Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
alexmunoz502 committed Aug 26, 2024
1 parent 5479b9f commit f066f6b
Show file tree
Hide file tree
Showing 9 changed files with 342 additions and 9 deletions.
43 changes: 35 additions & 8 deletions global/autoload/save_file/save_file.gd
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
extends Node

signal save_file_imported(save_file_name: String)

const SIGNATURE = "$$$"
const SAVE_FILE_EXTENSION = ".json"
const AUTOSAVE_SECONDS: int = Game.PARAMS["autosave_seconds"]
Expand Down Expand Up @@ -297,7 +299,8 @@ func prestige(infinity_count: int) -> void:
if not first_time:
backup_file_name = active_file_name + ".BAK_LAST"
_update_metadata()
_write(backup_file_name)
var save_data: Dictionary = _export_save_data()
_write(backup_file_name, save_data)

# prestige save file data
#
Expand Down Expand Up @@ -341,11 +344,36 @@ func prestige(infinity_count: int) -> void:
# write save file data
var file_name: String = active_file_name
_update_metadata()
_write(file_name)
save_data = _export_save_data()
_write(file_name, save_data)

# autosave_timer.start()


func export_as_string(save_file_name: String) -> String:
var encoded_save_file: String = Marshalls.variant_to_base64(save_datas[save_file_name])
return encoded_save_file


func import_from_string(encoded_string: String) -> bool:
var decoded_save_file: Variant = Marshalls.base64_to_variant(encoded_string)
if decoded_save_file == null or not decoded_save_file is Dictionary:
return false

var save_file_name: String = decoded_save_file.get("metadata", {}).get("save_file_name")
if save_file_name:
while SaveFile.save_datas.has(save_file_name):
save_file_name = StringUtils.increment_int_suffix(
save_file_name, SaveFile.save_datas.keys()
)
decoded_save_file["metadata"]["save_file_name"] = save_file_name
save_datas[save_file_name] = decoded_save_file
save_file_imported.emit(save_file_name)
return true

return false


###########
## setup ##
###########
Expand Down Expand Up @@ -413,7 +441,8 @@ func _autosave(force: bool = false, silent: bool = false) -> void:

var file_name: String = active_file_name
_update_metadata()
_write(file_name)
var save_data: Dictionary = _export_save_data()
_write(file_name, save_data)


func _get_seconds_since_last_autosave() -> int:
Expand Down Expand Up @@ -741,12 +770,10 @@ func _on_offline_progress_processed(
##############


func _write(file_name: String) -> void:
var save_data: Dictionary = _export_save_data()

check_backward_corrupt_worker_role(save_data)
func _write(file_name: String, data: Dictionary) -> void:
check_backward_corrupt_worker_role(data)

var content: String = JSON.stringify(save_data)
var content: String = JSON.stringify(data)
content += SIGNATURE

var path: String = FileSystemUtils.USER_PATH + file_name
Expand Down
2 changes: 2 additions & 0 deletions global/autoload/signal_bus/signal_bus.gd
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ signal heart_unclick
signal prestige_cancel
signal prestige_yes
signal prestige_reborn
signal open_import_modal
signal open_export_modal(save_file_name: String)

## CONTROLLER
signal main_ready
Expand Down
9 changes: 9 additions & 0 deletions global/const/locale/locale_en.gd
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,15 @@ const UI_LABEL: Dictionary = {
"load": "Load",
"delete": "Delete",
"new_game": "New Game",
"import": "Import",
"import_tooltip": "Restore your progress from a previous session.",
"import_placeholder": "Paste save file code here",
"import_error": "Import failed. Please check your save file code and try again.",
"export": "Export",
"export_tooltip": "Copy and save this code to restore your progress later.",
"import_title": "Import Save",
"export_title": "Export Save",
"accept": "Accept",
"dear_diary": "Dear Diary",
"resource_storage": "Resource Storage",
"upgrade": "Upgrade",
Expand Down
7 changes: 6 additions & 1 deletion scenes/autostart/save_file_picker/save_file_picker.tscn
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
[gd_scene load_steps=3 format=3 uid="uid://b1aukxlmjun2b"]
[gd_scene load_steps=4 format=3 uid="uid://b1aukxlmjun2b"]

[ext_resource type="Script" path="res://scenes/autostart/save_file_picker/save_file_picker.gd" id="1_kcqmi"]
[ext_resource type="PackedScene" uid="uid://c7vond3ba2425" path="res://scenes/ui/save_file_modal/save_file_modal.tscn" id="3_wirjs"]
[ext_resource type="PackedScene" uid="uid://cacyvnvhq6xau" path="res://scenes/autostart/save_file_picker/save_file_tracker/save_file_tracker.tscn" id="3_yhfy1"]

[node name="SaveFilePicker" type="Node"]
Expand All @@ -18,3 +19,7 @@ grow_vertical = 2
[node name="SaveFileTracker" parent="UI" instance=ExtResource("3_yhfy1")]
unique_name_in_owner = true
layout_mode = 1

[node name="SaveFileModal" parent="UI" instance=ExtResource("3_wirjs")]
visible = false
layout_mode = 1
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,13 @@ var _delete_counter: int = 0
@onready var load_button: Button = %LoadButton
@onready var delete_button: Button = %DeleteButton
@onready var new_button: Button = %NewButton
@onready var import_button: Button = %ImportButton
@onready var export_button: Button = %ExportButton
@onready var load_margin_container: MarginContainer = %LoadMarginContainer
@onready var delete_margin_container: MarginContainer = %DeleteMarginContainer
@onready var new_margin_container: MarginContainer = %NewMarginContainer
@onready var import_margin_container: MarginContainer = %ImportMarginContainer
@onready var export_margin_container: MarginContainer = %ExportMarginContainer
@onready var section_h_box_container: HBoxContainer = %SectionHBoxContainer

###############
Expand Down Expand Up @@ -99,9 +103,13 @@ func _set_ui_labels() -> void:
var ui_load: String = Locale.get_ui_label("load")
var ui_delete: String = Locale.get_ui_label("delete")
var ui_new_game: String = Locale.get_ui_label("new_game")
var ui_import: String = Locale.get_ui_label("import")
var ui_export: String = Locale.get_ui_label("export")
load_button.text = ui_load
delete_button.text = ui_delete
new_button.text = ui_new_game
import_button.text = ui_import
export_button.text = ui_export


func _add_section(
Expand All @@ -125,10 +133,14 @@ func _display_new(new: bool) -> void:
load_margin_container.visible = false
delete_margin_container.visible = false
new_margin_container.visible = true
import_margin_container.visible = true
export_margin_container.visible = false
else:
load_margin_container.visible = true
delete_margin_container.visible = true
new_margin_container.visible = false
import_margin_container.visible = false
export_margin_container.visible = true


func _display_delete_counter() -> void:
Expand Down Expand Up @@ -164,6 +176,8 @@ func _connect_signals() -> void:
new_button.button_up.connect(_on_new_button)
delete_button.button_up.connect(_on_delete_button)
delete_button.mouse_exited.connect(_on_delete_reset)
import_button.button_up.connect(_on_import_button)
export_button.button_up.connect(_on_export_button)


func _on_load_button() -> void:
Expand All @@ -178,6 +192,14 @@ func _on_delete_button() -> void:
_handle_on_delete_button()


func _on_import_button() -> void:
SignalBus.open_import_modal.emit()


func _on_export_button() -> void:
SignalBus.open_export_modal.emit(_save_file_name)


func _on_delete_reset() -> void:
_delete_counter = 0
_display_delete_counter()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,3 +103,37 @@ custom_minimum_size = Vector2(60, 0)
layout_mode = 2
theme_type_variation = &"ProgressButton"
text = "Delete"

[node name="ImportMarginContainer" type="MarginContainer" parent="HBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 6
theme_override_constants/margin_left = 8
theme_override_constants/margin_top = 2
theme_override_constants/margin_right = 2
theme_override_constants/margin_bottom = 2

[node name="ImportButton" type="Button" parent="HBoxContainer/ImportMarginContainer"]
unique_name_in_owner = true
modulate = Color(0.110884, 0.492636, 0.821255, 1)
custom_minimum_size = Vector2(60, 0)
layout_mode = 2
theme_type_variation = &"ProgressButton"
text = "Import"

[node name="ExportMarginContainer" type="MarginContainer" parent="HBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 6
theme_override_constants/margin_left = 8
theme_override_constants/margin_top = 2
theme_override_constants/margin_right = 2
theme_override_constants/margin_bottom = 2

[node name="ExportButton" type="Button" parent="HBoxContainer/ExportMarginContainer"]
unique_name_in_owner = true
modulate = Color(0.110884, 0.492636, 0.821255, 1)
custom_minimum_size = Vector2(60, 0)
layout_mode = 2
theme_type_variation = &"ProgressButton"
text = "Export"
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ func _ready() -> void:
_clear_items()
_load_save_files()
owner.ready.connect(_on_ready)
SaveFile.save_file_imported.connect(_on_save_file_imported)


###########
Expand Down Expand Up @@ -50,6 +51,12 @@ func _load_save_files() -> void:
_add_item(metadata, save_file_name, false)


func add_item_from_file_name(save_file_name: String, new: bool) -> SaveFileItem:
var save_file_data: Dictionary = SaveFile.save_datas[save_file_name]
var metadata: Dictionary = save_file_data.get("metadata", {})
return _add_item(metadata, save_file_name, new)


func _add_item(metadata: Dictionary, save_file_name: String, new: bool) -> SaveFileItem:
var save_file_item: SaveFileItem = save_file_item_scene.instantiate() as SaveFileItem
save_file_item.set_data(metadata, save_file_name, new)
Expand Down Expand Up @@ -94,3 +101,8 @@ func _on_delete_button_click(save_file_name: String) -> void:

func _on_new_input_set(save_file_name: String, new_text: String, old_text: String) -> void:
new_input_set.emit(save_file_name, new_text, old_text)


func _on_save_file_imported(save_file_name: String) -> void:
add_item_from_file_name(save_file_name, false)
load_save_file.emit(save_file_name)
129 changes: 129 additions & 0 deletions scenes/ui/save_file_modal/save_file_modal.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
class_name SaveFileModal extends Control

enum Mode { IMPORT, EXPORT }

@onready var title: Label = %Title
@onready var text_area: TextEdit = %TextArea
@onready var close_button: Button = %CloseButton
@onready var import_button: Button = %ImportButton
@onready var accept_button: Button = %AcceptButton
@onready var tooltip: Label = %Tooltip
@onready var error_message: Label = %ErrorMessage

###############
## overrides ##
###############


func _ready() -> void:
_initialize()
_connect_signals()


#############
## helpers ##
#############


func _initialize() -> void:
visible = false
text_area.clear()


func _set_import_ui_labels() -> void:
title.text = Locale.get_ui_label("import_title")
import_button.text = Locale.get_ui_label("import")
accept_button.text = ""
text_area.placeholder_text = Locale.get_ui_label("import_placeholder")
error_message.text = ""
tooltip.text = Locale.get_ui_label("import_tooltip")


func _set_export_ui_labels() -> void:
title.text = Locale.get_ui_label("export_title")
import_button.text = ""
accept_button.text = Locale.get_ui_label("accept")
text_area.placeholder_text = ""
error_message.text = ""
tooltip.text = Locale.get_ui_label("export_tooltip")


func _set_modal_options(mode: Mode, save_file_name: String) -> void:
error_message.hide()

match mode:
Mode.IMPORT:
_set_import_ui_labels()
text_area.editable = true
accept_button.hide()
import_button.show()
Mode.EXPORT:
_set_export_ui_labels()
text_area.editable = false
accept_button.show()
import_button.hide()

_load_save_file_string(save_file_name)
_:
push_error("Unknown mode %s" % mode)


func _load_save_file_string(save_file_name: String) -> void:
text_area.text = SaveFile.export_as_string(save_file_name)


func _handle_save_file_import() -> void:
var import_success: bool = SaveFile.import_from_string(text_area.text)
if import_success:
close()
else:
error_message.text = Locale.get_ui_label("import_error")
error_message.show()


#############
## methods ##
#############


func open(mode: Mode, save_file_name: String = "") -> void:
_set_modal_options(mode, save_file_name)
visible = true


func close() -> void:
text_area.clear()
visible = false


#############
## signals ##
#############


func _connect_signals() -> void:
close_button.button_up.connect(_on_close_button)
accept_button.button_up.connect(_on_accept_button)
import_button.button_up.connect(_on_import_button)
SignalBus.open_import_modal.connect(_on_open_import_modal)
SignalBus.open_export_modal.connect(_on_open_export_modal)


func _on_open_import_modal() -> void:
open(Mode.IMPORT)


func _on_open_export_modal(save_file_name: String) -> void:
open(Mode.EXPORT, save_file_name)


func _on_close_button() -> void:
close()


func _on_accept_button() -> void:
close()


func _on_import_button() -> void:
_handle_save_file_import()
Loading

0 comments on commit f066f6b

Please sign in to comment.