platformer-game-test/src/Singletons/GameState.gd

166 lines
3.9 KiB
GDScript

extends Node
signal scene_changed
signal player_just_died
signal on_game_over
signal on_new_game
enum States{
INTRO,
INTRO_CUTSCENE,
TRANSITIONING,
MAIN_MENU,
GAME_OVER,
CONTROLS,
NEW_GAME,
GAME,
PUSE,
STATS,
CUTSCENE,
}
var _SAVE_FILE_PATH = "user://data"
# Change key in release
var _ENCRYPTION_KEY = "fas3uyf076HJsiUDs24dfI9"
var is_first_run = false
var _SCENES := {
States.MAIN_MENU: "res://src/Menu/MainMenu.tscn",
States.NEW_GAME: "res://src/GameWorld/GameWorld.tscn",
States.INTRO_CUTSCENE: "res://src/CutScenes/IntroCutscene.tscn"
}
var GAME_TIMEOUT_MIN = 10
var _default_data := {
"statistics": {
"deaths": 0,
"clears": 0,
"runs": 0,
"total_time_played": 0,
"orbs": 0,
"coins": 0,
},
"heigh_score": {
"deaths": 0,
"score": 0,
"cleard": false,
"coins": 0,
"orbs": 0,
"time": 0,
},
"achivements": {
"a": false,
"b": false
}
}
var _data := _default_data
var _run_data:= {
"deaths": 0,
"coins": 0,
"orbs": 0,
"time": 0,
"score": 0
}
var _state = States.INTRO
func _ready() -> void:
load_data()
for key in _data:
print("[%s]: %s" % [key, _data[key]])
func _physics_process(delta: float) -> void:
if _state == States.GAME:
_run_data.time += delta
_data.statistics.total_time_played += delta
if _run_data.time >= GAME_TIMEOUT_MIN * 60:
game_over(true)
func game_over(timed_out:bool):
print("**************Game OVER******************")
_state = States.GAME_OVER
var cleared_bonus = 10000 if not timed_out else 0
_run_data.score = cleared_bonus + (_run_data.coins * 10) + (_run_data.deaths * -2) + (_run_data.orbs * 100)
emit_signal("on_game_over", timed_out)
func load_data():
var data_file = File.new()
var e = data_file.open_encrypted_with_pass(_SAVE_FILE_PATH, File.READ, _ENCRYPTION_KEY)
if e != 0:
data_file.close()
is_first_run = true
save_data()
else:
var saved_data:Dictionary = data_file.get_var()
for key in saved_data.keys():
if _data.has(key):
if typeof(saved_data[key]) == TYPE_DICTIONARY:
for sub_key in saved_data[key]:
var subdict:Dictionary = _data[key];
if subdict.has(sub_key): _data[key][sub_key] = saved_data[key][sub_key]
else: _data[key] = saved_data[key]
data_file.close()
pass
func save_data():
var data_file = File.new()
data_file.open_encrypted_with_pass(_SAVE_FILE_PATH, File.WRITE, _ENCRYPTION_KEY)
data_file.store_var(_data)
data_file.close()
pass
func start_new_game(from_main_menu:bool=false, change_music:bool=true):
get_tree().paused = false
for key in _run_data.keys():
_run_data[key] = 0
var state = States.INTRO_CUTSCENE if from_main_menu else States.NEW_GAME
if not from_main_menu: _data.statistics.runs += 1
save_data()
var delay = 3 if state == States.INTRO_CUTSCENE else 1
if change_music: AudioManager.play_music(AudioManager.Music.PreGame, delay)
_change_scene(state, delay)
yield(self, "scene_changed")
emit_signal("on_new_game")
# get_tree().change_scene_to(load(_SCENES[_state]))
func set_state(state:int = States.GAME):
_state = state
func get_heigh_score():
return _data.heigh_score.duplicate()
func get_statistics():
return _data.statistics.duplicate()
func get_run_data():
return _run_data.duplicate()
func get_state():
return int(_state)
func go_to_main_menu():
get_tree().paused = false
save_data()
_change_scene(States.MAIN_MENU)
yield(self, "scene_changed")
func _change_scene(state:int,duration:float=1):
_state = States.TRANSITIONING
Stage.fade_out(duration/2)
yield(Stage, "fade_finished")
get_tree().change_scene_to(load(_SCENES[state]))
Stage.fade_in(duration/2)
yield(Stage, "fade_finished")
_state = state
emit_signal("scene_changed")
func player_died():
emit_signal("player_just_died")
_run_data.deaths += 1
_data.statistics.deaths += 1
func coin_collected():
_run_data.coins += 10
_data.statistics.coins += 10
func orb_collected():
print("orb collected")
_run_data.orbs += 1
_data.statistics.orbs += 1