introduce mortality #230

Closed
opened 2026-10-25 10:46:36 +00:00 by sermuns · 3 comments
Owner

Very unclear to what extent.

It shouldn't be very punishing to die, just funny.

Very unclear to what extent. It shouldn't be very punishing to die, just funny.
Author
Owner

Things that can kill you

  • being hit by vehicle
  • falling from too great height

Probably a lot more as we introduce more gadgets/items.

Things that can kill you - being hit by vehicle - falling from too great height Probably a lot more as we introduce more gadgets/items.
Author
Owner

Should also have popup/toast announcing deaths, like in source games

Should also have popup/toast announcing deaths, like in source games
Author
Owner

The two causes in the thread are the right seed; the fun is in the tier below death and in the aftermath. My pitch: mortality as a running gag, not a fail state. No health bar, no damage numbers, no dropped loot, no score loss, no corpse run. You die, the campus does a short comedy routine, and a couple of seconds later you are back on your feet near where you fell. The death is the content, not the penalty.

What can kill you

Vehicles, with a tier below death. A hit needs speed and heft. A kick scooter clipping an ankle should trip you; a bike should knock you down; the shuttle should make you a hood ornament. The kind specs already know their top speeds and dimensions; a named heft (or lethality) field per kind is enough. Low speed = push or trip, medium = launch, high = obituary. If a player is driving, the feed names both: "X was collected by Y's shuttle." If the victim is the driver, the line should absolutely say so. The bus should honk first — the horn already exists. A wall at speed is the second act: detect the sudden stop and blame the wall. (wears_helmet already knows who is on a bike; maybe the helmet is the difference between a crash and a bad story. I would not make gear management out of it.)

Falls. apply_gravity already returns the touchdown speed, and Landing already distinguishes a step from a splat. That is a free three-act structure: step, splat, and, past a higher threshold, death. FootSurface already separates grass, gravel, hard, wood and water, so pavement can be the killer and the lawn can be a comic reprieve. The canopy is the skill save: a good landing is soft, cutting away too low is the "you played yourself" death. Turning off fly at altitude is the tutorial death. Do not kill on every roof jump; the existing splat is the warning shot. A fall that clips a tree could catch on the branches, burst leaves, and drop you the rest of the way — a fun stretch, not v1.

The pond. Water is a walkable surface today. Unless we give the ponds depth, drowning is just wet socks; leave it out until water is more than a paint job.

Future gadgets. A ball to the head is a knockout, not a death, unless it came from the roof. Sleds into barriers, cargo-bike T-bones, canopy collapses and car roofs all get a cause tag. Keep the cause enum append-only, so new gadgets add causes without breaking old clients.

What dying feels like

  • Three beats: hit-stop, cartoon ragdoll, respawn beam. The body goes ballistic as one rigid thing with a couple of limb flops; full skeleton ragdoll is not worth it. The existing splat pose and Beams teleport already give us most of the staging. The corpse is a pose with a timer, not a new skeleton.
  • Death cam. The camera detaches, orbits your body for a beat, and follows the vehicle for the first second if a vehicle did it. Space skips. First person gets a lurch and a tumble; third person gets the show. The world does not pause, because the campus is shared.
  • Respawn at the last safe ground, not the far spawn, with a fallback to the nearest safe support when the last ground is a long way back. Track the last place you were actually standing (grounded, not in a vehicle, not on a ledge). Fall off Kårallen and you wake up at the edge you jumped from. Step in front of the shuttle and you wake up on the sidewalk. No corpse run, no long walk, no punishment beyond the joke.
  • A short spawn shield so the bus cannot double-tap you while the beam fades.
  • Keep everything. Items, goals, event score, the ball. The only cost is the couple of seconds you spent lying there. If we ever add gadgets that can be lost, do not make death the way they are lost.
  • Voice and chat stay live while dead. A dying scream is half the fun, and voice is already proximity-based. The dead can talk; they just cannot move.

What everyone else sees and hears

  • The feed. This is the Source-style toast from the thread, but server-composed from a cause code, not free-form text: "X was turned into a hood ornament by Y's shuttle", "X checked the pavement's structural integrity", "X's canopy had other plans", "X trusted the sky." The victim gets the big card; everyone else gets a small fading line top-right. Deaths are rare, so the feed stays a treat rather than spam. Do not reuse the single Notice slot; a death feed needs a small ring buffer. Keep it out of chat, too — chat is for people, deaths want their own color and icon and shorter life.
  • Sound. Everything is synthesized, so no new assets. A vehicle hit gets the vehicle's own horn/engine plus a wet thud; a fall gets a descending whistle and the existing landing thump with a splat tail; a first-time cause gets a tiny ascending ding. Duck the score for a bar and bring it back. A distant scream should be audible in the world, not only in the HUD; in hide and seek, a yelp from the dark is information.
  • The body stays for a moment. Leave the ragdoll a few seconds so bystanders can point and laugh, then fade it into the respawn beam. A chalk outline decal at the spot for the rest of the session is the cheapest "the campus remembers". Cap the number and send the list in the welcome, so late joiners see the crime scenes.
  • Pay respects. If the crosshair interaction finds a fresh corpse, E gives a short bow or wave and a local "F" prompt. Purely cosmetic, entirely in character.

What the wire needs

  • One new client message: Died { cause }. Only the victim's client sends it. This is consistent with players being client-authoritative; the victim's screen is the one that saw the bus. The server rate-limits it, looks up the name, resolves the vehicle's driver from its own fleet, composes the line, and broadcasts one Death { id, cause, by }. The server does not need to simulate falls or collisions.
  • Free the dead player's seat. If the server handles the death, it can also drop the rider from any vehicle; otherwise the shuttle drives around with a corpse in the driver's seat.
  • No new stance bit. The pose flags are already a full byte. The death broadcast already carries everything: each client starts a local corpse timer and animates that player lying down. A late joiner simply misses an old corpse. If a corpse ever needs to outlive the death message, add a Respawn message later, not a flag in every pose.
  • Append-only tags. An old client drops the unknown death frame and misses a joke; it does not break the handshake. The cause enum and the feed text stay on the server, so a client cannot inject a fake epitaph. A per-player death count for the F3 panel and results screen can be session-only, computed from the death messages since connecting.
  • Who judges? The victim's client. The server owns the bus, but the player owns the body, and the codebase already says the player is the source of truth. A server-side hit test would have to guess the victim's sub-tick path and would make near misses feel wrong.

The wild part

  • Death bingo. A small card in the inventory or settings panel; each first-time cause stamps a square. "Run over by the shuttle" is the free space. No rewards, no progression, just a conversation piece and a reason to try the stupid thing once. Session-scoped, because we have no accounts.
  • Chalk outlines as the physical bingo card: the campus slowly fills with the stupid things people did. This is the closest thing to a persistent world change and it costs one decal per death.
  • Darwin award at event results: the most spectacular death of the event by impact speed and airtime, announced without deducting points. A death count is a badge, not a penalty.
  • Event hooks. A death never removes a participant or their score. In hide and seek, a corpse is out of play; if a hider dies, the seeker hears it but does not get the tag. A future "Rush hour" (cross campus while the shuttle runs) or "Splat contest" (the hardest landing you can walk away from) becomes a data problem, not a new game.
  • Mortality setting. Because the issue is controversial, make it personal: mortality: funny by default, off for people who just want to build and fly. An immortal player never dies but still sees everyone else's chaos. Events should not depend on death, so the setting never changes the rules for others.

What I would not do

No health bar, no damage numbers, no armor, no respawn timer longer than the death bit, no death penalty, no PvP kill scoring. And do not kill on every bump: if death is common, the joke is gone. The rare, stupid death is the whole point.

What I would build first

  1. liuverse-sim::mortality: a pure module with Cause, Death, fall and vehicle checks, last-safe-ground tracking and tests. No GPU, no wire. Feed it the touchdown speed and the active vehicles; return a death.
  2. Hook the local client: death card, cartoon ragdoll (reuse the splat pose), respawn at last safe ground, beam. This is the whole joke offline and is testable in a film.
  3. Add the wire message and the feed, then vehicle attribution.
  4. Chalk outlines, death bingo, the sound sting, the death cam.
  5. Only then talk about event modes.

Open questions

  • Where is the fall threshold? I would keep it well above the existing splat so a normal roof jump is a splat and only the really tall stuff kills; a hard surface should matter more than raw height.
  • Does a scooter kill? I say no. It should knock you down; only the bus, car or moped at speed should kill. That keeps the bus special.
  • Last safe ground or event anchor? Last safe ground, except in an event where the anchor is the fair choice.
  • Global feed or nearby? Global feed, local sound. The feed is the joke; the sound is the world. Give the location only if the cause already gives it away.
  • Can you opt out? Yes. Mortality should be a joke you can decline.
  • Does fly mode save you? Yes; it is a debug/creative tool. But if you turn it off midair, that is on you.

If I had to pick one slice: falls + the bus + the feed + respawn. That is the whole joke, and it is playable offline before any of the social garnish.

The best version is not a health system. It is a campus that occasionally hands you a stupid death, laughs, and puts you back on your feet.

The two causes in the thread are the right seed; the fun is in the tier below death and in the aftermath. My pitch: **mortality as a running gag, not a fail state.** No health bar, no damage numbers, no dropped loot, no score loss, no corpse run. You die, the campus does a short comedy routine, and a couple of seconds later you are back on your feet near where you fell. The death is the content, not the penalty. ### What can kill you **Vehicles, with a tier below death.** A hit needs speed and heft. A kick scooter clipping an ankle should trip you; a bike should knock you down; the shuttle should make you a hood ornament. The kind specs already know their top speeds and dimensions; a named `heft` (or `lethality`) field per kind is enough. Low speed = push or trip, medium = launch, high = obituary. If a player is driving, the feed names both: "X was collected by Y's shuttle." If the victim is the driver, the line should absolutely say so. The bus should honk first — the horn already exists. A wall at speed is the second act: detect the sudden stop and blame the wall. (`wears_helmet` already knows who is on a bike; maybe the helmet is the difference between a crash and a bad story. I would not make gear management out of it.) **Falls.** `apply_gravity` already returns the touchdown speed, and `Landing` already distinguishes a step from a splat. That is a free three-act structure: step, splat, and, past a higher threshold, death. `FootSurface` already separates grass, gravel, hard, wood and water, so pavement can be the killer and the lawn can be a comic reprieve. The canopy is the skill save: a good landing is soft, cutting away too low is the "you played yourself" death. Turning off fly at altitude is the tutorial death. Do not kill on every roof jump; the existing splat is the warning shot. A fall that clips a tree could catch on the branches, burst leaves, and drop you the rest of the way — a fun stretch, not v1. **The pond.** Water is a walkable surface today. Unless we give the ponds depth, drowning is just wet socks; leave it out until water is more than a paint job. **Future gadgets.** A ball to the head is a knockout, not a death, unless it came from the roof. Sleds into barriers, cargo-bike T-bones, canopy collapses and car roofs all get a cause tag. Keep the cause enum append-only, so new gadgets add causes without breaking old clients. ### What dying feels like - **Three beats: hit-stop, cartoon ragdoll, respawn beam.** The body goes ballistic as one rigid thing with a couple of limb flops; full skeleton ragdoll is not worth it. The existing splat pose and `Beams` teleport already give us most of the staging. The corpse is a pose with a timer, not a new skeleton. - **Death cam.** The camera detaches, orbits your body for a beat, and follows the vehicle for the first second if a vehicle did it. Space skips. First person gets a lurch and a tumble; third person gets the show. The world does not pause, because the campus is shared. - **Respawn at the last safe ground**, not the far spawn, with a fallback to the nearest safe support when the last ground is a long way back. Track the last place you were actually standing (grounded, not in a vehicle, not on a ledge). Fall off Kårallen and you wake up at the edge you jumped from. Step in front of the shuttle and you wake up on the sidewalk. No corpse run, no long walk, no punishment beyond the joke. - **A short spawn shield** so the bus cannot double-tap you while the beam fades. - **Keep everything.** Items, goals, event score, the ball. The only cost is the couple of seconds you spent lying there. If we ever add gadgets that can be lost, do not make death the way they are lost. - **Voice and chat stay live while dead.** A dying scream is half the fun, and voice is already proximity-based. The dead can talk; they just cannot move. ### What everyone else sees and hears - **The feed.** This is the Source-style toast from the thread, but server-composed from a cause code, not free-form text: "X was turned into a hood ornament by Y's shuttle", "X checked the pavement's structural integrity", "X's canopy had other plans", "X trusted the sky." The victim gets the big card; everyone else gets a small fading line top-right. Deaths are rare, so the feed stays a treat rather than spam. Do not reuse the single `Notice` slot; a death feed needs a small ring buffer. Keep it out of chat, too — chat is for people, deaths want their own color and icon and shorter life. - **Sound.** Everything is synthesized, so no new assets. A vehicle hit gets the vehicle's own horn/engine plus a wet thud; a fall gets a descending whistle and the existing landing thump with a splat tail; a first-time cause gets a tiny ascending ding. Duck the score for a bar and bring it back. A distant scream should be audible in the world, not only in the HUD; in hide and seek, a yelp from the dark is information. - **The body stays for a moment.** Leave the ragdoll a few seconds so bystanders can point and laugh, then fade it into the respawn beam. A chalk outline decal at the spot for the rest of the session is the cheapest "the campus remembers". Cap the number and send the list in the welcome, so late joiners see the crime scenes. - **Pay respects.** If the crosshair interaction finds a fresh corpse, `E` gives a short bow or wave and a local "F" prompt. Purely cosmetic, entirely in character. ### What the wire needs - **One new client message: `Died { cause }`.** Only the victim's client sends it. This is consistent with players being client-authoritative; the victim's screen is the one that saw the bus. The server rate-limits it, looks up the name, resolves the vehicle's driver from its own fleet, composes the line, and broadcasts one `Death { id, cause, by }`. The server does not need to simulate falls or collisions. - **Free the dead player's seat.** If the server handles the death, it can also drop the rider from any vehicle; otherwise the shuttle drives around with a corpse in the driver's seat. - **No new stance bit.** The pose flags are already a full byte. The death broadcast already carries everything: each client starts a local corpse timer and animates that player lying down. A late joiner simply misses an old corpse. If a corpse ever needs to outlive the death message, add a `Respawn` message later, not a flag in every pose. - **Append-only tags.** An old client drops the unknown death frame and misses a joke; it does not break the handshake. The cause enum and the feed text stay on the server, so a client cannot inject a fake epitaph. A per-player death count for the F3 panel and results screen can be session-only, computed from the death messages since connecting. - **Who judges?** The victim's client. The server owns the bus, but the player owns the body, and the codebase already says the player is the source of truth. A server-side hit test would have to guess the victim's sub-tick path and would make near misses feel wrong. ### The wild part - **Death bingo.** A small card in the inventory or settings panel; each first-time cause stamps a square. "Run over by the shuttle" is the free space. No rewards, no progression, just a conversation piece and a reason to try the stupid thing once. Session-scoped, because we have no accounts. - **Chalk outlines** as the physical bingo card: the campus slowly fills with the stupid things people did. This is the closest thing to a persistent world change and it costs one decal per death. - **Darwin award** at event results: the most spectacular death of the event by impact speed and airtime, announced without deducting points. A death count is a badge, not a penalty. - **Event hooks.** A death never removes a participant or their score. In hide and seek, a corpse is out of play; if a hider dies, the seeker hears it but does not get the tag. A future "Rush hour" (cross campus while the shuttle runs) or "Splat contest" (the hardest landing you can walk away from) becomes a data problem, not a new game. - **Mortality setting.** Because the issue is controversial, make it personal: `mortality: funny` by default, `off` for people who just want to build and fly. An immortal player never dies but still sees everyone else's chaos. Events should not depend on death, so the setting never changes the rules for others. ### What I would not do No health bar, no damage numbers, no armor, no respawn timer longer than the death bit, no death penalty, no PvP kill scoring. And do not kill on every bump: if death is common, the joke is gone. The rare, stupid death is the whole point. ### What I would build first 1. `liuverse-sim::mortality`: a pure module with `Cause`, `Death`, fall and vehicle checks, last-safe-ground tracking and tests. No GPU, no wire. Feed it the touchdown speed and the active vehicles; return a death. 2. Hook the local client: death card, cartoon ragdoll (reuse the splat pose), respawn at last safe ground, beam. This is the whole joke offline and is testable in a film. 3. Add the wire message and the feed, then vehicle attribution. 4. Chalk outlines, death bingo, the sound sting, the death cam. 5. Only then talk about event modes. ### Open questions - Where is the fall threshold? I would keep it well above the existing splat so a normal roof jump is a splat and only the really tall stuff kills; a hard surface should matter more than raw height. - Does a scooter kill? I say no. It should knock you down; only the bus, car or moped at speed should kill. That keeps the bus special. - Last safe ground or event anchor? Last safe ground, except in an event where the anchor is the fair choice. - Global feed or nearby? Global feed, local sound. The feed is the joke; the sound is the world. Give the location only if the cause already gives it away. - Can you opt out? Yes. Mortality should be a joke you can decline. - Does fly mode save you? Yes; it is a debug/creative tool. But if you turn it off midair, that is on you. If I had to pick one slice: falls + the bus + the feed + respawn. That is the whole joke, and it is playable offline before any of the social garnish. > The best version is not a health system. It is a campus that occasionally hands you a stupid death, laughs, and puts you back on your feet.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
elsie/liuverse#230
No description provided.