72 lines
2.3 KiB
TypeScript
72 lines
2.3 KiB
TypeScript
import { PlaySfx } from "../Applet/Audio";
|
|
import { RenderBounds, Polygon, Location } from "../Ecs/Components";
|
|
import { Join, Remove, Lookup, Create, Id } from "../Ecs/Data";
|
|
import { Data, World, Lifetime, Teams } from "./GameComponents";
|
|
|
|
export function SelfDestructMinions(data: Data, world: World) {
|
|
const bossKilled = Join(data, "boss", "hp")
|
|
.filter(([_boss, {hp}]) => hp < 0)
|
|
.length > 0;
|
|
|
|
if(bossKilled) {
|
|
Join(data, "hp")
|
|
.filter(([hp]) => hp.team == Teams.ENEMY)
|
|
.forEach(([hp]) => hp.hp = 0);
|
|
}
|
|
}
|
|
|
|
export function CheckHp(data: Data, world: World) {
|
|
Join(data, "hp", "id").forEach(([hp, id]) => {
|
|
if(hp.hp <= 0) {
|
|
// remove from game
|
|
Remove(data, id);
|
|
}
|
|
});
|
|
}
|
|
|
|
export function CheckLifetime(data: Data, world: World, interval: number) {
|
|
let particles = 0;
|
|
Join(data, "lifetime", "id").forEach(([lifetime, id]) => {
|
|
lifetime.time -= interval;
|
|
if(lifetime.time <= 0) {
|
|
// remove from game
|
|
Remove(data, id);
|
|
}
|
|
particles++;
|
|
});
|
|
}
|
|
|
|
export function SmokeDamage(data: Data, world: World) {
|
|
Join(data, "hp", "location").forEach(([hp, {X, Y}]) => {
|
|
// convert dealt damage to particles
|
|
const puffs = Math.floor(hp.receivedDamage / 3);
|
|
SpawnBlast(data, world, X, Y, 2, "#000", puffs);
|
|
hp.receivedDamage = Math.floor(hp.receivedDamage % 3);
|
|
});
|
|
}
|
|
|
|
function SpawnBlast(data: Data, world: World, x: number, y: number, size: number, color: string, count: number) {
|
|
for(let puff = 0; puff < count; puff++) {
|
|
const angle = Math.PI * 2 * puff / count;
|
|
SpawnPuff(data, world, x, y, size, color, angle);
|
|
}
|
|
}
|
|
|
|
function SpawnPuff(data: Data, world: World, x: number, y: number, size: number, color: string, angle: number): Id {
|
|
return Create(data, {
|
|
location: new Location({
|
|
X: x,
|
|
Y: y,
|
|
VX: (Math.random() + 0.5) * 400 * Math.cos(angle),
|
|
VY: (Math.random() + 0.5) * 400 * -Math.sin(angle)
|
|
}),
|
|
bounds: new Polygon([
|
|
-size, -size,
|
|
-size, size,
|
|
size, size,
|
|
size, -size
|
|
]),
|
|
renderBounds: new RenderBounds(color, world.smokeLayer),
|
|
lifetime: new Lifetime(Math.random() / 3)
|
|
});
|
|
}
|