grechka-game/src3d/world/world-storage.js

61 lines
2.0 KiB
JavaScript

import { BLOCKS } from '../data/blocks.js';
import { state } from '../core/state.js';
// Мир-хранилище — используем state.grid и state.blocks для единого источника данных
// Это гарантирует, что все модули (включая loop.js) видят одни и те же данные
const grid = state.grid; // Map: key "gx,gy" => {gx,gy,t, ...}
const blocks = state.blocks; // Array для рендера/перебора видимых
function k(gx, gy) { return gx + ',' + gy; }
function getBlock(gx, gy) { return grid.get(k(gx, gy)); }
function hasBlock(gx, gy) { return grid.has(k(gx, gy)); }
function isSolid(gx, gy) {
const b = getBlock(gx, gy);
if (!b || b.dead) return false;
const def = BLOCKS[b.t];
return !!def.solid && !def.fluid && !def.decor;
}
function setBlock(gx, gy, t, isPlayerPlaced = false) {
const key = k(gx, gy);
if (grid.has(key)) return false;
const b = { gx, gy, t, dead: false, active: false, fuse: 0 };
grid.set(key, b);
blocks.push(b);
state.blocksVersion = (state.blocksVersion || 0) + 1;
// Отслеживаем блоки, установленные игроком
if (isPlayerPlaced) {
state.placedBlocks.push({ gx, gy, t });
}
return true;
}
function removeBlock(gx, gy) {
const key = k(gx, gy);
const b = grid.get(key);
if (!b) return null;
if (BLOCKS[b.t].unbreakable) return null;
grid.delete(key);
b.dead = true;
state.blocksVersion = (state.blocksVersion || 0) + 1;
// Отслеживаем удалённые блоки
const wasPlayerPlaced = state.placedBlocks.some(pb => pb.gx === gx && pb.gy === gy);
if (wasPlayerPlaced) {
// Удаляем из placedBlocks
state.placedBlocks = state.placedBlocks.filter(pb => !(pb.gx === gx && pb.gy === gy));
} else {
// Это природный блок - добавляем в removedBlocks
state.removedBlocks.push({ gx, gy });
}
return b;
}
export { grid, blocks, k, getBlock, hasBlock, isSolid, setBlock, removeBlock };