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:
+54
-23
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user