diff --git a/island.ts b/island.ts index 5e13e86..bdb77c8 100644 --- a/island.ts +++ b/island.ts @@ -104,14 +104,38 @@ export function IslandApplet() { const islands = new IslandGrid(WIDTH, HEIGHT, 128); - const basePos = islands.data.length >> 1; + const len = islands.data.length; + const basePos = len >> 1; + const width = islands.width; + + function drop(pos: number) { + const lowerNeighbors: number[] = []; + + function check(adjPos: number) { + if (islands.data[adjPos] < islands.data[pos]) { + lowerNeighbors.push(adjPos); + } + } + + check((pos - width) % len); + check((pos - 1) % len); + check((pos + 1) % len); + check((pos + width) % len); + + if (lowerNeighbors.length > 0) { + const downhill = lowerNeighbors[islands.rng() % lowerNeighbors.length]; + drop(downhill); + } else { + islands.data[pos]++; + } + } function tick() { const islandTiles = islands.floodSearch(basePos, (tile) => tile > 0); const pos = islandTiles[islands.rng() % islandTiles.length]; - islands.data[pos]++; + drop(pos); renderIslands(islands, cx); }