Files
seeding-planets/common/game_info/game_info.gd
2026-06-26 17:53:28 +02:00

123 lines
4.2 KiB
GDScript

extends Node
const SAVE_NAME = "playtest_2"
const SAVE_STORY_GAME_LOCATION = "user://stw_%s_save.tres" % SAVE_NAME
const SAVE_INFINTE_GAME_LOCATION = "user://stw_%s_infinite_save.tres" % SAVE_NAME
const SAVE_SETTINGS_LOCATION = "user://stw_settings.tres"
signal game_loaded
var game_mode_choosen := GameData.Mode.STORY
var game_data : GameData :
get():
if game_mode_choosen == GameData.Mode.STORY:
return story_game_data
elif game_mode_choosen == GameData.Mode.INFINITE:
return infinite_game_data
return null
var story_game_data : GameData
var infinite_game_data : GameData
var settings_data : SettingsData
var current_dialog_path : String
func load_story_game_data() -> GameData:
story_game_data = null
if ResourceLoader.exists(SAVE_STORY_GAME_LOCATION) and ResourceLoader.load(SAVE_STORY_GAME_LOCATION):
story_game_data = ResourceLoader.load(SAVE_STORY_GAME_LOCATION).duplicate_deep()
game_loaded.emit()
return story_game_data
func load_infinite_game_data() -> GameData:
infinite_game_data = null
if ResourceLoader.exists(SAVE_INFINTE_GAME_LOCATION) and ResourceLoader.load(SAVE_INFINTE_GAME_LOCATION):
infinite_game_data = ResourceLoader.load(SAVE_INFINTE_GAME_LOCATION).duplicate_deep()
return infinite_game_data
func start_game_data():
if game_mode_choosen == GameData.Mode.STORY:
story_game_data = GameData.new(GameData.Mode.STORY)
story_game_data.start_run()
else:
infinite_game_data = GameData.new(GameData.Mode.INFINITE)
infinite_game_data.start_run()
save_game_data()
func save_game_data():
if game_mode_choosen == GameData.Mode.STORY:
if story_game_data:
ResourceSaver.save(story_game_data, SAVE_STORY_GAME_LOCATION)
elif game_mode_choosen == GameData.Mode.INFINITE:
if infinite_game_data:
ResourceSaver.save(infinite_game_data, SAVE_INFINTE_GAME_LOCATION)
func load_settings_data() -> SettingsData:
if ResourceLoader.exists(SAVE_SETTINGS_LOCATION):
settings_data = ResourceLoader.load(SAVE_SETTINGS_LOCATION).duplicate_deep()
else :
settings_data = SettingsData.new()
save_settings()
return settings_data
func save_settings():
if settings_data:
ResourceSaver.save(settings_data, SAVE_SETTINGS_LOCATION)
func _init():
load_story_game_data()
load_infinite_game_data()
load_settings_data()
update_language_settings()
update_video_settings()
settings_data.language_changed.connect(_on_settings_language_changed)
settings_data.video_changed.connect(_on_settings_video_changed)
settings_data.sound_changed.connect(_on_settings_sound_changed)
func _ready():
Dialogic.timeline_started.connect(_on_timeline_started)
Dialogic.timeline_ended.connect(_on_timeline_ended)
func _on_settings_video_changed(s : SettingsData):
update_video_settings(s)
func _on_settings_language_changed(s : SettingsData):
update_language_settings(s)
func _on_settings_sound_changed(s : SettingsData):
AudioServer.set_bus_volume_db(SettingsData.MUSIC_BUS_ID, linear_to_db(s.music_volume))
AudioServer.set_bus_volume_db(SettingsData.SFX_BUS_ID, linear_to_db(s.sfx_volume))
AudioServer.set_bus_volume_db(SettingsData.AMBIANCE_BUS_ID, linear_to_db(s.ambiance_volume))
func _on_timeline_started():
current_dialog_path = Dialogic.current_timeline.resource_path
func _on_timeline_ended():
if not current_dialog_path in game_data.dialogs_done:
game_data.dialogs_done.append(current_dialog_path)
save_game_data()
func update_language_settings(s : SettingsData = settings_data):
TranslationServer.set_locale(s.language)
func update_video_settings(s : SettingsData = settings_data):
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN if s.full_screen else DisplayServer.WINDOW_MODE_WINDOWED)
if not is_node_ready():
await ready
get_tree().root.content_scale_factor = s.ui_size
func update_inputs(s : SettingsData = settings_data):
for i in range(len(s.input_remapped)):
InputMap.action_erase_events(s.action_remapped[i])
InputMap.action_add_event(s.action_remapped[i], s.input_remapped[i])
func has_unlocked_infinite_mode():
return true