Files
TheGame/scripts/AdvancedSaveDialog.cs
Björn Blomberg 74062a37d6 Add localization support and refactor menus
- Implemented LocalizationManager for handling multiple languages.
- Updated LoadGameMenu, MainMenu, PauseMenu, and SettingsMenu to support localization.
- Added InstanceSelectionMenu for selecting game instances.
- Refactored SaveManager to handle new SaveInstance structure.
- Created SaveDialog for saving games with user-defined names.
- Enhanced SaveData to manage multiple save instances.
- Added error handling and logging for save/load operations.
- Updated UI elements to reflect localized text.
2025-10-17 14:22:21 +02:00

302 lines
11 KiB
C#

using Godot;
namespace TheGame
{
public partial class AdvancedSaveDialog : AcceptDialog
{
private LineEdit _nameInput;
private CheckBox _newInstanceCheck;
private Label _infoLabel;
private Game _gameController;
private SaveData _existingSaveData;
public override void _Ready()
{
// Sätt process mode så att dialogen fungerar när spelet är pausat
ProcessMode = ProcessModeEnum.WhenPaused;
var loc = LocalizationManager.Instance;
Title = loc.GetText("save_dialog_title");
// Kontrollera om det finns befintlig save för denna seed
var saveManager = new SaveManager();
if (GameState.CurrentGameSeed != null)
{
_existingSaveData = saveManager.FindSaveDataBySeed(GameState.CurrentGameSeed);
}
CreateDialogContent();
// Sätt process mode på alla child nodes
SetProcessModeRecursive(this, ProcessModeEnum.WhenPaused);
}
private void CreateDialogContent()
{
var vbox = new VBoxContainer();
if (_existingSaveData == null || _existingSaveData.Instances.Count == 0)
{
// Första gången man sparar detta spel - bara namn input
CreateFirstTimeSaveUI(vbox);
}
else
{
// Det finns befintliga saves - visa alternativ
CreateExistingSaveUI(vbox);
}
AddChild(vbox);
}
private void CreateFirstTimeSaveUI(VBoxContainer vbox)
{
var loc = LocalizationManager.Instance;
var infoLabel = new Label();
infoLabel.Text = "This is your first save for this game.";
infoLabel.AutowrapMode = TextServer.AutowrapMode.WordSmart;
vbox.AddChild(infoLabel);
var separator = new HSeparator();
vbox.AddChild(separator);
// Save name input
var nameLabel = new Label();
nameLabel.Text = loc.GetText("save_dialog_enter_name");
vbox.AddChild(nameLabel);
_nameInput = new LineEdit();
_nameInput.PlaceholderText = loc.GetText("save_dialog_placeholder");
_nameInput.Text = $"Save {System.DateTime.Now:HH:mm:ss}";
vbox.AddChild(_nameInput);
// Anslut signaler
Confirmed += OnSaveConfirmed;
// Fokusera på text input
_nameInput.GrabFocus();
_nameInput.SelectAll();
}
private void CreateExistingSaveUI(VBoxContainer vbox)
{
var latestInstance = _existingSaveData.GetLatestInstance();
var infoLabel = new Label();
infoLabel.Text = $"Game Seed: {_existingSaveData.GameSeed.ToString()}\nExisting saves: {_existingSaveData.Instances.Count}\nLatest: {latestInstance.DisplayName} ({latestInstance.GetFormattedGameTime()})";
infoLabel.AutowrapMode = TextServer.AutowrapMode.WordSmart;
vbox.AddChild(infoLabel);
var separator = new HSeparator();
vbox.AddChild(separator);
// Button för att skriva över senaste save
var overwriteButton = new Button();
overwriteButton.Text = "Save over the last save point";
overwriteButton.CustomMinimumSize = new Vector2(0, 40);
overwriteButton.Pressed += OnOverwriteLatestPressed;
vbox.AddChild(overwriteButton);
// Button för att skapa ny save point
var newSaveButton = new Button();
newSaveButton.Text = "Save a new save point";
newSaveButton.CustomMinimumSize = new Vector2(0, 40);
newSaveButton.Pressed += OnNewSavePressed;
vbox.AddChild(newSaveButton);
// Dölj standard OK-knappen
GetOkButton().Visible = false;
}
public void Initialize(Game gameController)
{
_gameController = gameController;
}
private void ShowErrorDialog(string message)
{
var errorDialog = new AcceptDialog();
errorDialog.DialogText = message;
errorDialog.Title = "Save Error";
errorDialog.ProcessMode = ProcessModeEnum.WhenPaused;
GetTree().Root.AddChild(errorDialog);
errorDialog.PopupCentered();
}
private void OnOverwriteLatestPressed()
{
// Skriv över senaste save utan att fråga om namn
if (_gameController != null)
{
var saveManager = new SaveManager();
float currentTime = _gameController.GetGameTime();
bool saveSuccess = saveManager.SaveGame(currentTime, "", GameState.CurrentGameSeed, true); // overwriteLatest = true
if (saveSuccess)
{
GameState.MarkProgressAsSaved(currentTime);
_gameController.TogglePause();
}
else
{
ShowErrorDialog("Failed to save the game. Please try again.");
return;
}
}
QueueFree();
}
private void OnNewSavePressed()
{
// Visa namn-input dialog för ny save point
ShowNameInputDialog();
}
private void ShowNameInputDialog()
{
// Rensa nuvarande innehåll
foreach (Node child in GetChildren())
{
if (child != GetOkButton())
{
child.QueueFree();
}
}
var vbox = new VBoxContainer();
var loc = LocalizationManager.Instance;
var nameLabel = new Label();
nameLabel.Text = loc.GetText("save_dialog_enter_name");
vbox.AddChild(nameLabel);
_nameInput = new LineEdit();
_nameInput.PlaceholderText = loc.GetText("save_dialog_placeholder");
_nameInput.Text = $"Save {System.DateTime.Now:HH:mm:ss}";
vbox.AddChild(_nameInput);
AddChild(vbox);
// Visa OK-knappen igen och anslut till ny save
GetOkButton().Visible = true;
// Ta bort tidigare signaler och lägg till ny
if (IsConnected("confirmed", new Callable(this, nameof(OnSaveConfirmed))))
{
Disconnect("confirmed", new Callable(this, nameof(OnSaveConfirmed)));
}
Confirmed += OnNewSaveConfirmed;
// Fokusera på text input
_nameInput.GrabFocus();
_nameInput.SelectAll();
}
private void OnNewSaveConfirmed()
{
if (_gameController != null)
{
string saveName = _nameInput.Text.Trim();
if (string.IsNullOrEmpty(saveName))
{
saveName = $"Save {System.DateTime.Now:HH:mm:ss}";
}
var saveManager = new SaveManager();
float currentTime = _gameController.GetGameTime();
bool saveSuccess = saveManager.SaveGame(currentTime, saveName, GameState.CurrentGameSeed, false); // overwriteLatest = false (ny instans)
if (saveSuccess)
{
GameState.MarkProgressAsSaved(currentTime);
_gameController.TogglePause();
}
else
{
ShowErrorDialog("Failed to save the game. Please try again.");
return;
}
}
QueueFree();
}
private void OnSaveConfirmed()
{
// För första gången man sparar
if (_gameController != null)
{
string saveName = _nameInput.Text.Trim();
if (string.IsNullOrEmpty(saveName))
{
saveName = $"Save {System.DateTime.Now:HH:mm:ss}";
}
var saveManager = new SaveManager();
float currentTime = _gameController.GetGameTime();
bool saveSuccess = saveManager.SaveGame(currentTime, saveName, GameState.CurrentGameSeed, false); // Första save är alltid ny instans
if (saveSuccess)
{
GameState.MarkProgressAsSaved(currentTime);
_gameController.TogglePause();
}
else
{
ShowErrorDialog("Failed to save the game. Please try again.");
return;
}
}
QueueFree();
}
private void SetProcessModeRecursive(Node node, ProcessModeEnum mode)
{
if (node is Control control)
{
control.ProcessMode = mode;
}
foreach (Node child in node.GetChildren())
{
SetProcessModeRecursive(child, mode);
}
}
public override void _Input(InputEvent @event)
{
if (@event is InputEventKey keyEvent && keyEvent.Pressed)
{
if (keyEvent.Keycode == Key.Enter || keyEvent.Keycode == Key.KpEnter)
{
// Hantera Enter baserat på nuvarande state
if (_nameInput != null && _nameInput.Visible)
{
if (IsConnected("confirmed", new Callable(this, nameof(OnNewSaveConfirmed))))
{
OnNewSaveConfirmed();
}
else
{
OnSaveConfirmed();
}
}
GetViewport().SetInputAsHandled();
}
else if (keyEvent.Keycode == Key.Escape)
{
Hide();
QueueFree();
GetViewport().SetInputAsHandled();
}
}
}
}
}