diff --git a/README.md b/README.md index a25d708..bc84772 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # oneheim -A detailled roguelike in console. +A detailed roguelike in console. Explore the region : diff --git a/Roguelike.Core.Tests/Game/Collectables/TreasureSelectorTests.cs b/Roguelike.Core.Tests/Game/Collectables/TreasureSelectorTests.cs index dbf8691..9eb4b59 100644 --- a/Roguelike.Core.Tests/Game/Collectables/TreasureSelectorTests.cs +++ b/Roguelike.Core.Tests/Game/Collectables/TreasureSelectorTests.cs @@ -1,7 +1,12 @@ -using Roguelike.Core.Configuration; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Roguelike.Core.Configuration; +using Roguelike.Core.Game.Characters.Enemies; using Roguelike.Core.Game.Characters.Players; using Roguelike.Core.Game.Collectables; using Roguelike.Core.Game.Collectables.Items; +using Roguelike.Core.Game.Levels; using Roguelike.Core.Tests.Fakes; namespace Roguelike.Core.Tests.Game.Collectables; @@ -104,11 +109,62 @@ public void GenerateBonusChoices_AddsDominantStatFocus_AndRespectsFilters() Assert.IsTrue(choices.Count <= 3); hasStrength = choices.Any(t => t.Type == BonusType.Strength); } - + Assert.IsTrue(hasStrength, "Dominant Strength should lead to a Strength-focused bonus being added."); } + [TestMethod] + public void EnsureItemPoolInitialization_ExcludesEnemySpecificItems() + { + var forcedEnemyTypes = new[] { EnemyType.Undead, EnemyType.Wild, EnemyType.Outlaws, EnemyType.Cultist }; + var originalEnemyTypes = LevelManager.EnemyTypes.ToList(); + + var poolField = typeof(TreasureSelector).GetField("_selectedItemPool", BindingFlags.Static | BindingFlags.NonPublic); + Assert.IsNotNull(poolField, "Expected TreasureSelector to expose _selectedItemPool field."); + + var originalPoolReference = (List)poolField!.GetValue(null)!; + var originalPoolSnapshot = originalPoolReference.ToList(); + + var ensureMethod = typeof(TreasureSelector).GetMethod("EnsureItemPoolInitialized", BindingFlags.Static | BindingFlags.NonPublic); + Assert.IsNotNull(ensureMethod, "EnsureItemPoolInitialized should exist."); + + try + { + LevelManager.EnemyTypes.Clear(); + LevelManager.EnemyTypes.AddRange(forcedEnemyTypes); + + var excludedItems = forcedEnemyTypes + .SelectMany(ItemIdHelper.GetItemIdsSpecificByEnemyType) + .ToHashSet(); + + Assert.IsTrue(excludedItems.Count > 0, "Test setup should exclude at least one item."); + + for (int attempt = 0; attempt < 5; attempt++) + { + poolField.SetValue(null, new List()); + ensureMethod!.Invoke(null, null); + + var currentPool = (List)poolField.GetValue(null)!; + var forbidden = currentPool.Where(excludedItems.Contains).ToList(); + + Assert.IsTrue(currentPool.Count > 0, "Item pool should contain entries after initialization."); + Assert.AreEqual(0, forbidden.Count, + $"Item pool should exclude enemy-specific items. Found forbidden: {string.Join(", ", forbidden)}"); + } + } + finally + { + LevelManager.EnemyTypes.Clear(); + LevelManager.EnemyTypes.AddRange(originalEnemyTypes); + + originalPoolReference.Clear(); + originalPoolReference.AddRange(originalPoolSnapshot); + poolField.SetValue(null, originalPoolReference); + } + } + + [TestMethod] public void ChooseWithPicker_OutOfRangeIndex_FallsBackToZero_AndReturnsAChoice() { diff --git a/Roguelike.Core/Game/Characters/NPCs/Services/ArminService.cs b/Roguelike.Core/Game/Characters/NPCs/Services/ArminService.cs index 2ab05f4..fdd50d1 100644 --- a/Roguelike.Core/Game/Characters/NPCs/Services/ArminService.cs +++ b/Roguelike.Core/Game/Characters/NPCs/Services/ArminService.cs @@ -158,7 +158,7 @@ public string PickOther() { Messages.ArminJustTalking1, Messages.ArminJustTalking2, - // TODO: will ad more later + // TODO: will add more later }; var rand = new Random(); int idx = rand.Next(sayings.Length); diff --git a/Roguelike.Core/Game/Collectables/TreasureSelector.cs b/Roguelike.Core/Game/Collectables/TreasureSelector.cs index 7587fa5..1a0da42 100644 --- a/Roguelike.Core/Game/Collectables/TreasureSelector.cs +++ b/Roguelike.Core/Game/Collectables/TreasureSelector.cs @@ -219,7 +219,12 @@ private static void EnsureItemPoolInitialized() excludedItems.AddRange(ItemIdHelper.GetItemIdsSpecificByEnemyType(enemyType)); var filteredItems = all.Except(excludedItems).ToList(); - _selectedItemPool = all.OrderBy(_ => _random.Next()).Take(_numberOfItemInPool).ToList(); + var sourcePool = filteredItems.Count > 0 ? filteredItems : all; + + _selectedItemPool = sourcePool + .OrderBy(_ => _random.Next()) + .Take(_numberOfItemInPool) + .ToList(); } }