Mystery item implementation

This commit is contained in:
2025-03-26 23:13:01 -07:00
parent 114ff35630
commit 9d3621dd2c
58 changed files with 860 additions and 309 deletions

View File

@@ -179,7 +179,28 @@ public partial class Game : Node3D, IGame
})
.Handle((in GameLogic.Output.HidePauseMenu _) => { PauseMenu.Hide(); })
.Handle((in GameLogic.Output.ExitPauseMenu _) => { PauseMenu.FadeOut(); Input.MouseMode = Input.MouseModeEnum.Visible; PauseMenu.SetProcessUnhandledInput(false); })
.Handle((in GameLogic.Output.LoadNextFloor _) => { Map.SpawnNextFloor(); })
.Handle((in GameLogic.Output.LoadNextFloor _) =>
{
Map.SpawnNextFloor();
if (Player.EquippedWeapon.Value.ItemTag == ItemTag.BreaksOnChange)
{
var itemToDestroy = Player.EquippedWeapon.Value;
Player.Unequip(itemToDestroy);
Player.Inventory.Remove(itemToDestroy);
}
if (Player.EquippedArmor.Value.ItemTag == ItemTag.BreaksOnChange)
{
var itemToDestroy = Player.EquippedArmor.Value;
Player.Unequip(itemToDestroy);
Player.Inventory.Remove(itemToDestroy);
}
if (Player.EquippedAccessory.Value.ItemTag == ItemTag.BreaksOnChange)
{
var itemToDestroy = Player.EquippedAccessory.Value;
Player.Unequip(itemToDestroy);
Player.Inventory.Remove(itemToDestroy);
}
})
.Handle((in GameLogic.Output.LoadMap _) => { Map.LoadMap(); })
.Handle((in GameLogic.Output.ShowFloorClearMenu _) => { FloorClearMenu.Show(); FloorClearMenu.FadeIn(); })
.Handle((in GameLogic.Output.ExitFloorClearMenu _) => { FloorClearMenu.FadeOut(); })
@@ -211,7 +232,7 @@ public partial class Game : Node3D, IGame
FloorClearMenu.SaveAndExit += FloorClearMenu_SaveAndExit;
FloorClearMenu.TransitionCompleted += FloorClearMenu_TransitionCompleted;
GameEventDepot.RestorativePickedUp += GameEventDepot_RestorativePickedUp;
GameRepo.RestorativePickedUp += GameEventDepot_RestorativePickedUp;
DoubleEXPTimer.Timeout += DoubleEXPTimer_Timeout;
@@ -236,6 +257,9 @@ public partial class Game : Node3D, IGame
public async Task UseItem(InventoryItem item)
{
if (item.ItemTag == ItemTag.MysteryItem)
item = RerollItem(item);
switch (item)
{
case ConsumableItem consumableItem:
@@ -267,7 +291,7 @@ public partial class Game : Node3D, IGame
{
var thrownScene = GD.Load<PackedScene>("res://src/items/thrown/ThrownItem.tscn");
var thrown = thrownScene.Instantiate<ThrownItem>();
thrown.ItemThatIsThrown = (InventoryItem)item;
thrown.ItemThatIsThrown = item;
AddChild(thrown);
thrown.Position += new Vector3(0, 1.5f, 0);
thrown.Throw(_effectService);
@@ -275,7 +299,37 @@ public partial class Game : Node3D, IGame
public IDungeonFloor CurrentFloor => Map.CurrentFloor;
public void EnemyDefeated(Vector3 defeatedLocation, EnemyStatResource resource) => Player.GainExp(resource.ExpFromDefeat * GameRepo.ExpRate);
public void EnemyDefeated(Vector3 defeatedLocation, EnemyStatResource resource)
{
Player.GainExp(resource.ExpFromDefeat * GameRepo.ExpRate);
DropRestorative(defeatedLocation);
}
public InventoryItem RerollItem(InventoryItem itemToReroll)
{
var itemDb = new ItemDatabase();
var currentIndex = Player.Inventory.Items.IndexOf(itemToReroll);
Player.Inventory.Remove(itemToReroll);
InventoryItem rolledItem = null;
if (itemToReroll is Weapon weapon)
rolledItem = itemDb.PickItem(weapon);
if (itemToReroll is Armor armor)
rolledItem = itemDb.PickItem(armor);
if (itemToReroll is Accessory accessory)
rolledItem = itemDb.PickItem(accessory);
if (itemToReroll is ThrowableItem throwableItem)
rolledItem = itemDb.PickItem(throwableItem);
if (itemToReroll is EffectItem effectItem)
rolledItem = itemDb.PickItem(effectItem);
if (itemToReroll is ConsumableItem consumableItem)
rolledItem = itemDb.PickItem(consumableItem);
Player.Inventory.TryInsert(rolledItem, currentIndex);
return rolledItem;
}
private void DropRestorative(Vector3 vector)
{

View File

@@ -1,6 +1,5 @@
using Godot;
using System;
using Zennysoft.Game.Abstractions;
namespace Zennysoft.Ma.Adapter;
@@ -18,7 +17,6 @@ public class GameEventDepot : IGameEventDepot
public event Action? MenuBackedOut;
public event Action? InventorySorted;
public event Action<InventoryItem>? HealingItemConsumed;
public event Action<IHealthPack>? RestorativePickedUp;
public void OnOverworldEntered() => OverworldEntered?.Invoke();
public void OnDungeonAThemeAreaEntered() => DungeonAThemeAreaEntered?.Invoke();
@@ -32,7 +30,6 @@ public class GameEventDepot : IGameEventDepot
public void OnInventorySorted() => InventorySorted?.Invoke();
public void OnHealingItemConsumed(InventoryItem item) => HealingItemConsumed?.Invoke(item);
public void OnRestorativePickedUp(IHealthPack restorative) => RestorativePickedUp?.Invoke(restorative);
public void Dispose()
{

View File

@@ -6,7 +6,6 @@ using Chickensoft.GodotNodeInterfaces;
using Chickensoft.SaveFileBuilder;
using Godot;
using System.Threading.Tasks;
using Zennysoft.Game.Abstractions;
using Zennysoft.Ma.Adapter;
public interface IGame : IProvide<IGameRepo>, IProvide<IGameEventDepot>, IProvide<IGame>, IProvide<IPlayer>, IProvide<IMap>, IProvide<ISaveChunk<GameData>>, INode3D
@@ -32,4 +31,6 @@ public interface IGame : IProvide<IGameRepo>, IProvide<IGameEventDepot>, IProvid
public void EnemyDefeated(Vector3 defeatedLocation, EnemyStatResource enemyStatResource);
public void TogglePause();
public InventoryItem RerollItem(InventoryItem itemToReroll);
}