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:
@@ -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}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user