import { Container } from 'pixi.js';
import type { Updatable } from '../../core/Updatables';
import { samplePop, type FxPopSpec } from './fxSim';
/**
* Появление с овершутом масштаба (подбор, спавн, UI-подтверждение). Базовый
* масштаб снимается в конструкторе — эффект не конфликтует с вьюхами, масштаб
* которых меняет игра; вьюху не уничтожает (она «уже есть»).
*/
export class FxPop implements Updatable {
private t = 0;
private finished = false;
private readonly base: number;
constructor(
private readonly view: Container,
private readonly spec: FxPopSpec = {}
) {
this.base = view.scale.x;
}
/** Прекратить эффект и вернуть базовый масштаб. */
cancel(): void {
this.finished = true;
if (!this.view.destroyed) this.view.scale.set(this.base);
}
/** Вьюха разрушена извне или эффект закончился. */
get destroyed(): boolean {
return this.finished || this.view.destroyed;
}
update(dt: number): void {
if (this.finished) return;
if (this.view.destroyed) return;
this.t += dt;
this.view.scale.set(this.base * samplePop(this.t, this.spec));
if (this.t >= (this.spec.duration ?? 0.25) - 1e-6) this.finished = true;
}
}