Make altar spawn behavior consistent with dungeon floors

Add missing audio/vfx/hitboxes to other directional attacks for most enemies
Play hit sound and pause slightly before playing death animation
This commit is contained in:
2026-06-17 01:13:23 -07:00
parent 9decb2a02d
commit 138b4538e1
17 changed files with 1230 additions and 307 deletions
@@ -1,6 +1,7 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using System.Drawing;
using System.Linq;
using Zennysoft.Ma.Adapter;
@@ -38,24 +39,52 @@ public partial class Altar : SpecialFloor
{
if (ItemSpawnPoints == null)
return;
var color = string.Empty;
var itemSpawnPoints = ItemSpawnPoints.GetChildren();
var rng = new RandomNumberGenerator();
rng.Randomize();
var database = ItemDatabase.Instance;
var spawnableItems = ItemDatabase.Instance.Items.Where(x => (x.SpawnsOn as FloorSpawnTable).SpawnsOnFloor(FloorType.Altar)).ToArray();
var numberOfItemsToSpawn = rng.RandiRange(2, itemSpawnPoints.Count);
itemSpawnPoints.Shuffle();
var database = ItemDatabase.Instance;
var spawnableItems = database.Items.Where(x => (x.SpawnsOn as FloorSpawnTable).SpawnsOnFloor(FloorType.Altar)).ToArray();
foreach (var spawnPoint in itemSpawnPoints.Cast<Marker3D>())
var spawnPoints = itemSpawnPoints.Cast<Marker3D>().ToList();
foreach (var spawnPoint in spawnPoints)
{
if (numberOfItemsToSpawn <= 0)
break;
numberOfItemsToSpawn--;
var rarity = RarityTag.Common;
var rarityGroup = rng.Randf();
if (rarityGroup < 0.5f)
{
rarity = RarityTag.Common;
color = "white";
}
else if (rarityGroup < 0.85f)
{
rarity = RarityTag.Uncommon;
color = "green";
}
else if (rarityGroup < 0.99f)
{
rarity = RarityTag.Rare;
color = "cyan";
}
else
{
rarity = RarityTag.Legendary;
color = "gold";
}
spawnableItems = [.. spawnableItems.Where(x => x.RarityTag == rarity)];
if (spawnableItems.Length == 0)
break;
var selectedItem = database.PickItemFromList(spawnableItems) as Node3D;
var duplicated = selectedItem.Duplicate((int)DuplicateFlags.UseInstantiation) as Node3D;
AddChild(duplicated);
duplicated.Position = new Vector3(spawnPoint.Position.X, 0, spawnPoint.Position.Z);
GD.PrintRich($"Item spawned: [b]{(selectedItem as IBaseInventoryItem).ItemName}[/b] at {duplicated.GlobalPosition}. Rolled a {rarityGroup} for a [color={color}]{rarity}");
}
}