private void ProcessSmPointOfInterest(SCPointOfInterest poi, byte dungeonIndex) { if (poi.Type == SCPointOfInterestType.Treasure) { ProcessTreasure(poi, dungeonIndex); } else if (poi.Type == SCPointOfInterestType.Shop) { ProcessShop(poi, dungeonIndex); } else if (poi.Type == SCPointOfInterestType.Orb) { ProcessOrb(poi); } else if (poi.Type == SCPointOfInterestType.QuestNpc) { if (!ProcessQuestNpc(poi, dungeonIndex)) { poi.DungeonIndex = dungeonIndex; deferredPointOfInterests.Enqueue(poi); } } else if (poi.Type == SCPointOfInterestType.Exit) { var area = Main.Overworld.Tiles[poi.Teleport.TargetCoords.X, poi.Teleport.TargetCoords.Y].Area; if (!processedAreas.Contains(area)) { immediateAreas.Add(area); } } }
private void ProcessEnterTele(SCOwArea area, SCPointOfInterest poi) { if (processedDungeons.Contains(poi.Teleport.OverworldTeleport)) { return; } processedDungeons.Add(poi.Teleport.OverworldTeleport); var dungeon = Main.Dungeons.First(d => d.OverworldTeleport == poi.Teleport.OverworldTeleport); dungeon.Done = true; foreach (var dpoi in dungeon.PointsOfInterest) { if (dpoi.BitFlagSet.IsAccessible(requirements, changes)) { ProcessSmPointOfInterest(dpoi, (byte)poi.Teleport.OverworldTeleport); } else if (dpoi.Type == SCPointOfInterestType.Treasure || dpoi.Type == SCPointOfInterestType.Shop || dpoi.Type == SCPointOfInterestType.Orb || dpoi.Type == SCPointOfInterestType.QuestNpc || dpoi.Type == SCPointOfInterestType.Exit) { dpoi.DungeonIndex = (byte)poi.Teleport.OverworldTeleport; deferredPointOfInterests.Enqueue(dpoi); } } }
private void ProcessShop(SCPointOfInterest poi, byte dungeonIndex) { if (shopslot != null && poi.ShopId == shopslot.ShopIndex) { ProcessItem(shopslot.Item, dungeonIndex); rewardSources.Add(shopslot); } else if (poi.ShopId == declaredShopSlot.ShopIndex) { rewardSources.Add(declaredShopSlot); poi.Done = true; } }
private void ProcessTreasure(SCPointOfInterest poi, byte dungeonIndex) { if (chests.TryGetValue(poi.TreasureId, out var chest)) { ProcessItem(chest.Item, dungeonIndex); rewardSources.Add(chest); poi.Done = true; } else if (allTreasures.TryGetValue(poi.TreasureId, out var chest1)) { rewardSources.Add(chest1); poi.Done = true; } }
private void ProcessOwPointOfInterest(SCOwArea area, SCPointOfInterest poi) { if (poi.Type == SCPointOfInterestType.Shop) { ProcessShop(poi, 255); } else if (poi.Type == SCPointOfInterestType.Tele) { ProcessEnterTele(area, poi); } else if (poi.Type == SCPointOfInterestType.AirShip) { airShipLocationAccessible = true; } }
private void ProcessOrb(SCPointOfInterest poi) { switch (poi.ItemId) { case Item.EarthOrb: requirements |= AccessRequirement.EarthOrb; break; case Item.FireOrb: requirements |= AccessRequirement.FireOrb; break; case Item.WaterOrb: requirements |= AccessRequirement.WaterOrb; break; case Item.AirOrb: requirements |= AccessRequirement.AirOrb; break; } poi.Done = true; }
private bool ProcessItemOnFlag(SCPointOfInterest poi, MapObject npc, byte dungeonIndex, bool giveItem = true) { var flag = (ObjectId)poi.TalkArray[(int)TalkArrayPos.requirement_id]; if (npc.ObjectId == ObjectId.Fairy) { if (requirements.HasFlag(AccessRequirement.Bottle)) { if (giveItem) { ProcessItem(npc.Item, dungeonIndex); } rewardSources.Add(npc); poi.Done = true; return(true); } } else if (npc.ObjectId == ObjectId.Princess2) { if (princessRescued) { if (giveItem) { ProcessItem(npc.Item, dungeonIndex); } rewardSources.Add(npc); poi.Done = true; return(true); } } else if (flag == ObjectId.Unne) { if (slabTranslated) { if (giveItem) { ProcessItem(npc.Item, dungeonIndex); } rewardSources.Add(npc); poi.Done = true; return(true); } } else if (flag == ObjectId.ElfDoc) { if (herbCheckedIn) { if (giveItem) { ProcessItem(npc.Item, dungeonIndex); } rewardSources.Add(npc); poi.Done = true; return(true); } } else if (flag == ObjectId.Princess1) { if (princessRescued) { if (giveItem) { ProcessItem(npc.Item, dungeonIndex); } rewardSources.Add(npc); poi.Done = true; return(true); } } else if (flag == ObjectId.Vampire) { if (vampireAccessible) { if (giveItem) { ProcessItem(npc.Item, dungeonIndex); } rewardSources.Add(npc); poi.Done = true; return(true); } } else if (flag == ObjectId.None) { if (giveItem) { ProcessItem(npc.Item, dungeonIndex); } rewardSources.Add(npc); poi.Done = true; return(true); } return(false); }
private bool ProcessQuestNpc(SCPointOfInterest poi, byte dungeonIndex) { if (poi.Npc.ObjectId == ObjectId.Princess1) { princessRescued = true; poi.Done = true; return(true); } else if (poi.Npc.ObjectId == ObjectId.Vampire) { vampireAccessible = true; poi.Done = true; return(true); } else if (poi.TalkRoutine == newTalkRoutines.Talk_ElfDocUnne) { if (poi.TalkArray[(int)TalkArrayPos.requirement_id] == (byte)Item.Herb) { if (requirements.HasFlag(AccessRequirement.Herb)) { herbCheckedIn = true; poi.Done = true; return(true); } } else if (poi.TalkArray[(int)TalkArrayPos.requirement_id] == (byte)Item.Slab) { if (requirements.HasFlag(AccessRequirement.Slab)) { slabTranslated = true; poi.Done = true; return(true); } } } else if (npcs.TryGetValue(poi.Npc.ObjectId, out var npc)) { switch (poi.TalkRoutine) { case newTalkRoutines.Talk_Bikke: ProcessItem(npc.Item, dungeonIndex); rewardSources.Add(npc); poi.Done = true; return(true); case newTalkRoutines.Talk_GiveItemOnFlag: return(ProcessItemOnFlag(poi, npc, dungeonIndex)); case newTalkRoutines.Talk_Nerrick: case newTalkRoutines.Talk_TradeItems: case newTalkRoutines.Talk_GiveItemOnItem: case newTalkRoutines.Talk_Astos: if (requirements.HasFlag(npc.AccessRequirement)) { ProcessItem(npc.Item, dungeonIndex); rewardSources.Add(npc); poi.Done = true; return(true); } break; default: return(true); } } else if (allQuestNpcs.TryGetValue(poi.Npc.ObjectId, out var npc1)) { switch (poi.TalkRoutine) { case newTalkRoutines.Talk_Bikke: rewardSources.Add(npc1); poi.Done = true; return(true); case newTalkRoutines.Talk_GiveItemOnFlag: return(ProcessItemOnFlag(poi, npc1, dungeonIndex, false)); case newTalkRoutines.Talk_Nerrick: case newTalkRoutines.Talk_TradeItems: case newTalkRoutines.Talk_GiveItemOnItem: case newTalkRoutines.Talk_Astos: if (requirements.HasFlag(npc1.AccessRequirement)) { rewardSources.Add(npc1); poi.Done = true; return(true); } break; default: return(true); } } return(false); }