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 };