Characters & assets

Fluids and blood

Body fluids and blood as mod data, on skin and floors, and wounds that bleed.

Fluids are mod data: each mod can ship a Fluids/fluids.json. A later mod replaces a type it names and adds pieces to an area. FluidsExtended ships semen, squirt, urine, urine leak and saliva. ul_Blood ships blood and the wounds. Turn ul_Blood off and nobody bleeds: addWound and stickIn do nothing.

Types

json"Blood": {
 "color": [0.30, 0.015, 0.02], "dry_color": [0.15, 0.045, 0.03],
 "jet_color": [0.22, 0.01, 0.012], "jet_opacity": 0.9,
 "cover": 0.95, "dry_hours": 1.0, "body": false,
 "puddle_minutes": 240, "puddle_scale": 2, "puddle_opacity": 0.92,
 "puddle_mesh": "Rooms/Sets/GenCore/Pieces/GenCore/Decor_Blood_Pool_Small.glb",
 "puddle_mesh_dry": "Rooms/Sets/GenCore/Pieces/GenCore/Decor_Blood_Pool_Dried.glb",
 "drip_chance": 0.7, "drips_land": true, "drip_speed": 9, "drip_seconds": 9,
 "drip_bead": false, "drip_trail": false,
 "jet": { "pulses": 1, "pulse_seconds": 2, "speed": [60, 30], "rate": 40, "radius": 0.28, "spread": 8 }
}
Field Meaning
color, dry_color The stain on skin and floors, wet and once dry (dry_hours). Without dry_color it keeps color.
cover How much of the colour shows on skin (a thin film is barely a tint).
body Also drawn as the splash pieces' geometry (female body only).
puddle_minutes How long a puddle on a floor lasts after its last drop.
puddle_scale, puddle_opacity How wide a puddle spreads per drop (1) and how opaque it gets (0.55).
puddle_max_cm The widest a puddle grows, in cm (45). ul_Blood's blood goes to 90: someone who bleeds out lies in it.
puddle_mesh, puddle_mesh_dry A flat mesh drawn as the puddle, grown with it, swapped for the dry one once it has dried.
drip_chance How often a drop landing on skin runs down it.
drip_speed, drip_seconds A run's starting speed (cm/s) and longest life (s).
drips_land A run that lets go falls to the floor as a drop of its own.
drip_bead, drip_trail A run is drawn as a bead on the skin, and paints its trail as it goes (both on by default).
stamp_image, stamp_cm The mark is this picture (under Fluids/), stamp_cm across, instead of a round drop.
jet The stream in the air: spurts, speed, droplets a second, size, scatter.

Wounds

Actor:addWound(bone, side, severity, kind) paints the opening of type Wound_<kind> (Wound_Stab, Wound_Slash, Wound_Stabs, Wound_Gunshot; a stamp_image each) where the bone meets the skin on that side. Below it hangs a BloodRun picture, turned to point down the body. Blood then wells from the wound, runs, and drips into a puddle. Any body works, male or female. Add a kind by adding a Wound_<Name> type with its picture.

Actor:stickIn(bone, mesh) leaves a knife (any .glb) in the wound, moving with the body. Actor:pullOut() takes it out, and the wound bleeds hard. Blood stays on the skin until Actor:wash().

On clothes

Clothed, the garment over a wound takes the blood: a stain soaks into it there and spreads while the wound bleeds, wet and dark at first, then dry. It is kept with the garment (worn or not, saved with it) until Actor:washClothes(); the do_laundry action runs it, where there is a washing machine.

How bodies react

A wound moves the body that has it. Under ul_Blood's Reactions/wounds.json threshold the wounded stay on their feet holding it, a hand where it hurts; past it, or sooner when it is a leg, they go down and stay down until Actor:getUp(). Wounds add up: two of 0.5 are 0.75. The face goes to the Pain mood. Everyone within reach turns to them, afraid, for a while, except whoever did it (addWound's fifth argument, by) and the player.

The poses are activities (Animations/*.ulactivity), looked up as <id>_<region>_<f|m>, then <id>_<f|m>, then <id>: hurt_stand, hurt_down and fear_stand by default, the region being the first in regions whose words are in the wounded bone's name.

json{
  "wound": {
    "stand": "hurt_stand", "down": "hurt_down",
    "down_at": 0.7, "leg_down_at": 0.45,
    "recover_seconds": 30, "mood": "Pain",
    "lying": "hurt_lying", "lie_after": 5,
    "regions": { "head": ["head", "neck"], "leg": ["thigh", "shin", "foot"] }
  },
  "witness": { "reach_cm": 1200, "activity": "fear_stand", "mood": "Scared", "seconds": 25 },
  "dead": { "activity": "hurt_lying", "freeze_after": 2.5 }
}

Down and still bleeding, they go from their knees onto the floor after lie_after seconds (lying); stopped bleeding, they stay kneeling. Actor:die(cause) lays the body down in dead.activity and stops its pose after freeze_after seconds; Actor:isDead(). The dead and the wounded stay where they are when the scene that hurt them ends, even someone the scene drew for itself.

A mod adds a pose for belly wounds with a hurt_down_torso_f activity; it overrides any of these values with its own Reactions/*.json. Actor:isDown() says whether they are on the floor. Actor:bloodied() (0 to 1) is how much blood shows on someone: skin, the clothes they wear, a wound still bleeding. What a stranger sees, until they wash and change.

Out cold

Actor:knockOut(cause [, minutes]) puts someone on the floor unconscious: the fall of unconscious.activity, stopped and held, a slack face, out of the room's life. The cause names an entry of unconscious.causes in any mod's Reactions/*.json, which gives the game minutes they stay out (rolled between the two) and how deep they are (0 to 1); minutes overrides the roll. It is kept with the person, not the body: they are still out when the player comes back to the room, after a save, or when carried somewhere else (Actor:joinParty(); Actor:leaveHere([hours]) puts them down at the current place instead of sending them home). They come to by themselves once the game clock passes it, or now with Actor:wakeUp(). Actor:isUnconscious(), Actor:unconsciousMinutes(), Actor:unconsciousDepth().

json{
  "unconscious": {
    "activity": "hurt_lying", "freeze_after": 2.5, "mood": "Unconscious", "wake_mood": "Scared",
    "causes": { "strangled": { "minutes": [4, 20], "depth": 0.35 }, "sedated": { "minutes": [240, 600], "depth": 0.95 } }
  }
}

Only actions with TARGET_OUT = true are offered on someone unconscious or dead. A sex scene with someone out cold plays the positions tagged CanBeUnconscious, forced, and they stay out after it; someone who passes out from pain during a scene is knocked out with the sex_pain cause when it ends. The player is never knocked out. ul_Unconscious ships the causes and the actions on them.