153 lines
4.1 KiB
GDScript
153 lines
4.1 KiB
GDScript
extends Node
|
|
|
|
const SAVE_PATH := "user://save_slot_1.json"
|
|
var has_save: bool = false
|
|
var play_elapsed: float = 0.0
|
|
var demo_limit: float = 36000.0
|
|
var scramble_at: float = 35280.0
|
|
var scramble_started: bool = false
|
|
var clock_paused: bool = false
|
|
var game_year: int = 2066
|
|
var game_month: int = 9
|
|
var game_day: int = 14
|
|
var game_hour: float = 8.0
|
|
var time_scale: float = 1.0
|
|
signal scramble_begun
|
|
signal time_scale_changed(new_scale: float)
|
|
|
|
|
|
func _ready() -> void:
|
|
has_save = FileAccess.file_exists(SAVE_PATH)
|
|
process_mode = Node.PROCESS_MODE_PAUSABLE
|
|
|
|
|
|
func _process(delta: float) -> void:
|
|
if clock_paused:
|
|
return
|
|
var stepped: float = delta * time_scale
|
|
play_elapsed += stepped
|
|
_advance_game_clock(stepped)
|
|
if not scramble_started and play_elapsed >= scramble_at:
|
|
scramble_started = true
|
|
scramble_begun.emit()
|
|
print("SCRAMBLE: proxy privateers inbound")
|
|
|
|
|
|
func set_time_scale(scale: float) -> void:
|
|
time_scale = clampf(scale, 0.0, 4.0)
|
|
time_scale_changed.emit(time_scale)
|
|
print("Time scale: x", time_scale)
|
|
|
|
|
|
func _advance_game_clock(game_seconds: float) -> void:
|
|
game_hour += game_seconds / 3600.0
|
|
while game_hour >= 24.0:
|
|
game_hour -= 24.0
|
|
game_day += 1
|
|
var days_in_month: int = _days_in_month(game_year, game_month)
|
|
if game_day > days_in_month:
|
|
game_day = 1
|
|
game_month += 1
|
|
if game_month > 12:
|
|
game_month = 1
|
|
game_year += 1
|
|
|
|
|
|
func _days_in_month(_year: int, month: int) -> int:
|
|
match month:
|
|
1, 3, 5, 7, 8, 10, 12:
|
|
return 31
|
|
4, 6, 9, 11:
|
|
return 30
|
|
2:
|
|
return 28
|
|
_:
|
|
return 30
|
|
|
|
|
|
func get_time_string() -> String:
|
|
var h: int = int(game_hour)
|
|
var m: int = int((game_hour - float(h)) * 60.0)
|
|
var s: int = int((game_hour - float(h) - float(m) / 60.0) * 3600.0)
|
|
var month_names := ["", "Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
|
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
|
|
var mon: String = month_names[game_month]
|
|
var scale_txt := ""
|
|
if time_scale == 0.0:
|
|
scale_txt = " PAUSED"
|
|
elif time_scale > 1.0:
|
|
scale_txt = " x%d" % int(time_scale)
|
|
return "%d %s %d %02d:%02d:%02d%s" % [game_day, mon, game_year, h, m, s, scale_txt]
|
|
|
|
|
|
func get_play_remaining_string() -> String:
|
|
var left: float = max(demo_limit - play_elapsed, 0.0)
|
|
var h: int = int(left / 3600.0)
|
|
var m: int = int((left - float(h) * 3600.0) / 60.0)
|
|
var sec: int = int(left) % 60
|
|
return "%02d:%02d:%02d" % [h, m, sec]
|
|
|
|
|
|
func save_game(player: Node) -> void:
|
|
if player == null:
|
|
return
|
|
var look = {}
|
|
if "appearance" in player:
|
|
look = player.appearance
|
|
var data := {
|
|
"player_name": player.player_name,
|
|
"background_id": player.background_id,
|
|
"background_name": player.background_name,
|
|
"culture_id": player.culture_id if "culture_id" in player else "",
|
|
"culture_name": player.culture_name if "culture_name" in player else "",
|
|
"appearance": look,
|
|
"money": player.money,
|
|
"food": player.food,
|
|
"health": player.health,
|
|
"oxygen": player.oxygen,
|
|
"inventory": player.inventory.duplicate(),
|
|
"position": {
|
|
"x": player.global_position.x,
|
|
"y": player.global_position.y,
|
|
"z": player.global_position.z
|
|
},
|
|
"play_elapsed": play_elapsed,
|
|
"scramble_started": scramble_started,
|
|
"game_year": game_year,
|
|
"game_month": game_month,
|
|
"game_day": game_day,
|
|
"game_hour": game_hour,
|
|
"time_scale": time_scale
|
|
}
|
|
var file := FileAccess.open(SAVE_PATH, FileAccess.WRITE)
|
|
if file:
|
|
file.store_string(JSON.stringify(data))
|
|
file.close()
|
|
has_save = true
|
|
print("Game saved")
|
|
|
|
|
|
func load_game_data() -> Dictionary:
|
|
if not FileAccess.file_exists(SAVE_PATH):
|
|
return {}
|
|
var file := FileAccess.open(SAVE_PATH, FileAccess.READ)
|
|
if file == null:
|
|
return {}
|
|
var text := file.get_as_text()
|
|
file.close()
|
|
var parsed = JSON.parse_string(text)
|
|
if typeof(parsed) == TYPE_DICTIONARY:
|
|
return parsed
|
|
return {}
|
|
|
|
|
|
func apply_loaded_clock(data: Dictionary) -> void:
|
|
play_elapsed = float(data.get("play_elapsed", 0.0))
|
|
scramble_started = bool(data.get("scramble_started", false))
|
|
game_year = int(data.get("game_year", 2066))
|
|
game_month = int(data.get("game_month", 9))
|
|
game_day = int(data.get("game_day", 14))
|
|
game_hour = float(data.get("game_hour", 8.0))
|
|
time_scale = float(data.get("time_scale", 1.0))
|
|
clock_paused = false
|