winchxyz/wumpus-torture-simulator

A cartoon ragdoll sandbox in the browser: 25 ways to ruin Wumpus's day. Three.js + Rapier, no build, no assets.

JavaScript

5

2 commits

updated Sep 29, 2026

See the code

See what people are saying

SourceMessageScoreDate

Opus 5.5 created me game where you can hate Wumpus (Discord Mascot) (r/ClaudeAI)

It's a Kick the Buddy style ragdoll sandbox. **Wumpus stands in a padded room and you get 25 tools:** mallet, frying pan, piano drop, knives that stay stuck, a cutter that slices off limbs, chainsaw, bombs, acid that melts him down to the skeleton, and a squeeze tool for his organs. He always gets…

0

Sep 30, 2026

README

Wumpus Torture Simulator: a cartoon ragdoll sandbox. 25 ways to ruin his day.

Play in browser three.js r169 Rapier 0.14 No build step License MIT GitHub stars

▶ Play it now

Runs in any modern browser, desktop or phone. No install, no sign-up.

Wumpus gets squashed by a mallet, stabbed, sliced, dissolved in acid, opened up with a saw, and still gives a teary thumbs-up.
A 6 second loop of the real game. Sharper MP4 version.


🎬 What is this?

Wumpus Torture Simulator is a Kick-the-Buddy-style physics sandbox in 3D. A wobbly, big-eared ragdoll called Wumpus stands in a padded room, and you get a toolbar of hands, blunt objects, blades, explosives and chemicals to try on him. Every hit pays coins, and coins unlock the tools you cannot afford yet. The gore is stylized cartoon (glossy toon-red blood, white cartoon bones, pink flesh) and there is a switch to turn it off. He never really dies: one click on Reset and he is standing again. Once things go calm for a couple of seconds his face turns teary and he gives you a trembling thumbs-up.

Everything is generated in code. There are no image, model or sound files in the repo.

✨ Features

🧍 Ragdoll physicsNine rigid bodies on Rapier joints, stepped at a fixed 120 Hz. A balance controller keeps him upright and wobbling, he goes limp after big hits, and he can lose his head, arms and legs for real.
🧰 25 toolsHands, blunt, sharp, explosive and nasty, each with its own wind-up, follow-through, sound and gore. See the tool list.
🩸 Gore toggleOne button swaps blood and guts for stars and sweat drops. Same physics, same fun, no blood.
🫀 Organs you can squeezeOpen his belly and 19 organ props tumble out with a floppy rope of intestines. Grab them, squeeze them, pop them.
☣️ Acid melt shaderSkin droops, bubbles and dissolves down to the skull, drip by drip, all in a custom shader patched into the toon materials.
🪙 Coins and shopDamage pays coins, floating "+N" text pops up, and locked tools glow when you can afford them. Your balance is saved in the browser.
🎨 Procedural everythingThe model, room, tools, decals, particles and even the sound effects are built at runtime. Sound is pure WebAudio synthesis.
📱 Phone supportPointer-event input with forgiving finger picking, and a HUD that reflows below 720 px wide.

🧰 Tools

25 tools in five tabs. Eight are free from the start (all the Hands, the Mallet and the Knife), the other 17 are bought with coins. Prices below are straight from the code.

All 25 tools grouped by tab, with prices

✋ Hands

IconToolWhat it doesPrice
✊Grab & ThrowDrag any body part, swing him around, let go.Free
✋SlapAn open-handed smack that leaves a handprint.Free
👉PokeProd him and watch him squish.Free
🪶Tickle FeatherRub the feather over him until he giggles.Free
👂Ear PullStretch an ear as far as it goes, then let go.Free
🌱Pluck LeafYank the sprout off his head. It grows back.Free

🔨 Blunt

IconToolWhat it doesPrice
🔨MalletA big wind-up and a WHAM that pancakes him flat.Free
🐔Rubber ChickenA squeaky, dangling, deeply humiliating whack.🪙 40
🍳Frying PanBONG. Shockwave rings included.🪙 60
🎳Bowling BallDrops from above onto the spot you click, then rolls on.🪙 120
🥊Boxing GloveA spring-loaded punch that launches him across the room.🪙 200
⚒️AnvilA shadow grows on the floor, then it lands. Cracks the tiles.🪙 250
🎹PianoSame idea, but it smashes into flying debris.🪙 350

🔪 Sharp

IconToolWhat it doesPrice
🔪KnifeStab him and the blade stays in. Click a stuck knife to pull it out.Free
🎯Throwing knivesFlick them at him or the walls. Most stick, a few bounce off flat.🪙 90
⚔️CutterA curved sabre. A fast stroke through a joint cuts off a limb, or his head.🪙 180
🪓CleaverA heavy chop with a proper wind-up. It stays wedged in.🪙 260
⛓️ChainsawHold to rev it up, then saw through whatever is under it.🪙 400

💥 Boom

IconToolWhat it doesPrice
💣BombSets a lit fuse, then a full cartoon fireball with a radial blast.🪙 100
🍍GrenadeTossed, bounces around, then goes off.🪙 200
🥏LandminePlant it and set it off with something heavy. Launches whatever is on top.🪙 300
🧨DynamiteSticks to him with a burning fuse.🪙 500

☣️ Nasty

IconToolWhat it doesPrice
☣️AcidPour a flask on him. The skin sags, bubbles and dissolves, and long pours drop limbs.🪙 120
🤏SqueezeA giant glove that flattens limbs, bursts his torso and pops loose organs.🪙 180
🪚SawA hand saw. Work it back and forth across his belly to open him up.🪙 260
Grab and throw
✊ Throw him
Frying pan BONG
🍳 Frying pan
Piano crash
🎹 Piano
Bomb explosion
💣 Bomb
Throwing knives stuck in him and the walls
🎯 Knives stuck
Cleaver chop
🪓 Cleaver
Chainsaw
⛓️ Chainsaw
Acid melting his head down to the skull
☣️ Acid
Squeezing his organs
🤏 Organs and squeeze

All shots are straight from the game, HUD included. Click one for the full 1280 x 720 image.

🎮 How to play

Do thisTo get this
Click or tap on WumpusUse the selected tool where you clicked.
Press, hold and dragHeld tools work while you hold: Grab & Throw, Tickle, Chainsaw, Acid, Squeeze, Saw, Ear Pull, Pluck Leaf. Cutter slices along your stroke.
Tabs (Hands, Blunt, Sharp, Boom, Nasty)Switch the tool group. Number keys 1-9 pick the tools of the current tab.
🔒 Locked toolClick it to buy it when you have the coins. It shakes your coin counter when you do not.
↺ Reset or RRebuild Wumpus and clear the room. You keep your coins and unlocked tools.
🩸 Gore: On / OffBlood and guts, or stars and sweat.
🔊 Sound / MutedToggle the synthesized sound effects.

Tip: wait a few calm seconds after hurting him and watch his face.

🚀 Run locally

You need Node.js and an internet connection (three.js and Rapier load from the jsDelivr CDN).

git clone https://github.com/winchxyz/wumpus-torture-simulator.git
cd wumpus-torture-simulator
node server.mjs

Then open http://localhost:8811/. The tiny server has no dependencies, and PORT=9000 node server.mjs changes the port.

The model viewer, where you can orbit Wumpus and look at the rig, faces, bones and organs, is at http://localhost:8811/viewer.html.

Any static file server works too, since there is no build step.

🛠️ How it's made

Plain ES modules, three.js r169 and Rapier 0.14, loaded through an import map. No bundler, no framework, no assets.

flowchart LR
  main["main.js<br/>boot and TS debug hooks"] --> game["game.js<br/>loop, input, coins, tool dispatch"]
  main --> ui["ui.js<br/>HUD, tabs, shop"]
  main --> tools["tools/index.js<br/>loads the tool files"]
  game --> wumpus["wumpus.js<br/>procedural model, bones, organs, melt shader"]
  game --> physics["physics.js<br/>Rapier world, groups, props"]
  game --> ragdoll["ragdoll.js<br/>joints, balance, severing"]
  game --> room["room.js<br/>padded room"]
  game --> audio["audio.js<br/>WebAudio synthesis"]
  tools --> hands["hands.js"]
  tools --> blunt["blunt.js"]
  tools --> sharp["sharp.js"]
  tools --> explosive["explosive.js"]
  tools --> nasty["nasty.js"]
  tools --> gore["gore.js<br/>blood, wounds, stumps, belly, organs"]
  ragdoll --> physics
  gore -. "damage and sever events" .-> game
  • src/wumpus.js builds the whole character from primitives: rig, faces, ears, leaf, bones, organs, stump caps and the acid melt shader.
  • src/ragdoll.js and src/physics.js turn the rig into nine Rapier bodies with impulse joints, balance, limp and recovery, severing, and dynamic props.
  • src/gore.js listens to damage and sever events and decides what bleeds, tears, sticks or spills.
  • src/tools/*.js has one file per tool family, each exporting tools with down, move, up and update handlers.
  • src/ui.js is the HUD: tabs, tool buttons, shop, coin counter, Reset, Gore and Sound.
  • SPEC.md is the module contract the parts were built against.

This project was built by Claude Code with an Opus orchestrator and Sonnet workers. Each worker owned one slice (model, engine, blunt and boom, sharp, gore and nasty) and built it against the contract in SPEC.md.

Debug hooks and regenerating the media

window.TS is exposed for scripted scenes: pause, advance(sec), tool(id), click(nx, ny), drag(points), hover, ndc(segment), shot(name), reset(), unlockAll(), addCoins(n) and state(). With the loop paused, TS.advance steps the physics deterministically, which is how the tests and the images in this README are made.

Every image in media/ comes from the real game, driven through that API:

node tools/media.mjs                  # everything (needs ffmpeg on PATH)
node tools/media.mjs --only=hero      # hero.gif and hero.mp4
node tools/media.mjs --only=gallery   # shot-*.png and thumb-*.jpg
node tools/media.mjs --only=banner,tools

🧪 Tests

Four headless-Chromium suites drive the game through window.TS and save PNGs to shots/. All of them fail on any console error.

CommandWhat it checks
node tools/play.mjsThe engine and the hands: he stands and stays upright, grab and throw, slap, poke, tickle, ear pull, leaf pluck and regrow, the teary thumbs-up beat.
node tools/test_blunt.mjsEvery blunt and boom tool, plus a stress run: no NaNs, nothing flying out of the room or through the floor, joints stay attached, he recovers, debris cleans up, and the frame cost stays sane.
node tools/test_sharp.mjsKnife, throwing knives, cutter, cleaver and chainsaw: blades stick and stay put on moving bodies, pulling one out works, cuts really sever joints, blades vanish on Reset, and gore-off draws no blood.
node tools/test_gore.mjsGore and the nasty tools: severing and stump spurts, the belly opening, organ physics and popping, squeeze, acid melt and the saw, particle budgets, and a clean gore-off mode (about 8 minutes).

node tools/shots.mjs renders a model contact sheet. The shared tools/harness.mjs imports playwright-core from a local path and looks for Chromium under %LOCALAPPDATA%\ms-playwright, so point those two spots at your own install before running the suites on another machine.

⚠️ Content note

This game has cartoon violence and stylized gore: blood, severed limbs, exposed bones and organs, explosions. It is played for slapstick, with a squishy toon look, but it is not for everyone. Use the Gore: Off button to swap all of it for stars and sweat drops.

📝 Disclaimer

This is a fan project. Wumpus is the mascot of Discord. This project is not affiliated with, endorsed by or sponsored by Discord Inc. All character rights belong to their owners.

📄 License

MIT © 2026 winchxyz


▶ Play it now · If he made you smile, a ⭐ helps a lot.

browser-game
kick-the-buddy
ragdoll
rapier
threejs
webgl

winchxyz/wumpus-torture-simulator

A cartoon ragdoll sandbox in the browser: 25 ways to ruin Wumpus's day. Three.js + Rapier, no build, no assets.

JavaScript

5

2 commits

updated Sep 29, 2026

See the code

See what people are saying

SourceMessageScoreDate

Opus 5.5 created me game where you can hate Wumpus (Discord Mascot) (r/ClaudeAI)

It's a Kick the Buddy style ragdoll sandbox. **Wumpus stands in a padded room and you get 25 tools:** mallet, frying pan, piano drop, knives that stay stuck, a cutter that slices off limbs, chainsaw, bombs, acid that melts him down to the skeleton, and a squeeze tool for his organs. He always gets…

0

Sep 30, 2026

README

Wumpus Torture Simulator: a cartoon ragdoll sandbox. 25 ways to ruin his day.

Play in browser three.js r169 Rapier 0.14 No build step License MIT GitHub stars

▶ Play it now

Runs in any modern browser, desktop or phone. No install, no sign-up.

Wumpus gets squashed by a mallet, stabbed, sliced, dissolved in acid, opened up with a saw, and still gives a teary thumbs-up.
A 6 second loop of the real game. Sharper MP4 version.


🎬 What is this?

Wumpus Torture Simulator is a Kick-the-Buddy-style physics sandbox in 3D. A wobbly, big-eared ragdoll called Wumpus stands in a padded room, and you get a toolbar of hands, blunt objects, blades, explosives and chemicals to try on him. Every hit pays coins, and coins unlock the tools you cannot afford yet. The gore is stylized cartoon (glossy toon-red blood, white cartoon bones, pink flesh) and there is a switch to turn it off. He never really dies: one click on Reset and he is standing again. Once things go calm for a couple of seconds his face turns teary and he gives you a trembling thumbs-up.

Everything is generated in code. There are no image, model or sound files in the repo.

✨ Features

🧍 Ragdoll physicsNine rigid bodies on Rapier joints, stepped at a fixed 120 Hz. A balance controller keeps him upright and wobbling, he goes limp after big hits, and he can lose his head, arms and legs for real.
🧰 25 toolsHands, blunt, sharp, explosive and nasty, each with its own wind-up, follow-through, sound and gore. See the tool list.
🩸 Gore toggleOne button swaps blood and guts for stars and sweat drops. Same physics, same fun, no blood.
🫀 Organs you can squeezeOpen his belly and 19 organ props tumble out with a floppy rope of intestines. Grab them, squeeze them, pop them.
☣️ Acid melt shaderSkin droops, bubbles and dissolves down to the skull, drip by drip, all in a custom shader patched into the toon materials.
🪙 Coins and shopDamage pays coins, floating "+N" text pops up, and locked tools glow when you can afford them. Your balance is saved in the browser.
🎨 Procedural everythingThe model, room, tools, decals, particles and even the sound effects are built at runtime. Sound is pure WebAudio synthesis.
📱 Phone supportPointer-event input with forgiving finger picking, and a HUD that reflows below 720 px wide.

🧰 Tools

25 tools in five tabs. Eight are free from the start (all the Hands, the Mallet and the Knife), the other 17 are bought with coins. Prices below are straight from the code.

All 25 tools grouped by tab, with prices

✋ Hands

IconToolWhat it doesPrice
✊Grab & ThrowDrag any body part, swing him around, let go.Free
✋SlapAn open-handed smack that leaves a handprint.Free
👉PokeProd him and watch him squish.Free
🪶Tickle FeatherRub the feather over him until he giggles.Free
👂Ear PullStretch an ear as far as it goes, then let go.Free
🌱Pluck LeafYank the sprout off his head. It grows back.Free

🔨 Blunt

IconToolWhat it doesPrice
🔨MalletA big wind-up and a WHAM that pancakes him flat.Free
🐔Rubber ChickenA squeaky, dangling, deeply humiliating whack.🪙 40
🍳Frying PanBONG. Shockwave rings included.🪙 60
🎳Bowling BallDrops from above onto the spot you click, then rolls on.🪙 120
🥊Boxing GloveA spring-loaded punch that launches him across the room.🪙 200
⚒️AnvilA shadow grows on the floor, then it lands. Cracks the tiles.🪙 250
🎹PianoSame idea, but it smashes into flying debris.🪙 350

🔪 Sharp

IconToolWhat it doesPrice
🔪KnifeStab him and the blade stays in. Click a stuck knife to pull it out.Free
🎯Throwing knivesFlick them at him or the walls. Most stick, a few bounce off flat.🪙 90
⚔️CutterA curved sabre. A fast stroke through a joint cuts off a limb, or his head.🪙 180
🪓CleaverA heavy chop with a proper wind-up. It stays wedged in.🪙 260
⛓️ChainsawHold to rev it up, then saw through whatever is under it.🪙 400

💥 Boom

IconToolWhat it doesPrice
💣BombSets a lit fuse, then a full cartoon fireball with a radial blast.🪙 100
🍍GrenadeTossed, bounces around, then goes off.🪙 200
🥏LandminePlant it and set it off with something heavy. Launches whatever is on top.🪙 300
🧨DynamiteSticks to him with a burning fuse.🪙 500

☣️ Nasty

IconToolWhat it doesPrice
☣️AcidPour a flask on him. The skin sags, bubbles and dissolves, and long pours drop limbs.🪙 120
🤏SqueezeA giant glove that flattens limbs, bursts his torso and pops loose organs.🪙 180
🪚SawA hand saw. Work it back and forth across his belly to open him up.🪙 260
Grab and throw
✊ Throw him
Frying pan BONG
🍳 Frying pan
Piano crash
🎹 Piano
Bomb explosion
💣 Bomb
Throwing knives stuck in him and the walls
🎯 Knives stuck
Cleaver chop
🪓 Cleaver
Chainsaw
⛓️ Chainsaw
Acid melting his head down to the skull
☣️ Acid
Squeezing his organs
🤏 Organs and squeeze

All shots are straight from the game, HUD included. Click one for the full 1280 x 720 image.

🎮 How to play

Do thisTo get this
Click or tap on WumpusUse the selected tool where you clicked.
Press, hold and dragHeld tools work while you hold: Grab & Throw, Tickle, Chainsaw, Acid, Squeeze, Saw, Ear Pull, Pluck Leaf. Cutter slices along your stroke.
Tabs (Hands, Blunt, Sharp, Boom, Nasty)Switch the tool group. Number keys 1-9 pick the tools of the current tab.
🔒 Locked toolClick it to buy it when you have the coins. It shakes your coin counter when you do not.
↺ Reset or RRebuild Wumpus and clear the room. You keep your coins and unlocked tools.
🩸 Gore: On / OffBlood and guts, or stars and sweat.
🔊 Sound / MutedToggle the synthesized sound effects.

Tip: wait a few calm seconds after hurting him and watch his face.

🚀 Run locally

You need Node.js and an internet connection (three.js and Rapier load from the jsDelivr CDN).

git clone https://github.com/winchxyz/wumpus-torture-simulator.git
cd wumpus-torture-simulator
node server.mjs

Then open http://localhost:8811/. The tiny server has no dependencies, and PORT=9000 node server.mjs changes the port.

The model viewer, where you can orbit Wumpus and look at the rig, faces, bones and organs, is at http://localhost:8811/viewer.html.

Any static file server works too, since there is no build step.

🛠️ How it's made

Plain ES modules, three.js r169 and Rapier 0.14, loaded through an import map. No bundler, no framework, no assets.

flowchart LR
  main["main.js<br/>boot and TS debug hooks"] --> game["game.js<br/>loop, input, coins, tool dispatch"]
  main --> ui["ui.js<br/>HUD, tabs, shop"]
  main --> tools["tools/index.js<br/>loads the tool files"]
  game --> wumpus["wumpus.js<br/>procedural model, bones, organs, melt shader"]
  game --> physics["physics.js<br/>Rapier world, groups, props"]
  game --> ragdoll["ragdoll.js<br/>joints, balance, severing"]
  game --> room["room.js<br/>padded room"]
  game --> audio["audio.js<br/>WebAudio synthesis"]
  tools --> hands["hands.js"]
  tools --> blunt["blunt.js"]
  tools --> sharp["sharp.js"]
  tools --> explosive["explosive.js"]
  tools --> nasty["nasty.js"]
  tools --> gore["gore.js<br/>blood, wounds, stumps, belly, organs"]
  ragdoll --> physics
  gore -. "damage and sever events" .-> game
  • src/wumpus.js builds the whole character from primitives: rig, faces, ears, leaf, bones, organs, stump caps and the acid melt shader.
  • src/ragdoll.js and src/physics.js turn the rig into nine Rapier bodies with impulse joints, balance, limp and recovery, severing, and dynamic props.
  • src/gore.js listens to damage and sever events and decides what bleeds, tears, sticks or spills.
  • src/tools/*.js has one file per tool family, each exporting tools with down, move, up and update handlers.
  • src/ui.js is the HUD: tabs, tool buttons, shop, coin counter, Reset, Gore and Sound.
  • SPEC.md is the module contract the parts were built against.

This project was built by Claude Code with an Opus orchestrator and Sonnet workers. Each worker owned one slice (model, engine, blunt and boom, sharp, gore and nasty) and built it against the contract in SPEC.md.

Debug hooks and regenerating the media

window.TS is exposed for scripted scenes: pause, advance(sec), tool(id), click(nx, ny), drag(points), hover, ndc(segment), shot(name), reset(), unlockAll(), addCoins(n) and state(). With the loop paused, TS.advance steps the physics deterministically, which is how the tests and the images in this README are made.

Every image in media/ comes from the real game, driven through that API:

node tools/media.mjs                  # everything (needs ffmpeg on PATH)
node tools/media.mjs --only=hero      # hero.gif and hero.mp4
node tools/media.mjs --only=gallery   # shot-*.png and thumb-*.jpg
node tools/media.mjs --only=banner,tools

🧪 Tests

Four headless-Chromium suites drive the game through window.TS and save PNGs to shots/. All of them fail on any console error.

CommandWhat it checks
node tools/play.mjsThe engine and the hands: he stands and stays upright, grab and throw, slap, poke, tickle, ear pull, leaf pluck and regrow, the teary thumbs-up beat.
node tools/test_blunt.mjsEvery blunt and boom tool, plus a stress run: no NaNs, nothing flying out of the room or through the floor, joints stay attached, he recovers, debris cleans up, and the frame cost stays sane.
node tools/test_sharp.mjsKnife, throwing knives, cutter, cleaver and chainsaw: blades stick and stay put on moving bodies, pulling one out works, cuts really sever joints, blades vanish on Reset, and gore-off draws no blood.
node tools/test_gore.mjsGore and the nasty tools: severing and stump spurts, the belly opening, organ physics and popping, squeeze, acid melt and the saw, particle budgets, and a clean gore-off mode (about 8 minutes).

node tools/shots.mjs renders a model contact sheet. The shared tools/harness.mjs imports playwright-core from a local path and looks for Chromium under %LOCALAPPDATA%\ms-playwright, so point those two spots at your own install before running the suites on another machine.

⚠️ Content note

This game has cartoon violence and stylized gore: blood, severed limbs, exposed bones and organs, explosions. It is played for slapstick, with a squishy toon look, but it is not for everyone. Use the Gore: Off button to swap all of it for stars and sweat drops.

📝 Disclaimer

This is a fan project. Wumpus is the mascot of Discord. This project is not affiliated with, endorsed by or sponsored by Discord Inc. All character rights belong to their owners.

📄 License

MIT © 2026 winchxyz


▶ Play it now · If he made you smile, a ⭐ helps a lot.

browser-game
kick-the-buddy
ragdoll
rapier
threejs
webgl

Languages

JavaScript

99.4%