Player warp item implementation

This commit is contained in:
2025-03-03 01:17:30 -08:00
parent 05295f535a
commit 4ac70b1ca7
48 changed files with 231 additions and 138 deletions

View File

@@ -21,7 +21,7 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
#region Dependencies
[Dependency] IGameEventDepot GameEventDepot => this.DependOn<IGameEventDepot>();
[Dependency] IGame Game => this.DependOn<IGame>();
[Dependency] protected IPlayer _player => this.DependOn(() => GetParent().GetChildren().OfType<IPlayer>().Single());
#endregion
@@ -154,7 +154,7 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
var tweener = GetTree().CreateTween();
tweener.TweenInterval(1.0f);
tweener.TweenCallback(Callable.From(QueueFree));
GameEventDepot.OnEnemyDefeated(GlobalPosition, _enemyStatResource);
Game.EnemyDefeated(GlobalPosition, _enemyStatResource);
}
public void StartAttackTimer()
@@ -171,7 +171,20 @@ public partial class Enemy : CharacterBody3D, IEnemy, IProvide<IEnemyLogic>
public void SetEnemyGlobalPosition(Vector3 target)
{
GlobalPosition = target;
GlobalPosition = new Vector3(target.X, -0.5f, target.Z);
}
public IDungeonRoom GetCurrentRoom()
{
var currentRooms = Game.CurrentFloor.Rooms;
foreach (var room in currentRooms)
{
var enemiesInCurrentRoom = room.EnemiesInRoom;
if (enemiesInCurrentRoom.Contains(this))
return room;
}
return null;
}
private void OnAttackTimeout()

View File

@@ -21,4 +21,6 @@ public interface IEnemy : IKillable
public abstract void SetTarget(Vector3 target);
public void SetEnemyGlobalPosition(Vector3 target);
public IDungeonRoom GetCurrentRoom();
}

View File

@@ -6,6 +6,7 @@ using Chickensoft.Introspection;
using Godot;
using System;
using System.Collections.Immutable;
using static GameJamDungeon.GameLogic.State;
[Meta(typeof(IAutoNode))]
public partial class Game : Node3D, IGame
@@ -124,7 +125,6 @@ public partial class Game : Node3D, IGame
FloorClearMenu.SaveAndExit += FloorClearMenu_SaveAndExit;
FloorClearMenu.TransitionCompleted += FloorClearMenu_TransitionCompleted;
GameEventDepot.EnemyDefeated += OnEnemyDefeated;
GameEventDepot.RestorativePickedUp += GameEventDepot_RestorativePickedUp;
DoubleEXPTimer.Timeout += DoubleEXPTimer_Timeout;
@@ -132,6 +132,9 @@ public partial class Game : Node3D, IGame
public void ToggleInventory()
{
if (GameLogic.Value is InventoryOpened)
GameLogic.Input(new GameLogic.Input.CloseInventory());
else
GameLogic.Input(new GameLogic.Input.OpenInventory());
}
@@ -182,10 +185,10 @@ public partial class Game : Node3D, IGame
public IDungeonFloor CurrentFloor => Map.CurrentFloor;
private void OnEnemyDefeated(Vector3 vector, EnemyStatResource resource)
public void EnemyDefeated(Vector3 defeatedLocation, EnemyStatResource resource)
{
Player.GainExp(resource.ExpFromDefeat * GameRepo.EXPRate);
DropRestorative(vector);
DropRestorative(defeatedLocation);
}
private void DropRestorative(Vector3 vector)
@@ -256,7 +259,7 @@ public partial class Game : Node3D, IGame
public async void DoubleEXP(TimeSpan lengthOfEffect)
{
InventoryMenu_CloseInventory();
ToggleInventory();
InGameUI.PlayerInfoUI.DisplayMessage("Experience points temporarily doubled.");
DoubleEXPTimer.Start(lengthOfEffect.Seconds);
GameRepo.EXPRate = 2;

View File

@@ -3,6 +3,7 @@ namespace GameJamDungeon;
using Chickensoft.AutoInject;
using Chickensoft.GodotNodeInterfaces;
using Godot;
using System;
public interface IGame : IProvide<IGameRepo>, IProvide<IGameEventDepot>, IProvide<IGame>, IProvide<IPlayer>, INode3D
@@ -30,4 +31,6 @@ public interface IGame : IProvide<IGameRepo>, IProvide<IGameEventDepot>, IProvid
public void FloorExitReached();
public void NextFloorLoaded();
public void EnemyDefeated(Vector3 defeatedLocation, EnemyStatResource enemyStatResource);
}

View File

@@ -395,10 +395,11 @@ public partial class InventoryMenu : Control, IInventoryMenu
if (currentItem is IEquipableItem)
await EquipOrUnequipItem();
else if (currentItem is IUsableItem usableItem)
{
usableItem.Use();
if (currentItem is ConsumableItem consumableItem)
DestroyItem(consumableItem);
DestroyItem(usableItem);
EmitSignal(SignalName.ClosedMenu);
}
RefreshUIAfterUserSelection();
}

View File

@@ -70,6 +70,8 @@ public partial class ThrowableItem : Node3D, IUsableItem
if (_throwableItemStats.UsableItemTags.Contains(UsableItemTag.DoubleEXP))
Game.DoubleEXP(TimeSpan.FromSeconds(30));
if (_throwableItemStats.ThrowableItemTags.Contains(ThrowableItemTag.TeleportToRandomLocation))
TeleportToRandomRoom(Player);
if (_throwableItemStats.ThrowableItemTags.Contains(ThrowableItemTag.CanChangeAffinity))
ChangeAffinity();
@@ -79,26 +81,41 @@ public partial class ThrowableItem : Node3D, IUsableItem
{
var currentFloor = Game.CurrentFloor;
var rooms = currentFloor.Rooms;
var currentRoom = enemy.GetCurrentRoom();
var validRooms = rooms.OfType<MonsterRoom>().ToList();
if (currentRoom is MonsterRoom currentMonsterRoom)
validRooms.Remove(currentMonsterRoom);
var rng = new RandomNumberGenerator();
rng.Randomize();
var randomRoom = rooms[rng.RandiRange(0, rooms.Count - 1)];
if (validRooms.Count == 0)
return;
var roomsGodotCollection = new Godot.Collections.Array<MonsterRoom>(validRooms);
var randomRoom = roomsGodotCollection.PickRandom();
var spawnPoints = randomRoom.EnemySpawnPoints.GetChildren().OfType<Marker3D>().ToList();
var randomSpawnPoint = spawnPoints[rng.RandiRange(0, spawnPoints.Count - 1)];
var spawnPointsGodotCollection = new Godot.Collections.Array<Marker3D>(spawnPoints);
var randomSpawnPoint = spawnPointsGodotCollection.PickRandom();
enemy.SetEnemyGlobalPosition(randomSpawnPoint.GlobalPosition);
}
public void TeleportToRandomRoom(IPlayer player)
private void TeleportToRandomRoom(IPlayer player)
{
var currentFloor = Game.CurrentFloor;
var rooms = currentFloor.Rooms;
var rng = new RandomNumberGenerator();
rng.Randomize();
var randomRoom = rooms[rng.RandiRange(0, rooms.Count - 1)];
var currentRoom = rooms.SingleOrDefault(x => x.IsPlayerInRoom);
var validRooms = rooms.OfType<MonsterRoom>().ToList();
if (currentRoom is MonsterRoom currentMonsterRoom)
validRooms.Remove(currentMonsterRoom);
if (validRooms.Count == 0)
return;
var roomsGodotCollection = new Godot.Collections.Array<MonsterRoom>(validRooms);
var randomRoom = roomsGodotCollection.PickRandom();
var spawnPoint = randomRoom.PlayerSpawn;
Game.ToggleInventory();
player.TeleportPlayer(spawnPoint.GlobalPosition);
}

View File

@@ -4,16 +4,15 @@ public enum ThrowableItemTag
{
LowerTargetTo1HP,
CanChangeAffinity,
TeleportToRandomLocation
TeleportToRandomLocation,
WarpToExitIfFound
}
public enum UsableItemTag
{
DoubleEXP,
RandomWarp,
IdentifyAllItemsCostHP,
BriefImmunity,
WarpToExitIfFound,
}
public enum EnhancingItemTag

View File

@@ -12,7 +12,7 @@ public partial class BossFloor : Node3D, IDungeonFloor
private BossRoomA BossRoom;
public ImmutableList<MonsterRoom> Rooms => [];
public ImmutableList<IDungeonRoom> Rooms => [];
public void InitializeDungeon()
{

View File

@@ -18,14 +18,15 @@ namespace GameJamDungeon
private Transform3D _playerSpawnPoint;
public ImmutableList<MonsterRoom> Rooms { get; private set; }
public ImmutableList<IDungeonRoom> Rooms { get; private set; }
public void InitializeDungeon()
{
Rooms = [];
Rooms = FindAllDungeonRooms([.. GetChildren()], Rooms);
_playerSpawnPoint = RandomizePlayerSpawnPoint();
foreach (var room in Rooms)
var monsterRooms = Rooms.OfType<MonsterRoom>();
foreach (var room in monsterRooms)
room.SpawnEnemies(EnemyDatabase);
DungeonGenerator.EmitSignal("done_generating");
}
@@ -34,24 +35,22 @@ namespace GameJamDungeon
private Transform3D RandomizePlayerSpawnPoint()
{
var rng = new RandomNumberGenerator();
rng.Randomize();
var rngDistribution = new List<float>();
var randomSpawnLocations = Rooms
.OfType<MonsterRoom>()
.Select(x => x.PlayerSpawn);
var godotCollection = new Godot.Collections.Array<Marker3D>(randomSpawnLocations);
var result = godotCollection.PickRandom();
return result.GlobalTransform;
}
private static ImmutableList<MonsterRoom> FindAllDungeonRooms(List<Node> nodesToSearch, ImmutableList<MonsterRoom> roomsFound)
private static ImmutableList<IDungeonRoom> FindAllDungeonRooms(List<Node> nodesToSearch, ImmutableList<IDungeonRoom> roomsFound)
{
if (nodesToSearch.Count == 0)
return roomsFound;
foreach (var node in nodesToSearch)
{
if (node is MonsterRoom dungeonRoom)
if (node is IDungeonRoom dungeonRoom)
roomsFound = roomsFound.Add(dungeonRoom);
if (node.HasSignal("dungeon_done_generating"))

View File

@@ -0,0 +1,50 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using System.Collections.Immutable;
namespace GameJamDungeon;
[Meta(typeof(IAutoNode))]
public abstract partial class DungeonRoom : Node3D, IDungeonRoom
{
public override void _Notification(int what) => this.Notify(what);
[Node] public Marker3D PlayerSpawn { get; set; } = default!;
public bool IsPlayerInRoom => _isPlayerInRoom;
public ImmutableList<IEnemy> EnemiesInRoom => _enemiesInRoom;
[Node] private Area3D _room { get; set; } = default!;
private ImmutableList<IEnemy> _enemiesInRoom;
private bool _isPlayerInRoom = false;
public void Setup()
{
_enemiesInRoom = [];
_room.BodyEntered += Room_BodyEntered;
_room.BodyExited += Room_BodyExited;
}
private void Room_BodyExited(Node3D body)
{
if (body is IEnemy enemy)
_enemiesInRoom = _enemiesInRoom.Remove(enemy);
if (body is IPlayer)
_isPlayerInRoom = false;
}
private void Room_BodyEntered(Node3D body)
{
if (body is IEnemy enemy)
_enemiesInRoom = _enemiesInRoom.Add(enemy);
if (body is IPlayer)
_isPlayerInRoom = true;
}
public ImmutableList<IEnemy> GetEnemiesInCurrentRoom()
{
return _enemiesInRoom;
}
}

View File

@@ -5,24 +5,22 @@ using Godot;
namespace GameJamDungeon;
[Meta(typeof(IAutoNode))]
public partial class ExitRoom : Node3D, IExitRoom
public partial class ExitRoom : DungeonRoom
{
public override void _Notification(int what) => this.Notify(what);
[Dependency] public IGame Game => this.DependOn<IGame>();
[Node] public Area3D Exit { get; set; } = default!;
[Node] private Area3D _exit { get; set; } = default!;
[Node] private Area3D _room { get; set; } = default!;
public Marker3D PlayerSpawn { get; set; }
public void Setup()
public override void _Ready()
{
Exit.AreaEntered += Exit_AreaEntered;
_exit.AreaEntered += Exit_AreaEntered;
}
public void ExitReached()
=> Game.FloorExitReached();
private void Exit_AreaEntered(Area3D area) => ExitReached();
public void SpawnEnemies(EnemyDatabase enemyDatabase) => throw new System.NotImplementedException();
}

View File

@@ -6,7 +6,7 @@ using System.Collections.Immutable;
namespace GameJamDungeon;
[Meta(typeof(IAutoNode))]
public partial class Floor0 : Node3D, IDungeonFloor, IExitRoom
public partial class Floor0 : Node3D, IDungeonFloor
{
public override void _Notification(int what) => this.Notify(what);
@@ -16,9 +16,9 @@ public partial class Floor0 : Node3D, IDungeonFloor, IExitRoom
[Node] private Marker3D PlayerSpawnPoint { get; set; } = default!;
public ImmutableList<MonsterRoom> Rooms => [];
public ImmutableList<IDungeonRoom> Rooms => [];
public void Setup()
public override void _Ready()
{
Show();
Exit.AreaEntered += Exit_AreaEntered;
@@ -27,10 +27,6 @@ public partial class Floor0 : Node3D, IDungeonFloor, IExitRoom
private void Exit_AreaEntered(Area3D area) => ExitReached();
public void ExitReached() => Game.FloorExitReached();
public void InitializeDungeon()
{
return;
}
public Transform3D GetPlayerSpawnPoint() => PlayerSpawnPoint.GlobalTransform;
public void InitializeDungeon() => throw new System.NotImplementedException();
public Transform3D GetPlayerSpawnPoint() => throw new System.NotImplementedException();
}

View File

@@ -9,5 +9,5 @@ public interface IDungeonFloor : INode3D
public Transform3D GetPlayerSpawnPoint();
public ImmutableList<MonsterRoom> Rooms { get; }
public ImmutableList<IDungeonRoom> Rooms { get; }
}

View File

@@ -1,6 +1,13 @@
using Chickensoft.GodotNodeInterfaces;
using Godot;
using System.Collections.Immutable;
namespace GameJamDungeon;
public interface IDungeonRoom : INode3D
{
Marker3D PlayerSpawn { get; }
bool IsPlayerInRoom { get; }
ImmutableList<IEnemy> EnemiesInRoom { get; }
}

View File

@@ -1,50 +1,24 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using System.Collections.Immutable;
using System.Linq;
namespace GameJamDungeon;
[Meta(typeof(IAutoNode))]
public partial class MonsterRoom : Node3D, IDungeonRoom
public partial class MonsterRoom : DungeonRoom
{
public override void _Notification(int what) => this.Notify(what);
[Node] public Marker3D PlayerSpawn { get; set; } = default!;
[Node] public Node3D ItemSpawnPoints { get; set; } = default!;
[Node] public Node3D EnemySpawnPoints { get; set; } = default!;
[Node] public ItemDatabase ItemDatabase { get; set; } = default!;
[Node] private Area3D _room { get; set; } = default!;
private ImmutableList<IEnemy> _enemiesInRoom;
public void Setup()
public override void _Ready()
{
SpawnItems();
_enemiesInRoom = [];
_room.BodyEntered += _room_BodyEntered;
_room.BodyExited += _room_BodyExited;
}
private void _room_BodyExited(Node3D body)
{
if (body is IEnemy enemy)
_enemiesInRoom = _enemiesInRoom.Remove(enemy);
}
private void _room_BodyEntered(Node3D body)
{
if (body is IEnemy enemy)
_enemiesInRoom = _enemiesInRoom.Add(enemy);
}
public ImmutableList<IEnemy> GetEnemiesInCurrentRoom()
{
return _enemiesInRoom;
}
public void SpawnEnemies(EnemyDatabase enemyDatabase)
@@ -54,7 +28,7 @@ public partial class MonsterRoom : Node3D, IDungeonRoom
var enemySpawnPoints = EnemySpawnPoints.GetChildren();
var numberOfEnemiesToSpawn = rng.RandiRange(1, enemySpawnPoints.Count);
foreach (Marker3D spawnPoint in enemySpawnPoints)
foreach (var spawnPoint in enemySpawnPoints.Cast<Marker3D>())
{
if (numberOfEnemiesToSpawn <= 0)
break;
@@ -75,7 +49,7 @@ public partial class MonsterRoom : Node3D, IDungeonRoom
var numberOfItemsToSpawn = rng.RandiRange(1, itemSpawnPoints.Count);
itemSpawnPoints.Shuffle();
var database = ItemDatabase.Initialize();
foreach (Marker3D spawnPoint in itemSpawnPoints)
foreach (var spawnPoint in itemSpawnPoints.Cast<Marker3D>())
{
if (numberOfItemsToSpawn <= 0)
break;

View File

@@ -13,7 +13,7 @@ public partial class Overworld : Node3D, IDungeonFloor
[Node] public Marker3D ExitSpawnPoint { get; set; } = default!;
public ImmutableList<MonsterRoom> Rooms => [];
public ImmutableList<IDungeonRoom> Rooms => [];
public void InitializeDungeon()
{

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=61 format=4 uid="uid://dl6h1djc27ddl"]
[gd_scene load_steps=62 format=4 uid="uid://dl6h1djc27ddl"]
[ext_resource type="Script" uid="uid://c1nhqlem1ew3m" path="res://src/map/dungeon/code/Floor0.cs" id="1_db2o3"]
[ext_resource type="Texture2D" uid="uid://b27ksiyfefb33" path="res://src/map/dungeon/models/Set A/02. Altar/02_ALTAR_FLOOR_ZER0_VER_outside_desert.png" id="2_xh2ej"]
@@ -739,6 +739,9 @@ size = Vector3(1.53375, 1.46143, 3.13956)
[sub_resource type="BoxShape3D" id="BoxShape3D_db2o3"]
size = Vector3(2.97754, 2.34912, 3.79205)
[sub_resource type="BoxShape3D" id="BoxShape3D_ntxe5"]
size = Vector3(369.423, 20, 47.9875)
[node name="Floor0" type="Node3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.63488, -5.13176)
script = ExtResource("1_db2o3")
@@ -870,3 +873,21 @@ collision_mask = 256
[node name="CollisionShape3D" type="CollisionShape3D" parent="Exit"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.1171, -2.1779, -0.0887146)
shape = SubResource("BoxShape3D_db2o3")
[node name="Model" type="Node3D" parent="."]
[node name="Collision" type="Node3D" parent="."]
[node name="Spawn Points" type="Node3D" parent="."]
[node name="Room" type="Node3D" parent="."]
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 0
collision_mask = 8
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 149.05, -4.02862, -1.76389)
shape = SubResource("BoxShape3D_ntxe5")

View File

@@ -831,8 +831,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, 1.9843, 0)

View File

@@ -1280,8 +1280,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.27566, -0.246464, -3.5794)
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, 1.9843, 0)

View File

@@ -1405,8 +1405,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.76788, -1.76654, -10.247)
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 15.689, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -13.6094, 0)

View File

@@ -1273,8 +1273,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, 5.65958, 0)

View File

@@ -1852,8 +1852,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, 1.9843, 0)

View File

@@ -884,8 +884,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0361805, -0.0723581, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, 1.9843, 0)

View File

@@ -1729,8 +1729,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, 2.00828, 0)

View File

@@ -2580,8 +2580,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, 1.9843, 0)

View File

@@ -967,8 +967,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, 3.93401, 0)

View File

@@ -1177,8 +1177,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, 1.9843, 0)

View File

@@ -1306,8 +1306,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, 1.9843, 0)

View File

@@ -1906,8 +1906,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, 1.9843, 0)

View File

@@ -1263,8 +1263,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, 1.9843, 0)

View File

@@ -1021,8 +1021,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, 0.894945, 0)

View File

@@ -603,8 +603,8 @@ shape = SubResource("BoxShape3D_mg5bq")
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -4.02862, -1.19209e-07)

View File

@@ -780,8 +780,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -10.6408, -1.19209e-07)

View File

@@ -1034,8 +1034,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -10.6408, -1.19209e-07)

View File

@@ -851,8 +851,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -8.76788, -1.76654, -10.247)
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -10.6408, -1.19209e-07)

View File

@@ -540,8 +540,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -10.6408, -1.19209e-07)

View File

@@ -981,8 +981,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -11.8126, -1.19209e-07)

View File

@@ -886,8 +886,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -10.6408, -1.19209e-07)

View File

@@ -879,8 +879,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -10.6408, -1.19209e-07)

View File

@@ -1038,8 +1038,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -10.6408, -1.19209e-07)

View File

@@ -901,8 +901,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -10.6408, -1.19209e-07)

View File

@@ -529,8 +529,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -10.6408, -1.19209e-07)

View File

@@ -902,8 +902,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -3.8538, -1.19209e-07)

View File

@@ -1598,8 +1598,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -10.6408, -1.19209e-07)

View File

@@ -1282,8 +1282,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -10.6408, -1.19209e-07)

View File

@@ -684,8 +684,8 @@ unique_name_in_owner = true
[node name="Room" type="Area3D" parent="Room"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.8436, 0)
collision_layer = 8
collision_mask = 8
collision_layer = 0
collision_mask = 10
[node name="CollisionShape3D" type="CollisionShape3D" parent="Room/Room"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.04566, -3.99197, -1.19209e-07)

View File

@@ -25,6 +25,8 @@ public interface IPlayer : IKillable
public void TeleportPlayer(Vector3 newPosition);
public IDungeonRoom GetCurrentRoom();
public void HealHP(int amount);
public void RaiseHP(int amount);

View File

@@ -6,6 +6,7 @@ using Chickensoft.SaveFileBuilder;
using Godot;
using Godot.Collections;
using System;
using System.Linq;
namespace GameJamDungeon;
@@ -201,6 +202,13 @@ public partial class Player : CharacterBody3D, IPlayer
EmitSignal(SignalName.PauseButtonPressed);
}
public IDungeonRoom GetCurrentRoom()
{
var rooms = Game.CurrentFloor.Rooms;
var playersRoom = rooms.SingleOrDefault(x => x.IsPlayerInRoom);
return playersRoom;
}
public void RaiseHP(int amountToRaise)
{
Stats.SetMaximumHP(Stats.MaximumHP.Value + amountToRaise);