Revamp item spawn behavior
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user