silphius/app/react-components/dom/entities.jsx

70 lines
1.6 KiB
React
Raw Normal View History

2024-07-12 02:10:22 -05:00
import {useState} from 'react';
2024-07-13 03:02:55 -05:00
2024-07-12 02:10:22 -05:00
import {useEcs, useEcsTick} from '@/context/ecs.js';
2024-07-13 03:02:55 -05:00
import {parseLetters} from '@/dialogue.js';
2024-07-12 02:10:22 -05:00
import Entity from './entity.jsx';
export default function Entities({camera, scale}) {
const [ecs] = useEcs();
const [entities, setEntities] = useState({});
useEcsTick((payload) => {
if (!ecs) {
return;
}
2024-07-13 16:33:23 -05:00
const deleting = {};
const updating = {};
2024-07-12 02:10:22 -05:00
for (const id in payload) {
if ('1' === id) {
continue;
}
const update = payload[id];
if (false === update) {
2024-07-13 16:33:23 -05:00
deleting[id] = true;
2024-07-12 02:10:22 -05:00
continue;
}
2024-07-13 16:33:23 -05:00
updating[id] = ecs.get(id);
2024-07-12 02:10:22 -05:00
const {dialogue} = update.Interlocutor || {};
if (dialogue) {
2024-07-13 16:33:23 -05:00
const {dialogues} = updating[id].Interlocutor;
2024-07-12 02:10:22 -05:00
for (const key in dialogue) {
2024-07-13 03:02:55 -05:00
dialogues[key] = dialogue[key];
dialogues[key].letters = parseLetters(dialogues[key].body);
dialogues[key].onClose = () => {
delete dialogues[key];
setEntities((entities) => ({
...entities,
[id]: ecs.rebuild(id),
}));
};
2024-07-12 02:10:22 -05:00
}
}
}
2024-07-13 16:33:23 -05:00
setEntities((entities) => {
for (const id in deleting) {
delete entities[id];
}
return {
...entities,
...updating,
};
});
}, [ecs]);
2024-07-12 02:10:22 -05:00
const renderables = [];
for (const id in entities) {
renderables.push(
<Entity
camera={camera}
entity={entities[id]}
key={id}
scale={scale}
/>
);
}
return (
<>
{renderables}
</>
);
}