Positional audio fix and BossRoomA spawn fix

This commit is contained in:
Pal
2025-09-14 22:35:11 -07:00
parent 32ecc3752a
commit b501d22782
4 changed files with 328 additions and 325 deletions

View File

@@ -74,202 +74,202 @@ public partial class Game : Node3D, IGame
public void Setup() public void Setup()
{ {
_container = new SimpleInjector.Container(); _container = new SimpleInjector.Container();
Module.Bootstrap(_container); Module.Bootstrap(_container);
GameRepo = _container.GetInstance<IGameRepo>(); GameRepo = _container.GetInstance<IGameRepo>();
GameState = _container.GetInstance<IGameState>(); GameState = _container.GetInstance<IGameState>();
GameState.Set(GameRepo); GameState.Set(GameRepo);
GameState.Set(AppRepo); GameState.Set(AppRepo);
GameState.Set(Player); GameState.Set(Player);
GameState.Set(Map); GameState.Set(Map);
GameState.Set(InGameUI); GameState.Set(InGameUI);
Instantiator = new Instantiator(GetTree()); Instantiator = new Instantiator(GetTree());
RescuedItems = new RescuedItemDatabase(); RescuedItems = new RescuedItemDatabase();
GameChunk = new SaveChunk<GameData>( GameChunk = new SaveChunk<GameData>(
(chunk) => (chunk) =>
{ {
var gameData = new GameData() var gameData = new GameData()
{ {
PlayerData = new PlayerData() PlayerData = new PlayerData()
{ {
PlayerStats = Player.Stats, PlayerStats = Player.Stats,
Inventory = Player.Inventory Inventory = Player.Inventory
}, },
MapData = new MapData() MapData = new MapData()
{ {
FloorScenes = Map.FloorScenes FloorScenes = Map.FloorScenes
}, },
RescuedItems = new RescuedItemDatabase() RescuedItems = new RescuedItemDatabase()
{ {
Items = RescuedItems.Items Items = RescuedItems.Items
} }
}; };
return gameData; return gameData;
}, },
onLoad: onLoad:
(chunk, data) => (chunk, data) =>
{ {
RescuedItems = data.RescuedItems; RescuedItems = data.RescuedItems;
chunk.LoadChunkSaveData(data.PlayerData); chunk.LoadChunkSaveData(data.PlayerData);
chunk.LoadChunkSaveData(data.MapData); chunk.LoadChunkSaveData(data.MapData);
} }
); );
} }
public void OnResolved() public void OnResolved()
{ {
var saveFileManager = _container.GetInstance<IMaSaveFileManager<GameData>>(); var saveFileManager = _container.GetInstance<IMaSaveFileManager<GameData>>();
SaveFile = new SaveFile<GameData>( SaveFile = new SaveFile<GameData>(
root: GameChunk, root: GameChunk,
onSave: saveFileManager.Save, onSave: saveFileManager.Save,
onLoad: async () => onLoad: async () =>
{ {
try try
{ {
var gameData = await saveFileManager.Load(); var gameData = await saveFileManager.Load();
return gameData; return gameData;
} }
catch (FileNotFoundException) catch (FileNotFoundException)
{ {
GD.Print("No save file found."); GD.Print("No save file found.");
} }
return null; return null;
} }
); );
GameBinding = GameState.Bind(); GameBinding = GameState.Bind();
GameBinding GameBinding
.Handle((in GameState.Output.InitializeGame _) => .Handle((in GameState.Output.InitializeGame _) =>
{ {
InitializeGame(); InitializeGame();
Map.LoadMap(); Map.LoadMap();
GameRepo.Resume(); GameRepo.Resume();
InGameUI.Show(); InGameUI.Show();
InGameUI.PlayerInfoUI.Activate(); InGameUI.PlayerInfoUI.Activate();
Player.TeleportPlayer(Map.CurrentFloor.GetPlayerSpawnPoint()); Player.TeleportPlayer(Map.CurrentFloor.GetPlayerSpawnPoint());
Player.Activate(); Player.Activate();
Autoload.BgmPlayer.Play(BackgroundMusic.CrossingTheGate); Autoload.BgmPlayer.Play(BackgroundMusic.CrossingTheGate);
}) })
.Handle((in GameState.Output.LoadGameFromFile _) => .Handle((in GameState.Output.LoadGameFromFile _) =>
{ {
LoadExistingGame(); LoadExistingGame();
}) })
.Handle((in GameState.Output.OpenPauseScreen _) => .Handle((in GameState.Output.OpenPauseScreen _) =>
{ {
GameRepo.Pause(); GameRepo.Pause();
PauseMenu.Show(); PauseMenu.Show();
PauseMenu.FadeIn(); PauseMenu.FadeIn();
Input.MouseMode = Input.MouseModeEnum.Visible; Input.MouseMode = Input.MouseModeEnum.Visible;
PauseMenu.SetProcessUnhandledInput(true); PauseMenu.SetProcessUnhandledInput(true);
}) })
.Handle((in GameState.Output.ClosePauseScreen _) => .Handle((in GameState.Output.ClosePauseScreen _) =>
{ {
PauseMenu.FadeOut(); PauseMenu.FadeOut();
Input.MouseMode = Input.MouseModeEnum.Visible; Input.MouseMode = Input.MouseModeEnum.Visible;
PauseMenu.SetProcessUnhandledInput(false); PauseMenu.SetProcessUnhandledInput(false);
GameRepo.Resume(); GameRepo.Resume();
}) })
.Handle((in GameState.Output.OpenInventoryMenu _) => .Handle((in GameState.Output.OpenInventoryMenu _) =>
{ {
InGameUI.InventoryMenu.RefreshInventoryScreen(); InGameUI.InventoryMenu.RefreshInventoryScreen();
InGameUI.InventoryMenu.Show(); InGameUI.InventoryMenu.Show();
InGameUI.InventoryMenu.SetProcessInput(true); InGameUI.InventoryMenu.SetProcessInput(true);
}) })
.Handle((in GameState.Output.CloseInventoryMenu _) => .Handle((in GameState.Output.CloseInventoryMenu _) =>
{ {
InGameUI.InventoryMenu.Hide(); InGameUI.InventoryMenu.Hide();
InGameUI.InventoryMenu.SetProcessInput(false); InGameUI.InventoryMenu.SetProcessInput(false);
}) })
.Handle((in GameState.Output.OpenDebugMenu _) => .Handle((in GameState.Output.OpenDebugMenu _) =>
{ {
InGameUI.DebugMenu.Show(); InGameUI.DebugMenu.Show();
InGameUI.PlayerInfoUI.Hide(); InGameUI.PlayerInfoUI.Hide();
GameRepo.Pause(); GameRepo.Pause();
}) })
.Handle((in GameState.Output.CloseDebugMenu _) => .Handle((in GameState.Output.CloseDebugMenu _) =>
{ {
InGameUI.DebugMenu.Hide(); InGameUI.DebugMenu.Hide();
InGameUI.PlayerInfoUI.Show(); InGameUI.PlayerInfoUI.Show();
GameRepo.Resume(); GameRepo.Resume();
}) })
.Handle((in GameState.Output.OpenTeleportScreen _) => .Handle((in GameState.Output.OpenTeleportScreen _) =>
{ {
InGameUI.UseTeleportPrompt.Show(); InGameUI.UseTeleportPrompt.Show();
InGameUI.UseTeleportPrompt.FadeIn(); InGameUI.UseTeleportPrompt.FadeIn();
}) })
.Handle((in GameState.Output.OpenFloorExitScreen _) => .Handle((in GameState.Output.OpenFloorExitScreen _) =>
{ {
InGameUI.UseTeleportPrompt.FadeOut(); InGameUI.UseTeleportPrompt.FadeOut();
FloorClearMenu.Show(); FloorClearMenu.Show();
FloorClearMenu.FadeIn(); FloorClearMenu.FadeIn();
}) })
.Handle((in GameState.Output.LoadNextFloor _) => .Handle((in GameState.Output.LoadNextFloor _) =>
{ {
FloorClearMenu.FadeOut(); FloorClearMenu.FadeOut();
Map.SpawnNextFloor(); Map.SpawnNextFloor();
if (Player.EquippedWeapon.Value.ItemTag == ItemTag.BreaksOnChange) if (Player.EquippedWeapon.Value.ItemTag == ItemTag.BreaksOnChange)
{ {
var itemToDestroy = Player.EquippedWeapon.Value; var itemToDestroy = Player.EquippedWeapon.Value;
Player.Unequip(itemToDestroy); Player.Unequip(itemToDestroy);
Player.Inventory.Remove(itemToDestroy); Player.Inventory.Remove(itemToDestroy);
} }
if (Player.EquippedArmor.Value.ItemTag == ItemTag.BreaksOnChange) if (Player.EquippedArmor.Value.ItemTag == ItemTag.BreaksOnChange)
{ {
var itemToDestroy = Player.EquippedArmor.Value; var itemToDestroy = Player.EquippedArmor.Value;
Player.Unequip(itemToDestroy); Player.Unequip(itemToDestroy);
Player.Inventory.Remove(itemToDestroy); Player.Inventory.Remove(itemToDestroy);
} }
if (Player.EquippedAccessory.Value.ItemTag == ItemTag.BreaksOnChange) if (Player.EquippedAccessory.Value.ItemTag == ItemTag.BreaksOnChange)
{ {
var itemToDestroy = Player.EquippedAccessory.Value; var itemToDestroy = Player.EquippedAccessory.Value;
Player.Unequip(itemToDestroy); Player.Unequip(itemToDestroy);
Player.Inventory.Remove(itemToDestroy); Player.Inventory.Remove(itemToDestroy);
} }
FloorClearMenu.FadeOut(); FloorClearMenu.FadeOut();
}) })
.Handle((in GameState.Output.GameOver _) => .Handle((in GameState.Output.GameOver _) =>
{ {
GameRepo.Pause(); GameRepo.Pause();
DeathMenu.FadeIn(); DeathMenu.FadeIn();
}); });
GameState.Start(); GameState.Start();
this.Provide(); this.Provide();
InGameUI.UseTeleportPrompt.TeleportToNextFloor += UseTeleportPrompt_TeleportToNextFloor; InGameUI.UseTeleportPrompt.TeleportToNextFloor += UseTeleportPrompt_TeleportToNextFloor;
InGameUI.UseTeleportPrompt.CloseTeleportPrompt += UseTeleportPrompt_CloseTeleportPrompt; InGameUI.UseTeleportPrompt.CloseTeleportPrompt += UseTeleportPrompt_CloseTeleportPrompt;
FloorClearMenu.GoToNextFloor += FloorClearMenu_GoToNextFloor; FloorClearMenu.GoToNextFloor += FloorClearMenu_GoToNextFloor;
FloorClearMenu.SaveAndExit += FloorClearMenu_SaveAndExit; FloorClearMenu.SaveAndExit += FloorClearMenu_SaveAndExit;
FloorClearMenu.TransitionCompleted += FloorClearMenu_TransitionCompleted; FloorClearMenu.TransitionCompleted += FloorClearMenu_TransitionCompleted;
GameRepo.RestorativePickedUp += GameEventDepot_RestorativePickedUp; GameRepo.RestorativePickedUp += GameEventDepot_RestorativePickedUp;
DoubleEXPTimer.Timeout += DoubleEXPTimer_Timeout; DoubleEXPTimer.Timeout += DoubleEXPTimer_Timeout;
MainMenu.NewGame += OnNewGame; MainMenu.NewGame += OnNewGame;
MainMenu.LoadGame += OnLoadGame; MainMenu.LoadGame += OnLoadGame;
MainMenu.Quit += OnQuit; MainMenu.Quit += OnQuit;
DeathMenu.NewGame += OnContinueGame; DeathMenu.NewGame += OnContinueGame;
DeathMenu.QuitGame += OnQuit; DeathMenu.QuitGame += OnQuit;
GameRepo.IsPaused.Sync += IsPaused_Sync; GameRepo.IsPaused.Sync += IsPaused_Sync;
_effectService = new EffectService(this, Player, Map); _effectService = new EffectService(this, Player, Map);
MainMenu.Show(); MainMenu.Show();
} }
private void FloorClearMenu_SaveAndExit() private void FloorClearMenu_SaveAndExit()
{ {
//SaveFile.Save(); //SaveFile.Save();
Player.Deactivate(); Player.Deactivate();
GameState.Input(new GameState.Input.ReturnToMainMenu()); GameState.Input(new GameState.Input.ReturnToMainMenu());
InGameUI.Hide(); InGameUI.Hide();
MainMenu.FadeIn(); MainMenu.FadeIn();
} }
private void FloorClearMenu_GoToNextFloor() => GameState.Input(new GameState.Input.LoadNextFloor()); private void FloorClearMenu_GoToNextFloor() => GameState.Input(new GameState.Input.LoadNextFloor());
@@ -277,126 +277,126 @@ public partial class Game : Node3D, IGame
public void InitializeGame() public void InitializeGame()
{ {
Map.InitializeMapData(); Map.InitializeMapData();
Player.InitializePlayerState(); Player.InitializePlayerState();
} }
public void FloorExitReached() public void FloorExitReached()
{ {
GameState.Input(new GameState.Input.FloorExitEntered()); GameState.Input(new GameState.Input.FloorExitEntered());
} }
public async Task UseItem(InventoryItem item) public async Task UseItem(InventoryItem item)
{ {
if (item.ItemTag == ItemTag.MysteryItem) if (item.ItemTag == ItemTag.MysteryItem)
item = RerollItem(item); item = RerollItem(item);
switch (item) switch (item)
{ {
case ConsumableItem consumableItem: case ConsumableItem consumableItem:
EnactConsumableItemEffects(consumableItem); EnactConsumableItemEffects(consumableItem);
break; break;
case EffectItem effectItem: case EffectItem effectItem:
EnactEffectItemEffects(effectItem); EnactEffectItemEffects(effectItem);
break; break;
case ThrowableItem throwableItem: case ThrowableItem throwableItem:
EnactThrowableItemEffects(throwableItem); EnactThrowableItemEffects(throwableItem);
break; break;
} }
await ToSignal(GetTree().CreateTimer(0.3f), "timeout"); await ToSignal(GetTree().CreateTimer(0.3f), "timeout");
RemoveItemOrSubtractFromItemCount(item); RemoveItemOrSubtractFromItemCount(item);
} }
public void DropItem(InventoryItem item) public void DropItem(InventoryItem item)
{ {
var droppedScene = GD.Load<PackedScene>("res://src/items/dropped/DroppedItem.tscn"); var droppedScene = GD.Load<PackedScene>("res://src/items/dropped/DroppedItem.tscn");
var dropped = droppedScene.Instantiate<DroppedItem>(); var dropped = droppedScene.Instantiate<DroppedItem>();
dropped.Item = item; dropped.Item = item;
AddChild(dropped); AddChild(dropped);
dropped.Drop(); dropped.Drop();
} }
public void ThrowItem(InventoryItem item) public void ThrowItem(InventoryItem item)
{ {
var thrownScene = GD.Load<PackedScene>("res://src/items/thrown/ThrownItem.tscn"); var thrownScene = GD.Load<PackedScene>("res://src/items/thrown/ThrownItem.tscn");
var thrown = thrownScene.Instantiate<ThrownItem>(); var thrown = thrownScene.Instantiate<ThrownItem>();
thrown.ItemThatIsThrown = item; thrown.ItemThatIsThrown = item;
AddChild(thrown); AddChild(thrown);
thrown.Position += new Vector3(0, 1.5f, 0); thrown.Position += new Vector3(0, 1.5f, 0);
thrown.Throw(_effectService); thrown.Throw(_effectService);
} }
public IDungeonFloor CurrentFloor => Map.CurrentFloor; public IDungeonFloor CurrentFloor => Map.CurrentFloor;
public void EnemyDefeated(Vector3 defeatedLocation, EnemyStatResource resource) public void EnemyDefeated(Vector3 defeatedLocation, EnemyStatResource resource)
{ {
Player.GainExp(resource.ExpFromDefeat * GameRepo.ExpRate); Player.GainExp(resource.ExpFromDefeat * GameRepo.ExpRate);
DropRestorative(defeatedLocation); DropRestorative(defeatedLocation);
} }
public InventoryItem RerollItem(InventoryItem itemToReroll, bool insertIntoInventory = true) public InventoryItem RerollItem(InventoryItem itemToReroll, bool insertIntoInventory = true)
{ {
var itemDb = new ItemDatabase(); var itemDb = new ItemDatabase();
var currentIndex = Player.Inventory.Items.IndexOf(itemToReroll); var currentIndex = Player.Inventory.Items.IndexOf(itemToReroll);
if (insertIntoInventory) if (insertIntoInventory)
Player.Inventory.Remove(itemToReroll); Player.Inventory.Remove(itemToReroll);
InventoryItem rolledItem = null; InventoryItem rolledItem = null;
if (itemToReroll is Weapon weapon) if (itemToReroll is Weapon weapon)
rolledItem = itemDb.PickItem(weapon); rolledItem = itemDb.PickItem(weapon);
if (itemToReroll is Armor armor) if (itemToReroll is Armor armor)
rolledItem = itemDb.PickItem(armor); rolledItem = itemDb.PickItem(armor);
if (itemToReroll is Accessory accessory) if (itemToReroll is Accessory accessory)
rolledItem = itemDb.PickItem(accessory); rolledItem = itemDb.PickItem(accessory);
if (itemToReroll is ThrowableItem throwableItem) if (itemToReroll is ThrowableItem throwableItem)
rolledItem = itemDb.PickItem(throwableItem); rolledItem = itemDb.PickItem(throwableItem);
if (itemToReroll is EffectItem effectItem) if (itemToReroll is EffectItem effectItem)
rolledItem = itemDb.PickItem(effectItem); rolledItem = itemDb.PickItem(effectItem);
if (itemToReroll is ConsumableItem consumableItem) if (itemToReroll is ConsumableItem consumableItem)
rolledItem = itemDb.PickItem(consumableItem); rolledItem = itemDb.PickItem(consumableItem);
if (insertIntoInventory) if (insertIntoInventory)
Player.Inventory.TryInsert(rolledItem, currentIndex); Player.Inventory.TryInsert(rolledItem, currentIndex);
return rolledItem; return rolledItem;
} }
public void GameOver() public void GameOver()
{ {
GameState.Input(new GameState.Input.GameOver()); GameState.Input(new GameState.Input.GameOver());
} }
public override void _Input(InputEvent @event) public override void _Input(InputEvent @event)
{ {
if (@event.IsActionPressed(GameInputs.Debug)) if (@event.IsActionPressed(GameInputs.Debug))
GameState.Input(new GameState.Input.DebugButtonPressed()); GameState.Input(new GameState.Input.DebugButtonPressed());
} }
private void DropRestorative(Vector3 vector) private void DropRestorative(Vector3 vector)
{ {
var restorativeScene = GD.Load<PackedScene>("res://src/items/restorative/Restorative.tscn"); var restorativeScene = GD.Load<PackedScene>("res://src/items/restorative/Restorative.tscn");
var restorative = restorativeScene.Instantiate<Restorative>(); var restorative = restorativeScene.Instantiate<Restorative>();
AddChild(restorative); AddChild(restorative);
restorative.GlobalPosition = vector; restorative.GlobalPosition = vector;
} }
private void UseTeleportPrompt_CloseTeleportPrompt() private void UseTeleportPrompt_CloseTeleportPrompt()
{ {
GameState.Input(new GameState.Input.CloseTeleport()); GameState.Input(new GameState.Input.CloseTeleport());
InGameUI.UseTeleportPrompt.FadeOut(); InGameUI.UseTeleportPrompt.FadeOut();
GameRepo.Resume(); GameRepo.Resume();
} }
private void UseTeleportPrompt_TeleportToNextFloor() => GameState.Input(new GameState.Input.UseTeleport()); private void UseTeleportPrompt_TeleportToNextFloor() => GameState.Input(new GameState.Input.UseTeleport());
private void FloorClearMenu_TransitionCompleted() private void FloorClearMenu_TransitionCompleted()
{ {
GameRepo.Resume(); GameRepo.Resume();
} }
private void GameEventDepot_RestorativePickedUp(IHealthPack obj) => Player.Stats.SetCurrentVT(Player.Stats.CurrentVT.Value + (int)obj.RestoreAmount); private void GameEventDepot_RestorativePickedUp(IHealthPack obj) => Player.Stats.SetCurrentVT(Player.Stats.CurrentVT.Value + (int)obj.RestoreAmount);
@@ -409,118 +409,118 @@ public partial class Game : Node3D, IGame
private void EnactConsumableItemEffects(ConsumableItem consumableItem) private void EnactConsumableItemEffects(ConsumableItem consumableItem)
{ {
if (Player.Stats.CurrentHP == Player.Stats.MaximumHP && consumableItem.RaiseHPAmount > 0) if (Player.Stats.CurrentHP == Player.Stats.MaximumHP && consumableItem.RaiseHPAmount > 0)
Player.RaiseHP(consumableItem.RaiseHPAmount); Player.RaiseHP(consumableItem.RaiseHPAmount);
if (Player.Stats.CurrentVT == Player.Stats.MaximumVT && consumableItem.RaiseVTAmount > 0) if (Player.Stats.CurrentVT == Player.Stats.MaximumVT && consumableItem.RaiseVTAmount > 0)
Player.RaiseVT(consumableItem.RaiseVTAmount); Player.RaiseVT(consumableItem.RaiseVTAmount);
if (consumableItem.HealHPAmount > 0 && Player.Stats.CurrentHP != Player.Stats.MaximumHP) if (consumableItem.HealHPAmount > 0 && Player.Stats.CurrentHP != Player.Stats.MaximumHP)
Player.HealHP(consumableItem.HealHPAmount); Player.HealHP(consumableItem.HealHPAmount);
if (consumableItem.HealVTAmount > 0 && Player.Stats.CurrentVT != Player.Stats.MaximumVT) if (consumableItem.HealVTAmount > 0 && Player.Stats.CurrentVT != Player.Stats.MaximumVT)
Player.HealVT(consumableItem.HealVTAmount); Player.HealVT(consumableItem.HealVTAmount);
} }
private void EnactEffectItemEffects(EffectItem effectItem) private void EnactEffectItemEffects(EffectItem effectItem)
{ {
switch (effectItem.UsableItemTag) switch (effectItem.UsableItemTag)
{ {
case UsableItemTag.TeleportAllEnemiesToRoom: case UsableItemTag.TeleportAllEnemiesToRoom:
_effectService.TeleportEnemiesToCurrentRoom(); _effectService.TeleportEnemiesToCurrentRoom();
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case UsableItemTag.KillHalfEnemiesInRoom: case UsableItemTag.KillHalfEnemiesInRoom:
_effectService.KillHalfEnemiesInRoom(); _effectService.KillHalfEnemiesInRoom();
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case UsableItemTag.TurnAllEnemiesIntoHealingItem: case UsableItemTag.TurnAllEnemiesIntoHealingItem:
_effectService.TurnAllEnemiesInRoomIntoHealingItem(); _effectService.TurnAllEnemiesInRoomIntoHealingItem();
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case UsableItemTag.HealsAllInRoomToMaxHP: case UsableItemTag.HealsAllInRoomToMaxHP:
_effectService.HealAllEnemiesAndPlayerInRoomToFull(); _effectService.HealAllEnemiesAndPlayerInRoomToFull();
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case UsableItemTag.AbsorbHPFromAllEnemiesInRoom: case UsableItemTag.AbsorbHPFromAllEnemiesInRoom:
_effectService.AbsorbHPFromAllEnemiesInRoom(); _effectService.AbsorbHPFromAllEnemiesInRoom();
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case UsableItemTag.DealElementalDamageToAllEnemiesInRoom: case UsableItemTag.DealElementalDamageToAllEnemiesInRoom:
_effectService.DealElementalDamageToAllEnemiesInRoom(effectItem.Stats.ElementalDamageType); _effectService.DealElementalDamageToAllEnemiesInRoom(effectItem.Stats.ElementalDamageType);
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case UsableItemTag.SwapHPAndVT: case UsableItemTag.SwapHPAndVT:
_effectService.SwapHPandVT(); _effectService.SwapHPandVT();
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case UsableItemTag.RaiseCurrentWeaponAttack: case UsableItemTag.RaiseCurrentWeaponAttack:
_effectService.RaiseCurrentWeaponAttack(); _effectService.RaiseCurrentWeaponAttack();
break; break;
case UsableItemTag.RaiseCurrentDefenseArmor: case UsableItemTag.RaiseCurrentDefenseArmor:
_effectService.RaiseCurrentArmorDefense(); _effectService.RaiseCurrentArmorDefense();
break; break;
case UsableItemTag.RaiseLevel: case UsableItemTag.RaiseLevel:
_effectService.RaiseLevel(); _effectService.RaiseLevel();
break; break;
case UsableItemTag.RandomEffect: case UsableItemTag.RandomEffect:
_effectService.RandomEffect(effectItem); _effectService.RandomEffect(effectItem);
break; break;
} }
} }
private void EnactThrowableItemEffects(ThrowableItem throwableItem) private void EnactThrowableItemEffects(ThrowableItem throwableItem)
{ {
switch (throwableItem.ThrowableItemTag) switch (throwableItem.ThrowableItemTag)
{ {
case ThrowableItemTag.DoubleExp: case ThrowableItemTag.DoubleExp:
GameRepo.StartDoubleEXP(TimeSpan.FromSeconds(30)); GameRepo.StartDoubleEXP(TimeSpan.FromSeconds(30));
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case ThrowableItemTag.TeleportToRandomLocation: case ThrowableItemTag.TeleportToRandomLocation:
_effectService.TeleportToRandomRoom(Player); _effectService.TeleportToRandomRoom(Player);
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
case ThrowableItemTag.CanChangeAffinity: case ThrowableItemTag.CanChangeAffinity:
_effectService.ChangeAffinity(throwableItem); _effectService.ChangeAffinity(throwableItem);
break; break;
case ThrowableItemTag.WarpToExitIfFound: case ThrowableItemTag.WarpToExitIfFound:
_effectService.WarpToExit(Player); _effectService.WarpToExit(Player);
GameRepo.CloseInventory(); GameRepo.CloseInventory();
break; break;
} }
if (throwableItem.HealHPAmount > 0) if (throwableItem.HealHPAmount > 0)
Player.HealHP(throwableItem.HealHPAmount); Player.HealHP(throwableItem.HealHPAmount);
if (throwableItem.HealVTAmount > 0) if (throwableItem.HealVTAmount > 0)
Player.HealVT(throwableItem.HealVTAmount); Player.HealVT(throwableItem.HealVTAmount);
} }
private void RemoveItemOrSubtractFromItemCount(InventoryItem item) private void RemoveItemOrSubtractFromItemCount(InventoryItem item)
{ {
if (item is IStackable stackableItem && stackableItem.Count > 1) if (item is IStackable stackableItem && stackableItem.Count > 1)
stackableItem.SetCount(stackableItem.Count - 1); stackableItem.SetCount(stackableItem.Count - 1);
else else
GameRepo.RemoveItemFromInventory(item); GameRepo.RemoveItemFromInventory(item);
} }
private void OnNewGame() private void OnNewGame()
{ {
GameState.Input(new GameState.Input.NewGame()); GameState.Input(new GameState.Input.NewGame());
MainMenu.Hide(); MainMenu.Hide();
} }
private void OnContinueGame() private void OnContinueGame()
{ {
GameState.Input(new GameState.Input.ContinueGame()); GameState.Input(new GameState.Input.ContinueGame());
} }
private void OnLoadGame() private void OnLoadGame()
{ {
GameState.Input(new GameState.Input.LoadGame()); GameState.Input(new GameState.Input.LoadGame());
MainMenu.Hide(); MainMenu.Hide();
} }
private void OnQuit() private void OnQuit()
{ {
MainMenu.Hide(); MainMenu.Hide();
} }
} }

View File

@@ -106,6 +106,7 @@ stretch = true
[node name="SubViewport" type="SubViewport" parent="SubViewportContainer"] [node name="SubViewport" type="SubViewport" parent="SubViewportContainer"]
handle_input_locally = false handle_input_locally = false
audio_listener_enable_3d = true
size = Vector2i(1440, 1080) size = Vector2i(1440, 1080)
render_target_update_mode = 4 render_target_update_mode = 4

View File

@@ -4885,22 +4885,22 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -240.071, 36.4279, 34.624)
visible = false visible = false
shape = SubResource("BoxShape3D_pkvyy") shape = SubResource("BoxShape3D_pkvyy")
[node name="Horse Head Statue" parent="Room" instance=ExtResource("24_r1rk5")] [node name="HorseHeadStatue" parent="Room" instance=ExtResource("24_r1rk5")]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -102.157, -2.30863, 13.0139) transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -102.157, -2.30863, 13.0139)
[node name="Horse Head Active" parent="Room" instance=ExtResource("25_a482y")] [node name="HorseFace" parent="Room" instance=ExtResource("25_a482y")]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(-6.55671e-09, 0, -0.15, 0, 0.15, 0, 0.15, 0, -6.55671e-09, -102.157, -0.510939, 13.0139) transform = Transform3D(-6.55671e-09, 0, -0.15, 0, 0.15, 0, 0.15, 0, -6.55671e-09, -102.157, -0.510939, 13.0139)
visible = false visible = false
PrimaryAttackElementalType = 0 PrimaryAttackElementalType = 0
PrimaryAttackElementalDamageBonus = 1.0 PrimaryAttackElementalDamageBonus = 1.0
[node name="Ox Face Statue" parent="Room" instance=ExtResource("26_futcf")] [node name="OxFaceStatue" parent="Room" instance=ExtResource("26_futcf")]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -101.555, -2.30863, 21.5833) transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -101.555, -2.30863, 21.5833)
[node name="OxFace Active" parent="Room" instance=ExtResource("27_g6y6v")] [node name="OxFace" parent="Room" instance=ExtResource("27_g6y6v")]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(-6.55671e-09, 0, -0.15, 0, 0.15, 0, 0.15, 0, -6.55671e-09, -101.703, -0.479859, 22.0955) transform = Transform3D(-6.55671e-09, 0, -0.15, 0, 0.15, 0, 0.15, 0, -6.55671e-09, -101.703, -0.479859, 22.0955)
visible = false visible = false

View File

@@ -8119,6 +8119,7 @@ root_node = NodePath("Overworld_CLOUD_RINGS_INNER")
libraries = { libraries = {
&"": SubResource("AnimationLibrary_q2pi3") &"": SubResource("AnimationLibrary_q2pi3")
} }
autoplay = "Cloud Rotation 1"
[node name="Overworld_CLOUD_RINGS_INNER" type="Node3D" parent="Model/AnimationPlayer"] [node name="Overworld_CLOUD_RINGS_INNER" type="Node3D" parent="Model/AnimationPlayer"]
transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 485.326, 0) transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 485.326, 0)
@@ -8608,6 +8609,7 @@ volume_db = 5.275
unit_size = 10.55 unit_size = 10.55
max_db = -3.264 max_db = -3.264
autoplay = true autoplay = true
stream_paused = true
max_distance = 100.0 max_distance = 100.0
bus = &"AMBIENT" bus = &"AMBIENT"