feat(meta): MetaProgress autoload(碎片+已解锁+持久化 user://meta.json)
This commit is contained in:
@@ -50,6 +50,7 @@ DpsTracker="*res://scripts/autoloads/dps_tracker.gd"
|
||||
ZoneManager="*res://scripts/autoloads/zone_manager.gd"
|
||||
MinionManager="*res://scripts/autoloads/minion_manager.gd"
|
||||
EndlessRecords="*res://scripts/autoloads/endless_records.gd"
|
||||
MetaProgress="*res://scripts/autoloads/meta_progress.gd"
|
||||
Locale="*res://scripts/autoloads/locale_manager.gd"
|
||||
SettingsManager="*res://scripts/autoloads/settings_manager.gd"
|
||||
AudioManager="*res://scripts/autoloads/audio_manager.gd"
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
## MetaProgress — 全局元进展(Autoload: MetaProgress)
|
||||
## 以太碎片 + 已解锁法术,持久化 user://meta.json(死亡不重置)。
|
||||
extends Node
|
||||
|
||||
const PATH: String = "user://meta.json"
|
||||
|
||||
var aether: int = 0
|
||||
var unlocked: Array = [] # 已解锁法术 id (String)
|
||||
|
||||
func _ready() -> void:
|
||||
load_meta()
|
||||
|
||||
func add_aether(n: int) -> void:
|
||||
if n <= 0:
|
||||
return
|
||||
aether += n
|
||||
save_meta()
|
||||
|
||||
func is_unlocked(id: String) -> bool:
|
||||
return id in unlocked
|
||||
|
||||
## 已解锁 或 碎片不足 → false(不扣费);否则扣费+记录+存档 → true
|
||||
func unlock(id: String, cost: int) -> bool:
|
||||
if is_unlocked(id) or aether < cost:
|
||||
return false
|
||||
aether -= cost
|
||||
unlocked.append(id)
|
||||
save_meta()
|
||||
return true
|
||||
|
||||
func clear() -> void:
|
||||
aether = 0
|
||||
unlocked = []
|
||||
if FileAccess.file_exists(PATH):
|
||||
DirAccess.remove_absolute(ProjectSettings.globalize_path(PATH))
|
||||
|
||||
func save_meta() -> void:
|
||||
var f := FileAccess.open(PATH, FileAccess.WRITE)
|
||||
if f:
|
||||
f.store_string(JSON.stringify({"aether": aether, "unlocked": unlocked}))
|
||||
f.close()
|
||||
|
||||
func load_meta() -> void:
|
||||
aether = 0
|
||||
unlocked = []
|
||||
if not FileAccess.file_exists(PATH):
|
||||
return
|
||||
var parsed = JSON.parse_string(FileAccess.get_file_as_string(PATH))
|
||||
if not (parsed is Dictionary):
|
||||
return
|
||||
aether = int(parsed.get("aether", 0))
|
||||
var u = parsed.get("unlocked", [])
|
||||
if u is Array:
|
||||
for id in u:
|
||||
unlocked.append(String(id))
|
||||
Reference in New Issue
Block a user