Exemplo n.º 1
0
        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);
        }
Exemplo n.º 5
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.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 11
0
        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);
        }
Exemplo n.º 12
0
        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);
        }
Exemplo n.º 13
0
        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);
        }
Exemplo n.º 14
0
        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);
        }
Exemplo n.º 15
0
        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);
        }
Exemplo n.º 16
0
        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);
        }
Exemplo n.º 17
0
        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);
        }
Exemplo n.º 18
0
        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);
        }
Exemplo n.º 19
0
        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);
        }
Exemplo n.º 20
0
        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);
        }
Exemplo n.º 21
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);
        }
Exemplo n.º 22
0
        /// <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);
        }
Exemplo n.º 24
0
        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);
        }
Exemplo n.º 25
0
        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);
        }
Exemplo n.º 26
0
        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);
        }
Exemplo n.º 27
0
        /// <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);
        }