Characters & assets

The free hand

Touch mode (the player's own hands on someone's skin) and the placement data behind it, BodyResponse/placements.json.

The player can touch someone with their own hands instead of picking a touch from a menu: point at the skin, hold a mouse button to put a hand there, drag to caress, let go. The hand stays on the skin whatever the body does (breathing, squirming, a clip playing, the body's own answer). The body that touches places itself the way people do, standing, bending, crouching or kneeling, from poses taken from the game's own animations.

Touch mode

Outside a scene nothing changes until the player enters touch mode: the Touch petal of someone's menu, or the T key with the pointer on them. In a sex scene, the scene's Your hands petal or T. Esc or Let go leaves it.

Input What it does
Left button held the left hand on the skin under the pointer; drag to slide it
Right button held the right hand
Space held the mouth (a kiss; with Lick on, the tongue)
Middle drag turns the camera (Shift: pans it)
Wheel zooms
Gamepad triggers the left and right hands; A the mouth; Start leaves

The bar at the bottom picks the hand's shape: Caress (flat), Grip, Two fingers (into an opening: the mouth, the vagina), Knead, Tickle, Both (the thumb in one opening and a finger in the other), Cover (a hand over the mouth: the voice is muffled and she fights it), Stroke (a closed hand along a penis from base to glans, at the gesture's rhythm), Pinch (fingertips, a nipple). Leave the hand keeps the next hand released where it is, still moving; the next press of that button takes it back. A pill per hand left in place lets go when clicked. The rhythm follows the gesture's speed.

In a sex scene the clip keeps the body: the arm reaches as far as it can from the position, and the bodies shift up to 15 cm when that makes the reach, and a spot still out of reach is refused ("Not reachable in this position"). Nobody under 18 is ever touched or touches in touch mode.

The petal is data: any intent of a .ulintents file with SCREEN = "touch" opens touch mode instead of a list (ul_Base/Actions/ul_base.ulintents has the "Touch" one).

placements.json

<mod>/BodyResponse/placements.json. A later mod replaces entries by key in each block.

places

The places a hand can be put on in touch mode, by name. The pointer finds the nearest place this body has; a place made for the current shape counts 10 cm nearer (two fingers at the crotch is crotch_fingers, a flat hand there crotch, a stroke on a man penis_stroke).

json"places": {
  "crotch_fingers": { "zone": "crotch", "shape": "two", "opening": "vagina", "depth": 3.5,
                      "enter": ["pelvis"], "spread": 14,
                      "sides": { "any": ["front", "behind", "left", "right"], "lying_back": ["feet", "left", "right"] } }
}
  • zone: a place of Interactions/*.ulzones (where on the body).
  • shape: flat, grip, knead, tickle, cover, two, both, stroke, pinch, kiss, lick.
  • region: face, chest or lower. A pose saved with the posing editor's Touch Pose button serves only places of its own region.
  • face_ok (optional): the toucher's face may be at the skin for this place. Otherwise his face keeps about 12 cm from the touched body, the genital part included (a face pressed to a groin reads as oral, not a hand).
  • needs: what the touched body must have for it, ["penis"] or ["vagina"]; the place is not offered elsewhere.
  • with: {"place": "penis", "shape": "grip"}, the other hand on another place at the same time ("both" on a man: his penis held while the fingers go in). Both hands let go together.
  • opening, opening2: openings of Bodies/*.ulzones the fingers go into; depth: how far past the entrance, cm.
  • enter: the body parts (hull tubes: pelvis, head...) the fingers may go into; everywhere else the hand stays out of the skin.
  • spread: how far (cm, between the knees) the touched person parts her legs for it (standing, a half step). spread_by_posture gives it per posture of the touched body, e.g. {"sitting": 24}.
  • A place with a vagina opening is offered only on a body whose genitals are a vagina. For both, the opening nearer the toucher takes the thumb.
  • sides: where the toucher may stand, by the touched person's posture (standing, sitting, kneeling, lying_back, lying_front, all_fours, or any). Lying, the sides are head, feet, left, right. From a side not listed, the toucher walks round to the first one listed; an empty list means not from that posture at all.

Body zones (Interactions/body.ulzones) may lie on the genital part: "mesh": "genital" (the penis and the testicles are their own mesh). A body without that part has no such zone.

touch_lines.json

BodyResponse/touch_lines.json holds the narration: one line shows on the one touched when a hand has reached its place, and a scene writer can ask what hands are doing (DescribeTouches). Keys are <motion>@<zone> first, then <motion>; {A} is who touches, {B} who is touched. A later mod's key replaces an earlier one's.

json"lines": {
  "stroke@penis": ["{A} strokes {B}'s cock from base to tip."],
  "caress": ["{A} runs a hand over {B}."]
}

poses

The toucher's base poses: a moment of a clip in which a body reaches someone. The placement starts from one and the arm only carries the hand the last centimetres. A pose made for one hand serves the other mirrored.

json"poses": {
  "wall_fingering_idle_1_r2_r_020": { "clip": "newMotions/couple.intimate/wall_fingering_idle_1_2M.ulanim",
      "time": 0.2, "loop": false, "hands": "r", "posture": "stand", "zones": ["crotch", "crotch_fingers"], "mouth": false }
}
  • clip (under Animations/), time (s), loop (played on around time, so the body keeps living under the hand).
  • hands: the hand(s) that reach (r, l, lr); mouth: the mouth is what reaches.
  • posture: its height band: stand, bend, crouch, kneel, sit, lie. Standing is preferred when it reaches.
  • zones: the places it was made for (a preference, not a limit).
  • plain (optional): a plain posture (kneeling, standing) with no hand on anyone; placed with the shoulder at arm's length from the spot and the arm reaching. Poses made from it with the Touch Pose button keep the reach.
  • sex (optional, default false): the moment comes from a sex position (a thrusting stance: knees bent, pelvis pushed into the partner). Such a pose is never used for a touch outside a scene.

Only poses with their supports on the floor are used, and upright ones need both feet down with the hips over them. The game's own list is generated from every couple clip (Tools/TouchMatrix); sex is set from the clip's tags in the motions index.

A placement is never shown half-reached. A placement passes only when:

  • the hand lands on its spot, palm to the skin;
  • no arm or body is in the other person or in furniture;
  • the toucher stands in a stance, not a stride;
  • his head is at least 8 cm from the other's head (unless the mouth is the tool);
  • his free hand rests away from his own groin;
  • his neck is not bent back.

When the spot is far, the toucher walks there before the hands reach; in a scene the bodies stay where the scene put them, shifted up to 15 cm when that makes the reach. A hand is refused only when no placement exists at all. The message says why: "Not reachable in this position" (a spot under her on the bed) or "Not reachable together with your other hand".

cells

One saved placement per case, keyed place|side|posture|<toucher sex><touched sex>|hand, e.g. crotch_fingers|front|standing|MF|r:

json"cells": {
  "crotch_fingers|front|standing|MF|r": { "pose": "owner_crotch_fingers_front_standing_MF_r", "mirror": false,
      "offset": [38.0, -6.5, 0.0], "yaw": 178.0, "drop": 0, "status": "to_fix", "zone_side": "l",
      "note": "hand 2.1 cm off its spot" }
}
  • pose: a base pose (usually one saved with Touch Pose, its .ulpose under Animations/TouchPoses/).
  • offset: where the pose stands from the hand's spot, in the touched body's own front/left/up (cm); yaw its turn from her front; drop how much lower.
  • status: owner (posed by hand in the posing editor: always used as it is, never overwritten by a tool), validated (a tool's placement that passes with room to spare), to_fix (the best placement a tool found, note saying what is wrong).
  • zone_side: l or r for a place with a side (a breast, a thigh): which one the spot is on.

Only the right hand and one of the left/right sides are saved: the left hand and the other side use the saved cell mirrored. Only the man-touching-woman cases (MF) are saved in full; another pair uses the MF cell, adapted by the IK to the two bodies, and has its own cell only where that adaptation does not hold. A saved pose stays a starting point: at run time the IK still adapts it to the bodies' sizes, the furniture and the hand's motion.

The posing editor's Prev Case / Next Case go through the cases, Cases picks which (to fix, validated, owner, all) and Pair whose (MF, FM, MM, FF). A case loads both people in place, her bed or seat, and the spot in green, with what is wrong written on the view. Correct the pose of the one touching, then Touch Pose saves the case as owner.