bool CanPlaceFeature(Vector3Int startPos, DungeonFeature feature, out bool inverseX, out bool inverseY) { bool canPlace = true; int startPosX = startPos.x - feature.offset.x - 1; int startPosY = startPos.y - feature.offset.y - 1; int endPosX = startPosX + feature.size.x + 1; int endPosY = startPosY + feature.size.y + 1; //if (feature.offset.y == 0) //{ // startPosY -= 1; // endPosY += 1; //} //if (feature.offset.x == 0) //{ // startPosX -= 1; // endPosX += 1; //} for (int i = startPosX; i <= endPosX; i++) { for (int j = startPosY; j <= endPosY; j++) { if (i >= mapSizeX - 1 || j >= mapSizeY - 1 || map.GetTile(new Vector3Int(i, j, 0)) != wall) { canPlace = false; j = mapSizeY + 100; i = mapSizeX + 100; } } } if (canPlace == true) { inverseX = false; inverseY = false; return(canPlace); } //inverse X ? canPlace = true; startPosX = startPos.x + feature.offset.x + 1; endPosX = startPosX - feature.size.x - 1; //if (feature.offset.x == 0) //{ // startPosX += 1; // endPosX -= 1; //} for (int i = startPosX; i >= endPosX; i--) { for (int j = startPosY; j <= endPosY; j++) { if (i <= -mapSizeX || j >= mapSizeY - 1 || map.GetTile(new Vector3Int(i, j, 0)) != wall) { canPlace = false; } } } if (canPlace == true) { inverseX = true; inverseY = false; return(canPlace); } //inverse Y ? canPlace = true; startPosX = startPos.x - feature.offset.x - 1; startPosY = startPos.y + feature.offset.y + 1; endPosX = startPosX + feature.size.x + 1; endPosY = startPosY - feature.size.y - 1; //if (feature.offset.y == 0) //{ // startPosY += 1; // endPosY -= 1; //} //if (feature.offset.x == 0) //{ // startPosX -= 1; // endPosX += 1; //} for (int i = startPosX; i <= endPosX; i++) { for (int j = startPosY; j >= endPosY; j--) { if (i >= mapSizeX - 1 || j <= -mapSizeY || map.GetTile(new Vector3Int(i, j, 0)) != wall) { canPlace = false; } } } if (canPlace == true) { inverseX = false; inverseY = true; return(canPlace); } //inverse X et Y ? canPlace = true; startPosX = startPos.x + feature.offset.x + 1; startPosY = startPos.y + feature.offset.y + 1; endPosX = startPosX - feature.size.x - 1; endPosY = startPosY - feature.size.y - 1; //if (feature.offset.y == 0) //{ // startPosY += 1; // endPosY -= 1; //} //if (feature.offset.x == 0) //{ // startPosX += 1; // endPosX -= 1; //} for (int i = startPosX; i >= endPosX; i--) { for (int j = startPosY; j >= endPosY; j--) { if (i <= -mapSizeX || j <= -mapSizeY || map.GetTile(new Vector3Int(i, j, 0)) != wall) { canPlace = false; } } } if (canPlace == true) { inverseX = true; inverseY = true; return(canPlace); } inverseX = false; inverseY = false; return(canPlace); }
void PlaceFeature(Vector3Int position, DungeonFeature feature, bool inverseX, bool inverseY, bool placeDoor = true, int doorSize = 1) { int startPosX = position.x; int startPosY = position.y; //* if (placeDoor) { Vector3Int pos = new Vector3Int(); for (int i = 0; i < doorSize; i++) { pos.x = startPosX; pos.y = startPosY; map.SetTile(pos, ground); /* * map.SetTileFlags(pos, TileFlags.None); * map.SetColor(pos, Color.red); * //*/ } /* * map.SetTileFlags(pos, TileFlags.None); * map.SetColor(pos, Color.red); * //*/ } if (!inverseX && !inverseY) { startPosX -= feature.offset.x; startPosY -= feature.offset.y; if (null != feature.text) { int i = startPosX; int j = startPosY; foreach (char c in feature.text.text) { switch (c) { case '0': map.SetTile(new Vector3Int(i, j, 0), ground); i++; break; case '1': map.SetTile(new Vector3Int(i, j, 0), wall); i++; break; case '2': map.SetTile(new Vector3Int(i, j, 0), water); i++; break; case 'x': j++; i = startPosX; break; default: break; } } } else { for (int i = startPosX; i < startPosX + feature.size.x; i++) { for (int j = startPosY; j < startPosY + feature.size.y; j++) { map.SetTile(new Vector3Int(i, j, 0), ground); } } } } else if (inverseX && !inverseY) { startPosX += feature.offset.x; startPosY -= feature.offset.y; if (null != feature.text) { int i = startPosX; int j = startPosY; foreach (char c in feature.text.text) { switch (c) { case '0': map.SetTile(new Vector3Int(i, j, 0), ground); i--; break; case '1': map.SetTile(new Vector3Int(i, j, 0), wall); i--; break; case '2': map.SetTile(new Vector3Int(i, j, 0), water); i--; break; case 'x': j++; i = startPosX; break; default: break; } } } else { for (int i = startPosX; i > startPosX - feature.size.x; i--) { for (int j = startPosY; j < startPosY + feature.size.y; j++) { map.SetTile(new Vector3Int(i, j, 0), ground); } } } } else if (!inverseX && inverseY) { startPosX -= feature.offset.x; startPosY += feature.offset.y; if (null != feature.text) { int i = startPosX; int j = startPosY; foreach (char c in feature.text.text) { switch (c) { case '0': map.SetTile(new Vector3Int(i, j, 0), ground); i++; break; case '1': map.SetTile(new Vector3Int(i, j, 0), wall); i++; break; case '2': map.SetTile(new Vector3Int(i, j, 0), water); i++; break; case 'x': j--; i = startPosX; break; default: break; } } } else { for (int i = startPosX; i < startPosX + feature.size.x; i++) { for (int j = startPosY; j > startPosY - feature.size.y; j--) { map.SetTile(new Vector3Int(i, j, 0), ground); } } } } else { startPosX += feature.offset.x; startPosY += feature.offset.y; if (null != feature.text) { int i = startPosX; int j = startPosY; foreach (char c in feature.text.text) { switch (c) { case '0': map.SetTile(new Vector3Int(i, j, 0), ground); i--; break; case '1': map.SetTile(new Vector3Int(i, j, 0), wall); i--; break; case '2': map.SetTile(new Vector3Int(i, j, 0), water); i--; break; case 'x': j--; i = startPosX; break; default: break; } } } else { for (int i = startPosX; i > startPosX - feature.size.x; i--) { for (int j = startPosY; j > startPosY - feature.size.y; j--) { map.SetTile(new Vector3Int(i, j, 0), ground); } } } } }
private GameObject MakeFeature(DungeonFeature feature, Vector2 position) { position += Vector2.one / 2; //needed to align the feature with the center of each cell GameObject featureGO = (GameObject)Instantiate( feature.Prefab, GetWorldPosition(position) + feature.Offset, Quaternion.identity); switch (feature.Alignment) { case DungeonFeature.CellAlignment.FLOOR: if (!feature.Offset.IsZero()) featureGO.transform.forward = feature.Offset; break; case DungeonFeature.CellAlignment.WALL: if (dungeon.IsOfType(position + Vector2.up, null)) featureGO.transform.up = Vector3.forward; //wall is "above" else if (dungeon.IsOfType(position + Vector2.down, null)) featureGO.transform.up = Vector3.back; //wall is "below" else if (dungeon.IsOfType(position + Vector2.right, null)) featureGO.transform.up = Vector3.right; //wall is to the right else if (dungeon.IsOfType(position + Vector2.left, null)) featureGO.transform.up = Vector3.left; //wall is to the left break; } return featureGO; }