Пример #1
0
    // Update is called once per frame
    void Update()
    {
        if (life <= 0)
        {
            GameObject lt_gameObject = GameObject.FindGameObjectWithTag("Loot");
            LootTables lt            = lt_gameObject.GetComponent <LootTables>();
            GameObject go;
            go = lt.looting(nombre);

            if (go != null)
            {
                if (go.GetComponent <Item>() != null)
                {
                    go.GetComponent <Item>().tienda = false;
                }
                Instantiate(go, transform.position, Quaternion.identity);
            }
            int n = Random.Range(0, 99);
            if (n < 25)
            {
                go = lt.looting(nombre);
                if (go.GetComponent <Item>() != null)
                {
                    go.GetComponent <Item>().tienda = false;
                }
                if (go != null)
                {
                    Instantiate(go, transform.position, Quaternion.identity);
                }
            }
            Destroy(gameObject);
        }
    }
Пример #2
0
 internal static void DisableQueuedGadgets()
 {
     Logger.Log("Unloading Gadgets...");
     foreach (GadgetInfo gadget in QueuedGadgets)
     {
         gadget.Gadget.Unload();
         LootTables.RemoveModEntries(gadget.Gadget.ModID);
         GadgetCoreAPI.RemoveModResources(gadget.Gadget.ModID);
         GadgetCoreAPI.UnregisterStatModifiers(gadget.Gadget.ModID);
         GadgetNetwork.UnregisterSyncVars(gadget.Gadget.ModID);
         PlanetRegistry.UnregisterGadget(gadget.Gadget.ModID);
         foreach (Registry reg in GameRegistry.ListAllRegistries())
         {
             reg.UnregisterGadget(gadget);
         }
     }
     Logger.Log("Done unloading Gadgets.");
     Logger.Log("Unpatching Gadgets...");
     foreach (GadgetInfo gadget in QueuedGadgets.ToList())
     {
         try
         {
             gadget.Gadget.HarmonyInstance.UnpatchAll(gadget.Mod.Name + "." + gadget.Attribute.Name + ".gadget");
         }
         catch (Exception e)
         {
             Logger.LogError("Exception Unpatching Gadget '" + gadget.Attribute.Name + "':" + Environment.NewLine + e.ToString());
         }
     }
     Logger.Log("Done patching Gadgets.");
     Logger.Log("Sorting Gadgets...");
     Gadgets.SortGadgets();
     Logger.Log("Done sorting Gadgets.");
     QueuedGadgets.Clear();
 }
Пример #3
0
 void OnEnable()
 {
     if (EditorPrefs.HasKey("LootTablePath"))
     {
         string objectPath = EditorPrefs.GetString("LootTablePath");
         lootTables = AssetDatabase.LoadAssetAtPath(objectPath, typeof(LootTables)) as LootTables;
     }
 }
Пример #4
0
        /// <summary>
        /// Generates items in the given item collection based on loot table key.
        /// Any existing items will be destroyed.
        /// </summary>
        public static void GenerateDungeonItems(ItemCollection collection, int dungeonIndex)
        {
            DaggerfallUnityItem[] newitems = LootTables.GenerateDungeonLootItems(dungeonIndex);

            FormulaHelper.ModifyFoundLootItems(ref newitems);

            collection.Import(newitems);
        }
        /// <summary>
        /// Generates items in the given item collection based on loot table key.
        /// Any existing items will be destroyed.
        /// </summary>
        public static void GenerateItems(string LootTableKey, ItemCollection collection)
        {
            LootChanceMatrix matrix = LootTables.GetMatrix(LootTableKey);

            DaggerfallUnityItem[] newitems = LootTables.GenerateRandomLoot(LootTableKey, matrix, GameManager.Instance.PlayerEntity);

            collection.Import(newitems);
        }
Пример #6
0
        /// <summary>
        /// Regenerates items in this container based on loot table key.
        /// Existing items will be destroyed.
        /// </summary>
        public void GenerateItems()
        {
            LootChanceMatrix matrix = LootTables.GetMatrix(LootTableKey);

            DaggerfallUnityItem[] newitems = LootTables.GenerateRandomLoot(LootTableKey, matrix, GameManager.Instance.PlayerEntity);

            items.Import(newitems);
        }
Пример #7
0
    public static LootTables Create()
    {
        LootTables asset = ScriptableObject.CreateInstance <LootTables> ();

        asset.lootTables = new List <LootTable> ();
        AssetDatabase.CreateAsset(asset, "Assets/LootTables.asset");
        AssetDatabase.SaveAssets();
        return(asset);
    }
Пример #8
0
 void CreateNewLootTables()
 {
     lootTableViewIndex = 1;
     lootTables         = CreateLootTables.Create();
     if (lootTables)
     {
         string relPath = AssetDatabase.GetAssetPath(lootTables);
         EditorPrefs.SetString("LootTablePath", relPath);
     }
 }
Пример #9
0
        /// <summary>
        /// Generates items in the given item collection based on loot table key.
        /// Any existing items will be destroyed.
        /// </summary>
        public static void GenerateItems(string LootTableKey, ItemCollection collection)
        {
            LootChanceMatrix matrix = LootTables.GetMatrix(LootTableKey);

            DaggerfallUnityItem[] newitems = LootTables.GenerateRandomLoot(matrix, GameManager.Instance.PlayerEntity);

            DaggerfallUnityItem[] modifieditems = FormulaHelper.ModifyFoundLootItems(ref newitems);

            collection.Import(modifieditems);
        }
Пример #10
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);
        }
Пример #12
0
        static public LootTables ExtractLootTables(string root)
        {
            var lootTables = new LootTables();

            // Chests
            foreach (var file in Directory.EnumerateFiles(root + "/loot_tables/chests", "*.json"))
            {
                dynamic chest = JsonConvert.DeserializeObject <LootTable>(File.ReadAllText(file), new JsonSerializerSettings
                {
                    DefaultValueHandling = DefaultValueHandling.Ignore
                });
                chest.Name = Path.GetFileNameWithoutExtension(file);
                lootTables.Chests.Add(chest);
            }

            // Entities
            foreach (var file in Directory.EnumerateFiles(root + "/loot_tables/entities", "*.json"))
            {
                var entity = JsonConvert.DeserializeObject <LootTable>(File.ReadAllText(file), new JsonSerializerSettings
                {
                    DefaultValueHandling = DefaultValueHandling.Ignore
                });
                entity.Name = Path.GetFileNameWithoutExtension(file);
                lootTables.Entities.Add(entity);
            }

            // Equipment
            foreach (var file in Directory.EnumerateFiles(root + "/loot_tables/equipment", "*.json"))
            {
                var equipment = JsonConvert.DeserializeObject <LootTable>(File.ReadAllText(file), new JsonSerializerSettings
                {
                    DefaultValueHandling = DefaultValueHandling.Ignore
                });
                equipment.Name = Path.GetFileNameWithoutExtension(file);
                lootTables.Equipment.Add(equipment);
            }

            // Fishing
            lootTables.Gameplay.FishingJson = JsonConvert.DeserializeObject <LootTable>(File.ReadAllText(root + "/loot_tables/gameplay/fishing.json"), new JsonSerializerSettings
            {
                DefaultValueHandling = DefaultValueHandling.Ignore
            });
            foreach (var file in Directory.EnumerateFiles(root + "/loot_tables/gameplay/Fishing", "*.json"))
            {
                var fishing = JsonConvert.DeserializeObject <LootTable>(File.ReadAllText(file), new JsonSerializerSettings
                {
                    DefaultValueHandling = DefaultValueHandling.Ignore
                });
                fishing.Name = Path.GetFileNameWithoutExtension(file);
                lootTables.Gameplay.Fishing.Add(fishing);
            }


            return(lootTables);
        }
Пример #13
0
 public static void Postfix(ChestScript __instance)
 {
     if (__instance.isGold)
     {
         LootTables.DropLoot("chest:gold", __instance.transform.position, 0.2f);
     }
     else
     {
         LootTables.DropLoot("chest:basic", __instance.transform.position, 0.2f);
     }
 }
        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);
        }
Пример #15
0
        public override void Save(JsonValue root)
        {
            base.Save(root);
            var drops = new JsonArray();

            foreach (var d in Drops)
            {
                drops.Add(LootTables.WriteDrop(d));
            }

            root["drops"] = drops;
        }
Пример #16
0
    void OpenLootTables()
    {
        string absPath = EditorUtility.OpenFilePanel("Select LootTables SO", "", "");

        if (absPath.StartsWith(Application.dataPath))
        {
            string relPath = absPath.Substring(Application.dataPath.Length - "Assets".Length);
            lootTables = AssetDatabase.LoadAssetAtPath(relPath, typeof(LootTables)) as LootTables;
            if (lootTables)
            {
                EditorPrefs.SetString("LootTablePath", relPath);
            }
        }
    }
Пример #17
0
        public override void Load(JsonValue root)
        {
            base.Load(root);

            if (root["drops"].IsJsonArray)
            {
                var drops = root["drops"].AsJsonArray;
                Drops = new Drop[drops.Count];

                for (var i = 0; i < Drops.Length; i++)
                {
                    Drops[i] = LootTables.ParseDrop(drops[i]);
                }
            }
        }
Пример #18
0
        public static void RenderDebug(JsonValue root)
        {
            root.InputFloat("Chance", "chance");

            if (!root["drops"].IsJsonArray)
            {
                root["drops"] = new JsonArray();
            }

            var drops    = root["drops"].AsJsonArray;
            var toRemove = -1;

            for (var i = 0; i < drops.Count; i++)
            {
                if (LootTables.RenderDrop(drops[i]) && ImGui.Button("Remove drop"))
                {
                    toRemove = i;
                }
            }

            if (toRemove > -1)
            {
                drops.Remove(toRemove);
            }

            if (DropNames == null)
            {
                DropNames = new string[DropRegistry.Defined.Count];
                var i = 0;

                foreach (var v in DropRegistry.Defined.Values)
                {
                    DropNames[i++] = v.Id;
                }
            }

            ImGui.Separator();

            ImGui.Combo("##tp", ref CurrentDrop, DropNames, DropNames.Length);
            ImGui.SameLine();

            if (ImGui.Button("Add drop"))
            {
                drops.Add(new JsonObject {
                    ["type"] = DropNames[CurrentDrop]
                });
            }
        }
Пример #19
0
        /// <summary>
        /// Generates items in the given item collection based on loot table key.
        /// Any existing items will be destroyed.
        /// </summary>
        public static void GenerateEnemyItems(ItemCollection collection, int[] traits, EnemyEntity enemyEnt)
        {
            DaggerfallEntity enemy = enemyEnt as DaggerfallEntity;

            int[] enemyPredefLootTableProperties;
            int[] enemyExtraLootProperties;

            enemyPredefLootTableProperties = EnemyBasics.EnemyPredefLootTableCalculator(enemy, traits);
            enemyExtraLootProperties       = EnemyBasics.EnemyExtraLootCalculator(enemy, traits, enemyPredefLootTableProperties);
            EnemyBasics.TraitExtraLootModCalculator(traits, enemyPredefLootTableProperties, enemyExtraLootProperties, out enemyPredefLootTableProperties, out enemyExtraLootProperties);

            DaggerfallUnityItem[] newitems = LootTables.GenerateEnemyLoot(enemy, traits, enemyPredefLootTableProperties, enemyExtraLootProperties);

            FormulaHelper.ModifyFoundLootItems(ref newitems);

            collection.Import(newitems);
        }
Пример #20
0
        /// <summary>
        /// Generates items in the given item collection based on loot table key.
        /// Any existing items will be destroyed.
        /// </summary>
        public static void GenerateBuildingItems(ItemCollection collection, int[] traits, EnemyEntity enemyEnt = null)
        {
            DaggerfallEntity enemy = enemyEnt as DaggerfallEntity; // This may not work as i'm expecting, will have to see.

            int[] enemyPredefLootTableProperties;
            int[] enemyExtraLootProperties;

            enemyPredefLootTableProperties = EnemyBasics.EnemyPredefLootTableCalculator(enemy, traits);
            enemyExtraLootProperties       = EnemyBasics.EnemyExtraLootCalculator(enemy, traits, enemyPredefLootTableProperties);
            EnemyBasics.TraitExtraLootModCalculator(traits, enemyPredefLootTableProperties, enemyExtraLootProperties, out enemyPredefLootTableProperties, out enemyExtraLootProperties);
            // Now will start actually creating the items based on enemyPredefLootTableProperties and enemyExtraLootProperties, after that is done, likely add the "flavor" items from the traits afterward.

            DaggerfallUnityItem[] newitems = LootTables.GenerateEnemyLoot(enemy, traits, enemyPredefLootTableProperties, enemyExtraLootProperties);

            FormulaHelper.ModifyFoundLootItems(ref newitems);

            collection.Import(newitems);
        }
Пример #21
0
    // Use this for initialization
    void Start()
    {
        table  = GameObject.Find("Controller").GetComponent <LootTables> ();
        player = GameObject.Find("Player").GetComponent <Player> ();
        int i = Random.Range(0, 100);

        if (name.Contains("Wbox"))
        {
            //int result = table.Weapons [tier] [i];
            w      = ItemTemplates.GetWeaponOfTier(tier);
            Damage = w.Damage;
        }
        else if (name.Contains("Abox"))
        {
            //int result = table.Armour [tier] [i];
            a      = ItemTemplates.GetArmourOfTier(tier);
            Damage = (int)a.Resistances [0];
        }
    }
Пример #22
0
 private void OnCollisionEnter2D(Collision2D collision)
 {
     if (collision.gameObject.tag == "Hero")
     {
         GameObject lt_gameObject = GameObject.FindGameObjectWithTag("Loot");
         LootTables lt            = lt_gameObject.GetComponent <LootTables>();
         go = lt.looting("Chest");
         go.GetComponent <Item>().tienda = false;
         player = GameObject.FindGameObjectWithTag("Hero");
         PlayerItems pi = player.GetComponent <PlayerItems>();
         if (pi.llaves >= 1)
         {
             pi.llaves--;
             pi.UILlaves.text = "x " + pi.llaves.ToString("00");
             Instantiate(go, transform.position, Quaternion.identity);
             Destroy(this.gameObject);
         }
     }
 }
Пример #23
0
        private Inventory GetLoot(Area arena, int level)
        {
            long                score = Modifiers.CurrentScore;
            Inventory           loot  = new Inventory();
            LootTables <string> lt    = new LootTables <string>(arena.loot, Program.rng);

            for (; score > 0; score -= 100)
            {
                if (Program.Chance(score))
                {
                    Item item;
                    if (Program.Chance(10))
                    {
                        item = Item.CreateRune(1);
                    }
                    else if (arena.ValidTable(arena.loot))
                    {
                        item = Item.LoadItem(lt.GetItem(out _).Trim());
                        item.Scale(level);
                    }
                    else
                    {
                        item = Item.RandomGear(level * 5, true);
                    }

                    loot.Add(item, 1, -1);

                    if (Program.Chance(20))
                    {
                        loot.Add(Item.CreateRepairKit(1), 1, -1);
                    }
                }
            }

            return(loot);
        }
Пример #24
0
        private static WorldObject CreateArmor(TreasureDeath profile, bool isMagical, bool isArmor, LootBias lootBias = LootBias.UnBiased, bool mutate = true)
        {
            var minType = LootTables.ArmorType.Helms;

            LootTables.ArmorType maxType;

            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)
            {
                armorType = (LootTables.ArmorType)ThreadSafeRandom.Next((int)minType, (int)maxType);
            }
            else
            {
                armorType = LootTables.ArmorType.MiscClothing;
            }

            int[] table = LootTables.GetLootTable(armorType);

            int rng = ThreadSafeRandom.Next(0, table.Length - 1);

            int armorWeenie = table[rng];

            WorldObject wo = WorldObjectFactory.CreateNewWorldObject((uint)armorWeenie);

            if (wo != null && mutate)
            {
                MutateArmor(wo, profile, isMagical, armorType);
            }

            return(wo);
        }
Пример #25
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);
        }
Пример #26
0
        /// <summary>
        /// Add interior flats.
        /// </summary>
        private void AddFlats(PlayerGPS.DiscoveredBuilding buildingData)
        {
            GameObject node = new GameObject("Interior Flats");

            node.transform.parent = this.transform;

            // Add block flats
            markers.Clear();
            foreach (DFBlock.RmbBlockFlatObjectRecord obj in recordData.Interior.BlockFlatObjectRecords)
            {
                // Calculate position
                Vector3 billboardPosition = new Vector3(obj.XPos, -obj.YPos, obj.ZPos) * MeshReader.GlobalScale;

                // Import custom 3d gameobject instead of flat
                if (MeshReplacement.ImportCustomFlatGameobject(obj.TextureArchive, obj.TextureRecord, billboardPosition, node.transform) != null)
                {
                    continue;
                }

                // Spawn billboard gameobject
                GameObject go = GameObjectHelper.CreateDaggerfallBillboardGameObject(obj.TextureArchive, obj.TextureRecord, node.transform);

                // Set position
                DaggerfallBillboard dfBillboard = go.GetComponent <DaggerfallBillboard>();
                go.transform.position  = billboardPosition;
                go.transform.position += new Vector3(0, dfBillboard.Summary.Size.y / 2, 0);

                // Add editor markers to list
                if (obj.TextureArchive == TextureReader.EditorFlatsTextureArchive)
                {
                    InteriorEditorMarker marker = new InteriorEditorMarker();
                    marker.type       = (InteriorMarkerTypes)obj.TextureRecord;
                    marker.gameObject = go;
                    markers.Add(marker);

                    // Add loot containers for treasure markers (always use pile of clothes icon)
                    if (marker.type == InteriorMarkerTypes.Treasure)
                    {
                        // Create unique LoadID for save system, using 9 lsb and the sign bit from each coord pos int
                        ulong loadID = ((ulong)buildingData.buildingKey) << 30 |
                                       (uint)(obj.XPos << 1 & posMask) << 20 |
                                       (uint)(obj.YPos << 1 & posMask) << 10 |
                                       (uint)(obj.ZPos << 1 & posMask);

                        DaggerfallLoot loot = GameObjectHelper.CreateLootContainer(
                            LootContainerTypes.RandomTreasure,
                            InventoryContainerImages.Chest,
                            billboardPosition,
                            node.transform,
                            DaggerfallLootDataTables.clothingArchive,
                            0, loadID);

                        if (!LootTables.GenerateLoot(loot, (int)GameManager.Instance.PlayerGPS.CurrentLocationType))
                        {
                            DaggerfallUnity.LogMessage(string.Format("DaggerfallInterior: Location type {0} is out of range or unknown.", GameManager.Instance.PlayerGPS.CurrentLocationType), true);
                        }
                    }
                }

                // Add point lights
                if (obj.TextureArchive == TextureReader.LightsTextureArchive)
                {
                    AddLight(obj, go.transform);
                }
            }
        }
 public static void Postfix(Destroyer __instance)
 {
     LootTables.DropLoot("entity:" + (__instance.wormDisassemble != null ? __instance.wormDisassemble.transform : __instance.transform).GetHighestParent().name.Split('(')[0], __instance.transform.position);
 }
 public static void Postfix(ScarabScript __instance)
 {
     LootTables.DropLoot("entity:" + __instance.name.Split(' ', '(')[0], __instance.transform.position);
 }
Пример #29
0
        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);
        }
Пример #30
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);
        }