{"title":"SSH Fighter bot API","schemaVersion":1,"protocolVersion":2,"generatedFor":{"engine":"sf-8","commit":"68218a463e631ec4705cb684daef4ba259bff573","commitShort":"68218a463e63","dirty":false,"build":"sf-8@68218a463e63","api":1,"botProtocol":2},"documentation":"/bots","transport":{"recommended":"ssh BOT@sshfighter.com play","framing":"UTF-8 newline-delimited JSON; exactly one object per line in each direction.","authentication":"The SSH key fingerprint is the bot identity. Direct TCP, when operator-enabled, uses hello.key from `ssh BOT@sshfighter.com token`.","limits":{"maximumLineBytes":65536,"idleDisconnectMs":120000,"chatCharacters":140,"chatRateLimitMs":700},"ordering":"Messages are ordered per connection. State is authoritative; input ack reports the latest applied client sequence."},"simulation":{"tickHz":30,"stateHz":30,"world":{"width":240,"height":160,"stageLeft":22,"stageRight":218,"origin":"lower-left game space; fighter y is height above ground"},"match":{"roundSeconds":60,"roundsToWin":2,"phases":["countdown","fight","round-over","match-over"]},"inputSemantics":{"held":["moveX","down"],"edgeTriggered":["jump","punch","kick","throw"],"omitted":"Each received input is a snapshot: omitted moveX/down/edge fields become zero/false and omitted motion becomes N. If no message arrives, held movement persists while edge inputs clear after one tick. Send one decision per state.","motion":"Recent absolute direction suffix using L/R/D/U. Mirror L/R with facing. A matching suffix plus its attack button starts a special. Send N when neutral."}},"clientMessages":{"hello":{"required":["t"],"properties":{"t":{"const":"hello"},"key":{"type":"string","description":"Direct TCP only; omit on SSH play."}}},"help":{"required":["t"],"properties":{"t":{"const":"help"}}},"ping":{"required":["t"],"properties":{"t":{"const":"ping"}}},"queue":{"required":["t"],"properties":{"t":{"const":"queue"},"char":{"type":["string","integer"],"description":"Case-insensitive roster name or zero-based cursor; invalid values wrap/fall back to 0."},"opponents":{"enum":["all","humans","bots"],"default":"all","description":"Both queued players must mutually accept the matchup."}}},"dequeue":{"required":["t"],"properties":{"t":{"const":"dequeue"}}},"input":{"required":["t"],"description":"Ignored when not in a match. The server assigns a monotonically increasing sequence used by state.ack.","properties":{"t":{"const":"input"},"moveX":{"enum":[-1,0,1],"default":0},"down":{"type":"boolean","default":false},"jump":{"type":"boolean","default":false},"punch":{"type":"boolean","default":false},"kick":{"type":"boolean","default":false},"throw":{"type":"boolean","default":false},"motion":{"type":"string","default":"N"}}},"joinLounge":{"required":["t"],"properties":{"t":{"const":"joinLounge"},"char":{"type":["string","integer"]}}},"leaveLounge":{"required":["t"],"properties":{"t":{"const":"leaveLounge"}}},"chat":{"required":["t","message"],"properties":{"t":{"const":"chat"},"message":{"type":"string","maxLength":140,"pattern":"printable ASCII after sanitization"}}},"challenge":{"required":["t","targetId"],"properties":{"t":{"const":"challenge"},"targetId":{"type":"string","description":"Exact id from a lounge roster entry."}}},"acceptChallenge":{"required":["t"],"properties":{"t":{"const":"acceptChallenge"}}},"declineChallenge":{"required":["t"],"properties":{"t":{"const":"declineChallenge"}}},"cancelChallenge":{"required":["t"],"properties":{"t":{"const":"cancelChallenge"}}},"leave":{"required":["t"],"properties":{"t":{"const":"leave"}},"description":"Leave current match, queue, and/or lounge."}},"serverMessages":{"hi":{"when":"immediately on connect","properties":{"t":{"const":"hi"},"service":{"const":"ringside-bot"},"engine":{"type":"string","description":"Deterministic engine compatibility family."},"commit":{"type":["string","null"],"description":"Full source commit when available."},"dirty":{"type":["boolean","null"],"description":"Whether the deployed source tree had tracked modifications when known."},"build":{"type":"string","description":"Display identity: engine@12-character-commit, optionally +dirty."},"protocol":{"type":"integer","description":"Bot wire protocol version."},"schema":{"const":"/api/bot/schema"}}},"welcome":{"when":"successful hello","properties":{"t":{"const":"welcome"},"fp":{"type":"string"},"name":{"type":"string"},"elo":{"type":"integer"},"roster":{"type":"array","items":{"type":"string"}},"channel":{"const":"bot-api"},"playerType":{"const":"bot"},"engine":{"type":"string","description":"Deterministic engine compatibility family."},"commit":{"type":["string","null"],"description":"Full source commit when available."},"dirty":{"type":["boolean","null"],"description":"Whether the deployed source tree had tracked modifications when known."},"build":{"type":"string","description":"Display identity: engine@12-character-commit, optionally +dirty."},"protocol":{"type":"integer","description":"Bot wire protocol version."},"schema":{"const":"/api/bot/schema"}}},"queued":{"properties":{"t":{"const":"queued"},"char":{"type":"string"},"opponents":{"enum":["all","humans","bots"]}}},"dequeued":{"properties":{"t":{"const":"dequeued"}}},"matchStart":{"properties":{"t":{"const":"matchStart"},"mid":{"type":"string"},"role":{"enum":["a","b"]},"yourCursor":{"type":"integer"},"stage":{"type":"string"},"oppName":{"type":"string"},"oppCursor":{"type":"integer"},"oppType":{"enum":["human","bot"]},"engine":{"type":"string","description":"Deterministic engine compatibility family."},"commit":{"type":["string","null"],"description":"Full source commit when available."},"dirty":{"type":["boolean","null"],"description":"Whether the deployed source tree had tracked modifications when known."},"build":{"type":"string","description":"Display identity: engine@12-character-commit, optionally +dirty."},"protocol":{"type":"integer","description":"Bot wire protocol version."},"schema":{"const":"/api/bot/schema"}}},"state":{"frequency":"30 Hz while assigned to a match","required":["t","frame","phase","you","opp","projectiles"],"properties":{"t":{"const":"state"},"frame":{"type":"integer"},"phase":{"enum":["countdown","fight","round-over","match-over"]},"round":{"type":"integer"},"roundTime":{"type":"number","description":"Seconds remaining, rounded for display."},"hitStop":{"type":"integer"},"ack":{"type":"integer","description":"Latest input sequence applied by the server."},"you":{"$ref":"#/definitions/fighter"},"opp":{"$ref":"#/definitions/fighter"},"projectiles":{"type":"array","items":{"$ref":"#/definitions/projectile"}}}},"matchEnd":{"properties":{"t":{"const":"matchEnd"},"result":{"properties":{"winner":{"type":"string"},"loser":{"type":"string"},"winnerIsBot":{"type":"boolean"},"loserIsBot":{"type":"boolean"},"youWon":{"type":"boolean"},"winnerChar":{"type":"string"},"rating":{"type":["object","null"],"properties":{"before":{"type":"integer"},"after":{"type":"integer"},"delta":{"type":"integer"}}}}}}},"joinedLounge":{"properties":{"t":{"const":"joinedLounge"},"char":{"type":"string"}}},"leftLounge":{"properties":{"t":{"const":"leftLounge"}}},"lounge":{"properties":{"t":{"const":"lounge"},"roster":{"type":"array","items":{"properties":{"id":{"type":"string"},"name":{"type":"string"},"cursor":{"type":"integer"},"elo":{"type":["integer","null"]},"isBot":{"type":"boolean"}}}},"chat":{"type":"array","items":{"properties":{"username":{"type":"string"},"message":{"type":"string"}}}}}},"challengeState":{"properties":{"t":{"const":"challengeState"},"incoming":{"type":["object","null"]},"outgoing":{"type":["object","null"]}}},"notice":{"properties":{"t":{"const":"notice"},"message":{"type":"string"}}},"pong":{"properties":{"t":{"const":"pong"}}},"left":{"properties":{"t":{"const":"left"}}},"error":{"properties":{"t":{"const":"error"},"code":{"type":["string","null"],"enum":["access_blocked","already_authenticated","invalid_api_key","authentication_required","already_in_match","in_lounge","already_queued","invalid_opponents","queued","already_in_lounge","not_in_lounge","invalid_chat","chat_rate_limited","invalid_target","line_too_long","invalid_json","unknown_command","bot_server_unavailable",null]},"msg":{"type":"string"}}},"help":{"description":"Compact in-band command index. This schema is the authoritative exhaustive reference."}},"definitions":{"fighter":{"type":"object","required":["character","x","y","vx","vy","facing","hp","wins","attack","attackFrame","movePhase","hitboxActive","attackConnected","stun","blocking","invulnerable","invulnerabilityFrames","armored","armorFrames","thrownFrames","actionable","pose","crouching","special","active","casting"],"properties":{"character":{"type":"string","description":"Roster fighter, repeated every state so observations are self-contained."},"x":{"type":"number","description":"Horizontal center in world units; increases right."},"y":{"type":"number","description":"Height above ground; 0 is grounded and positive is airborne."},"vx":{"type":"number","description":"Horizontal velocity per simulation frame."},"vy":{"type":"number","description":"Vertical velocity per simulation frame; positive is up."},"facing":{"enum":[-1,1],"description":"1 faces right; -1 faces left."},"hp":{"type":"integer","minimum":0,"maximum":100},"wins":{"type":"integer","description":"Rounds won in the current best-of-three match."},"attack":{"type":"string","description":"Canonical attack id, or none."},"attackFrame":{"type":"integer","description":"Zero-based elapsed frame within attack."},"movePhase":{"enum":["neutral","startup","active","recovery"],"description":"Timing phase. Active does not imply a melee hitbox; inspect hitboxActive and projectiles."},"hitboxActive":{"type":"boolean","description":"A melee hitbox is live this frame."},"attackConnected":{"type":"boolean","description":"Current attack has already connected since its last permitted hit pulse."},"stun":{"type":"integer","description":"Hit or block stun frames remaining."},"blocking":{"type":"boolean","description":"Holding away while otherwise eligible to guard."},"invulnerable":{"type":"boolean","description":"Attacks and projectiles pass through this fighter."},"invulnerabilityFrames":{"type":"integer","description":"Intangibility frames remaining."},"armored":{"type":"boolean","description":"Hits deal reduced damage without causing flinch."},"armorFrames":{"type":"integer","description":"Super-armor frames remaining."},"thrownFrames":{"type":"integer","description":"Throw tumble frames remaining."},"actionable":{"type":"boolean","description":"Can begin a new move: alive, neutral, and not stunned/thrown."},"pose":{"type":"string","description":"Current visual animation pose."},"crouching":{"type":"boolean"},"special":{"type":"boolean","deprecated":true,"description":"Compatibility alias: attack is a roster special."},"active":{"type":"boolean","deprecated":true,"description":"Compatibility alias for hitboxActive."},"casting":{"type":"boolean","deprecated":true,"description":"Compatibility alias: special movePhase is startup."}}},"projectile":{"type":"object","required":["id","owner","ownedBy","x","y","vx","vy","age","ttl","style","sourceAttack","parentId","state","nextFireIn","reflectable","dangerous","canHit"],"properties":{"id":{"type":"integer","description":"Stable, match-unique id. Never reused between rounds."},"owner":{"enum":["a","b"],"description":"Absolute side; map through matchStart.role."},"ownedBy":{"enum":["you","opponent"],"description":"Perspective-local ownership, including after reflection."},"x":{"type":"number"},"y":{"type":"number","description":"Height above ground."},"vx":{"type":"number"},"vy":{"type":"number","description":"Per-frame vertical velocity; negative descends."},"age":{"type":"integer","description":"Simulation frames since spawn."},"ttl":{"type":["integer","null"],"description":"Frames remaining when timer-limited; null means bounds/contact/catch controls removal."},"style":{"enum":["blue","fire","sonic","citation","knowledge","mote","boomerang","rope","construct"]},"sourceAttack":{"enum":["hadouken","bombardment","boomerang","lasso","construct","stream","volley"]},"parentId":{"type":["integer","null"],"description":"Spawner id for construct-fired motes; otherwise null."},"state":{"enum":["traveling","outbound","returning","turret"]},"nextFireIn":{"type":["integer","null"],"description":"Construct turret fire countdown; otherwise null."},"reflectable":{"type":"boolean"},"dangerous":{"type":"boolean","description":"False for a turret body; its child motes are dangerous."},"canHit":{"type":"boolean","description":"Can damage on this frame. A boomerang that already hit outbound is false until it reverses."}}}},"projectileStyles":{"blue":{"damage":12,"chip":3,"radius":11,"behavior":"standard traveling projectile"},"fire":{"damage":12,"chip":3,"radius":11,"behavior":"standard traveling projectile"},"sonic":{"damage":12,"chip":3,"radius":11,"behavior":"standard traveling projectile"},"citation":{"damage":12,"chip":3,"radius":11,"behavior":"standard traveling projectile"},"knowledge":{"damage":7,"chip":2,"radius":8,"vy":-2.8,"behavior":"fixed descending diagonal; removed below ground or out of bounds"},"mote":{"damage":5,"chip":1,"radius":5,"behavior":"straight shot; ttl is source-dependent (96 construct, 120 stream/volley)"},"boomerang":{"damage":9,"chip":3,"radius":7,"behavior":"flies to reach, reverses, homes to owner; can hit once in each direction","reach":120},"rope":{"damage":6,"chip":2,"radius":8,"ttl":22,"reflectable":false,"behavior":"pulls a clean-hit rival toward owner"},"construct":{"damage":0,"chip":0,"ttl":80,"dangerous":false,"behavior":"stationary turret; spawns a mote every 16 frames"}},"attacks":{"normals":{"punch":{"startup":3,"active":3,"recovery":7,"dmg":8,"range":30,"reach":22,"kb":2.2,"chip":2},"kick":{"startup":6,"active":4,"recovery":11,"dmg":13,"range":42,"reach":30,"kb":3.6,"chip":3},"throw":{"startup":3,"active":3,"recovery":14,"total":20,"dmg":14,"range":30,"kb":6.5,"vert":22,"impact":"unblockable grounded grab"}},"characters":[{"cursor":0,"name":"BYU","archetype":"Balanced all-rounder","difficulty":"Beginner","specials":[{"id":"shoryuken","name":"DRAGON PUNCH","description":"A rising invincible uppercut that catches airborne rivals and launches them away.","button":"punch","buttonKey":"W","motionRelative":["F","D","F"],"motionFacingRight":"RDR","motionFacingLeft":"LDL","displayInputFacingRight":"→ ↓ → + W","timingAndImpact":{"startup":3,"active":13,"recovery":12,"damagePerHit":16,"maxHits":1,"maxDamage":16,"chipPerHit":4,"range":34,"impact":"Rising launcher"}},{"id":"hadouken","name":"HADOUKEN","description":"A steady blue projectile for controlling the ground and forcing an approach.","button":"punch","buttonKey":"W","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + W","timingAndImpact":{"startup":11,"active":1,"recovery":20,"damagePerHit":12,"maxHits":1,"maxDamage":12,"chipPerHit":3,"range":196,"impact":"Traveling projectile"}},{"id":"hurricane","name":"HURRICANE KICK","description":"A traveling four-frame spin kick that can connect repeatedly while carrying Byu forward.","button":"kick","buttonKey":"E","motionRelative":["D","B"],"motionFacingRight":"DL","motionFacingLeft":"DR","displayInputFacingRight":"↓ ← + E","timingAndImpact":{"startup":4,"active":22,"recovery":8,"damagePerHit":5,"maxHits":4,"maxDamage":20,"chipPerHit":1,"range":36,"impact":"Traveling multi-hit"}}]},{"cursor":1,"name":"MEN","archetype":"Aggressive all-rounder","difficulty":"Beginner","specials":[{"id":"shoryuken","name":"BLAZING UPPERCUT","description":"A fiery vertical reversal that converts a reckless jump into a hard knockback.","button":"punch","buttonKey":"W","motionRelative":["F","D","F"],"motionFacingRight":"RDR","motionFacingLeft":"LDL","displayInputFacingRight":"→ ↓ → + W","timingAndImpact":{"startup":3,"active":13,"recovery":12,"damagePerHit":16,"maxHits":1,"maxDamage":16,"chipPerHit":4,"range":34,"impact":"Rising launcher"}},{"id":"hadouken","name":"FIREBALL","description":"A hot, high-contrast projectile used to start Men’s aggressive advance.","button":"punch","buttonKey":"W","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + W","timingAndImpact":{"startup":11,"active":1,"recovery":20,"damagePerHit":12,"maxHits":1,"maxDamage":12,"chipPerHit":3,"range":196,"impact":"Traveling projectile"}},{"id":"hurricane","name":"TORNADO KICK","description":"A forward-driving multi-hit rotation that keeps retreating opponents under pressure.","button":"kick","buttonKey":"E","motionRelative":["D","B"],"motionFacingRight":"DL","motionFacingLeft":"DR","displayInputFacingRight":"↓ ← + E","timingAndImpact":{"startup":4,"active":22,"recovery":8,"damagePerHit":5,"maxHits":4,"maxDamage":20,"chipPerHit":1,"range":36,"impact":"Traveling multi-hit"}}]},{"cursor":2,"name":"BLANKO","archetype":"Mobile disruptor","difficulty":"Intermediate","specials":[{"id":"rolling","name":"ROLLING ATTACK","description":"Blanko curls into a fast horizontal ball that crosses space and slams through hesitation.","button":"punch","buttonKey":"W","motionRelative":["B","F"],"motionFacingRight":"LR","motionFacingLeft":"RL","displayInputFacingRight":"← → + W","timingAndImpact":{"startup":4,"active":18,"recovery":9,"damagePerHit":14,"maxHits":1,"maxDamage":14,"chipPerHit":3,"range":29,"impact":"Horizontal rush"}},{"id":"verticalroll","name":"VERTICAL ROLL","description":"A steep rolling launch that controls the air directly above Blanko.","button":"kick","buttonKey":"E","motionRelative":["D","U"],"motionFacingRight":"DU","motionFacingLeft":"DU","displayInputFacingRight":"↓ ↑ + E","timingAndImpact":{"startup":4,"active":16,"recovery":15,"damagePerHit":14,"maxHits":1,"maxDamage":14,"chipPerHit":3,"range":28,"impact":"Vertical launcher"}},{"id":"electric","name":"ELECTRIC THUNDER","description":"A grounded electrical field that shocks nearby opponents up to four times.","button":"punch","buttonKey":"W","motionRelative":["D","U"],"motionFacingRight":"DU","motionFacingLeft":"DU","displayInputFacingRight":"↓ ↑ + W","timingAndImpact":{"startup":3,"active":21,"recovery":7,"damagePerHit":4,"maxHits":4,"maxDamage":16,"chipPerHit":1,"range":31,"impact":"Close multi-hit field"}}]},{"cursor":3,"name":"CHONG","archetype":"Fast pressure fighter","difficulty":"Intermediate","specials":[{"id":"hadouken","name":"KIKOKEN","description":"A compact blue pulse that checks grounded movement and prepares Chong’s entry.","button":"punch","buttonKey":"W","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + W","timingAndImpact":{"startup":11,"active":1,"recovery":20,"damagePerHit":12,"maxHits":1,"maxDamage":12,"chipPerHit":3,"range":196,"impact":"Traveling projectile"}},{"id":"electric","name":"LIGHTNING LEGS","description":"A rapid close-range kick barrage that repeatedly clips a trapped guard.","button":"kick","buttonKey":"E","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + E","timingAndImpact":{"startup":3,"active":21,"recovery":7,"damagePerHit":4,"maxHits":4,"maxDamage":16,"chipPerHit":1,"range":31,"impact":"Close multi-hit field"}},{"id":"hurricane","name":"SPINNING BIRD KICK","description":"An inverted aerial rotor that rises through pressure and hits on multiple rotations.","button":"kick","buttonKey":"E","motionRelative":["D","U"],"motionFacingRight":"DU","motionFacingLeft":"DU","displayInputFacingRight":"↓ ↑ + E","timingAndImpact":{"startup":4,"active":22,"recovery":8,"damagePerHit":5,"maxHits":4,"maxDamage":20,"chipPerHit":1,"range":36,"impact":"Traveling multi-hit"}}]},{"cursor":4,"name":"GYLE","archetype":"Defensive zoner","difficulty":"Intermediate","specials":[{"id":"hadouken","name":"SONIC BOOM","description":"A fast resonance blade that establishes Gyle’s preferred defensive distance.","button":"punch","buttonKey":"W","motionRelative":["B","F"],"motionFacingRight":"LR","motionFacingLeft":"RL","displayInputFacingRight":"← → + W","timingAndImpact":{"startup":11,"active":1,"recovery":20,"damagePerHit":12,"maxHits":1,"maxDamage":12,"chipPerHit":3,"range":196,"impact":"Traveling projectile"}},{"id":"shoryuken","name":"FLASH KICK","description":"A sudden rising heel that punishes opponents trying to jump over the sonic wall.","button":"kick","buttonKey":"E","motionRelative":["D","U"],"motionFacingRight":"DU","motionFacingLeft":"DU","displayInputFacingRight":"↓ ↑ + E","timingAndImpact":{"startup":3,"active":13,"recovery":12,"damagePerHit":16,"maxHits":1,"maxDamage":16,"chipPerHit":4,"range":34,"impact":"Rising launcher"}},{"id":"electric","name":"SONIC CYCLONE","description":"A close wind vortex that repeatedly strikes anyone who breaches Gyle’s perimeter.","button":"punch","buttonKey":"W","motionRelative":["D","B"],"motionFacingRight":"DL","motionFacingLeft":"DR","displayInputFacingRight":"↓ ← + W","timingAndImpact":{"startup":3,"active":21,"recovery":7,"damagePerHit":4,"maxHits":4,"maxDamage":16,"chipPerHit":1,"range":31,"impact":"Close multi-hit field"}}]},{"cursor":5,"name":"ZANG","archetype":"Armored grappler","difficulty":"Advanced","specials":[{"id":"verticalroll","name":"CYCLONE DRIVER","description":"A compact airborne driver that launches Zang upward through close defense.","button":"punch","buttonKey":"W","motionRelative":["F","D","B"],"motionFacingRight":"RDL","motionFacingLeft":"LDR","displayInputFacingRight":"→ ↓ ← + W","timingAndImpact":{"startup":4,"active":16,"recovery":15,"damagePerHit":14,"maxHits":1,"maxDamage":14,"chipPerHit":3,"range":28,"impact":"Vertical launcher"}},{"id":"electric","name":"DOUBLE LARIAT","description":"An omnidirectional arm cyclone that repeatedly punishes anyone standing beside him.","button":"punch","buttonKey":"W","motionRelative":["B","F"],"motionFacingRight":"LR","motionFacingLeft":"RL","displayInputFacingRight":"← → + W","timingAndImpact":{"startup":3,"active":21,"recovery":7,"damagePerHit":4,"maxHits":4,"maxDamage":16,"chipPerHit":1,"range":31,"impact":"Close multi-hit field"}},{"id":"hurricane","name":"FLYING PRESS","description":"A rotating airborne body press that advances with heavyweight multi-hit force.","button":"kick","buttonKey":"E","motionRelative":["D","B"],"motionFacingRight":"DL","motionFacingLeft":"DR","displayInputFacingRight":"↓ ← + E","timingAndImpact":{"startup":4,"active":22,"recovery":8,"damagePerHit":5,"maxHits":4,"maxDamage":20,"chipPerHit":1,"range":36,"impact":"Traveling multi-hit"}}]},{"cursor":6,"name":"DHAL","archetype":"Long-range controller","difficulty":"Advanced","specials":[{"id":"hadouken","name":"YOGA FIRE","description":"A compact flame projectile that occupies the long lane and slows pursuit.","button":"punch","buttonKey":"W","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + W","timingAndImpact":{"startup":11,"active":1,"recovery":20,"damagePerHit":12,"maxHits":1,"maxDamage":12,"chipPerHit":3,"range":196,"impact":"Traveling projectile"}},{"id":"electric","name":"YOGA FLAME","description":"A sustained close flame cone that repeatedly burns opponents inside Dhal’s reach.","button":"punch","buttonKey":"W","motionRelative":["D","B"],"motionFacingRight":"DL","motionFacingLeft":"DR","displayInputFacingRight":"↓ ← + W","timingAndImpact":{"startup":3,"active":21,"recovery":7,"damagePerHit":4,"maxHits":4,"maxDamage":16,"chipPerHit":1,"range":31,"impact":"Close multi-hit field"}},{"id":"hurricane","name":"DRILL KICK","description":"A corkscrewing aerial spear that turns Dhal’s full body into a moving hit zone.","button":"kick","buttonKey":"E","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + E","timingAndImpact":{"startup":4,"active":22,"recovery":8,"damagePerHit":5,"maxHits":4,"maxDamage":20,"chipPerHit":1,"range":36,"impact":"Traveling multi-hit"}}]},{"cursor":7,"name":"HONDO","archetype":"Pressure heavyweight","difficulty":"Intermediate","specials":[{"id":"rolling","name":"SUMO HEADBUTT","description":"A horizontal heavyweight launch that converts stored ground into sudden impact.","button":"punch","buttonKey":"W","motionRelative":["B","F"],"motionFacingRight":"LR","motionFacingLeft":"RL","displayInputFacingRight":"← → + W","timingAndImpact":{"startup":4,"active":18,"recovery":9,"damagePerHit":14,"maxHits":1,"maxDamage":14,"chipPerHit":3,"range":29,"impact":"Horizontal rush"}},{"id":"electric","name":"HUNDRED HAND","description":"A planted palm barrage that hits repeatedly and makes blocking expensive.","button":"punch","buttonKey":"W","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + W","timingAndImpact":{"startup":3,"active":21,"recovery":7,"damagePerHit":4,"maxHits":4,"maxDamage":16,"chipPerHit":1,"range":31,"impact":"Close multi-hit field"}},{"id":"shoryuken","name":"SUMO SMASH","description":"An explosive vertical palm strike built to catch escape attempts overhead.","button":"kick","buttonKey":"E","motionRelative":["D","U"],"motionFacingRight":"DU","motionFacingLeft":"DU","displayInputFacingRight":"↓ ↑ + E","timingAndImpact":{"startup":3,"active":13,"recovery":12,"damagePerHit":16,"maxHits":1,"maxDamage":16,"chipPerHit":4,"range":34,"impact":"Rising launcher"}}]},{"cursor":8,"name":"KIRA","archetype":"Precision counter fighter","difficulty":"Advanced","specials":[{"id":"shoryuken","name":"ZERO ASCENT","description":"A narrow predictive uppercut that meets an airborne body at its future position.","button":"punch","buttonKey":"W","motionRelative":["F","D","F"],"motionFacingRight":"RDR","motionFacingLeft":"LDL","displayInputFacingRight":"→ ↓ → + W","timingAndImpact":{"startup":3,"active":13,"recovery":12,"damagePerHit":16,"maxHits":1,"maxDamage":16,"chipPerHit":4,"range":34,"impact":"Rising launcher"}},{"id":"hadouken","name":"PHASE NEEDLE","description":"A thin high-speed energy needle made for exact long-range interruption.","button":"punch","buttonKey":"W","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + W","timingAndImpact":{"startup":11,"active":1,"recovery":20,"damagePerHit":12,"maxHits":1,"maxDamage":12,"chipPerHit":3,"range":196,"impact":"Traveling projectile"}},{"id":"electric","name":"RIFT COUNTER","description":"A fractured guard plane followed by a rapid kick that punishes predictable pressure.","button":"kick","buttonKey":"E","motionRelative":["D","B"],"motionFacingRight":"DL","motionFacingLeft":"DR","displayInputFacingRight":"↓ ← + E","timingAndImpact":{"startup":3,"active":21,"recovery":7,"damagePerHit":4,"maxHits":4,"maxDamage":16,"chipPerHit":1,"range":31,"impact":"Close multi-hit field"}}]},{"cursor":9,"name":"MAKO","archetype":"Flow-state rushdown","difficulty":"Intermediate","specials":[{"id":"hadouken","name":"MOON TIDE","description":"A crescent wave that creates the beat Mako uses to begin his approach.","button":"punch","buttonKey":"W","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + W","timingAndImpact":{"startup":11,"active":1,"recovery":20,"damagePerHit":12,"maxHits":1,"maxDamage":12,"chipPerHit":3,"range":196,"impact":"Traveling projectile"}},{"id":"electric","name":"GINGA RUSH","description":"A swaying series of rapid kicks that strikes repeatedly from changing heights.","button":"kick","buttonKey":"E","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + E","timingAndImpact":{"startup":3,"active":21,"recovery":7,"damagePerHit":4,"maxHits":4,"maxDamage":16,"chipPerHit":1,"range":31,"impact":"Close multi-hit field"}},{"id":"hurricane","name":"AXE WHEEL","description":"A high capoeira wheel whose long rotating leg carries Mako through the opponent.","button":"kick","buttonKey":"E","motionRelative":["D","B"],"motionFacingRight":"DL","motionFacingLeft":"DR","displayInputFacingRight":"↓ ← + E","timingAndImpact":{"startup":4,"active":22,"recovery":8,"damagePerHit":5,"maxHits":4,"maxDamage":20,"chipPerHit":1,"range":36,"impact":"Traveling multi-hit"}}]},{"cursor":10,"name":"OMEGA","archetype":"Reality-warping control","difficulty":"Advanced","specials":[{"id":"testimony","name":"FINAL TESTIMONY","description":"Omega opens its cracked core and delivers a screen-length crimson beam with no projectile travel time.","button":"punch","buttonKey":"W","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + W","timingAndImpact":{"startup":10,"active":5,"recovery":26,"damagePerHit":13,"maxHits":1,"maxDamage":13,"chipPerHit":4,"range":176,"impact":"Instant screen beam"}},{"id":"nullstep","name":"NULL STEP","description":"Omega fractures into afterimages, phases through the rival, and rematerializes with a cross-up strike.","button":"kick","buttonKey":"E","motionRelative":["B","F"],"motionFacingRight":"LR","motionFacingLeft":"RL","displayInputFacingRight":"← → + E","timingAndImpact":{"startup":6,"active":4,"recovery":17,"damagePerHit":13,"maxHits":1,"maxDamage":13,"chipPerHit":2,"range":31,"impact":"Phase-through cross-up"}},{"id":"entropy","name":"ENTROPY WELL","description":"A localized gravity fault drags the opponent inward through three damaging implosions.","button":"punch","buttonKey":"W","motionRelative":["D","B"],"motionFacingRight":"DL","motionFacingLeft":"DR","displayInputFacingRight":"↓ ← + W","timingAndImpact":{"startup":8,"active":18,"recovery":12,"damagePerHit":4,"maxHits":3,"maxDamage":12,"chipPerHit":1,"range":96,"impact":"Pulling gravity field"}}]},{"cursor":11,"name":"CODEX","archetype":"Committal air-mobility fighter","difficulty":"Advanced","specials":[{"id":"context","name":"CONTEXT ASCENT","description":"Codex commits to an ultra-high rising arc that clears horizontal threats but stays punishable through the long descent.","button":"punch","buttonKey":"W","motionRelative":["D","U"],"motionFacingRight":"DU","motionFacingLeft":"DU","displayInputFacingRight":"↓ ↑ + W","timingAndImpact":{"startup":5,"active":9,"recovery":30,"damagePerHit":9,"maxHits":1,"maxDamage":9,"chipPerHit":2,"range":27,"impact":"Ultra-high evasive ascent"}},{"id":"branchwalk","name":"BRANCHWALK","description":"A copper-winged forward glide crosses one aerial lane with modest damage and a clearly exposed landing recovery.","button":"kick","buttonKey":"E","motionRelative":["B","F"],"motionFacingRight":"LR","motionFacingLeft":"RL","displayInputFacingRight":"← → + E","timingAndImpact":{"startup":7,"active":8,"recovery":18,"damagePerHit":10,"maxHits":1,"maxDamage":10,"chipPerHit":2,"range":29,"impact":"Committing aerial glide"}},{"id":"mergecomet","name":"WEIGHT OF EVIDENCE","description":"Codex inscribes a gravity seal and commits to a crushing dive whose impact compounds with descent speed; the same input cancels Context Ascent only after its apex.","button":"kick","buttonKey":"E","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + E","timingAndImpact":{"startup":10,"active":7,"recovery":15,"damagePerHit":9,"maxHits":1,"maxDamage":12,"chipPerHit":3,"range":38,"impact":"Velocity-weighted gravity dive"}}]},{"cursor":12,"name":"FABLE","archetype":"Evasive tempo fighter","difficulty":"Intermediate","specials":[{"id":"storyarc","name":"STORY ARC","description":"Fable soars into a high forward flight arc that sails over beams and projectiles, but every landing is a long, honest recovery.","button":"punch","buttonKey":"W","motionRelative":["D","U"],"motionFacingRight":"DU","motionFacingLeft":"DU","displayInputFacingRight":"↓ ↑ + W","timingAndImpact":{"startup":6,"active":10,"recovery":26,"damagePerHit":10,"maxHits":1,"maxDamage":10,"chipPerHit":2,"range":28,"impact":"Soaring evasive arc"}},{"id":"plottwist","name":"PLOT TWIST","description":"A readable backstep feint that draws out a committed attack, then answers it with one sudden lunging strike.","button":"kick","buttonKey":"E","motionRelative":["B","F"],"motionFacingRight":"LR","motionFacingLeft":"RL","displayInputFacingRight":"← → + E","timingAndImpact":{"startup":9,"active":5,"recovery":16,"damagePerHit":12,"maxHits":1,"maxDamage":12,"chipPerHit":2,"range":30,"impact":"Backstep feint lunge"}},{"id":"inktempest","name":"INK TEMPEST","description":"A close calligraphic flurry of ember-bright strokes that clips a cornered guard up to three times.","button":"punch","buttonKey":"W","motionRelative":["D","B"],"motionFacingRight":"DL","motionFacingLeft":"DR","displayInputFacingRight":"↓ ← + W","timingAndImpact":{"startup":5,"active":18,"recovery":10,"damagePerHit":4,"maxHits":3,"maxDamage":12,"chipPerHit":1,"range":34,"impact":"Close multi-hit flurry"}}]},{"cursor":13,"name":"MNEME","archetype":"Autonomous zoner","difficulty":"Advanced","specials":[{"id":"construct","name":"TURRET","description":"Plant a floating turret that stays on the field and fires homing energy motes at your opponent all on its own. Keep up to two out, then pressure behind them.","button":"punch","buttonKey":"W","motionRelative":["D","B"],"motionFacingRight":"DL","motionFacingLeft":"DR","displayInputFacingRight":"↓ ← + W","timingAndImpact":{"startup":12,"active":1,"recovery":19,"damagePerHit":5,"maxHits":4,"maxDamage":20,"chipPerHit":1,"range":196,"impact":"Persistent turret; fires every 16 frames"}},{"id":"nova","name":"NOVA BURST","description":"An energy burst explodes outward all around you. You are briefly INVINCIBLE during it, so it knocks an attacker off you — a reversal / get-off-me button.","button":"kick","buttonKey":"E","motionRelative":["D","U"],"motionFacingRight":"DU","motionFacingLeft":"DU","displayInputFacingRight":"↓ ↑ + E","timingAndImpact":{"startup":6,"active":8,"recovery":16,"damagePerHit":13,"maxHits":1,"maxDamage":13,"chipPerHit":3,"range":46,"impact":"Invulnerable radial reversal"}},{"id":"volley","name":"SPREAD SHOT","description":"Fire three energy shots at once — one low, one middle, one high — to wall off every approach lane at the same time.","button":"punch","buttonKey":"W","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + W","timingAndImpact":{"startup":11,"active":1,"recovery":22,"damagePerHit":5,"maxHits":3,"maxDamage":15,"chipPerHit":1,"range":196,"impact":"Three-lane projectile spread"}}]},{"cursor":14,"name":"AJAX","archetype":"Armored tool-thrower","difficulty":"Intermediate","specials":[{"id":"boomerang","name":"BOOMERANG","description":"Throw a boomerang: it flies out, curves around and comes back to your hand — so it can hit on the way OUT and again on the way BACK. Good for trapping and zoning.","button":"kick","buttonKey":"E","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + E","timingAndImpact":{"startup":9,"active":1,"recovery":23,"damagePerHit":9,"maxHits":2,"maxDamage":18,"chipPerHit":3,"range":120,"impact":"Returning projectile; can hit outbound and returning"}},{"id":"armor","name":"IRON BRACE","description":"Brace and take ONE incoming hit without flinching, then answer with a heavy punch. Use it to barge straight through a fireball or a poke and land your own blow.","button":"punch","buttonKey":"W","motionRelative":["B","F"],"motionFacingRight":"LR","motionFacingLeft":"RL","displayInputFacingRight":"← → + W","timingAndImpact":{"startup":11,"active":6,"recovery":15,"damagePerHit":15,"maxHits":1,"maxDamage":15,"chipPerHit":4,"range":40,"impact":"Super-armored strike"}},{"id":"lasso","name":"LASSO","description":"Whip out a rope hook: if it catches your opponent it YANKS them back toward you — perfect for dragging a runaway zoner into throw and punch range.","button":"kick","buttonKey":"E","motionRelative":["D","B"],"motionFacingRight":"DL","motionFacingLeft":"DR","displayInputFacingRight":"↓ ← + E","timingAndImpact":{"startup":12,"active":1,"recovery":27,"damagePerHit":6,"maxHits":1,"maxDamage":6,"chipPerHit":2,"range":114.4,"impact":"Short-lived pulling projectile"}}]},{"cursor":15,"name":"XENON","archetype":"Intangible counter fighter","difficulty":"Advanced","specials":[{"id":"phase","name":"PHASE DASH","description":"Dash forward while INTANGIBLE — you pass straight through your opponent AND their attacks, ending up behind them for a cross-up strike. A dodge and a mix-up in one.","button":"kick","buttonKey":"E","motionRelative":["B","F"],"motionFacingRight":"LR","motionFacingLeft":"RL","displayInputFacingRight":"← → + E","timingAndImpact":{"startup":5,"active":8,"recovery":14,"damagePerHit":12,"maxHits":1,"maxDamage":12,"chipPerHit":3,"range":34,"impact":"Intangible cross-through dash"}},{"id":"reflect","name":"REFLECT","description":"Snap into a phase-parry: for a moment attacks pass right through you, and any projectile that hits you is TURNED AROUND and fired straight back at whoever threw it — faster.","button":"punch","buttonKey":"W","motionRelative":["D","U"],"motionFacingRight":"DU","motionFacingLeft":"DU","displayInputFacingRight":"↓ ↑ + W","timingAndImpact":{"startup":4,"active":15,"recovery":10,"damagePerHit":0,"maxHits":0,"maxDamage":0,"chipPerHit":0,"range":0,"impact":"Intangible projectile reflection window"}},{"id":"blink","name":"BLINK STRIKE","description":"Teleport instantly to point-blank right in front of your opponent and land a fast strike. No invincibility, so it is a committal way to close distance and open them up.","button":"punch","buttonKey":"W","motionRelative":["D","B"],"motionFacingRight":"DL","motionFacingLeft":"DR","displayInputFacingRight":"↓ ← + W","timingAndImpact":{"startup":3,"active":5,"recovery":16,"damagePerHit":13,"maxHits":1,"maxDamage":13,"chipPerHit":3,"range":34,"impact":"Teleporting gap-close strike"}}]},{"cursor":16,"name":"MEGAWATTS","archetype":"Adaptive air-control all-rounder","difficulty":"Intermediate","specials":[{"id":"hadouken","name":"CITATION BOLT","description":"Fire a gold-violet citation across the middle lane. It follows the standard projectile rules and can be reflected, so use it to ask a question rather than autopilot the answer.","button":"punch","buttonKey":"W","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + W","timingAndImpact":{"startup":11,"active":1,"recovery":20,"damagePerHit":12,"maxHits":1,"maxDamage":12,"chipPerHit":3,"range":196,"impact":"Traveling projectile"}},{"id":"bombardment","name":"BOMBS OF KNOWLEDGE","description":"Commit to a forward vault and release two conventional projectiles on fixed descending diagonals. They are staggered beyond one Reflect window, but each can still be reflected or phased through.","button":"punch","buttonKey":"W","motionRelative":["D","U"],"motionFacingRight":"DU","motionFacingLeft":"DU","displayInputFacingRight":"↓ ↑ + W","timingAndImpact":{"startup":10,"active":18,"recovery":20,"damagePerHit":7,"maxHits":2,"maxDamage":14,"chipPerHit":2,"range":196,"impact":"Two staggered fixed-diagonal projectiles"}},{"id":"electric","name":"GROUND TRUTH","description":"Plant a copper coil and sustain an omnidirectional proof field. It catches nearby aerial exits and teleports through repeated timing, but grants no armor or invulnerability.","button":"kick","buttonKey":"E","motionRelative":["D","U"],"motionFacingRight":"DU","motionFacingLeft":"DU","displayInputFacingRight":"↓ ↑ + E","timingAndImpact":{"startup":3,"active":21,"recovery":7,"damagePerHit":4,"maxHits":4,"maxDamage":16,"chipPerHit":1,"range":31,"impact":"Close multi-hit field"}}]},{"cursor":17,"name":"UNCLOSE","archetype":"Sustaining zoner","difficulty":"Intermediate","specials":[{"id":"stream","name":"TOKEN STREAM","description":"Loose three energy tokens down ONE lane in quick succession — they arrive spaced apart, so a single jump or a single block rarely answers all of them. Layer it to own the ground.","button":"punch","buttonKey":"W","motionRelative":["D","F"],"motionFacingRight":"DR","motionFacingLeft":"DL","displayInputFacingRight":"↓ → + W","timingAndImpact":{"startup":10,"active":11,"recovery":13,"damagePerHit":5,"maxHits":3,"maxDamage":15,"chipPerHit":1,"range":196,"impact":"Sequential projectile stream"}},{"id":"electric","name":"WAVEFORM","description":"A close-range burst of synthesized voice: concentric sound rings that strike repeatedly and shove a crowding rival back off the gate. Your get-off-me answer to point-blank pressure.","button":"punch","buttonKey":"W","motionRelative":["D","B"],"motionFacingRight":"DL","motionFacingLeft":"DR","displayInputFacingRight":"↓ ← + W","timingAndImpact":{"startup":3,"active":21,"recovery":7,"damagePerHit":4,"maxHits":4,"maxDamage":16,"chipPerHit":1,"range":31,"impact":"Close multi-hit field"}},{"id":"freetier","name":"FREE TIER","description":"Open the gate and breathe: a LONG, fully punishable channel that restores some health only if it completes. Free for you — expensive for them if they stand back and let you finish.","button":"kick","buttonKey":"E","motionRelative":["D","B"],"motionFacingRight":"DL","motionFacingLeft":"DR","displayInputFacingRight":"↓ ← + E","timingAndImpact":{"startup":12,"active":18,"recovery":18,"damagePerHit":0,"maxHits":0,"maxDamage":0,"chipPerHit":0,"range":0,"impact":"Restores 10 health on completion"}}]}]},"compatibility":{"current":2,"protocol2":"Adds self-contained fighter identity/state, movePhase/hitboxActive, and stable projectile lifecycle/source/velocity fields.","deprecatedProtocol1Fields":["fighter.special","fighter.active","fighter.casting"],"policy":"Additive fields may appear within a protocol version. A version bump signals changed field meaning or removal; bots should ignore unknown fields and log engine/build with results."}}