extends Node const INT64_MAX = (1 << 63) - 1 # 9223372036854775807 var score : int = 0 : set(x): score = x EventBus.update_score.emit(score) if score > highscore: highscore = score var highscore : int = 0 : set(x): highscore = x EventBus.update_highscore.emit(highscore) _save() var relative_mouse : bool = true : set(x): relative_mouse = x _save() var music_volume : int : set(x): music_volume = x AudioServer.set_bus_volume_db(1, music_volume) _save() var effects_volume : int : set(x): effects_volume = x AudioServer.set_bus_volume_db(2, effects_volume) _save() var best_times : Dictionary var upgrade_tokens : int = 0 : set(x): upgrade_tokens = x EventBus.upgrade_tokens_updated.emit(upgrade_tokens) _save() var effect_time : int = 0 : set(x): effect_time = x _save() var laser_power : int = 0 : set(x): laser_power = x _save() var extra_lives : int = 0 : set(x): extra_lives = x _save() var powerup_percent : int = 0 : set(x): powerup_percent = x _save() var ball_split : int = 0 : set(x): ball_split = x _save() var start_level : String = "DUNKANOID" var _loading : bool = false func _ready() -> void: _loading = true if FileAccess.file_exists("user://data.json"): var data = JSON.parse_string(FileAccess.get_file_as_string("user://data.json")) highscore = data.get("highscore", 0) relative_mouse = data.get("relative_mouse", true) music_volume = data.get("music_volume", AudioServer.get_bus_volume_db(1)) effects_volume = data.get("effects_volume", AudioServer.get_bus_volume_db(2)) best_times = data.get("best_times", {}) upgrade_tokens = data.get("upgrade_tokens", 0) effect_time = data.get("effect_time", 0) laser_power = data.get("laser_power", 0) extra_lives = data.get("extra_lives", 0) powerup_percent = data.get("powerup_percent", 0) ball_split = data.get("ball_split", 0) else: highscore = 0 relative_mouse = true music_volume = int(AudioServer.get_bus_volume_db(1)) effects_volume = int(AudioServer.get_bus_volume_db(2)) best_times = {} upgrade_tokens = 0 effect_time = 0 laser_power = 0 extra_lives = 0 powerup_percent = 0 ball_split = 0 _loading = false func _save() -> void: if _loading: return var data : Dictionary = { "highscore": highscore, "relative_mouse": relative_mouse, "music_volume": music_volume, "effects_volume": effects_volume, "best_times": best_times, "upgrade_tokens": upgrade_tokens, "effect_time": effect_time, "laser_power": laser_power, "extra_lives": extra_lives, "powerup_percent": powerup_percent, "ball_split": ball_split } var f = FileAccess.open("user://data.json", FileAccess.WRITE) f.store_string(JSON.stringify(data)) f.close() func get_best_time(level : String) -> int: return best_times.get(level, INT64_MAX) func set_best_time(level : String, time : int) -> void: best_times[level] = time _save() func reset_best_times() -> void: best_times.clear() _save() func get_effect_time() -> int: return 5 + (effect_time * 5) func get_laser_power() -> int: return laser_power + 1 func get_lives() -> int: return extra_lives + 3 func get_powerup_percent() -> float: return 0.98 - (powerup_percent * 0.02) func get_num_balls() -> int: return ball_split + 2 func format_effect_time() -> String: return "%d s" % get_effect_time() func format_laser_power() -> String: var p = get_laser_power() if p == 1: return "1 hit" return "%d hits" % p func format_extra_lives() -> String: return "%d lives" % get_lives() func format_powerup_percent() -> String: return "%d%%" % int((1 - get_powerup_percent()) * 100) func format_ball_split() -> String: return "%d balls" % get_num_balls()