You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.4 KiB
TypeScript
74 lines
2.4 KiB
TypeScript
import type { NoiseFunction2D } from 'simplex-noise'
|
|
import {blockTypes as T, level as L, probability as P, type Block} from './def'
|
|
|
|
function trees(r: number, i: number, row: Block[], previousRow: Block[]) {
|
|
const max = row.length - 1
|
|
const h = i - 1
|
|
const j = i + 1
|
|
|
|
if (row[i] === T.treeTopMiddle) {
|
|
if (i) {
|
|
if (row[h] === T.treeTopRight) row[h] = T.treeTopLeftMixed
|
|
else row[h] = T.treeTopLeft
|
|
}
|
|
if (i < max) row[j] = T.treeTopRight
|
|
|
|
} else if (previousRow[i] === T.treeTopMiddle) {
|
|
row[i] = T.treeCrownMiddle
|
|
if (i) {
|
|
if (row[h] === T.treeCrownRight) row[h] = T.treeCrownLeftMixed
|
|
else row[h] = T.treeCrownLeft
|
|
}
|
|
if (i < max) row[j] = T.treeCrownRight
|
|
} else if (previousRow[i] === T.treeCrownMiddle) {
|
|
row[i] = T.treeTrunkMiddle
|
|
if (i) {
|
|
if (row[h] === T.treeTrunkRight) row[h] = T.treeTrunkLeftMixed
|
|
else row[h] = T.treeTrunkLeft
|
|
}
|
|
if (i < max) row[j] = T.treeTrunkRight
|
|
} else if (previousRow[i] === T.treeTrunkMiddle) {
|
|
row[i] = T.treeRootMiddle
|
|
if (i) {
|
|
if (row[h] === T.treeRootRight) row[h] = T.treeRootLeftMixed
|
|
else row[h] = T.treeRootLeft
|
|
}
|
|
if (i < max) row[j] = T.treeRootRight
|
|
}
|
|
}
|
|
|
|
function ground(r: number, i: number, row: Block[], previousRow: Block[]) {
|
|
const rootParts = [T.treeRootLeft, T.treeRootMiddle, T.treeRootRight]
|
|
const prevBlock = previousRow[i]
|
|
|
|
if (prevBlock === T.air) {
|
|
if (r < P.soilHole) row[i] = T.air
|
|
else if (row[i] === T.soil) row[i] = T.grass
|
|
} else if (rootParts.indexOf(prevBlock) >= 0) {
|
|
if (row[i] === T.soil) row[i] = T.grass
|
|
}
|
|
}
|
|
|
|
function rock(r: number, i: number, row: Block[], previousRow: Block[]) {
|
|
if (previousRow[i] === T.soil && r < P.fray) row[i] = T.soil
|
|
}
|
|
|
|
function underground(r: number, i: number, row: Block[], previousRow: Block[]) {
|
|
if (previousRow[i] === T.stone && r < P.fray) row[i] = T.stone
|
|
}
|
|
|
|
export default function createBlockExtender(rand: NoiseFunction2D) {
|
|
function extendBlocks(level: number, column: number, row: Block[], previousRow: Block[]) {
|
|
for (let i = 0; i < row.length; i++) {
|
|
const r = rand(level, column + i)
|
|
|
|
if (level < L.ground) trees(r, i, row, previousRow)
|
|
else if (level < L.rock) ground(r, i, row, previousRow)
|
|
else if (level < L.underground) rock(r, i, row, previousRow)
|
|
else underground(r, i, row, previousRow)
|
|
}
|
|
}
|
|
|
|
return extendBlocks
|
|
}
|