public void RemoveTilesAround(DoWorld world, DoRegion biggestRegion, int x, int y, int radius) { if (biggestRegion != null) biggestRegion.Remove(world.GetTileAt(x, y)); for (int i = -radius; i <= radius; i++) { for (int j = -radius; j <= radius; j++) { int idX = x + i; int idY = y + j; if (idX >= borderWidth && idY >= borderWidth && idX < world.WorldWidth - borderWidth && idY < world.WorldHeight - borderWidth) { int dist = world.GetDistance8Neigh(x, y, idX, idY); if (dist <= radius && world.GetTileAt(idX, idY).TopObject != DoTile.ObjectOnTop.Player && world.GetTileAt(idX, idY).TopObject != DoTile.ObjectOnTop.BigPortal && world.GetTileAt(idX, idY).TopObject != DoTile.ObjectOnTop.SingleBlocker && world.GetTileAt(idX, idY).TopObject != DoTile.ObjectOnTop.SmallPortal) { world.GetTileAt(idX, idY).Type = DoTile.TileType.Empty; world.GetTileAt(idX, idY).TopObject = DoTile.ObjectOnTop.None; world.GetTileAt(idX, idY).SpawnEnemyHere = false; } } } } }
private void PlaceAllTheStuff(DoRegion biggestRegion) { for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { DoTile curTile = CurWorld.GetTileAt(i, j); //you are in the ground: if (curTile.Type == DoTile.TileType.Empty) { //create grass if (RandFloat() < grassOnGroundChance) curTile.TopObject = DoTile.ObjectOnTop.Grass; //create obstacle else if (CurWorld.CountNeighbours(i, j, (x => (x.Type == DoTile.TileType.Obstacle || x.TopObject == DoTile.ObjectOnTop.SingleBlocker))) == 0) { if (RandFloat() < singleObstacleChanceOnGround) curTile.TopObject = DoTile.ObjectOnTop.SingleBlocker; } //create pool: else if (RandFloat() < poolSpawnChance) curTile.TopObject = DoTile.ObjectOnTop.Pool; if (curTile.TopObject == DoTile.ObjectOnTop.Grass || curTile.TopObject == DoTile.ObjectOnTop.None) { if (RandFloat() < enemyChance) { curTile.SpawnEnemyHere = true; } } } //you are on a obstacle: else if (curTile.Type == DoTile.TileType.Obstacle) { if (CurWorld.HasLowerNeighbour(i, j, DoTile.TileType.Obstacle)) { //create grass: if (RandFloat() < grassOnObstacleChance) curTile.TopObject = DoTile.ObjectOnTop.Grass; //create obstacle else if (RandFloat() < singleObstaclesChanceOnObstacles) curTile.TopObject = DoTile.ObjectOnTop.SingleBlocker; } } } } DoTile bigPortalTile = biggestRegion.GetTile( random.Next(biggestRegion.RegionSize())); RemoveTilesAround(CurWorld, biggestRegion, bigPortalTile.X, bigPortalTile.Y, 8); bigPortalTile.TopObject = DoTile.ObjectOnTop.BigPortal; for (int i = 0; i < PortalStoneTarget.NUM_COLORS; i++) { DoTile smallPortalTile = biggestRegion.GetTile(random.Next(biggestRegion.RegionSize())); RemoveTilesAround(CurWorld, biggestRegion, smallPortalTile.X, smallPortalTile.Y, 2); smallPortalTile.TopObject = DoTile.ObjectOnTop.SmallPortal; } DoTile playerStartTile = biggestRegion.GetTile(random.Next(biggestRegion.RegionSize())); RemoveTilesAround(CurWorld, biggestRegion, playerStartTile.X, playerStartTile.Y, 4); playerStartTile.TopObject = DoTile.ObjectOnTop.Player; }
private void FillRegion(DoRegion region, DoWorld world, int[,] markedTiles, int x, int y) { //is inside the level: if (x >= 0 && y >= 0 && y < height && x < width) { //label is not 0 -> its marked by a region if (markedTiles[x, y] != 0 || world.GetTileAt(x, y).Type == DoTile.TileType.Obstacle) return; else { markedTiles[x, y] = region.RegionId; region.AddTile(world.GetTileAt(x, y)); FillRegion(region, world, markedTiles, x - 1, y); FillRegion(region, world, markedTiles, x + 1, y); FillRegion(region, world, markedTiles, x, y - 1); FillRegion(region, world, markedTiles, x, y + 1); } } }