diff --git a/src/level/blockExt.ts b/src/level/blockExt.ts index 268cc22..fa74dbe 100644 --- a/src/level/blockExt.ts +++ b/src/level/blockExt.ts @@ -2,7 +2,13 @@ import type { NoiseFunction2D } from 'simplex-noise' import { blockTypes as T, level as L, probability as P } from './def' import type { Block } from '../types.d' -function trees(r: number, i: number, row: Block[], previousRow: Block[]) { +function trees( + r: number, + i: number, + row: Block[], + previousRow: Block[], + nextRow: Block[], +) { const max = row.length - 1 const h = i - 1 const j = i + 1 @@ -10,6 +16,7 @@ function trees(r: number, i: number, row: Block[], previousRow: Block[]) { const above = previousRow[i] const aboveLeft = previousRow[h] const aboveRight = previousRow[j] + const below = nextRow[i] if (current === T.treeCrown) { if (i > 0) row[h] = T.treeLeaves @@ -26,8 +33,8 @@ function trees(r: number, i: number, row: Block[], previousRow: Block[]) { if (i < max) row[j] = T.treeLeaves } else if (above === T.treeTrunk) { - if (current === T.air) row[i] = T.treeTrunk - else row[i] = T.treeRoot + if (below === T.soil || below === T.grass) row[i] = T.treeRoot + else row[i] = T.treeTrunk } else if (above === T.treeRoot) { row[i] = T.soil if (i > 0) row[h] = T.treeRoot @@ -68,9 +75,16 @@ function underground(r: number, i: number, current: Block, above: Block) { } export default function createBlockExtender(rand: NoiseFunction2D) { - function growTrees(level: number, column: number, offset: number, row: Block[], previousRow: Block[]) { + function growTrees( + level: number, + column: number, + offset: number, + row: Block[], + previousRow: Block[], + nextRow: Block[], + ) { const r = rand(level, column + offset) - trees(r, column, row, previousRow) + trees(r, column, row, previousRow, nextRow) } function extendBlock(level: number, column: number, offset: number, current: Block, above: Block) { @@ -81,10 +95,16 @@ export default function createBlockExtender(rand: NoiseFunction2D) { return underground(r, column, current, above) } - function extendRow(level: number, columnOffset: number, row: Block[], previousRow: Block[]) { + function extendRow( + level: number, + columnOffset: number, + row: Block[], + previousRow: Block[], + nextRow: Block[], + ) { for (let column = 0; column < row.length; column++) { if (level < L.ground) { - // growTrees(level, column, columnOffset, row, previousRow) + growTrees(level, column, columnOffset, row, previousRow, nextRow) } else { row[column] = extendBlock(level, column, columnOffset, row[column], previousRow[column]) } diff --git a/src/level/def.ts b/src/level/def.ts index 703a4b0..b1380b2 100644 --- a/src/level/def.ts +++ b/src/level/def.ts @@ -49,7 +49,7 @@ export const level = { } export const probability = { - tree: 0.3, + tree: 0.2, soilHole: 0.3, soilGravel: 0.2, stoneGravel: 0.1, diff --git a/src/level/index.ts b/src/level/index.ts index 1019f1c..fc3ed86 100644 --- a/src/level/index.ts +++ b/src/level/index.ts @@ -75,9 +75,10 @@ export default function createLevel(width: number, height: number, seed = 'extre const level = levelOffset + i const row: Block[] = Array(width) const previousRow = i ? _grid[i-1] : [] as Block[] + const nextRow = _grid[i+1] ?? [] as Block[] blockGen.fillRow(level, columnOffset, row) - blockExt.extendRow(level, columnOffset, row, previousRow) + blockExt.extendRow(level, columnOffset, row, previousRow, nextRow) _grid[i] = row }