Stripe Projects
fossasia/eventyay
A skill your agent uses when the user wants to provision infrastructure or third-party services using Stripe Projects.
A skill your agent uses when working with the Phaser 4 event system.
$ npx skills add autonomous-ai/openharness --skill events-system -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install autonomous-ai/openharness events-system --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/autonomous-ai/openharness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/store/agents/phaser/skills/events-system .claude/skills/events-system && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "events-system" agent skill from https://github.com/autonomous-ai/openharness/tree/main/store/agents/phaser/skills/events-system into .claude/skills/events-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "events-system", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/autonomous-ai/openharness/tree/main/store/agents/phaser/skills/events-systemType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add autonomous-ai/openharness --skill events-system -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install autonomous-ai/openharness events-system --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/autonomous-ai/openharness.git skills-src && mkdir -p .agents/skills && cp -r skills-src/store/agents/phaser/skills/events-system .agents/skills/events-system && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "events-system" agent skill from https://github.com/autonomous-ai/openharness/tree/main/store/agents/phaser/skills/events-system into .agents/skills/events-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "events-system", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add autonomous-ai/openharness --skill events-system -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install autonomous-ai/openharness events-system --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/autonomous-ai/openharness.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/store/agents/phaser/skills/events-system .cursor/skills/events-system && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "events-system" agent skill from https://github.com/autonomous-ai/openharness/tree/main/store/agents/phaser/skills/events-system into .cursor/skills/events-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "events-system", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/autonomous-ai/openharness.git --path store/agents/phaser/skills/events-system--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add autonomous-ai/openharness --skill events-system -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install autonomous-ai/openharness events-system --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/autonomous-ai/openharness.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/store/agents/phaser/skills/events-system .gemini/skills/events-system && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "events-system" agent skill from https://github.com/autonomous-ai/openharness/tree/main/store/agents/phaser/skills/events-system into .gemini/skills/events-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "events-system", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install autonomous-ai/openharness events-systemInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add autonomous-ai/openharness --skill events-system -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/autonomous-ai/openharness.git skills-src && mkdir -p .github/skills && cp -r skills-src/store/agents/phaser/skills/events-system .github/skills/events-system && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "events-system" agent skill from https://github.com/autonomous-ai/openharness/tree/main/store/agents/phaser/skills/events-system into .github/skills/events-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "events-system", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add autonomous-ai/openharness --skill events-system -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install autonomous-ai/openharness events-system --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/autonomous-ai/openharness.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/store/agents/phaser/skills/events-system .opencode/skills/events-system && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "events-system" agent skill from https://github.com/autonomous-ai/openharness/tree/main/store/agents/phaser/skills/events-system into .opencode/skills/events-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "events-system", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
events-systemA skill your agent uses when working with the Phaser 4 event system.
Events System is an agent skill from autonomous-ai/openharness. Use this skill when working with the Phaser 4 event system. Covers EventEmitter, scene events, game events, custom events, and event-driven communication. Triggers on: events, on, emit, EventEmitter, scene events, listeners.
Its SKILL.md is about 5.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Backend & APIs, covering Event-driven systems. The repository describes itself as: The ultimate harness for coding agents and beyond. All your agents. All your machines. One command center. Start with code, then follow your curiosity and build across… The licence is MIT.
Read from SKILL.md and the folder at commit 50da5db. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are javascript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
ANIMATION_COMPLETE_KEYADD_KEYREMOVE_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Events System loads about 5.5k tokens when it runs. Until then it costs about 60 tokens; SKILL.md has 1,532 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from autonomous-ai/openharness at commit 50da5db, republished under its MIT licence (© autonomous-ai). 1,532 words, ~5,517 tokens.
.claude/skills/events-system/SKILL.md (or your agent's skills folder).Phaser uses the EventEmitter pattern (via eventemitter3) throughout the entire framework. Every major system -- Game, Scene, Input, Loader, Cameras, Sound, Tweens, Physics, Textures, Animations -- is an EventEmitter or contains one. Events use lowercase string keys. Phaser provides named constants for all built-in events to avoid typos and enable IDE autocomplete.
Key source paths: src/events/EventEmitter.js, src/scene/events/, src/core/events/, src/input/events/, src/loader/events/, src/animations/events/, src/cameras/2d/events/, src/sound/events/, src/tweens/events/, src/physics/arcade/events/, src/textures/events/, src/gameobjects/events/, src/time/events/
Related skills: ../scenes/SKILL.md, ../input-keyboard-mouse-touch/SKILL.md
// on — listen for an event (persists until removed)
this.input.on('pointerdown', (pointer) => {
console.log('clicked at', pointer.x, pointer.y);
});
// once — listen for an event, auto-removes after first fire
this.events.once('shutdown', () => {
console.log('scene shutting down');
});
// off — remove a specific listener (must pass same function reference)
const handler = (pointer) => { /* ... */ };
this.input.on('pointerdown', handler);
this.input.off('pointerdown', handler);
// emit — fire a custom event with arguments
this.events.emit('player-died', this.player, this.score);
// removeAllListeners — remove all listeners for an event (or all events)
this.events.removeAllListeners('player-died');
this.events.removeAllListeners(); // all events// Always prefer constants over raw strings to prevent typos
this.events.on(Phaser.Scenes.Events.UPDATE, (time, delta) => {
// runs every frame
});
this.input.on(Phaser.Input.Events.POINTER_DOWN, (pointer) => {
// pointer pressed
});
this.game.events.on(Phaser.Core.Events.BLUR, () => {
// browser tab lost focus
});Phaser.Events.EventEmitter extends eventemitter3. It adds shutdown() and destroy() methods that both call removeAllListeners().
Full API (inherited from eventemitter3):
| Method | Description |
|---|---|
on(event, fn, context?) | Add persistent listener. Returns this for chaining |
addListener(event, fn, context?) | Alias for on |
once(event, fn, context?) | Add one-time listener; auto-removed after first fire |
off(event, fn?, context?, once?) | Remove listener(s). Must pass same fn reference to remove specific listener |
removeListener(event, fn?, context?, once?) | Alias for off |
removeAllListeners(event?) | Remove all listeners for event, or all events if no arg |
emit(event, ...args) | Fire event. Returns true if it had listeners |
listeners(event) | Return array of listener functions for an event |
listenerCount(event) | Return number of listeners for an event |
eventNames() | Return array of event names that have listeners |
shutdown() | Calls removeAllListeners() |
destroy() | Calls removeAllListeners() |
Every built-in event is a lowercase string exported as a constant. The constant name maps predictably to the string:
Phaser.Scenes.Events.UPDATE // 'update'
Phaser.Scenes.Events.PRE_UPDATE // 'preupdate'
Phaser.Scenes.Events.SHUTDOWN // 'shutdown'
Phaser.Core.Events.BOOT // 'boot'
Phaser.Input.Events.POINTER_DOWN // 'pointerdown'Some events use a key-suffix pattern for per-key listening:
// Loader: listen for a specific file completing
this.load.on(Phaser.Loader.Events.FILE_KEY_COMPLETE + 'image-logo', (key, type, data) => {});
// String value: 'filecomplete-image-logo'
// Animations: listen for a specific animation completing on a sprite
sprite.on(Phaser.Animations.Events.ANIMATION_COMPLETE_KEY + 'walk', () => {});
// String value: 'animationcomplete-walk'
// Textures: listen for a specific texture being added
this.textures.on(Phaser.Textures.Events.ADD_KEY + 'myTexture', () => {});
// String value: 'addtexture-myTexture'The third argument to on/once sets this inside the callback. Defaults to the emitter.
// 'this' inside handler refers to the scene
this.input.on('pointerdown', function (pointer) {
this.cameras.main.shake(100); // 'this' = scene
}, this);
// Arrow functions ignore the context argument (they capture lexical 'this')
this.input.on('pointerdown', (pointer) => {
this.cameras.main.shake(100); // 'this' = enclosing scope (scene in create)
});Frame loop order: preupdate -> update -> Scene.update() -> postupdate -> prerender -> render
create() {
this.events.on(Phaser.Scenes.Events.UPDATE, this.onUpdate, this);
// CRITICAL: always clean up on shutdown to prevent leaks on scene restart
this.events.on(Phaser.Scenes.Events.SHUTDOWN, () => {
this.events.off(Phaser.Scenes.Events.UPDATE, this.onUpdate, this);
this.input.off('pointerdown', this.onPointerDown, this);
});
}// game.events fires on the Game instance, shared across all scenes
// Access from a scene via this.game.events
this.game.events.on(Phaser.Core.Events.BLUR, this.handleBlur, this);
this.game.events.on(Phaser.Core.Events.VISIBLE, this.handleVisible, this);// METHOD 1: game.events — a global event bus accessible from all scenes
// Scene A emits:
this.game.events.emit('score-changed', this.score);
// Scene B listens:
this.game.events.on('score-changed', (score) => { this.scoreText.setText(score); });
// METHOD 2: this.registry — a shared DataManager across all scenes
// The registry is a Phaser.Data.DataManager on the Game instance.
// Scene A sets data:
this.registry.set('score', 100);
// Scene B listens for changes:
this.registry.events.on('changedata-score', (parent, value, previousValue) => {
this.scoreText.setText(value);
});
// METHOD 3: Direct scene access via ScenePlugin
this.scene.get('UIScene').events.emit('update-health', hp);// Emit custom events with arbitrary data arguments
this.events.emit('player-died', this.player, { lives: this.lives });
this.events.on('player-died', (player, data) => {
console.log('Lives remaining:', data.lives);
});Phaser.Scenes.Events)Emitter: this.events (the Scene's Systems EventEmitter)
| Constant | String | When |
|---|---|---|
BOOT | 'boot' | Scene Systems boot (for plugins) |
READY | 'ready' | Scene Systems fully ready |
START | 'start' | Scene starts running |
CREATE | 'create' | After Scene.create() completes |
PRE_UPDATE | 'preupdate' | Before update each frame |
UPDATE | 'update' | Main update each frame |
POST_UPDATE | 'postupdate' | After update each frame |
PRE_RENDER | 'prerender' | Before render each frame |
RENDER | 'render' | During render each frame |
PAUSE | 'pause' | Scene paused |
RESUME | 'resume' | Scene resumed from pause |
SLEEP | 'sleep' | Scene put to sleep |
WAKE | 'wake' | Scene woken from sleep |
SHUTDOWN | 'shutdown' | Scene shutting down (may restart) |
DESTROY | 'destroy' | Scene permanently destroyed |
ADDED_TO_SCENE | 'addedtoscene' | GameObject added to scene |
REMOVED_FROM_SCENE | 'removedfromscene' | GameObject removed from scene |
TRANSITION_INIT | 'transitioninit' | Transition initialized (target scene) |
TRANSITION_START | 'transitionstart' | Transition started (target scene) |
TRANSITION_OUT | 'transitionout' | Transition out (source scene) |
TRANSITION_COMPLETE | 'transitioncomplete' | Transition finished |
TRANSITION_WAKE | 'transitionwake' | Transition wakes target scene |
Phaser.Core.Events)Emitter: this.game.events or game.events
| Constant | String | When |
|---|---|---|
BOOT | 'boot' | Game instance finished booting |
READY | 'ready' | Game ready to start running |
SYSTEM_READY | 'systemready' | All global systems ready |
PRE_STEP | 'prestep' | Before game loop step |
STEP | 'step' | Main game loop step |
POST_STEP | 'poststep' | After game loop step |
PRE_RENDER | 'prerender' | Before rendering all scenes |
POST_RENDER | 'postrender' | After rendering all scenes |
PAUSE | 'pause' | Game paused |
RESUME | 'resume' | Game resumed |
BLUR | 'blur' | Browser tab lost focus |
FOCUS | 'focus' | Browser tab gained focus |
HIDDEN | 'hidden' | Page Visibility API: hidden |
VISIBLE | 'visible' | Page Visibility API: visible |
CONTEXT_LOST | 'contextlost' | WebGL context lost |
DESTROY | 'destroy' | Game being destroyed |
Phaser.Input.Events)Emitter: this.input (scene-level) or individual GameObjects. Events exist at three levels: scene-level (this.input), scene-level with gameobject prefix, and directly on interactive GameObjects. See ../input-keyboard-mouse-touch/SKILL.md for full usage.
Scene-level pointer events (on this.input):
POINTER_DOWN 'pointerdown' | POINTER_UP 'pointerup' | POINTER_MOVE 'pointermove' | POINTER_OVER 'pointerover' | POINTER_OUT 'pointerout' | POINTER_WHEEL 'wheel' | POINTER_DOWN_OUTSIDE 'pointerdownoutside' | POINTER_UP_OUTSIDE 'pointerupoutside'
Scene-level gameobject events (on this.input):
GAMEOBJECT_DOWN 'gameobjectdown' | GAMEOBJECT_UP 'gameobjectup' | GAMEOBJECT_MOVE 'gameobjectmove' | GAMEOBJECT_OVER 'gameobjectover' | GAMEOBJECT_OUT 'gameobjectout' | GAMEOBJECT_WHEEL 'gameobjectwheel'
Per-GameObject events (emitted on the GameObject itself, requires setInteractive()):
GAMEOBJECT_POINTER_DOWN 'pointerdown' | GAMEOBJECT_POINTER_UP 'pointerup' | GAMEOBJECT_POINTER_MOVE 'pointermove' | GAMEOBJECT_POINTER_OVER 'pointerover' | GAMEOBJECT_POINTER_OUT 'pointerout' | GAMEOBJECT_POINTER_WHEEL 'wheel'
Drag events (on this.input and on GameObjects with same string):
DRAG_START/GAMEOBJECT_DRAG_START 'dragstart' | DRAG/GAMEOBJECT_DRAG 'drag' | DRAG_END/GAMEOBJECT_DRAG_END 'dragend' | DRAG_ENTER/GAMEOBJECT_DRAG_ENTER 'dragenter' | DRAG_OVER/GAMEOBJECT_DRAG_OVER 'dragover' | DRAG_LEAVE/GAMEOBJECT_DRAG_LEAVE 'dragleave' | DROP/GAMEOBJECT_DROP 'drop'
Other: GAME_OUT 'gameout' | GAME_OVER 'gameover' | POINTERLOCK_CHANGE 'pointerlockchange'
Phaser.Loader.Events)Emitter: this.load
| Constant | String | When |
|---|---|---|
ADD | 'addfile' | File added to load queue |
START | 'start' | Loader starts |
PROGRESS | 'progress' | Overall progress updated (0-1) |
FILE_LOAD | 'load' | Individual file loaded |
FILE_PROGRESS | 'fileprogress' | Individual file progress |
FILE_COMPLETE | 'filecomplete' | Individual file completed processing |
FILE_KEY_COMPLETE | 'filecomplete-' | Specific file completed (append type-key) |
FILE_LOAD_ERROR | 'loaderror' | File failed to load |
POST_PROCESS | 'postprocess' | All files loaded, post-processing |
COMPLETE | 'complete' | All loading complete |
Phaser.Animations.Events)Emitter: individual sprites (per-sprite) or this.anims (global AnimationManager)
| Constant | String | When |
|---|---|---|
ADD_ANIMATION | 'add' | Animation added to manager |
REMOVE_ANIMATION | 'remove' | Animation removed from manager |
PAUSE_ALL | 'pauseall' | All animations paused |
RESUME_ALL | 'resumeall' | All animations resumed |
ANIMATION_START | 'animationstart' | Animation starts playing on a sprite |
ANIMATION_RESTART | 'animationrestart' | Animation restarts on a sprite |
ANIMATION_REPEAT | 'animationrepeat' | Animation repeats on a sprite |
ANIMATION_UPDATE | 'animationupdate' | Animation frame changes on a sprite |
ANIMATION_COMPLETE | 'animationcomplete' | Animation finishes on a sprite |
ANIMATION_COMPLETE_KEY | 'animationcomplete-' | Specific animation finishes (append key) |
ANIMATION_STOP | 'animationstop' | Animation stopped on a sprite |
Phaser.Cameras.Scene2D.Events)Emitter: individual camera instance (e.g. this.cameras.main). Each camera effect has a START and COMPLETE pair.
DESTROY 'cameradestroy' | FADE_IN_START 'camerafadeinstart' | FADE_IN_COMPLETE 'camerafadeincomplete' | FADE_OUT_START 'camerafadeoutstart' | FADE_OUT_COMPLETE 'camerafadeoutcomplete' | FLASH_START 'cameraflashstart' | FLASH_COMPLETE 'cameraflashcomplete' | PAN_START 'camerapanstart' | PAN_COMPLETE 'camerapancomplete' | ROTATE_START 'camerarotatestart' | ROTATE_COMPLETE 'camerarotatecomplete' | SHAKE_START 'camerashakestart' | SHAKE_COMPLETE 'camerashakecomplete' | ZOOM_START 'camerazoomstart' | ZOOM_COMPLETE 'camerazoomcomplete' | FOLLOW_UPDATE 'followupdate' | PRE_RENDER 'prerender' | POST_RENDER 'postrender'
Phaser.Sound.Events)Emitter: individual sound instances or this.sound (SoundManager)
Per-sound instance events:
PLAY 'play' | PAUSE 'pause' | RESUME 'resume' | STOP 'stop' | COMPLETE 'complete' | LOOP 'loop' | LOOPED 'looped' | SEEK 'seek' | MUTE 'mute' | VOLUME 'volume' | RATE 'rate' | DETUNE 'detune' | PAN 'pan' | DECODED 'decoded' | DESTROY 'destroy'
SoundManager-level events (on this.sound):
GLOBAL_MUTE 'mute' | GLOBAL_VOLUME 'volume' | GLOBAL_RATE 'rate' | GLOBAL_DETUNE 'detune' | PAUSE_ALL 'pauseall' | RESUME_ALL 'resumeall' | STOP_ALL 'stopall' | DECODED_ALL 'decodedall' | UNLOCKED 'unlocked'
Phaser.Tweens.Events)Emitter: individual tween instances
| Constant | String | When |
|---|---|---|
TWEEN_ACTIVE | 'active' | Tween becomes active |
TWEEN_START | 'start' | Tween starts first play |
TWEEN_UPDATE | 'update' | Tween updates a value |
TWEEN_YOYO | 'yoyo' | Tween yoyos (reverses direction) |
TWEEN_REPEAT | 'repeat' | Tween repeats |
TWEEN_LOOP | 'loop' | Tween loops |
TWEEN_PAUSE | 'pause' | Tween paused |
TWEEN_RESUME | 'resume' | Tween resumed |
TWEEN_COMPLETE | 'complete' | Tween finishes |
TWEEN_STOP | 'stop' | Tween stopped manually |
Phaser.Physics.Arcade.Events)Emitter: this.physics.world
| Constant | String | When |
|---|---|---|
COLLIDE | 'collide' | Two bodies collide |
OVERLAP | 'overlap' | Two bodies overlap |
TILE_COLLIDE | 'tilecollide' | Body collides with a tile |
TILE_OVERLAP | 'tileoverlap' | Body overlaps with a tile |
WORLD_BOUNDS | 'worldbounds' | Body hits world boundary |
WORLD_STEP | 'worldstep' | Physics world completes a step |
PAUSE | 'pause' | Physics world paused |
RESUME | 'resume' | Physics world resumed |
Phaser.Textures.Events)Emitter: this.textures (TextureManager)
| Constant | String | When |
|---|---|---|
ADD | 'addtexture' | Any texture added |
ADD_KEY | 'addtexture-' | Specific texture added (append key) |
REMOVE | 'removetexture' | Any texture removed |
REMOVE_KEY | 'removetexture-' | Specific texture removed (append key) |
LOAD | 'onload' | Texture source loaded |
ERROR | 'onerror' | Texture source load error |
READY | 'ready' | Texture manager ready |
Phaser.GameObjects.Events)Emitter: individual GameObjects
| Constant | String | When |
|---|---|---|
ADDED_TO_SCENE | 'addedtoscene' | GameObject added to a scene |
REMOVED_FROM_SCENE | 'removedfromscene' | GameObject removed from scene |
DESTROY | 'destroy' | GameObject destroyed |
Video GameObject events (on Video GameObjects):
VIDEO_PLAY 'play' | VIDEO_PLAYING 'playing' | VIDEO_COMPLETE 'complete' | VIDEO_LOOP 'loop' | VIDEO_STOP 'stop' | VIDEO_CREATED 'created' | VIDEO_ERROR 'error' | VIDEO_LOCKED 'locked' | VIDEO_UNLOCKED 'unlocked' | VIDEO_METADATA 'metadata' | VIDEO_SEEKED 'seeked' | VIDEO_SEEKING 'seeking' | VIDEO_STALLED 'stalled' | VIDEO_TEXTURE 'textureready' | VIDEO_UNSUPPORTED 'unsupported'
Phaser.Time.Events)Emitter: Phaser.Time.TimerEvent instances
| Constant | String | When |
|---|---|---|
COMPLETE | 'complete' | TimerEvent finishes all repeats |
You must pass the SAME function reference AND the same context/scope to off() that you used with on(). Anonymous or inline arrow functions cannot be removed.
// BAD: arrow function cannot be removed later
this.events.on('update', () => { this.doStuff(); });
// GOOD: named method can be removed
this.events.on('update', this.onUpdate, this);
this.events.off('update', this.onUpdate, this);once() automatically removes the listener after first fire. No manual cleanup needed.
this.events.once(Phaser.Scenes.Events.CREATE, this.onFirstCreate, this);emitter.listenerCount('update'); // number of listeners for an event
emitter.eventNames(); // ['update', 'player-died'] -- all registered event names
emitter.removeAllListeners('player-died'); // remove all listeners for one event
emitter.removeAllListeners(); // remove ALL listeners for ALL eventsconst bus = new Phaser.Events.EventEmitter();
bus.on('inventory-changed', (items) => { console.log(items.length); });
bus.emit('inventory-changed', this.inventory);this.events -- Scene-specific. Fires scene lifecycle events. Cleaned up when scene is destroyed.this.game.events -- Global. Fires game-level events (blur, focus, pause, resume). Persists across scene restarts -- clean up on SHUTDOWN.create() {
this.events.on(Phaser.Scenes.Events.UPDATE, this.onUpdate, this);
this.game.events.on(Phaser.Core.Events.BLUR, this.onBlur, this);
this.events.once(Phaser.Scenes.Events.SHUTDOWN, () => {
this.game.events.off(Phaser.Core.Events.BLUR, this.onBlur, this);
});
}The most common source of bugs. If a scene uses on() and the scene restarts via scene.restart(), old listeners persist because on() does not auto-remove. Each restart adds duplicate listeners.
// BAD: leaks listeners on every scene restart
create() {
this.input.on('pointerdown', this.shoot, this);
}
// GOOD: clean up in shutdown
create() {
this.input.on('pointerdown', this.shoot, this);
this.events.once(Phaser.Scenes.Events.SHUTDOWN, () => {
this.input.off('pointerdown', this.shoot, this);
});
}
// ALSO GOOD: use once() for events you only need fired once
create() {
this.events.once(Phaser.Scenes.Events.CREATE, this.onFirstCreate, this);
}SHUTDOWN fires when a scene stops but can restart later. Clean up listeners here.DESTROY fires when a scene is permanently removed. Use for final cleanup.SHUTDOWN then START then CREATE. It does NOT fire DESTROY.The third argument to on/once sets this inside the callback. Without it, this defaults to the emitter, not the scene. Use this as the third argument with regular functions, or use arrow functions (which capture lexical this).
off() only works if you pass the exact same function reference (and context) used with on(). Anonymous functions or arrow literals cannot be removed -- store a reference or use a class method.
Input events fire in order: (1) GAMEOBJECT_POINTER_DOWN on the GameObject, (2) GAMEOBJECT_DOWN on this.input, (3) POINTER_DOWN on this.input. Higher handlers can stop propagation.
this.game.events and this.events are different emitters. Game events fire once per game loop tick across all scenes. Scene events fire per-scene. Listeners on game.events persist across scene restarts -- always clean them up on SHUTDOWN:
create() {
this.game.events.on(Phaser.Core.Events.BLUR, this.onBlur, this);
this.events.once(Phaser.Scenes.Events.SHUTDOWN, () => {
this.game.events.off(Phaser.Core.Events.BLUR, this.onBlur, this);
});
}| Path | Description |
|---|---|
src/events/EventEmitter.js | Base EventEmitter class (wraps eventemitter3) |
src/scene/events/ | Scene lifecycle events (22 events) |
src/core/events/ | Game-level events (16 events) |
src/input/events/ | Input/pointer/drag events (48 events) |
src/loader/events/ | Asset loading events (10 events) |
src/animations/events/ | Animation playback events (11 events) |
src/cameras/2d/events/ | Camera effect events (18 events) |
src/sound/events/ | Sound playback events (24 events) |
src/tweens/events/ | Tween lifecycle events (10 events) |
src/physics/arcade/events/ | Arcade physics events (8 events) |
src/textures/events/ | Texture manager events (7 events) |
src/gameobjects/events/ | GameObject lifecycle + Video events (18 events) |
src/time/events/ | TimerEvent events (1 event) |
© autonomous-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in store/agents/phaser/skills/events-system of autonomous-ai/openharness.
Open the folder on GitHubat commit 50da5db
Events System next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Events System this skillautonomous-ai/openharness | 1.1k | — | ~5.5k | Automated safety check: Pass | MIT | |
| Stripe Projectsfossasia/eventyay | 1.7k | 5 repos | ~2k | Automated safety check: Notes | Apache-2.0 | |
| MQTTX CLIemqx/MQTTX | 5.1k | — | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| AWS Serverless Edazxkane/aws-skills | 367 | 4 repos | ~3.2k | Automated safety check: Pass | MIT | |
| Windmill Trigger Type Checklistwindmill-labs/windmill | 18k | — | ~4.7k | Automated safety check: Pass | Custom licence | |
| FoundatioFoundatioFx/Foundatio | 2.1k | — | ~3.9k | Automated safety check: Pass | Apache-2.0 |
fossasia/eventyay
A skill your agent uses when the user wants to provision infrastructure or third-party services using Stripe Projects.
emqx/MQTTX
Operates the `mqttx` command line client to connect, publish, subscribe, benchmark and simulate data against an MQTT broker, with TLS and MQTT 5 support.
zxkane/aws-skills
AWS serverless and event-driven architecture expert based on Well-Architected Framework.
windmill-labs/windmill
Checklist of every backend, frontend, CLI and capture change needed to add a new TriggerCrud-based trigger type, such as Azure, GCP or Kafka, to Windmill.
FoundatioFx/Foundatio
A skill your agent uses when working with Foundatio infrastructure abstractions for .NET -- caching, queuing, messaging, file storage, distributed locking, or background jobs.
xiaotianfotos/homerail
Design, start, supervise, inspect, and continue HomeRail DAG workflows from any agent with CLI or HTTP access.
autonomous-ai/openharness
Slices 3D mesh files into printer-profiled plain G-code through real slicer CLIs, with backend discovery, input inspection, dry runs and static validation.
autonomous-ai/openharness
Turns a home-automation request into standard, testable automations.yaml, run against Home Assistant Core's real triggers and verified with its own trace tool.
autonomous-ai/openharness
Turns a musical brief into LilyPond concert-pitch music, checked parts for each instrument and a playable practice pack.
autonomous-ai/openharness
Turns an STL and explicit printer and material requirements into compared OrcaSlicer plans, an editable 3MF project, checked G-code and a portable handoff.
autonomous-ai/openharness
Builds an editable DOCX report, a formula-driven XLSX workbook and a fresh LibreOffice PDF preview from one structured source file, then checks them together.
autonomous-ai/openharness
Dry-run, upload, and cautiously initiate local Bambu Lab print jobs from validated plain .gcode, using Bambu LAN FTPS/MQTT handoffs.
Categories
A skill your agent uses when working with the Phaser 4 event system. Events System is an agent skill from autonomous-ai/openharness. Use this skill when working with the Phaser 4 event system.
Events System fits situations like: working with the Phaser 4 event system; tasks that involve Event-driven systems.
Run `npx skills add autonomous-ai/openharness --skill events-system -a claude-code`. Or copy the skill folder (store/agents/phaser/skills/events-system in autonomous-ai/openharness) into .claude/skills/events-system in your project. Claude Code loads it when a task matches its description.
Run `npx skills add autonomous-ai/openharness --skill events-system -a codex`. Or copy the skill folder (store/agents/phaser/skills/events-system in autonomous-ai/openharness) into .agents/skills/events-system in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add autonomous-ai/openharness --skill events-system -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/events-system, .gemini/skills/events-system, .github/skills/events-system and .opencode/skills/events-system in your project.
Going by SKILL.md and its folder, Events System needs credentials named ANIMATION_COMPLETE_KEY, ADD_KEY and REMOVE_KEY. Our summary lists: A credential in ANIMATION_COMPLETE_KEY; A credential in ADD_KEY.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Events System is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.5k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Events System: Stripe Projects (fossasia/eventyay, 1.7k stars), MQTTX CLI (emqx/MQTTX, 5.1k stars), AWS Serverless Eda (zxkane/aws-skills, 367 stars) and Windmill Trigger Type Checklist (windmill-labs/windmill, 18k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
autonomous-ai (a GitHub organization) maintains it in autonomous-ai/openharness, which has 1,149 GitHub stars. The repository holds 100 skills in this directory. The repository was last updated on October 8, 2026.
Source: autonomous-ai/openharness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.