Nimbin[12]?Games / Entropie / entropie/STATE.md

Entropie git · main

Entropie festival game; first steps

sdl c game entropie cmake · first commit 2026-10-10 · last commit 2026-11-02 (17 hours ago) · synced 8 hours ago

C 88.5% Markdown 9.1% GLSL 2.3%
git clone https://git.christianimmanuel.de/games/Entropie.gitwget https://git.christianimmanuel.de/games/Entropie/archive/Entropie.tar.gz
entropie/STATE.md 208 KB · 1763 lines raw

Entropie – dev overview

Where the game stands: everything there is, and what is still open. Updated with every version (see the version line at the end).

The story (plan)

The game is the making of a small festival on a farm in Wriezen, from the first idea to driving home after the clean-up. What's fun: getting it built with people who have their own minds, and finding out why festivals today do things the way they do.

Chapters

  1. Kreuzberg, Grossbeerenstrasse 37, 3rd floor: the first meeting - "we do a
  2. festival".

  3. The "Herberge" bar, several evenings: where (Wriezen), who leads what.
  4. Between weekends on the ground, back to the Herberge for the next decisions. The base ideas are settled here, not on the ground.

  5. The build-up on the ground (three months, played as weekends there): the
  6. floors, the snail rescue, the mowing, the wood, the shopping. Small decisions are made on the spot by whoever leads that task.

  7. The festival, Friday to Sunday. Saturday afternoon a bad storm: get
  8. everybody out of harm's way (evacuate).

  9. The clean-up: whoever is still happy to help, and the supporters (a free
  10. ticket for 2 x 6 h of work each, during the festival and after).

  11. The end: into the car and off home.

The floors

The crew (who leads what is settled in the Herberge; it can change)

How it plays

Roadmap (one release each, every one playable)

  1. The crew: one cast table with roles, the new people arriving over the
  2. first days, the crew overview (dev). (2.39)

  3. Projects and leads: the floors and side jobs as projects with stages, a
  4. lead and helpers; leads decide; mood and commitment; quitting and taking over.

  5. Materials and money: the cash box, the hardware store, boards and beams,
  6. nails, screws, paint. (2.41)

  7. The side jobs: the scythe on the Kartoffelacker, the snail rescue, Kerry's
  8. chainsaw art. (2.43)

  9. Berlin: Grossbeerenstrasse and the Herberge as places, the meetings, going
  10. back and forth between weekends. (2.44)

  11. The "why" questions and their options. (2.45)
  12. The festival (guests, the floors running, the storm and the evacuation)
  13. (2.46), the clean-up with the supporters, the drive home (2.50). In between: the big old tree and injuries (2.47).

People

YouVolkramJanaToniKurtiMartinJonas
Who–your friend, Jana's boyfriendyour friendyour friend, first timethe house is his, 74his eldest, ~30his youngest, ~25
Weight75 kg88 kg60 kg70 kg72 kg92 kg76 kg
Bearing (pride / energy / nerves)0 / .2 / .1.5 / .1 / 0.1 / .7 / .3-.3 / .4 / .6.3 / -.6 / 0.8 / .3 / .1-.1 / .6 / .2
Sporty (0..1).5.55.7.8.12 (old legs: x.52 speed).6.85
Holds drink1.01.20.80.91.41.31.0
Likes: firewood / trees / trash / fire–.8 / .3 / 0 / .60 / -.5 / .6 / .9.4 / .6 / -.4 / .3.6 / .7 / .2 / .8.4 / .9 / -.6 / .3.6 / .4 / .3 / .5
Willing–.7.8.5.4.5.85
Skills: firewood / trees / trash / fire.3 each.6 / .4 / .3 / .6.3 / .2 / .5 / .6.4 / .4 / .2 / .3.8 / .9 / .4 / .8.7 / .8 / .2 / .4.4 / .4 / .4 / .4
Tempo / thinks first (s)1 / 01 / .81.1 / .51.2 / .3.7 / 2.21.2 / .21.15 / .4
Break–coffeea chata little walksits downnonea chat
Main handrightrightleftrightrightrightleft
Peesstandingstandingstanding (Urinella)standingstandingstandingstanding
Lighteryesyes–yesyesyes–
Smokes (craving speed).3.6.2.7.8.4–
Pockets: cigarettes / tobacco / papers / filters0 / 75 / 50 / 1200 / 40 / 20 / 600 / 10 / 5 / 00 / 25 / 0 / 150 / 60 / 30 / never12 / – / – / ––
Keyscar–––house––
Wits.6.7.65.5.75.55.45
Afraid of heights.2.15.5.1.7.05.2
Worn from the days before (start).15.2.1.35.4.2.1

Everybody is one entry of world/cast.c (CastMember: look, bearing, skills, pockets, and their part: role, the Project they leads / helps, commitment, when they arrives); the table above is the first seven. The crew turning up later (hours on the ground): Kilian and Julia (2 h), Stella and Doro (5 h), Kerry (20 h), Rouven and Pascal (26 h) - roles as in "The story (plan)". Hats: Toni a red cap, Kurti a green one, Jonas and Kerry beanies, Pascal a black cap.

Alice the dog: follows, can be petted and called.

What each trait does

Needs and stats (Tab)

Energy, hunger, thirst, bladder, sleepy, drunk, dirty, sporty; skills on page two. Worn out: "worn out" shows until energy is back above 30%; no running until then.

Behaviours (people on their own)

Taking care: the practised cut even pieces (0.6 m), the unpractised by eye, up to 0.2 m off (firewood skill; ai_work.c ai_taskFor). Done with a tool (idle, wandering), careful people (ai_stackCare 0.5 and up) take it back to where it was at the start (has_home, the tool room, up to 80 m), the others put it down where they are (ai_help.c ai_putAway).

Tools they shouldn't use (ai_work.c, Ai_shouldntUse): the chainsaw with tree skill under 0.4, the axe or chainsaw drunk over 0.6. They use them anyway: a remark when they start, a close call (a stagger, "it kicked back") about every 8 s of work with it. Talking to a worker on a wood job: "Leave the <tool in hand, else chainsaw> alone" / "You can use the ... again". Told, they put it down and take another tool; they ignore it with a chance of 0.1 + 0.45 pride + 0.5 (0.5 - willing) + 0.4 drunk ("Pfft. I know what I'm doing").

ModeWhat they do
Idle / wanderstand about (fidgets, gestures), stroll near home
Drinkfetch a bottle, a few sips; empty: onto a table or crate in reach, with other empties, into the container, down at the feet, or tossed (careless, drunk, wild)
Supplyeat or drink at the apple crate / water barrel; out of Urinellas (bladder under 0.6): fill the pocket at the box by the toilet
Peehands free first (Hands_setAside: down beside them, taken up again after if still there); the toilet if free and within 40 m (waits a while, less when urgent); else a hidden spot within 40 m: behind a bush, tree, wall, building or car, away from the others; used spots welcome; not where someone else is going; standing: face it, aim at it; squatting: back to it
Wakeshake someone asleep or passed out awake
Help (G)push or lift along with you, copy what you do
Work (an order)firewood (fetch tools, fell, delimb, cut, split, stack), trees, trash (bag it, empty bags), fire (feed, light at dusk, sit by it; no working lighter: borrow one from somebody within 30 m - walk over, "Lend me your lighter"; nobody has one: ask out loud every 45 s)
Followbeing shown how, or where the woodpile goes
Approachcome to you with an offer, a question, a suggestion; left without an answer they ask again, then give up (patience: 12 s x (1 - .35 energy) x (1 - .3 pride), 5..25 s: Jonas, Mila ~8 s, Ida, Ben ~15 s) and are annoyed (+0.4, fades in 3 min: frown, less willing, no approaching while > 0.3)
Tidy uptidy ones pick up trash on the way

Pockets (src/people/pockets.c): Urinellas (POCKET_URINELLAS 4, one-time use), a lighter (lighter, lighter_uses, LIGHTER_USES 60 full; lighter_of = whose it is when borrowed). Lighter manners (ai.c lighterManners, every 3-7 s): a borrower near the owner (2.5 m, not lighting the fire) gives it back with a chance (0.45 to people, 0.12 to you; less drunk, more careful); an owner near the borrower (4 m) asks for it - another person gives it back (drunk over 0.6: "What lighter?" half the time), you get asked. Talk (hello, choice 3 instead of "Who are you?"): "Can I have my lighter back?" / "Here's your lighter back" / "Can I borrow your lighter?" (annoyed over 0.6: "Get your own").

Smoking: craving grows smoker / 300 s (world.c smoke), falls 1/90 s while smoking. NPCs (ai.c smokeBreak, quiet moment = idle, wander, sitting, a work break, fire duty; 0.98: anywhere): craving 0.75+, something in the pocket (tobacco first when both hands are free, else a ready one), a light (own lighter, or somebody within 4 m: "Got a light?") -> Body_smoke. None: bum one off somebody within 6 m (refused under 3 left, annoyed, or not willing: "Buy your own"); the player is asked. Cooldowns 20-80 s. Body (body.c updateSmoking): roll 7 s (both hands at the lap, licked at the end; waits while the hands are needed), light 1.8 s (in the lips, lighter hand and the cupping hand at the face), burns 200 s (x4 during a drag), a drag every 8-20 s (nervous: sooner) of 1.4 s, then 1.4 s breathing out (puffs every 0.14 s; a thread off the tip every 0.35 s). Hand needed: into the mouth; back to a free hand after a drag. Standing still the hand is held up in front (cig_hold). Drawn in the figure shader (cigA, cigTip, cigGlow: filter, paper, ash, ember). Butt (OBJ_TRASH made with size.x < 0, "Cigarette butt"): flicked or dropped; within 3 m of a burning fire it goes in. Down (a fall): dropped. Player K (game_actions.c smokeOrStop); talk choice 3: "Can I have a cigarette?" / "Want a cigarette?" (lighter topics first).

Smoke puffs (chips.c Chips_puff): small blocks drifting up, growing, drawn without the ink outline (Renderer_drawSmoke: no normal/depth write).

Shadows: 3x3 PCF with each tap blended bilinearly between its 4 texels (common.glsl shadowVisibility, 16 lookups): no stair steps at the edges.

Making room (ai_help.c makeRoom, every frame in AI_HELP): the leader wants to go (movement 0.2+ m/s) and the helper stands in the load's way (inLoadsWay: in front of it along that direction, within its width + 0.35 m). After 0.8 s + 2.5 x (1 - wits) the load's progress is checked (from jam_from): holding on and it goes 35 %+ of the speed: fine; else (or not holding on: shoved along) wits under 0.35 (minus 0.6 x drunk): "Why won't it move?" and nothing; else let go, "Wait - I'm in the way", and for 6 s (clear_time, clear_dir) spots in the load's way are no good spots. wits (object.h, 0.5 by default; table in scene.c; dev menu row).

Bystanders (hands.c inTheWay, in Hands_solveGrabs): people not holding a pushed load that it would go into (moved a step ahead) count against it with their weight (BYSTANDER_HOLD 1.0) and get shoved (the way it goes, shove_load its middle; cleared every frame). ai.c stepAside (not helpers, not sitting): after 0.25 + 1.5 x (1 - wits) s a quick side step to the side they're already off to (0.8 s at 1.6 m/s, no turning first); wits under 0.2: "Hey! Watch it!" and 4 s not minding it. While shoved, a standing leg against something doesn't hold the body back (physics.c steppingOver: their feet stalled against the load before, they got bulldozed along).

Onto, not over (physics.c, the player only - NPCs still step over and round): standsOn (static or STAND_HOLDS 4 kg+, a side facing straight up - boxes, planks, logs and fallen trees lying; not bottles, furniture, bins, supplies, ladders, branches, bags, trash, tools, the fire). Lower than STAND_LOWEST 0.18: not stepped over (Physics_stepsOver false), you walk onto it (tryStepUp with that most, also for loose things). Higher (up to STEP_UP_MOST, STAND_ROOM 0.2 m on top, 0.12 m across): one step up (startStepOver up, STAND_UP_TIME 0.4 s + 0.9 s/m), landing in its middle. Standing on something (feet within STOOD_ON 0.08 of its top) it is never stepped over (it holds you); standing_on (set when landing on something, every step); the object you stand on is skipped by steppingOver / startStepOver / pastTheEnd, and no leg-wait up there. A lying tree (toppled, topple 1) is no longer neverOver. pastTheEnd (player): something you can't step over or onto (neverOver, or neither a low obstacle nor standable up to STEP_UP_MOST; bottom under 1.2 m, top over 0.1 m, not light loose things) that you'd catch with up to END_CLIP 0.7 m of you (END_BODY 0.4: half width and legs), within 1.6 m: you drift past it sideways (veer_side, up to 0.45 of the speed, eased 2.5/s). Wider: you walk round it yourself.

Smooth lines (ink.frag): edgeAt looked at in 4 spots inside the pixel (rotated grid) and averaged (smoothEdge); the fill averaged over 4 taps where their luminance differs 0.04-0.14+ (smoothFill). 4x the edge texture reads: watch it on slow graphics.

NPCs onto things (1.88): the onto-step (up to STEP_OVER_HEIGHT x 1.15) and walking onto flat things work for OBJ_HUMAN too; ai.c longToStepOnto: standable loose things 1.5 m+ long and up to ONTO_HIGH 0.55 m are not in the way for steering (Physics_standsOn), so people step onto a log across their way instead of walking round; a step off says "Whoa!" sometimes. Edges (physics.c middleOverAny): a character lands on something only with its middle over one of its colliders (OVER_EDGE 0.12 m past an edge at most); else it slides off away from it (the body box's corner used to hold it in the air). world.c clutterQuery: a tilted collider (no axis within 0.98 of upright) counts with its surface at the foot (rays down there and towards it), not its highest corner (invisible steps on roofs and tilted boxes).

Buildings made of parts (1.90, world/manor.c): OBJ_STRUCTURE (one static mesh, no collision: Shapes_structure = boxes + windows / panes / doors / door frames + gable roofs, the roof split out of addBuilding as addRoof) and OBJ_WALL (static invisible boxes: the solid parts; variant 1 a locked door, clicked says its name; 2 an outer wall under eaves, for the ladder; 3 a roof slab). Not drawn when there's no mesh. The main building (Manor_build at MANOR_A/B, yaw across; local x along it, +z to the yard): left half x -18..0, z -5..5; right half x 0..18, z -4.2..5.8; ground floor FL 0.7 (4 steps of 0.175), ceiling 3.4, eaves 6.2. Left: front door x -7.6; entrance on the ground (x -9.6..-5.75, z 1.4..4.7), steps up on its left (x -9.6..-8.4, from z 2.6 to 1.4), rail along the edge, the stairs down to the basement on its right; corridor z -0.75..0.75 to the opening into the right half; toilet x -5.6..-3.75 and kitchen -3.6..0 on the yard side (bowl, counter, stove, table); a locked room and the living room on the back side; a closed store room behind your garages. Right: the big room with the 4.2 m table and 8 chairs; its door from the porch landing. Porch z 5.8..7.3: way in at x 18, ground floor, four steps up going left, landing to the door (where: see 1.91 below). The old OBJ_HOUSE main building and its wing are gone.

Main building (1.91): the porch covers the right part of the front only (x 9.5..18, door to the big room at x 11, steps at x 12.6..13.8); the right half's roof ridge runs front to back (ShapeRoof.across, its slabs tilted about z; eaves wall at its right end). Furniture faces where it should: math/linalg.h yaw_facing (fronts +Z: furniture, doors, windows), yaw_along (lengths +X), yaw_front; manor.c gives facings as vectors (FACE_PX ...). The bug was two conventions mixed (openings turned the other way round than objects). Kitchen: counter along the front wall, stove against the big room's wall, a shelf, table with two chairs. Basement (BASE_Y -2.3): stairs down on the right of the entrance (13 steps of 0.177 x 0.25, from the landing at z 4.2 going back, a rail along the well), under the corridor and the back rooms (x -9.6..-0.15, z -4.7..1.4) and under the stairs, toilet and kitchen (z 1.4..4.7); old brick walls round it (ShapeSlab.brick: mortar courses, finer than outside), loose brick walls inside with openings, no doors, loose bricks on the walls and the floor, 8 shelves. The ground goes down there: Terrain_addPit (up to TERRAIN_PITS 4 turned rectangles, kept through Terrain_init): Terrain_height is the pit floor, scene.frag doesn't draw the ground inside (holes, Renderer_setHoles). The unfinished building's walls are brick (courses) too.

Camera (1.91, game.c followPlayer): the third-person boom is pulled in by what's between the head and where it would be (5 rays: middle and 0.15 m round it, World_rayCast with static things wider than 0.35 m; the ground along it), CAMERA_CLEAR 0.25 m off it; in at once, out again at 2.5 m/s (camera_reach). Pulled in closer than 0.6 m your own body isn't drawn.

Chairs (1.91, object.c): sitting down on one pulls it out CHAIR_PULL 0.38 m (CHAIR_SPEED 0.9 m/s, a free hand on its backrest within 0.9 m), from where it stands (tucked); clear of it again it's pushed back in, once nobody stands within 0.6 m of that spot (world.c chairWaits). Sitting down is a set move: no physics meanwhile (the table pushed you off the spot before), and no carrying over (crossing) while sitting.

Ground contact (1.91, physics.c): loose things lifted to their lowest corner's ground (all 8 corners), and once at rest (SETTLE_AFTER 0.3 s) turned to lie on the ground's slope (settleOnGround, up to SETTLE_STEEPEST 0.5); logs and lying round things are stood on at their round top (world.c roundLying). On a slope they slide down (slideDown: round things grip GRIP_ROUND 0.12, flat ones GRIP_FLAT 0.5). Edges higher than SNAP_UP_MOST 0.22 m (a ramp's side, a crate) are one step up (beginStepOver, the onto-move landing STEP_PROBE ahead), not a jolt; stairs are still just walked up.

Walking (1.91, body_pose.c): the hips rise over the standing leg mid-step and drop as the other foot lands (WALK_BOB 0.022 m, more for the unfit and the bouncy), until jogging takes over; side steps: the hips stay near the middle (SWAY_MOST 0.045). The springs that follow a moving goal (hips over the character, swinging feet, hands) lagged behind it as far as they were allowed (the hips 8 cm: sideways when strafing): springStep now moves the goal on during the step.

Trees and stumps (1.91): a tree's foot flares out (FOOT_FLARE 0.12 up to 0.45 m) into roots, and its stump is that same foot (shapes_addTrunkFoot, seed Shapes_treeSeed of the spot, as wide as the trunk): nothing pops when it's felled. A felled trunk shows its sawn end (trunk_cut), it isn't hollow.

Shared code (1.91): one box ray (Collider_ray, Object_rayToCollider; the ladder's copy is gone, world.c's down ray uses it), World_rayCast, Object_reach. ARCHITECTURE.md (modules, the frame, conventions) and RULES.md (do's and don'ts), kept current.

Unfinished building (Shell_build, at SHELL_AT in the frame's frame): brick shell 6.4 x 4.7, walls 2.9, open front (2 m) to the frame (now only the front half: pillars at z -13.8 / -9.2), window holes, bare floor, tiled roof with slabs. Barn: brick courses on BUILDING_BRICK walls (addBrickCourses: mortar a shade lighter, so the ink doesn't trace it), ivy (Shapes_ivy, OBJ_STRUCTUREs) on both long sides; the woodpile (OBJ_WOODPILE "Woodpile", WOODPILE_A/B) left of the toilet, everybody's woodpile from the start (scene.c Scene_finish). Fireplace tripod: wooden poles, feet TRIPOD_OUT 0.9 m outside the stones, TRIPOD_PAST 0.4 m past the top, a lashing; each pole an OBJ_WALL along it ("Tripod pole"). Gates (FURN_GATE, green boards): in your garages' doorways (GATES: hinge, end), gate_open / gate_t, hinge, gate_shut / gate_out; Object_swingGate (1.2 s), driven by showProps; a click within 1.2 m opens / shuts both leaves.

Props that show (1.89, world.c showProps every frame): the tin's mesh is built again when its butts change (Shapes_ashtray: up to 12 show, the ash rises, a heap from 14; shown = what's built).

The ramp (scene.c addRamp via Scene_finish, after the terrain): a static plank 1.2 x 0.15 x 3.2 m, 20 degrees up, its foot on the ground, its top on a block (the loose tilted test box hung in the air at one end: loose things never turn in the physics). Tilted things in the physics (1.89): tryStepUp takes the surface just ahead of you (STEP_PROBE 0.3 m, rayDownInto), not the highest corner; the footprints (middleOver, clutterQuery) use the whole box's outline seen from above (a tilted plank's thickness had counted as narrow).

Tiredness (object.c Object_tiredness: sleepiness from 0.25 up x (1 - 0.35 energy) x (1.2 - 0.4 fitness) + 0.4 drunk): the stamina ceiling TIRED_CAP 0.55 lower, effort TIRED_EFFORT 0.6 harder, rest (awake) TIRED_REST 0.5 slower (condition.c), Object_vigor 0.25 lower (speed, jumps, work).

Balancing (world.c -> body.balance_goal from Physics_footing: 1 at a top 0.3 m wide or less, 0 from 0.75 m; body.c updateBalance): teeter is a sprung wobble (3.2 rad/s, damping 0.35) kicked at random (TEETER_KICK 40 x (0.25 + 0.6 clumsy + 1.6 drunk + 0.35 speed + 0.4 nerves) x (1.25 - 0.75 fitness)); past 1: Body_stagger sideways (stepped_off -> "Whoa - you lose your balance and step off"). Pose: arms out to the sides (the one on the tipping side lower), the hips with the wobble, the upper body against it; walking BALANCE_SLOW 0.55 slower.

Chainsaw: collider and pivot fit the mesh (the motor's underside on the ground), the bar lower on the motor (it floated).

Ladders and things in the way (ladder.c): aiming with the view also tries 0.05 / 0.1 rad above and below (thin beams); hitting a beam from below takes the side towards you. Falling over (fallOver, now with the world: Ladder_update(world, l, dt)) it stops against anything solid it goes into (caught: leaning there, CAUGHT_STEADY 0.45, lean_top if its top is over the thing; just_caught -> the game says so). Carried held up (world.c dipLadder): running into something -> dipped (raise goal RAISE_DIP 0.12, nearly flat) if flat gets it out, else steep; down and clear, up again once it would stand up at 1.36 without going into anything.

Climbing for anybody (people/climb.c, moved out of the game): Climb_ledgeAhead, Climb_start (says why not: hands, strength, drunk), Climb_update (the pull up, its feet and hands), Climb_overLadderTop; the move lives in the person (climb_move). Helpers (ai_help.c ai_followByLadder): the leader 1.2 m higher (standing, not climbing): a leaning ladder within 25 m from their level to the leader's (top within 1.3 m) - to its foot, up (ai_climbing: on a ladder or pulling over its top this runs first, whatever the mode), over the edge; none, and the leader within reach (CLIMB_REACH): walk at it and pull up where the edge ahead is at the leader's level ("Hup!"). The leader 1.2 m lower: to the top of a ladder from up there and down it; none: they just walk off (the landing does the rest). A ladder leading nowhere (no top to get off at): down again after 8 s. Ai_useWorld gives the AI the world for this.

Walking styles (Body.style[4], -1..1 per person, made from the quirks - no extra dice, so nothing else changes): feet apart x (1 + 0.15 style0), toes out + 0.04 rad x style1, the bob x (1 + 0.35 style2 + 0.25 lively), the hips swaying over the standing foot x (1 + 0.35 style3). (The audit swings both ways with it - it changes where everybody goes; overall the player's numbers are lower.)

Ashtray (FURN_ASHTRAY, an old tin on the cool box by the fire - on the ground it was in everybody's way, stored = butts): a finished cigarette within 4 m of it goes in if it's yours or the smoker is tidy (likes trash over 0.2 or pride over 0.4, under 0.6 drunk). Emptying it (ai_help.c ai_tidyUp, ASHTRAY_FULL 12 butts): somebody tidy (likes trash 0.35+), idle or wandering, a hand free, not smoking, within 50 m walks over (gives up after 45 s: skipped a while); ai.empty_tray -> world.c emptyTray: the butts into a scrap of paper ("Butts in paper", OBJ_TRASH) in the hand, stored 0; then to the bin like other trash. Trash just out of reach is skipped instead of reached for again and again (Ida stood still for minutes). Standing to pee, one hand holds it (the Urinella to the body; the side by quirk[1]), the other stays at the belt (body_pose.c). The Urinella is drawn while it's used (skeleton uri, a funnel from the body to the spout; the stream starts at its end); standing with one, a skirt or dress is lifted higher in front. You take up again what you put down to pee (ai.set_aside, within 1.8 m). The others slip off wobbly ladders like you (ai_climbing: wobble, then the ladder falls sideways).

Smoother: walking up to something (goTo) slows down as they get there (no full speed then stop, then on again); on a chat break they stay "close" until 1.6 x the chatting distance (was: one frame walking, one standing, after somebody walking slowly - the whole body shook). Arms: when the elbow's pole lies nearly along the arm (a hand going up past the shoulder) the bend leans on "out to the side" or "down and back", blended (twoBone, arms only), and an elbow moves at most 5.5 m/s (JOINT_TOP_ELBOW): no elbow flipping over (worst arm jump in the audit 58 -> 40 cm).

Night clothes (world.c dressForNight): chill 0..1 grows 1/60 s at night (21:00-7:00) away from a burning fire (drunk: slower), falls by a fire (1/60 s) or in the day (2/60 s); over 0.6 the jacket (look.top TOP_JACKET, colour per person: Figure_wardrobe) goes on, under 0.15 off. Drawn a bit bulkier, long sleeves, a zip and a darker collar. The sun logic only takes off / puts on the shirt, never the jacket. You too (game.c sunShirt: working = a stroke in the last 3 s).

Urinella, trying: a woman who never had one (urinella_tried 0), bladder 0.35-0.65, chance 0.1 + 0.2 energy per think: fetches some from the box (30 m). The first one used decides: like = 0.6 - 0.3 shyness - 0.2 (pride over 0.5) + 0.2 energy; not liked: back to squatting ("not for me"). Craving: dying for a smoke (0.8-1) adds up to 0.5 x smoker to the nerves shown. A wobble rocks the ladder (shake, 1.2 s). A heavy piece to drag and nobody to call: the player is asked ("grab it with F").

Shirt off (ai_work.c ai_sunShirt): sun_heat grows 11:00-17:30 while felling or making firewood (or helping with a tool), faster when tired; at 90 s the shirt comes off (look.top: TOP_BARE men, TOP_CROP women; not the shy, pride under -0.3), under 40 it goes back on (cools fast after 17:30). Policy "no shirt no problem" for now; maybe "no shirt no service" later.

Getting about: straight at it, round things in the way (local look-ahead); leads into a corner: a way round from the walking map (src/world/nav.c, 0.4 m grid of fixed things, A*). When fixed things change (cheap signature over all of them) only the cells round what moved, turned, came or went are done again (a table of each fixed thing as last built, by pointer; more than 32 changes at once: the whole map): a felled tree 0.3 ms instead of 10 ms, the same cells as a whole rebuild. They remember 4 things they couldn't get at. Watchdog (every behaviour except waiting ones: idle, help, follow, drink, breaks, talking, sitting): nothing happening for 25 s (150 s while working on something): let go of the target and look again; again: give the job up ("I'm stuck here").

Jobs with tools: fell, take branches off, cut a log, split, chop out a stump (axe, chainsaw, shears, hands). Talk topics: offer, ask, suggest, where (new woodpile spot), ask for a hand, ask for the tool. Shout menu: everybody, by name, the dog.

Body

Things

Ladder steadiness (ladder.c): set when it's leaned (stability): 1 - 0.7 x (degrees off 75: flatter / 15, steeper / 9), x (1 - 0.6 mud at the foot), x (1 - 0.6 x feet off level / 12 cm), a bush x 0.2, something loose and light x weight / 60 kg, only against a face x 0.85; step ladder 1. Ladder_steadiness: 1 while somebody holds it (held_by, standing within 0.5 m of the hold spot 0.6 m out from the foot), else stability. Climbing (game_actions.c ladderSlips): risk a second while moving 0.9 x (1 - steady)^1.5 x (0.3 + height / 3 m) x (1 + drunk); first a wobble (remembered 30 s), then Ladder_topple: sideways, or back off the wall when steeper than 80 deg; you come off (a fall above 0.6 m; the landing does the rest). Placed: under 0.5 "very wobbly", under 0.85 "a bit wobbly".

Sporty is quicker: pull-ups x 1 / (0.6 + 0.9 fitness) (hard ones; easy ones the square root of that), the climb over the top of a ladder too, up and down a ladder x (0.7 + 0.6 fitness) (hands and feet to the rungs as quick). Stepping over stays as it was (quicker made the legs jumpy in the audit).

Toppling (ladder.c fallOver): about its foot like a rod (theta'' = 1.5 g / length x sin theta), then it lies flat, loose. Stood up with nothing to lean on (standFree, a held-up ladder clicked at nothing): 0.6 m in front, tilted a little away, falls over once it's up. Carried slid out: nearly upright (1.36 rad, 1.15-1.52 with the view).

Holding (ai_help.c ai_holdLadder): helpers (G) hold the ladder their leader climbs; idle / wandering people with willing over 0.6 come within 12 m when somebody is on a ladder under 0.85 steady. They put things down, stand 0.6 m out from the foot facing it, both hands on the rails at 1.15 m along, the right foot on the bottom rung (Ladder_poseHands / Ladder_poseFeet), and let go 3 s after nobody is on it ("There you go.").

The work place (ai_work.c prepareSpot, before splitting or cutting a piece, once per piece, last 4 remembered): loose things up to 25 kg (not wood, tools, the woodpile) within 0.9 m of where they'd stand = messy; something fixed or 60 kg+ (not wood, trees) within 0.35 m of it = cramped. Tidy (likes trash over 0.5, or stacking care 0.65+) and only messy: they clear it ("Let me clear this away first"): each thing carried 2.2 m to the side. Cramped (or messy and not tidy) and an open spot 2.5-4.9 m away (fixed things 1.3 m off, loose 0.9 m): the piece goes there - carried (the carried piece doesn't go to the pile meanwhile), else grabbed and dragged; over 30 kg somebody idle and willing within 20 m is called ("X, give me a hand moving this?", they help like a G helper). Gives up after 45 s.

Ladder kicks (physics.c push / noteBump): a lying ladder is stepped over (only a leaning one is never), walked into it moves 0.15 of what a loose thing would, at most 0.25 m/s; walking into it counts as a bump: "Ow..." / "Ouch! My toe!" (drunk: a stagger).

One-handed ladder (game_actions.c oneHandSlip): climbing with something up to 5 kg in the other hand. Slip risk a second while moving: 0.16 x (1.3 - fitness) x (0.6 + clumsy) x (1 + 3 drunk) x (1.5 - energy) x (1 - 0.9 practice); ladder_skill grows 0.01 a second of it. First slip a wobble (3 s), the next one a fall (on the bottom rung: you just slip off).

Landing from high up (world.c landFromHigh, body.c Body_land): the fastest fall speed in the air (air_fall) at touchdown. In the air, falling over 2 m/s with the ground 0.5 m+ below: feet pulled up (knees to the belly), 0.12-0.28 s before touchdown the legs reach down. Landing: under 5 m/s nothing extra; over it always into the knees first (land_squat); going along (1.2 m/s+) from 6.5 m/s up to 8 (+1 the very sporty) a roll for the sure; up to 8.2 the knees alone (the sure); else a crash (Body_fall, -0.25 energy, dirt). How bad it was: a twisted ankle or a broken bone (see Round 2.48). The player now spawns 1 m up (was 4: that would be a crash).

Ladder: one click at a wall slides it out to fit (top on the edge, 0.9 m over it; up to its 6 m) and leans it; slid out by hand, it keeps that length. Putting it up is a 1.1 s animation (ladder.c, putUp): stood upright, slid out, tipped onto the wall; you stand still with both hands on it (game.c, puttingUp); it can only be climbed or taken once it leans.

Drink on the fire (camp.c Camp_pourOnFire, C right at a burning fire with a bottle): 0.1 l a sip left goes on as water (beer, water); enough for the fire (Camp_waterNeeded: 0.2 l + 0.25 l per kg) puts it out, else it hisses; vodka flares (the water on it is gone). Hint shows when you stand there with a drink.

Hose and fire (hose.c): each node of the rope has melt (0..1), heat and taped. Near a burning fireplace (within its flames: (0.25 diameter + 0.1) x flame size + 0.15 m, below about 1 m over it) it heats up and melts (15 s right in the flames to burn through); melted past 0.35 it leaks (12 % + more the worse it is; up to 90 % lost; it squirts onto the ground there); at 1 it's burned through: the rope comes apart there (no constraint, not drawn), nothing comes out at the nozzle, the water runs out at the break, and the end you hold is loose (no reach limit). Drawn darker the more melted, glowing while hot. Duct tape (OBJ_TAPE, on the workbench) clicked at a melted bit tapes it (grey band; no leak); burned through it won't hold. Shears clicked there cut out the run of melted bits and join the ends: the rope is laid out again along what's left (length shorter, at least 3 m). Too hot: "pull it out of the fire first". world.c water: flow scales the water and the arc.

Folding ladder (variant LADDER_FOLDING, 9.8 kg so it carries one-handed): two 2.5 m sections on a hinge (shapes_props.c, Shapes_foldLadder: the upper section swings round the hinge by extend). It is either folded (2.5 m) or open (5 m, 18 rungs); leaning at a wall it always opens fully, the putUp animation swings the upper half up. ladder.c lengthFor / rung / rungCount pick per type.

Step ladder (LADDER_STEP, 7 kg): a 1.95 m front leg with 5 treads plus a platform, the back leg hinged at the top (Shapes_stepLadder, extend = how far open, 30 degrees between the legs, each 15 off upright, so the treads are set level). Two colliders, one per leg (ladder.c fitColliders). standStep: stood up 0.45 m in front of you; a wall within 0.6 m past its back feet: back to the wall, 8 cm off; lean_top = its length when the wall top is between 0.6 under and 0.9 over its top, so the usual "over the edge" works. Feet only on the treads (top tread 1.39 m along), hands on the platform. Taking it folds it up again. NOTE: mat4_rotate_x(a) turns +Y towards -Z.

Raised ladder: slid out (extend goal > 0.5) and in hand, it's held 0.45 m up from its foot, the hand in front, the other hand higher up the rail, tipped up 60 deg in front (43-83 deg with the view pitch, eased 1.6 rad/s; ladder.c Ladder_placeHeld). A click leans it where you look (view ray, ladder length + 1.5 m; else a ray along the ladder, length + 0.8 m; a top face: the side towards you under that edge). Aimed within 0.45 m of the top it rests on the edge; lower, against the face at that height, flatter (no flatter than 55 deg: "aim at least X m up"); its foot at most 1.8 m from you. Looking down (view y < -0.6) a click slides it together; nothing aimed at: says so.

Carrying long things (ladder, logs: 0.62 m and longer): they stop at people and the dog like at walls (unless you carry it together), push them out of the way (up to 25 cm a frame), knock light loose things aside; NPCs treat a long thing someone carries as in the way and walk round it (world.c pushOffCarried, ai.c ai_blockedBy).

Clicking with a tool in hand: if there's something it could work on within its reach + 0.6 m and not behind you, the click is for the tool (or "Step up to it"), never a pick-up into the free hand (Tools_jobNearby).

Felling: a started notch is hit again by anyone whose axe reaches its height; a stroke elsewhere starts a new notch from zero (the tree is never felled at a spot hit only once, so the stump is as high as the notch you saw).

Work shows: axe strokes throw wood chips (they lie 7-10 s), the chainsaw sprays sawdust (gone in about a second), a pale band of cut wood grows round the bark where a tree, log or stump is being cut (src/world/chips.c, Object_markCut).

Piling styles: how neatly someone stacks (ai_stackCare: firewood skill and liking, clumsiness, tempo, drink, nerves, pride, energy) sets how far each piece lands off its place (pushed in, to the side, askew). Below 0.55 care a pile 3+ layers high may come down as it grows (more often the looser and higher): the top pieces slide off and are loose again ("Oops..."); they get restacked. Care 0.7 and up (object.c Object_stackFirewood): sorted by length - pieces 4 cm and more under 0.6 m take the last free place of the lowest layer with room, the others the first - and pushed in so every front end lines up (+Z side of the pile). Care 0.6 and up (ai_work.c tidyBranches, after the firewood is stacked): branches and twigs up to 3 kg lying about the work area go onto a heap 0.8 m off the end of the woodpile, two at a time (stored = on the heap). Chips are left: they're gone in 10 s anyway.

Woodpile: firewood is stacked into the lowest free place (gaps left by pieces taken off are filled first); it counts what really lies on it; a piece that fell off is loose again (gets restacked).

Bottles (beer, vodka, water), apples, bread, sausages (grill: done, dark, burnt), crates and boxes, logs, branches, firewood, stumps, woodpiles, fireplace, trash and garbage bags, the waste container, tables and garage furniture, stones, garden hose (a rope: falls, lies, drapes round things), watering can, duct tape, telescopic, folding and step ladder, axe, shears, chainsaw, trees (fruit trees too), bushes, cars, buildings.

World

The site (farm, courtyard, garages, orchard, houses, pond, field, forest), day and night, fire light. Tiled roofs have an underside under the eaves and under the overhang past the gables (seen from below it is closed). Ground: meadow wears into paths; tar, concrete, gravel and tracks are part of the ground; water soaks in by soil, runs downhill, puddles, mud.

Testing switches

Speed

A cell grid of the site (2 m cells, src/world/grid.c, built once a frame) answers "what's near here" for the ground, legs, arms, physics and steering. World update per frame (no drawing): 5 people 0.5 ms, 150 people 3.2 ms, 300 people 7.8 ms (was 3.4 / 108 / ~215 ms). For the festival (750 people, -O2, crowded round the yard): 22.3 -> 14.2 ms - a per-frame index of the people, fireplaces and stink (object.c Object_indexKinds / Object_kind: valid for that objects array and count, else everything is looked at) for the scans everybody does (fire near, stink, sleepers, who's watching, scorching, grilling), who's around for the mood from the cell grid (Condition_useGrid), and people more than 30 m from the player (25 m to come back) don't keep their feet and hands out of things (far_off: no clutter / push-out questions, which were a third of the update). Memory: 383 MB with 5 people, 408 MB with 750. Drawing (software GL here, so only relative): 5 people 216 ms, 300 people 867 ms a frame - each figure is a card whose fragment shader draws the body, so it costs by how much of the screen they cover.

Playing it (in detail)

Everything the player sees and does, area by area (the README only lists it briefly).

Look

Painted in the rotoscope style of Waking Life (2001):

Berlin and the weekends

The why questions (J: your notebook)

The big old tree (Enrico)

  1. He looks at it and puts the throw line (a little bag on a long cord)
  2. down at its foot: "A rope up high, then we pull it the other way"

  3. You throw it: pick it up, look up at the crown, T (hold to wind up -
  4. longer: harder), let go. Where it touches the crown it catches over a branch: the height is said (from about 5 to 16 m). Low? Left click at the rope's end at the foot: pulled down, throw again. Nobody throws it for an hour and a half of his time: he does it himself (6 - 7.5 m)

  5. The notch: with the chainsaw (he fetches it), on the side it should
  6. fall to (about 40 minutes of his time)

  7. "Everybody on the rope!": the nearest crew (four at most; not Kurti,
  8. nobody hurt or drunk) go out to the rope's end, 28 m out in the meadow, and take hold. You can too: left click near the end (walk off: let go)

  9. Three or more on it, nobody standing where it could come down: the back
  10. cut. People in the way get shouted at; after 45 s he cuts anyway. "It's going - PULL!" - they lean back into it

Felling any tree

Injuries

Holding on, and people

The festival (the sixth weekend)

The clean-up and the drive home

Arriving

Weather

Tents

The site

The map is Homburgshöhe at Geflügelhof Oderland, traced from the real map and satellite pictures (about 340 x 340 m).

Campfire

Cleaning up

Water and mud

World

People

Wood

An axe, pruning shears and a chainsaw are in the tool room of your garages; the forest is all around.

JobAxeChainsawShearsHands
Fell a tree124––
Take a branch off (8 per tree)1.51.51.53
Cut a log in two84––
Split a short log or half3–––
Chop out a stump147––

A tree is cut at about hip height: look down at the trunk to cut right there, look up the trunk (above your head) to cut higher, up to the chest; where you started its notch; strokes elsewhere start a new notch from scratch. It falls beside its stump and lies on the ground.

Numbers are strokes for someone fresh. Tired or drunk takes more strokes; people who like the job need fewer, and practice makes everyone better at it (skills grow with every job; Tab shows yours). Work wears you out fast: take breaks. Hold the left button to keep working.

Logs weigh what their wood weighs. Click one to hold on, call helpers and lift it together (E or click). Each person lifts about 40 kg, less when worn out. Helpers take the other end of long things, and the load is lifted evenly. Too heavy alone but not for half its weight: hold a log at one end and you lift that end, the other drags along on the ground (slower). A hand that can't reach its grip lets go and takes hold again.

A felled tree lying on the ground can be pushed or pulled (grab it, call helpers). Its branches make it heavy and snag on things in the way: pull on and they snap off. Without branches it moves much more easily.

Ladder

Talking

X talks to someone in front of you; answer with 1-5, X, right click or walk off to end it. With nobody in front, X opens the shout menu: call everybody, someone by name (the nearest three) or Alice. A shout carries about 35 m, less over a running chainsaw, less to someone drunk; sleepers don't hear it. Who hears comes over, or says why not.

Nobody waits forever for an answer: the lively and the proud ask again after a few seconds and give up soon, the shy and the slow wait longer. Left waiting, they're annoyed for a while: it shows in the face, they say no more often and don't come to you for a bit.

Smoking

Day and needs

Sound

Saving

Changes by round

What each version since 1.92 added (older ones are folded into the sections above).

Round 1.92:

Round 1.93:

Round 1.94:

Round 1.95:

Round 1.96:

Round 1.97:

Round 1.98:

Round 1.99:

Round 2.0:

Round 2.1:

Round 2.2:

Round 2.3:

Round 2.4:

Round 2.5:

Round 2.6:

Round 2.7:

Round 2.8:

Round 2.9:

Round 2.10:

Round 2.11:

Round 2.12:

Round 2.13:

Round 2.14:

Round 2.14.1:

Round 2.15:

Round 2.16:

Round 2.16.1:

Round 2.17:

Round 2.18:

Round 2.19:

Round 2.19.1:

Round 2.20:

Round 2.21:

Round 2.22:

Round 2.23:

Round 2.24:

Round 2.25:

Round 2.26 (cleanup):

Round 2.27:

Round 2.28:

Round 2.29:

Round 2.30:

Round 2.31:

Round 2.32:

Round 2.33 (running and walking less stiff):

Round 2.34 (no bow legs):

Round 2.35 (Alice pants, goes round things):

Round 2.36 (rain together, view on the slope):

Round 2.37 (umbrellas blown inside out, hats):

Round 2.38 (a shelter in the yard):

Round 2.39 (the story starts: the crew):

Round 2.40 (projects and leads: the floors get built):

Round 2.41 (materials and money; the start shows the way; the pavilions; the GPU rests):

Round 2.42 (the pavilions in front of the house; sitting at a beer table; Kurti shows you all the way up):

Round 2.43 (the side jobs: the scythe, the snails, Kerry's art):

Round 2.44 (Berlin: the meetings and the weekends):

Round 2.45 (the why questions):

Round 2.46 (the festival):

Round 2.47 (the big old tree, injuries):

Round 2.48 (no falling through, landings, the old tree, any tree):

Round 2.49 (holding on, and people):

Round 2.50 (the clean-up, the drive home, the end):

Open tasks

Most important first.

The story (see "The story (plan)": the roadmap)

Bugs

Body and moving

People

Saves, still to do

Tools for us

Scale


State of entropie 2.50.0 (build 6409893)