private static void MutateSocietyArmor(WorldObject wo, TreasureDeath profile, bool isMagical) { int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } if (wo.GemCode != null) { wo.GemCount = GemCountChance.Roll(wo.GemCode.Value, profile.Tier); } else { wo.GemCount = ThreadSafeRandom.Next(1, 6); } wo.GemType = RollGemType(profile.Tier); int workmanship = GetWorkmanship(profile.Tier); wo.ItemWorkmanship = workmanship; double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(profile.Tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; // wo.WieldSkillType = (int)Skill.Axe; // Set by examples from PCAP data if (isMagical) { // looks like society armor always had impen on it AssignMagic(wo, profile, true); } else { wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; } wo = AssignArmorLevel(wo, profile.Tier, LootTables.ArmorType.SocietyArmor); wo.LongDesc = GetLongDesc(wo); // try mutate burden, if MutateFilter exists if (wo.HasMutateFilter(MutateFilter.EncumbranceVal)) { MutateBurden(wo, profile, false); } }
private static void MutateJewelry(WorldObject wo, TreasureDeath profile, bool isMagical) { wo.AppraisalLongDescDecoration = AppraisalLongDescDecorations.PrependWorkmanship; wo.LongDesc = wo.Name; int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } int gemCount = ThreadSafeRandom.Next(1, 5); int gemType = ThreadSafeRandom.Next(10, 50); wo.GemCount = gemCount; wo.GemType = (MaterialType)gemType; int workmanship = GetWorkmanship(profile.Tier); double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(profile.Tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; wo.ItemWorkmanship = workmanship; wo.ItemSkillLevelLimit = null; if (profile.Tier > 6) { wo.WieldRequirements = WieldRequirement.Level; wo.WieldSkillType = (int)Skill.Axe; // Set by examples from PCAP data var wield = profile.Tier switch { 7 => 150, // In this instance, used for indicating player level, rather than skill level _ => 180, // In this instance, used for indicating player level, rather than skill level }; wo.WieldDifficulty = wield; } if (isMagical) { wo = AssignMagic(wo, profile); } else { wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; wo.ManaRate = null; } RandomizeColor(wo); }
private static void MutateDinnerware_ItemValue(WorldObject wo) { var materialMod = LootTables.getMaterialValueModifier(wo); var gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var baseValue = ThreadSafeRandom.Next(300, 600); var workmanship = wo.ItemWorkmanship ?? 1; wo.Value = (int)(baseValue * gemMaterialMod * materialMod * workmanship); }
private static WorldObject CreateArmor(int tier, bool isMagical, LootBias lootBias = LootBias.UnBiased) { int lowSpellTier = 0; int highSpellTier = 0; int equipSetId = 0; int materialType = 0; int armorPiece = 0; int armorType = 0; int armorWeenie = 0; switch (tier) { case 1: lowSpellTier = 1; highSpellTier = 3; armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.ChainmailArmor); break; case 2: lowSpellTier = 3; highSpellTier = 5; armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.DiforsaArmor); break; case 3: lowSpellTier = 4; highSpellTier = 6; armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.CovenantArmor); break; case 4: lowSpellTier = 5; highSpellTier = 6; armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.CovenantArmor); break; case 5: lowSpellTier = 5; highSpellTier = 7; armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.AlduressaArmor); break; case 6: lowSpellTier = 6; highSpellTier = 7; armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.HaebreanArmor); break; case 7: lowSpellTier = 6; highSpellTier = 8; armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.OlthoiAlduressaArmor); break; default: lowSpellTier = 7; highSpellTier = 8; if (lootBias == LootBias.Armor) // Armor Mana Forge Chests don't include clothing type items { armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.Helms, (int)LootTables.ArmorType.OlthoiAlduressaArmor); } else { armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.OlthoiAlduressaArmor); } break; } switch (armorType) { case (int)LootTables.ArmorType.MiscClothing: armorPiece = ThreadSafeRandom.Next(0, 47); armorWeenie = LootTables.MiscClothing[armorPiece]; break; case (int)LootTables.ArmorType.Helms: armorPiece = ThreadSafeRandom.Next(0, 8); armorWeenie = LootTables.Helms[armorPiece]; break; case (int)LootTables.ArmorType.Shields: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.Shields[armorPiece]; break; case (int)LootTables.ArmorType.LeatherArmor: armorPiece = ThreadSafeRandom.Next(0, 15); armorWeenie = LootTables.LeatherArmor[armorPiece]; break; case (int)LootTables.ArmorType.StuddedLeatherArmor: armorPiece = ThreadSafeRandom.Next(0, 14); armorWeenie = LootTables.StuddedLeatherArmor[armorPiece]; break; case (int)LootTables.ArmorType.ChainmailArmor: armorPiece = ThreadSafeRandom.Next(0, 12); armorWeenie = LootTables.ChainmailArmor[armorPiece]; break; case (int)LootTables.ArmorType.PlatemailArmor: armorPiece = ThreadSafeRandom.Next(0, 10); armorWeenie = LootTables.PlatemailArmor[armorPiece]; break; case (int)LootTables.ArmorType.ScalemailArmor: armorPiece = ThreadSafeRandom.Next(0, 13); armorWeenie = LootTables.ScalemailArmor[armorPiece]; break; case (int)LootTables.ArmorType.YoroiArmor: armorPiece = ThreadSafeRandom.Next(0, 7); armorWeenie = LootTables.YoroiArmor[armorPiece]; break; case (int)LootTables.ArmorType.DiforsaArmor: armorPiece = ThreadSafeRandom.Next(0, 12); armorWeenie = LootTables.DiforsaArmor[armorPiece]; break; case (int)LootTables.ArmorType.CeldonArmor: armorPiece = ThreadSafeRandom.Next(0, 3); armorWeenie = LootTables.CeldonArmor[armorPiece]; break; case (int)LootTables.ArmorType.AmuliArmor: armorPiece = ThreadSafeRandom.Next(0, 1); armorWeenie = LootTables.AmuliArmor[armorPiece]; break; case (int)LootTables.ArmorType.KoujiaArmor: armorPiece = ThreadSafeRandom.Next(0, 2); armorWeenie = LootTables.KoujiaArmor[armorPiece]; break; case (int)LootTables.ArmorType.TenassaArmor: armorPiece = ThreadSafeRandom.Next(0, 2); armorWeenie = LootTables.TenassaArmor[armorPiece]; break; case (int)LootTables.ArmorType.CovenantArmor: armorPiece = ThreadSafeRandom.Next(0, 9); armorWeenie = LootTables.CovenantArmor[armorPiece]; break; case (int)LootTables.ArmorType.LoricaArmor: armorPiece = ThreadSafeRandom.Next(0, 5); armorWeenie = LootTables.LoricaArmor[armorPiece]; break; case (int)LootTables.ArmorType.NariyidArmor: armorPiece = ThreadSafeRandom.Next(0, 6); armorWeenie = LootTables.NariyidArmor[armorPiece]; break; case (int)LootTables.ArmorType.ChiranArmor: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.ChiranArmor[armorPiece]; break; case (int)LootTables.ArmorType.AlduressaArmor: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.AlduressaArmor[armorPiece]; break; case (int)LootTables.ArmorType.KnorrAcademyArmor: armorPiece = ThreadSafeRandom.Next(0, 7); armorWeenie = LootTables.KnorrAcademyArmor[armorPiece]; break; case (int)LootTables.ArmorType.SedgemailLeatherArmor: armorPiece = ThreadSafeRandom.Next(0, 5); armorWeenie = LootTables.SedgemailLeatherArmor[armorPiece]; break; case (int)LootTables.ArmorType.HaebreanArmor: armorPiece = ThreadSafeRandom.Next(0, 8); armorWeenie = LootTables.HaebreanArmor[armorPiece]; break; case (int)LootTables.ArmorType.OlthoiArmor: armorPiece = ThreadSafeRandom.Next(0, 9); armorWeenie = LootTables.OlthoiArmor[armorPiece]; break; case (int)LootTables.ArmorType.OlthoiAmuliArmor: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.OlthoiAmuliArmor[armorPiece]; break; case (int)LootTables.ArmorType.OlthoiCeldonArmor: armorPiece = ThreadSafeRandom.Next(0, 6); armorWeenie = LootTables.OlthoiCeldonArmor[armorPiece]; break; case (int)LootTables.ArmorType.OlthoiKoujiaArmor: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.OlthoiKoujiaArmor[armorPiece]; break; default: // Olthoi Alduressa armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.OlthoiAlduressaArmor[armorPiece]; break; } WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)armorWeenie); if (wo == null) { return(null); } wo.SetProperty(PropertyString.LongDesc, wo.GetProperty(PropertyString.Name)); wo.SetProperty(PropertyInt.AppraisalItemSkill, 7); wo.SetProperty(PropertyInt.AppraisalLongDescDecoration, 1); materialType = GetMaterialType(wo, tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } int gemCount = ThreadSafeRandom.Next(1, 6); int gemType = ThreadSafeRandom.Next(10, 50); wo.SetProperty(PropertyInt.GemCount, gemCount); wo.SetProperty(PropertyInt.GemType, gemType); int workmanship = GetWorkmanship(tier); wo.SetProperty(PropertyInt.ItemWorkmanship, workmanship); double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; int wield; if (tier > 6 && armorType != (int)LootTables.ArmorType.CovenantArmor) { wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.Level); wo.SetProperty(PropertyInt.WieldSkillType, (int)Skill.Axe); // Set by examples from PCAP data switch (tier) { case 7: wield = 150; // In this instance, used for indicating player level, rather than skill level break; default: wield = 180; // In this instance, used for indicating player level, rather than skill level break; } wo.SetProperty(PropertyInt.WieldDifficulty, wield); } if (armorType == (int)LootTables.ArmorType.CovenantArmor) { Skill wieldSkill; int chance = ThreadSafeRandom.Next(1, 3); switch (chance) { case 1: // Magic Def wieldSkill = Skill.MagicDefense; break; case 2: // Missile Def wieldSkill = Skill.MissileDefense; break; default: // Melee Def wieldSkill = Skill.MeleeDefense; break; } wield = GetCovenantWieldReq(tier, wieldSkill); wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.RawSkill); wo.SetProperty(PropertyInt.WieldSkillType, (int)wieldSkill); wo.SetProperty(PropertyInt.WieldDifficulty, wield); } // Setting random color wo.SetProperty(PropertyInt.PaletteTemplate, ThreadSafeRandom.Next(1, 2047)); double shade = .1 * ThreadSafeRandom.Next(0, 9); wo.SetProperty(PropertyFloat.Shade, shade); var baseArmorLevel = wo.GetProperty(PropertyInt.ArmorLevel) ?? 0; if (baseArmorLevel > 0) { int adjustedArmorLevel = baseArmorLevel + GetArmorLevelModifier(tier, armorType); wo.SetProperty(PropertyInt.ArmorLevel, adjustedArmorLevel); } wo.SetProperty(PropertyInt.EquipmentSetId, equipSetId); if (isMagical) { wo.SetProperty(PropertyInt.UiEffects, (int)UiEffects.Magical); int numSpells = GetNumSpells(tier); int spellcraft = GetSpellcraft(numSpells, tier); wo.SetProperty(PropertyInt.ItemSpellcraft, spellcraft); wo.SetProperty(PropertyInt.ItemDifficulty, GetDifficulty(tier, spellcraft)); int maxMana = GetMaxMana(numSpells, tier); wo.SetProperty(PropertyInt.ItemMaxMana, maxMana); wo.SetProperty(PropertyInt.ItemCurMana, maxMana); int[][] spells; int[][] cantrips; spells = LootTables.ArmorSpells; cantrips = LootTables.ArmorCantrips; int[] shuffledValues = new int[spells.Length]; for (int i = 0; i < spells.Length; i++) { shuffledValues[i] = i; } Shuffle(shuffledValues); int minorCantrips = GetNumMinorCantrips(tier); int majorCantrips = GetNumMajorCantrips(tier); int epicCantrips = GetNumEpicCantrips(tier); int legendaryCantrips = GetNumLegendaryCantrips(tier); int numCantrips = minorCantrips + majorCantrips + epicCantrips + legendaryCantrips; if (numSpells - numCantrips > 0) { for (int a = 0; a < numSpells - numCantrips; a++) { int col = ThreadSafeRandom.Next(lowSpellTier - 1, highSpellTier - 1); int spellID = spells[shuffledValues[a]][col]; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } } if (numCantrips > 0) { shuffledValues = new int[cantrips.Length]; for (int i = 0; i < cantrips.Length; i++) { shuffledValues[i] = i; } Shuffle(shuffledValues); int shuffledPlace = 0; //minor cantripps for (int a = 0; a < minorCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][0]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } //major cantrips for (int a = 0; a < majorCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][1]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } // epic cantrips for (int a = 0; a < epicCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][2]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } //legendary cantrips for (int a = 0; a < legendaryCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][3]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } } } else { wo.RemoveProperty(PropertyInt.ItemManaCost); wo.RemoveProperty(PropertyInt.ItemMaxMana); wo.RemoveProperty(PropertyInt.ItemCurMana); wo.RemoveProperty(PropertyInt.ItemSpellcraft); wo.RemoveProperty(PropertyInt.ItemDifficulty); } wo = RandomizeColor(wo); return(wo); }
private static bool MutateMeleeWeapon(WorldObject wo, TreasureDeath profile, bool isMagical, TreasureWeaponType weaponType = TreasureWeaponType.Undef) { if (!(wo is MeleeWeapon)) { return(false); } if (weaponType == TreasureWeaponType.Undef) { // previous method var wieldDifficulty = RollWieldDifficulty(profile.Tier, WieldType.MeleeWeapon); if (!MutateStats_OldMethod(wo, profile, wieldDifficulty)) { return(false); } } else { // thanks to 4eyebiped for helping with the data analysis of magloot retail logs // that went into reversing these mutation scripts var weaponSkill = wo.WeaponSkill.ToMeleeWeaponSkill(); // mutate Damage / WieldDifficulty / Variance var scriptName = GetDamageScript(weaponSkill, weaponType); var mutationFilter = MutationCache.GetMutation(scriptName); mutationFilter.TryMutate(wo, profile.Tier); // mutate WeaponOffense / WeaponDefense scriptName = GetOffenseDefenseScript(weaponSkill, weaponType); mutationFilter = MutationCache.GetMutation(scriptName); mutationFilter.TryMutate(wo, profile.Tier); } // weapon speed if (wo.WeaponTime != null) { var weaponSpeedMod = RollWeaponSpeedMod(profile); wo.WeaponTime = (int)(wo.WeaponTime * weaponSpeedMod); } // material type var materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } // item color MutateColor(wo); // gem count / gem material if (wo.GemCode != null) { wo.GemCount = GemCountChance.Roll(wo.GemCode.Value, profile.Tier); } else { wo.GemCount = ThreadSafeRandom.Next(1, 5); } wo.GemType = RollGemType(profile.Tier); // workmanship wo.ItemWorkmanship = GetWorkmanship(profile.Tier); // burden MutateBurden(wo, profile, true); // item value var materialMod = LootTables.getMaterialValueModifier(wo); var gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); wo.Value = GetValue(profile.Tier, wo.ItemWorkmanship ?? 0, gemMaterialMod, materialMod); // missile / magic defense wo.WeaponMissileDefense = MissileMagicDefense.Roll(profile.Tier); wo.WeaponMagicDefense = MissileMagicDefense.Roll(profile.Tier); // spells if (!isMagical) { // clear base wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; } else { AssignMagic(wo, profile); } // long description wo.LongDesc = GetLongDesc(wo); return(true); }
public static WorldObject CreateMissileWeapon(int tier, bool isMagical) { int weaponWeenie; int elemenatalBonus = 0; int wieldDifficulty = GetWield(tier, 1); // Changing based on wield, not tier. Refactored, less code, best results. HarliQ 11/18/19 if (wieldDifficulty < 315) { weaponWeenie = GetNonElementalMissileWeapon(); } else { elemenatalBonus = GetElementalBonus(wieldDifficulty); weaponWeenie = GetElementalMissileWeapon(); } WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)weaponWeenie); if (wo == null) { return(null); } int workmanship = GetWorkmanship(tier); wo.SetProperty(PropertyInt.ItemWorkmanship, workmanship); int materialType = GetMaterialType(wo, tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } wo.SetProperty(PropertyInt.GemCount, ThreadSafeRandom.Next(1, 5)); wo.SetProperty(PropertyInt.GemType, ThreadSafeRandom.Next(10, 50)); wo.SetProperty(PropertyString.LongDesc, wo.GetProperty(PropertyString.Name)); double meleeDMod = GetWieldReqMeleeDMod(wieldDifficulty); // double meleeDMod = GetMeleeDMod(tier); if (meleeDMod > 0.0f) { wo.SetProperty(PropertyFloat.WeaponDefense, meleeDMod); } // MagicD/Missile Bonus wo.WeaponMagicDefense = GetMagicMissileDMod(tier); wo.WeaponMissileDefense = GetMagicMissileDMod(tier); wo.SetProperty(PropertyFloat.DamageMod, GetMissileDamageMod(wieldDifficulty, wo.GetProperty(PropertyInt.WeaponType))); if (elemenatalBonus > 0) { wo.SetProperty(PropertyInt.ElementalDamageBonus, elemenatalBonus); } if (wieldDifficulty > 0) { wo.SetProperty(PropertyInt.WieldDifficulty, wieldDifficulty); wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.RawSkill); wo.SetProperty(PropertyInt.WieldSkillType, (int)Skill.MissileWeapons); } else { wo.RemoveProperty(PropertyInt.WieldDifficulty); wo.RemoveProperty(PropertyInt.WieldRequirements); wo.RemoveProperty(PropertyInt.WieldSkillType); } if (isMagical) { wo = AssignMagic(wo, tier); } else { wo.RemoveProperty(PropertyInt.ItemManaCost); wo.RemoveProperty(PropertyInt.ItemMaxMana); wo.RemoveProperty(PropertyInt.ItemCurMana); wo.RemoveProperty(PropertyInt.ItemSpellcraft); wo.RemoveProperty(PropertyInt.ItemDifficulty); wo.RemoveProperty(PropertyFloat.ManaRate); } double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; wo = RandomizeColor(wo); return(wo); }
private static WorldObject CreateJewelry(TreasureDeath profile, bool isMagical) { // 35% chance ring, 35% chance bracelet, 30% chance necklace int ringPercent = 35; int braceletPercent = 35; int necklacePercent = 30; int jewelrySlot = ThreadSafeRandom.Next(0, ringPercent + braceletPercent + necklacePercent); int jewelType; switch (jewelrySlot) { case int n when(n <= ringPercent): jewelType = LootTables.ringItems[ThreadSafeRandom.Next(0, LootTables.ringItems.Length - 1)]; break; case int n when(n <= ringPercent + braceletPercent && n > ringPercent): jewelType = LootTables.braceletItems[ThreadSafeRandom.Next(0, LootTables.braceletItems.Length - 1)]; break; case int n when(n <= ringPercent + braceletPercent + necklacePercent && n > ringPercent + braceletPercent): jewelType = LootTables.necklaceItems[ThreadSafeRandom.Next(0, LootTables.necklaceItems.Length - 1)]; break; default: return(null); } //int rank = 0; //int skill_level_limit = 0; WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)jewelType); if (wo == null) { return(null); } wo.SetProperty(PropertyInt.AppraisalLongDescDecoration, 1); wo.SetProperty(PropertyString.LongDesc, wo.GetProperty(PropertyString.Name)); int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } int gemCount = ThreadSafeRandom.Next(1, 5); int gemType = ThreadSafeRandom.Next(10, 50); wo.SetProperty(PropertyInt.GemCount, gemCount); wo.SetProperty(PropertyInt.GemType, gemType); int workmanship = GetWorkmanship(profile.Tier); double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(profile.Tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; wo.SetProperty(PropertyInt.ItemWorkmanship, workmanship); wo.RemoveProperty(PropertyInt.ItemSkillLevelLimit); if (profile.Tier > 6) { wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.Level); wo.SetProperty(PropertyInt.WieldSkillType, (int)Skill.Axe); // Set by examples from PCAP data var wield = profile.Tier switch { 7 => 150, // In this instance, used for indicating player level, rather than skill level _ => 180, // In this instance, used for indicating player level, rather than skill level }; wo.SetProperty(PropertyInt.WieldDifficulty, wield); } if (isMagical) { wo = AssignMagic(wo, profile); } else { wo.RemoveProperty(PropertyInt.ItemManaCost); wo.RemoveProperty(PropertyInt.ItemMaxMana); wo.RemoveProperty(PropertyInt.ItemCurMana); wo.RemoveProperty(PropertyInt.ItemSpellcraft); wo.RemoveProperty(PropertyInt.ItemDifficulty); wo.RemoveProperty(PropertyFloat.ManaRate); } wo = RandomizeColor(wo); return(wo); }
public static WorldObject CreateMeleeWeapon(int tier, bool isMagical, int weaponType = -1) { Skill wieldSkillType = Skill.None; int weaponWeenie = 0; int damage = 0; double damageVariance = 0; double weaponDefense = 0; double weaponOffense = 0; int longDescDecoration = 5; // Properties for weapons double magicD = GetMagicMissileDMod(tier); double missileD = GetMagicMissileDMod(tier); int gemCount = ThreadSafeRandom.Next(1, 5); int gemType = ThreadSafeRandom.Next(10, 50); int workmanship = GetWorkmanship(tier); int wieldDiff = GetWield(tier, 3); WieldRequirement wieldRequirments = WieldRequirement.RawSkill; int eleType = ThreadSafeRandom.Next(0, 4); if (weaponType == -1) { weaponType = ThreadSafeRandom.Next(0, 3); } switch (weaponType) { case 0: // Heavy Weapons wieldSkillType = Skill.HeavyWeapons; int heavyWeaponsType = ThreadSafeRandom.Next(0, 22); weaponWeenie = LootTables.HeavyWeaponsMatrix[heavyWeaponsType][eleType]; switch (heavyWeaponsType) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(tier, 18); weaponOffense = GetMaxDamageMod(tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 3: case 4: case 5: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Dagger); if (heavyWeaponsType == 3) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.Dagger); } if (heavyWeaponsType == 4 || heavyWeaponsType == 5) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); } break; case 6: case 7: case 8: case 9: weaponDefense = GetMaxDamageMod(tier, 22); weaponOffense = GetMaxDamageMod(tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); break; case 10: case 11: case 12: weaponDefense = GetMaxDamageMod(tier, 15); weaponOffense = GetMaxDamageMod(tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 13: case 14: weaponDefense = GetMaxDamageMod(tier, 25); weaponOffense = GetMaxDamageMod(tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 15: case 16: case 17: case 18: case 19: case 20: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (heavyWeaponsType == 20) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 21: default: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; case 1: // Light Weapons; wieldSkillType = Skill.LightWeapons; int lightWeaponsType = ThreadSafeRandom.Next(0, 19); weaponWeenie = LootTables.LightWeaponsMatrix[lightWeaponsType][eleType]; switch (lightWeaponsType) { case 0: case 1: case 2: case 3: weaponDefense = GetMaxDamageMod(tier, 18); weaponOffense = GetMaxDamageMod(tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 4: case 5: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); break; case 6: case 7: case 8: weaponDefense = GetMaxDamageMod(tier, 22); weaponOffense = GetMaxDamageMod(tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); break; case 9: case 10: weaponDefense = GetMaxDamageMod(tier, 15); weaponOffense = GetMaxDamageMod(tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 11: weaponDefense = GetMaxDamageMod(tier, 25); weaponOffense = GetMaxDamageMod(tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 12: case 13: case 14: case 15: case 16: case 17: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (lightWeaponsType == 14) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 18: default: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; case 2: // Finesse Weapons; wieldSkillType = Skill.FinesseWeapons; int finesseWeaponsType = ThreadSafeRandom.Next(0, 22); weaponWeenie = LootTables.FinesseWeaponsMatrix[finesseWeaponsType][eleType]; switch (finesseWeaponsType) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(tier, 18); weaponOffense = GetMaxDamageMod(tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 3: case 4: case 5: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Dagger); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Dagger); if (finesseWeaponsType == 3 || finesseWeaponsType == 4) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); } break; case 6: case 7: case 8: case 9: case 10: weaponDefense = GetMaxDamageMod(tier, 22); weaponOffense = GetMaxDamageMod(tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); if (finesseWeaponsType == 9) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.Jitte); } break; case 11: case 12: weaponDefense = GetMaxDamageMod(tier, 15); weaponOffense = GetMaxDamageMod(tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 13: case 14: weaponDefense = GetMaxDamageMod(tier, 25); weaponOffense = GetMaxDamageMod(tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 15: case 16: case 17: case 18: case 19: case 20: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (finesseWeaponsType == 15) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 21: default: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; default: // Two handed wieldSkillType = Skill.TwoHandedCombat; int twoHandedWeaponsType = ThreadSafeRandom.Next(0, 11); weaponWeenie = LootTables.TwoHandedWeaponsMatrix[twoHandedWeaponsType][eleType]; damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Cleaving); damageVariance = GetVariance(wieldSkillType, LootWeaponType.TwoHanded); switch (twoHandedWeaponsType) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); break; case 3: case 4: case 5: case 6: weaponDefense = GetMaxDamageMod(tier, 22); weaponOffense = GetMaxDamageMod(tier, 18); break; case 7: weaponDefense = GetMaxDamageMod(tier, 18); weaponOffense = GetMaxDamageMod(tier, 22); break; case 8: case 9: case 10: default: weaponDefense = GetMaxDamageMod(tier, 15); weaponOffense = GetMaxDamageMod(tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spears); break; } break; } WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)weaponWeenie); if (wo == null) { return(null); } wo.SetProperty(PropertyInt.AppraisalLongDescDecoration, longDescDecoration); wo.SetProperty(PropertyString.LongDesc, wo.GetProperty(PropertyString.Name)); wo.SetProperty(PropertyInt.GemCount, gemCount); wo.SetProperty(PropertyInt.GemType, gemType); int materialType = GetMaterialType(wo, tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } wo.SetProperty(PropertyInt.ItemWorkmanship, workmanship); wo.SetProperty(PropertyInt.Damage, damage); wo.SetProperty(PropertyFloat.DamageVariance, damageVariance); wo.SetProperty(PropertyFloat.WeaponDefense, weaponDefense); wo.SetProperty(PropertyFloat.WeaponOffense, weaponOffense); wo.SetProperty(PropertyFloat.WeaponMissileDefense, missileD); wo.SetProperty(PropertyFloat.WeaponMagicDefense, magicD); if (wieldDiff > 0) { wo.SetProperty(PropertyInt.WieldDifficulty, wieldDiff); wo.SetProperty(PropertyInt.WieldRequirements, (int)wieldRequirments); wo.SetProperty(PropertyInt.WieldSkillType, (int)wieldSkillType); } else { wo.RemoveProperty(PropertyInt.WieldDifficulty); wo.RemoveProperty(PropertyInt.WieldRequirements); wo.RemoveProperty(PropertyInt.WieldSkillType); } if (isMagical) { wo = AssignMagic(wo, tier); } else { wo.RemoveProperty(PropertyInt.ItemManaCost); wo.RemoveProperty(PropertyInt.ItemMaxMana); wo.RemoveProperty(PropertyInt.ItemCurMana); wo.RemoveProperty(PropertyInt.ItemSpellcraft); wo.RemoveProperty(PropertyInt.ItemDifficulty); } double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; wo = RandomizeColor(wo); return(wo); }
private static WorldObject CreateCaster(int tier, bool isMagical) { int casterWeenie = 0; //done double elementalDamageMod = 0; Skill wieldSkillType = Skill.None; WieldRequirement wieldRequirement = WieldRequirement.RawSkill; int subType = 0; int wield = GetWield(tier, 2); ////Getting the caster Weenie needed. if (wield == 0) { // Determine plain caster type: 0 - Orb, 1 - Sceptre, 2 - Staff, 3 - Wand subType = ThreadSafeRandom.Next(0, 3); casterWeenie = LootTables.CasterWeaponsMatrix[wield][subType]; if (tier > 6) { wieldRequirement = WieldRequirement.Level; wieldSkillType = Skill.Axe; // Set by examples from PCAP data switch (tier) { case 7: wield = 150; // In this instance, used for indicating player level, rather than skill level break; default: wield = 180; // In this instance, used for indicating player level, rather than skill level break; } } } else { // Determine the Elemental Damage Mod amount elementalDamageMod = GetMaxDamageMod(tier, 18); // Determine caster type: 1 - Sceptre, 2 - Baton, 3 - Staff int casterType = ThreadSafeRandom.Next(1, 3); // Determine element type: 0 - Slashing, 1 - Piercing, 2 - Blunt, 3 - Frost, 4 - Fire, 5 - Acid, 6 - Electric, 7 - Nether int element = ThreadSafeRandom.Next(0, 7); casterWeenie = LootTables.CasterWeaponsMatrix[casterType][element]; // If element is Nether, Void Magic is required, else War Magic is required for all other elements if (element == 7) { wieldSkillType = Skill.VoidMagic; } else { wieldSkillType = Skill.WarMagic; } } WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)casterWeenie); if (wo == null) { return(null); } int workmanship = GetWorkmanship(tier); wo.SetProperty(PropertyInt.ItemWorkmanship, workmanship); int materialType = GetMaterialType(wo, tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } wo.SetProperty(PropertyInt.MaterialType, GetMaterialType(wo, tier)); wo.SetProperty(PropertyInt.GemCount, ThreadSafeRandom.Next(1, 5)); wo.SetProperty(PropertyInt.GemType, ThreadSafeRandom.Next(10, 50)); wo.SetProperty(PropertyString.LongDesc, wo.GetProperty(PropertyString.Name)); double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; if (ThreadSafeRandom.Next(0, 100) > 95) { double missileDMod = GetMissileDMod(tier); if (missileDMod > 0.0f) { wo.SetProperty(PropertyFloat.WeaponMissileDefense, missileDMod); } } else { double meleeDMod = GetMeleeDMod(tier); if (meleeDMod > 0.0f) { wo.SetProperty(PropertyFloat.WeaponDefense, meleeDMod); } } double manaConMod = GetManaCMod(tier); if (manaConMod > 0.0f) { wo.SetProperty(PropertyFloat.ManaConversionMod, manaConMod); } if (elementalDamageMod > 1.0f) { wo.SetProperty(PropertyFloat.ElementalDamageMod, elementalDamageMod); } if (wield > 0 || wieldRequirement == WieldRequirement.Level) { wo.SetProperty(PropertyInt.WieldRequirements, (int)wieldRequirement); wo.SetProperty(PropertyInt.WieldSkillType, (int)wieldSkillType); wo.SetProperty(PropertyInt.WieldDifficulty, wield); } else { wo.RemoveProperty(PropertyInt.WieldRequirements); wo.RemoveProperty(PropertyInt.WieldSkillType); wo.RemoveProperty(PropertyInt.WieldDifficulty); } wo.RemoveProperty(PropertyInt.ItemSkillLevelLimit); if (isMagical) { wo.SetProperty(PropertyInt.UiEffects, (int)UiEffects.Magical); int lowSpellTier = GetLowSpellTier(tier); int highSpellTier = GetHighSpellTier(tier); int numSpells = GetNumSpells(tier); int spellcraft = GetSpellcraft(numSpells, tier); int itemMaxMana = GetMaxMana(numSpells, tier); wo.SetProperty(PropertyInt.ItemDifficulty, GetDifficulty(tier, spellcraft)); wo.SetProperty(PropertyFloat.ManaRate, GetManaRate()); wo.SetProperty(PropertyInt.ItemMaxMana, itemMaxMana); wo.SetProperty(PropertyInt.ItemCurMana, itemMaxMana); wo.SetProperty(PropertyInt.AppraisalLongDescDecoration, 7); wo.SetProperty(PropertyInt.ItemSpellcraft, spellcraft); int minorCantrips = GetNumMinorCantrips(tier); int majorCantrips = GetNumMajorCantrips(tier); int epicCantrips = GetNumEpicCantrips(tier); int legendaryCantrips = GetNumLegendaryCantrips(tier); int numCantrips = minorCantrips + majorCantrips + epicCantrips + legendaryCantrips; int[][] spells = LootTables.WandSpells; int[][] cantrips = LootTables.WandCantrips; int[] shuffledValues = new int[spells.Length]; for (int i = 0; i < spells.Length; i++) { shuffledValues[i] = i; } Shuffle(shuffledValues); if (numSpells - numCantrips > 0) { for (int a = 0; a < numSpells - numCantrips; a++) { int col = ThreadSafeRandom.Next(lowSpellTier - 1, highSpellTier - 1); int spellID = spells[shuffledValues[a]][col]; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } } if (numCantrips > 0) { shuffledValues = new int[cantrips.Length]; for (int i = 0; i < cantrips.Length; i++) { shuffledValues[i] = i; } Shuffle(shuffledValues); int shuffledPlace = 0; //minor cantripps for (int a = 0; a < minorCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][0]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } //major cantrips for (int a = 0; a < majorCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][1]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } // epic cantrips for (int a = 0; a < epicCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][2]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } //legendary cantrips for (int a = 0; a < legendaryCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][3]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } } } else { wo.RemoveProperty(PropertyInt.ItemManaCost); wo.RemoveProperty(PropertyInt.ItemMaxMana); wo.RemoveProperty(PropertyInt.ItemCurMana); wo.RemoveProperty(PropertyInt.ItemSpellcraft); wo.RemoveProperty(PropertyInt.ItemDifficulty); } wo = RandomizeColor(wo); return(wo); }
private static WorldObject CreateMeleeWeapon(int tier, bool isMagical) { Skill wieldSkillType = Skill.None; int weaponWeenie = 0; int damage = 0; double damageVariance = 0; double weaponDefense = 0; double weaponOffense = 0; int longDescDecoration = 5; ///Properties for weapons double magicD = GetMissileDMod(tier); double missileD = GetMissileDMod(tier); int gemCount = ThreadSafeRandom.Next(1, 5); int gemType = ThreadSafeRandom.Next(10, 50); int workmanship = GetWorkmanship(tier); int wieldDiff = GetWield(tier, 3); WieldRequirement wieldRequirments = WieldRequirement.RawSkill; int eleType = ThreadSafeRandom.Next(0, 4); int weaponType = ThreadSafeRandom.Next(0, 3); switch (weaponType) { case 0: // Heavy Weapons wieldSkillType = Skill.HeavyWeapons; int heavyWeaponsType = ThreadSafeRandom.Next(0, 22); weaponWeenie = LootTables.HeavyWeaponsMatrix[heavyWeaponsType][eleType]; switch (heavyWeaponsType) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(tier, 18); weaponOffense = GetMaxDamageMod(tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 3: case 4: case 5: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Dagger); if (heavyWeaponsType == 3) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.Dagger); } if (heavyWeaponsType == 4 || heavyWeaponsType == 5) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); } break; case 6: case 7: case 8: case 9: weaponDefense = GetMaxDamageMod(tier, 22); weaponOffense = GetMaxDamageMod(tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); break; case 10: case 11: case 12: weaponDefense = GetMaxDamageMod(tier, 15); weaponOffense = GetMaxDamageMod(tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 13: case 14: weaponDefense = GetMaxDamageMod(tier, 25); weaponOffense = GetMaxDamageMod(tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 15: case 16: case 17: case 18: case 19: case 20: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (heavyWeaponsType == 20) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 21: default: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; case 1: // Light Weapons; wieldSkillType = Skill.LightWeapons; int lightWeaponsType = ThreadSafeRandom.Next(0, 19); weaponWeenie = LootTables.LightWeaponsMatrix[lightWeaponsType][eleType]; switch (lightWeaponsType) { case 0: case 1: case 2: case 3: weaponDefense = GetMaxDamageMod(tier, 18); weaponOffense = GetMaxDamageMod(tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 4: case 5: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); break; case 6: case 7: case 8: weaponDefense = GetMaxDamageMod(tier, 22); weaponOffense = GetMaxDamageMod(tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); break; case 9: case 10: weaponDefense = GetMaxDamageMod(tier, 15); weaponOffense = GetMaxDamageMod(tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 11: weaponDefense = GetMaxDamageMod(tier, 25); weaponOffense = GetMaxDamageMod(tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 12: case 13: case 14: case 15: case 16: case 17: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (lightWeaponsType == 14) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 18: default: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; case 2: // Finesse Weapons; wieldSkillType = Skill.FinesseWeapons; int finesseWeaponsType = ThreadSafeRandom.Next(0, 22); weaponWeenie = LootTables.FinesseWeaponsMatrix[finesseWeaponsType][eleType]; switch (finesseWeaponsType) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(tier, 18); weaponOffense = GetMaxDamageMod(tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 3: case 4: case 5: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Dagger); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Dagger); if (finesseWeaponsType == 3 || finesseWeaponsType == 4) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); } break; case 6: case 7: case 8: case 9: case 10: weaponDefense = GetMaxDamageMod(tier, 22); weaponOffense = GetMaxDamageMod(tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); if (finesseWeaponsType == 9) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.Jitte); } break; case 11: case 12: weaponDefense = GetMaxDamageMod(tier, 15); weaponOffense = GetMaxDamageMod(tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 13: case 14: weaponDefense = GetMaxDamageMod(tier, 25); weaponOffense = GetMaxDamageMod(tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 15: case 16: case 17: case 18: case 19: case 20: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (finesseWeaponsType == 15) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 21: default: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; default: // Two handed wieldSkillType = Skill.TwoHandedCombat; int twoHandedWeaponsType = ThreadSafeRandom.Next(0, 11); weaponWeenie = LootTables.TwoHandedWeaponsMatrix[twoHandedWeaponsType][eleType]; damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Cleaving); damageVariance = GetVariance(wieldSkillType, LootWeaponType.TwoHanded); switch (twoHandedWeaponsType) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(tier, 20); weaponOffense = GetMaxDamageMod(tier, 20); break; case 3: case 4: case 5: case 6: weaponDefense = GetMaxDamageMod(tier, 22); weaponOffense = GetMaxDamageMod(tier, 18); break; case 7: weaponDefense = GetMaxDamageMod(tier, 18); weaponOffense = GetMaxDamageMod(tier, 22); break; case 8: case 9: case 10: default: weaponDefense = GetMaxDamageMod(tier, 15); weaponOffense = GetMaxDamageMod(tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spears); break; } break; } WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)weaponWeenie); if (wo == null) { return(null); } wo.SetProperty(PropertyInt.AppraisalLongDescDecoration, longDescDecoration); wo.SetProperty(PropertyString.LongDesc, wo.GetProperty(PropertyString.Name)); wo.SetProperty(PropertyInt.GemCount, gemCount); wo.SetProperty(PropertyInt.GemType, gemType); int materialType = GetMaterialType(wo, tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } wo.SetProperty(PropertyInt.ItemWorkmanship, workmanship); wo.SetProperty(PropertyInt.Damage, damage); wo.SetProperty(PropertyFloat.DamageVariance, damageVariance); wo.SetProperty(PropertyFloat.WeaponDefense, weaponDefense); wo.SetProperty(PropertyFloat.WeaponOffense, weaponOffense); wo.SetProperty(PropertyFloat.WeaponMissileDefense, missileD); wo.SetProperty(PropertyFloat.WeaponMagicDefense, magicD); if (wieldDiff > 0) { wo.SetProperty(PropertyInt.WieldDifficulty, wieldDiff); wo.SetProperty(PropertyInt.WieldRequirements, (int)wieldRequirments); wo.SetProperty(PropertyInt.WieldSkillType, (int)wieldSkillType); } else { wo.RemoveProperty(PropertyInt.WieldDifficulty); wo.RemoveProperty(PropertyInt.WieldRequirements); wo.RemoveProperty(PropertyInt.WieldSkillType); } if (isMagical) { wo.SetProperty(PropertyInt.UiEffects, (int)UiEffects.Magical); int numSpells = GetNumSpells(tier); int lowSpellTier = GetLowSpellTier(tier); int highSpellTier = GetHighSpellTier(tier); int minorCantrips = GetNumMinorCantrips(tier); int majorCantrips = GetNumMajorCantrips(tier); int epicCantrips = GetNumEpicCantrips(tier); int legendaryCantrips = GetNumLegendaryCantrips(tier); int numCantrips = minorCantrips + majorCantrips + epicCantrips + legendaryCantrips; int spellCraft = GetSpellcraft(numSpells, tier); int itemDifficulty = GetDifficulty(tier, spellCraft); int maxMana = GetMaxMana(numSpells, tier); wo.SetProperty(PropertyInt.ItemSpellcraft, spellCraft); wo.SetProperty(PropertyInt.ItemDifficulty, itemDifficulty); wo.SetProperty(PropertyInt.ItemMaxMana, maxMana); wo.SetProperty(PropertyInt.ItemCurMana, maxMana); wo.SetProperty(PropertyFloat.ManaRate, GetManaRate()); int[][] spells = LootTables.MeleeSpells; int[][] cantrips = LootTables.MeleeCantrips; int[] shuffledValues = new int[spells.Length]; for (int i = 0; i < spells.Length; i++) { shuffledValues[i] = i; } Shuffle(shuffledValues); if (numSpells - numCantrips > 0) { for (int a = 0; a < numSpells - numCantrips; a++) { int col = ThreadSafeRandom.Next(lowSpellTier - 1, highSpellTier - 1); int spellID = spells[shuffledValues[a]][col]; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } } if (numCantrips > 0) { shuffledValues = new int[cantrips.Length]; for (int i = 0; i < cantrips.Length; i++) { shuffledValues[i] = i; } Shuffle(shuffledValues); int shuffledPlace = 0; wo.SetProperty(PropertyInt.UiEffects, 1); //minor cantripps for (int a = 0; a < minorCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][0]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } //major cantrips for (int a = 0; a < majorCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][1]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } // epic cantrips for (int a = 0; a < epicCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][2]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } //legendary cantrips for (int a = 0; a < legendaryCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][3]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } } } else { wo.RemoveProperty(PropertyInt.ItemManaCost); wo.RemoveProperty(PropertyInt.ItemMaxMana); wo.RemoveProperty(PropertyInt.ItemCurMana); wo.RemoveProperty(PropertyInt.ItemSpellcraft); wo.RemoveProperty(PropertyInt.ItemDifficulty); } double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; wo = RandomizeColor(wo); return(wo); }
private static WorldObject CreateMissileWeapon(int tier, bool isMagical) { int[][] spells = LootTables.MissileSpells; int[][] cantrips = LootTables.MissileCantrips; ////Double Values double manaRate = -.04166667; ///done int weaponWeenie; int chance; int elemenatalBonus = 0; int wieldDifficulty = GetWield(tier, 1); if (tier < 4) { weaponWeenie = GetNonElementalMissileWeapon(); } else { chance = ThreadSafeRandom.Next(0, 1); switch (chance) { case 0: weaponWeenie = GetNonElementalMissileWeapon(); break; default: elemenatalBonus = GetElementalBonus(wieldDifficulty); weaponWeenie = GetElementalMissileWeapon(); break; } } WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)weaponWeenie); if (wo == null) { return(null); } int workmanship = GetWorkmanship(tier); wo.SetProperty(PropertyInt.ItemWorkmanship, workmanship); int materialType = GetMaterialType(wo, tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } wo.SetProperty(PropertyInt.GemCount, ThreadSafeRandom.Next(1, 5)); wo.SetProperty(PropertyInt.GemType, ThreadSafeRandom.Next(10, 50)); wo.SetProperty(PropertyString.LongDesc, wo.GetProperty(PropertyString.Name)); double meleeDMod = GetMeleeDMod(tier); if (meleeDMod > 0.0f) { wo.SetProperty(PropertyFloat.WeaponDefense, meleeDMod); } double missileDMod = GetMissileDMod(tier); if (missileDMod > 0.0f) { wo.SetProperty(PropertyFloat.WeaponMissileDefense, missileDMod); } // wo.SetProperty(PropertyFloat.WeaponMagicDefense, magicDefense); wo.SetProperty(PropertyFloat.DamageMod, GetMissileDamageMod(wieldDifficulty, wo.GetProperty(PropertyInt.WeaponType))); if (elemenatalBonus > 0) { wo.SetProperty(PropertyInt.ElementalDamageBonus, elemenatalBonus); } if (wieldDifficulty > 0) { wo.SetProperty(PropertyInt.WieldDifficulty, wieldDifficulty); wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.RawSkill); wo.SetProperty(PropertyInt.WieldSkillType, (int)Skill.MissileWeapons); } else { wo.RemoveProperty(PropertyInt.WieldDifficulty); wo.RemoveProperty(PropertyInt.WieldRequirements); wo.RemoveProperty(PropertyInt.WieldSkillType); } if (isMagical) { wo.SetProperty(PropertyInt.UiEffects, (int)UiEffects.Magical); wo.SetProperty(PropertyFloat.ManaRate, manaRate); int numSpells = GetNumSpells(tier); int spellCraft = GetSpellcraft(numSpells, tier); int lowSpellTier = GetLowSpellTier(tier); int highSpellTier = GetHighSpellTier(tier); int itemSkillLevelLimit = 0; int maxMana = GetMaxMana(numSpells, tier); wo.SetProperty(PropertyInt.ItemMaxMana, maxMana); wo.SetProperty(PropertyInt.ItemCurMana, maxMana); wo.SetProperty(PropertyInt.ItemSpellcraft, spellCraft); wo.SetProperty(PropertyInt.ItemDifficulty, GetDifficulty(tier, spellCraft)); wo.SetProperty(PropertyInt.ItemSkillLevelLimit, itemSkillLevelLimit); int[] shuffledValues = new int[spells.Length]; for (int i = 0; i < spells.Length; i++) { shuffledValues[i] = i; } Shuffle(shuffledValues); int minorCantrips = GetNumMinorCantrips(tier); int majorCantrips = GetNumMajorCantrips(tier); int epicCantrips = GetNumEpicCantrips(tier); int legendaryCantrips = GetNumLegendaryCantrips(tier); int numCantrips = minorCantrips + majorCantrips + epicCantrips + legendaryCantrips; if (numSpells - numCantrips > 0) { for (int a = 0; a < numSpells - numCantrips; a++) { int col = ThreadSafeRandom.Next(lowSpellTier - 1, highSpellTier - 1); int spellID = spells[shuffledValues[a]][col]; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } } if (numCantrips > 0) { shuffledValues = new int[cantrips.Length]; for (int i = 0; i < cantrips.Length; i++) { shuffledValues[i] = i; } Shuffle(shuffledValues); int shuffledPlace = 0; //minor cantripps for (int a = 0; a < minorCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][0]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } //major cantrips for (int a = 0; a < majorCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][1]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } // epic cantrips for (int a = 0; a < epicCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][2]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } //legendary cantrips for (int a = 0; a < legendaryCantrips; a++) { int spellID = cantrips[shuffledValues[shuffledPlace]][3]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } } } else { wo.RemoveProperty(PropertyInt.ItemManaCost); wo.RemoveProperty(PropertyInt.ItemMaxMana); wo.RemoveProperty(PropertyInt.ItemCurMana); wo.RemoveProperty(PropertyInt.ItemSpellcraft); wo.RemoveProperty(PropertyInt.ItemDifficulty); wo.RemoveProperty(PropertyFloat.ManaRate); } double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; wo = RandomizeColor(wo); return(wo); }
private static void MutateCaster(WorldObject wo, TreasureDeath profile, bool isMagical, int?wieldDifficulty = null) { if (wieldDifficulty != null) { // previous method var wieldRequirement = WieldRequirement.RawSkill; var wieldSkillType = Skill.None; double elementalDamageMod = 0; if (wieldDifficulty == 0) { if (profile.Tier > 6) { wieldRequirement = WieldRequirement.Level; wieldSkillType = Skill.Axe; // Set by examples from PCAP data wieldDifficulty = profile.Tier switch { 7 => 150, // In this instance, used for indicating player level, rather than skill level _ => 180, // In this instance, used for indicating player level, rather than skill level }; } } else { elementalDamageMod = RollElementalDamageMod(wieldDifficulty.Value); if (wo.W_DamageType == DamageType.Nether) { wieldSkillType = Skill.VoidMagic; } else { wieldSkillType = Skill.WarMagic; } } // ManaConversionMod var manaConversionMod = RollManaConversionMod(profile.Tier); if (manaConversionMod > 0.0f) { wo.ManaConversionMod = manaConversionMod; } // ElementalDamageMod if (elementalDamageMod > 1.0f) { wo.ElementalDamageMod = elementalDamageMod; } // WieldRequirements if (wieldDifficulty > 0 || wieldRequirement == WieldRequirement.Level) { wo.WieldRequirements = wieldRequirement; wo.WieldSkillType = (int)wieldSkillType; wo.WieldDifficulty = wieldDifficulty; } else { wo.WieldRequirements = WieldRequirement.Invalid; wo.WieldSkillType = null; wo.WieldDifficulty = null; } // WeaponDefense wo.WeaponDefense = RollWeaponDefense(wieldDifficulty.Value, profile); } else { // new method - mutation scripts // mutate ManaConversionMod var mutationFilter = MutationCache.GetMutation("Casters.caster.txt"); mutationFilter.TryMutate(wo, profile.Tier); // mutate ElementalDamageMod / WieldRequirements var isElemental = wo.W_DamageType != DamageType.Undef; var scriptName = GetCasterScript(isElemental); mutationFilter = MutationCache.GetMutation(scriptName); mutationFilter.TryMutate(wo, profile.Tier); // this part was not handled by mutation filter if (wo.WieldRequirements == WieldRequirement.RawSkill) { if (wo.W_DamageType == DamageType.Nether) { wo.WieldSkillType = (int)Skill.VoidMagic; } else { wo.WieldSkillType = (int)Skill.WarMagic; } } // mutate WeaponDefense mutationFilter = MutationCache.GetMutation("Casters.weapon_defense.txt"); mutationFilter.TryMutate(wo, profile.Tier); } // material type int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } // item color MutateColor(wo); // gem count / gem material if (wo.GemCode != null) { wo.GemCount = GemCountChance.Roll(wo.GemCode.Value, profile.Tier); } else { wo.GemCount = ThreadSafeRandom.Next(1, 5); } wo.GemType = RollGemType(profile.Tier); // workmanship wo.ItemWorkmanship = GetWorkmanship(profile.Tier); // burden? // item value wo.Value = GetValue(profile.Tier, wo.ItemWorkmanship.Value, LootTables.getMaterialValueModifier(wo), LootTables.getGemMaterialValueModifier(wo)); // missile defense / magic defense wo.WeaponMissileDefense = RollWeapon_MissileMagicDefense(profile.Tier); wo.WeaponMagicDefense = RollWeapon_MissileMagicDefense(profile.Tier); // spells if (!isMagical) { wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; } else { // if a caster was from a MagicItem profile, it always had a SpellDID MutateCaster_SpellDID(wo, profile); AssignMagic(wo, profile); } // long description wo.LongDesc = GetLongDesc(wo); }
private static WorldObject CreateJewelry(TreasureDeath profile, bool isMagical) { // 31% chance ring, 31% chance bracelet, 30% chance necklace 8% chance Trinket int jewelrySlot = ThreadSafeRandom.Next(1, 100); int jewelType; // Made this easier to read (switch -> if statement) if (jewelrySlot <= 31) { jewelType = LootTables.ringItems[ThreadSafeRandom.Next(0, LootTables.ringItems.Length - 1)]; } else if (jewelrySlot <= 62) { jewelType = LootTables.braceletItems[ThreadSafeRandom.Next(0, LootTables.braceletItems.Length - 1)]; } else if (jewelrySlot <= 92) { jewelType = LootTables.necklaceItems[ThreadSafeRandom.Next(0, LootTables.necklaceItems.Length - 1)]; } else { jewelType = LootTables.trinketItems[ThreadSafeRandom.Next(0, LootTables.trinketItems.Length - 1)]; } WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)jewelType); if (wo == null) { return(null); } wo.AppraisalLongDescDecoration = 1; wo.LongDesc = wo.Name; int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } int gemCount = ThreadSafeRandom.Next(1, 5); int gemType = ThreadSafeRandom.Next(10, 50); wo.GemCount = gemCount; wo.GemType = (MaterialType)gemType; int workmanship = GetWorkmanship(profile.Tier); double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(profile.Tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; wo.ItemWorkmanship = workmanship; wo.ItemSkillLevelLimit = null; if (profile.Tier > 6) { wo.WieldRequirements = WieldRequirement.Level; wo.WieldSkillType = (int)Skill.Axe; // Set by examples from PCAP data var wield = profile.Tier switch { 7 => 150, // In this instance, used for indicating player level, rather than skill level _ => 180, // In this instance, used for indicating player level, rather than skill level }; wo.WieldDifficulty = wield; } if (isMagical) { wo = AssignMagic(wo, profile); } else { wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; wo.ManaRate = null; } wo = RandomizeColor(wo); return(wo); }
private static bool MutateMeleeWeapon(WorldObject wo, TreasureDeath profile, bool isMagical) { if (!(wo is MeleeWeapon)) { return(false); } Skill wieldSkillType = wo.WeaponSkill; int damage = 0; double damageVariance = 0; double weaponDefense = 0; double weaponOffense = 0; // Properties for weapons double magicD = GetMagicMissileDMod(profile.Tier); double missileD = GetMagicMissileDMod(profile.Tier); int gemCount = 0; if (wo.GemCode != null) { gemCount = GemCountChance.Roll(wo.GemCode.Value, profile.Tier); } else { gemCount = ThreadSafeRandom.Next(1, 5); } MaterialType gemType = RollGemType(profile.Tier); int workmanship = GetWorkmanship(profile.Tier); int wieldDiff = GetWieldDifficulty(profile.Tier, WieldType.MeleeWeapon); WieldRequirement wieldRequirments = WieldRequirement.RawSkill; // Weapon Types // 0 = Heavy // 1 = Light // 2 = Finesse // default = Two Handed switch (wieldSkillType) { case Skill.HeavyWeapons: switch (wo.W_WeaponType) { case WeaponType.Axe: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case WeaponType.Dagger: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Dagger); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Dagger); if (wo.W_AttackType.IsMultiStrike()) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); } break; case WeaponType.Mace: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); break; case WeaponType.Spear: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case WeaponType.Staff: weaponDefense = GetMaxDamageMod(profile.Tier, 25); weaponOffense = GetMaxDamageMod(profile.Tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case WeaponType.Sword: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (wo.W_AttackType.IsMultiStrike()) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case WeaponType.Unarmed: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; default: return(false); } break; case Skill.LightWeapons: switch (wo.W_WeaponType) { case WeaponType.Axe: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case WeaponType.Dagger: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); if (!wo.W_AttackType.IsMultiStrike()) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Dagger); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Dagger); } break; case WeaponType.Mace: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); break; case WeaponType.Spear: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case WeaponType.Staff: weaponDefense = GetMaxDamageMod(profile.Tier, 25); weaponOffense = GetMaxDamageMod(profile.Tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case WeaponType.Sword: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (wo.W_AttackType.IsMultiStrike()) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case WeaponType.Unarmed: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; default: return(false); } break; case Skill.FinesseWeapons: switch (wo.W_WeaponType) { case WeaponType.Axe: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case WeaponType.Dagger: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Dagger); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Dagger); if (wo.W_AttackType.IsMultiStrike()) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); } break; case WeaponType.Mace: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); if (wo.TsysMutationData == 101188610) // Unique data to the five Jitte wcids for lootgen, within WeaponType.Mace class weapons { weaponDefense = GetMaxDamageMod(profile.Tier, 25); weaponOffense = GetMaxDamageMod(profile.Tier, 15); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Jitte); } break; case WeaponType.Spear: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case WeaponType.Staff: weaponDefense = GetMaxDamageMod(profile.Tier, 25); weaponOffense = GetMaxDamageMod(profile.Tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case WeaponType.Sword: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (wo.W_AttackType.IsMultiStrike()) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case WeaponType.Unarmed: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; default: return(false); } break; case Skill.TwoHandedCombat: if (wo.IsCleaving) { weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Cleaving); damageVariance = GetVariance(wieldSkillType, LootWeaponType.TwoHanded); } else { weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spears); damageVariance = GetVariance(wieldSkillType, LootWeaponType.TwoHanded); } break; default: return(false); } wo.LongDesc = wo.Name; // GemTypes, Material, Workmanship wo.GemCount = gemCount; wo.GemType = gemType; int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } wo.ItemWorkmanship = workmanship; // Burden MutateBurden(wo, profile.Tier, true); // Weapon Stats wo.Damage = damage; wo.DamageVariance = damageVariance; wo.WeaponDefense = weaponDefense; wo.WeaponOffense = weaponOffense; wo.WeaponMissileDefense = missileD; wo.WeaponMagicDefense = magicD; // Adding Wield Reqs if required if (wieldDiff > 0) { wo.WieldDifficulty = wieldDiff; wo.WieldRequirements = wieldRequirments; wo.WieldSkillType = (int)wieldSkillType; } else { // If no wield, remove wield reqs wo.WieldDifficulty = null; wo.WieldRequirements = WieldRequirement.Invalid; wo.WieldSkillType = null; } // Adding Magic Spells if (isMagical) { wo = AssignMagic(wo, profile); } else { // If no spells remove magic properites wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; } double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(profile.Tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; RandomizeColor(wo); return(true); }
private static void MutateMissileWeapon(WorldObject wo, TreasureDeath profile, bool isMagical, int wieldDifficulty, bool isElemental) { int elemenatalBonus = 0; if (isElemental) { elemenatalBonus = GetElementalBonus(wieldDifficulty); } // Item Basics wo.ItemWorkmanship = GetWorkmanship(profile.Tier); int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } wo.GemCount = ThreadSafeRandom.Next(1, 5); wo.GemType = (MaterialType)ThreadSafeRandom.Next(10, 50); wo.LongDesc = wo.Name; wo.AppraisalLongDescDecoration = AppraisalLongDescDecorations.PrependWorkmanship | AppraisalLongDescDecorations.AppendGemInfo; // Burden MutateBurden(wo, profile.Tier, true); // MeleeD/MagicD/Missile Bonus wo.WeaponMagicDefense = GetMagicMissileDMod(profile.Tier); wo.WeaponMissileDefense = GetMagicMissileDMod(profile.Tier); double meleeDMod = GetWieldReqMeleeDMod(wieldDifficulty, profile); if (meleeDMod > 0.0f) { wo.WeaponDefense = meleeDMod; } // Damage wo.DamageMod = GetMissileDamageMod(wieldDifficulty, wo.GetProperty(PropertyInt.WeaponType)); if (elemenatalBonus > 0) { wo.ElementalDamageBonus = elemenatalBonus; } // Wields if (wieldDifficulty > 0) { wo.WieldDifficulty = wieldDifficulty; wo.WieldRequirements = WieldRequirement.RawSkill; wo.WieldSkillType = (int)Skill.MissileWeapons; } else { wo.WieldDifficulty = null; wo.WieldRequirements = WieldRequirement.Invalid; wo.WieldSkillType = null; } // Magic if (isMagical) { wo = AssignMagic(wo, profile); } else { wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; wo.ManaRate = null; } // Material/Value/Color double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(profile.Tier, (int)wo.Workmanship, gemMaterialMod, materialMod); wo.Value = value; RandomizeColor(wo); }
private static WorldObject CreateMissileWeapon(int tier, bool isMagical) { int weaponWeenie; int chance; int elemenatalBonus = 0; int wieldDifficulty = GetWield(tier, 1); if (tier < 4) { weaponWeenie = GetNonElementalMissileWeapon(); } else { chance = ThreadSafeRandom.Next(0, 1); switch (chance) { case 0: weaponWeenie = GetNonElementalMissileWeapon(); break; default: elemenatalBonus = GetElementalBonus(wieldDifficulty); weaponWeenie = GetElementalMissileWeapon(); break; } } WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)weaponWeenie); if (wo == null) { return(null); } int workmanship = GetWorkmanship(tier); wo.SetProperty(PropertyInt.ItemWorkmanship, workmanship); int materialType = GetMaterialType(wo, tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } wo.SetProperty(PropertyInt.GemCount, ThreadSafeRandom.Next(1, 5)); wo.SetProperty(PropertyInt.GemType, ThreadSafeRandom.Next(10, 50)); wo.SetProperty(PropertyString.LongDesc, wo.GetProperty(PropertyString.Name)); double meleeDMod = GetMeleeDMod(tier); if (meleeDMod > 0.0f) { wo.SetProperty(PropertyFloat.WeaponDefense, meleeDMod); } double missileDMod = GetMissileDMod(tier); if (missileDMod > 0.0f) { wo.SetProperty(PropertyFloat.WeaponMissileDefense, missileDMod); } // wo.SetProperty(PropertyFloat.WeaponMagicDefense, magicDefense); wo.SetProperty(PropertyFloat.DamageMod, GetMissileDamageMod(wieldDifficulty, wo.GetProperty(PropertyInt.WeaponType))); if (elemenatalBonus > 0) { wo.SetProperty(PropertyInt.ElementalDamageBonus, elemenatalBonus); } if (wieldDifficulty > 0) { wo.SetProperty(PropertyInt.WieldDifficulty, wieldDifficulty); wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.RawSkill); wo.SetProperty(PropertyInt.WieldSkillType, (int)Skill.MissileWeapons); } else { wo.RemoveProperty(PropertyInt.WieldDifficulty); wo.RemoveProperty(PropertyInt.WieldRequirements); wo.RemoveProperty(PropertyInt.WieldSkillType); } if (isMagical) { wo = AssignMagic(wo, tier); } else { wo.RemoveProperty(PropertyInt.ItemManaCost); wo.RemoveProperty(PropertyInt.ItemMaxMana); wo.RemoveProperty(PropertyInt.ItemCurMana); wo.RemoveProperty(PropertyInt.ItemSpellcraft); wo.RemoveProperty(PropertyInt.ItemDifficulty); wo.RemoveProperty(PropertyFloat.ManaRate); } double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; wo = RandomizeColor(wo); return(wo); }
private static WorldObject CreateJewelry(int tier, bool isMagical) { int[][] JewelrySpells = LootTables.JewelrySpells; int[][] JewelryCantrips = LootTables.JewelryCantrips; int[] jewelryItems = { 621, 295, 297, 294, 623, 622 }; int jewelType = jewelryItems[ThreadSafeRandom.Next(0, jewelryItems.Length - 1)]; //int rank = 0; //int skill_level_limit = 0; WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)jewelType); if (wo == null) { return(null); } wo.SetProperty(PropertyInt.AppraisalLongDescDecoration, 1); wo.SetProperty(PropertyString.LongDesc, wo.GetProperty(PropertyString.Name)); int materialType = GetMaterialType(wo, tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } int gemCount = ThreadSafeRandom.Next(1, 5); int gemType = ThreadSafeRandom.Next(10, 50); wo.SetProperty(PropertyInt.GemCount, gemCount); wo.SetProperty(PropertyInt.GemType, gemType); int workmanship = GetWorkmanship(tier); double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; wo.SetProperty(PropertyInt.ItemWorkmanship, workmanship); wo.RemoveProperty(PropertyInt.ItemSkillLevelLimit); if (tier > 6) { int wield; wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.Level); wo.SetProperty(PropertyInt.WieldSkillType, (int)Skill.Axe); // Set by examples from PCAP data switch (tier) { case 7: wield = 150; // In this instance, used for indicating player level, rather than skill level break; default: wield = 180; // In this instance, used for indicating player level, rather than skill level break; } wo.SetProperty(PropertyInt.WieldDifficulty, wield); } if (isMagical) { wo.SetProperty(PropertyInt.UiEffects, (int)UiEffects.Magical); int numSpells = GetNumSpells(tier); int spellcraft = GetSpellcraft(numSpells, tier); int maxMana = GetMaxMana(numSpells, tier); wo.SetProperty(PropertyFloat.ManaRate, GetManaRate()); wo.SetProperty(PropertyInt.ItemMaxMana, maxMana); wo.SetProperty(PropertyInt.ItemCurMana, maxMana); wo.SetProperty(PropertyInt.ItemSpellcraft, spellcraft); int difficulty = GetDifficulty(tier, spellcraft); wo.SetProperty(PropertyInt.ItemDifficulty, difficulty); int minorCantrips = GetNumMinorCantrips(tier); int majorCantrips = GetNumMajorCantrips(tier); int epicCantrips = GetNumEpicCantrips(tier); int legendaryCantrips = GetNumLegendaryCantrips(tier); int numCantrips = minorCantrips + majorCantrips + epicCantrips + legendaryCantrips; if (numCantrips > 10) { minorCantrips = 0; } int[] shuffledValues = new int[JewelrySpells.Length]; for (int i = 0; i < JewelrySpells.Length; i++) { shuffledValues[i] = i; } Shuffle(shuffledValues); int lowSpellTier = GetLowSpellTier(tier); int highSpellTier = GetHighSpellTier(tier); if (numSpells - numCantrips > 0) { for (int a = 0; a < numSpells - numCantrips; a++) { int col = ThreadSafeRandom.Next(lowSpellTier - 1, highSpellTier - 1); int spellID = JewelrySpells[shuffledValues[a]][col]; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } } if (numCantrips > 0) { shuffledValues = new int[JewelryCantrips.Length]; for (int i = 0; i < JewelryCantrips.Length; i++) { shuffledValues[i] = i; } Shuffle(shuffledValues); int shuffledPlace = 0; //minor cantripps for (int a = 0; a < minorCantrips; a++) { int spellID = JewelryCantrips[shuffledValues[shuffledPlace]][0]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } //major cantrips for (int a = 0; a < majorCantrips; a++) { int spellID = JewelryCantrips[shuffledValues[shuffledPlace]][1]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } // epic cantrips for (int a = 0; a < epicCantrips; a++) { int spellID = JewelryCantrips[shuffledValues[shuffledPlace]][2]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } //legendary cantrips for (int a = 0; a < legendaryCantrips; a++) { int spellID = JewelryCantrips[shuffledValues[shuffledPlace]][3]; shuffledPlace++; wo.Biota.GetOrAddKnownSpell(spellID, wo.BiotaDatabaseLock, wo.BiotaPropertySpells, out _); } } } else { wo.RemoveProperty(PropertyInt.ItemManaCost); wo.RemoveProperty(PropertyInt.ItemMaxMana); wo.RemoveProperty(PropertyInt.ItemCurMana); wo.RemoveProperty(PropertyInt.ItemSpellcraft); wo.RemoveProperty(PropertyInt.ItemDifficulty); wo.RemoveProperty(PropertyFloat.ManaRate); } return(wo); }
private static WorldObject CreateCaster(int tier, bool isMagical) { int casterWeenie = 0; //done double elementalDamageMod = 0; Skill wieldSkillType = Skill.None; WieldRequirement wieldRequirement = WieldRequirement.RawSkill; int subType = 0; int wield = GetWield(tier, 2); ////Getting the caster Weenie needed. if (wield == 0) { // Determine plain caster type: 0 - Orb, 1 - Sceptre, 2 - Staff, 3 - Wand subType = ThreadSafeRandom.Next(0, 3); casterWeenie = LootTables.CasterWeaponsMatrix[wield][subType]; if (tier > 6) { wieldRequirement = WieldRequirement.Level; wieldSkillType = Skill.Axe; // Set by examples from PCAP data switch (tier) { case 7: wield = 150; // In this instance, used for indicating player level, rather than skill level break; default: wield = 180; // In this instance, used for indicating player level, rather than skill level break; } } } else { // Determine the Elemental Damage Mod amount elementalDamageMod = GetMaxDamageMod(tier, 18); // Determine caster type: 1 - Sceptre, 2 - Baton, 3 - Staff int casterType = ThreadSafeRandom.Next(1, 3); // Determine element type: 0 - Slashing, 1 - Piercing, 2 - Blunt, 3 - Frost, 4 - Fire, 5 - Acid, 6 - Electric, 7 - Nether int element = ThreadSafeRandom.Next(0, 7); casterWeenie = LootTables.CasterWeaponsMatrix[casterType][element]; // If element is Nether, Void Magic is required, else War Magic is required for all other elements if (element == 7) { wieldSkillType = Skill.VoidMagic; } else { wieldSkillType = Skill.WarMagic; } } WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)casterWeenie); if (wo == null) { return(null); } int workmanship = GetWorkmanship(tier); wo.SetProperty(PropertyInt.ItemWorkmanship, workmanship); int materialType = GetMaterialType(wo, tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } wo.SetProperty(PropertyInt.MaterialType, GetMaterialType(wo, tier)); wo.SetProperty(PropertyInt.GemCount, ThreadSafeRandom.Next(1, 5)); wo.SetProperty(PropertyInt.GemType, ThreadSafeRandom.Next(10, 50)); wo.SetProperty(PropertyString.LongDesc, wo.GetProperty(PropertyString.Name)); double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; if (ThreadSafeRandom.Next(0, 100) > 95) { double missileDMod = GetMissileDMod(tier); if (missileDMod > 0.0f) { wo.SetProperty(PropertyFloat.WeaponMissileDefense, missileDMod); } } else { double meleeDMod = GetMeleeDMod(tier); if (meleeDMod > 0.0f) { wo.SetProperty(PropertyFloat.WeaponDefense, meleeDMod); } } double manaConMod = GetManaCMod(tier); if (manaConMod > 0.0f) { wo.SetProperty(PropertyFloat.ManaConversionMod, manaConMod); } if (elementalDamageMod > 1.0f) { wo.SetProperty(PropertyFloat.ElementalDamageMod, elementalDamageMod); } if (wield > 0 || wieldRequirement == WieldRequirement.Level) { wo.SetProperty(PropertyInt.WieldRequirements, (int)wieldRequirement); wo.SetProperty(PropertyInt.WieldSkillType, (int)wieldSkillType); wo.SetProperty(PropertyInt.WieldDifficulty, wield); } else { wo.RemoveProperty(PropertyInt.WieldRequirements); wo.RemoveProperty(PropertyInt.WieldSkillType); wo.RemoveProperty(PropertyInt.WieldDifficulty); } wo.RemoveProperty(PropertyInt.ItemSkillLevelLimit); if (isMagical) { wo = AssignMagic(wo, tier); } else { wo.RemoveProperty(PropertyInt.ItemManaCost); wo.RemoveProperty(PropertyInt.ItemMaxMana); wo.RemoveProperty(PropertyInt.ItemCurMana); wo.RemoveProperty(PropertyInt.ItemSpellcraft); wo.RemoveProperty(PropertyInt.ItemDifficulty); } wo = RandomizeColor(wo); return(wo); }
private static void MutateMissileWeapon(WorldObject wo, TreasureDeath profile, bool isMagical, int?wieldDifficulty = null, TreasureWeaponType?weaponType = null) { if (wieldDifficulty != null) { // previous method // DamageMod wo.DamageMod = GetMissileDamageMod(wieldDifficulty.Value, wo.W_WeaponType); // ElementalDamageBonus if (wo.W_DamageType != DamageType.Undef) { int elementalBonus = GetElementalDamageBonus(wieldDifficulty.Value); if (elementalBonus > 0) { wo.ElementalDamageBonus = elementalBonus; } } // Wield Requirements if (wieldDifficulty > 0) { wo.WieldDifficulty = wieldDifficulty; wo.WieldRequirements = WieldRequirement.RawSkill; wo.WieldSkillType = (int)Skill.MissileWeapons; } else { wo.WieldDifficulty = null; wo.WieldRequirements = WieldRequirement.Invalid; wo.WieldSkillType = null; } // WeaponDefense var meleeDMod = RollWeaponDefense(wieldDifficulty.Value, profile); if (meleeDMod > 0.0f) { wo.WeaponDefense = meleeDMod; } } else if (weaponType != null) { // new method / mutation scripts var isElemental = wo.W_DamageType != DamageType.Undef; var scriptName = GetMissileScript(weaponType.Value, isElemental); // mutate DamageMod / ElementalDamageBonus / WieldRequirements var mutationFilter = MutationCache.GetMutation(scriptName); mutationFilter.TryMutate(wo, profile.Tier); // mutate WeaponDefense mutationFilter = MutationCache.GetMutation("MissileWeapons.weapon_defense.txt"); mutationFilter.TryMutate(wo, profile.Tier); } else { log.Warn($"LootGenerationFactory_Missile.MutateMissileWeapon({wo.Name}, {profile.TreasureType}, {isMagical}, {wieldDifficulty}, {weaponType}) - unexpected: WieldDifficulty and WeaponType are both null!"); } // weapon speed if (wo.WeaponTime != null) { var weaponSpeedMod = RollWeaponSpeedMod(profile); wo.WeaponTime = (int)(wo.WeaponTime * weaponSpeedMod); } // material type int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } // item color MutateColor(wo); // gem count / gem material if (wo.GemCode != null) { wo.GemCount = GemCountChance.Roll(wo.GemCode.Value, profile.Tier); } else { wo.GemCount = ThreadSafeRandom.Next(1, 5); } wo.GemType = RollGemType(profile.Tier); // workmanship wo.ItemWorkmanship = GetWorkmanship(profile.Tier); // burden MutateBurden(wo, profile, true); // item value var materialMod = LootTables.getMaterialValueModifier(wo); var gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); wo.Value = GetValue(profile.Tier, (int)wo.Workmanship, gemMaterialMod, materialMod); // missile / magic defense wo.WeaponMissileDefense = RollWeapon_MissileMagicDefense(profile.Tier); wo.WeaponMagicDefense = RollWeapon_MissileMagicDefense(profile.Tier); // spells if (!isMagical) { wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; wo.ManaRate = null; } else { AssignMagic(wo, profile); } // long description wo.LongDesc = GetLongDesc(wo); }
private static WorldObject CreateArmor(TreasureDeath profile, bool isMagical, bool isArmor, LootBias lootBias = LootBias.UnBiased) { var minType = LootTables.ArmorType.Helms; var maxType = new LootTables.ArmorType(); switch (profile.Tier) { case 1: default: maxType = LootTables.ArmorType.ChainmailArmor; break; case 2: maxType = LootTables.ArmorType.DiforsaArmor; break; case 3: case 4: maxType = LootTables.ArmorType.CovenantArmor; break; case 5: maxType = LootTables.ArmorType.AlduressaArmor; break; case 6: maxType = LootTables.ArmorType.HaebreanArmor; break; case 7: case 8: maxType = LootTables.ArmorType.OlthoiAlduressaArmor; break; } // Added for making clothing drops their own drop, and not involved in armor roll chance LootTables.ArmorType armorType; if (isArmor == true) { armorType = (LootTables.ArmorType)ThreadSafeRandom.Next((int)minType, (int)maxType); } else { armorType = LootTables.ArmorType.MiscClothing; } int[] table = LootTables.GetLootTable(armorType); int rng = ThreadSafeRandom.Next(0, table.Length - 1); int armorWeenie = table[rng]; WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)armorWeenie); if (wo == null) { return(null); } wo.SetProperty(PropertyString.LongDesc, wo.GetProperty(PropertyString.Name)); wo.SetProperty(PropertyInt.AppraisalItemSkill, 7); wo.SetProperty(PropertyInt.AppraisalLongDescDecoration, 1); int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } int gemCount = ThreadSafeRandom.Next(1, 6); int gemType = ThreadSafeRandom.Next(10, 50); wo.SetProperty(PropertyInt.GemCount, gemCount); wo.SetProperty(PropertyInt.GemType, gemType); int workmanship = GetWorkmanship(profile.Tier); wo.SetProperty(PropertyInt.ItemWorkmanship, workmanship); double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(profile.Tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; int wield; if (profile.Tier > 6 && armorType != LootTables.ArmorType.CovenantArmor) { wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.Level); wo.SetProperty(PropertyInt.WieldSkillType, (int)Skill.Axe); // Set by examples from PCAP data wield = profile.Tier switch { 7 => 150, // In this instance, used for indicating player level, rather than skill level _ => 180, // In this instance, used for indicating player level, rather than skill level }; wo.SetProperty(PropertyInt.WieldDifficulty, wield); } if (armorType == LootTables.ArmorType.CovenantArmor) { int chance = ThreadSafeRandom.Next(1, 3); var wieldSkill = chance switch { // Magic Def 1 => Skill.MagicDefense, // Missile Def 2 => Skill.MissileDefense, // Melee Def _ => Skill.MeleeDefense, }; wield = GetCovenantWieldReq(profile.Tier, wieldSkill); wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.RawSkill); wo.SetProperty(PropertyInt.WieldSkillType, (int)wieldSkill); wo.SetProperty(PropertyInt.WieldDifficulty, wield); } // Setting random color wo.SetProperty(PropertyInt.PaletteTemplate, ThreadSafeRandom.Next(1, 2047)); double shade = .1 * ThreadSafeRandom.Next(0, 9); wo.SetProperty(PropertyFloat.Shade, shade); wo = AssignArmorLevel(wo, profile.Tier, armorType); wo = AssignEquipmentSetId(wo, profile); if (isMagical) { bool covenantArmor = false || (armorType == LootTables.ArmorType.CovenantArmor || armorType == LootTables.ArmorType.OlthoiArmor); wo = AssignMagic(wo, profile, covenantArmor); } else { wo.RemoveProperty(PropertyInt.ItemManaCost); wo.RemoveProperty(PropertyInt.ItemMaxMana); wo.RemoveProperty(PropertyInt.ItemCurMana); wo.RemoveProperty(PropertyInt.ItemSpellcraft); wo.RemoveProperty(PropertyInt.ItemDifficulty); } wo = RandomizeColor(wo); return(wo); }
private static WorldObject CreateArmor(int tier, bool isMagical, LootBias lootBias = LootBias.UnBiased) { var minType = LootTables.ArmorType.MiscClothing; var maxType = new LootTables.ArmorType(); switch (tier) { case 1: default: maxType = LootTables.ArmorType.ChainmailArmor; break; case 2: maxType = LootTables.ArmorType.DiforsaArmor; break; case 3: case 4: maxType = LootTables.ArmorType.CovenantArmor; break; case 5: maxType = LootTables.ArmorType.AlduressaArmor; break; case 6: maxType = LootTables.ArmorType.HaebreanArmor; break; case 7: case 8: maxType = LootTables.ArmorType.OlthoiAlduressaArmor; // armor Mana Forge Chests don't include clothing type items if (lootBias == LootBias.Armor) { minType = LootTables.ArmorType.Helms; } break; } var armorType = (LootTables.ArmorType)ThreadSafeRandom.Next((int)minType, (int)maxType); int[] table = LootTables.GetLootTable(armorType); int rng = ThreadSafeRandom.Next(0, table.Length - 1); int armorWeenie = table[rng]; WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)armorWeenie); if (wo == null) { return(null); } wo.SetProperty(PropertyString.LongDesc, wo.GetProperty(PropertyString.Name)); wo.SetProperty(PropertyInt.AppraisalItemSkill, 7); wo.SetProperty(PropertyInt.AppraisalLongDescDecoration, 1); int materialType = GetMaterialType(wo, tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } int gemCount = ThreadSafeRandom.Next(1, 6); int gemType = ThreadSafeRandom.Next(10, 50); wo.SetProperty(PropertyInt.GemCount, gemCount); wo.SetProperty(PropertyInt.GemType, gemType); int workmanship = GetWorkmanship(tier); wo.SetProperty(PropertyInt.ItemWorkmanship, workmanship); double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; int wield; if (tier > 6 && armorType != LootTables.ArmorType.CovenantArmor) { wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.Level); wo.SetProperty(PropertyInt.WieldSkillType, (int)Skill.Axe); // Set by examples from PCAP data switch (tier) { case 7: wield = 150; // In this instance, used for indicating player level, rather than skill level break; default: wield = 180; // In this instance, used for indicating player level, rather than skill level break; } wo.SetProperty(PropertyInt.WieldDifficulty, wield); } if (armorType == LootTables.ArmorType.CovenantArmor) { Skill wieldSkill; int chance = ThreadSafeRandom.Next(1, 3); switch (chance) { case 1: // Magic Def wieldSkill = Skill.MagicDefense; break; case 2: // Missile Def wieldSkill = Skill.MissileDefense; break; default: // Melee Def wieldSkill = Skill.MeleeDefense; break; } wield = GetCovenantWieldReq(tier, wieldSkill); wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.RawSkill); wo.SetProperty(PropertyInt.WieldSkillType, (int)wieldSkill); wo.SetProperty(PropertyInt.WieldDifficulty, wield); } // Setting random color wo.SetProperty(PropertyInt.PaletteTemplate, ThreadSafeRandom.Next(1, 2047)); double shade = .1 * ThreadSafeRandom.Next(0, 9); wo.SetProperty(PropertyFloat.Shade, shade); wo = AssignArmorLevel(wo, tier, armorType); wo = AssignEquipmentSetId(wo, tier); if (isMagical) { wo = AssignMagic(wo, tier); } else { wo.RemoveProperty(PropertyInt.ItemManaCost); wo.RemoveProperty(PropertyInt.ItemMaxMana); wo.RemoveProperty(PropertyInt.ItemCurMana); wo.RemoveProperty(PropertyInt.ItemSpellcraft); wo.RemoveProperty(PropertyInt.ItemDifficulty); } wo = RandomizeColor(wo); return(wo); }
/// <summary> /// Creates Caster (Wand, Staff, Orb) /// </summary> public static WorldObject CreateCaster(int tier, bool isMagical, int wield = -1, bool forceWar = false) { // Refactored 11/20/19 - HarliQ int casterWeenie = 0; double elementalDamageMod = 0; Skill wieldSkillType = Skill.None; WieldRequirement wieldRequirement = WieldRequirement.RawSkill; int subType = 0; if (wield == -1) { wield = GetWield(tier, 2); } // Getting the caster Weenie needed. if (wield == 0) { // Determine plain caster type: 0 - Orb, 1 - Sceptre, 2 - Staff, 3 - Wand subType = ThreadSafeRandom.Next(0, 3); casterWeenie = LootTables.CasterWeaponsMatrix[wield][subType]; if (tier > 6) { wieldRequirement = WieldRequirement.Level; wieldSkillType = Skill.Axe; // Set by examples from PCAP data switch (tier) { case 7: wield = 150; // In this instance, used for indicating player level, rather than skill level break; default: wield = 180; // In this instance, used for indicating player level, rather than skill level break; } } } else { // Determine the Elemental Damage Mod amount elementalDamageMod = DetermineElementMod(wield); // Determine caster type: 1 - Sceptre, 2 - Baton, 3 - Staff int casterType = ThreadSafeRandom.Next(1, 3); // Determine element type: 0 - Slashing, 1 - Piercing, 2 - Blunt, 3 - Frost, 4 - Fire, 5 - Acid, 6 - Electric, 7 - Nether int element = forceWar ? ThreadSafeRandom.Next(0, 6) : ThreadSafeRandom.Next(0, 7); casterWeenie = LootTables.CasterWeaponsMatrix[casterType][element]; // If element is Nether, Void Magic is required, else War Magic is required for all other elements if (element == 7) { wieldSkillType = Skill.VoidMagic; } else { wieldSkillType = Skill.WarMagic; } } WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)casterWeenie); // Why is this here? Should not get a null object if (wo == null) { return(null); } // Setting MagicD and MissileD Bonuses to null (some weenies have a value) wo.WeaponMagicDefense = null; wo.WeaponMissileDefense = null; // Not sure why this is here, guessing some wienies have it by default wo.ItemSkillLevelLimit = null; // Setting general traits of weapon wo.ItemWorkmanship = GetWorkmanship(tier); int materialType = GetMaterialType(wo, tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } wo.GemCount = ThreadSafeRandom.Next(1, 5); wo.GemType = (MaterialType)ThreadSafeRandom.Next(10, 50); wo.Value = GetValue(tier, wo.ItemWorkmanship.Value, LootTables.getMaterialValueModifier(wo), LootTables.getGemMaterialValueModifier(wo)); // Is this right?? wo.LongDesc = wo.Name; // Setting Weapon defensive mods wo.WeaponDefense = GetWieldReqMeleeDMod(wield); wo.WeaponMagicDefense = GetMagicMissileDMod(tier); wo.WeaponMissileDefense = GetMagicMissileDMod(tier); // Setting weapon Offensive Mods if (elementalDamageMod > 1.0f) { wo.ElementalDamageMod = elementalDamageMod; } // Setting Wield Reqs for weapon if (wield > 0 || wieldRequirement == WieldRequirement.Level) { wo.WieldRequirements = wieldRequirement; wo.WieldSkillType = (int)wieldSkillType; wo.WieldDifficulty = wield; } else { wo.WieldRequirements = WieldRequirement.Invalid; wo.WieldSkillType = null; wo.WieldDifficulty = null; } // Adjusting Properties if weapon has magic (spells) double manaConMod = GetManaCMod(tier); if (manaConMod > 0.0f) { wo.ManaConversionMod = manaConMod; } if (isMagical) { wo = AssignMagic(wo, tier); } else { wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; } wo = RandomizeColor(wo); return(wo); }
private static WorldObject CreateArmor(int tier, bool isMagical, LootBias lootBias = LootBias.UnBiased) { int equipSetId = 0; int materialType = 0; int armorPiece = 0; int armorType = 0; int armorWeenie = 0; switch (tier) { case 1: armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.ChainmailArmor); break; case 2: armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.DiforsaArmor); break; case 3: armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.CovenantArmor); break; case 4: armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.CovenantArmor); break; case 5: armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.AlduressaArmor); break; case 6: armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.HaebreanArmor); break; case 7: armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.OlthoiAlduressaArmor); break; default: if (lootBias == LootBias.Armor) // Armor Mana Forge Chests don't include clothing type items { armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.Helms, (int)LootTables.ArmorType.OlthoiAlduressaArmor); } else { armorType = ThreadSafeRandom.Next((int)LootTables.ArmorType.MiscClothing, (int)LootTables.ArmorType.OlthoiAlduressaArmor); } break; } switch (armorType) { case (int)LootTables.ArmorType.MiscClothing: armorPiece = ThreadSafeRandom.Next(0, 47); armorWeenie = LootTables.MiscClothing[armorPiece]; break; case (int)LootTables.ArmorType.Helms: armorPiece = ThreadSafeRandom.Next(0, 8); armorWeenie = LootTables.Helms[armorPiece]; break; case (int)LootTables.ArmorType.Shields: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.Shields[armorPiece]; break; case (int)LootTables.ArmorType.LeatherArmor: armorPiece = ThreadSafeRandom.Next(0, 15); armorWeenie = LootTables.LeatherArmor[armorPiece]; break; case (int)LootTables.ArmorType.StuddedLeatherArmor: armorPiece = ThreadSafeRandom.Next(0, 14); armorWeenie = LootTables.StuddedLeatherArmor[armorPiece]; break; case (int)LootTables.ArmorType.ChainmailArmor: armorPiece = ThreadSafeRandom.Next(0, 12); armorWeenie = LootTables.ChainmailArmor[armorPiece]; break; case (int)LootTables.ArmorType.PlatemailArmor: armorPiece = ThreadSafeRandom.Next(0, 10); armorWeenie = LootTables.PlatemailArmor[armorPiece]; break; case (int)LootTables.ArmorType.ScalemailArmor: armorPiece = ThreadSafeRandom.Next(0, 13); armorWeenie = LootTables.ScalemailArmor[armorPiece]; break; case (int)LootTables.ArmorType.YoroiArmor: armorPiece = ThreadSafeRandom.Next(0, 7); armorWeenie = LootTables.YoroiArmor[armorPiece]; break; case (int)LootTables.ArmorType.DiforsaArmor: armorPiece = ThreadSafeRandom.Next(0, 12); armorWeenie = LootTables.DiforsaArmor[armorPiece]; break; case (int)LootTables.ArmorType.CeldonArmor: armorPiece = ThreadSafeRandom.Next(0, 3); armorWeenie = LootTables.CeldonArmor[armorPiece]; break; case (int)LootTables.ArmorType.AmuliArmor: armorPiece = ThreadSafeRandom.Next(0, 1); armorWeenie = LootTables.AmuliArmor[armorPiece]; break; case (int)LootTables.ArmorType.KoujiaArmor: armorPiece = ThreadSafeRandom.Next(0, 2); armorWeenie = LootTables.KoujiaArmor[armorPiece]; break; case (int)LootTables.ArmorType.TenassaArmor: armorPiece = ThreadSafeRandom.Next(0, 2); armorWeenie = LootTables.TenassaArmor[armorPiece]; break; case (int)LootTables.ArmorType.CovenantArmor: armorPiece = ThreadSafeRandom.Next(0, 9); armorWeenie = LootTables.CovenantArmor[armorPiece]; break; case (int)LootTables.ArmorType.LoricaArmor: armorPiece = ThreadSafeRandom.Next(0, 5); armorWeenie = LootTables.LoricaArmor[armorPiece]; break; case (int)LootTables.ArmorType.NariyidArmor: armorPiece = ThreadSafeRandom.Next(0, 6); armorWeenie = LootTables.NariyidArmor[armorPiece]; break; case (int)LootTables.ArmorType.ChiranArmor: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.ChiranArmor[armorPiece]; break; case (int)LootTables.ArmorType.AlduressaArmor: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.AlduressaArmor[armorPiece]; break; case (int)LootTables.ArmorType.KnorrAcademyArmor: armorPiece = ThreadSafeRandom.Next(0, 7); armorWeenie = LootTables.KnorrAcademyArmor[armorPiece]; break; case (int)LootTables.ArmorType.SedgemailLeatherArmor: armorPiece = ThreadSafeRandom.Next(0, 5); armorWeenie = LootTables.SedgemailLeatherArmor[armorPiece]; break; case (int)LootTables.ArmorType.HaebreanArmor: armorPiece = ThreadSafeRandom.Next(0, 8); armorWeenie = LootTables.HaebreanArmor[armorPiece]; break; case (int)LootTables.ArmorType.OlthoiArmor: armorPiece = ThreadSafeRandom.Next(0, 9); armorWeenie = LootTables.OlthoiArmor[armorPiece]; break; case (int)LootTables.ArmorType.OlthoiAmuliArmor: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.OlthoiAmuliArmor[armorPiece]; break; case (int)LootTables.ArmorType.OlthoiCeldonArmor: armorPiece = ThreadSafeRandom.Next(0, 6); armorWeenie = LootTables.OlthoiCeldonArmor[armorPiece]; break; case (int)LootTables.ArmorType.OlthoiKoujiaArmor: armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.OlthoiKoujiaArmor[armorPiece]; break; default: // Olthoi Alduressa armorPiece = ThreadSafeRandom.Next(0, 4); armorWeenie = LootTables.OlthoiAlduressaArmor[armorPiece]; break; } WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)armorWeenie); if (wo == null) { return(null); } wo.SetProperty(PropertyString.LongDesc, wo.GetProperty(PropertyString.Name)); wo.SetProperty(PropertyInt.AppraisalItemSkill, 7); wo.SetProperty(PropertyInt.AppraisalLongDescDecoration, 1); materialType = GetMaterialType(wo, tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } int gemCount = ThreadSafeRandom.Next(1, 6); int gemType = ThreadSafeRandom.Next(10, 50); wo.SetProperty(PropertyInt.GemCount, gemCount); wo.SetProperty(PropertyInt.GemType, gemType); int workmanship = GetWorkmanship(tier); wo.SetProperty(PropertyInt.ItemWorkmanship, workmanship); double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; int wield; if (tier > 6 && armorType != (int)LootTables.ArmorType.CovenantArmor) { wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.Level); wo.SetProperty(PropertyInt.WieldSkillType, (int)Skill.Axe); // Set by examples from PCAP data switch (tier) { case 7: wield = 150; // In this instance, used for indicating player level, rather than skill level break; default: wield = 180; // In this instance, used for indicating player level, rather than skill level break; } wo.SetProperty(PropertyInt.WieldDifficulty, wield); } if (armorType == (int)LootTables.ArmorType.CovenantArmor) { Skill wieldSkill; int chance = ThreadSafeRandom.Next(1, 3); switch (chance) { case 1: // Magic Def wieldSkill = Skill.MagicDefense; break; case 2: // Missile Def wieldSkill = Skill.MissileDefense; break; default: // Melee Def wieldSkill = Skill.MeleeDefense; break; } wield = GetCovenantWieldReq(tier, wieldSkill); wo.SetProperty(PropertyInt.WieldRequirements, (int)WieldRequirement.RawSkill); wo.SetProperty(PropertyInt.WieldSkillType, (int)wieldSkill); wo.SetProperty(PropertyInt.WieldDifficulty, wield); } // Setting random color wo.SetProperty(PropertyInt.PaletteTemplate, ThreadSafeRandom.Next(1, 2047)); double shade = .1 * ThreadSafeRandom.Next(0, 9); wo.SetProperty(PropertyFloat.Shade, shade); var baseArmorLevel = wo.GetProperty(PropertyInt.ArmorLevel) ?? 0; if (baseArmorLevel > 0) { int adjustedArmorLevel = baseArmorLevel + GetArmorLevelModifier(tier, armorType); wo.SetProperty(PropertyInt.ArmorLevel, adjustedArmorLevel); } wo.SetProperty(PropertyInt.EquipmentSetId, equipSetId); if (isMagical) { wo = AssignMagic(wo, tier); } else { wo.RemoveProperty(PropertyInt.ItemManaCost); wo.RemoveProperty(PropertyInt.ItemMaxMana); wo.RemoveProperty(PropertyInt.ItemCurMana); wo.RemoveProperty(PropertyInt.ItemSpellcraft); wo.RemoveProperty(PropertyInt.ItemDifficulty); } wo = RandomizeColor(wo); return(wo); }
private static void MutateMeleeWeapon(WorldObject wo, TreasureDeath profile, bool isMagical, int weaponType, int subtype) { Skill wieldSkillType = Skill.None; int damage = 0; double damageVariance = 0; double weaponDefense = 0; double weaponOffense = 0; // Properties for weapons double magicD = GetMagicMissileDMod(profile.Tier); double missileD = GetMagicMissileDMod(profile.Tier); int gemCount = ThreadSafeRandom.Next(1, 5); int gemType = ThreadSafeRandom.Next(10, 50); int workmanship = GetWorkmanship(profile.Tier); int wieldDiff = GetWieldDifficulty(profile.Tier, WieldType.MeleeWeapon); WieldRequirement wieldRequirments = WieldRequirement.RawSkill; // Weapon Types // 0 = Heavy // 1 = Light // 2 = Finesse // default = Two Handed switch (weaponType) { case 0: // Heavy Weapons wieldSkillType = Skill.HeavyWeapons; switch (subtype) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 3: case 4: case 5: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Dagger); if (subtype == 3) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.Dagger); } if (subtype == 4 || subtype == 5) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); } break; case 6: case 7: case 8: case 9: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); break; case 10: case 11: case 12: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 13: case 14: weaponDefense = GetMaxDamageMod(profile.Tier, 25); weaponOffense = GetMaxDamageMod(profile.Tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 15: case 16: case 17: case 18: case 19: case 20: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (subtype == 20) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 21: default: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; case 1: // Light Weapons; wieldSkillType = Skill.LightWeapons; switch (subtype) { case 0: case 1: case 2: case 3: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 4: case 5: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); break; case 6: case 7: case 8: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); break; case 9: case 10: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 11: weaponDefense = GetMaxDamageMod(profile.Tier, 25); weaponOffense = GetMaxDamageMod(profile.Tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 12: case 13: case 14: case 15: case 16: case 17: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (subtype == 14) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 18: default: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; case 2: // Finesse Weapons; wieldSkillType = Skill.FinesseWeapons; switch (subtype) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 3: case 4: case 5: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Dagger); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Dagger); if (subtype == 3 || subtype == 4) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); } break; case 6: case 7: case 8: case 9: case 10: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); if (subtype == 9) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.Jitte); } break; case 11: case 12: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 13: case 14: weaponDefense = GetMaxDamageMod(profile.Tier, 25); weaponOffense = GetMaxDamageMod(profile.Tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 15: case 16: case 17: case 18: case 19: case 20: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (subtype == 15) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 21: default: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; default: // Two handed wieldSkillType = Skill.TwoHandedCombat; damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Cleaving); damageVariance = GetVariance(wieldSkillType, LootWeaponType.TwoHanded); switch (subtype) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); break; case 3: case 4: case 5: case 6: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); break; case 7: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); break; case 8: case 9: case 10: default: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spears); break; } break; } // Description wo.AppraisalLongDescDecoration = AppraisalLongDescDecorations.PrependWorkmanship | AppraisalLongDescDecorations.AppendGemInfo; wo.LongDesc = wo.Name; // GemTypes, Material, Workmanship wo.GemCount = gemCount; wo.GemType = (MaterialType)gemType; int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } wo.ItemWorkmanship = workmanship; // Burden MutateBurden(wo, profile.Tier, true); // Weapon Stats wo.Damage = damage; wo.DamageVariance = damageVariance; wo.WeaponDefense = weaponDefense; wo.WeaponOffense = weaponOffense; wo.WeaponMissileDefense = missileD; wo.WeaponMagicDefense = magicD; // Adding Wield Reqs if required if (wieldDiff > 0) { wo.WieldDifficulty = wieldDiff; wo.WieldRequirements = wieldRequirments; wo.WieldSkillType = (int)wieldSkillType; } else { // If no wield, remove wield reqs wo.WieldDifficulty = null; wo.WieldRequirements = WieldRequirement.Invalid; wo.WieldSkillType = null; } // Adding Magic Spells if (isMagical) { wo = AssignMagic(wo, profile); } else { // If no spells remove magic properites wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; } double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(profile.Tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; RandomizeColor(wo); }
private static void MutateCaster(WorldObject wo, TreasureDeath profile, bool isMagical, int wield, int element) { WieldRequirement wieldRequirement = WieldRequirement.RawSkill; Skill wieldSkillType = Skill.None; double elementalDamageMod = 0; if (wield == 0) { if (profile.Tier > 6) { wieldRequirement = WieldRequirement.Level; wieldSkillType = Skill.Axe; // Set by examples from PCAP data wield = profile.Tier switch { 7 => 150, // In this instance, used for indicating player level, rather than skill level _ => 180, // In this instance, used for indicating player level, rather than skill level }; } } else { // Determine the Elemental Damage Mod amount elementalDamageMod = DetermineElementMod(wield); // If element is Nether, Void Magic is required, else War Magic is required for all other elements if (element == 7) { wieldSkillType = Skill.VoidMagic; } else { wieldSkillType = Skill.WarMagic; } } // Setting MagicD and MissileD Bonuses to null (some weenies have a value) wo.WeaponMagicDefense = null; wo.WeaponMissileDefense = null; // Not sure why this is here, guessing some wienies have it by default wo.ItemSkillLevelLimit = null; // Setting general traits of weapon wo.ItemWorkmanship = GetWorkmanship(profile.Tier); int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } wo.GemCount = ThreadSafeRandom.Next(1, 5); wo.GemType = (MaterialType)ThreadSafeRandom.Next(10, 50); wo.Value = GetValue(profile.Tier, wo.ItemWorkmanship.Value, LootTables.getMaterialValueModifier(wo), LootTables.getGemMaterialValueModifier(wo)); // Is this right?? wo.LongDesc = wo.Name; // Setting Weapon defensive mods wo.WeaponDefense = GetWieldReqMeleeDMod(wield, profile); wo.WeaponMagicDefense = GetMagicMissileDMod(profile.Tier); wo.WeaponMissileDefense = GetMagicMissileDMod(profile.Tier); // Setting weapon Offensive Mods if (elementalDamageMod > 1.0f) { wo.ElementalDamageMod = elementalDamageMod; } // Setting Wield Reqs for weapon if (wield > 0 || wieldRequirement == WieldRequirement.Level) { wo.WieldRequirements = wieldRequirement; wo.WieldSkillType = (int)wieldSkillType; wo.WieldDifficulty = wield; } else { wo.WieldRequirements = WieldRequirement.Invalid; wo.WieldSkillType = null; wo.WieldDifficulty = null; } // Adjusting Properties if weapon has magic (spells) double manaConMod = GetManaCMod(profile.Tier); if (manaConMod > 0.0f) { wo.ManaConversionMod = manaConMod; } if (isMagical) { wo = AssignMagic(wo, profile); } else { wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; } RandomizeColor(wo); }
private static void MutateArmor(WorldObject wo, TreasureDeath profile, bool isMagical, LootTables.ArmorType armorType) { wo.LongDesc = wo.Name; //wo.AppraisalItemSkill = 7; //wo.AppraisalLongDescDecoration = AppraisalLongDescDecorations.PrependWorkmanship; int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } int gemCount = ThreadSafeRandom.Next(1, 6); int gemType = ThreadSafeRandom.Next(10, 50); wo.GemCount = gemCount; wo.GemType = (MaterialType)gemType; int workmanship = GetWorkmanship(profile.Tier); wo.ItemWorkmanship = workmanship; double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(profile.Tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; int wield; if (profile.Tier > 6 && armorType != LootTables.ArmorType.CovenantArmor) { wo.WieldRequirements = WieldRequirement.Level; wo.WieldSkillType = (int)Skill.Axe; // Set by examples from PCAP data wield = profile.Tier switch { 7 => 150, // In this instance, used for indicating player level, rather than skill level _ => 180, // In this instance, used for indicating player level, rather than skill level }; wo.WieldDifficulty = wield; } if (armorType == LootTables.ArmorType.CovenantArmor) { int chance = ThreadSafeRandom.Next(1, 3); var wieldSkill = chance switch { 1 => Skill.MagicDefense, 2 => Skill.MissileDefense, _ => Skill.MeleeDefense, }; wield = GetCovenantWieldReq(profile.Tier, wieldSkill); wo.WieldRequirements = WieldRequirement.RawSkill; wo.WieldSkillType = (int)wieldSkill; wo.WieldDifficulty = wield; // used by tinkering requirements for copper/silver wo.ItemSkillLimit = (uint)wieldSkill; } // Setting random color wo.PaletteTemplate = ThreadSafeRandom.Next(1, 2047); wo.Shade = .1 * ThreadSafeRandom.Next(0, 9); wo = AssignArmorLevel(wo, profile.Tier, armorType); wo = AssignEquipmentSetId(wo, profile); if (isMagical) { bool covenantArmor = false || (armorType == LootTables.ArmorType.CovenantArmor || armorType == LootTables.ArmorType.OlthoiArmor); wo = AssignMagic(wo, profile, covenantArmor); } else { wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; } // try mutate burden, if MutateFilter exists if (wo.HasMutateFilter(MutateFilter.EncumbranceVal)) { MutateBurden(wo, profile.Tier, false); } RandomizeColor(wo); }
/// <summary> /// Creates a Melee weapon object. /// </summary> /// <param name="profile"></param><param name="isMagical"></param> /// <returns>Returns Melee Weapon WO</returns> public static WorldObject CreateMeleeWeapon(TreasureDeath profile, bool isMagical, int weaponType = -1) { Skill wieldSkillType = Skill.None; int weaponWeenie = 0; int damage = 0; double damageVariance = 0; double weaponDefense = 0; double weaponOffense = 0; int longDescDecoration = 5; // Properties for weapons double magicD = GetMagicMissileDMod(profile.Tier); double missileD = GetMagicMissileDMod(profile.Tier); int gemCount = ThreadSafeRandom.Next(1, 5); int gemType = ThreadSafeRandom.Next(10, 50); int workmanship = GetWorkmanship(profile.Tier); int wieldDiff = GetWield(profile.Tier, 3); WieldRequirement wieldRequirments = WieldRequirement.RawSkill; int eleType = ThreadSafeRandom.Next(0, 4); if (weaponType == -1) { weaponType = ThreadSafeRandom.Next(0, 3); } // Weapon Types // 0 = Heavy // 1 = Light // 2 = Finesse // default = Two Handed switch (weaponType) { case 0: // Heavy Weapons wieldSkillType = Skill.HeavyWeapons; int heavyWeaponsType = ThreadSafeRandom.Next(0, 22); weaponWeenie = LootTables.HeavyWeaponsMatrix[heavyWeaponsType][eleType]; switch (heavyWeaponsType) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 3: case 4: case 5: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Dagger); if (heavyWeaponsType == 3) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.Dagger); } if (heavyWeaponsType == 4 || heavyWeaponsType == 5) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); } break; case 6: case 7: case 8: case 9: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); break; case 10: case 11: case 12: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 13: case 14: weaponDefense = GetMaxDamageMod(profile.Tier, 25); weaponOffense = GetMaxDamageMod(profile.Tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 15: case 16: case 17: case 18: case 19: case 20: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (heavyWeaponsType == 20) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 21: default: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; case 1: // Light Weapons; wieldSkillType = Skill.LightWeapons; int lightWeaponsType = ThreadSafeRandom.Next(0, 19); weaponWeenie = LootTables.LightWeaponsMatrix[lightWeaponsType][eleType]; switch (lightWeaponsType) { case 0: case 1: case 2: case 3: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 4: case 5: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); break; case 6: case 7: case 8: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); break; case 9: case 10: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 11: weaponDefense = GetMaxDamageMod(profile.Tier, 25); weaponOffense = GetMaxDamageMod(profile.Tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 12: case 13: case 14: case 15: case 16: case 17: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (lightWeaponsType == 14) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 18: default: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; case 2: // Finesse Weapons; wieldSkillType = Skill.FinesseWeapons; int finesseWeaponsType = ThreadSafeRandom.Next(0, 22); weaponWeenie = LootTables.FinesseWeaponsMatrix[finesseWeaponsType][eleType]; switch (finesseWeaponsType) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Axe); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Axe); break; case 3: case 4: case 5: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Dagger); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Dagger); if (finesseWeaponsType == 3 || finesseWeaponsType == 4) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.DaggerMulti); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.DaggerMulti); } break; case 6: case 7: case 8: case 9: case 10: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Mace); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Mace); if (finesseWeaponsType == 9) { damageVariance = GetVariance(wieldSkillType, LootWeaponType.Jitte); } break; case 11: case 12: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spear); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Spear); break; case 13: case 14: weaponDefense = GetMaxDamageMod(profile.Tier, 25); weaponOffense = GetMaxDamageMod(profile.Tier, 15); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Staff); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Staff); break; case 15: case 16: case 17: case 18: case 19: case 20: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Sword); damageVariance = GetVariance(wieldSkillType, LootWeaponType.Sword); if (finesseWeaponsType == 15) { damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.SwordMulti); damageVariance = GetVariance(wieldSkillType, LootWeaponType.SwordMulti); } break; case 21: default: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.UA); damageVariance = GetVariance(wieldSkillType, LootWeaponType.UA); break; } break; default: // Two handed wieldSkillType = Skill.TwoHandedCombat; int twoHandedWeaponsType = ThreadSafeRandom.Next(0, 11); weaponWeenie = LootTables.TwoHandedWeaponsMatrix[twoHandedWeaponsType][eleType]; damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Cleaving); damageVariance = GetVariance(wieldSkillType, LootWeaponType.TwoHanded); switch (twoHandedWeaponsType) { case 0: case 1: case 2: weaponDefense = GetMaxDamageMod(profile.Tier, 20); weaponOffense = GetMaxDamageMod(profile.Tier, 20); break; case 3: case 4: case 5: case 6: weaponDefense = GetMaxDamageMod(profile.Tier, 22); weaponOffense = GetMaxDamageMod(profile.Tier, 18); break; case 7: weaponDefense = GetMaxDamageMod(profile.Tier, 18); weaponOffense = GetMaxDamageMod(profile.Tier, 22); break; case 8: case 9: case 10: default: weaponDefense = GetMaxDamageMod(profile.Tier, 15); weaponOffense = GetMaxDamageMod(profile.Tier, 25); damage = GetMeleeMaxDamage(wieldSkillType, wieldDiff, LootWeaponType.Spears); break; } break; } WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)weaponWeenie); if (wo == null) { return(null); } // Description wo.AppraisalLongDescDecoration = longDescDecoration; wo.LongDesc = wo.Name; // GemTypes, Material, Workmanship wo.GemCount = gemCount; wo.GemType = (MaterialType)gemType; int materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.MaterialType = (MaterialType)materialType; } wo.ItemWorkmanship = workmanship; // Weapon Stats wo.Damage = damage; wo.DamageVariance = damageVariance; wo.WeaponDefense = weaponDefense; wo.WeaponOffense = weaponOffense; wo.WeaponMissileDefense = missileD; wo.WeaponMagicDefense = magicD; // Adding Wield Reqs if required if (wieldDiff > 0) { wo.WieldDifficulty = wieldDiff; wo.WieldRequirements = wieldRequirments; wo.WieldSkillType = (int)wieldSkillType; } else { // If no wield, remove wield reqs wo.WieldDifficulty = null; wo.WieldRequirements = WieldRequirement.Invalid; wo.WieldSkillType = null; } // Adding Magic Spells if (isMagical) { wo = AssignMagic(wo, profile); } else { // If no spells remove magic properites wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; } double materialMod = LootTables.getMaterialValueModifier(wo); double gemMaterialMod = LootTables.getGemMaterialValueModifier(wo); var value = GetValue(profile.Tier, workmanship, gemMaterialMod, materialMod); wo.Value = value; wo = RandomizeColor(wo); return(wo); }