Game review

Stolen Sword

7.2 / 10

Developer
Ian Chiao
Publisher
Independent (js13k 2020 entry)
Released
1 January 2020
Platforms
Web browser (desktop and mobile)
Genre
Action platformer
Monetisation
Free, open source, no ads and no in-game purchases
Players
Single-player only

The short version

Stolen Sword packs an entire physics-based combat system into 13 kilobytes by making the drag-and-release gesture do everything: aim, jump, and attack are one motion, mouse and touch handled by the literal same code path. It is genuinely satisfying once you realise it works like a slingshot — pull away from where you want to go, release to launch there — but nothing on screen states that outright, and a first-time player who flicks in the "obvious" direction will get nowhere. Four hand-authored stages vary their format rather than repeating one loop, but the whole thing is over in under fifteen minutes and ends on a cliffhanger that is never resolved in this build. Worth the ten minutes for the mechanic alone; not much reason to stay.

Biggest strengths

  • The entire control scheme is one gesture on one finger — press, drag, release — and the source code proves it is genuinely shared between input methods: mousedown/mousemove/mouseup and touchstart/touchmove/touchend all funnel into the same three functions in src/modules/interaction.js, with the old keyboard listeners literally commented out
  • Confirmed by playtesting on a simulated 390x844 touchscreen, not just reading the code — a correctly-aimed drag launched the character into the first enemy, cleared the wave, and advanced the fight into the second wave, with zero console or page errors across every run
  • Four stages that change format rather than repeating the same loop: stage one runs eight short combat waves with escalating enemy patterns (solo, then paired, then a six-enemy swarm and a twelve-node chained enemy); stage two drops combat entirely for one long vertical climb past six moving hazards; stage three adds lower gravity, an underwater section, and shield enemies that block a hit until a second one lands; stage four closes on one sprawling encounter of roughly twenty enemies including a ten-link chain

Biggest weaknesses

  • The gesture is a pull-back slingshot, not a flick in your direction of travel — drag away from where you want the character to go and release, exactly like drawing a bow — and nothing on screen says this in words. The only teaching is a faint animated dashed line shown once on the first two waves. A player who flicks the "obvious" way will watch their character do nothing useful and may reasonably conclude the controls are broken
  • Short even by jam standards: four stages, roughly fifteen hand-placed encounters total, clearable in ten to fifteen minutes, ending on a literal "Still can't find him... (To be continued)" caption that this build never resolves. The repo's own README explains why — the concept was carried forward into a separate, paid mobile game ("Wild Wind" on iOS and Android) — which makes this free version feel like a tech demo for a product outside its scope
  • No score, no difficulty choice, no unlockables; once the four stages are cleared there is nothing pulling a player back

Who it's for: Players who want to feel a genuinely clever one-thumb control scheme work, and anyone curious what a 13KB jam game can still make room for

Our recommendation: Worth playing once for the slingshot mechanic and the production values packed into 13KB; not worth returning to once its four short stages are cleared

7.2 / 10

Stolen Sword's pitch is one sentence long and it is not lying to you: it is a one-finger action platformer where a single press-drag-release gesture handles aiming, jumping, and attacking at once. Ian Chiao built it for js13k 2020 — the competition that caps entries at 13 kilobytes zipped — and the whole game, four stages included, ships as one 31KB HTML file that unpacks from that budget. What makes it worth a look six years later isn't the file-size trick, though; it's that the control scheme it had to invent to fit a whole combat system into one gesture turns out to be genuinely good, once you understand what it is actually asking you to do.

The gesture is a slingshot, not a flick — and that matters

Reading src/modules/interaction.js settles the registry's claim outright: the code binds mousedown/mousemove/mouseup and touchstart/touchmove/touchend to the exact same three handler functions, and the old keydown/keyup listeners sit commented out above them. This was built touch-first and never had its symmetry bolted on afterward — there is no separate "mobile" code path to fall out of sync with the real one.

But the gesture itself needs stating plainly, because nothing in the game states it: this is a pull-back-and-release slingshot, not a flick in the direction you want to travel. The release velocity in state.js is calculated as the vector from your release point back to your press point — press near the top of the screen, drag down and release, and the character launches up, the same way pulling a slingshot's pouch backward sends the shot forward. It is precisely the Angry Birds convention, and once you know that, aiming a slash at an enemy above and to the right is just "press up-right, drag down-left, let go." Verified directly: playtesting on a simulated 390×844 touchscreen with that gesture launched the character straight into the first enemy, cleared it, and advanced the fight into the game's second wave, with zero console errors and zero page errors across every test run. The mechanic works, and dropping the whole screen to 5% time speed for the duration of the press — easing back to normal the instant you let go — turns what would otherwise be a twitchy mid-air aim into something genuinely readable. It's a cheap effect and a smart one.

The problem is that the game never tells you any of this in words. The only teaching is a faint, once-only dashed line animated across the first two waves, showing the correct pull-and-release motion — easy to miss, and easy to misread as decoration rather than instruction. A first-time player's instinct is to flick in the direction they want to go, the same way Fruit Ninja or a dozen other touch games work, and that instinct is exactly backward here. Get the gesture wrong and the character does nothing useful; a player who doesn't stumble onto the reversal within a try or two could reasonably conclude the controls simply don't work, which is a real risk for a touch-only shelf whose whole premise is that the controls have to work.

Four short stages that don't repeat themselves

For a 13-kilobyte competition entry, the source shows real variety rather than one loop copy- pasted with bigger numbers. Stage one is the closest thing to a "normal" combat gauntlet: eight small waves that escalate from a single stationary enemy, to a pair, to a six-enemy swarm with staggered spawn timing, to a twelve-node chained enemy that follows its own head around the screen. Stage two abandons combat waves entirely for one long vertical climb through six moving, untouchable hazards — pure platforming precision, no sword involved. Stage three changes the rules again: lower gravity, an underwater section with its own swimming animation, and "shell" enemies that actively defend and only take real damage once you've landed a second hit past their guard. Stage four closes with one sprawling encounter of roughly twenty enemies scattered across a much taller vertical space, including a ten-link chained enemy that has to be threaded rather than simply charged.

That structural variety is a genuine strength — this is not "one mechanic, four palette swaps." But the whole thing is also over fast: four stages, around fifteen hand-placed encounters total, clearable in ten to fifteen minutes by a player who has the gesture down. It ends on a literal "Still can't find him... (To be continued)" caption, and this build never continues it. The repo's own README explains why: Stolen Sword's concept was carried forward into a separate, paid mobile release, Wild Wind, on iOS and Android. That's a perfectly reasonable thing for an indie developer to do with a successful jam idea, but it does mean the free, open-source game under review here plays like an extended proof-of-concept for a product this review has no way to cover. Dying only costs you the current wave — two hits and you restart it from its start, no larger penalty — which keeps the combat approachable but also fairly low-stakes, and combined with the short runtime there's little tension left once the gesture clicks.

Verdict

Stolen Sword earns its shelf spot on the strength of one thing: a control scheme that is genuinely, verifiably built for a single thumb, with a source-level guarantee that mouse and touch behave identically. It's satisfying to pull off once you learn it works backward from instinct, and the four stages spend their tiny file-size budget on real structural variety instead of repetition. But it's a fifteen-minute experience that ends unresolved by design, with nothing built in to teach its own most important idea in words, and 72 GitHub stars plus 17 forks — a solid showing for a js13k entry — reflects a clever jam curiosity more than a game with lasting pull. Recommended for the ten minutes it takes to feel the mechanic work; don't expect much beyond that.

Pros and cons

Pros

  • The entire control scheme is one gesture on one finger — press, drag, release — and the source code proves it is genuinely shared between input methods: mousedown/mousemove/mouseup and touchstart/touchmove/touchend all funnel into the same three functions in src/modules/interaction.js, with the old keyboard listeners literally commented out
  • Confirmed by playtesting on a simulated 390x844 touchscreen, not just reading the code — a correctly-aimed drag launched the character into the first enemy, cleared the wave, and advanced the fight into the second wave, with zero console or page errors across every run
  • Four stages that change format rather than repeating the same loop: stage one runs eight short combat waves with escalating enemy patterns (solo, then paired, then a six-enemy swarm and a twelve-node chained enemy); stage two drops combat entirely for one long vertical climb past six moving hazards; stage three adds lower gravity, an underwater section, and shield enemies that block a hit until a second one lands; stage four closes on one sprawling encounter of roughly twenty enemies including a ten-link chain
  • The screen drops to 5% speed the instant you press down and eases back to normal on release, which turns what could be a twitchy mid-air flick into a readable, almost bullet-time aiming moment — a genuinely good use of a very cheap trick
  • MIT-licensed, no analytics, no monetisation of any kind, and a real peer signal for a jam entry: 72 GitHub stars and 17 forks as of this writing

Cons

  • The gesture is a pull-back slingshot, not a flick in your direction of travel — drag away from where you want the character to go and release, exactly like drawing a bow — and nothing on screen says this in words. The only teaching is a faint animated dashed line shown once on the first two waves. A player who flicks the "obvious" way will watch their character do nothing useful and may reasonably conclude the controls are broken
  • Short even by jam standards: four stages, roughly fifteen hand-placed encounters total, clearable in ten to fifteen minutes, ending on a literal "Still can't find him... (To be continued)" caption that this build never resolves. The repo's own README explains why — the concept was carried forward into a separate, paid mobile game ("Wild Wind" on iOS and Android) — which makes this free version feel like a tech demo for a product outside its scope
  • No score, no difficulty choice, no unlockables; once the four stages are cleared there is nothing pulling a player back
  • Dying (two hits) simply restarts the current wave from its beginning rather than costing anything more meaningful, which keeps failure low-stakes but also low-consequence — combined with the short runtime, there is very little tension to the combat once the gesture clicks

Category scores

Category scores are the reviewer's read on each area. They inform the overall score but do not average into it — the number at the top of the page is a judgement, not a calculation.

  • Gameplay 7.5 / 10
  • Visuals 7.5 / 10
  • Value 6 / 10
  • Originality 7 / 10
  • Replayability 5 / 10