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