private static WorldObject AssignArmorLevel(WorldObject wo, int tier, LootTables.ArmorType armorType) { var baseArmorLevel = wo.GetProperty(PropertyInt.ArmorLevel) ?? 0; if (baseArmorLevel > 0) { int adjustedArmorLevel = baseArmorLevel + GetArmorLevelModifier(tier, armorType); wo.SetProperty(PropertyInt.ArmorLevel, adjustedArmorLevel); } return(wo); }
private static void MutateArmor(WorldObject wo, TreasureDeath profile, bool isMagical, LootTables.ArmorType armorType, TreasureRoll roll = null) { // material type var materialType = GetMaterialType(wo, profile.Tier); if (materialType > 0) { wo.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, 6); } wo.GemType = RollGemType(profile.Tier); // workmanship wo.ItemWorkmanship = WorkmanshipChance.Roll(profile.Tier); // burden if (wo.HasMutateFilter(MutateFilter.EncumbranceVal)) // fixme: data { MutateBurden(wo, profile, false); } if (roll == null) { if (armorType == LootTables.ArmorType.CovenantArmor || armorType == LootTables.ArmorType.OlthoiArmor) { int chance = ThreadSafeRandom.Next(1, 3); var wieldSkill = chance switch { 1 => Skill.MagicDefense, 2 => Skill.MissileDefense, _ => Skill.MeleeDefense, }; wo.WieldRequirements = WieldRequirement.RawSkill; wo.WieldSkillType = (int)wieldSkill; wo.WieldDifficulty = GetCovenantWieldReq(profile.Tier, wieldSkill); } else if (profile.Tier > 6) { wo.WieldRequirements = WieldRequirement.Level; wo.WieldSkillType = (int)Skill.Axe; // Set by examples from PCAP data wo.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 if (profile.Tier > 6 && !wo.HasArmorLevel()) { // normally this is handled in the mutation script for armor // for clothing, just calling the generic method here RollWieldLevelReq_T7_T8(wo, profile); } if (roll == null) { AssignArmorLevel(wo, profile.Tier, armorType); } else { AssignArmorLevel_New(wo, profile, roll); } if (wo.HasMutateFilter(MutateFilter.ArmorModVsType)) { MutateArmorModVsType(wo, profile); } if (isMagical) { AssignMagic(wo, profile, roll, true); } else { wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; } if (profile.Tier > 6) { TryRollEquipmentSet(wo, profile, roll); } if (roll != null && profile.Tier == 8) { TryMutateGearRating(wo, profile, roll); } // item value //if (wo.HasMutateFilter(MutateFilter.Value)) // fixme: data MutateValue(wo, profile.Tier, roll); wo.LongDesc = GetLongDesc(wo); }
private static void AssignArmorLevelCompat(WorldObject wo, int tier, LootTables.ArmorType armorType) { log.Debug($"[LOOT] Using AL Assignment Compatibility layer for item {wo.WeenieClassId} - {wo.Name}."); var baseArmorLevel = wo.ArmorLevel ?? 0; if (baseArmorLevel > 0) { int armorModValue = 0; if (armorType > LootTables.ArmorType.HaebreanArmor && armorType <= LootTables.ArmorType.OlthoiAlduressaArmor) { // Even if most are not using T8, made a change to that outcome to ensure that Olthoi Alduressa doesn't go way out of spec // Side effect is that Haebrean to Olthoi Celdon may suffer armorModValue = tier switch { 7 => ThreadSafeRandom.Next(0, 40), 8 => ThreadSafeRandom.Next(91, 115), _ => 0, }; } else { switch (tier) { case 1: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { armorModValue = ThreadSafeRandom.Next(0, 27); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { armorModValue = ThreadSafeRandom.Next(0, 23); } else { armorModValue = ThreadSafeRandom.Next(0, 40); } break; case 2: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { armorModValue = ThreadSafeRandom.Next(27, 54); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { armorModValue = ThreadSafeRandom.Next(23, 46); } else { armorModValue = ThreadSafeRandom.Next(40, 80); } break; case 3: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { armorModValue = ThreadSafeRandom.Next(54, 81); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { armorModValue = ThreadSafeRandom.Next(46, 69); } else if (armorType == LootTables.ArmorType.CovenantArmor || armorType == LootTables.ArmorType.OlthoiArmor) { armorModValue = ThreadSafeRandom.Next(90, 130); } else { armorModValue = ThreadSafeRandom.Next(80, 120); } break; case 4: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { armorModValue = ThreadSafeRandom.Next(81, 108); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { armorModValue = ThreadSafeRandom.Next(69, 92); } else if (armorType == LootTables.ArmorType.CovenantArmor || armorType == LootTables.ArmorType.OlthoiArmor) { armorModValue = ThreadSafeRandom.Next(130, 170); } else { armorModValue = ThreadSafeRandom.Next(120, 160); } break; case 5: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { armorModValue = ThreadSafeRandom.Next(108, 135); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { armorModValue = ThreadSafeRandom.Next(92, 115); } else if (armorType == LootTables.ArmorType.CovenantArmor || armorType == LootTables.ArmorType.OlthoiArmor) { armorModValue = ThreadSafeRandom.Next(170, 210); } else { armorModValue = ThreadSafeRandom.Next(160, 200); } break; case 6: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { armorModValue = ThreadSafeRandom.Next(135, 162); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { armorModValue = ThreadSafeRandom.Next(115, 138); } else if (armorType == LootTables.ArmorType.CovenantArmor || armorType == LootTables.ArmorType.OlthoiArmor) { armorModValue = ThreadSafeRandom.Next(210, 250); } else { armorModValue = ThreadSafeRandom.Next(200, 240); } break; case 7: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { armorModValue = ThreadSafeRandom.Next(162, 189); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { armorModValue = ThreadSafeRandom.Next(138, 161); } else if (armorType == LootTables.ArmorType.CovenantArmor || armorType == LootTables.ArmorType.OlthoiArmor) { armorModValue = ThreadSafeRandom.Next(250, 290); } else { armorModValue = ThreadSafeRandom.Next(240, 280); } break; case 8: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { armorModValue = ThreadSafeRandom.Next(189, 216); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { armorModValue = ThreadSafeRandom.Next(161, 184); } else if (armorType == LootTables.ArmorType.CovenantArmor || armorType == LootTables.ArmorType.OlthoiArmor) { armorModValue = ThreadSafeRandom.Next(290, 330); } else if (armorType == LootTables.ArmorType.SocietyArmor) { armorModValue = ThreadSafeRandom.Next(189, 216); } else { armorModValue = ThreadSafeRandom.Next(280, 320); } break; default: armorModValue = 0; break; } } int adjustedArmorLevel = baseArmorLevel + armorModValue; wo.ArmorLevel = adjustedArmorLevel; } }
/// <summary> /// Assign a final AL value based upon tier /// Used values given at https://asheron.fandom.com/wiki/Loot#Armor_Levels for setting the AL mod values /// so as to not exceed the values listed in that table /// </summary> private static void AssignArmorLevel(WorldObject wo, int tier, LootTables.ArmorType armorType) { if (wo.ArmorType == null) { log.Warn($"[LOOT] Missing PropertyInt.ArmorType on loot item {wo.WeenieClassId} - {wo.Name}"); return; } var baseArmorLevel = wo.ArmorLevel ?? 0; if (((wo.ClothingPriority & (CoverageMask)CoverageMaskHelper.Underwear) == 0) || wo.IsShield) { int armorModValue = 0; // Account for ACE World Databases that have not yet been updated if (wo.ArmorType != (int)ArmorType.Cloth && (wo.GetProperty(PropertyInt.Version) ?? 0) < 3) { AssignArmorLevelCompat(wo, tier, armorType); } // Sets AL variations based on weenie ArmorType field, such as cloth, leather, metal, etc. switch (tier) { case 1: if (wo.ArmorType == (int)ArmorType.Cloth) { armorModValue = ThreadSafeRandom.Next(0, 25); } if (wo.ArmorType == (int)ArmorType.Leather || wo.ArmorType == (int)ArmorType.StuddedLeather) { armorModValue = ThreadSafeRandom.Next(0, 29); } if (wo.ArmorType == (int)ArmorType.Metal || wo.ArmorType == (int)ArmorType.Chainmail || wo.ArmorType == (int)ArmorType.Scalemail) { armorModValue = ThreadSafeRandom.Next(0, 26); } // Covenant and Olthoi Armor (not Amuli, Celdon, Koujia, or Alduressa types of Olthoi Armor) // Does not drop at this tier level if (wo.ResistMagic != null && wo.ResistMagic == 9999) { armorModValue = 0; } if (wo.IsShield) { armorModValue = ThreadSafeRandom.Next(5, 22); } break; case 2: if (wo.ArmorType == (int)ArmorType.Cloth) { armorModValue = ThreadSafeRandom.Next(25, 50); } if (wo.ArmorType == (int)ArmorType.Leather || wo.ArmorType == (int)ArmorType.StuddedLeather) { armorModValue = ThreadSafeRandom.Next(29, 52); } if (wo.ArmorType == (int)ArmorType.Metal || wo.ArmorType == (int)ArmorType.Chainmail || wo.ArmorType == (int)ArmorType.Scalemail) { armorModValue = ThreadSafeRandom.Next(26, 50); } // Covenant and Olthoi Armor (not Amuli, Celdon, Koujia, or Alduressa types of Olthoi Armor) // Does not drop at this tier level if (wo.ResistMagic != null && wo.ResistMagic == 9999) { armorModValue = 0; } if (wo.IsShield) { armorModValue = ThreadSafeRandom.Next(22, 39); } break; case 3: if (wo.ArmorType == (int)ArmorType.Cloth) { armorModValue = ThreadSafeRandom.Next(50, 75); } if (wo.ArmorType == (int)ArmorType.Leather || wo.ArmorType == (int)ArmorType.StuddedLeather) { armorModValue = ThreadSafeRandom.Next(52, 75); } if (wo.ArmorType == (int)ArmorType.Metal || wo.ArmorType == (int)ArmorType.Chainmail || wo.ArmorType == (int)ArmorType.Scalemail) { armorModValue = ThreadSafeRandom.Next(50, 74); } // Covenant and Olthoi Armor (not Amuli, Celdon, Koujia, or Alduressa types of Olthoi Armor) if (wo.ResistMagic != null && wo.ResistMagic == 9999) { armorModValue = ThreadSafeRandom.Next(190, 210); } if (wo.IsShield) { armorModValue = ThreadSafeRandom.Next(39, 56); } break; case 4: if (wo.ArmorType == (int)ArmorType.Cloth) { armorModValue = ThreadSafeRandom.Next(75, 100); } if (wo.ArmorType == (int)ArmorType.Leather || wo.ArmorType == (int)ArmorType.StuddedLeather) { armorModValue = ThreadSafeRandom.Next(75, 98); } if (wo.ArmorType == (int)ArmorType.Metal || wo.ArmorType == (int)ArmorType.Chainmail || wo.ArmorType == (int)ArmorType.Scalemail) { armorModValue = ThreadSafeRandom.Next(74, 98); } // Covenant and Olthoi Armor (not Amuli, Celdon, Koujia, or Alduressa types of Olthoi Armor) if (wo.ResistMagic != null && wo.ResistMagic == 9999) { armorModValue = ThreadSafeRandom.Next(210, 230); } if (wo.IsShield) { armorModValue = ThreadSafeRandom.Next(56, 73); } break; case 5: if (wo.ArmorType == (int)ArmorType.Cloth) { armorModValue = ThreadSafeRandom.Next(100, 125); } if (wo.ArmorType == (int)ArmorType.Leather || wo.ArmorType == (int)ArmorType.StuddedLeather) { armorModValue = ThreadSafeRandom.Next(98, 121); } if (wo.ArmorType == (int)ArmorType.Metal || wo.ArmorType == (int)ArmorType.Chainmail || wo.ArmorType == (int)ArmorType.Scalemail) { armorModValue = ThreadSafeRandom.Next(98, 122); } // Covenant and Olthoi Armor (not Amuli, Celdon, Koujia, or Alduressa types of Olthoi Armor) if (wo.ResistMagic != null && wo.ResistMagic == 9999) { armorModValue = ThreadSafeRandom.Next(230, 250); } if (wo.IsShield) { armorModValue = ThreadSafeRandom.Next(73, 90); } break; case 6: if (wo.ArmorType == (int)ArmorType.Cloth) { armorModValue = ThreadSafeRandom.Next(125, 150); } if (wo.ArmorType == (int)ArmorType.Leather || wo.ArmorType == (int)ArmorType.StuddedLeather) { armorModValue = ThreadSafeRandom.Next(121, 144); } if (wo.ArmorType == (int)ArmorType.Metal || wo.ArmorType == (int)ArmorType.Chainmail || wo.ArmorType == (int)ArmorType.Scalemail) { armorModValue = ThreadSafeRandom.Next(122, 146); } // Covenant and Olthoi Armor (not Amuli, Celdon, Koujia, or Alduressa types of Olthoi Armor) if (wo.ResistMagic != null && wo.ResistMagic == 9999) { armorModValue = ThreadSafeRandom.Next(250, 270); } if (wo.IsShield) { armorModValue = ThreadSafeRandom.Next(90, 107); } break; case 7: if (wo.ArmorType == (int)ArmorType.Cloth) { armorModValue = ThreadSafeRandom.Next(150, 175); } if (wo.ArmorType == (int)ArmorType.Leather || wo.ArmorType == (int)ArmorType.StuddedLeather) { armorModValue = ThreadSafeRandom.Next(144, 167); } if (wo.ArmorType == (int)ArmorType.Metal || wo.ArmorType == (int)ArmorType.Chainmail || wo.ArmorType == (int)ArmorType.Scalemail) { armorModValue = ThreadSafeRandom.Next(146, 170); } // Covenant and Olthoi Armor (not Amuli, Celdon, Koujia, or Alduressa types of Olthoi Armor) if (wo.ResistMagic != null && wo.ResistMagic == 9999) { armorModValue = ThreadSafeRandom.Next(270, 290); } if (wo.IsShield) { armorModValue = ThreadSafeRandom.Next(107, 124); } break; case 8: if (wo.ArmorType == (int)ArmorType.Cloth) { armorModValue = ThreadSafeRandom.Next(175, 200); } if (wo.ArmorType == (int)ArmorType.Leather || wo.ArmorType == (int)ArmorType.StuddedLeather) { armorModValue = ThreadSafeRandom.Next(167, 190); } if (wo.ArmorType == (int)ArmorType.Metal || wo.ArmorType == (int)ArmorType.Chainmail || wo.ArmorType == (int)ArmorType.Scalemail) { armorModValue = ThreadSafeRandom.Next(170, 194); } // Covenant and Olthoi Armor (not Amuli, Celdon, Koujia, or Alduressa types of Olthoi Armor) if (wo.ResistMagic != null && wo.ResistMagic == 9999) { armorModValue = ThreadSafeRandom.Next(290, 310); } if (wo.IsShield) { armorModValue = ThreadSafeRandom.Next(124, 141); } break; } int adjustedArmorLevel = baseArmorLevel + armorModValue; wo.ArmorLevel = adjustedArmorLevel; } if ((wo.ResistMagic == null || wo.ResistMagic < 9999) && wo.ArmorLevel >= 345) { log.Warn($"[LOOT] Standard armor item exceeding upper AL threshold {wo.WeenieClassId} - {wo.Name}"); } }
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); }
private static WorldObject CreateArmor(TreasureDeath profile, bool isMagical, bool isArmor, LootBias lootBias = LootBias.UnBiased, bool mutate = true) { 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 && mutate) { MutateArmor(wo, profile, isMagical, armorType); } return(wo); }
private static void MutateArmor(WorldObject wo, TreasureDeath profile, bool isMagical, LootTables.ArmorType armorType, TreasureRoll roll = null) { // 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, 6); } wo.GemType = RollGemType(profile.Tier); // workmanship wo.ItemWorkmanship = WorkmanshipChance.Roll(profile.Tier); // try mutate burden, if MutateFilter exists if (wo.HasMutateFilter(MutateFilter.EncumbranceVal)) { MutateBurden(wo, profile, false); } if (profile.Tier > 6 && armorType != LootTables.ArmorType.CovenantArmor && armorType != LootTables.ArmorType.OlthoiArmor) { wo.WieldRequirements = WieldRequirement.Level; wo.WieldSkillType = (int)Skill.Axe; // Set by examples from PCAP data wo.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 }; } if (armorType == LootTables.ArmorType.CovenantArmor || armorType == LootTables.ArmorType.OlthoiArmor) { int chance = ThreadSafeRandom.Next(1, 3); var wieldSkill = chance switch { 1 => Skill.MagicDefense, 2 => Skill.MissileDefense, _ => Skill.MeleeDefense, }; wo.WieldRequirements = WieldRequirement.RawSkill; wo.WieldSkillType = (int)wieldSkill; wo.WieldDifficulty = GetCovenantWieldReq(profile.Tier, wieldSkill); // used by tinkering requirements for copper/silver wo.ItemSkillLimit = wieldSkill; } wo = AssignArmorLevel(wo, profile.Tier, armorType); wo = AssignEquipmentSetId(wo, profile); if (isMagical) { //bool covenantArmor = false || (armorType == LootTables.ArmorType.CovenantArmor || armorType == LootTables.ArmorType.OlthoiArmor); AssignMagic(wo, profile, roll, true); } else { wo.ItemManaCost = null; wo.ItemMaxMana = null; wo.ItemCurMana = null; wo.ItemSpellcraft = null; wo.ItemDifficulty = null; } if (wo.HasMutateFilter(MutateFilter.ArmorModVsType) && wo.ArmorLevel > 0) { // covenant armor and olthoi armor appear to have different mutation methods possibly if (armorType != LootTables.ArmorType.CovenantArmor && armorType != LootTables.ArmorType.OlthoiArmor) { MutateArmorModVsType(wo, profile); } } if (roll != null && profile.Tier == 8) { TryMutateGearRating(wo, profile, roll); } // item value wo.Value = Roll_ItemValue(wo, profile.Tier); 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 int GetArmorLevelModifier(int tier, LootTables.ArmorType armorType) { // fixed in pending update synced w/ db if (armorType > LootTables.ArmorType.HaebreanArmor && armorType < LootTables.ArmorType.OlthoiAlduressaArmor) { switch (tier) { case 7: return(ThreadSafeRandom.Next(0, 40)); case 8: return(ThreadSafeRandom.Next(160, 200)); default: return(0); } } switch (tier) { case 1: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { return(ThreadSafeRandom.Next(0, 27)); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { return(ThreadSafeRandom.Next(0, 23)); } else { return(ThreadSafeRandom.Next(0, 40)); } case 2: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { return(ThreadSafeRandom.Next(27, 54)); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { return(ThreadSafeRandom.Next(23, 46)); } else { return(ThreadSafeRandom.Next(40, 80)); } case 3: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { return(ThreadSafeRandom.Next(54, 81)); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { return(ThreadSafeRandom.Next(46, 69)); } else if (armorType == LootTables.ArmorType.CovenantArmor) { return(ThreadSafeRandom.Next(90, 130)); } else { return(ThreadSafeRandom.Next(80, 120)); } case 4: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { return(ThreadSafeRandom.Next(81, 108)); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { return(ThreadSafeRandom.Next(69, 92)); } else if (armorType == LootTables.ArmorType.CovenantArmor) { return(ThreadSafeRandom.Next(130, 170)); } else { return(ThreadSafeRandom.Next(120, 160)); } case 5: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { return(ThreadSafeRandom.Next(108, 135)); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { return(ThreadSafeRandom.Next(92, 115)); } else if (armorType == LootTables.ArmorType.CovenantArmor) { return(ThreadSafeRandom.Next(170, 210)); } else { return(ThreadSafeRandom.Next(160, 200)); } case 6: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { return(ThreadSafeRandom.Next(135, 162)); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { return(ThreadSafeRandom.Next(115, 138)); } else if (armorType == LootTables.ArmorType.CovenantArmor) { return(ThreadSafeRandom.Next(210, 250)); } else { return(ThreadSafeRandom.Next(200, 240)); } case 7: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { return(ThreadSafeRandom.Next(162, 189)); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { return(ThreadSafeRandom.Next(138, 161)); } else if (armorType == LootTables.ArmorType.CovenantArmor) { return(ThreadSafeRandom.Next(250, 290)); } else { return(ThreadSafeRandom.Next(240, 280)); } case 8: if (armorType == LootTables.ArmorType.StuddedLeatherArmor || armorType == LootTables.ArmorType.Helms || armorType == LootTables.ArmorType.Shields) { return(ThreadSafeRandom.Next(189, 216)); } else if (armorType == LootTables.ArmorType.LeatherArmor || armorType == LootTables.ArmorType.MiscClothing) { return(ThreadSafeRandom.Next(161, 184)); } else if (armorType == LootTables.ArmorType.CovenantArmor) { return(ThreadSafeRandom.Next(290, 330)); } else { return(ThreadSafeRandom.Next(280, 320)); } default: return(0); } }
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); }
private static WorldObject CreateArmor(int tier, bool isMagical, bool isArmor, LootBias lootBias = LootBias.UnBiased) { var minType = LootTables.ArmorType.Helms; 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; 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, 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);
private static bool AssignArmorLevel_New(WorldObject wo, TreasureDeath profile, TreasureRoll roll, LootTables.ArmorType armorType) { // retail was only divied up into a few different mutation scripts here // anything with ArmorLevel ran these mutation scripts // anything that covered extremities (head / hand / foot wear) started with a slightly higher base AL, // but otherwise used the same mutation as anything that covered non-extremities // shields also had their own mutation script // only exceptions found: covenant armor, olthoi armor, metal cap if (!roll.HasArmorLevel(wo)) { return(false); } var scriptName = GetMutationScript_ArmorLevel(wo, roll); if (scriptName == null) { log.Error($"AssignArmorLevel_New({wo.Name}, {profile.TreasureType}, {roll.ItemType}) - unknown item type"); return(false); } // persist original values for society armor var wieldRequirements = wo.WieldRequirements; var wieldSkillType = wo.WieldSkillType; var wieldDifficulty = wo.WieldDifficulty; //Console.WriteLine($"Mutating {wo.Name} with {scriptName}"); var mutationFilter = MutationCache.GetMutation(scriptName); var success = mutationFilter.TryMutate(wo, profile.Tier); if (armorType == LootTables.ArmorType.SocietyArmor) { wo.WieldRequirements = wieldRequirements; wo.WieldSkillType = wieldSkillType; wo.WieldDifficulty = wieldDifficulty; } return(success); }