summaryrefslogtreecommitdiff
path: root/scripts/Entities
diff options
context:
space:
mode:
authorMatheus <matheus.guedes.mg.m@gmail.com>2025-11-09 20:16:40 -0300
committerMatheus <matheus.guedes.mg.m@gmail.com>2025-11-09 20:16:50 -0300
commitc4f5404211ef654944d5615e9055c714441f8234 (patch)
treee1ff13c28c44deb9b3f9e4ac9a3ef8c5656769d4 /scripts/Entities
parent3840e41432593855f53013962f42da553264baeb (diff)
desgosto
Este commit marca minha desistência oficial do projeto. Minha preocupação em seguir um tutorial, adicionando minhas próprias features sem se importar com o design da aplicação como um todo resultou em um código maior que o necessário e difícil de manter. Toda vez que eu me forço a trabalhar no jogo, me sinto extremamente desmotivado e enojado. Os próximos commits serão para terminar o jogo para a apresentação. Eu planejo fazer um novo roguelike durante minhas férias da faculade, sem prazos, sem a limitação de usar todos os pilares da programação orientada a objetos e com planejamento minimamente decente. O projeto como um todo não foi um desperdício de tempo. Não só me ensinou o que não fazer, como também será um ótimo alimento para o copilot e outros LLMs. - Matheus Ferreira Guedes.
Diffstat (limited to 'scripts/Entities')
-rw-r--r--scripts/Entities/Actions/EscapeAction.cs76
-rw-r--r--scripts/Entities/Actors/Actor.cs6
2 files changed, 80 insertions, 2 deletions
diff --git a/scripts/Entities/Actions/EscapeAction.cs b/scripts/Entities/Actions/EscapeAction.cs
index f0b1ed5..1b3aae2 100644
--- a/scripts/Entities/Actions/EscapeAction.cs
+++ b/scripts/Entities/Actions/EscapeAction.cs
@@ -1,13 +1,85 @@
+using System;
+using Godot;
+using Godot.Collections;
+using Microsoft.VisualBasic;
using TheLegendOfGustav.Entities.Actors;
using TheLegendOfGustav.Utils;
namespace TheLegendOfGustav.Entities.Actions;
-public partial class EscapeAction(Actor actor) : Action(actor)
+public partial class EscapeAction(Actor actor, bool should_save = false) : Action(actor)
{
+ private bool should_save = should_save;
public override bool Perform()
{
- Actor.MapData.SaveGame();
+ if (should_save) {
+ Actor.MapData.SaveGame();
+ } else {
+ // game over
+ bool hasLeaderboardFile = FileAccess.FileExists("user://placar.json");
+ if (hasLeaderboardFile) {
+ using var leaderboardFile = FileAccess.Open("user://placar.json", FileAccess.ModeFlags.ReadWrite);
+ string boardString = leaderboardFile.GetLine();
+
+ Dictionary<string, Variant> leaderBoardData;
+
+ try {
+ var parseResult = Json.ParseString(boardString);
+ if (parseResult.VariantType == Variant.Type.Nil) {
+ throw new Exception();
+ }
+ leaderBoardData = (Dictionary<string, Variant>)parseResult;
+ } catch (Exception)
+ {
+ leaderboardFile.Resize(0);
+ leaderboardFile.Seek(0);
+
+ leaderBoardData = new()
+ {
+ {"placar", new Array<Dictionary<string, Variant>>() {Stats.Instance.Serialize()}}
+ };
+ boardString = Json.Stringify(leaderBoardData);
+
+ leaderboardFile.StoreLine(boardString);
+
+ SignalBus.Instance.EmitSignal(SignalBus.SignalName.EscapeRequested);
+ return false;
+ }
+
+ Array<Dictionary<string, Variant>> players = (Array<Dictionary<string, Variant>>)leaderBoardData["placar"];
+
+ players.Add(Stats.Instance.Serialize());
+
+ for (int i = 0; i < players.Count; i++) {
+ for (int j = 0; j < players.Count - 1 - i; j++) {
+ if ((int)players[j]["andar_mais_fundo"] < (int)players[j + 1]["andar_mais_fundo"]) {
+ Dictionary<string, Variant> tmp = players[j];
+ players[j] = players[j + 1];
+ players[j + 1] = tmp;
+ }
+ }
+ }
+
+ if (players.Count > 10) {
+ players = players.GetSliceRange(0, 10);
+ }
+
+ leaderBoardData["placar"] = players;
+
+ leaderboardFile.Resize(0);
+ leaderboardFile.Seek(0);
+ leaderboardFile.StoreLine(Json.Stringify(leaderBoardData));
+ } else {
+ using var leaderboardFile = FileAccess.Open("user://placar.json", FileAccess.ModeFlags.Write);
+ Dictionary<string, Variant> leaderBoardData = new()
+ {
+ {"placar", new Array<Dictionary<string, Variant>>() {Stats.Instance.Serialize()}}
+ };
+ string boardString = Json.Stringify(leaderBoardData);
+
+ leaderboardFile.StoreLine(boardString);
+ }
+ }
SignalBus.Instance.EmitSignal(SignalBus.SignalName.EscapeRequested);
return false;
}
diff --git a/scripts/Entities/Actors/Actor.cs b/scripts/Entities/Actors/Actor.cs
index c68cc2b..e6b8867 100644
--- a/scripts/Entities/Actors/Actor.cs
+++ b/scripts/Entities/Actors/Actor.cs
@@ -101,6 +101,9 @@ public partial class Actor : Entity, ISaveable
get => hp;
set
{
+ if (MapData != null && MapData.Player == this && hp > value) {
+ Stats.Instance.DamageTaken += (hp - value);
+ }
// Esta propriedade impede que o HP seja maior que o máximo.
hp = int.Clamp(value, 0, MaxHp);
EmitSignal(SignalName.HealthChanged, Hp, MaxHp);
@@ -280,6 +283,9 @@ public partial class Actor : Entity, ISaveable
else
{
deathMessage = $"{DisplayName} morreu!";
+ if (!inLoading) {
+ Stats.Instance.EnemiesKilled++;
+ }
}