Skip to content

Instantly share code, notes, and snippets.

@lethern
Created July 25, 2026 23:55
Show Gist options
  • Select an option

  • Save lethern/b9854e4e2ad76e406eb235028e275aeb to your computer and use it in GitHub Desktop.

Select an option

Save lethern/b9854e4e2ad76e406eb235028e275aeb to your computer and use it in GitHub Desktop.
ComponentsStorage.define(
COMPONENTS.TrapTrigger,
{
onStep: { type: "boolean" },
trapId: { type: "string", description: "Leave empty to link to same entity" },
},
);
ComponentsStorage.define(
COMPONENTS.Trap,
{
radius: { type: "number" },
damage: { type: "number" },
force: { type: "number" },
isReady: { type: "boolean", default: true },
dmgType: { type: "string", subtype: "TrapDmgTypeDict" },
},
);
PrefabStorage.add({
id: Random.generateId(),
name: "Fire trap",
components: {
[COMPONENTS.Name]: { key: "Trap" },
[COMPONENTS.Visual]: { char: "_", color: "#CC8A8A" },
[COMPONENTS.Position]: {},
[COMPONENTS.Trap]: {
radius: 3,
damage: 15,
force: 3,
isReady: true,
dmgType: "Fire",
},
[COMPONENTS.TrapTrigger]: {
onStep: true,
},
},
});
class TrapTriggerSystem extends BaseSystem {
constructor() {
this.events.listen(EVENTS.MoveAction, bind(this.onMovedEvent, this));
}
onMovedEvent(event) {
const target = event.entity;
for (const entity of this.gameData.grid.getAt(event.toX, event.toY)) {
const TrapTrigger = entity.TrapTrigger;
if (TrapTrigger && TrapTrigger.onStep) {
const trap = TrapTrigger.trapId ? this.gameData.world.entity(TrapTrigger.trapId) : entity;
const trapEvent = {
type: EVENTS.TrapTriggered,
target: target,
x: event.toX,
y: event.toY,
source: event,
entity: trap,
};
this.events.raise(trapEvent);
}
}
}
}
class TrapResolveSystem extends BaseSystem {
constructor() {
this.events.listen(EVENTS.TrapTriggered, bind(this.onTriggered, this));
}
onTriggered(event) {
const trap = event.entity;
const Trap = trap.Trap;
const Position = trap.Position;
if (Trap && Position && Trap.isReady) {
Trap.isReady = false;
const trapAction = {
type: EVENTS.TrapTriggeredAction,
trap,
};
this.events.raise(trapAction);
const explosionEvent = {
type: EVENTS.ExplosionIntent,
x: Position.x,
y: Position.y,
radius: Trap.radius,
damage: Trap.damage,
force: Trap.force,
dmgType: Trap.dmgType,
source: trap,
causalityId,
};
this.events.raise(explosionEvent);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment