56 lines
1.4 KiB
GDScript
56 lines
1.4 KiB
GDScript
## 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))
|