From 138b4538e1e71f9f96be94c1c54a878d89b15caf Mon Sep 17 00:00:00 2001 From: Zenny Date: Wed, 17 Jun 2026 01:13:23 -0700 Subject: [PATCH] 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 --- Zennysoft.Game.Ma/src/enemy/Enemy.cs | 3 + .../enemy/behaviors/EngagePlayerBehavior.cs | 4 +- .../01. sproingy/SproingyModelView.tscn | 53 +++- .../02. michael/MichaelModelView.tscn | 8 +- .../03. filth_eater/FilthEaterModelView.tscn | 8 +- .../enemy_types/04. sara/SaraModelView.tscn | 16 +- .../05. ballos/BallosModelView.tscn | 194 ++++++++++- .../06. Planter/PlanterModelView.tscn | 8 +- .../07. chinthe/ChintheModelView.tscn | 22 +- .../08a. Ambassador/AmbassadorModelView.tscn | 72 +++++ .../AmbassadorSmallModelView.tscn | 137 +++++++- .../09. Agni/AgniDemonModelView.tscn | 178 ++++++++++- .../enemy_types/11. Palan/PalanModelView.tscn | 125 +++++++- .../12. Shield of Heaven/ShieldModelView.tscn | 300 ++++++++++++------ .../GoldSproingyModelView.tscn | 170 +--------- .../9b. Aqueos Demon/AqueosModelView.tscn | 202 +++++++++++- .../src/map/dungeon/code/Altar.cs | 37 ++- 17 files changed, 1230 insertions(+), 307 deletions(-) diff --git a/Zennysoft.Game.Ma/src/enemy/Enemy.cs b/Zennysoft.Game.Ma/src/enemy/Enemy.cs index dd0d9b8b..332c5c1b 100644 --- a/Zennysoft.Game.Ma/src/enemy/Enemy.cs +++ b/Zennysoft.Game.Ma/src/enemy/Enemy.cs @@ -191,6 +191,9 @@ public abstract partial class Enemy : CharacterBody3D, IEnemy, IProvide (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()) + var spawnPoints = itemSpawnPoints.Cast().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}"); } }