Add more floors, light refactoring
This commit is contained in:
@@ -5,3 +5,6 @@ dotnet_diagnostic.CS8632.severity = silent
|
||||
|
||||
# CS1998: Async method lacks 'await' operators and will run synchronously
|
||||
dotnet_diagnostic.CS1998.severity = silent
|
||||
|
||||
# IDE1006: Naming Styles
|
||||
dotnet_diagnostic.IDE1006.severity = none
|
||||
|
||||
@@ -14,6 +14,8 @@ public partial class InGameAudio : Node
|
||||
|
||||
[Dependency] public IGameEventDepot GameEventDepot => this.DependOn<IGameEventDepot>();
|
||||
|
||||
[Dependency] public IPlayer Player => this.DependOn<IPlayer>();
|
||||
|
||||
#region BGM Nodes
|
||||
[Node] public IDimmableAudioStreamPlayer MenuBgm { get; set; } = default!;
|
||||
|
||||
@@ -54,6 +56,7 @@ public partial class InGameAudio : Node
|
||||
{
|
||||
InGameAudioLogic.Set(AppRepo);
|
||||
InGameAudioLogic.Set(GameEventDepot);
|
||||
InGameAudioLogic.Set(Player);
|
||||
|
||||
InGameAudioBinding = InGameAudioLogic.Bind();
|
||||
|
||||
|
||||
@@ -11,15 +11,16 @@ public partial class InGameAudioLogic
|
||||
{
|
||||
OnAttach(() =>
|
||||
{
|
||||
var player = Get<IPlayer>();
|
||||
OnOverworldEntered();
|
||||
var gameEventDepot = Get<IGameEventDepot>();
|
||||
gameEventDepot.OverworldEntered += OnOverworldEntered;
|
||||
gameEventDepot.DungeonAThemeAreaEntered += OnDungeonAThemeEntered;
|
||||
gameEventDepot.MenuScrolled += OnMenuScrolled;
|
||||
gameEventDepot.MenuBackedOut += OnMenuBackedOut;
|
||||
gameEventDepot.EquippedWeapon += OnEquippedItem;
|
||||
gameEventDepot.EquippedArmor += OnEquippedItem;
|
||||
gameEventDepot.EquippedAccessory += OnEquippedItem;
|
||||
player.Inventory.EquippedWeapon.Changed += OnEquippedItem;
|
||||
player.Inventory.EquippedArmor.Changed += OnEquippedItem;
|
||||
player.Inventory.EquippedAccessory.Changed += OnEquippedItem;
|
||||
gameEventDepot.InventorySorted += OnInventorySorted;
|
||||
gameEventDepot.HealingItemConsumed += OnHealingItemConsumed;
|
||||
gameEventDepot.RestorativePickedUp += OnRestorativePickedUp;
|
||||
@@ -28,13 +29,14 @@ public partial class InGameAudioLogic
|
||||
OnDetach(() =>
|
||||
{
|
||||
var gameEventDepot = Get<IGameEventDepot>();
|
||||
var player = Get<IPlayer>();
|
||||
gameEventDepot.OverworldEntered -= OnOverworldEntered;
|
||||
gameEventDepot.DungeonAThemeAreaEntered -= OnDungeonAThemeEntered;
|
||||
gameEventDepot.MenuScrolled -= OnMenuScrolled;
|
||||
gameEventDepot.MenuBackedOut -= OnMenuBackedOut;
|
||||
gameEventDepot.EquippedWeapon -= OnEquippedItem;
|
||||
gameEventDepot.EquippedArmor -= OnEquippedItem;
|
||||
gameEventDepot.EquippedAccessory -= OnEquippedItem;
|
||||
player.Inventory.EquippedWeapon.Changed -= OnEquippedItem;
|
||||
player.Inventory.EquippedArmor.Changed -= OnEquippedItem;
|
||||
player.Inventory.EquippedAccessory.Changed -= OnEquippedItem;
|
||||
gameEventDepot.InventorySorted -= OnInventorySorted;
|
||||
gameEventDepot.TeleportEntered -= OnTeleportEntered;
|
||||
});
|
||||
|
||||
@@ -5,5 +5,9 @@ public enum WeaponTag
|
||||
SelfDamage,
|
||||
IgnoreAffinity,
|
||||
Knockback,
|
||||
}
|
||||
|
||||
public enum ItemTag
|
||||
{
|
||||
BreaksOnChange
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ GameJamDungeon_EnemyLogic_State_Alive --> GameJamDungeon_EnemyLogic_State_Idle :
|
||||
GameJamDungeon_EnemyLogic_State_Attacking --> GameJamDungeon_EnemyLogic_State_Idle : StopMoving
|
||||
GameJamDungeon_EnemyLogic_State_FollowPlayer --> GameJamDungeon_EnemyLogic_State_FollowPlayer : PhysicsTick
|
||||
GameJamDungeon_EnemyLogic_State_FollowPlayer --> GameJamDungeon_EnemyLogic_State_Idle : LostPlayer
|
||||
GameJamDungeon_EnemyLogic_State_FollowPlayer --> GameJamDungeon_EnemyLogic_State_Idle : StopMoving
|
||||
GameJamDungeon_EnemyLogic_State_Idle --> GameJamDungeon_EnemyLogic_State_Patrolling : StartPatrol
|
||||
GameJamDungeon_EnemyLogic_State_Patrolling --> GameJamDungeon_EnemyLogic_State_Idle : StopMoving
|
||||
GameJamDungeon_EnemyLogic_State_Patrolling --> GameJamDungeon_EnemyLogic_State_Patrolling : PatrolToRandomSpot
|
||||
|
||||
@@ -7,7 +7,7 @@ public partial class EnemyLogic
|
||||
public partial record State
|
||||
{
|
||||
[Meta, Id("enemy_logic_state_followplayer")]
|
||||
public partial record FollowPlayer : Activated, IGet<Input.PhysicsTick>, IGet<Input.LostPlayer>, IGet<Input.StopMoving>
|
||||
public partial record FollowPlayer : Activated, IGet<Input.PhysicsTick>, IGet<Input.LostPlayer>
|
||||
{
|
||||
public Transition On(in Input.PhysicsTick input)
|
||||
{
|
||||
@@ -23,11 +23,6 @@ public partial class EnemyLogic
|
||||
{
|
||||
return To<Idle>();
|
||||
}
|
||||
|
||||
public Transition On(in Input.StopMoving _)
|
||||
{
|
||||
return To<Idle>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,21 +35,21 @@ public partial class Game : Node3D, IGame
|
||||
[Dependency] public IAppRepo AppRepo => this.DependOn<IAppRepo>();
|
||||
|
||||
#region Nodes
|
||||
[Node] public IMap Map { get; set; } = default!;
|
||||
[Node] private IMap Map { get; set; } = default!;
|
||||
|
||||
[Node] public IPlayer Player { get; set; } = default!;
|
||||
[Node] private InGameUI InGameUI { get; set; } = default!;
|
||||
|
||||
[Node] public InGameUI InGameUI { get; set; } = default!;
|
||||
[Node] private IFloorClearMenu FloorClearMenu { get; set; } = default!;
|
||||
|
||||
[Node] public IFloorClearMenu FloorClearMenu { get; set; } = default!;
|
||||
[Node] private DeathMenu DeathMenu { get; set; } = default!;
|
||||
|
||||
[Node] public DeathMenu DeathMenu { get; set; } = default!;
|
||||
[Node] private IPauseMenu PauseMenu { get; set; } = default!;
|
||||
|
||||
[Node] public IPauseMenu PauseMenu { get; set; } = default!;
|
||||
[Node] private InGameAudio InGameAudio { get; set; } = default!;
|
||||
|
||||
[Node] public InGameAudio InGameAudio { get; set; } = default!;
|
||||
[Node] private Timer DoubleEXPTimer { get; set; } = default!;
|
||||
|
||||
[Node] public Timer DoubleEXPTimer { get; set; } = default!;
|
||||
[Node] private IPlayer Player { get; set; } = default!;
|
||||
#endregion
|
||||
|
||||
public RescuedItemDatabase RescuedItems { get; set; } = default!;
|
||||
@@ -121,7 +121,6 @@ public partial class Game : Node3D, IGame
|
||||
|
||||
Player.Inventory.InventoryAtCapacity += PlayerInventory_InventoryAtCapacity;
|
||||
Player.Inventory.PickedUpItem += Inventory_PickedUpItem;
|
||||
Player.Inventory.RaiseStatRequest += Inventory_RaiseStatRequest;
|
||||
FloorClearMenu.GoToNextFloor += FloorClearMenu_GoToNextFloor;
|
||||
FloorClearMenu.SaveAndExit += FloorClearMenu_SaveAndExit;
|
||||
FloorClearMenu.TransitionCompleted += FloorClearMenu_TransitionCompleted;
|
||||
@@ -166,6 +165,16 @@ public partial class Game : Node3D, IGame
|
||||
thrown.Throw();
|
||||
}
|
||||
|
||||
public void AnnounceMessageOnInventoryScreen(string message)
|
||||
{
|
||||
InGameUI.InventoryMenu.ShowMessage(message);
|
||||
}
|
||||
|
||||
public void AnnounceMessageOnMainScreen(string message)
|
||||
{
|
||||
InGameUI.PlayerInfoUI.DisplayMessage(message);
|
||||
}
|
||||
|
||||
private void OnEnemyDefeated(Vector3 vector, EnemyStatResource resource)
|
||||
{
|
||||
Player.GainExp(resource.ExpFromDefeat * GameRepo.EXPRate);
|
||||
@@ -209,8 +218,12 @@ public partial class Game : Node3D, IGame
|
||||
private void FloorClearMenu_TransitionCompleted()
|
||||
{
|
||||
GameRepo.Resume();
|
||||
if (Player.Inventory.EquippedWeapon.Value.WeaponTags.Contains(WeaponTag.BreaksOnChange))
|
||||
if (Player.Inventory.EquippedWeapon.Value.ItemTags.Contains(ItemTag.BreaksOnChange))
|
||||
Player.Inventory.Unequip(Player.Inventory.EquippedWeapon.Value);
|
||||
if (Player.Inventory.EquippedArmor.Value.ItemTags.Contains(ItemTag.BreaksOnChange))
|
||||
Player.Inventory.Unequip(Player.Inventory.EquippedArmor.Value);
|
||||
if (Player.Inventory.EquippedAccessory.Value.ItemTags.Contains(ItemTag.BreaksOnChange))
|
||||
Player.Inventory.Unequip(Player.Inventory.EquippedAccessory.Value);
|
||||
}
|
||||
|
||||
private void FloorClearMenu_GoToNextFloor()
|
||||
@@ -228,52 +241,12 @@ public partial class Game : Node3D, IGame
|
||||
private void GameEventDepot_RestorativePickedUp(Restorative obj)
|
||||
=> Player.Stats.SetCurrentVT(Player.Stats.CurrentVT.Value + obj.VTRestoreAmount);
|
||||
|
||||
private void Inventory_RaiseStatRequest(InventoryItemStats itemStats)
|
||||
{
|
||||
HealHP(itemStats.HealHPAmount);
|
||||
HealVT(itemStats.HealVTAmount);
|
||||
}
|
||||
|
||||
private void SetPauseMode(bool isPaused)
|
||||
{
|
||||
if (GetTree() != null)
|
||||
GetTree().Paused = isPaused;
|
||||
}
|
||||
|
||||
public void RaiseHP(int amountToRaise)
|
||||
{
|
||||
if (Player.Stats.CurrentHP.Value == Player.Stats.MaximumHP.Value)
|
||||
{
|
||||
Player.Stats.SetMaximumHP(Player.Stats.MaximumHP.Value + amountToRaise);
|
||||
Player.Stats.SetCurrentHP(Player.Stats.MaximumHP.Value);
|
||||
EmitSignal(SignalName.StatRaisedAlert, $"{amountToRaise}MAXHP Up.");
|
||||
}
|
||||
}
|
||||
|
||||
public void HealHP(int amountToRestore)
|
||||
{
|
||||
Player.Stats.SetCurrentHP(Player.Stats.CurrentHP.Value + amountToRestore);
|
||||
var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}";
|
||||
EmitSignal(SignalName.StatRaisedAlert, $"{raiseString}HP Restored.");
|
||||
}
|
||||
|
||||
public void RaiseVT(int amountToRaise)
|
||||
{
|
||||
if (Player.Stats.CurrentVT.Value == Player.Stats.MaximumVT.Value)
|
||||
{
|
||||
Player.Stats.SetMaximumVT(Player.Stats.MaximumVT.Value + amountToRaise);
|
||||
Player.Stats.SetCurrentVT(Player.Stats.MaximumVT.Value);
|
||||
EmitSignal(SignalName.StatRaisedAlert, $"{amountToRaise}MAXVT Up.");
|
||||
}
|
||||
}
|
||||
|
||||
public void HealVT(int amountToRestore)
|
||||
{
|
||||
Player.Stats.SetCurrentVT(Player.Stats.CurrentVT.Value + amountToRestore);
|
||||
var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}";
|
||||
EmitSignal(SignalName.StatRaisedAlert, $"{raiseString}VT Restored.");
|
||||
}
|
||||
|
||||
public async void DoubleEXP(TimeSpan lengthOfEffect)
|
||||
{
|
||||
InventoryMenu_CloseInventory();
|
||||
|
||||
@@ -26,24 +26,6 @@ public interface IGameEventDepot : IDisposable
|
||||
event Action? MenuBackedOut;
|
||||
public void OnMenuBackedOut();
|
||||
|
||||
event Action<Weapon>? EquippedWeapon;
|
||||
public void OnEquippedWeapon(Weapon equippedWeapon);
|
||||
|
||||
event Action? UnequippedWeapon;
|
||||
public void OnUnequippedWeapon();
|
||||
|
||||
event Action<Armor>? EquippedArmor;
|
||||
public void OnEquippedArmor(Armor equippedArmor);
|
||||
|
||||
event Action? UnequippedArmor;
|
||||
public void OnUnequippedArmor();
|
||||
|
||||
event Action<Accessory>? EquippedAccessory;
|
||||
public void OnEquippedAccessory(Accessory equippedAccessory);
|
||||
|
||||
event Action? UnequippedAccessory;
|
||||
public void OnUnequippedAccessory();
|
||||
|
||||
event Action? InventorySorted;
|
||||
public void OnInventorySorted();
|
||||
|
||||
@@ -69,12 +51,6 @@ public class GameEventDepot : IGameEventDepot
|
||||
|
||||
public event Action? MenuScrolled;
|
||||
public event Action? MenuBackedOut;
|
||||
public event Action<Weapon>? EquippedWeapon;
|
||||
public event Action? UnequippedWeapon;
|
||||
public event Action<Armor>? EquippedArmor;
|
||||
public event Action? UnequippedArmor;
|
||||
public event Action<Accessory>? EquippedAccessory;
|
||||
public event Action? UnequippedAccessory;
|
||||
public event Action? InventorySorted;
|
||||
public event Action<ConsumableItemStats>? HealingItemConsumed;
|
||||
public event Action<Restorative>? RestorativePickedUp;
|
||||
@@ -91,15 +67,6 @@ public class GameEventDepot : IGameEventDepot
|
||||
public void OnMenuScrolled() => MenuScrolled?.Invoke();
|
||||
public void OnMenuBackedOut() => MenuBackedOut?.Invoke();
|
||||
|
||||
public void OnEquippedWeapon(Weapon equippedWeapon) => EquippedWeapon?.Invoke(equippedWeapon);
|
||||
public void OnUnequippedWeapon() => UnequippedWeapon?.Invoke();
|
||||
|
||||
public void OnEquippedArmor(Armor equippedArmor) => EquippedArmor?.Invoke(equippedArmor);
|
||||
public void OnUnequippedArmor() => UnequippedArmor?.Invoke();
|
||||
|
||||
public void OnEquippedAccessory(Accessory equippedAccessory) => EquippedAccessory?.Invoke(equippedAccessory);
|
||||
public void OnUnequippedAccessory() => UnequippedAccessory?.Invoke();
|
||||
|
||||
public void OnInventorySorted() => InventorySorted?.Invoke();
|
||||
public void OnHealingItemConsumed(ConsumableItemStats item) => HealingItemConsumed?.Invoke(item);
|
||||
public void OnRestorativePickedUp(Restorative restorative) => RestorativePickedUp?.Invoke(restorative);
|
||||
|
||||
@@ -9,23 +9,19 @@ public interface IGame : IProvide<IGameRepo>, IProvide<IGameEventDepot>, IProvid
|
||||
{
|
||||
event Game.StatRaisedAlertEventHandler StatRaisedAlert;
|
||||
|
||||
public IPlayer Player { get; }
|
||||
|
||||
public RescuedItemDatabase RescuedItems { get; }
|
||||
|
||||
public void DropItem(IInventoryItem item);
|
||||
|
||||
public void ThrowItem(IInventoryItem item);
|
||||
|
||||
public void HealHP(int amountToRaise);
|
||||
public void RaiseHP(int amountToRaise);
|
||||
|
||||
public void HealVT(int amountToRaise);
|
||||
public void RaiseVT(int amountToRaise);
|
||||
|
||||
public void DoubleEXP(TimeSpan lengthOfEffect);
|
||||
|
||||
public void ToggleInventory();
|
||||
|
||||
public void ToggleMinimap();
|
||||
|
||||
public void AnnounceMessageOnInventoryScreen(string message);
|
||||
|
||||
public void AnnounceMessageOnMainScreen(string message);
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@ public interface IInventoryMenu : IControl
|
||||
{
|
||||
public Task RedrawInventory();
|
||||
|
||||
public Task ShowMessage(string message);
|
||||
|
||||
event InventoryMenu.ClosedMenuEventHandler ClosedMenu;
|
||||
}
|
||||
|
||||
@@ -93,16 +95,15 @@ public partial class InventoryMenu : Control, IInventoryMenu
|
||||
Player.Inventory.EquippedArmor.Sync += EquippedArmor_Sync;
|
||||
Player.Inventory.EquippedAccessory.Sync += EquippedAccessory_Sync;
|
||||
|
||||
Game.StatRaisedAlert += Game_StatRaisedAlert;
|
||||
SetProcessInput(false);
|
||||
}
|
||||
|
||||
private async void Game_StatRaisedAlert(string statRaisedAlert)
|
||||
public async Task ShowMessage(string message)
|
||||
{
|
||||
SetProcessInput(false);
|
||||
await HideUserActionPrompt();
|
||||
await ShowInventoryInfo();
|
||||
ItemEffectLabel.Text = statRaisedAlert;
|
||||
ItemEffectLabel.Text = message;
|
||||
await ToSignal(GetTree().CreateTimer(1f), "timeout");
|
||||
await RedrawInventory();
|
||||
SetProcessInput(true);
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
namespace GameJamDungeon;
|
||||
using System.Collections.Immutable;
|
||||
|
||||
namespace GameJamDungeon;
|
||||
|
||||
public interface IEquipableItem : IInventoryItem
|
||||
{
|
||||
public void Equip();
|
||||
|
||||
public void Unequip();
|
||||
public ImmutableList<ItemTag> ItemTags { get; }
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Chickensoft.Collections;
|
||||
using Chickensoft.AutoInject;
|
||||
using Chickensoft.Collections;
|
||||
using Chickensoft.GodotNodeInterfaces;
|
||||
using Godot;
|
||||
using System;
|
||||
@@ -31,24 +32,18 @@ public interface IInventory : INode
|
||||
event Inventory.InventoryAtCapacityEventHandler InventoryAtCapacity;
|
||||
|
||||
event Inventory.PickedUpItemEventHandler PickedUpItem;
|
||||
|
||||
event Inventory.AccessoryUnequippedEventHandler AccessoryUnequipped;
|
||||
|
||||
event Inventory.RaiseStatRequestEventHandler RaiseStatRequest;
|
||||
}
|
||||
|
||||
public partial class Inventory : Node, IInventory
|
||||
{
|
||||
public override void _Notification(int what) => this.Notify(what);
|
||||
|
||||
// TODO: Constants class with export
|
||||
private const int _maxInventorySize = 20;
|
||||
|
||||
[Signal]
|
||||
public delegate void InventoryAtCapacityEventHandler(string rejectedItemName);
|
||||
[Signal]
|
||||
public delegate void AccessoryUnequippedEventHandler(Accessory unequippedAccessory);
|
||||
[Signal]
|
||||
public delegate void RaiseStatRequestEventHandler(ConsumableItemStats consumableItemStats);
|
||||
[Signal]
|
||||
public delegate void PickedUpItemEventHandler(string pickedUpItemName);
|
||||
|
||||
public Inventory()
|
||||
@@ -56,6 +51,27 @@ public partial class Inventory : Node, IInventory
|
||||
Items = [];
|
||||
}
|
||||
|
||||
public void Setup()
|
||||
{
|
||||
EquippedWeapon.Changed += EquippedWeapon_Changed;
|
||||
EquippedArmor.Changed += EquippedArmor_Changed;
|
||||
EquippedAccessory.Changed += EquippedAccessory_Changed;
|
||||
}
|
||||
|
||||
private void EquippedAccessory_Changed(Accessory obj)
|
||||
{
|
||||
}
|
||||
|
||||
private void EquippedArmor_Changed(Armor obj)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
private void EquippedWeapon_Changed(Weapon obj)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public List<IInventoryItem> Items { get; private set; }
|
||||
|
||||
public IAutoProp<Weapon> EquippedWeapon => _equippedWeapon;
|
||||
@@ -96,21 +112,17 @@ public partial class Inventory : Node, IInventory
|
||||
|
||||
public void Unequip(IEquipableItem equipable)
|
||||
{
|
||||
if (equipable is Weapon weapon)
|
||||
{
|
||||
if (equipable is Weapon)
|
||||
_equippedWeapon.OnNext(new Weapon());
|
||||
if (weapon.WeaponTags.Contains(WeaponTag.BreaksOnChange))
|
||||
Items.Remove(weapon);
|
||||
}
|
||||
else if (equipable is Armor armor)
|
||||
else if (equipable is Armor)
|
||||
_equippedArmor.OnNext(new Armor());
|
||||
else if (equipable is Accessory accessory)
|
||||
{
|
||||
EmitSignal(SignalName.AccessoryUnequipped, _equippedAccessory.Value);
|
||||
else if (equipable is Accessory)
|
||||
_equippedAccessory.OnNext(new Accessory());
|
||||
}
|
||||
else
|
||||
throw new NotImplementedException("Item type is not supported.");
|
||||
|
||||
if (equipable.ItemTags.Contains(ItemTag.BreaksOnChange))
|
||||
Remove(equipable);
|
||||
}
|
||||
|
||||
public bool IsEquipped(IEquipableItem equipable)
|
||||
|
||||
@@ -26,4 +26,7 @@ public partial class InventoryItemStats : Resource
|
||||
|
||||
[Export(PropertyHint.Range, "0, 999, 1")]
|
||||
public int ThrowDamage { get; set; } = 5;
|
||||
|
||||
[Export]
|
||||
public Godot.Collections.Array<ItemTag> ItemTags { get; set; } = new Godot.Collections.Array<ItemTag>();
|
||||
}
|
||||
@@ -43,6 +43,8 @@ public partial class Accessory : Node3D, IEquipableItem
|
||||
|
||||
public ImmutableList<AccessoryTag> AccessoryTags => [.. _accessoryStats.AccessoryTags];
|
||||
|
||||
public ImmutableList<ItemTag> ItemTags => [.. _accessoryStats.ItemTags];
|
||||
|
||||
public void OnReady()
|
||||
{
|
||||
Pickup.BodyEntered += OnEntered;
|
||||
@@ -54,16 +56,6 @@ public partial class Accessory : Node3D, IEquipableItem
|
||||
_accessoryStats = (AccessoryStats)inventoryItemStats;
|
||||
}
|
||||
|
||||
public void Equip()
|
||||
{
|
||||
GameEventDepot.OnEquippedAccessory(this);
|
||||
}
|
||||
|
||||
public void Unequip()
|
||||
{
|
||||
GameEventDepot.OnUnequippedAccessory();
|
||||
}
|
||||
|
||||
public void Throw()
|
||||
{
|
||||
Player.Inventory.Remove(this);
|
||||
|
||||
@@ -2,6 +2,7 @@ using Chickensoft.AutoInject;
|
||||
using Chickensoft.Introspection;
|
||||
using Godot;
|
||||
using System;
|
||||
using System.Collections.Immutable;
|
||||
|
||||
namespace GameJamDungeon;
|
||||
|
||||
@@ -10,8 +11,6 @@ public partial class Armor : Node3D, IEquipableItem
|
||||
{
|
||||
public override void _Notification(int what) => this.Notify(what);
|
||||
|
||||
[Dependency] public IGameEventDepot GameEventDepot => this.DependOn<IGameEventDepot>();
|
||||
|
||||
[Dependency] public IPlayer Player => this.DependOn<IPlayer>();
|
||||
|
||||
[Export] private ArmorStats _armorStats { get; set; } = new ArmorStats();
|
||||
@@ -36,6 +35,8 @@ public partial class Armor : Node3D, IEquipableItem
|
||||
|
||||
public int Defense => _armorStats.Defense;
|
||||
|
||||
public ImmutableList<ItemTag> ItemTags => [.. _armorStats.ItemTags];
|
||||
|
||||
public void OnReady()
|
||||
{
|
||||
Pickup.BodyEntered += OnEntered;
|
||||
@@ -47,16 +48,6 @@ public partial class Armor : Node3D, IEquipableItem
|
||||
_armorStats = (ArmorStats)inventoryItemStats;
|
||||
}
|
||||
|
||||
public void Equip()
|
||||
{
|
||||
GameEventDepot.OnEquippedArmor(this);
|
||||
}
|
||||
|
||||
public void Unequip()
|
||||
{
|
||||
GameEventDepot.OnUnequippedArmor();
|
||||
}
|
||||
|
||||
public void Throw()
|
||||
{
|
||||
Player.Inventory.Remove(this);
|
||||
|
||||
@@ -10,9 +10,6 @@ public partial class ConsumableItem : Node3D, IUsableItem
|
||||
{
|
||||
public override void _Notification(int what) => this.Notify(what);
|
||||
|
||||
[Signal]
|
||||
public delegate void RaiseStatRequestEventHandler(ConsumableItemStats consumableItemStats);
|
||||
|
||||
[Dependency] public IGame Game => this.DependOn<IGame>();
|
||||
|
||||
[Dependency] public IPlayer Player => this.DependOn<IPlayer>();
|
||||
@@ -40,15 +37,15 @@ public partial class ConsumableItem : Node3D, IUsableItem
|
||||
|
||||
public void Use()
|
||||
{
|
||||
if (_consumableItemStats.RaiseHPAmount > 0)
|
||||
Game.RaiseHP(_consumableItemStats.RaiseHPAmount);
|
||||
if (_consumableItemStats.RaiseVTAmount > 0)
|
||||
Game.RaiseVT(_consumableItemStats.RaiseVTAmount);
|
||||
if (Player.Stats.CurrentHP.Value == Player.Stats.MaximumHP.Value && _consumableItemStats.RaiseHPAmount > 0)
|
||||
Player.RaiseHP(_consumableItemStats.RaiseHPAmount);
|
||||
if (Player.Stats.CurrentVT.Value == Player.Stats.MaximumVT.Value && _consumableItemStats.RaiseVTAmount > 0)
|
||||
Player.RaiseVT(_consumableItemStats.RaiseVTAmount);
|
||||
|
||||
if (_consumableItemStats.HealHPAmount > 0 && Player.Stats.CurrentHP.Value != Player.Stats.MaximumHP.Value)
|
||||
Game.HealHP(_consumableItemStats.HealHPAmount);
|
||||
Player.HealHP(_consumableItemStats.HealHPAmount);
|
||||
if (_consumableItemStats.HealVTAmount > 0 && Player.Stats.CurrentVT.Value != Player.Stats.MaximumVT.Value)
|
||||
Game.HealVT(_consumableItemStats.HealVTAmount);
|
||||
Player.HealVT(_consumableItemStats.HealVTAmount);
|
||||
}
|
||||
|
||||
public void SetItemStats(InventoryItemStats inventoryItemStats)
|
||||
|
||||
@@ -32,11 +32,11 @@ public partial class DroppedItem : RigidBody3D, IDroppedItem
|
||||
|
||||
public async void Drop()
|
||||
{
|
||||
AddCollisionExceptionWith((Node)Game.Player);
|
||||
AddCollisionExceptionWith((Node)Player);
|
||||
GlobalPosition = Player.CurrentPosition + Vector3.Up;
|
||||
ApplyCentralImpulse(-Player.CurrentBasis.Z.Normalized() * 5.0f);
|
||||
await ToSignal(GetTree().CreateTimer(1.5), "timeout");
|
||||
RemoveCollisionExceptionWith((Node)Game.Player);
|
||||
RemoveCollisionExceptionWith((Node)Player);
|
||||
}
|
||||
|
||||
public void RescueItem()
|
||||
|
||||
@@ -63,9 +63,9 @@ public partial class ThrowableItem : Node3D, IUsableItem
|
||||
public void Use()
|
||||
{
|
||||
if (_throwableItemStats.HealHPAmount > 0)
|
||||
Game.HealHP(_throwableItemStats.HealHPAmount);
|
||||
Player.HealHP(_throwableItemStats.HealHPAmount);
|
||||
if (_throwableItemStats.HealVTAmount > 0)
|
||||
Game.HealVT(_throwableItemStats.HealVTAmount);
|
||||
Player.HealVT(_throwableItemStats.HealVTAmount);
|
||||
|
||||
if (_throwableItemStats.UsableItemTags.Contains(UsableItemTag.DoubleEXP))
|
||||
Game.DoubleEXP(TimeSpan.FromSeconds(30));
|
||||
|
||||
@@ -45,6 +45,8 @@ public partial class Weapon : Node3D, IInventoryItem, IEquipableItem
|
||||
|
||||
public ImmutableList<WeaponTag> WeaponTags => [.. _weaponStats.WeaponTags];
|
||||
|
||||
public ImmutableList<ItemTag> ItemTags => [.. _weaponStats.ItemTags];
|
||||
|
||||
public ElementType WeaponElement => _weaponStats.WeaponElement;
|
||||
|
||||
public double ElementalDamageBonus => _weaponStats.ElementalDamageBonus;
|
||||
@@ -62,16 +64,6 @@ public partial class Weapon : Node3D, IInventoryItem, IEquipableItem
|
||||
Sprite.Texture = texture;
|
||||
}
|
||||
|
||||
public void Equip()
|
||||
{
|
||||
EmitSignal(SignalName.EquippedItem, this);
|
||||
}
|
||||
|
||||
public void Unequip()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Throw()
|
||||
{
|
||||
Player.Inventory.Remove(this);
|
||||
|
||||
@@ -750,7 +750,6 @@ mesh = SubResource("ArrayMesh_xh2ej")
|
||||
[node name="StaticBody3D" type="StaticBody3D" parent="02_ALTAR_FLOOR_ZER0_VER_1/COLLISION"]
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="02_ALTAR_FLOOR_ZER0_VER_1/COLLISION/StaticBody3D"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
|
||||
shape = SubResource("ConcavePolygonShape3D_aqomv")
|
||||
|
||||
[node name="CollisionShape3D2" type="CollisionShape3D" parent="02_ALTAR_FLOOR_ZER0_VER_1/COLLISION/StaticBody3D"]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=17 format=3 uid="uid://bc1sp6xwe0j65"]
|
||||
[gd_scene load_steps=16 format=3 uid="uid://bc1sp6xwe0j65"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_0ecnn"]
|
||||
[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_cxmwa"]
|
||||
@@ -14,13 +14,12 @@
|
||||
[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="12_aw26s"]
|
||||
[ext_resource type="PackedScene" uid="uid://bksq62muhk3h5" path="res://src/enemy/enemy_types/1. sproingy/Sproingy.tscn" id="13_kwaga"]
|
||||
[ext_resource type="PackedScene" uid="uid://b0gwivt7cw7nd" path="res://src/enemy/enemy_types/2. michael/Michael.tscn" id="14_gkkr3"]
|
||||
[ext_resource type="PackedScene" uid="uid://cvk007twac22c" path="res://src/enemy/enemy_types/3. filth_eater/FilthEater.tscn" id="15_kwaga"]
|
||||
|
||||
[sub_resource type="NavigationMesh" id="NavigationMesh_4d8mx"]
|
||||
sample_partition_type = 2
|
||||
geometry_parsed_geometry_type = 0
|
||||
|
||||
[node name="Floor1" type="Node3D"]
|
||||
[node name="Floor01" type="Node3D"]
|
||||
script = ExtResource("1_0ecnn")
|
||||
|
||||
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."]
|
||||
@@ -41,5 +40,4 @@ hide_debug_visuals_for_all_generated_rooms = false
|
||||
|
||||
[node name="EnemyDatabase" parent="." instance=ExtResource("12_aw26s")]
|
||||
unique_name_in_owner = true
|
||||
EnemyList = Array[PackedScene]([ExtResource("13_kwaga"), ExtResource("14_gkkr3"), ExtResource("15_kwaga")])
|
||||
SpawnRate = PackedFloat32Array(1, 1, 10)
|
||||
EnemyList = Array[PackedScene]([ExtResource("13_kwaga"), ExtResource("14_gkkr3")])
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=15 format=3 uid="uid://dmiqwmivkjgmq"]
|
||||
[gd_scene load_steps=16 format=3 uid="uid://dmiqwmivkjgmq"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="1_afeds"]
|
||||
[ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Antechamber.tscn" id="3_7txs6"]
|
||||
@@ -13,13 +13,14 @@
|
||||
[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="11_yvj8v"]
|
||||
[ext_resource type="PackedScene" uid="uid://bksq62muhk3h5" path="res://src/enemy/enemy_types/1. sproingy/Sproingy.tscn" id="12_pmbic"]
|
||||
[ext_resource type="PackedScene" uid="uid://b0gwivt7cw7nd" path="res://src/enemy/enemy_types/2. michael/Michael.tscn" id="13_eyrkc"]
|
||||
[ext_resource type="PackedScene" uid="uid://bkj1kyqu7reul" path="res://src/enemy/enemy_types/13. gold sproingy/GoldSproingy.tscn" id="14_pmbic"]
|
||||
|
||||
[sub_resource type="NavigationMesh" id="NavigationMesh_gqi8w"]
|
||||
border_size = 1.0
|
||||
agent_height = 3.0
|
||||
agent_radius = 0.1
|
||||
|
||||
[node name="Floor1" type="Node3D"]
|
||||
[node name="Floor02" type="Node3D"]
|
||||
script = ExtResource("5_ld0kt")
|
||||
|
||||
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."]
|
||||
@@ -37,4 +38,5 @@ generate_on_ready = false
|
||||
|
||||
[node name="EnemyDatabase" parent="." instance=ExtResource("11_yvj8v")]
|
||||
unique_name_in_owner = true
|
||||
EnemyList = Array[PackedScene]([ExtResource("12_pmbic"), ExtResource("13_eyrkc")])
|
||||
EnemyList = Array[PackedScene]([ExtResource("12_pmbic"), ExtResource("13_eyrkc"), ExtResource("14_pmbic")])
|
||||
SpawnRate = PackedFloat32Array(1, 1, 0.05)
|
||||
|
||||
@@ -20,7 +20,7 @@ border_size = 1.0
|
||||
agent_height = 3.0
|
||||
agent_radius = 0.1
|
||||
|
||||
[node name="Floor1" type="Node3D"]
|
||||
[node name="Floor03" type="Node3D"]
|
||||
script = ExtResource("5_mo2td")
|
||||
|
||||
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."]
|
||||
|
||||
41
src/map/dungeon/floors/Floor04.tscn
Normal file
41
src/map/dungeon/floors/Floor04.tscn
Normal file
@@ -0,0 +1,41 @@
|
||||
[gd_scene load_steps=15 format=3 uid="uid://cikq7vuorlpbl"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_8amoj"]
|
||||
[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_p7nwd"]
|
||||
[ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Antechamber.tscn" id="3_te0rp"]
|
||||
[ext_resource type="PackedScene" uid="uid://b82dx66mgs2d7" path="res://src/map/dungeon/scenes/BasinRoom.tscn" id="4_i5hjj"]
|
||||
[ext_resource type="PackedScene" uid="uid://b7111krf365x0" path="res://src/map/dungeon/scenes/InnerBalcony.tscn" id="5_katpr"]
|
||||
[ext_resource type="PackedScene" uid="uid://c1qicmrcg6q6x" path="res://src/map/dungeon/scenes/ColumnRoom.tscn" id="6_8pmtc"]
|
||||
[ext_resource type="PackedScene" uid="uid://dfpyfpnya0f4u" path="res://src/map/dungeon/scenes/WaterRoom.tscn" id="7_5wyu4"]
|
||||
[ext_resource type="PackedScene" uid="uid://vdhl32je6hq2" path="res://src/map/dungeon/scenes/Antechamber_2.tscn" id="8_36gcj"]
|
||||
[ext_resource type="PackedScene" uid="uid://cam640h4euewx" path="res://src/map/dungeon/scenes/PitRoom2.tscn" id="9_gn1yf"]
|
||||
[ext_resource type="PackedScene" uid="uid://bn4gslp2gk8ds" path="res://src/map/dungeon/corridor/Corridor.tscn" id="10_he2ag"]
|
||||
[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="11_f4225"]
|
||||
[ext_resource type="PackedScene" uid="uid://b0gwivt7cw7nd" path="res://src/enemy/enemy_types/2. michael/Michael.tscn" id="13_5kttw"]
|
||||
[ext_resource type="PackedScene" uid="uid://cvk007twac22c" path="res://src/enemy/enemy_types/3. filth_eater/FilthEater.tscn" id="14_h5hhw"]
|
||||
|
||||
[sub_resource type="NavigationMesh" id="NavigationMesh_gqi8w"]
|
||||
border_size = 1.0
|
||||
agent_height = 3.0
|
||||
agent_radius = 0.1
|
||||
|
||||
[node name="Floor04" type="Node3D"]
|
||||
script = ExtResource("1_8amoj")
|
||||
|
||||
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."]
|
||||
unique_name_in_owner = true
|
||||
navigation_mesh = SubResource("NavigationMesh_gqi8w")
|
||||
|
||||
[node name="DungeonGenerator" type="Node3D" parent="NavigationRegion3D"]
|
||||
unique_name_in_owner = true
|
||||
script = ExtResource("2_p7nwd")
|
||||
room_scenes = Array[PackedScene]([ExtResource("3_te0rp"), ExtResource("4_i5hjj"), ExtResource("5_katpr"), ExtResource("6_8pmtc"), ExtResource("7_5wyu4"), ExtResource("8_36gcj"), ExtResource("9_gn1yf")])
|
||||
corridor_room_scene = ExtResource("10_he2ag")
|
||||
dungeon_size = Vector3i(60, 1, 60)
|
||||
voxel_scale = Vector3(4, 4, 4)
|
||||
generate_on_ready = false
|
||||
|
||||
[node name="EnemyDatabase" parent="." instance=ExtResource("11_f4225")]
|
||||
unique_name_in_owner = true
|
||||
EnemyList = Array[PackedScene]([ExtResource("13_5kttw"), ExtResource("14_h5hhw")])
|
||||
SpawnRate = PackedFloat32Array(0.5, 1)
|
||||
42
src/map/dungeon/floors/Floor05.tscn
Normal file
42
src/map/dungeon/floors/Floor05.tscn
Normal file
@@ -0,0 +1,42 @@
|
||||
[gd_scene load_steps=16 format=3 uid="uid://t7cac7801bnk"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_8l7r7"]
|
||||
[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_ksplq"]
|
||||
[ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Antechamber.tscn" id="3_b3rou"]
|
||||
[ext_resource type="PackedScene" uid="uid://b82dx66mgs2d7" path="res://src/map/dungeon/scenes/BasinRoom.tscn" id="4_duhq4"]
|
||||
[ext_resource type="PackedScene" uid="uid://b7111krf365x0" path="res://src/map/dungeon/scenes/InnerBalcony.tscn" id="5_ut4ij"]
|
||||
[ext_resource type="PackedScene" uid="uid://c1qicmrcg6q6x" path="res://src/map/dungeon/scenes/ColumnRoom.tscn" id="6_lposy"]
|
||||
[ext_resource type="PackedScene" uid="uid://dfpyfpnya0f4u" path="res://src/map/dungeon/scenes/WaterRoom.tscn" id="7_mb8sd"]
|
||||
[ext_resource type="PackedScene" uid="uid://vdhl32je6hq2" path="res://src/map/dungeon/scenes/Antechamber_2.tscn" id="8_573ke"]
|
||||
[ext_resource type="PackedScene" uid="uid://cam640h4euewx" path="res://src/map/dungeon/scenes/PitRoom2.tscn" id="9_puq45"]
|
||||
[ext_resource type="PackedScene" uid="uid://bn4gslp2gk8ds" path="res://src/map/dungeon/corridor/Corridor.tscn" id="10_slkpn"]
|
||||
[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="11_l2dei"]
|
||||
[ext_resource type="PackedScene" uid="uid://b0gwivt7cw7nd" path="res://src/enemy/enemy_types/2. michael/Michael.tscn" id="12_uv3l4"]
|
||||
[ext_resource type="PackedScene" uid="uid://cvk007twac22c" path="res://src/enemy/enemy_types/3. filth_eater/FilthEater.tscn" id="13_v44hk"]
|
||||
[ext_resource type="PackedScene" uid="uid://bkj1kyqu7reul" path="res://src/enemy/enemy_types/13. gold sproingy/GoldSproingy.tscn" id="14_ksplq"]
|
||||
|
||||
[sub_resource type="NavigationMesh" id="NavigationMesh_gqi8w"]
|
||||
border_size = 1.0
|
||||
agent_height = 3.0
|
||||
agent_radius = 0.1
|
||||
|
||||
[node name="Floor05" type="Node3D"]
|
||||
script = ExtResource("1_8l7r7")
|
||||
|
||||
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."]
|
||||
unique_name_in_owner = true
|
||||
navigation_mesh = SubResource("NavigationMesh_gqi8w")
|
||||
|
||||
[node name="DungeonGenerator" type="Node3D" parent="NavigationRegion3D"]
|
||||
unique_name_in_owner = true
|
||||
script = ExtResource("2_ksplq")
|
||||
room_scenes = Array[PackedScene]([ExtResource("3_b3rou"), ExtResource("4_duhq4"), ExtResource("5_ut4ij"), ExtResource("6_lposy"), ExtResource("7_mb8sd"), ExtResource("8_573ke"), ExtResource("9_puq45")])
|
||||
corridor_room_scene = ExtResource("10_slkpn")
|
||||
dungeon_size = Vector3i(60, 1, 60)
|
||||
voxel_scale = Vector3(4, 4, 4)
|
||||
generate_on_ready = false
|
||||
|
||||
[node name="EnemyDatabase" parent="." instance=ExtResource("11_l2dei")]
|
||||
unique_name_in_owner = true
|
||||
EnemyList = Array[PackedScene]([ExtResource("12_uv3l4"), ExtResource("13_v44hk"), ExtResource("14_ksplq")])
|
||||
SpawnRate = PackedFloat32Array(0.5, 1, 0.05)
|
||||
41
src/map/dungeon/floors/Floor06.tscn
Normal file
41
src/map/dungeon/floors/Floor06.tscn
Normal file
@@ -0,0 +1,41 @@
|
||||
[gd_scene load_steps=15 format=3 uid="uid://da107mywg18x1"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_51vs0"]
|
||||
[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_ixj2e"]
|
||||
[ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Antechamber.tscn" id="3_rgrkc"]
|
||||
[ext_resource type="PackedScene" uid="uid://b82dx66mgs2d7" path="res://src/map/dungeon/scenes/BasinRoom.tscn" id="4_ltey6"]
|
||||
[ext_resource type="PackedScene" uid="uid://b7111krf365x0" path="res://src/map/dungeon/scenes/InnerBalcony.tscn" id="5_xalbn"]
|
||||
[ext_resource type="PackedScene" uid="uid://c1qicmrcg6q6x" path="res://src/map/dungeon/scenes/ColumnRoom.tscn" id="6_yfjr1"]
|
||||
[ext_resource type="PackedScene" uid="uid://dfpyfpnya0f4u" path="res://src/map/dungeon/scenes/WaterRoom.tscn" id="7_wnhhx"]
|
||||
[ext_resource type="PackedScene" uid="uid://vdhl32je6hq2" path="res://src/map/dungeon/scenes/Antechamber_2.tscn" id="8_7s220"]
|
||||
[ext_resource type="PackedScene" uid="uid://cam640h4euewx" path="res://src/map/dungeon/scenes/PitRoom2.tscn" id="9_twkiu"]
|
||||
[ext_resource type="PackedScene" uid="uid://bn4gslp2gk8ds" path="res://src/map/dungeon/corridor/Corridor.tscn" id="10_xh2mp"]
|
||||
[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="11_vn8cd"]
|
||||
[ext_resource type="PackedScene" uid="uid://feegakykn3fv" path="res://src/enemy/enemy_types/5. ballos/Ballos.tscn" id="13_0tmnj"]
|
||||
[ext_resource type="PackedScene" uid="uid://cvk007twac22c" path="res://src/enemy/enemy_types/3. filth_eater/FilthEater.tscn" id="13_gb3sg"]
|
||||
|
||||
[sub_resource type="NavigationMesh" id="NavigationMesh_gqi8w"]
|
||||
border_size = 1.0
|
||||
agent_height = 3.0
|
||||
agent_radius = 0.1
|
||||
|
||||
[node name="Floor06" type="Node3D"]
|
||||
script = ExtResource("1_51vs0")
|
||||
|
||||
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."]
|
||||
unique_name_in_owner = true
|
||||
navigation_mesh = SubResource("NavigationMesh_gqi8w")
|
||||
|
||||
[node name="DungeonGenerator" type="Node3D" parent="NavigationRegion3D"]
|
||||
unique_name_in_owner = true
|
||||
script = ExtResource("2_ixj2e")
|
||||
room_scenes = Array[PackedScene]([ExtResource("3_rgrkc"), ExtResource("4_ltey6"), ExtResource("5_xalbn"), ExtResource("6_yfjr1"), ExtResource("7_wnhhx"), ExtResource("8_7s220"), ExtResource("9_twkiu")])
|
||||
corridor_room_scene = ExtResource("10_xh2mp")
|
||||
dungeon_size = Vector3i(60, 1, 60)
|
||||
voxel_scale = Vector3(4, 4, 4)
|
||||
generate_on_ready = false
|
||||
|
||||
[node name="EnemyDatabase" parent="." instance=ExtResource("11_vn8cd")]
|
||||
unique_name_in_owner = true
|
||||
EnemyList = Array[PackedScene]([ExtResource("13_gb3sg"), ExtResource("13_0tmnj")])
|
||||
SpawnRate = PackedFloat32Array(1, 0.5)
|
||||
42
src/map/dungeon/floors/Floor07.tscn
Normal file
42
src/map/dungeon/floors/Floor07.tscn
Normal file
@@ -0,0 +1,42 @@
|
||||
[gd_scene load_steps=16 format=3 uid="uid://cgtqjgh1f5fqi"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_un5rc"]
|
||||
[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_purgj"]
|
||||
[ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Antechamber.tscn" id="3_67qnt"]
|
||||
[ext_resource type="PackedScene" uid="uid://b82dx66mgs2d7" path="res://src/map/dungeon/scenes/BasinRoom.tscn" id="4_ogmgc"]
|
||||
[ext_resource type="PackedScene" uid="uid://b7111krf365x0" path="res://src/map/dungeon/scenes/InnerBalcony.tscn" id="5_fjqnq"]
|
||||
[ext_resource type="PackedScene" uid="uid://c1qicmrcg6q6x" path="res://src/map/dungeon/scenes/ColumnRoom.tscn" id="6_bji1g"]
|
||||
[ext_resource type="PackedScene" uid="uid://dfpyfpnya0f4u" path="res://src/map/dungeon/scenes/WaterRoom.tscn" id="7_sqvag"]
|
||||
[ext_resource type="PackedScene" uid="uid://vdhl32je6hq2" path="res://src/map/dungeon/scenes/Antechamber_2.tscn" id="8_c5i81"]
|
||||
[ext_resource type="PackedScene" uid="uid://cam640h4euewx" path="res://src/map/dungeon/scenes/PitRoom2.tscn" id="9_lo82o"]
|
||||
[ext_resource type="PackedScene" uid="uid://bn4gslp2gk8ds" path="res://src/map/dungeon/corridor/Corridor.tscn" id="10_xvcp8"]
|
||||
[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="11_xast8"]
|
||||
[ext_resource type="PackedScene" uid="uid://cvk007twac22c" path="res://src/enemy/enemy_types/3. filth_eater/FilthEater.tscn" id="12_tr8km"]
|
||||
[ext_resource type="PackedScene" uid="uid://feegakykn3fv" path="res://src/enemy/enemy_types/5. ballos/Ballos.tscn" id="13_43euk"]
|
||||
[ext_resource type="PackedScene" uid="uid://dlw5cvutvypxn" path="res://src/enemy/enemy_types/6. chariot/Chariot.tscn" id="14_purgj"]
|
||||
|
||||
[sub_resource type="NavigationMesh" id="NavigationMesh_gqi8w"]
|
||||
border_size = 1.0
|
||||
agent_height = 3.0
|
||||
agent_radius = 0.1
|
||||
|
||||
[node name="Floor07" type="Node3D"]
|
||||
script = ExtResource("1_un5rc")
|
||||
|
||||
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."]
|
||||
unique_name_in_owner = true
|
||||
navigation_mesh = SubResource("NavigationMesh_gqi8w")
|
||||
|
||||
[node name="DungeonGenerator" type="Node3D" parent="NavigationRegion3D"]
|
||||
unique_name_in_owner = true
|
||||
script = ExtResource("2_purgj")
|
||||
room_scenes = Array[PackedScene]([ExtResource("3_67qnt"), ExtResource("4_ogmgc"), ExtResource("5_fjqnq"), ExtResource("6_bji1g"), ExtResource("7_sqvag"), ExtResource("8_c5i81"), ExtResource("9_lo82o")])
|
||||
corridor_room_scene = ExtResource("10_xvcp8")
|
||||
dungeon_size = Vector3i(60, 1, 60)
|
||||
voxel_scale = Vector3(4, 4, 4)
|
||||
generate_on_ready = false
|
||||
|
||||
[node name="EnemyDatabase" parent="." instance=ExtResource("11_xast8")]
|
||||
unique_name_in_owner = true
|
||||
EnemyList = Array[PackedScene]([ExtResource("12_tr8km"), ExtResource("13_43euk"), ExtResource("14_purgj")])
|
||||
SpawnRate = PackedFloat32Array(0.5, 1, 0.25)
|
||||
40
src/map/dungeon/floors/Floor08.tscn
Normal file
40
src/map/dungeon/floors/Floor08.tscn
Normal file
@@ -0,0 +1,40 @@
|
||||
[gd_scene load_steps=15 format=3 uid="uid://dg20ovvj2m2lp"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_qs20c"]
|
||||
[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_6ps7u"]
|
||||
[ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Antechamber.tscn" id="3_pn3nc"]
|
||||
[ext_resource type="PackedScene" uid="uid://b82dx66mgs2d7" path="res://src/map/dungeon/scenes/BasinRoom.tscn" id="4_esh22"]
|
||||
[ext_resource type="PackedScene" uid="uid://b7111krf365x0" path="res://src/map/dungeon/scenes/InnerBalcony.tscn" id="5_mir7f"]
|
||||
[ext_resource type="PackedScene" uid="uid://c1qicmrcg6q6x" path="res://src/map/dungeon/scenes/ColumnRoom.tscn" id="6_1elux"]
|
||||
[ext_resource type="PackedScene" uid="uid://dfpyfpnya0f4u" path="res://src/map/dungeon/scenes/WaterRoom.tscn" id="7_c68jx"]
|
||||
[ext_resource type="PackedScene" uid="uid://vdhl32je6hq2" path="res://src/map/dungeon/scenes/Antechamber_2.tscn" id="8_3lecr"]
|
||||
[ext_resource type="PackedScene" uid="uid://cam640h4euewx" path="res://src/map/dungeon/scenes/PitRoom2.tscn" id="9_dtrr3"]
|
||||
[ext_resource type="PackedScene" uid="uid://bn4gslp2gk8ds" path="res://src/map/dungeon/corridor/Corridor.tscn" id="10_vtwmp"]
|
||||
[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="11_uflod"]
|
||||
[ext_resource type="PackedScene" uid="uid://feegakykn3fv" path="res://src/enemy/enemy_types/5. ballos/Ballos.tscn" id="13_c8dl5"]
|
||||
[ext_resource type="PackedScene" uid="uid://dlw5cvutvypxn" path="res://src/enemy/enemy_types/6. chariot/Chariot.tscn" id="13_qs20c"]
|
||||
|
||||
[sub_resource type="NavigationMesh" id="NavigationMesh_gqi8w"]
|
||||
border_size = 1.0
|
||||
agent_height = 3.0
|
||||
agent_radius = 0.1
|
||||
|
||||
[node name="Floor08" type="Node3D"]
|
||||
script = ExtResource("1_qs20c")
|
||||
|
||||
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."]
|
||||
unique_name_in_owner = true
|
||||
navigation_mesh = SubResource("NavigationMesh_gqi8w")
|
||||
|
||||
[node name="DungeonGenerator" type="Node3D" parent="NavigationRegion3D"]
|
||||
unique_name_in_owner = true
|
||||
script = ExtResource("2_6ps7u")
|
||||
room_scenes = Array[PackedScene]([ExtResource("3_pn3nc"), ExtResource("4_esh22"), ExtResource("5_mir7f"), ExtResource("6_1elux"), ExtResource("7_c68jx"), ExtResource("8_3lecr"), ExtResource("9_dtrr3")])
|
||||
corridor_room_scene = ExtResource("10_vtwmp")
|
||||
dungeon_size = Vector3i(60, 1, 60)
|
||||
voxel_scale = Vector3(4, 4, 4)
|
||||
generate_on_ready = false
|
||||
|
||||
[node name="EnemyDatabase" parent="." instance=ExtResource("11_uflod")]
|
||||
unique_name_in_owner = true
|
||||
EnemyList = Array[PackedScene]([ExtResource("13_c8dl5"), ExtResource("13_qs20c")])
|
||||
42
src/map/dungeon/floors/Floor09.tscn
Normal file
42
src/map/dungeon/floors/Floor09.tscn
Normal file
@@ -0,0 +1,42 @@
|
||||
[gd_scene load_steps=16 format=3 uid="uid://b5jk743ng6fqg"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_ah6eb"]
|
||||
[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_2l5nt"]
|
||||
[ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Antechamber.tscn" id="3_f55jb"]
|
||||
[ext_resource type="PackedScene" uid="uid://b82dx66mgs2d7" path="res://src/map/dungeon/scenes/BasinRoom.tscn" id="4_iljqd"]
|
||||
[ext_resource type="PackedScene" uid="uid://b7111krf365x0" path="res://src/map/dungeon/scenes/InnerBalcony.tscn" id="5_2admg"]
|
||||
[ext_resource type="PackedScene" uid="uid://c1qicmrcg6q6x" path="res://src/map/dungeon/scenes/ColumnRoom.tscn" id="6_fuh3g"]
|
||||
[ext_resource type="PackedScene" uid="uid://dfpyfpnya0f4u" path="res://src/map/dungeon/scenes/WaterRoom.tscn" id="7_lk05i"]
|
||||
[ext_resource type="PackedScene" uid="uid://vdhl32je6hq2" path="res://src/map/dungeon/scenes/Antechamber_2.tscn" id="8_b81ow"]
|
||||
[ext_resource type="PackedScene" uid="uid://cam640h4euewx" path="res://src/map/dungeon/scenes/PitRoom2.tscn" id="9_tl40f"]
|
||||
[ext_resource type="PackedScene" uid="uid://bn4gslp2gk8ds" path="res://src/map/dungeon/corridor/Corridor.tscn" id="10_glh5y"]
|
||||
[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="11_xxd5b"]
|
||||
[ext_resource type="PackedScene" uid="uid://feegakykn3fv" path="res://src/enemy/enemy_types/5. ballos/Ballos.tscn" id="12_mhyau"]
|
||||
[ext_resource type="PackedScene" uid="uid://dlw5cvutvypxn" path="res://src/enemy/enemy_types/6. chariot/Chariot.tscn" id="13_v2ihw"]
|
||||
[ext_resource type="PackedScene" uid="uid://bkj1kyqu7reul" path="res://src/enemy/enemy_types/13. gold sproingy/GoldSproingy.tscn" id="14_2l5nt"]
|
||||
|
||||
[sub_resource type="NavigationMesh" id="NavigationMesh_gqi8w"]
|
||||
border_size = 1.0
|
||||
agent_height = 3.0
|
||||
agent_radius = 0.1
|
||||
|
||||
[node name="Floor09" type="Node3D"]
|
||||
script = ExtResource("1_ah6eb")
|
||||
|
||||
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."]
|
||||
unique_name_in_owner = true
|
||||
navigation_mesh = SubResource("NavigationMesh_gqi8w")
|
||||
|
||||
[node name="DungeonGenerator" type="Node3D" parent="NavigationRegion3D"]
|
||||
unique_name_in_owner = true
|
||||
script = ExtResource("2_2l5nt")
|
||||
room_scenes = Array[PackedScene]([ExtResource("3_f55jb"), ExtResource("4_iljqd"), ExtResource("5_2admg"), ExtResource("6_fuh3g"), ExtResource("7_lk05i"), ExtResource("8_b81ow"), ExtResource("9_tl40f")])
|
||||
corridor_room_scene = ExtResource("10_glh5y")
|
||||
dungeon_size = Vector3i(60, 1, 60)
|
||||
voxel_scale = Vector3(4, 4, 4)
|
||||
generate_on_ready = false
|
||||
|
||||
[node name="EnemyDatabase" parent="." instance=ExtResource("11_xxd5b")]
|
||||
unique_name_in_owner = true
|
||||
EnemyList = Array[PackedScene]([ExtResource("12_mhyau"), ExtResource("13_v2ihw"), ExtResource("14_2l5nt")])
|
||||
SpawnRate = PackedFloat32Array(1, 1, 0.05)
|
||||
@@ -24,6 +24,20 @@ public interface IPlayer : IKillable
|
||||
|
||||
public void TeleportPlayer(Vector3 newPosition);
|
||||
|
||||
public void HealHP(int amount);
|
||||
|
||||
public void RaiseHP(int amount);
|
||||
|
||||
public void HealVT(int amount);
|
||||
|
||||
public void RaiseVT(int amount);
|
||||
|
||||
public void RaiseBonusAttack(int amount);
|
||||
|
||||
public void RaiseBonusDefense(int amount);
|
||||
|
||||
public void RaiseBonusLuck(int amount);
|
||||
|
||||
public IInventory Inventory { get; }
|
||||
|
||||
public PlayerStats Stats { get; }
|
||||
|
||||
@@ -162,7 +162,6 @@ public partial class Player : CharacterBody3D, IPlayer
|
||||
this.Provide();
|
||||
PlayerLogic.Start();
|
||||
HealthTimer.Timeout += OnHealthTimerTimeout;
|
||||
Inventory.AccessoryUnequipped += Inventory_AccessoryUnequipped;
|
||||
Hitbox.AreaEntered += Hitbox_AreaEntered;
|
||||
}
|
||||
|
||||
@@ -193,6 +192,52 @@ public partial class Player : CharacterBody3D, IPlayer
|
||||
EmitSignal(SignalName.PauseButtonPressed);
|
||||
}
|
||||
|
||||
public void RaiseHP(int amountToRaise)
|
||||
{
|
||||
Stats.SetMaximumHP(Stats.MaximumHP.Value + amountToRaise);
|
||||
Stats.SetCurrentHP(Stats.MaximumHP.Value);
|
||||
Game.AnnounceMessageOnInventoryScreen($"{amountToRaise}MAXHP Up.");
|
||||
}
|
||||
|
||||
public void HealHP(int amountToRestore)
|
||||
{
|
||||
Stats.SetCurrentHP(Stats.CurrentHP.Value + amountToRestore);
|
||||
var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}";
|
||||
Game.AnnounceMessageOnInventoryScreen($"{raiseString}HP Restored.");
|
||||
}
|
||||
|
||||
public void RaiseVT(int amountToRaise)
|
||||
{
|
||||
if (Stats.CurrentVT.Value == Stats.MaximumVT.Value)
|
||||
{
|
||||
Stats.SetMaximumVT(Stats.MaximumVT.Value + amountToRaise);
|
||||
Stats.SetCurrentVT(Stats.MaximumVT.Value);
|
||||
Game.AnnounceMessageOnInventoryScreen($"{amountToRaise}MAXVT Up.");
|
||||
}
|
||||
}
|
||||
|
||||
public void HealVT(int amountToRestore)
|
||||
{
|
||||
Stats.SetCurrentVT(Stats.CurrentVT.Value + amountToRestore);
|
||||
var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}";
|
||||
Game.AnnounceMessageOnInventoryScreen($"{raiseString}VT Restored.");
|
||||
}
|
||||
|
||||
public void RaiseBonusAttack(int amount)
|
||||
{
|
||||
Stats.SetBonusAttack(Stats.BonusAttack.Value + amount);
|
||||
}
|
||||
|
||||
public void RaiseBonusDefense(int amount)
|
||||
{
|
||||
Stats.SetBonusDefense(Stats.BonusDefense.Value + amount);
|
||||
}
|
||||
|
||||
public void RaiseBonusLuck(int amount)
|
||||
{
|
||||
Stats.SetLuck(amount);
|
||||
}
|
||||
|
||||
public void Move(float delta)
|
||||
{
|
||||
var rawInput = GlobalInputVector;
|
||||
|
||||
Reference in New Issue
Block a user