/** 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)); } }
/** 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); } }