Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 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);
 }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
 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);
 }
Exemplo n.º 8
0
        private static string GetMissileScript(TreasureWeaponType weaponType, bool isElemental = false)
        {
            var elementalStr = isElemental ? "elemental" : "non_elemental";

            return("MissileWeapons." + weaponType.GetScriptName() + "_" + elementalStr + ".txt");
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
 private static string GetOffenseDefenseScript(MeleeWeaponSkill weaponSkill, TreasureWeaponType weaponType)
 {
     return("MeleeWeapons.WeaponOffense_WeaponDefense." + weaponType.GetScriptShortName() + "_offense_defense.txt");
 }
Exemplo n.º 11
0
 private static string GetDamageScript(MeleeWeaponSkill weaponSkill, TreasureWeaponType weaponType)
 {
     return("MeleeWeapons.Damage_WieldDifficulty_DamageVariance." + weaponSkill.GetScriptName_Combined() + "_" + weaponType.GetScriptName() + ".txt");
 }
Exemplo n.º 12
0
 public static bool IsCaster(this TreasureWeaponType weaponType)
 {
     return(weaponType == TreasureWeaponType.Caster);
 }
Exemplo n.º 13
0
 public static WeenieClassName RollTwoHandedWeaponWcid(ref TreasureWeaponType weaponType)
 {
     return(TwoHandedWeaponWcids.Roll(out weaponType));
 }
Exemplo n.º 14
0
        // 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);
        }