static void Drop(string code, Vector3 pos, int itemLevel, QualityFactors qualityFactors = new QualityFactors()) { var treasureClass = TreasureClass.Find(code); if (treasureClass == null) { var item = Item.Create(code); if (item == null) { Debug.LogWarning("Item wasn't spawned: " + code); return; } item.level = itemLevel; SelectItemQuality(item, qualityFactors, mf: 1000); if (item.quality != Item.Quality.HiQuality && item.quality != Item.Quality.Normal && item.quality != Item.Quality.LowQuality) { item.identified = false; } GenerateItemProperties(item); GenerateItemQuantity(item); Pickup.Create(pos, item); } else { Drop(treasureClass, pos, itemLevel, qualityFactors); } }
static MonStat() { foreach (MonStat stat in sheet) { var key = stat.id.ToLower(); if (stats.ContainsKey(key)) { stats.Remove(key); } stats.Add(key, stat); stat.ext = MonStatsExtended.Find(stat.monStatEx); stat.name = stat.nameStr == null ? null : Translation.Find(stat.nameStr); stat.minion1 = stat.minion1Id == null ? null : Find(stat.minion1Id); stat.minion2 = stat.minion2Id == null ? null : Find(stat.minion2Id); stat.sound = MonSound.Find(stat.monSoundId); stat.uniqueSound = MonSound.Find(stat.uMonSoundId); foreach (var tcInfo in stat.treasureClass) { tcInfo.normal = TreasureClass.Find(tcInfo._normal); tcInfo.champion = TreasureClass.Find(tcInfo._champion); tcInfo.unique = TreasureClass.Find(tcInfo._unique); tcInfo.quest = TreasureClass.Find(tcInfo._quest); } } }
private static void GenerateFromItemTypes() { var nodes = new List <Node>(); foreach (var type in ItemType.sheet) { if (!type.treasureClass) { continue; } for (int i = 0; i < 100; i += 3) { var treasureClass = new TreasureClass(); treasureClass.name = type.code + i; treasureClass.picks = 1; byName.Add(treasureClass.name, treasureClass); nodes.Clear(); foreach (var item in ItemInfo.all) { if (item.level > i && item.level <= i + 3 && item.HasType(type)) { var node = new Node(); node.code = item.code; node.prob = 1; nodes.Add(node); treasureClass.probSum += node.prob; } } treasureClass.nodeArray = nodes.ToArray(); } } }
static MonStat() { foreach(MonStat stat in sheet) { var key = stat.id.ToLower(); if (monStats.ContainsKey(key)) { monStats.Remove(key); } monStats.Add(key, stat); stat.ext = MonStatsExtended.Find(stat.monStatEx); stat.name = stat.nameStr == null ? null : Translation.Find(stat.nameStr); stat.minion1 = stat.minion1Id == null ? null : Find(stat.minion1Id); stat.minion2 = stat.minion2Id == null ? null : Find(stat.minion2Id); stat.sound = MonSound.Find(stat.monSoundId); stat.uniqueSound = MonSound.Find(stat.uMonSoundId); for(int i = 0; i < stat.treasureClass.Length; ++i) { stat.treasureClass[i].normal = TreasureClass.Find(stat.treasureClass[i]._normal); stat.treasureClass[i].champion = TreasureClass.Find(stat.treasureClass[i]._champion); stat.treasureClass[i].unique = TreasureClass.Find(stat.treasureClass[i]._unique); stat.treasureClass[i].quest = TreasureClass.Find(stat.treasureClass[i]._quest); } } }
/// <summary> /// Creates a new Quest with the provided values. /// </summary> /// <param name="questId">A unique identifier for this Quest</param> /// <param name="name">The user-friendly Name of the Quest</param> /// <param name="description">The user-friendly Description of the Quest</param> /// <param name="itemsToComplete">The complete list of ItemsToComplete for the Quest</param> /// <param name="rewardEXP">How many experience points are rewarded upon completion</param> /// <param name="rewardGold">How much gold is rewarded upon completion</param> /// <param name="rewardItems">The TreasureClass for items rewarded upon completion</param> public Quest(int questId, string name, string description, List <ItemQuantity> itemsToComplete, int rewardEXP, int rewardGold, TreasureClass rewardItems) { QuestId = questId; Name = name; Description = description; ItemsToComplete = itemsToComplete; RewardEXP = rewardEXP; RewardGold = rewardGold; RewardItems = rewardItems; }
private void OnCharacterDeath(Character target, Character killer) { if (target.monStat == null) { return; } TreasureClass tc = target.monStat.treasureClass[0].normal; tc = tc.Upgraded(target.level); Drop(tc, target.transform.position, target.level); }
/// <summary> /// Creates a new Quest with the provided values. /// </summary> /// <param name="questID">A unique identifier for this Quest</param> /// <param name="name">The user-friendly Name of the Quest</param> /// <param name="description">The user-friendly Description of the Quest</param> /// <param name="rewardExp">How many experience points are rewarded upon completion</param> /// <param name="rewardGold">How much gold is rewarded upon completion</param> /// <param name="rewardItems">The TreasureClass for items rewarded upon completion</param> /// <param name="itemsToComplete">ItemsToComplete for the Quest</param> public Quest(int questID, string name, string description, int rewardExp, int rewardGold, TreasureClass rewardItems, params ItemQuantity[] itemsToComplete) { QuestId = questID; Name = name; Description = description; RewardEXP = rewardExp; RewardGold = rewardGold; RewardItems = rewardItems; ItemsToComplete = new List <ItemQuantity>(); foreach (var item in itemsToComplete) { ItemsToComplete.Add(item); } }
private void OnUnitDeath(Unit target, Unit killer) { if (target.monStat == null) { return; } TreasureClass tc = target.monStat.treasureClass[0].normal; if (tc == null) { return; } tc = tc.Upgraded(target.level); Drop(tc, target.transform.position, target.level); }
/// <summary> /// Parses TreasureClass data, used by Monsters when they die to generate loot. /// </summary> private static void InitializeTreasureClasses() { TreasureClasses = new TreasureClass(); string treasureClassPath = $@"{DataPath}\TreasureClass.txt"; using (CsvReader csv = new CsvReader(new StreamReader(treasureClassPath), true, '\t')) { while (csv.ReadNextRecord()) { string key = csv["treasureclass"]; string val1 = csv["item1"]; string val2 = csv["item2"]; string val3 = csv["item3"]; TreasureClasses.AddTreasureClass(key, val1, val2, val3); } } }
static void Drop(TreasureClass treasureClass, Vector3 pos, int itemLevel, QualityFactors qualityFactors = new QualityFactors()) { qualityFactors.unique = Mathf.Max(qualityFactors.unique, treasureClass.unique); qualityFactors.set = Mathf.Max(qualityFactors.set, treasureClass.set); qualityFactors.rare = Mathf.Max(qualityFactors.rare, treasureClass.rare); qualityFactors.magic = Mathf.Max(qualityFactors.magic, treasureClass.magic); int noDrop = 0; // value is temporary just to increase drop for debugging purposes, should be treasureClass.noDrop for (int i = 0; i < treasureClass.picks; ++i) { int sample = Random.Range(0, treasureClass.probSum + noDrop); foreach (var node in treasureClass.nodeArray) { if (node.code == null) { break; } if (sample < node.prob) { Drop(node.code, pos, itemLevel, qualityFactors); break; } sample -= node.prob; } } for (int i = 0; i < -treasureClass.picks; ++i) { var node = treasureClass.nodeArray[i]; if (node.code == null) { break; } for (int j = 0; j < node.prob; ++j) { Drop(node.code, pos, itemLevel, qualityFactors); } } }
static TreasureClass() { GenerateFromItemTypes(); for (int i = 0; i < sheet.Count; ++i) { TreasureClass tc = sheet[i]; if (tc.name == null) { continue; } if (byName.ContainsKey(tc.name)) { continue; } byName.Add(tc.name, tc); tc.index = i; } foreach (TreasureClass tc in sheet) { if (tc.name == null) { continue; } tc.probSum = 0; for (int i = 0; i < tc.nodeArray.Length; ++i) { var node = tc.nodeArray[i]; if (node.code == null) { break; } if (node.code.StartsWith("\"gld")) { node.code = "gld"; // todo correctly parse strings like "gld,mul=123" } tc.probSum += node.prob; tc.nodeArray[i] = node; } } }
public static List <Item> CreateLoot(Player owner, int treasureClassId) { List <Item> items = new List <Item>(); if (MPQStorage.Data.Assets[SNOGroup.TreasureClass].ContainsKey(treasureClassId)) { TreasureClass treasureClass = (TreasureClass)MPQStorage.Data.Assets[SNOGroup.TreasureClass][treasureClassId].Data; foreach (LootDropModifier modifier in treasureClass.LootDropModifiers) { ItemTable definition = ItemGenerator.GetItemDefinition(modifier.ItemSpecifier.ItemGBId); if (definition != null) { Item item = ItemGenerator.CreateItem(owner, definition); item.Attributes[GameAttribute.Item_Quality_Level] = (modifier.GBIdQualityClass > 0) ? modifier.GBIdQualityClass : 0; items.Add(item); } } } return(items); }
public static void LoadAll() { var sw = System.Diagnostics.Stopwatch.StartNew(); Translation.Load(); SoundInfo.Load(); SoundEnvironment.Load(); ObjectInfo.Load(); BodyLoc.Load(); ExpTable.Load(); LevelType.Load(); LevelWarpInfo.Load(); LevelPreset.Load(); LevelMazeInfo.Load(); LevelInfo.Load(); OverlayInfo.Load(); MissileInfo.Load(); ItemStat.Load(); ItemRatio.Load(); ItemType.Load(); ItemPropertyInfo.Load(); ItemSet.Load(); UniqueItem.Load(); SetItem.Load(); TreasureClass.Load(); MagicAffix.Load(); CharStatsInfo.Load(); MonLvl.Load(); MonPreset.Load(); MonSound.Load(); MonStatsExtended.Load(); MonStat.Load(); SuperUnique.Load(); SkillDescription.Load(); SkillInfo.Load(); SpawnPreset.Load(); StateInfo.Load(); Debug.Log("All txt files loaded in " + sw.ElapsedMilliseconds + " ms"); }