initial game save implementation using ConfigFile, plus some experimentation with ResourceSaver though nonfunctional

This commit is contained in:
tonydero 2024-10-29 10:30:19 -06:00
parent db865e2ab9
commit 249c58af46
6 changed files with 129 additions and 13 deletions

View File

@ -30,15 +30,27 @@ layout_mode = 2
text = "Play
"
[node name="TestButton" type="Button" parent="MenuButtons"]
[node name="SaveButton" type="Button" parent="MenuButtons"]
layout_mode = 2
text = "Test
text = "Save"
[node name="LoadButton" type="Button" parent="MenuButtons"]
layout_mode = 2
text = "Load
"
[node name="ExitButton" type="Button" parent="MenuButtons"]
layout_mode = 2
text = "Exit"
[node name="TestButton" type="Button" parent="MenuButtons"]
visible = false
layout_mode = 2
text = "Test
"
[connection signal="pressed" from="MenuButtons/PlayButton" to="." method="_on_play_button_pressed"]
[connection signal="pressed" from="MenuButtons/TestButton" to="." method="_on_test_button_pressed"]
[connection signal="pressed" from="MenuButtons/SaveButton" to="." method="_on_save_button_pressed"]
[connection signal="pressed" from="MenuButtons/LoadButton" to="." method="_on_load_button_pressed"]
[connection signal="pressed" from="MenuButtons/ExitButton" to="." method="_on_exit_button_pressed"]
[connection signal="pressed" from="MenuButtons/TestButton" to="." method="_on_test_button_pressed"]

View File

@ -2,7 +2,9 @@
extends Node
var debugSpeedEnabled : bool
var debugSpeedEnabled: bool
var player_save := ConfigFile.new()
class World:
enum Zone {
@ -95,7 +97,7 @@ func elapsed_time_format(elapsed_time: Array, round_seconds: bool = true) -> Str
var days_format = "%d days "
if elapsed_time[3] == 0:
days_format = ""
elapsed_time = elapsed_time.slice(0,3)
elapsed_time = elapsed_time.slice(0, 3)
if round_seconds:
seconds_format = "%02d"
elapsed_time.reverse()
@ -108,3 +110,33 @@ func _input(event: InputEvent) -> void:
Engine.time_scale = 10.0
if event.is_action_pressed("game_speed_normal"):
Engine.time_scale = 1.0
func save_game() -> void:
player_save.set_value("player", "player_name", PlayerState.player_name)
player_save.set_value("player", "constitution", PlayerState.constitution)
player_save.set_value("player", "experience", PlayerState.experience)
player_save.set_value("player", "level", PlayerState.level)
player_save.set_value("player", "base_health", PlayerState.base_health)
player_save.set_value("player", "base_resource", PlayerState.base_resource)
player_save.set_value("player", "weapon_type", PlayerState.weapon_type)
player_save.set_value("player", "zone_duration", PlayerState.zone_duration)
player_save.save_encrypted_pass("user://player_save.sav", "test")
func load_game() -> void:
var err = player_save.load_encrypted_pass("user://player_save.sav", "test")
if err != OK:
print("Failed to load save file.")
return
PlayerState.player_name = player_save.get_value("player", "player_name")
PlayerState.constitution = player_save.get_value("player", "constitution")
PlayerState.experience = player_save.get_value("player", "experience")
PlayerState.level = player_save.get_value("player", "level")
PlayerState.base_health = player_save.get_value("player", "base_health")
PlayerState.base_resource = player_save.get_value("player", "base_resource")
PlayerState.weapon_type = player_save.get_value("player", "weapon_type")
PlayerState.zone_duration = player_save.get_value("player", "zone_duration")

View File

@ -7,7 +7,6 @@ const EXP_EXPONENT := 2.4
var area_exp := 0.0
var current_health: int
var resource_type: String
var current_resource: int
var max_health
var max_resource
@ -17,12 +16,26 @@ func _ready() -> void:
SignalBus.enemy_died.connect(_on_enemy_died)
SignalBus.quest_completed.connect(_on_quest_completed)
SignalBus.enemy_damaged_player.connect(_on_enemy_damaged_player)
max_health = PlayerState.max_health
max_resource = PlayerState.max_resource
max_health = _set_player_health()
max_resource = _set_player_resource()
_set_player_health_display()
_set_player_resource_display()
$PlayerExpBar.value = _get_level_progress_percent()
$PlayerLabel/PlayerLevel.text = str(floor(PlayerState.level))
func _set_player_health() -> int:
# modify player health based on stats or temporary buffs
return PlayerState.base_health * PlayerState.constitution
func _set_player_resource() -> int:
# modify player resources based on weapon and stats or temporary buffs
match PlayerState.weapon_type:
Globals.Weapon.WeaponType.BOW:
return PlayerState.base_resource
_:
return PlayerState.base_resource
func _on_enemy_died(enemyDifficulty, enemyTier, _enemyFaction) -> void:
@ -84,7 +97,7 @@ func _update_player_resource(change: int) -> void:
var prev_resource = current_resource
var new_resource = prev_resource + change
current_resource = new_resource
PlayerState.current_resource = current_resource
# PlayerState.current_resource = current_resource
if current_resource <= 0:
$PlayerResourceBar/PlayerResourceCurrent.text = str(0)
$PlayerResourceBar.value = 0

46
scripts/PlayerData.gd Normal file
View File

@ -0,0 +1,46 @@
# player save data resource to use with ResourceSaver
class_name PlayerData
extends Resource
@export var player_name := "Player"
@export var constitution := 1
@export var experience := 0.0
@export var level := 1.0
@export var base_health := 100
@export var base_resource := 100
@export var weapon_type: Globals.Weapon.WeaponType
@export var zone_duration := 0
# Confused on where this all goes...
# Let's assume the PlayerState is the node where we save the player data in game
var PlayerState: Node
var save_path := "user://player_data.tres" # <- tres is Text RESource
func save() -> void:
var data := PlayerData.new()
data.player_name = PlayerState.player_name
data.constitution = PlayerState.constitution
data.experience = PlayerState.experience
data.level = PlayerState.level
data.base_health = PlayerState.base_health
data.base_resource = PlayerState.base_resource
data.weapon_type = PlayerState.weapon_type
data.zone_duration = PlayerState.zone_duration
var error := ResourceSaver.save(data, save_path)
if error:
print("An error happened while saving data: ", error)
func load() -> void:
var data: PlayerData = load(save_path)
PlayerState.player_name = data.player_name
PlayerState.constitution = data.constitution
PlayerState.experience = data.experience
PlayerState.level = data.level
PlayerState.base_health = data.base_health
PlayerState.base_resource = data.base_resource
PlayerState.weapon_type = data.weapon_type
PlayerState.zone_duration = data.zone_duration

View File

@ -4,12 +4,11 @@
extends Node
var player_name := "Player"
var constitution := 1
var experience := 0.0
var level := 1.0
var max_health := constitution * 100
var max_resource := 100
var current_resource := max_resource
var base_health := 100
var base_resource := 100
var weapon_type: Globals.Weapon.WeaponType
var zone_duration := 0

View File

@ -1,6 +1,11 @@
extends Control
func _ready() -> void:
if OS.is_debug_build():
$MenuButtons/TestButton.show()
func _on_play_button_pressed() -> void:
get_tree().change_scene_to_file("res://scenes/combatUIScene.tscn")
@ -9,5 +14,14 @@ func _on_exit_button_pressed() -> void:
get_tree().quit()
func _on_load_button_pressed() -> void:
Globals.load_game()
func _on_save_button_pressed() -> void:
# ResourceSaver.save(PlayerState, "user://player_state.tres")
Globals.save_game()
func _on_test_button_pressed() -> void:
pass # Replace with function body.