Bloodsand
- graphics
- client-only
- Sandboxed: no raw memory access
- SHA-256
b9a199621669e0386d1787d16d75be46f89d2b44849c3ad46a6a6ef564b7bb20
The Store in the game installs and updates it for you; the zip is for installing by hand.
- Needs
- Melange 0.3.5 or later
>=0.3.5 - Install
- In the game, press ` and open Thumper > Store
- Authors
- Melange
- Licence
- MIT
- Source
- plugins/bloodsand on GitHub
A client-only gore mod for Worms Ultimate Mayhem: worms spray blood when they are hit (with a spray of its own for each melee and special weapon), wear it on their skin, open layered wounds and get black eyes as their health runs low, throw up blood and spill ray-marched, simulated intestines when they are nearly dead, spurt from their arteries in time with their heartbeat, leave a trail of drips and smears behind them and grow pools under them as they bleed, burst into ray-marched chunks of meat, shards of bone and organs when they die, leave splats and drying pools on the floors and walls where the blood lands, and spatter the camera lens. Only code and original procedurally generated art is shipped — no game file, or anything derived from one.
What it does
Section titled “What it does”- Bursts: the moment a worm is hurt, blood droplets are thrown from it, away from the explosion if there was one.
The number and speed of the droplets scale with the damage, and even a light hit throws a visible spray. A droplet is
a teardrop: a rounded head and a tail that tapers to a point, longer along its flight the faster it goes (so in flight
it reads as a thin streak, not a flat petal). Mist is a fine red haze of soft blobs. Nothing is drawn nearer than 12
world units to the camera, and what is a little further fades in and is held to a size, so a droplet that flies past the
lens is never a huge flat shape; up close a droplet is held to 16 pixels across, and far ones that would be under two
pixels wide are grown a little so they still read at the usual distance of play (so are the bursts’ droplets and mist
when the burst is far from the camera).
On Melange 0.6 and later all particles are drawn with soft textured sprites (
wum.draw.sprite), one call each: a wet, shaded teardrop with a dark rim and a baked glint, stretched along its flight (a fat one up to a stretch of about three and a slim one beyond), plus a small additive spark on a big close droplet; a lumpy glossy blob for a clot (four shapes); soft rotated puffs for mist (three) and steam (two); a ragged fleck for char (two). The seventeen textures (mod/textures/bs_*.png, about 180 KB, generated bytools/make_blood_sprites.js) are neutral grey and tinted per particle, so Green blood uses the same files. On older Melange, or for any kind whose textures will not load, or if the sprite call ever raises, the particles are drawn as they were in the first 1.2 builds: a droplet as a small triangle fan with a fainter fringe of its own colour about a pixel wide for anti-aliasing (a big one near the camera also gets a tiny faint glint near its head), mist as several translucent fans, each smaller and denser than the last, with an irregular outline. There is no setting for it; it is chosen at load. - Bleeding: a wounded worm keeps dripping for a while after the hit.
- Arterial spurts: a worm below about a third of its health (stronger the lower it goes, with no setting of its own:
it follows Blood) spurts blood from its deepest open wounds in time with its heartbeat, 1.1 beats a second at the
threshold and 1.6 at the lowest, each interval a little different and about half the beats followed by a weaker second
one. A beat is a pulse of about a fifth of a second: a pressurised stream. Every frame of it the wound sends out pieces of
stream (particles drawn as thin tubes of dark blood along their velocity, with a texture of their own,
bs_jet.png, which has no glint) at a steady rate, each placed where it would be had it left at its own moment inside the frame, so that they are evenly spaced along one arc and closer together than their length (about one every one and a half units, each four to six long) however long the frame took; the pressure sets how fast and wide they are (the stream swells and thins), and as a piece ages it thins and shortens, the older ones sooner, so that the far end breaks up into beads. A few beads fly on ahead, a short sputter of weak broken pieces follows the pulse, a puff of fine mist leaves the wound, and a weak dribble runs from it between the pulses. The jet leaves the wound along its outward normal, lifted a little and tilted a little differently at every pulse, and is worked out again every frame from where the worm’s wounds are, so it follows the worm as it walks and turns. The gashes are on the middle of the body (6 to 16 units above the feet). Light and Heavy spurt from the deepest wound, Absurd from up to two (the second only once the worm is well below the threshold), with more and faster pieces as Blood goes up. The pieces are ordinary particles, so they land through the terrain collision and leave splats and streaks. Nothing spurts while the worm is thrown or falling (faster than 90 units a second sideways or 80 vertically), since its facing no longer says where its wounds are, and it resumes a third of a second after it lands with a stronger first pulse. A new hit brings an extra pulse at once and stronger, longer, quicker ones for one to three and a half seconds, more for a bigger hit. A dying worm (health 0, waiting for the game to blow it up) goes on for six seconds with weakening, slowing pulses and then stops; the death burst takes over. Spurts draw on the frame’s spawn budget after the bursts (at most 14, 22 or 44 particles a frame between all the worms), never fill more than 60% of the pool and send nothing to the post-FX passes. The Preview button makes the previewed worm spurt for six seconds. - Death: a worm that dies throws a larger burst, with more mist and a ring of heavy clots that carry past the smoke and splat round the crater, and leaves a big pool in the crater. It is shown when the worm blows up. A worm whose health reaches zero is only dying (the game counts the damage down and blows it up seconds later), and the burst waits for an explosion at the worm, for its state to flip to dead, for it to be gone from the worm list for a third of a second, or for 40 seconds, whichever comes first and only once; a worm that dies some other way (drowned, say) bursts when its state flips or it disappears. A death is never dropped: it may use more of a frame’s spawn budget than other bursts, waits up to three seconds in the queue when even that is spent, and pushes older particles out of a full pool. Once it has burst, the grave the game leaves gets no blood, wounds or guts.
- Weapon sprays: each melee and special weapon has its own signature, scaled by the Blood setting (see below for how a hit is matched to a weapon). The baseball bat flings a wide horizontal arc of long streaks with a few heavy clots and a fine mist. The prod squirts a thin pulsing jet from the contact point, then dribbles. The fire punch throws a gush of blood straight up with a few small burnt flakes (dark cooked blood, brown soot and grey ash, light enough to slow down and flutter, and a few faint embers that are gone within a third of a second) with a short rise of pale steam and a little smoke, and asks the skin pass for a scorch mark. No more nails fires several small jets in a ragged cone. The concrete donkey and Fatkins crush: a flat ring of blood hugging the ground and a big pool. The old woman and Scouser shred: many fine fast drops in every direction on top of the blast. A ninja rope knock smears blood along the knock. A fall splats downward into a pool. The shotgun and sniper rifle puff at the entry and shoot a narrow fast cone out behind the victim (the sniper’s is longer, faster and heavier). The poison arrow leaves an entry wound and a sickly dark dribble that goes on for a while. Explosions keep spraying away from the blast.
- Blood on the worms: a worm that was hit wears blood on its skin, and the blood stays on it as it moves. Each hit
adds to it, healing does not wash it off and a death clears it. It is a Post-FX pass,
bloodsand/skin(PostWorld, order 51), that paints the blood from the depth buffer onto the surfaces inside each worm’s body. The pattern is held in the worm’s own frame, so it travels with the worm and turns with the way it faces. Only skin takes anything, on the whole body: every pixel is first classified by the colour the scene has there (skin is a peach to orange whose green-over-red and blue-over-red ratios stay in a narrow window whatever the light, and whose hue (21 to 28 degrees) and saturation stay put, which hats, helmets, glasses, headbands, ears, a moustache and the whites and pupils of the eyes fall outside: a cowboy hat is yellower (34 to 40 degrees), a helmet more so (47 to 51), brown fur too, and an orange moustache is more saturated), softly, so the edge against a hat is anti-aliased. The blood is not a coat: it is soaked round each open wound and the place the worm was last hit, runs down the body from there in streaks that thin to a bead, is smeared and spattered in drops on the side that faces the hits, and is thin or absent elsewhere, so the skin shows between. The light on it comes from the body’s smooth normal, so the facets of the worm’s mesh do not show as angular shards, and edges inside the worm (the eyes over the face, the chin over the body) are painted in full instead of leaving a bright line of bare skin. - Wounds: once a worm is below about two thirds of its health, gashes open on its body, more and larger the lower
it gets (up to five). Each is built in layers: a rolled lip of torn skin that catches the light, pink-red raw
dermis, broken patches of pale fat on parts of the torn edge only, dark wet muscle with glints and a cavity that gets
darker the deeper it goes and shifts as the camera moves, all under a film of blood. Blood runs down from it in beads. They close again if the worm is healed; the blood on its skin stays. The same
bloodsand/skinpass paints them. Blood on the skin is wet: it has a sheen, and is darker and glossier where it pools. - Black eyes: below nine tenths of its health a worm gets a black eye, a wide ring of purple-black bruise on the skin that hugs the white of the eye (found on the screen with fixed rings of taps, so it follows the head wherever it bobs and has no grain, and never narrower than a few pixels, so it shows from across the level), darkest in a swollen lower lid under the eye, with a faintly lit lip above, and it keeps a pixel or two of clean skin off a moustache; the ring is wider and darker the lower the health. One eye goes first and the other follows: at 70 of 100 health one is black and the other nearly, and both are fully black from about 55 down. The skin pass paints them on the face, and they fade while a worm is thrown through the air. Blood and wounds stay thin over a bruise, so a black eye shows on a bloodied face.
- Throwing up: a worm at a quarter of its health or less heaves now and then while it stands still: a stream of blood from its mouth for about a second, every 12 to 30 seconds, leaving a small stain in front of it.
- Intestines: about two worms in five, picked at random each match, have their belly torn open once they are
badly wounded (around a third of their health). The skin pass paints the opening, with a ragged lip of skin, patches of fat and
muscle round a dark cavity that holds coils. A length of intestine slides out of it and drops to the ground: a chain
of sixteen points that sags, drags, lies in coils and piles up on the ground (and follows slopes, with Melange 0.6’s
wum.game.landRay), stretches when the worm is knocked, and slides further out every time the worm is hit again. It is drawn by a third Post-FX pass,bloodsand/guts(PostWorld, order 52), which ray-marches the chain as smooth tubes with ridges and segmentation, and lights them: pale pink-grey to deep purple-red with veins, a film of blood, wet highlights, light through the thin wall, and shadow where they meet the worm and the ground. It draws up to four gutted worms at once, the closest to the camera. If that pass cannot run, the old flat ribbons are drawn instead. Withoutwum.game.landRaythe gut lies on a flat ground at the worm’s feet. - Scorching: the skin pass can burn a worm where it was hit (on the chest, on the side it was last hit from, never on its back unless the hit came from there): one patch in rings, as a flame leaves on skin, a reddened, singed halo round skin cooked to a dark leathery brown with a few pale blisters, round a black crust cracked by a few dull dark-red fissures (nothing glows, except a faint ember flicker in the cracks for the first half second), fading out over about three seconds. The fire punch sets it, and so does the preview.
- No stutter when an effect first runs: Melange compiles a Post-FX effect the first time it is switched on, and the driver finishes the job on its first draw, which cost several milliseconds in the middle of the action. At the start of the first match of a session Bloodsand switches each of its four effects on for five frames, one after the other, with nothing to paint, so that this is over before anything is on the screen.
- Ground decals: blood that reaches the terrain stays there. A droplet that hits the ground or a wall leaves a
splat shaped by the way it came in (a round splat with satellite specks when it came down steeply, a teardrop
streak when it came in low, with drips that run down a wall), and a burst or a heave leaves a pool under the worm
that spreads over about two seconds. Fresh blood is a wet, glossy bead with a crisp edge: a thin dark line at the rim, a rounded raised shoulder that
catches the light, a domed middle and darker clots inside; over
30 to 60 seconds it dries to a dark matte brown with a clotted rim, and a pool cracks. Decals that overlap are one
body of blood: the pass combines their edges (a smooth union) and draws one outline, one rim and one shoulder around
the whole, so no decal’s border shows inside another, and a speck beside a blot runs into it. No two splats are alike:
the size has a long tail (tiny specks, many small ones, a few big blots, finer when the hit was fast) and the outline
(lobes, lumps, crowns of spikes), the stretch and the number of satellite drops and specks come from the splat’s own
seed. Blood does not land on a worm or its hat (the pass is told where the worms are and keeps clear of a volume
around each, tall enough for a hat; the floor and curved ground under a worm excepted), nor on smoke, silhouettes or a
wall behind a pool: it takes surface near the decal’s plane (the tolerance grows away from the middle, so a splat wraps
round a pillar or a rock facet by facet and its own outline is what ends it, not a facet edge), turned no more than
about 60 degrees from it and not behind a depth edge, and fades out as the camera comes within about 50 units (it is
gone at 18, where the aim camera sits in front of a rock). The pass takes each pixel’s normal from its own four
neighbours, so edges never break into two-pixel steps. A wide pool is a nearly flat film, so it catches a broad faint
sheen instead of one round highlight. An explosion that digs a crater takes away the decals whose middle is in it,
and a worm’s pool goes down four tenths of a second after it is asked for, so a death pool lies in the crater the worm
left instead of being cut into strips where the old ground was. The decals are a
depth-projected Post-FX pass,
bloodsand/stains(PostWorld, order 50, so before Sunstone’s effects), with 32 slots on floors, walls and overhangs; the one blood landed in longest ago is recycled first (size counts for a little) and a speck does not push out a pool. A splat does not push out a pool or a trail piece that is still fresh either (see The three together). Because it is projected from the depth buffer it follows the terrain, and a decal disappears where the terrain under it is destroyed. Droplets only collide with the terrain on a Melange that haswum.game.landRay(0.6); on an older one there are only pools, as before. Droplets of every weapon spray and the heavy clots collide; steam and smoke do not. The Post-FX panel has two settings for the pass: drying time and wet gloss. - Gibs: a worm that dies, and a worm that takes a very big hit (45 damage or more; 30 on Absurd), throws meat chunks,
bone shards and a few organs (a kidney, a liver lobe, a heart, a lung, a loop of intestine, an eyeball on its stump of nerve) with a few dozen small
bits of meat (soft sprites) flying out around them. They are not particles: each is a signed distance field ray-marched
by the Post-FX pass
bloodsand/gibs(PostWorld, order 53, after the guts). A meat chunk is a bent, rounded box eaten away by noise and sliced by up to two ragged planes, dark red with lighter fibres, cream fat marbling, silverskin and pale, fibrous tear faces; a bone is a tapered shaft with a knob at one end on some and a jagged, splintered, hollow break at the other, ivory, with a porous marrow-red end; the organs are the shapes above with their own colours (fat on the heart and round the kidney’s notch, a bloodshot eye with an iris and a pupil, some staring up at the camera). They are wet at first (a bright sheen, light through the thin flesh, a film of blood in the low spots) and dry over about 60 seconds (thedryTimeparameter) to a darker, browner, matte finish. They fly with spin, bounce with a restitution that depends on what they are, roll, slide and come to rest lying on their flattest face, where they stay (up to 16 on Absurd, 14 on Heavy, 8 on Light, the oldest recycled). Each leaves a splat where it first lands hard, a streak or two where it slides and a pool where it lies, through the decal pass (so they need Blood on the ground for those). A later explosion throws the gibs near it again, away from the blast, and one in the middle of a crater is blown into bits of meat (bone is only thrown); one whose ground is dug out from under it falls. WithoutlandRaythey land on the plane at the height of the worm’s feet. If the pass cannot run (an older Melange, or a driver that fails to draw it) each gib is drawn as a flat sprite instead. The setting is Gibs; Preview throws some (a very big hit’s worth, and a death’s worth on every third press). - Pools and trails (the setting of that name; it needs Blood on the ground): a worm below two thirds of its health
leaves a line of drips on the ground as it walks, and below a quarter of it a smear where it drags itself. The drips are
beads of every size with now and then a big splat (a tenth of them) and sometimes a small drop behind, one every 8 to 15
units, in clusters with bare stretches between, three to ten units across, so that they read from the play distance. The
smear is a stripe of the worm’s own width (about nine units), streaked along the drag by ridges of thicker and thinner
blood, with thick, dark, ragged edges, thin only at its very start; it runs thinner and drier the further the worm has
dragged itself since its last hit (down to 60% of its width over about five hundred units, a hit brings fresh blood), and is
now and then broken for a body length. The trail is read off the worm’s own path (a ray down to the ground under it every couple of
units, so it follows slopes): one trail piece is a straight strip that the worm lengthens step by step, up to about 50
units of drips or 64 of smear, and then a new piece starts where it left off (also when the worm turns or goes back; a smear
piece starts twelve units back on the one before it, so that the stripe has no neck between them), so a trail costs one of
the 32 decal slots for every 30 to 60 units walked, and not one for each step. The pieces are
decals of their own kinds (3, a dotted line of drips of every size, none in some places; 4, a smear), the pass draws
them in the same one fluid as the splats and pools, so a trail runs into a pool it meets, and a trail dries like any
blood (a thin smear a little sooner). The most pieces there may be is 5 on Light, 8 on Heavy and 12 on Absurd; the
oldest goes first, and a trail that goes on takes the slot of a splat of any age when all 32 are in use (the sphere each piece
sends the pass is also 35% wider than it needs, so that where splats crowd, the pass, which keeps the three decals that hold
a pixel deepest, does not leave the piece out). A worm that is dying (its health is gone and the game is about to blow it up, which may be seconds away) grows a
pool under it over about six seconds to 15 to 20 units across the radius on Heavy, and a worm below 30% of its health that
lies still for a second and a half grows one over about eight seconds (6 to 14 units of radius, the more the less
health it has), once for each place it lies in; both stay wet while they spread and dry afterwards like any pool.
The death explosion’s crater takes them like any other decal. A moment after a worm blows up (1.1 seconds, when the
gravestone has come down) its grave gets a wet pool, smears that run out of it (3 on Heavy, 5 on Absurd) and a spatter of
splats around. Melange has a decoder for no message that says where the stone lands (CreateGravestoneMessage is on its
list of names but its payload is empty), so the grave is taken to be where the worm was last seen. Light, Heavy and
Absurd scale the sizes, the number of pieces, the drip density and the grave’s smears and spatter; the colour setting
colours everything. Without
wum.game.landRaythe ground under a worm is a plane at its feet. - The three together (gibs, pools and trails, arterial spurts): they share the decal slots, the terrain rays and the frame’s spawn budget, and the shares are set so that none starves the others. Decal slots: a worm that spurts rains splats all the time it is hurt, which used to push the trail and the pools it leaves out of the 32 slots within seconds. A new splat now takes the slot of a pool or a trail piece only once that is no longer worth keeping (a trail piece after about fifty seconds, a pool after a minute or more), and only while pools and pieces fill no more than 18 of the 32, so the spray always has 14 slots; a new pool pushes out whatever is least valuable, as before, a new trail piece the oldest piece or a splat that is worth little, and the grave’s smears are worth three times as much for their first eight seconds. The gibs’ splats, streaks and pools, the spurts’ and the trails’ all go through the same decal code and its limit of four new splats a frame. Terrain rays (at most 64 a frame in all, see Cost): the flying gibs take up to 20 and go first, then the droplets (the spurts’, the bursts’, the weapon sprays’) up to 48, and what can wait a frame (the trail samples, pools, the guts’ probes, the melee ground rays) is refused once 24 are spent, and asks again the next frame. Spawn budget: bursts first, then the spurts (40 spawns are kept back for the bursts, and the spurts never fill more than 60% of the pool); the gibs’ bits of meat are sprites of their own (up to 96) and the gibs themselves are not particles. A frame throws at most 20 gibs between all the worms that die or are hit hard in it (the pool is 8, 14 or 16: more would only recycle what was just thrown), and a death throws at most half the pool, so a blast that kills the pack leaves some of each. Death: the burst, the gibs and the lens splat come when the worm blows up, the spurts stop (a dying worm’s fade over six seconds first), the dying worm’s pool is already growing, and 1.1 seconds later the grave gets its pool, smears and spatter. Preview: each press shows the next weapon’s spray, throws a very big hit’s worth of gibs (a death’s worth every third press), lays a drip trail, a smear and a pool at the worm’s feet, and makes the worm spurt for six seconds. Resend: the insurance resend is one slot of the gibs per step on top of four decal slots, spread over the same 17 frames. Script: the main function has two spare local-variable slots out of Lua’s 200, so new state belongs in tables or in do-blocks like the three sections.
- Lens splatter: heavy hits near the camera, and a death, splash blood across the lens, fading over a few seconds. It
is a Post-FX pass,
bloodsand/lens(PostWorld, order 60), so it is drawn before the HUD and the minimap and the timer stay clear. Where a splat is, the picture is bent as if by a wet droplet, blurred a little, tinted and darkened (clear at the thin edges, nearly opaque in the thick middle), with a dark edge, a pale highlight on the side the light is on and a few drips that run down and lengthen. As a splat goes, the blood drains from its thin parts first, so it shrinks to its thick core and is gone instead of fading into a pale ghost with a dark outline. Up to six splats at once. If that pass cannot run (an older Melange, or a driver that cannot draw it, which Melange reports and Bloodsand checks every two seconds), the same shapes are drawn flat on the HUD, as in 1.1.
Settings
Section titled “Settings”On the Mods page:
| Setting | Options | Default | Notes |
|---|---|---|---|
| Blood | Off / Light / Heavy / Absurd | Heavy | how much blood each hit throws, weapon sprays included; Off disables everything |
| Blood on worms | on / off | on | the skin pass: the blood on worms, their wounds, black eyes, burns and torn bellies |
| Worms throw up blood | on / off | on | the heaving of nearly dead worms |
| Intestines | on / off | on | the torn belly and the length of intestine that comes out of it |
| Gibs | on / off | on | meat, bone and organs thrown by deaths and very big hits, and the bits of meat that fly with them |
| Blood on the ground | on / off | on | the decals pass: splats, drips and pools, and the droplets’ collision with the terrain |
| Pools & trails | on / off | on | blood trails behind hurt worms, pools under dying and badly hurt ones, and the gore round a grave (needs Blood on the ground) |
| Splatter on the lens | on / off | on | the camera lens splatter (the lens pass, or the flat fallback) |
| Blood colour | Red / Green | Red | the colour of droplets, decals, blood on worms, wounds, guts and lens splatter |
The Mods > Bloodsand > Preview menu item throws a test burst at the active worm so you can see the current settings without hurting anyone. Each press shows the next weapon’s signature (bat, prod, fire punch, nails, donkey, old woman, rope knock, fall, shotgun, sniper, poison arrow, then an ordinary explosion burst, and round again), sprayed sideways across the screen, and writes its name to the log. It also gives that worm wounds, black eyes, intestines and a burn that fade away over about twelve seconds (the burn over three), and makes it throw up once. Press it again to see more of the intestine slide out. It also throws gibs (a very big hit’s worth each time, and a death’s worth every third press), lays a trail of drips and a smear with a pool at the worm’s feet, and makes the worm spurt for six seconds.
How it detects hits
Section titled “How it detects hits”The game posts a message the moment a worm is damaged, and another for every explosion with its position, damage and radius. Bloodsand listens for both and reads every worm’s health and position each frame. A hit with an explosion bleeds away from the blast; a hit without one is matched to a weapon and a victim.
Which weapon. The active worm’s weapon id is remembered every frame and again when a weapon is fired (the game may clear the id before the damage message arrives). For a hit without an explosion, the first rule that matches wins:
- A weapon fired within its window counts: 2.5 s by default, 2 s for the shotgun, 3 s for the sniper rifle and 4 s for the poison arrow. The shotgun and the ninja rope get three hits per firing, everything else one.
- A held melee weapon counts if some other worm is within its reach (bat 52, prod 42, fire punch 48, No more nails 44, ninja rope 46 units), unless that worm has just landed from a fall.
- A bullet needs a worm in front of the shooter’s facing, within a cone that narrows with distance.
- A worm that was stopped from faster than 230 units a second downward gets the fall splat.
- Anything else is the ordinary blunt hit.
Explosions of the concrete donkey, Fatkins, old woman and Scouser are recognised for 20 s after they were fired and give every worm in the blast the weapon’s signature. Any other explosion keeps the ordinary burst away from the blast.
Which worm. The one with the largest impulse (from its engine velocity when Melange reports one, otherwise from how its position changes), else the nearest candidate. The spray runs from the attacker to the victim, blended toward the real knock when one was seen.
| Weapon | Signature | Counted as |
|---|---|---|
| Baseball bat | wide horizontal arc of long streaks, a fine arc, a few straight streaks, 3 to 8 heavy clots, mist | 32 damage |
| Prod | thin pulsing jet of 10 to 20 drops for a fifth of a second, then a dribble | 15 |
| Fire punch | upward gush, mostly charred drops, embers, steam and smoke; the worm is scorched | 30 |
| No more nails | five small jets in a narrow cone, a few hundredths of a second apart | 20 |
| Concrete donkey, Fatkins | a ground-hugging ring, low clots and a big pool | 55, 45 |
| Old woman, Scouser | fine fast drops in every direction on top of the blast | 40 |
| Ninja rope knock | a smear along the knock | 14 |
| Fall | a ring on the ground, a small gush upward and a pool that grows with the fall speed | 8 to 40 |
| Shotgun | puff at the entry, narrow cone behind the victim | 22 |
| Sniper rifle | puff, a fast narrow cone and a long streak behind the victim, and a lens splat if close | 48 |
| Poison arrow | dark yellow-green entry jet and a dribble that goes on for 14 s | 14 |
The number of droplets scales with the damage counted and the Blood setting, and Blood caps what one hit can throw. The
damage counted is only an estimate for the size of the spray: the game only takes the health off at the end of the turn,
seconds later; by then the hit has been shown, so the difference between the estimate and the real damage only changes
how long the worm bleeds. Wounds, black eyes, vomiting, spurting and intestines follow the worm’s health, counting damage already
shown. Where the face and the belly are comes from the worm’s position and its facing angle (yaw in
wum.game.worms()). Nothing is sent back to the game.
Client-only
Section titled “Client-only”"kind": "client-only" in spice.json, with no permissions (unsafe is false, filesystem is none). The mod only
reads game state and draws, so it cannot change the simulation.
The Post-FX values (the decals’ positions and shapes, each living worm’s position for the stains pass, each gib’s
position, orientation and size, each bloodied
worm’s position, facing, blood, wound, eye, gut and scorch levels, the points of each hanging gut, and the lens splats)
are fed with wum.postfx.setTransient, which Melange neither writes to Melange.ini nor logs. The only thing Melange
saves is an effect being switched on or off, which happens when the first blood appears and when it is cleared.
These are estimates until they are measured in a live match on a build of Melange 0.6 that has the sprites. The GPU figures come from a test harness on a desktop Radeon RX 7800 XT at 1920x1080 (GL timer queries), not from the game; the script figures from a mock of the game, which leaves out the real cost of drawing the quads or sprites and of the terrain rays. Version 1.1 was measured in a live four-team match: the stains pass about 0.04 ms and the skin pass about 0.07 to 0.1 ms.
- Skin pass: about 0.10 to 0.11 ms (1.1: about 0.09; the in-game figure for the previous 1.2 build was 0.09 to 0.10), only while a worm wears blood, a wound, a bruise or a burn. It has a fixed full-screen cost of about 0.09 ms; the skin classifier, the new blood pattern and the black-eye ring add 7% (blood only) to 13% (blood, wounds and both eyes at once with the camera close) over the previous build in the harness at 1920x1080, which is 0.01 to 0.015 ms; at the usual distance of play with every effect on it is 9.5% (0.111 to 0.122 ms). Most of a black eye’s cost is sixteen screen taps that find the whites of the eyes and four that find a moustache, about 4% of the pass at the harness’s mid-range camera (the shell test and the silhouette test that keep ground and rock from taking skin’s paint cost two depth taps for each pixel that is skin by colour, and save more than that on a worm that fills the screen). A burn on a worm that fills the screen is about 9% more. This is at the limit of what was aimed for and has not been measured in a live match.
- Guts pass: only on while a gutted worm is in view. About 0.16 to 0.18 ms at the usual zoom, and up to 0.4 ms with the camera right on top of the guts. A pass that only copies the screen takes about 0.05 ms of that.
- Gibs pass: only on while a gib may be on the screen (checked every frame, against the camera; with none the pass costs
nothing). In the same harness (1920x1080, native OpenGL, best of four runs; its scene and depth are RGBA32F, which makes the
fixed cost of any pass that reads them larger than in the game): about 0.18 ms with 16 gibs spread over the screen at the
usual zoom (1.3 after the organ and bone rework: about 0.21 ms, the organs and the broken bones being dearer to march than a
chunk of meat; with the camera that close gibs fade out under 60 units, so the “fill the screen” case no longer arises), 0.24 to 0.28 ms with the camera close enough that they fill it, 0.09 ms at 1280x720 at the usual zoom. Of that
about 0.058 ms is a pass that only copies the screen (the figure with the pass on and nothing to draw,
count0), and about 0.015 ms the sphere tests of the sixteen slots; a pixel reads the depth only if its view ray meets a gib’s bounding sphere, and marches only inside a box that holds the gib. The rest is the pixels that are a gib: a 26-step march, four taps for the normal and one for the occlusion and two for the shadow, none of them for a gib under about six pixels across. It was aimed at 0.15 ms and is above it at the usual zoom by 0.03 ms; native OpenGL and the browser’s ANGLE agree but for a few edge pixels. - Lens pass: about 0.02 ms (a copy of the screen) with no splat in the way, 0.04 ms with a few and 0.055 ms with six large ones on top of each other (the same harness, 1920x1080), only while there is a splat on the lens.
- Decals pass: about 0.075 ms in the harness with nothing on the ground, 0.15 ms with four decals and about 0.35 ms for a deliberately dense pile of 32 (0.13 to 0.165 ms was measured in the game with the version before the worm and near-camera checks). It is switched off while there are none. Measured on the same card against the pass as it was before the decals were made one fluid and kept off the worms (interleaved runs, 1080p): 6% more with four decals, and the same (1% less) with 32 covering a third of the screen, because a pixel now combines three decals and shades once instead of shading each of four. Working out the normal from each pixel’s own neighbours (instead of the 2 by 2 block derivatives) adds 3 to 7% in the harness (0.149 to 0.158 ms with four decals, 0.354 to 0.371 ms with 32). Before that change the game measured 0.22 to 0.26 ms with blood about. The trail pieces of 1.3 (a branch for kinds 3 and 4 in the same pass) cost 0 to 2% in the same harness and the same native GL timing (nothing on the ground 0.078 ms before and after, four decals 0.158 and 0.160, nine decals and three trail pieces 0.203 and 0.206, 32 splats and pools 0.366 and 0.371), and 24 splats and pools with 8 trail pieces take 0.34 ms, less than 32 splats. A raise to 48 slots was measured and not taken: 32 splats and pools with 16 trail pieces take 0.44 ms and 48 splats and pools 0.46 ms (+21%, the slots above 32 are tested by every pixel of the screen whether anything is there or not).
- Script: in a stress test with six worms and explosions, weapon sprays and previews back to back, an average of
about 0.4 ms a frame on Heavy and 0.45 ms on Absurd. At rest on Heavy, with eight worms of which four are badly hurt
(gutted, vomiting, bleeding done) and the decals down, about 43000 to 47000 VM instructions and 0.24 ms a frame in the
mock’s plain Lua 5.4 (the game’s own steady figure is still to be measured; it reported 0.35 to 0.8 ms only right
after preview bursts). A gutted worm takes under 0.1 ms and six take about 0.3 ms. With
Blood set to Off it takes under 0.01 ms. A Lua callback may run 500000 VM instructions and Melange stops it for the
session after three faults, so the script keeps clear of that: one frame spawns about 200 particles for bursts (the rest of
a big blast waits a few frames in a queue, and a burst takes at most half of what the pool has left, so the worms of one
blast share it), and only the four gutted worms nearest the camera are simulated (with one fixed step and fewer passes
while more than two are going). In the mock host the world callback peaked at about 270000 instructions for sixteen
worms in one Absurd blast (with the camera right on top of them), at about 280000 when all sixteen die in one frame
and at about 260000 for sixteen gutted worms. Drawing the droplets and puffs as fans costs about 0.05 to 0.15 ms a frame
more than the old kites and squares on Heavy at the usual distance of play, and about the same far away (where most are one
thin quad); a crowded pool and a camera close in draw simpler shapes so the cost stays bounded. With sprites
(Melange 0.6) there is one call per particle and no levels of detail, so the script is about a third cheaper in VM
instructions on a big blast than with fans (in the mock host, where the sprite call costs the script nothing, as the real
one is a C function: a 12-worm Absurd blast peaks at about 175000 instructions instead of 258000 and averages 92000
instead of 148000, Heavy peaks at 129000 instead of 186000 and averages 59000 instead of 101000, 24 worms at 60 fps
peak at 188000 instead of 272000, and 24 worms at 30 fps at 228000 instead of 299000, all with no faults; at rest on
Heavy the figure drops from about 45000 to 42000). The call itself is not free: Melange measured about 0.18 ms per 1000
wum.draw.spritecalls, and its own side (building the quads, sorting by depth and drawing) about 0.04 to 0.06 ms per 1000 when they share a texture. At most about 500 sprites are drawn a frame (a 12-worm Absurd blast peaks at 480, a quiet scene is a few dozen), far under Melange’s limit of 4096 a mod, so that is about 0.09 ms of script at the very peak and 0.01 to 0.03 ms in ordinary play. The cost that can matter is draw calls: Melange sorts the sprites of every mod back to front and starts a draw call at every change of texture or blend mode, and a blast’s droplets, clots and puffs are mixed in depth. In the mock host, which counts the runs after sorting the same way, a blast peaks at about 280 draw calls a frame and averages 20 to 65 over a scene (a steady scene of bleeding worms: peak 150, average 20), which Melange’s figure for shuffled textures (about 0.28 ms of CPU and a few milliseconds of GPU time per 1000 sprites in the worst case of 3100 draw calls) puts at roughly 0.03 to 0.14 ms of CPU and a small GPU cost for a few hundred small sprites. That is an estimate from Melange’s published figures, not measured with this plugin in the game. The textures are few on purpose (17, with the spark and the three bits of meat; a mod may hold 256). - Gibs, script: with sixteen gibs at rest about 0.003 ms a frame (a loop over the slots, one ray a frame to see that the ground is still there, and nothing sent to the effect) and about 1000 VM instructions; a burst of four deaths on Absurd adds about 0.1 ms a frame on average for the second and a half they fly (0.065 ms on Heavy), 16000 instructions on average and up to 17000 more than the same frame without gibs at the worst, and up to 96 bits of meat as sprites, about 0.02 ms more in the game. A death throws at most half of the pool at once, so the worms of one blast share it. In the mock host eight worms dying in one Absurd blast peak at about 206000 instructions (186000 without the gibs).
- Arterial spurts: the spurt code itself (heartbeats, wound sites, spawning) is about 7000 VM instructions a frame with four badly hurt worms on Heavy and about 29000 with sixteen on Absurd in the mock host; the rest of what they cost is the particles they make, like any other (a few hundred instructions each a frame, one sprite call each, a terrain ray every few frames): four dying worms on Heavy keep about 140 particles alive (of 300) and add about 65000 instructions a frame to the 42000 of the same scene without them, and sixteen on Absurd about 280 of 480 (the pool share they may fill is 60%), raising the sixteen-gutted-worm stress test from an average of 155000 to 183000 instructions and its peak from 228000 to 234000 (307000 at 20 frames a second), the sixteen-worm Absurd blast (six blasts at 30 frames a second) to a peak of 291000, all far under the 500000 limit, with no faults. They add no post-FX parameters and at most 64 terrain rays a frame stays true (they take the droplets’ share).
- Pools and trails, script: one low-priority terrain ray for every 2.5 units a hurt worm walks (none while it stands). In the mock host (Absurd, eight worms crawling at 45 units a second, then four deaths in one frame) the world callback averages 56900 VM instructions a frame against 53800 without them, peaks at 204000 against 191000, and makes 56 rays a frame at most against 52.
- All of 1.3 together: a stress test of the mock host with sixteen worms at 12 of 100 health on Absurd crawling at 45
units a second (so spurting and laying trails), four of them taking a 60-damage hit (gibs), five dying and three of them
blown up in one frame and two a second later, and eight more blown up in one frame with a big explosion over the pack
(thirteen deaths in all, 20 seconds of crawling and 20 of aftermath): at 60 frames a second the world callback averages
172000 to 182000 VM instructions in the crawling and fighting phases (126000 in the aftermath), at 30 frames a second
204000 to 213000, and its worst frame over five seeds was 328000 at 60, 327000 at 30 and 330000 at 20 frames a second
(the limit is 500000), with no faults, 268000 on Heavy and 171000 on Light. The worst frame is the one with the eight deaths;
before a frame was limited to 20 thrown gibs it was about 400000. Without
landRayit peaks at 298000, without sprites (the triangle-fan fallback) at 385000, with the gibs off at 271000. The terrain rays reach the 64 of the cap in 4 to 5% of the frames of the crawl, 10 to 15% of those of the big hits and the first deaths and 3 to 5% of those of the last deaths; the droplets lose a few rays in those frames (0.5% of the high-priority rays asked for are refused), and the trail samples, pools and guts probes, which wait a frame, are refused about one time in four.wum.postfx.setTransientcalls peak at about 280 in a frame, in the fight (two per moving gib, 32 at most, plus the worms’ skin and the decals), and at most about 60 at rest. Eight worms on Heavy, four of them at 15 health and the decals down, now use about 113000 VM instructions a frame at rest (0.65 ms in the mock’s plain Lua 5.4), against 42000 in 1.2: the spurts’ droplets are all of the difference. - Terrain rays: at most 64 calls of
wum.game.landRaya frame, all counted together (48 for droplets, at most 24 between the guts’ 8 probes, the trail samples, the pools and the melee sprays’ ground rays, and up to 20 for the flying gibs, which go before the droplets). Melange 0.6 logs their average and worst cost at the end of each match; a few microseconds each is expected, and if it is more, the droplets’ share is what to lower. - Resend: every two seconds everything is sent to the effects again as insurance; this is spread over 17 frames so no
single frame makes more than about 80
wum.postfx.setTransientcalls.
Re-measure with the Mirage/Post-FX panel on your own machine.
Limits
Section titled “Limits”- Needs game build 1077 for game state. On any other build it does nothing.
- Needs Melange 0.3.5 or later, for
wum.postfx.setTransientand the worms’ facing angle. - Melange 0.6 adds three things that Bloodsand uses when they are there, each with a fallback, so it still runs on 0.3.5
to 0.5:
wum.draw.sprite(soft textured particles; without it the particles are triangle fans, as above),wum.game.landRayand the worms’ velocity. Without the last two droplets do not collide with the terrain (the ground only gets pools), the guts lie on a flat ground at the worm’s feet and knocks and falls are read from how the worm’s position changes. Everything else works the same. The sprites are drawn after the world’s other primitives, tested against the scene’s depth but not written to it, and sorted back to front with the sprites of any other mod, so a semi-transparent thing drawn by another mod can sit in front of or behind a puff according to its depth only. Melange 0.6 also gives every texture a full mip chain and trilinear filtering, so the lens splats’ flat HUD fallback is smoother when scaled down. IflandRayanswers “unavailable” (for one odd level, say) the plugin goes without it for ten seconds and again at the next match start, instead of for the rest of the session. - A weapon’s signature depends on seeing its weapon id on the active worm. If a build of the game clears it before the hit and no firing message came, the hit gets the ordinary blunt burst instead. A held melee weapon (no firing message) needs a worm within reach that was also knocked just then, so an unrelated hit next to a worm holding a bat is not taken for a bat swing, but a poke that moves nobody shows nothing. The spray shapes, the fall threshold and the reach distances are untuned guesses until seen in the game. A melee hit that the game reports as an explosion takes the ordinary burst.
- Everything on a worm’s skin is painted from the depth buffer inside the worm’s volume. It travels and turns with the worm, but it does not follow the mesh’s animation: the game gives a worm’s position and facing, not its bones.
- Black eyes are placed where the eyes are on a worm standing upright, on the side the game’s facing angle says is the
front (the facing is
(sin yaw, 0, cos yaw), the same one the blood and the belly use), and only on surfaces that face that way, so never on the back of the head. A worm’s head bobs, slumps and looks around, so a bruise can sit a little off the eye, and it is not drawn while a worm is thrown. Only skin-coloured pixels are darkened, so the whites of the eyes, glasses and hats stay clean; under strongly coloured light or on a worm whose skin is not a warm peach (a green tint passes while green stays under about 1.2 times red, but strongly green bright skin is turned away, and this has not been checked on a real poisoned worm) the bruise, like the blood, fades out. With no white of an eye near (glasses over the eyes, say) only a faint oval darkening is left. - The intestines come out of the belly opening that the skin pass paints, so they need Blood on worms (and are off with it). They are ray-marched in a screen-space pass. They stay out of the worm’s body (a guessed capsule) and on the ground below them, but they do not collide with other worms or with walls, and at most four gutted worms (the closest to the camera) are drawn at once. They are lit by a fixed key light and the camera, not the level’s lights. Where the opening sits on the belly was set by eye and may need adjusting.
- The spurts, the trails, the pools and the gibs of 1.3 have been seen in a test harness (the shaders) and a mock of the game (the script), not yet in a live match: the strengths, sizes and timings are untuned guesses until they are. The spurts come from the wound places the script works out for the skin pass (checked against the shader to a hair), on a standing worm; a worm lying down or animating its head can have the jet a unit or two off the gash.
- A worm that spurts is the main cost of the script at rest (see Cost): its droplets are ordinary particles, up to 60% of the pool, and each collides with the terrain in turn. Blood set to Light or Heavy cuts that a lot, and Off removes it all.
- A frame throws at most 20 gibs between all the worms, and a frame’s decal slots go to at most four new splats; a blast that kills a whole pack at once gives the later deaths their bits of meat and blood but fewer or no gibs.
- Trails are straight pieces along the worm’s path (a path that turns makes a new piece at each corner, which can show as a slight kink), and they and every other decal share the 32 slots: a fresh piece is safe from the splats (pools and pieces together may hold 18 of the slots), but an old one goes when its place is wanted and a piece that is pushed out by a new piece, a pool or the cap is gone, so a trail shows best in a quiet turn. The pools under dying and badly hurt worms are laid at the worm’s feet and a death explosion’s crater takes them. The grave is where the worm was last seen, not where the stone lands, and the smears round it are straight lines on the ground there (on a crater’s slope the part off the plane is not drawn).
- Decals are projected from the depth buffer: there are 32 of them, and a pixel combines at most three. Where more than three overlap, the ones that hold the pixel least deeply are dropped (a pool with many splats on it can still show a hard edge here and there), and a decal vanishes where the terrain under it is destroyed (an explosion’s crater takes the decals whose middle is in it). The surface has to lie near the decal’s plane, within a tolerance that grows away from the middle, so a pool on strongly curved ground may still be trimmed at its edge, and a step or a kerb a few units up beside a pool can take some of it. Blood is kept off a volume about 19 units wide and 27 high, raised 5 above the middle of each worm (so a worm lying down and a hat are covered too), except for the floor and the curved ground under it; an arm or a weapon that sticks out of the volume can still be painted if it is on the decal’s plane. Droplets are tested against the terrain only, not against worms, crates or water.
- Wounds are placed from a per-match seed, not where the hit landed, and which worms have intestines to show is chosen at random each match.
- Only skin-coloured pixels take blood, wounds, bruises or burns, wherever on the body: a hat the colour of skin (straw, light brown) is painted like the head, a moustache or tufts of a skin-like brown can take a little blood in their lit parts, a gold monocle’s rim can, and under strongly coloured light skin can go without. Held weapons inside a worm’s volume take blood too. The side a worm was hit from (for the soaked patch, streaks, smears and drops) is the side the last hit’s blood went away from; a fall, or a hit that only moved the health, leaves the side from before (or one from the match seed).
- A pixel takes the blood of one worm only, the one whose body it is deepest inside, so where two worms overlap on screen the pattern of one stops at the other.
- Up to 16 worms can wear blood and wounds at once.
- The guts shader repeats its shape function several times and was tried on one AMD driver only. Another driver could link it and draw nothing; the flat ribbons of 1.1 are drawn instead if Melange reports the pass as failed (checked every two seconds). The skin and stains shaders are big as well and were tried on the same driver only; they have no fallback, so if Melange reports one as failed Bloodsand writes a line to the log and stops feeding it (no droplet rays, no guts).
- The gibs are a sphere against the terrain, not the shape that is drawn: a long bone is held up by a sphere of about a third of its length while it flies and settles to its radius as it lies down, so a bone that comes down on a ledge can rest with an end in the air, and a gib that lands on a worm, a crate or water is not stopped (the ground under it is all it knows). They stay on slopes up to about 38 degrees and slide down steeper ones; on a wall they run down it to the floor. They do not collide with each other (two can lie one inside another), and a gib is not a hazard: it has no effect on the game. A gib is drawn only if it is in front of what the scene shows, so one lying partly under a rock is cut off by it. Only the nearest three overlapping gibs along a view ray are drawn, so a heap of more than that can lose a piece. They are lit by a fixed key light and the camera, like the guts. The ground a gib shades is darkened by an ellipsoid standing in for it, not by its shape, so a bone’s contact shadow is a smooth sausage.
- No sound.
tools/gen_guts.js writes mod/postfx/guts/guts.frag and effect.ini from tools/guts.frag.in (run it with Node from
this folder): the four worm slots of sixteen chain points are separate parameters, so the declarations are generated.
Edit the template, not the generated files.
tools/gen_gibs.js writes mod/postfx/gibs/gibs.frag and effect.ini from tools/gibs.frag.in (run it with Node from this
folder): the sixteen slots of four parameters, the code that picks the slot a pixel looks into and the sphere tests are generated.
Edit the template, not the generated files.
tools/make_splats.py regenerates the four lens textures (mod/textures/splat1.png to splat4.png). It uses only
the Python standard library.
tools/make_lens_atlas.js builds mod/postfx/lens/atlas.png from those four, for the lens pass: the shape, how thick
the blood is and which way its surface leans, side by side in one 256x256 picture. Run it with Node after changing the
splat textures.
tools/make_blood_sprites.js writes the particle sprite textures mod/textures/bs_*.png (droplets, clots, mist, steam,
char flecks, a spark and the small bits of meat of the gibs; neutral grey, so the sprite’s colour tints them). Run it with Node from this folder; the output is
the same on every run. Add --preview for a contact sheet.
Licence
Section titled “Licence”MIT, see LICENSE.
Versions
Section titled “Versions”Released 2026-10-09 · Melange 0.3.5 or later · bloodsand-1.3.1.zip (442 KB)
SHA-256 b9a199621669e0386d1787d16d75be46f89d2b44849c3ad46a6a6ef564b7bb20
Runs on Melange 0.7 and every later version: the plugin no longer names an upper Melange version, so a new
Melange release no longer moves it to Mods\.incompatible. No other change.
Released 2026-10-08 · Melange 0.3.5 up to (not including) 0.7.0 · bloodsand-1.3.0.zip (442 KB)
SHA-256 12dd636b0e6c24c0463529526443df5302c2fb9082b728f031e41a7083408815
Gorier again: worms spurt blood, leave trails and pools, and come apart. Three new things that work together, each with the Blood setting to turn it down and (for the gibs, and the trails and pools) a setting of its own, both on by default.
Gibs. A worm that dies, and one that takes a very big hit (45 damage or more, 30 on Absurd), now throws chunks of meat,
shards of bone and a few organs (a kidney, a liver lobe, a heart, an eyeball on its stump of nerve), with small bits of meat
flying out around them, and they stay: up to 16 on Absurd (14 on Heavy, 8 on Light), the oldest recycled. They are ray-marched
signed distance fields drawn by a new Post-FX pass, bloodsand/gibs (PostWorld, order 53, after the guts): flesh is dark red with
lighter fibres, cream marbling, silverskin and fibrous tear faces, bone ivory with a jagged, hollow, porous break, the eye
bloodshot with an iris and a pupil; all wet and glossy with light through the thin flesh at first, drying over about a minute to
a dark, brown, matte finish. The organs and bones were reworked after the first in-game look (they read as glossy pills, cigarette
butts and a tomato): the liver is a dark maroon lobed wedge with a thin sharp edge, a cleft, a vessel stub and torn raw faces; the
kidney a bean with a hilum, fat and the cut stubs of its vein, artery and ureter; the heart a leaning cone with a groove, a lumpy
cap of fat and the hollow, obliquely torn ends of its great vessels; new lung lobes and loops of intestine; bones are ivory, matte
and porous, a long bone with a knobbed joint end, a shaft snapped at both ends, a curved rib or a shard, each with splintered
breaks round a hollow marrow cavity and on some a rag of red meat still clinging; some meat chunks are fatty or dark. The wet
sheen is a thin, patchy, weak film (no glassy glint), with dark clotted blood in the crevices. A gib (and its bits) fades out
between 60 and 25 units from the camera and is gone nearer, one that would fill much of the screen fades too, and in the aim
view (the camera within 40 units of the active worm) the ones near the camera or the worm are hidden so they never block the
aim. They fly with spin, bounce, roll and slide on the terrain (wum.game.landRay; on the plane at the
worm’s feet without it), come to rest lying on their flattest face and sleep (no rays, nothing sent to the effect), and leave
a splat where they land hard, a streak where they slide and a pool where they lie. An explosion near them throws them again, and
flesh in the middle of its crater is blown into bits; ground dug out from under one lets it fall. A new setting, Gibs (on),
and Preview throws some. If the pass cannot run each gib is drawn as a flat sprite. A frame throws at most twenty gibs between
all the worms that die in it, so a blast that kills the whole pack does not spend its time recycling what it has just thrown.
Blood trails and pools (the new setting “Pools & trails”, on by default, which needs Blood on the ground). A worm below
two thirds of its health leaves a line of drips behind it as it walks, and below a quarter of it a smear where it drags
itself, laid on the ground under the worm (slopes included, with Melange 0.6’s wum.game.landRay). The drips are beads of
every size, one every 8 to 15 units in clusters with bare stretches between, now and then a big splat with a satellite drop
behind it, each a few units across, so that the line reads from the usual play distance. The smear is a stripe of the worm’s
own width, streaked along the drag with thicker, darker edges, thinner and drier the further the worm has dragged itself
since its last hit (a hit brings fresh blood), now and then broken for a body length, and pieces are laid overlapping so
that it is one continuous stripe, not dashes. A worm that is dying, or hurt and
lying still, slowly grows a pool under it over six to eight seconds, which stays wet while it spreads and dries later; and
after a worm blows up its grave sits in a pool with smears running out of it and a spatter of splats around.
Light, Heavy and Absurd scale the size, the number of trail pieces (5, 8 and 12) and the smears round a grave (2, 3 and 5).
A trail is a straight strip that the worm lengthens as it goes, two new decal kinds of the stains pass (a dotted line of
drips, and a smear), so it costs a decal slot for every 30 to 50 units and not one for each step; the oldest goes first.
The pass stays within 2% of its old cost (5% in a view full of drip pieces; measured with native GL at 1080p) and keeps its 32 slots: 48 would have cost
21% more with everything in use. Melange’s CreateGravestoneMessage has no decoder, so the grave is where the worm was
last seen. Trail and pool pieces follow the same rules as any decal on a worm and on smoke (a pool takes surface up to about
50 degrees from its plane, a grey pixel off the plane is skipped, and a worm’s wider volume stays clear of blood however
close its flank is to the plane), so a smear no longer paints a worm standing on a slope.
Arterial spurts. A worm below about a third of its health spurts blood from its deepest open wound in time with a
heartbeat (1.1 to 1.6 beats a second, faster the lower it is, slightly irregular, often with a weaker second beat): each
beat is a pressurised stream, a continuous arc of thin dark-red tubes of blood (a new sprite, bs_jet.png, no glint) laid
at a steady rate along the arc and closer together than they are long, thinning and breaking into beads at the far end,
a few beads flying ahead of it, a short sputter after the beat, a fine mist puff at the wound and a weak dribble between
the beats. The jets follow the worm as it moves and turns, land through the existing droplet
collision and leave splats and streaks, pause while the worm is thrown or falling and come back stronger after it lands,
start stronger after a new hit and weaken and stop on a dying worm. One wound spurts on Light and Heavy, two on Absurd. The
previewed worm spurts for a few seconds. They follow the Blood setting and have no setting of their own.
The gashes (and so the spurts) now sit on the middle of the body, not the head: their elevation runs from -0.6 to 0.4 radians
about the body’s middle, from -0.35 to 0.75 before (the highest wounds were at three quarters of the worm’s height, under
its head), which puts them 6 to 16 units above the feet. The wound sites that the code computes (woundSites) are now where skin.frag draws the gashes: it used to put them
up to 0.14 of a unit direction off (a unit or two at the upper wounds) and the belly opening about a unit and a half too
high, because the shader finds a gash along the ray from the body’s middle in the ellipsoid’s own space.
Working together. All three draw on the same limits, which are shared out so that none starves the others. The 32 decal slots: the spray of a spurting worm used to push the trails and pools it leaves out of them within seconds, so a new splat now leaves a pool or a trail piece alone while it is still fresh (about fifty seconds for a piece, a minute or more for a pool), as long as pools and pieces take no more than 18 of the slots, which leaves 14 for splats. The 64 terrain rays a frame: the flying gibs take up to 20 and go first, the droplets (the spurts’ too) up to 48, and the trails, pools, guts and melee sprays, which can wait a frame, what is left under 24. The frame’s spawn budget: bursts first, the spurts after them with 40 spawns kept back for the bursts and no more than 60% of the pool, the gibs’ bits of meat (up to 96, sprites) apart from both. Preview throws a very big hit’s worth of gibs (a death’s worth every third press), lays a trail piece and a pool and makes the worm spurt. The insurance resend is still spread over 17 frames.
Needs no new Melange: the sprites, landRay and the worms’ velocity of 0.6 are used where there, with fallbacks. Costs, in
the test rig at 1080p: the gibs pass about 0.18 ms with sixteen on screen (nothing while none may be seen), the stains pass
within 2% of what it was; in the mock host the script averages 170000 to 210000 VM instructions a frame, and peaks at about
330000 (the limit is 500000), with sixteen badly hurt worms on Absurd crawling, spurting and trailing, then big hits and
thirteen deaths. A few badly hurt worms spurting now make the script’s steady cost about two and a half times what it was
in 1.2 (eight worms on Heavy, four of them at 15 health: 113000 instructions a frame, from 42000), nearly all of it the droplets.
Released 2026-10-07 · Melange 0.3.5 up to (not including) 0.6.0 · bloodsand-1.1.3.zip (93 KB)
SHA-256 1f8844a4aca8d17c3b36d16e17075648699159d4f774677e85ed9baf16826e84
Runs on Melange 0.5. No other change.
Released 2026-10-05 · Melange 0.3.5 up to (not including) 0.5.0 · bloodsand-1.1.2.zip (93 KB)
SHA-256 4c9dace2243790fb9dc494f7fb6af65a3aa23fd27d04aca02c94f32273175018
Runs on Melange 0.4. No other change.
Released 2026-10-05 · Melange 0.3.5 up to (not including) 0.4.0 · bloodsand-1.1.1.zip (93 KB)
SHA-256 64b67b26ccd01913b6144ccf1bc006c5b62a971f9f690d7d2114bb3fd10f480e
Fixes blood, wounds, black eyes and ground stains not being drawn at all on some machines: the shader that paints the worms was large enough that a graphics driver could accept it and then draw nothing with it, which also discarded the stains drawn before it. It now picks the one worm a pixel belongs to and does the long work once. Much more blood from ordinary hits: more and larger droplets, longer bleeding, larger and darker stains, and a first hit now leaves a worm clearly bloodied instead of speckled. Black eyes no longer fade out while a worm walks.
Released 2026-10-05 · Melange 0.3.5 up to (not including) 0.4.0 · bloodsand-1.1.0.zip (92 KB)
SHA-256 8296ac227e88bd4ebc5424ea0b8ac8fd5b2f11a160e46e213d424a3320d1753b
Badly hurt worms now show it in three more ways. Their eyes blacken as health falls: one eye first, then both. Worms
at a quarter of their health or less occasionally throw up blood. Some worms, picked at random each match, have their
intestines out once they are badly wounded: coils in a torn belly and a loop hanging from it that swings as the worm
moves. Blood, wounds and the new marks now turn with the way a worm faces, not the way it last walked. Needs Melange
0.3.5 or later, which gives plugins a worm’s facing angle (yaw in wum.game.worms()). New settings: Worms throw up
blood and Intestines; black eyes follow Blood on worms.
Released 2026-10-05 · Melange 0.3.4 up to (not including) 0.4.0 · bloodsand-1.0.0.zip (85 KB)
SHA-256 587ed31ed127bb0902a906f59df38ca564e0376c4d94193de00808d8178ddf56
First release. Worms throw blood the moment they are hurt, away from the explosion and sized by the damage, bleed for
a while afterwards and burst when they die. Hit worms wear blood on their skin that stays with them as they move, and
worms low on health open gaping wounds: up to five gashes with torn edges and running blood, which close again if the
worm is healed. Blood stains the ground in a depth-projected Post-FX pass that follows the terrain, and heavy hits
spatter the camera lens. Client-only and cosmetic: it reads worm health and positions and the game’s damage and
explosion messages, and only draws. Needs Melange 0.3.4 or later for wum.postfx.setTransient, which lets it feed the
Post-FX passes every frame without anything being written to Melange.ini. Settings: Blood (Off / Light / Heavy /
Absurd), Blood on worms, Blood on the ground, Splatter on the lens and Blood colour (Red / Green).