Block on events where the inventory will close after, block in general to prevent inventory scrolling during inventory message display

This commit is contained in:
2026-03-03 18:59:09 -08:00
parent 7b6ca68e65
commit ff82f51451
2 changed files with 21 additions and 4 deletions

View File

@@ -235,13 +235,13 @@ public partial class Game : Node3D, IGame
switch (item) switch (item)
{ {
case BoxItem boxItem: case BoxItem boxItem:
EnactBoxItemEffects(boxItem); await EnactBoxItemEffects(boxItem);
break; break;
case ConsumableItem consumableItem: case ConsumableItem consumableItem:
EnactConsumableItemEffects(consumableItem); EnactConsumableItemEffects(consumableItem);
break; break;
case EffectItem effectItem: case EffectItem effectItem:
EnactEffectItemEffects(effectItem); await EnactEffectItemEffects(effectItem);
break; break;
} }
RemoveItemOrSubtractFromItemCount(item); RemoveItemOrSubtractFromItemCount(item);
@@ -465,13 +465,14 @@ public partial class Game : Node3D, IGame
private void FinishedLoadingSaveFile() => EmitSignal(SignalName.SaveFileLoaded); private void FinishedLoadingSaveFile() => EmitSignal(SignalName.SaveFileLoaded);
private void EnactBoxItemEffects(BoxItem boxItem) private async Task EnactBoxItemEffects(BoxItem boxItem)
{ {
switch (boxItem.ItemTag) switch (boxItem.ItemTag)
{ {
case ItemTag.DamagesPlayer: case ItemTag.DamagesPlayer:
_effectService.DamagesPlayer(boxItem.Stats.DamageToPlayer); _effectService.DamagesPlayer(boxItem.Stats.DamageToPlayer);
InventoryEventNotification.Invoke($"{boxItem.Stats.DamageToPlayer} damage done to self."); InventoryEventNotification.Invoke($"{boxItem.Stats.DamageToPlayer} damage done to self.");
await ToSignal(GetTree().CreateTimer(2f), "timeout");
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case ItemTag.ContainsAccessory: case ItemTag.ContainsAccessory:
@@ -560,6 +561,7 @@ public partial class Game : Node3D, IGame
ThrowItem(item); ThrowItem(item);
_player.Inventory.Items.Clear(); _player.Inventory.Items.Clear();
InventoryEventNotification.Invoke($"All items have been ejected from inventory."); InventoryEventNotification.Invoke($"All items have been ejected from inventory.");
await ToSignal(GetTree().CreateTimer(2f), "timeout");
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
} }
@@ -600,7 +602,7 @@ public partial class Game : Node3D, IGame
} }
} }
private void EnactEffectItemEffects(EffectItem effectItem) private async Task EnactEffectItemEffects(EffectItem effectItem)
{ {
switch (effectItem.UsableItemTag) switch (effectItem.UsableItemTag)
{ {
@@ -608,22 +610,26 @@ public partial class Game : Node3D, IGame
_effectService.TeleportEnemiesToCurrentRoom(GetTree().GetNodesInGroup("enemy").OfType<IEnemy>().ToList()); _effectService.TeleportEnemiesToCurrentRoom(GetTree().GetNodesInGroup("enemy").OfType<IEnemy>().ToList());
SfxDatabase.Instance.Play(SoundEffect.RecallEnemies); SfxDatabase.Instance.Play(SoundEffect.RecallEnemies);
InventoryEventNotification.Invoke($"All enemies have been summoned."); InventoryEventNotification.Invoke($"All enemies have been summoned.");
await ToSignal(GetTree().CreateTimer(2f), "timeout");
GameRepo.CloseInventory(); GameRepo.CloseInventory();
_player.PlaySpellFX(SpellFXEnum.DivinityRecall); _player.PlaySpellFX(SpellFXEnum.DivinityRecall);
break; break;
case UsableItemTag.KillHalfEnemiesInRoom: case UsableItemTag.KillHalfEnemiesInRoom:
_effectService.KillHalfEnemiesInRoom(); _effectService.KillHalfEnemiesInRoom();
InventoryEventNotification.Invoke($"The balance has been achieved."); InventoryEventNotification.Invoke($"The balance has been achieved.");
await ToSignal(GetTree().CreateTimer(2f), "timeout");
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case UsableItemTag.TurnAllEnemiesIntoHealingItem: case UsableItemTag.TurnAllEnemiesIntoHealingItem:
_effectService.TurnAllEnemiesInRoomIntoHealingItem(); _effectService.TurnAllEnemiesInRoomIntoHealingItem();
InventoryEventNotification.Invoke($"Enemies in current room have been converted."); InventoryEventNotification.Invoke($"Enemies in current room have been converted.");
await ToSignal(GetTree().CreateTimer(2f), "timeout");
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case UsableItemTag.HealsAllInRoomToMaxHP: case UsableItemTag.HealsAllInRoomToMaxHP:
_effectService.HealAllEnemiesAndPlayerInRoomToFull(); _effectService.HealAllEnemiesAndPlayerInRoomToFull();
InventoryEventNotification.Invoke($"All present have been renewed."); InventoryEventNotification.Invoke($"All present have been renewed.");
await ToSignal(GetTree().CreateTimer(2f), "timeout");
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case UsableItemTag.AbsorbHPFromAllEnemiesInRoom: case UsableItemTag.AbsorbHPFromAllEnemiesInRoom:
@@ -631,11 +637,13 @@ public partial class Game : Node3D, IGame
if (hpAbsorbed == 0) if (hpAbsorbed == 0)
{ {
InventoryEventNotification.Invoke($"No enemies present to absorb from or invalid location."); InventoryEventNotification.Invoke($"No enemies present to absorb from or invalid location.");
await ToSignal(GetTree().CreateTimer(2f), "timeout");
GameRepo.CloseInventory(); GameRepo.CloseInventory();
return; return;
} }
_player.HealthComponent.Heal(hpAbsorbed); _player.HealthComponent.Heal(hpAbsorbed);
InventoryEventNotification.Invoke($"Enemies have surrendered {hpAbsorbed} to you."); InventoryEventNotification.Invoke($"Enemies have surrendered {hpAbsorbed} to you.");
await ToSignal(GetTree().CreateTimer(2f), "timeout");
GameRepo.CloseInventory(); GameRepo.CloseInventory();
_player.PlaySpellFX(SpellFXEnum.Kyuuketsuki); _player.PlaySpellFX(SpellFXEnum.Kyuuketsuki);
break; break;
@@ -643,11 +651,13 @@ public partial class Game : Node3D, IGame
case UsableItemTag.DealElementalDamageToAllEnemiesInRoom: case UsableItemTag.DealElementalDamageToAllEnemiesInRoom:
_effectService.DealElementalDamageToAllEnemiesInRoom(effectItem.Stats.ElementalDamageType); _effectService.DealElementalDamageToAllEnemiesInRoom(effectItem.Stats.ElementalDamageType);
InventoryEventNotification.Invoke($"All enemies present have taken {effectItem.Stats.ElementalDamageType} to you."); InventoryEventNotification.Invoke($"All enemies present have taken {effectItem.Stats.ElementalDamageType} to you.");
await ToSignal(GetTree().CreateTimer(2f), "timeout");
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case UsableItemTag.SwapHPAndVT: case UsableItemTag.SwapHPAndVT:
_effectService.SwapHPandVT(); _effectService.SwapHPandVT();
InventoryEventNotification.Invoke($"HP and VT have been traded."); InventoryEventNotification.Invoke($"HP and VT have been traded.");
await ToSignal(GetTree().CreateTimer(2f), "timeout");
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case UsableItemTag.RaiseCurrentWeaponAttack: case UsableItemTag.RaiseCurrentWeaponAttack:
@@ -696,6 +706,7 @@ public partial class Game : Node3D, IGame
InventoryEventNotification.Invoke($"Moved to exit room."); InventoryEventNotification.Invoke($"Moved to exit room.");
else else
InventoryEventNotification.Invoke($"Unable to locate exit room."); InventoryEventNotification.Invoke($"Unable to locate exit room.");
await ToSignal(GetTree().CreateTimer(2f), "timeout");
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case UsableItemTag.IncreaseAttack: case UsableItemTag.IncreaseAttack:

View File

@@ -81,6 +81,12 @@ public partial class InventoryMenu : Control, IInventoryMenu
public override void _Input(InputEvent @event) public override void _Input(InputEvent @event)
{ {
if (_blocking)
{
GetViewport().SetInputAsHandled();
return;
}
var validSelectableItems = _player.Inventory.Items.ToList(); var validSelectableItems = _player.Inventory.Items.ToList();
if (Input.IsActionJustPressed(GameInputs.MoveUp) && _currentlySelected != null && _currentlySelected.Item.Value != validSelectableItems.First()) if (Input.IsActionJustPressed(GameInputs.MoveUp) && _currentlySelected != null && _currentlySelected.Item.Value != validSelectableItems.First())