summaryrefslogtreecommitdiff
path: root/scripts/entities
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/entities')
-rw-r--r--scripts/entities/Entity.cs82
-rw-r--r--scripts/entities/Entity.cs.uid1
-rw-r--r--scripts/entities/EntityDefinition.cs17
-rw-r--r--scripts/entities/EntityDefinition.cs.uid1
-rw-r--r--scripts/entities/actors/AI/HostileEnemyAI.cs4
-rw-r--r--scripts/entities/actors/Actor.cs70
-rw-r--r--scripts/entities/actors/ActorDefinition.cs11
-rw-r--r--scripts/entities/actors/Enemy.cs6
-rw-r--r--scripts/entities/actors/actions/BumpAction.cs2
-rw-r--r--scripts/entities/actors/actions/DirectionalAction.cs4
-rw-r--r--scripts/entities/actors/actions/MeleeAction.cs14
-rw-r--r--scripts/entities/actors/actions/MovementAction.cs4
12 files changed, 135 insertions, 81 deletions
diff --git a/scripts/entities/Entity.cs b/scripts/entities/Entity.cs
new file mode 100644
index 0000000..fb83f90
--- /dev/null
+++ b/scripts/entities/Entity.cs
@@ -0,0 +1,82 @@
+using Godot;
+
+public partial class Entity : Sprite2D {
+ /// <summary>
+ /// A definição da entidade possui caracterísitcas padrões que definem
+ /// a entidade em questão.
+ /// </summary>
+ private EntityDefinition definition;
+
+ /// <summary>
+ /// É conveniente ter acesso ao mapa dentro da entidade. Isto porque ela existe dentro
+ /// do mapa, então é necessário ter acesso à algumas informações.
+ /// </summary>
+ public MapData Map_Data { get; set; }
+
+ private Vector2I gridPosition = Vector2I.Zero;
+ /// <summary>
+ /// Posição da entidade no mapa do jogo. Diferentemente de Position, GridPosition tem como formato
+ /// os tiles do mapa.
+ /// </summary>
+ public Vector2I GridPosition {
+ set {
+ gridPosition = value;
+ // O sistema de coordenadas do Godot é em pixels, mas faz mais sentido para o jogo utilizar coordenadas em tiles.
+ // Esta propriedade converte um sistema para o outro automaticamente.
+ Position = Grid.GridToWorld(value);
+ }
+ get => gridPosition;
+ }
+
+ private bool blocksMovement;
+ /// <summary>
+ /// Se a entidade bloqueia movimento (não pode oculpar a mesma célula de outra entidade.)
+ /// </summary>
+ public bool BlocksMovement {
+ get => blocksMovement;
+ protected set {
+ blocksMovement = value;
+ }
+ }
+
+ private string displayName;
+ /// <summary>
+ /// Nome da entidade.
+ /// </summary>
+ public string DisplayName {
+ get => displayName;
+ protected set {
+ displayName = value;
+ }
+ }
+
+ public override void _Ready()
+ {
+ base._Ready();
+ // Quando a entidade for carregada completamente, atualizamos sua posição para refletir
+ // sua posição real.
+ GridPosition = Grid.WorldToGrid(Position);
+ }
+
+ public Entity(Vector2I initialPosition, MapData map, EntityDefinition definition) {
+ GridPosition = initialPosition;
+ Map_Data = map;
+ Centered = false;
+
+ SetDefinition(definition);
+ }
+
+ /// <summary>
+ /// Aplica uma definição de NPC para o ator.
+ /// Se o ator for um boneco de barro, este método é como um
+ /// sopro de vida.
+ /// </summary>
+ /// <param name="definition">A definição do ator.</param>
+ public virtual void SetDefinition(EntityDefinition definition) {
+ this.definition = definition;
+ BlocksMovement = definition.blocksMovement;
+ DisplayName = definition.name;
+ ZIndex = 1;
+ Texture = definition.texture;
+ }
+} \ No newline at end of file
diff --git a/scripts/entities/Entity.cs.uid b/scripts/entities/Entity.cs.uid
new file mode 100644
index 0000000..f178d64
--- /dev/null
+++ b/scripts/entities/Entity.cs.uid
@@ -0,0 +1 @@
+uid://w1325qe64c6w
diff --git a/scripts/entities/EntityDefinition.cs b/scripts/entities/EntityDefinition.cs
new file mode 100644
index 0000000..19693db
--- /dev/null
+++ b/scripts/entities/EntityDefinition.cs
@@ -0,0 +1,17 @@
+using Godot;
+
+[GlobalClass]
+public partial class EntityDefinition : Resource{
+ [ExportCategory("Visuals")]
+ // Nome da entidade.
+ [Export]
+ public string name = "unnamed";
+ // Seu sprite.
+ [Export]
+ public Texture2D texture;
+
+ [ExportCategory("Mechanics")]
+ // Se a entidade bloqueia movimento.
+ [Export]
+ public bool blocksMovement = true;
+} \ No newline at end of file
diff --git a/scripts/entities/EntityDefinition.cs.uid b/scripts/entities/EntityDefinition.cs.uid
new file mode 100644
index 0000000..0aed6ab
--- /dev/null
+++ b/scripts/entities/EntityDefinition.cs.uid
@@ -0,0 +1 @@
+uid://bp33ly3hnjwk0
diff --git a/scripts/entities/actors/AI/HostileEnemyAI.cs b/scripts/entities/actors/AI/HostileEnemyAI.cs
index 35d6d1a..e7efd26 100644
--- a/scripts/entities/actors/AI/HostileEnemyAI.cs
+++ b/scripts/entities/actors/AI/HostileEnemyAI.cs
@@ -53,8 +53,8 @@ public partial class HostileEnemyAI : BaseAI
if (path.Count > 0) {
// Pegamos o próximo passo para o destino.
Vector2I destination = (Vector2I) path[0];
- // Se tiver um outro ator no caminho, paramos o nosso turno aqui.
- if (body.Map_Data.GetBlockingActorAtPosition(destination) != null) {
+ // Se tiver o caminho estiver bloqueado, paramos o nosso turno aqui.
+ if (body.Map_Data.GetBlockingEntityAtPosition(destination) != null) {
action = new WaitAction(body);
action.Perform();
return;
diff --git a/scripts/entities/actors/Actor.cs b/scripts/entities/actors/Actor.cs
index c77122a..dc8ba53 100644
--- a/scripts/entities/actors/Actor.cs
+++ b/scripts/entities/actors/Actor.cs
@@ -4,7 +4,7 @@ using Godot;
/// A classe de ator define um personagem no jogo.
/// </summary>
[GlobalClass]
-public partial class Actor : Sprite2D
+public partial class Actor : Entity
{
/// <summary>
/// Sinal emitido toda vez que o HP mudar.
@@ -25,12 +25,7 @@ public partial class Actor : Sprite2D
/// A definição do ator possui caracterísitcas padrões que definem
/// o ator em questão.
/// </summary>
- protected ActorDefinition definition;
- /// <summary>
- /// É conveniente ter acesso ao mapa dentro do ator. Isto porque suas ações são feitas dentro
- /// do mapa, então é necessário ter acesso à algumas informações.
- /// </summary>
- public MapData Map_Data { get; set; }
+ private ActorDefinition definition;
/// <summary>
/// Se o ator está vivo.
@@ -66,37 +61,6 @@ public partial class Actor : Sprite2D
Energy += Speed;
}
- private Vector2I gridPosition = Vector2I.Zero;
- /// <summary>
- /// Posição do ator no mapa do jogo. Diferentemente de Position, GridPosition tem como formato
- /// os tiles do mapa.
- /// </summary>
- public Vector2I GridPosition {
- set {
- gridPosition = value;
- // O sistema de coordenadas do Godot é em pixels, mas faz mais sentido para o jogo utilizar coordenadas em tiles.
- // Esta propriedade converte um sistema para o outro automaticamente.
- Position = Grid.GridToWorld(value);
- }
- get => gridPosition;
- }
-
- private bool blocksMovement;
- /// <summary>
- /// Se o ator bloqueia movimento (não pode oculpar a mesma célula de outro ator.)
- /// </summary>
- public bool BlocksMovement {
- get => blocksMovement;
- }
-
- private string actorName;
- /// <summary>
- /// Nome do ator.
- /// </summary>
- public string ActorName {
- get => actorName;
- }
-
private int hp;
/// <summary>
/// HP máximo do ator.
@@ -147,14 +111,6 @@ public partial class Actor : Sprite2D
/// </summary>
public int Men { get; private set; }
- public override void _Ready()
- {
- base._Ready();
- // Quando o ator for carregado completamente, atualizamos sua posição para refletir
- // sua posição real.
- GridPosition = Grid.WorldToGrid(Position);
- }
-
/// <summary>
/// Move o ator para uma localização. Veja MovementAction.
/// </summary>
@@ -162,18 +118,15 @@ public partial class Actor : Sprite2D
public void Walk(Vector2I offset) {
// Cada ator tem um peso no sistema de pathfinding.
// Sempre que ele se mover, removemos seu peso da posição antiga
- Map_Data.UnregisterBlockingActor(this);
+ Map_Data.UnregisterBlockingEntity(this);
GridPosition += offset;
// E colocamos na próxima.
- Map_Data.RegisterBlockingActor(this);
+ Map_Data.RegisterBlockingEntity(this);
// Este peso influencia o algoritmo de pathfinding.
// Atores evitam caminhos bloqueados. por outros atores.
}
- public Actor(Vector2I initialPosition, MapData map, ActorDefinition definition) {
- GridPosition = initialPosition;
- Map_Data = map;
- Centered = false;
+ public Actor(Vector2I initialPosition, MapData map, ActorDefinition definition) : base(initialPosition, map, definition) {
SetDefinition(definition);
}
@@ -200,11 +153,10 @@ public partial class Actor : Sprite2D
/// </summary>
/// <param name="definition">A definição do ator.</param>
public virtual void SetDefinition(ActorDefinition definition) {
+ base.SetDefinition(definition);
this.definition = definition;
- blocksMovement = definition.blocksMovement;
- actorName = definition.name;
+
ZIndex = 1;
- Texture = definition.texture;
MaxHp = definition.Hp;
Hp = definition.Hp;
@@ -248,16 +200,16 @@ public partial class Actor : Sprite2D
if (Map_Data.Player == this) {
deathMessage = "Você morreu!";
} else {
- deathMessage = $"{ActorName} morreu!";
+ deathMessage = $"{DisplayName} morreu!";
}
MessageLogData.Instance.AddMessage(deathMessage);
Texture = definition.deathTexture;
- blocksMovement = false;
+ BlocksMovement = false;
ZIndex = 0;
- actorName = $"Restos mortais de {actorName}";
- Map_Data.UnregisterBlockingActor(this);
+ DisplayName= $"Restos mortais de {DisplayName}";
+ Map_Data.UnregisterBlockingEntity(this);
EmitSignal(SignalName.Died);
}
} \ No newline at end of file
diff --git a/scripts/entities/actors/ActorDefinition.cs b/scripts/entities/actors/ActorDefinition.cs
index ab0160b..540ede0 100644
--- a/scripts/entities/actors/ActorDefinition.cs
+++ b/scripts/entities/actors/ActorDefinition.cs
@@ -4,23 +4,14 @@ using Godot;
/// Define de forma genérica as características de um ator.
/// </summary>
[GlobalClass]
-public partial class ActorDefinition : Resource
+public partial class ActorDefinition : EntityDefinition
{
[ExportCategory("Visuals")]
- // Nome do ator.
- [Export]
- public string name = "unnamed";
- // Seu sprite.
- [Export]
- public Texture2D texture;
// Sprite de morto
[Export]
public Texture2D deathTexture;
[ExportCategory("Mechanics")]
- // Se o ator bloqueia movimento.
- [Export]
- public bool blocksMovement = true;
[Export]
public int Speed { get; set;} = 10;
diff --git a/scripts/entities/actors/Enemy.cs b/scripts/entities/actors/Enemy.cs
index 19bcd2c..9c06417 100644
--- a/scripts/entities/actors/Enemy.cs
+++ b/scripts/entities/actors/Enemy.cs
@@ -16,13 +16,15 @@ public enum AIType
/// </summary>
public partial class Enemy : Actor
{
+ private EnemyDefinition definition;
/// <summary>
- /// A alma do ator. Gera ações que são executadas todo turno.
- /// </summary>
+ /// A alma do ator. Gera ações que são executadas todo turno.
+ /// </summary>
public BaseAI Soul { get; private set; }
public Enemy(Vector2I initialPosition, MapData map, EnemyDefinition definition) : base(initialPosition, map, definition)
{
+ this.definition = definition;
SetDefinition(definition);
}
diff --git a/scripts/entities/actors/actions/BumpAction.cs b/scripts/entities/actors/actions/BumpAction.cs
index 805520c..bee202b 100644
--- a/scripts/entities/actors/actions/BumpAction.cs
+++ b/scripts/entities/actors/actions/BumpAction.cs
@@ -19,7 +19,7 @@ public partial class BumpAction : DirectionalAction
Action action;
// Se houver um ator no destino, crie uma ação de ataque.
- if (GetTargetActor() != null) {
+ if (GetTarget() != null) {
action = new MeleeAction(actor, Offset);
} else {
// Mas se não houver, crie uma ação de movimento.
diff --git a/scripts/entities/actors/actions/DirectionalAction.cs b/scripts/entities/actors/actions/DirectionalAction.cs
index ca2ca95..9c7a915 100644
--- a/scripts/entities/actors/actions/DirectionalAction.cs
+++ b/scripts/entities/actors/actions/DirectionalAction.cs
@@ -24,7 +24,7 @@ public abstract partial class DirectionalAction : Action
/// Função que obtém o alvo da ação, se houver.
/// </summary>
/// <returns>O ator alvo da ação, nulo se não houver.</returns>
- protected Actor GetTargetActor() {
- return Map_Data.GetBlockingActorAtPosition(Destination);
+ protected Entity GetTarget() {
+ return Map_Data.GetBlockingEntityAtPosition(Destination);
}
}
diff --git a/scripts/entities/actors/actions/MeleeAction.cs b/scripts/entities/actors/actions/MeleeAction.cs
index b20430a..6dfeb78 100644
--- a/scripts/entities/actors/actions/MeleeAction.cs
+++ b/scripts/entities/actors/actions/MeleeAction.cs
@@ -15,7 +15,15 @@ public partial class MeleeAction : DirectionalAction
public override void Perform()
{
// Eu te disse que este método seria útil.
- Actor target = GetTargetActor();
+ Entity potentialTarget = GetTarget();
+
+ // Só podemos atacar atores.
+ if (potentialTarget is not Actor) {
+ return;
+ }
+
+ Actor target = (Actor)potentialTarget;
+
// Se não houver um ator na direção, não podemos continuar.
// Isto é uma ação gratuita.
@@ -24,13 +32,13 @@ public partial class MeleeAction : DirectionalAction
// não podemos ter dano negativo.
int damage = actor.Atk - target.Def;
- string attackDesc = $"{actor.ActorName} ataca {target.ActorName}";
+ string attackDesc = $"{actor.DisplayName} ataca {target.DisplayName}";
if (damage > 0) {
attackDesc += $" e remove {damage} de HP.";
target.Hp -= damage;
} else {
- attackDesc += $" mas {target.ActorName} tem músculos de aço.";
+ attackDesc += $" mas {target.DisplayName} tem músculos de aço.";
}
MessageLogData.Instance.AddMessage(attackDesc);
diff --git a/scripts/entities/actors/actions/MovementAction.cs b/scripts/entities/actors/actions/MovementAction.cs
index 3608357..2c394fc 100644
--- a/scripts/entities/actors/actions/MovementAction.cs
+++ b/scripts/entities/actors/actions/MovementAction.cs
@@ -12,11 +12,11 @@ public partial class MovementAction : DirectionalAction
public override void Perform()
{
// Não anda se o destino for um tile sólido.
- if (!Map_Data.IsTileWalkable(Destination)) return;
+ if (!Map_Data.GetTile(Destination).IsWalkable) return;
// Não anda se o destino for oculpado por um ator.
// Na maioria dos casos, essa condição nunca é verdadeira.
- if (GetTargetActor() != null) return;
+ if (GetTarget() != null) return;
actor.Walk(Offset);
actor.Energy -= cost;