public void SetNpc(TriadNpc inNpc) { npc = inNpc; UpdateStatusDescription(); labelNpc.Text = "NPC: " + ((npc != null) ? npc.ToString() : "unknown"); labelRules.Text = "Rules: npc changed, waiting for scan..."; }
private bool UpdateNpcs(GameDataLists gameDataLists, Dictionary <string, TriadGameModifier> mapRuleNames) { Logger.WriteLine("Updating npc list..."); TriadCardDB cardDB = TriadCardDB.Get(); TriadNpcDB npcDB = TriadNpcDB.Get(); var validDeckIds = new List <string>(); foreach (var npcData in gameDataLists.npcs) { if (npcData.LinkedNpcId == null) { continue; } if (npcData.LinkedNpcId.LinkedName == null || npcData.LinkedNpcId.LinkedLocation == null) { continue; } TriadDeck npcDataDeck = new TriadDeck(); foreach (var cardData in npcData.LinkedCardsFixed) { npcDataDeck.knownCards.Add(cardDB.cards[cardData.Id]); } foreach (var cardData in npcData.LinkedCardsVariable) { npcDataDeck.unknownCardPool.Add(cardDB.cards[cardData.Id]); } npcDataDeck.UpdateDeckId(); validDeckIds.Add(npcDataDeck.deckId); // mistakes were made... TriadNpc npcOb = npcDB.FindByDeckId(npcDataDeck.deckId); int npcId = (npcOb == null) ? npcDB.npcs.Count : npcOb.Id; if (npcOb != null) { // ensure decks are the same if (!npcOb.Deck.Equals(npcDataDeck)) { Logger.WriteLine("FAILED npc update, id:{0} name:{1} is not matching cards!", npcId, npcData.LinkedNpcId.LinkedName.Name.GetCodeName()); return(false); } } else { while (npcDB.npcs.Count <= npcId) { npcDB.npcs.Add(null); } var listMods = new List <TriadGameModifier>(); foreach (var ruleData in npcData.LinkedRules) { listMods.Add(mapRuleNames[ruleData.Name.GetCodeName()]); } var listRewards = new List <TriadCard>(); foreach (var rewardData in npcData.LinkedRewards) { listRewards.Add(cardDB.cards[rewardData.LinkedCard.Id]); } npcOb = new TriadNpc(npcId, listMods, listRewards, npcDataDeck); Logger.WriteLine(">> adding new npc: " + npcOb.ToString()); npcDB.npcs[npcId] = npcOb; } var linkedLoc = npcData.LinkedNpcId.LinkedLocation; linkedLoc.LinkedMap.GetCoords(linkedLoc.ScaledPosX, linkedLoc.ScaledPosZ, out npcOb.LocationX, out npcOb.LocationY); npcOb.Name.Text = npcData.LinkedNpcId.LinkedName.Name.Text; npcOb.LocationMap.Text = npcData.LinkedNpcId.LinkedLocation.LinkedMap.LinkedPlace.Name.Text; } for (int idx = 0; idx < npcDB.npcs.Count; idx++) { TriadNpc npcOb = npcDB.npcs[idx]; if (npcOb != null) { if (!validDeckIds.Contains(npcOb.Deck.deckId)) { Logger.WriteLine(">> removing npc: " + npcOb.ToString() + ", deck:" + npcOb.Deck.ToString()); npcDB.npcs[idx] = null; continue; } if (npcOb.Id != idx) { Logger.WriteLine("FAILED npc update, index mismatch for npc[{0}].Id:{1}, Name:{2}", idx, npcOb.Id, npcOb.Name.GetCodeName()); return(false); } } } return(true); }