protected void FillLevelExits(Level level, CollisionMap cmap) { var ptCenters = cmap.GetPtCenters(); for (var pRoom = level.pRoom2First; pRoom != 0;) { var room = game.Debugger.Read <Room2>(pRoom); var roomsNear = game.Debugger.ReadArray <uint>(room.pRoom2Near, (int)room.dwRoomsNear); foreach (var pr in roomsNear) { var r = game.Debugger.Read <Room2>(pr); var lvl = game.Debugger.Read <Level>(r.pLevel); if (lvl.dwLevelNo != level.dwLevelNo) { int nRoomX = (int)room.dwPosX * 5; int nRoomY = (int)room.dwPosY * 5; foreach (var ptCenter in ptCenters) { if ((ptCenter.X + cmap.LevelOrigin.X) >= (short)nRoomX && (ptCenter.X + cmap.LevelOrigin.X) <= (short)(nRoomX + (room.dwSizeX * 5))) { if ((ptCenter.Y + cmap.LevelOrigin.Y) >= (short)nRoomY && (ptCenter.Y + cmap.LevelOrigin.Y) <= (short)(nRoomY + (room.dwSizeY * 5))) { var exit = new LevelExit { dwTargetLevel = lvl.dwLevelNo, ptPos = new Point(ptCenter.X + cmap.LevelOrigin.X, ptCenter.Y + cmap.LevelOrigin.Y), dwType = (uint)ExitType.Level, dwId = 0, pRoom2 = 0, }; if (!levelExits.ContainsKey(level.dwLevelNo)) { levelExits.Add(level.dwLevelNo, new List <LevelExit>()); } if (levelExits[level.dwLevelNo].Find(it => it.dwTargetLevel == lvl.dwLevelNo) == null) { levelExits[level.dwLevelNo].Add(exit); } } } } break; } } pRoom = room.pRoom2Next; } }