Example #1
0
 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);
         }
     }
 }
Example #2
0
        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);
                }
            }
        }
Example #3
0
 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;
     }
 }
Example #4
0
 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;
     }
 }
Example #5
0
 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;
     }
 }
Example #6
0
        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;
        }
Example #7
0
        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);
        }
Example #8
0
        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);
        }