Skip to content

Horroterrors part 2 - lots of bullshit - #487

Open
RandomDudeFromTheRim wants to merge 115 commits into
voidcrew:masterfrom
RandomDudeFromTheRim:expie
Open

RandomDudeFromTheRim wants to merge 115 commits into
voidcrew:masterfrom
RandomDudeFromTheRim:expie

Conversation

@RandomDudeFromTheRim

@RandomDudeFromTheRim RandomDudeFromTheRim commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

About The Pull Request

A big one. Everything lives in its own voidcrew/modules/ folder; upstream files are only touched where marked VOIDCREW EDIT.

Limb rig (voidcrew/modules/limb_rig)

  • Human-shaped mobs get their sprite cut into moving pieces (head, torso, upper/lower arms and legs, held items) that actually walk, run (a weighted stomp after Kris's run in Deltarune), crawl, breathe, work tools, swing at things and act out ~50 emotes (wave, clap, salute, bow, laugh, cry, dance, dab, facepalm, collapse...).
  • Roundstart species can be drawn on a generated body with their own head on top, with clothes stretched onto the pieces and tails swinging from the small of the back. Players turn this on for their own character with the Animated body game preference (off by default). Bodies nobody plays are always drawn this way.
  • Experiments and Milkies are always rigged, since they're drawn only through it. Anyone else human-shaped can have it through the cosmetic Overanimated quirk.

Limb physics (voidcrew/modules/limb_rig/physics, tools/vcphys)

  • A Box2D ragdoll mode for the rig, through a small native library called like rust_g. vcphys.dll (32-bit Windows, like BYOND) ships in the repo root next to the game; the Rust source is in tools/vcphys, and builds libvcphys.so for Linux hosts. Wherever the library isn't found, nothing physical happens and nothing breaks.
  • Debug verbs: Spawn Physics Ragdoll, Limb Physics: Toggle / Inspect / Toggle Call Log.
  • Serverblight smite: corrupts a ragdoll's physics into a seizing, many-handed mass that hunts people down and takes them into itself.

Experiments and Milkies (voidcrew/modules/expie)

  • Experiment: new roundstart species from Casualties Unknown. Dark furry dog-rat people with big orange eyes, digitigrade legs and a huge spiky tail, drawn entirely through the rig from their own piece sprites. Yellow-orange blood, claws and teeth that cut, limbs that wound easily, their own voice.
  • Milkie: roundstart Experiment subspecies (Gunsaw, SAW-03): short, fluffy, white, cyan-eyed.
  • Both added to ROUNDSTART_RACES in config/game_options.txt.

Rhythm battles (voidcrew/modules/fnf, see wiki/content/rhythm-battles.md)

  • The battle microphone (loadout pocket item) starts Friday Night Funkin'-style sing-offs: pick a week, song, mix and difficulty, then summon the song's own opponent or challenge someone.
  • Between two players nobody is run off the health bar, and Corruption+ drains only come from the CPU; the winner is decided at the end.
  • Funkin's scoring, ratings, long notes, health bar with bobbing head icons, results screen, botplay, and ping-corrected input with a per-player audio offset.
  • Stages do what Funkin's do: Girlfriend/Nene on the boombox or A-Bot, Week 2 lightning, the Week 3 train, Week 4 henchmen, Stress's tankmen, Week 6 dialogue, Weekend 1's cans and the Blazin' fistfight.
  • Pico mixes let you sing as Pico, gun in hand. Singers pull faces.
  • Game overs: the world goes black, and you die like Pico does (knife, can, gut punch), or as an Experiment, with RETRY / GIVE UP and an Experiment last stand.
  • Corruption+ songs (Carlito049's fan mod, used with credit): corruption spreads over the singers sprite-piece by sprite-piece, with glowing faces, tainted arrows and overlays, their own health bars, game overs, props (Kapi's dance pad, Marble's speaker) and the cast's moves traced off their own sprites.
  • One original song ships (Yip Yap). Funkin's and Corruption+'s songs are fetched by the host (see below).

Weird Route (voidcrew/modules/weird_route)

  • Admin.Fun Weird Route / Weird Route: Bring Back: sends someone to a recreation of Deltarune Chapter 5's evening lake scene, with Moffer in Noelle's place.
  • It's timed off the game's own cutscene code: the ominous fade, the remembering pinwheel, the Proceed/Stop asking that walks you into the lake, the blur, drowning and whiteout.
  • Ends either in "I was wrong..." or, walking all the way in, the Meat Factory: a white void strewn with sprite sheets of the game's own art, Moffer following you around.
  • Both places are built on reserved ground before the player is taken, and given back after.

Gags (voidcrew/modules/gags)

  • Fall Down The Stairs (smite): Peter Griffin's fall, down a long staircase, into his pose; then back home, hurt.
  • I Like Trains (smite): asdfmovie's three kids in a white room ("I like singing!" "I like dancing!"), waits for the victim to say it, then the tram (tramstation's own car) takes all three.
  • *skibidi (emote): your head on a long neck out of a toilet, grinning, for one chorus.
  • *springlock (emote, only when typed on purpose): the springlocks give, crunch by crunch. Fatal.
  • *invincible (emote): makes you wobble funni
invincible_preview.mp4
  • Their rooms are map templates in _maps/voidcrew/templates/gags/.

MODsuits (voidcrew/modules/mod)

  • Corpse exoskeleton module, ported from MOD Corpse Exoskeleton Module - Frebby Fabbear edition Monkestation/Monkestation2.0#9889. It keeps the wearer standing when they go into crit or die, or when toggled. It's in maintenance MOD loot, and analysing it or a springlock unlocks the hidden MOD Mortality Modules node, which has designs for both.
  • MOD AIs and pAIs work a downed wearer's hands. This applies when the wearer is unconscious, in hard crit or dead, and the suit is on with its gauntlets sealed.
    • The AI's clicks become the wearer's hands, and its combat mode sets punch or help.
    • Its drop, swap hands and use-in-hand keys work on the wearer.
    • The wearer's hands show on the AI's screen.
    • It's slower than a person: a 2 second cooldown, 1.5 seconds to pick something up or put it down, and each action costs charge.
  • MOD AIs can aim the selected module with middle or alt click, as the wearer does (tether, kinesis and so on).

Smaller things

  • code/__DEFINES/sound.dm: CHANNEL_HIGHEST_AVAILABLE 1011 → 1009, because voice barks play on fixed channel 1010, which sat inside the reservable pool. Whatever reserved it (a battle's music, a jukebox) got cut off by the next person to speak.

Upstream files touched

  • code/__DEFINES/sound.dm: the channel change above.
  • code/modules/unit_tests/_unit_tests.dm: includes for the new tests.
  • code/game/objects/effects/spawners/random/mod.dm: the corpse exoskeleton in maintenance MOD loot.
  • config/game_options.txt: the two roundstart races.
  • tgstation.dme: includes.

Unit tests

voidcrew/modules/unit_tests/: limb_rig, limb_physics, fnf, weird_route, gags.

Assets, and what isn't shipped

Shipped (compiled into the .rsc like any other sound, about 6.5 MB of audio). Credits are in each module's sound/attribution.txt:

  • Funkin' SFX (countdown, misses, game over music, Pico's guns, Weeks 2, 3 and 6 sounds), from The Funkin' Crew's public assets repo.
  • Corruption+ sprites: arrows, overlays, health bar frame, speakers, used with credit as Carlito049 asks.
  • Casualties Unknown sounds: the Experiment's pain, death and effort noises, and the last stand drone.
  • Short gag clips (Family Guy, Skibidi Toilet, FNAF, asdfmovie).

Not shipped: hosts fetch these into data/, which is gitignored:

  • Funkin' songs: python3 tools/fnf/fetch_funkin.py (a few hundred MB; --from <folder> for an offline copy of funkin.assets).
  • Corruption+ songs: python3 tools/fnf/fetch_corruption_plus.py (about 430 MB download, about 90 MB kept; --from <zip or folder> for a copy already downloaded from GameJolt).
  • Weird Route sounds: the game's own, so they can't be shipped or fetched. Drop the files into data/weird_route/; without them it plays silent.
  • The physics library on Linux: vcphys.dll covers Windows hosts; a Linux host builds the 32-bit libvcphys.so from tools/vcphys (cargo build --release --target i686-unknown-linux-gnu, as for rust_g) and puts it next to the game. Without it, physics simply stays off.

Why It's Good For The Game

It's funny.

Testing

Played on a local server while building each part. Each module has unit tests; dreamchecker shows no new diagnostics, and the modularization check passes.

Changelog

🆑
add: Limb rig: bodies that walk, run, crawl, breathe, work and emote with their limbs. Turn it on for your own character with the Animated body game preference; the Overanimated quirk gives it to anyone human-shaped.
add: Experiments and Milkies, new roundstart species.
add: Rhythm battles: the battle microphone, with Funkin' and Corruption+ songs, stages, Pico mixes, game overs and results.
admin: Weird Route and Weird Route: Bring Back (Fun).
admin: Smites: Serverblight, Fall Down The Stairs, I Like Trains.
admin: Limb physics debug verbs (Spawn Physics Ragdoll, Limb Physics: Toggle / Inspect / Toggle Call Log).
add: *skibidi, *invincible and *springlock emotes.
add: MOD corpse exoskeleton module (from Monkestation), in maintenance and the hidden MOD Mortality Modules node.
add: MOD AIs and pAIs can work a downed wearer's hands (slowly), and aim the suit's selected module.
fix: Voice barks no longer cut off rhythm battle music or anything else on a reserved sound channel.
/:cl:

claude and others added 30 commits September 26, 2026 08:58
Flesh hands get five fingers that can be lost, drawn on the mob, and put back.

- Severe or critical slash/pierce wounds and critical blunt wounds on an arm can
  take a finger off. Right-clicking a hand with a bladed tool out of combat mode
  cuts one off on purpose.
- Missing fingers make a hand fumble things it picks up; a hand with none can't
  hold anything. Snapping needs a thumb and a middle finger.
- Severed fingers are meat and twitch for a bit. They can be pressed back into
  their own gap. Prosthetic fingers are printable at the autolathe, protolathe
  and exosuit fabricator and fit any gap. Either sits loose until sutured, and
  loose fingers can be knocked off when the arm takes a hit.
- Fingers are drawn on the mob, made from each species' own arm sprite and baked
  per direction, with an idle wiggle, a *wiggle emote, and a curled grip drawn
  over anything held. Gloves, MODsuit gauntlets and hand-covering suits recolour
  them to match.
- Full heals regrow fingers. Examine shows missing, loose and prosthetic ones.

Includes a unit test and a player wiki page.
Finger overlays and severed fingers get PIXEL_SCALE, so rotating or scaling them
(dancing, the severed finger's twitch) uses nearest-neighbour instead of blurring
one-pixel fingers into mush.
The zone selector has no hand zones, so the hand-only check could never pass.
Cutting now uses the same targeting as putting fingers back: aim at the left or
right arm.
The cut-off and prosthetic pickers now say which hand, and list fingers as
Thumb/Index/Middle/Ring/Pinky.
…limbs

Every living human-shaped carbon has its sprite cut into moving pieces (head,
torso, arms, legs, held items, fingers) and animated:

- walking swings legs and arms with a bob; lying down turns it into crawling
- an idle breathing loop, slower and deeper while unconscious
- the active arm saws away during any progress bar, and swings when attacking
- about 30 emotes act themselves out (*wave, *dance, *dab, *scream, *bow, ...)

The body's overlays_standing layers are mirrored onto vis_contents pieces, each
cut out with a per-direction alpha mask, instead of repainting clothes into new
icons like the dancing PR did (tgstation/tgstation#95581, where the joint
positions come from). Held items and fingers ride on unmasked pieces that follow
their arm. The pose math works in 3D terms and projects per facing, so one pose
reads right from all four sides.

Dead humans, dummies, monkeys and xenos aren't rigged. Mirrors get the body
added back to their reflection, since the mob's own appearance is empty while
rigged.
Palms up, hands bobbing in turns, a 6 and a 7 floating over them. Rigged mobs
work their arms along with it. *sixseven works too.
Maptext on an object in the mob's vis_contents didn't show in game. The digits
are now client images on the balloon chat plane, shown to everyone watching.
Arms and legs are now two pieces each, forearm and shin cut at the elbow and
knee, laid along a joint chain so each piece gets its own transform instead of
inheriting the one above (foreshortening an upper arm no longer squashes the
forearm with it). Poses get "elbow" and "knee" angles; walking bends the back
knee and lifts the swinging leg, tools are worked from the elbow, and clap,
cry, salute, facepalm, hug, jump, dance and *67 use the new joints.

Arms are drawn 1.25x and legs 1.3x their sprite length, and the body stands up
by the extra leg length so the feet stay on the floor.
Loomers are humans drawn by the limb rig with legs 4.5x and arms 3.2x their
sprite length, 3x fingers, a permanent stoop, and a long high-kneed loping
walk. Loosely after the Serverblight and DOORS' Figure, but they can see.
Purely cosmetic; they play exactly like humans. Roundstart-selectable.

The rig now takes its shape from the species (limb_rig_shape: limb and finger
stretch, a posture added to every pose, and a walk style), and lifts the body
from wherever the lowest foot ends up, so bent knees, crouches and long legs
all stay on the floor.
Loomer moves from a species to a neutral quirk, so any species can take it.
The rig takes its shape from the quirk first, then the species.

A Loomer in combat mode with empty hands reaches out: arms straight forward,
fingers stretching out after them, then holds there trembling all over until
combat mode drops or something is picked up.

*bird makes a fist with the active hand and raises the middle finger.
*crankbird brings the fist up first, then the other hand cranks an invisible
lever while the middle finger slowly unfurls. The fist-and-finger is on the
hand sprite, so any carbon can do it; a rigged body also acts it out, with the
raised middle finger on its own piece so it can unfurl separately.

Fingers now foreshorten with the forearm, so they point the way the hand does.
In combat mode with empty hands, a walking Loomer keeps its arms out in front
with its fingers stretched and twitching, the legs loping underneath and the
body shuddering, and goes straight back to trembling in place when it stops.
Facing north, anything the arms do in front of the body happens on the far
side of the spine, so the arms, forearms, fingers and held items now layer
under the torso and head instead of over them.
- Tendrils: the forearms and fingers writhe under looping wave filters, the
  same trick anomalies use to wibble.
- Stop-motion: every few frames the tremble freezes, then snaps (jump easing)
  into a wrenched, sheared pose. Poses can now skew the head and torso, and
  keyframes can pick their own easing.
- Glitches: every few seconds, for a moment, the face turns into Ransom from
  DOORS: crushed to black and white, covered in flickering red-flecked static,
  warped and smeared sideways, while the body tears into a red and blue split
  and jumps a couple of pixels.
The combat stance used to re-roll finger reach every beat and jitter the arms'
forward swing, which from the front also changes how long the arms and fingers
look, so they throbbed bigger and smaller. Reach now only grows: each beat
closes part of the gap to the limit, fast at first and slower as they strain,
then holds there until the stance ends. Walking carries on stretching from
wherever it got to. The arms twitch sideways instead of swinging.
Walking keeps the old walk (and the Loomer lope). With the run intent, rigged
mobs lean hard into it with the legs in a wide split, the back foot kicked up,
fists pumping with bent elbows, and a little hang in the air as the legs swap.

Fingers also stop foreshortening at 40% of their length, so a forearm pointed
at the viewer no longer flattens its fingers into a line.
… poses

The run was two even poses, so every frame had the same weight. It now hits the
ground, sinks into a held squash, drives off and floats, with fast easing into
the impact and slow easing out of the air. Poses can lift the body off the
ground with a chest "air" offset.
…move speed

- Overanimated and Fingers quirks: the limb rig and individual fingers now only
  apply to people who take them. Loomer is an admin smite that hands out
  Overanimated if missing; losing that quirk ends the Loomer too.
- Steps last as long as crossing a stride's worth of tiles at the current move
  delay, so the legs keep time with actual speed and long legs stride slower.
  Faster or slower than usual for the gait scales the stride size too.
- Arms account for the torso's bend. The combat stance aims the arms level in
  the world, so a hunched Loomer reaches straight out instead of drooping, and
  from the front no longer folds its hands over its face. Hands reaching at the
  viewer draw larger.
- "hand_y" solves the elbow to put a hand at a height; cry, facepalm, cough and
  gasp use it to actually reach the face. Crying sobs.
- The stance tremble is a smooth sway with the odd stop-motion snap, instead of
  one-frame random jumps.
- Facing away, fingers sit under the arm so wings and capes cover them.
- Captain's gloves colour the fingers blue rather than their gold trim.
- *67 digits ride in vis_contents instead of client images.
An Overanimated arm whose hand has no fingers drawn reaches 20% further, so it
still meets whatever it holds instead of stopping short of it. Hands without
the Fingers quirk sprout just the middle finger for *bird and *crankbird.
Picking things up, dropping them and changing gloves no longer redraws the
bodyparts of carbons without the Fingers quirk. Hands catch up on their grip
when they gain fingers.
They live on the fingers branch. This one is for the Experiment species.
Small dark dog-rat people: a crest of swept-back spikes, big orange eyes, digitigrade
legs and an enormous spiky tail. The art is original. Their sprites are laid out like a
human's so clothes fit, and the rig makes them small (short legs and arms) instead, so
they're always rigged, quirk or not.

The rig gains per-species masks, a head size and an optional tail piece: the tail is
pulled off the chest's overlays onto its own piece, carried high, and sways while idle,
swings against each stride and streams out behind a run.
The body is now measured from a reference model: long digitigrade legs in three segments
(thigh forward, knee back, foot forward), thick thighs, a big head and the tail, in 64x64
sprites about a head taller than a human. Every rig piece has its own sprite, so no stray
bits of body stay on the torso when a limb moves.

A species can now give the limb rig its own piece sprites and skeleton
(/datum/limb_rig/sprites). Worn clothes, still drawn for a human, are cut into pieces with
human-shaped masks and stretched from each human bone onto the matching one: shoes onto the
paws, hats onto the crown, scaled to the head.
…g clothes

Standing, running, walking and swinging are recreated as key poses from how the creature moves
in its home game: a forward-leaning bounding run with pumping arms, a hunched creep for walk
intent, a rocking stance and an overhead swing. The limb rig gains hooks for a body's own idle,
step and attack animations, and sprite-built bodies take whole joint angles.

Eyes are bigger, all pupil with an orange crescent. Hats are smaller, clothes cover the shoulders,
and from the front the head no longer squashes flat when the torso bends over.
Shoes get a piece of their own on each paw that takes the whole shoe, instead of being cut by
height, which left a boot top halfway up the leg. Sleeves and trouser legs are stretched across
as well as along each segment, so they wrap the thick thighs instead of sitting on them.

Side-on the pupil now stares ahead with the orange behind it. Head-on the eyes are smaller and
rounder.
rig_clip_keyframes() named a parameter "to", a DM keyword, which broke compiling.

The tail hung off the torso pivot, which draws as one group over the legs, so it could never go
under them or over the arms. It now hangs off the mob with the torso's movement applied to it:
under everything from the front and sides, over everything from behind.
Pieces hung on the mob drew in the order they were added, whatever their layers said, so an
Experiment's legs always covered its tail and the tail always covered its torso. Whenever the
layers change, the pieces are now put in layer order.
…unds

- Their own blood type, a thin yellow-orange.
- Claws that slash and cut instead of punching, and a bite (pointed, so it can puncture) used
  whenever their hands are tied or gone, or they have someone in an aggressive grab.
- Frail: every limb takes wounds 10 points more easily than a human's.
- Wounds drawn on the rig pieces themselves, three levels of brute and burn each, following the
  limbs as they move; brute marks take the owner's blood colour.
- The voice picked in one place (scream, hiss, laugh, death), from sounds already in the game.
- Species perks for all of it in the preferences menu.
claude added 30 commits October 6, 2026 16:56
An admin sends someone to the lake (Admin.Fun). Moffer stands in for Noelle
and the player for Kris, through obj_ch5_LW20W's cutscene and the handoff's
asking, timed frame for frame: the box going red then white, the heart
whitening, the lake fading out behind them, the blur, the chant sinking and
climbing, the shaking, and failing if they hesitate once she's under. Walk
all the way in and both come out in the Meat Factory, a white plane covered
in sheets of the fork's own renders. The game's sounds go in
data/weird_route/; without them it plays silent.
Sized to the game's pixels (Noelle's 46 tall against our 32), so the walk,
the shore and the camera sit where they do there. Moffer starts where Noelle's
marker does. They sink and their shadow shrinks as the game's submerge object
does it, going under at 928. Its text runs at two frames a letter throughout,
as its slow text and text style 63 do, and stays white when the box does. The
choice starts with the heart between the options and nothing picked, as the
game's choicer does. The blur is the game's sideways smear, flickering. And
the ending is its own: black, then INSERT CHAPTER 7 a letter at a time, and
where it would spell out SIDE B, MEAT FACTORY.
"to" is a keyword in DM, so the colour blend, fades and progress no longer
use it as an argument name.

The pinwheel is now the game's: three places from life aboard (screenshots
from the server) each showing through its own third of a wheel over black,
fading in a segment at a time, turning faster and rippling harder with each
line, and a silhouette of Moffer kneeling in the middle. Before it, the
ominous fade: three dark clouds behind the two of them, fading in slower
than one another and breathing, gone four seconds after they start to go.
The fade is its sprite: black all over but for a soft patch near the top,
three of it behind the two of them. The kneeling Moffer in the pinwheel is
drawn solid black, as the game's silhouette is.
…them

The white fills were lost when the pinwheel went in, and a null in the screen
list stopped any of it showing (the box, Moffer's face, the pinwheel) and
crashed the asking on its first step. Volume and pitch updates now keep a
looping sound looping. Moffer and the player stand dark against the sunset
at the lake, lit again in the Meat Factory.
The box's text sits at the top, larger; Moffer's face shows on the lines the
game shows Noelle's; and once a choice is up the box holds only the two
options and the heart, which now sits beside the picked one (screen objects
take pixel_x/pixel_y, not pixel_w/pixel_z), at a size you can see. The box
stays black inside, blurred with the rest and whited out over the top when
they hesitate. The ominous fade and the pinwheel's memories fill whatever
size the player's screen is, the fade's soft patch a third of the way down
it as in the game. The kneeling Moffer in the pinwheel is cyan and faces
out. The lake is big enough that the camera never sees past it.

The Meat Factory is far bigger, its sheets at their sprites' own size: our
renders, tg's test screenshots, and icon files laid out state by state.
Moffer follows a step behind. The sounds are sent ahead when the scene
starts, so the factory's music isn't waiting on a download.
Its 570px sprite, placed by a corner well off the screen, made BYOND widen
the whole view to fit it, shrinking the map into a black frame. It's now a
96px icon on the middle tile, scaled up to the screen, and each axis the
game leaves at 1 stays at 1.
…e whiteout, slower sinking, built before it starts

Also lets crewmembers hide the green crew marker (IC: Toggle Crew Markers).
…ngs, white comet hair and goatee, grey jumpsuit
…ringlock emotes

Fall Down The Stairs: Peter Griffin's fall down a long flight, timed to the clip, into his pose.
I Like Trains: asdfmovie's three kids in a white room, then tramstation's own tram car through them.
*skibidi: a toilet with your head on a long neck, grinning, for a chorus.
*springlock: the springlocks give, crunch by crunch. Fatal.
# Conflicts:
#	code/modules/unit_tests/_unit_tests.dm
#	tgstation.dme
…g a downed wearer's hands and aiming the suit's modules
…nd Corruption+ songs' drains only come from the CPU
…ff by default) for whether a player's own character is rigged
…k as capped speed, spin capped, steps cut back when they cost too much, and a torn body starts over; spinning no longer counts as blowing up; no double delete when the hunt ends; Weird Route sends everyone in it back out; physics verbs check for a carbon
… their own); *springlock throws its blood, gibs and organs off at any angle
…le with the edit's poses, invincible and held in place while it plays
…ting and swinging back and forth until it settles; spammable every 10 seconds, invincible at most every 3 minutes
…t lets them go they come out dead with their players back in them
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants