public static WeenieClassName RollMeleeWeapon(ref TreasureWeaponType weaponType) { // retail did something silly here -- // instead of having an even chance to roll between heavy/light/finesse, // they kept everything divied up by weaponType // doing something slightly less silly here... // basically throwing out the weaponType here, // rolling for an even chance between heavy/light/finesse, // and then an even chance into each weapon for that skill // if you wish to maintain a profile closer to retail overall, // heavy 36% | light 30% | finesse 34% // however, it still wouldn't match up exactly, // as each weaponType still had slightly different chances, // which were most likely engrained deeply in the per-weaponType chance tables var weaponSkill = (MeleeWeaponSkill)ThreadSafeRandom.Next(1, 3); switch (weaponSkill) { case MeleeWeaponSkill.HeavyWeapons: return(HeavyWeaponWcids.Roll(out weaponType)); case MeleeWeaponSkill.LightWeapons: return(LightWeaponWcids.Roll(out weaponType)); case MeleeWeaponSkill.FinesseWeapons: return(FinesseWeaponWcids.Roll(out weaponType)); } return(WeenieClassName.undef); }
public static string GetScriptName(this TreasureWeaponType weaponType) { switch (weaponType) { case TreasureWeaponType.Axe: return("axe"); case TreasureWeaponType.Dagger: return("dagger"); case TreasureWeaponType.DaggerMS: return("dagger_ms"); case TreasureWeaponType.Mace: return("mace"); case TreasureWeaponType.MaceJitte: return("mace_jitte"); case TreasureWeaponType.Spear: case TreasureWeaponType.TwoHandedSpear: return("spear"); case TreasureWeaponType.Staff: return("staff"); case TreasureWeaponType.Sword: return("sword"); case TreasureWeaponType.SwordMS: return("sword_ms"); case TreasureWeaponType.Unarmed: return("unarmed"); case TreasureWeaponType.TwoHandedAxe: case TreasureWeaponType.TwoHandedMace: case TreasureWeaponType.TwoHandedSword: return("cleaver"); case TreasureWeaponType.Bow: return("bow"); case TreasureWeaponType.Crossbow: return("crossbow"); case TreasureWeaponType.Atlatl: return("atlatl"); case TreasureWeaponType.Caster: return("caster"); } return(null); }
public static bool IsMissileWeapon(this TreasureWeaponType weaponType) { switch (weaponType) { case TreasureWeaponType.MissileWeapon: case TreasureWeaponType.Bow: case TreasureWeaponType.Crossbow: case TreasureWeaponType.Atlatl: return(true); } return(false); }
public static WeenieClassName Roll(TreasureDeath treasureDeath, TreasureWeaponType weaponType) { switch (weaponType) { /*case TreasureWeaponType.Sword: * return RollSwordWcid(treasureDeath); * * case TreasureWeaponType.Mace: * return RollMaceWcid(treasureDeath); * * case TreasureWeaponType.Axe: * return RollAxeWcid(treasureDeath); * * case TreasureWeaponType.Spear: * return RollSpearWcid(treasureDeath); * * case TreasureWeaponType.Unarmed: * return RollUnarmedWcid(treasureDeath); * * case TreasureWeaponType.Staff: * return RollStaffWcid(treasureDeath); * * case TreasureWeaponType.Dagger: * return RollDaggerWcid(treasureDeath);*/ case TreasureWeaponType.Sword: case TreasureWeaponType.Mace: case TreasureWeaponType.Axe: case TreasureWeaponType.Spear: case TreasureWeaponType.Unarmed: case TreasureWeaponType.Staff: case TreasureWeaponType.Dagger: return(RollMeleeWeapon()); case TreasureWeaponType.Bow: return(RollBowWcid(treasureDeath)); case TreasureWeaponType.Crossbow: return(RollCrossbowWcid(treasureDeath)); case TreasureWeaponType.Atlatl: return(RollAtlatlWcid(treasureDeath)); case TreasureWeaponType.Caster: return(RollCaster(treasureDeath)); case TreasureWeaponType.TwoHandedWeapon: return(RollTwoHandedWeaponWcid()); } return(WeenieClassName.undef); }
public static string GetScriptShortName(this TreasureWeaponType weaponType) { switch (weaponType) { case TreasureWeaponType.Axe: return("axe"); case TreasureWeaponType.Dagger: case TreasureWeaponType.DaggerMS: return("dagger"); case TreasureWeaponType.Mace: return("mace"); case TreasureWeaponType.MaceJitte: return("mace_jitte"); case TreasureWeaponType.Spear: return("spear"); case TreasureWeaponType.Staff: return("staff"); case TreasureWeaponType.Sword: case TreasureWeaponType.SwordMS: return("sword"); case TreasureWeaponType.Unarmed: return("unarmed"); case TreasureWeaponType.TwoHandedAxe: return("two_handed_axe"); case TreasureWeaponType.TwoHandedMace: return("two_handed_mace"); case TreasureWeaponType.TwoHandedSpear: return("two_handed_spear"); case TreasureWeaponType.TwoHandedSword: return("two_handed_sword"); } return(null); }
public static WeenieClassName Roll(TreasureDeath treasureDeath, TreasureWeaponType weaponType) { switch (weaponType) { case TreasureWeaponType.Sword: return(RollSwordWcid(treasureDeath)); case TreasureWeaponType.Mace: return(RollMaceWcid(treasureDeath)); case TreasureWeaponType.Axe: return(RollAxeWcid(treasureDeath)); case TreasureWeaponType.Spear: return(RollSpearWcid(treasureDeath)); case TreasureWeaponType.Unarmed: return(RollUnarmedWcid(treasureDeath)); case TreasureWeaponType.Staff: return(RollStaffWcid(treasureDeath)); case TreasureWeaponType.Dagger: return(RollDaggerWcid(treasureDeath)); case TreasureWeaponType.Bow: return(RollBowWcid(treasureDeath)); case TreasureWeaponType.Crossbow: return(RollCrossbowWcid(treasureDeath)); case TreasureWeaponType.Atlatl: return(RollAtlatlWcid(treasureDeath)); case TreasureWeaponType.Caster: return(RollCaster(treasureDeath)); } return(WeenieClassName.undef); }
public static bool IsMeleeWeapon(this TreasureWeaponType weaponType) { switch (weaponType) { case TreasureWeaponType.MeleeWeapon: case TreasureWeaponType.Axe: case TreasureWeaponType.Dagger: case TreasureWeaponType.DaggerMS: case TreasureWeaponType.Mace: case TreasureWeaponType.MaceJitte: case TreasureWeaponType.Spear: case TreasureWeaponType.Staff: case TreasureWeaponType.Sword: case TreasureWeaponType.SwordMS: case TreasureWeaponType.Unarmed: case TreasureWeaponType.TwoHandedWeapon: case TreasureWeaponType.TwoHandedAxe: case TreasureWeaponType.TwoHandedMace: case TreasureWeaponType.TwoHandedSpear: case TreasureWeaponType.TwoHandedSword: return(true); } return(false); }
private static string GetMissileScript(TreasureWeaponType weaponType, bool isElemental = false) { var elementalStr = isElemental ? "elemental" : "non_elemental"; return("MissileWeapons." + weaponType.GetScriptName() + "_" + elementalStr + ".txt"); }
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); }
private static string GetOffenseDefenseScript(MeleeWeaponSkill weaponSkill, TreasureWeaponType weaponType) { return("MeleeWeapons.WeaponOffense_WeaponDefense." + weaponType.GetScriptShortName() + "_offense_defense.txt"); }
private static string GetDamageScript(MeleeWeaponSkill weaponSkill, TreasureWeaponType weaponType) { return("MeleeWeapons.Damage_WieldDifficulty_DamageVariance." + weaponSkill.GetScriptName_Combined() + "_" + weaponType.GetScriptName() + ".txt"); }
public static bool IsCaster(this TreasureWeaponType weaponType) { return(weaponType == TreasureWeaponType.Caster); }
public static WeenieClassName RollTwoHandedWeaponWcid(ref TreasureWeaponType weaponType) { return(TwoHandedWeaponWcids.Roll(out weaponType)); }
// legacy chance tables // used by multiple item types private static int RollWieldDifficulty(int tier, TreasureWeaponType weaponType) { int wield = 0; int chance = ThreadSafeRandom.Next(1, 100); switch (weaponType) { case TreasureWeaponType.MeleeWeapon: switch (tier) { case 1: wield = 0; break; case 2: if (chance < 60) { wield = 0; } else { wield = 250; } break; case 3: if (chance < 60) { wield = 0; } else if (chance < 90) { wield = 250; } else { wield = 300; } break; case 4: if (chance < 60) { wield = 0; } else if (chance < 90) { wield = 250; } else { wield = 300; } break; case 5: if (chance < 60) { wield = 300; } else if (chance < 90) { wield = 325; } else { wield = 350; } break; case 6: if (chance < 60) { wield = 350; } else if (chance < 90) { wield = 370; } else { wield = 400; } break; case 7: if (chance < 60) { wield = 370; } else if (chance < 90) { wield = 400; } else { wield = 420; } break; case 8: if (chance < 60) { wield = 400; } else if (chance < 90) { wield = 420; } else { wield = 430; } break; } break; case TreasureWeaponType.MissileWeapon: switch (tier) { case 1: wield = 0; break; case 2: if (chance < 60) { wield = 0; } else { wield = 250; } break; case 3: if (chance < 30) { wield = 0; } else if (chance < 80) { wield = 250; } else { wield = 270; } break; case 4: if (chance < 30) { wield = 0; } else if (chance < 80) { wield = 250; } else { wield = 270; } break; case 5: if (chance < 30) { wield = 270; } else if (chance < 80) { wield = 290; } else { wield = 315; } break; case 6: if (chance < 30) { wield = 315; } else if (chance < 80) { wield = 335; } else { wield = 360; } break; case 7: if (chance < 30) { wield = 335; } else if (chance < 80) { wield = 360; } else { wield = 375; } break; case 8: if (chance < 30) { wield = 360; } else if (chance < 80) { wield = 375; } else { wield = 385; } break; } break; case TreasureWeaponType.Caster: switch (tier) { case 1: case 2: case 3: wield = 0; break; case 4: if (chance < 60) { wield = 0; } else { wield = 290; } break; case 5: if (chance < 40) { wield = 0; } else if (chance < 90) { wield = 290; } else { wield = 310; } break; case 6: if (chance < 20) { wield = 0; } else if (chance < 45) { wield = 310; } else if (chance < 90) { wield = 330; } else { wield = 355; } break; case 7: if (chance < 10) { wield = 0; } else if (chance < 40) { wield = 330; } else if (chance < 85) { wield = 355; } else { wield = 375; } break; case 8: if (chance < 25) { wield = 0; } else if (chance < 50) { wield = 355; } else if (chance < 85) { wield = 375; } else { wield = 385; } break; } break; } return(wield); }