summaryrefslogtreecommitdiff
path: root/scripts/map
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/map')
-rw-r--r--scripts/map/DungeonGenerator.cs45
-rw-r--r--scripts/map/Map.cs12
2 files changed, 48 insertions, 9 deletions
diff --git a/scripts/map/DungeonGenerator.cs b/scripts/map/DungeonGenerator.cs
index f016dd2..cb89508 100644
--- a/scripts/map/DungeonGenerator.cs
+++ b/scripts/map/DungeonGenerator.cs
@@ -12,12 +12,16 @@ public partial class DungeonGenerator : Node
private static readonly Godot.Collections.Array<EnemyDefinition> enemies = [
GD.Load<EnemyDefinition>("res://assets/definitions/actor/Skeleton.tres"),
GD.Load<EnemyDefinition>("res://assets/definitions/actor/morcegao.tres"),
- GD.Load<EnemyDefinition>("res://assets/definitions/actor/Shadow.tres")
+ GD.Load<EnemyDefinition>("res://assets/definitions/actor/Shadow.tres"),
+ ];
+
+ private static readonly Godot.Collections.Array<ConsumableItemDefinition> items = [
+ GD.Load<HealingConsumableDefinition>("res://assets/definitions/Items/small_healing_potion.tres")
];
/// <summary>
- /// Dimensões do mapa a ser criado.
- /// </summary>
+ /// Dimensões do mapa a ser criado.
+ /// </summary>
[ExportCategory("Dimension")]
[Export]
private int width = 80;
@@ -52,6 +56,13 @@ public partial class DungeonGenerator : Node
[Export]
private int maxMonsterPerRoom = 2;
+ /// <summary>
+ /// Quantidade máxima de itens por sala.
+ /// </summary>
+ [ExportCategory("Loot RNG")]
+ [Export]
+ private int maxItemsPerRoom = 2;
+
public override void _Ready()
{
base._Ready();
@@ -149,6 +160,8 @@ public partial class DungeonGenerator : Node
private void PlaceEntities(MapData data, Rect2I room) {
// Define quantos monstros serão colocados na sala
int monsterAmount = rng.RandiRange(0, maxMonsterPerRoom);
+ // Define quantos itens serão colocados na sala.
+ int itemAmount = rng.RandiRange(0, maxItemsPerRoom);
for (int i = 0; i < monsterAmount; i++) {
// Escolhe um lugar aleatório na sala.
@@ -173,6 +186,32 @@ public partial class DungeonGenerator : Node
data.InsertEntity(enemy);
}
}
+
+ for (int i = 0; i < itemAmount; i++) {
+ // Escolhe um lugar aleatório na sala.
+ Vector2I position = new(
+ rng.RandiRange(room.Position.X, room.End.X - 1),
+ rng.RandiRange(room.Position.Y, room.End.Y - 1)
+ );
+
+ // Só podemos colocar um ator por ponto no espaço.
+ bool canPlace = true;
+ foreach (Entity entity in data.Entities) {
+ if (entity.GridPosition == position) {
+ canPlace = false;
+ break;
+ }
+ }
+
+ // Se possível, criamos um inimigo aleatório na posição escolhida.
+ if (canPlace) {
+ ConsumableItemDefinition definition = items.PickRandom();
+ if (definition is HealingConsumableDefinition hcDefinition) {
+ HealingConsumable item = new(position, data, hcDefinition);
+ data.InsertEntity(item);
+ }
+ }
+ }
}
/// <summary>
diff --git a/scripts/map/Map.cs b/scripts/map/Map.cs
index c14880a..f4f0783 100644
--- a/scripts/map/Map.cs
+++ b/scripts/map/Map.cs
@@ -46,11 +46,11 @@ public partial class Map : Node2D
}
/// <summary>
- /// Coloca todos os tiles do mapa no mundo do jogo.
+ /// Coloca todas as entidades do mapa no mundo do jogo.
/// </summary>
private void PlaceEntities() {
- foreach (Actor actor in Map_Data.Entities) {
- entitiesNode.AddChild(actor);
+ foreach (Entity entity in Map_Data.Entities) {
+ entitiesNode.AddChild(entity);
}
}
@@ -72,9 +72,9 @@ public partial class Map : Node2D
/// <param name="pos">Centro de visão, normalmente é a posição do jogador.</param>
public void UpdateFOV(Vector2I pos) {
fieldOfView.UpdateFOV(Map_Data, pos, fovRadius);
- // Esconde ou revela atores com base no campo de visão.
- foreach (Actor actor in Map_Data.Entities) {
- actor.Visible = Map_Data.GetTile(actor.GridPosition).IsInView;
+ // Esconde ou revela entidades com base no campo de visão.
+ foreach (Entity entity in Map_Data.Entities) {
+ entity.Visible = Map_Data.GetTile(entity.GridPosition).IsInView;
}
}
}