20c838da7d
- Поле: вода (сплошная заливка по штриху, превью кистью), туман/огонь/дождь без изменений логики. - Действия: облако яда (частицы, круглая текстура, звук oblako-yada.mp3, длительность как у трека), луч света и заморозка со звуками из public/. - Пульт: инструменты воды и яда, синхрон SFX, тесты панели и ластика. - Окно управления: дочернее от окна просмотра (Z-order). - Типы эффектов, effectsStore prune, hit-test ластика. Made-with: Cursor
85 lines
2.2 KiB
TypeScript
85 lines
2.2 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
|
|
import { EffectsStore } from './effectsStore';
|
|
|
|
void test('pruneExpired: лёд не удаляется по времени', () => {
|
|
const store = new EffectsStore();
|
|
const createdAtMs = Date.now() - 365 * 24 * 60 * 60 * 1000;
|
|
store.dispatch({
|
|
kind: 'instance.add',
|
|
instance: {
|
|
id: 'ice_test',
|
|
type: 'ice',
|
|
seed: 1,
|
|
createdAtMs,
|
|
at: { x: 0.5, y: 0.5 },
|
|
radiusN: 0.1,
|
|
opacity: 0.85,
|
|
lifetimeMs: null,
|
|
},
|
|
});
|
|
assert.equal(store.getState().instances.length, 1);
|
|
assert.equal(store.pruneExpired(), false);
|
|
assert.equal(store.getState().instances.length, 1);
|
|
});
|
|
|
|
void test('pruneExpired: молния удаляется после lifetime', () => {
|
|
const store = new EffectsStore();
|
|
store.dispatch({
|
|
kind: 'instance.add',
|
|
instance: {
|
|
id: 'lt_test',
|
|
type: 'lightning',
|
|
seed: 1,
|
|
createdAtMs: Date.now() - 10_000,
|
|
start: { x: 0, y: 0 },
|
|
end: { x: 0.5, y: 0.5 },
|
|
widthN: 0.05,
|
|
intensity: 1,
|
|
lifetimeMs: 1000,
|
|
},
|
|
});
|
|
assert.equal(store.pruneExpired(), true);
|
|
assert.equal(store.getState().instances.length, 0);
|
|
});
|
|
|
|
void test('pruneExpired: луч света удаляется после lifetime', () => {
|
|
const store = new EffectsStore();
|
|
store.dispatch({
|
|
kind: 'instance.add',
|
|
instance: {
|
|
id: 'sb_test',
|
|
type: 'sunbeam',
|
|
seed: 1,
|
|
createdAtMs: Date.now() - 10_000,
|
|
start: { x: 0.5, y: 0 },
|
|
end: { x: 0.5, y: 0.6 },
|
|
widthN: 0.04,
|
|
intensity: 1,
|
|
lifetimeMs: 800,
|
|
},
|
|
});
|
|
assert.equal(store.pruneExpired(), true);
|
|
assert.equal(store.getState().instances.length, 0);
|
|
});
|
|
|
|
void test('pruneExpired: облако яда удаляется после lifetime', () => {
|
|
const store = new EffectsStore();
|
|
store.dispatch({
|
|
kind: 'instance.add',
|
|
instance: {
|
|
id: 'pc_test',
|
|
type: 'poisonCloud',
|
|
seed: 1,
|
|
createdAtMs: Date.now() - 20_000,
|
|
at: { x: 0.5, y: 0.5 },
|
|
radiusN: 0.08,
|
|
intensity: 1,
|
|
lifetimeMs: 3000,
|
|
},
|
|
});
|
|
assert.equal(store.pruneExpired(), true);
|
|
assert.equal(store.getState().instances.length, 0);
|
|
});
|