Revamp item spawn behavior

This commit is contained in:
2026-06-12 18:09:52 -07:00
parent 403b136c5c
commit 8575cd6ddf
154 changed files with 4769 additions and 352 deletions
+29 -28
View File
@@ -27,53 +27,54 @@ public partial class Altar : SpecialFloor
public void OnResolved()
{
Show();
Exit.AreaEntered += Exit_AreaEntered;
NoExitArea.AreaEntered += NoExitArea_AreaEntered;
FloorIsLoaded = true;
SpawnItems();
Show();
Exit.AreaEntered += Exit_AreaEntered;
NoExitArea.AreaEntered += NoExitArea_AreaEntered;
FloorIsLoaded = true;
SpawnItems();
}
private void SpawnItems()
{
if (ItemSpawnPoints == null)
return;
if (ItemSpawnPoints == null)
return;
var itemSpawnPoints = ItemSpawnPoints.GetChildren();
var rng = new RandomNumberGenerator();
rng.Randomize();
var numberOfItemsToSpawn = rng.RandiRange(2, itemSpawnPoints.Count);
itemSpawnPoints.Shuffle();
var database = ItemDatabase.Instance;
foreach (var spawnPoint in itemSpawnPoints.Cast<Marker3D>())
{
if (numberOfItemsToSpawn <= 0)
break;
numberOfItemsToSpawn--;
var itemSpawnPoints = ItemSpawnPoints.GetChildren();
var rng = new RandomNumberGenerator();
rng.Randomize();
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>())
{
if (numberOfItemsToSpawn <= 0)
break;
numberOfItemsToSpawn--;
var selectedItem = database.PickBasicItem<IBaseInventoryItem>() as Node3D;
var duplicated = selectedItem.Duplicate((int)DuplicateFlags.UseInstantiation) as Node3D;
AddChild(duplicated);
duplicated.Position = new Vector3(spawnPoint.Position.X, 0, spawnPoint.Position.Z);
}
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);
}
}
private void NoExitArea_AreaEntered(Area3D area)
{
DialogueController.ShowDialogue(Dialogue, "no_exit");
DialogueController.ShowDialogue(Dialogue, "no_exit");
}
private void Exit_AreaEntered(Area3D area)
{
if (area.GetOwner() is IPlayer)
ExitReached();
if (area.GetOwner() is IPlayer)
ExitReached();
}
public void ExitReached() => Game.FloorExitReached();
public void OnExitTree()
{
Exit.AreaEntered -= Exit_AreaEntered;
NoExitArea.AreaEntered -= NoExitArea_AreaEntered;
Exit.AreaEntered -= Exit_AreaEntered;
NoExitArea.AreaEntered -= NoExitArea_AreaEntered;
}
}
@@ -3,6 +3,7 @@ using Chickensoft.Introspection;
using Godot;
using Godot.Collections;
using System.Linq;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma;
@@ -11,17 +12,14 @@ public partial class MonsterRoom : DungeonRoom
{
public override void _Notification(int what) => this.Notify(what);
[Dependency] private IMap _map => this.DependOn<IMap>();
[Node] public Node3D ItemSpawnPoints { get; set; } = default!;
[Node] public Node3D EnemySpawnPoints { get; set; } = default!;
[Node] public Marker3D PlayerSpawn { get; set; } = default!;
public override void _Ready()
{
SpawnItems();
}
public void SpawnEnemies(Array<EnemySpawnRate> spawnTable)
{
if (spawnTable.Count == 0)
@@ -47,7 +45,7 @@ public partial class MonsterRoom : DungeonRoom
}
}
private void SpawnItems()
public void SpawnItems(FloorType floorType)
{
if (ItemSpawnPoints == null)
return;
@@ -55,16 +53,32 @@ public partial class MonsterRoom : DungeonRoom
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)).ToArray();
var numberOfItemsToSpawn = rng.RandiRange(1, itemSpawnPoints.Count);
itemSpawnPoints.Shuffle();
var database = ItemDatabase.Instance;
foreach (var spawnPoint in itemSpawnPoints.Cast<Marker3D>())
var spawnPoints = itemSpawnPoints.Cast<Marker3D>().ToList();
foreach (var spawnPoint in spawnPoints)
{
if (numberOfItemsToSpawn <= 0)
break;
numberOfItemsToSpawn--;
var selectedItem = database.PickItem<IBaseInventoryItem>() as Node3D;
var rarity = RarityTag.Common;
var rarityGroup = rng.Randf();
if (rarityGroup < 0.5f)
rarity = RarityTag.Common;
else if (rarityGroup < 0.85f)
rarity = RarityTag.Uncommon;
else if (rarityGroup < 0.99f)
rarity = RarityTag.Rare;
else
rarity = RarityTag.Legendary;
spawnableItems = [.. spawnableItems.Where(x => x.RarityTag == rarity)];
if (spawnableItems.Count() == 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);
@@ -1,5 +1,6 @@
using Godot;
using Godot.Collections;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma;