bullet-heaven.ahraz.me
An agent-ready bullet hell maker built with Phaser and WebMCP.
First seen 2026-11-05 · Last seen 2026-11-05 · Source: webmcp.com
Answer 4 · Act 15 · Transact 1 · Score: Not yet scored
Tool inspector
edit_firing_pattern
Adds, updates, or removes an emitter firing pattern and returns { action, waveId, emitterId, patternId, pattern, waveCount, emitterCount } with the affected pattern in full. Remove reports the ids and the new counts with no pattern. A pattern is one rhythm, one formation and one projectile; layer several on an emitter for a composite attack. The result reflects the state after this call, so no follow-up read is needed. The result's 'evaluation' reports whether the project has been measured since it changed; on verified: false, run evaluate_encounter before calling the edit an improvement. This returns to the editor first, on its own. From a landing page or shared play link that needs a page load, it opens the editor and asks you to retry once WebMCP reconnects rather than editing during teardown. Call get_maker_state immediately before this: the person edits the same live state you do.
Page: /editor
Input schema
| Property | Type | Required | Description |
|---|---|---|---|
action |
string | yes | 'add' generates the patternId and rejects one you supply. 'update' and 'remove' require patternId, and 'remove' accepts nothing but the ids. An emitter must keep at least one pattern, so the last one cannot be removed. |
waveId |
string | yes | The wave the emitter belongs to. |
emitterId |
string | yes | The emitter that owns the pattern. |
patternId |
string | no | The pattern to change. Required to update or remove, omitted to add. |
name |
string | no | — |
enabled |
boolean | no | — |
initialDelay |
number | no | Seconds after the emitter appears before it first fires. |
interval |
number | no | Seconds between volleys. |
burstCount |
integer | no | Volleys fired back to back, burstInterval apart, each interval. |
burstInterval |
number | no | Seconds between the volleys of one burst. |
volleys |
— | no | How many volleys the pattern fires in total, or 'continuous' to fire for as long as the emitter lives. |
formationType |
string | no | 'single' fires one projectile, 'fan' spreads formationCount across spreadAngle, 'ring' spreads formationCount over 360 degrees. A fan or ring needs formationCount. |
formationCount |
integer | no | Projectiles per volley. Requires formationType fan or ring, and is required when creating one; a single formation fires one projectile and rejects it. |
spreadAngle |
number | no | Total width of a fan in degrees. Requires formationType fan; a ring already covers 360 degrees. |
aimMode |
string | no | 'at_player' samples the player's position each volley; 'fixed' fires along the emitter's angle. |
rotationPerVolley |
number | no | Degrees the aim advances per volley; this is what makes a spiral. |
speed |
number | no | Projectile speed in pixels per second. |
acceleration |
number | no | Pixels per second squared, up to maxSpeed. |
maxSpeed |
number | no | Ceiling for an accelerating projectile, in pixels per second. Must be at least speed; omit it and it follows a raised speed up. |
angularVelocity |
number | no | Degrees per second the projectile curves as it travels. |
lifetime |
number | no | Seconds a projectile lives before it is culled. |
collisionRadius |
number | no | Damage circle in pixels, independent of renderRadius. |
renderRadius |
number | no | Drawn size in pixels. Purely visual. |
color |
string | no | Projectile color as a six-digit CSS hex value. |
Raw JSON schema
{
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": [
"add",
"update",
"remove"
],
"description": "'add' generates the patternId and rejects one you supply. 'update' and 'remove' require patternId, and 'remove' accepts nothing but the ids. An emitter must keep at least one pattern, so the last one cannot be removed."
},
"waveId": {
"type": "string",
"minLength": 1,
"description": "The wave the emitter belongs to."
},
"emitterId": {
"type": "string",
"minLength": 1,
"description": "The emitter that owns the pattern."
},
"patternId": {
"type": "string",
"minLength": 1,
"description": "The pattern to change. Required to update or remove, omitted to add."
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"enabled": {
"type": "boolean"
},
"initialDelay": {
"type": "number",
"minimum": 0,
"maximum": 3600,
"description": "Seconds after the emitter appears before it first fires."
},
"interval": {
"type": "number",
"minimum": 0.05,
"maximum": 30,
"description": "Seconds between volleys."
},
"burstCount": {
"type": "integer",
"minimum": 1,
"maximum": 99,
"description": "Volleys fired back to back, burstInterval apart, each interval."
},
"burstInterval": {
"type": "number",
"minimum": 0,
"maximum": 30,
"description": "Seconds between the volleys of one burst."
},
"volleys": {
"anyOf": [
{
"type": "string",
"const": "continuous"
},
{
"type": "integer",
"minimum": 1,
"maximum": 999
}
],
"description": "How many volleys the pattern fires in total, or 'continuous' to fire for as long as the emitter lives."
},
"formationType": {
"type": "string",
"enum": [
"single",
"fan",
"ring"
],
"description": "'single' fires one projectile, 'fan' spreads formationCount across spreadAngle, 'ring' spreads formationCount over 360 degrees. A fan or ring needs formationCount."
},
"formationCount": {
"type": "integer",
"minimum": 1,
"maximum": 128,
"description": "Projectiles per volley. Requires formationType fan or ring, and is required when creating one; a single formation fires one projectile and rejects it."
},
"spreadAngle": {
"type": "number",
"minimum": 0,
"maximum": 360,
"description": "Total width of a fan in degrees. Requires formationType fan; a ring already covers 360 degrees."
},
"aimMode": {
"type": "string",
"enum": [
"at_player",
"fixed"
],
"description": "'at_player' samples the player's position each volley; 'fixed' fires along the emitter's angle."
},
"rotationPerVolley": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Degrees the aim advances per volley; this is what makes a spiral."
},
"speed": {
"type": "number",
"minimum": 20,
"maximum": 2000,
"description": "Projectile speed in pixels per second."
},
"acceleration": {
"type": "number",
"minimum": -5000,
"maximum": 5000,
"description": "Pixels per second squared, up to maxSpeed."
},
"maxSpeed": {
"type": "number",
"minimum": 20,
"maximum": 4000,
"description": "Ceiling for an accelerating projectile, in pixels per second. Must be at least speed; omit it and it follows a raised speed up."
},
"angularVelocity": {
"type": "number",
"minimum": -720,
"maximum": 720,
"description": "Degrees per second the projectile curves as it travels."
},
"lifetime": {
"type": "number",
"minimum": 0.05,
"maximum": 60,
"description": "Seconds a projectile lives before it is culled."
},
"collisionRadius": {
"type": "number",
"minimum": 1,
"maximum": 32,
"description": "Damage circle in pixels, independent of renderRadius."
},
"renderRadius": {
"type": "number",
"minimum": 1,
"maximum": 48,
"description": "Drawn size in pixels. Purely visual."
},
"color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "Projectile color as a six-digit CSS hex value."
}
},
"required": [
"action",
"waveId",
"emitterId"
],
"additionalProperties": false
}
Similar websites
wfsim.app
A Warframe calculator that simulates the fight instead of estimating it — builder, simulator, optimizer. Every formula cites its source, and the golden tests ar…
commonplace-webmcp.vercel.app
Commonplace is an editable social reading space built for people and their browser agents.
pixelforge-studio.appcaster.chatgpt.site
A professional browser pixel-art editor for drawing, frame animation, palettes, sprite sheets, GIF export, and WebMCP automation.
pixelite.taskcraft.site
Pixelite