69 lines
2.3 KiB
TypeScript
69 lines
2.3 KiB
TypeScript
import { useState, useCallback } from 'react'
|
|
import { useStore } from '@nanostores/react'
|
|
import type { TileState } from '../types/tiles'
|
|
import { synthesisMode, setSynthesisMode, type SynthesisMode } from '../stores/synthesisMode'
|
|
import { engineSettings } from '../stores/settings'
|
|
import { generateTileGrid, generateRandomFormula } from '../utils/bytebeatFormulas'
|
|
import { generateFMTileGrid, generateRandomFMPatch, createFMTileState } from '../utils/fmPatches'
|
|
import { createTileStateFromCurrent } from '../utils/tileState'
|
|
import { TILE_GRID } from '../constants/defaults'
|
|
|
|
export function useTileGrid() {
|
|
const mode = useStore(synthesisMode)
|
|
const engineValues = useStore(engineSettings)
|
|
|
|
const [tiles, setTiles] = useState<TileState[][]>(() =>
|
|
mode === 'fm'
|
|
? generateFMTileGrid(TILE_GRID.SIZE, TILE_GRID.COLUMNS, engineValues.complexity)
|
|
: generateTileGrid(TILE_GRID.SIZE, TILE_GRID.COLUMNS, engineValues.complexity)
|
|
)
|
|
|
|
const regenerateAll = useCallback(() => {
|
|
if (mode === 'fm') {
|
|
setTiles(generateFMTileGrid(TILE_GRID.SIZE, TILE_GRID.COLUMNS, engineValues.complexity))
|
|
} else {
|
|
setTiles(generateTileGrid(TILE_GRID.SIZE, TILE_GRID.COLUMNS, engineValues.complexity))
|
|
}
|
|
}, [mode, engineValues.complexity])
|
|
|
|
const regenerateTile = useCallback((row: number, col: number): TileState => {
|
|
let newTile: TileState
|
|
|
|
if (mode === 'fm') {
|
|
const patch = generateRandomFMPatch(engineValues.complexity)
|
|
newTile = createFMTileState(patch)
|
|
} else {
|
|
const newFormula = generateRandomFormula(engineValues.complexity)
|
|
newTile = createTileStateFromCurrent(newFormula)
|
|
}
|
|
|
|
setTiles(prevTiles => {
|
|
const newTiles = [...prevTiles]
|
|
newTiles[row] = [...newTiles[row]]
|
|
newTiles[row][col] = newTile
|
|
return newTiles
|
|
})
|
|
|
|
return newTile
|
|
}, [mode, engineValues.complexity])
|
|
|
|
const switchMode = useCallback((newMode: SynthesisMode) => {
|
|
setSynthesisMode(newMode)
|
|
|
|
if (newMode === 'fm') {
|
|
setTiles(generateFMTileGrid(TILE_GRID.SIZE, TILE_GRID.COLUMNS, engineValues.complexity))
|
|
} else {
|
|
setTiles(generateTileGrid(TILE_GRID.SIZE, TILE_GRID.COLUMNS, engineValues.complexity))
|
|
}
|
|
}, [engineValues.complexity])
|
|
|
|
return {
|
|
tiles,
|
|
setTiles,
|
|
mode,
|
|
regenerateAll,
|
|
regenerateTile,
|
|
switchMode
|
|
}
|
|
}
|