fix: better savepoint persistence, coin collecting
This commit is contained in:
parent
135817c8af
commit
b01f4ed027
@ -31,7 +31,7 @@ func load_sounds() -> void:
|
|||||||
|
|
||||||
func set_progress(value) -> void:
|
func set_progress(value) -> void:
|
||||||
gsr.progress_dict = value
|
gsr.progress_dict = value
|
||||||
SaveManager.save_default()
|
save()
|
||||||
|
|
||||||
|
|
||||||
func get_progress() -> Dictionary:
|
func get_progress() -> Dictionary:
|
||||||
@ -41,6 +41,7 @@ func get_progress() -> Dictionary:
|
|||||||
func save() -> void:
|
func save() -> void:
|
||||||
SaveManager.save_default()
|
SaveManager.save_default()
|
||||||
|
|
||||||
|
|
||||||
# Returns if the level was completed or not
|
# Returns if the level was completed or not
|
||||||
func get_level_completed(level_name: String) -> bool:
|
func get_level_completed(level_name: String) -> bool:
|
||||||
if gsr.progress_dict.has(level_name) && gsr.progress_dict[level_name].has("levelcompleted"):
|
if gsr.progress_dict.has(level_name) && gsr.progress_dict[level_name].has("levelcompleted"):
|
||||||
@ -53,14 +54,14 @@ func set_level_completed(level_name: String, state: bool) -> void:
|
|||||||
if !gsr.progress_dict.has(level_name):
|
if !gsr.progress_dict.has(level_name):
|
||||||
gsr.progress_dict[level_name] = {}
|
gsr.progress_dict[level_name] = {}
|
||||||
gsr.progress_dict[level_name]["levelcompleted"] = state
|
gsr.progress_dict[level_name]["levelcompleted"] = state
|
||||||
SaveManager.save_default()
|
save()
|
||||||
|
|
||||||
|
|
||||||
func set_leveltime(level_name: String, time: float) -> void:
|
func set_level_time(level_name: String, time: float) -> void:
|
||||||
if !gsr.progress_dict.has(level_name):
|
if !gsr.progress_dict.has(level_name):
|
||||||
gsr.progress_dict[level_name] = {}
|
gsr.progress_dict[level_name] = {}
|
||||||
gsr.progress_dict[level_name]["leveltime"] = time
|
gsr.progress_dict[level_name]["leveltime"] = time
|
||||||
SaveManager.save_default()
|
save()
|
||||||
|
|
||||||
|
|
||||||
func get_level_time(level_name: String) -> float:
|
func get_level_time(level_name: String) -> float:
|
||||||
@ -74,7 +75,7 @@ func set_uncompleted_level_time(level_name: String, time: float) -> void:
|
|||||||
if !gsr.progress_dict.has(level_name):
|
if !gsr.progress_dict.has(level_name):
|
||||||
gsr.progress_dict[level_name] = {}
|
gsr.progress_dict[level_name] = {}
|
||||||
gsr.progress_dict[level_name]["uncompletedleveltime"] = time
|
gsr.progress_dict[level_name]["uncompletedleveltime"] = time
|
||||||
SaveManager.save_default()
|
save()
|
||||||
|
|
||||||
|
|
||||||
func get_uncompleted_level_time(level_name: String) -> float:
|
func get_uncompleted_level_time(level_name: String) -> float:
|
||||||
@ -90,28 +91,29 @@ func set_savepoint(level_name: String, position: Vector2) -> void:
|
|||||||
if !gsr.progress_dict.has(level_name):
|
if !gsr.progress_dict.has(level_name):
|
||||||
gsr.progress_dict[level_name] = {}
|
gsr.progress_dict[level_name] = {}
|
||||||
gsr.progress_dict[level_name]["savepoint"] = position
|
gsr.progress_dict[level_name]["savepoint"] = position
|
||||||
SaveManager.save_default()
|
save()
|
||||||
|
|
||||||
|
|
||||||
func set_level_state(level_name: String, property_dict: Dictionary) -> void:
|
func set_level_state(level_name: String, property_dict: Dictionary) -> void:
|
||||||
if !gsr.progress_dict.has(level_name):
|
if !gsr.progress_dict.has(level_name):
|
||||||
gsr.progress_dict[level_name] = {}
|
gsr.progress_dict[level_name] = {}
|
||||||
gsr.progress_dict[level_name]["savestate"] = property_dict
|
gsr.progress_dict[level_name]["savestate"] = property_dict
|
||||||
SaveManager.save_default()
|
save()
|
||||||
|
|
||||||
|
|
||||||
func remove_savepoint(level_name: String) -> void:
|
func remove_savepoint(level_name: String) -> void:
|
||||||
if !gsr.progress_dict.has(level_name):
|
if !gsr.progress_dict.has(level_name):
|
||||||
return
|
return
|
||||||
gsr.progress_dict[level_name].erase("savepoint")
|
gsr.progress_dict[level_name].erase("savepoint")
|
||||||
|
gsr.progress_dict[level_name].erase("currency")
|
||||||
gsr.progress_dict[level_name].erase("uncompletedleveltime")
|
gsr.progress_dict[level_name].erase("uncompletedleveltime")
|
||||||
SaveManager.save_default()
|
save()
|
||||||
|
|
||||||
func remove_savestate(level_name: String) -> void:
|
func remove_savestate(level_name: String) -> void:
|
||||||
if !gsr.progress_dict.has(level_name):
|
if !gsr.progress_dict.has(level_name):
|
||||||
return
|
return
|
||||||
gsr.progress_dict[level_name].erase("savestate")
|
gsr.progress_dict[level_name].erase("savestate")
|
||||||
SaveManager.save_default()
|
save()
|
||||||
|
|
||||||
|
|
||||||
func get_property_value(level_name: String, propertyName: String) -> int:
|
func get_property_value(level_name: String, propertyName: String) -> int:
|
||||||
@ -149,14 +151,14 @@ func touch_level(level_name: String) -> void:
|
|||||||
# TODO This is permanent immediatly
|
# TODO This is permanent immediatly
|
||||||
func set_wallet(value) -> void:
|
func set_wallet(value) -> void:
|
||||||
gsr.wallet = value
|
gsr.wallet = value
|
||||||
SaveManager.save_default()
|
save()
|
||||||
|
|
||||||
func get_wallet() -> int:
|
func get_wallet() -> int:
|
||||||
return gsr.wallet
|
return gsr.wallet
|
||||||
|
|
||||||
func set_swaying_grass(value: bool) -> void:
|
func set_swaying_grass(value: bool) -> void:
|
||||||
gsr.swaying_grass = value
|
gsr.swaying_grass = value
|
||||||
SaveManager.save_default()
|
save()
|
||||||
|
|
||||||
func get_swaying_grass() -> bool:
|
func get_swaying_grass() -> bool:
|
||||||
return gsr.swaying_grass
|
return gsr.swaying_grass
|
||||||
|
|||||||
@ -9,20 +9,17 @@ export var currencyValue := 1
|
|||||||
export var coin_3D_fps := 30
|
export var coin_3D_fps := 30
|
||||||
|
|
||||||
var last_draw_time := 0
|
var last_draw_time := 0
|
||||||
var scene_saved_id := 0
|
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
scene_saved_id = level_state.register_saveable_object(self)
|
level_state.register_saveable_node(self)
|
||||||
var collected_saved = level_state.get_saved_object_property(scene_saved_id, "was_collected")
|
var collected_saved = level_state.get_saved_node_property(self, "was_collected")
|
||||||
|
|
||||||
if collected_saved != null:
|
if collected_saved != null:
|
||||||
was_collected = collected_saved
|
was_collected = collected_saved
|
||||||
|
|
||||||
if was_collected:
|
if was_collected:
|
||||||
visible = false
|
visible = false
|
||||||
level_state.set_currency(level_state.get_currency() + currencyValue)
|
|
||||||
return
|
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
func _physics_process(delta: float) -> void:
|
||||||
if !visible || proto_coin == null:
|
if !visible || proto_coin == null:
|
||||||
|
|||||||
@ -15,10 +15,10 @@ var scene_saved_id := 0
|
|||||||
var activatable = true
|
var activatable = true
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
scene_saved_id = level_state.register_saveable_object(self)
|
level_state.register_saveable_node(self)
|
||||||
var activated_saved = level_state.get_saved_object_property(scene_saved_id, "activated")
|
var activated_saved = level_state.get_saved_node_property(self, "activated")
|
||||||
|
|
||||||
if activated_saved != null:
|
if level_state.savepoint_loaded && activated_saved != null:
|
||||||
activated = activated_saved
|
activated = activated_saved
|
||||||
$Digit.frame = frog_number
|
$Digit.frame = frog_number
|
||||||
if activated:
|
if activated:
|
||||||
|
|||||||
@ -8,14 +8,13 @@ onready var unactivatable_timer := $Timer
|
|||||||
|
|
||||||
export onready var activated := false
|
export onready var activated := false
|
||||||
|
|
||||||
var scene_saved_id := 0
|
|
||||||
var activatable := true
|
var activatable := true
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
scene_saved_id = level_state.register_saveable_object(self)
|
level_state.register_saveable_node(self)
|
||||||
var activated_saved = level_state.get_saved_object_property(scene_saved_id, "activated")
|
var activated_saved = level_state.get_saved_node_property(self, "activated")
|
||||||
|
|
||||||
if activated_saved != null:
|
if level_state.savepoint_loaded && activated_saved != null:
|
||||||
activated = activated_saved
|
activated = activated_saved
|
||||||
|
|
||||||
signal_manager.connect("unlocked", self, "receive_unlock")
|
signal_manager.connect("unlocked", self, "receive_unlock")
|
||||||
|
|||||||
@ -9,14 +9,13 @@ onready var unactivatable_timer := $Timer
|
|||||||
export onready var activated := false
|
export onready var activated := false
|
||||||
export var cost := 3
|
export var cost := 3
|
||||||
|
|
||||||
var scene_saved_id := 0
|
|
||||||
var activatable = false
|
var activatable = false
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
scene_saved_id = level_state.register_saveable_object(self)
|
level_state.register_saveable_node(self)
|
||||||
var activated_saved = level_state.get_saved_object_property(scene_saved_id, "activated")
|
var activated_saved = level_state.get_saved_node_property(self, "activated")
|
||||||
|
|
||||||
if activated_saved != null:
|
if level_state.savepoint_loaded && activated_saved != null:
|
||||||
activated = activated_saved
|
activated = activated_saved
|
||||||
|
|
||||||
$Sprite.frame = 0
|
$Sprite.frame = 0
|
||||||
|
|||||||
@ -7,14 +7,13 @@ export onready var is_armed = false
|
|||||||
|
|
||||||
var trigger_zone_entered: bool = false
|
var trigger_zone_entered: bool = false
|
||||||
|
|
||||||
var scene_saved_id := 0
|
|
||||||
var activatable = false
|
var activatable = false
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
scene_saved_id = level_state.register_saveable_object(self)
|
level_state.register_saveable_node(self)
|
||||||
var is_armed_saved = level_state.get_saved_object_property(scene_saved_id, "is_armed")
|
var is_armed_saved = level_state.get_saved_node_property(self, "is_armed")
|
||||||
|
|
||||||
if is_armed_saved != null:
|
if level_state.savepoint_loaded && is_armed_saved != null:
|
||||||
is_armed = is_armed_saved
|
is_armed = is_armed_saved
|
||||||
|
|
||||||
if(!is_armed):
|
if(!is_armed):
|
||||||
|
|||||||
@ -10,6 +10,7 @@ var freed_frogs := []
|
|||||||
# TODO Rename probs
|
# TODO Rename probs
|
||||||
var is_dead := false setget set_dead
|
var is_dead := false setget set_dead
|
||||||
|
|
||||||
|
var savepoint_loaded := false
|
||||||
var level_time := 0.0
|
var level_time := 0.0
|
||||||
|
|
||||||
var saved_property_dictionary := {}
|
var saved_property_dictionary := {}
|
||||||
@ -19,8 +20,9 @@ var object_in_scene_id: int = 0
|
|||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
GlobalState.touch_level(level_name)
|
GlobalState.touch_level(level_name)
|
||||||
|
saved_property_dictionary = GlobalState.get_savestate(level_name)
|
||||||
GlobalState.gsr.last_played_level = level_name
|
GlobalState.gsr.last_played_level = level_name
|
||||||
SaveManager.save_default()
|
GlobalState.save()
|
||||||
signal_manager.connect("level_completed", self, "_on_level_completed")
|
signal_manager.connect("level_completed", self, "_on_level_completed")
|
||||||
signal_manager.connect("player_died", self, "player_dying")
|
signal_manager.connect("player_died", self, "player_dying")
|
||||||
|
|
||||||
@ -42,52 +44,61 @@ func set_currency(value: int) -> void:
|
|||||||
currency = value
|
currency = value
|
||||||
signal_manager.emit_signal("currency_updated")
|
signal_manager.emit_signal("currency_updated")
|
||||||
|
|
||||||
|
|
||||||
func get_currency() -> int:
|
func get_currency() -> int:
|
||||||
return currency
|
return currency
|
||||||
|
|
||||||
|
|
||||||
func set_deaths(value: int) -> void:
|
func set_deaths(value: int) -> void:
|
||||||
deaths = value
|
deaths = value
|
||||||
|
|
||||||
|
|
||||||
func set_dead(value: bool) -> void:
|
func set_dead(value: bool) -> void:
|
||||||
is_dead = value
|
is_dead = value
|
||||||
|
|
||||||
func get_own_scene_id(obj: Object) -> int:
|
|
||||||
if "scene_id" in obj && saved_object_dictionary.has(obj.scene_id):
|
func register_saveable_node(node: Node) -> void:
|
||||||
return obj.scene_id
|
if saved_object_dictionary.has(node.name):
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
return register_saveable_object(obj)
|
saved_object_dictionary[node.name] = node
|
||||||
|
if !saved_property_dictionary.has(node.name):
|
||||||
|
save_node_properties()
|
||||||
|
|
||||||
|
|
||||||
func register_saveable_object(obj: Object) -> int:
|
# Saves the state of triggers, collected collectibles and such
|
||||||
var id = object_in_scene_id
|
func save_node_properties() -> void:
|
||||||
saved_object_dictionary[id] = obj
|
for name in saved_object_dictionary.keys():
|
||||||
object_in_scene_id += 1
|
var object = saved_object_dictionary[name]
|
||||||
return id
|
|
||||||
|
|
||||||
|
|
||||||
func save_object_properties() -> void:
|
|
||||||
for id in saved_object_dictionary.keys():
|
|
||||||
var object = saved_object_dictionary[id]
|
|
||||||
var property_list = object.get_property_list()
|
var property_list = object.get_property_list()
|
||||||
var saved_properties = {}
|
var saved_properties = {}
|
||||||
for property in property_list:
|
for property in property_list:
|
||||||
# Only script Variables and only "primitive" types
|
# Only script Variables and only "primitive" types
|
||||||
if property["usage"] == PROPERTY_USAGE_SCRIPT_VARIABLE && property["type"] <= 16:
|
if property["usage"] == PROPERTY_USAGE_SCRIPT_VARIABLE && property["type"] <= 16:
|
||||||
saved_properties[property["name"]] = object.get(property["name"])
|
saved_properties[property["name"]] = object.get(property["name"])
|
||||||
saved_property_dictionary[id] = saved_properties
|
saved_property_dictionary[name] = saved_properties
|
||||||
|
GlobalState.set_level_state(level_name, saved_property_dictionary)
|
||||||
|
|
||||||
func get_saved_object_property(id: int, property: String):
|
|
||||||
if saved_property_dictionary.has(id) && saved_property_dictionary[id].has(property):
|
func get_saved_node_property(node: Node, property: String):
|
||||||
return saved_property_dictionary[id][property]
|
if (
|
||||||
|
saved_property_dictionary.has(node.name)
|
||||||
|
&& saved_property_dictionary[node.name].has(property)
|
||||||
|
):
|
||||||
|
return saved_property_dictionary[node.name][property]
|
||||||
else:
|
else:
|
||||||
return null
|
return null
|
||||||
|
|
||||||
|
|
||||||
func set_savepoint(pos: Vector2) -> void:
|
func set_savepoint(pos: Vector2) -> void:
|
||||||
GlobalState.set_savepoint(level_name, pos)
|
GlobalState.set_savepoint(level_name, pos)
|
||||||
save_object_properties()
|
|
||||||
GlobalState.set_uncompleted_level_time(level_name, level_time)
|
GlobalState.set_uncompleted_level_time(level_name, level_time)
|
||||||
GlobalState.set_level_state(level_name, saved_property_dictionary)
|
save_node_properties()
|
||||||
|
GlobalState.get_progress()[level_name]["currency"] = (
|
||||||
|
GlobalState.get_property_value(level_name, "currency")
|
||||||
|
+ currency)
|
||||||
|
currency = 0
|
||||||
|
update_global_state()
|
||||||
|
|
||||||
|
|
||||||
func load_savepoint() -> bool:
|
func load_savepoint() -> bool:
|
||||||
@ -95,6 +106,9 @@ func load_savepoint() -> bool:
|
|||||||
return false
|
return false
|
||||||
saved_property_dictionary = GlobalState.get_savestate(level_name)
|
saved_property_dictionary = GlobalState.get_savestate(level_name)
|
||||||
level_time = GlobalState.get_uncompleted_level_time(level_name)
|
level_time = GlobalState.get_uncompleted_level_time(level_name)
|
||||||
|
# Just update the hud
|
||||||
|
set_currency(currency)
|
||||||
|
savepoint_loaded = true
|
||||||
return true
|
return true
|
||||||
|
|
||||||
|
|
||||||
@ -134,48 +148,48 @@ func absolved_tutorial(lesson: String) -> void:
|
|||||||
# and returns true if so. Else it does not spend and return false.
|
# and returns true if so. Else it does not spend and return false.
|
||||||
func spend_currency(cost: int) -> bool:
|
func spend_currency(cost: int) -> bool:
|
||||||
# TODO member that
|
# TODO member that
|
||||||
if OS.is_debug_build():
|
#if OS.is_debug_build():
|
||||||
return true
|
# return true
|
||||||
if check_balance() < cost:
|
if check_balance() < cost:
|
||||||
return false
|
return false
|
||||||
# Can get negative if the cost is greater than what was collected in the same level
|
# Can get negative if the cost is greater than what was collected in the same level
|
||||||
currency = currency - cost
|
currency = currency - cost
|
||||||
return true
|
return true
|
||||||
|
|
||||||
|
|
||||||
func check_balance() -> int:
|
func check_balance() -> int:
|
||||||
var balance = currency + GlobalState.get_wallet()
|
var balance = currency + GlobalState.get_wallet() + GlobalState.get_property_value(level_name, "currency")
|
||||||
return balance
|
return balance
|
||||||
|
|
||||||
|
|
||||||
func _on_level_completed():
|
func _on_level_completed():
|
||||||
#if(OS.is_debug_build()):
|
#if(OS.is_debug_build()):
|
||||||
# return
|
# return
|
||||||
# TODO Extra screen for new best time
|
# TODO Extra screen for new best time
|
||||||
|
save_node_properties()
|
||||||
|
savepoint_loaded = false
|
||||||
GlobalState.set_level_completed(level_name, true)
|
GlobalState.set_level_completed(level_name, true)
|
||||||
if(GlobalState.get_level_time(level_name) > level_time ):
|
if GlobalState.get_level_time(level_name) > level_time:
|
||||||
GlobalState.set_leveltime(level_name, level_time)
|
GlobalState.set_level_time(level_name, level_time)
|
||||||
GlobalState.set_uncompleted_level_time(level_name, INF)
|
GlobalState.set_uncompleted_level_time(level_name, INF)
|
||||||
GlobalState.remove_savepoint(level_name)
|
|
||||||
GlobalState.remove_savestate(level_name)
|
|
||||||
update_global_state()
|
update_global_state()
|
||||||
|
GlobalState.remove_savepoint(level_name)
|
||||||
reset()
|
reset()
|
||||||
|
|
||||||
|
|
||||||
# TODO This is now inconsistent as the level_completed property could be used to
|
# TODO This is now inconsistent as the level_completed property could be used to
|
||||||
# determine what was achieved for good and what progress was lost due to death/reloading
|
# determine what was achieved for good and what progress was lost due to death/reloading
|
||||||
func update_global_state() -> void:
|
func update_global_state() -> void:
|
||||||
var progress_dict: Dictionary = GlobalState.get_progress()
|
var progress_dict: Dictionary = GlobalState.get_progress()
|
||||||
var levelProgress: Dictionary = {}
|
var levelProgress: Dictionary = {}
|
||||||
|
|
||||||
levelProgress["currency"] = currency
|
|
||||||
levelProgress["deaths"] = deaths
|
levelProgress["deaths"] = deaths
|
||||||
|
|
||||||
# TODO Doesnt account for multiple plays of same level
|
# TODO Doesnt account for multiple plays of same level
|
||||||
if !progress_dict.has(level_name):
|
if !progress_dict.has(level_name):
|
||||||
progress_dict[level_name] = levelProgress
|
progress_dict[level_name] = levelProgress
|
||||||
else:
|
else:
|
||||||
progress_dict[level_name]["currency"] = (
|
|
||||||
GlobalState.get_property_value(level_name, "currency")
|
|
||||||
+ currency
|
|
||||||
)
|
|
||||||
progress_dict[level_name]["deaths"] = (
|
progress_dict[level_name]["deaths"] = (
|
||||||
GlobalState.get_property_value(level_name, "deaths")
|
GlobalState.get_property_value(level_name, "deaths")
|
||||||
+ deaths
|
+ deaths
|
||||||
@ -186,11 +200,15 @@ func update_global_state() -> void:
|
|||||||
for frog_number in freed_frogs:
|
for frog_number in freed_frogs:
|
||||||
if progress_dict[level_name]["froggies"].has(frog_number):
|
if progress_dict[level_name]["froggies"].has(frog_number):
|
||||||
progress_dict[level_name]["froggies"][frog_number] = true
|
progress_dict[level_name]["froggies"][frog_number] = true
|
||||||
|
if GlobalState.get_level_completed(level_name):
|
||||||
# TODO Wallet is independant from progress_dict because???
|
currency += GlobalState.get_property_value(level_name, "currency")
|
||||||
GlobalState.set_wallet(GlobalState.gsr.wallet + currency)
|
GlobalState.set_wallet(GlobalState.gsr.wallet + currency)
|
||||||
|
progress_dict[level_name]["currency"] = 0
|
||||||
|
currency = 0
|
||||||
|
# Adds currency to level progress temporarily
|
||||||
GlobalState.set_progress(progress_dict)
|
GlobalState.set_progress(progress_dict)
|
||||||
|
|
||||||
|
|
||||||
func player_dying(animation_number: int = 0) -> void:
|
func player_dying(animation_number: int = 0) -> void:
|
||||||
currency = 0
|
currency = 0
|
||||||
is_dead = true
|
is_dead = true
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user