diff --git a/DnDGen.TreasureGen.Tests.Integration/Generators/Items/ItemPowerTestData.cs b/DnDGen.TreasureGen.Tests.Integration/Generators/Items/ItemPowerTestData.cs index a5d62844..5df3482f 100644 --- a/DnDGen.TreasureGen.Tests.Integration/Generators/Items/ItemPowerTestData.cs +++ b/DnDGen.TreasureGen.Tests.Integration/Generators/Items/ItemPowerTestData.cs @@ -31,6 +31,22 @@ public static IEnumerable Armors } } + public static IEnumerable SpecificArmors + { + get + { + var armors = ArmorConstants.GetAllSpecificArmorsAndShields(); + + foreach (var armor in armors) + { + foreach (var power in powers) + { + yield return new TestCaseData(armor, power); + } + } + } + } + public static IEnumerable Potions { get @@ -111,6 +127,22 @@ public static IEnumerable Weapons } } + public static IEnumerable SpecificWeapons + { + get + { + var weapons = WeaponConstants.GetAllSpecific(); + + foreach (var weapon in weapons) + { + foreach (var power in powers) + { + yield return new TestCaseData(weapon, power); + } + } + } + } + public static IEnumerable WondrousItems { get diff --git a/DnDGen.TreasureGen.Tests.Integration/Generators/Items/Magical/MagicalArmorGeneratorTests.cs b/DnDGen.TreasureGen.Tests.Integration/Generators/Items/Magical/MagicalArmorGeneratorTests.cs index 09b13b9e..ab686233 100644 --- a/DnDGen.TreasureGen.Tests.Integration/Generators/Items/Magical/MagicalArmorGeneratorTests.cs +++ b/DnDGen.TreasureGen.Tests.Integration/Generators/Items/Magical/MagicalArmorGeneratorTests.cs @@ -53,6 +53,7 @@ public void GenerateArmorOfSize(string itemName, string power, string size) var item = ArmorGenerator.Generate(power, itemName, "my trait", size); itemVerifier.AssertItem(item); Assert.That(item, Is.InstanceOf()); + Assert.That(item.Quantity, Is.EqualTo(1)); var armor = item as Armor; Assert.That(armor.ItemType, Is.EqualTo(ItemTypeConstants.Armor), $"{armor.Name} {armor.Magic.Curse}"); @@ -88,6 +89,7 @@ public void GenerateShieldOfSize(string itemName, string power, string size) var item = ArmorGenerator.Generate(power, itemName, "my trait", size); itemVerifier.AssertItem(item); Assert.That(item, Is.InstanceOf()); + Assert.That(item.Quantity, Is.EqualTo(1)); var armor = item as Armor; Assert.That(armor.ItemType, Is.EqualTo(ItemTypeConstants.Armor), $"{armor.Name} {armor.Magic.Curse}"); @@ -109,5 +111,14 @@ public void BUG_DragonhideCastersShieldRemovesWoodAndMetalAsAttributes(string po Assert.That(shield.Attributes, Does.Not.Contain(AttributeConstants.Wood) .And.Not.Contain(AttributeConstants.Metal)); } + + [TestCaseSource(typeof(ItemPowerTestData), nameof(ItemPowerTestData.SpecificArmors))] + public void BUG_GenerateArmor_SpecificArmorHasQuantity(string itemName, string power) + { + var item = ArmorGenerator.Generate(power, itemName); + itemVerifier.AssertItem(item); + Assert.That(item, Is.InstanceOf(), item.Name); + Assert.That(item.Quantity, Is.EqualTo(1), item.Name); + } } } diff --git a/DnDGen.TreasureGen.Tests.Integration/Generators/Items/Magical/MagicalWeaponGeneratorTests.cs b/DnDGen.TreasureGen.Tests.Integration/Generators/Items/Magical/MagicalWeaponGeneratorTests.cs index 395ede4e..58027788 100644 --- a/DnDGen.TreasureGen.Tests.Integration/Generators/Items/Magical/MagicalWeaponGeneratorTests.cs +++ b/DnDGen.TreasureGen.Tests.Integration/Generators/Items/Magical/MagicalWeaponGeneratorTests.cs @@ -185,5 +185,14 @@ public void GenerateSpecificMagicalWeaponWithExtraDamage(string weaponName) Assert.That(weapon.Damages, Has.Count.GreaterThan(1), weapon.DamageDescription); Assert.That(weapon.CriticalDamages, Has.Count.GreaterThan(1), weapon.CriticalDamageDescription); } + + [TestCaseSource(typeof(ItemPowerTestData), nameof(ItemPowerTestData.SpecificWeapons))] + public void BUG_GenerateWeapon_SpecificWeaponHasQuantity(string itemName, string power) + { + var item = WeaponGenerator.Generate(power, itemName); + itemVerifier.AssertItem(item); + Assert.That(item, Is.InstanceOf(), item.Name); + Assert.That(item.Quantity, Is.AtLeast(1), item.Name); + } } } diff --git a/DnDGen.TreasureGen.Tests.Unit/Generators/Items/ItemVerifier.cs b/DnDGen.TreasureGen.Tests.Unit/Generators/Items/ItemVerifier.cs index bc4b5265..91517b08 100644 --- a/DnDGen.TreasureGen.Tests.Unit/Generators/Items/ItemVerifier.cs +++ b/DnDGen.TreasureGen.Tests.Unit/Generators/Items/ItemVerifier.cs @@ -20,6 +20,7 @@ public ItemVerifier() public void AssertItem(Item item) { Assert.That(item.Name, Is.Not.Empty); + Assert.That(item.Quantity, Is.Positive, item.Description); Assert.That(item.ItemType, Is.Not.Empty, $"{item.Description} item type"); Assert.That(item.BaseNames, Is.Not.Empty, item.Description); Assert.That(item.BaseNames, Is.All.Not.Empty, item.Description); diff --git a/DnDGen.TreasureGen.Tests.Unit/Generators/Items/Magical/MagicalWeaponGeneratorTests.cs b/DnDGen.TreasureGen.Tests.Unit/Generators/Items/Magical/MagicalWeaponGeneratorTests.cs index 4b1703af..76180fed 100644 --- a/DnDGen.TreasureGen.Tests.Unit/Generators/Items/Magical/MagicalWeaponGeneratorTests.cs +++ b/DnDGen.TreasureGen.Tests.Unit/Generators/Items/Magical/MagicalWeaponGeneratorTests.cs @@ -65,6 +65,7 @@ public void Setup() mundaneWeapon.CriticalDamages.Add(new Damage { Roll = "hurty mcSUPERhurtface", Type = "spiritual" }); mundaneWeapon.Size = "enormous"; mundaneWeapon.ThreatRange = 96; + mockMundaneWeaponGenerator.Setup(g => g.Generate(It.IsAny())).Returns(new Weapon()); mockMundaneWeaponGenerator.Setup(g => g.Generate(It.IsAny(), It.IsAny())).Returns(new Weapon()); mockMundaneWeaponGenerator.Setup(g => g.Generate(It.Is(i => i.NameMatches("weapon name")), true)).Returns(mundaneWeapon); @@ -184,6 +185,7 @@ public void GetSpecificWeaponFromGenerator() var specificWeapon = new Weapon(); specificWeapon.Name = Guid.NewGuid().ToString(); + specificWeapon.BaseNames = new[] { "base name 1", "base name 2" }; mockSpecificGearGenerator.Setup(g => g.CanBeSpecific(power, ItemTypeConstants.Weapon, "weapon name")).Returns(true); mockSpecificGearGenerator.Setup(g => g.GenerateNameFrom(power, ItemTypeConstants.Weapon, "weapon name")).Returns(specificWeapon.Name); @@ -191,10 +193,38 @@ public void GetSpecificWeaponFromGenerator() mockSpecificGearGenerator.Setup(g => g.IsSpecific(It.Is(i => i.Name == specificWeapon.Name))).Returns(true); mockSpecificGearGenerator.Setup(g => g.GenerateFrom(It.Is(i => i.Name == specificWeapon.Name))).Returns(specificWeapon); + mockMundaneWeaponGenerator.Setup(g => g.Generate("base name 1")).Returns(mundaneWeapon); + var weapon = magicalWeaponGenerator.GenerateRandom(power); Assert.That(weapon, Is.EqualTo(specificWeapon)); } + [Test] + public void BUG_GetSpecificWeaponFromGenerator_HasQuantity() + { + var tableName = string.Format(TableNameConstants.Percentiles.Formattable.POWERITEMTYPEs, power, ItemTypeConstants.Weapon); + mockPercentileSelector.Setup(s => s.SelectFrom(tableName)).Returns(ItemTypeConstants.Weapon); + + var specificWeapon = new Weapon(); + specificWeapon.Name = Guid.NewGuid().ToString(); + specificWeapon.BaseNames = new[] { "base name 1", "base name 2" }; + + mockSpecificGearGenerator.Setup(g => g.CanBeSpecific(power, ItemTypeConstants.Weapon, "weapon name")).Returns(true); + mockSpecificGearGenerator.Setup(g => g.GenerateNameFrom(power, ItemTypeConstants.Weapon, "weapon name")).Returns(specificWeapon.Name); + mockSpecificGearGenerator.Setup(g => g.GeneratePrototypeFrom(power, ItemTypeConstants.Weapon, specificWeapon.Name)).Returns(specificWeapon); + mockSpecificGearGenerator.Setup(g => g.IsSpecific(It.Is(i => i.Name == specificWeapon.Name))).Returns(true); + mockSpecificGearGenerator.Setup(g => g.GenerateFrom(It.Is(i => i.Name == specificWeapon.Name))).Returns(specificWeapon); + + var weaponForQuantity = new Weapon(); + weaponForQuantity.Name = "base name 1"; + weaponForQuantity.Quantity = 1336; + mockMundaneWeaponGenerator.Setup(g => g.Generate("base name 1")).Returns(weaponForQuantity); + + var weapon = magicalWeaponGenerator.GenerateRandom(power); + Assert.That(weapon, Is.EqualTo(specificWeapon)); + Assert.That(weapon.Quantity, Is.EqualTo(1336)); + } + [Test] public void GetSpecialAbilitiesFromGenerator() { @@ -1148,6 +1178,9 @@ public void GenerateSpecificCustomWeapon() mockSpecificGearGenerator.Setup(g => g.GenerateFrom(It.Is(i => i.Name == name))).Returns(specificWeapon); mockSpecificGearGenerator.Setup(g => g.IsSpecific(It.Is(i => i.Name == name))).Returns(true); + specificWeapon.BaseNames = new[] { "base name 1", "base name 2" }; + mockMundaneWeaponGenerator.Setup(g => g.Generate("base name 1")).Returns(mundaneWeapon); + var weapon = magicalWeaponGenerator.Generate(template, true); Assert.That(weapon.Name, Is.EqualTo(specificWeapon.Name)); Assert.That(weapon.BaseNames, Is.EquivalentTo(specificWeapon.BaseNames)); @@ -1173,6 +1206,9 @@ public void GenerateSpecificCustomWeapon_WithSetAbilities() var wrongAbilities = template.Magic.SpecialAbilities.Union(specificWeapon.Magic.SpecialAbilities).ToArray(); mockSpecialAbilitiesGenerator.Setup(g => g.GenerateFor(template.Magic.SpecialAbilities)).Returns(wrongAbilities); + specificWeapon.BaseNames = new[] { "base name 1", "base name 2" }; + mockMundaneWeaponGenerator.Setup(g => g.Generate("base name 1")).Returns(mundaneWeapon); + var weapon = magicalWeaponGenerator.Generate(template, true); Assert.That(weapon.Name, Is.EqualTo(specificWeapon.Name)); Assert.That(weapon.BaseNames, Is.EquivalentTo(specificWeapon.BaseNames)); @@ -1200,6 +1236,9 @@ public void GenerateSpecificCustomWeapon_WithSetAbilities_WhenGeneratedNameIsNot var wrongAbilities = template.Magic.SpecialAbilities.Union(specificWeapon.Magic.SpecialAbilities).ToArray(); mockSpecialAbilitiesGenerator.Setup(g => g.GenerateFor(template.Magic.SpecialAbilities)).Returns(wrongAbilities); + specificWeapon.BaseNames = new[] { "base name 1", "base name 2" }; + mockMundaneWeaponGenerator.Setup(g => g.Generate("base name 1")).Returns(mundaneWeapon); + var weapon = magicalWeaponGenerator.Generate(template, true); Assert.That(weapon.Name, Is.EqualTo(specificWeapon.Name)); Assert.That(weapon.BaseNames, Is.EquivalentTo(specificWeapon.BaseNames)); @@ -1209,6 +1248,35 @@ public void GenerateSpecificCustomWeapon_WithSetAbilities_WhenGeneratedNameIsNot Assert.That(weapon.Attributes, Is.EquivalentTo(specificWeapon.Attributes)); } + [Test] + public void BUG_GenerateSpecificCustomWeapon_WithQuantity() + { + var name = Guid.NewGuid().ToString(); + var template = itemVerifier.CreateRandomTemplate(name); + + var specificWeapon = itemVerifier.CreateRandomWeaponTemplate(name); + specificWeapon.ItemType = ItemTypeConstants.Weapon; + specificWeapon.Magic.SpecialAbilities = new[] { new SpecialAbility(), new SpecialAbility() }; + specificWeapon.Attributes = new[] { "type 1", AttributeConstants.Specific, "type 2" }; + specificWeapon.BaseNames = new[] { "base name 1", "base name 2" }; + + mockSpecificGearGenerator.Setup(g => g.GenerateFrom(It.Is(i => i.Name == name))).Returns(specificWeapon); + mockSpecificGearGenerator.Setup(g => g.IsSpecific(It.Is(i => i.Name == name))).Returns(true); + + var weaponForQuantity = new Weapon(); + weaponForQuantity.Name = "base name 1"; + weaponForQuantity.Quantity = 1336; + mockMundaneWeaponGenerator.Setup(g => g.Generate("base name 1")).Returns(weaponForQuantity); + + var weapon = magicalWeaponGenerator.Generate(template, true); + Assert.That(weapon.Name, Is.EqualTo(specificWeapon.Name)); + Assert.That(weapon.BaseNames, Is.EquivalentTo(specificWeapon.BaseNames)); + Assert.That(weapon.Quantity, Is.EqualTo(specificWeapon.Quantity)); + Assert.That(weapon.Magic.SpecialAbilities, Is.EquivalentTo(specificWeapon.Magic.SpecialAbilities)); + Assert.That(weapon.Attributes, Is.EquivalentTo(specificWeapon.Attributes)); + Assert.That(weapon.Quantity, Is.EqualTo(1336)); + } + [Test] public void GenerateFromName() { @@ -1284,6 +1352,8 @@ public void GenerateSpecificFromName() mockSpecificGearGenerator.Setup(g => g.GeneratePrototypeFrom(power, ItemTypeConstants.Weapon, "specific weapon name")).Returns(specificWeapon); mockSpecificGearGenerator.Setup(g => g.GenerateFrom(It.Is(i => i.Name == "specific weapon name"))).Returns(specificWeapon); + mockMundaneWeaponGenerator.Setup(g => g.Generate("base name")).Returns(mundaneWeapon); + var weapon = magicalWeaponGenerator.Generate(power, "specific weapon name"); Assert.That(weapon.Name, Is.EqualTo("specific weapon name")); Assert.That(weapon, Is.EqualTo(specificWeapon)); @@ -1305,11 +1375,39 @@ public void GenerateSpecificFromName_WithTraits() .Returns(specificWeapon); mockSpecificGearGenerator.Setup(g => g.GenerateFrom(It.Is(i => i.Name == "specific weapon name"))).Returns(specificWeapon); + mockMundaneWeaponGenerator.Setup(g => g.Generate("base name")).Returns(mundaneWeapon); + var weapon = magicalWeaponGenerator.Generate(power, "specific weapon name", "trait 1", "trait 2"); Assert.That(weapon.Name, Is.EqualTo("specific weapon name")); Assert.That(weapon, Is.EqualTo(specificWeapon)); } + [Test] + public void BUG_GenerateSpecificFromName_WithQuantity() + { + var tableName = string.Format(TableNameConstants.Percentiles.Formattable.POWERITEMTYPEs, power, ItemTypeConstants.Weapon); + mockPercentileSelector.SetupSequence(p => p.SelectFrom(tableName)).Returns("SpecialAbility").Returns("SpecialAbility").Returns(ItemTypeConstants.Weapon); + + var specificWeapon = new Weapon(); + specificWeapon.Name = "specific weapon name"; + specificWeapon.BaseNames = new[] { "base name", "other specific base name" }; + + mockSpecificGearGenerator.Setup(g => g.IsSpecific(ItemTypeConstants.Weapon, "specific weapon name")).Returns(true); + mockSpecificGearGenerator.Setup(g => g.IsSpecific(It.Is(i => i.Name == "specific weapon name"))).Returns(true); + mockSpecificGearGenerator.Setup(g => g.GeneratePrototypeFrom(power, ItemTypeConstants.Weapon, "specific weapon name")).Returns(specificWeapon); + mockSpecificGearGenerator.Setup(g => g.GenerateFrom(It.Is(i => i.Name == "specific weapon name"))).Returns(specificWeapon); + + var weaponForQuantity = new Weapon(); + weaponForQuantity.Name = "base name"; + weaponForQuantity.Quantity = 1336; + mockMundaneWeaponGenerator.Setup(g => g.Generate("base name")).Returns(weaponForQuantity); + + var weapon = magicalWeaponGenerator.Generate(power, "specific weapon name"); + Assert.That(weapon.Name, Is.EqualTo("specific weapon name")); + Assert.That(weapon, Is.EqualTo(specificWeapon)); + Assert.That(weapon.Quantity, Is.EqualTo(1336)); + } + [Test] public void GenerateSpecificFromBaseName() { @@ -1319,6 +1417,7 @@ public void GenerateSpecificFromBaseName() var specificWeapon = new Weapon(); specificWeapon.Name = "specific weapon name"; specificWeapon.BaseNames = new[] { "base name", "other specific base name" }; + mockSpecificGearGenerator.Setup(g => g.IsSpecific(ItemTypeConstants.Weapon, "specific weapon name")).Returns(true); mockSpecificGearGenerator.Setup(g => g.IsSpecific(It.Is(i => i.Name == "specific weapon name"))).Returns(true); mockSpecificGearGenerator.Setup(g => g.CanBeSpecific(power, ItemTypeConstants.Weapon, "base name")).Returns(true); @@ -1326,6 +1425,8 @@ public void GenerateSpecificFromBaseName() mockSpecificGearGenerator.Setup(g => g.GeneratePrototypeFrom(power, ItemTypeConstants.Weapon, "specific weapon name")).Returns(specificWeapon); mockSpecificGearGenerator.Setup(g => g.GenerateFrom(It.Is(i => i.Name == "specific weapon name"))).Returns(specificWeapon); + mockMundaneWeaponGenerator.Setup(g => g.Generate("base name")).Returns(mundaneWeapon); + var weapon = magicalWeaponGenerator.Generate(power, "base name"); Assert.That(weapon.Name, Is.EqualTo("specific weapon name")); Assert.That(weapon, Is.EqualTo(specificWeapon)); @@ -1351,7 +1452,6 @@ public void GenerateSpecificWithSpecialAbilitiesFromName() var specificWeapon = new Weapon(); specificWeapon.Name = "specific weapon name"; specificWeapon.BaseNames = new[] { "base name", "other specific base name" }; - specificWeapon.Quantity = 1337; specificWeapon.ItemType = ItemTypeConstants.Weapon; var abilities = new[] { new SpecialAbility(), new SpecialAbility() }; @@ -1361,9 +1461,11 @@ public void GenerateSpecificWithSpecialAbilitiesFromName() mockSpecificGearGenerator.Setup(g => g.GenerateFrom(It.Is(i => i.Name == "specific weapon name"))).Returns(specificWeapon); mockSpecificGearGenerator.Setup(g => g.IsSpecific(It.Is(i => i.Name == "specific weapon name"))).Returns(true); + mockMundaneWeaponGenerator.Setup(g => g.Generate("base name")).Returns(mundaneWeapon); + var weapon = magicalWeaponGenerator.Generate(power, "specific weapon name"); Assert.That(weapon.Name, Is.EqualTo("specific weapon name")); - Assert.That(weapon.Quantity, Is.EqualTo(1337)); + Assert.That(weapon.Quantity, Is.EqualTo(600)); Assert.That(weapon.BaseNames, Is.EquivalentTo(specificWeapon.BaseNames)); Assert.That(weapon.Magic.SpecialAbilities, Is.EquivalentTo(abilities)); } @@ -1388,7 +1490,6 @@ public void GenerateSpecificWithSpecialAbilitiesFromBaseName() var specificWeapon = new Weapon(); specificWeapon.Name = "specific weapon name"; specificWeapon.BaseNames = new[] { "base name", "other specific base name" }; - specificWeapon.Quantity = 1337; specificWeapon.ItemType = ItemTypeConstants.Weapon; var abilities = new[] { new SpecialAbility(), new SpecialAbility() }; @@ -1401,11 +1502,41 @@ public void GenerateSpecificWithSpecialAbilitiesFromBaseName() mockSpecificGearGenerator.Setup(g => g.GeneratePrototypeFrom(power, ItemTypeConstants.Weapon, "specific weapon name")).Returns(specificWeapon); mockSpecificGearGenerator.Setup(g => g.GenerateFrom(It.Is(i => i.Name == "specific weapon name"))).Returns(specificWeapon); + mockMundaneWeaponGenerator.Setup(g => g.Generate("base name")).Returns(mundaneWeapon); + var weapon = magicalWeaponGenerator.Generate(power, "base name"); Assert.That(weapon.Name, Is.EqualTo("specific weapon name")); - Assert.That(weapon.Quantity, Is.EqualTo(1337)); + Assert.That(weapon.Quantity, Is.EqualTo(600)); Assert.That(weapon.BaseNames, Is.EquivalentTo(specificWeapon.BaseNames)); Assert.That(weapon.Magic.SpecialAbilities, Is.EquivalentTo(abilities)); } + + [Test] + public void BUG_GenerateSpecificFromBaseName_WithQuantity() + { + var tableName = string.Format(TableNameConstants.Percentiles.Formattable.POWERITEMTYPEs, power, ItemTypeConstants.Weapon); + mockPercentileSelector.SetupSequence(p => p.SelectFrom(tableName)).Returns("SpecialAbility").Returns("SpecialAbility").Returns(ItemTypeConstants.Weapon); + + var specificWeapon = new Weapon(); + specificWeapon.Name = "specific weapon name"; + specificWeapon.BaseNames = new[] { "base name", "other specific base name" }; + + mockSpecificGearGenerator.Setup(g => g.IsSpecific(ItemTypeConstants.Weapon, "specific weapon name")).Returns(true); + mockSpecificGearGenerator.Setup(g => g.IsSpecific(It.Is(i => i.Name == "specific weapon name"))).Returns(true); + mockSpecificGearGenerator.Setup(g => g.CanBeSpecific(power, ItemTypeConstants.Weapon, "base name")).Returns(true); + mockSpecificGearGenerator.Setup(g => g.GenerateNameFrom(power, ItemTypeConstants.Weapon, "base name")).Returns("specific weapon name"); + mockSpecificGearGenerator.Setup(g => g.GeneratePrototypeFrom(power, ItemTypeConstants.Weapon, "specific weapon name")).Returns(specificWeapon); + mockSpecificGearGenerator.Setup(g => g.GenerateFrom(It.Is(i => i.Name == "specific weapon name"))).Returns(specificWeapon); + + var weaponForQuantity = new Weapon(); + weaponForQuantity.Name = "base name"; + weaponForQuantity.Quantity = 1336; + mockMundaneWeaponGenerator.Setup(g => g.Generate("base name")).Returns(weaponForQuantity); + + var weapon = magicalWeaponGenerator.Generate(power, "base name"); + Assert.That(weapon.Name, Is.EqualTo("specific weapon name")); + Assert.That(weapon, Is.EqualTo(specificWeapon)); + Assert.That(weapon.Quantity, Is.EqualTo(1336)); + } } } \ No newline at end of file diff --git a/DnDGen.TreasureGen/Generators/Items/Magical/MagicalWeaponGenerator.cs b/DnDGen.TreasureGen/Generators/Items/Magical/MagicalWeaponGenerator.cs index d7bf142a..143294c0 100644 --- a/DnDGen.TreasureGen/Generators/Items/Magical/MagicalWeaponGenerator.cs +++ b/DnDGen.TreasureGen/Generators/Items/Magical/MagicalWeaponGenerator.cs @@ -123,13 +123,21 @@ private Weapon GeneratePrototype(string power, string itemName, bool isSpecific, private Weapon GenerateFromPrototype(Item prototype, bool allowDecoration) { + var mundaneWeaponGenerator = justInTimeFactory.Build(ItemTypeConstants.Weapon); + if (specificGearGenerator.IsSpecific(prototype)) { var specificWeapon = specificGearGenerator.GenerateFrom(prototype); + + //INFO: We need to set the quantity on the weapon. However, ammunition or thrown weapons might have quantities greater than 1 + //The quantity logic is contained within the MundaneWeaponGenerator, to which we do not have direct access + //So, we will generate a mundane item from the base names of the specific weapon, and use that quantity + var weaponForQuantity = mundaneWeaponGenerator.Generate(specificWeapon.BaseNames.First()); + specificWeapon.Quantity = weaponForQuantity.Quantity; + return specificWeapon as Weapon; } - var mundaneWeaponGenerator = justInTimeFactory.Build(ItemTypeConstants.Weapon); var weapon = mundaneWeaponGenerator.Generate(prototype, allowDecoration); weapon.Magic.Bonus = prototype.Magic.Bonus;