- build.sh: Remove old bundle tag before injecting hashed version - index.html: Remove duplicate script tag from template - docker-compose.yml: Fix network name (hermes-net, not litellm_hermes-net) - Deployment verified: HTTPS 200 via Cloudflare + Traefik
108 lines
3.5 KiB
JavaScript
108 lines
3.5 KiB
JavaScript
/**
|
||
* Iron Requiem — Bullet Hell Pattern Definitions
|
||
*
|
||
* Every pattern MUST document a provable safe zone. This is non-negotiable:
|
||
* bullet-hell fairness requires that the player can always identify and
|
||
* reach a position where they won't take damage.
|
||
*
|
||
* @module src/data/patterns
|
||
*/
|
||
|
||
export const patterns = {
|
||
/**
|
||
* infantry_wall — Horizontal line of projectiles sweeping across screen.
|
||
*
|
||
* Used by: Type 62 (Light tank), Zone 1-3
|
||
*
|
||
* Safe zone: A 60px vertical gap exists above and below the projectile
|
||
* line. The wall is a single horizontal row — projectiles have no
|
||
* vertical spread. Standing at y = lineY ± 60 guarantees safety.
|
||
*/
|
||
infantry_wall: {
|
||
patternId: 'infantry_wall',
|
||
projectileCount: 40,
|
||
spawnInterval: 50,
|
||
telegraphTime: 1500,
|
||
telegraphAudio: 'plaa_bugle',
|
||
direction: 'left-to-right',
|
||
spacing: 12,
|
||
safeZone:
|
||
'Above or below the horizontal wall line by >=60px — ' +
|
||
'projectiles form a single row with no vertical spread.',
|
||
},
|
||
|
||
/**
|
||
* tank_destroyer_beam — Narrow cone beam from a heavy tank.
|
||
*
|
||
* Used by: Type 59 (Heavy), Zone 2-3
|
||
*
|
||
* Safe zone: Outside the 45° cone spread. The beam fires in a fixed
|
||
* direction from the enemy toward the player's last known position.
|
||
* There is no tracking after launch — any position more than 22.5°
|
||
* off the beam axis is safe.
|
||
*/
|
||
tank_destroyer_beam: {
|
||
patternId: 'tank_destroyer_beam',
|
||
projectileCount: 12,
|
||
spawnInterval: 80,
|
||
telegraphTime: 2000,
|
||
telegraphAudio: 'beam_charge',
|
||
direction: 'targeted',
|
||
spreadAngle: 45,
|
||
spacing: 16,
|
||
safeZone:
|
||
'Outside the 45° cone spread — beam fires in a fixed direction ' +
|
||
'with no tracking after launch. Any position >22.5° off axis is safe.',
|
||
},
|
||
|
||
/**
|
||
* artillery_ring — Expanding ring of projectiles from a static emplacement.
|
||
*
|
||
* Used by: Artillery Emplacement, all zones
|
||
*
|
||
* Safe zone: The center of the ring at the moment of spawn (radius
|
||
* 0–20 px). All projectiles travel radially outward from a single
|
||
* origin point. Standing at the exact spawn center places the player
|
||
* in the eye of the storm. The safe zone shrinks to zero as the first
|
||
* wave exits — timing is everything.
|
||
*/
|
||
artillery_ring: {
|
||
patternId: 'artillery_ring',
|
||
projectileCount: 24,
|
||
spawnInterval: 30,
|
||
telegraphTime: 2000,
|
||
telegraphAudio: 'mortar_whistle',
|
||
direction: 'radial_out',
|
||
spacing: 15,
|
||
safeZone:
|
||
'The center of the ring at time of spawn (radius 0–20 px) — ' +
|
||
'all projectiles travel radially outward from a single origin. ' +
|
||
'Safe zone shrinks to 0 after first wave exits.',
|
||
},
|
||
|
||
/**
|
||
* heli_sweep — Helicopter gunship strafing run.
|
||
*
|
||
* Used by: Helicopter Gunship, Zone 2-3
|
||
*
|
||
* Safe zone: The opposite screen edge from the sweep entry side.
|
||
* The helicopter crosses the screen in a straight line, firing
|
||
* projectiles in a 60° forward cone. The area behind the entry
|
||
* point (opposite edge of the screen) is completely safe during
|
||
* the sweep.
|
||
*/
|
||
heli_sweep: {
|
||
patternId: 'heli_sweep',
|
||
projectileCount: 30,
|
||
spawnInterval: 40,
|
||
telegraphTime: 1500,
|
||
telegraphAudio: 'rotor_wash',
|
||
direction: 'left-to-right',
|
||
spreadAngle: 60,
|
||
spacing: 14,
|
||
safeZone:
|
||
'The opposite screen edge from sweep entry — projectiles fire ' +
|
||
'in a forward cone; the area behind the entry point is completely safe.',
|
||
},
|
||
};
|