Refactor save management; enhance save_data function with verification and plaintext copy options, and update load_data logic for improved error handling

This commit is contained in:
Kirill
2026-09-13 22:57:25 +03:00
parent c22b21a537
commit dea744bc30
7 changed files with 380 additions and 260 deletions
+54 -23
View File
@@ -71,6 +71,8 @@ var g_counters: Dictionary[String, Counter] = {
var g_active_items: Dictionary = {}
var pending_page: int = -1
var owniverse:Owniverse = Owniverse.new()
var owniverse_items: Dictionary[String, OwniverseItem] = {}
var locked_items: Array = []
@@ -83,8 +85,10 @@ func set_datetime(value: float):
func set_owniverse_item_value() -> void:
for _item_id in owniverse_items:
owniverse_items[_item_id].set_label(owniverse.state.amount[_item_id])
for item_id in owniverse.items_to_update:
if owniverse_items.has(item_id):
owniverse_items[item_id].set_label(owniverse.items_to_update[item_id])
owniverse.items_to_update.clear()
#endregion
@@ -93,16 +97,21 @@ func set_owniverse_item_value() -> void:
func _unlock_items():
if locked_items.size() == 0: return
var _new_locked_items = []
var display_totals: Dictionary = owniverse.get_item_amounts(true)
for _item_id in locked_items:
#print(_item_id ' | ', _entity.unlock)
var _flag_to_unlock = true
for _elem in owniverse.entities[_item_id].unlock:
if owniverse.state.stats.total_amount[_elem] < owniverse.entities[_item_id].unlock[_elem]:
if maxf(owniverse.state.stats.total_amount.get(_elem, 0.0), display_totals.get(_elem, 0.0)) < owniverse.entities[_item_id].unlock[_elem]:
_flag_to_unlock = false
break
if _flag_to_unlock:
owniverse_items[_item_id].set_visible(true)
var item_id: String = owniverse.entities[_item_id].count_as
if item_id == "":
item_id = _item_id
if owniverse_items.has(item_id):
owniverse_items[item_id].set_visible(true)
else:
_new_locked_items.append(_item_id)
locked_items = _new_locked_items
@@ -268,6 +277,11 @@ func _ready() -> void:
locked_items = inited_result.locked_items
load_data()
_init_owniverse_items()
owniverse.refresh_item_amounts()
_change_speed(0)
set_datetime(owniverse.state.time.year)
set_owniverse_item_value()
_unlock_items()
g_counters.swipe.sec = 0.2
@@ -279,6 +293,7 @@ func _ready() -> void:
func _process(delta: float) -> void:
owniverse.evolute(delta)
set_owniverse_item_value()
set_datetime(owniverse.state.time.year)
#owniverse.cycle(delta)
@@ -342,31 +357,47 @@ func _on_unlock_and_save_timeout() -> void:
func load_data() -> bool:
# Получаем версию приложения
var app_version = ProjectSettings.get_setting("application/config/version")
print("Версия приложения: ", app_version)
var game_data: Dictionary = SaveManager.load_data("owniverse", "qwerty")
if game_data == {}: return false
#if game_data.get('version', '0.0.1') != 'app_version': return false
if game_data.get('version', str(app_version)) != '0.1.0':
print(game_data.get('version', 7))
print('wrong load version')
if game_data.is_empty():
return false
owniverse.state = game_data["state"]
for item in owniverse.state.amount:
owniverse.items_to_update[item] = owniverse.state.amount[item]
var restored: Dictionary = game_data.state
# Current definitions are initialized first; reject incompatible saves before publishing.
for id in owniverse.state.amount:
if not restored.amount.has(id) or not restored.stats.total_amount.has(id):
SaveManager.blocked_saves["owniverse"] = true
push_error("Save is missing the current entity: " + id)
return false
var complete: Dictionary = owniverse.state.duplicate(true)
complete.merge(restored, true)
owniverse.state = complete
owniverse.new_state = complete
owniverse.refresh_item_amounts()
pending_page = clampi(int(game_data.get("ui", {}).get("current_page", 0)), 0, PAGE_COUNT - 1)
_restore_page.call_deferred()
return true
func _restore_page() -> void:
# Wait until containers have calculated the scrollable width.
await get_tree().process_frame
if pending_page >= 0:
stage_page_scroller.scroll_horizontal = pending_page * PAGE_WIDTH
pending_page = -1
func save_data() -> void:
var game_data: Dictionary = {}
game_data["state"] = owniverse.state
SaveManager.save_data("owniverse", "qwerty", game_data)
#print("saved ", game_data.version, "\n\n\n")
var page: int = pending_page
if page < 0:
page = clampi(roundi(float(stage_page_scroller.scroll_horizontal) / PAGE_WIDTH), 0, PAGE_COUNT - 1)
SaveManager.save_data("owniverse", "qwerty", {
"state": owniverse.state,
"ui": {"current_page": page},
})
func _notification(what: int) -> void:
if is_node_ready() and (what == NOTIFICATION_WM_CLOSE_REQUEST or what == NOTIFICATION_APPLICATION_PAUSED):
save_data()
func init_enitities() -> Dictionary: