private SCRequirementsSet ProcessItemOnFlag(SCPointOfInterest poi, MapObject rewardSource, Dictionary <ObjectId, SCRequirementsSet> allNpcs) { var flag = (ObjectId)poi.TalkArray[(int)TalkArrayPos.requirement_id]; if (poi.Npc.ObjectId == ObjectId.Fairy) { return(new SCRequirementsSet(SCRequirements.Bottle)); } else if (poi.Npc.ObjectId == ObjectId.Princess2) { return(allNpcs[ObjectId.Princess1]); } else if (flag == ObjectId.Unne) { return(allNpcs[ObjectId.Unne].Restrict(SCRequirements.Slab)); } else if (flag == ObjectId.ElfDoc) { return(allNpcs[ObjectId.ElfDoc].Restrict(SCRequirements.Herb)); } else if (flag == ObjectId.Princess1) { return(allNpcs[ObjectId.Princess1]); } else if (flag == ObjectId.Vampire) { return(allNpcs[ObjectId.Vampire]); } else if (flag == ObjectId.None) { return(new SCRequirementsSet(SCRequirements.None)); } throw new NotSupportedException(); }
private SCRequirementsSet GetSecondaryRequirements(SCPointOfInterest poi, MapObject rewardSource, Dictionary <ObjectId, SCRequirementsSet> allNpcs, Dictionary <Item, SCRequirementsSet> allOrbs) { if (poi.TalkRoutine == newTalkRoutines.Talk_ElfDocUnne) { if (poi.TalkArray[(int)TalkArrayPos.requirement_id] == (byte)Item.Herb) { return(new SCRequirementsSet(SCRequirements.Herb)); } else if (poi.TalkArray[(int)TalkArrayPos.requirement_id] == (byte)Item.Slab) { return(new SCRequirementsSet(SCRequirements.Herb)); } } else { switch (poi.TalkRoutine) { case newTalkRoutines.Talk_Bikke: return(new SCRequirementsSet(SCRequirements.None)); case newTalkRoutines.Talk_GiveItemOnFlag: return(ProcessItemOnFlag(poi, rewardSource, allNpcs)); case newTalkRoutines.Talk_Nerrick: case newTalkRoutines.Talk_TradeItems: case newTalkRoutines.Talk_GiveItemOnItem: case newTalkRoutines.Talk_Astos: return(ProcessItemOnItem(poi, rewardSource, allNpcs, allOrbs)); } } throw new NotSupportedException(); }
private void SetPoiAccessFromNeighbors(SCPointOfInterest poi) { poi.BitFlagSet = GetPassableBitFlagSetFromTile(poi.Coords.SmLeft); poi.BitFlagSet.Merge(GetPassableBitFlagSetFromTile(poi.Coords.SmRight)); poi.BitFlagSet.Merge(GetPassableBitFlagSetFromTile(poi.Coords.SmUp)); poi.BitFlagSet.Merge(GetPassableBitFlagSetFromTile(poi.Coords.SmDown)); }
private void ProcessSpecialTileProps(int x, int y, byte tileId, SCTileDef tileDef) { var poi = new SCPointOfInterest { Coords = new SCCoords(x, y), TileDef = tileDef, TileId = tileId }; if ((tileDef.OWBitFlags & SCBitFlags.Enter) > 0) { var overworldTeleport = (OverworldTeleportIndex)(tileDef.TileProp.Byte2 & 0x3F); var teleDef = enter[(int)overworldTeleport]; var t = new SCTeleport { Coords = poi.Coords, Type = SCPointOfInterestType.OwEntrance, TargetMap = teleDef.Map, TargetCoords = new SCCoords { X = teleDef.X, Y = teleDef.Y }, OverworldTeleport = overworldTeleport }; Exits.Add(t); poi.Type = SCPointOfInterestType.Tele; poi.Teleport = t; PointsOfInterest.Add(poi); } else if ((tileDef.OWBitFlags & SCBitFlags.Caravan) > 0) { poi.Type = SCPointOfInterestType.Shop; poi.ShopId = 69; PointsOfInterest.Add(poi); } }
private void ProcessQuestNpc(ref NPC npc) { var routine = npcdata.GetRoutine(npc.ObjectId); var talkArray = npcdata.GetTalkArray(npc.ObjectId); var poi = new SCPointOfInterest { Coords = new SCCoords(npc.Coord.x, npc.Coord.y), Type = SCPointOfInterestType.QuestNpc, Npc = npc, TalkRoutine = routine, TalkArray = talkArray }; PointsOfInterest.Add(poi); //if (blocked) Tiles[poi.Coords.X, poi.Coords.Y].Tile |= SCBitFlags.Blocked; }
private SCRequirementsSet ProcessItemOnItem(SCPointOfInterest poi, MapObject rewardSource, Dictionary <ObjectId, SCRequirementsSet> allNpcs, Dictionary <Item, SCRequirementsSet> allOrbs) { if (rewardSource.AccessRequirement == AccessRequirement.EarthOrb) { return(allOrbs[Item.EarthOrb]); } else if (rewardSource.AccessRequirement == AccessRequirement.FireOrb) { return(allOrbs[Item.FireOrb]); } else if (rewardSource.AccessRequirement == AccessRequirement.WaterOrb) { return(allOrbs[Item.WaterOrb]); } else if (rewardSource.AccessRequirement == AccessRequirement.AirOrb) { return(allOrbs[Item.AirOrb]); } return(new SCRequirementsSet(rewardSource.AccessRequirement)); }
private void SetPoiAccess(SCPointOfInterest poi) { poi.BitFlagSet = GetBitFlagSetFromTile(poi.Coords); }
private void ProcessSpecialTileProps(int x, int y, byte tileId, SCTileDef tileDef) { var poi = new SCPointOfInterest { Coords = new SCCoords(x, y), TileDef = tileDef, TileId = tileId }; if (tileDef.TileProp.TilePropFunc == (TilePropFunc.TP_NOMOVE | TilePropFunc.TP_SPEC_DOOR) && tileDef.TileProp.ShopId > 0) { poi.Type = SCPointOfInterestType.Shop; poi.ShopId = tileDef.TileProp.ShopId; PointsOfInterest.Add(poi); } else if (tileDef.SpBitFlags == SCBitFlags.Warp) { if ((CFlags & SCMapCheckFlags.NoWarp) > 0) { return; } var t = new SCTeleport { Coords = poi.Coords, Type = SCPointOfInterestType.Warp }; Exits.Add(t); poi.Type = SCPointOfInterestType.Warp; poi.Teleport = t; PointsOfInterest.Add(poi); } else if (tileDef.SpBitFlags == SCBitFlags.Teleport) { var teleDef = tele[tileDef.TileProp.Byte2]; var t = new SCTeleport { Coords = poi.Coords, Type = SCPointOfInterestType.Tele, TargetMap = teleDef.Map, TargetCoords = new SCCoords { X = teleDef.X, Y = teleDef.Y }.SmClamp }; Exits.Add(t); poi.Type = SCPointOfInterestType.Tele; poi.Teleport = t; PointsOfInterest.Add(poi); } else if ((tileDef.SpBitFlags & SCBitFlags.Exit) == SCBitFlags.Exit) { var teleDef = exit[tileDef.TileProp.Byte2]; var t = new SCTeleport { Coords = poi.Coords, Type = SCPointOfInterestType.Exit, TargetMap = teleDef.Map, TargetCoords = new SCCoords { X = teleDef.X, Y = teleDef.Y } }; Exits.Add(t); poi.Type = SCPointOfInterestType.Exit; poi.Teleport = t; PointsOfInterest.Add(poi); } else if (tileDef.SpBitFlags == SCBitFlags.Treasure) { poi.Type = SCPointOfInterestType.Treasure; poi.TreasureId = tileDef.TileProp.Byte2; PointsOfInterest.Add(poi); Tiles[x, y].Tile |= SCBitFlags.Blocked; } else if (tileDef.SpBitFlags == SCBitFlags.EarthOrb) { poi.Type = SCPointOfInterestType.Orb; poi.ItemId = Item.EarthOrb; PointsOfInterest.Add(poi); } else if (tileDef.SpBitFlags == SCBitFlags.FireOrb) { poi.Type = SCPointOfInterestType.Orb; poi.ItemId = Item.FireOrb; PointsOfInterest.Add(poi); } else if (tileDef.SpBitFlags == SCBitFlags.WaterOrb) { poi.Type = SCPointOfInterestType.Orb; poi.ItemId = Item.WaterOrb; PointsOfInterest.Add(poi); } else if (tileDef.SpBitFlags == SCBitFlags.AirOrb) { poi.Type = SCPointOfInterestType.Orb; poi.ItemId = Item.AirOrb; PointsOfInterest.Add(poi); } }