public static bool FindGoodDuplicatePosAround(LogicLevel level, int x, int y, out int outputX, out int outputY, int radiusInTiles) { int width = level.GetWidth(); int height = level.GetHeight(); int radius = radiusInTiles << 9; if (-512 * radiusInTiles < x) { x = x >= 0 ? x : 0; } if (-512 * radiusInTiles < y) { y = y >= 0 ? y : 0; } if (level.IsNpcVillage()) { if (x <= 0) { x = 512; } if (y <= 0) { y = 512; } width -= 512; height -= 512; if (x - radius > width || y - radius > height) { outputX = 0; outputY = 0; return(false); } } int startX = x; int startY = y; if (x < width + radius) { startX = x <= width ? x : width; } if (y < height + radius) { startY = y <= height ? y : height; } int tileX = startX / 512 - 1; int tileY = startY / 512 - 1; for (int i = 0; i < 9; i++) { int randomPos = (i + 4) % 9; int randomX = tileX + randomPos % 3; int randomY = tileY + randomPos / 3; LogicTile tile = level.GetTileMap().GetTile(randomX, randomY); if (tile != null) { if (tile.GetPassableFlag() != 0) { if (i == 0) { outputX = startX; outputY = startY; return(true); } outputX = randomX << 9; outputY = randomY << 9; return(true); } for (int j = 0; j < 4; j++) { if (tile.IsPassablePathFinder(j & 1, j >> 1)) { outputX = (randomX << 9) | ((j & 1) << 8); outputY = (randomY << 9) + ((j >> 1) << 8); return(true); } } } } outputX = 0; outputY = 0; return(false); }
public static bool GetNearestValidAttackPos(LogicLevel level, int x, int y, out int outputX, out int outputY) { if ((uint)x > 0xFFFFF600) { x = 0; } if ((uint)y > 0xFFFFF600) { y = 0; } int width = level.GetWidth(); int height = level.GetHeight(); if (level.IsNpcVillage()) { if (x <= 0) { x = 512; } if (y <= 0) { y = 512; } if (x - 2048 > width || y - 2048 > height) { outputX = 0; outputY = 0; return(false); } width -= 512; height -= 512; } int startX = x; int startY = y; if (x < width + 2560) { startX = x <= width ? x : width; } if (y < height + 2560) { startY = y <= height ? y : height; } int tileX = startX / 512 - 1; int tileY = startY / 512 - 1; for (int i = 0; i < 9; i++) { int randomPos = (i + 4) % 9; int randomX = tileX + randomPos % 3; int randomY = tileY + randomPos / 3; LogicTile tile = level.GetTileMap().GetTile(randomX, randomY); if (tile != null && level.GetTileMap().IsValidAttackPos(randomX, randomY)) { if (tile.GetPassableFlag() != 0) { if (i == 0) { outputX = startX; outputY = startY; return(true); } outputX = randomX << 9; outputY = randomY << 9; return(true); } for (int j = 0; j < 4; j++) { if (tile.IsPassablePathFinder(j & 1, j >> 1)) { outputX = (randomX << 9) | ((j & 1) << 8); outputY = (randomY << 9) + ((j >> 1) << 8); return(true); } } } } outputX = 0; outputY = 0; return(false); }