| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- extends Node
- ## What the player keeps between sessions: the level reached (saved on every win, and
- ## dropping by one for every Params.LOSE_HOURS away), best stars per level, and settings.
- const PATH := "user://progress.cfg"
- ## Level the next game scene starts at.
- var current_level := 0
- var _config := ConfigFile.new()
- func _ready() -> void:
- _config.load(PATH)
- func save_level(level: int) -> void:
- _config.set_value("progress", "level", level)
- _config.set_value("progress", "time", Time.get_unix_time_from_system())
- _config.save(PATH)
- ## Applies any decay since the last save and returns [level, hours until the next decay].
- func load_level() -> Array:
- var level: int = _config.get_value("progress", "level", 0)
- var last: float = _config.get_value("progress", "time", 0.0)
- var now := Time.get_unix_time_from_system()
- var period := 3600.0 * Params.LOSE_HOURS
- var remaining := period + last - now
- while remaining < 0.0 and level > 0:
- last += period
- level -= 1
- remaining = period + last - now
- _config.set_value("progress", "level", level)
- _config.set_value("progress", "time", last)
- _config.save(PATH)
- return [level, remaining / 3600.0]
- ## Keeps the best star count (1 to 3) for a level; returns true if it is a new best.
- func save_stars(level: int, stars: int) -> bool:
- var key := str(level)
- if stars <= _config.get_value("stars", key, 0):
- return false
- _config.set_value("stars", key, stars)
- _config.save(PATH)
- return true
- func total_stars() -> int:
- var total := 0
- if _config.has_section("stars"):
- for key in _config.get_section_keys("stars"):
- total += int(_config.get_value("stars", key))
- return total
- func save_best_score(score: int) -> bool:
- if score <= best_score():
- return false
- _config.set_value("progress", "best_score", score)
- _config.save(PATH)
- return true
- func best_score() -> int:
- return _config.get_value("progress", "best_score", 0)
- func music_on() -> bool:
- return _config.get_value("settings", "music", true)
- func set_music_on(on: bool) -> void:
- _config.set_value("settings", "music", on)
- _config.save(PATH)
|