Initial commit
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
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: Unknown Vessels 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
|
||||
Reference in New Issue
Block a user