Ejemplo n.º 1
0
        /** Creates a spawn list for given area */
        public void BuildList(MDRArea area, int minLevel, int maxLevel)
        {
            PotentialItems.Clear();

            List <MDRMonsterClass> potentialClasses = new List <MDRMonsterClass>();

            // Find list of all potential monster classes.
            for (int lp = 0; lp < CoM.MonsterClasses.Count; lp++)
            {
                if (area.SpawnMask[lp])
                {
                    potentialClasses.Add(CoM.MonsterClasses[lp]);
                }
            }

            for (int lp = 0; lp < CoM.Monsters.Count; lp++)
            {
                MDRMonster monster = CoM.Monsters[lp];
                if (
                    (monster.AppearsOnLevel >= minLevel) &&
                    (monster.AppearsOnLevel <= maxLevel) &&
                    (potentialClasses.Contains(monster.Type.TypeClass)))
                {
                    addWeight(monster, monster.EncounterChance);
                }
            }

            // Add laired monster at 80% chance.
            if (area.LairedMonster != null)
            {
                addWeight(area.LairedMonster, calculateTotalWeighting() * (1f / 0.20f));
            }
        }
Ejemplo n.º 2
0
        /** Creates a loot list from the given entries under the following rules.
         * The first matching condition will be followed:
         * 1: entry matches "Any" all items will be added within level range at 25% probability.
         * 2: entry matches a [MDRItemClass] name all items of that class and level range are added.
         * 3: entry matches a [MDRItemType] name all items of that type and level range are added.
         * 4: entry matches an item name, that items is added with 4x probability at a minimum weighting of 25 */
        public void BuildList(string[] entries, int minLevel, int maxLevel)
        {
            _minLevel = minLevel;
            _maxLevel = maxLevel;

            PotentialItems.Clear();
            foreach (string entryName in entries)
            {
                var entry = entryName.Trim();
                if (String.Compare(entry, "None", true) == 0)
                {
                    continue;
                }

                if (String.Compare(entry, "Any", true) == 0)
                {
                    foreach (MDRItem item in CoM.Items)
                    {
                        if ((item.AppearsOnLevel < minLevel) || (item.AppearsOnLevel > maxLevel))
                        {
                            continue;
                        }
                        addWeight(item, item.ChanceOfFinding * 0.25f);
                    }
                    continue;
                }

                var itemClass = CoM.ItemClasses.ByName(entry);
                if (itemClass != null)
                {
                    foreach (MDRItem item in CoM.Items)
                    {
                        if ((item.AppearsOnLevel < minLevel) || (item.AppearsOnLevel > maxLevel))
                        {
                            continue;
                        }
                        if (item.Type.TypeClass == itemClass)
                        {
                            addWeight(item, item.ChanceOfFinding);
                        }
                    }
                    continue;
                }

                var itemType = CoM.ItemTypes.ByName(entry);
                if (itemType != null)
                {
                    foreach (MDRItem item in CoM.Items)
                    {
                        if ((item.AppearsOnLevel < minLevel) || (item.AppearsOnLevel > maxLevel))
                        {
                            continue;
                        }
                        if (item.Type == itemType)
                        {
                            addWeight(item, item.ChanceOfFinding);
                        }
                    }
                    continue;
                }

                var itemSpecific = CoM.Items.ByName(entry);
                if (itemSpecific != null)
                {
                    addWeight(itemSpecific, Math.Max(20, itemSpecific.ChanceOfFinding * 4));
                    continue;
                }

                Trace.LogWarning("Data Error: [Loot Table] Entry {0} does not match an item, type or class. ", entryName);
            }
        }