|
|
|
@ -3,7 +3,22 @@ import { createNoise2D, type NoiseFunction2D } from 'simplex-noise'
|
|
|
|
|
import createBlockGenerator from './blockGen'
|
|
|
|
|
import createBlockExtender from './blockExt'
|
|
|
|
|
|
|
|
|
|
import {blockTypes as T, level as L, type Block} from './def'
|
|
|
|
|
import {blockTypes, blockTypes as T, level as L, type Block, type BlockType} from './def'
|
|
|
|
|
|
|
|
|
|
// describes a changed block, eg digged or placed by the player
|
|
|
|
|
type DamagedBlock = {
|
|
|
|
|
type: 'damage'
|
|
|
|
|
x: number
|
|
|
|
|
y: number
|
|
|
|
|
damage: number
|
|
|
|
|
}
|
|
|
|
|
type ChangedBlock = {
|
|
|
|
|
type: 'exchange'
|
|
|
|
|
x: number
|
|
|
|
|
y: number
|
|
|
|
|
newType: BlockType
|
|
|
|
|
}
|
|
|
|
|
type Change = DamagedBlock | ChangedBlock
|
|
|
|
|
|
|
|
|
|
const MAX_LIGHT = 100 // maximum level where light shines
|
|
|
|
|
|
|
|
|
@ -17,15 +32,34 @@ export default function createLevel(width: number, height: number, seed = 'extre
|
|
|
|
|
// stores the limit to where light still shines,
|
|
|
|
|
// for each column currently visible on the screen
|
|
|
|
|
const _lightBarrier: number[] = [...new Array(width)].map(() => MAX_LIGHT)
|
|
|
|
|
const _changes: Change[] = []
|
|
|
|
|
|
|
|
|
|
const blockGen = createBlockGenerator(rand)
|
|
|
|
|
const blockExt = createBlockExtender(rand)
|
|
|
|
|
|
|
|
|
|
// Apply changes, coming from the player (tocktocktock-plopp!)
|
|
|
|
|
function change (level: number, column: number, newBlock: Block) {
|
|
|
|
|
// TODO
|
|
|
|
|
function change(change: Change) {
|
|
|
|
|
_changes.push(change)
|
|
|
|
|
console.log(_changes)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function applyPlayerChanges(columnOffset: number, levelOffset: number) {
|
|
|
|
|
for (const change of _changes) {
|
|
|
|
|
// ignore all changes outside of the current view
|
|
|
|
|
if (change.x < columnOffset || change.x > columnOffset + width) continue
|
|
|
|
|
if (change.y < levelOffset || change.y > levelOffset + height) continue
|
|
|
|
|
|
|
|
|
|
if (change.type === 'exchange') {
|
|
|
|
|
_grid[change.y - levelOffset][change.x - columnOffset] = blockTypes[change.newType]
|
|
|
|
|
} else if (change.type === 'damage') {
|
|
|
|
|
console.warn('damaging blocks not yet supported')
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// takes the current columnOffset and generates all blocks from the very top
|
|
|
|
|
// until a block is generated that blocks light. The height of that block is
|
|
|
|
|
// stored in the lightBarrier list
|
|
|
|
|
function calcLightBarrier(columnOffset: number) {
|
|
|
|
|
let previousBlock: Block = T.air
|
|
|
|
|
|
|
|
|
@ -33,6 +67,12 @@ export default function createLevel(width: number, height: number, seed = 'extre
|
|
|
|
|
for (let level = 0; level < MAX_LIGHT; level++) {
|
|
|
|
|
let block = blockGen.generateBlock(level, col + columnOffset)
|
|
|
|
|
block = blockExt.extendBlock(level, col, columnOffset, block, previousBlock)
|
|
|
|
|
|
|
|
|
|
const change = _changes.find(change => {
|
|
|
|
|
return change.x === columnOffset + col && change.y === level
|
|
|
|
|
})
|
|
|
|
|
if (change && change.type === 'exchange') block = blockTypes[change.newType]
|
|
|
|
|
|
|
|
|
|
previousBlock = block
|
|
|
|
|
|
|
|
|
|
if (!block.transparent) {
|
|
|
|
@ -43,21 +83,22 @@ export default function createLevel(width: number, height: number, seed = 'extre
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function generate(column: number, y: number) {
|
|
|
|
|
function generate(columnOffset: number, levelOffset: number) {
|
|
|
|
|
for (let i = 0; i < height; i++) {
|
|
|
|
|
const level = y+i
|
|
|
|
|
const level = levelOffset + i
|
|
|
|
|
const row: Block[] = Array(width)
|
|
|
|
|
const previousRow = i ? _grid[i-1] : [] as Block[]
|
|
|
|
|
|
|
|
|
|
blockGen.fillRow(level, column, row)
|
|
|
|
|
blockExt.extendRow(level, column, row, previousRow)
|
|
|
|
|
blockGen.fillRow(level, columnOffset, row)
|
|
|
|
|
blockExt.extendRow(level, columnOffset, row, previousRow)
|
|
|
|
|
|
|
|
|
|
_grid[i] = row
|
|
|
|
|
}
|
|
|
|
|
applyPlayerChanges(columnOffset, levelOffset)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function sunLight(x: number, y: number) {
|
|
|
|
|
calcLightBarrier(x)
|
|
|
|
|
function sunLight(columnOffset: number) {
|
|
|
|
|
calcLightBarrier(columnOffset)
|
|
|
|
|
return _lightBarrier
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|