cantbreathelethal[ WITNESS // RESTRICTED CLINICAL ARCHIVE ]
THIS FILE DOCUMENTS AN ACTIVE BIOLOGICAL SIMULATION OPERATING ON A LIVE HOST.
THE SUBJECT OF THIS FILE IS THE READER.
DOOMED
Clinical Archive - Complete Systems Reference
Internal Summary
WITNESS maintains a knowledge archive for every character. It is an observational record, not a list of unlocks: it holds what that body has personally survived, and a body that has never been opened has nothing written in it. Most players never see the majority of it.
This document is the unredacted copy. It describes every system the simulation runs, including the ones it never announces, the thresholds it never displays, and the interactions between them that are only visible from inside the code.
Where this file states a number, that number is the one the game uses.
PART I - THE SUBJECT
Pain, Consciousness and Death
In Doomed you do not die when your health bar empties. You die when your brain reaches zero, and nothing else ends a character. Everything lethal in the mod - bleeding, a stopped heart, suffocation, sepsis, cold, poison - works by driving that one number down, which is why a body with no pulse and no blood is still technically alive and still savable. Between full alertness and brain death sits a long, playable middle: pain that eats your consciousness, a consciousness ceiling built from a dozen competing caps, a collapse state you crawl in, and one borrowed minute that the mod will offer you exactly once per life.
Brain death
One line in the entire mod is lethal. DeathHandler asks the same question every tick: has brain health reached zero with no last stand running. If it has, the run ends. Anything short of that is a living character, however ruined.
That single gate is what makes a Doomed body behave the way it does. A stopped heart, 0.1 litres of blood, both legs gone, lungs full of fluid - a character in that state is alive, because lethality is asked about the brain and about nothing else. The rest are upstream causes. Each drains the brain at its own rate, and the drain is what kills. A transfusion five seconds before the brain empties saves the character completely. The same transfusion a second after it empties saves nothing; the check has already fired.
So the survival clock is always the brain readout on the tablet rather than whichever vital is loudest. Two players at 0.8 litres of blood sit on different clocks if one of them is still haemorrhaging, because the drain rate scales with the bleed. Read the brain number, work out which drain is open, close that one.
The vanilla health bar was cut out of the lethality question deliberately. Every single incoming hit is capped to leave at least 1 hp, with two exemptions: the /kill command and falling out of the world. A modded projectile that advertises itself as bypassing invulnerability gets capped like everything else and still has to bleed you out. Should something slip past both cap layers and fire a real death event, that event is cancelled, health is restored, and the player is routed into the ordinary Doomed death sequence carrying the violent cause.
NEURAL FAILURE
doomedmatu.vitals.neural_failure
The vitals ring draws this label over a circle filled from brain/100, so the one number that ends a run is the one the terminal readout is actually drawing.
The vanilla health bar is not connected to death at all
Every single incoming hit is capped to leave you at 1 hp, at two separate layers, and only the /kill command and falling out of the world are exempt. A lethal event that somehow still fires is cancelled outright, your health is restored to full, and you are routed into the bleed-out model instead. Nothing you can be hit by will kill you in one blow.
FRAGMENT 13-B - CERTIFICATE, FINAL LINE
SUMMARY: The clinical record as a body goes down and stops. One entry per kind of event, not per occurrence: the first time each happened, and a count of every time after.
RESPONSE: "Unconscious." Then "Agonal." Then "Blood under 2.5 L." Then, appended by the death itself and always last, "Brain death."
FINAL NOTE: From the enum's own header: "A kind ships with ALL of its write sites or it does not ship. A line that fires from two of fourteen paths is worse than no line at all, because an absence on this screen reads as 'nothing happened' and the whole claim of the certificate is that it records what did." The ids are permanent and are never reused, even for a kind that gets deleted.
~/body/ClinicalKind.java - constants DOWNED(16), AGONAL(19), BLOOD_FLOOR(13), CLOSED(20); written from DeathHandler.java:74
The clocks
One gate means the survival game is really a question of which drain is currently open. There are several. They run at wildly different speeds, and two of them refuse to stack on purpose.
Oxygen starvation is the slow one. It keys on oxygen DELIVERY rather than saturation, and delivery is saturation multiplied by red cell mass and by perfusion, so a saline-filled body reads 100 percent on a pulse oximeter while it starves. Below 33 percent delivery the brain loses 0.28 percent per minute for every point under the line. At total delivery failure that is about 9.2 per minute, roughly eleven minutes from a full brain to death.
Circulatory collapse is the fast one. Systolic pressure under 10 with consciousness under 5 takes 1.5 per second, a little over a minute from full. Almost every fatal chain in the mod ends here.
Critical exsanguination sits between them. Below the knockout blood line the brain drains at up to 50 percent per minute, scaled by how far below the line the body has fallen, then multiplied by up to 2.5 times by how hard it is still bleeding. A body torrenting from open stumps dies far faster than one that merely went quietly low, at identical blood volume.
The hypoxia drain and the exsanguination drain both switch themselves off while circulatory collapse is running, so three clocks never share a body at once. Stroke takes 0.025 per second while it progresses. Radiation, liver toxaemia, prion disease and severe overheating each take their own share. Against all of that, the brain heals passively at 0.008 per second, about an hour and three quarters to climb from 50 back to 100.
IV volume expander; adds blood, thins it, eases thirst.
tooltip.doomedmatu.saline
The tooltip sells volume. The hypoxia drain reads delivery, which counts red cell mass, so the litres saline adds are not the thing the drain is measuring.
The exsanguination drain and its haemorrhage multiplier are both computed inside BloodHandler off the live bleed rate, so anything that slows the leak - a pressure hold, a clotting agent - moves this brain clock directly rather than by way of blood volume. Blood and Circulation
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Critical oxygen delivery threshold | 33 percent | ~/body/RespirationHandler.java:73 |
| Hypoxia brain loss | 0.28 %/min per point below 33 | ~/body/RespirationHandler.java:79 |
| Brain death time at zero oxygen delivery | about 11 minutes | ~/body/RespirationHandler.java:246 |
| Circulatory-collapse brain drain | 1.5 %/s at systolic <10 and consciousness <5 | ~/body/CardiovascularHandler.java:65-67 |
| Exsanguination brain drain at empty | 50 %/min, x1 to x2.5 by bleed rate | ~/body/BloodHandler.java:57-61 |
| Bleed rate that maxes the haemorrhage multiplier | 1.5 L/min | ~/body/BloodHandler.java:59 |
| Passive brain regeneration | 0.008 %/s | ~/body/ConsciousnessHandler.java:54 |
| Stroke brain drain | 0.025 %/s while progressing | ~/body/CardiovascularHandler.java:75 |
The agonal drain
There was once a reachable state where a player could not act, could not recover and could not die. The agonal drain closes it.
Unconscious - consciousness at or below 30 - and physiologically failing at the same time costs the brain 0.35 percent per second. Roughly five minutes from a full brain. About 43 seconds from the brain value where the last stand is offered.
Failing is doing real work in that sentence. The drain runs only where at least one of these holds: a bleed faster than 0.25 litres per minute, blood oxygen saturation under 70, systolic pressure under 60, blood volume under 1.8 litres, sepsis over 60, or liver toxaemia over 60. A body that is merely knocked out and otherwise stable stays untouched by it. Concussion sleeps itself off. A treatable cap holding someone under leaves them alive to be treated.
Sleeping and napping are exempt outright. Rest forces consciousness down to 10, and the exemption is what keeps an ordinary night in bed with a scratch from registering as an agonal collapse.
The drain resolves through the ordinary brain-death gate rather than through a kill of its own. That matters. The last stand can still fire out of an agonal collapse, the death receipt still names a real cause, and the bled-out achievement still applies.
Sleeping is exempt from the drain that ends a hopeless collapse
Sleep and napping force consciousness to 10, which is well below the agonal drain's unconscious threshold of 30. Without an explicit exemption an ordinary night in bed with a minor untreated injury would count as an agonal collapse and quietly kill you in your sleep. The exemption is checked before anything else in the drain.
The ceiling
Consciousness rises only as far as the lowest cap currently imposed on it. Every system that can cloud a head computes its own maximum, the lowest of them wins, and actual consciousness eases toward that. Raise a value that is not the binding cap and nothing moves. That is the single most common mistake players make over an unconscious teammate.
The caps, and what each is worth. Blood loss draws a straight line between the two configured blood lines: at the grace line (2.5 litres by default) the cap is 60 and the body still functions, at the knockout line (1.5 litres) the cap is 20 and locked out, and the line continues to zero a little below that. Head trauma caps at head muscle health times 1.6, floored at 20, so a beaten head concusses without pinning anyone at zero forever. Oxygen delivery caps at delivery times 1.2. Sedative caps at 100 minus the sedation load. Exhaustion caps at energy times 4.2, floored at 31, and that floor keeps tiredness alone short of a full faint. A bad rest caps at 70. Severe nausea caps at 150 minus sickness. Radiation caps at 100 minus 0.7 per point. Brain damage caps at the brain value directly. Sleeping or napping caps at 10. Terminal kuru carries its own cap.
On top of the caps, pain above 75 subtracts from the target point for point. Systolic pressure under 60 caps at 18 while blood is still above the knockout line, and at a flat 0 once it is not. Pain-shock past 0.66 forces the target to zero outright and overrides everything above it.
The movement is asymmetric on purpose. Consciousness falls at 12 per second and rises at 3, so a character blacks out four times faster than they come round.
Consciousness reads as a percentage on the tablet. Three values on that scale gate anything.
At 30 a character stops counting as conscious. Below it they collapse, and they stay down. The agonal brain drain reads the same line, and the HUD marks it with the Incapacitated moodle.
At 20 your hands stop. Below 20 the server cancels block placement, block breaking, block use, entity interaction, item use and attacks; movement is zeroed separately. Exactly one item is exempt, and it is Revivol, the smelling salts, precisely so you can fumble it out as you go under. The same line takes the screen to a near-solid black at 96.5 percent opacity, and starts the timer that bounds self-treatment.
At 5, combined with a systolic pressure under 10, the body is in perfusion collapse and the brain is being taken at 1.5 percent per second. The vitals widget paints that one red.
The grey-out below full alertness is cubed rather than linear, which was a deliberate fix. It reaches 21 percent at consciousness 40 and 49 percent at 30, so vision fails hardest across the last few points before the drop instead of blinding a player who is still standing and fighting.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Consciousness at the grace blood line | 60, at 2.5 L default | ~/body/ConsciousnessHandler.java:27 |
| Consciousness at the knockout blood line | 20, at 1.5 L default | ~/body/ConsciousnessHandler.java:86 |
| Head-trauma cap | head muscle x 1.6, floored at 20 | ~/body/ConsciousnessHandler.java:39-41 |
| Oxygen-delivery cap | delivery x 1.2 | ~/body/ConsciousnessHandler.java:43 |
| Exhaustion cap | energy x 4.2, floored at 31 | ~/body/ConsciousnessHandler.java:45-47 |
| Sleep cap | 10 | ~/body/ConsciousnessHandler.java:49 |
| Bad-rest cap | 70 | ~/body/ConsciousnessHandler.java:51 |
| Pain penalty threshold | above 75, point for point | ~/body/ConsciousnessHandler.java:33 |
| Circulatory-collapse cap | 18 above knockout blood, 0 below | ~/body/ConsciousnessHandler.java:31, 201-206 |
| Fall and rise rates | 12/s down, 3/s up | ~/body/ConsciousnessHandler.java:74-75 |
| Conscious threshold | above 30 | ~/body/DownedStateHandler.java:268 |
| Hands-stop threshold | below 20 | ~/body/IncapacitationGate.java:28 |
| Only item usable below 20 | Revivol | ~/body/IncapacitationGate.java:60 |
| Blackout opacity below 20 | 0.965 | ~/client/hud/VisionEffectsOverlay.java:245 |
| Grey-out at consciousness 40 / 30 | 21% / 49% | ~/client/hud/VisionEffectsOverlay.java:991-1001 |
| Perfusion collapse | systolic <10 and consciousness <5 | ~/client/ClientDoomedData.java:1144 |
Pain
Pain is computed per limb and then aggregated, and the two halves of that behave differently.
Each limb eases toward a resting target every tick. The target starts at 15 and is adjusted from there: minus 0.15 per point of intact skin, plus 0.1 per point of infection, plus 0.35 per point of active bleed, plus 0.6 per point of burn, plus 0.8 per point of frostbite above 40, plus up to 18 for a retained arrow, and plus 28 for an unsplinted fracture or 10 for a splinted one. A limb lying open on a surgical table adds its own ache. The whole target is clamped to the 0 to 100 range.
Acute injuries land outside that target. A dislocation adds 40 to 80 on the spot, a fracture adds 60 to 100, a burn adds its own spike, and each spike then decays back down toward the resting figure. Pain falls at 1 per second and rises at 0.6, so a spike drains away noticeably faster than a slow ache builds. Deep cold below 32 degrees subtracts 5 per second from every limb. A freezing body stops feeling its wounds.
Moving on an unsplinted broken leg adds 12 pain per second on top of everything else, multiplied by 1.8 while sprinting and scaled by how fast the ground is actually going past. Standing still stops it climbing.
The number on screen is the worst single limb rather than the average, taken against transformation spurt pain, amputation pain and kuru pain, whichever of them is highest. A septic rigor adds up to 18 over that as a whole-body term. Adrenaline is subtracted last.
The HUD moodle appears above 10 as Sore, becomes Pain above 30, Severe Pain above 55, and Agony above 80.
Right-click to pull about 4 C of core heat out of yourself. It works in any climate, and it stops at 34.5 C, which is already cold enough to be its own problem.
tooltip.doomedmatu.cold_pack
The item stops itself at 34.5 C, comfortably above the 32 C line where every limb starts shedding 5 pain per second.
The 32 degree numbing line reads core temperature from the survival temperature model, which also supplies a separate consciousness cap curve on the same value - a body cold enough to stop feeling its wounds is already being dulled twice. Needs and Survival
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Resting pain target base | 15 | ~/body/PainHandler.java:27 |
| Bleed contribution to resting pain | 0.35 per point | ~/body/PainHandler.java:33 |
| Unsplinted vs splinted fracture ache | 28 vs 10 | ~/body/PainHandler.java:53-54 |
| Pain fall / rise rate | 1.0/s down, 0.6/s up | ~/body/PainHandler.java:63-64 |
| Cold numbing | -5/s below 32 C | ~/body/PainHandler.java:66-67 |
| Moving on an unsplinted broken leg | +12 pain/s, x1.8 sprinting | ~/body/PainHandler.java:58, 136 |
| Septic rigor whole-body ache | up to 18 | ~/body/PainHandler.java:21 |
| Moodle thresholds | 10 / 30 / 55 / 80 | ~/client/hud/DoomedHudOverlay.java:1618-1632 |
Cold silently deletes your pain, and your ability to read your own injuries
Below 32 degrees core temperature every limb loses 5 pain per second, on top of the resting target it was easing toward. A badly hurt body in deep cold reports almost nothing. The wounds are still bleeding, still infected and still driving the consciousness caps.
The mask
Felt pain is the worst limb minus 0.35 per point of adrenaline. A full 100 adrenaline is 35 points of relief, which dulls a bad wound and leaves it legible. The mod deviated down from its source material here on purpose, so that a real injury still breaks through mid-fight.
The timing is the important part. The mask reads a smoothed adrenaline value that chases the raw one at 4 points per second. A sudden spike of 80 from a landmine or a compound fracture therefore numbs nothing at the moment it arrives. The pain flashes at full strength at the instant of the hit, the screen reddens, and only then does the numbing take hold over the following seconds. Wire the mask to raw adrenaline and the landmine never reddens the screen at all.
Adrenaline decays at 1.7 per second, so a spike is worth about a minute at most. Melee hits add a small amount. A dislocation adds 75. An amputation, a limb torn off by a fall, or being recognised by a deep predator all push it near or to the ceiling. Epinephrine adds 1.5 per millilitre. A runner's high raises the floor.
The mask is subtracted from the same number that feeds the consciousness penalty and pain-shock, which makes adrenaline genuinely protective. It can hold you under the pain-shock threshold long enough to finish what you were doing. Then it decays, and everything it was holding back arrives at once.
A combat auto-injector.
Slam it in (right-click) for an instant hit of stimulant,
adrenaline and oxygen - to push through a crisis.
Do not redose while the first pen is active: the second
stacks directly onto it and crosses into stimulant overdose.
tooltip.doomedmatu.combatpen
The adrenaline arrives instantly. The relief does not - the mask chases the raw value at 4 points per second, so the pen's numbing lands seconds behind the pen.
ThreatEncounterHandler writes the floor directly: 85 once a Deep Maw has recognised you, 90 once you have taken it past the focus damage fraction, so the mask deepens as the encounter escalates and lifts hard when the thing leaves. Threats
Adrenaline is kept in DrugHandler alongside the opioids, so its 1.7 per second decay and the last stand's +5 per second pin are tuned in the same file as opioid reception, tolerance and the epinephrine restart roll. Drugs and Pharmacology
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Adrenaline pain mask | 0.35 pain per point | ~/body/PainHandler.java:71 |
| Mask ramp rate | 4 points/s toward the raw value | ~/body/PainHandler.java:75 |
| Adrenaline decay | 1.7/s | ~/body/DrugHandler.java:55 |
| Dislocation adrenaline spike | +75 | ~/body/CombatRouter.java:686 |
| Deep Maw encounter adrenaline floors | Deep Maw encounters only, in three tiers. FOCUSED (it has recognised you and you have already taken off FOCUS_DAMAGE_FRACTION of its health) raises adrenaline to at least 90. | ~/body/ThreatEncounterHandler.java:130 |
| Opioid pain relief | 0.3 pain/s per point of reception | ~/body/DrugHandler.java:33 |
| Non-opioid analgesic relief | 0.1 pain/s per point of level | ~/body/NsaidHandler.java:26 |
The pain flash lands before the numbing does
The adrenaline pain mask uses a smoothed adrenaline value that chases the raw one at 4 points per second, not the raw spike. A landmine or a compound fracture therefore reddens the screen at full strength at the instant of the hit, and the numbing only takes hold over the following seconds as the smoothed value catches up.
Two shocks
Two separate systems with separate consequences, and the tablet names them differently for a reason.
Pain-shock is a 0 to 1 meter. It builds while felt pain sits above 75 and ebbs while it does not, at a rate that takes 30 seconds to fill or to clear completely. Past 0.66 it forces the consciousness target to zero regardless of every other cap in the stack, so a character blacks out from pain alone on perfectly good blood, oxygen and pressure. Roughly 20 seconds of sustained agony will do it. This is the knockout Revivol exists to break: clearing it costs nothing but the item, and the deep causes Revivol leaves alone are the ones that would put you straight back down.
Motor-shock is a 0 to 100 value, and it governs standing rather than awareness. Pain above 99 floors it at 100. Stamina below 1 sets it to 60. Collapsing floors it at 20, which puts a gap between going down and popping back up. It bleeds off at 10 per second while conscious and only while conscious, which is the reason an unconscious body waits on the floor for consciousness to return before it gets up.
Above 10 motor-shock, nobody stands. Six seconds of recovery from a fresh collapse, ten from a stamina crash, assuming nothing else is holding you under.
Smelling salts in a crack-vial.
Right-click to jolt yourself back from a faint, or
right-click a downed teammate to rouse them. Clears
pain-shock and grogginess and snaps you awake.
It will NOT fix the real cause - if blood loss or
suffocation is putting you down, the jolt just fades.
The whiff stings.
tooltip.doomedmatu.revivol
The tooltip and the code agree exactly, and it is the only string in the mod that names pain-shock out loud.
Pain-shock knocks you out with perfect vitals
Pain above 75 builds a separate meter that fills over 30 seconds. Past 0.66 it forces the consciousness target to zero, overriding every other cap in the stack. Roughly 20 seconds of sustained agony blacks you out on full blood, full oxygen and normal pressure. Revivol clears it instantly and costs nothing but the item.
The floor
Three conditions each drop a standing body on their own: unconsciousness (consciousness at or below 30, or a brain at zero), leg capability under 0.25, or motor-shock above 10. Collapsing floors motor-shock at 20.
A downed player is forced into the vanilla crawl pose. Other players see a prone body on the ground, and only a genuine high-speed fling swaps in a ragdoll puppet. Your own hop is cancelled while an actual launch from an explosion or a jump pad survives, because being thrown is the whole point of being ragdolled. Movement drops to a crawl at 0.22 of base speed while conscious, and to zero otherwise.
Standing again needs four things true at once: conscious, motor-shock below 10, leg capability back at or above 0.25, and settled - on the ground or in water with almost no horizontal movement. Motor-shock recovers only while conscious, so an unconscious body waits on the floor until whatever is capping its consciousness improves.
Sleeping and napping are never read as a collapse. Sleep forces consciousness to 10, and before the exemption existed that ragdolled the sleeper and shook the camera over the bed view.
Being downed leaves your hands working until consciousness also crosses 20. A conscious crawling player can bandage, inject and drag themselves to their bag. That is the survivable band, and it is worth knowing exactly where it ends.
Every treatment committed on yourself routes through one check, and that check has a hard time limit.
A counter starts the moment consciousness drops below 20 and resets to zero whenever it rises back above. Self-treatment stays open for 180 ticks after passing out - nine real seconds. After that the server refuses every self-directed commit and tells you your hands will not answer you. This is the fumble-the-AED-onto-your-own-chest window, and it was sized to stop right there rather than stretch to defibrillating yourself forty seconds into an arrest.
The nine seconds are counted in real ticks and left unscaled by the server's pace factor, because the window bounds a human's reaction time rather than a simulation rate.
An active last stand overrides all of it. Through the walk and crawl phases you may treat yourself however long you have been under, because using your own items to save yourself is the entire purpose of the window. Through the final numb phase you may not. The arms are gone.
A second player treating you sits outside this system altogether. A conscious medic can work on a patient who has been out cold indefinitely, which is exactly why the self-treatment grace can afford to be so short. A matching consent system runs alongside it: treatments that would normally need the patient's agreement proceed automatically on a body that cannot answer, and a patient who explicitly refused keeps that refusal after they black out.
A muffled drone
subtitles.doomedmatu.criticalloop_unconscious
The audio swaps to this muffled bed on the same consciousness-above-30 test that decides whether a body is standing, so the soundtrack changes at the exact moment the collapse does.
Every treatment commit in the mod, yours or a medic's, resolves through CoopMedical first, so the consciousness line that stops your hands is the same line the entire treatment layer checks before it will do anything at all. Injury and Treatment
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Collapse: consciousness | 30 or below | ~/body/DownedStateHandler.java:268 |
| Collapse: leg capability | below 0.25 | ~/body/DownedStateHandler.java:238 |
| Collapse: motor-shock | above 10 | ~/body/DownedStateHandler.java:278 |
| Crawl speed | 0.22 of base | ~/body/MovementCapabilityHandler.java:130 |
| Upward velocity treated as a cancelled hop | 0.45 or below | ~/body/DownedStateHandler.java:233 |
| Self-treatment grace after blackout | 180 ticks (9 s) | ~/body/CoopMedical.java:130 |
| Consciousness that starts the counter | below 20 | ~/body/ConsciousnessHandler.java:86, 243 |
| Healer reach for co-op treatment | 6 blocks, with line of sight | ~/body/CoopMedical.java:77, 118-121 |
| Revivol consciousness jolt | +40, plus 40 adrenaline | ~/item/RevivolItem.java:43-44 |
You have nine real seconds to treat yourself after blacking out
A tick counter starts when consciousness drops below 20 and every self-directed treatment commit checks it. At 180 ticks the server refuses. The counter is deliberately not scaled by the server's pace factor, because it exists to bound a human's reaction time rather than a simulation rate. An active last stand ignores this entirely during its walk and crawl phases.
FRAGMENT 09-A - HANDS
SUMMARY: A self-directed treatment commit arrived from a body that had been under consciousness 20 for more than 180 ticks. The server resolved the patient id, found it pointing back at the sender, and refused. The same refusal fires whether the packet named the self path or forged the sender's own entity id.
RESPONSE: One action-bar line, dark red, one per attempt: "Your hands won't answer you any more." Nothing else was sent. The item stayed in the hand and the minigame never opened.
FINAL NOTE: The line is per attempt rather than per tick, so it reads as feedback and never as spam. It has no counterpart on the other side of the body. A second player standing over the same patient may work on them for as long as they like and will never see it. Nothing on screen counted down to it.
~/body/CoopMedical.java:94 and :109, gated by canSelfTreat at :142-152
The roll
The last stand is offered once per life, and only under a precise set of conditions. The brain must be at or below 15 and strictly above zero, consciousness must be at or below 30, the roll must be unspent for this life, and the server config must have it enabled. Miss the window and it is gone. Fail the roll and it is spent for the rest of that life either way.
The odds come from somewhere else entirely. They are read off your mood from roughly nine minutes ago. The mod keeps a ten-slot rolling history of mood, pushed once every 60 seconds, and the roll evaluates the oldest slot - how the character was doing before the collapse rather than during the panicked moment of it. That value goes through a smooth curve running from a 10 percent chance at the most despairing mood to a 70 percent chance at the most hopeful. Neutral mood lands on exactly 40 percent.
Two consequences follow. A character who has been miserable for ten minutes is far less likely to get up than one who has been doing well, which makes looking after your mood before a dangerous descent a real investment. And a fresh life starts with the history slots at zero, which reads as neutral, so the first ten minutes of any life sit at a flat 40 percent however the character has actually been feeling.
An injury that sets the brain to zero in a single step skips the roll, because the check requires the brain to still be above zero when it fires. An obliterating explosion, a head torn off, or a head-first landing on a server with lethal head trauma enabled kills without ever offering the stand.
The odds come out of MoodHandler's ten-slot happiness ring through getDelayedHappiness, so the mood system is the roll's only input and every other vital is ignored by it. Psychology
The last stand rolls on your mood from nine minutes ago
The survival chance is evaluated against the oldest slot of a ten-slot mood history that is pushed once every 60 seconds - how you were doing before the collapse, not during it. The curve runs from 10 percent at the most despairing mood to 70 percent at the most hopeful, landing on 40 percent at neutral. Looking after your mood before a dangerous descent is a genuine survival investment with a nine-minute lead time.
A fresh life is always exactly 40 percent for the first ten minutes
The mood history slots are zeroed when a life begins, and zero reads as neutral mood. Until real samples have rolled through all ten slots, which takes about ten minutes of play, the last stand roll is a flat 40 percent no matter how well or badly the character is actually doing.
Anything that zeroes your brain in one step skips the last stand
The last-stand branch requires the brain to be strictly above zero at the moment of the check. Obliteration by an explosion, a head torn off, and a head-first landing on a server with lethal head trauma enabled all set the brain to zero directly, so the roll is never offered even on your first death of the life.
Borrowed time
A successful stand restores nothing - no blood back, no heart restarted, and the bleed runs exactly as fast as it did. What it does is hold death at the door and make the body obey while the door is held.
The window is 1260 ticks. The first 60 are a three-second recognition sequence, unskippable, and they do not come out of your 60 seconds. The remaining 1200 ticks are those 60 seconds, under your control, split into three phases measured from the end.
For the first 30 actionable seconds you walk, at 0.9 of base speed. With one leg and no blood and a stopped heart, the body answers anyway. From 30 seconds down to 15 you crawl, and your hands still work. In the final 15 seconds the arms go: dragging yourself still works, using an item or attacking anything does not. The HUD labels the three MOTOR OVERRIDE, OVERRIDE DECAY and DISTAL FAILURE.
The movement phases are a floor rather than a ceiling. Walking and crawling GRANT a capability to a body that has lost it, and they take nothing from a body that still has it. When the grant decays at the 30-second mark it stops holding you up rather than forcing you prone, so legs that are genuinely wrecked drop out from under you while a body dying of something else keeps walking. The arms are the deliberate exception, and they are absolute - the final phase takes your hands whoever you are and however awake you feel.
Consciousness is pinned at a minimum of 45 for the whole window, which is the only reason the window is usable at all; every cap in the stack would otherwise hold you under the blackout line. Adrenaline is pinned climbing at 5 per second for exactly 63 seconds, so pain does not spend the minute for you. Everything underneath stays exactly as dead as it was. The moment the window closes, whatever was true resolves.
A monitor strikes once
subtitles.doomedmatu.laststand_chime
One strike, played on the activation packet, for a recognition beat that is deliberately a single event and never retriggered by the countdown.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Total window | 1260 ticks (63 s) | ~/body/LastStand.java:53-55 |
| Non-skippable opening beat | 60 ticks (3 s) | ~/body/LastStand.java:54 |
| Actionable time | 1200 ticks (60 s) | ~/body/LastStand.java:53 |
| Crawl phase begins | 600 ticks remaining (last 30 s) | ~/body/LastStand.java:57 |
| Arms go | 300 ticks remaining (last 15 s) | ~/body/LastStand.java:58 |
| Granted walk speed | 0.9 of base | ~/body/LastStand.java:60 |
| Pinned consciousness floor | 45 | ~/body/ConsciousnessHandler.java:20, 235-237 |
| Adrenaline gain during the window | +5/s to a cap of 100 | ~/body/DrugHandler.java:57, 194-196 |
The last stand's movement phases can only ever give, never take
Walking and crawling are granted as a floor. The game takes the maximum of what your body can naturally do and what the window grants. When the grant decays at 30 seconds it does not force you prone; it stops holding you up, so a body whose legs are genuinely fine keeps walking for the full minute. The arms going in the final 15 seconds is the deliberate exception and applies to everyone absolutely.
The stopped heart
Nothing sets a cardiac arrest flag. Arrest is derived every tick from heart rate: below 20 beats per minute is arrest, and it ends the moment the rate genuinely recovers. Fibrillation reaching 100 stops the heart, and a stopped heart holds at zero until something restarts it.
Arrest drains nobody directly. It collapses blood pressure, the pressure caps consciousness, and circulatory collapse takes the brain. That chain is the killer, and it is why the pressure deserves as much attention as the rhythm.
Chest compressions are a bridge. A valid cadence - one press every 8 to 14 ticks - holds systolic pressure at a floor of 30 while it continues; a late press between 14 and 24 ticks holds a weaker floor of 22, and only for 12 ticks instead of 20. Past 24 ticks the run breaks and starts over. Heart rate, fibrillation, blood volume and oxygen saturation all sit outside what compressions touch. They buy time against the brain clock. That is the whole of it.
A defibrillator is violent whichever way it goes. Every shock tears the chest skin by 5, spikes that limb's pain by 20, drops the patient into a collapse and crashes systolic pressure to 40, win or lose. The manual unit's success chance is 1 minus the distance between the dialled power and twice the fibrillation percentage, divided by 120, so the ideal power is exactly double the fibrillation and a 60-joule error roughly halves the odds. An AED's completed cycle converts fibrillation with certainty. Against a fully arrested heart both units top out at 20 percent, because a defibrillator corrects a rhythm rather than starting one from nothing.
Epinephrine starts one. An injected dose gives 6 active ticks per millilitre, and each of those ticks rolls a 3 percent chance to restart the heart at 60 beats per minute. A full 100 millilitre syringe is 600 ticks and close to certain. The restart hands back a fibrillation of 50, so the heart that comes back is not a steady one.
Apply pads to the chest to shock a stopped heart.
tooltip.doomedmatu.defibrillator
The tooltip names the stopped heart as the use case. Against a fully arrested heart the shock lands 20 percent of the time, and the drug is what the code relies on for the rest.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Cardiac arrest definition | heart rate below 20 | ~/body/CardiovascularHandler.java:89, 97 |
| Fibrillation that stops the heart | 100 | ~/body/CardiovascularHandler.java:263 |
| Good compression cadence | every 8 to 14 ticks | ~/body/CprService.java:25-27 |
| Systolic floor from good compressions | 30, held 20 ticks | ~/body/CprService.java:28-30 |
| Systolic floor from late compressions | 22, held 12 ticks | ~/body/CprService.java:29-31 |
| Ideal defibrillator power | 2 x fibrillation percent | ~/body/DefibService.java:97 |
| Defibrillator error tolerance | 120 joules to zero odds | ~/body/DefibService.java:41 |
| Arrest restart chance per shock | 20 percent | ~/body/DefibService.java:38 |
| Systolic pressure after any shock | 40 | ~/body/DefibService.java:44 |
| Epinephrine restart chance | 3 percent per tick, 6 ticks per ml | ~/body/DrugHandler.java:59; DrugService.java:62 |
| Fibrillation left after an epinephrine restart | 50 | ~/body/DrugHandler.java:61 |
Compressions can never restart a heart
CPR provides a temporary systolic pressure floor of 30 on a good cadence, which slows the brain clock. It touches nothing else - not heart rate, not fibrillation, not blood volume, not saturation. A defibrillator or epinephrine is what restarts a stopped heart, and a defibrillator only manages it 20 percent of the time because it cannot start a heart that has already stopped outright.
A full syringe of epinephrine is near-certain, but hands you a fibrillating heart
Each injected millilitre grants 6 active ticks, and each tick rolls a 3 percent chance to restart the heart. A 100 millilitre dose is 600 rolls and will almost always succeed, but a successful restart sets fibrillation to 50 and heart rate to 60, so the rhythm you get back is unstable and can re-arrest.
What survives
The brain reaching zero puts up the death screen, and the real vanilla death is committed at that same moment. Items drop immediately according to the server gamerules. Disconnecting on the death screen saves nobody - the kill has already landed, and the screen's continue button only respawns you.
The receipt names a cause, and it derives that cause from real state rather than decorating it. Drowning wins if the body is underwater. A violent death wins if the bleed was still above 0.02 litres per minute or the blood is under 2.5 litres, and a violent death scatters the body into harvestable flesh limbs and lootable prosthetics. Failing those, the most specific cause wins: terminal prion disease above 78, hepatic encephalopathy above 50 toxaemia, a named disease above 55, sepsis above 60, hypothermia below 30 degrees core, then cardiac causes. Dying with blood under 2.5 litres also grants the Mossified achievement, awarded a moment before the death commits.
A lethal blow landing while a transformation finishes kills nothing. Past 95 percent progress, or once the final growth stage has begun, the death is intercepted and becomes the Refusal Sequence.
Almost everything resets on respawn. Blood, brain, consciousness, pain, every wound, every amputation, hearing loss, radiation, nausea, lung tar and the last-stand roll all return to baseline, and a fresh life gets a fresh chance at the stand. Psychological trauma carries - it is a mind attribute and it stays with the character. Nicotine dependence and your smoking history survive on purpose, so respawning is closed off as a cure for addiction. Skills reset only where the server has that option enabled.
DEATH ENVELOPS YOU
doomedmatu.vitals.dead
Translated into zh_cn and never read by any code path - the vitals overlay only ever asks for dying, neural_failure, sleeping or unconscious.
DoomedDeath checks transformation progress before it commits anything, and past the final growth stage or 95 percent the kill is intercepted and becomes the Refusal Sequence. Transformation
The receipt's ordering reads straight off the disease meters - prion load past 78, toxaemia past 50, the worst named pathogen past 55, sepsis past 60 - so whichever was highest on the last tick picks the picture you are shown. Disease and Infection
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Blood volume for the bled-out death and achievement | below 2.5 L | ~/body/DeathHandler.java:25, 120 |
| Bleed rate that reads as a violent death | above 0.02 L/min | ~/body/DeathHandler.java:173 |
| Hepatic death threshold | toxaemia above 50 | ~/body/DeathHandler.java:148 |
| Prion death threshold | prion load above 78 | ~/body/DeathHandler.java:149 |
| Hypothermic death threshold | core temp below 30 C | ~/body/DeathHandler.java:152 |
| Transformation progress that intercepts death | stage 4, or past 95 percent | ~/body/DoomedDeath.java:141-143 |
| Trauma across death | persists | ~/capability/DoomedData.java:97-98 |
| Nicotine dependence across death | persists | ~/capability/DoomedData.java:3787-3789 |
FRAGMENT 13-C - MOSSIFIED
SUMMARY: Brain-death reached with under 2.5 litres of blood in the body. The grant is issued one line before enterDeath, while the character is still technically alive.
RESPONSE: Advancement, challenge frame, toast and chat announcement. Title: "Mossified". Description: "Survive the wall. Bleed out anyway."
FINAL NOTE: The datapack file carries its own note: "you didn't die to the big thing, you died to the leak. Rare enough that announcing it can't spam chat." Its criterion is minecraft:impossible, so nothing in the datapack can ever award it. One line of Java is the only route in.
res/data/doomedmatu/advancements/mossified.json; granted at ~/body/DeathHandler.java:119-121
Notes
- The last stand's odds curve is a stand-in. The original evaluates an AnimationCurve stored in a Unity prefab inspector, and inspector values never made it into the decompile - DeathHandler says so in its own comment and marks the smoothstep from 10 to 70 percent as a faithful-spirit approximation the author signed off on. Whether 40 percent at neutral mood is anywhere near what the original did stays unanswerable unless the keyframes surface.
- Nothing automated exercises any of this. No gametest names DeathHandler, ConsciousnessHandler or PainHandler, and the only test in the repo that mentions the last stand checks the keyframes of the client-side glass-fracture overlay. Every rate on this page was verified by reading the constant rather than by timing a body.
- IncapacitationGate takes the hands during the stand's final phase, and GunItem.canOperate never asks about it. That gate reads downed, refusal-pending, Corebound and consciousness at or below zero, and the trigger arrives through FirearmServerController rather than through the interact event the gate listens on - so a held firearm still fires while DISTAL FAILURE is on the HUD. Whether guns were meant to be spared the numb phase was never written down either way.
- The agonal drain's numbers came out of an audit, not out of the source. The 0.35 percent per second, and five of the six failing thresholds - the 0.25 L/min bleed, saturation 70, blood 1.8 L, sepsis 60, toxaemia 60 - carry no source citation; only the systolic 60 does. Nothing records how they were chosen, or that anyone ever sat through a hopeless collapse to see whether five minutes is the right length.
- Extreme pain floors motor-shock at 100, and a bottomed-out stamina then overwrites it to 60, in that order. A body in agony that is also exhausted therefore gets back up sooner than a body in agony alone. The mod reproduces the ordering on purpose, because in the original the later assignment won. Whether the original meant that, or simply wrote the two lines in that sequence, the decompile cannot say.
Blood and Circulation
Blood is the mod's main kill chain. You carry five litres, you lose them through per-limb wounds that each keep their own bleed rate, and death arrives as brain death once circulating volume can no longer perfuse the brain. Almost every treatment in the game touches this system somewhere: a bandage masks flow, a tourniquet masks a whole limb chain, a transfusion buys volume and cells back, and saline buys volume alone. The numbers below are read out of the running code, which is not always what an in-game tooltip or a design note says.
Five litres
A healthy body holds 5.0 L. The stored value is clamped to the range -5.0 to 7.5 L, and the negative half is real: it is the exsanguination window. Perfusion, oxygen saturation and blood pressure all read off volume, so a body at 0 L keeps falling, and the pressure collapse finishes it.
Regeneration is slow and conditional. Below 5.0 L the body rebuilds at a base 0.05 L per minute, multiplied by a tissue-repair factor (food, energy and wasting) and by a hydration factor running from 1.0 at thirst 60 down to 0.30 at thirst 0. A dehydrated, starving body rebuilds blood at a small fraction of an already slow rate. Full nutrition still means a hundred minutes from empty to full. Regeneration answers nothing while a wound is open.
Two configured lines shape the bleed-out. graceFunctionalBlood (2.5 L by default) is where consciousness starts being capped, at 60. knockoutBlood (1.5 L by default) is where the cap reaches 20 and the unconscious lockout band begins. The cap runs on a straight line between them, and the server holds knockout at least 0.25 L below grace whatever the config file says, because closing that gap turns the whole survivable window into a single-frame drop.
Below the knockout line the brain begins an agonal drain: 50 percent per minute at zero blood, scaled down toward the line, and multiplied by up to 2.5 depending on how fast the body is currently bleeding. A body torrenting from four stumps dies far faster than one that merely went quietly low.
Smelling salts in a crack-vial.
Right-click to jolt yourself back from a faint, or
right-click a downed teammate to rouse them. Clears
pain-shock and grogginess and snaps you awake.
It will NOT fix the real cause - if blood loss or
suffocation is putting you down, the jolt just fades.
The whiff stings.
tooltip.doomedmatu.revivol
The "real cause" here is the consciousness cap: 60 at the grace line, 20 at knockout.
Heat takes volume the same way a wound does but on the plasma path: an overheating body sweats blood volume off through a direct write (TemperatureHandler.java:315), so the litres fall without costing a single red cell. Needs and Survival
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Baseline blood volume | 5.0 L | ~/body/BloodHandler.java:22 |
| Stored volume clamp | -5.0 to 7.5 L | ~/capability/DoomedData.java:652 |
| Regeneration at full nutrition | 0.05 L/min | ~/body/BloodHandler.java:24 |
| Hydration multiplier on blood recovery | 0.30x at thirst 0, 1.0x at thirst 60 | ~/body/PhysiologyFactors.java:12 |
| Functional / knockout blood lines | 2.5 L / 1.5 L (config defaults) | ~/config/DoomedConfig.java:1925,1974 |
| Consciousness cap at those lines | 60 at grace, 20 at knockout | ~/body/ConsciousnessHandler.java:26,86 |
| Agonal brain drain at zero blood | 50 %/min, up to 2.5x by bleed rate | ~/body/BloodHandler.java:57,62,63 |
Bleed units
Bleeding is per limb. Each limb carries its own bleed value in source units on a 0 to 100 scale, and each unit is worth 0.015 L per minute of blood loss. The whole-body rate on the HUD and the tablet is the sum of every limb's units converted to litres per minute.
A limb bleeds only as hard as its skin is torn. The cap is 100 minus skin health, applied every tick, so a wound that has knitted its skin back loses the ability to hold a heavy bleed along with it. Bandaging a limb tends to make its bleed value stick low afterwards rather than snapping back.
What opens a bleed depends on the damage. A generic melee hit adds 2.0 units per point of damage, a claw or blade 3.0, a projectile 3.0, an explosion 1.5. A fracture opens a flat 12 units. Fire and freezing add none at all, and the generic fallback used for magic, thorns and suffocation adds none either - those tear skin and leave the blood where it is.
The HUD moodle tiers are worth learning, since they are the rate readout most players have. Anything above 0.005 L/min shows light bleeding, above 0.09 shows bleeding, above 0.225 heavy bleeding, and above 0.45 the catastrophic bleed icon.
One rate signal is deliberately dishonest about your safety. The whole-body bleed rate is tapered by perfusion: between 0.75 L and 0 L of blood, the reported and drained rate scales down to zero. The wound is exactly as open as it was; what has changed is how much is left to push out. The number falls as you empty.
Radiation drains blood with no wound anywhere on the body - above sickness 10 the handler removes rad x 0.00025 L a second (RadiationHandler.java:41,90-91), so the volume falls while every bleed readout, drip and pool sits at zero. Disease and Infection
Excision bills its blood on a different channel entirely: taking an organ out subtracts a flat 1.0 L directly and writes only 0.45 bleed units to the abdomen (ExcisionService.java:44,49,91,101), so the largest single loss in the mod barely moves the external bleed line. Organs
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Bleed unit to blood loss | 1 unit = 0.015 L/min | ~/capability/DoomedData.java:1028 |
| Per-limb bleed cap | 100 - skin health | ~/body/LimbData.java:512 |
| Melee / sharp / projectile / explosion bleed | 2.0 / 3.0 / 3.0 / 1.5 units per damage | ~/body/CombatRouter.java:70,73,78,132 |
| Fracture bleed | 12 units | ~/body/CombatRouter.java:201 |
| Moodle tiers | 0.005 / 0.09 / 0.225 / 0.45 L/min | ~/client/hud/DoomedHudOverlay.java:691-694 |
| Perfusion taper band | full rate at 0.75 L, zero at 0 L | ~/capability/DoomedData.java:1040,1041 |
Your reported bleed rate falls as you empty, and that is not improvement
The whole-body bleed rate is multiplied by a perfusion term that scales from 1 at 0.75 L of blood down to 0 at 0 L. The wound's stored units are unchanged and the limb icons still show the tear. Below about three quarters of a litre, the HUD moodle drops tiers, the tablet's external bleed reading falls, the drips slow and the pools stop forming - while the agonal brain drain accelerates.
Clotting
A wound closes on its own, and the rate depends on how bad it is. At 2 units or below a capillary bleed clots at 0.050 units per second. At 8 units or above a serious tear clots at 0.017 units per second, and the rate blends linearly between those two points. The slow end is deliberate: at 0.017 an untreated serious wound stays open long enough to actually kill you, where the earlier faster rate made a single wound survivable forever.
Five modifiers multiply into that rate, and they apply to internal clotting as well.
A fragment still in the wound suspends natural clotting completely. Suspends, not slows. A limb with shrapnel in it weeps until the fragment is pulled, and waiting helps by exactly nothing.
Venom is an anticoagulant. Clotting is multiplied by 1 minus venom divided by 20, so it reaches exactly zero at a venom level of 20 or above. Venom also thickens the blood toward its own level over time.
A non-opioid painkiller thins the blood. The penalty scales with the drug level and tops out at halved clotting. Medicating the pain of a bleed makes the bleed last longer.
Cold hurts. Below 35 C clotting falls linearly and bottoms out at 60 percent by 30 C. It never turns off entirely.
Warmth helps a little. A body held in the comfortable 36.5 to 37.5 C band earns up to an 8 percent bonus. The two temperature terms are exclusive - one or the other, never both together.
The Bleeder trait sits on top of all of it at 0.55x, which is close to doubling how long everything bleeds.
A non-opioid painkiller.
Weaker than the opioids, but no breathing risk, no
overdose, no addiction - and doses stack. Also fights
fever and inflammation.
The catch: it thins your blood (wounds clot slower)
and upsets your gut. Don't pop it while you're bleeding,
and don't chain doses or you'll start a stomach bleed.
tooltip.doomedmatu.nocifen
String and code agree. The penalty behind "clot slower" tops out at halved clotting.
The fragment that suspends clotting is the same foreign body that re-tears the limb it sits in, adding 0.35 units plus 0.45 per unit of depth every time it shifts (ForeignBodyAggravationHandler.java:50,51,170). Injury and Treatment
Deep wounds
Past 20 bleed units - 0.30 L/min from one limb - a wound is promoted to DEEP. Promotion also wipes any stitched or reopen bookkeeping the limb was carrying, because a fresh heavy tear is a new wound and wants treating again.
A bandage's effect scales with how far the wrap actually got. The bleed multiplier lerps from 1.0 at no wrap down to the specific dressing's floor at full wrap. Complete the wrap to 90 percent or more and the bleed is set to zero outright. On a deep wound that has not been stitched, that same completion arms a reopen countdown of 3600 server ticks - three minutes - after which the wound tears itself back to the deep-wound threshold or whatever the current skin cap allows, with an audible squelch and no text warning.
A suture is the only thing that clears the deep state properly, and only if the stitching minigame scores 0.55 or better. A clean close knits skin by up to 25, stops the bleed dead, marks the limb stitched and writes a real closure to the record. A ragged stitch below 0.55 closes nothing: the wound stays deep and unstitched, the reopen timer arms exactly as if it had been bandaged, the suture is still consumed, and below quality 0.5 it also works dirt into the wound and marks the limb infected.
A stapler is the guaranteed mediocre alternative. It closes instantly with no minigame, knits skin by 15 instead of 25, zeroes the bleed and clears the deep flag, and costs 22 pain against a neat stitch's 12.5.
Cauterizing with a held flame sears the bleed to zero, and charges 30 burn, 45 pain and a 40 percent chance of seeding infection at 20.
The deep and stitched flags clear once the limb is at zero bleed with skin at 99 or above.
Surgical thread and needle.
Drag onto a wounded limb to stitch it shut: restores
skin and sharply cuts the bleeding (the stitching stings).
Disinfect first: filth can seed infection during closure.
tooltip.doomedmatu.medicalsuture
The warning about filth is accurate. The quality gate is not mentioned: below 0.55 the thread is spent and the wound is still deep.
Despair writes wounds of its own: the standard self-harm cut adds 6 to 10 units, the severe one 45 to 60, and the violent head sequence 60 to 90 (DespairHandler.java:64,75,81) - all of them past the 20-unit deep threshold, and the last of them equal to an open amputation stump. Psychology
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Deep wound threshold | 20 units (0.30 L/min) | ~/body/LimbData.java:41 |
| Reopen delay | 3600 ticks (3 min) | ~/body/LimbData.java:43 |
| Wrap that fully staunches | 0.9 or more | ~/body/TreatmentService.java:1706 |
| Suture clean-close quality | 0.55 | ~/body/TreatmentService.java:878 |
| Suture skin knit | +6 to +25 by quality | ~/body/TreatmentService.java:880 |
| Staple skin knit / pain | +15 skin, +22 pain | ~/body/TreatmentService.java:951,960 |
| Cauterize cost | +30 burn, +45 pain, 40 % infection at seed 20 | ~/body/TreatmentService.java:750-753 |
A ragged suture is not a closure at all
Below stitching quality 0.55 the suture is consumed, the skin knits a little, and the wound stays deep and unstitched. That state is byte-for-byte identical to a bandaged deep wound, so the three-minute reopen countdown arms and the wound tears back open later. Below quality 0.5 it also seeds infection.
Internal bleeding
Internal bleeding is stored per limb directly in litres per minute and drains blood alongside the external channel. It sits out of reach of every dressing in the game.
The drain is soft-saturated rather than clipped. Up to a summed 0.9 L/min it drains one for one; above that it curves toward a hard ceiling of 3.0 L/min. Multiple internally bleeding limbs stack, with diminishing returns.
It resolves on its own at 0.003 per second, halved to 0.0015 for any single limb above 0.25 L/min. A bruise clears in minutes. A serious tear takes far longer and wants a drug.
The early-game answer is stillness. While the body is genuinely not moving - under 0.03 blocks per tick horizontally, not sprinting, not swinging - it tamponades at an extra 0.0025 units per second. Crouching multiplies that by 1.7. So does being downed, so dragging an unconscious teammate somewhere quiet is worth the trip. Adrenaline works against it: the rate is multiplied by 1 minus adrenaline over 150, floored at 0.30, so a frightened body clots badly and still clots. All the external clot modifiers apply here too, shrapnel included - a fragment suspends internal clotting exactly as it suspends external clotting.
Procoagulant is the systemic answer. It reduces internal bleeding by 0.06 L/min per ml across every limb, cuts external bleed by 40 percent at a full 100 ml, and raises blood viscosity by 0.35 per ml.
Regenex injected into the chest multiplies thoracic internal bleeding by 0.45 at a full 25 ml dose. Anywhere else in the body, internal bleeding ignores it.
Every one of these routes goes through the wound ledger. A treatment that wrote the limb value directly used to be silently reverted the next time that limb was touched, which is the bug behind years of reports that internal bleeding simply never went down.
Clots internal and external bleeding; thickens blood.
tooltip.doomedmatu.procoagulant_syringe
Three effects in one line, and accurate. The number behind "thickens" is 0.35 viscosity per ml.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Internal drain soft ceiling | 0.9 L/min | ~/body/BloodHandler.java:36 |
| Internal drain hard ceiling | 3.0 L/min | ~/body/BloodHandler.java:38 |
| Natural decay | 0.003/s, x0.5 above 0.25 L/min | ~/body/BloodHandler.java:43,48,56 |
| Stillness clot rate | 0.0025/s | ~/body/BleedHandler.java:57 |
| Crouched or downed bonus | x1.7 | ~/body/BleedHandler.java:59 |
| Stillness speed gate | 0.03 blocks/tick | ~/body/BleedHandler.java:61 |
| Adrenaline suppression | floor 0.30, span 150 | ~/body/BleedHandler.java:64,65 |
| Procoagulant | -0.06 L/min internal per ml, -40 % external at 100 ml, +0.35 viscosity per ml | ~/body/DrugService.java:68,70,72 |
| Regenex thoracic internal | x0.45 at a full 25 ml | ~/body/DrugService.java:403 |
Adrenaline blocks the only field treatment for internal bleeding
Internal bleeding tamponades only while the body is genuinely still, and the rate is multiplied by 1 minus adrenaline over 150 with a floor of 0.30. Fighting, running or being frightened suppresses it to a third of an already slow rate, and any real locomotion switches it off entirely. Being unconscious on the floor counts as still and gets the same 1.7x bonus crouching does.
Tourniquets
A tourniquet goes on a non-vital region only. Head, neck, eyes, thorax and abdomen are refused - there is nothing above them to tie against.
Once fastened it stops external blood loss from the anchor limb and everything distal to it. The stored wound is unchanged; only its contribution to the drain is masked. The wound icons stay exactly as bad as they were.
The strap hurts immediately. Anchor-limb pain ramps at 2 per second up to a cap of 40.
At 540 seconds - nine minutes - the safe window closes. Every cut-off limb in the chain loses 2 percent muscle per second. Any limb that falls below 5 percent muscle has its infection floored at 10 and is flagged infected, which puts it on the sepsis path.
At 840 seconds - fourteen minutes total - the limb is gone. It comes off by the necrotic path rather than the saw path, so the stump is dry: tissue that died on the body does not haemorrhage the way tissue cut off it does. That leaves five full minutes after visible necrosis begins in which taking the strap off still saves the limb.
Applying one costs 1 of the strap's 8 condition points, and the source strap is consumed - it lives on as the limb's stored condition and is handed back at that condition when removed. Removal unblocks the limb and it resumes bleeding from wherever clotting left it.
With nothing in inventory a wound can still be pressed by hand. Both hands must be empty, the panel routes it, and the server revalidates every tick.
Pressure masks flow the same way a tourniquet does - the stored wound is untouched. On an ordinary wound the limb's flow is multiplied by 0.35. On a deep wound the floor is 0.7, because a hand cannot close an artery. It never reaches zero, so a bandage always beats a hand.
One limb carries the benefit at a time. One pair of hands, and the code enforces that as a single slot covering both the active hold and the fading credit afterwards.
Holding banks credit. Ten seconds of real, still, paid-for pressing earns the full release credit, which then decays back to open flow over twenty seconds. A partial hold drains proportionally sooner, and a tap banks nothing.
It costs stamina at sprint drain rate. Below 0.5 stamina the press stops helping and starts grinding instead, adding 2 pain per second to the limb toward a ceiling of 60.
The movement gate is positional and server side. Move faster than 0.12 blocks per tick horizontally and the hold releases, whatever the client claims. Pressure is refused on a dismembered limb, on a limb already tourniqueted, and on a limb that is not actually flowing. In co-op the hands belong to the helper and the wound to the patient, and one wound accepts one helper.
Clamp a limb to stop all bleeding below it.
tooltip.doomedmatu.tourniquet
Accurate for the first nine minutes.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Anchor pain ramp | +2/s to a cap of 40 | ~/body/TourniquetHandler.java:23,24 |
| Safe window | 540 s (9 min) | ~/body/TourniquetHandler.java:26 |
| Muscle loss past the window | 2 %/s per cut-off limb | ~/body/TourniquetHandler.java:28 |
| Necrosis to sepsis | muscle < 5 %, infection floored at 10 | ~/body/TourniquetHandler.java:30,32 |
| Total time to lose the limb | 840 s (14 min) | ~/body/TourniquetHandler.java:44 |
| Strap condition cost | 1 of 8 | ~/body/TreatmentService.java:111 |
| Flow multiplier while held | 0.35 normal, 0.7 deep | ~/capability/DoomedData.java:1084,1085 |
| Full credit earned after | 10 s | ~/capability/DoomedData.java:1087 |
| Credit fade | 20 s | ~/capability/DoomedData.java:1090 |
| Exhaustion threshold | stamina <= 0.5 | ~/body/PressureHold.java:41 |
| Exhausted grind | +2 pain/s to a cap of 60 | ~/body/PressureHold.java:43,44 |
| Movement release gate | 0.12 blocks/tick | ~/body/PressureHold.java:47 |
The tourniquet has a second clock at fourteen minutes
Nine minutes is where necrosis starts and the muscle drain and sepsis begin. Eight hundred and forty seconds is where the limb is simply taken, by the necrotic path, leaving a dry stump. There are five minutes between the two, so a strap you notice going bad can still be saved.
Procoagulant can throw a pulmonary embolism
Each ml of procoagulant adds 0.35 blood viscosity, so a full 100 ml syringe adds 35. Viscosity relaxes toward neutral at only 0.05 per second, which is about twelve minutes to shed one full dose. Above viscosity 90 the body rolls at 1.66 percent per second to throw a clot to the lungs, which then eats thoracic muscle until viscosity falls back below 50. Three full doses inside twenty minutes clears the throw line.
You keep bleeding while logged out
On login the server settles the gap using the exact same per-tick arithmetic the live tick uses, charging up to ten minutes of absence however long you were away. Blood cannot be taken below 1.2 L by catch-up alone, and the brain not below 20, so you wake up in a terrible state rather than dead.
FRAGMENT 09-C - STRAP TIMEOUT
SUMMARY: One line, on the action bar, at fourteen minutes: "The strap was on too long. There was nothing under it left to save."
RESPONSE: By the time it prints the limb is already gone. TourniquetHandler takes it through necroticLoss rather than the saw path, so the stump comes off dry and the strap falls away with the limb it killed. The message is the only notice the system ever gives. The nine-minute mark that started the 2 percent per second muscle drain and floored infection at 10 across the whole cut-off chain printed nothing whatsoever.
FINAL NOTE: The tourniquet timer is displayed nowhere. A player who has never lost a limb this way has no reason to suspect two clocks were running.
body/TourniquetHandler.java:68-76,79-95
FRAGMENT 02-D - LEGALLY DEAD
SUMMARY: An advancement, announced to chat, framed as a challenge: "Walk around with less than a quarter of your blood."
RESPONSE: The grant is a float compare in the body tick against 1.2 L, with a single gate - death must not already be pending. Nothing checks whether you are moving, and nothing checks whether you are conscious. At 1.2 L the consciousness ceiling computes to 8 on the straight line between the two config blood lines, well inside the unconscious band, so what usually earns the toast is a body on the floor. A quarter of 5.0 L would be 1.25.
FINAL NOTE: Offline catch-up floors blood at exactly 1.2 L, so a player who logs out bleeding and logs back in can never earn it that way. Whether the two constants were meant to be the same number is not recorded anywhere.
data/doomedmatu/advancements/legally_dead.json; body/DoomedAdvancements.java:45,76; body/ConsciousnessHandler.java:86,114,115; body/OfflineCatchUp.java:36,103
Stumps
A severed limb does not bleed - it is gone. What bleeds is the amputation boundary, and it is counted separately from any limb's stored bleed value.
Each amputation boundary adds a flat 60 bleed units. At the standard conversion that is 0.9 L per minute of arterial loss per severed chain. The source comment beside that constant claims 1.5 L/min. The arithmetic in the code gives 0.9, and the code is what runs.
Only the boundary counts. A whole arm off at the shoulder is one open stump rather than three, so upper arm plus forearm plus hand bleed as a single wound. Losing all four limbs bleeds twice as hard as losing two, which the older stump-slot counting got wrong.
Three things close that channel, and all three are things a player can actually do:
- a tourniquet anywhere proximal to the amputation, since the block check walks up the chain
- dressing or cauterizing the open stump the amputation left on the parent segment, until that stump's own bleed drops to 0.5 units or below
- fitting a prosthetic, whose socket seals the stump
A saw amputation leaves the stump bleeding at full rate with 100 contamination and a 300 second disinfect window. A limb lost to necrosis instead - deep frostbite, or a tourniquet left on past fourteen minutes - has its stump wound written to zero bleeding and marked clotted, with contamination floored at 45. Dry, but dirty.
Drag onto an arm or leg to amputate it.
tooltip.doomedmatu.saw
Eight words. The boundary it opens is worth 60 bleed units, or 0.9 L per minute.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Bleed per amputation boundary | 60 units = 0.9 L/min | ~/capability/DoomedData.java:1032, 1028 |
| Stump counted as closed at | bleed <= 0.5 units | ~/capability/DoomedData.java:1030 |
| Saw stump muscle loss / pain | -50 muscle, 100 pain | ~/body/DismemberService.java:38,39 |
| Stump disinfect window | 300 s | ~/body/DismemberService.java:40 |
| Necrotic stump contamination floor | 45 | ~/body/DismemberService.java:415 |
Shock
Bleeding out can stop your heart before anything else has failed, and nothing in game announces it.
Below 2.0 L of blood, each second rolls a chance to seed fibrillation. The odds ramp from zero at 2.0 L up to a cap of 6 percent per second at 1.0 L and below. The seed is non-forced, so a transfusion that rebuilds volume lets the rhythm settle back down on its own.
A separate acute-trauma seed fires at 4 percent per second whenever motor shock is above 70, which happens on extreme pain with bottomed stamina. Shock bleeds off at about 10 per second, so that is a brief window after a hit rather than a standing risk.
The general begin-gate also seeds fibrillation whenever oxygen delivery is under 50, systolic pressure under 82, heart rate over 200, viscosity over 95, or body temperature under 28 C. A body that is merely anaemic can sit under the oxygen-delivery line permanently, and the anaemia floor is placed where it is for exactly that reason.
What kills you is the collapse chain rather than the rhythm. Below systolic 20 every limb loses 0.6 percent muscle per second. Below systolic 10 with consciousness under 5 the brain itself drains at 1.5 percent per second. The agonal low-blood drain deliberately steps aside while that is running so the two never stack.
Blood pressure itself is driven by volume through two terms: a target that subtracts a quarter of the volume deficit, and a multiplicative factor of 1 plus 1.1 times the deviation from full. Dehydration multiplies pressure by as little as 0.72 at deeply negative thirst.
A battery-powered blood-pressure regulator.
Wear it on your chest front: while it has charge it props
your blood pressure back up whenever it sags. It drains
its battery as it works.
tooltip.doomedmatu.autopump
Pressure is the number the collapse chain reads. The tooltip names no lines; the muscle line is systolic 20 and the brain line is systolic 10.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Haemorrhage fib seed band | 2.0 L down to 1.0 L | ~/body/CardiovascularHandler.java:46,47 |
| Haemorrhage seed cap | 6 %/s | ~/body/CardiovascularHandler.java:48 |
| Acute shock seed | shock > 70, 4 %/s | ~/body/CardiovascularHandler.java:49,50 |
| Fibrillation begin gate | O2 delivery < 50, systolic < 82, HR > 200, viscosity > 95, temp < 28 C | ~/body/CardiovascularHandler.java:44, 336-338 |
| Muscle collapse line | systolic < 20, -0.6 %/s all limbs | ~/body/CardiovascularHandler.java:66,67 |
| Brain collapse line | systolic < 10 and consciousness < 5, -1.5 %/s | ~/body/CardiovascularHandler.java:69-71 |
| Cardiac arrest definition | heart rate < 20 | ~/body/CardiovascularHandler.java:96 |
Red cells
Volume and carriage are tracked as two different numbers, and that is the single most confusing thing about blood in this mod.
Red-cell fraction starts at 1.0 and is clamped between 0 and 1.5, so repeated transfusion can bank a modest reserve above baseline. Losing whole blood removes cells in proportion to the current concentration. Adding compatible whole blood adds litres divided by 5 to the fraction.
Oxygen delivery is arterial saturation multiplied by red-cell fraction multiplied by a perfusion term of systolic pressure over 80, capped at 1. A pulse oximeter can read a perfectly normal saturation while the organs are starving. Saturation says nothing about how many cells there are to saturate.
Cells rebuild far more slowly than volume: 35 percent of the volume regeneration rate, expressed as a fraction of baseline. At best that is roughly 0.35 percent of your normal red-cell mass per minute. The Anaemic trait cuts it to 0.45x on top of that.
Iron gates it. Each litre of blood lost spends 22 iron, and simply being alive spends 10 per in-game day. Above an iron store of 45 the rebuild runs unrestricted. Below it, both the rebuild rate and the ceiling fall away, down to a marrow floor of 0.12 on the rate and a red-cell ceiling of 0.68 at empty stores.
That 0.68 floor is deliberate. A fully saturated body at 0.68 sits at about 66 oxygen delivery, which clears both the 50 seeding line and the 60 rising line for fibrillation. Iron starvation is meant to leave you fragile and slow to recover. It is not meant to execute you.
Brain damage hangs off delivery rather than volume: below an oxygen delivery of 33 the brain loses 0.28 percent a minute for every point under the line (RespirationHandler.java:73,79,254-257), and that drain deliberately stands down while the terminal circulatory collapse is running so the two never stack. Pain, Consciousness and Death
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Red-cell fraction clamp | 0 to 1.5 | ~/capability/DoomedData.java:666 |
| Oxygen delivery formula | SpO2 x red-cell fraction x min(systolic/80, 1) | ~/capability/DoomedData.java:713 |
| Cell regen vs volume regen | 0.35x | ~/body/BloodHandler.java:26 |
| Iron spent per litre lost | 22 | ~/body/NutrientHandler.java:32 |
| Iron spent per in-game day | 10 | ~/body/NutrientHandler.java:30 |
| Iron store restriction band | 45 down to 5 | ~/body/NutrientHandler.java:45,46 |
| Anaemia red-cell floor | 0.68 | ~/body/NutrientHandler.java:43 |
| Anaemic trait | red-cell rebuild x0.45 | ~/body/Trait.java:319 |
Saline restores volume and no red cells at all
A blood bag calls addWholeBlood, which raises circulating volume AND red-cell fraction. Saline calls setBloodVolume directly, so it raises the litres and adds nothing to carriage - and because the fraction is now spread over more litres, it actively dilutes what you had. Your tablet's blood volume line recovers, and oxygen delivery, which is saturation times red-cell fraction times perfusion, does not move. Consciousness is capped by oxygen delivery, so a fully saline-resuscitated body can still be woozy with a normal-looking volume readout.
Each litre of blood you lose costs 22 iron, and iron caps how fast you get it back
Blood loss debits the iron store directly. Below a store of 45 both the red-cell rebuild rate and its ceiling fall away, down to a rate floor of 0.12 and a red-cell ceiling of 0.68 at empty stores. Repeated haemorrhage therefore compounds: each bleed makes the next recovery slower, and a transfusion can hand back volume that your marrow cannot follow.
The reaction
A wrong bag does two separate things. It raises a symptom level, and it banks a hemolysis debt in litres.
The symptom level is added, not maxed, and capped at 100. A second wrong bag onto a reaction already running pushes it toward the ceiling. It decays at 0.70 per second, so a full ABO reaction runs about two and a half minutes.
The debt is uncapped, and that is the point. It is computed as 0.75 L multiplied by how much of the bag you actually pushed multiplied by 1.2 plus the raw severity over 100. A fully pushed ABO bag therefore owes about 1.65 L against the 0.75 L it delivered. A fully pushed Rh-mismatched bag owes about 1.24 L. Both scale with the plunger, so an incompatible transfusion costs blood at every depth and every tier.
The debt burns at 0.016 L per second scaled by symptom strength, with a floor of 30 percent of that rate. Symptoms fade; hemolysis finishes the job afterwards. Waiting a mild mismatch out still ends in the red.
While the reaction runs it adds 1.5 sickness per second, 0.08 fibrillation per second, a slow temperature climb, and pain to the thorax and abdomen. You are told when the worst passes, at symptom level 25.
One thing the tablet says that the code does not do: the readout labels an active reaction as "further blood restricted". Nothing anywhere gates a further transfusion on the reaction level. Another bag goes in whenever you want it to - it just adds its own severity and its own debt.
Transformation is the other source of severity. As a body diverges from human, banked human blood stops being yours. Divergence contributes nothing below transform factor 0.25, then ramps to 70 at full transformation. It adds to any ABO or Rh clash and the total is capped at 100. Saline is untyped, so a transformed character always keeps a volume expander even after blood bags stop working for them.
Every Doomed character carries an ABO and Rh(D) group. It is drawn once when you commit to the run, on realistic population weights rather than a flat eight-way roll: O+ 37 percent, A+ 34, B+ 9, O- 7, A- 6, AB+ 4, B- 2, AB- 1. Old saves that pre-date typing get theirs derived from the player UUID, which is stable across every reload, so relogging rerolls nothing.
The type belongs to the character rather than the life. It survives death and respawn - resetVitals never touches it.
Compatibility is checked on packed red cells. Donor cells are refused if the donor carries an A antigen the recipient lacks, or a B antigen the recipient lacks, or if Rh-positive blood is going into an Rh-negative recipient. O- can donate to everyone. AB+ can receive from everyone. The tablet spells out both lists, and a labelled bag's tooltip names exactly which recipients its cells are safe for.
The severity of getting it wrong is tiered. An ABO mismatch scores 100. An isolated Rh mismatch scores 45 - serious, and slower. An unlabelled bag would score 70, though that branch is never reached during a transfusion, because an untyped bag has its type rolled and permanently written at the moment it is pushed.
That is the real risk of the plain, unlabelled Blood Bag. It is a gamble whose odds are your own type against the population table. The Human Blood Bag found as loot or drawn from a person is typed and labelled up front. The Experiment trader's emergency blood is always a fixed O-.
Whole blood taken out of somebody else.
Drag onto a limb to put about 0.75 L back into your veins.
Check the donor type against your own first. Get it wrong
and the reaction comes for you hours later.
tooltip.doomedmatu.bloodbaghuman
"Hours later" is not what runs. The symptom level goes up on the push and decays at 0.70 per second, about two and a half minutes for a full ABO reaction, with the hemolysis debt burning off behind it.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Symptom decay | 0.70/s, full reaction about 143 s | ~/body/TransfusionReactionHandler.java:81 |
| Hemolysis debt formula | 0.75 L x fraction pushed x (1.2 + severity/100) | ~/body/DrugService.java:966 |
| Debt burn rate | 0.016 L/s x strength, floored at 0.30 of that | ~/body/TransfusionReactionHandler.java:22,25 |
| Per-second symptoms at full strength | +1.5 sickness, +0.08 fibrillation, +0.30 thorax pain, +0.35 abdomen pain | ~/body/TransfusionReactionHandler.java:70-79 |
| "Worst is passing" notice | symptom level 25 | ~/body/TransfusionReactionHandler.java:28 |
| Transformation divergence | free below factor 0.25, up to 70 at full | ~/body/DoomedBlood.java:44,52 |
| Type weights | O- 7, O+ 37, A- 6, A+ 34, B- 2, B+ 9, AB- 1, AB+ 4 | ~/body/BloodType.java:32 |
| ABO mismatch severity | 100 | ~/body/BloodType.java:79 |
| Rh-only mismatch severity | 45 | ~/body/BloodType.java:82 |
| Unlabelled bag severity (unreached in transfusion) | 70 | ~/body/BloodType.java:76 |
| Trader emergency blood | always O- | ~/inventory/TradeMenu.java:179 |
An unlabelled blood bag has no type until the moment you push it
The plain Blood Bag carries no type tag. When it is transfused, ensureType rolls a group on the population weights and writes it to the stack permanently. So the gamble is not "this bag will react" - it is a weighted draw against your own group. An O- recipient has a roughly 7 percent chance of a clean bag; an AB+ recipient can never have a bad one.
Your blood type is fixed for the character and survives death
The group is drawn once when you commit to the Doomed run, or derived deterministically from your UUID on an old save. resetVitals clears blood volume, red cells, transfusion reaction and transfusion debt, but never the type. Dying does not reroll it, and neither does relogging or moving the save.
FRAGMENT 07-A - DELAYED REACTION NOTICE
SUMMARY: Three separate records describe the hemolytic reaction as delayed. The Human Blood Bag tooltip reads "Get it wrong and the reaction comes for you hours later." The plain Blood Bag tooltip calls it a "delayed reaction". The changelog entry that introduced blood types announces "a delayed hemolytic reaction - sickness, fever, pain, fresh blood loss, and a heart that can tip into fibrillation".
RESPONSE: The alert fires on the same tick as the push. DrugService scores the mismatch and calls TransfusionReactionHandler.start, which prints "That blood is wrong - your body is attacking it" immediately whenever no reaction was already running. Symptoms then decay at 0.70 a second, so a full ABO reaction has burned out in about two and a half minutes. What genuinely arrives late is the hemolysis debt, which keeps destroying blood at the tail rate long after the symptoms have faded.
FINAL NOTE: Either the tooltips describe an older build, or they describe the debt and call it the reaction. Nothing in the commits separates the two readings.
res/assets/doomedmatu/lang/en_us.json:630,670; CHANGELOG.md:813; body/TransfusionReactionHandler.java:42,81; body/DrugService.java:960
Bags and saline
One full blood bag restores 0.75 L. Right-clicking it only tells you to open the health panel and apply it to a limb, which runs the syringe minigame. Push less than the full plunger and the rest is spoiled, and you are told the percentage you managed.
Saline restores 0.5 L, thins the blood by 40 viscosity, and adds 60 thirst. Critically, saline writes blood volume directly rather than adding whole blood, so it contributes zero red cells. It fixes the volume number on the tablet, leaves oxygen delivery exactly where it was, and dilutes what carriage was left.
Blood bags spoil. Default shelf life is 12 hours of charged time, tracked on the stack so it survives saves, chests and trades. A powered freezer charges time at 0.1x and an icebox at 0.2x. Neither ever charges zero for blood - whole blood is refrigerated, not preserved. A mined freezer's contents are charged their full carried interval at room rate before they can be placed again.
Saline works the other way round. A sealed bag keeps forever, so loot and trader stock never age. Spiking it starts a 24 hour clock, and running a day-old open bag into somebody dirties the injection site and gives you the infection instead of the fluid.
An empty blood bag draws 0.75 L from you, or from another player when you right-click them with it. It refuses if the draw would leave the donor under 3.25 L, and it refuses if the donor's red-cell fraction is below 0.80 - a saline-expanded body has volume to spare but not cells. The donor is told who did it.
A transfused bag comes back as a used empty, marked contaminated, carrying the pathogen masks of both bloodstreams it touched. Refilling it does not wash it out. Pushing a contaminated bag dirties the injection site and rolls a blood exposure for every agent it carries.
IV volume expander; adds blood, thins it, eases thirst.
tooltip.doomedmatu.saline
"Adds blood" means litres only. Saline writes volume directly and contributes zero red cells, so oxygen delivery does not move.
The 0.1x rate belongs to a freezer that is actually drawing power - an unpowered one settles its contents as AMBIENT and ages blood at the full room rate (FreezerBlockEntity.java:86,112), so a brownout on the machine row is a spoiled bag rather than a paused clock. Machines, Power and Fluids
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Blood bag volume | 0.75 L | ~/item/BloodBagItem.java:33 |
| Saline effects | +0.5 L volume, -40 viscosity, +60 thirst, no red cells | ~/item/SalineItem.java:21,23,25 and DrugService.java:989-991 |
| Blood bag shelf life | 12 h default | ~/config/DoomedConfig.java:2082 |
| Cold storage multipliers | freezer 0.1x, icebox 0.2x | ~/item/BloodBagItem.java:266-268 |
| Opened saline shelf life | 24 h | ~/item/SalineItem.java:37 |
| Donation refusals | blood after draw below 3.25 L, or red cells below 0.80 | ~/item/EmptyBloodBagItem.java:32,34 |
Drips and pools
The visuals are server-authoritative so every player sees the same blood, and they are keyed off the same whole-body rate the drain uses.
Drips start at 0.05 L/min. They come off the worst-bleeding limb's rough position on the body, biased downward, roughly two thirds of the time, with the remainder scattered across whatever else is bleeding. Heavier bleeding produces more frequent drips.
Floor pools need 0.35 L/min and both feet on the ground. That threshold sits much higher than the drip threshold on purpose - a scraped shin drips and fades, and only a wound that genuinely needs treating paints the floor. A pool lasts 50 seconds, holding solid for the first three quarters of that and fading out over the last quarter. It also checks the block underneath it twice a second and vanishes if that block is removed.
Colour has two independent layers. The base is a per-player choice, defaulting to 0xFF0907, sent to the server and baked into every particle and pool that player spawns, so other people see your blood in your colour rather than their own.
On top of that, transformation shifts blood from red toward orange 0xFF5500. The factor is your transform stage divided by 4, or 1 outright once you are Corebound. That is the same factor that drives transfusion divergence. A character whose blood has visibly changed colour is a character whose body has started rejecting human blood.
The colour factor is transform stage divided by 4, or 1 outright once you are Corebound (DoomedBlood.java:33-36), and it is the same number feeding transfusion divergence, so the orange in the pool on the floor is a direct readout of how badly human blood now fits you. Transformation
Notes
- The amputation constant reads 60 units, and the javadoc sitting directly beside it says 1.5 L/min. Sixty units converts to 0.9. FIXBATCH_AUDIT records the constant as 100 back when the double-count bug was found, and 100 does give exactly 1.5, so the number was cut at some point and the comment was left behind. Only one commit in the history touches that constant and it is a whole-version squash, so the reason for 60 was never written down.
- HEALTH_AUDIT asks for the blood regeneration rate to be 0.0525 L/min to match the source game's 0.035 units per second. BloodHandler still runs 0.05. Nothing in the commits says whether the figure was rejected or the item was simply never picked up. The same audit line also asks for a downward pull whenever blood sits above 5.0 L, and that was never added, so a body transfused up to the 7.5 L clamp keeps the surplus until something takes it off him.
- Cutting out an organ subtracts a flat 1.0 L by writing blood volume directly, and the javadoc on removeWholeBlood reserves that direct write for plasma-only losses. So a surgical litre costs no red cells and spends no iron, where a litre lost through a wound costs both. Every other whole-blood loss in the mod, blood vomit included, routes through removeWholeBlood. Whether the surgeon's litre was judged to be plasma or the call site was just wrong, the record does not say.
- The tablet prints an Estimated Hct line with its own alarm colours at relative 0.60 and 0.82. Nothing mechanical reads that figure. getRelativeHematocrit is called by the tablet screen and by the co-op patient scan, and every handler that matters uses the raw red-cell fraction instead, so those two thresholds correspond to no line anywhere in the sim. Whether the relative number was meant to gate something, or was always a readout, is not recorded.
- Transfusion divergence is computed from the recipient's transform factor alone, and nothing writes a donor's transformation onto a bag. Blood drawn out of a Corebound player is stored as an ordinary human group, so it carries the full divergence penalty when it runs into another Corebound player. Two changed bodies with identical blood cannot give to each other. The design note beside DIVERGENCE_MAX is careful about what a transformed recipient should suffer and says nothing at all about a transformed donor.
Organs
You have eleven internal organs. None of them helps you - a healthy organ does nothing you can feel, and its only job is to stop being a liability. Damage to one degrades the sim through a channel that already exists: a failing liver poisons your blood, failing kidneys back potassium up into your heart, lost lung caps how hard you can breathe. Since 0.2.9 organs recover, one step per dawn and only on a day they were left alone, but every injury past a certain depth leaves permanent loss and an organ can never be repaired above what is left of it. Real death is the only thing that clears that.
The set
The set is fixed and its order is frozen into the save format: heart, left lung, right lung, liver, left kidney, right kidney, stomach, pancreas, spleen, intestines, bladder. Each one lives in a body region. The heart and both lungs sit in the thorax, everything else in the abdomen, and that is where a wound to it is routed from.
An organ carries one number that matters to everything else. Function runs from 1 down to 0, and it is condition divided by 100, except that a removed or ruptured organ reads 0 outright and a transplanted one is cut further by how far rejection has climbed. Every downstream handler reads that single fraction, which is why setting an organ's condition with a command runs the entire cascade below it.
The source states the design rule plainly, and it is worth knowing before you go looking for upside. An organ is only ever a liability. Health in one buys nothing. Every failure ends through a death channel that already existed before organs did - toxaemia into brain-death, hyperkalaemia into cardiac arrest - so an organ kills you only in a way you have already seen.
Tissue
Every organ carries two numbers that say what kind of tissue it is. Fibrosis is the fraction of an injury's depth that tissue keeps forever. The dawn step is how many condition points it can convalesce on a day that earned it, and 0 means it stays where it is for life.
- Heart: fibrosis 1.00, dawn step 0. Cardiac muscle does not divide. A heart scar is a heart scar for the rest of that life.
- Lungs: 0.85, step 6. The lining relines over days. The alveoli stay lost.
- Liver: 0.55, step 20. The fastest recovery in the body and the lowest fibrosis, which is why a survived episode heals back nearly whole.
- Kidneys: 0.90, step 5. The highest fibrosis of any organ and a mean recovery rate. Nephrons are fixed before birth and only ever fall.
- Stomach and intestines: 0.25, step 25. Mucosa is the fastest tissue in the body.
- Pancreas: 0.85, step 4.
- Spleen: 0.70, step 3.
- Bladder: 0.30, step 20.
Multiply fibrosis by 60 and the product is the deepest permanent mark that tissue can ever carry, which fixes the worst ceiling each organ can be driven to. A liver can never be capped below 67. A kidney can be capped as low as 46, a lung 49, and a heart 40.
The liver
Four things wear the liver, each at a rate per second per unit of the stressor: sustained Nocifen at 0.0016, radiation sickness at 0.0022, sepsis at 0.0030, and blood alcohol at 0.00015. The alcohol term is threshold-gated, so only the part of blood alcohol above 20 reaches the liver at all. That is just under one 400 mL bottle. A single drink grazes the organ and a habit is what scars it. All four rates diminish as the organ fails, scaling by 0.3 plus 0.7 times current function, so a wrecked liver gets worse slowly.
What a failing liver does is poison you. Toxaemia eases toward what the liver and kidneys cannot clear, rising at 10% of the remaining gap per second. Above 15 it tops up your nausea at 0.6 per point. Above 55 it starts eating your brain at 0.05 percent per second per point over the line, which is hepatic encephalopathy, and it ends at brain-death through the gate that already kills you.
Jaundice trails liver failure at 5% of the gap per second. It is bilirubin rather than an illness, and it yellows the skin where other players can see it. Anything applied to the skin runs straight past it.
A working liver clears toxaemia at 6 per second scaled by function. Clearance takes the lower of liver and renal function, so a pristine liver with dead kidneys leaves the blood dirty.
A non-opioid painkiller.
Weaker than the opioids, but no breathing risk, no
overdose, no addiction - and doses stack. Also fights
fever and inflammation.
The catch: it thins your blood (wounds clot slower)
and upsets your gut. Don't pop it while you're bleeding,
and don't chain doses or you'll start a stomach bleed.
tooltip.doomedmatu.nocifen
The catch the tooltip names is clotting and the gut. The catch the handler applies is 0.0016 off the liver and 0.0011 off each kidney per second, plus an insult flag that costs all three organs their dawn step.
Nocifen level and blood alcohol are the pharmacology layer's own fields, read here unchanged, so the painkiller you take for a fracture and the drink you take for your mood both bill the same organ. Drugs and Pharmacology
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Blood alcohol below which the liver is untouched | 20 | ~/body/OrganHandler.java:45 |
| Sepsis liver wear | 0.0030 condition/s per point | ~/body/OrganHandler.java:39 |
| Toxaemia nausea threshold | 15 | ~/body/OrganHandler.java:52 |
| Toxaemia brain-drain threshold | 55, then 0.05 brain %/s per point over | ~/body/OrganHandler.java:54-55 |
| Toxaemia clearance | 6/s x min(liver, renal function) | ~/body/OrganHandler.java:49,140 |
A perfect liver cannot clean your blood if your kidneys are dead
Toxaemia clearance takes the lower of liver function and mean renal function, not the liver alone. The liver converts the ammonia and the kidneys excrete it, so the slower filter governs. A player with a pristine liver and two failed kidneys watches toxaemia climb toward the encephalopathy threshold and cannot work out why the organ responsible for it reads healthy.
The kidneys
There are two, and renal function is their mean, so losing one leaves about half capacity and that is survivable. Losing the second is a different kind of event.
Both take the same stressors independently. Thirst below 25 counts as dehydrated and wears them at 0.0022 per point below that line per second, which makes running dry the signature renal killer and one of the few organ failures that comes from neglect rather than from injury. Radiation adds 0.0020, sepsis 0.0026, and Nocifen 0.0011. The painkiller is nephrotoxic as well as hepatotoxic.
Serum potassium eases toward what the remaining renal capacity can excrete: 4.0 mmol/L healthy, 8.5 with no function at all, moving at 4.5% of the gap per second. That is hours, not seconds. Above 6.0 the heart's electrics destabilise and hyperkalaemia can seed fibrillation, with the odds reaching their cap at 8.0. Above 6.5 an existing fibrillation keeps climbing on its own, so untreated renal failure ends at the heart, through arrest.
Failed kidneys also feed the shared toxaemia channel by up to 12 points, standing in for metabolic acidosis.
The dialysis rig is the standing answer, and by design it buys time instead of curing anything. Worn and charged, it pulls toxaemia down 1.4 per second and potassium 0.09 per second toward 4.0, spending one charge of 150 per second of filtering. That is roughly two and a half minutes of battery. The organ itself is untouched.
A battery-powered blood filter worn on your back.
While it has charge it scrubs out the poison a failed
liver or kidney can no longer clear. It does NOT repair
the organ - the moment the battery dies, the poison
comes straight back. Heavy, and thirsty for power.
tooltip.doomedmatu.dialysisrig
The string and the handler agree exactly, down to the reason for the capital NOT.
Thirst is read straight out of the survival layer here - the same 0-100 bar that governs hydration is what sets the dehydration insult, so a run of days spent slightly dry is a renal problem before it is a thirst problem. Needs and Survival
The potassium number leaves this system entirely: CardiovascularHandler reads it every tick and seeds fibrillation off it, so renal failure arrives as a heart rhythm the circulation chapter owns. Blood and Circulation
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Dehydration threshold | thirst below 25 | ~/body/OrganHandler.java:60 |
| Potassium range | 4.0 healthy to 8.5 fully failed | ~/body/OrganHandler.java:66-67 |
| Fibrillation seed / cap | 6.0 / 8.0 mmol/L | ~/body/CardiovascularHandler.java:51-53 |
| An existing fibrillation keeps rising above | 6.5 mmol/L | ~/body/CardiovascularHandler.java:54 |
| Dialysis rig scrub rate | 1.4 toxaemia/s, 0.09 potassium/s | ~/body/WearableEffects.java:232-234 |
The lungs
Mean lung function is a hard ceiling on respiratory drive. Pain, fever, adrenaline and panic all push respiration up, and the ceiling holds every one of them. It runs from 8 at no lung function to 100 at full, so one lung alone caps you near half. Survivable, permanently short of breath, and you will never sprint out of trouble again.
Chest wounds leave the lungs alone. Trunk trauma routes only to organs the sim actually models, and that list is the liver and the two kidneys. A round through the thorax gives you the internal-bleed channel and a wrecked chest wall instead.
Disease is what takes lung. Rot Lung floods a section, and a flooded section left undrained past its sixty-second window organises: 11 points come off both lungs as permanent loss rather than as damage. Surviving Rot Lung as a carrier leaves both lungs pinned at 82 with a matching permanent ceiling, and that scar is the only way anyone will ever tell a carrier from a clean survivor. Late-stage kuru aspiration takes 0.8 off both lungs each time it fires, alongside a sepsis bump.
Two datapack damage profiles also reach the lungs directly: dragon breath at 0.55 per point of damage to each, and wither at 0.10.
Clears a viral disease such as Rot Lung. Antibiotics do nothing to a virus.
tooltip.doomedmatu.antiviral
Clearing the disease stops the flooding. The 11 points an organised consolidation already took are permanent loss and stay taken.
Every route into a lung is a disease route: ContagionHandler deposits the 11 points of permanent loss when a Rot Lung consolidation organises, and KuruHandler takes 0.8 off both lungs each time late-stage aspiration fires. Disease and Infection
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Respiratory ceiling at zero lung function | 8 | ~/body/RespirationHandler.java:75,143 |
| Drain window before a consolidation sets | 1200 ticks (60 s) | ~/body/ContagionHandler.java:556 |
| Cost of one organised consolidation | 11 condition and 11 permanent, both lungs | ~/body/ContagionHandler.java:558,629-630 |
| Carrier lung pin | 82 | ~/body/ContagionHandler.java:552,365-366 |
| Dragon breath lung damage | 0.55 per point of damage, each lung | res/data/doomedmatu/doomed_damage_profiles/vanilla.json |
No wound in the game can damage a lung or a heart
Trunk trauma only picks from the organs whose failure the sim models, and that list is the liver and the two kidneys. A thorax hit finds nothing eligible and returns immediately. So a bullet through the chest never touches a lung, and nothing anywhere in combat touches the heart. Lungs are only reached by Rot Lung, by late-stage kuru aspiration, by the wither and dragon-breath damage profiles, and by a graft.
The unread six
Be clear about this, because the body panel is not. The heart, stomach, pancreas, spleen, intestines and bladder have no consumer in the physiology. Their function is a number nothing reads. They hold state, they save and load, they sync to your client, they show on the status panel, and the WITNESS tablet raises findings on them. Every one of those is a display.
The spleen is the one with a real event attached. Landing on your side hard enough bursts it: past 9 blocks of residual core load on a side landing there is a 35% chance the spleen ruptures. Its function drops to 0 and it becomes excisable, which is the actual operation. The ruptured flag has exactly one reader, the saw, so a burst spleen sits there without bleeding you.
The heart is a special case for a different reason. Its dawn step is 0 and its fibrosis is 1.00, so if anything ever did drive its condition down, that loss would be exactly as permanent as it sounds. Nothing does.
Treat all six as substrate wired for a future the mod has not shipped. The WITNESS tablet will happily report an abdominal organ injury at under 50% and a cardiac organ failure at under 60%, and both findings are true readings of a value nothing acts on.
The transplant screen opens on organs the graft can never target
The client-side check that decides whether to open the theatre accepts any organ under 65% - including the spleen, stomach, pancreas, intestines and bladder. The server's target selection only ever considers the liver, the kidneys and the lungs. So a ruptured spleen will happily open the surgery screen, and the commit at the end refuses with "Nothing in there is failing badly enough to replace" after you have already been opened up and bled.
Routes in
There are four routes in.
Chemistry is the slow one, covered above: painkillers, radiation, sepsis, drink and thirst grinding the liver and kidneys down over minutes and hours.
Trauma is the fast one. A penetrating or crushing hit to the thorax or abdomen picks one organ homed in that region and wrecks it, drawing from the shortlist of organs whose failure the sim models, which is the liver and the two kidneys. The wound must be worth at least 4 after armour, and even then there is a 45% chance it finds an organ at all, because the trunk is mostly other tissue. What it finds loses 2.2 condition points per point of wound magnitude. Trauma stops at 22 on those organs, on purpose. A gut shot is meant to be a debt you have to manage, and an unavoidable death with no counterplay is the thing the floor was written to prevent.
Disease is the third, and it goes to the lungs.
The fourth is a datapack. A damage profile can carry a physiology block naming organs and a coefficient per point of damage, and the shipped file uses it for wither and dragon breath and for toxic magic, which takes 0.25 off the liver and 0.08 off each kidney per point.
The whole organ layer is gated behind enableOrgans, which is on by default.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Minimum wound to reach an organ | 4 | ~/body/CombatRouter.java:167 |
| Chance a trunk hit finds an organ | 45% | ~/body/CombatRouter.java:168 |
| Organ damage per point of wound | 2.2 condition | ~/body/CombatRouter.java:169 |
| Floor trauma cannot cross | 22 | ~/body/CombatRouter.java:172 |
| Organs trauma can reach | liver, left kidney, right kidney | ~/body/CombatRouter.java:173-174 |
Scarring
Each organ carries a second number beside its condition. Scar is a high-water mark of the worst state that organ has ever been in, and the most it can ever be repaired to again is 100 minus that scar.
The deposit is automatic and it happens inside the setter rather than at the injury sites, so every existing way of hurting an organ scars correctly and so will every future one. Only a decrease scars, which leaves restoration free of any mark. Only depth past 60 scars, so ordinary wear genuinely heals away: above 60 an organ is bruised, below it tissue is being destroyed. What gets deposited is the depth past that line multiplied by the organ's fibrosis.
Work an example. Drive a liver to 30 and it takes (60 - 30) x 0.55 = 16.5 of permanent loss, so it will never exceed 83.5 again. That figure is not a balance number. It is where living liver donors actually plateau. Drive a kidney to the same 30 and it takes 27, capping it at 73 forever, because kidneys do not do that.
Scar is clamped at 60 times fibrosis wherever it is written, including the additive deposits Rot Lung makes. That clamp is what stops four consolidations plus a carrier scar from stacking a lung into an unwinnable body.
The game displays this number nowhere. Not the status panel, not the WITNESS tablet, not the sync packet. The only signal you get is one action-bar line the day an organ finishes healing.
Real death hands you fresh organs. Condition goes back to 100, the scar clears, ruptures and removals clear, and a graft reverts to native tissue with no rejection. That is the one hard reset in the mod, and it is deliberate. The body is new, so its history goes with the old one.
A dimension change settles nothing. Organ state is explicitly copied across, scar included, so a portal hands you back exactly the body you walked in with.
The convalescence day clock and the insult flags also reset on death, so the first day back owes nothing to the life before it. The day you log in on pays nothing either: the first dawn tick after a login clears the flags and returns without paying a step.
Turning enableOrgans off restores every one of your organs to whole, scar included. Freezing them where they stand would be worse. A failed organ is a permanent multiplier on breathing, potassium and consciousness, and with the handler off nothing could ever repair it. Potassium and jaundice are read by the heart and the skin ungated, so a frozen kidney would be an untreatable heart attack. The day clock is zeroed too, so re-enabling the system starts fresh instead of paying out a free day for a period it was not running.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Depth past which damage becomes permanent | condition below 60 | ~/body/OrganState.java:95,111 |
| Permanent loss deposited | (60 - new condition) x fibrosis | ~/body/OrganState.java:112 |
| Hard cap on scar | 60 x fibrosis | ~/body/OrganState.java:83 |
| Repair ceiling | 100 - scar | ~/body/OrganState.java:64-66 |
| Scar sent to the client | never - only function 0-100 syncs | ~/network/DoomedNetwork.java:1097-1106 |
| Cleared by real death | condition, scar, rupture, removal, graft, rejection | ~/body/OrganState.java:165-172 |
| Carried across a dimension change | all of the above, unchanged | ~/body/OrganState.java:174-181 |
| Behaviour with enableOrgans off | every organ restored to 100 and unscarred | ~/body/Quiesce.java:118-133 |
| Credit for your login day | none | ~/body/OrganHandler.java:196,204-206 |
Your organ ceiling is never shown to you anywhere
Scar is a server-side field. The sync packet sends only function as a 0-100 byte, the WITNESS patient snapshot sends the same, and neither the status panel nor the tablet has a line for permanent loss. You can be at 100% on a liver whose true ceiling is 67 and nothing will say so. The single signal in the entire game is one action-bar line - "Your liver has healed as far as it is going to" - fired once, only on an organ that actually has a scar, and only for the first such organ on that dawn. If five organs top out on the same morning you see one message and the other four are silently overwritten.
Trauma cannot rupture anything, despite the code path for it
The rupture branch requires the struck organ to be in the rupturable set - spleen, stomach, intestines, bladder - but the organ was already chosen from the modelled set, which is liver and kidneys only. The two sets do not overlap, so the branch is unreachable. Every trauma-struck organ takes the vital floor of 22 instead. The only rupture that actually happens in the game is a spleen bursting on a hard side landing.
Excision maxes out that organ's permanent loss
Cutting an organ out sets its condition to 0, and the automatic scar deposit fires on the way down: (60 - 0) x fibrosis, which is the deepest mark that tissue can carry. A removed kidney is capped at 46 forever. That matters only if you later graft, because a graft clears the scar outright - but if you never find a donor, the slot is at its worst possible ceiling in addition to being empty.
A graft is the only thing that clears a scar without dying
Installing a donor organ sets the target's scar to zero, because it is new tissue. The order of writes matters and is deliberate: condition is written first, then the scar is cleared, because a graft landing at 48 on an organ that was at 64 would otherwise be a decrease past the scar depth and would deposit fresh permanent loss onto the tissue it is meant to be replacing. So the newly grafted organ is genuinely uncapped, and every organ you never graft carries its history to the grave.
The immunosuppressant clock runs even when the organ system is off
The countdown is advanced above the enableOrgans kill-switch on purpose, because the immunity penalty it pays for is read ungated by the infection handler. On a server with organs off and infection on, the pill would otherwise dock 85 immunity for the rest of your life with nothing able to clear it - and the transplant that would justify it is refused outright in that configuration. Only the rejection maths is gated; the clock is not.
FRAGMENT 09-B - ONE LINE ABOUT A NUMBER YOU ARE NEVER SHOWN
SUMMARY: "Your liver has healed as far as it is going to." An action bar line, fired at a dawn boundary and at no other moment.
RESPONSE: It fires only for an organ that finished climbing to its ceiling that morning and that carries a scar above 0.01, and only for the first such organ in enum order. An organ healing cleanly back to 100 says nothing - the line used to fire there too, which told the player their liver would never recover further at the exact moment it had fully recovered.
FINAL NOTE: A body topping out five scarred organs on the same dawn shows one line and silently overwrites four. Scar is never put on the wire; the sync packet carries function as a 0-100 byte and the tablet carries the same. So this sentence is the only sight of the ceiling anywhere in the game, and it is gone in a few seconds.
~/body/OrganHandler.java:232-242; the sync path at network/DoomedNetwork.java:1097-1106
Convalescence
Recovery arrives all at once. It is granted at the dawn boundary, in a single step, and only for organs that earned it. The reasons are practical: a per-second rate would be multiplied by paceFactor while organ damage is not, so a fast server would heal the same wounds ten times over, and any rate slow enough to leave the chemical wear standing would be too slow to perceive.
At dawn the day that just ended is settled from flags accumulated across it. An organ is skipped if its dawn step is 0, if it is removed or ruptured, if it is a graft, or if its own insult bit was set at any point that day. Otherwise it gains its dawn step, multiplied by the organRegenMultiplier setting, up to its ceiling.
The insult flags are sampled every tick and settled at dawn. That matters more than anything else here. One tick of Nocifen at 05:59 costs the liver its whole day, and blood alcohol above 20 at any hour does the same. For the kidneys the flags are Nocifen and thirst under 25. Sepsis above 1 or radiation sickness above 1 blocks every organ in the body, systemically.
There is also a whole-body gate. Let tissue repair capacity drop under 0.55 at any point in the day and nothing knits at all. Repair capacity is food times energy times wasting: with energy at or above 60 and no wasting, hunger has to stay at roughly 30 or above all day, and a lower energy level raises that requirement sharply.
Setting organRegenMultiplier to 0 restores the pre-0.2.9 rule where organ damage was permanent for life.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Recovery cadence | once per in-game day, at the dawn boundary | ~/body/OrganHandler.java:192 |
| Tissue repair needed for any recovery | 0.55 | ~/body/OrganHandler.java:166,263 |
| Systemic block on every organ | sepsis above 1 or radiation sickness above 1 | ~/body/OrganHandler.java:275-276 |
| Liver insult flags | Nocifen above 1, or blood alcohol above 20 | ~/body/OrganHandler.java:279 |
| Kidney insult flags | Nocifen above 1, or thirst below 25 | ~/body/OrganHandler.java:280 |
| Starvation flag | bit 31 of the insult mask, blocks everything | ~/body/OrganHandler.java:247,263-265 |
| Config to restore permanence | organRegenMultiplier = 0 (default 1.0, max 8.0) | ~/config/DoomedConfig.java:2065-2072 |
One tick of an insult costs the whole day
The insult flags are sampled every tick and settled at dawn. Swallow one Nocifen at any moment of the day and your liver and both kidneys bank nothing that dawn. Let your thirst dip under 25 once and the kidneys lose the day. Drink past blood alcohol 20 at any hour and the liver does. Sepsis over 1 or radiation sickness over 1 blocks every organ in the body at once. And if your tissue repair capacity drops under 0.55 at any point - roughly, hunger under 30 with good energy, higher with poor energy - nothing in your body knits at all that day.
Harvest
Organs come from two places, a crate or a body. A violent death scatters the trunk as a cadaver torso item, stamped with the moment of death, who it was, and what their own organs were worth. That last figure is the best condition among the donor's liver and kidneys, so a body that was failing before the saw arrived yields accordingly.
From the stamp the corpse is on a clock. Under two minutes it is still warm and can yield up to 90% quality. Under five, cooling, capped at 60%. Under ten, going grey, capped at 35%. Ten minutes is the end of it. Cold slows the clock and always leaves it running: a powered freezer takes it to 15% speed and an icebox to 35%, and the code holds a floor of 5% so a body can only ever be delayed.
Opening it needs the bone saw in your inventory and Intelligence 20, ten levels above the baseline every character starts at and past what any other content in the mod asks for. The procedure runs in three stages: open the trunk in one straight pass, press and hold each of three vessel stumps, then trace the ring around the organ while keeping the blade off it.
The yield multiplies four things and skips none of them: the corpse's freshness cap, your procedure score, your cleanliness (filth costs up to 60% at dirtiness 100), and the donor's own cap. A perfect extraction from a ten-minute corpse is still a marginal organ.
Your own remains are off limits, and a donor can be opened once every 30 real minutes. Doing it costs you happiness and nausea, and it costs the same to every player within 8 blocks who watches. Each act desensitises you by 10%. A harvest that yielded more than 15% teaches you 15 Intelligence XP. Butchery teaches nothing.
The moment it comes out, it starts dying. A donor organ has 600 real seconds of ambient life, which is ten minutes. That is a sprint rather than a shelf. Viability falls linearly across the window and the tooltip names the band it is in: fresh, fading, failing, almost gone, then DEAD.
The cold chain here works differently from the corpse's. A chest is not a hospital and gets no enclosed-container mercy at all. An icebox runs the clock at 20%, stretching ten minutes to fifty. A powered freezer runs it at zero and genuinely holds the organ indefinitely. It is the one thing in the harvest chain that stops time.
The number that matters when you install it is effective quality: the harvest quality the extraction earned, multiplied by how alive it still is. A 90% organ that has been carried around for five minutes is a 45% organ.
Organs found in a crate or bought from a trader carry no tags, so they read as a flat 55% preserved quality, and their clock starts the first time the server actually looks at them rather than retroactively. That figure was chosen against the harvest curve on purpose. A clean fresh extraction lands around 69% or better, so loot stays the fallback and never the ceiling. The tooltip shows you both numbers, and the displayed viability includes the time that has passed since anything last settled the stack, so a chest-aged organ reads its real age at you.
Drag onto an arm or leg to amputate it.
tooltip.doomedmatu.saw
The saw's whole tooltip is that one line. It never mentions that the same tool opens a cadaver torso, that the work wants Intelligence 20, or that crouching with it in hand cuts an organ out of you.
The act runs through seeCorpse(), the desensitisation model on DoomedData, so the happiness and nausea it costs the surgeon and every witness within 8 blocks are the mood system's numbers scaled by how many bodies that person has already opened. Psychology
The cold chain is machinery: a torso or an organ only gets the FREEZER_POWERED multiplier while the Freezer block entity actually has power, so an unpowered freezer stores a corpse at room rate. Machines, Power and Fluids
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Freshness bands | 120 s / 300 s / 600 s | ~/item/CadaverTorsoItem.java:40-42 |
| Quality caps by band | 0.90 / 0.60 / 0.35 | ~/item/CadaverTorsoItem.java:43-45 |
| Intelligence required | 20 | ~/item/CadaverTorsoItem.java:32 |
| Corpse clock in a powered freezer | 15% speed (icebox 35%) | ~/item/CadaverTorsoItem.java:195-200 |
| Filth penalty at dirtiness 100 | 60% of the yield | ~/network/C2SHarvestOrganPacket.java:29 |
| One harvest per donor per | 36000 ticks (30 real minutes) | ~/network/C2SHarvestOrganPacket.java:36 |
| Witness radius | 8 blocks | ~/network/C2SHarvestOrganPacket.java:33 |
| Cost of seeing it done | -3.5 happiness, +6 nausea, both x your desensitisation | ~/capability/DoomedData.java:2867-2871 |
| Ambient shelf life | 600 s | ~/item/TransplantOrganItem.java:81 |
| Icebox / powered freezer | 20% speed / fully held | ~/item/TransplantOrganItem.java:195-200 |
| Loot and trader organ quality | 0.55 | ~/item/TransplantOrganItem.java:79 |
| Effective quality | harvest quality x viability | ~/item/TransplantOrganItem.java:147-149 |
| Time on the floor before it despawns | 12 minutes | ~/item/TransplantOrganItem.java:133-135 |
Cold holds an extracted organ but never a corpse
A powered freezer runs a donor organ's clock at zero, genuinely stopping it. The same freezer runs a cadaver torso at 15% and an icebox at 35%, with a hard floor of 5% in the code so that no storage can ever pause a body. The practical consequence is that the ten minutes between a death and the extraction are the real constraint, and everything after the organ is in your hand can be banked indefinitely.
Loot organs start their clock when the server first looks at them
A crate or trader organ carries no NBT, so it reads as 55% quality and full viability until something authoritative settles it, at which point the stamp is written at the current time rather than backdated. Sitting in an unloaded chest costs nothing. The displayed viability, unlike the stored one, includes the unsettled gap at ambient, so the tooltip tells you the truth even when the stored value has not caught up.
Harvesting is capped at one organ per donor per half hour
The server keeps a map of donor UUID to the game time of the last harvest and refuses any torso from that donor for 36000 ticks. It is what stops a consenting partner dying on a loop from being an organ printer. The map is server-lifetime, so a restart forgives it, and a negative gap - a stamp from a different world's clock - is dropped rather than trusted. Harvesting your own remains is refused outright, and with the default skillsResetOnDeath your own death also costs you the Intelligence the saw demands.
FRAGMENT 11-A - THE SAW'S FOUR REFUSALS
SUMMARY: The harvest packet can return one of four lines when nothing in your inventory can be opened, in the order it tests them: "That was YOU. Some doors stay shut." / "You have taken from this one too recently - the flesh remembers." / "Too long dead - whatever was in there is meat now." / "There is no body here to open."
RESPONSE: The server ranks every cadaver torso you carry by its freshness cap multiplied by what the donor's own liver and kidneys were still worth, then refuses only if none of them survived that pass. The wording explains why the whole bag failed rather than why one body did. An earlier version picked the freshest torso first and then refused it, with no way to choose the other one.
FINAL NOTE: The cooldown behind the second line is a map of donor UUID to game time, held for the server's lifetime. A restart forgives it. The line names no duration; the constant is 36000 ticks, which is thirty real minutes.
~/network/C2SHarvestOrganPacket.java:134-140, and the ranking loop at 96-133
FRAGMENT 13-C - TWO REFUSALS THAT SAY ALMOST THE SAME THING
SUMMARY: The client pre-check speaks a lang key, message.doomedmatu.transplant.none: "Nothing in there is failing badly enough to be worth replacing." The server commit speaks a hardcoded literal: "Nothing in there is failing badly enough to replace."
RESPONSE: They guard different lists. ClientHooks.canTransplant returns true for any organ under 65, all eleven of them; the server's worstFailing only ever looks at the liver, both kidneys and both lungs. A ruptured spleen therefore opens the theatre, and the refusal arrives after the abdomen has already been bled at the transplant rate.
FINAL NOTE: Only the client half has a translation key. A zh_cn client gets refused in Chinese before the surgery and in English after it. The excision messages are all translatable - but the organ name substituted into "%s - 取出。" comes from Organ.displayName(), which is hardcoded English, so a Chinese client reads "Left Kidney - 取出。"
~/client/ClientHooks.java:360-370, item/TransplantOrganItem.java:53-58 and 170-181, body/TreatmentService.java:1215-1218, assets/doomedmatu/lang/en_us.json:796-799, lang/zh_cn.json:782-785
The graft
Right-clicking a donor organ opens the theatre. It targets whichever of the liver, either kidney or either lung is worst, and only if that organ is below 65% function. Anything healthier than that is not worth the surgery.
This is the only procedure where the patient can die on the table. The abdomen is held open at roughly three and a half times the bleed of a prosthetic fit, up to a cap, and the old organ has to come out before the new one goes in. Four stages: open along the line, clamp all four vessels, seat the graft, sew each vessel back on. From the first clamp the clock is running, and courage buys no time off it. Your own blood volume sits on screen the whole time, and under 1.9 L the theatre closes itself. Being open adds 62 to that limb's pain target before sedation, scaled away entirely at sedation 70, which is why this is the procedure that makes a second player and a sedative worth having: the screen aborts below consciousness 12, so sedating yourself and then operating is out.
The graft lands between 48 and 88 condition depending on quality, where quality is your procedure score capped by the organ's effective quality. It clears the old tissue's scar outright, which is the only in-life reset there is. A botched join starts with up to 34 rejection already on the clock.
Rejection then climbs 0.055 per second forever, which fully rejects an organ in about half an hour. Lungs reject 2.4 times faster, so a lung graft is gone in under thirteen minutes. Immunosuppressants walk it back at 0.03 per second, and only 0.45 of that for a lung. Function is cut by up to 90% as rejection climbs, so a fully rejecting graft fails fast while still sitting there.
The drug is the trade. One dose covers ten minutes and costs 85 immunity for every tick of it, in a world with airborne plague, wound infection and sepsis. Doses set the timer rather than stacking it.
Stops your body destroying a transplanted organ.
While it is in you, rejection is held back - and your
immune system is switched off with it. Infection,
sepsis and plague become far more dangerous.
tooltip.doomedmatu.immunosuppressant
"Held back" is the honest word. At 0.03 per second against a 0.055 climb the drug wins on a kidney, and on a lung it recovers 0.0135 against 0.132.
The immunosuppressant's 85-point immunity penalty is applied by InfectionHandler rather than by anything here, ungated by the organ switch, so the cost of keeping a graft is paid entirely inside the infection system. Disease and Infection
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Eligible for a graft below | 65% function | ~/item/TransplantOrganItem.java:172 |
| Graft starting condition | 48 to 88 by quality | ~/body/TreatmentService.java:1290-1291 |
| Botched-join rejection head start | up to 34 | ~/body/TreatmentService.java:1293 |
| Rejection climb | 0.055/s, lungs x2.4 | ~/body/OrganHandler.java:73,77 |
| Rejection walked back while suppressed | 0.03/s, lungs x0.45 | ~/body/OrganHandler.java:74,79 |
| Immunosuppressant dose | 12000 ticks (10 minutes) | ~/item/AntimicrobialItem.java:36 |
| Immunity cost while it is in you | -85 | ~/body/InfectionHandler.java:31,114-115 |
| Theatre self-closes below | 1.9 L blood | ~/client/screen/surgery/TransplantScreen.java:32-33 |
| Open-abdomen bleed | 0.055/s x 1.85, capped at 1.10 | ~/body/SurgeryManager.java:37,39,46 |
A lung graft loses ground faster than the drug can win it back
Rejection on a lung climbs at 0.132 per second unsuppressed and only falls at 0.0135 per second under immunosuppressants, and one dose covers exactly ten minutes. Ten covered minutes recover about 8 points; ten uncovered minutes add about 79. Doses set the timer rather than stacking it, so taking a second pill early buys nothing. A lung graft is only survivable if you never let the cover lapse at all.
Excision
Crouch and right-click with the bone saw and it takes out the organ most worth losing. There is no minigame. You are opening your own abdomen with a bone saw, and the price is the point.
Three things can be excised: either kidney, or the spleen. The liver is deliberately absent from that list and always will be, since it has no pair and no substitute, so the knife refuses it. The mod hands out no unavoidable deaths and it will not let you give yourself one either. The saw also refuses to take a second kidney once the first is gone.
An organ only qualifies if it is a graft that has passed 25 rejection, or if it is ruptured. A merely damaged kidney is not a candidate, and the message you get says as much. A rejecting graft outranks a rupture, because rejection is the one failure that keeps getting worse on its own.
It costs a litre of blood, 85 pain, 45 pain-shock, and an abdomen left open at 55 skin damage with 0.45 bleed and 30 infection seeded, which is a real wound that will go septic if you leave it. Below 2.6 L of blood the saw refuses outright, because opening yourself up at that point is just suicide.
What you are left with is zero function on that organ and a rejection clock that has stopped. That is not a cure. For a kidney the survivor carries you at about half capacity while you go and find another donor.
Nothing in there is worth cutting out.
message.doomedmatu.excise.none
The same line covers three different refusals: no graft past 25 rejection, no rupture, and a liver the knife will not consider at all.
What the saw leaves is an ordinary abdominal wound in the injury system - 55 skin damage, 0.45 bleed and 30 infection seeded, with a CaseNotes INFECTED entry filed - so the aftercare is the same antisepsis and dressing as any other open belly. Injury and Treatment
Notes
- CombatRouter still holds ORGAN_RUPTURE_MIN at 18 and a rupturable set of spleen, stomach, intestines and bladder, while the organ a trunk hit selects is drawn from a modelled set of liver and the two kidneys. The sets never overlap, so the branch has never run once. Directly above the modelled set sit two javadoc comments in a row, the upper one describing a field that no longer exists. Whether the four rupturable organs were meant to join the modelled set later or the branch was meant to be cut is recorded nowhere in the source or in reference/.
- reference/ORGAN_HARVEST_SPEC.md, decision 7, says an attempt below the Intelligence gate BOTCHES - destroys the organ, worse mood hit. The shipped code refuses to open the screen and charges nothing at all: "You know where the organs ARE. You do not know how to take one." Nothing in the spec, the changelog or the code comments records the change of mind.
- Phase 2 of that same spec lists an operating-theatre requirement, a field transport cooler, and per-organ selection instead of one generic donor organ. None of it is in the tree. The organ item stays generic and its tooltip still reads "Someone else's liver or kidney, kept cold" although lungs were later added to the graft target list on Matt's call. Whether that tooltip is simply stale or the fiction intends a generic organ was never written down.
- Organ wear runs on paceFactor-scaled seconds. Convalescence is a fixed step at a dawn boundary that arrives on the vanilla day clock, and the config comment says outright that pace does not scale it. A server running pace above 1 therefore grinds organs down faster while healing them at exactly the same rate per day. That ratio reads as the product of two different clocks rather than a number anybody chose, and nothing in reference/ mentions the dawn step at all - the whole convalescence design lives in one javadoc block and one changelog paragraph.
- One gametest touches this domain: suppressantCoverageExpiresBeforeOfflineRejection, and it covers the offline rejection clock only. The dawn boundary, the scar deposit, the trunk trauma router and the entire harvest chain are unexercised by any test or preflight checker. A single dawn step is also the smallest observable unit of the 0.2.9 recovery rule, so how it actually reads in play is not established anywhere in the repo.
- Excision needs a graft past 25 rejection or a rupture, ExcisionService is the only writer of the removed flag, and trauma cannot rupture a kidney. So a native kidney can never be taken out - every excisable kidney is one somebody donated first. The guard that refuses to take the second kidney is only reachable by a player who has grafted twice and lost both grafts. Whether that was the intent or a consequence of the rupture set never being wired up is not stated.
Injury and Treatment
Every injury in Doomed is stored per body region and treated per body region, through the paper-doll panel. A wound is not a number that ticks down on its own: bleeding, deep tears, embedded objects, burns, cold injury and infection all interact, and several of them silently switch each other off. This page covers what each treatment actually does to the numbers, what the thresholds are, and which of them the game never tells you about.
Storage
Every region carries one set of aggregate values - skin health, muscle health, bone state, external bleed, internal bleed, pain, infection, burn, frostbite - plus up to four individual wound records. The records are the real injuries: a laceration, a gunshot entry, an amputation stump. The aggregates are a projection summed back out of them.
That distinction decides what a treatment has to touch. A value written straight onto the region survives only until the next time that region is touched, when the projection rebuilds the aggregate by summing the records again. Every treatment that means to change a bleed permanently changes the record instead. It is why a coagulant that only lowered the region's number appeared to do nothing.
A fifth wound landing on a region that already holds four merges into the nearest compatible record rather than opening its own. A limb opened eleven times reads as a small number of wounds carrying the accumulated damage.
Skin health caps how much a region can bleed. The ceiling is 100 minus skin, so a region at 80 skin holds at most 20 bleed units, and as skin knits back the ceiling tightens and squeezes the bleed down with it. Muscle health is capped at 50 while the bone is fractured. A missing region is made completely inert - pain, infection, wound records and lodged objects are all cleared off it. A limb that is gone stops simulating anything at all.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Wound records kept per region | 4 | ~/body/WoundLedgerService.java:17 |
| Maximum bleed a region can hold | 100 - skin health | ~/body/LimbData.java (maxBleedForSkin) |
| Muscle ceiling while fractured | 50 of 100 | ~/body/LimbData.java:37 |
| Maximum internal bleed per region | 2.0 L/min | ~/body/LimbData.java:33 |
Clotting
External bleed is measured in source units. Each unit of summed, unmasked bleed drains roughly 0.015 litres per minute of blood, and a full body holds about 5 litres.
Natural clotting is slow on purpose. A small bleed at or under 2 units clots at 0.050 units per second. A serious bleed at or above 8 units clots at 0.017, and the middle blends between them. At that rate a serious untreated wound stays open long enough to kill you. The figure was deliberately lowered from a faster one that made a single wound survivable forever.
Several modifiers scale clotting at once. Venom is an anticoagulant and reduces clotting to zero at venom 20. Nocifen, the non-opioid painkiller, thins the blood and drags clotting down with it, so a medicated wound bleeds longer. Cold below 35 C degrades clotting on a straight line to 60 percent at 30 C. The comfortable temperature band buys a small 8 percent bonus instead, and the two can never both apply.
An embedded fragment suspends clotting entirely. Not slows - suspends. A wound with shrapnel in it weeps until the fragment comes out, however long you wait and whatever you wrap over it.
Blood loss also tapers as the body empties. Below 0.75 litres the flow rate falls toward zero, because there is nothing left to lose. The wound is unchanged and still reads as open.
Internal bleeding is a separate channel measured directly in litres per minute, and no dressing reaches it. Procoagulant works anywhere. Regenex is thoracic only.
The field answer with no drugs at all is holding still. While a body is genuinely not moving, an internal bleed clots at 0.0025 units per second. Crouching counts as deliberate pressure and multiplies that by 1.7. Being unconscious on the floor counts too, which is why dragging a downed friend somewhere quiet is worth doing. Any real locomotion stops it outright, and so does sprinting or swinging.
Adrenaline suppresses it, scaling down to a floor of 30 percent, so a frightened body clots badly. A moderate internal bleed is minutes of doing nothing in a game that will not pause for you, and it is far too slow to outrun a serious haemorrhage. An embedded fragment suspends internal clotting the same way it suspends external clotting.
Direct pressure is the bare-handed answer to an external bleed. Both hands empty, kneeling on the wound. It multiplies the region's flow by 0.35 while held, and floors at 0.7 on a deep wound, because a hand cannot close an artery. It masks flow exactly like a tourniquet: the stored wound is untouched, you are standing on the hose.
Pressure costs stamina at sprint rate. Below 0.5 stamina it stops helping and starts grinding the raw tissue instead, pushing that region's pain toward 60. Ten seconds of real pressing banks a full release credit, which then drains back to open flow over 20 seconds. A tap banks nothing. You get one benefit slot: one pair of hands, one wound.
A non-opioid painkiller.
Weaker than the opioids, but no breathing risk, no
overdose, no addiction - and doses stack. Also fights
fever and inflammation.
The catch: it thins your blood (wounds clot slower)
and upsets your gut. Don't pop it while you're bleeding,
and don't chain doses or you'll start a stomach bleed.
tooltip.doomedmatu.nocifen
The tooltip is the only place the anticoagulant side of Nocifen is stated, and it states it as advice rather than a rate. It does not say the drug shares a multiplier chain with venom, cold and warmth.
The cold clotting penalty reads the same core temperature the survival layer drives, and wet clothing on a frozen peak settles that near 26 C - far under the 30 C floor, so clotting sits at 60 percent for as long as you stay up there. Needs and Survival
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Bleed unit to blood loss | 1 unit = 0.015 L/min | ~/capability/DoomedData.java:1028 |
| Clot rate, serious wound (8+ units) | 0.017 units/s | ~/body/BleedHandler.java:26 |
| Clot rate, small wound (2 units or less) | 0.050 units/s | ~/body/BleedHandler.java:29 |
| Clotting reaches zero at venom | 20 | ~/body/BleedHandler.java (venomClotFactor) |
| Cold clotting penalty | starts below 35 C, floors at 60% by 30 C | ~/body/BleedHandler.java:33 |
| Warmth clotting bonus | +8% at full comfort | ~/body/BleedHandler.java:36 |
| Clotting while a fragment is embedded | 0 | ~/body/BleedHandler.java (hasShrapnel gate) |
| Internal clot rate while still | 0.0025 units/s | ~/body/BleedHandler.java:64 |
| Crouch bonus | x1.7 | ~/body/BleedHandler.java:66 |
| Adrenaline floor on internal clotting | 30% | ~/body/BleedHandler.java:72 |
| Direct pressure flow multiplier | 0.35 (0.7 on a deep wound) | ~/capability/DoomedData.java:1085 |
| Pressure hold to bank full credit | 10 s | ~/capability/DoomedData.java:1088 |
| Pressure credit fade after release | 20 s | ~/capability/DoomedData.java:1091 |
| Stamina at which pressing starts hurting instead | 0.5 | ~/body/PressureHold.java:39 |
| Pain added while pressing exhausted | 2.0/s, capped at 60 | ~/body/PressureHold.java:41 |
Anything embedded in a wound suspends clotting completely
While a fragment is in a region, both external and internal clotting are multiplied by zero on that region. Natural healing is blocked as well. A bandage will still staunch it, but the moment the wrap comes off or the deep wound reopens the bleed is exactly where it was, and it will never settle on its own.
Holding still is a real treatment for internal bleeding
Internal bleeding tamponades at 0.0025 units per second while you are genuinely stationary, multiplied by 1.7 while crouched, and being unconscious on the floor counts. Adrenaline scales it down to a floor of 30 percent, so a frightened body clots badly. Any real locomotion, sprinting or swinging stops it dead. A 0.40 internal bleed takes roughly 2.7 minutes of lying up.
Closure
Once a region's bleed reaches 20 units the wound is promoted to deep, and any earlier stitch bookkeeping is thrown away. It is a new tear and it needs treating again. Some wound types are deep on creation however hard they are bleeding: an avulsion, an amputation stump, a gunshot entry or exit. A laceration, puncture or bite is deep only if the tract went at least 75 percent of the way into the tissue.
A bandage does not close a deep wound. A full wrap staunches it to zero bleed and arms a 3-minute countdown. When that expires the wound weeps again, back up to the deep-wound threshold or whatever the open skin can sustain, announced by a wet squelch and the moodle returning. Until it is properly closed, the flesh knits at one fifth of normal speed.
Four things close a wound for good. A clean suture is the best close in the game. A wound stapler does it instantly with no minigame, at a rougher skin restore and a sharper pain spike. Cauterisation welds it shut under a held flame. And a botched suture does not close it at all.
That last one is worth reading twice. The stitching minigame scores from 0 to 1 on the entry knots, the exits and the line of the thread. At 0.55 or better the wound is shut for good and the bleed stops dead. Under 0.55 the thread tears through the edges: the suture is spent, the skin knits a little, the bleed is pinched, and the wound is still deep and still unstitched. It is measurably worse than a staple.
A spring-loaded surgical stapler (about 12 staples).
Drag onto a deep wound to close it INSTANTLY like a
suture - faster and dirtier: it stings hard and knits
the skin rougher. A clean stitch still heals best.
tooltip.doomedmatu.woundstapler
True for a clean stitch. The comparison the tooltip makes is against the stitch that lands, and under quality 0.55 the thread tears through and closes nothing, which puts the guaranteed staple ahead of the suture the player actually got.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Bleed at which a wound becomes deep | 20 units | ~/body/LimbData.java:41 |
| Reopen delay after a bandage | 3600 ticks (3 min) | ~/body/LimbData.java:43 |
| Healing rate on an unstitched deep wound | 20% of normal | ~/body/LimbHandler.java:42 |
| Suture quality needed for a clean close | 0.55 | ~/body/TreatmentService.java (cleanClose) |
| Suture skin restore | +6 to +25 by quality | ~/body/TreatmentService.java (applyLimbMed SUTURE) |
| Suture pain | +8 to +24 by quality | ~/body/TreatmentService.java (applyLimbMed SUTURE) |
| Staple: skin, bleed, pain | +15 skin, bleed to 0, +22 pain | ~/body/TreatmentService.java (applyLimbMed STAPLE) |
| Staples per stapler | 12 | ~/registry/DoomedItems.java:165 |
| Tract depth that makes a laceration or puncture deep | 0.75 | ~/body/WoundLedgerService.java:22 |
A ragged suture is not a closure at all
The stitching minigame reports a quality from 0 to 1. At 0.55 or better the deep wound is shut for good. Below that the thread tears through: the suture is consumed, the skin knits a little and the bleed is pinched, but the wound remains deep and unstitched, which is byte-for-byte the state a bandage leaves. The 3-minute reopen countdown arms and the wound weeps again. A botched suture is measurably worse than a wound stapler's guaranteed mediocre close.
FRAGMENT 03-B - PINCHED, NOT CLOSED
SUMMARY: The message the server sends when a stitch on a deep wound scores under 0.55. Recovered because it is the only notice a player gets that the closure failed.
RESPONSE: "You stitch the deep wound in the Left Forearm, but the thread tears through the edges. It is pinched, not closed." The clean version, for comparison: "You stitch the deep wound in the Left Forearm neatly closed; it will heal properly now."
FINAL NOTE: The line names the failure and withholds the number. The wound is left in the exact state a bandage leaves - deep, unstitched, three minutes on the reopen countdown - and the suture item is gone. The clinical record writes no closure for it, correctly, since nothing was closed.
~/body/TreatmentService.java, applyLimbMed case SUTURE, the botch branch around line 930.
Dressings
Every dressing goes on through the same wrap minigame and carries its own potency, all of it scaled by how much of the wrap was completed. A wrap of 0.9 or better staunches the bleed to zero outright. Below that the bleed is multiplied toward the dressing's floor.
The plain bandage restores 30 skin and cuts bleeding to 10 percent at a full wrap. The adhesive bandage is nearly useless on a real wound. The ripped dressing is improvised cloth with modest bleed control and real pain relief. The sterilized bandage adds a 45-second antiseptic window. Analgesic gauze kills limb pain hard and pushes a systemic opiate dose in with it, which matters on an already medicated body. The plastic dressing is an occlusive seal with near-total bleed control. Alginate is the best wrap available: full skin restore, all but stops the bleed, and a 60-second disinfect window.
The two herbal dressings are early-game and stay early-game. The herbal poultice halves bleeding. The bittermoss wash barely wraps at all, but carries a 90-second disinfect window, which is the early answer to an infection.
Dressings are durable rather than consumed. Each carries a condition pool, and a full wrap costs 56 points on a large region, 40 on a medium one, and 28 on a small one. A partial wrap costs proportionally less, with a floor of one point. When the pool runs out the dressing is gone.
An antiseptic dressing used on an infected region with no open wound performs a wash instead: the disinfect window alone, with no minigame and no gauze left behind, at a flat cost of 4 condition. That exists because an infection outlives the wound that started it, and refusing to treat one on closed skin used to strand people.
A completed wrap stays visible on the body for 2 to 10 minutes depending on how complete it was.
An early antiseptic made from cold-grown moss.
Wrap a wound, or wash an infected limb directly - no open
wound needed. Its skin and bleed control are weak, and its
disinfect is far shorter than real antiseptic.
tooltip.doomedmatu.bittermoss_wash
This is the one dressing tooltip that tells the player the wash path exists. The others carry disinfect windows and route the same way, and say nothing about it.
Analgesic gauze writes its 28 points straight into the systemic opiate level, so a wrap counts toward tolerance and stacks on top of anything already injected. Drugs and Pharmacology
The bittermoss wash starts as worldgen: bittermoss scatters in cold biomes, harvests double with the foraging knife, and has to be ground to pulp before it is a dressing at all. Items, World and Trade
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Wrap that fully staunches | 0.9 | ~/body/TreatmentService.java (applyBandage) |
| Bandage | skin +30, bleed x0.10, 64 condition | ~/registry/DoomedItems.java:104 |
| Adhesive bandage | skin +3, bleed x0.90, pain -5, 24 condition | ~/registry/DoomedItems.java:108 |
| Ripped dressing | skin +8, bleed x0.78, pain -40, 32 condition | ~/registry/DoomedItems.java:112 |
| Sterilized bandage | skin +30, bleed x0.44, pain -60, 45 s disinfect, 48 condition | ~/registry/DoomedItems.java:116 |
| Analgesic gauze | skin +20, bleed x0.375, pain -300, +28 opiate, 48 condition | ~/registry/DoomedItems.java:120 |
| Plastic dressing | skin +60, bleed x0.10, pain -100, 56 condition | ~/registry/DoomedItems.java:124 |
| Alginate | skin +100, bleed x0.09, pain -80, 60 s disinfect, 56 condition | ~/registry/DoomedItems.java:128 |
| Herbal poultice | skin +18, bleed x0.50, pain -20, 20 s disinfect, 20 condition | ~/registry/DoomedItems.java:249 |
| Bittermoss wash | skin +5, bleed x0.85, 90 s disinfect, 20 condition | ~/registry/DoomedItems.java:253 |
| Condition cost of a full wrap | 56 large / 40 medium / 28 small | ~/body/TreatmentMath.java:17 |
| Condition cost of a wash | 4 | ~/body/TreatmentService.java:99 |
The strap
A tourniquet goes on a non-vital arm or leg segment and stops all blood loss from that segment and everything below it, instantly. The wound's stored bleed is unchanged. Only its contribution to blood loss is masked, and the mask walks the whole chain downward from the anchor.
Applying one spends a single point of the strap's eight and consumes the strap itself, which now lives only as the stored condition on the limb. Removing it hands the strap back at that condition. A strap that reached zero returns nothing.
The strap then starts a clock, and the clock is the whole mechanic. The anchor segment's pain ramps at 2 per second up to a cap of 40. At 540 seconds, nine minutes, every cut-off segment starts losing muscle at 2 per second. A starved segment that drops below 5 muscle has its infection floored at 10 and turns septic.
At 840 seconds, fourteen minutes, the limb is simply gone. It comes off through the necrotic loss path, so the stump is dry - tissue that died on the body does not gush like a saw cut. That leaves five full minutes after necrosis visibly begins in which taking the strap off still saves the limb, on top of the nine before it starts. You have to ignore it to lose it.
A tourniquet on a limb that is later blown off falls away with it.
Clamp a limb to stop all bleeding below it.
tooltip.doomedmatu.tourniquet
Accurate, and it is the whole of what the game tells you. The nine-minute muscle death, the sepsis floor and the loss of the limb at fourteen minutes appear nowhere in the item text.
An overtight splint is a tourniquet, and nothing warns you
The splinting minigame's tension stage has a target band between 0.55 and 0.78. Past 0.88 you have bound the limb hard enough to shut off its circulation, and the server sets the same tourniquet flag a real strap sets. The brace inherits the entire ischaemia clock: pain ramping to 40, muscle death across the whole cut-off chain at nine minutes, and limb loss at fourteen. It stores zero strap condition, so removing it returns nothing.
Splints
A fractured segment produces no useful force worth the name until it heals, and it caps that segment's usable muscle at 50. On a hand-chain segment, an unsplinted fracture multiplies that link's function by 0.38, and splinting it raises that to 0.58. A dislocated or unstable joint in the region multiplies by a further 0.42, and pain scales the whole thing by 1 minus pain over 145, floored at 0.3.
Splinting is a two-stage minigame with two opposed failure modes. Stage one is traction: the distal fragment is hauled back into line, and the score is how collinear it is at the moment of commitment. Your own pain tremble is directly in the way, so setting a bone while you are wrecked genuinely sets it worse. Stage two is tension: the strap tightens toward a target band between 0.55 and 0.78 on the gauge.
Alignment scales the brace's durability between 35 percent and 100 percent, and scales how much seating it hurts. A slack brace keeps 30 percent of that durability and will not hold.
A splint sheds 0.02 durability per tick, so a perfectly aligned brace lasts about four and a quarter minutes. A splinted fracture mends in 75 seconds of pace time. An unsplinted one still knits on its own, over about 30 minutes. Progress made under a brace survives the brace wearing out.
The bone welding tool is the brutal shortcut. It mends a fracture instantly at the cost of 30 pain, 25 skin, 26 muscle and a fresh 5 units of bleed, and it has four uses.
Stabilises a fractured limb so it can heal.
tooltip.doomedmatu.splint
Seven words that describe the good outcome. The tension stage is what decides whether the brace holds, and past 0.88 the same screen binds the limb hard enough that the server flags it as a tourniquet.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Hand function multiplier, unsplinted fracture | x0.38 | ~/body/HandFunctionService.java:177 |
| Hand function multiplier, splinted fracture | x0.58 | ~/body/HandFunctionService.java:177 |
| Splint tension target band | 0.55 to 0.78 | ~/client/screen/SplintScreen.java:53 |
| Tension above which the brace strangles | 0.88 | ~/client/screen/SplintScreen.java:55 |
| Splint durability by alignment | 35% to 100% of 100 | ~/body/TreatmentService.java:52 |
| Durability kept by a slack brace | 30% of that | ~/body/TreatmentService.java:54 |
| Splint wear | 0.02/tick (about 4.2 min from full) | ~/body/LimbHandler.java:44 |
| Splinted fracture mend time | 1500 ticks (75 s) | ~/body/LimbHandler.java:46 |
| Unsplinted fracture mend time | 36000 ticks (about 30 min) | ~/body/LimbHandler.java:49 |
| Splint seating pain | 25 x (1 + 1.2 x misalignment) | ~/body/TreatmentService.java:46 |
| Bone welding tool cost | +30 pain, -25 skin, -26 muscle, +5 bleed | ~/body/TreatmentService.java (applyLimbMed BONE_WELD) |
Foreign bodies
Anything embedded in a region blocks all natural healing there and suspends clotting, so the wound weeps until it comes out.
Shrapnel is the simpler case. Fragments come out bare-handed or with tweezers, and the panel refuses either while that region's pain is at 60 or above - numb it first. A clean pull costs nothing. A slip tears the wound for 5 skin, 12 pain and a unit of bleed, and on the head it takes a little brain with it four times out of five.
A whole arrow is different. It is barbed, and it has a depth: how far through that region's meat it sits, rolled on the hit. About a quarter of hits sit barely in, a third are buried halfway, a quarter are buried deep, and the rest go through-and-through with the head out the far side. The extraction screen draws the region as a cross-section to its real thickness, so a forearm is a thin slab and the torso is a deep one.
Removal is entirely manual. You wiggle an end off, or push the shaft through, or pull it back, and each has its own price. Snapping the shaft flush is the cheap, safe move, and it leaves the barbed head in you as a fragment to dig out later. Drawing the shaft out after a snap, or a shallow straight pull, removes it for a moderate cost. Hauling the whole barbed arrow back out rakes the channel on the way, and the deeper it sat the worse the rake. Botching a pull-back means the barbs catch, the arrow stays, and it lodges deeper.
A vital core region - chest, gut, neck, head - has no safe route out at all. Driving the head out through what is behind it is near-fatal, and the shattered head stays lodged anyway. Even a clean pull from a core region drags a shaft through organs and adds internal bleeding. Snap the shaft flush and live with the head.
While an arrow stays in, using the pierced anatomy jostles the tract. Mining, swinging and hard landings each roll for a jolt of pain at most once every four seconds, and much more rarely reopen some bleeding.
Hold and click an embedded limb to extract foreign material.
Disinfect first: filth can seed infection during extraction.
tooltip.doomedmatu.tweezers
Written for shrapnel. A lodged arrow opens its own cross-section screen instead, and the pain gate at 60 that refuses the click either way is stated nowhere.
The panel will not offer a fragment pull while that region's pain is 60 or above, so an analgesic or an ice pack is a prerequisite for the extraction rather than a comfort alongside it. Pain, Consciousness and Death
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Pain gate on shrapnel removal | 60 | ~/client/screen/StatusPanelScreen.java:100 |
| Shrapnel slip cost | -5 skin, +12 pain, +1 bleed | ~/body/TreatmentService.java:86 |
| Arrow: snap the shaft | +15 pain, +4 bleed, -3 skin, head stays as a fragment | ~/body/TreatmentService.java:613 |
| Arrow: draw the shaft out (limb) | +22 pain, +14 bleed, -5 skin | ~/body/TreatmentService.java:616 |
| Arrow: barbs catch (fails, stays) | +42 pain, +36 bleed, -12 skin, depth +0.15 | ~/body/TreatmentService.java:619 |
| Arrow: whole barbed pull-back (limb) | +32 pain, +26 bleed, -9 skin, scaled 0.25x to 1.35x by depth | ~/body/TreatmentService.java:629 |
| Arrow: forcing one out of a core region | +0.7 L/min internal, +55 pain, +36 bleed | ~/body/TreatmentService.java:624 |
| Arrow: clean pull from a core region | +0.45 L/min internal, +35 pain, +24 bleed | ~/body/TreatmentService.java:634 |
| Arrow depth roll | 25% barely in, 33% halfway, 26% deep, 16% through | ~/body/CombatRouter.java:740 |
| Aggravation cooldown while an arrow stays in | 80 ticks pain, 400 ticks bleed roll | ~/body/ForeignBodyAggravationHandler.java:43 |
Burns
A burn is tracked per region as a percentage, built at 6 points per point of fire damage. It does not bleed. It festers and leaks instead.
Any burn above 40 on a region will infect it, seeded at 8, unless an antiseptic window is already open there. Burns also ache: the resting pain target carries 0.6 pain per point of burn, which means painkillers can actually ease it.
The dangerous part is area. Once total burn across all regions passes 120, plasma starts leaking and blood volume falls. That loss scales with how much of the body is burned, reaching four times the base rate at a total of 400. This is burn shock, and it is what kills people who stand in lava rather than the damage itself. Treat it with blood or saline, not with a bandage.
Burns recover on their own at 0.15 per second, which is slow. Burn gel is the real answer: it takes 60 points off the burn, halves that region's pain, restores 25 skin and lays down a 5-minute antiseptic window so the burn does not fester. Aloe gel is the gentle version - 25 points off, pain to three quarters, 10 skin back - and it is deliberately weaker. It is comfort, not a cure.
A burn treated to zero leaves no scar.
Cauterisation deserves its own note here, because it is a burn you inflict on yourself. A sustained flame pressed to a bleeding wound stops the bleed dead and crudely welds a deep wound closed with no thread needed. It costs 30 burn, 45 pain, and a 40 percent chance the wound festers at an infection of 20. A spark does not count - flint and steel is excluded, while a torch, campfire or lantern is not.
Frostbite only accrues below a core temperature of 31 C. That is genuine deep hypothermia, well past ordinary cold. It thaws above 35.5 C.
Only limbs freeze, and they freeze on a gradient from the warm core outward. Hands and feet accrue at full rate. Forearms and shins accrue at 0.6. Upper arms and thighs at 0.35. The head, neck, eyes, chest and abdomen never frostbite at all. How far below 31 C the core has fallen scales the rate further.
Thawing runs the other way: proximal segments thaw fastest, so the cold recedes outward and the tips are last to come back. A heat pack floods the core with 5 C of warmth and pulls frostbite off every affected limb, most from the proximal ones.
At 85 percent frostbite the tissue starts dying, at 1.2 skin and 0.8 muscle per second. That same threshold blocks all natural healing on the segment, so it cannot regrow what is being destroyed. Below that threshold, a thawed segment regrows normally.
If a segment reaches 99 percent frostbite with both skin and muscle at or under 1, it is lost. It and everything distal to it come off together and splat free, with a dry stump - frozen black tissue does not gush like a saw cut. There is no warning text. The doll, the moodles and the stump are the notification.
Frostbite also makes bone brittle. A frozen segment keeps 55 percent of its tolerance in a fall.
Cool gel pressed from a cactus.
Drag onto a limb - soothes burns, dulls the ache, restores a little skin.
Comfort, not a cure.
tooltip.doomedmatu.aloe_gel
The item text and the numbers agree here. Aloe is weaker than burn gel on every axis and carries no antiseptic window, so a burn treated with it can still fester above 40.
Burn shock is a blood problem wearing a burn's clothes: it drains volume directly at up to 0.04 litres per second with no bleed unit anywhere in the arithmetic, so it answers to transfusion and saline and ignores every dressing in your pack. Blood and Circulation
Body traits scale the freezing before anything else touches it - WARM_BLOODED multiplies frostbite accrual by 0.6 and POOR_CIRCULATION by 1.6 - so two characters standing in the same storm lose their hands on different clocks. Transformation
FRAGMENT 06-A - THE STRAP, PAGE FOUR
SUMMARY: A field journal page recovered on a body, filed under BODY, titled "The strap". Three earlier pages track the same tourniquet going on, biting, and coming off. The fourth page unlocks only on a specific event, and the reader had reached it.
RESPONSE: The page reads: "The strap came away with it. There was hardly any blood. The place where the limb ended looked dry, dark and old, as if it had been dead much longer than the rest of me knew." The server's own line at that instant is shorter: "The strap was on too long. There was nothing under it left to save."
FINAL NOTE: Page four is gated on the loss actually happening. A player who takes the strap off in time owns pages one through three and will never see the fourth. The dryness in the writing is mechanical - necrotic loss seals the stump as it kills, so nothing gushes.
res/data/doomedmatu/doomed_journal_entries/the_strap.json, page 4; the action-bar line and the page-3 unlock both fire from ~/body/TourniquetHandler.java at 840 seconds.
Infection
A region can only become infected once its skin drops below 80. From then on it rolls to start an infection every 40 seconds, at a chance set by your immunity, the wound's own contamination, and whether anything is still lodged in it. Once the infection flag is set, the percentage climbs on a curve driven by immunity. Clear the percentage to zero and the flag clears with it.
An antiseptic window is the source-control treatment. While one is open the infection regresses instead of progressing, at roughly 8.6 percent per minute at typical immunity. A pour of proper antiseptic opens a 10-minute window and strips 55 contamination and 18 infection off the wound record directly. Iodine gives 8 minutes. Antiseptic mush gives 5, plus 4 minutes on the segment above it, and stings for 10 pain. Bittermoss wash gives 90 seconds, which is the early-game answer and is meant to stay one.
Antibiotics are systemic and slower, stripping about 7 percent per minute off every infected region while a course runs. Repeated courses build resistance, which halves their effect at 40 and decays only while you are off them. Using a topical and a course together is properly strong, because that is the correct medical answer.
Past 75 percent infection the wound rots. It eats muscle at 0.05 per second, and - this is the part that catches people - the region stops healing entirely. Skin does not knit back over a rotting wound. Before that rule existed, a fed player's regeneration outran the rot and infection could never actually damage anything. Above 90 percent it can seed a neighbouring region.
Any invasive procedure done with a filthy body contaminates the wound just manipulated. It starts at dirtiness 35 and rises to an 8 percent infection chance at maximum grime. An existing disinfect window removes 90 percent of that risk.
Apply to a wounded or infected limb to disinfect it.
Use before invasive care to sharply reduce infection risk.
tooltip.doomedmatu.antiseptic
"Sharply" is 90 percent of the procedure risk, and the window it opens is the longest in the mod at 10 minutes. Neither number is anywhere in game.
Crafted liquids reach the wound record through the same disinfect call the bottled antiseptic uses: a 100 mL pour of alcohol strips 22 contamination and buys 350 seconds of cover, while bleach strips 44, grants no window at all, and charges 20 skin and 15 muscle for the privilege. Reagents and Routes
A wound rotting past 75 percent infection stops healing entirely
Skin and muscle regeneration are switched off completely on any region whose infection is above 75. This is not a slowdown. It exists because natural regeneration at default rates is strictly larger than infection's own rot rate, so before this rule a fully infected limb net gained muscle every tick and the whole rotting-wound mechanic was decorative.
Amputation
Only the arm and leg chains can be amputated. Cutting a segment takes it and everything below it, and leaves an open stump on the segment above. Cutting the upper arm takes the forearm and hand with it, and the stump lands on the chest.
The cut needs something that goes through bone. A bone saw anywhere in your pack is the clean cut and the numbers the system was tuned around. An axe works and charges you for it: nearly double the immediate blood loss, nearly double the muscle taken off the stump, a third more pain and trauma, and 55 extra contamination on the stump wound with the surgical disinfect wiped. The saw is worth carrying.
The cut itself is not a checklist item. Each amputation dumps 0.35 litres of blood on the spot with a saw, adrenaline floors at 60, and a motor shock of 30 slams through you, which is above the collapse line. Doing all four in a row means repeated collapses and a stacking blood deficit.
Then the stump. It takes skin to zero, 50 muscle off, pain to 100, and it bleeds at the full rate. An open amputation channel is worth 60 bleed units, which the conversion turns into roughly 0.9 litres per minute. Exactly three things close it: a tourniquet anywhere proximal, dressing or cauterising the open stump wound on the parent segment, or fitting a prosthetic whose socket seals it. Without one of those, an unbandaged amputee exsanguinates.
Sawing your own neck takes the head off. There is no confirmation and no minigame.
A violent death bursts the body apart. Each arm and leg is flung free as a harvestable severed piece, and any fitted prosthetic drops as its own item carrying the wear it had.
Drag onto an arm or leg to amputate it.
tooltip.doomedmatu.saw
Eight words for the operation that dumps 0.35 litres on the spot, floors adrenaline at 60 and opens a channel bleeding 0.9 litres a minute until one of three specific things closes it. The tooltip also never says an axe will do the same job at a penalty.
The Deep Maw calls the same dismember path a saw does, so a limb it tears off opens the identical 60-unit stump channel and shuts through the same three exits. Threats
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Axe penalty vs saw | 1.9x blood, 1.85x stump muscle, 1.35x pain and trauma, +55 contamination | ~/body/DismemberService.java:139 |
| Blood lost on the spot per cut (saw) | 0.35 L | ~/body/DismemberService.java:44 |
| Motor shock per cut | 30 | ~/body/DismemberService.java:47 |
| Adrenaline floored at | 60 | ~/body/DismemberService.java:41 |
| Stump muscle loss | 50 | ~/body/DismemberService.java:38 |
| Stump disinfect window | 300 s | ~/body/DismemberService.java:40 |
| Open amputation channel | 60 bleed units (about 0.9 L/min) | ~/capability/DoomedData.java:1032 |
| Bleed at which a stump counts as closed | 0.5 units | ~/capability/DoomedData.java:1030 |
| Trauma, self-amputation | +30 then -20 for completing it yourself | ~/body/DismemberService.java:42 |
The stump keeps bleeding at 0.9 litres a minute until you do one of three specific things
An open amputation boundary contributes 60 bleed units, roughly 0.9 litres per minute, and that channel keys off the permanent missing-limb state rather than any wound you can see. It closes only if there is a tourniquet anywhere proximal, or the open stump wound on the parent segment is dressed or cauterised below 0.5 bleed, or a prosthetic is fitted and seals the socket. A shoulder or hip disarticulation cannot be tourniqueted at all, since there is nothing above it to tie.
An axe amputation hands you an infection to treat afterwards
Cutting with an axe adds 55 contamination to the stump wound and wipes the surgical disinfect window that the saw path leaves behind, on top of 1.9 times the blood loss, 1.85 times the stump muscle loss and 1.35 times the pain and trauma. A saw anywhere in your pack automatically beats an axe in your hand.
Prosthetics
A prosthetic seats on the stump, meaning the highest missing segment of that limb, and fills every missing segment below it. Fitting to a lower portion while the segment above is also gone is impossible; the game walks the fit up to the real stump.
A stump has to be ready. It must be healed to at least 65 percent, bleeding at 8 or less, infected at 5 or less, with systemic sepsis under 8. Stump healing runs at 0.13 per second, gated by nutrition and immunity, and only while the stump is stable.
Three tiers. Improvised restores 45 percent of limb function, mechanical 88 percent, titanium 98 percent. None of them beat healthy tissue at everything. Fitting is a real operation: improvised is two stages, mechanical adds a bolt ring that must be brought up in a star pattern, and titanium adds a nerve weave held at each junction. The stump bleeds on the server's clock the whole time the screen is open, so a titanium fit genuinely costs blood an improvised one does not.
Effective function is the tier's ceiling scaled by condition rather than the tier alone. At zero condition a fitted limb is dead weight at 10 percent of its tier. Fit quality can only take away from what the item was worth - a perfect operation cannot make a scavenged limb better than it is - and it floors at 45 percent of the item's condition.
Prosthetics wear instead of healing. Idle wear is 0.012 per second always. A prosthetic leg loses 0.060 per second while you move; a prosthetic arm loses 0.050 per second while swinging. Tier changes the appetite: mechanical is the reliable workhorse at 1.0, improvised is crude at 1.4, and titanium's neuromechanics are the thirstiest at 1.6. Combat impacts batter one fitted segment at a time, and there the expensive tiers resist better.
Upkeep is two-tier. Prosthetic lubricant is a right-click that puts 40 condition back into every running prosthetic at once, and refuses a seized one. A seized limb needs a wrench plus tier-appropriate material - leather, an iron ingot, or netherite scrap - which restores it to 100.
Missing tissue itself feels nothing, but the flesh the hardware is seated in does. A poor fit adds up to 24 socket irritation immediately, and movement grinds more in depending on fit quality, how immature the stump is and how worn the limb has become. Resting eases it. Phantom pain runs on its own clock with episodes of 12 to 40 seconds, and adaptation and mirror therapy lower the frequency without ever curing it.
Right-click to grease your fitted prosthetics, restoring their condition.
Routine upkeep - prosthetics wear down as you use them.
A fully seized prosthetic needs a wrench + parts instead.
tooltip.doomedmatu.prosthetic_lubricant
This is the one tooltip in the domain that matches its code exactly, including the two-tier split and the refusal on a seized limb.
The fitting gate reads whole-body sepsis rather than the stump alone and refuses above 8, so an infection anywhere else in you blocks the operation. Disease and Infection
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Tier function | improvised 45%, mechanical 88%, titanium 98% | ~/body/ProstheticTier.java:5 |
| Effective function | tier x (0.10 + 0.90 x condition/100) | ~/body/LimbData.java (prostheticFunction) |
| Stump healing needed to fit | 65% | ~/body/AmputationHandler.java:13 |
| Stump bleed and infection limits for fitting | bleed 8 or less, infection 5 or less, sepsis under 8 | ~/body/AmputationHandler.java:14 |
| Stump healing rate | 0.13/s, scaled by nutrition and immunity | ~/body/AmputationHandler.java:95 |
| Fit quality floor on condition | 45% of the item's condition | ~/body/TreatmentService.java:50 |
| Idle wear | 0.012/s | ~/body/WearableEffects.java:167 |
| Leg wear while moving | 0.060/s | ~/body/WearableEffects.java:168 |
| Arm wear while swinging | 0.050/s | ~/body/WearableEffects.java:169 |
| Wear multiplier by tier | improvised 1.4, mechanical 1.0, titanium 1.6 | ~/body/WearableEffects.java:205 |
| Impact resistance by tier | improvised 0.75, mechanical 0.45, titanium 0.25 | ~/body/WearableEffects.java:148 |
| Lubricant restore | +40 condition to every running prosthetic | ~/item/ProstheticLubricantItem.java:25 |
| Wrench repair materials | leather / iron ingot / netherite scrap, restores 100 | ~/body/TreatmentService.java:574 |
| Socket irritation from a bad fit | up to +24 | ~/body/AmputationHandler.java (noteFit) |
| Phantom pain episode length | 12 to 40 s | ~/body/AmputationHandler.java:117 |
| Open-stump bleed during a fitting operation | 0.055/s x 0.55 | ~/body/SurgeryManager.java:37 |
Fit quality is permanent and can only subtract
A prosthetic is seated at the item's own condition multiplied by (0.45 + 0.55 x fit quality). A clean operation seats it at whatever the item was worth; a rushed one leaves it sitting at as little as 45 percent of that, and the socket ache charges you for it every second you wear it. A perfect fit cannot make a scavenged limb better than it is. The fit quality is also stored and drives ongoing socket irritation and adaptation gain.
Treating others
Right-click a Doomed player while holding the right item and a treatment starts on them. The item comes from your inventory and the feedback comes to you; their body is what gets treated and re-synced. You have to be within 6 blocks with line of sight, and awake enough to work.
The division is strict and it is the point. Your own hand does the minigame, with your own pain tremble and your own cursor lag. Their body takes the result. A steady medic gets a clean stitch on a wrecked patient.
Self-treatment stays open for 9 seconds after you pass out. That grace exists so fumbling the AED onto your own chest as you black out still lands. Treating yourself deep into an arrest you have been in for the better part of a minute does not. Another player treating you is untouched by that limit, which is exactly why the window can afford to be short.
Some cross-player treatments ask first, because they can hurt: applying or removing a tourniquet, disinfecting, chest drains, limb meds and amputation. The ask lasts 4 seconds. Crouching after the ask refuses it instantly and locks that healer out for 30 seconds. Silence is only consent if the patient actually holds still for most of the window - fleeing or fighting is not a yes. A patient who cannot answer gets implied consent, because an unconscious femoral bleed is the reason the cross-player tourniquet exists.
Implied consent has teeth. Nobody pulls someone else's strap while what it is holding back would gush; the check measures the whole masked chain including the amputation channel, and refuses above 5 bleed units. A patient who genuinely wants a gushing strap off can do it themselves - their own click has no gate. An ice pack is refused on an unconscious patient, because stacked cold on a body that cannot say enough walks core temperature into arrest. Iodine and antiseptic mush are refused on an unconscious patient whose region pain is already 55 or above.
Amputating another player needs the limb selected on a WITNESS scan first, so nobody amputates by walking into a friend with an axe. A limb that is already lost - deep frostbite at 80, infection at 75, or skin and muscle both at 4 or under - can be taken from a patient who cannot answer, because that is the case the feature exists for. A limb that could still be saved needs them awake and consenting.
Select a region for the next applicable treatment on this patient. Live anatomy is rechecked by the server.
screen.doomedmatu.witness_scan.target_help
The scan target is a soft convenience for most treatments and a hard requirement for amputating another player, and the text draws no line between the two.
Organ installation rides this same router on the same quality channel, so anhedonia degrades a graft you perform on yourself exactly as it degrades a wrap - but INSTALL_ORGAN sits outside the consent group, so putting an organ into another player asks them nothing first. Organs
Past anhedonia 80 nobody sitting with you can land any of it, and the clinical record keeps a line for that alone: "Nothing got through." Psychology
Deep anhedonia degrades your self-treatment, but not a friend's
Past anhedonia 55, every treatment you perform on yourself is multiplied by a reluctance factor scaling down to 0.55 at anhedonia 100. Your wrap is worse, your stitch is worse, your fit is worse. It applies only to self-treatment. Someone else's hands are not numb, so a friend can still fix what you cannot make yourself care enough to fix properly. Past anhedonia 80 nobody sitting with you can land any of it.
Hand function silently gates every treatment at 0.12
A hand's function is the weakest link in its chain: muscle over 100, times 0.38 for an unsplinted fracture or 0.58 for a splinted one, times 0.42 for an impaired joint, times max(0.3, 1 - pain/145). Below 0.12 the hand is unusable and the server refuses treatments outright. One badly hurt arm at high pain lands around 0.118 - under the line - which is exactly the state where you are hammering the panel hardest. Prosthetic servicing and tourniquet removal are deliberately exempt so a body cannot lock its own toolbox inside itself.
FRAGMENT 12-C - THE ENTRY FOR A LIMB
SUMMARY: What the death certificate writes when a limb comes off. One entry per kind of event rather than per occurrence, so four amputations produce one line and the number four.
RESPONSE: The template is "%s gone." Formatted, that is the whole entry: "Left Foot gone." Chat gets more words than the record does, because any dismemberment grants the advancement "'Tis But a Scratch - Lose a limb and keep walking", and that one announces.
FINAL NOTE: The saw, the axe, an explosion, the Deep Maw's teeth, the strap left on too long and deep cold all write the same two words. The certificate cannot distinguish a limb you cut off from one that died on you. The advancement is withheld if death is already pending, on the grounds that dying with it does not count.
~/body/ClinicalKind.java:30 for the template; the four write sites are in DismemberService.java (amputate, dismember, necroticLoss, the co-op path); res/data/doomedmatu/advancements/limb_lost.json for the chat line.
Notes
- The open amputation channel is 60 bleed units, and the constant's own comment in DoomedData.java calls that "1.5 L/min of arterial loss". The conversion sitting eleven lines above it is 0.015 L/min per unit, which makes 60 units 0.9. Whether 60 was chosen against an older conversion, or the comment simply went stale, is recorded nowhere.
- A suture closes for good at quality 0.55 and picks up its infection-and-extra-pain penalty below 0.50. Both are bare literals typed inline, neither has a named constant, and nothing explains the gap between them. A stitch landing at 0.52 fails to close the wound and escapes the mangling charge entirely.
- Deep anhedonia multiplies the normalised quality channel, so it reaches the bandage, the suture, the prosthetic fit and the shrapnel pull. Splinting, dislocation reduction and arrow extraction consume the raw encoded amount instead and never see the multiplier. Nothing in the code says whether that exemption was chosen or inherited from those three kinds using a different channel.
- The shrapnel branch reads wrap >= 1f, and the client sends exactly 1.0 for a clean pull. Past anhedonia 55 the multiplier makes that comparison impossible to satisfy, so every fragment you dig out of yourself is forced onto the slip path, and on the head that carries an 80 percent chance of losing brain each attempt. The reluctance is documented as changing how well a thing lands rather than whether it happens, and here it flips a boolean.
- Driving an arrow out through a core region prints "straight through what's behind it" and adds internal bleed, pain, external bleed, and brain loss on the head. The organ substrate is untouched by that path. Whether the organs were meant to be in it is not written down anywhere.
- The tourniquet's 540-second safe window carries a "// src:" tag and came from the source game. The 840-second limb-loss endpoint carries a player's remark about keeping track of the time and no derivation at all. Why fourteen minutes rather than twelve or twenty was never recorded, and the endpoint has no gametest.
Disease and Infection
Doomed splits "getting sick" into two separate machines. One is wound infection: a real, per-limb number that climbs on open skin, eats muscle, spreads to neighbouring parts, and ends in sepsis. The other is contagion: four named pathogens with silent incubation periods, person-to-person spread, and specific medicines that only work on the right agent. Both read the same whole-body immunity score, which is built out of food, water, warmth, blood volume and how filthy you are. Radiation sits alongside them as a third clock that only ever counts down, but poisons everything else while it runs.
The switches
Two server config options sit under everything in this document. enableInfection owns wound infection, sepsis, immunity and the antibiotic window. enableContagion owns the four named diseases and kuru. Contagion rides on the infection substrate, so switching infection off takes the disease layer with it.
The values are not frozen when a switch goes off. A frozen sepsis score would be unkillable, and a frozen infected limb would read INFECTED forever with nothing able to heal it. So the disabling code scrubs state actively, every tick. Infection off zeroes sepsis, the rigor, every limb's infection and disinfect window, the antibiotic course and the resistance it taught, and pins immunity to its default. Contagion off clears every pathogen load, timer and peak, clears carriage, wipes the Rot Lung consolidation record, and cures kuru outright rather than pausing it.
One thing survives both switches. Acquired immunity to a pathogen already beaten counts as player progress rather than residue, so it sits inert while the layer is off and is still there when it comes back on.
Radiation has its own switch, enableRadiation. Turning it off clears the dose.
Kuru is not cleared by death
When you die, the reset wipes pathogen loads, timers, peaks, carriage and the cyst spore burden. It deliberately does not touch prion load, the prion onset time, the kuru stage or the stage clock. A character who died in the terminal stage of kuru comes back with terminal kuru still running, still eating brain at 0.15 per second. The only things that clear it are turning the contagion config off, which cures it outright, or a console command.
Immunity
Immunity is recomputed from scratch every tick on a 0 to 200 scale. It is a live readout of how well the body is being kept.
The build starts at 100. Hunger above 70 adds up to 10 more, and hunger below that subtracts at 0.75 per point down to a floor of -75. Thirst contributes 0.3 per point above 60, so a fully hydrated character is worth +12. Body temperature is worth 8 points per degree away from 37 C in either direction. Blood volume is worth 4 points per litre away from a full 5 L, so bleeding out costs 20. Filth past 50 subtracts one for one. Nausea subtracts at 0.8 per point and radiation at 0.5 per point. Low energy costs 0.45 per point below 60, and sustained wasting costs 0.40 per point of weight offset past -10.
Do the arithmetic on a perfectly maintained body with no traits and no drugs and it lands around 122. 120 is the break-even at which a body starts beating a named disease on its own. Two points of headroom. The Strong Gut trait adds 18 and Sickly subtracts 20, so trait choice is the difference between comfortably clearing diseases and never clearing one.
An antibiotic course adds a flat 70. An immunosuppressant, the only thing holding a transplanted organ back from rejection, subtracts 85.
Stops your body destroying a transplanted organ.
While it is in you, rejection is held back - and your
immune system is switched off with it. Infection,
sepsis and plague become far more dangerous.
tooltip.doomedmatu.immunosuppressant
The tooltip says switched off. The code subtracts 85 from a score whose break-even is 120, on a body that tops out around 122 maintained.
Every term in that build except the drugs is read straight out of the survival loop: hunger, thirst, core temperature, blood volume and accumulated filth are the same fields the needs system writes each tick, so letting any one of them slip is a disease decision as much as a survival one. Needs and Survival
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Immunity scale | 0 to 200, clamped | ~/body/InfectionHandler.java:124 |
| Base immunity | 100 | ~/body/InfectionHandler.java:99 |
| Hunger contribution | (hunger - 70) x 0.75, clamped -75 to +10 | ~/body/InfectionHandler.java:102 |
| Thirst contribution | (thirst - 60) x 0.3 | ~/body/InfectionHandler.java:103 |
| Temperature contribution | (bodyTemp - 37) x 8 | ~/body/InfectionHandler.java:104 |
| Blood contribution | (bloodVolume - 5) x 4 per litre | ~/body/InfectionHandler.java:107 |
| Antibiotic bonus | +70 while a course runs | ~/body/InfectionHandler.java:29 |
| Immunosuppressant penalty | -85 while a course runs | ~/body/InfectionHandler.java:31 |
| Nausea drag | sicknessAmount x 0.8 | ~/body/InfectionHandler.java:55 |
| Radiation drag | radiationSickness x 0.5 | ~/body/InfectionHandler.java:56 |
| Filth drag | max(0, dirtiness - 50), one for one | ~/body/InfectionHandler.java:57 |
| Energy penalty | max(0, 60 - energy) x 0.45 | ~/body/PhysiologyFactors.java:45 |
| Wasting penalty | max(0, -weightOffset - 10) x 0.40 | ~/body/PhysiologyFactors.java:50 |
| Trait offsets | Strong Gut +18, Sickly -20 | ~/body/Trait.java:329-339 |
Wound infection
Any undismembered limb whose skin health is under 80 runs a hidden infection roll once every 40 seconds. Prosthetic and missing segments are skipped, having no flesh to fester.
The base odds come from how open the wound is, and active bleeding pushes them up. At skin 79 the raw chance is under half a percent per roll. At skin 0 it is 23 percent. That figure is then multiplied by the wound's own contamination risk, which is where the variance lives. A wound starts at 0.65 and gains contamination over 55. A bite adds 0.9, a puncture or crush 0.45, an avulsion or stump 0.7, and retained fragments 0.18 each up to 0.8. A definitively closed wound multiplies the whole thing by 0.35 and a dressed one by 0.48. Grime transfers into the record on every roll, scaled by dirtiness past 25, and an active antiseptic cuts that transfer to a tenth.
Once a limb is infected the percentage moves at a rate read off an immunity curve. The normal column runs from 18 percent per minute at zero immunity down to 1.08 at 195, turning negative only past 195. Read that plainly: untreated, an established infection essentially never heals. Even a perfectly maintained body at immunity 122 is still gaining about 6.4 percent a minute.
A topical antiseptic flips the limb onto the disinfected column, which is negative from immunity 40 upward. That is source control and it is the reliable answer. Antibiotics work differently, stripping a flat 7 percent per minute off every infected limb at once, divided by a resistance term, on top of the curve. Net that is about -4 per minute, so a ten minute course removes roughly 40 percent and a bad infection needs two.
Above 75 percent the infection eats muscle at 0.05 per second. Above 90 it rolls 2 percent per second to seed a random anatomical neighbour at 5 percent. An infected limb also raises the temperature the body regulates toward. That is where fever comes from.
Apply to a wounded or infected limb to disinfect it.
Use before invasive care to sharply reduce infection risk.
tooltip.doomedmatu.antiseptic
The string sells antiseptic as preparation before invasive care. In the rate curve it is also the only reliable way to make an established infection fall.
The contamination number the onset roll multiplies by belongs to the wound ledger rather than to this system, along with the closed and dressed multipliers, so how a wound was handled in the minute it was opened is what decides whether it turns hours later. Injury and Treatment
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Skin health below which a limb can infect | 80 | ~/body/InfectionHandler.java:58 |
| Onset roll interval | every 40 seconds | ~/body/InfectionHandler.java:65 |
| Onset formula | num2 = skin x 0.0125 + (1 - skin x 0.0125) x 0.77 - bleed x 0.007; chance = 1 - num2 | ~/body/InfectionHandler.java:153-154 |
| Wound risk multiplier base | 0.65 + contamination / 55, clamped 0.15 to 4 | ~/body/WoundLedgerService.java:301,308 |
| Bite / puncture / avulsion modifiers | +0.9 / +0.45 / +0.7 | ~/body/WoundLedgerService.java:302-304 |
| Closed and dressed multipliers | x0.35 closed, x0.48 dressed | ~/body/WoundLedgerService.java:306-307 |
| Grime transfer threshold and antiseptic effect | dirtiness above 25; x0.10 while disinfected | ~/body/InfectionHandler.java:69-70 |
| Normal rate at immunity 0 / 100 / 195 | +18 / +7.2 / +1.08 percent per minute | ~/body/InfectionHandler.java:81-82 |
| Disinfected rate at immunity 40 / 100 / 160 | 0 / -5.04 / -8.64 percent per minute | ~/body/InfectionHandler.java:81,83 |
| Antibiotic strip rate | -7 percent per minute per infected limb | ~/body/InfectionHandler.java:47 |
| Resistance term | divided by (1 + resistance / 40); +22 per oral course; decays 0.04 per second while off | ~/body/InfectionHandler.java:49,51,201; ~/item/AntibioticItem.java:25 |
| Muscle rot threshold and rate | above 75 percent, -0.05 muscle per second | ~/body/InfectionHandler.java:60-61 |
| Spread threshold, chance and seed | above 90 percent, 2 percent per second, seeds at 5 percent | ~/body/InfectionHandler.java:62-64 |
| Uninfected decay | -0.5 percent per second | ~/body/InfectionHandler.java:66 |
| Disinfect window | 10 minutes per application | ~/body/TreatmentService.java:93 |
Sepsis
Sepsis is driven by the TOTAL infection summed across every limb, not by the worst one. At or above a total of 100 it climbs at total x 0.00028 per second. Below that it falls at 0.07 per second. One limb at a full 100 is enough to start it. A single neglected wound goes systemic on its own.
Above sepsis 20 the body begins to fit. A rigor is a violent whole-body convulsion in three parts: a three second prodrome that is the warning, a five second peak you cannot act through, and a four second climb-down. The prodrome is identical every time, so it becomes something to react to.
The gap between fits is the instrument. It tightens from four minutes at onset down to twenty-five seconds by sepsis 95, with plus or minus 15 percent of jitter over the top, so the countdown can never be timed exactly. During a fit above 0.6 strength sprinting is gone, top speed is cut by up to 45 percent, and pain rises by up to 18. Convulsing also burns energy and dumps heat.
Past sepsis 78 the fever setpoint inverts. The thermostat stops regulating warm and starts regulating cold, down to 3.2 degrees below neutral at sepsis 100. At almost the same point the fits collapse toward a trace shudder. The shaking stopping and the fever breaking both feel like recovery. Neither is.
Sepsis above 60 counts a body as failing rather than merely unconscious, which qualifies it for the agonal brain drain that ends in brain death.
Cuts sepsis, adds blood, boosts immunity, disinfects limb.
tooltip.doomedmatu.antiserum_syringe
Sepsis is also a circulatory event: CardiovascularHandler drops the pressure target by 0.4 mmHg for every point of it and multiplies cardiac output by one minus sepsis times 0.00525, so a body at sepsis 100 is perfusing at under half output before anything else has gone wrong. Blood and Circulation
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Sepsis rise threshold | total infection across all limbs at or above 100 | ~/body/InfectionHandler.java:76 |
| Sepsis rise rate | total x 0.00028 per second | ~/body/InfectionHandler.java:77 |
| Sepsis fall rate | -0.07 per second below threshold | ~/body/InfectionHandler.java:78 |
| Rigor onset | sepsis 20 | ~/body/SepsisHandler.java:38 |
| Interval range | 240 seconds down to 25 seconds, fully tightened at sepsis 95 | ~/body/SepsisHandler.java:40-43 |
| Interval jitter | plus or minus 15 percent | ~/body/SepsisHandler.java:45 |
| Fit shape | 3 s prodrome, 5 s peak, 4 s decay | ~/body/SepsisHandler.java:48-50 |
| Full fit violence at | sepsis 60 | ~/body/SepsisHandler.java:58 |
| Fits collapse from | sepsis 97 downward over a span of 17, floor 0.12 | ~/body/SepsisHandler.java:53-56 |
| Cold shock threshold and depth | sepsis 78, up to -3.2 C setpoint at sepsis 100 | ~/body/TemperatureHandler.java:575-576 |
| Fever setpoint sources | +2.2 C at 100 percent limb infection, +1.8 C at sepsis 100, capped +3.5 C | ~/body/TemperatureHandler.java:113-117 |
| Rigor speed loss and pain | up to -45 percent speed, up to +18 pain | ~/body/MovementCapabilityHandler.java:250; ~/body/PainHandler.java:21 |
| Blood pressure target loss | -0.4 mmHg per point of sepsis | ~/body/CardiovascularHandler.java:127 |
| Cardiac output multiplier | 1 - sepsis x 0.00525 (x0.475 at sepsis 100) | ~/body/CardiovascularHandler.java:216 |
| Agonal qualifying threshold | sepsis above 60 | ~/body/DeathHandler.java:44 |
The four agents
Contagion is a fixed set of four agents, each carrying its own incubation, transmission weights, virulence and cure. The set is entirely a cost. Its one reward is surviving Marrow Fever, which grants permanent immunity to Marrow Fever and to that alone.
Marrow Fever is the bacterial baseline. It incubates for two minutes, cures to antibiotics, immunises on recovery, and its symptom is pushing sepsis directly. It is the disease the system is learned on.
Rot Lung is the viral one and the worst. It incubates for three minutes, spreads hardest through the air, and answers only to an antiviral. Antibiotics do nothing at all to it. A third of survivors keep shedding it silently for the rest of their life.
Kuru is a prion. It runs its own clock instead of an incubation entry in the table, and its cure entry is NONE. It enters one way: eating human flesh.
Marrow Worm is a parasite with a five minute incubation. It cures to an antiparasitic. Its damage is indirect. It steals food and weight while the body's defences sag.
Load runs 0 to 100 in all cases. Above 75 the fever costs brain at 0.06 per second regardless of which disease it is, and mood falls the whole time.
Clears a viral disease such as Rot Lung. Antibiotics do nothing to a virus.
tooltip.doomedmatu.antiviral
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Marrow Fever incubation | 2400 ticks (2 minutes) | ~/body/PathogenType.java:25 |
| Marrow Fever vectors (air / contact / blood / food / bite) | 0.30 / 0.35 / 0.20 / 0.15 / 0.10 | ~/body/PathogenType.java:26 |
| Marrow Fever virulence / immunising / carrier chance | 1.0 / yes / 5 percent | ~/body/PathogenType.java:27 |
| Rot Lung incubation | 3600 ticks (3 minutes) | ~/body/PathogenType.java:35 |
| Rot Lung vectors (air / contact / blood / food / bite) | 0.45 / 0.20 / 0.25 / 0.05 / 0.05 | ~/body/PathogenType.java:36 |
| Rot Lung virulence / immunising on recovery / vaccine-preventable / carrier chance | 1.15 / yes / no / 33 percent | ~/body/PathogenType.java:37 |
| Marrow Worm incubation | 6000 ticks (5 minutes) | ~/body/PathogenType.java:54 |
| Marrow Worm vectors (air / contact / blood / food / bite) | 0 / 0.10 / 0.05 / 0.40 / 0.25 | ~/body/PathogenType.java:55 |
| Marrow Worm virulence / carrier chance | 0.75 / 10 percent | ~/body/PathogenType.java:56 |
| Kuru cure and vectors | NONE; blood 0.05 only, no airborne or food route | ~/body/PathogenType.java:45-47 |
| Marrow Fever symptom | sepsis +0.35 per second at full load | ~/body/ContagionHandler.java:64,282 |
| Rot Lung symptoms | thoracic fluid +0.55 per second; blood -0.0035 L per second above load 45 | ~/body/ContagionHandler.java:62,66,290-293 |
| Marrow Worm symptoms | hunger -0.22 per second, weight -0.02 per second at full load | ~/body/ContagionHandler.java:65,298-299 |
| Brain drain above load 75 | -0.06 per second scaled by severity | ~/body/ContagionHandler.java:61,304-306 |
| Mood drain | -0.08 per second scaled by severity | ~/body/ContagionHandler.java:63,273 |
Incubation
When a pathogen is seeded, load is set to 1 and a timer starts. Until that timer passes the incubation length, nothing happens at all. No symptom, no moodle, no sound, no chat message. The server withholds the load even from the infected player's own client during incubation, so there is no packet to read and nothing a modified client could surface. That silence is the mechanic.
After incubation, load moves once per second against a judged immunity figure. With a correct medicine in the blood, load falls at 1.6 per second, which clears a full-strength disease in about a minute. At judged immunity 120 or above, load falls at up to 0.30 per second, scaled by how far past 120 it sits. Below 120, load climbs at 0.45 x virulence x how far short it falls.
The practical consequence of that ceiling matters. A maintained body sits around 122, two points past break-even, so natural clearance runs at roughly 0.0075 per second. Beating a full-strength disease that way takes several hours. Medicine is the realistic exit.
There is a subtlety that keeps the whole thing from sealing shut. A running disease pins nausea to a floor of severity x 60, and nausea drags immunity at 0.8 per point. Left uncorrected, a pathogen would suppress the very score deciding whether it clears. So when judging a pathogen the handler adds back exactly the nausea that pathogen is itself causing. Nausea from anything else, such as overeating or filth, still counts against you.
Above load 45 the infected cough audibly every 3.5 seconds and throw sneeze particles. An ill person is legible across a room.
When a load reaches zero the disease resolves, and the payout depends on how bad it actually got. The handler tracks the highest load the pathogen ever reached this life. A peak under 25 pays nothing: no immunity, no carrier roll, nothing. A subclinical brush cured within a second of it incubating does not count as having survived anything.
If the peak did reach 25, and the pathogen immunises, that character is permanently immune to that one agent. The flag survives death. It is the only reward in the disease layer.
Then the carrier roll happens. Marrow Fever carries a 5 percent chance, Marrow Worm 10 percent, and Rot Lung 33 percent. A carrier has no symptoms of any kind, ever. They shed at a steady 0.35 strength forever, which is between a quarter and full strength for a symptomatic person. Their own client is told nothing about it and no screen in the mod displays it.
There is exactly one tell, and it exists only for Rot Lung. A Rot Lung carrier's lungs are scarred so that their condition can never recover above 82, and that ceiling is written as permanent scar rather than as a condition floor, specifically so a night's convalescence cannot heal it away. A medic reading lung condition on the tablet can tell a carrier from a clean survivor.
Carriage has one exit. A correct course of medicine for that pathogen clears the carrier bit even with no active infection to treat. Carriage also ends at death. Acquired immunity does not.
Antibiotics cure exactly one of the four diseases, and the game hides that they help nothing else
A running antibiotic course adds a flat +70 to immunity. That would push a maintained player straight past the 120 break-even and quietly cure Rot Lung, Marrow Worm and anything else through the back door. So the handler strips that +70 back off before judging any pathogen an antibiotic cannot actually treat. Marrow Fever is judged with the bonus. Rot Lung, Marrow Worm and kuru are judged without it.
Injectable antibiotics do not teach resistance; the pill does
Only the oral antibiotic item adds 22 points of antibiotic resistance per dose, and resistance halves the drug's ability to strip infection off a limb at 40 points. Ceftriaxone injected from a syringe adds up to 15 minutes of antibiotic window per full 100 ml dose with no resistance cost at all, plus a local disinfect and a painful jab. Antiserum likewise adds antibiotic ticks without resistance. The pill also SETS the window to ten minutes rather than extending it, so taking one while a course is already running throws away the remaining time and still charges you the resistance.
Carrier status is sent to your client and never shown on any screen
The carrier bitmask is included in the sync packet and the client mirror can answer whether you are a carrier. No HUD element, moodle, status panel or tablet screen ever reads it. A carrier sheds at a constant 0.35 strength forever with no symptoms. The single readable consequence is that a Rot Lung carrier's lungs are permanently capped at 82 condition, written as scar so a night's convalescence cannot heal it away, which a medic can spot on the organ readout. Taking a correct medicine course clears carriage even with no active infection.
A brush with a disease that never developed gives you nothing at all
Immunity and the carrier roll both require the pathogen's peak load to have reached 25 this life. A seed cured within a second of incubating, or shaken off naturally by a very healthy body, resolves without granting permanent immunity and without rolling carriage. This also means racing to take the right medicine the instant symptoms appear denies you the immunity that surviving Marrow Fever otherwise grants.
Radiation does not decay while you are logged out
The offline catch-up settles bleeding, infection, sepsis, pathogen incubation, kuru progression, wound age and residual limb recovery. It deliberately excludes radiation, on the reasoning that the radiation handler only ever decays the dose and charging for time away would be inventing harm. The practical effect is the opposite of relief: the dose you log out with is exactly the dose you log back in with, however long you were gone, while everything else has moved on.
A running disease makes your wound infections worse, and the game corrects for this in only one direction
A pathogen pins nausea to severity times 60, and nausea drags immunity at 0.8 per point. The contagion handler adds that self-inflicted drag back before judging whether the pathogen clears, so a disease cannot suppress the score deciding its own fate. The limb infection system does no such correction. It reads the raw, suppressed immunity. A full-strength disease therefore removes about 48 points of effective immunity from every infected wound on your body at once, which on the infection rate curve is roughly the difference between 6 and 10 percent per minute.
The in-game wiki's Marrow Worm treatment advice is not supported by the code
The WITNESS wiki page for Marrow Worm says an improvised charcoal slurry is the field answer when there is no trader within reach. In the shipped code neither the improvised slurry nor pharmaceutical activated charcoal writes an antiparasitic window. They only clear nausea, bind swallowed opioid and open a short gut-absorption window. The only thing that clears Marrow Worm is the antiparasitic course item. Where the two disagree, the code is what ships.
FRAGMENT 08 - CERTIFICATE LINE, AGENT UNNAMED
SUMMARY: The clinical certificate a Doomed body prints on death has one entry for a fatal named disease. Its text is "A named disease." The pathogen is not on the line.
RESPONSE: The enum comment states the reason without apology: the record slot is typed to a body part, and widening it to carry a pathogen name was judged not worth a word. The load at first crossing rides along as the magnitude instead. Sepsis gets its own line, "Sepsis.", and so does the prion, "Kuru.", annotated as the one thing on the list that outlives the body.
FINAL NOTE: A survivor reading a friend's certificate learns that something named killed them, and how bad it had got before it did. Which of the three it was has to come from somewhere else.
~/body/ClinicalKind.java:41-50
FRAGMENT 05 - ADVICE, DELIVERED TO THE WRONG PEOPLE
SUMMARY: The Rot Lung moodle carries the line "A lung virus - antibiotics will do nothing. Get an antiviral, and keep away from other people." Past load 65 it escalates to "You are drowning in your own chest."
RESPONSE: Both strings are gated on the client's reported load being above 0.5. The sync packet reports a flat zero for any pathogen that is not symptomatic, which covers the whole incubation period and covers a carrier permanently. A third of Rot Lung survivors roll carriage.
FINAL NOTE: The warning to keep away from other people goes to the person coughing hard enough that the room already knows. The silent shedder is told nothing, ever, and sheds at a steady 0.35 for the rest of their life.
~/client/hud/DoomedHudOverlay.java:1889-1899; ~/network/DoomedNetwork.java:1114-1119; ~/body/ContagionHandler.java:354-358
Ambient exposure
Three of the four pathogens pass person to person only, so a fresh singleplayer world needs environmental seeding or the whole layer would be dead content. Every environmental route is gated behind a decision the player made and can see, and the odds are deliberately tiny per roll.
All of it is gated on frailty, which is one minus immunity over 120. At immunity 120 or above the entire environmental block returns immediately. A fed, watered, warm, clean, rested body catches nothing from the world at all.
Marrow Fever needs both real filth and a real open wound at the same time: dirtiness above 60 and a limb whose skin is below 75. Either one alone is safe. Together the roll is 0.035 percent per second at zero immunity, which averages out to a bit under an hour of continuous exposure.
Rot Lung needs genuinely contaminated air. The player must be below Y 50, under no sky, and standing in air whose measured respiratory risk is at least 10. Depth and darkness alone do nothing; an ordinary mine or underground base stays safe forever unless something is actually putting matter in the air. Recent geology dust from breaking stone, or authored organic spore sources, are what supply that matter. Enclosure only decides how long it stays suspended. A loaded ventilation unit sets the risk to zero outright.
Marrow Worm needs nausea above 35 and no other disease already running. That second gate exists because a running disease pins your nausea, and without it a bad fever would spontaneously hand you a gut parasite as well.
Only the infectious player's own tick writes to anybody else, so there is exactly one writer per infection event. Shedding runs once a second.
A pathogen with any airborne weight reaches 6 blocks. One with only contact weight reaches 2. The query box is a cube but the distance is clipped back to a real sphere, so the stated radius is honest. Line of sight is required. An airborne strain cannot pass through a wall, which means quarantine works and sealing someone in a room genuinely stops it.
Enclosed air multiplies the airborne term by 1.75. Open sky multiplies it by 0.45. Within 2 blocks the contact weight is added on top of the airborne one. The result falls off linearly across the radius to a floor of 0.15, is scaled by the shedder's strength and by the server rate multiplier, and then multiplied by 0.02 to give a per-second chance.
On the receiving end, immunity resists directly. The odds are multiplied by one minus immunity over 200 times 0.85, so a body at immunity 200 takes about 15 percent of the exposure a body at zero would. An active rebreather cuts an airborne strain to 5 percent of its odds.
A worked case: standing a metre from someone with full-strength Rot Lung, indoors, at immunity 120, gives roughly 0.8 percent per second. That is a couple of minutes of conversation. Outdoors the same exchange is about a quarter as dangerous.
Keeps the air clean nearby. Enclosed, underground air grimes you up faster;
stay within 8 blocks of one and it won't.
tooltip.doomedmatu.ventilation
The tooltip sells the unit as a grime measure. The same unit forces measured air risk to zero, which is the gate the Rot Lung roll sits behind.
The only hard counter to contaminated air is a built block: a loaded Ventilation unit within 8 blocks forces measured risk to zero and knocks the standing dust and organic loads down to 8 percent, with no power draw, no upkeep and no filter to replace. Machines, Power and Fluids
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Frailty formula | max(0, 1 - immunity / 120); returns with no roll at all if zero | ~/body/ContagionHandler.java:151-154 |
| Marrow Fever gate | dirtiness above 60 and worst open wound above 25 | ~/body/ContagionHandler.java:157 |
| Marrow Fever per-second odds | 0.00035 x frailty x rate multiplier | ~/body/ContagionHandler.java:158 |
| Rot Lung gate | no sky, Y below 50, air risk at or above 10 | ~/body/ContagionHandler.java:165-167 |
| Rot Lung per-second odds | 0.00055 x airRisk x frailty x rate x breathing factor | ~/body/ContagionHandler.java:181 |
| Marrow Worm gate | nausea above 35 and no other active disease | ~/body/ContagionHandler.java:189 |
| Marrow Worm per-second odds | 0.00030 x frailty x rate multiplier | ~/body/ContagionHandler.java:190 |
| Air risk formula | max(dust x 0.72, organic x 0.92) x (0.48 + stagnation / 100 x 0.52) | ~/body/AirQualityService.java:144-146 |
| Ventilation effect | risk forced to 0; dust and organic loads x0.08 | ~/body/AirQualityService.java:136-146 |
| Dust cloud strength and life | 24 + 22 x sqrt(hardness / 8), 90 seconds, 8 block radius, x0.25 in water or rain | ~/body/AirQualityService.java:42-44,71-73 |
| Organic source weights | spore bloom 34, rooted cadaver 12, spore reeds 4, within 7 blocks and line of sight | ~/body/AirQualityService.java:46-47,215-218 |
| Respirator filter draw while the Rot Lung roll runs | 4 units per second; a 36,000 unit particulate cartridge is about 2.5 hours | ~/body/ContagionHandler.java:72; ~/registry/DoomedItems.java:661-666 |
| Protection factors | rebreather 0.03; gas mask with correct cartridge 0.03 particulate / 0.08 vapour; dust mask 0.15 / 0.72 | ~/body/RespiratoryProtection.java:16-30 |
| Shed interval | every 20 ticks (1 second) | ~/body/ContagionHandler.java:85 |
| Airborne radius | 6.0 blocks | ~/body/ContagionHandler.java:80 |
| Contact radius | 2.0 blocks | ~/body/ContagionHandler.java:81 |
| Enclosed multiplier | x1.75 | ~/body/ContagionHandler.java:83 |
| Open sky multiplier | x0.45 | ~/body/ContagionHandler.java:84 |
| Line of sight required | yes; blocked exposure is skipped entirely | ~/body/ContagionHandler.java:412-414 |
| Distance falloff floor | 0.15 at maximum range | ~/body/ContagionHandler.java:421 |
| Per-tick scalar | x0.02 | ~/body/ContagionHandler.java:422 |
| Target immunity resistance | x(1 - min(1, immunity / 200) x 0.85) | ~/body/ContagionHandler.java:435 |
| Rebreather against airborne | x0.05 | ~/body/ContagionHandler.java:437-439 |
Marrow Worm cannot be caught while another disease is running
The environmental Marrow Worm roll requires nausea above 35 AND no other non-prion pathogen currently active. Any running disease pins nausea to a floor of severity times 60, so without that second gate a bad fever would spontaneously hand you a gut parasite as a side effect of its own symptom. The gate means the parasite is only ever caught while your nausea comes from something else, such as spoiled food or filth.
If your immunity is at or above 120, you catch nothing from the environment whatsoever
Every ambient exposure roll is gated behind a frailty term of one minus immunity over 120. When immunity reaches 120 the frailty is zero and the entire environmental exposure block returns before any roll happens. That is a hard cutoff, not a scaling. Direct inoculation from a bite, a meal or a needle still works, because those bypass the barrier, but they scale down to a floor of 0.35 rather than to nothing.
Airborne disease respects walls and line of sight
Before any transmission roll, the shedder must have line of sight to the target. A wall, a door or a closed hatch stops airborne spread entirely, at any distance inside the radius. Enclosure still multiplies the airborne term by 1.75 for people who share the room, and open sky cuts it to 0.45. Quarantine therefore genuinely works, and so does simply stepping outdoors to talk.
FRAGMENT 12 - VOCALISATION, THIRD PERSON
SUMMARY: Two subtitle strings exist for kuru and nothing else uses them: "Someone giggles involuntarily" and "Someone laughs involuntarily".
RESPONSE: KuruHandler plays the clip into the world at the sufferer's own block position with no excluded listener, so the afflicted player hears the episode alongside everyone in range. The giggle belongs to the ambulatory stage at 0.82 volume; the laugh belongs to sedentary and terminal and plays at full. Each episode costs stamina and adds pain to the head, and the next one is between three and twelve minutes out depending on stage.
FINAL NOTE: The subtitle says someone. It is describing you, and the game will not say so.
res/assets/doomedmatu/lang/en_us.json:863-864; ~/body/KuruHandler.java:206-232
Inoculation
Three routes exist outside the air, and each rolls only the pathogens that carry a weight on that route. A bite cannot give you Rot Lung and a meal cannot give you an airborne virus.
Direct inoculation skips the frailty gate that ambient exposure sits behind, because it bypasses the barrier the immune system defends. It scales with frailty instead, from 0.35 at full immunity up to 1.0 at zero.
Anything with a mouth that reaches you in melee applies a bite exposure, with the dose scaled by how deep the wound got, from 0.15 for a graze up to 1.0 for a mauling. A zombie's bite is separately worse: on a five second cooldown it has a 50 percent chance to seed a bite wound at 20 percent infection and 70 contamination, and a 12 percent chance on top of that to carry Marrow Fever outright.
Food exposure fires on a datapack tag of raw meat and carrion. Rotten flesh carries the full dose; the raw meats on the list carry 0.35. Cooking is the counterplay and it is one you already know.
Needles are the nastiest route because they persist. Injecting anybody marks the syringe contaminated and writes the exact blood-borne agents from that bloodstream onto the item as a bitmask, including agents carried silently by a carrier. Reusing it inoculates the next person with precisely those agents and nothing else, and also drops a local infection of at least 12 at the injection site with 35 contamination. A reused blood bag follows the same rule. The counterplay costs nothing: right-click a contaminated syringe next to an open flame and it is sterile again.
The needle glows, then cools. Clean.
message.doomedmatu.syringe_sterilized
The needle route lives in DrugService, not here. Injecting anybody is what stamps the syringe contaminated and writes that bloodstream's agents onto the stack, so every shared dose of painkiller or adrenaline is a transmission event sitting in somebody's inventory. Drugs and Pharmacology
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Direct inoculation frailty term | 0.35 + 0.65 x max(0, 1 - immunity / 120) | ~/body/ContagionHandler.java:472 |
| Bite dose scaling | wounding / 8, clamped 0.15 to 1.0 | ~/body/CombatRouter.java:420-421 |
| Zombie wound infection chance | 50 percent, 5 second cooldown | ~/body/CombatRouter.java:109,122 |
| Zombie Marrow Fever chance | 12 percent on a successful infect roll | ~/body/CombatRouter.java:110,974-975 |
| Zombie bite seed | 20 percent infection, 70 contamination | ~/body/CombatRouter.java:121,967-968 |
| Food dose | 1.0 for rotten flesh, 0.35 for other tagged raw meat | ~/body/VanillaConsumableHandler.java:247-248 |
| Contaminated food tag contents | rotten flesh, spider eye, beef, porkchop, mutton, chicken, rabbit, cod, salmon, tropical fish, pufferfish | res/data/doomedmatu/tags/items/contaminated_food.json |
| Dirty needle site infection | at least 12 percent, contamination 35 | ~/body/DrugService.java:490-497,528 |
| Needle sterilization | right-click with an open flame nearby; clears the flag and the pathogen mask | ~/item/FluidSyringeItem.java:215-226 |
| Blood bag reuse | same provenance mask and same per-agent exposure as a needle | ~/body/DrugService.java:893-905 |
Rot Lung
Rot Lung takes the chest in four discrete steps rather than smoothly, at loads 35, 55, 75 and 92, and each one announces itself with a distinct low choking sound that is deliberately different from the ordinary cough.
When a step lands, the section floods with 18 units of infectious thoracic fluid and a sixty second window opens. Get a chest drain into the thorax inside that window and the section comes back out as fluid. Miss it and the fluid organises into scar: both lungs lose 11 condition permanently and gain 11 scar, and organ scar is a hard ceiling that no amount of convalescence recovers within a life. Only a donor lung gets it back.
The next threshold is tracked by a monotonic history cursor rather than by scar count, so draining a section cannot re-arm its threshold and the same step cannot be farmed twice.
Separately from the steps, the disease floods the chest continuously at 0.55 per second at full load. That fluid is read by the respiration model as lost lung volume at half a point of respiration per unit, so the suffocation is real, survivable and drainable.
Then there is the quiet. Once three consolidations have set, the coughing stops. It stops because there is not enough working lung left to cough with. Every signal you have learned to read says you are recovering. It is the same lie sepsis tells when the rigors end, told by a different organ.
Four sterile insertion assemblies per kit.
Drag onto the thorax to drain a hemothorax.
Disinfect first: filth can seed infection during drainage.
tooltip.doomedmatu.chest_drain
The tooltip names one indication, a hemothorax. The same kit is the entire answer to a Rot Lung consolidation, and the window is sixty seconds wide.
A missed drain window does its lasting damage through the organ system rather than through the disease: the eleven points land as organ scar on both lungs at once, and scar is the organ layer's own hard ceiling on what convalescence can ever give back. Organs
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Consolidation thresholds | loads 35, 55, 75, 92 | ~/body/ContagionHandler.java:554 |
| Drain window | 1200 ticks (60 seconds) | ~/body/ContagionHandler.java:556 |
| Permanent cost per missed step | -11 condition and +11 scar on BOTH lungs | ~/body/ContagionHandler.java:558,623-631 |
| Fluid dumped at consolidation | 18 units, infectious provenance | ~/body/ContagionHandler.java:593 |
| Consolidations at which coughing stops | 3 | ~/body/ContagionHandler.java:560 |
| Continuous flooding rate | 0.55 units per second at full load | ~/body/ContagionHandler.java:66,290 |
| Respiration cost of thoracic fluid | -0.5 respiration per unit | ~/body/RespirationHandler.java:94,123 |
| Natural reabsorption | 2 units per 60 seconds | ~/body/RespirationHandler.java:93 |
| Chest drain removal | 35 units per charged drain | ~/body/TreatmentService.java:87 |
| Lung fibrosis and daily convalescence | 0.85 fibrosis, 6 condition per earned dawn | ~/body/Organ.java:24-25 |
Rot Lung goes quiet at three consolidations because there is not enough lung left to cough with
The audible cough that marks a symptomatic disease is suppressed once three of the four lung sections have permanently consolidated. Every other indicator behaves as though you are improving: the coughing ends, and if sepsis is also involved the fits fade and the fever inverts into cold shock at the same time. The disease load has not fallen and the lung damage is permanent.
Kuru
Kuru enters one way. You eat human flesh.
The risk on a portion follows the donor and the tissue, not how many meals have been eaten. Harvested flesh records who it came from and what kind of tissue it is. If that donor carried no prion, the risk is zero whatever the tissue was. If they did, the risk is the tissue's own infectivity: muscle is 1.2 percent, visceral tissue 11, ocular 52, spinal 68, and neural tissue 82. Flesh with no recorded provenance falls back to a configurable 2.5 percent. Cooking preserves the provenance exactly and never reduces the prion risk, though it does cut the ordinary nausea and sepsis a bad portion carries.
If the roll succeeds, an onset time is written two real hours into the future. Deliberately no message, no moodle, no sound. Only one seed can ever be pending; a second contaminated meal changes nothing.
When the clock expires the course begins, strictly ordered and irreversible. Prodrome runs ten minutes of headache, joint pain and weight loss. Ambulatory runs twenty-five minutes and is where movement, hand steadiness and speech start to fail. Sedentary runs fifteen minutes and takes standing and swallowing. Terminal is open-ended and eats brain at 0.15 per second, which from a full brain is about eleven minutes.
Nothing treats it. Antibiotics, antivirals, rest and surgery all do nothing. Supportive care, feeding and airway management are all anyone can offer.
Harvested from a landed severed limb with a Foraging Knife or Bone Saw.
Very filling, but psychologically devastating and medically unsafe.
Every portion permanently marks the character and increases the next cost.
Cooking reduces sickness and sepsis; spoilage risk is shown above.
tooltip.doomedmatu.raw_human_flesh
The last line is accurate and incomplete. Cooking cuts the nausea and the sepsis, preserves the provenance exactly, and leaves the prion risk where it was.
The prion roll is the smaller half of what a portion costs. CannibalismService charges happiness and trauma on the same swallow, scaled by how many portions the character has eaten before, and that count outlives the body. Psychology
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Prion latency | 2 real hours (144,000 ticks) | ~/body/CannibalismService.java:16 |
| Tissue infectivity | muscle 0.012, visceral 0.11, ocular 0.52, spinal 0.68, neural 0.82 | ~/body/HumanTissueRisk.java:86-91 |
| Unprovenanced flesh risk | 0.025 per portion (config default) | ~/config/DoomedConfig.java:2297 |
| Tissue class by harvested part | head neural, neck spinal, eyes ocular, thorax and abdomen visceral, everything else muscle | ~/entity/SeveredLimbEntity.java:238-244 |
| Stage durations | prodrome 10 min, ambulatory 25 min, sedentary 15 min, terminal open-ended | ~/body/KuruHandler.java:30-32 |
| Brain drain by stage | 0.0095 / 0.012 / 0.022 / 0.15 per second | ~/body/KuruHandler.java:105,120-122 |
| Movement multiplier | ambulatory 0.88 to 0.68, sedentary 0.48 to 0.28, terminal 0.12 | ~/body/KuruHandler.java:246-253 |
| Hand steadiness multiplier | ambulatory 0.9 to 0.66, sedentary 0.55 to 0.30, terminal 0.18 | ~/body/KuruHandler.java:255-262 |
| Terminal consciousness cap | 62 falling to 12 | ~/body/KuruHandler.java:264-267 |
| Pain contribution by stage | 14 / 20 / 27 / 34 | ~/body/KuruHandler.java:236-244 |
| Choking chance while eating or drinking | ambulatory 0.8 percent, sedentary 7.5 percent, terminal 20 percent, plus (50 - consciousness) / 400 | ~/body/KuruHandler.java:387-393 |
| Choke consequences | respiration -16, SpO2 -8, nausea +3, sepsis +0.8, both lungs -0.8 condition | ~/body/KuruHandler.java:395-403 |
| Eating slowdown | x1.45 sedentary, x2.2 terminal | ~/body/KuruHandler.java:374-376 |
| Chat scramble chance | ambulatory 28 to 48 percent, sedentary 72 percent, terminal 90 percent | ~/body/KuruHandler.java:315-321 |
| Cannibalism mood and trauma cost | happiness -min(52, 22 + 3n), trauma +min(24, 8 + 1.5n) on the nth portion | ~/body/CannibalismService.java:27-28 |
| Nausea and sepsis per portion | raw and badly spoiled +40 nausea and +16 sepsis; cooked and fresh +1 and +0 | ~/body/CannibalismService.java:34-38 |
The donor prion flag only reads an online player
Harvesting flesh from a severed limb stamps the donor, the tissue class and whether that donor carried a prion. The prion check looks the donor up in the server's player list. If the donor is offline at the moment of harvest, the lookup returns nothing and the flesh is stamped as prion-free regardless of the donor's actual state. That flesh is then permanently recorded as safe, and cooking preserves the record.
Cyst spores
The gut parasite has a second, slower route in, entirely separate from bad meat: airborne spores in the Cyst jungle and the caves under it.
Standing in air near authored spore sources builds a hidden burden from 0 to 100. The scan runs once a second, weights sources by distance, and requires clear line of sight, so a solid wall between a player and a bloom stops the reading. A gas mask or a rebreather cuts the inhaled portion hard. An uncovered open wound gives the spores a smaller second route that no mask can close, and a dressing on that limb closes it.
At burden 35 the nausea starts as a slow trickle. At 100 the burden seeds Marrow Worm outright, unless the parasite is already present or an antiparasitic course is running, and then resets itself to 40 so a treated infection cannot be immediately re-seeded by burden that accumulated during treatment. Out of spore air the burden clears at 0.22 per second, so a saturated burden takes about seven and a half minutes to shed.
Drinking water taken from cyst territory adds 12 burden per sip, which respiratory protection obviously cannot help with. Boiling a full canteen on a heat source clears it. Contamination already in the bottle survives a top-up from clean water, so a tainted canteen cannot be laundered at an ordinary pond.
Severely sustained nausea has its own consequence regardless of source. At 95 or above it seeds an abdominal infection at 5 percent and arms it to fester.
Kills a parasite such as Marrow Worm, which eats your food before you do.
tooltip.doomedmatu.antiparasitic
The string covers the cure. It says nothing about the second job the course does, which is to block a saturated spore burden from seeding the parasite again mid-treatment.
The Deep Maw feeds this same burden. Its breath calls the identical spore intake path at 0.42 and again at 0.18, both scaled by exposure, so walking away from the encounter can still leave you carrying a parasite that arrives minutes later with nothing to connect it to. Threats
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Burden scale and gain | 0 to 100; 0.17 per cloud-second | ~/body/CystSporeExposureHandler.java:34 |
| Cloud cap | 3.0 | ~/body/CystSporeExposureHandler.java:33 |
| Recovery outside spore air | 0.22 per second | ~/body/CystSporeExposureHandler.java:36 |
| Open wound route weight | cloud x 0.20 x uncovered wound fraction | ~/body/CystSporeExposureHandler.java:37,204 |
| Uncovered wound fraction | (worst open wound - 15) / 85, dressed limbs excluded | ~/body/CystSporeExposureHandler.java:242-252 |
| Nausea onset burden | 35, then 0.045 x severity per second | ~/body/CystSporeExposureHandler.java:40,216-219 |
| Seed threshold and post-seed reset | 100, then reset to 40 | ~/body/CystSporeExposureHandler.java:41,221-231 |
| Contaminated water dose | 12 burden per sip | ~/body/CystSporeExposureHandler.java:39 |
| Deep Maw breath dose | 0.42 and 0.18 scaled by exposure, clamped to 1.5 | ~/entity/DeepMawEntity.java:2596,5532; ~/body/CystSporeExposureHandler.java:172 |
| Abdominal infection from nausea | nausea 95 or above seeds 5 percent infection in the abdomen | ~/body/SicknessHandler.java:183-185,199-205 |
| Nausea clearance | 0.06 per second | ~/body/SicknessHandler.java:181 |
| Activated charcoal | -60 nausea and a 60 second gut window; it does NOT treat Marrow Worm | ~/registry/DoomedItems.java:315-324; ~/body/CharcoalHandler.java:23 |
Radiation
Radiation sickness is a single 0 to 100 dose that only ever decays on its own at 0.033 per second, which is about half an hour from a dose of 60. There is no cure to hunt for. The question is whether you can outlast it.
While it runs it does damage on several channels at once. Nausea trails it up to 40 percent of the dose. The brain cooks at 0.0003 per second per point. Above dose 10 blood is lost at 0.00025 litres per second per point, so a dose of 50 is bleeding you at three quarters of a litre a minute with no wound anywhere. Thirst drains at 0.0002 per point. Every limb takes rising pain up to 30 percent of the dose. Muscle sloughs at 0.2 per second down to a floor of 100 minus half the dose, and above dose 30 skin does the same.
On top of that, above dose 30 the handler rolls once a minute for three separate disasters. A fresh infection on a random limb at dose x 0.25 percent. An internal haemorrhage into the thorax at dose x 0.7 percent. And, rarely, a catastrophic mutation at dose x 0.015 percent, which takes 5 brain, wrecks the chest muscle down to 3.5, pins motor shock at 100, thickens the blood by 30, and makes you vomit.
Sources are barrels and irradiated crystals. Crystals pool: connected crystals flood-fill into one cluster, only the leader emits, and both the strength and the reach scale with cluster size up to a cap of six. Intensity falls off as radAtZero divided by one plus distance squared over four, applied once per second. A large crystal formation at point blank is dosing you at 24 per second and reaches nearly twenty blocks.
Radiation also drags immunity at half a point per point. Radiation and infection compound each other badly.
A hot radioactive crystal. Irradiates anyone nearby
(~8 blocks). Connected crystals pool into one field -
a lone shard is mild, a big formation is a lethal hot
zone. Doomed take radiation sickness; others, poison.
tooltip.doomedmatu.crystal_irradiated
The tooltip prints one reach, about 8 blocks. That is the lone shard. The pooling it describes in the next sentence scales the reach with the cluster, out to nearly twenty.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Decay | 0.033 per second | ~/body/RadiationHandler.java:239 |
| Nausea trail | up to 40 percent of the dose, fed at 0.45 per second | ~/body/RadiationHandler.java:241,275-279 |
| Brain drain | dose x 0.0003 per second | ~/body/RadiationHandler.java:243 |
| Blood drain | dose x 0.00025 L per second, above dose 10 | ~/body/RadiationHandler.java:249-250 |
| Skin slough threshold | dose above 30 | ~/body/RadiationHandler.java:247 |
| Tissue slough rate and floor | 0.2 per second down to 100 - dose x 0.5 | ~/body/RadiationHandler.java:245,287-294 |
| Limb pain ceiling | dose x 0.3, ramped at 2 per second | ~/body/RadiationHandler.java:253,309-317 |
| Minute roll: fresh infection | dose x 0.0025 | ~/body/RadiationHandler.java:329 |
| Minute roll: internal haemorrhage | dose x 0.007 | ~/body/RadiationHandler.java:335 |
| Minute roll: catastrophic mutation | dose x 0.00015 | ~/body/RadiationHandler.java:342 |
| Mutation effects | brain -5, thorax muscle set to 3.5, shock 100, viscosity +30, vomit | ~/body/RadiationHandler.java:345-349 |
| Waste barrel field | 2.0 at point blank, 8 block range | ~/block/entity/RadioactiveWasteBarrelBlockEntity.java:39-41 |
| Irradiated crystal field | 4.0 per crystal, cluster scale capped at 6, range 8 x sqrt(scale) | ~/block/entity/RadioactiveWasteBarrelBlockEntity.java:43-45,82-84 |
| Falloff | radAtZero / (1 + distance^2 / 4), once per second | ~/block/entity/RadioactiveWasteBarrelBlockEntity.java:114 |
| Antirad | -40 dose, +4 nausea | ~/registry/DoomedItems.java:501-507 |
Notes
- PathogenType carries a vaccinePreventable flag, true for Marrow Fever and false for the other three, and nothing in the shipped mod ever calls the getter. The vaccine item the flag was written for is fully specified in reference/GRAND_EXPANSION.md under "Immunity, vaccination, quarantine", down to the mild side-effect fever and the bad batch that seeds a case. It was never built. reference/QOL_ROADMAP_2026_07_BATCH1.md lists the flag as dead substrate and proposes a tablet assay instead, and no entry anywhere records whether the vaccine tier was dropped or only deferred.
- reference/CONTAGION_AUDIT.md, finding 5, says in as many words not to gate contagion behind infection, on the grounds that doing so would silently switch off a second system. The shipped BodySimulation gates it exactly that way, and carries its own four-line comment justifying the reversal. The audit was never amended, so the design record and the code disagree on this point and a reader who trusts reference/ will get it backwards.
- Person-to-person spread and the carrier state have never been mechanically exercised. shed() needs a second ServerPlayer, no gametest in the repo touches it, and /doomstat can seed all three transmissible pathogens but has no setter for carriage at all. The 0.35 constant shed rate and the 33 percent Rot Lung carrier roll are therefore code that has only ever run in a live multiplayer session, if it has run at all.
- The Ventilation unit forces measured air risk to zero and so closes the entire Rot Lung environmental route. It is a passive presence check within 8 blocks with no ticker, no energy draw and no filter to replace, and its own class documentation only ever mentions grime accrual underground. AirQualityService reused that check later as the hard counter to airborne disease. Whether the block was meant to carry the second job is not recorded.
- A maintained body with no traits and no drugs tops out at immunity 122 against a break-even of 120, which leaves natural clearance running at roughly 0.0075 load per second. The comment on IMMUNITY_BREAKEVEN records the scale and the intent and says nothing about that two-point margin. Whether the ceiling was tuned to sit just above the line, or landed there out of two formulas written months apart, is not written down.
Drugs and Pharmacology
Doomed has two separate painkilling channels and they behave nothing alike. The opioid channel runs on a single derived number called reception, which is your active opioid level minus the tolerance your body has built against it, and everything else in the system reads that one value. The non-opioid channel is a flat level that dulls pain without ever touching reception, at the cost of thinned blood and a bad stomach. Around those sit the stimulant, the sedative, the antagonist that reverses an overdose, and a server switch that can remove the entire opioid family from the world.
Reception
The body tracks two values: the opioid level in the blood, and the tolerance built against it. Reception is level minus tolerance. Positive reception is relief and negative reception is withdrawal. Zero is a body that has learned to need exactly what it is getting.
Nothing in the mod acts on reception directly. Every effect reads a smoothed copy that chases the real value at 5 points per second, so a dose eases in over several seconds and lingers on the way out rather than snapping on and off. That smoothing is why a huge push does not kill you the instant the plunger bottoms out. It is also why a reversal is not instant.
While smoothed reception is positive it drains pain on every limb at 0.3 per second per point of reception. Pain climbs back toward its own target at 0.6 per second, so any meaningful dose outpaces the re-raise and holds pain down; a trickle dose only blunts it. Reception drops the blood-pressure target by 0.4 per point, drops the heart-rate target by a fifth of itself, and subtracts itself straight out of respiratory drive. Above reception 30 it quietly drains energy. Above reception 5, and only while mood is above -60, it pays a very small amount of real happiness.
The HUD moodle reads the raw reception instead of the smoothed one, so the chip can change a moment before the effect does.
Strong injectable painkiller; risk of opioid tolerance.
tooltip.doomedmatu.morphine_syringe
The stated warning is tolerance. Reception, level minus tolerance, is the number every effect actually reads, and the tooltip does not name it.
Both painkilling channels are read together outside the drug system: TreatmentService steadies the treatment hand by (reception + Nocifen level x 0.5) / 100 x 0.18, and AmputationHandler reads the same pair as stump analgesia, so being medicated makes you better at surgery on someone else as a side effect of being medicated for yourself. Injury and Treatment
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Reception definition | opiate level minus opiate tolerance | ~/capability/DoomedData.java:3344 |
| Smoothing rate toward true reception | 5 points per second | ~/body/DrugHandler.java:117 |
| Pain drained per second per reception point | 0.3 on every limb | ~/body/DrugHandler.java:36 |
| Pain re-rise rate it competes with | 0.6 per second (falls at 1.0) | ~/body/PainHandler.java:63-64 |
| Energy drain above reception 30 | reception x 0.0025 per second | ~/body/DrugHandler.java:139-141 |
| Blood pressure target shift | -0.4 per reception point | ~/body/CardiovascularHandler.java:133 |
| Heart rate target shift | -reception / 5 | ~/body/CardiovascularHandler.java:285 |
The barrel
Every factory syringe holds 100 ml, and the injection minigame fills at 50 ml per second at full needle depth. A full barrel goes in in about two seconds of holding.
Four of the shipped syringes are not neat drug. The fentanyl barrel is 90 ml of water and 10 ml of fentanyl, because nobody injects fentanyl neat, and the heroin barrel is roughly two parts heroin to one part water. A full push of the factory fentanyl syringe therefore delivers 420 points of opioid load. Respiratory arrest sits near 100. A quarter of that barrel stops your breathing, and the whole thing is four times a lethal dose.
The same barrel filled with neat fentanyl from your own chemistry is ten times that: 4200 points for 100 ml. Nothing special-cases it. The factory dilution was the only thing keeping the number survivable.
Morphine's full syringe is 90, which lands just under the arrest line, and that is why morphine is the drug that can actually be titrated. Opium's full syringe is 40. The factory heroin syringe delivers about 87 points of opioid and about 33 points of sickness, since heroin also churns the gut at half a sickness point per active millilitre.
On opium, morphine, fentanyl, heroin, the stimulant and the sedative, the one-click treatment shortcut is deliberately switched off. The minigame is the dose control on those six, and emptying the barrel in one click would be choosing the largest dose available on exactly the drugs that overdose.
An injection lands in a depot, a reservoir under the skin, rather than in the blood. The depot feeds the active level every tick at a per-drug fraction of whatever is left in it. Opium absorbs at 10 percent of the remaining depot per second, morphine 12 percent, heroin 18 percent, fentanyl 9 percent, and the sedative 55 percent.
That is what makes fentanyl the most dangerous thing in the game rather than the fastest. Its absorption is deliberately the slowest of the four, so an enormous dose spreads out: it hits hard, keeps coming, and stays catchable for a while. Opium is gentle and gradual under the same rule.
Mixing opioids blends the depot's absorption rate toward the new dose, weighted by size, so stacking drugs behaves sensibly instead of taking whichever rate arrived last.
As smoothed reception first climbs through 65 there is one line: "Your breathing is going shallow." At the 5-per-second slew that is roughly seven seconds of warning before respiratory drive reaches zero. It fires once per crossing, on the way up only.
Swallowed opioids and the regenerative serum skip the depot and write the active level directly.
An empty, refillable syringe (100 mB).
Fill it with a drug fluid at a barrel or filler, then
inject it into a limb like any other syringe.
tooltip.doomedmatu.syringe
"like any other syringe" is the gap: the same 100 ml barrel filled with neat fentanyl carries 4200 points against an arrest line near 100, where the factory one carries 420.
One opioid arrives without a needle at all: analgesic gauze adds 28 opiate points straight to the active level at a full wrap, skipping the depot, the purity scaling and the minigame, so four wraps put a patient over the arrest line with a dressing that is not tagged as an opioid and is not counted anywhere as a dose. Injury and Treatment
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Syringe capacity | 100 ml | ~/registry/DoomedItems.java:87 |
| Injection rate at full depth | 0.05 ml per millisecond (50 ml/s) | ~/client/screen/SyringeScreen.java:41 |
| Opium, full syringe | 40 opiate points | ~/body/DrugService.java:42 |
| Morphine, full syringe | 90 opiate points | ~/body/DrugService.java:43 |
| Fentanyl, neat, per 100 ml | 4200 opiate points | ~/body/DrugService.java:92 |
| Fentanyl factory syringe mix | 90 ml water + 10 ml fentanyl, so a full push = 420 | ~/item/SyringeContents.java:54-55 |
| Heroin factory syringe mix | 66.7 ml heroin + 33.3 ml water; full push = 86.7 opiate, 33.4 sickness | ~/item/SyringeContents.java:57 with DrugService.java:428-430 |
| Drugs where one-click auto-resolve is refused | opium, morphine, fentanyl, heroin, stimulant, sedative | ~/body/DrugType.java:90-95 |
| Opium absorption | 0.10 of remaining depot per second | ~/body/DrugService.java:56 |
| Morphine absorption | 0.12 per second | ~/body/DrugService.java:57 |
| Heroin absorption | 0.18 per second | ~/body/DrugService.java:58 |
| Fentanyl absorption | 0.09 per second | ~/body/DrugService.java:59 |
| Sedative absorption | 0.55 per second | ~/body/DrugService.java:600 |
| Pre-arrest warning threshold | smoothed reception 65, crossing upward | ~/body/DrugHandler.java:57 |
| L.R.D. / Regenex direct opioid load | 0.4 opiate level per ml, no depot | ~/body/DrugService.java:411 |
The factory fentanyl syringe is 90 percent water, and yours is not
The shipped fentanyl syringe is a 1 to 9 dilution, so a full 100 ml push delivers 420 points of opioid load against a respiratory arrest line near 100. Filling the same 100 ml barrel with neat fentanyl from your own chemistry delivers 4200. The heroin syringe is likewise cut two parts to one, so its full push is about 87 points rather than the 130 a neat barrel would give.
FRAGMENT 04-B - REBOUND NOTICE
SUMMARY: Naloxone empties the blood and never touches the depot. When the antagonist decays to zero with more than 25 points of opioid still waiting under the skin, the reservoir starts feeding the level again and the respiratory danger returns behind it. The mod tells the player exactly once, at the moment the antagonist runs out.
RESPONSE: One line, verbatim: "The naloxone is spent, and there is still opioid in you". It fires from DrugHandler on the tick the antagonist hits zero, and only when the depot is still above 25. On the way up, the matching telegraph reads "Your breathing is going shallow" as smoothed reception first crosses 65, roughly seven seconds ahead of arrest at the 5-per-second slew.
FINAL NOTE: Both lines go through BodyAlert, whose own javadoc opens with "Action bar, never chat." - 0.2.9 pulled 135 messages out of chat on purpose so nothing would stack up and nothing would repeat. The consequence for these two is that the only notice a second overdose has begun is transient text above the hotbar, written to no log and recoverable from nowhere. A player looking down at their inventory when it fires gets no record that it fired at all.
DrugHandler.java lines 107-155 (RESP_ARREST_WARN, REBOUND_WARN_DEPOT) and BodyAlert.java:12-47
FRAGMENT 05-C - RECORDED SPEECH, WITHDRAWAL
SUMMARY: Below smoothed reception -15 the character starts speaking withdrawal lines aloud, typed out over the puppet. Three are authored. They are among the most direct things anyone in this mod says.
RESPONSE: Verbatim, from Quips: "My bones-they're itching-please, just one, I swear just one...", "I'm sick, I'm so sick without it-help me-!", and "I'm crawling out of my skin-please!". The line has a 720-tick cooldown and sits high in the priority walk, above the comfort complaints and below the damage lines.
FINAL NOTE: QuipHandler suppresses all speech once mood drops below -75. Withdrawal is itself a mood term at reception x 1.66, floored at -80. The withdrawal that produces the line is therefore also the thing that eventually takes it away, and past a certain depth the character stops asking. Whether the -75 speech gate and the -80 withdrawal floor were set against each other, or merely landed near each other, is not written down.
Quips.java:131, QuipHandler.java:50 and :216, MoodHandler.java:150-151
Overdose
Opioids do no direct damage. Respiratory drive starts at 100 and reception is subtracted from it, so reception near 100 drives breathing to zero, oxygen saturation collapses, and the hypoxia kills the brain. That chain is the whole of an opioid death. A body can be fully analgesic and dying at the same time, so restoring consciousness without watching ventilation only looks like a save.
Naloxone loads an antagonist at 0.5 points per millilitre. While any antagonist is present it drives the active level toward zero at 8 points per second, on top of normal decay. The antagonist itself decays at 1 point per second, so a 25 ml push buys about 12.5 seconds of clearing.
Naloxone clears the blood and leaves the depot alone. If the antagonist runs out while there is still opioid waiting to absorb, the level climbs straight back and the respiratory danger climbs with it. With more than 25 points still in the depot when that happens you are told: "The naloxone is spent, and there is still opioid in you." That is a cue to redose, not a decoration. An under-reversed fentanyl push is the classic way to die twice.
The diagnostic tablet's recommended dose is smoothed reception divided by four, capped at 25 ml. It is a conservative starting push and it makes no claim to have cleared you.
The opioid level itself decays on a tiered curve that gets faster the higher it is, from 0.059 per second below level 100 up to 0.839 per second above 300. Level is hard-capped at 500.
Opioid antagonist; reverses an opiate overdose fast.
tooltip.doomedmatu.naloxone_syringe
Fast and partial. It clears the blood at 8 points per second and never removes a point from the depot, which is why the level can climb straight back when the antagonist runs out.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Respiratory drive term | base 100 minus smoothed reception | ~/body/RespirationHandler.java:114-121 |
| Naloxone antagonist loaded | 0.5 per ml | ~/body/DrugService.java:83 |
| Antagonist clearing rate | 8 opiate points per second | ~/body/DrugHandler.java:53 |
| Antagonist self-decay | 1 per second | ~/body/DrugHandler.java:51 |
| Rebound warning threshold | depot above 25 when antagonist expires | ~/body/DrugHandler.java:55 |
| Tablet naloxone prescription | smoothed reception / 4, capped at 25 ml | ~/client/screen/DiagnosticTabletScreen.java:3749-3751 |
| Opiate level decay tiers, per second | 0.059 / 0.109 / 0.179 / 0.269 / 0.379 / 0.509 / 0.659 / 0.839 at levels 100 / 130 / 160 / 195 / 235 / 260 / 300 / above | ~/body/DrugHandler.java:220-238 |
| Opiate level hard cap | 500 | ~/capability/DoomedData.java:2998-3001 |
Naloxone clears your blood and leaves the depot untouched
An injected opioid sits in a depot that feeds your bloodstream over time. Naloxone drives the blood level toward zero at 8 points per second while its antagonist lasts, and the antagonist decays at 1 per second. It never removes a single point from the depot. If the antagonist expires with more than 25 points still waiting to absorb, the level climbs straight back and you get one line saying so. Under-reversing a fentanyl push is a delayed second overdose.
Withdrawal
Tolerance climbs whenever reception is positive, at 0.08 per second, with another 0.022 while reception is above 45. Its ceiling is the current opioid level, so it tracks a habit instead of running away. The Addictive Personality trait multiplies the climb by 1.7.
Tolerance falls whenever reception is negative, at 0.04 per second, with another 0.025 while reception is below -30. Being in withdrawal is the only thing that unwinds a habit.
Negative reception is the withdrawal. Mood takes the reception value multiplied by 1.66, floored at -80, which makes withdrawal a far heavier mood term than the high ever was a lift. Below -16 nausea accrues at 0.09 per second. Below -15 a nap or a bed ends immediately if there is any real energy left, and you cannot sleep through it.
Below smoothed reception -34 the withdrawal latches fibrillation on the heart. Latched means it stays after the withdrawal lifts. It clears at 0 or 100 percent fibrillation, or on a defibrillator or a restart. Deep withdrawal commits you to a defibrillator or an arrest. That is the actual teeth of the addiction system.
A warning stage sits ahead of all of it. Once tolerance passes 30 while reception is roughly neutral, a Dependent chip appears, because a habit otherwise stays invisible until it turns into a crash.
Dying wipes opioid level, depot, tolerance, oral load and antagonist. Respawning is a cure for an opioid habit.
Basic injectable painkiller; risk of opioid tolerance.
tooltip.doomedmatu.opium_syringe
Tolerance is the whole of the stated risk. The latched fibrillation that deep withdrawal commits you to, below smoothed reception -34, is not part of the warning.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Tolerance rise | 0.08/s, plus 0.022 while reception is above 45; ceiling is current level | ~/body/DrugHandler.java:41-44 |
| Tolerance fall | 0.04/s, plus 0.025 while reception is below -30; floor 0 | ~/body/DrugHandler.java:45-47 |
| Addictive Personality multiplier on tolerance gain | x1.7 | ~/body/Trait.java:355-363 |
| Withdrawal mood term | reception x 1.66, floored at -80 | ~/body/MoodHandler.java:150-151 |
| Withdrawal nausea | 0.09 sickness/s below reception -16 | ~/body/DrugHandler.java:145-147 |
| Forced sleep break | reception below -15 with energy above 45 | ~/body/DrugHandler.java:148-154 |
| Forced fibrillation latch | smoothed reception below -34 | ~/body/DrugHandler.java:49 |
| Dependent chip threshold | tolerance above 30 | ~/client/hud/DoomedHudOverlay.java:734 |
| Moodle stages, dosed | reception above 5 / 20 / 50 / 80 | ~/client/hud/DoomedHudOverlay.java:1664-1681 |
| Moodle stages, withdrawal | reception below -5 / -15 / -25 / -34 | ~/client/hud/DoomedHudOverlay.java:1683-1699 |
Deep withdrawal latches your heart into fibrillation and lifting the withdrawal does not clear it
Smoothed reception below -34 forces fibrillation and sets a latch. The latch does not release when reception comes back up. It releases only at 0 or 100 percent fibrillation, or on a defibrillator or a heart restart. Taking another dose stops the withdrawal and leaves the latched heart behind.
Pills and charcoal
A swallowed opioid raises the active level and also a second pool that tracks how much of it is still sitting in the gut. That gut pool fades at 3 points per second as absorption completes, and it is clamped so it can never exceed the total active opioid.
One Painkillers pill is 14 points. It is a single 10 ml swallow out of a bottle rather than the bottle, and it is real relief on its own. Chaining seven or eight of them crosses the arrest line. That is the intended way to die of pills.
Mushpear, an ordinary foraged fruit, carries 10 points of oral opioid per fruit. Nothing about the item announces this.
Activated charcoal instantly binds half of whatever is still in the gut pool, purges 60 points of sickness, and opens a 60-second window during which it keeps binding at 1.5 points per second. The improvised charcoal slurry binds only a fifth, purges 20 sickness, opens a 20-second window, and has a one in four chance of adding 8 sickness instead of helping.
Charcoal only ever draws down the gut pool. An injected dose, venom and radiation all sit outside its reach. Naloxone is the answer to a needle; charcoal is the answer to a bottle.
The cost is the gut. While the charcoal window is open it absorbs less of everything, and food gives half its nutrition and half its weight gain. Taking charcoal and then eating is throwing food away.
A pear gone to mush. It is foul to eat and it leaves an opiate trace behind.
tooltip.doomedmatu.mushpear
The tooltip does flag the trace. The amount is not stated: 10 points of oral opioid into the same gut pool a 14-point Painkillers pill uses.
The blunting lands inside Consumption.eat itself, which multiplies both the hunger value and the weight gain by the charcoal absorption factor before either reaches the body, so no food item is exempt and nothing about a particular meal signals that the window is open. Needs and Survival
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Painkillers pill | +14 oral opioid per pill | ~/registry/DoomedItems.java:300 |
| Mushpear | +10 oral opioid per fruit | ~/registry/DoomedConsumables.java:204 |
| Oral absorption fade | 3 points per second, clamped to total opioid | ~/body/DrugHandler.java:39 |
| Activated charcoal instant bind | 50 percent of the gut pool, -60 sickness | ~/registry/DoomedItems.java:318-323 |
| Charcoal window | 60 seconds, binding 1.5 opioid per second | ~/body/CharcoalHandler.java:22-26 |
| Improvised slurry | 20 percent bind, 20-second window, -20 sickness, 25 percent chance of +8 sickness | ~/registry/DoomedItems.java:330-340 |
| Food absorption while the window is open | x0.5 nutrition and weight gain | ~/body/Consumption.java:62-64 |
Charcoal halves the food you eat for the next minute
Taking activated charcoal opens a 60-second gut window. While it is open, every food you eat gives half its nutrition and half its weight gain. The improvised slurry opens a 20-second version of the same window. Charcoal also only ever binds the swallowed portion of an opioid; it cannot reach anything injected, and it does nothing for venom or radiation.
Mushpear is an opioid
The foraged mushpear adds 10 points of swallowed opioid per fruit, into the same gut pool a Painkillers pill uses. It builds tolerance and feeds withdrawal exactly like any other opioid, and activated charcoal binds it.
Anhedonia
Anhedonia is a separate meter. It builds while mood sits at or below -55 and fades slowly once the body is genuinely clear of the pit. At full anhedonia every positive mood change is worth 15 percent of itself and the natural drift back toward baseline runs at 30 percent speed. It takes nothing away. It makes what would have lifted you stop landing.
Opioids feed it. While smoothed reception is 25 or higher, anhedonia builds at 0.012 per second on top of everything else. A habit alone can carry you to anhedonia 70 and no further; past that you have to do it to yourself.
Analgesia is untouched by any of it, and that is exactly the trap. The pain relief keeps working perfectly, so from the inside another dose stays the rational move while the thing being dosed for gets quietly harder to feel.
Above anhedonia 55 your own hands stop trying properly: self-treatment effectiveness falls from full down to 55 percent at the maximum. It is a reluctance rather than a block, and it never applies to work another player does on you. Above 80 nobody sitting with you can reach you at all.
Antidepressants are the counter, and they are not a mood button. A dose loads 20 points of depot and does nothing whatsoever for 14400 ticks, which is 12 in-game minutes. After that it lifts happiness at 0.022 per second and, far more importantly, halves how fast the numbness deepens. Tolerance builds at 0.05 per second while dosed and fades at 0.02 per second when clean, so swallowing the bottle stops working inside one session.
Anhedonia survives death, halved and capped at 40 each time.
A dose lifts your mood away from despair.
tooltip.doomedmatu.antidepressant
The lift is 0.022 happiness per second and it starts 14400 ticks after the dose. The halved anhedonia gain, which is the part that matters, goes unmentioned.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Opioid spiral gate | smoothed reception 25 or higher | ~/body/Anhedonia.java:95 |
| Spiral build rate and ceiling | 0.012 per second, ceiling 70 | ~/body/Anhedonia.java:97-99 |
| Anhedonia build gate | mood at or below -55, fastest at -100 | ~/body/Anhedonia.java:35-39 |
| Reward multiplier at full anhedonia | 0.15 | ~/body/Anhedonia.java:44 |
| Drift multiplier at full anhedonia | 0.30 | ~/body/Anhedonia.java:46 |
| Self-care floor | 0.55, starting above anhedonia 55 | ~/body/Anhedonia.java:155-159 |
| Unreachable by others | anhedonia 80 | ~/body/Anhedonia.java:157 |
| Antidepressant onset | 14400 ticks (12 minutes), 20 depot per dose | ~/item/AntidepressantItem.java:28-30 |
| Antidepressant effect | 0.022 happiness/s, halves anhedonia gain | ~/body/Anhedonia.java:51-52 |
| Anhedonia on death | halved, capped at 40 | ~/capability/DoomedData.java:3952 |
Opioids permanently deepen anhedonia while leaving analgesia perfect
Above smoothed reception 25 your anhedonia builds at 0.012 per second, up to a ceiling of 70. Anhedonia scales every positive mood change down to as little as 15 percent of itself and slows the natural recovery drift to 30 percent, and it survives death halved and capped at 40. The pain relief is untouched, so the drug never stops being worth taking.
Nocifen
Nocifen is a non-opioid analgesic on a completely separate channel. Reception stays untouched, so it carries none of the opioid liabilities: respiratory depression, overdose, tolerance, withdrawal. Its level stacks freely and decays at 0.07 per second, which clears a single dose in roughly 12 minutes.
One Nocifen is 50 points of level. The herbal Feverbell Chew is 12 points and costs 4 happiness because it tastes foul. Relief is 0.1 pain per second per level point, a third of the opioid rate, so a single dose blunts pain rather than masking it.
The catch is blood. Nocifen thins it: natural clotting is multiplied by a factor that falls from 1 down to 0.5 as the level approaches 100. Medicating a bleed makes the bleed last longer, and that trade stays invisible unless you know to look for it.
It also upsets the gut continuously at 0.03 sickness per second. Above level 120 a gastric bleed opens in the abdomen at 0.02 internal-bleed units per second, capped at 0.5, with extra nausea on top. Two Nocifen plus a Feverbell Chew is 112. Three Nocifen is 150, and you are bleeding into your own stomach.
On the credit side it lowers the fever setpoint and drags active infections back at 0.1 per second, which slows an infection without ever curing one.
A non-opioid painkiller.
Weaker than the opioids, but no breathing risk, no
overdose, no addiction - and doses stack. Also fights
fever and inflammation.
The catch: it thins your blood (wounds clot slower)
and upsets your gut. Don't pop it while you're bleeding,
and don't chain doses or you'll start a stomach bleed.
tooltip.doomedmatu.nocifen
The tooltip names both costs and even the stomach bleed. It stops short of the number: level 120, which three doses clear and two plus a Feverbell Chew do not.
The thinning is applied where every other clotting modifier is applied: BleedHandler multiplies its natural clot rate by NsaidHandler.clotFactor in the same product as the venom factor and the cold factor, so a medicated bleed compounds with a snakebite or with hypothermia rather than replacing them. Blood and Circulation
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Nocifen dose | +50 level | ~/registry/DoomedItems.java:307 |
| Feverbell Chew dose | +12 level, -4 happiness | ~/registry/DoomedItems.java:259 |
| Pain relief | 0.1 per second per level point | ~/body/NsaidHandler.java:26 |
| Level decay | 0.07 per second | ~/body/NsaidHandler.java:28 |
| Clotting penalty | x1.0 down to x0.5, saturating at level 100 | ~/body/NsaidHandler.java:95-100 |
| Gastric bleed threshold | level 120 | ~/body/NsaidHandler.java:38 |
| Gastric bleed rate and cap | 0.02 per second, capped at 0.5, plus 0.06 nausea/s | ~/body/NsaidHandler.java:39-41 |
| Anti-inflammatory drag | 0.1 infection per second on infected limbs | ~/body/NsaidHandler.java:34 |
Nocifen thins your blood, and stacking it opens a stomach bleed
The non-opioid painkiller multiplies natural clotting by a factor falling to 0.5 as its level approaches 100, so a medicated wound bleeds for longer. Past level 120, which is three Nocifen, an internal bleed opens in your abdomen at 0.02 units per second and keeps going until the level decays back down. One dose is 50 points and the level decays at 0.07 per second.
Stimulants
The stimulant syringe buys 3.6 seconds of stimulant time per millilitre, so a full 100 ml barrel is 360 seconds. The overdose line is 220 seconds of remaining time. A full push is well past it.
While the stimulant runs, one step fires per second: 2 stamina, 2 consciousness, 0.1 energy, 7 adrenaline, a little nausea, and a small internal bleed in the abdomen from the racing circulation. The speed and attack-rate buff builds by 0.035 a step to a ceiling of 0.25 and always bleeds back toward zero at 0.02 per second.
Above 220 seconds remaining the body starts coming apart. There is a 10 percent chance each second of a 35-point stamina crash, brain damage at 0.05 a second, a thorax pain spike of 4 up to a ceiling of 60, and convulsions. A convulsion is a real ragdoll: you are thrown, and you have to get up. The first one cannot land until you have been over the line for about eight seconds, then it is a 3.5 percent chance per second with a twelve-second cooldown between flings. Nothing tells you that you have overdosed.
The crash arrives as the stimulant runs out, and only if the window ever peaked above 59 seconds. Below 30 seconds remaining you take random 25-point stamina crashes; on the final second you lose 30 energy and vomit.
Epinephrine queues 6 active ticks per millilitre and grants 1.5 adrenaline per millilitre. Each active tick on an arrested heart has a 3 percent chance to restart it, coming back at heart rate 60 with 50 percent fibrillation and a clean, unlatched rhythm. A bolus of 40 ml or more starts and latches fibrillation by itself, so a panicked full-syringe push is a heart problem you created.
Adrenaline decays at 1.7 per second, except during a last stand, where it is pinned upward at 5 per second instead. It masks pain at 0.35 of its smoothed value, and the smoothing ramps at 4 per second, so a sudden injury hurts fully for a moment before the numbing takes hold.
The combat pen is a single right-click that applies 200 seconds of stimulant, 22.5 adrenaline, 90 epinephrine ticks, and an oxygen kick, all at once.
Adrenaline and stamina shot; too much overdoses you.
tooltip.doomedmatu.stimulant_syringe
"Too much" is 220 seconds of remaining duration against a full barrel's 360. The crossing itself sends nothing, so the first real signal is the convulsion.
A convulsion is not a bespoke animation: StimulantHandler floors your shock at 20 and sets a launch velocity, so DownedStateHandler collapses you on the next tick down the ordinary downed-to-ragdoll path, and getting back up costs exactly what getting up from any other collapse costs. Pain, Consciousness and Death
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Stimulant duration per ml | 3.6 seconds (360 s for a full syringe) | ~/body/DrugService.java:96 |
| Stimulant overdose line | 220 seconds of remaining duration | ~/body/StimulantHandler.java:43 |
| Convulsion grace, chance and cooldown | 8 seconds, 3.5 percent per second, 12-second cooldown | ~/body/StimulantHandler.java:50-53 |
| Speed buff ceiling and decay | 0.25 ceiling, +0.035 per step, -0.02 per second | ~/body/StimulantHandler.java:41, 128-130 |
| Crash gate | peak above 59 seconds; final second is -30 energy and vomit | ~/body/StimulantHandler.java:45, 156-164 |
| Epinephrine per ml | 6 active ticks, +1.5 adrenaline | ~/body/DrugService.java:61-62 |
| Epinephrine fibrillation bolus | 40 ml or more latches fibrillation | ~/body/DrugService.java:63 |
| Heart restart chance | 3 percent per active tick; returns at HR 60, fibrillation 50 | ~/body/DrugHandler.java:60-62 |
| Adrenaline decay | 1.7 per second, or pinned +5 per second in a last stand | ~/body/DrugHandler.java:57-59 |
| Adrenaline pain mask | 0.35 of smoothed adrenaline, ramping at 4 per second | ~/body/PainHandler.java:71, 75 |
| Combat pen | 200 s stimulant, +22.5 adrenaline, 90 epi ticks, +5 SpO2, +5 stamina, +0.025 L blood | ~/body/DrugService.java:766-775 |
The stimulant overdose sends you no message at all
Stacking more than 220 seconds of stimulant starts convulsions, brain damage at 0.05 per second, random stamina crashes and a thorax pain spike. The throttled warning that was meant to announce this currently sends nothing. Your first real signal is being flung to the ground about eight seconds after crossing the line.
The sedative
The sedative does not kill pain. It removes the person who was feeling it. Per millilitre it adds 1.6 sedation, 1.1 opioid to the depot at a fast 55 percent absorption, and it subtracts 0.16 respiration and 0.22 from blood pressure.
Sedation is a hard cap on consciousness: the ceiling is 100 minus sedation, applied as a cap rather than a write, so nothing can raise a body back through it while the drug lasts. It clears at 0.75 per second, which makes a 40 ml surgical dose about a minute and a half under.
A 40 ml push is a surgical dose. A 100 ml push is an apnoea somebody else has to breathe for. That judgement is the entire drug.
Because the relief rides the ordinary opioid depot, everything that already reads "how medicated is this body" picks the sedative up for free, including the pain mask, the hand tremble in the treatment minigames, and the vision fog. It also means naloxone reverses a sedative overdose, which is correct and is the counterplay.
Surgery is where it earns itself. An open limb adds 62 pain to its target during an operation, and sedation scales that away to nothing at sedation 70. Unsedated, a long procedure can put a conscious patient into pain shock on the table.
Sedating yourself is no use. The procedure screen aborts below consciousness 12, so a self-dose leaves you unconscious on the floor with your abdomen open. Self-surgery is done awake. Painless surgery requires a second person.
Puts a body under. It does not stop the pain - it removes the person feeling it. For a stable adult, begin around 40 mL and reassess consciousness, breathing and pressure before adding more. You cannot operate on yourself while under.
tooltip.doomedmatu.sedative_syringe
String and code agree on the 40 mL start. Neither this nor anything else on the item says the dose rides the opioid depot, which is what lets naloxone reverse it.
The ceiling is enforced in ConsciousnessHandler, which caps consciousness at 100 minus sedation after every other term has been summed, so a stimulant, an adrenaline surge and a shout from a friend all resolve first and are then cut off at the same line. Pain, Consciousness and Death
Purity and needles
Every drug fluid carries a purity from 0 to 100 in its own data, and it rides along through tanks, pipes and syringes. Factory pharmaceutical syringes are always pure. Anything self-made is as pure as the process that made it.
Purity is the active fraction rather than a second punishment. A 100 ml push at 40 percent grade delivers the effect of 40 ml plus 60 ml of dirty inactive material. A low-grade find cannot give a pharma-strength effect and then charge extra on top.
The dirt is charged once per injection. Sickness is 0.4 per millilitre scaled by how impure it was, so 100 ml of completely filthy drug is about 40 sickness. It can also fester the injection site, seeding up to 25 points of infection at 0 percent purity, scaled by how much volume actually went in.
Every invasive dose creates a real puncture wound at the site, and process contamination from the fluid lands in that exact wound.
A needle that has been in a person is dirty from then on. Reusing one seeds 12 points of infection at the new site whether or not any disease transfers, and it carries the exact blood-borne agents from the previous bloodstream and no others - a Marrow Fever needle cannot invent Rot Lung. Blood bags work the same way and come back empty and contaminated, inheriting both bloodstreams the line ran between. The fix is one right-click at a campfire.
In the minigame, the needle's entry point locks the moment it pierces. After that the barrel only tilts with how far a shaking hand drifts off that line. Drift past 80 units and the needle tears free: 20 ml of the syringe wasted, 20 pain, a fragment snapped off inside the limb if one is not already there, and nothing delivered. A fragment in a wound suspends natural clotting until it is pulled.
A mixed solution injects proportionally - pushing 40 of a 100 ml mix delivers 40 percent of every component, not 40 ml of the first one - and its purity is the volume-weighted average of what is in it.
The needle glows, then cools. Clean.
message.doomedmatu.syringe_sterilized
That line is the campfire right-click, and it is the whole of the fix for a needle that has been in a person.
All three quality tags a syringe reads - Purity, ChemicalCarryover and MicrobialLoad - are written by the Reactor and the process machines from their own equipment cleanliness and blended by volume in PurityBlendingTank, so the grade you inject is decided entirely upstream in the chemistry and carried, never rerolled. The Chemistry Engine
A reused needle sets the site's infection to 12 and the wound's contamination to 35 through the ordinary wound ledger, so the puncture then progresses under the same infection rules as any other dirty wound and can carry through to sepsis without a second injection ever happening. Disease and Infection
Nicotine
Each cigarette needs a lighter or flint and steel somewhere in the inventory. It gives up to 2 mood, adds 0.3 permanent lung tar, and adds 2 points of nicotine dependence. Addictive Personality multiplies the dependence gain by 1.7.
Dependence runs 0 to 100 with four stages at 10, 30, 55 and 80. At the ordinary rate stage I begins on the fifth cigarette. While nicotine is absent at any stage, derived mood carries a flat penalty: 4 at stage I, 9 at stage II, 16 at stage III, 25 at stage IV. That last one is a large enough mood cost to matter on a body where mood drives despair.
The reward shrinks as the dependence grows. A smoke is worth its full 2 mood at stage 0, three quarters at stage I, half at stage II, a quarter at stage III and an eighth at stage IV. Past the early stages you are no longer smoking to feel good, you are smoking to stop feeling bad.
A cigarette buys quiet for 8 minutes, and the higher stages buy less: 7 minutes at stage II, 6 at stage III, 5 at stage IV. Dependence recovers only while that quiet has run out, at 0.02 per second, which is 1.2 points per simulated minute. Clearing stage IV takes several active in-game days without smoking.
Dependence survives death on purpose. Respawning cures an opioid habit and leaves this one alone. Lung tar, which lowers the stamina ceiling, is cleared by death and by nothing else. Five hundred lifetime cigarettes earns Loyal Customer.
Blood alcohol is a single value and it clears at a flat 0.02 per second regardless of how much is in you. Almost every other decay in the mod is proportional. This one is not, and that choice is the whole mechanic: a second bottle opened before the first has cleared stacks on top of it, while the same two bottles an hour apart never reach the same peak.
A 400 ml bottle puts on 24 points and clears in 1200 seconds, one Minecraft day. Against Nocifen shedding at 0.07 per second, that is about three and a half times slower per unit. You are stuck with it.
Below 15 nothing registers at all, so a single 100 ml gulp at 6 points is free. The distortion ramps from 15 to full at 55. Visible drunkenness starts past about 35 percent of that ramp, a blood alcohol of 29 - two glasses of wine, or one spirit and some patience. Past that point the room starts moving, refreshed every two seconds.
Alcohol carries no pain relief, no mood lift, no euphoria, and it never will. It hydrates worse than water and sickens you unconditionally. The part of it above a tolerated threshold is what your liver reads. Everything alcohol does is a cost or a distortion.
Death sobers you completely.
Matu Tobacco Co. - 'A small death, held between your lips.'
Needs a lighter. A little calm now; tar in your lungs forever.
tooltip.doomedmatu.cigarette
Both halves are literal. The tar clears on death and on nothing else, and the calm is down to an eighth of its original 2 mood by stage IV.
Tar is spent where you would least look for it: StaminaHandler subtracts lung tar from the stamina ceiling in the same expression as SpO2, so a heavy smoker's maximum stamina is capped by the same term that a suffocating player's is. Needs and Survival
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Dependence per cigarette | +2, multiplied by 1.7 with Addictive Personality | ~/item/CigaretteItem.java:38 |
| Stage thresholds | 10 / 30 / 55 / 80 out of 100 | ~/capability/DoomedData.java:2005-2013 |
| Withdrawal mood penalty by stage | 4 / 9 / 16 / 25 | ~/capability/DoomedData.java:2016-2024 |
| Reward multiplier by stage | 1.0 / 0.75 / 0.50 / 0.25 / 0.125 | ~/item/CigaretteItem.java:118-126 |
| Sated window by stage | 8 / 8 / 7 / 6 / 5 minutes | ~/item/CigaretteItem.java:40, 128-135 |
| Dependence recovery | 0.02 per second, only while unsated | ~/body/CigaretteHandler.java:24 |
| Lung tar | 0.3 per cigarette, about 330 to fully coat | ~/item/CigaretteItem.java:36 |
| Persistence across death | dependence and lifetime count survive; tar is cleared | ~/capability/DoomedData.java:3783-3788 |
| Clearance | 0.02 per second, flat regardless of dose | ~/body/AlcoholHandler.java:52 |
| One 400 ml bottle | 24 points, 1200 seconds to clear | ~/body/AlcoholHandler.java:48-51 |
| Effect onset and full | 15 and 55 | ~/body/AlcoholHandler.java:55-57 |
| Visibly drunk threshold | 0.35 of the ramp, a blood alcohol of 29 | ~/body/AlcoholHandler.java:66-67 |
| Hydration and sickness | 75 hydration per litre against water's 90; 70 sickness per litre | ~/body/AlcoholHandler.java:31-32 |
| On death | blood alcohol reset to 0 | ~/capability/DoomedData.java:3871 |
Respawning cures an opioid habit but not a nicotine one
Death resets opioid level, depot, tolerance, the swallowed pool, the antagonist, the non-opioid level, blood alcohol and the charcoal window to zero. Nicotine dependence and lifetime cigarette count deliberately survive, so a new life inherits the habit and its withdrawal mood penalty. Lung tar goes the other way: death is the only thing that ever clears it.
FRAGMENT 11-A - CUSTOMER RECORD
SUMMARY: Nicotine dependence and the lifetime cigarette count are two of the very few numbers on the body that a death does not clear. Lung tar runs the opposite way: dying is the only thing that ever removes it. At 500 lifetime cigarettes the mod grants an advancement from code rather than from a criterion, using minecraft:impossible as the trigger so nothing else can award it.
RESPONSE: The advancement text, verbatim: "Smoke 500 Matulls. Matu Tobacco Co. thanks you for your continued patronage." It is a challenge-frame advancement, announced to chat, not hidden. Its file carries a comment saying the counter survives death on purpose. The item tooltip it hangs off reads "Matu Tobacco Co. - 'A small death, held between your lips.'"
FINAL NOTE: CHANGELOG.md:625 records the one place this rule was tested and upheld. A player found that /doomedheal wiped opiates, tolerance, painkillers and stimulants while quietly skipping nicotine, so a total-body reset left you still addicted and already withdrawing. The fix cleared the dependence and deliberately left the count alone, on the stated grounds that the number of cigarettes your character has smoked is a record of what they did rather than something wrong with them.
data/doomedmatu/advancements/loyal_customer.json, DoomedData.java:238, CigaretteItem.java:43, en_us.json:493, CHANGELOG.md:625
The opioid switch
One server config flag, opioidsEnabled, defaults to true. Set it false and the opioid family stops existing rather than merely stopping working.
The family is opium, morphine, heroin, fentanyl and oxyline. Naloxone is deliberately outside it, because removing the antidote along with the drug would be the exact wrong half to cut, so naloxone still turns up in loot.
Switched off, the whole chain goes. Syringes and every intermediate item on the synthesis chain leave loot tables, trader shelves and every creative tab, because half a chain is worse than none. Worldgen fluid barrels drop those entries from their weighted pools and keep their own proportions among what is left; before that gate existed, opium alone was 22 of the common pool's 64 weight, roughly one generated barrel in six. Wild opium poppies stop generating, and a poppy that predates the switch keeps growing while dropping nothing at all, which closes the renewable farm a single surviving seed used to be. The synthesis recipes leave the machines and the recipe viewers, and so do the reactor steps that were orphaned when their precursors went.
In the body, the depot, the level and the smoothed reception are pinned to zero every single tick. That is what makes a save that already carried a dose clear out instead of freezing. Tolerance and antagonist decay still run on those zeros, so nobody is stranded mid-withdrawal by a config flip.
Oxyline counting as an opioid surprises people. With the switch off, the oxyline syringe is gone and its effect is refused by name.
Two things sit outside the gate. The oral Painkillers pill is off the item tag, so it still generates in loot; the level pin makes it inert, and it is still there to find. And the combat pen writes its oxygen, stamina and adrenaline effects directly rather than through the drug path, so the pen keeps working exactly as before.
Oxygen booster; raises SpO2, breathing and stamina.
tooltip.doomedmatu.oxyline_syringe
Nothing here reads as an opioid, and the config removes this syringe with the family and refuses its effect by name.
The switch reaches into generation as well as into loot: CaveScatterFeature drops the blocked entries from its weighted barrel pools and renormalises what is left, and OpiumPoppyBlock keeps growing a standing poppy while returning nothing at all from a harvest. Items, World and Trade
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Config key and default | opioidsEnabled, default true | ~/config/DoomedConfig.java:1885-1896 |
| Blocked drug family | opium, morphine, heroin, fentanyl, oxyline | ~/body/OpioidPolicy.java:53-54 |
| Blocked process fluids | any doomedmatu fluid whose id contains opium, morphine, heroin, fentanyl or oxyline | ~/body/OpioidPolicy.java:57 |
| Item gate | the doomedmatu:opioids tag, 19 entries covering syringes, seeds, latex and every synthesis intermediate | res/data/doomedmatu/tags/items/opioids.json |
| Body pin | depot, level and smoothed reception set to 0 every tick | ~/body/DrugHandler.java:73-85 |
| Poppy behaviour | a standing poppy keeps growing and drops nothing | ~/block/OpiumPoppyBlock.java:43-49 |
| Barrel pool weight removed | opium was 22 of 64 in the common pool | ~/worldgen/CaveScatterFeature.java:480-487 |
Oxyline counts as an opioid, and the combat pen does not
The server opioid switch treats oxyline as part of the family, so switching opioids off removes the oxyline syringe and refuses its effect by name. The combat pen applies its stimulant, adrenaline and oxygen effects through its own direct path rather than the drug pipeline, so it keeps working unchanged. The oral Painkillers pill is likewise absent from the opioid item tag, so it still generates in loot; the per-tick level pin is what makes it do nothing.
Notes
- The stimulant overdose is supposed to announce itself. StimulantHandler.warnOverdose still carries a full javadoc describing one chat line on the first crossing and action-bar repeats every two seconds after it, and the method body is a guard clause followed by an if-statement with nothing inside it. The file imports net.minecraft.network.chat.Component and uses it nowhere, which is the residue a deleted message leaves. CHANGELOG.md:854 tells players that an overdose warns them before the first convulsion. Nothing in the commit record says when the lines went, or whether anyone meant them to.
- reference/THE_BOTTOM.md:104 is explicit that anhedonia is within-a-life and must reset on death. The shipped code at DoomedData.java carries it across instead, halved and capped at 40, with a comment saying dying is no cure. reference/GRAND_ROADMAP_2026_07.md:323 calls surviving death the single best addition that was never in the spec, so the reversal was deliberate. Where the halving came from, and why the cap landed on 40 rather than any other number, is written down in neither document.
- One injection is assessed for dirt twice by two systems that never consult each other. Purity drives the sickness and up to 25 points of injection-site infection; the separate MicrobialLoad tag on the same FluidStack drives the puncture wound's contamination and up to 35 points of its own. Both fire on the same push, from the same fluid, out of the same tank. Whether a self-made dirty batch is meant to be charged on both axes, or whether the newer wound-ledger path was supposed to replace the older one, is not recorded anywhere in the source or in reference/.
- The opioid mood term is floored on one side and open on the other. MoodHandler adds the smoothed reception straight into the mood total when it is positive and multiplies it by 1.66 with a floor of -80 when it is negative. Mood then clamps to 100. So any reception near 100 pins the derived mood at maximum no matter what else is wrong with the body, while no depth of withdrawal can contribute worse than -80. The asymmetry is visible in a single line of code and explained in none of the specs.
- A habit alone builds anhedonia to a ceiling of 70. QuipHandler silences the feeling lines, which include the character's own "opiatedsad" line about being numb, at 72. The two constants sit in different files, two points apart, and the effect is that an opioid habit taken to its limit stops just short of taking away the voice that would describe it. No comment, changelog entry or spec claims that gap was measured.
- Naltrexone is an oral pill that adds 15 to the same antagonist pool naloxone uses, alongside -15 tolerance and -25 sickness. Naloxone loads 0.5 per millilitre, so the diagnostic tablet's own capped recommendation of 25 ml is 12.5 - less antagonist than one swallowed tablet. The code comment beside the pill admits its magnitudes were reconstructed by inference from its siblings after the ported numbers were found to be off by factors of two and four. Whether the pill is meant to out-reverse the injectable antidote was never settled.
Needs and Survival
Doomed replaces the vanilla food bar with six interlocking survival tracks that all feed the same body. Hunger and thirst run on separate clocks, and behind them sits a body-weight ledger that decides how fast you heal, how much you can carry and whether your heart stays in rhythm. Temperature is a slow simulation with real thermal mass, so a place turns on you over minutes rather than instantly. Everything below is server-authoritative and per-player, and every per-second rate is multiplied by the pack's paceFactor.
Two clocks
Hunger and thirst run on separate clocks, deliberately out of phase so the two never come due at the same moment. Hunger falls a point every 33 simulated seconds, which empties a full 100 in about 55 minutes at the default pace. Thirst falls a point every 26 seconds and empties in roughly 43. Across one Minecraft day the body spends about 36 hunger and about 46 thirst. Water asks first, and asks more often.
Heat is the only thing that speeds thirst up. The divisor is 26 minus half the core temperature above 37 C, floored at 1, so a fever or a desert genuinely dries a body out faster while a cold biome leaves the rate where it was. Metabolism scales both clocks together: the run setting, the FUR trait at 1.25x and the DROWSY trait at 1.15x each multiply hunger, thirst and energy at once. RAVENOUS adds 1.45x to hunger alone. THIRSTY adds 1.45x to thirst alone.
Both bars run past zero, hunger to a floor of -50 and thirst to the same. Negative hunger is active starvation, and it strips 0.15 muscle health per second from every limb at once. Below thirst 30 a dull ache builds in your chest and eases again at 25. Below thirst 0 your blood thickens by 0.25 viscosity per second, which is the road to a clot. Dehydration also throttles plasma recovery to 30 percent and drags arterial pressure to 72 percent of normal at the floor.
Deep cold bills hunger separately. Below 32 C core the body burns 0.035 hunger per second, 2.1 a minute on top of the ordinary drain. Shivering is expensive.
Dry cereal. Light food, and it leaves you thirstier than you started.
tooltip.doomedmatu.cereal
Thirst is read straight into the circulation sim, where hydrationPressure scales the circulating-volume contribution to arterial pressure and hydrationBloodRecovery throttles how fast plasma rebuilds. Blood and Circulation
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Hunger drain divisor | 1 point per 33 sim-seconds (~55 min for a full bar) | ~/body/NeedsHandler.java:29 |
| Thirst drain divisor | 1 point per 26 sim-seconds (~43 min for a full bar) | ~/body/NeedsHandler.java:35 |
| Heat term on thirst | divisor = max(1, 26 - (bodyTemp - 37) x 0.5) | ~/body/NeedsHandler.java:76 |
| Hunger clamp | -50 to 175 | ~/capability/DoomedData.java:1724 |
| Thirst clamp | -50 to 250 | ~/capability/DoomedData.java:1743 |
| Starvation muscle loss | 0.15 muscle health/s on every limb at hunger <= 0 | ~/body/LimbHandler.java:32 |
| Deep-cold hunger burn | 0.035/s below 32 C core | ~/body/TemperatureHandler.java:130 |
| Dehydration pressure floor | 0.72x circulating-volume contribution at thirst -50 | ~/body/PhysiologyFactors.java:22 |
The weight ledger
Every food in the mod is priced against two constants. One point of vanilla nutrition is worth 1.75 hunger and 0.15 body weight, calibrated so the mod's reference burger and a vanilla cooked steak agree with each other. Divide one by the other and the exchange rate that matters falls out: a single point of hunger carries 0.0857 body weight.
Metabolism burns weight continuously, and the burn is derived from that same exchange rate rather than guessed beside it. Maintenance is exactly the weight that the food holding hunger at its station would have carried, which works out at about 9.35 weight per hour at the default pace. A deficit term sits on top of it: 1 minus hunger divided by 100, clamped between -0.5 and 1, with the final burn being maintenance multiplied by one plus that deficit times 1.5.
The consequences read straight off the formula. At hunger 100 the burn is exactly maintenance and weight holds. At hunger 0 it is 2.5 times maintenance, which is a body eating its own tissue. Above hunger 100 the deficit floors at -0.5, so a stuffed metabolism slows to a quarter of maintenance and stops there. Metabolism will never manufacture mass. Getting heavy is something done with food.
Weight itself is stored as an offset clamped between -80 and 100, with 0 as a normal frame. The moodle tiers run Lean below -15, Underweight below -30, Starving below -40 and Emaciated at or below -50. The other direction gives Well-Fed above 15, then the Overweight tiers, then Pyro Obese at 50 and above.
One trap worth naming: overeating banks only the weight the stomach accepted. A meal that overshoots the 175 ceiling spends the refused portion on sickness and returns no mass.
Body weight is a load-bearing number, not a cosmetic one on a panel. It gates four separate systems, and each of them stays quiet about it.
Repair. Tissue repair is the product of a food term, an energy term and a wasting term, and the wasting term slides from 1 down to 0.45 as the weight offset falls from -10 to -60. That multiplier covers soft tissue, stump healing, bone and blood rebuilding, so a wasted body mends at well under half speed. It also caps what brewed Regeneration can deliver, since the potion multiplies this rate rather than replacing it.
Immunity. Every point of weight offset past -10 costs 0.40 immunity. At -60 that is 20 immunity gone, and at the -80 floor it is 28, on the same scale infection rolls read.
Carrying capacity. The base ceiling is 11 kg. Wasting subtracts up to 6 kg of it, hunger under 40 costs another 1.5 kg, thirst under 40 costs 1 kg, and sickness shaves 0.025 kg per point. Sitting above hunger 100 gives 1.5 kg back. Strength and Resilience above level 10 add half a kilogram per level, taking the lower of the two.
Speed. Past 40 points of weight offset in either direction, every further point costs 0.006 of the movement cap. Hunger below 35 separately scales speed down toward a floor of 0.4 at empty, and thirst above 125 costs a flat 10 percent.
The heart. Once the absolute value of your weight offset passes 60, each second rolls to seed forced fibrillation, with odds ramping from zero at 60 to certain by about 110. Being far too thin is a cardiac event in its own right, not a milder version of being heavy.
Raw organs. They fill you, and they are revolting and toxic with it.
tooltip.doomedmatu.internalorgans
"They fill you" is the hunger half of the price. The weight half is never named on any tooltip in the language file.
Wasting reaches the organs through that same repair term: OrganHandler samples tissueRepair once a day and marks the whole body STARVED below 0.55, and a marked day gives no organ its dawn regeneration. Organs
Activated charcoal sits upstream of the whole ledger: while its window is open, Consumption.eat scales both the nutrition and the weight of everything you swallow before either one is banked. Drugs and Pharmacology
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Hunger per nutrition point | 1.75 | ~/body/Consumption.java:37 |
| Weight per nutrition point | 0.15 | ~/body/Consumption.java:38 |
| Weight carried by one hunger point | 0.0857 | ~/body/Consumption.java:46 |
| Starvation catabolism multiplier | 1.5 (so hunger 0 burns 2.5x maintenance) | ~/body/NeedsHandler.java:56 |
| Deficit clamp | -0.5 to 1 | ~/body/NeedsHandler.java:154 |
| Weight offset clamp | -80 to 100 | ~/capability/DoomedData.java:1904 |
| Underweight moodle tiers | -15 Lean / -30 Underweight / -40 Starving / -50 Emaciated | ~/client/hud/DoomedHudOverlay.java:2032 |
| Wasting repair multiplier | 1.0 at -10 offset down to 0.45 at -60 | ~/body/PhysiologyFactors.java:29 |
| Wasting immunity penalty | 0.40 immunity per point past -10 | ~/body/PhysiologyFactors.java:50 |
| Base carry capacity | 11 kg | ~/body/EncumbranceHandler.java:33 |
| Wasting capacity loss | up to -6 kg (clamped weightOffset+15 x 0.1) | ~/body/EncumbranceHandler.java:31 |
| Hunger speed curve | clamp(hunger / 35, 0.4, 1) | ~/body/MovementCapabilityHandler.java:332 |
| Overhydration speed penalty | x0.9 above thirst 125 | ~/body/MovementCapabilityHandler.java:274 |
| Extreme-weight fibrillation seed | |offset| > 60, chance/s = (|offset| - 60) / 50 | ~/body/CardiovascularHandler.java:313 |
The vanilla food bar is a puppet, and it lies about how hungry you are
Doomed mirrors its own hunger onto the vanilla shank bar every tick. Below hunger 100 the bar sits under 20 so vanilla will let you start eating, and at 100 or above it pins to 20. It is floored at 7 and capped at 19, which means every hunger value from 0 to 35 renders as an identical 3.5 shanks. The floor of 7 also keeps you above vanilla's sprint requirement and stops vanilla starvation from ever firing, because the mod owns every underfed penalty itself. If you turn Doomed hunger off in the config, this handover stops entirely and vanilla gets its bar back.
Food that never passes through an item is reconciled behind your back
Everything nutritional in Doomed hangs off the finish-using-item event, which only fires for food you use from your hand. A cake is a block, so right-clicking it calls the vanilla feed method directly and produces no item event at all. Because the mirror then overwrites the vanilla bar from the Doomed sim on the next tick, those points used to be actively erased rather than merely uncounted. The mod now watches the outcome instead of the mechanism: if the vanilla bar reads higher than the value it last wrote itself, something fed you, and the gain is converted at the standard 1.75 hunger and 0.15 weight per point. Any accompanying saturation is dropped, and micronutrients are credited from the datapack's default row.
The metabolic burn is derived from the food economy and floors above full
Maintenance weight burn is computed every tick as the hunger you just spent multiplied by 0.0857, which is the exact weight that the food holding your hunger station would have carried. Eat what you spend and you keep your body at any hunger level, not only while stuffed. The deficit term above hunger 100 clamps at -0.5, so a stuffed metabolism slows to a quarter of maintenance rather than banking mass. Your metabolism will never make you heavier. Only food does. Overeating also only deposits the weight the stomach actually accepted, so the portion refused past the 175 ceiling costs sickness and returns nothing.
FRAGMENT 12-C - EXHAUSTION CHIP, BOTTOM RUNG
SUMMARY: At energy 7 or below the tired moodle turns critical. Its flavour line reads "You've embraced the true Matu lifestyle." The advice line on the same chip reads "You are about to pass out from exhaustion. Sleep in a bed."
RESPONSE: Both strings are Java literals in the HUD overlay rather than keys in en_us.json. No moodle text in the mod passes through the lang files at all, so zh_cn carries none of it.
FINAL NOTE: The clinical half of that chip is the half a player actually needs at energy 7, and it is the half that will never leave English.
~/client/hud/DoomedHudOverlay.java:2270-2282; no matching key exists in assets/doomedmatu/lang/en_us.json
Excess
Both bars run well past full, and both punish the excess rather than the act. Hunger caps at 175. Anything above that ceiling converts to sickness at 1.2 times the overflow, and an overflow of more than 3 points carries a 20 percent chance of vomiting on the spot. Eating with dirtiness at or above 75 adds its own 10 percent chance of 8 sickness, whatever the meal was.
Thirst is the dangerous one. Above 100 the drain above that line is taxed by the overdrink multiplier, which defaults to 2, and above 175 the tax is 2.5. Only the portion of a step spent above 100 is taxed, so crossing the line is smooth rather than a cliff.
Past 175 you are in water intoxication. Your head pain climbs toward 50, your brain loses 0.05 health per second, and each second rolls a 1.66 percent chance of seeding forced fibrillation. This is the single most common accidental death on a fresh server, and the shape of it is always the same: a full canteen drunk on top of an already full stomach. A canteen sip is worth 9 thirst and a full six-sip canteen is 54, which is safe from any normal starting point and lethal on top of 150.
The practical rule is the one the in-game record gives. Drink when thirsty. The canteen is the safe part. Chugging refills nobody needed is the part that kills you.
Mood reads both bars continuously below about 40, and above 100 for thirst they stop mattering to it. Over-eating trickles a little mood back above hunger 101, which is the only reward excess ever pays.
Sweet milk. It hydrates and it cheers you, and too much of it will make you sick.
tooltip.doomedmatu.chocolatemilk
The warning is real, and it points at sickness. The thirst ceiling at 175 appears on no drink tooltip in the mod.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Hunger ceiling | 175 (overflow becomes sickness x1.2) | ~/body/Consumption.java:25 |
| Vomit roll | 20% when overflow > 3 | ~/body/Consumption.java:84 |
| Filthy-mouth sickness roll | 10% for +8 sickness at dirtiness >= 75 | ~/body/Consumption.java:88 |
| Overdrink tax | x2 above thirst 100, x2.5 above 175 | ~/body/NeedsHandler.java:82 |
| Water intoxication | thirst > 175: head pain toward 50, brain -0.05/s | ~/body/NeedsHandler.java:110 |
| Water-poisoning arrhythmia | 1.66% per second above thirst 175 | ~/body/CardiovascularHandler.java:316 |
| Canteen sip | +9 thirst, 6 sips per canteen | ~/item/CanteenItem.java:50 |
Deep misery hides your hunger and thirst readouts entirely
At mood -50 or below, both need bars are removed from the HUD and both hunger and thirst moodle chips stop appearing. Nothing about the needs themselves changes. You starve and dehydrate on exactly the same clock, you simply stop being told. This models the loss of will to bother with these things, and it means the point at which you most need to eat is the point at which the game stops reminding you. The client config option keepNeedsWhenApathetic set to true restores both.
Water
A canteen filled from open water comes out murky. Aim at a water source and use it to fill, use it again to drink, and use it on a lit heat source to boil it clean. Each murky sip adds between 6 and 14 sickness before the pack's dirty-water multiplier is applied. Clean water costs nothing.
Anything that counts as a lit fire will boil it. That covers the mod's brazier, a powered heater, any campfire, any furnace burning, and a magma block. It is what makes the temperature-tier heat blocks pull double duty as a water purifier.
Contamination survives a top-up, and this is the rule people trip over. Filling a canteen that still holds tainted water writes the whole canteen back to full and keeps the taint, so a single bad sip taken to open a slot buys nothing at a clean pond. Clean water poured into a murky canteen leaves the mixture murky. Boiling it and drinking it dry are the two ways out.
Water drawn inside Cyst territory is worse than murky. It reads as Cyst-tainted, and each swallowed mouthful adds 12 to a hidden spore burden. Three unboiled mouthfuls make the exposure clinically visible, and repeated drinking can seed the parasite outright. Swallowed water is already past anything a respirator can filter. Boiling is the entire counterplay.
Bottled and canteen liquids elsewhere in the mod share a common rate. Clean water is worth 90 thirst per litre, which is where the 9-point sip comes from. Beverages that are also meals, such as milk, cereal and soup, route their food through the same eating path, so they obey the overeating and dirtiness rules exactly as solid food does.
A refillable canteen. It starts empty, so find something to put in it.
tooltip.doomedmatu.canteen
The tooltip covers filling and stops there. Murky, boiling and Cyst-tainted are all absent from it.
The swallowed dose feeds CystSporeExposureHandler, the same hidden burden the Deep Maw's exhale fills, and the whole route goes inert unless cyst exposure, infection and contagion are all switched on. Threats
Contamination survives a top-up, so you cannot launder a canteen
Filling a partly full canteen writes the whole thing back to six sips while keeping any contamination already in it. Clean water added to a murky canteen does not purify the mixture, and Cyst-tainted water stays tainted through any number of refills at a clean pond. Boiling it on a lit fire and drinking it dry are the only two ways out. This exists specifically to close the exploit of swallowing one bad sip to open a slot and then refilling clean.
Ambient set point
The ambient set point starts from a five-band read of the biome. Hot is plus 8 C, warm plus 4, temperate 0, cold minus 4 and freezing minus 10. The band comes from the biome's base temperature, with one override: a biome cold enough to snow at that exact position is forced into the freezing band regardless of what its base number claims. The override is deliberate. A Deep Frozen Ocean has a base of 0.5, which reads as temperate, and used to report a perfectly comfortable body temperature in a place full of ice.
Four modifiers stack on top of the band, in a natural sky-lit dimension only. Thunder is minus 5 and plain rain is minus 3, with an extra minus 2 where the biome is cold enough for it to fall as snow, and weather reaches only what stands under open sky. Night is minus 3 and twilight minus 1. Altitude costs a further 1 C every 24 blocks above Y 100, down to a limit of minus 6.
Cover changes the arithmetic twice. Under a roof the night and altitude terms are cut to 30 percent of their value and a flat 1.5 C is added. Powder snow and snow are the exception: standing inside either flags the position as freezing rather than sheltered, because a cold block sits at head or feet.
Below Y 0 the set point gains 1 C every 24 blocks, up to plus 3, in any dimension. Descending genuinely escapes surface cold.
The finished offset from 37 is then scaled by temperatureSeverityMultiplier, so a pack sharpens or softens every contributor together and cannot accidentally invert one.
Roughly calibrated: an ordinary cold or snowy night settles a body near 34 C, a freezing biome exposed at night near 32 C, and it takes a freezing biome plus storm or altitude to drop under the 31 C frostbite line.
Core temperature is a slow simulation with real thermal mass rather than a readout of the block underfoot. Every rate-based thermal input is divided by 7, giving a time constant of about 44 seconds and full settling in a little over two minutes. A place can be felt turning on you while there is still time to act, and a coat put on before setting out is worth more than the same coat put on once the cold has landed.
Two pulls act at once. Homeostasis drags the body toward 37 C at 0.005 per tick before the mass divisor. The environment drags it toward its ambient set point at 0.003 per tick, divided by insulation. Insulation decides where the body ends up. Thermal mass only decides how long the journey takes.
Illness moves the target instead of fighting it. The worst single infected limb raises the regulated setpoint by up to 2.2 C at full infection, systemic sepsis adds up to 1.8 C, and the two together are capped at 3.5 C. That is why a fever actually reaches the fever bands instead of converging just above normal. An active NSAID lowers the setpoint by up to 2 C, which is what an antipyretic does. Once the body is already hotter than the setpoint, homeostasis pulls it back toward 37 exactly as normal, so a fever and a hot biome cannot stack additively.
Carrying a thermometer turns on a bottom-left gauge: the exact core temperature, plus a hollow marker for where the world is dragging it. The gap between the two markers is the whole of what the climate is doing to you, and it is the only way to confirm the shelter you just built did anything.
Herb crops sample the identical reading through LocalClimateService.suits, so a brazier lit for your own warmth also moves the climate band that a bittermoss patch or a herb bed is trying to grow in. Items, World and Trade
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Biome bands | hot +8 / warm +4 / temperate 0 / cold -4 / freezing -10 | ~/body/LocalClimateService.java:246 |
| Weather offsets | thunder -5, rain -3, snow extra -2 (open sky only) | ~/body/LocalClimateService.java:38 |
| Night and twilight | -3 and -1 | ~/body/LocalClimateService.java:41 |
| Altitude | -1 C per 24 blocks above Y 100, floor -6 | ~/body/LocalClimateService.java:43 |
| Depth | +1 C per 24 blocks below Y 0, cap +3 | ~/body/LocalClimateService.java:45 |
| Shelter | night and altitude x0.3, plus a flat +1.5 C | ~/body/LocalClimateService.java:47 |
| Thermal mass divisor | 7 (tau ~44 s, settled in ~2 min) | ~/body/TemperatureHandler.java:56 |
| Homeostatic pull | 0.005 per tick before the divisor | ~/body/TemperatureHandler.java:104 |
| Ambient exchange | 0.003 per tick, divided by insulation | ~/body/TemperatureHandler.java:117 |
| Fever setpoint rise | up to +2.2 C from infection, +1.8 C from sepsis, capped at +3.5 C | ~/body/TemperatureHandler.java:108 |
| Antipyretic setpoint drop | -2.0 C at NSAID level 50 | ~/body/TemperatureHandler.java:113 |
| Core temperature clamp | 0 to 60 C | ~/capability/DoomedData.java:2431 |
Late sepsis inverts your fever into cold shock while the moodle still says fever
Illness normally raises the temperature your body regulates toward. Past sepsis 78 the sign flips: the setpoint offset falls by up to 3.2 C, bottoming out near 35.8 C, deliberately clear of the frostbite band. The heat you have been fighting drains away and frost creeps in, and every signal you have learned to read tells you that you are winning. The chip on the HUD is still a fever chip because the infection contribution is still what named it.
A daily upkeep quietly scores four ordinary habits at dawn
Once per in-game dawn, the mod scores four anchors from the day that just ended: getting your dirtiness to 20 or below, eating something with a positive mood value rather than mere calories, sleeping a real night through in a bed, and either treating a wound or spending five minutes near another person. It is failure-tolerant. Two of four still moves you the right way, only a wholly empty day costs you, and a kept streak of three or more anchors makes each good day dig further out of the numbness, up to double after seven days. It grants no capability whatsoever. All it does is take anhedonia down.
Metal prosthetics are thermal bridges
When the ambient is below your body temperature, each Mechanical or Titanium prosthetic limb adds 0.00025 per tick of extra pull toward ambient, scaled by thermal mass like every other rate input. A heavily prosthetic body chills far faster in cold and is unaffected in heat, because the term only bites when the environment is dragging you down.
Insulation
Insulation is a divisor on the ambient pull rather than a source of heat. It starts at 1 and adds three things: the total isolation of equipped Doomed wearables, one hundredth of the body weight offset, and worn armour value times 0.02. A full vanilla armour kit is worth about plus 0.4. A full insulation set of fur coat, insulated liner and fur hood is about 2.4 isolation, which roughly halves the drift.
Body fat is insulation, and a lean body sheds heat faster for it. That is the same weight offset that governs everything else, so a wasted body has to work its clothing harder.
Wetness is the term that kills people who thought their gear was enough. While the ambient sits below body temperature, insulation is divided by one plus wetness times 0.02, floored at 0.4. Fully soaked cuts effective insulation to a third. Drenched on a frozen peak, equilibrium falls from about 31.6 C to about 26 C, which is deep hypothermia and real frostbite, while the same drenching on a temperate night only dips to about 34 C. Wet skin also sheds heat directly, at 0.001 C per second per point of wetness.
Wetness itself rises 15 per second while you are in water and 1.5 per second in rain under open sky, capping at 75 from rain alone. It dries at 0.35 per second above 75 and 0.2 per second below. Above 37.5 C core the body sweats, raising wetness to a cap of twenty times the degrees above 37.5.
Fur is a trade rather than a gift. Dry it is worth plus 0.45 insulation, the best in the mod. Soaked it is minus 0.28, crossing over near 62 wetness. It also dries at 0.55 speed, multiplies incoming heat gain by 1.35 in warm ambient, and raises the whole metabolism by 25 percent.
Each metal prosthetic is a thermal bridge, adding 0.00025 per tick of extra cold conduction while the ambient is pulling downward.
A woven rag (about 16 dry-offs).
Right-click to towel off and shed your wetness -
handy after a swim or a downpour. The cold/mood
debuff still clears the slow way; this just dries you.
tooltip.doomedmatu.dryingcloth
The wetness the rag sheds is the same number that divides insulation here, and the tooltip is honest that clearing it does not undo the cold you already took.
Wetness is a direct mood cost as well as a thermal one: MoodHandler weights it at 0.05 against total happiness, so being soaked shows on the mood chip well before the cold has reached your core. Psychology
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Insulation formula | 1 + wearable isolation + weightOffset x 0.01 + armour value x 0.02 | ~/body/TemperatureHandler.java:200 |
| Wet insulation collapse | insulation / (1 + wetness x 0.02), floored at 0.4 | ~/body/TemperatureHandler.java:225 |
| Full insulation set | ~2.4 isolation (fur coat 1.2, liner 0.7, fur hood 0.5) | ~/registry/DoomedWearables.java:139 |
| Wetness rise | +15/s submerged, +1.5/s in rain to a cap of 75 | ~/body/WetnessHandler.java:23 |
| Wetness dry | -0.35/s above 75, -0.2/s below | ~/body/WetnessHandler.java:28 |
| Sweat threshold and cap | above 37.5 C, wetness cap = (temp - 37.5) x 20 | ~/body/TemperatureHandler.java:126 |
| Fur insulation | +0.45 dry, -0.28 soaked, crossover near wetness 62 | ~/body/Trait.java:241 |
Radiant heat
Radiant sources are scanned in a 3-block cube every 10 ticks and applied straight to core temperature, bypassing insulation entirely. A fire warms through a coat. Each source is weighted by distance, falling to zero at the edge of the scan, and a solid collision block between body and source cuts it off.
Strengths are tiered. Lava and the strong tag are 8 C, the standard tag is 5, medium is 2.5 and weak is 1. The mod's brazier is 5. A powered heater is 7 and a powered cooler is minus 6. Cold sources run minus 3 for strong and minus 1.5 for standard. Any tagged block with a lit state has to be lit to radiate, so an unlit campfire or an idle furnace is worth nothing.
Sources stack, with diminishing returns. The strongest counts fully, the next at half, the next at a quarter, and so on for six entries. The series converges at exactly twice the strongest source however many get built. A well-built room genuinely warms, and a hoard of braziers still cannot cook you.
The taper is the important part. Ordinary warm sources fade out as the body approaches 41 C, so sitting by a campfire all night is comfort and stays comfort. Furnace-class sources taper toward 46 C instead, which is past the 42 C brain line, so standing beside open lava genuinely cooks you. Furnace class is decided by the dominant single source's own strength rather than by the stacked total, so a pile of braziers can never become a furnace.
Being under cover with stagnant air retains up to 25 percent more of whatever conditioning is present, and a loaded Ventilation unit in range removes that bonus.
An RF heater. Feed it from a cable; while powered it
glows and warms nearby players. A full buffer runs
~4.5 min. The charge rides the block when you mine it,
so carry it charged.
tooltip.doomedmatu.heater
Doomed registers no cable of its own. This is one of seven block tooltips in the language file that tell the player to feed a machine from one.
The heater and cooler are PoweredClimateBlock instances read off their lit state, and the Ventilation unit that cancels the enclosure retention bonus needs no power and no ticker at all. Machines, Power and Fluids
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Scan radius and interval | 3 blocks, every 10 ticks | ~/body/TemperatureHandler.java:162 |
| Source strengths | lava/strong 8, standard 5, medium 2.5, weak 1, brazier 5, powered heater 7, cooler -6 | ~/body/LocalClimateService.java:61 |
| Radiant rate | 0.12 C/s per unit of weighted strength, capped at 1.2 C/s | ~/body/TemperatureHandler.java:165 |
| Stacking | geometric, 0.5 falloff, 6 deep, converging at 2x the strongest | ~/body/TemperatureHandler.java:456 |
| Taper ceilings | 41 C ordinary, 46 C furnace class | ~/body/TemperatureHandler.java:302 |
| Enclosure retention | up to +25% when sheltered and unventilated | ~/body/LocalClimateService.java:56 |
Stacked heat sources converge at exactly twice the strongest one
The radiant scan keeps the six largest contributions and sums them geometrically: the strongest counts fully, the next at half, the next at a quarter. The series converges to twice the strongest source no matter how many blocks you place. A well-built room genuinely warms and a wall of braziers still cannot cook you. Separately, whether a warm source is furnace class, and therefore allowed to taper you toward 46 C instead of 41 C, is decided by the dominant single source's own strength rather than by the stacked total. Machines you build regulate; the world's fire kills.
The bands
The moodle tiers are the readable surface. Cold begins below 35.5 C as Chilly, then Cold below 34, Freezing below 32.5 and Hypothermia below 28. Heat begins above 38 C as Warm, then Hot above 39, Overheating above 40.25 and Heatstroke above 41.5. Where infection or sepsis is contributing, those same four chips are renamed Fever through Critical Fever, which says the temperature is a symptom rather than the weather.
The real thresholds sit elsewhere. Above 41 C blood volume falls 0.225 litres per minute. Above 42 C your brain loses 0.5 health per second. Below 32 C the body burns extra hunger and shivers a little heat back. Frostbite accrues below 31 C and thaws above 35.5 C.
Consciousness is capped by a temperature curve, flat at 100 across 33 to 40.7 C, falling to 79 at 30 C and 60 at 20 C, and on the hot side to 50 at 45 C and 27.5 at 52.2 C. Movement has its own curve, flat between 32 and 39 C and losing 4 percent of the cap per degree outside that band, down to half speed.
Cold thins clotting. The penalty starts below 35 C and bottoms at 60 percent of normal clot rate by 30 C. There is a matching reward. Hold the core between 36.5 and 37.5 C for a sustained two minutes and it banks up to 8 percent better clotting. That comfort clock fills at one tick per tick and drains at three, so warmth is banked rather than owned, and it pays for a camp rather than a passing fire.
Mood loses 0.03 per second whenever the core is under 33.5 C or over 40 C.
Right-click to pull about 4 C of core heat out of yourself. It works in any climate, and it stops at 34.5 C, which is already cold enough to be its own problem.
tooltip.doomedmatu.cold_pack
The 34.5 C stop lands inside the Chilly band listed above, which is what the tooltip means by its own problem.
Both clotting terms live in BleedHandler, so a cold body and a warm camp are changes to how fast a wound seals rather than to temperature itself. Blood and Circulation
Warmth is banked over two minutes and spent three times as fast
Holding your core between 36.5 and 37.5 C fills a comfort clock at one tick per tick, reaching full at 2400 ticks, which is two minutes. Leaving the band drains it at three ticks per tick. At full comfort your clotting improves by up to 8 percent. This is the only positive temperature effect in the mod, and it deliberately requires a camp rather than a passing fire. Note the band is narrower than the cold penalty's onset at 35 C, so it is possible to be earning nothing and losing nothing at the same time.
Frostbite
Frostbite accrues below 31 C core only, which is genuine deep hypothermia rather than ordinary cold. Head, neck, eyes, chest and abdomen are exempt. It works on a distance-from-core gradient: hands and feet freeze at full rate, forearms and shins at 0.6, upper arms and thighs at 0.35.
The base rate is 1.6 per second at the onset edge, scaled by how far below 31 C the core has fallen, reaching full depth at 25 C. The WARM_BLOODED trait multiplies it by 0.6 and POOR_CIRCULATION by 1.6.
Above 35.5 C it thaws at 2.2 per second, scaled by warmth and inverted against exposure, so proximal limbs thaw first and the cold recedes outward with the tips last. A heat pack floods 5 C into the core, capped at 38, and strips between 12 and 40 frostbite from each affected limb, weighted the same way.
At 85 frostbite the tissue starts dying. Skin loses 1.2 per second and muscle 0.8 per second, and deep frostbite blocks natural healing entirely while it stays above that line. At 99 frostbite with skin and muscle both at or below 1, the limb is lost. It comes off through the shared dismemberment path, so everything distal to it comes off too, and the stump is dry rather than gushing, because frozen black tissue bleeds nothing like a saw cut. There is no message. The doll, the moodles and the stump are the notification.
Necrosed tissue that never reached the loss point heals normally once thawed.
Right-click to warm your core and thaw frostbite.
The warmth spreads from the body outward, so the
fingers and toes are the last to come back. Carry these
on long cold treks.
tooltip.doomedmatu.heatpack
The tooltip states the order the thaw runs in and matches the code. The 5 C flood, the 38 cap and the 12 to 40 stripped are not on it.
The loss runs through DismemberService.necroticLoss, the same path a saw or a crushing injury uses, so everything distal comes off with it and the stump enters the ordinary treatment model from there. Injury and Treatment
FRAGMENT 11-A - THE WARM PART, PAGE FOUR
SUMMARY: A four-page field journal entry that writes itself as your extremities freeze. Page one opens "The cold has changed." Page four is written only after a segment comes away, and records "The stump hardly bled."
RESPONSE: Page four is gated on page three, and page three only unlocks when a limb thaws from above 60 frostbite back under it with your core over 35.5 C. Page three is in turn gated on page two, which needs frostbite to have crossed 85. A player who freezes straight through to the loss without ever warming up satisfies none of that chain and gets nothing.
FINAL NOTE: The entry is the only sustained account of frostbite the game will ever give you. Freezing badly enough to lose the finger, and never once getting warm, costs you the record of it as well as the finger.
res/data/doomedmatu/doomed_journal_entries/the_warm_part.json, with the observation gates at body/FrostbiteHandler.java:69-101
Stamina
Stamina runs 0 to 100 and is spent by moving. Sprinting costs 1.2 per second and walking costs 0.1. Both are multiplied by one plus over-encumbrance, and by an armour exertion penalty of 0.017 per armour point up to a cap of plus 40 percent. That penalty applies to movement drain alone, so resting in armour recovers at the ordinary rate. Moving also warms the body by 0.04 C per second, scaled by thermal mass.
At rest recovery is 1.4 per second, multiplied by several factors at once. Energy throttles it directly with a floor of 0.2, so a drained body recovers poorly. Encumbrance multiplies it by one minus 0.7 times overload. Resilience gives a base 1.2 and a further 0.02 per level above 10, capped at 10 levels. Caffeine multiplies regen by 1.5 and cuts movement drain to 0.45.
Recovery is gated on breathing. Respiration has to be at least 2.5 breaths per minute, and underwater without a real air source recovery is zero until stamina is already under 25. Kneeling to hold pressure on a wound counts as work rather than rest: it charges the sprint rate.
The ceiling is not 100 for everyone. It is the higher of 70 and current SpO2, minus 0.30 for every point of lung tar, floored at 25. A lifetime of cigarettes shaves up to 30 off the top permanently.
Falling below 1 stamina slams motor shock to 60, which collapses you. Climbing back above 55 after bottoming out rolls, gated entirely on good mood, for a 20-second Runner's High worth 1.5 times regen and 45 adrenaline. At neutral mood the roll can never come up.
Sitting on any seat entity restores 0.4 stamina per second.
A hard jolt of energy, stamina and caffeine all at once. You will feel sick for it.
tooltip.doomedmatu.energydrink
Caffeine is the x1.5 regen and the x0.45 movement drain described here. Sickness is the price the tooltip names.
Runner's High pins adrenaline at 45, five points over the level MoodHandler treats as living on fight-or-flight, so the reward for being in good spirits quietly drains mood for the twenty seconds it runs. Psychology
The ceiling is an organ readout wearing a stamina label, taking the higher of 70 and your current SpO2 and then subtracting the tar coating your lungs. Organs
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Sprint and walk drain | 1.2/s and 0.1/s | ~/body/StaminaHandler.java:33 |
| Rest regen | 1.4/s base | ~/body/StaminaHandler.java:37 |
| Armour exertion penalty | 0.017 per armour point, capped at +40% | ~/body/ArmorReduction.java:240 |
| Caffeine | regen x1.5, movement drain x0.45 | ~/body/StaminaHandler.java:50 |
| Stamina ceiling | max(70, SpO2) - lungTar x 0.30, floored at 25 | ~/body/StaminaHandler.java:155 |
| Exhaustion collapse | stamina < 1 sets shock to 60 | ~/body/StaminaHandler.java:76 |
| Runner's High | 20 s, x1.5 regen, 45 adrenaline, armed below 1 and fired above 55 | ~/body/StaminaHandler.java:40 |
| Exertion moodle tiers | 70 Tiring / 50 Winded / 35 Exhausted / 15 Spent | ~/client/hud/DoomedHudOverlay.java:2241 |
Your stamina ceiling is not 100, and cigarettes lower it for good
Stamina is clamped each tick to the higher of 70 and your current SpO2, minus 0.30 for every point of lung tar, with a hard floor of 25. Being hypoxic caps recovery below full, and a lifetime of smoking shaves up to 30 points off the top permanently. The bar simply stops filling short of the end.
Rest
Energy runs 0 to 100 and drains at 0.049 per second while awake. That base is multiplied by an exertion factor of two minus one hundredth of stamina, multiplied again by a mood factor that reaches 2 at mood -100 and shaves up to 20 percent off for genuine happiness. The product of the two is capped at 2.5, so hard, unhappy play asks for a rest roughly every 14 minutes rather than every 8. Sickness adds one plus 0.02 per sickness point. Caffeine cuts the whole burn to 0.7. The DROWSY trait multiplies it by 1.4.
There are three rests, and where the body is lying tells them apart. A vanilla bed at night skips to morning, wakes you at energy 100 with 180 seconds of caffeination, clears any lingering grogginess and lifts mood by 3. A bed in the daytime skips no time, so the rest runs in real time at 14 times base regen and ends at energy 99 with no instant bonus. The nap-anywhere button lies the body down where it stands, and the block directly below decides everything: a bed or any wool is a comfortable nap at 12.75 times regen, waking at energy 90 and leaving only 20 seconds of grogginess, while bare ground is 1.7 times regen, gives up at energy 75, and leaves 90 seconds of it.
A nap also ends early on pain above 40, blood below 2 litres, sickness above 55, cardiac arrest, a hit taken, or a sprint.
Nightmares strike naps only, never a bed. Below mood -40 each lie-down rolls once, the chance ramping from 0 at -40 to 45 percent at -100 and doubled by the NIGHTMARES trait. A nightmare caps energy at 45, leaves 120 seconds of grogginess and costs 4 mood.
Energy also caps consciousness at energy times 4.2, floored at 31, and grogginess caps it at 70 for as long as it lasts.
Hot and bitter. It quenches thirst, and the caffeine holds fatigue off a while.
tooltip.doomedmatu.coffee
Holding fatigue off is the burn cut to 0.7. The tooltip gives the duration as a while and the code gives a multiplier.
Sleep debt is also an immune penalty the sleep system never mentions: every point of energy below 60 costs 0.45 immunity through PhysiologyFactors, so running yourself down to zero hands the contagion layer 27 points before anything else is counted. Disease and Infection
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Awake energy drain | 0.049/s base | ~/body/EnergyHandler.java:37 |
| Exertion drain cap | 2.5 combined stamina x mood | ~/body/EnergyHandler.java:41 |
| Regen multipliers | bed 14x, comfortable nap 12.75x, floor nap 1.7x, on a 0.4/s base | ~/body/EnergyHandler.java:44 |
| Nap wake energy | 90 on a bed or wool, 75 on the floor | ~/body/EnergyHandler.java:57 |
| Grogginess left | 20 s comfortable, 90 s floor, 120 s nightmare | ~/body/EnergyHandler.java:71 |
| Nap wake triggers | pain > 40, blood < 2.0 L, sickness > 55 | ~/body/EnergyHandler.java:61 |
| Nightmare chance | 0 at mood -40 up to 45% at -100, x2.5 with the NIGHTMARES trait | ~/body/EnergyHandler.java:96 |
| Tired moodle tiers | energy 35 Sleepy / 25 Tired / 15 Drained / 7 Exhausted | ~/client/hud/DoomedHudOverlay.java:2270 |
| Energy consciousness cap | energy x 4.2, floored at 31; grogginess caps at 70 | ~/body/ConsciousnessHandler.java:45 |
Where you lie down is read from the block directly beneath you
The nap-anywhere button checks the block under your feet against the beds tag and the wool tag. Anything in either is a comfortable nap at 12.75 times regen that wakes you at energy 90 and leaves 20 seconds of grogginess. Anything else at all is a floor nap at 1.7 times regen that gives up at 75 and leaves 90 seconds. Throwing down a single wool block before you lie down is worth roughly seven times the recovery rate. Nightmares can also only strike a nap, never a bed.
FRAGMENT 13-B - ADVANCEMENT doomedmatu:nightmare
SUMMARY: Title: "Woah! It's a reference to... You!!" Description: "Get thrown out of bed by your own head." Icon is a red bed. It announces to chat.
RESPONSE: The grant site refuses beds. The roll happens on napStart only, and the comment beside it states that the bed is the reliable refuge that always rests you. Every player holding this advancement earned it lying on bare ground or on a wool block.
FINAL NOTE: The description was written for behaviour the code either lost or never had. Which of the two, the record does not say.
res/data/doomedmatu/advancements/nightmare.json against body/EnergyHandler.java:116-130
Grime
Grime runs 0 to 100 and accrues from four sources. The passive trickle is one point every 1500 seconds, which is glacial: about 20 hours to matter on its own. Working underground with no Ventilation unit in range adds 0.008 per second, reaching the immunity threshold in about an hour and three quarters of continuous enclosed time. Sweating adds up to 0.045 per second, but only above 37.8 C core and only while actually moving. Breaking soil barehanded adds 0.38 per block, or 0.22 for sand and gravel.
Standing in water strips 30 per second, down to a floor of 10. A Wash Station scrubs to zero anywhere, which is what makes it worth building underground, and leaves 25 wetness behind.
What grime does is the part the bar keeps to itself. From dirtiness 25 upward it transfers into any exposed open wound on a ramp that reaches full strength at 100, raising the recurring infection roll. Disinfecting a limb cuts that transfer to 10 percent. Separately, every point above 50 comes straight off immunity, which raises the risk of everything else in the contagion layer at the same time. At 75 and above, eating carries a 10 percent chance of adding 8 sickness.
Marrow Fever is the one that specifically requires both. It needs real grime and a real open wound at once plus lowered immunity, and either one on its own leaves it unseeded.
The moodles are Grimy above 50 and Filthy above 80, and both quote the live number so it can be read precisely.
Getting dirtiness to 20 or below also scores the WASH anchor of the daily upkeep, described below.
Right-click to scrub off all your grime.
Works anywhere - no natural water needed, handy underground.
tooltip.doomedmatu.wash_station
Scrubs to zero and works anywhere are both accurate. The 25 wetness it leaves on you is not mentioned.
Both halves of that land squarely in the contagion layer: InfectionHandler subtracts one point of immunity for every point of grime over 50, and reads the same dirtiness figure again when it rolls wound inoculation. Disease and Infection
Notes
- The starvation catabolism multiplier is 1.5, and the comment that sets it says outright that the eating curves behind that choice are a judgement call and want a playtest. Nothing in reference/ or CHANGELOG.md records the playtest happening, so the number that decides how fast an underfed body eats itself has only ever been checked against a simulation.
- The reference burger is priced at exactly 0.0857 weight per hunger point, the same rate the metabolic burn is derived from. Eleven of the mod's own authored foods sit below that line and can hold your hunger without ever returning mass at any hunger level, including foliagemeal at 18 hunger for zero weight. reference/REPORT_BOARD_VERIFIED_20260810.md flagged the spread on 10 August and the values in DoomedConsumables are unchanged; whether it is deliberate food design or an unrescaled leftover was never written down.
- The top heat tier is 8 C, and the doomedmatu:heat_sources_strong tag ships with an empty values list, so lava fluid is the only thing in the game that reaches it. Furnace class is gated on that same 8, which leaves the vanilla furnace, blast furnace and smoker two tiers below the class named after them. Nothing in the source says whether the empty tag is a datapack extension point or an unfinished one.
- The extra grime you pick up in enclosed, unventilated air is 0.008 a second, and the constant's own comment calls its balance unverified in real play. The Ventilation unit that cancels it takes no power, has no ticker and never wears out, so the pressure ends permanently the first time one is placed.
- Runner's High can only roll in the tick your stamina climbs back past 55 after bottoming under 1, and bottoming under 1 is what sets shock to 60 and puts you on the floor. Mood above +10 is the sole source of chance, peaking at 35 percent at mood 100. Whether a player has ever been in genuinely good spirits at the moment they got back up from an exhaustion collapse is not something the source can report.
- reference/TEMPERATURE_DESIGN.md asked for a radiant scan of roughly 4 to 5 blocks throttled to about four times a second; the shipped scan is 3 blocks every 10 ticks. The same document leaves how punishing an exposed freezing night should be as an open question for Matt, and no later document in reference/ answers it.
Psychology
Your character's mind is simulated as two separate numbers that most players assume are one. Mood decides how much of what you try actually happens, how fast you walk, how quickly you tire, and whether your body starts hurting itself while you stand still. Underneath it sits anhedonia, a number the game never shows you, which decides whether the pit closes on its own or becomes somewhere you live. Almost everything in this domain is invisible: there is no numbness bar, no self-harm warning, and no on-screen tell that the last-stand roll is reading a mood you had nine minutes ago.
Happiness and mood
Mood is never stored. It is a display of a calculation run fresh, and underneath it sits a slow persistent baseline called happiness.
Happiness moves in fractions per second. While the character is awake it erodes from sickness above 20, from hunger, from thirst, from average pain above 50, from an open bleed, and from a core temperature outside 33.5 to 40 degrees. Standing alone under the night sky, or being anywhere in the Nether without company, costs 0.03 per second. Living above 40 adrenaline costs another 0.02 per second, so a long fight wears a body down while nothing lands on it. Overeating past hunger 101 pays a trickle back. Sleep suspends the whole set of drains, which is why a bad night in a bed is still respite.
Happiness also springs back toward neutral on its own at 0.01 per second, faster when it is negative. Another player, a villager, or one of the character's own tamed animals within 14 blocks multiplies that spring by 1.9. Company is the single largest passive mood mechanic in the mod and the game says so nowhere.
The derived total is rebuilt from scratch every tick. It takes the baseline and subtracts pain at 0.1 a point, sickness at 0.1, radiation at 0.1, hearing loss at 0.2, wetness at 0.05, trauma at 0.525, and 0.2 for every point of blood missing off a 5 litre scale. Hunger and thirst come off on a ramp worth up to 18 each. Opiates add euphoria, or in withdrawal subtract 1.66 times as hard. The whole result is then multiplied by one minus horrified level times 0.005, so a Deep Maw that has recognised you halves your mood outright.
That multiplication is why patching every wound sometimes changes nothing. The baseline is fine. A term no dressing reaches is eating the total.
A woven rag (about 16 dry-offs).
Right-click to towel off and shed your wetness -
handy after a swim or a downpour. The cold/mood
debuff still clears the slow way; this just dries you.
tooltip.doomedmatu.dryingcloth
Two separate terms are in play. Wetness comes off the derived total at 0.05 a point and the total is rebuilt every tick; a core temperature outside 33.5 to 40 degrees erodes the baseline instead.
The horrified level that scales the whole derived mood is written by ThreatEncounterHandler and by nothing else, so the term you cannot bandage is the Deep Maw's recognition of you. Threats
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Automatic drift back toward neutral | 0.01 happiness per second | body/MoodHandler.java:44 |
| Drift multiplier with company nearby | 1.9x, within 14 blocks | body/MoodHandler.java:47-48 |
| Alone at night or in the Nether | -0.03 happiness per second | body/MoodHandler.java:49 |
| Adrenaline above 40 | -0.02 happiness per second | body/MoodHandler.java:50-51 |
| Trauma weight on derived mood | 0.525 per point | body/MoodHandler.java:59 |
| Horrified scaling of the whole mood | x (1 - level x 0.005), so 0.5x at Horrified 100 | body/MoodHandler.java:63 |
Being near almost anything alive nearly doubles your mood recovery
Another player, a villager, or one of your own tamed animals within 14 blocks multiplies the automatic drift back toward neutral by 1.9. The scan runs once a second and is cached. The same companion flag also accumulates toward the day's Tend anchor at 300 seconds of company, which is worth up to 6 anhedonia at dawn on a full four-anchor day with a streak.
Cost and payback
Mood is wired into four systems, and until recently none of them said so.
The refusal curve is the big one. At mood 0 nothing happens. From 0 to -30 the chance that an interaction simply fails ramps to 15 percent. From -30 to -100 it ramps to 90 percent, and at the floor it takes roughly ten attempts to get one click through. It applies to left-clicks inside Doomed screens and to picking items up off the floor. Keys and escape stay live, so the curve can always be walked out of, and the pickup event re-fires while a player stands on the item, so a refusal costs a fumble rather than the item.
Movement force is scaled by mood clamped into 0.2 to 1.2 and then capped at 1, so the term only ever slows. It starts biting below mood -20 and bottoms out at a fifth of walking speed.
Energy drain is multiplied by one minus mood over 100, which doubles the burn at the floor.
At mood -50 or below, apathy hides your own hunger and thirst moodles and dims the hotbar gauges. The needs themselves carry on exactly as before. You starve on the same clock, and the body panel still reads true. You simply stop being reminded. A client option restores the chips.
Good mood pays back above +10. Energy drain drops to 0.8 times at mood 100. Bottoming stamina and climbing back above 55 rolls for Runner's High at up to 35 percent, which grants 20 seconds of 45 adrenaline and 1.5 times stamina regeneration. MoodBonus also defines a positive-effect duration bonus that nothing in the code calls, so do not count on it.
GrowthSpurtScheduler drops mood through addHappiness with a negative delta every tick of a spurt, and negative deltas skip the anhedonia gate entirely, so a growth spurt lands at full weight on a body nothing else can reach. Transformation
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Action refusal chance at mood -30 / -70 / -100 | 15% / about 58% / 90% | body/MoodRefusal.java:20-28 |
| Movement cap from mood | min(1, clamp(mood x 0.01 + 1.2, 0.2, 1.2)) | body/MovementCapabilityHandler.java:280 |
| Energy burn multiplier from misery | up to 2x at mood -100 | body/EnergyHandler.java:176 |
| Apathy threshold (hunger and thirst chips hidden) | mood at or below -50 | client/hud/DoomedHudOverlay.java:718 |
| Runner's High chance | up to 35% above mood +10 | body/MoodBonus.java:47 |
| Runner's High payout | 20 seconds, 45 adrenaline, 1.5x stamina regen | body/StaminaHandler.java:40-42 |
At mood -50 the game stops telling you that you are hungry
Apathy removes your own hunger and thirst moodles and dims the hotbar gauges once derived mood is at or below -50. Nothing about the needs changes - they drain on exactly the same clock and the body panel still reads true. You simply stop being reminded, at precisely the point where you are least likely to check manually. There is a client option, keepNeedsWhenApathetic, that restores the chips.
Anhedonia
Before anhedonia existed, mood was derived and self-correcting: patch the wounds, eat, and the pit closed by itself in minutes. Anhedonia is what makes a depression last. It is the most important number in this domain and the game shows it nowhere.
It builds only while derived mood sits at or below -55, and it builds faster the deeper that mood goes. At the floor of -100 it gains 0.125 per second, so roughly thirteen minutes of rock bottom takes a character from nothing to fully numb. It fades once you are genuinely clear of the pit, above mood -40, and then at 0.03 per second - slower than it built. Clearing a full 100 takes the better part of an hour of being all right.
It does exactly one thing, and it was built as the deliberate opposite of a debuff. It multiplies the things that would lift you and leaves the things that hurt you at full strength. Every positive happiness change is scaled down to as little as 0.15 of itself at full numbness, applied inside the setter so every call site inherits it. And the automatic spring back toward neutral slows to 0.30 of normal, which is the load-bearing half. The pit stops closing itself.
Past anhedonia 55 your own hands stop trying. Treating yourself is multiplied down to a floor of 0.55, a reluctance rather than a block. It applies only when you are the one doing the work. Another player's hands are still their own, so a friend can fix what you cannot make yourself care enough to fix properly.
Past anhedonia 80 you are unreachable, and someone sitting with you stops being able to land any of it.
Anhedonia survives death. It is halved and capped at 40 on respawn, so each death diminishes it. Dying is not a cure. The Fragile Mind trait makes it deepen 45 percent faster.
There are two off switches and they do very different things.
/doom off is the whole-condition escape hatch and it is a deliberate two-step for the player themselves. Typing /doom off alone explains that being Doomed is meant to be permanent and tells you the real command. /doom off confirm renounces it: the body is made whole, every vital and wound resets, the body simulation switches off, and you stand back up as a clean vanilla player. An operator can lift it from others with /doom off <players> at permission level 2. On someone who is not currently Doomed it is a no-op, so a Corebound graduate keeps their flag through it.
The server option enableDespair is narrower. With it false, anhedonia is forced to zero and kept there, any lapse pose is cleared, the vigil is dropped, and the spiral's own state - the episode tier, the lockout, the stillness timer, the antidepressant course - all reset to neutral. Anhedonia is zeroed specifically because it now survives death, and with despair off it would otherwise be the one state in the mod that literally could not be removed by any means. SSRI tolerance is deliberately kept, because wiping an overuse penalty with a config toggle would be the exploit.
Happiness and mood keep running with despair off. They belong to the whole simulation rather than to this system, so the refusal curve, the speed cap and the energy burn all still apply.
The purple depression veil and its tendril overlay are gated on the same flag, and so is the tablet's psychological section, which reports DISABLED. The framebuffer shader's despair channels - the gentle colour drain that onsets the moment mood goes negative, and the harsher wobble and jaundiced grade above mood -25 - are computed from mood alone and run regardless of the flag.
For testing, /doomdespair skin, /doomdespair eye and /doomdespair violent force an episode at permission level 2, bypassing both the trigger and the lockout.
They don't look up.
message.doomedmatu.vigil.unreachable
The line a vigil produces once the patient is past anhedonia 80.
The reluctance is applied in one place: TreatmentService multiplies the normalised treatment quality by Anhedonia.selfCareMult when the healer and the patient are the same player, so every wound-closing action in that domain reads this number. Injury and Treatment
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Mood at which numbness starts building | -55 or below | body/Anhedonia.java:35 |
| Gain at the floor of the mood scale | 0.125 per second, about 13 minutes to full | body/Anhedonia.java:39 |
| Fade rate once genuinely clear (above mood -40) | 0.03 per second | body/Anhedonia.java:41 |
| Worth of a positive mood gain at full numbness | 0.15 of itself | body/Anhedonia.java:44 |
| Drift multiplier at full numbness | 0.30 | body/Anhedonia.java:46 |
| Self-treatment reluctance | starts at 55, floors at 0.55 quality by 100 | body/Anhedonia.java:157-161 |
| Unreachable threshold | 80 | body/Anhedonia.java:159 |
| Carried through death | min(40, anhedonia x 0.5) | capability/DoomedData.java:3952 |
| Self-renunciation | /doom off confirm (two-step, no permission needed) | command/DoomCommand.java:58-62 |
| Operator lift | /doom off <players>, permission level 2 | command/DoomCommand.java:60-62 |
| Config key | enableDespair, default true | config/DoomedConfig.java:2109-2113 |
| What despair-off resets | anhedonia, lapse, vigil, episode tier, lockout, stillness timer, SSRI course | body/Quiesce.java:169-202 |
| What it deliberately keeps | SSRI tolerance and base happiness | body/Quiesce.java:181-185 |
| Early despair film onset in the shader | the moment mood goes negative; harsher wobble from mood -25 | client/VisionPostProcessor.java:245-246 |
Anhedonia has no readout anywhere in the game
The single most consequential psychological number - the one that decides whether the pit closes on its own, whether your own hands bother to treat you properly, and whether another player can reach you at all - has no moodle, no bar, no tablet row and no lang string. It is exposed exactly twice: the WITNESS clinical record notes a crossing labelled "Nothing got through" once you pass 80, and the accent colour of your entire interface silently desaturates toward grey of the same luminance from anhedonia 30 upward, reaching 85 percent drained at 100. Legibility and contrast are unchanged. Only the colour goes.
Anhedonia survives death; almost nothing else psychological does
On respawn, anhedonia is halved and capped at 40 rather than cleared. Each death halves it again, so it diminishes hard and never spirals, but dying is not a cure for numbness. By contrast happiness is clamped to at most -10 with a floor of -35, trauma gains 10 up to a soft cap of 60, and the antidepressant course, its tolerance, the routine flags, the streak and every vigil counter are all wiped clean.
Numbness makes your own hands worse at treating you, but only your own
Past anhedonia 55, every self-administered treatment's quality is multiplied down on a linear ramp to a floor of 0.55 at anhedonia 100. It is applied only when the healer and the patient are the same player. Someone else working on you is unaffected. Past anhedonia 80 you become unreachable, and a vigil held on you produces no mood, no anhedonia relief and no visible lift of your slump - while still charging the comforter their 0.10 happiness per second, because they did sit down and it did cost them.
Antidepressants and opiates
The antidepressant is a course, not a pill. One dose loads 20 into a depot and starts a 14400 tick onset clock - twelve real minutes during which it does absolutely nothing. Swallowing more inside the onset window loads more depot and leaves the wait exactly as long.
Once it takes hold the effective dose is depot minus tolerance. Tolerance rises at 0.05 per second while dosed and falls at 0.02 per second while clean, so chain-eating the bottle stops working inside one session. The depot itself decays at 0.012 per second.
What it hands over is small: a raw happiness lift of up to 0.022 per second, applied raw so the numbness it is treating cannot blunt it to nothing. The real payload is that an active course halves the rate at which anhedonia builds. It does not climb for you. It stops the ground giving way while you climb.
Opiates run the other way, and nobody tells you. While smoothed opiate reception is above 25, anhedonia gains an extra 0.012 per second, up to a ceiling of 70. A habit alone can carry a character to numb-but-not-hollow and no further. Analgesia is untouched, which is exactly why it stays worth taking, and that is the trap: the fog you are dosing for is the thing making feeling harder.
Nicotine withdrawal is a flat subtraction from derived mood by dependence stage: 4, 9, 16 and 25 points. It is present only while nicotine is absent and vanishes when you smoke, so it pulls on mood reversibly rather than draining the baseline.
Mindwipe refuses a sound mind. It goes down only if happiness is at or below -50, or trauma is at least 5, or stroke is at least 5. When it does, it zeroes trauma, stroke, mood and every limb's pain, wipes learned Intelligence, and drops the character unconscious.
A dose lifts your mood away from despair.
tooltip.doomedmatu.antidepressant
Twelve real minutes pass before the dose does anything at all, and the lift itself tops out at 0.022 happiness per second. Halving the rate anhedonia builds is the effect that matters, and the tooltip leaves it out.
The spiral reads getActualOpiateReception, the same smoothed reception the opiate system computes for analgesia and withdrawal, so tolerance chasing over there quietly sets the anhedonia floor over here. Drugs and Pharmacology
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Antidepressant onset | 14400 ticks (12 minutes) of nothing | item/AntidepressantItem.java:29 |
| Depot per dose | 20 | item/AntidepressantItem.java:27 |
| Tolerance rise vs fall | 0.05/s dosed, 0.02/s clean | body/Anhedonia.java:53-54 |
| What an active course does to anhedonia gain | halves it (0.5x) | body/Anhedonia.java:51 |
| Opiate spiral | +0.012 anhedonia/s above reception 25, ceiling 70 | body/Anhedonia.java:95-99 |
| Nicotine withdrawal mood penalty by stage | 4 / 9 / 16 / 25 | capability/DoomedData.java:2016-2023 |
Opiates deepen the numbness while you are on them
While smoothed opiate reception is above 25, anhedonia gains an extra 0.012 per second, stopping at a ceiling of 70. A habit alone can never bottom you out - the rest you have to do yourself. Pain relief is entirely unaffected, which is why it stays worth taking.
The climb out
Three things bring anhedonia down, and one of them takes another person.
The routine scores four daily anchors once per dawn, tracked off the character's own stored day number so joining mid-day or standing in a dimension with no day cycle still behaves. Wash means getting dirtiness to 20 or below at some point today. Eat means eating something that was worth eating. Rest means a real night in a bed. Tend means treating a wound, yours or someone else's, or spending 300 seconds near another person. The dawn payout by score is +4, 0, -1, -3, -6 anhedonia for zero through four anchors, plus a small raw mood gain of +2 or +4 at three or four. Only a wholly empty day charges you.
A kept streak doubles the relief: at three or more anchors the streak grows, and at seven days each good day digs twice as far out. The deficit is never streak-scaled, so a long streak cannot be spent as a licence to stop, and a wholly empty day resets it.
The voluntary sit is the fifth anchor. Crouch, still, for 160 ticks - eight seconds - and the character sits down deliberately. While held it bleeds anhedonia at 0.06 per second, hard-capped at 9 per day, so about two and a half minutes of sitting is the whole day's worth.
The vigil takes two people. A second player has to crouch within 4 blocks with an empty main hand, keep the patient in line of sight at a facing dot of 0.85 or better, and stay there for 600 ticks - thirty real seconds - while the patient's mood is below -60. Then the patient's mood climbs at 0.55 per second and their anhedonia falls at 0.01 per second, both raw. It costs the comforter 0.10 happiness per second. A comforter whose own mood is at or below -25 has nothing to give, though the freeze on the patient's self-harm spiral still applies. It saturates hard: five minutes of accumulated vigil decays the rate to 15 percent.
You stay where they can see you.
message.doomedmatu.vigil.comforter
A facing dot of 0.85 or better is what "where they can see you" means in code, held for 600 ticks from within 4 blocks.
Two of the four anchors are owned elsewhere: WASH samples dirtiness at or below 20 every tick, and EAT is marked from FoodItem only when that food's configured mood value is positive, so calories alone never count. Needs and Survival
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Daily anhedonia payout by anchors kept (0 to 4) | +4, 0, -1, -3, -6 | body/RoutineHandler.java:47 |
| Streak to full doubled relief | 7 days | body/RoutineHandler.java:44 |
| Voluntary sit: arm time, rate, daily cap | 160 ticks, 0.06 anhedonia/s, 9 per day | body/LapseHandler.java:57-60 |
| Vigil requirements | within 4 blocks, look dot 0.85, patient mood below -60 | body/VigilHandler.java:44-47 |
| Vigil arm time | 600 ticks (30 seconds) | body/VigilHandler.java:49 |
| Vigil payout and cost | +0.55 mood/s and -0.01 anhedonia/s to the patient, -0.10 mood/s to the comforter | body/VigilHandler.java:51-53 |
| Vigil saturation | 6000 held ticks decays the rate to 15% | body/VigilHandler.java:57-58 |
FRAGMENT 05-C - VIGIL, NO RESPONSE
SUMMARY: A second player crouched within four blocks with an empty main hand and held the look past 600 ticks. The vigil armed. The patient was sitting at anhedonia 82.
RESPONSE: One line went to the comforter: "They don't look up." No mood moved. No numbness came off. The broadcast slump did not lift, so nobody else in render distance saw anything change either. The comforter's own happiness was debited at 0.10 per second for as long as they stayed down.
FINAL NOTE: The freeze on the self-harm ladder had already applied, one branch earlier, before the unreachable check. The line fires only on the arming pass. Stay another ten minutes and the game says nothing further while continuing to take the payment.
assets/doomedmatu/lang/en_us.json, key message.doomedmatu.vigil.unreachable; body/VigilHandler.java, the Anhedonia.unreachable branch.
Trauma
Trauma is a separate 0 to 100 value that feeds mood at 0.525 a point. It is carried by the character rather than by any limb, which puts it out of reach of every dressing in the mod.
It accrues while adrenaline-masked average pain is above 50 and the character is conscious, at pain times 0.0034 per second. At pain 100 that is a third of a point per second. Outside those conditions it decays at one fifteenth of a point per second, which is one point every fifteen seconds, and that rate is the only rate there is.
Dying adds 10 trauma, but only up to a soft cap of 60. A death cannot push you past that. Pain can. Death also clamps happiness to at most -10, with a floor of -35, so you never respawn cheerful and never respawn at the bottom.
Eating human flesh adds 8 trauma for the first meal and 1.5 more for each previous one, capped at 24 per meal, and costs 22 mood plus 3 per previous meal, capped at 52. The counter is persistent and survives death, so repetition makes it worse rather than cheaper.
Dismemberment adds trauma scaled by the tool. Watching an organ harvested does too, through the corpse-witness path, which costs 3.5 mood and 6 sickness scaled by a desensitisation multiplier that shrinks by 10 percent each time - gore stops landing after about nine bodies.
The moodle tiers are trauma above 25, above 45 and above 80. The last one matters mechanically: above trauma 80 the character stops speaking entirely. Silence from a badly traumatised body is the system working.
Harvested from a landed severed limb with a Foraging Knife or Bone Saw.
Very filling, but psychologically devastating and medically unsafe.
Every portion permanently marks the character and increases the next cost.
Cooking reduces sickness and sepsis; spoilage risk is shown above.
tooltip.doomedmatu.raw_human_flesh
"Permanently marks the character" is the persistent counter: 8 trauma for the first meal, 1.5 more for each one after it, and it survives death.
C2SHarvestOrganPacket calls seeCorpse on the surgeon and on every other Doomed player within 8 blocks, so an organ harvest bills the whole room the 3.5 mood and 6 sickness and advances everybody's desensitisation multiplier by a tenth. Organs
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Trauma accrual | pain x 0.0034 per second, while pain is above 50 and consciousness is above 1. The consciousness gate is TRAUMA_CONSCIOUS_GATE = 1, so a body at consciousness 10 is unconscious by every other gate in the mod and still banks trauma. | body/PainHandler.java:80-87 |
| Trauma decay | 1 point every 15 seconds | body/PainHandler.java:85 |
| Death adds | +10 trauma, soft-capped at 60 | capability/DoomedCapabilityEvents.java:30-31 |
| Death clamps happiness to | at most -10, floor -35 | capability/DoomedCapabilityEvents.java:28-29 |
| Cannibalism cost | 8 to 24 trauma, 22 to 52 mood, worse each meal | body/CannibalismService.java:26-28 |
| Corpse desensitisation | -3.5 mood, +6 sickness, x0.9 each time | capability/DoomedData.java:2867-2871 |
| Speech cut off above | trauma 80 | body/QuipHandler.java:57 |
The despair ladder
The self-harm ladder has three rungs and the lowest one barely registers as an event.
Scratching starts at mood -45. Each tick rolls a chance that scales from nothing at the threshold up to about one in a thousand at mood -90, which is roughly once every fifty seconds at the worst. It only ever picks a wound that is already open and untended: a limb that is still attached, unstitched, and either bleeding or carrying a deep wound. Each scratch adds 2.5 bleed, removes 1.5 skin health and adds 4 pain. The damage is in the drip rather than the hit, and stitching a wound removes it from the pool permanently.
The episode spiral starts at mood -70 and needs stillness. A timer builds while the character is conscious above 20 and moving less than 0.05 blocks per tick horizontally. It builds at 2.5 per second below mood -75, and 1.875 per second between -70 and -75, and it fires at 30. That is about twelve seconds of standing still at the bottom, or sixteen higher up. Moving bleeds it back at 5 to 7.5 per second, so a step is a genuine reset.
Three things stop the entire ladder dead, scratching included. A vigil held on you freezes it. So does a lapse, because the stillness the spiral watches for is exactly the stillness a lapse is made of. So does a post-episode lockout, for as long as it counts down.
You can hear it coming. The dread drone swells with the same windup the server is counting, and at windup 28 - two points under the trigger - a sharp sting fires and the drone cuts to dead air for 0.7 seconds. The screen darkens with it: a black fill ramps in from windup 20. Below mood -90 a separate radial vignette closes in from the edges even while you are fully conscious.
Stand still for 100 ticks with mood at or below -45 and the character stops holding themselves together. Their head goes down, or they sit on the ground, or they put their hands over their face, or they wrap their arms around themselves.
The lapse charges nothing. Health, stamina, speed and any action in progress all carry on untouched. It ends the instant you move, and the pose eases back out over about a tenth of a second, so the character answers immediately.
The idle check reads more than position. Sprinting, swimming, elytra flight and riding all disqualify, and so does having a Doomed screen open - a player forty seconds into suturing their own thigh is idle by any movement test, and a character who slumps over mid-surgery would be a bug. Consciousness above 20 is required, and a downed character is excluded.
Which shape a character falls into is fixed per character rather than random. Below anhedonia 45 it is only the head going down. Above it, the player UUID decides permanently between sitting, hands to the face, and arms wrapped, so a given character reads as having their own way of doing this.
Everybody in render distance sees it, because the pose rides the broadcast posture channel rather than sitting as a local effect. That channel also carries the ordinary slump, which is the worst of pain over 100, negative happiness over 100, low consciousness and stroke. A vigil held on you multiplies the despair half of that by 0.4, so your head visibly comes back up for the whole server. Other people can see that someone is sitting with you.
A hopeless drone
subtitles.doomedmatu.despair
The drone is a live readout of the windup counter the server is holding. At 28 it cuts to dead air for 0.7 seconds, two points before the episode fires.
Every rung is paid in blood - 2.5 bleed per scratch onto a wound that was already open, 6 to 10 for a standard episode, 45 to 60 for a severe one and 60 to 90 plus another 20 for the raked face - all in the same 0 to 100 bleed units the circulation model drains from. Blood and Circulation
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Scratching onset | mood -45 or below | body/DespairHandler.java:36 |
| Scratch cost per hit | +2.5 bleed, -1.5 skin, +4 pain | body/DespairHandler.java:40-42 |
| Episode spiral onset | mood -70 or below | body/DespairHandler.java:45 |
| Stillness timer trigger | 30, built at 2.5/s below mood -75 (about 12 seconds) | body/DespairHandler.java:50, 141-148 |
| What counts as still | under 0.05 blocks per tick horizontal, consciousness above 20 | body/DespairHandler.java:52-54 |
| Audio warning threshold | windup 28, sting plus 0.7 seconds of dead air | client/sound/DoomedAmbientAudio.java:355-360 |
| Rock-bottom vignette | mood -90 or below | client/hud/VisionEffectsOverlay.java:1040 |
| Idle time before the body gives up the pose | 100 ticks (5 seconds) | body/LapseHandler.java:50 |
| Mood at which the lapse can happen | -45 or below | body/LapseHandler.java:52 |
| Anhedonia at which deeper poses appear | 45 | body/LapseHandler.java:54 |
| Stillness epsilon | 0.015 blocks per tick | body/LapseHandler.java:63 |
| Vigil lift on the broadcast slump | x0.4 | body/VigilHandler.java:66 |
| The lapse also freezes the whole self-harm ladder | scratching included | body/DespairHandler.java:124-127 |
The self-harm trigger is roughly twelve seconds of standing still
Below mood -70 a hidden stillness timer builds at 1.875 per second, or 2.5 per second once mood drops below -75, and fires an episode at 30. Standing still at the bottom therefore gives you about twelve to sixteen seconds. Moving bleeds the timer back at 5 to 7.5 per second, so a single step resets most of it. The dread drone and the darkening screen are a real-time readout of that exact counter, and the sting that fires at windup 28 lands two points before the screen opens.
Episodes
When the timer fires, the game checks the inventory first. A plushie carried anywhere in it is destroyed, you gain 15 happiness raw, and a 240 second lockout starts. No harm at all. This is the only pre-emptive counter to an episode and nothing in game mentions that it exists.
Otherwise the tier is chosen by mood. Above -90 it is a standard skin episode: one cut on a random limb other than the head or an eye, costing 35 skin health, 13 muscle, 6 to 10 bleed and 20 to 30 pain, returning 8 happiness raw and a 180 second lockout.
Below -90 it is severe. If mood is at or below -94, an eye is still present, and a coin flip comes up, an eye episode runs. With both eyes intact this becomes the violent variant: the face is raked at least ten times, head skin goes to zero, head pain goes to 100, the head takes 60 to 90 bleed plus another 20, adrenaline jumps 50, and exactly one random eye is removed. Never both. Otherwise the severe skin variant takes a major limb for 70 skin, 30 muscle, 45 to 60 bleed and 25 to 35 pain. Severe episodes carry a 300 second lockout.
The relief numbers were deliberately raised above the source values - 22 for a severe skin episode and 26 for an eye - and all of them are applied raw, bypassing the anhedonia reward gate. Scaled, self-harm would be the most reward-efficient action available to a numb body.
The episode itself is a full-screen minigame that runs to a conclusion whatever you do. A clawed hand chases your cursor and jitters. You resist by clicking, but each click only kicks the hand harder, and after about fifteen clicks it breaks and a cut lands. Sit there and the hand descends on its own every 0.8 seconds. The severe skin tier cascades five cuts.
Hold it to soothe a despair episode; ruined when used.
tooltip.doomedmatu.plushie
It does not have to be held. The check scans the whole inventory, and it runs before the mood tiers, so the plushie pre-empts the episode rather than soothing one already running.
A plushie in your inventory converts an episode into comfort
When the timer fires, the game scans your whole inventory for a plushie before anything else. If it finds one, the plushie is consumed, you gain 15 happiness applied raw, and you get a 240 second lockout. No wound, no minigame, no eye. This is checked before the mood tiers, so it works even at mood -100 where the violent both-eyes episode would otherwise run.
FRAGMENT 07-A - TOAST DURING AN EPISODE
SUMMARY: Mood -96, an eye still present, the coin flip came up. The violent variant ran: ten face rakes, head skin to zero, head pain to 100, one eye removed.
RESPONSE: DoomedAdvancements.tick watches the state and not the cause, so isEyeGone read true on the next body tick and awarded eye_lost. Its display block carries "title": "You'll Shoot Your Eye Out" and "announce_to_chat": true. Every player on the server got the line.
FINAL NOTE: The advancement was written for shrapnel and a Neural Booster. The grant path has no way to tell those apart from a despair episode, and nothing in the record shows the overlap was weighed when the episode tiers were tuned.
data/doomedmatu/advancements/eye_lost.json; body/DoomedAdvancements.java, the isEyeGone check in tick(); body/DespairHandler.java, TIER_VIOLENT.
Speech
The character talks to themselves. A shared cooldown advances every tick while conscious, and the game walks a fixed priority list of about thirty-three conditions, firing the first one whose condition holds and whose own cooldown has elapsed. Severe lines sit at the top and re-fire soonest: agony at pain above 80 with a 100 tick cooldown, suffocation below respiration 6 at 160, and the dying line at 240. Ordinary complaints sit at 600 to 2400 ticks. Feeling good is deliberately last in the walk and carries the longest silence of any line at 2400 ticks, and it re-checks the whole body rather than trusting its position.
The same line twice in a row is blocked, with agony, suffocation and the dying line exempt. After 2400 ticks of silence the memory of the last line is forgotten so it can be said again.
Speech is cut off entirely in four states: consciousness at or below 5, brain at or below 50, trauma above 80, or mood below -75. The brain gate is worth noting, because the brain-damage line fires from brain 95 downward and then the character goes silent at 50 - the complaint about not being able to think stops exactly when it becomes true.
Flat affect is the part nobody works out. As anhedonia climbs, the character stops narrating themselves from the bottom of the list up. At anhedonia 40 the comfort complaints go: tired, hungry, thirsty, cold, warm, gloomy, confused, sick, and the two lines about ruined skin and dead muscle. At anhedonia 72 the lines about how you feel go too: miserable, depressed, sad, exhausted, starving, dehydrated, very sick. Being happy is grouped with those, because a numb body can still be having an objectively good day and simply stops being the kind of person who mentions it. What survives is damage and dying. Whatever a body would still scream about is left in.
Hunger complaints are additionally scaled by mood: the thresholds are multiplied by one plus mood times 0.009, so a wretched body only mentions food when it is genuinely starving.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Speech gate | consciousness above 5, brain above 50, trauma at or below 80, mood at or above -75 | body/QuipHandler.java:166-168 |
| Flat affect: comfort complaints stop | anhedonia 40 | body/QuipHandler.java:29 |
| Flat affect: lines about feeling stop | anhedonia 72 | body/QuipHandler.java:30 |
| Fastest re-firing lines | agony 100 ticks, suffocation 160, dying 240 | body/Quips.java:38-47 |
| Silence before a line can repeat | 2400 ticks | body/QuipHandler.java:32 |
| Hunger complaint scaling | threshold x clamp(1 + mood x 0.009, 0, 1) | body/QuipHandler.java:221 |
| Wakeup gasp | fires 1 second after coming to, only if pain is under 21 | body/QuipHandler.java:110-116 |
Flat affect silences your character by category, not by volume
At anhedonia 40 the comfort complaints stop firing: tired, hungry, thirsty, cold, warm, gloomy, confused, sick, and the lines about ruined skin and dead muscle. At anhedonia 72 the lines about feeling stop too: miserable, depressed, sad, exhausted, starving, dehydrated, very sick, and being happy. Lines about damage and dying are never suppressed. Separately, speech is cut off entirely at trauma above 80, brain at or below 50, or mood below -75.
FRAGMENT 09-B - ONE GOOD LINE
SUMMARY: The quip walk reached its final entry with nothing more urgent true. Mood above 45, pain under 10, no bleed at all, hunger and thirst both above 50, sickness at zero, brain at 95 or better. Cooldown 2400 ticks, the longest in the table.
RESPONSE: "Nothing hurts. I'd forgotten that was allowed." The key re-checks the whole body rather than trusting its position in the list, so a player bleeding out cannot fall through to it while a bleed line is still cooling down.
FINAL NOTE: It sits in the FEELING set, which flat affect switches off at anhedonia 72. A body most of the way out of the pit can be having a genuinely good day and never mention it. The author's comment beside it calls happiness the first thing flat affect takes, though in the code the comfort complaints go thirty-two points earlier.
body/Quips.java, the "happy" pool and FEELING_KEYS; body/QuipHandler.java, the "happy" case and FLAT_FEELING_ANHEDONIA.
Brain damage
Text corruption is a purely local render effect keyed off your own brain value. It holds at exactly zero until brain falls to 20 - that is 80 percent brain damage - and then ramps linearly to a per-character replace probability of 0.85 at brain 0. At brain 10 roughly 43 percent of letters and digits are swapped for a symbol from a small punctuation set.
Only letters and digits are corrupted, so spaces and punctuation keep word shape, and formatting codes are skipped so colours survive. It is deterministic by character position, so the same letters corrupt the same way every frame instead of flickering, and the corrupted set grows monotonically as brain falls. The underlying strings are untouched: typing and clicking still work, the text is just hard to read. It is forced off entirely during a Last Stand, because the alarm and the triage line arriving as noise would defeat the whole feature.
Separately, below brain 95 a thirty-second timer rolls a battery of afflictions. Every roll is gated on a random value exceeding brain divided by 100, so at brain 90 each is about 10 percent likely and at brain 10 about 90 percent. A confused shout at 75 percent secondary chance. Reversed movement controls at 80 percent. A fumble that drops your held slot, your offhand and the next hotbar slot at 75 percent each. And a screen flash with a sound if you are conscious above 20.
Collapse is the harsh one and it is gated separately: 0 percent above brain 60, ramping to 40 percent at brain 0. It is telegraphed 100 ticks - about five seconds - ahead with a flash and a cry before the floor comes, and it sets shock to at least 20.
The whole battery is skipped during an active Last Stand.
Brain damage also feeds the framebuffer: chromatic separation ramps at 0.012 per point below 100, and static grain has its own client slider, so it can come down without flattening every other effect.
The last-stand survival roll reads a mood from nine minutes ago
Every 60 seconds your derived mood is pushed into a ten-slot ring buffer. When your brain reaches zero, the reprieve roll reads slot nine - your mood from roughly nine minutes earlier, not the mood you had while collapsing. That value is smoothstepped across the range from a 10 percent chance at the most despairing to a 70 percent chance at the most hopeful, with about 40 percent at neutral.
Text only starts scrambling at 80 percent brain damage
The corruption probability holds at exactly zero until brain health falls to 20, then ramps to 0.85 at brain 0. It is deterministic by character position, so the same letters corrupt the same way every frame and the corrupted set only ever grows as your brain falls. It is forced off entirely for the duration of a Last Stand so the window's alarm and triage line stay readable.
Threat states
These are the Deep Maw states and they progress in a strict order that admits no skipping.
Impending Doom is proximity only, and it is deliberately independent of sight - stone conceals the animal, not the fact that something enormous is closing through the cave. The level runs from 2 at the outer boundary of the Maw's territory up to 50 at the redline, on a squared closeness curve. Adrenaline is floored between 30 and 68 across that range.
Horrified requires two things at once: the Maw has confirmed you as prey, and you have a real server-clipped line of sight to it. The check ignores where the camera is pointed. It sets the level to 100 and floors adrenaline at 85. Recognition latches for as long as that exact entity remains your active in-range encounter, so leaving the territory and coming back correctly restarts you at Impending Doom.
Focused is earned. You must have dealt at least 10 percent of that specific Maw's maximum health in accepted post-mitigation damage, credited per player and stored on the entity itself. Two players attacking the same Maw, or one player meeting two Maws, progress independently. It replaces Horrified rather than stacking beside it, and floors adrenaline at 90. Hitting anything else earns nothing toward it.
The hidden cost is in mood. Horrified level multiplies your entire derived mood by one minus level times 0.005, so a Horrified 100 halves whatever your mood was. All the aura levels decay by 1 per tick toward zero once you are clear, so a full 100 takes five seconds to bleed off.
Ordinary adrenaline is separate and comes from the proximity handler: three or more hostiles within 12 blocks, or one hostile with max health above 25, floors adrenaline at 45. A hostile with max health of 150 or more within 100 blocks floors it at 80. An arrow passing within 1.65 blocks of your chest floors it at 60, once per second. Remember that adrenaline above 40 costs happiness at 0.02 per second.
Something commits to the hunt
subtitles.doomedmatu.deep_maw_confirm
The confirmation is half of Horrified. The other half is a real server-clipped line of sight to the animal.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Impending Doom level range | 2 at the boundary to 50 at the redline | body/ThreatEncounterHandler.java:180-184 |
| Focused requirement | 10% of that Maw's max health in damage, per player | body/ThreatEncounterHandler.java:38 |
| Adrenaline floors | 30-68 impending, 85 horrified, 90 focused | body/ThreatEncounterHandler.java:133-148 |
| Aura decay | 1 per tick toward zero (100 clears in 5 seconds) | body/MoodHandler.java:39 |
| Crowd and heavyweight thresholds | 3 hostiles within 12 blocks, or one above 25 max health | body/ThreatHandler.java:28-31 |
| Boss heuristic | max health 150 or more within 100 blocks, adrenaline 80 | body/ThreatHandler.java:29-33 |
| Arrow near miss | within 1.65 blocks, adrenaline 60, once per second | body/ThreatHandler.java:34-36 |
The imaginary friend
Taking the Schizophrenia trait gives you a voice. The trait costs zero points on purpose, because nobody has judged it yet - a friend that turns out useful would be a perk handed out as a flaw, and one that turns out miserable would be a flaw nobody could afford.
Which friend is yours is derived from your character UUID, so it never changes, survives death, and is the same answer on every server with the same datapacks. The friend speaks to your action bar rather than to chat, and its voice is sent to you alone at your own position, so anybody standing next to you hears silence. Right now the voice is the whole of it. The trait description promises other people can see yours, and the body and the entity behind that promise have yet to be built.
It will not talk more often than every 900 ticks - 45 seconds - and when it has nothing to react to it goes quiet for somewhere between 45 and 200 seconds.
It reacts to five situations, checked in order: a Deep Maw within 48 blocks, being downed, blood volume below 3.2 litres, stateful happiness at or below -50, and idle. Only one in three idle checks produces a line at all.
The hazard warning lies one time in five, and it lies in both directions. Twenty percent of the time there is no Maw within 48 blocks, it will tell you there is one. Twenty percent of the time there genuinely is one, it says nothing about it and falls through to whatever else is true about your body. It reports what it thinks rather than what it checked. A voice that is always right would be a radar.
Every friend is a single datapack file under data/<namespace>/doomed_imaginary_friends/. One file plus one sound event makes a new character exist with no code and no rebuild, and a resource pack can replace the voice of a friend somebody else wrote. One ships with the mod as the template.
The imaginary friend is wrong one time in five, in both directions
The Deep Maw warning does not check whether it is right. Twenty percent of the time it invents a Maw that is not there, and twenty percent of the time a Maw genuinely is within 48 blocks and the friend says nothing about it, falling through to whatever else is true about your body. It also cannot warn you about anything more than 48 blocks away.
Notes
- Below mood -70 the involuntary lapse arms after 100 ticks of stillness, and DespairHandler bails the moment it sees one, zeroing the episode timer. The timer needs 240 ticks to reach its trigger. The twelve-second countdown can therefore only complete while something suppresses the lapse and not the timer: a Doomed screen open (uiBusy blocks one handler and not the other), riding an entity, or drifting between the two handlers' different stillness epsilons of 0.015 and 0.05 blocks per tick. Both freezes are documented as deliberate. Neither javadoc mentions the other, and whether the collision was intended is written down nowhere.
- The dread drone and the darkening screen are computed on the client from synced mood, local movement and the synced lockout. The client is never told that a vigil or a lapse has frozen the server ladder, even though lapse kind is already on the wire for the pose. So the windup keeps climbing and the sting still fires at 28 with nothing behind it. Whether anyone has heard that happen in a live session is not recorded.
- DeathHandler says outright that the source's survival curve was a Unity prefab inspector value that never made it into the decompile, so the smoothstep from 10 percent to 70 percent is an approximation of a shape nobody has. Separately, resetVitals zeroes the ten-slot mood ring, which leaves a fresh character reading a stored 0 - a flat 40 percent - for their first nine minutes of life. Neither the curve nor that opening window can be checked against the original.
- THE_BOTTOM specifies anhedonia rising from mood -60 at between 0.015 and 0.040 per second, falling only through the upkeep and by 0.004 per second near company. The shipped code starts at -55, peaks at 0.125 per second, fades at 0.03 per second on its own and has no company term at all. The build rate is three times the spec's ceiling. No commit message, javadoc or reference note records the retune, and the spec's own estimate of 7.5 real hours to wait back up from -80 works out at under an hour against what actually shipped.
- The same spec makes the WITNESS tablet's NEURAL section "the one and only place the system is explained" - four filled or hollow squares, a streak count, an "Anhedonia 62 BLUNTED" row. Anhedonia is synced to the client. Its only client reader is the accent desaturation in DoomedUiTheme. The tablet page prints mood, trauma and adrenaline and says nothing about numbness or the routine, while the overview row above it reports PSYCHOLOGICAL as DISABLED whenever the server has despair off, over a mood number the same screen keeps printing live. Cut or missed is not recorded.
- The one shipped imaginary friend names doomedmatu:vocal_friend_waits as its voice. That id appears in the datapack file and nowhere else - not in sounds.json, not in the registry - so the lookup in speak() returns null and the friend falls through to action-bar text alone. It has never made a sound. Whether the recording was never delivered or the registration was simply missed, the record does not say.
Transformation
Doomed asks you two questions before it lets you play, and the answers are permanent for that character. The first is which run you are on: Endless, where the body simulation never ends and never changes you, or C.A. #DR-01, where horns and a tail grow through you across four growth spurts and the run has an ending. The second question is only asked on Endless, and it is what your body is made of - a perk-and-flaw build where perks cost points, flaws pay them, and you start with nothing. This page covers both, plus the Refusal Sequence that closes out a #DR-01 run and the Corebound state on the far side of it.
The two runs
The mode question is asked once per character, on a screen with two buttons: Endless and C.A. #DR-01. It comes before the ritual, and it comes even when the ritual intro is skipped, on the reasoning that skipping a cutscene should quietly decide nothing.
Endless is the health simulation with no ending. Transformation progress stays at zero and the growth spurt scheduler sits idle. No stage ever steps up. The Refusal Sequence and Corebound belong to the other mode entirely. Keep the body alive until it beats you, and that is the whole of the run. It is the default, and it is what most installs are for.
C.A. #DR-01 is the finite run. Progress ticks up while you play, the body changes in four stages, and the arc terminates in the Refusal Sequence and then Corebound. It is also the only mode that can complete the Corebound subclass in the companion RPG mod, since that unlock fires off the transformation finishing.
The gate is one line in the body simulation: the growth spurt scheduler ticks only when the mode transforms. Everything downstream inherits from that. Force-write transformation progress onto an Endless character with a command and it sits where it was written, advancing nowhere.
This is the arc, not the art. The body sprites are a separate cosmetic choice in the Customization panel and both modes leave it alone. Endless keeps the anthro body available, and #DR-01 leaves it optional.
Once you are Corebound the mode is frozen for good. Before that an operator can move a character with /doom mode, and the transformation resumes or stops where it stood.
The budget
An Endless run gets a second screen after the mode question. Two columns: perks in green on the left, flaws in red on the right. Hovering anything shows the flavour line and the exact arithmetic underneath it.
The rule is one sentence. A perk costs points, a flaw gives them back, and the starting budget is zero, so every perk is paid for by agreeing to be worse at something else for the rest of that character's life. The confirm button stays dark while you owe, and it says how much: "You owe 3 - pick a flaw". An empty list is a valid answer, and the button reads "Stay as you are".
Worth stating plainly, because an older version of the system worked differently. Traits were two switches with no budget, on the reasoning that claws and fur each carry their own cost inside themselves. That reasoning collapsed the moment a straight gain like "start with more Intelligence" joined the list, so everything is priced now. The internal costs stayed on top of the point price. Fur is genuinely dangerous when wet whether or not two points were paid for it.
The budget is a server setting. traitStartingBudget defaults to 0. Raise it for a softer run where a perk or two comes free, or set it negative and players start owing flaws before they are allowed in.
The whole system has an off switch too. Disabled, the pick screen is skipped, and a character who already picked keeps the stored mask while every effect goes flat - claws that do not mine, fur that does not insulate, every multiplier back at 1. Switch the option on again and that character's exact build comes back.
Perks
Seven perks, priced 2 to 4 points. Every number below is read by a live handler; nothing on this screen is decorative.
Claws (4) tear into wood and the softer stone family barehanded, at up to 2.2x break speed, and set a floor of 2.5 damage on healthy empty-hand attacks. Both uses blunt the claws.
Fur (2) is the best insulation in the mod while dry and worse than bare skin once soaked. Details below.
Bright (3) starts a character at Intelligence +4. Intelligence gates the hardest surgery in the game and trains slowly, so four free levels are worth three points.
Hardy (3) starts a character at Resilience +4 - stamina regeneration otherwise earned through pain.
Steady Hands (3) cuts the pain tremble in every treatment minigame to 0.55x. The pain stays; only the shake comes down, so stitches and splints land closer to where they were aimed.
Strong Constitution (3) is Immunity +18, on the same 0-100 scale infection is scored against. Wounds take infection less readily and diseases have a harder time getting in.
Warm Blooded (2) accrues frostbite at 0.6x. It buys time before the extremities go, and that is all it buys - the body is no warmer for it.
Bright and Hardy are handled as real experience grants rather than display offsets, and the mod tracks exactly how much bonus experience it handed over, so removing the trait can take back that much and no more.
Fur is a straight line between two numbers rather than a switch. Dry it gives +0.45 insulation, the strongest in the mod. Soaked it gives -0.28, worse than wearing nothing at all. The value interpolates linearly with wetness from 0 to 100, so the crossover where fur stops helping and starts hurting sits near 62 wetness.
The real bite is the time spent on the wrong side of that crossover. Fur dries at 0.55x. Get wet and you stay wet for nearly twice as long as a bare-skinned character standing in the same place.
Two more costs come with the coat, and both are mandatory. Heat pushes in 1.35x harder, since it is a coat that cannot come off in a warm place, and the whole metabolism runs 1.25x, so hunger, thirst and energy all drain faster. Take Drowsy as well and the metabolism multipliers stack: 1.25 times 1.15.
The practical shape is that fur is excellent for cold, dry caving and actively bad for anything involving water, rain or a warm biome. Getting out of the water is half the fix. The drying penalty carries the negative insulation along with you for a long time afterward.
Steady Hands multiplies the tremble inside PainHand, the shared cursor every treatment screen draws from, so bandaging, stitching, arrow extraction, dislocation reduction, amputation and surgery all inherit the same 0.55x. Injury and Treatment
Fur reaches the survival layer at several separate points: TemperatureHandler reads its insulation curve and its heat-gain multiplier, WetnessHandler reads its drying rate, and NeedsHandler folds its metabolism straight into the same term the run's metabolismrate setting scales. Needs and Survival
Flaws
Twelve flaws pay points. One pays nothing yet.
Thirsty (-2) drains thirst 45% faster. Ravenous (-2) does the same to hunger. Drowsy (-2) drains energy 40% faster and runs the whole metabolism 15% hotter, so it costs food and water as well as sleep. Night Terrors (-2) makes a nightmare 2.5x likelier out of a bad sleep.
Brittle Bones (-3) leaves bones tolerating 38% less punishment, so falls other people walk away from break you. Bleeder (-3) clots at 0.55x, which is nearly twice as long bleeding and a bad wound that outruns a bandage. Anaemic (-2) rebuilds red cells at 0.45x; a transfusion still restores the litres, and the breathlessness stays long after. Sickly (-3) is Immunity -20.
Addictive Personality (-2) builds opioid tolerance and nicotine dependence 70% faster, so habits take hold sooner and withdrawal arrives earlier. Fragile Mind (-3) deepens anhedonia 45% faster - the numbness that blunts every good thing and survives your death. Poor Circulation (-2) accrues frostbite 60% faster, and stacks multiplicatively against Warm Blooded if both are somehow taken.
Missing Left Arm (-4) is the largest ordinary payout. Your left upper arm, forearm and hand are biologically absent from the first second. No stump wound, no blood, no gore, no trauma and no chat line - these parts were gone before this body became your problem. The boundary is already healed and socket-ready. That side cannot act until you fit a working prosthetic.
Severed (-5) is the biggest payout in the game. It replaces the status panel with a physical self-examination: you look, touch, test movement, check circulation and count rough vitals, and exact measurements need the WITNESS tablet. Diagnostic moodles you could not have seen or felt are hidden from you.
Schizophrenia costs nothing and pays nothing while it is being judged. It occasionally gives you an imaginary friend, drawn once from your own UUID so it is consistently yours and survives death, and other players who took the trait can see yours. It comments on a Deep Maw within 48 blocks, on being downed, on heavy blood loss and on a collapsed mood. One time in five it is wrong, in both directions. Priced at zero, it sorts into the right-hand flaw column despite paying nothing.
Sickly's -20 is a flat offset on the same 100-point immunity baseline InfectionHandler builds every wound-infection and disease roll against, and Strong Constitution's +18 lands in that identical term from the other direction. Disease and Infection
Addictive Personality is one multiplier read in two places - DrugHandler applies it to the opioid tolerance ramp and CigaretteItem applies it to nicotine gain - so both habits accelerate off a single trait bit. Drugs and Pharmacology
Fragile Mind multiplies Anhedonia's own gain term on the same line the SSRI halving sits on, so it deepens the numbness the psychology layer already tracks instead of running a second one alongside it. Psychology
The imaginary friend's only trigger that reads the world at all is a living Deep Maw inside 48 blocks; everything else it remarks on is your own body, so on a server where the Maw never spawns the friend is talking about you and nothing else. Threats
Claws
Claws want a genuinely empty main hand on a biological hand. A tool always wins the slot, and a prosthetic hand does not qualify.
What they bite into is wood and the softer stone family: logs, planks, wooden slabs and stairs, leaves, dirt, overworld base stone, and the stone ore replaceables. What they can actually harvest is a narrower list, on purpose - logs, planks, wooden slabs and stairs, plus vanilla stone and deepslate exactly. Base-stone tags carry a lot of modded material that must not become free bare-hand drops. Scratching faster and being allowed to keep the block are two different permissions.
Speed scales with condition rather than sitting flat. Condition is 0 at or below 15 claw health and reaches 1 at 100, so the 2.2x figure is the best case on perfectly intact claws, and worn claws are worth much less. The same condition value sets the empty-hand damage baseline, sliding from vanilla's 1 up to 2.5. That is a floor rather than a bonus, so Strength effects and critical hits still stack on top.
Every block broken this way costs keratin: 1.4 per rock, 0.5 per wood, charged only when the block actually breaks, so an abandoned swing is free. Every accepted punch costs 0.35, plus up to another 0.65 against armoured targets.
Regrowth runs on its own at 0.25 per second at full nourishment, scaled down by hunger to a floor of 0.2x, multiplied by 1.4 while asleep and by 3 during a keratin booster window. A full 100ml keratin booster syringe buys 2800 seconds of that boost, and dosing while more than 3600 seconds are already banked delivers only a tenth of the new dose.
So this is a rate limit, not a wall. Claw your way through a mountain and you arrive on the far side unable to defend yourself. Leave them alone and they come back. The HUD warns at two tiers: Worn Claws under 60, Broken Claws under 25.
Regrows damaged nails and future claws faster, and hardens them while active.
tooltip.doomedmatu.keratinbooster_syringe
The tooltip names no window and no ceiling. The code gives 2800 seconds of x3 regrowth per 100ml, and cuts a re-dose to a tenth once more than 3600 seconds are banked.
The scratch list is vanilla block tags, but the harvest list is those tags plus Blocks.STONE and Blocks.DEEPSLATE named one at a time, so a modded stone that joins BASE_STONE_OVERWORLD breaks faster under claws and still yields nothing. Items, World and Trade
Claw regrowth time is a syringe field like any other - DrugService's KERATINBOOSTER case adds 28 seconds per millilitre and cuts a fresh dose to a tenth once more than 3600 seconds are already banked. Drugs and Pharmacology
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Best-case break speed | 2.2x at full claw health | ~/body/ClawMining.java:MAX_BONUS |
| Useless below | 15 claw health | ~/body/ClawMining.java:USELESS_AT |
| Wear per block | 1.4 rock, 0.5 wood | ~/body/ClawMining.java:WEAR_STONE/WEAR_WOOD |
| Wear per punch | 0.35 plus up to 0.65 vs armour | ~/body/ClawWearHandler.java:PUNCH_WEAR |
| Regrowth | 0.25/sec base, x1.4 asleep, x3 boosted, hunger floor 0.2x | ~/body/ClawHealthHandler.java:19-27 |
| Keratin booster | 100ml = 2800 seconds; x0.1 if over 3600 banked | ~/body/DrugService.java:291-298 |
| HUD tiers | Worn under 60, Broken under 25 | ~/client/hud/DoomedHudOverlay.java:704, 2094-2103 |
The pick screen
The trait screen is a hard gate on entering the run. On an Endless character with traits enabled the server holds the Doomed condition back until the build is confirmed. Close the screen without answering and you are simply not Doomed yet.
Within a life the answer is final. Running the /doom traits command after confirming gets you "You already answered. This body is what it is." The server re-validates the mask independently of the screen, so an unpaid build fails there too.
Death re-opens the question, and only the answered flag clears. The mask itself survives, so the screen comes back with the previous build already ticked, and confirming it unchanged keeps exactly what was there. Change it and the anatomy follows: a fitted prosthetic is dropped at your feet before a fresh biological arm is restored, so switching away from Missing Left Arm cannot silently delete equipment.
A C.A. #DR-01 run never sees this screen, on entry or on death. That arc decides what the body becomes on its own, and a #DR-01 character's effective trait mask is zero regardless of what is stored.
One more case. A server running autoDoomOnJoin in its silent setting applies the configured mode and locks it without asking anything, and on Endless that means the neutral zero-point body with no perks and no flaws - a setting that promises no questions must not invent a build for you. A later death still lets you pick normally.
If a balance change or a schema change ever makes a confirmed build invalid, the editor comes back rather than grandfathering it, and your existing anatomy is left untouched until you confirm its replacement.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Entry gate | setDoomed returns early until traitsChosen is true | ~/capability/DoomedDataUtil.java:50-53 |
| On death | only traitsChosen clears; the mask survives | ~/capability/DoomedData.java:resetVitals |
| C.A. #DR-01 | effective mask forced to 0 | ~/body/BodySimulation.java:77-79 |
Traits are an Endless-only system, and a C.A. #DR-01 character's trait mask is forced to zero
The trait pick screen is only shown after choosing Endless. On a #DR-01 run the game skips straight to the ritual, because that arc decides what the body becomes. The body simulation goes further than not asking: it computes the effective trait mask as zero for any character not on DEFAULT mode, so even a mask written in by an operator produces no head-start skills and no missing-arm anatomy. There is no way in game to have both claws from the trait screen and horns from the transformation.
Timeline
Progress is measured in active playtime, one tick per tick, while you are Doomed and on a C.A. #DR-01 run. The shipped default is 168 hours - one full week of active play. paceFactor is not in the calculation, so a server that has sped up or slowed down the rest of the body simulation has left this exactly where it found it.
The four growth spurts fire at 25%, 50%, 75% and 100% of that timeline. At the default that is roughly 42 hours of playtime between each one. A spurt is a short window rather than a phase you live in, so the shape of a #DR-01 run is 42 hours of nothing followed by 30 to 75 seconds of everything, four times over.
One threshold sits off the milestone grid. Past 95% progress, a blow that would kill you diverts into the Refusal Sequence instead. The fourth spurt only begins at 100%, so without that rule a death at 96% would be an ordinary death that wiped the whole week.
The duration is configurable between 0.25 and 10000 hours. Changing it reinterprets the stored progress of every existing character against the new timeline, so lowering it can make the next spurt begin immediately.
Horns and tail render at the stage reached, and the stage steps up at the start of each spurt rather than at the end. The horns grow from 0.400 scale at stage 1 to 0.650 at stage 4. The tail renders 40% of its segments at stage 1, 65% at stage 2, 85% at stage 3 and all of them at stage 4. A client-side hideTransformModels option suppresses both layers and touches nothing mechanical.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Full timeline | 168 hours of active play (default), range 0.25 to 10000 | ~/config/DoomedConfig.java:1784-1790 |
| Spurt milestones | 25% / 50% / 75% / 100% | ~/transform/GrowthSpurtScheduler.java:39-43 |
| Refusal threshold | 95% of the timeline | ~/transform/GrowthSpurtScheduler.java:34-37 |
| Horn scale by stage | 0.400 / 0.465 / 0.574 / 0.650 | ~/client/render/HornLayer.java:45 |
| Tail extension by stage | 40% / 65% / 85% / 100% of 10 segments | ~/client/render/TailLayer.java:246-252 |
The Refusal triggers at 95% progress, not at the fourth spurt
The fourth growth spurt only begins at 100% of the timeline, so a naive reading is that only the final window can produce the Refusal. There is a second, earlier gate: past 95% of the configured duration, any blow that would kill you diverts into the Refusal Sequence instead. Before that threshold there is no protection of any kind, and a death wipes the entire transformation.
Growth spurts
A spurt announces itself. Stage 1 is "Your skull splits - something is forcing its way out." Stage 4 is "Everything fails at once. This kills you - unless you endure it."
The window lengths escalate: 30 seconds, then 45, then 60, then 75. Pain follows a sine envelope across the window, rising from nothing to the stage peak at the halfway point and back down, peaking at 45, 70, 92 and 100. Happiness sheds continuously while the window is open, at 0.03, 0.06, 0.10 and 0.16 per tick.
Bleed pulses land every 30 ticks at both the head, where the horns are coming out, and the abdomen, where the tail is reshaping the lower spine, once the envelope is past 0.15. The per-pulse amount is 6, 12, 20 and 30 by stage, and the same amount is added to that limb's pain.
From stage 2 onward, spikes erupt and impale you. One salvo fires the instant the spurt begins, then more every 60 ticks while the envelope is past 0.2. Each event hits 1 to 3 random body segments with punctures worth 30 to 55 skin damage before armour, floors your shock at 50 times the stage intensity and your adrenaline at 90, and makes you scream. A stage 4 window contains roughly 23 of these.
Worth knowing before you plan around it: the spike table leaves out the head. The fiction says a horn is coming through your skull, and the wound lands on a random shin. Treating during a spurt is a poor plan for a similar reason - bleed pulses reopen two sites every 1.5 seconds and one full bandage wrap is 144 crank actions on a single limb, so the intended play inside a window is to survive it rather than to keep up with it.
Stages 1 through 3 leave the leftover transform pain to decay at 0.08 per tick between windows. Stage 4 ends only one way.
One item exists to make a spurt survivable. Right-click it and a five minute window opens during which the entire ordeal is cut to a quarter of its bite.
The quarter multiplier covers a lot. Transform pain, the mood loss per tick and the bleed pulses are all multiplied by 0.25. The spike eruptions are switched off outright rather than scaled down, including the opening salvo at the start of a stage 2 or higher spurt. The stage 3 shock climb and the stage 4 consciousness drain are suppressed the same way, entirely.
The timing detail that matters: the suppressant window is checked continuously, so a dose taken partway through a window helps from that moment onward and leaves everything that has already landed exactly where it landed. The opening spike salvo is decided on the instant the spurt begins. Skipping that salvo means already being dosed when the announcement appears.
The clock burns down whether a spurt is running or not, so a dose taken 42 hours before the next milestone is a wasted dose. Five minutes covers any single window with room to spare, since the longest is 75 seconds.
On a player who is not currently Doomed it does nothing, and it says so: "The suppressant does nothing to you."
Suppressant appears in the medical loot pool at the common weight, one per pull, so it comes out of medical caches rather than a recipe. Bank it as soon as you know you are on a #DR-01 run. Nothing else in the system mitigates any of this.
Your skull splits - something is forcing its way out.
doomedmatu.alert.spurt.1
The line puts the wound in your skull. The spike table has no head entry, so the puncture the game actually writes lands on a random shin.
The spike eruptions go through TrapEffects.impaleSpurt, which returns immediately when the trapsDamage option is false, so a server that disarms its bear traps and caltrops silently disarms every growth spurt as well - and that option's own comment lists nothing but contact hazards. Threats
Transform pain reaches PainHandler as one candidate inside a maximum rather than as an added term, and the spurt's per-pulse limb pain pins the head and abdomen at the 100 cap from stage 2 onward, so the aggregate returns 100 whichever stage peak the scheduler wrote. Pain, Consciousness and Death
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Window length | 30s / 45s / 60s / 75s (600/900/1200/1500 ticks) | ~/transform/GrowthSpurtScheduler.java:45 |
| Peak transform pain | 45 / 70 / 92 / 100 | ~/transform/GrowthSpurtScheduler.java:47 |
| Bleed per pulse, per site | 6 / 12 / 20 / 30, every 30 ticks | ~/transform/GrowthSpurtScheduler.java:49, 58 |
| Happiness lost per tick | 0.03 / 0.06 / 0.10 / 0.16 | ~/transform/GrowthSpurtScheduler.java:51 |
| Spike interval | every 60 ticks, stage 2 and up | ~/transform/GrowthSpurtScheduler.java:60, 149-152 |
| Spike wound | 1-3 segments, 30-55 skin damage before armour, adrenaline floored at 90 | ~/body/TrapEffects.java:355-372 |
| Spike target list | thorax, abdomen, arms, hands, thighs, shins - no head | ~/body/TrapEffects.java:30-33 |
| Dose duration | 5 minutes (6000 ticks) | ~/item/SuppressantItem.java:27 |
| Bite reduction | x0.25 on pain, mood loss and bleed | ~/transform/GrowthSpurtScheduler.java:54, 127 |
| Spikes while suppressed | disabled entirely, not reduced | ~/transform/GrowthSpurtScheduler.java:113-115, 149 |
| Loot weight | "doomedmatu:suppressant 1 3" in the medical pool | ~/config/DoomedConfig.java:1524 |
The growth-spurt bleed at the horn and tail sites is clamped away on intact skin
A spurt writes 6 to 30 bleed onto the head and the abdomen every 30 ticks, and adds the same amount to those limbs' pain. But the bleeding system caps every limb's bleed at 100 minus its skin health each tick, which on undamaged skin is zero, and that clamp runs later in the same tick than the spurt does. The pain lands and stays. The bleeding is erased before anything can read it, unless the skin at that site is already open - which in practice means unless a spike has already wounded you there, and the spike table does not include the head at all.
Transform pain is aggregated with a maximum, not a sum, and the spurt saturates the channel it competes in
Total pain takes the largest of your worst limb pain, transform pain, and amputation pain, then adds sepsis myalgia as a term. Transform pain is a candidate rather than an addition. Meanwhile the spurt's own bleed pulses add 6 to 30 pain per pulse to the head and abdomen against a decay of about 1 per second, so from stage 2 onward those limbs pin at the 100 cap and the maximum returns 100 regardless of which stage peak the scheduler wrote. The authored ladder of 45, 70, 92 and 100 does not survive to your pain bar.
The suppressant clock burns down whether a spurt is running or not, and the opening spike salvo is decided at the announcement
Suppressant sets a five minute window that decrements every tick from the moment you drink it, spurt or no spurt. Since spurts are roughly 42 hours of playtime apart at the default timeline, a dose taken in anticipation is a wasted dose. The stage 2 and higher opening spike salvo checks your suppressant state on the exact tick the spurt begins, so a dose taken one second after the announcement appears will blunt the pain and the bleeding but will not stop the salvo you have already taken.
FRAGMENT 09-D - SPURT ONSET BANNER, STAGE 4
SUMMARY: The fourth and final growth spurt opens with a banner sent from the server the instant the window begins. The authored line is en_us.json key doomedmatu.alert.spurt.4: "Everything fails at once. This kills you - unless you endure it."
RESPONSE: Inside the window the scheduler raises shock by 0.16 per tick and drains consciousness by 0.05 per tick, both gated on the pain envelope. ConsciousnessHandler runs seventeen lines later in the same tick, bleeds shock off at 10 a second and eases consciousness back at 3 a second toward a target of 100 on an unbled body. Net movement on both channels is the wrong way.
FINAL NOTE: The window runs its 75 seconds, expires, and calls RefusalService.begin. Whatever else stage 4 was meant to be, the banner is the part of "this kills you" that reaches the player intact.
res/assets/doomedmatu/lang/en_us.json:32; GrowthSpurtScheduler.java:150-156 against BodySimulation.java:230 and :247
Divergence
The transformation has a medical consequence outside the spurt windows, and it is easy to miss because nothing announces it.
As you change, your blood runs from red toward orange. The colour is driven by a factor derived from your stage: 0 at untransformed, 0.25 at stage 1, and 1 once you are stage 4 or Corebound. It shows in the particle bursts and in the ground pools you leave behind, and each character's blood reflects only their own transformation.
The transfusion system reads the same factor. Below 0.25 divergence - everything up to and including stage 1 - banked human blood still runs clean in you. Past that point a human blood bag adds extra hemolytic reaction severity, scaling linearly to a maximum of 70 at full transformation. For reference, that sits between the 45 of a rhesus mismatch and the 100 of a full ABO clash, so a wrong blood type on top of divergence is meaningfully worse than divergence alone.
This is deliberately a penalty rather than a hard block. The volume still goes in and you pay for it afterward. Saline is untyped and completely unaffected, so a transformed player always keeps a volume expander even once human blood has stopped fitting.
The practical version: from stage 2 onward, treat blood bags as a last resort and carry saline. From stage 3 onward the penalty is severe enough that a transfusion is a decision rather than a first-aid step.
Typed whole blood. Transfuse onto a limb to restore 0.75 L; incompatible ABO/Rh blood causes a delayed reaction.
tooltip.doomedmatu.blood_bag
The tooltip knows about ABO and Rh only. Divergence adds its own severity on top of whatever the type does, and appears nowhere in the text.
Divergence is added to the ABO and Rh clash rather than replacing it, and DrugService clamps the sum at the same 100 ceiling before handing it to TransfusionReactionHandler, so a transformed body is scored on the exact severity axis a wrong bag is scored on. Blood and Circulation
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Transform factor | stage/4, or 1 when Corebound | ~/body/DoomedBlood.java:32-37 |
| Divergence-free zone | factor at or below 0.25 (up to stage 1) | ~/body/DoomedBlood.java:DIVERGENCE_FREE |
| Peak divergence penalty | 70 extra reaction severity at full transformation | ~/body/DoomedBlood.java:DIVERGENCE_MAX |
| Fully transformed blood colour | #ff5500 | ~/body/DoomedBlood.java:23-26 |
Your blood diverging from human is a transfusion penalty nobody mentions
Past stage 1, banked human blood starts causing extra hemolytic reaction, scaling to 70 severity at full transformation. Saline is untyped and completely unaffected. Nothing in the interface connects the orange blood you are visibly bleeding to the fact that your blood bags have started hurting you, and the penalty is a severity addition rather than a refusal, so the transfusion appears to work.
FRAGMENT 12-B - TRANSFUSION NOTICE, DIVERGENT RECIPIENT
SUMMARY: A bag of correctly typed human blood pushed into a body past stage 1 puts one line on the action bar of the patient and, in co-op, of the person holding the needle: "The blood is right. The body is not - it is rejecting human blood."
RESPONSE: The branch fires only where the ABO and Rh clash scores zero and divergence does not. The volume still went in. TransfusionReactionHandler starts on the summed severity and banks the hemolysis debt against what was delivered, so the reaction arrives after the transfusion rather than in place of it.
FINAL NOTE: The comment above these four branches records that they shipped empty - wrong blood went into a friend and nothing said anything at all. The line exists because somebody had to be told which incompatibility it was, or a correctly labelled bag failing reads as a bug.
~/body/DrugService.java:963-978, reached through DoomedBlood.divergenceSeverity
The Refusal Sequence
When the change finishes killing you, the run ends in a sequence you sit through and then type your way out of, rather than in a death screen.
It starts on either of two triggers: a lethal blow landing while progress is past 95%, or the fourth spurt's window running out at 100%. In both cases the server locks you out of death first - health is set back to maximum and nothing is allowed to finish you mid-sentence.
The first phase runs 57 seconds and it cannot be skipped, paused or exited. Escape is consumed, mouse clicks are consumed, there is no button. Text, alarms, screen fractures and interface failures pile up without stopping. Then it cuts to black and holds silence for nearly seven seconds, and the rest of the sequence is quiet lines typing themselves out one at a time.
The gate at the end is literal. A prompt reads I REFUSE DEATH with a cursor under it, and you physically type it. Wrong keys do nothing at all - no error, no reset, it simply waits. Backspace works. Enter with the phrase complete sends the confirmation.
Nothing in this times out. The world waits. Disconnect partway through and the sequence re-opens the next time you log in, because the completed fourth spurt is saved state while the pending flag is not.
One accessibility note, stated here because the sequence itself no longer states it. Every flash, strobe, static field and inversion in phase 1 multiplies by the vision intensity client setting, with no floor anywhere, so setting it to zero genuinely removes the flashing. Screen shake answers to the shake slider's strength and not only its on/off. The sequence used to open on a card explaining this and the card was removed, so the settings are the whole of the promise now.
When you confirm, every player online gets a white dome from your coordinates, a hard screen shake and a single chord, across dimensions, and the server broadcasts one line: "Something refused to be forgotten."
A death during stages 1 through 3 is a real death. Items drop under the server gamerules and the normal respawn flow takes over, exactly like any other Doomed death.
What it costs on top of the ordinary death is the transformation. On respawn, progress ticks, transform stage, spurts completed, the active spurt window, transform pain and any banked suppressant all go back to zero. The horns and the tail are gone, and the week starts over from nothing.
The Corebound flag is the one thing death never resets. It persists forever.
This is what the 95% rule is for. Dying at 96% progress - 161 hours in, past every spurt but the last - would otherwise be an ordinary death that wiped all of it. Past 95%, the killing blow diverts into the Refusal Sequence and the run ends the way it is supposed to.
Under 95%, the progress has no protection at all. Last Stand is a floor on your capabilities and lets the wipe straight through, and so does everything else.
A fresh life is also a fresh clinical file. Your case notes are closed, composed once, filed as a death certificate you can still read later, and a new ledger opens. Skills carry across the death. The body does not.
The Refusal Sequence's only accessibility control is a client setting that no longer announces itself
Phase 1 is 57 seconds of sustained flashing that cannot be skipped, paused or exited - Escape and mouse clicks are consumed by the screen. Every flash, strobe, static field and inversion multiplies by the vision intensity client setting with no floor anywhere, so setting it to zero genuinely removes the flashing, and screen shake answers to the shake slider's strength rather than only its on/off state. The sequence used to open on a card that explained all of this before the wall hit, and the card was deliberately removed to protect the immersion of the scene.
FRAGMENT 14-A - ADVANCEMENT TEXT, ANNIHILATION
SUMMARY: On the tick a player confirms the refusal, the server awards doomedmatu:annihilation to them and announces it to everyone. The advancement carries the challenge frame, a crying-obsidian icon, and one line of description: "Every lethal blow, refused."
RESPONSE: The clamp underneath it substitutes 1.0 damage - half a heart - for any blow that would otherwise be fatal. At or below half a heart the clamp still fires, and 1.0 still kills. The effect has no tooltip. The description was never corrected.
FINAL NOTE: The line is true of every lethal blow except the ones taken at the bottom of the health bar, and those are the only ones a player is likely to be taking. The first person to learn the difference learns it from a death screen, with a permanent advancement in their book saying otherwise.
res/data/doomedmatu/advancements/annihilation.json (announce_to_chat true); the substitution is CoreboundPerks.ANNIHILATION_LETHAL_FLOOR = 1.0f
Corebound
Confirming the refusal splits you off from the run. You are a vanilla player again with every Doomed system switched off, and you keep the horns and the tail as proof.
The exit is thorough on purpose. Every vital, wound and transformation scalar is cleared to healthy defaults, the body simulation stops ticking for that player, they are stood back up at full vanilla health with fire out and effects gone, and the movement-speed and attack-speed modifiers the simulation leaves behind are stripped. Those modifiers are the reason the cleanup exists at all: a freed player used to keep a near-zero movement speed that also pinched their field of view, forever, because the handlers that would have cleared it had already stopped running.
Two permanent effects are granted, both infinite, both with particles suppressed so nobody wears a potion cloud for the rest of the save.
Spite denies harmful effects at the door. Anything in the HARMFUL category is refused before it applies. Effects already running stay running. Beneficial effects pass through untouched, and milk cannot remove Spite itself.
Annihilation does two things. Outgoing, you hit 25% harder, applied last so every other modifier has already had its say. Incoming, a blow that would kill you leaves you on half a heart instead - unless you are already at half a heart or less, in which case it kills you normally. The mortality is deliberate. Annihilation buys one more decision in every fight, not immunity.
Both effects are re-applied on login and on respawn, since vanilla death clears effects and Corebound is earned rather than granted.
The flag persists forever. It survives death, /doom mode cannot change it, and /doom off does nothing to it because that command only acts on players who are currently Doomed. If the Fantastic RPG mod is installed, the Corebound class completes at the same moment. Two advancements land together: survived Doomed, and gained Annihilation.
The Doom has left you - but its mark remains.
screen.doomedmatu.corebound.line2
The mark is literal - the horns and the tail stay, and so do Spite and Annihilation.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Annihilation outgoing | +25% damage dealt | ~/transform/CoreboundPerks.java:ANNIHILATION_OUTGOING_MULT |
| Annihilation lethal-hit substitution | A blow that would kill you deals 1.0 damage instead. It is a damage substitution, not a health floor, so a hit at 8 health leaves you at 7. | ~/transform/CoreboundPerks.java:ANNIHILATION_LETHAL_FLOOR |
| Spite scope | MobEffectCategory.HARMFUL, denied on application only | ~/transform/CoreboundPerks.java:onEffectApplicable |
| Persistence | re-applied on login and respawn | ~/transform/CoreboundPerks.java:reapplyIfCorebound |
| Advancements | doomedmatu:survived_doomed, doomedmatu:annihilation | ~/transform/CoreboundPerks.java:41-44 |
Annihilation still kills you at half a heart or less
The lethal clamp checks whether the incoming damage is at or above your current health and replaces it with 1.0 - half a heart. If you are already at or below half a heart, the clamp still fires and sets the damage to 1.0, which is enough to kill you. So Annihilation guarantees you survive one killing blow from any health above half a heart, and guarantees nothing after that until you heal.
Spite refuses effects at the door and never removes one you already have
Spite hooks the moment an effect is applied and denies it if the effect is categorised HARMFUL. Anything already running on you when Corebound is granted continues to run. Beneficial effects are untouched, which includes Spite and Annihilation themselves - they are both categorised beneficial, so they cannot deny each other. A harmful effect from a mod that categorises its effect as beneficial passes straight through.
Notes
- Whether 42 hours between spurts is the right spacing was never decided. reference/TRANSFORMATION_STAGE_AUDIT_20260812.md closes by naming the spacing as a design question it deliberately did not touch, and nothing in the repo records a C.A. #DR-01 character actually reaching 168 hours at the shipped default. Every judgement about how that week feels is arithmetic done on constants.
- The stage 3 shock climb and the stage 4 blackout drain both run before ConsciousnessHandler in the same tick, and that handler sheds motor shock at 10 a second and eases consciousness back toward its target at 3. The scheduler's own javadoc says the fourth spurt is meant to kill you. Nobody has watched one to see whether the screen so much as dims.
- The bleed a spurt writes to the head and the abdomen is erased by the next tick's skin clamp unless a spike has already opened that site, and the spike target table has no head entry at all. The 2026-08-12 audit marks this verified and recommends a fix. Nothing in it has been implemented, and BleedHandler still ticks at BodySimulation:192 against a scheduler that writes at :230.
- Schizophrenia is priced at zero on Matt's own instruction and the trait text admits it in the panel: "Costs nothing and pays nothing for now, while it is being judged." What it should cost once somebody has actually lived with the friend was never written down.
- /doomtransform stage N writes the same field the scheduler reads as "spurts already begun", so setting a stage to look at the horns cancels every spurt below it on that character permanently. Because that command is how the transformation gets tested, some share of what has been reported about spurt behaviour may belong to the tool rather than to the system.
- The Corebound subclass completes through a reflected call into ffrpg's DoomedClassBridge, and the command fallback sitting next to it refuses to act when the player already holds a class - which a #DR-01 graduate always does, because the ritual set "doomed" at the start of the run. Every failure on that path is caught and ignored on purpose. Whether the class completes cannot be answered from inside this repo.
PART II - CHEMISTRY
The Chemistry Engine
Doomed's chemistry is a datapack-driven production chain run by eight unit-operation machines plus the Reactor. A batch is not a black box that swallows items and spits out a product: the machine locks onto one recipe, meters its energy tick by tick, records the temperature it actually ran at and every time it stopped, and rolls the finished grade and volume from that history. Nothing you make is guaranteed to be as good as the recipe says it can be, and the machine will never tell you the true number - only a measured estimate with an error bar. This page covers how a batch runs, what heat does, how grade propagates down a chain, how equipment fouls, and every way a batch can be ruined.
The batch
A progress bar is the smallest part of it. When the loaded inputs match a recipe the machine opens a batch: it records that recipe's structural key and its index in the table, and stays committed to that recipe until the batch finishes or is cancelled. Progress, energy already spent, the running thermal average, the number of ticks spent below and above the operating band, the interruption count and whether an incident has happened all persist with the block.
Inputs stay where they are. They sit in the slots and the tank and are taken on the tick the batch completes. Nothing is committed until then, so a batch at zero progress can still be re-selected freely - load a better-matching recipe before the first tick of real work and the machine switches to it. The first working tick locks the recipe.
Energy is metered exactly. The recipe's total FE is divided across its ticks with a cumulative ceiling calculation, so the batch pays precisely the recipe's total by the time it completes, no more and no less, however many times it stopped and restarted. A tick whose fractional cost rounds to zero still requires the machine to hold at least 1 FE. An empty buffer always stalls.
Mining a machine keeps the batch. The loot table copies the items, both tanks, the energy, the side configuration, the equipment condition and the batch itself onto the dropped block.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Persistent batch fields | recipe key, recipe index, progress, energy spent, thermal ticks, heat total, below-band ticks, above-band ticks, interruptions, pause reason, starting quality, incident flag | ~/crafting/ActiveChemBatch.java:231-250 |
| Inputs consumed | only on the completion tick | ~/block/entity/ProcessMachineBlockEntity.java:560-608 |
| Re-selection window | while progress is still 0 | ~/block/entity/ProcessMachineBlockEntity.java:115 |
| Minimum energy to advance a tick | 1 FE even on a zero-cost tick | ~/block/entity/ProcessMachineBlockEntity.java:368 |
The equipment
Eight unit-operation machines share one block entity and one recipe table, filtered by machine type. Each has two input item slots, one output item slot, a 4,000 mB input tank, a 4,000 mB output tank and a 32,000 FE buffer that accepts up to 1,024 FE per tick. The Reactor is its own class: three input slots, a 64,000 FE buffer accepting 2,048 FE per tick, and a drug fluid as its only product. It has no item output slot at all.
The Drying Oven, the Kiln and the Recrystallizer show no fluid bars, since none of their recipes use fluid. They also never auto-pull a fluid, which keeps their input tanks clear of something they could never consume.
The input tank accepts only fluids some recipe for that machine consumes. The input slots take only items some recipe uses, reject the output slot entirely, and reject an ingredient already sitting in the other input slot. That last rule has a history. Forge fills the first slot to a full stack before touching the second, so a chest holding more than a stack of one ingredient used to load both slots with it and starve every two-ingredient recipe. The Recrystallizer, whose recipes are all two-ingredient, died outright.
Slot filtering compares item identity and ignores NBT. Every solid chemistry intermediate carries per-batch grade and contamination tags, so two lots of the same reagent from different batches are different stacks and will not merge in an inventory.
The heart of drug synthesis. Load reagents in the 3
slots and a precursor fluid; needs FE and heat (a
brazier/heater beside it). Runs the chain raw opium ->
opium -> morphine -> heroin, and precursor + catalyst
-> fentanyl / naloxone / ceftriaxone, out as a drug
fluid. Set faces to input/output. Volatile - fumes
while running; deep syntheses can detonate over a flame
or when overheating.
tooltip.doomedmatu.reactor
The three slots and the fluid-only output match the code. "A brazier/heater beside it" reads as either being fine, but the Reactor's band is fixed at 1 to 3, and a brazier alone puts it at the floor of that band.
All eight unit operations and the Reactor sit on the ordinary Doomed machine chassis and share its per-face routing and its auto push and pull, so the machines record covers how material actually gets into one of these and back out. Machines, Power and Fluids
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Unit-operation machines | DRYING_OVEN, KILN, SLAKING_VAT, FERMENTER, STILL, FILTER_PRESS, RECRYSTALLIZER, EVAPORATOR | ~/block/ProcessType.java:10-18 |
| Process machine tanks / buffer | 4,000 mB each, 32,000 FE, 1,024 FE/tick in | ~/block/entity/ProcessMachineBlockEntity.java:49-51 |
| Reactor buffer | 64,000 FE, 2,048 FE/tick in, 3 slots | ~/block/entity/ReactorBlockEntity.java:49-57 |
| Machines with no fluid bars | DRYING_OVEN, KILN, RECRYSTALLIZER | ~/block/ProcessType.java:25 |
| Same ingredient in both input slots | refused | ~/block/entity/ProcessMachineBlockEntity.java:664-689 |
Two lots of the same reagent do not stack, and a machine will not take both
Every solid chemistry intermediate carries per-batch grade and contamination NBT written when it was made, so two stacks of the same reagent from different batches are different item stacks and will not merge in your inventory. Separately, the input slots compare by item identity and refuse to put the same item in both slots, deliberately ignoring NBT - so you cannot work around a two-ingredient recipe by loading two different lots of one reagent.
Heat
Every server tick a machine reads the best heat source among its six face-adjacent blocks. Tier 1 is a lit Brazier or vanilla open heat - fire, lava, magma or a lit campfire. Tier 2 is one running RF Heater. Two running Heaters make tier 3. Three or more make tier 4, which is over-fired and sits above every recipe's safe ceiling.
Each recipe carries a heat_min and a heat_max. Below heat_min the recipe is skipped over entirely and the console reads NEEDS HEAT. Inside the band it runs. Above heat_max it also runs, and it is being damaged.
The band grades rather than gates. Heat quality runs from 0 at heat_min to 1 at heat_max, and everything short of the ceiling costs something. The bare minimum of the band is the worst legal place to run a batch.
Default bands by machine, used when a datapack row leaves them alone: Kiln 2 to 3, Still 1 to 2, Drying Oven 1 to 2, Evaporator 1 to 3, Recrystallizer 0 to 2, Fermenter 0 to 0, Slaking Vat and Filter Press 0 to 3. The Reactor is fixed at 1 to 3 in code and ignores the datapack fields.
The practical readings: a Kiln needs at least one RF Heater to run at all and two to run well. A Still, Drying Oven or Recrystallizer wants exactly one Heater. An Evaporator or a Reactor wants two. A Fermenter wants nothing at all - see below. A machine reports its heat tier to a comparator as 0, 4, 8, 12 or 15, so 12 is the back-off threshold and 15 alone means over-fired.
An RF heater. Feed it from a cable; while
powered it
glows and warms nearby players. A full buffer runs
~4.5 min. The charge rides the block when you mine it,
so carry it charged.
tooltip.doomedmatu.heater
The tooltip describes the Heater as a comfort block for players and says nothing about it being tier 2, the only way to reach the top of most bands. It also tells the player to feed it from a cable, and no cable block is registered anywhere in the mod - six other block tooltips say the same thing.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Tier 1 | lit Brazier, fire, lava, magma, lit campfire | ~/block/HeatSource.java:62-68 |
| Tier 2 / 3 / 4 | one / two / three or more running RF Heaters | ~/block/HeatSource.java:57-76 |
| Default heat_min | KILN 2; STILL, EVAPORATOR, DRYING_OVEN 1; everything else 0 | ~/crafting/ProcessRecipe.java:65-71 |
| Default heat_max | KILN and EVAPORATOR 3; STILL, DRYING_OVEN, RECRYSTALLIZER 2; FERMENTER 0; default 3 | ~/crafting/ProcessRecipe.java:73-80 |
| Reactor band | 1 to 3, hardcoded | ~/block/entity/ReactorBlockEntity.java:52-53 |
| Comparator mapping | tier 0/1/2/3/4 reads 0/4/8/12/15 | ~/block/HeatSource.java:41-49 |
| RF Heater draw | 12 FE/tick while lit, 64,000 FE buffer | ~/block/entity/PoweredClimateBlockEntity.java:26-28 |
Thermal cost
Grade is rolled at completion out of the whole batch rather than the temperature at the last tick. Four separate thermal penalties stack.
Heat quality below 1 costs up to 12 points of purity. That is the price of running at the bottom of the band rather than the top, and it lands even on a batch that never left the band.
Overshoot above heat_max costs 16 purity per whole tier above the ceiling, taken against the batch's average heat.
Time spent below the band costs up to 10 more purity, scaled by what fraction of the recipe's duration was spent cold. Time spent above the band costs up to 20, scaled the same way. Both fractions saturate against the recipe's total tick count.
On top of all of that, a random jitter of plus or minus 3 is added. The jitter is the only term that can push a number up, and it is small.
The Filter Press and the Slaking Vat are exempt. Their recipes are heat-insensitive, so the thermal terms are skipped entirely and they roll as though they ran perfectly in band.
The worked case that matters most is the Fermenter. Its band is 0 to 0, so heat quality reaches 1 only when the machine is genuinely cold. Put a lit brazier, a campfire or lava next to a Fermenter and every batch takes the 12-point band penalty, a 16-point overshoot penalty, and up to a further 20 for above-band residence. Roughly 48 points of purity off a nominal 100. The mash carries that number forward into the Still and then into every solvent made from it.
Item output counts are fixed. A recipe that makes two activated charcoal always makes two, and what varies on a solid is its grade rather than its amount.
Fluid yield varies, and only on the Fermenter, the Still and the Evaporator, or on any fluid recipe that declares a nominal purity. Everything else deposits its nominal millibucket figure exactly.
Where yield does vary it starts at a floor of 75 percent of nominal at the bottom of the heat band and ramps to 100 percent at the ceiling. Overshoot above the ceiling removes a further 22 percent per tier. Full-duration cold residence removes 30 percent, full-duration hot residence removes 40 percent, and each interruption removes 3 percent down to a floor of 65 percent. A jitter of plus or minus 5 percent is applied last.
The roll is capped at the nominal amount, which makes the machine's output-tank room check against nominal a safe upper bound. It has a floor as well: any recipe with a nominal output deposits at least 1 mB. A ruined batch leaves residue in the tank instead of eating its inputs for nothing.
Ferments organics in water (FE, no heat - too hot kills
the culture). Sugar/wheat/apple + water -> mash, and
grows antibiotic broth. Harmless CO2 only.
Set faces to input/output.
tooltip.doomedmatu.fermenter
The string warns, and the warning is the only warning there is. Heat does not kill the culture in code - the batch runs to completion and finishes about 48 points down, with no stall, no fire and nothing on the console.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Purity lost at the bottom of the band | 12 | ~/crafting/ChemConditions.java:293 |
| Purity lost per heat tier above the ceiling | 16 | ~/crafting/ChemConditions.java:301 |
| Purity lost to full-duration cold residence | 10 | ~/crafting/ChemConditions.java:360 |
| Purity lost to full-duration hot residence | 20 | ~/crafting/ChemConditions.java:361 |
| Random purity jitter | plus or minus 3 | ~/crafting/ChemConditions.java:295 |
| Heat-exempt machines | FILTER_PRESS, SLAKING_VAT | ~/crafting/ProcessRecipe.java:139-141 |
| Yield floor at minimum heat | 0.75 of nominal | ~/crafting/ChemConditions.java:297 |
| Yield lost per tier above the ceiling | 22 percent | ~/crafting/ChemConditions.java:303 |
| Cold / hot residence yield multipliers | down to 0.70 and 0.60 | ~/crafting/ChemConditions.java:376-377 |
| Interruption yield multiplier | 3 percent each, floored at 0.65 | ~/crafting/ChemConditions.java:378 |
| Yield jitter | plus or minus 5 percent | ~/crafting/ChemConditions.java:299 |
| Machines with variable fluid yield | FERMENTER, STILL, EVAPORATOR | ~/crafting/ProcessRecipe.java:131-133 |
| Minimum deposit | 1 mB | ~/crafting/ChemConditions.java:344 |
A Fermenter next to any heat is ruined, and it never says so
The Fermenter's operating band is 0 to 0. Heat quality is 1 only when the machine is genuinely cold, so a lit brazier, campfire, lava or magma on any of its six faces means every batch takes the full band penalty of 12, an overshoot penalty of 16, and up to 20 more for above-band residence - roughly 48 points off a nominal 100 - and yields about 35 percent of nominal volume. It does not stall, does not catch fire, and shows no warning, because the Fermenter's overheat-ignition flag is off. The bad mash then caps every Still and Evaporator step downstream of it.
Sitting at the bottom of a legal heat band still costs you 12 purity and 25 percent of your yield
Heat quality is a ramp from 0 at heat_min to 1 at heat_max, not a pass/fail check. A Recrystallizer with no heat source at all runs perfectly happily - its heat_min is 0 - and loses 12 purity and a quarter of its yield on every batch, because its ceiling is 2. A Kiln on one RF Heater runs but is at the floor of its 2-to-3 band. An Evaporator or Reactor on a single brazier is at the floor of a 1-to-3 band. Only reaching heat_max removes the penalty.
Grade
Every solid chemistry intermediate carries a 0-100 ChemicalGrade tag written when the machine made it. Every drug and process fluid carries a Purity tag on its FluidStack. Untagged legacy or raw material reads as 100, and it counts as an observed grade only once a chemistry machine stamps it.
When a batch starts, the machine reads the lowest observed grade among the inputs the recipe will actually consume - the input tank if the recipe takes a fluid, plus every graded item it will draw from. That is the charge quality. It is re-read freely while progress is 0, so topping the input tank up with purer material before work begins genuinely improves the batch. The first working tick latches it, and a same-recipe substitution afterwards can only lower it.
At completion the rolled grade is capped against the charge quality. A step may recover at most 20 percent of the gap between the charge and 100, and only up to that machine's own recovery allowance: 20 for the Recrystallizer, 12 for the Slaking Vat, 8 for the Filter Press, and 0 for everything else including the Reactor.
That cap is the single most important rule in the system. A dirty feedstock cannot be laundered clean. Recrystallizing 60 percent material returns at most 68, because 20 percent of the 40-point gap is 8. Recrystallizing 20 percent material returns at most 36. The same material through a Drying Oven or a Kiln comes out exactly as it went in, their recovery being zero.
One rolled grade is shared by every product of a batch. Hand-crafting preserves it too: the acetylating reagent and sodium lactate recipes take the lowest grade among their ingredients.
Two machines take a borosilicate flask: the Evaporator and the Reactor. Right-click either with a flask in hand and it is fitted, rather than the console opening.
The flask imposes a purity ceiling on every batch that machine finishes. Fresh glass at 100 condition allows a ceiling of 100. With no glass at all, or fully worn glass, the ceiling is 60 - street grade. Between those it scales linearly.
Condition drops by 4 per completed batch, so a flask lasts about 25 batches.
This is the most easily missed gate in the whole system, because it applies to everything those two machines make rather than to drugs alone. An Evaporator with no flask caps saline, Ringer's solution, iodine and even kelp salt at 60 percent, and that 60 then becomes the charge quality of the next step. The Reactor behaves the same: with an empty flask holder, a nominal 96 percent ceftriaxone recipe still finishes at 60.
The flask is cheap - eight glass around one quartz - and the console reports its condition. Nothing warns you when it runs out.
Crude cephalosporin, extracted from the mash.
Recrystallize it with solvent up to pharma grade.
tooltip.doomedmatu.cephalosporin_crude
"Up to pharma grade" is the recovery allowance read as a promise. The Recrystallizer's allowance is 20 points and the recovery is also capped at 20 percent of the gap to 100, so crude at 60 comes out at 68 at best.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Grade range | 0-100, untagged reads 100 | ~/crafting/ChemicalGrade.java:419-424 |
| Maximum recovery per step | 20 percent of the gap to 100 | ~/crafting/ChemConditions.java:389-393 |
| Recrystallizer allowance | 20 points | ~/block/entity/ProcessMachineBlockEntity.java:317-324 |
| Slaking Vat / Filter Press allowance | 12 / 8 points | ~/block/entity/ProcessMachineBlockEntity.java:317-324 |
| Reactor allowance | 0 | ~/block/entity/ReactorBlockEntity.java:173 |
| Charge quality latch | free while progress is 0, then minimum-only | ~/crafting/ActiveChemBatch.java:85-112 |
| Grade-preserving hand recipes | reagent_acetyl, sodium_lactate | res/data/doomedmatu/recipes/reagent_acetyl.json |
| Machines using glassware | EVAPORATOR and the Reactor | ~/block/entity/ProcessMachineBlockEntity.java:438-440 |
| Ceiling with no glass | 60 | ~/crafting/Glassware.java:15 |
| Condition lost per batch | 4, about 25 batches per flask | ~/crafting/Glassware.java:14 |
| Flask recipe | 8 glass around 1 quartz | res/data/doomedmatu/recipes/borosilicate_flask.json |
Purification can only ever recover 20 percent of the gap
The rolled output grade is capped at the charge quality plus a recovery, and that recovery is the smaller of the machine's allowance and 20 percent of the distance between the charge and 100. Recrystallizing 60 percent material gives at most 68. Recrystallizing 20 percent gives at most 36. Only three machines have any allowance at all - Recrystallizer 20, Slaking Vat 12, Filter Press 8 - and the Reactor has exactly zero, so a Reactor can never produce a drug better than its worst input.
An Evaporator or Reactor with no flask caps everything at 60
Glassware condition imposes a hard purity ceiling on those two machines - 100 with fresh glass, 60 with none. A flask wears 4 points per completed batch, so it lasts about 25 batches and then silently stops helping. This applies to every product, not only drugs: saline, Ringer's solution, iodine and kelp salt are all capped at 60 by a flaskless Evaporator, and that 60 becomes the charge quality of the next step.
You can improve a selected batch right up until its first working tick
Charge quality is re-read freely while progress is 0 and only latched once real work begins. A batch parked by a full output slot can sit at zero progress indefinitely, and topping the input tank up with purer material during that wait genuinely raises the grade the finished product will be measured against. After the first working tick, a substitution can only lower the charge quality, never raise it.
Stalls
Five stall states, shown on the console as text.
NEEDS HEAT means the heat tier fell below the recipe's minimum. NO POWER means the buffer cannot pay the next tick. OUTPUT BLOCKED means the output slot or tank has no room. BATCH INPUT LOST means an ingredient or the input fluid has gone missing. BATCH MISMATCH is a separate diagnosis: an attached tank has free room and the same fluid but refuses the incoming lot solely because its blendable purity or contamination record differs.
Every transition from running to stalled counts one interruption. Each interruption costs 2 purity, capped at 14 total, and 3 percent of yield down to a floor of 65 percent.
Stalls also continue to sample temperature. A batch left cold and unpowered, or hot with an ingredient missing, keeps accruing below-band and above-band residence exactly as if it were running. One stall is deliberately exempt: OUTPUT_BLOCKED samples heat not at all, because a full buffer on an automated line is a normal state and a Fermenter sitting next to a lit brazier would otherwise rot its own charge while waiting.
Deliberately emptying the recipe's inputs is the cancel gesture. Removing the last of an ingredient while the batch is paused resets the batch outright and loses its progress. Swapping one ingredient for another of the same kind only pauses it.
A recipe that vanishes from the table - a mod or datapack change - cancels the batch rather than bricking the machine, since nothing was reserved.
Compatible graded batches can carry different purity and contamination records. Most ordinary tanks treat those records as different fluid stacks. Route repeated chemistry output through a Batch Blending Barrel to average them by volume before storage.
jei.doomedmatu.fluid_barrel.info
BATCH MISMATCH is this paragraph as a failure state. The JEI page describes the tank behaviour; the console names the stall.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Purity lost per interruption | 2, capped at 14 | ~/crafting/ChemConditions.java:362 |
| Stall codes | 1 NEEDS HEAT, 2 NO POWER, 3 OUTPUT BLOCKED, 4 BATCH INPUT LOST, 6 BATCH MISMATCH | ~/client/screen/MachineScreen.java:1034-1039 |
| Stall that does not sample heat | OUTPUT_BLOCKED only | ~/block/entity/ProcessMachineBlockEntity.java:158-160 |
| Cancel gesture | clear the recipe's inputs while it is paused | ~/block/entity/ProcessMachineBlockEntity.java:145-147 |
Stalls keep damaging the batch, except one of them
A paused batch continues sampling temperature. Sitting cold with no power, or hot with an ingredient missing, accrues below-band and above-band residence exactly as if the batch were running, and those fractions saturate against the recipe's full duration within seconds. Every running-to-stalled transition also counts an interruption at 2 purity and 3 percent of yield. The single exemption is OUTPUT_BLOCKED, which samples nothing, because a full buffer on an automated line is normal and would otherwise rot the charge it is protecting.
BATCH MISMATCH is not the same as a full tank
When an attached tank has free room and already holds the same fluid, but refuses the incoming lot solely because its blendable purity or contamination record differs, the machine reports BATCH MISMATCH rather than OUTPUT BLOCKED. Forge tanks treat purity NBT as fluid identity, so two otherwise identical lots at 71 and 72 percent deadlock the line. The fix is to route output through a Batch Blending Barrel, which volume-averages the records. Full tanks, filtered tanks, different fluids and different solution compositions are not misdiagnosed as this.
Incidents
A running machine rolls a hazard check every 10 ticks. The chances are per half-second of exposure rather than per batch.
A flammable step carries a base 0.1 percent chance per roll. An adjacent open flame - a lit brazier, fire, lava, magma or a lit campfire - adds 0.4 percent. Overheating past heat_max adds 0.8 percent. A non-flammable step that is overheating carries 0.15 percent on its own. Across a 30-second run those work out at roughly 6, 26 and 42 percent respectively. An ignition places fire on top of the machine, and a step that is both flammable and overheating adds a small flash blast as well.
The Reactor's high-pressure reactions are treated as violent. A reaction with a pressure rating of 2 or higher, run over an open flame or while overheating, rolls a full detonation at 0.4 percent per roll for the flame and 0.8 percent for the overheat. The blast has a 4-block radius, leaves terrain intact, and applies real wounds and knockback to you through the body sim's explosion path. The two fentanyl routes and the two naloxone routes are the shipped reactions that qualify.
A separate equipment-risk roll covers vessel compatibility and sealed pressure. Chance is the pressure rating times 0.035 percent plus the compatibility excess times 0.075 percent per roll. If either is 2 or more the result is a blast rather than a fire.
Only one incident per batch is possible. It is more than cosmetic: an incident adds four interruption-equivalents, which is 8 purity and roughly 12 percent of yield, whether or not the fire gets put out.
The controlled RF Heater is not an open flame. Using it in place of a brazier removes the largest single ignition term for a Still, an Evaporator or a Reactor.
Pharma-grade fentanyl precursor, dried from the pure intermediate.
React it with catalyst in the Reactor for clean fentanyl.
That synthesis is violent - keep open flame away and don't
overheat the vessel, or it can detonate.
tooltip.doomedmatu.fentanyl_precursor_pure
This is one of the four pressure-2 rows. The string is accurate and gives no rate; the rate is 0.4 percent per roll for the flame and 0.8 percent for the overheat, rolled every 10 ticks for the length of the batch.
A Reactor detonation runs the sim's ordinary explosion path rather than a chemistry-specific one, so it sets shock to 100 outright and zeroes consciousness on a head hit - the pain and consciousness record is where the rest of that lands. Pain, Consciousness and Death
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Roll interval | every 10 ticks | ~/block/ChemHazards.java:24 |
| Ignition chance per roll | 0.1 percent base, +0.4 open flame, +0.8 overheating | ~/block/ChemHazards.java:28-30 |
| Non-flammable overheat chance | 0.15 percent per roll | ~/block/ChemHazards.java:31 |
| Violent blast chance | 0.4 percent open flame, 0.8 percent overheating | ~/block/ChemHazards.java:32-33 |
| Blast radius | 4.0 blocks, no block destruction | ~/block/ChemHazards.java:34 |
| Incident penalty | 4 interruptions: -8 purity, -12 percent yield | ~/crafting/ActiveChemBatch.java:73-78 |
| Violent reactor rows | pressure 2: both fentanyl routes, both naloxone routes | res/data/doomedmatu/doomed_chemistry/shipped_processes.json |
A fire or blast costs you the batch even if you contain it
An incident is recorded once per batch and adds four interruption-equivalents on top of whatever the fire did to the world - 8 purity and about 12 percent of yield. Scorched or vented material is a worse batch whether or not you put the fire out. The Reactor's pressure-2 reactions - both fentanyl routes and both naloxone routes - can detonate outright when run over an open flame or while overheating, with a 4-block wounding blast that leaves terrain intact.
Fumes
A running machine emits fumes at a potency set by the recipe or, where the recipe stays silent, by the machine. The Kiln and the Still are worst at 3. The Slaking Vat and the Evaporator sit at 2. The Drying Oven and the Recrystallizer are 1. The Fermenter and the Filter Press emit nothing.
Exposure is scanned every 10 ticks in a 3-block cube around each player. Every running machine within that cube contributes its potency scaled down by distance, and the contributions add up to a bounded ceiling of 5. Solid blocks and bulk liquids block the line entirely, so a wall between you and the machine works.
Open sky halves the concentration. A lit Fume Hood in the same connected airspace cuts it to 12 percent, which is the difference between a workable indoor lab and a room that will kill you. The hood is an RF block drawing 12 FE per tick while lit.
Unprotected, a cloud accrues 0.8 sickness per second per unit of cloud. At 1.5 or above you get movement slowdown, and without safety glasses or a gas mask a dark haze over your vision. At 2.0 or above you get nausea, and the excess above 2.0 starts doing real muscle damage to the thorax at 0.025 per second per unit.
Respiratory protection reduces what reaches the airway and spends filter life doing it. A pack can switch the whole hazard off through the chemFumes config.
An RF ventilation hood. Feed it from a cable; while
powered it vents the acrid fumes from nearby chemistry
machines, so you can work indoors without a mask.
Makes no power of its own.
tooltip.doomedmatu.fume_hood
Two gaps in four lines. The hood multiplies the cloud by 0.12 rather than clearing it, so a Kiln and a Still in the same room can still reach the slowdown threshold. And the cable it tells the player to feed it from does not exist in the mod.
Past a breathed cloud of 2.0 the handler reaches into the thorax and subtracts from its muscle health directly, so chemical injury to the chest is stored, projected and healed as an ordinary limb injury - the injuries and treatment record carries it from there. Injury and Treatment
Fouling
Machines remember what they have made. Four numbers persist between batches and across saves.
Residue climbs by 9 per completed batch plus a third of the recipe's fume potency in tenths, so a fume-3 process adds 19 each time. Residue caps at 100.
Microbial load climbs by 16 for a Fermenter batch, 3 for any other wet batch, and 1 for a dry one.
Sterility is pushed down to at most 55 by a wet batch and at most 75 by a dry one.
Calibration drops by 1 per batch, and a drift value random-walks by up to plus or minus 0.35 each time, bounded at plus or minus 12.
These feed straight back into the product. Chemical carryover on the output is the greater of the input's own chemical contamination and 35 percent of the machine's residue, plus 15 per point of vessel compatibility excess. Microbial carryover is the greater of the input's microbial load and 45 percent of the machine's. An injectable product with sterility below 90 has its microbial carryover additionally floored at half the sterility deficit.
Maintenance is done from the console and revalidated server-side. Rinsing consumes one water bucket, clears residue to 0, removes 30 microbial and pushes sterility down to at most 45. Rinsing is washing, and washing makes the sterility reading worse. Sterilizing consumes one bleach and requires residue at 5 or below; on a dirty vessel it fails silently, with no sound and no message. Calibrating costs 750 FE and resets calibration to 100 with near-zero drift. All three refuse to run once a batch is past progress 0.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Residue per batch | 9 plus fume tenths / 3 | ~/crafting/ChemistryEquipmentState.java:87 |
| Microbial per batch | 16 biological / 3 wet / 1 dry | ~/crafting/ChemistryEquipmentState.java:90 |
| Sterility ceiling after a batch | 55 wet, 75 dry | ~/crafting/ChemistryEquipmentState.java:88-89 |
| Chemical carryover | max(input, 35 percent of residue) plus 15 per compatibility point | ~/crafting/ChemistryEquipmentState.java:74-76 |
| Microbial carryover | max(input, 45 percent of machine load); invasive product floors at (90 - sterility) / 2 | ~/crafting/ChemistryEquipmentState.java:78-82 |
| Rinse | 1 water bucket; residue 0, microbial -30, sterility down to 45 | ~/crafting/ChemistryEquipmentState.java:97-106 |
| Sterilize | 1 bleach; requires residue 5 or below | ~/crafting/ChemistryEquipmentState.java:109-119 |
| Calibrate | 750 FE | ~/network/C2SChemistryActionPacket.java:107 |
Rinsing makes the sterility reading worse, and sterilizing a dirty vessel fails silently
Rinsing with a water bucket clears residue to 0 and removes 30 microbial load, but it also pushes sterility down to at most 45 - water is not sterilization. Bleach sterilization then requires residue at 5 or below, so the order is forced: rinse first, then bleach. Attempting to sterilize a residue-fouled vessel returns false with no sound, no message and no consumed bleach.
FRAGMENT 11-C - FIELD JOURNAL, ENTRY "CLEAR"
SUMMARY: A four-page entry the character writes for himself, one page at a time, as he works out that a clean vessel and a safe vessel are different objects. Page one unlocks the first time a rinse takes a heavily fouled vessel down and the sterility reading still sits under 90. Page two unlocks only if he has already written page one and then tries to bleach a vessel with residue still in it - the attempt fails, no bleach is consumed, and the console records "Sterilize blocked: rinse first".
RESPONSE: Page two, in full at the end: "I nearly used the vessel anyway. It had been heated. I had done the serious-looking part. That should have counted for something. It doesn't. Dirt first. Then heat. Sterilizing something filthy only makes hot filth." Page three, written after a successful bleach, notes that the glass looks exactly as it did after rinsing and that he has marked the sterile equipment separately.
FINAL NOTE: Page four is the hot injection site, and it requires page three, which requires page two, which requires page one. Someone who never works out the rinse-then-bleach order can seed an infected puncture with a filthy needle as often as he likes and will never be handed the page explaining what happened. The entry teaches the lesson only to a player who has already learned it.
res/data/doomedmatu/doomed_journal_entries/clear.json, gated by C2SChemistryActionPacket.rinse/sterilize and FieldJournalObservationTracker.observeDirtyInjection
The assay
The machine console never displays the real grade of what it made. Data slot 17 returns -1 permanently, by design - quality is disclosed by a consumed sample rather than by omniscient telemetry.
Pressing ASSAY destroys 10 mB of the output fluid, or one item from the output slot where there is no fluid, and produces an estimate with an error bar.
The reported purity is the true value plus the machine's calibration drift plus a random offset within the uncertainty band. Purity uncertainty is 14, minus 0.55 per point of Intelligence, plus a tenth of the calibration deficit, clamped to between 2 and 22. Contamination uncertainty is 20, minus 0.65 per Intelligence point, plus an eighth of the calibration deficit, clamped between 3 and 30.
Calibration drift is a bias, not noise. A drifted instrument reports consistently high or low by up to 12 points, and nothing on screen distinguishes that from the real number. Calibrating fixes the instrument. It never touches the reaction.
The reading is stamped onto whatever remains in the output, so an assayed item carries its estimate in its tooltip after it leaves the machine. Any change to the sampled material voids it: completing another batch into the same output slot, or blending a new lot into a tank, clears the assay. An item with a grade tag but no assay shows "Assay: untested".
Chemistry trains Intelligence, which is what narrows the interval. Hand-crafting a tagged reagent awards a base of 8, a machine synthesis awards 12 to the nearest player within 8 blocks, and each repeat of the same product yields 82 percent of the last, floored at 8 percent of base.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Assay sample cost | 10 mB of output fluid, or 1 output item | ~/crafting/ChemistryEquipment.java:31 |
| Purity uncertainty | clamp(14 - 0.55 x INT + (100 - calibration)/10, 2, 22) | ~/crafting/ChemistryEquipmentState.java:131 |
| Contamination uncertainty | clamp(20 - 0.65 x INT + (100 - calibration)/8, 3, 30) | ~/crafting/ChemistryEquipmentState.java:132 |
| Calibration drift range | plus or minus 12, applied as a bias | ~/crafting/ChemistryEquipmentState.java:92 |
| True grade in telemetry | never sent, slot 17 returns -1 | ~/block/entity/ProcessMachineBlockEntity.java:765 |
| Chemistry XP | 8 hand-craft, 12 synthesis, x0.82 per repeat, floored at 8 percent | ~/crafting/ChemXp.java:323-326 |
| Synthesis XP reach | 8 blocks, nearest player | ~/crafting/ChemXp.java:327 |
The console will never tell you the true grade
The machine's telemetry slot for output quality returns -1 permanently and deliberately. The only way to learn a batch's grade is to press ASSAY, which destroys 10 mB of fluid or one item and returns an estimate. The estimate is the true value plus the instrument's calibration drift plus random noise inside an uncertainty band. Drift is a bias of up to 12 points in one direction, so a drifted instrument reports consistently wrong and nothing on screen distinguishes that from the real number. Calibration decays by 1 per batch.
FRAGMENT 12-A - CONSOLE TELEMETRY, SLOT 17
SUMMARY: A machine console publishes a block of numbered readings to the screen - energy, tank levels, heat tier, progress, stall code, residue, sterility, calibration. Slot 17 is where the finished batch's quality would go. It returns -1 on every read, on every chemistry machine, permanently, with a line of justification sitting beside it in the code.
RESPONSE: The line reads: "output quality is disclosed by a consumed assay, never omniscient telemetry". Until you spend a sample, the product's own tooltip says "Assay: untested (sample it in the machine console)" and nothing else.
FINAL NOTE: What you get for the sample is the true value plus the instrument's calibration drift plus noise inside a stated band. Drift is a bias of up to 12 points held in one direction until somebody spends 750 FE, and a drifted reading and an honest one are rendered in identical text. The uncertainty is printed. The bias is not.
ProcessMachineBlockEntity data slot 17, ChemTooltips.onTooltip, ChemistryEquipmentState.assay
In the body
Purity is not a score. It is the active fraction of what you inject. A 100 mL dose at 40 percent grade delivers 40 mL of actual drug effect, and the dose calculation multiplies volume by purity before anything else touches it.
Separately, the impurity itself hurts. A dirty dose adds sickness at 0.4 per mL scaled by how impure it is, applied once per injection rather than once per component of a mix. It can also fester the injection site: the infection seed is up to 25, scaled by the impurity fraction and by how much of a full 100 mL syringe you actually pushed.
Microbial load is tracked separately from purity and does something different. Every injection creates a real puncture wound, and the process contamination is written onto that exact wound rather than onto a generic limb value. Wound contamination is 2 plus a quarter of the chemical carryover plus three quarters of the microbial load, both scaled by delivered volume. Where microbial load is present the wound also gets an infection seed of up to 35.
For a mixed solution the effective purity is the volume-weighted mean of its components, and each component's own purity scales its own effect.
This is what makes street chemistry emergent rather than flagged. A batch made in a fouled Fermenter, run over a brazier, stalled twice and drawn through an unsterilised vessel is a weaker drug that also makes you sick and infects the hole it went in through. No tag anywhere says "impure".
A dirty street opioid in a syringe.
Inject into a limb (drag onto it): powerful pain relief,
but it leaves you sick. Addictive.
tooltip.doomedmatu.heroin
The tooltip is fixed text on the item, so every syringe of it reads "dirty". The sickness is rolled from the batch, so two syringes with the same tooltip can hurt you by different amounts.
Grade is applied before the drug model ever sees the dose: the injected millilitres are multiplied by purity and by the syringe's carrier fraction first, so everything the pharmacology record describes about the depot, reception and the overdose line is running on that reduced number. Drugs and Pharmacology
The puncture's infection seed is written only while the infection switch is on, so a server running with infection disabled leaves microbial load doing nothing beyond the contamination figure stamped on the wound. Disease and Infection
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Delivered effect | mL x purity / 100 x carrier fraction | ~/body/DrugService.java:170 |
| Impurity sickness | 0.4 per mL, scaled by (100 - purity) / 100 | ~/body/DrugService.java:101-103 |
| Impurity infection seed | up to 25 | ~/body/DrugService.java:104 |
| Puncture contamination | 2 + 0.25 x chemical x volume + 0.75 x microbial x volume | ~/body/DrugService.java:509 |
| Puncture infection seed | microbial x volume x 0.35, capped at 35 | ~/body/DrugService.java:516 |
| Factory syringes | always read as 100 percent pure | ~/body/DrugService.java:445-450 |
The table
All 68 shipped operations live in one datapack file, data/doomedmatu/doomed_chemistry/shipped_processes.json - 58 unit operations and 10 Reactor reactions. The breakdown is 16 Evaporator, 11 Recrystallizer, 10 Reactor, 8 Kiln, 7 Fermenter, 6 Drying Oven, 4 Still, 3 Slaking Vat and 3 Filter Press.
Rows are validated on load and rejected individually, so one malformed row loses that row and logs it rather than deleting the table. Bounds are enforced: ticks 1 to 72,000, FE 0 to 1,000,000, fluid amounts 0 to 4,000 mB, item counts 1 to 64, heat 0 to 3, fume 0 to 4, corrosive and pressure 0 to 3. A unit-operation row with more than one output item is refused outright, since those machines have a single output slot and the second product would silently vanish.
When two recipes for the same machine match what is loaded, the most specific wins - the one asking for the most item ingredients. Ties keep file order. This is more than cosmetic: the industrial iodine batch on the Evaporator sat behind an item-free solvent row on the same fluid and could never fire once, so loading kelp and bottles into an evaporator produced reagent solvent instead.
Selection deliberately ignores whether the output has room. A full output slot is a reason to stall, not a reason to run something else.
With the opioidsEnabled server setting off, 20 of the 68 rows disappear from the machines and from JEI and EMI, and the filter then repeatedly drops any surviving row whose ingredient nothing left can produce. The naloxone chain is the live case - its first step is raw opium.
Dried poppy latex - the base of the opioid line.
Dissolve it into opium fluid (Reactor or Evaporator),
or recrystallize it with acid to start the naloxone branch.
tooltip.doomedmatu.raw_opium
This item is the reason the naloxone chain is the live case for the opioid switch. With opioidsEnabled off, the rows this tooltip points at are among the 20 removed, and the naloxone branch goes with them.
The two accessors the machines read are the same ones feeding the JEI and EMI sync packet, so a recipe book on a server with opioids switched off is showing the shortened table the machine is actually running - the routes record walks what survives. Reagents and Routes
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Shipped table | 68 rows: 58 unit operations, 10 reactor | res/data/doomedmatu/doomed_chemistry/shipped_processes.json |
| Row counts by machine | EVAPORATOR 16, RECRYSTALLIZER 11, REACTOR 10, KILN 8, FERMENTER 7, DRYING_OVEN 6, STILL 4, SLAKING_VAT 3, FILTER_PRESS 3 | res/data/doomedmatu/doomed_chemistry/shipped_processes.json |
| Validated bounds | ticks 1-72,000; fe 0-1,000,000; mB 0-4,000; heat 0-3; fume 0-4 | ~/crafting/ChemistryProcessManager.java:343-351 |
| Selection rule | most item requirements wins, ties keep file order | ~/block/entity/ProcessMachineBlockEntity.java:242-254 |
| Rows removed by the opioid switch | 20 of 68, plus orphaned dependents | ~/crafting/ChemistryProcessManager.java:153-213 |
FRAGMENT 13-B - LOAD LOG, REJECTED ROW
SUMMARY: The chemistry table is revalidated on every world load and every datapack reload, row by row, and the survivors are counted out loud: "Loaded 58 unit-operation and 10 reactor chemistry recipes". A row that fails validation is dropped by itself and named in the log with its index and its file.
RESPONSE: A representative refusal, thrown while parsing: "output_items has 2 entries but a RECRYSTALLIZER has one output slot - only the first would ever be produced". The machine has one output slot and the tick loop only ever writes the first product, so the second would have vanished on every batch forever without anybody being told.
FINAL NOTE: The per-row catch used to sit outside the loop, at file scope. One typo anywhere in shipped_processes.json therefore threw away all 68 recipes at once and left eight machines and a Reactor with nothing at all to make - a mod that boots clean and appears to have no chemistry in it.
ChemistryProcessManager.apply and ChemistryProcessManager.parseProcess
Notes
- Every completed batch writes a residue signature onto the machine - the exact recipe key that last fouled the vessel - and saves it to NBT. Nothing reads it back. Whether it was laid down for cross-product carryover, so that a Kiln caked in roasted sulfur would poison the next lot of refined salt, or whether it was only ever a debugging field, is not written down anywhere in the source.
- Vessel compatibility is live code that no shipped recipe reaches. A row incurs it only when its corrosive rating exceeds the machine's corrosion resistance, or when its sealed pressure exceeds the machine's pressure rating, and across all 68 shipped rows neither happens once. The 15-points-per-excess contamination surcharge and the compatibility branch of the rupture roll are datapack-only in practice. No record says whether the resistance table was tuned until shipped content came out clean, or whether the content simply predates the table.
- The heat comparator reports a tier, not a position in the band. Back off at 12, over-fired at 15 holds only for the machines whose ceiling is tier 3. A Still or a Drying Oven has already passed its ceiling at 12. A Fermenter passed its at 4. Whether an automation was ever meant to compare the signal against each machine's own band was never settled in the source.
- The build spec and the shipped code disagree about glassware. reference/CHEMISTRY_REALISM_SPEC.md asks for a machine upgrade slot, a crude ceiling near 75, and lab glass that also lowers the hazard rate. What shipped is a flask fitted by right-click, a crude ceiling of 60, and a condition value that feeds the purity ceiling and touches no hazard roll at all. Which of the two ceilings was the intended difficulty is not recorded.
- None of the penalty stack has been measured in play. The hazard rates carry a comment saying the previous values compounded to roughly 60-100 percent incidents across an ordinary 30-second run, and the replacements were derived by arithmetic from that; the arithmetic is in the file, a measurement is not. The seven chemistry gametests exercise the state objects only - legacy load, rinsing, sterilization, tank blending, contamination tags, datapack sourcing. None of them places a machine and runs a batch, so nothing automated has ever checked a heat penalty or the incident cost.
Reagents and Routes
Chemistry in Doomed is a chain of small, dumb machines. Each one performs a single physical operation - dry, roast, slake, ferment, distil, press, recrystallize, boil down - and the Reactor sits at the end of the ladder holding the reactions that actually make an injectable drug. Every batch carries a hidden 0-100 quality number that is rolled from how the machine was run, and that number decides how much of the dose is real drug and how much is dirt that sickens you and festers the injection site. Nothing in the interface shows you that number until you spend part of the batch sampling it.
Two tables
All chemistry recipes live in a single server datapack file rather than the normal recipe folder, and they split into two tables. Rows whose machine is anything other than REACTOR are unit operations, run by the eight process machines. Rows whose machine is REACTOR belong to the Reactor alone. Sixty-eight rows ship.
A process machine has two input item slots, one output item slot, an input fluid tank, an output fluid tank and an RF buffer. The Drying Oven, Kiln and Recrystallizer show no fluid bars at all - their recipes run solid to solid, and the reagent they consume is an item. The Reactor has three reagent slots and both tanks. Both tanks hold 4,000 mB.
A machine picks its recipe from what was loaded, ranked by how many ingredients the row asks for. The most specific row wins, and ties keep file order. Output space is deliberately left out of that decision: a full output slot stalls the machine rather than pushing it toward a different product. It used to push. That is how kelp and bottles loaded into an Evaporator came out as solvent instead of iodine.
One ingredient never occupies both input slots. Two slots mean two ingredient roles, so a Recrystallizer fed a double stack of one reagent out of a chest keeps every two-ingredient row it owns.
The heart of drug synthesis. Load reagents in the 3
slots and a precursor fluid; needs FE and heat (a
brazier/heater beside it). Runs the chain raw opium ->
opium -> morphine -> heroin, and precursor + catalyst
-> fentanyl / naloxone / ceftriaxone, out as a drug
fluid. Set faces to input/output. Volatile - fumes
while running; deep syntheses can detonate over a flame
or when overheating.
tooltip.doomedmatu.reactor
The three slots and the precursor fluid are the whole Reactor interface; the eight process machines take two item slots instead.
Heat
A machine reads the best heat source among its six face-adjacent blocks. A lit Brazier, fire, lava, magma or a lit campfire is tier 1. One running RF Heater is tier 2. Two adjacent running Heaters make tier 3. Three or more make tier 4, which is over-fired and above every recipe's safe ceiling.
Each machine type carries a required minimum and a safe ceiling. The Kiln needs tier 2, so a brazier will never light one - the single most common reason a Kiln sits idle reading NEEDS HEAT. The Still, Evaporator and Drying Oven need tier 1. The rest need none.
The ceiling is where it gets expensive. Quality is rolled against how far into the band the machine actually sat, averaged over the whole batch. The bare minimum costs 12 points of grade and a quarter of the fluid yield. The ceiling costs nothing. So the Evaporator and the Kiln want exactly two Heaters, while the Drying Oven, Still and Recrystallizer want exactly one, their ceiling being tier 2 and a second Heater pushing them over it.
The Fermenter is the trap. Its safe ceiling is tier 0, so any heat at all beside a Fermenter sits above band, costing grade and mash. Put the braziers somewhere else.
The Recrystallizer is the other trap, running the opposite way. It runs with no heat, and heat still drives its quality roll: at tier 0 the roll starts 12 points down. A Recrystallizer with no Heater beside it quietly makes worse crystal than one with a Heater beside it.
The Filter Press and Slaking Vat ignore heat entirely for quality purposes.
Every row carries a total FE cost and a tick count, and the machine spends the FE evenly across those ticks. The heaviest single row is the Kiln turning catalyst ore into clinker at 4,000 FE over 300 ticks, which works out to 13.3 FE per tick. The Fermenter rows are the cheapest at about 1 FE per tick.
The mod ships exactly one generator. The Fuel Generator burns ordinary furnace fuel at a flat 20 FE per tick, which covers any single chemistry machine with room to spare and falls short of two heavy ones. A Heater draws 12 FE per tick while lit, so a Kiln plus its two Heaters is already 37 FE per tick.
A batch remembers its own history. Time spent below the band, time spent above it, and every stop-start transition subtract from the finished grade, and the arithmetic only ever runs the one way. Each interruption costs 2 grade points up to a cap of 14, and 3 percent of fluid yield down to a floor of 65 percent. A fire or a rupture during the batch counts as four interruptions at once.
A batch that has yet to tick once is committed to nothing. Reservation happens at the completion tick, so a machine parked on OUTPUT BLOCKED loses nothing, and topping up its input tank with cleaner material while it waits actually improves the finished product. A stalled full output is specifically excluded from the thermal sampling for that reason - a backed-up automation line will not rot the charge it is holding.
Purifies crude solids with a solvent reagent (FE, no
heat, no tanks). Recrystallises crude morphine, heroin
and precursors, and catalyst, to a cleaner grade.
Set faces to input/output.
tooltip.doomedmatu.recrystallizer
The string says no heat, and the machine does run cold. Heat still drives the quality roll, so tier 0 starts that roll 12 points down.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Heat tier sources | 1 open flame, 2 one Heater, 3 two Heaters, 4 three or more | ~/block/HeatSource.java tierAt() |
| Minimum tier to run | Kiln 2; Still, Evaporator, Drying Oven 1; all others 0; Reactor 1 | ~/crafting/ProcessRecipe.java:309 |
| Safe ceiling | Kiln and Evaporator 3; Still, Drying Oven, Recrystallizer 2; Fermenter 0; Slaking Vat and Filter Press 3; Reactor 3 | ~/crafting/ProcessRecipe.java:317 |
| Grade lost at minimum heat | 12 points, plus 16 more per tier above the ceiling | ~/crafting/ChemConditions.java:18,26 |
| Fluid yield floor at minimum heat | 75 percent of nominal | ~/crafting/ChemConditions.java:22 |
| Comparator readout | tier 3 reads 12, tier 4 reads 15 | ~/block/HeatSource.java comparatorSignal() |
| Fuel Generator output | 20 FE per tick | ~/block/entity/FuelGeneratorBlockEntity.java:47 |
| Heater draw while lit | 12 FE per tick | ~/block/entity/PoweredClimateBlockEntity.java:28 |
| Heaviest chemistry row | 13.3 FE per tick (Kiln, catalyst clinker) | shipped_processes.json, KILN raw_catalyst_ore row |
| Longest row | 640 ticks (Reactor, fentanyl from pure precursor) | shipped_processes.json, REACTOR fentanyl_precursor_pure row |
| Interruption penalty | 2 grade each, capped at 14; yield floor 65 percent | ~/crafting/ChemConditions.java:87,103 |
| Fire or rupture cost | counts as 4 interruptions | ~/crafting/ActiveChemBatch.java:77 |
The Fermenter's safe heat ceiling is zero
Every other machine has a heat band you want to sit inside. The Fermenter's ceiling is tier 0, so any adjacent heat source - a lit brazier, a campfire, lava, a running Heater - puts it above band for the whole batch, costing grade and up to 40 percent of the mash yield. Its quality roll is not exempted the way the Filter Press and Slaking Vat are.
The Recrystallizer wants heat it does not require
The Recrystallizer's minimum heat is 0, so it runs happily with nothing beside it. Its safe ceiling is 2, and heat still drives its quality roll, so running it cold starts the roll 12 points down. Exactly one RF Heater adjacent puts it at tier 2 and removes the penalty; a second Heater pushes it to tier 3 and costs 16 points instead.
The five reagents
Everything downstream runs on five generic reagents. All five are earned.
Base reagent is slaked lime. Craft calcite into limestone, kiln the limestone into quicklime, then slake the quicklime with 500 mB of water in the Slaking Vat for two base reagent. Boiling 500 mB of waste filtrate down in the Evaporator gives one, which is how the press waste from the morphine and antibiotic lines gets recycled.
Solvent comes off the alcohol chain. Ferment sugar, wheat, apples, sweet berries or cyst gall berries with water into mash, distil 1,000 mB of mash into 300 mB of ethanol in the Still, then boil 300 mB of ethanol down in the Evaporator for two solvent. Sugar is the best feedstock: two sugar and 1,000 mB of water gives a full 1,000 mB of mash in 400 ticks, where three wheat gives 800 mB in 600 ticks.
Acid reagent has a mineral route and a bio route, and the mineral route is worth twice as much. Two gunpowder crafts into two sulfur lumps; kiln a lump into roasted sulfur, kiln that into sulfur trioxide, slake the trioxide with 500 mB of water into 300 mB of acid liquor, then boil the liquor down for two acid reagent. The bio route ferments 300 mB of ethanol into 300 mB of vinegar in an unsealed Fermenter and boils that down for one acid reagent.
Acetylating reagent is a bench craft: one acid reagent plus one solvent. It uses the grade-carrying shapeless recipe type, so it inherits the lowest grade of the two ingredients rather than resetting to perfect.
Catalyst is the gate on the two hardest syntheses. Three amethyst shards craft into raw catalyst ore, the Kiln fires it into catalyst clinker at 4,000 FE, and the Recrystallizer dissolves the clinker in solvent into reaction catalyst. Fentanyl and naloxone will not run without it.
Salt starts in the sea. One dried kelp boiled with 1,000 mB of water in the Evaporator gives two crude salt. Two crude salt recrystallized with solvent gives two refined salt. Kilning refined salt gives electrolyte salts.
Saline is refined salt boiled with 900 mB of water into 1,000 mB of saline. The choice of water decides the grade outright: distilled water stamps the batch at 95, ordinary water stamps it at 70. Distilling costs 1,000 mB of water and 700 FE for 900 mB of distilled water in the Still, and it is worth doing for anything headed into a vein.
Ringer's solution takes two dry components. Kiln bone meal into mineral supplement, craft sodium lactate from two sugar plus a base reagent, then recrystallize the supplement with the lactate into Ringer's salts. Evaporate electrolyte salts plus Ringer's salts with 900 mB of water into 1,000 mB of Ringer's solution - again 95 on distilled water, 70 on plain.
One unrelated route lives on the same machine. Two dried kelp blocks, four glass bottles and 300 mB of ethanol in the Evaporator produce four iodine, against the bench recipe's one iodine per kelp block and bottle. Iodine is the long-window topical disinfectant.
A rare catalyst reagent.
The hardest full syntheses - fentanyl and naloxone -
won't run without it. Refined from catalyst clinker.
tooltip.doomedmatu.reagent_catalyst
Saline and Ringer's carry their stamped grade as an active fraction, so a 100 mL syringe off the plain-water row adds 0.07 L of blood volume where the distilled-water row adds 0.095 L, and the distillation step pays for itself in the vein rather than on the recipe card. Blood and Circulation
Turning opioids off deletes the naloxone chain too
The opioid kill-switch filters the recipe tables at the accessor rather than at load, then runs a fixpoint pass that repeatedly drops any row whose ingredients nothing can produce any more. Naloxone's first step consumes raw opium, so with opioids off the whole four-step naloxone synthesis vanishes from the machines and from JEI and EMI along with it. Naloxone still appears in loot; you simply cannot make it. Surviving poppies also keep growing but stop dropping anything.
Antibiotics
Ceftriaxone has the longest legitimate chain in the mod, with two entry points. Above ground, an antibiotic culture crafts from rotten flesh, a brown mushroom and sugar. In the cyst biome, spore caps come off spore blooms, and three of them dried in the Drying Oven make one culture - that is the reason a trip down there is worth the lungs it costs, and it is the only antibiotic source free of a mob farm.
From the culture: ferment it with 500 mB of distilled water into 500 mB of ferment broth, press the broth into ceftriaxone mash plus 400 mB of waste filtrate, run the mash with solvent through the Still into crude cephalosporin, recrystallize that with solvent into pure cephalosporin, and finish it in the Reactor with an acetylating reagent. That last step stamps 96, the highest nominal grade of anything in the mod.
There is a one-step shortcut. Antibiotic culture plus solvent straight into the Reactor gives ceftriaxone at 75 for 5,000 FE and 600 ticks. It skips five machines and costs 21 points of grade.
The antibiotic pill is a separate, cruder thing: culture plus sugar plus paper on a bench. The antiviral costs two cultures plus glow berries plus paper, deliberately dearer, because antibiotics do nothing to Rot Lung.
A cultured mould broth.
Ferment it in sterile water, or take the Reactor shortcut
with solvent - the source of the ceftriaxone line.
tooltip.doomedmatu.antibiotic_culture
Both routes named here are real. The shortcut stamps 75 where the full chain stamps 96.
Injected ceftriaxone sets the antibiotic timer and disinfects the limb it entered for 180 seconds, and nothing on this line reaches a virus: Rot Lung wants the antiviral, whose recipe costs two cultures for that reason. Disease and Infection
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Cave culture route | 3 spore caps -> 1 antibiotic culture, 400 FE, 160 ticks | shipped_processes.json, DRYING_OVEN spore_cap row |
| Spore cap drop | 1-2 per spore bloom, Fortune applies; shears keep the plant instead | res/data/doomedmatu/loot_tables/blocks/cyst_spore_bloom.json |
| Full ceftriaxone grade | 96, at 5,500 FE and 600 ticks | shipped_processes.json, REACTOR cephalosporin_pure row |
| Shortcut ceftriaxone grade | 75, at 5,000 FE and 600 ticks | shipped_processes.json, REACTOR antibiotic_culture row |
| Ferment step | 1 culture + 500 mB distilled water -> 500 mB broth, 2,500 FE, 400 ticks | shipped_processes.json, FERMENTER antibiotic_culture row |
Opioids
It starts with the opium poppy, an eight-stage crop that grows on farmland, dirt, grass, podzol, moss or a dirt path. Harvest the mature pod for poppy latex, dry the latex in the Drying Oven for raw opium.
The bench route is long. Evaporate raw opium with 500 mB of water into 500 mB of opium solution at grade 60. Slake that with a base reagent into 500 mB of morphine slurry at 70. Press the slurry into crude morphine plus 400 mB of waste filtrate. Recrystallize the crude with an acid reagent into morphine base, dry it, recrystallize the dry base with solvent into morphine solid, then evaporate the solid with 200 mB of water into 200 mB of morphine at grade 92.
The dirty shortcut skips the last two steps: evaporate morphine base dry straight into morphine at grade 68. Twenty-four points of grade for two machine steps.
There is also a weak tap-off. Boil 500 mB of opium solution down to 100 mB of opium at grade 55, a fifth of the volume and the worst grade on the board.
Heroin repeats the pattern. Morphine solid plus acetylating reagent recrystallizes into crude heroin, which dries into heroin dry. Evaporate the dry directly for heroin at 48, or recrystallize the dry with solvent into pure heroin first and evaporate that for heroin at 90.
The Reactor carries a parallel, shorter ladder at worse grades: raw opium into 100 mB of opium at 80, then opium plus base and solvent into morphine at 65, then morphine plus acetylating reagent into heroin at 55. It is faster and it is dirtier. Dirt is not cosmetic.
Dried morphine base.
Recrystallize with solvent for pure morphine solid,
or dissolve it straight for a low-grade morphine fluid.
tooltip.doomedmatu.morphine_base_dry
Low-grade is 68. The two extra machine steps the string points at are worth 92.
An injected opioid loads a depot that absorbs over time rather than landing all at once, so fentanyl's respiratory low point arrives well after the needle and can outlast a naloxone dose given in answer to it. Pain, Consciousness and Death
The deep syntheses
These are the deep syntheses, and all of them finish in the Reactor.
Fentanyl's precursor is built out of pure reagents rather than the plant. Kiln a base reagent and an acid reagent together into crude fentanyl intermediate, recrystallize it with solvent into the pure intermediate, dry that into the pure precursor, then react the precursor with a reaction catalyst. That final step is the most expensive operation in the mod at 7,000 FE over 640 ticks, and it stamps 92.
Naloxone runs off raw opium instead. Recrystallize raw opium with an acid reagent into the crude intermediate, recrystallize that with solvent, dry it into the pure precursor, and react it with catalyst for grade 94.
Both have a dirty shortcut built on an unrefined precursor item that can only be found - fentanyl precursor and naloxone precursor turn up in drop capsule loot at the rarest weight. Reacted with catalyst they give grade 70 instead of 92 or 94.
Procoagulant is the odd one out, the one Reactor row that stands clear of the chemistry chain entirely. Two clotting mush, one mineral supplement and one solvent give 100 mB of procoagulant at grade 72 for 3,500 FE. Clotting mush is cobweb and wheat on a bench, and mineral supplement is kilned bone meal. Procoagulant is the only treatment that reaches internal bleeding anywhere in the body, so this row matters more than its position on the ladder suggests.
Pharma-grade fentanyl precursor, dried from the pure intermediate.
React it with catalyst in the Reactor for clean fentanyl.
That synthesis is violent - keep open flame away and don't
overheat the vessel, or it can detonate.
tooltip.doomedmatu.fentanyl_precursor_pure
Procoagulant reduces internal bleeding through the wound ledger in every limb at once and thickens the blood as it goes, so a second and third dose trade a bleed you can see for a viscosity problem you cannot. Blood and Circulation
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Fentanyl, full route | grade 92, 7,000 FE, 640 ticks | shipped_processes.json, REACTOR fentanyl_precursor_pure row |
| Naloxone, full route | grade 94, 6,000 FE, 560 ticks | shipped_processes.json, REACTOR naloxone_precursor_pure row |
| Found-precursor shortcut | grade 70 for both | shipped_processes.json, REACTOR fentanyl_precursor and naloxone_precursor rows |
| Procoagulant | 2 clotting mush + 1 mineral supplement + 1 solvent -> 100 mB at grade 72, 3,500 FE, 420 ticks | shipped_processes.json, REACTOR clottingmush row |
| Every reactor output volume | 100 mB nominal, which is exactly one full syringe | ~/item/FluidSyringeItem.java:37 |
Grade
Every solid intermediate carries a hidden 0-100 grade on its NBT, and every chemistry fluid carries a purity the same way. An item with no tag reads as 100 and counts as unmeasured.
The finished number is rolled at the completion tick from the recipe's nominal grade, minus the heat penalty, minus time spent out of band, minus interruptions, plus a jitter of up to 3 points either way. Then it is capped twice.
The first cap is the input. A batch stays close to the dirtiest tracked ingredient that went in. The recovery allowed is 20 percent of the shortfall, capped again by the machine: the Recrystallizer may recover up to 20 points, the Slaking Vat up to 12, the Filter Press up to 8, and every other machine including the Reactor recovers nothing. Grade therefore only ever creeps upward, and it creeps only through recrystallization. Feed a Reactor a grade-60 precursor and no amount of careful heat lifts the drug to 92.
The second cap is glassware, covered below.
When you inject, purity is the active fraction rather than a separate punishment. A 100 mL shot at 40 percent delivers the effect of 40 mL of drug plus 60 mL of dirt. The dirt then adds sickness scaled by volume and impurity, and seeds infection at the injection site up to 25 points at zero purity. A bad batch is weak and harmful at once.
Fluid yield varies too, and only for fluids. Item outputs produce their full stated count however badly the batch ran.
The Evaporator and the Reactor stamp their batches through an installed borosilicate flask. Right-click either machine holding a flask to fit one; the flask goes in instead of the interface opening.
With no flask, or a fully worn one, the purity ceiling is 60. A fresh flask lifts it to 100 on a straight line, so condition 50 means a ceiling of 80. Each batch wears the flask by 4 points, about 25 batches per flask. The ceiling caps the roll and never raises it.
This is the quietest gate in the whole tree, because the Evaporator makes the reagents. Solvent, acid reagent, salt and iodine all come off the Evaporator, and all of them are stamped with a grade. Run a flask-less Evaporator and every reagent it produces is grade 60, the input cap carries that 60 down the entire chain, and the only thing that lifts it is a Recrystallizer creeping it up eight or ten points at a time. A player who never learned about the flask will make grade-60 drugs forever with nothing on screen to explain why.
A flask is nine glass and one quartz on a bench, so the fix is cheap once you know.
Grade is dose: DrugService multiplies the injected millilitres by purity before it applies any effect at all, so a grade-48 street batch delivers roughly half the opioid load of a grade-90 one out of the same 100 mL syringe. Drugs and Pharmacology
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Grade jitter | plus or minus 3 points | ~/crafting/ChemConditions.java:20 |
| Input cap recovery | 20 percent of the shortfall, capped per machine | ~/crafting/ChemConditions.java:114 |
| Per-machine recovery cap | Recrystallizer 20, Slaking Vat 12, Filter Press 8, everything else 0 | ~/block/entity/ProcessMachineBlockEntity.java purificationRecovery() |
| Impurity sickness | 100 mL at 0 percent purity gives about 40 sickness | ~/body/DrugService.java:103 |
| Impurity infection seed | up to 25 at the injection site | ~/body/DrugService.java:104 |
| Blending | tanks and output stacks merge lots by volume-weighted average rather than refusing them | ~/fluid/PurityBlendingTank.java |
| Ceiling with no glassware | 60 | ~/crafting/Glassware.java:230 |
| Wear per batch | 4 points, about 25 batches per flask | ~/crafting/Glassware.java:229 |
| Ceiling formula | 60 + 40 x condition / 100 | ~/crafting/Glassware.java:236 |
| Machines that use it | Evaporator and Reactor only | ~/block/entity/ProcessMachineBlockEntity.java usesGlassware() |
| Flask recipe | 8 glass around 1 quartz | res/data/doomedmatu/recipes/borosilicate_flask.json |
A flask-less Evaporator caps your entire chemistry tree at grade 60
The Evaporator is the machine that produces solvent, acid reagent, salt and the injectable drug fluids, and it stamps every one of them through its installed borosilicate flask. With no flask the ceiling is 60. Because the input-quality cap then limits every downstream step to roughly the dirtiest ingredient it consumed, a grade-60 solvent drags the whole chain down, and only the Recrystallizer can claw any of it back, at up to 20 points and never more than 20 percent of the shortfall. The Reactor recovers nothing at all.
Grade only ever creeps upward, and only through recrystallization
The input-quality cap allows a batch to exceed its dirtiest ingredient by 20 percent of the shortfall, further limited by the machine: 20 points at the Recrystallizer, 12 at the Slaking Vat, 8 at the Filter Press, and 0 everywhere else. At input 90 the Recrystallizer can only add 2 points. There is no way to launder a bad feedstock clean, and the Reactor cannot improve anything at all - a grade-60 precursor produces a grade-60 drug no matter how perfectly the reaction runs.
FRAGMENT 02-A - GLASSWARE, ASSIGNED MACHINE
SUMMARY: The Borosilicate Flask carries one description in en_us.json: "Lab glassware for the Reactor.\nFit it to raise the purity ceiling toward pharma grade.\nIt clouds over with use - re-fit a fresh one when it does."
RESPONSE: Two machines take a flask. ProcessMachineBlockEntity.usesGlassware() returns true for the Evaporator, and ReactorBlockEntity keeps a glassCondition field of its own. The Evaporator is the machine that stamps solvent, acid reagent, salt, saline, Ringer's and every finished opioid fluid, so its flask governs far more of the tree than the Reactor's does. The Evaporator's own tooltip mentions the flask. The flask's tooltip never mentions the Evaporator.
FINAL NOTE: A player who reads the item and fits their one flask to the Reactor has gated nothing, because the Reactor recovers no grade in the first place and the 60-point cap has already been stamped onto every reagent upstream. The 0.2.x notes record a pass that added tooltips for every machine, block and step of the chain. Whether this string predates the Evaporator's ceiling or was simply missed in that pass is not recorded.
assets/doomedmatu/lang/en_us.json, tooltip.doomedmatu.borosilicate_flask and tooltip.doomedmatu.evaporator; ProcessMachineBlockEntity.usesGlassware(); the glassCondition field in ReactorBlockEntity.
FRAGMENT 07-C - UNWASHED CARBON, HANDLING NOTE
SUMMARY: The Kiln turns two charcoal and a base reagent into two Unwashed Activated Carbon. The item's tooltip: "Chemically activated carbon contaminated with corrosive residue.\nWash it with distilled water in a Filter Press before swallowing it."
RESPONSE: The washed product, Activated Charcoal, is registered as a MedDrinkItem and can be swallowed. The unwashed item is registered through the plain chem() helper as an ordinary Item with no use action. Nothing consumes it except the Filter Press row. The warning describes a mistake the game will not let a player make.
FINAL NOTE: Read as a safety label it is redundant. Read as a record it says somebody expected the unwashed carbon to be swallowable and to hurt, then either changed their mind or stopped before that half was built. The carbon line is also the only chemistry route in the mod that ends in something you drink rather than inject.
assets/doomedmatu/lang/en_us.json, tooltip.doomedmatu.activated_carbon_unwashed; DoomedItems.chem() against the MedDrinkItem registration for activatedcharcoal; the KILN charcoal row and the FILTER_PRESS wash row in shipped_processes.json.
Fouling
Every machine keeps four numbers that survive between batches: residue, microbial load, sterility and calibration. Finishing a batch fouls all of them. Residue climbs by 9 plus a third of the recipe's fume potency. Any wet step drops sterility to 55, and any biological step - the Fermenter - adds 16 microbial at once. Calibration falls by 1 and drifts randomly.
The payoff is real. Chemical carryover into the product is the larger of the input's contamination and 35 percent of the machine's residue, so a Kiln left uncleaned for six batches stamps 35 chemical contamination onto everything it makes. Microbial carryover is 45 percent of the machine's microbial load, and an injectable product carries a floor on top of that: below sterility 90, the product takes at least half the shortfall. A Reactor that has run one batch sits at sterility 55, so every drug it makes from the second batch onward comes out with at least 17 microbial load.
That number travels. Injecting seeds a puncture wound whose contamination is 2 plus a quarter of the chemical load and three quarters of the microbial load, and any microbial load at all seeds real infection at the site. Seventeen is enough to mark the limb infected on its own.
The cleaning cycle has an order, and it enforces the order. Rinse consumes one water bucket, wipes residue to zero, removes 30 microbial, and drops sterility to 45 - rinsing is explicitly not sterilizing. Sterilize consumes one bleach container, zeroes microbial and restores sterility to 100, and it refuses outright while residue is above 5. Dirt gets to stay visible rather than sealed under a clean surface. Calibrate costs 750 FE and only affects what the readout tells you.
Bleach is a found or bought item, craftable nowhere in the mod, and sterilizing consumes the whole container regardless of how full it is.
Poison. Drinking it will nearly kill you.
A 100 mL wound pour strips contamination and a little infection,
but chemically burns skin and muscle and grants no antiseptic protection.
tooltip.doomedmatu.bleach
The tooltip covers the wound pour. A container of the same bleach is also what sterilizes a machine, and sterilizing spends the whole container.
Every invasive dose writes one puncture wound at the site it went into, and that wound's contamination is built from the machine's own carryover - 2 plus a quarter of the chemical load plus three quarters of the microbial load, scaled by volume - so a dirty vessel becomes a specific wound record rather than a general penalty. Injury and Treatment
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Residue per batch | 9 + fume potency x 10 / 3 | ~/crafting/ChemistryEquipmentState.java:46 |
| Sterility after a wet batch | capped at 55; 75 for a dry one | ~/crafting/ChemistryEquipmentState.java:47-48 |
| Microbial floor for injectables | (90 - sterility) / 2 when sterility is under 90 | ~/crafting/ChemistryEquipmentState.java:39 |
| Chemical carryover | 35 percent of residue, or the input's own load, whichever is higher | ~/crafting/ChemistryEquipmentState.java:34 |
| Rinse | 1 water bucket; residue to 0, microbial -30, sterility capped at 45 | ~/crafting/ChemistryEquipmentState.java:57 |
| Sterilize | 1 bleach; blocked while residue is above 5 | ~/crafting/ChemistryEquipmentState.java:70 |
| Calibrate | 750 FE | ~/network/C2SChemistryActionPacket.java:106 |
| Injection wound contamination | 2 + chemical x 0.25 + microbial x 0.75, scaled by dose | ~/body/DrugService.java:509 |
Your second reactor batch is already contaminated
Completing a wet batch drops the machine's sterility to 55 and cannot be undone by running more batches. For an injectable product, sterility under 90 forces a minimum microbial load of half the shortfall, which is 17. That 17 rides the fluid into the syringe, and injecting seeds real infection at the puncture site at roughly 6 points, enough to mark the limb infected. Restoring sterility takes a rinse with a water bucket followed by a sterilize with a bleach container, in that order, before every batch you intend to inject.
Sterilizing refuses to run until you have rinsed
Sterilize checks residue and hard-refuses while it is above 5, on the principle that you cannot seal dirt under a clean surface. Rinse is the only thing that zeroes residue, and rinsing itself drops sterility to 45. The cycle is therefore always rinse first, sterilize second, and doing it in the other order accomplishes nothing.
The assay
Nothing shows a batch's grade until it is assayed. An unassayed item or syringe reads "Assay: untested" on its tooltip and stops there. The Assay button on the machine console consumes 10 mB of the output fluid, or one whole item from the output slot when there is no fluid, and writes an estimate onto whatever is left.
The estimate is not the truth. It is the true value plus the machine's calibration drift, plus a random error of up to the reported uncertainty. Uncertainty on purity starts at 14 and falls by 0.55 per point of Intelligence, with a floor of 2 and a ceiling of 22, and it widens by one point for every 10 points of lost calibration. Contamination reads worse: it starts at 20, falls by 0.65 per Intelligence, and floors at 3.
A character starts at Intelligence 10, which gives about plus or minus 8 on purity and plus or minus 13 on contamination from a freshly calibrated machine. Around Intelligence 22 the purity reading hits its floor of plus or minus 2.
Calibration drift is the nastier half, being a systematic bias rather than noise. It wanders by up to 0.35 per batch and clamps at 12 in either direction, so a machine that has run a long time can quietly report every batch up to 12 points high. Calibrating resets the drift to near zero.
The reading is discarded whenever the material changes. A new batch landing in the tank, or a lot blending in down a pipe, clears the stale assay rather than carrying it forward.
Chemistry itself trains Intelligence. Every machine synthesis awards 12 XP to the nearest player within 8 blocks, and hand-crafting anything in the chemistry tag awards 8, but each repeat of the same product pays 82 percent of the last, flooring at 8 percent of base. One cheap row will carry a character only so far.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Assay sample cost | 10 mB of fluid, or one output item | ~/crafting/ChemistryEquipment.java:31 |
| Purity uncertainty | 14 - 0.55 x INT + (100 - calibration) / 10, clamped 2 to 22 | ~/crafting/ChemistryEquipmentState.java:88 |
| Contamination uncertainty | 20 - 0.65 x INT + (100 - calibration) / 8, clamped 3 to 30 | ~/crafting/ChemistryEquipmentState.java:89 |
| Calibration drift range | plus or minus 12, moving up to 0.35 per batch | ~/crafting/ChemistryEquipmentState.java:51 |
| Starting Intelligence | level 10 | ~/body/Skills.java:15 |
| Synthesis XP | 12 base, 8 for hand-crafted reagents, x0.82 per repeat, floor 8 percent | ~/crafting/ChemXp.java:183-186 |
| XP reach | nearest player within 8 blocks of the machine | ~/crafting/ChemXp.java:187 |
The assay is a noisy estimate with a systematic bias
The number on your tooltip is the true grade plus the machine's calibration drift plus random error. Drift wanders by up to 0.35 a batch and clamps at 12 in either direction, so an old machine can report every batch it makes up to 12 points high, consistently, forever. Calibrating costs 750 FE and resets the drift to near zero. Intelligence narrows the random half only - it cannot see through the bias.
FRAGMENT 09-B - THE ONLY NOTICE
SUMMARY: A graded item or syringe with no assay tag prints exactly one line: "Assay: untested (sample it in the machine console)".
RESPONSE: Sampling consumes 10 mB of the output fluid, or one whole item out of the output slot when no fluid is present. What comes back is the true value plus the machine's calibration drift plus a random error up to the reported uncertainty, and the drift is a bias rather than noise: it wanders up to 0.35 a batch and clamps at 12 either way. Reading the number costs part of the batch and returns an estimate.
FINAL NOTE: That line is the whole of what the game volunteers about grade. A player running a flask-less Evaporator gets no line at all - their reagents simply come out at 60 forever, and the tooltip that would tell them is the one they have to spend material to see.
ChemTooltips.java, the untested line and the assay percentage line beneath it; ChemistryEquipment.assay consuming a 10 mB sample; ChemistryEquipmentState.assay and its calibrationDrift term.
Fumes and fire
A running machine emits fumes with a potency of its own. The Kiln and Still are worst at 3, the Slaking Vat and Evaporator sit at 2, the Drying Oven and Recrystallizer at 1, and the Fermenter and Filter Press emit nothing. Individual recipes can override this, and several do.
Exposure is scanned every half second in a 3-block cube around you, distance-weighted and blocked by solid geometry, summing every running machine and capping at 5. Open sky halves it. A powered Fume Hood in line of sight cuts it to 12 percent, which is what makes an indoor lab survivable. Without respiratory protection the cloud adds sickness continuously; at 1.5 it slows you and darkens your vision without safety glasses or a gas mask; at 2 it adds nausea and starts doing recoverable chemical injury to your chest muscle.
Fire is rolled every half second while a batch is moving. A flammable step - the Still, the Evaporator and every Reactor row - carries a base ignition chance that works out to about 6 percent across a 30-second run. An open flame adjacent raises that to roughly 26 percent, and overheating to roughly 42 percent. A brazier, campfire, lava and magma all count as open flame; the RF Heater counts as none. Fire is placed on top of the machine, so it spreads to a wooden base.
The fentanyl and naloxone reactor rows are sealed at pressure 2, which makes them violent. Run one over an open flame or above the heat ceiling and it can detonate rather than merely catch, and a sealed pressure-2 vessel carries a small rupture chance even when run perfectly. The blast wounds and flings, and leaves blocks intact.
The two over-dried pure precursors are shock-sensitive. Carrying pure fentanyl precursor or pure naloxone precursor means a hard wounding fall has a 50 percent chance per stack of setting the whole cache off in your inventory, and every burn tick while you are on fire has a 35 percent chance. The blast radius scales with the stack size up to 4.5 blocks. The tooltip warns you in red; that warning is the only notice you get.
Pharma-grade naloxone precursor, dried from the pure intermediate.
React it with catalyst in the Reactor for clean naloxone.
That synthesis runs violent - no open flame, no overheating,
or the vessel can detonate.
tooltip.doomedmatu.naloxone_precursor_pure
The vessel warning is in the lang file. The red shock-sensitive line on the same item is written in code instead, so it is not translated with the rest.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Base machine fume potency | Kiln and Still 3, Slaking Vat and Evaporator 2, Drying Oven and Recrystallizer 1, Fermenter and Filter Press 0 | ~/block/ProcessType.java fumePotency() |
| Fume scan | 3-block radius, every 10 ticks, cloud capped at 5 | ~/body/FumeExposureHandler.java:36-41 |
| Fume Hood venting | cuts the cloud to 12 percent; open sky halves it | ~/body/FumeExposureHandler.java:38-39 |
| Harm thresholds | 1.5 for slowness and eye darkness, 2.0 for nausea and chest injury | ~/body/FumeExposureHandler.java:44-45 |
| Ignition odds over 30 seconds | about 6 percent controlled, 26 percent over open flame, 42 percent overheating | ~/block/ChemHazards.java:587-589 |
| Blast radius | 4 blocks, no block destruction | ~/block/ChemHazards.java:593 |
| Shock-sensitive detonation | 50 percent per hard fall, 35 percent per burn tick | ~/body/ShockSensitiveHandler.java:30-31 |
Moving fluids
Chemistry fluids other than water have no bucket item. They move by adjacent Fluid Barrel, by pipes from another mod, or in a refillable syringe. The barrel holds 16,000 mB, blends lots of the same fluid by volume-weighted average, and is the only fluid storage in the mod.
Every machine has per-face I/O. By default the bottom face is Output and the other five are Input, with auto-push and auto-pull both on. That is convenient, and it is also how accidents happen: an Input face beside a barrel will pull whatever the barrel holds into the machine's input tank as long as some recipe for that machine consumes it.
The input tank has no exit. An Input face is fill-only, an Output face addresses the output tank, and draining by hand was never built. So a stray charge of the wrong accepted fluid pins the machine to that fluid's recipe subset until it runs out, and if less remains than any recipe consumes, it stays there permanently. This is a known open defect rather than a misunderstanding on the player's part.
The status line names most other stalls plainly. NEEDS HEAT means the tier is below the minimum. OUTPUT BLOCKED means the product will not fit, a stall rather than a loss. BATCH MISMATCH means an adjacent output destination has room for the same fluid and is refusing it over quality data.
For injection, the Syringe Filler pumps 20 mB per tick at 10 FE per mB, and a syringe holds 100 mB. The Centrifuge does the opposite job: pour a mixed solution in and it separates one component every 2 seconds at 2,000 FE a spin, each component keeping the purity it had in the mix.
Homogenizes compatible fluid batches. Averages purity
and contamination by volume; ordinary tanks may reject
differing batches. Holds 16,000 mB and connects on every
side. Player-placed barrels retain their contents.
tooltip.doomedmatu.fluid_barrel
The barrel connects on every side. The machine input tank it feeds accepts on five faces and gives back on none.
The one-way input tank belongs to the shared SideConfig rather than to chemistry - Input faces fill only, Output faces address the output tank, and every Doomed machine ships with the same bottom-Output default and auto-pull switched on. Machines, Power and Fluids
An input tank you fill with the wrong fluid can never be emptied
Input faces are fill-only, output faces address the output tank, and there is no hand drain or pipe extraction from an input tank. The tank accepts any fluid that some recipe for that machine consumes, and auto-pull is on by default, so a barrel of water beside an Evaporator will load it unasked. If the stranded amount is smaller than any recipe consumes, the machine is pinned to that fluid's recipe subset permanently and has to be broken and replaced.
Notes
- Every one of the sixty-eight shipped rows sits at or under its vessel's corrosion tolerance, so ProcessRecipe.compatibilityRisk() returns zero for all of them. The extra 15 contamination per point and the slow rupture roll it feeds have never fired in a shipped game; only a datapack that adds a row can reach them. Whether the tolerance table was written around the recipes or the recipes around the table is not recorded.
- RECIPE UNAVAILABLE is a status the console can draw and no code path assigns. ActiveChemBatch defines the constant and clamps it when loading a save, and nothing anywhere pauses a batch with it - a machine whose recipe disappears resets the batch instead. What was meant to raise it was never written down.
- reference/CHEMISTRY_REALISM_SPEC.md asks for a crude purity ceiling of about 75 and an upgrade item sitting in a machine upgrade slot. What shipped is a ceiling of 60 and a flask fitted by right-clicking the machine. Fifteen points is a large move in how hard the whole tree is gated, and neither the spec nor the source says when or why it happened.
- Chemistry has seven gametests. They cover equipment state, lot blending, the BATCH MISMATCH diagnosis and the datapack load, and preflight carries no chemistry checker at all. Nothing exercises the grade roll, the heat band, the glassware ceiling or the input cap, so the 12-point heat swing, the 20 percent recovery cap, the jitter of plus or minus 3 and the 4 points of flask wear per batch rest on reading the code rather than on a test or a recorded playtest.
- The exemption from the heat quality roll names the Filter Press and the Slaking Vat and stops there. The Recrystallizer needs no heat to run, never reports NEEDS HEAT, and still takes the full 12-point cold penalty for running at tier 0 - and it is the one machine that can lift a batch's grade at all. Whether it was considered for the exemption and rejected, or simply not considered, is not recorded.
- The antiviral recipe carries its own caveat in the file: "Ingredients provisional, tune off reports." Two antibiotic cultures, glow berries and paper is what shipped. No report is recorded against it since, so the price of the only cure for a viral disease is still the placeholder somebody wrote while building the contagion layer.
PART III - APPARATUS
Machines, Power and Fluids
Doomed runs a full Forge Energy and Forge Fluid layer under its chemistry and medical blocks. One block burns fuel and makes power; everything else only consumes it. Every machine that moves items or fluids carries a six-face routing config that decides which pipes may talk to it and which way round, and it pushes and pulls through those faces on its own even with no pipes present. Most of the frustration players hit here comes from four places: there are no cables in this mod, an input tank cannot be emptied once you put the wrong thing in it, a face set to None really does disconnect an attached hopper, and a machine stalled on a full output is still holding a live batch that can rot.
Supply
The Fuel Generator is the entire supply side of the mod. It burns ordinary furnace fuel through Forge's burn-time hook, produces a flat 20 FE per tick while an item is alight, and holds a 16,000 FE buffer. Coal burns for 1,600 ticks, so one lump is 32,000 FE, more than the buffer can hold at once.
Ignition waits on headroom. A fresh item lights only when there is room in the buffer for at least one more tick of output, so a generator sitting on a full buffer stops eating fuel rather than wasting it.
Every other energy block in the mod is a pure sink. MachineEnergyStorage's two-argument constructor sets maxExtract to zero on purpose, so a Process Machine, a Reactor or a Freezer keeps whatever it has taken in and hands none of it back. The generator is the one exception: it uses the three-argument form and states an extract limit of 256 FE per tick, which is what lets a foreign cable from another mod draw off it.
Since nothing in Doomed pulls, the generator pushes. Each server tick it walks its six neighbours and offers up to 256 FE to any block entity exposing the energy capability that reports it can receive. That is the whole distribution system. Distribution ends at contact: the mod registers no cable, conduit or wireless block, so a generator has to physically touch the machine it powers, or the pipes have to come from another mod. A ring of machines around one generator is the intended survival layout.
One trap sits in the fuel slot. A syringe of Kyntiane fuel is never burned. Putting one in arms it, and when its fuse expires the generator deletes the syringe and detonates it in place.
Burns ordinary furnace fuel and pushes power into whatever it touches. The only thing in the mod that makes FE - every powered machine here needs one.
tooltip.doomedmatu.fuel_generator
This one is exact, down to the pushing. Seven other block tooltips tell the player to feed a machine from a cable, and the mod registers no cable.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Generator output | 20 FE/tick while burning | block/entity/FuelGeneratorBlockEntity.java:47 |
| Generator buffer | 16,000 FE | block/entity/FuelGeneratorBlockEntity.java:45 |
| Push ceiling per neighbour | 256 FE/tick | block/entity/FuelGeneratorBlockEntity.java:49 |
| Energy from one coal | 32,000 FE (1,600 ticks x 20) | block/entity/FuelGeneratorBlockEntity.java:47 |
| Extract limit on every other machine | 0 FE (sinks only) | energy/MachineEnergyStorage.java:19-21 |
There are no power cables in Doomed
The Fuel Generator is the only block that makes energy, and it distributes by pushing up to 256 FE per tick into each of its six face-adjacent neighbours. No cable, conduit or wireless block is registered anywhere in the mod. A machine that is not touching a generator gets nothing unless you supply pipes from another mod.
FRAGMENT 07-C - EQUIPMENT CARD, RF HEATER
SUMMARY: Seven block tooltips in the shipped English lang file instruct the owner to supply the unit from a cable. The Battery Recharger, the Oxygen Compressor, the Freezer, the Heater, the Cooler, the Fume Hood and the Lifepod Console all carry some form of the same line.
RESPONSE: "An RF heater. Feed it from a cable; while powered it glows and warms nearby players. A full buffer runs ~4.5 min. The charge rides the block when you mine it, so carry it charged."
FINAL NOTE: No cable, conduit or wireless power block is registered anywhere in the mod. The only supply Doomed ships is a Fuel Generator physically touching the block, or pipes borrowed from another mod entirely. The second sentence is wrong by a different route: PoweredClimateBlockEntity charges its 12 FE once every ten ticks, so a full 64,000 FE buffer runs closer to 44 minutes than 4.5. Both halves of the card have been read by every player who has ever placed a heater.
assets/doomedmatu/lang/en_us.json lines 821-837 (tooltip.doomedmatu.heater and six siblings); block/entity/PoweredClimateBlockEntity.java:26-46
Buffers and cost
Buffers are sized by how hungry the machine is, and the receive rate is how fast a generator or a foreign cable can refill one. Energy is exposed on every face of every machine regardless of the side config, so a power connection never needs configuring.
The Reactor is the greediest, with a 64,000 FE buffer and a 2,048 FE per tick intake. The Process Machines, the Centrifuge and the Syringe Filler all sit at 32,000 FE and 1,024 FE per tick. The support stations (Battery Recharger, Oxygen Compressor, Freezer, RF Heater and Cooler) hold 64,000 FE at 1,024 FE per tick.
Running costs are per recipe rather than a flat draw. A Process Machine or Reactor batch carries a total FE figure and a tick count, and spends a fraction of that total on each tick of actual progress. Some low-power recipes legitimately cost zero on a given tick, and the machine still has to be energized to advance: the stop check demands at least 1 FE even when the exact due amount rounds to nothing.
The fixed-rate machines are simpler. The Centrifuge spends 2,000 FE for each component it spins out, once every 40 ticks. The Syringe Filler pumps 20 mB per tick at 10 FE per mB, so a full 100 mB syringe costs 1,000 FE and takes five ticks. The Oxygen Compressor adds 6 ticks of breathing supply per tick at 8 FE each, filling a 900-tick rebreather in about 7.5 seconds for roughly 7,200 FE. The Battery Recharger pushes up to 256 FE per tick into each of its two slots.
Calibrating a chemistry machine costs a flat 750 FE out of its buffer.
A powered refill station for a spent rebreather - feed
it FE from cables. Drop a drained rebreather in the
slot and it recompresses its air tank in ~7.5 s
(a full tank costs ~7,200 FE).
tooltip.doomedmatu.oxygen_compressor
The 7.5 seconds and the 7,200 FE are the code's own numbers. The cables are not.
The per-tick draw is not a machine property at all: a batch spends a fraction of the recipe's own declared FE across its declared tick count, so the recipe table is what sets the load, and across all 68 shipped rows the heaviest averages 13.34 FE per tick on a Kiln. The Chemistry Engine
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Reactor buffer / intake | 64,000 FE / 2,048 FE per tick | block/entity/ReactorBlockEntity.java:55-56 |
| Process Machine buffer / intake | 32,000 FE / 1,024 FE per tick | block/entity/ProcessMachineBlockEntity.java:50-51 |
| Centrifuge cost per component | 2,000 FE every 40 ticks | block/entity/CentrifugeBlockEntity.java:44-45 |
| Syringe fill cost | 10 FE/mB, 20 mB/tick (1,000 FE per 100 mB syringe) | block/entity/SyringeFillerBlockEntity.java:51-52 |
| Rebreather refill | 6 O2 ticks/tick at 8 FE each, ~7,200 FE for a full 900-tick tank | block/entity/OxygenCompressorBlockEntity.java:46-47, item/RebreatherItem.java:33 |
| Battery Recharger output | 256 FE/tick into each of 2 slots | block/entity/BatteryRechargerBlockEntity.java:52 |
| Calibration cost | 750 FE | network/C2SChemistryActionPacket.java:107 |
The six faces
Four machine families carry a side config: the eight Process Machines, the Reactor, the Centrifuge and the Syringe Filler. Each of their six faces holds one of four modes.
None exposes nothing at all. Input exposes an insert-only view of the input slots and the input tank, so a pipe can push material in while your reagents stay put. Output exposes an extract-only view of the output slot and output tank. Both hands out a combined view where inserting goes to the inputs and extracting comes from the outputs.
A freshly placed machine defaults to Input on all five faces and Output on the bottom. That is why a chest or hopper placed under a machine starts collecting product immediately with no setup at all, and it is also why a hopper under a machine you did not want drained is pulling from it.
Faces change from the machine screen's Configuration tab, marked Cfg. Left-click a face to cycle forward through None, Input, Output, Both, and right-click to cycle backward. Two buttons on the same tab toggle auto-input and auto-output globally for that machine, and both default to on.
The server refuses a side-cycle packet unless you actually have that machine's menu open, are within eight blocks, and your hands are functional. Wreck your hands and the machine stops answering.
Configured faces are drawn on the block itself as inset port plaques, blue for input and orange for output. A Both face gets two smaller plaques side by side rather than a third symbol. A None face draws nothing, so a machine with a bare side is a machine nothing can connect to.
The config, both auto toggles, the tanks, the slots, the buffered energy and any fitted flask all copy onto the block item when you mine the machine, so a machine you pick up and replace comes back configured and loaded.
Dries wet solids. Needs FE and low heat (a brazier/
heater beside it). Turns poppy latex into raw opium and
dries damp morphine, heroin and precursors.
Set faces to input/output.
tooltip.doomedmatu.drying_oven
That closing line rides eleven machine tooltips and names two modes. The Cfg tab cycles four, and the two it leaves out are the ones that cause trouble.
Auto push and pull
Every configured face does work on its own once per server tick, with no pipes involved at all. An Output face looks at the block entity on the other side and shoves finished items and fluid into it. An Input face looks at the same neighbour and pulls raw material out of it. A Both face does both, each direction gated by its own global toggle.
The rates are fixed and per face. Eight items per tick and 100 mB per tick move across each active face. Six configured faces means six times that.
This is the reason a barrel of ethanol set beside a Still keeps it fed, and the reason a chest under any machine fills with product. It is also why a machine with a Both face pointed at another machine can drain it: auto-pull reads the neighbour's fluid capability the same way a pipe would.
Input slots are filtered before anything crosses. A Process Machine accepts only an item that some recipe for that specific machine actually uses, so auto-pull keeps junk out of the inputs even from a mixed chest. A second rule is less obvious: the same ingredient can never occupy both input slots. Two input slots means two ingredient roles, and without that rule a chest holding more than a stack of one reagent would fill both slots with it and permanently starve every two-ingredient recipe. That defect killed the Recrystallizer outright, since all of its rows take two ingredients. The machine sat charged and idle, reporting no fault at all.
The duplicate check compares items by identity and deliberately ignores NBT, because every solid chemistry intermediate carries per-batch grade and contamination tags. Two stacks of the same reagent from different batches are still the same ingredient.
Setting a face to None does two separate things, and both had to be built because either alone leaks.
First, the capability. When a face changes mode, the machine retires every handler it has already handed out and issues fresh ones. Without that, a pipe that cached the handler kept the old mode until the machine unloaded, so a face set to None went on accepting pushes from whatever was already attached. Energy is deliberately exempt from the retirement, because cables connect on every face regardless of config and dropping their handles on an unrelated item-face change would be pointless churn.
Second, the vanilla path. Hoppers do not only ask for the capability. When Forge's hook returns nothing, a hopper falls back to plain vanilla container access, and that path honours face rules only if the block entity implements WorldlyContainer. The Process Machine, the Reactor and the Syringe Filler were plain Containers, so vanilla waved hoppers straight through and let them walk the slots in index order. Slot 0 is an input slot. A hopper under a face you had deliberately set to None did not stop, it started stealing your reagents, which made None strictly worse than leaving the face as Output.
All three now implement the face gates, so a None face returns no slots to vanilla and a hopper on it does nothing.
One related detail on the Syringe Filler: its Output face releases a syringe only when the syringe is full, or when the tank can no longer top it up. Earlier it released anything with fluid in it, and because auto-push runs before the fill loop each tick, a chest under the default bottom face collected a stream of one-fifth doses.
Spins a mixed drug solution back into its parts. Pipe
a solution into the input; while powered it separates
one component every ~2 s (2,000 FE each) into the
output. Set faces to input/output.
tooltip.doomedmatu.centrifuge
"Pipe a solution into the input" is optional. An Input face pulls 100 mB a tick out of an adjacent barrel with nothing between them.
A face set to None disconnects an attached hopper, and this needed two separate mechanisms
Changing a face's mode retires every capability handle the machine has already given out, so a pipe that cached the old handler cannot keep pushing. Separately, the machine implements vanilla's per-face container gate, because a hopper falls back to plain vanilla access when the capability returns nothing, and that path only honours faces on a WorldlyContainer. Without the second half, a hopper under a None face did not stop, it started pulling out of slot 0, which is an input slot.
FRAGMENT 12-A - FUEL CERTIFICATION, LIQUID RAW ORIGINIUM
SUMMARY: A syringe of Kyntiane compound is registered as furnace fuel with a genuine burn time - kyntianeAmountMb multiplied by 20 ticks per millilitre, so a full 100 mB syringe certifies at 2,000 ticks. The item carries two tooltip lines about that rating.
RESPONSE: "Nominal fuel: %s seconds from %s mL." "UNSTABLE FUEL: inserting it arms a 3-second fuse. It will explode before burning."
FINAL NOTE: The word doing the work is "nominal". The furnace mixin's own docstring reads "Makes Kyntiane Compound an advertised fuel that can never survive long enough to be consumed" - a vanilla furnace holding one cancels its tick entirely, arms the fuse and detonates in place without smelting anything. The Fuel Generator does the same and skips it when picking fuel. Its face gate then keeps the armed syringe where it is, because the syringe reports a real burn time and only spent items are allowed out, so a hopper cannot pull it clear during the three seconds. A Brazier goes further and arms the syringe while it is still in your hand, then hands it back.
item/FluidSyringeItem.java:39-144 (getBurnTime, armKyntianeFuel, detonateKyntianeFuel); mixin/AbstractFurnaceBlockEntityMixin.java:15-35; block/entity/FuelGeneratorBlockEntity.java:78-99, 292-303; block/BrazierBlock.java:73-77; lang lines 104-105
The input tank
This is a live defect the code documents against itself, and it is worth knowing about because there is currently no clean way out of it.
An Input face is fill-only. An Output face addresses the output tank rather than the input tank. A Both face hands out a combined view whose drain also goes to the OUTPUT tank. Add those up and no configuration of any face empties a machine's input tank.
Forge's tank refuses an unlike fluid whatever the free space, so a single millibucket of the wrong liquid pins that machine to whatever recipe subset uses that fluid until the charge is run out through a batch.
There is a partial guard. Both the Process Machine and the Reactor filter their input tank against their own recipe table, so a fluid no recipe for that machine consumes is rejected rather than hoarded. The Reactor goes further and accepts only a drug fluid that some reaction actually takes as input. What the filter cannot stop is a fluid that IS valid for that machine but is not the one you wanted.
The obvious fix was tried and reverted, because it was worse. Letting a Both face drain the input tank when the output tank was empty would have quietly emptied the ingredients into whatever was attached, since a process machine's output tank is empty for almost the whole of a run. Worse, auto-pull reads a neighbour's fluid capability, so one machine with a Both face aimed at another would have siphoned that machine's charge into itself.
The practical answer for now is to keep an item-only machine for item work and to be deliberate about what you pipe into a tank. The Drying Oven, the Kiln and the Recrystallizer show no fluid bars at all and therefore never auto-pull fluid, so they cannot be jammed this way.
Right-clicking a machine with a fluid container transfers fluid instead of opening the screen. This works on the eight Process Machines, the Reactor, the Centrifuge, the Syringe Filler and the Fluid Barrel.
The transfer routes through the same per-face config the pipes use, which is what makes it predictable rather than a special case. Click an Input face with a full bucket and the input tank fills. Click an Input face with an empty bucket and nothing happens, because an Input face is fill-only. Click the Output face (the bottom, by default) with an empty bucket and you draw the product off. A None face stays shut to a hand exactly as it stays shut to a pipe.
Vanilla water buckets work, because a bucket is the first thing anyone reaches for. The mod's own chemistry fluids are container-only and have no bucket item registered, so they move by syringe, by an adjacent tank, or by pipe.
Until this existed, the only route into a machine tank was the fluid capability, which in a Doomed-only install meant an adjacent Fluid Barrel and nothing else, and the Fluid Barrel had no crafting recipe. The whole fluid layer was unreachable in survival without another mod's pipes.
A Fluid Barrel holds 16,000 mB of anything and exposes it on every side with no configuration. Its contents survive being mined, because the loot table copies the tank onto the dropped item. The exception is a barrel authored by world generation: those are tagged non-recoverable, the barrel item is stripped from the drops entirely, and the fluid goes with it. Empty a found barrel before you break it.
Purifies crude solids with a solvent reagent (FE, no
heat, no tanks). Recrystallises crude morphine, heroin
and precursors, and catalyst, to a cleaner grade.
Set faces to input/output.
tooltip.doomedmatu.recrystallizer
"no tanks" reads as a limitation. It is the reason this machine is one of the three that can never be jammed by a millibucket.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Machines with no fluid tanks | Drying Oven, Kiln, Recrystallizer | block/ProcessType.java:21-28 |
| Input tank drain routes | none | machine/SideConfig.java:64-90 |
| Fluid Barrel capacity | 16,000 mB | block/entity/FluidBarrelBlockEntity.java:32 |
| Machine tank capacity | 4,000 mB per tank (input and output) | block/entity/ProcessMachineBlockEntity.java:49, block/entity/ReactorBlockEntity.java:54 |
The input tank cannot be emptied by any face configuration
An Input face is fill-only, an Output face addresses the output tank, and a Both face's drain also goes to the output tank. Forge refuses to mix unlike fluids in a tank whatever the free space, so one millibucket of a fluid you did not want locks that machine to the recipes using it until the charge is spent through a batch. The code comments record this as an open defect, with a note explaining that the obvious fix was tried once and quietly siphoned machines into each other.
Blending
Chemistry fluids carry their assay in NBT. A purity value from 0 to 100, a chemical carryover figure and a microbial load all ride along on the FluidStack through tanks, pipes and syringes. An absent tag reads as fully pure, so old or untouched fluid behaves normally.
Forge treats differing NBT as a different fluid, which would deadlock a pipe chain because one batch came out at 71 percent and the next at 72. Doomed's tanks work around that: they accept the compatible portion and stamp the volume-weighted mean of both lots. Purity, chemical carryover and microbial load are all blended by volume. Anything else in the tag counts as genuine incompatibility, and differently composed mixed solutions are refused outright because their component lists need real mixing rather than one headline average.
Blending is why topping up a tank batch after batch matters. Every merge is a weighted average, so a dirty lot poured into a clean tank drags the whole tank down and cannot be separated back out.
When an output face cannot move fluid, the machine tries to work out why. If the destination has room, accepts this base fluid, already holds the same base fluid, differs only in blendable assay properties, and still refuses the transfer, the machine reports status 6 and the screen reads BATCH MISMATCH. That is a specific diagnosis rather than a generic jam, and it tells you the neighbour is holding a graded lot that will not merge with what you are producing.
One output face succeeding is enough to clear it. The mismatch flag raises only when nothing moved anywhere that tick, so a second stale attachment does not get called a machine-wide failure while another destination is accepting.
Homogenizes compatible fluid batches. Averages purity
and contamination by volume; ordinary tanks may reject
differing batches. Holds 16,000 mB and connects on every
side. Player-placed barrels retain their contents.
tooltip.doomedmatu.fluid_barrel
The tooltip and the code agree throughout, including the "player-placed" qualifier that world-generated barrels fail.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Purity scale | 0 to 100, absent tag = 100 | fluid/Purity.java:20-32 |
| Blend method | volume-weighted mean, rounded | fluid/Purity.java:84-93 |
| Mismatch status code | 6, shown as BATCH MISMATCH | client/screen/MachineScreen.java:1039 |
Heat
Power alone does not run a chemistry machine. Almost every recipe also names a minimum heat tier, and the machine reads the best heat source among its six face-adjacent blocks every server tick.
Tier 0 is cold and nothing reacts. Tier 1 is a lit Brazier or vanilla open heat: fire, soul fire, lava, magma, or a lit campfire. Tier 2 is one running RF Heater. Tier 3 is forge grade and needs two running heaters adjacent. Tier 4 is over-fired, which takes three or more, and it is hotter than any recipe's safe ceiling.
Braziers count as open flame and RF Heaters do not, and that distinction is a safety decision rather than a cosmetic one. A flammable step run over an open flame carries several times the ignition risk of the same step on a controlled heater.
Heat is also the only thing these machines report to redstone. A comparator on a Process Machine or a Reactor reads the heat tier, not the progress or the buffer. The mapping is 0 for cold, then 4, 8, 12 for the safe ceiling, and 15 for over-fired. Twelve is the back-off threshold and fifteen alone means the vessel has gone over, so the drop from 15 to 12 is a visible recovery edge an automation can act on. The block updates its comparator the moment the tier changes rather than on a timer.
A machine's screen shows the tier it currently has, the minimum the active recipe needs, and the ceiling that recipe considers safe.
A fuel-burning brazier - the early heater, no power
needed. Its basket shows the fuel actually burning.
Any furnace fuel works; a Netherite Block becomes an
eternal core and burns forever.
tooltip.doomedmatu.brazier
Sold as the cheap heater. Nothing in it says the brazier is what the code counts as open flame.
A lit Heater or Cooler is doing two jobs at once - LocalClimateService and TemperatureHandler both scan for a nearby PoweredClimateBlock as a radiant source, so the pair of heaters holding a Reactor at forge grade is also pushing the body temperature of whoever stands beside them, and a Fume Hood is deliberately excluded from that scan because it is a different block class. Needs and Survival
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Heat tiers | 0 cold, 1 open flame or brazier, 2 one RF heater, 3 two heaters, 4 three or more (over-fired) | block/HeatSource.java:52-77 |
| Comparator mapping | 0, 4, 8, 12, 15 by tier | block/HeatSource.java:41-49 |
| Reactor heat band | minimum tier 1, safe ceiling tier 3 | block/entity/ReactorBlockEntity.java:52-53 |
The batch lock
A machine picks a recipe from what you loaded, never from whether the output has room. It ranks candidates by specificity, meaning the number of item requirements, so a recipe that asks for ingredients always beats one that asks for none. That ranking exists because a recipe with no item requirements silently shadowed every item-bearing recipe sharing its machine and input fluid. Loading kelp and bottles into an Evaporator produced reagent solvent and the iodine batch could never fire once.
Once selected, the batch locks. It stays re-selectable while progress is at zero, because nothing is reserved until the completion tick, and it locks for real the moment it starts moving. The lock survives a save, a reorder of the recipe table, and being mined and replaced.
Five things stop a running batch, and the screen names each one. NEEDS HEAT means the tier fell below the recipe minimum. NO POWER means the buffer cannot pay this tick. OUTPUT BLOCKED means the product will not fit. BATCH INPUT LOST means an ingredient or the input fluid went away. RECIPE UNAVAILABLE means the locked recipe no longer exists, which cancels the batch losslessly rather than bricking the machine.
The quiet part is that a paused batch keeps accruing damage. The machine samples heat while stopped and counts time spent below or above the recipe's band against the finished grade, on the reasoning that a cold stalled still or a hot unpowered vessel really is spending time at the wrong temperature. One exception is deliberate: an OUTPUT BLOCKED stall does not sample, because a backed-up buffer is the normal state of an automated line and sampling through it would have rotted the charge it was protecting. A Fermenter is the worst case there, since its heat ceiling is zero and any lit brazier nearby counts as above band.
Emptying the input slots of a stalled batch is the cancel gesture. There is no cancel button; clearing the ingredients on purpose resets the batch.
Ferments organics in water (FE, no heat - too hot kills
the culture). Sugar/wheat/apple + water -> mash, and
grows antibiotic broth. Harmless CO2 only.
Set faces to input/output.
tooltip.doomedmatu.fermenter
"too hot kills the culture" understates it. The Fermenter's ceiling is tier 0, so a brazier lit nearby is already above band, and a batch stalled beside one keeps sampling that heat.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Stall codes | 1 needs heat, 2 no power, 3 output blocked, 4 input lost, 5 recipe unavailable, 6 batch mismatch | crafting/ActiveChemBatch.java:14-19, client/screen/MachineScreen.java:1034-1039 |
| Re-selection window | while batch progress is 0 | block/entity/ProcessMachineBlockEntity.java:113 |
| Stall that does not sample heat | OUTPUT BLOCKED only | block/entity/ProcessMachineBlockEntity.java:156 |
| Interruption penalty | 2 purity per stop/start, capped at 14 | crafting/ChemConditions.java:86 |
A batch stalled on NEEDS HEAT or NO POWER is still degrading
A paused batch keeps sampling the vessel temperature, and every tick spent outside the recipe's heat band counts against the finished purity and yield. Cold residence costs up to 10 purity and 30 percent of yield; hot residence costs up to 20 purity and 40 percent of yield. Each stop/start transition costs a further 2 purity, capped at 14. Only an OUTPUT BLOCKED stall is exempt, because a backed-up buffer would otherwise rot the charge it is protecting.
The machine picks the most specific recipe, and ignores whether the output has room
Recipe selection ranks candidates by how many item requirements they carry, so a recipe that asks for ingredients always beats one that asks for none on the same input fluid. Selection deliberately does not consider whether the product will fit, because dropping a blocked recipe out of the ranking hands the fluid to a less specific one and makes the wrong product. A full output is a reason to stall, not a reason to pick something else.
The machines
Eight of them share one block entity, configured by the block it sits in, and all run off one recipe table filtered by machine type.
The Drying Oven dries a wet solid. The Kiln roasts at high heat. The Slaking Vat takes an item plus a fluid and makes an item. The Fermenter takes an organic solid plus water and makes a fluid over time. The Still distils a fluid into a fluid. The Filter Press separates a slurry into a solid and a filtrate. The Recrystallizer takes a crude solid plus a solvent and makes a purer solid. The Evaporator boils a fluid down to a solid. Each has two input slots, one output slot, a 4,000 mB input tank and a 4,000 mB output tank, except that the Drying Oven, the Kiln and the Recrystallizer show no fluid bars at all.
The Reactor is its own class. Three reagent slots, a filtered input tank, an output tank, and no item output at all, since its product is always a drug fluid. Multi-step syntheses chain through it.
The Centrifuge takes a mixed solution apart. Its input tank accepts solutions only. Every 40 ticks, if it has 2,000 FE and its output tank is completely empty, it spins one component out at the purity that component held inside the solution and rebuilds the input without it. That empty-output condition is a real constraint: the Centrifuge sits idle until the last component is taken or piped away.
The Syringe Filler holds two syringes under a nozzle and fills them from its tank. Only empty or partly filled syringes go in, and only full ones come out of an Output face.
Around them sit the support blocks. The Battery Recharger takes any energy-capable item, including devices from other mods. The Oxygen Compressor refills a rebreather. The Ventilation unit is passive with no power at all and simply clears stale underground air for anyone within 8 blocks, which is what stops enclosed space adding extra grime.
The heart of drug synthesis. Load reagents in the 3
slots and a precursor fluid; needs FE and heat (a
brazier/heater beside it). Runs the chain raw opium ->
opium -> morphine -> heroin, and precursor + catalyst
-> fentanyl / naloxone / ceftriaxone, out as a drug
fluid. Set faces to input/output. Volatile - fumes
while running; deep syntheses can detonate over a flame
or when overheating.
tooltip.doomedmatu.reactor
Accurate down to the fluid-only output and the detonation condition.
The Ventilation unit does its work through the hygiene clock rather than through any machine: each loaded unit registers its position in a dimension-aware set and DirtinessHandler tests proximity against that set, so the 8 block sphere suppresses the extra grime enclosed air adds and touches nothing else. Needs and Survival
Glassware and fouling
The Reactor and the Evaporator hold a borosilicate flask. Right-click either with a flask in hand to fit one, and it will refuse if the fitted glass is already at full condition rather than wasting it.
The flask sets a purity CEILING, never a bonus. Fresh glass at 100 condition allows up to 100 percent purity. Empty or fully worn glass caps you at 60, which is street grade, and the machine still runs. Each completed batch wears 4 condition off, so a flask is worth about 25 batches.
Separately, every chemistry machine carries persistent vessel state that has nothing to do with the current batch. Completing work adds 9 residue plus a share of the recipe's fume potency, drops sterility to at most 55 for a wet process, adds microbial load, and shaves a point off the measuring instrument's calibration while letting its drift wander.
That state leaks into your product. Chemical carryover on the output is floored at 35 percent of the vessel's residue, and microbial load at 45 percent of the vessel's own, with an extra floor for invasive products made in a vessel below 90 sterility. A dirty machine makes dirty drugs however clean the inputs are.
Four buttons on the Chemistry tab handle it, and each needs a specific thing in your inventory. Rinse consumes a water bucket, zeroes residue and removes 30 microbial load, but it explicitly caps sterility at 45 because washing is not sterilizing. Sterilize consumes a bleach and sets microbial to zero and sterility to 100, but it REFUSES outright while residue is above 5. You cannot seal dirt under a clean surface. Calibrate costs 750 FE from the machine's own buffer and resets the instrument. Assay consumes 10 mB of product or one output item and reads back purity and contamination with an uncertainty band.
That band is the point. The assay never reveals a true number. It reports a value shifted by the instrument's drift and jittered inside a window that narrows with your Intelligence and widens as calibration decays. A machine you never calibrate lies to you about its own product.
All four actions refuse while a batch is genuinely moving, but not while one is merely selected at zero progress, so a machine backed up on a full output can still be serviced.
Lab glassware for the Reactor.
Fit it to raise the purity ceiling toward pharma grade.
It clouds over with use - re-fit a fresh one when it does.
tooltip.doomedmatu.borosilicate_flask
"purity ceiling" is exactly the right word for what the glass does. The first line names only the Reactor, and the Evaporator takes one too.
The vessel's microbial floor rides out on the product and lands in a limb: DrugService reads the microbial figure off the injected syringe, scales it by dose volume at 0.35 and caps it at 35, and a seed of 3 or more flips the limb to infected and files an INFECTED case note, so a fouled machine is a source of infection several steps removed from the needle. Disease and Infection
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Glassware wear | 4 condition per batch, about 25 batches per flask | crafting/Glassware.java:14 |
| Purity ceiling with no glass | 60 | crafting/Glassware.java:15 |
| Residue added per batch | 9 plus fume tenths / 3 | crafting/ChemistryEquipmentState.java:47 |
| Sterilize refusal threshold | residue above 5 | crafting/ChemistryEquipmentState.java:70 |
| Rinse sterility cap | 45 | crafting/ChemistryEquipmentState.java:62 |
| Assay sample cost | 10 mB of fluid, or 1 output item | crafting/ChemistryEquipment.java:32 |
| Assay purity uncertainty | 2 to 22 points, narrowed by Intelligence, widened by lost calibration | crafting/ChemistryEquipmentState.java:90 |
Assay readings are deliberately wrong
The assay never reports the true purity. It shifts the value by the instrument's accumulated drift, then jitters it inside a window between 2 and 22 points wide for purity and 3 to 30 for contamination. The window narrows with your Intelligence stat and widens as calibration decays, and calibration falls by 1 with every batch. An uncalibrated machine misreports its own product, consistently in the direction its drift has wandered.
Sterilizing is refused while residue is above 5, and rinsing caps sterility at 45
The two cleaning actions are ordered and cannot be substituted for each other. Bleach refuses to run on a fouled vessel because sterilization cannot seal dirt under a clean surface. Rinsing with water zeroes residue and takes 30 off microbial load, but explicitly drops sterility to at most 45. The only path to a clean vessel is rinse first, then sterilize.
FRAGMENT 09-B - FIELD JOURNAL, ENTRY 'CLEAR'
SUMMARY: Four pages, filed under BODY, unlocked in order and only by getting the maintenance sequence wrong at a real machine. Page 0 arrives when a rinse leaves microbial load behind on a vessel still under 90 sterility. Page 1 arrives when the Sterilize button refuses because residue is above 5.
RESPONSE: "The heat did nothing useful. There was still material baked against the inside... I nearly used the vessel anyway. It had been heated. I had done the serious-looking part. That should have counted for something. It doesn't. Dirt first. Then heat. Sterilizing something filthy only makes hot filth."
FINAL NOTE: The last page is not awarded for cleaning anything. It waits for a contaminated injection to produce a real limb infection - a microbial seed of 3 or more out of the syringe, twenty seconds elapsed, the limb genuinely flagged infected - and it also demands that page 2 has already been read. So the entry cannot close until the vessel you neglected has put something into somebody. The refusal that unlocks page 1 sends the player no message at all; the button simply does nothing.
data/doomedmatu/doomed_journal_entries/clear.json; network/C2SChemistryActionPacket.java:68-101; journal/FieldJournalObservationTracker.java:90-96, 168-183; body/DrugService.java:505-523
Hazards
A running machine rolls for hazards every ten ticks, which is twice a second. The rolls are per half-second of exposure, not per batch.
A flammable step carries a base 0.1 percent per roll, which works out to roughly 6 percent across a 30 second run. An open flame adjacent adds 0.4 percent per roll, taking the same run to around 26 percent. Overheating adds 0.8 percent, taking it to around 42 percent. A non-flammable machine pushed above its ceiling still rolls 0.15 percent for a heat incident.
The Still and the Evaporator are the flammable process machines. The Reactor is always flammable and its high-energy syntheses are also violent, which means an open flame or an overheat can produce a real blast rather than a fire.
A fire is placed on top of the machine so it persists and can spread to a wooden floor. A blast has a 4 block radius, applies wounds and knockback through the body sim, and deliberately does NOT break blocks, so it will hurt you badly without cratering your base.
There is a separate roll for the datapack's material risks. A sealed over-pressured process and an incompatible vessel each contribute, and at risk level 2 or above the result is a blast rather than a fire.
The practical rule is that an RF Heater is much safer than a brazier for any flammable step, and that three heaters around a machine is not a bonus, it is an over-fire that both damages the product and multiplies the ignition roll.
A distillation still. Needs FE and heat. Distils mash
-> ethanol and purifies solvents and water. Flammable
vapour - can flash to fire over a flame or when
overheating. Choking fumes. Set faces to input/output.
tooltip.doomedmatu.still
Names both escalating conditions and leaves the per-roll odds off, which is the difference between a warning and a decision.
The blast goes through the mod's own Explosion.detonate with block breaking switched off, so what reaches you is the body sim's wound and knockback treatment rather than vanilla explosion damage, and the machine is then set alight on top for good measure. Injury and Treatment
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Hazard roll interval | every 10 ticks | block/ChemHazards.java:24 |
| Ignition chance, controlled heat | 0.1% per roll, about 6% over 30 seconds | block/ChemHazards.java:28 |
| Ignition chance, open flame | +0.4% per roll, about 26% over 30 seconds | block/ChemHazards.java:29 |
| Ignition chance, overheating | +0.8% per roll, about 42% over 30 seconds | block/ChemHazards.java:30 |
| Blast radius | 4 blocks, no block destruction | block/ChemHazards.java:34, 76-78 |
Three RF Heaters is worse than two
Two adjacent running heaters give tier 3, which is forge grade and the safe ceiling for every recipe. Three or more give tier 4, which is over-fired. Overheating costs 16 purity per tier above the ceiling, removes 22 percent of yield per tier, and raises the ignition roll on a flammable step by 0.8 percent per half second, roughly 42 percent across a 30 second run.
The cold chain
Food ages inside containers. Chests are not ticked, so instead of scanning every loaded block the mod stamps each food stack with a game-time mark and charges the elapsed time as rot the next time the stack is seen, either when a container GUI opens on it or when it lands back in a ticked player inventory. The enclosed rate is half the carried rate, still scaled by local biome temperature: cold keeps, heat spoils. Game time runs while a chunk is unloaded, so food in a plain chest genuinely ages while you are away.
A gap of 60 ticks or less counts as actively managed and is skipped, which is what stops the freezer and the icebox double-charging their own contents.
The Icebox is the unpowered answer. One fuel slot takes snow or ice and nine slots hold food. While a charge is melting, food spoils at a flat 10 percent of its carried rate with no biome multiplier, because the ice sets the climate. A snow block lasts 5 minutes, ice 20 minutes, packed ice an hour, and blue ice three hours. The melt only runs while the chunk is loaded, and food is kept across an unloaded stretch if the box went to sleep with a live charge.
The Freezer is the powered top tier. Nine slots, a 64,000 FE buffer, and an upkeep of 2 FE per second charged only while it holds something. A full buffer off-cable is about nine hours of preservation. While powered it re-stamps ordinary food every second, so no time passes for it at all. Out of power it degrades to a plain enclosed container.
Biological perishables ignore that pinning and map cold to their own rate instead. A transplant organ is fully arrested in a powered freezer and runs at 20 percent in an icebox. A blood bag runs at 10 and 20 percent. A cadaver torso and an opened saline bag both run at 15 and 35 percent, so neither ever fully stops.
Two details bite. Both boxes charge the stale warm interval at ambient before their own cold context takes over, so restoring power cannot retroactively refrigerate the minutes a bag already spent in a chest. And both refuse anything that is not food, a blood bag, an organ, a cadaver torso or saline, which means meds have to live somewhere else.
Powered cold storage - feed it FE from cables. While it
has power, food inside does not spoil at all; unpowered
it is only as good as a chest.
tooltip.doomedmatu.freezer
Both halves of the second sentence are exact for food. An organ, a blood bag, a cadaver torso and a saline bag all sit in the same nine slots and none of them are pinned. The cables are still not in the mod.
A transplant organ is the one perishable a powered Freezer arrests completely at 0.0, and it bypasses the food re-stamping entirely to get there, so organ viability is governed by TransplantOrganItem's own cold table rather than by anything the Freezer does for food. Organs
A blood bag never fully stops - 0.1 in a powered Freezer and 0.2 in an Icebox - and the settle call that runs when you place a packed cold box back down treats every perishable inside it as AMBIENT, so moving a stocked Freezer costs the bags the whole journey at room rate. Blood and Circulation
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Enclosed rot rate | 0.5x the carried rate, times biome temperature | body/ContainerSpoilage.java:45, 54-58 |
| Managed-gap threshold | 60 ticks | body/ContainerSpoilage.java:48 |
| Icebox chilled rate | flat 0.10x, no biome multiplier | block/entity/IceboxBlockEntity.java:45 |
| Ice melt durations | snow 6,000 ticks, ice 24,000, packed ice 72,000, blue ice 216,000 | block/entity/IceboxBlockEntity.java:48-54 |
| Freezer upkeep | 2 FE per second while holding contents (~8.9 h on a full 64,000 FE buffer) | block/entity/FreezerBlockEntity.java:51 |
| Organ cold rates | 0.0x powered freezer, 0.2x icebox | item/TransplantOrganItem.java:195-201 |
| Blood bag cold rates | 0.1x powered freezer, 0.2x icebox | item/BloodBagItem.java:265-271 |
| Cadaver and saline cold rates | 0.15x powered freezer, 0.35x icebox | item/CadaverTorsoItem.java:202-208, item/SalineItem.java:87-94 |
A powered freezer stops time entirely for food, but never for an organ
While powered, the freezer re-stamps every ordinary food stack's rot clock once a second, so no time passes for it at all. Biological perishables bypass that and map cold storage to their own rate: an organ is fully arrested at 0.0, a blood bag runs at 0.1, and a cadaver torso or an opened saline bag runs at 0.15 and never stops. Both boxes also charge the stale warm interval at ambient before their own cold context takes over, so restoring power cannot retroactively refrigerate minutes already spent in a chest.
Notes
- The RF Heater, the Cooler and the Fume Hood all run on PoweredClimateBlockEntity, which spends 12 FE once every ten ticks. That works out to 24 FE a second, so a full 64,000 FE buffer lasts around 44 minutes. The block tooltip and the field's own comment both promise about 4.5 minutes, which is what the same 12 would mean if it were charged every tick instead. The 2026-08-17 machine audit found the disagreement and recorded it as a balance decision rather than a typo, so the code is presumably the intended half. Which of the two numbers Matt actually meant was never written down.
- Every one of the 68 shipped chemistry rows averages under 13.34 FE per tick over its run, and the Fuel Generator makes 20, so the process machines and the Reactor are tuned to a single touching generator with headroom to spare. The Centrifuge is the one that breaks that: 2,000 FE every 40 ticks is 50 FE per tick sustained, which means one generator spins a component roughly every five seconds rather than the two its tooltip advertises. Whether the spin cadence was ever checked against the only power source in the mod is not recorded anywhere.
- The declared intake rates - 1,024 FE per tick on most machines, 2,048 on the Reactor - are between fifty and a hundred times anything Doomed itself can deliver. They only ever matter to a foreign cable. Nothing in the source says whether those figures were sized for a modpack supply on purpose or simply carried over from the template the first machine was written against.
- The generator's push walks Direction.values(), so DOWN is offered power first, and the offer is capped by whatever is sitting in the buffer when the sweep starts. A full buffer feeds all six neighbours at once. A generator in steady state holds about 20 FE, and the block underneath it takes that before anything else is asked. The ring of machines around one generator that the layout section describes is therefore not evenly fed once the buffer runs dry, and the ordering is nowhere discussed in the source.
- The commit that finally made a None face stop a hopper ends with a plain instruction: hopper under an Evaporator, cycle that face to None, confirm the inputs stay put. No later commit, changelog entry or checker run records anyone having done it. The audit left two more the same way, the comparator rescale against redstone that already exists in a world, and the Syringe Filler on an intermittent supply.
- reference/MACHINE_OUTPUT_AUDIT.md closes with "Nothing here has been changed. This is an audit." At least four of its confirmed defects have since been fixed in code - the Evaporator recipe hijack, the one-fifth syringes, saline being refused by both cold boxes, and the organ transport gap on a mined Freezer - and the document was never revised to say so. Which of its 24 minors still stand has to be re-read against the source one at a time.
PART IV - THE FIELD
Items, World and Trade
Doomed adds several hundred items and about a hundred blocks, and almost none of them are craftable from a recipe book. The supply lines are worldgen scatter, four kinds of lootable container, three medicinal herbs you cut and grind yourself, and two wandering merchants who are the only source of ammunition in the game. Everything you carry has a mass, most of what you eat has a spoilage clock, and both of those numbers move whether or not you are looking at them. This page is the map: what exists, where it comes from, and which of its rules the game never tells you.
Supply
Five supply routes, and they barely overlap.
World generation runs two scatter features, one on the surface and one in caves, plus a buried trader room and a bounded underground jungle. Both scatter features touch only newly generated chunks. Switch one on mid-save and it populates nothing you have already walked over.
Loot arrives in four containers: the Locked Crate and the Sealed Pod that generate in caves, the Drop Capsule that crash-lands under a ceiling breach, and the Rooted Cadaver in the cyst jungle. The first three roll from configurable weighted tables in the server config rather than from datapack loot tables.
Crafting exists, deliberately thin. 109 shipped recipes cover the herbal medicines, the climate gear, the chemistry machines and a handful of tools. The old internal material catalogue was stripped out: DoomedMaterials registers nothing at all, so Doomed ingots, cloths and scrap are gone from the game.
Traders are the fifth route and the widest. A general shelf is built by scanning every item the mod registers and keeping the ones with a curated trade value between 1 and the wallet cap, which is how most of the food catalogue and most of the placeable traps reach a survival world at all.
The last thing to know is that everything in the inventory weighs something. Base carrying capacity is 11 kg, shifted by body composition, sickness, hunger, thirst and the Strength and Resilience skills.
The WITNESS tablet indexes an ITEMS page for any Doomed item the player has physically held. It indexes what you have touched, and nothing else.
Worldgen-placed machines and crates do not drop themselves
Thirty-two block types are on a datapack tag called nonrecoverable_when_generated, and world generation records the exact position of every one it places into per-dimension saved data. When you break such a block, a global loot modifier looks up that position and, if it was authored by generation, strips the block's own item out of the drops. Container loot and unrelated salvage are untouched. The list covers every chemistry machine, the Freezer, the Icebox, the Battery Recharger, the Fuel Generator, the Oxygen Compressor, the Fluid Barrel, the Brazier, the Pestle and Mortar, the Heater, the Cooler, the Fume Hood, the Sealed Pod, the Locked Crate, the Radioactive Barrel, the Sound Cannon and the Lifepod Console. A block you placed yourself is unaffected, because player placement is the default and only generation opts a position in.
FRAGMENT 01 - CRAFTING CATALOGUE, EMPTY STATE
SUMMARY: The K key opens a panel headed "Crafting" and subtitled "Where Doomed gear actually comes from." The recipe registry behind it holds nothing, so the list never populates. What renders instead was written by hand for the empty case, after an earlier version promised players they could craft their way to more recipes.
RESPONSE: Doomed gear is FOUND, not crafted from a secret list: - the crafting bench: every mod recipe is in the vanilla recipe book - locked crates, sealed pods and drop capsules (bring lockpicks) - the traders - the maid and the adventurer buy and sell most medicine - the world: herbs for the knife, kelp for iodine, ferns for warmth
FINAL NOTE: Forty source-transcribed recipes remain in Recipes.java inside a method nothing calls. Some of them consume rope, canvas and scrapmetal, none of which register as items any more. The screen is the only part of that system a player will ever see, and it has been told to tell the truth.
~/client/screen/CraftingScreen.java:60-83, with the empty registry at ~/crafting/Recipes.java:49-53 and the retained bootstrap() below it
FRAGMENT 03 - DEAD ARCHIVE TERMINAL
SUMMARY: One of the six Cyst payoff structures is a flooded record room, thirteen by seven by eleven. At local position (6,2,7) it places a terminal. The terminal is a name, a facing direction and a hardness value. It has no block entity, no interaction and no screen.
RESPONSE: "Dead Archive Terminal" "Directional, deliberately inert scenery for failed Cyst-biome facilities." "The archive cannot provide readable Matu lore until canonical copy and a server-authoritative interaction are chosen. The structure therefore communicates only through its damaged environment and a non-interactive dead terminal."
FINAL NOTE: The terminal is on the nonrecoverable_when_generated tag, so the one in the archive cannot be carried home and studied either. A player who finds the room finds a machine that was already dead when the room was authored, and the archive holds exactly as much as the record does.
~/block/RuinPropBlock.java:11; the withheld-lore clause under "Deliberately unresolved in resources" in reference/CYST_PAYOFF_STRUCTURE_CONTRACT.md; placement at tools/generate_cyst_payoff_structures.py:296
Surface
One attempt per chunk, on the world-surface heightmap, in every biome the feature is added to. The cell has to be air with sturdy ground under it. Then the rolls run in a fixed order, beneficial plants ahead of hazards.
First is climate ferns at 12 percent. Which fern appears is decided purely by the biome's base temperature: Sun-Fern at 1.0 and above, Frost-Fern below 0.3. Temperate ground gets neither. A hit scatters three to six plants across a patch about five blocks wide, and each drops one or two Fern Fibre.
Second is wild opium poppies at 5 percent, in the temperate band the ferns skip. They generate fully mature, so a found patch is harvestable for latex and seeds on the spot. The roll is gated on the opioid config switch: with opioids off it still consumes the cell and places nothing.
Third is medicinal herbs at 9 percent, partitioned across the whole temperature range with no gaps. Bittermoss below 0.3, Woundwort from 0.3 up to 1.0, Feverbell at 1.0 and above. Same three to six bush patch as the ferns.
Hazards roll last, so trap density can be raised without ever costing a plant cell. A minefield is 0.8 percent and seeds 14 to 20 landmines across a 24-block spread. A grabber plant is 3 percent, and it keeps 48 blocks clear of world spawn.
A warm-climate fern. Harvest it for fern fibre - the
crafting material for insulation gear and the hot-drink
/ cold-pack. Grows where the heat is worst.
tooltip.doomedmatu.sun_fern
The tooltip describes the climate by feel. The feature reads a number: base temperature 1.0 and above, or nothing.
The poppy roll reads the opioid kill switch directly rather than only the loot tables, on the reasoning written into the feature itself: the plant is the opioid supply, so the switch has to reach the ground it grows in. Drugs and Pharmacology
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Climate fern chance | 12% | ~/worldgen/SurfaceScatterFeature.java:43 |
| Fern and herb patch size | 3 to 6 plants, 7x7 area | ~/worldgen/SurfaceScatterFeature.java:128-131 |
| Wild poppy patch chance | 5%, 3 to 5 mature plants | ~/worldgen/SurfaceScatterFeature.java:48,104 |
| Medicinal herb chance | 9% | ~/worldgen/SurfaceScatterFeature.java:67 |
| Herb biome split (base temperature) | Bittermoss below 0.3, Woundwort 0.3 to 1.0, Feverbell 1.0 and above | ~/worldgen/SurfaceScatterFeature.java:62-66 |
| Minefield chance and size | 0.8%, 14 to 20 mines over 24 blocks | ~/worldgen/SurfaceScatterFeature.java:71,147 |
| Grabber plant chance | 3% | ~/worldgen/SurfaceScatterFeature.java:79 |
| Grabber exclusion around world spawn | 48 blocks | ~/block/entity/GrabberPlantBlockEntity.java:41 |
Depth
Ten attempts per chunk, between Y -58 and Y 48. Each one needs open cave air, and then splits on geometry: a floor cell with headroom gets the floor table, while a cell with a sturdy wall or ceiling beside it gets a mounted hazard.
Depth is a single fraction, 0 at sea level and 1 at the bottom of the world, and it does two separate jobs. It ramps the floor-trap chance from 12 percent up to 52 percent, and it decides which family of trap you meet. The upper third is low-tech snares: spike traps, caltrops, bear traps. The middle third is failing base tech, adding live wire, sawblades and gunmines. The bottom third is the lethal tier, where landmines and electrified coils appear.
Some things ignore depth entirely. Locked crates sit at a flat 25 percent of every floor cell, which makes them the commonest find underground at any level. Fluid barrels are 4 percent. Sealed Pods and lifepod consoles are 5 percent, and only below Y 63. Drop capsules attempt only below Y 58.
Other things want depth and space together. Radioactive barrels and crystal formations need depth past 0.5 and a genuinely big cavern. Crystal caverns are seed-stable regions, so a whole cave shares one theme, and the tunnels leading toward one carry a thinning trail of single shards. That trail is the warning.
Wall and ceiling mounts are a 50 percent roll. Below depth 0.25 it is always a sound cannon; deeper, a gun turret about 45 percent of the time.
A volatile red crystal. Touch it (or strike it) and a
short fuse lights, then it detonates - real TNT that
breaks terrain. Connected crystals blow as ONE summed
blast, so a big cluster is a cave-clearing bomb.
tooltip.doomedmatu.crystal_unstable
The tooltip covers what one crystal does once you are standing next to it. The depth gate and the shard trail that leads you there are not on it.
The mounted sound cannon and the gun turret enter a world through this pass and nowhere else in worldgen, so the depth fraction that raises your odds of a floor trap is also the number deciding whether the thing on the wall shouts at you or shoots. Threats
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Cave attempts per chunk | 10, from Y -58 to Y 48 | res/data/doomedmatu/worldgen/placed_feature/cave_scatter.json |
| Floor trap chance | 12% + 40% x depth fraction | ~/worldgen/CaveScatterFeature.java:248 |
| Depth band boundaries | 0.33 and 0.66 of the way from sea level to bedrock | ~/worldgen/CaveScatterFeature.java:260-261 |
| Locked crate chance per floor cell | 25% | ~/worldgen/CaveScatterFeature.java:54 |
| Fluid barrel chance | 4% | ~/worldgen/CaveScatterFeature.java:220 |
| Sealed Pod / lifepod console | 5%, only below Y 63 | ~/worldgen/CaveScatterFeature.java:231 |
| Drop capsule | 16% per eligible attempt, only below Y 58 | ~/worldgen/CaveScatterFeature.java:238; DoomedConfig.java:2560 |
| Wall or ceiling mount chance | 50%, turret instead of cannon 45% of the time past depth 0.25 | ~/worldgen/CaveScatterFeature.java:50,144-145 |
Containers
A Locked Crate opens with the lockpicking minigame. The crate stores a hidden sweet-spot bearing between 5 and 175 degrees and a success half-band of 4 degrees, and it keeps that angle for its life. A lockpicking kit needs Intelligence 10 or higher to use; below that the game forces the bare-handed pick. The server records which player opened the minigame on that specific crate, so a forged solve packet achieves nothing. Cracking it consumes the crate and drops exactly one weighted entry. A player not running the Doomed body sim skips the minigame entirely and pries the crate for iron, gold or an emerald.
The Sealed Pod is a keypad. The code is shown on screen; the lock is the tedium of entering it. Solving it drops two guaranteed-different items from a purely medical table.
The Drop Capsule is the high-risk tier. Defusing it in time spills three to five distinct entries, and its table adds real food, iron, gold, an occasional diamond, and the rare chemistry entry points: poppy seeds, a fentanyl precursor, a naloxone precursor.
All three tables live in the server config as "id count weight" strings, where weight 3 is a common consumable, 2 an uncommon potent one, 1 a rare durable tool. The crate table adds a pistol, rifle or shotgun at weight 1 each, plus loose rounds at weight 5 or 6. Found guns arrive with no Rounds tag. They dry-fire until you find ammunition.
The Batch Blending Barrel is separate and rolls fluids rather than items. Half hold one fluid, 18 percent a crude mix, 22 percent plain water, 10 percent nothing. Within the single-fluid half the tier roll is 80 percent field stock, 18 percent clinical, 2 percent advanced.
A sealed Doomed-only pod. Right-click to open the
keypad and punch in the shown code - a slow, fiddly
entry - to spill one rare drug from its loot. Vanilla
players can't crack it.
tooltip.doomedmatu.keypad_pod
The tooltip promises one rare drug. The pod pays out two guaranteed-different items from its medical table.
Three capsule entries at weight 1 each - opium poppy seeds, a fentanyl precursor and a naloxone precursor - are the loot route into the drug chemistry chain; the wild poppy patch is the only other way in that skips a trader. Reagents and Routes
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Lock angle range and tolerance | 5 to 175 degrees, 4 degree half-band | ~/block/entity/LockedCrateBlockEntity.java:17-18,27 |
| Intelligence needed to use a lockpicking kit | 10 | ~/block/LockedCrateBlock.java:72 |
| Container yields | crate 1 entry, pod 2 distinct, capsule 3 to 5 distinct | C2SLockpickSolvedPacket.java:63; C2SKeypadSubmitPacket.java:60; DropCapsuleBlock.java:419 |
| Gun and ammunition weights in the crate table | guns 1 each; 9mm x4 at 6, 5.56 x3 and 12 gauge x3 at 5 | ~/config/DoomedConfig.java:1577-1590 |
| Non-Doomed player crate loot | iron x4, gold x3, emerald x2 | ~/config/DoomedConfig.java:1592-1594 |
| Barrel content split | 50% single fluid, 18% crude mix, 22% water (2 to 16 L), 10% empty | ~/worldgen/CaveScatterFeature.java:447-465 |
| Barrel tier split | 80% common, 18% clinical, 2% advanced | ~/worldgen/CaveScatterFeature.java:451-453 |
| Common barrel pool weights | saline 24, opium 22, relief cream 10, biochem 8 | ~/worldgen/CaveScatterFeature.java:75-80 |
The cyst jungle
The cyst jungle is a bounded underground pseudo-biome. The world is cut into deterministic 8x8-chunk regions, one region in sixteen is selected, and that region is carved between roughly Y -58 and Y -8. Several resources exist here and only here.
The Swollen Cyst Bush is the biome's real food. Right-clicking a bush at age 2 or 3 picks one to three Gall Berries and drops the plant back to age 1, so a patch keeps producing. Breaking it destroys the plant but yields more and respects Fortune. Shears keep the bush itself for replanting.
A raw Gall Berry is 3 nutrition, and it pushes a spore dose of 6 through the same exposure channel the biome's air uses. Cooking removes that entirely and raises the shelf life from 20 minutes to 60. It also costs the berry a third of its vitamin C.
The Water-Pod Bush is the safe water. A mature pod yields 250 mL of clean water: right-click empty-handed for a Sealed Water Pod to drink whole, or present a glass bottle, a Cyst-Filtered Water bottle or a canteen to fill it. Pods regrow up to three per plant on random ticks.
Feeler Fronds cut to Cyst Fibre, which crafts a dust mask underground, so a long trip can resupply its own protection. Cyst Spore Blooms cut to Spore Caps, and three of those dried in a Drying Oven make an Antibiotic Culture. That is the biome's real payoff.
Rooted Cadavers are searchable once. Right-click and they hand over one or two medical items and set their SEARCHED state. Breaking one interrupts its brood instead, and forfeits the search.
The only real food in the deep growth.
Filling, and it eats at your lungs raw - cook it first.
tooltip.doomedmatu.gall_berry
What eats at the lungs is the spore dose of 6, delivered down the same exposure channel as the biome's air.
The raw berry's dose of 6 and the 12-point dose from an unboiled mouthful of cavern water land on the same spore burden the biome's air fills; past 35 that burden starts adding sickness on its own, and at 100 it seeds Marrow Worm unless an antiparasitic is already running. Disease and Infection
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Region selection | 1 in 16 of the 8x8-chunk regions | ~/config/DoomedConfig.java:2591; CystRegionLayout.java:20 |
| Cyst cavern depth | roughly Y -58 to Y -8 | ~/worldgen/CystGroveFeature.java:139-140 |
| Berry pick yield | 1 to 2 at age 2, 2 to 3 at age 3 | ~/block/CystBerryBushBlock.java:83 |
| Raw Gall Berry spore dose | 6 | ~/registry/DoomedConsumables.java:78 |
| Gall Berry shelf life, raw and cooked | 20 minutes and 60 minutes | ~/registry/DoomedConsumables.java:135,139 |
| Water pod volume and capacity | 250 mL per pod, up to 3 pods per plant | ~/block/CystWaterPodBlock.java:53,182 |
| Antibiotic Culture from spore caps | 3 Spore Caps, 400 FE, 160 ticks in a Drying Oven | res/data/doomedmatu/doomed_chemistry/shipped_processes.json |
| Rooted Cadaver search yield | 1 to 2 items, once per corpse | res/data/doomedmatu/loot_tables/blocks/cyst_rooted_cadaver.json |
Herbalism
Three wild bushes, one mill, six products, and iron is nowhere in it.
The Foraging Knife is flint, a stick and string. Its real function is on the loot side: herb bushes and glowcap check for it by name in their loot tables and drop two instead of one. It loses a point of durability every time it cuts a bush, and that includes ferns and tall grass, so it wears down on the walk between patches. 128 durability, and no repair.
Woundwort, Feverbell and Bittermoss drop their raw leaf, flower or clump. A placed Pestle and Mortar grinds any one of them into its ground form at one-for-one through a stirring minigame, and the mill itself is stone and a stick.
The crafted medicines are all shapeless. Two Woundwort Paste and a Ripped Dressing make a Herbal Poultice, which restores 18 skin, halves the wound's bleeding, gives 20 pain relief and disinfects for 20 seconds. Two Bittermoss Pulp and a water bottle make a Bittermoss Wash, which barely restores skin but disinfects for 90 seconds, and that long window is the early answer to infection. Two Feverbell Powder and sugar make a Feverbell Chew, a non-opioid painkiller worth 12 on the NSAID channel with no breathing risk and a 4-point mood cost. One of each ground herb plus a glass bottle makes a Herbal Tonic, which removes 10 sickness, hydrates by 18, nudges energy by 5 and tastes bad enough to cost 6 happiness.
Bittermoss Pulp is also the binding agent in the standard Bandage recipe. Bandages are tied to foraging, not to a trader.
Glowcap is the cave's renewable answer to both food and bandages. It generates on cave floors at a 12 percent per-cell chance behind its own config switch, in patches of one to four, and it roots on any solid floor rather than only on dirt. Cutting it with a foraging knife gives two Glowcap Clumps.
Eaten, a clump is 2 nutrition, 4 mL of water, 3 sickness and a small mood lift. Ground in a pestle it becomes Bittermoss Pulp, the bandage binder, so a cave dweller keeps a full bandage supply without ever going home. It has a 24-minute shelf life. Glowcap spreads only where it is replanted, and replanting is the whole of farming it.
Light sources are worth reading carefully, because two of them are consumable in a way nothing warns about. The Doomed Torch has no battery and no toggle. It burns down its condition passively at a 30-minute rate and is destroyed at zero, placed or not. The Roselight does the same over 60 minutes. Both of those clocks run in your inventory.
The toggle lights work the other way round: they drain only while switched on. The Flashlight runs 66 minutes on a medium cell, the Lantern 120 minutes, and the Emergency Light 10 minutes before it is destroyed. The Flashlight's housing is rated for a medium battery, so a small cell runs it half as long and a large one does not fit at all.
A temperate meadow herb. Harvest the leaf, grind it,
and craft a herbal poultice - a weak early dressing.
tooltip.doomedmatu.woundwort
The tooltip calls the poultice weak and the numbers agree: 18 skin, half the bleeding, 20 seconds of disinfect.
The knife has a second use nothing in the herbalism loop hints at: right-click a landed severed limb with it and the limb is cut into Raw Human Flesh, one to five portions depending on which part came off, each stamped with the donor's UUID, a tissue-risk figure for that part, and a flag copied from whether the donor was carrying a live prion load at the moment you cut. Injury and Treatment
Turning opioids off reshapes the odds of every table it touches
The opioid kill switch does not substitute a replacement item. It deletes the disabled entries from the weighted pool before the pick is made, in loot tables, in trader shelves and in fluid barrel filling alike. The remaining entries keep their own weights relative to each other, so with opioids off a Locked Crate becomes measurably more likely to hand you a bandage or a gun, not less likely to hand you anything. Wild poppy patches also stop generating in new chunks, though poppies already in an old world stay put and simply lead nowhere.
The climate gate
Planting a leaf gives a cultivated crop block, a different block from the wild bush. Existing wild patches are untouched, and worldgen keeps placing the wild version. Crops have four growth stages rather than the usual eight, and they accept farmland, dirt, grass, coarse dirt, podzol, rooted dirt or moss block.
Each crop grows only inside its own temperature band, and the band is read from the same felt-temperature service the body reads. That scale is centred on 37, with the cold band below 35 and the warm band at 39 and above. It is not the biome number. It is the biome band offset plus weather, plus time of day, plus enclosure, plus depth, plus any Heater or Cooler in range through unobstructed line of sight.
Out of band, the crop survives. It sits at its current stage and refuses to advance, and bone meal is refused on exactly the same test, so the climate cannot be bought past. Breaking a dormant crop returns the leaf, so bad siting costs time and leaves seed stock intact.
Bittermoss is the awkward one. It wants cold, and it wants no sky above it, and darkness at night fails the test because the test is sky exposure rather than light level. A Cooler can supply the cold. Nothing can counterfeit a roof. Wild bittermoss also propagates on its own from a placed cutting through two growth steps at a one-in-nine roll, with no bone meal interface at all, and a cutting will not reach maturity if there are already four mature plants within five horizontal blocks.
A living cutting. Plant under cover in sustained cold; a
powered Cooler can maintain the climate. It matures slowly
and cannot be forced with bonemeal.
tooltip.doomedmatu.bittermoss
Two different refusals share one sentence here. The cultivated crop refuses bone meal on the band test; the wild cutting has no bone meal interface at all.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Growth stages | 4 (age 0 to 3) | ~/block/HerbCropBlock.java:35 |
| Climate band boundaries | cold below 35, warm at 39 and above, temperate between | ~/body/LocalClimateService.java:34-35,166-169 |
| Biome band offsets to the felt temperature | +8 at base temp 1.5+, +4 at 1.0+, 0 at 0.3+, -4 at -0.1+, -10 below | ~/body/LocalClimateService.java:250-256 |
| Night, rain and thunder temperature offsets | Night -3, applied wherever you are. Rain -3 and thunder -5 apply only under open sky and are mutually exclusive, not additive. | ~/body/LocalClimateService.java:38-42 |
| Enclosure and depth bonuses | +1.5 under a roof, up to +3 more below Y 0 | ~/body/LocalClimateService.java:47,159 |
| Wild bittermoss growth roll | 1 in 9 per random tick, two steps to maturity | ~/block/BittermossBlock.java:27,55-58 |
| Bittermoss crowding limit | 4 mature plants within 5 horizontal blocks | ~/config/DoomedConfig.java:2577; BittermossBlock.java:28 |
Cultivated herbs read the same felt temperature your body does, so weather and time of day stop them growing
A herb crop's growth band is checked against LocalClimateService, the same positional service that drives physiology and the WITNESS readouts. That scale is centred on 37, with cold below 35 and warm at 39 and above. It starts from a biome band offset, then subtracts 3 for night and 3 more for rain under open sky, adds 1.5 for being under a roof, adds up to 3 more for being below Y 0, and adds whatever a Heater or Cooler contributes through unobstructed line of sight. A Woundwort plot in an open temperate field sits at 37 during the day and drops to 34 at night, which is out of band, so it simply stops advancing until morning. Conversely, an enclosed room deep underground in a temperate biome can read 39 or higher on depth and roof bonus alone, which is enough to grow Feverbell nowhere near a desert.
Water
The Canteen is a leather and iron craft and holds six sips of 100 mL each. Aim at a water source and right-click to fill it; right-click again to drink one sip, worth 9 thirst.
Raw water is murky. Every murky sip adds between 6 and 14 sickness, scaled by the dirty-water config multiplier. Right-clicking a lit heat source with a full murky canteen boils the whole thing clean in one action, and the list of things that count is wider than a campfire: a lit Brazier, a lit RF Heater, any campfire, any lit furnace or smoker, and a magma block. The temperature-tier braziers double as water purifiers for exactly this reason.
Contamination survives a top-up. Filling a canteen that already holds tainted water leaves the whole thing tainted, so drinking one bad sip to open a slot and refilling at a clean pond launders nothing. Boiling and drinking it dry are the two ways out.
Water drawn inside cyst territory carries spores rather than ordinary murk. That flag is tracked separately, boiling leaves it alone, and the canteen relabels itself when it happens.
The alternative supplies are the Sealed Water Pod, 250 mL of clean water drunk whole for 22.5 thirst, and the Cyst-Filtered Water bottle, a reusable 250 mL container. Vanilla and modded bottled drinks give a flat 15 thirst per use, because a potion cannot be sipped.
Thirst runs on the same bar hunger uses, and it drains faster the hotter the core runs.
A refillable canteen. It starts empty, so find something to put in it.
tooltip.doomedmatu.canteen
That is the whole of what the canteen tells you. The murk, the boiling, and the taint that survives a top-up are all off the label.
Thirst divides by 26 less half a point for every degree your core sits above 37, so the canteen empties faster the hotter you run, whatever put the heat there. Needs and Survival
Canteen contamination survives a top-up
Filling a partly full canteen writes the whole thing back to six sips, but the clean flag is the logical AND of the source and what was already in there. Drinking one tainted sip to open a slot and refilling at a clean pond leaves all six sips tainted. Boiling on a lit fire and drinking it dry are the only two ways to clear it. Water drawn inside cyst territory sets a separate spore flag that boiling does not remove at all, and the canteen relabels itself when that happens.
Eating
Hunger is a 0 to 100 bar that can be packed up to 175. At default pace it falls from full to empty in about 55 minutes of real time, faster with a raised metabolism.
Every mod food carries a nutrition figure and a tastiness figure, and both go through one shared consumer, so the overeating rules always apply. Anything above the 175 ceiling is refused: the overflow becomes sickness at 1.2 times its size, and if the overflow is more than 3 there is a 20 percent chance you vomit on the spot. Weight is banked only for the part the stomach actually accepted, so force-feeding a full body fattens nothing.
A filthy body sickens itself while eating. At dirtiness 75 or above there is a 10 percent chance per meal of an extra 8 sickness, which is a reason to keep a Wash Station or a Ventilation unit near where you eat.
Vanilla and modded food is mapped onto the same scale automatically at 1.75 hunger per vanilla nutrition point, calibrated so the mod's Burger at 14 hunger matches a vanilla cooked steak at 8 nutrition. Nothing needs a whitelist.
Six of the mod's own foods are durable rather than stacking: the Burger, Bucket of Chicken, Popcorn, Chips, Cereal and Hard Candy. A bite leaves the item in hand. Each bite spends 0.34 condition, which gives three bites, and each of those bites delivers the food's full listed nutrition. A Burger is therefore 42 hunger, not 14.
Activated charcoal in the gut binds food as well as drugs, so meals absorb less while its window is open.
A hot, heavy meal. You will feel more like yourself afterwards.
tooltip.doomedmatu.burger
The tooltip names no figure. The Burger is three bites, each one paying the full listed 14.
Activated charcoal halves hunger and weight gain using the same 0.5 absorption factor it applies to drugs, so the dose you take to blunt an overdose blunts the meal you eat under it. Drugs and Pharmacology
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Hunger ceiling and drain | 175 cap, full to empty in about 55 minutes | ~/body/Consumption.java:26; NeedsHandler.java:20-23 |
| Overeating penalty | overflow x1.2 sickness, 20% vomit chance past 3 overflow | ~/body/Consumption.java:80-84 |
| Filth penalty while eating | 10% chance of +8 sickness at dirtiness 75+ | ~/body/Consumption.java:86-88 |
| Vanilla nutrition conversion | 1.75 hunger and 0.15 weight per nutrition point | ~/body/Consumption.java:39-40 |
| Durable food bite cost | 0.34 condition per bite, 3 bites, full nutrition each | ~/item/FoodItem.java:43,126-131 |
| Highest nutrition mod foods | Foliage Meal 18, Cooked Human Flesh 18, Raw Human Flesh 16, Internal Organs 15, Burger 14 | ~/registry/DoomedConsumables.java:143-205 |
| Soup and Hot Drink warming | +2.6 C per litre of soup, +4 C per Hot Drink | ~/item/Liquids.java:186; DoomedItems.java:180 |
Durable foods give full nutrition on every bite, and spoilage eats your bites
Six foods do not stack and are not consumed in one use: Burger, Bucket of Chicken, Popcorn, Chips, Cereal, Hard Candy. Each bite costs 0.34 of the item's condition, which gives three bites, and each of those bites hands you the food's complete listed nutrition value. A Burger listed at 14 nutrition is really 42 hunger. The trap is that condition is also the spoilage pool. Rot and eating spend the same number, so a Burger that has sat in your pack for 40 minutes in a plains biome has already lost a bite before you ever opened it, and a Burger at 30 percent condition is a single mouthful.
Iron
There are seven nutrient stores, all on a 0 to 100 scale: Iron, Vitamin C, Vitamin D, Calcium, Vitamin B12, Sodium and Thiamine. Iron alone has a mechanical output, and that output is deliberately indirect.
Iron does one thing: it multiplies red-cell regeneration. Below a store of 45 the multiplier starts falling, and by a store of 5 it bottoms out at 0.12. It also sets a ceiling on the red-cell fraction the body can hold, which floors at 0.68. That floor sits above the point where the heart starts seeding fibrillation, so anaemia leaves you fragile and slow to recover while stopping short of killing you on its own.
You lose 10 iron per in-game day just by existing, and 22 per litre of blood you bleed. That second term is the one that matters. Losing blood costs you the material to remake it. The third haemorrhage in a week is the one that does not come back, and a transfusion can put you back at 5 litres and still leave your oxygen delivery on the floor.
Absorption is non-linear. A store at zero takes up almost the full listed amount from a meal, while a store near 100 banks almost nothing, so a nutrient resists being stockpiled on a good day.
The table itself is a datapack keyed on item tags first and item ids second. Tag rows are authored per hunger point and multiplied by the food's own vanilla nutrition value, so one row against forge:vegetables is correct for a beetroot and a cabbage alike. An explicit item row is absolute and beats any tag. Anything matching nothing at all still gets the default row.
Heat-collapsed and free of the raw berry's viable cyst burden.
Safer and slower to spoil, but less hydrating and lower in vitamin C.
tooltip.doomedmatu.cooked_gall_berry
The vitamin C it names comes from an absolute item row, so it lands at its listed value instead of scaling off hunger points.
Iron is the only nutrient with a mechanical output and it spends itself entirely inside the blood system: bleeding costs 22 points a litre, and what is left sets both the red-cell regeneration multiplier, which bottoms out at 0.12, and a ceiling on red-cell fraction floored at 0.68 - deliberately just above the band where the heart starts seeding fibrillation. Blood and Circulation
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Nutrient stores | 7, scale 0 to 100 | ~/body/Nutrient.java:18-31 |
| Iron baseline burn | 10 per in-game day | ~/body/NutrientHandler.java:27 |
| Iron cost of bleeding | 22 per litre lost | ~/body/NutrientHandler.java:29 |
| Red-cell regeneration floor | 0.12 multiplier at iron 5 | ~/body/NutrientHandler.java:47-49 |
| Anaemia red-cell fraction floor | 0.68 | ~/body/NutrientHandler.java:41 |
| Iron falloff threshold | store below 45 | ~/body/NutrientHandler.java:46 |
| Richest iron tag rate | 3.2 per hunger point on #doomedmatu:rich_iron | res/data/doomedmatu/doomed_nutrient_sources/vanilla.json |
| Gall Berry absolute row | Vitamin C 6.0, Iron 1.5, Thiamine 1.0 raw | res/data/doomedmatu/doomed_nutrient_sources/vanilla.json |
The mod's own foods carry almost no micronutrients
The nutrient table scales tag rows and the default row by the food's vanilla nutrition value. Doomed's own foods are registered as plain items with a custom nutrition field and no vanilla FoodProperties at all, so that value reads as zero and every per-point row multiplies out to nothing. Only absolute item rows survive, and the shipped table has exactly two for Doomed foods: the raw and cooked Gall Berry. Everything else in the mod's own food catalogue feeds hunger, weight and thirst but leaves all seven stores untouched. Vanilla and modded food, and the drinkable meals in Liquids (milk, cereal, ketchup, soup), do feed them.
Rot
Every food carries a decay figure in minutes, and that figure is close to literal: at a biome multiplier of 1.0 a food rated at 30 minutes loses all its condition in about 30 minutes of real time while carried. The formula is a rot speed of 1.666 divided by the decay minutes, charged as condition loss of rot x 0.01 per simulated second.
Biome temperature scales that rate, for food only. The multiplier is 0.35 plus 0.55 times the biome's base temperature, clamped between 0.3 and 1.4. A snowy biome sits at 0.35, so food keeps almost three times as long there. Plains sit at 0.79. A desert clamps at 1.4, nearly twice as fast as plains. Medicines, light sources and other perishables ignore biome entirely and keep their own flat rate.
Containers slow rot rather than preserving. A stack sitting in a chest carries a game-time stamp, and the moment it is next seen, either because a container GUI opened on it or because it came back into a ticked inventory, the whole elapsed gap is charged at half the carried rate, still scaled by the biome. Game time keeps running while a chunk is unloaded. Food left in a chest genuinely ages while you are away.
Shelf lives worth knowing: Geo Fruit 12 minutes, Foliage Meal 10, Gall Berry 20, Glowcap Clump 24, Raw Human Flesh 40, Cooked Human Flesh 120, Burger 120, Chips and Cereal 300, Candy Bar 450, Pemmican 600. Nutrient Bar, Bucket of Chicken and Popcorn keep forever. So do drink containers.
Two blocks, two very different bargains.
The Icebox is the unpowered early answer. One fuel slot takes snow blocks, ice, packed ice or blue ice, and nine food slots sit behind it. While a charge is melting, food spoils at a flat 10 percent of the carried rate, and the biome multiplier stays out of it because the ice sets the climate. A snow block lasts 5 minutes, ice 20, packed ice an hour, blue ice three hours. The box bites a fresh charge the moment it runs dry, with or without food inside. Once the ice is gone it is an insulated chest at the ordinary enclosed rate.
The Freezer is the top tier and wants RF. Nine food slots, a 64,000 FE buffer, and an upkeep of 2 FE per one-second sample, which is 0.1 FE per tick. A full buffer runs it for about nine hours on its own. While powered it stops spoilage outright rather than slowing it: every stack's rot stamp is pinned to now each second, so no time passes for the food at all. Cut the power and it degrades cleanly to a plain enclosed container.
The Icebox will also accept blood bags, transplant organs, cadaver torsos and saline, each of which maps the storage tier onto its own separate ageing clock rather than sharing the food one. A powered Freezer holds an extracted organ outright. The Icebox only slows one.
One detail that matters for a base you leave: the Icebox sleeps through an unloaded chunk without melting, and it pins its contents' clocks on reload if it went to sleep with a live charge.
Dense, tasty meat that keeps for ages.
tooltip.doomedmatu.pemmican
600 minutes, the longest clock in the food catalogue.
Both cold blocks take more than food: a blood bag, a transplant organ or a cadaver torso occupies the same slots, and each maps the storage tier onto its own ageing clock rather than sharing the food one. Organs
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Rot formula | rotSpeed = 1.666 / decayMinutes; condition -= rotSpeed x 0.01 x seconds | ~/registry/DoomedConsumables.java:73; ItemDecayHandler.java:85 |
| Biome food multiplier | clamp(0.35 + baseTemp x 0.55, 0.3, 1.4) | ~/body/ContainerSpoilage.java:56-57 |
| Container rate | 0.5x the carried rate | ~/body/ContainerSpoilage.java:45 |
| Carried decay tick interval | every 10 ticks | ~/body/ItemDecayHandler.java:24 |
| Longest and shortest food shelf lives | Pemmican 600 minutes; Frigiant Fruit 5 minutes | ~/registry/DoomedConsumables.java:146,164 |
| Foods that never spoil | Nutrient Bar, Bucket of Chicken, Popcorn | ~/registry/DoomedConsumables.java:154-156,190 |
| Icebox layout | 1 fuel slot, 9 food slots | ~/block/entity/IceboxBlockEntity.java:39-41 |
| Iced spoilage rate | 10% of carried, no biome scaling | ~/block/entity/IceboxBlockEntity.java:46 |
| Melt durations | snow block 5 min, ice 20 min, packed ice 1 h, blue ice 3 h | ~/block/entity/IceboxBlockEntity.java:50-53 |
| Freezer buffer and draw | 64,000 FE buffer, 1,024 FE/t intake, 2 FE per second upkeep | ~/block/entity/FreezerBlockEntity.java:44-51 |
| Freezer autonomy on a full buffer | about 9 hours | ~/block/entity/FreezerBlockEntity.java:47-51 |
| Freezer slots | 9 | ~/block/entity/FreezerBlockEntity.java:42 |
Ordinary food keeps its full nutrition right up to the moment it vanishes
For a normal stacking food, condition controls three things and no more: the item's mass for encumbrance purposes, its barter value, and whether the stack is destroyed at zero. The eat path passes the food's configured nutrition to the body regardless of condition. A Pemmican at 4 percent condition feeds you exactly as much as a fresh one. The exception is human flesh, which is the only food that reads its own condition on use, and which reports a Fresh, Stale or Tainted band in its tooltip at the 75 and 40 percent marks.
Cooking cannot launder taint
The mod replaces the vanilla smelting, smoking and campfire recipes for its own meats and berries with a custom recipe type that copies the input's condition fraction onto the output. Cooking a 10 percent condition raw portion produces a 10 percent condition cooked portion. Cooking still helps in two specific ways: the cooked item's decay rate is about three times slower, so raw human flesh at 40 minutes becomes cooked human flesh at 120, and the cooked item's sickness and sepsis bands are far kinder. What it does not do is restore freshness, and it does not neutralise prions.
Biome temperature silently doubles or halves your food's shelf life
Every food's decay clock, both carried and in containers, is multiplied by a biome factor of 0.35 plus 0.55 times the local biome's base temperature, clamped between 0.3 and 1.4. In practice a snowy biome runs at 0.35, plains at 0.79, and a desert clamps at 1.4. A food rated at 30 minutes lasts about 86 minutes in the snow and about 21 in a desert. The factor is sampled at the position of whoever is carrying it, or at the position of whoever opened the container. Medicine, light sources and other non-food perishables are exempt and keep a flat rate.
The Icebox does not melt while its chunk is unloaded
The Icebox burns its ice charge only in its server tick, and that tick only runs while the chunk is loaded. On reload, if the box went to sleep with melt time remaining, it pins its contents' rot clocks rather than charging the gap. A blue-ice charge is three hours of loaded time and it does not lose a second while you are away. The Freezer behaves the opposite way at the edges: it pins clocks on reload only if it went to sleep with enough energy in the buffer, and settles perishable ageing at the ambient rate if it did not, so restored power can never retroactively refrigerate time already spent warm.
Bags increase what you can hold but never reduce what you carry
Every storage bag in the mod carries an encumbrance multiplier, and every one of the ten shipped bags has it set to 1.0. A bag's contents are folded into your carried mass at full weight on top of the bag's own mass, so putting 10 kg of supplies in a duffel bag adds 10.9 kg to your encumbrance rather than a discounted figure. What a bag actually buys you is slots and a weight ceiling of its own, and in the case of the medkit, toolbox, liquid pouch and material pouch, a tag restriction on what may go inside.
Traders
Trade runs on barter, not on coin. Items go into the Give slot, Give banks their value as credit with that specific trader, and the credit buys their stock. Credit is per player, so in co-op nobody can spend someone else's goods.
The wallet caps at 60 credits by default, and that single number does two jobs. It is the ceiling on what can be banked, and it is also the filter on what a trader will stock at all, because any item priced above it would be permanently unbuyable. At 60 the entire expensive tier is invisible on every shelf in the game.
A general merchant carries 8 offers. One slot is always a crate of loose rounds, 100 to 150 of a single calibre for a base 34 credits, because traders are the only ammunition supply that exists. The other slots are drawn from every Doomed item that has a curated trade value between 1 and the wallet cap. Loose single rounds, human flesh, the naval cannon, its shells, the quad minigun and its drum are refused by name or by class.
Prices are the item's value times a per-offer preference roll of 0.7, 1.0 or 1.5, times a reputation multiplier, and the result is clamped to the wallet cap. Preference is rolled once per offer.
Selling is throttled. You may bank 5 ordinary items per rolling window across all traders, keyed to your player rather than to the trader, so shop-hopping is no help. Crafted medicine draws on a higher cap of 10, and that count is shared, so at most 5 of your 10 may be non-medical. The window is 60 real minutes off the system clock, not an in-game hour.
Restocking belongs to traders who live in a generated lair, and the menu shows a countdown for them. Lairs attempt at one chunk in 24 between Y -48 and Y 30, and the room's condition roll decides both shelf size and restock speed. The Experiment is summon-only and carries a curated medical shelf instead.
Traders stock these, rarely. There is no recipe.
tooltip.doomedmatu.largebattery.source
The shelf filter is what puts it there: a curated trade value between 1 and the wallet cap, and nothing else.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Wallet and stock cap | 60 credits | ~/config/DoomedConfig.java:2729 |
| Offers per trader | 8 for a wandering trader. A lair resident's shelf is sized by shelter condition instead, at 5, 7 or 8. | ~/entity/TraderStock.java:30; TradeMenu.java:48 |
| Ammunition crate | 100 to 150 rounds, base 34 credits | ~/config/DoomedConfig.java:2751,2756,2763 |
| Preference multipliers | 0.7 wants-to-trade, 1.0 indifferent, 1.5 wants-to-keep | ~/entity/TraderStock.java:364-366 |
| Sell caps per window | 5 ordinary, 10 medical, shared count | ~/config/DoomedConfig.java:2703,2710 |
| Sell window | 60 real minutes | ~/config/DoomedConfig.java:2719 |
| Lair restock interval | 48,000 ticks base (about 40 minutes), 2 sold lots restored | ~/config/DoomedConfig.java:2737,2743 |
| Lair shelf size by shelter condition | failing 5, improvised 7, established 8 | ~/entity/DoomedTrader.java:173-179 |
| Lair generation attempt rarity | 1 chunk in 24, between Y -48 and Y 30 | ~/config/DoomedConfig.java:2696; placed_feature/trader_lair.json |
Trader reputation is a live price multiplier that nothing in play ever moves
Each trader stores a reputation clamped between 0 and 200, and prices are multiplied by clamp(1.5 - reputation / 200, 0.6, 1.5). Reputation is initialised at 100 and read back from NBT on load, and no code path anywhere raises or lowers it during play. Every trader you meet therefore sits at exactly 100, which is a multiplier of 1.0. Prices move for one reason only: the per-offer preference roll of 0.7, 1.0 or 1.5 that is fixed when the shelf is generated. Trading with a merchant repeatedly does not make them cheaper.
FRAGMENT 02 - FOUR REFUSALS AT THE GIVE SLOT
SUMMARY: The trader's Give button had four separate cases where it consumed the click and did nothing visible. Players concluded the button was broken, and at least one named reporter said so. Each case now speaks, and two of them share a beep so the refusals sound like one family.
RESPONSE: "They look at what you're offering and want nothing to do with it." "The trader has bought all they will take this hour - come back later." "Your credit with this trader is full (60) - spend some first." "That fills the trader's buying for this hour."
FINAL NOTE: The first refusal is unconditional and is checked before value, before the hourly cap, before the wallet. No trader buys human meat at any price. The Experiment deals exclusively in experimental medicine and refuses it as well. The last message fires on a sale that succeeded, so the next click's refusal arrives expected instead of looking like the button died.
~/inventory/TradeMenu.java:243-294
Notes
- Seven nutrient stores are tracked and written to NBT. Only Iron is ever read back. Iron gates red-cell regeneration and the red-cell ceiling, and Iron is the only store the server syncs to a client or the WITNESS tablet renders. Vitamin C, Vitamin D, Calcium, B12, Sodium and Thiamine are filled by food and consumed by nothing. Whether they are staging for a deficiency system that was never built, or residue carried over from the port, is recorded nowhere in the source.
- The custom crafting catalogue is empty on purpose and every piece of machinery around it survives intact - a keybind on K, a screen with an INT gate, a server-validated craft packet. Recipes.bootstrap(), which registers 40 recipes transcribed faithfully from the source game, sits in the file and is never called. The comment beside it says to prune or reroute them "when crafting is restored". Nothing in the repo says whether restoring it is planned.
- Every trader you can meet in a generated world lives in a lair. No biome modifier adds the trader to a spawn list, no spawn egg exists for it, and TraderLairFeature is the only caller that ever creates one. Three finished code paths therefore have no route in: the eight-offer shelf that non-lair merchants would use, the variant re-roll in finalizeSpawn that only fires on natural and spawner spawns, and the Experiment - his curated medical shelf, his portrait header, his classic-model exception and his one-percent rare interaction are all built and all reachable only through a /summon carrying a Character tag of 2.
- The lockpick's difficulty lives entirely on the client. The server checks that the crate exists, that the player is within eight blocks, that their hand works, and that they personally opened the minigame on that crate. It never checks the angle, the band, or that the lock was actually turned. The four-degree half-band and its widening while jammed are both faithful to the source game, so the missing angle check may be deliberate latency tolerance rather than an oversight. The packet carries no comment either way.
- The Drowned Archive room places a block called the Dead Archive Terminal and gives it nothing to do. Its class header calls it deliberately inert scenery, and the structure contract in reference/ states outright that the archive cannot provide readable lore until canonical copy and a server-authoritative interaction are chosen. The room is finished and the decision behind it has not been made.
Threats
Doomed's threats are not health-bar fights. The Deep Maw is one persistent apex predator authored into a generated Cyst grove, and it builds a case against you out of light, noise and movement before it ever attacks. The scattered traps are one-shot maimings that go through the limb system rather than your hearts. Firearms are server-owned machines with a real chamber, a real feed state, and a body that shakes them. Almost none of the numbers below are shown to you in game.
Residency
A generated Cyst grove holds at most one Deep Maw, and killing that one is permanent. Worldgen registers a safe pose in the grove's deterministic Maw hollow, the server creates the animal there once the chunk is available, and a ledger walks the grove from pending to claimed to killed. Killed is terminal, so the hollow is spent rather than renewable.
The random monster pool leaves it out on purpose - the mod's spawn biome modifier lists the crawler and the spider and stops there. The Maw's own spawn predicate then refuses a position inside a registered grove or inside an eligible cyst region, refuses anything above Y -32, refuses anything that can see sky, and refuses a spawn within the natural separation distance of another living Maw. It also validates that the full authored body has a clear yaw at that spot, rather than that the compact physics box fits.
Groves are rare by design. The underground divides into deterministic 8x8-chunk regions and one region in sixteen is selected at the default rarity.
On a mixed server the default prey policy is DOOMED_ONLY. A player without an active Doomed run is invisible to the animal - never a valid target for detection, suction, fog or shear, rather than merely left alone. Two other policies exist: one makes every Survival player prey, and one adds ordinary Survival players for five minutes after they damage that specific Maw.
Sealed Maw Remains
block.doomedmatu.deep_maw_remains
The block the world keeps where a Deep Maw died. The ledger entry behind it reads killed, and that is the end of the grove's residency.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| One resident per grove, terminal on death | PENDING -> CLAIMED -> KILLED | ~/worldgen/CystGroveMawData.java:50 |
| Depth gate for a natural spawn | Y -32 or lower, no sky | ~/entity/DeepMawEntity.java:9790 |
| Minimum separation between natural Maws | 192 blocks (96-512) | ~/config/DoomedConfig.java:2227 |
| Cyst region rarity | 1 region in 16 | ~/config/DoomedConfig.java:2591 |
| Default prey policy | DOOMED_ONLY | ~/config/DoomedConfig.java:2196 |
| Not in the biome spawn list | crawler weight 8, spider weight 6, no Maw | res/data/doomedmatu/forge/biome_modifier/doom_spawns.json |
Suspicion
The animal grades you rather than spotting you. Suspicion accumulates from 0 to 1 for as long as its search organs can reach you. At 0.30 it emits one physical cue - the aperture moves, and dust comes off the wall its ray terminates on. At 0.65 it recognises you and holds for eighteen ticks. At 1.0 you are confirmed, and confirmation carries a two-hundred-tick memory refreshed every tick it can still see you.
Base climb is 0.028 a tick. Moving faster than 0.025 blocks a tick adds 0.010, sprinting or exceeding 0.11 adds another 0.014, a swung arm adds 0.015, and light above level 7 adds 0.0018 per level, reading the brighter of the block light underfoot and whatever you are carrying. Bleeding adds up to 0.018. The total is then multiplied by how much of the body the organ can actually reach, floored at 0.25, so a lip you show only your head over quarters the climb. Distance multiplies it again, from 0.35 at 32 blocks up to full strength at 12. Inside 12 the whole tentacle mass perceives you and the gain is a flat 0.20 a tick whatever you do.
Holding still returns a negative 0.012 a tick. That is the one way to talk a Maw out of a bad glimpse, and five conditions have to hold in the same tick for it: genuinely still and not mid-swing, exposure under 0.75, effective light at 7 or lower counting what you carry, no bleeding at all, and not yet confirmed with suspicion still under 0.65 at more than 12 blocks. A torch in hand defeats it on its own. So does one open wound.
Breaking line of sight buys four ticks of grace in which suspicion neither gains nor decays. After that it bleeds off at 0.0075 a tick, or 0.0025 once confirmed, or 0.0015 while a disturbance is still live.
Three moodles track a player's relationship with a Maw, and the rules between them stay off-screen.
Impending Doom is pure proximity inside the territory radius, independent of sight. Stone hides the animal. It does not hide the fact that something enormous is closing. The level sits at 2 on the outer boundary and rises on a squared curve to 50 at the centre, dragging adrenaline up to somewhere between 30 and 68.
Horrified wants two things at once. The Maw must be targeting you and be in a hunting state, or searching at 0.65 suspicion or higher, and you must hold a genuine server-clipped line of sight to it. Where the camera points is deliberately not trusted as gameplay. Once earned it latches for as long as that same Maw remains your active in-range encounter, and it pins adrenaline to at least 85. Leaving the territory clears it, so a later meeting correctly starts again at Impending Doom.
Focused replaces Horrified only after you personally deal damage worth a tenth of that Maw's maximum health - 28 points against its 280. Credit is stored per player UUID on the individual animal, so two players working one Maw advance separately, and hurting an unrelated creature earns nothing.
Horrified charges for itself. The mood system multiplies your entire mood by one minus horrified level times 0.005, so a fully Horrified body loses half its mood for as long as the state holds.
An aperture draws open
subtitles.doomedmatu.deep_maw_search_aperture
This is the 0.30 cue and the only one the animal gives away before recognition at 0.65.
Horrified does more than label the encounter: MoodHandler multiplies your entire mood total by one minus the horrified level times 0.005, which halves it for as long as the state holds. Psychology
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Recognition threshold | 0.65 suspicion | ~/entity/DeepMawEntity.java:485 |
| Confirmation threshold | 1.0 suspicion | ~/entity/DeepMawEntity.java:486 |
| Base gain per tick | 0.028 | ~/entity/DeepMawEntity.java:3426 |
| Minimum cover multiplier | 0.25 | ~/entity/DeepMawEntity.java:3453 |
| Certain-perception radius | 12 blocks, flat 0.20 per tick | ~/entity/DeepMawEntity.java:346 |
| Stillness drain | -0.012 per tick | ~/entity/DeepMawEntity.java:3467 |
| Stillness light ceiling | light level 7 | ~/entity/DeepMawEntity.java:3465 |
| Confirmed memory | 200 ticks | ~/entity/DeepMawEntity.java:497 |
| Territory radius | 96 blocks (48-112) | ~/config/DoomedConfig.java:2203 |
| Impending Doom range | 2 at the boundary to 50 at the centre | ~/body/ThreatEncounterHandler.java:169 |
| Focus threshold | 10% of max health, so 28 damage | ~/body/ThreatEncounterHandler.java:37 |
| Adrenaline floor when Horrified | 85 | ~/body/ThreatEncounterHandler.java:134 |
| Adrenaline floor when Focused | 90 | ~/body/ThreatEncounterHandler.java:128 |
| Horrified mood multiplier | x(1 - level x 0.005) | ~/body/MoodHandler.java:63 |
Freezing only works if five separate conditions hold at once
Holding still drains 0.012 suspicion a tick, but only when you are moving at or under 0.025 blocks a tick and not sprinting or swinging, your exposure is under 0.75, your effective light is 7 or lower counting carried light, you are not bleeding at all, and the Maw has not confirmed you while your suspicion is still under 0.65 at more than 12 blocks. A torch in hand defeats it. One open wound defeats it. Inside 12 blocks it does not apply at all, and neither does it once suspicion has crossed the recognition line.
FRAGMENT 12-C - HIDDEN ADVANCEMENT, CABOOSE LANDMINE
SUMMARY: The advancement set contains one hidden challenge for a mine the archive's landmine section never mentions. Title: "Ca-Boose!~". Description: "Trigger the mine Caboose couldn't see." Its icon is doomedmatu:caboose_landmine, a recessed variant whose casing copies the top-face sprite of whatever block it sits on, leaving only the small trigger showing. Five times the ordinary damage and terrain radius.
RESPONSE: CabooseLandmineBlock.detonate collects every server player inside the 25-block damage envelope and grants the advancement to all of them before Explosion.detonateCaboose runs. Cover removes the entire wound payload but not the credit, so a player crouched behind a solid corner who takes none of it is awarded alongside the one who stood on the plate. The block has a crafting recipe and appears in no worldgen scatter, so every award traces back to somebody who built one and put it down.
FINAL NOTE: The advancement is marked hidden and announce_to_chat true. On a server the first anyone hears of its existence is the chat line naming the player who set it off.
res/data/doomedmatu/advancements/caboose.json; ~/block/CabooseLandmineBlock.java:44-51
FRAGMENT 04-A - MOODLE COPY, HORRIFIED
SUMMARY: Three moodles carry the Maw encounter. Their strings live in DoomedHudOverlay: "Impending Doom" / "Something below has begun to track you.", "Horrified" / "You have seen enough to understand.", "Focused" / "Everything else has fallen away. There is only the threat." Horrified's expanded line reads: "Direct exposure has overwhelmed you. Escape its reach and put stone between you."
RESPONSE: Escaping the reach works. Putting stone between you does not. ThreatEncounterHandler re-derives recognition each tick as recognizedNow OR recognizedThisEncounter, and the second term stays true while that exact Maw remains the active in-range encounter. The state clears when you leave the 96-block territory or the animal dies. A player who reads the instruction literally, backs behind a wall and waits keeps a fully Horrified body, an adrenaline floor of 85, and half their mood gone.
FINAL NOTE: Impending Doom's description is accurate about the same wall: "A deep predator is within reach. The warning intensifies as it closes, even through solid cover." Two moodles, one encounter, one honest sentence between them.
~/client/hud/DoomedHudOverlay.java:1073-1075; ~/body/ThreatEncounterHandler.java:91-99
Noise
Physical events become bounded uncertain evidence for any Maw in earshot. Mining is the loudest: hardness is normalised against 8, square-rooted, then lerped into a radius of 14 to 38 blocks, a strength of 0.08 to 0.30 and a memory of 60 to 160 ticks. Placing a block is quieter at 10 to 24 blocks. Projectile impacts, real post-armour injury to anything, and falls over 2.25 blocks each leave a shorter clue. Sprinting on the ground broadcasts every twelfth tick, swimming every tenth. Evidence is all any of it is - a stale point to walk to, never a confirmed target.
The surface underneath scales the lot. Sound-dampening blocks multiply radius and strength by 0.62, resonant blocks by 1.18, and dampening wins where a block is somehow in both. Dampening covers wool, wool carpets, leaves, moss block, moss carpet, mud, sculk and the cyst mosses. Resonant covers overworld base stone, every ore tag, every storage-block tag, tuff, calcite and dripstone. Mining stone near a Maw is close to the loudest thing available to you. A placed block emitting light 8 or higher is inspected separately, as line-of-sight evidence out to 40 blocks.
While it stalks or searches, and only before it confirms a target, it plays a recorded voice out of a real loaded cave recess you cannot see. The server picks an air block 14 to 34 blocks from your eye, at most 8 above or below, at least 8 from the Maw itself, with cave material within three blocks, and verifies that a solid block stands between your eye and that point. The roll is 52 percent a whisper, 24 percent a distant growl, 24 percent a cry. The first can arrive 260 ticks in, then every 700 to 1800 ticks. It changes nothing at all. It stops the moment the Maw confirms its quarry.
Whispering carries through the stone
subtitles.doomedmatu.deep_maw_mimic_whisper
The subtitle credits the stone. The source is a genuine air block 14 to 34 away with a solid block verified between it and your eye, and it goes quiet the moment you are confirmed.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Mining radius range | 14 to 38 blocks | ~/entity/DeepMawStimulusEvents.java:37 |
| Dampening surface multiplier | x0.62 | ~/entity/DeepMawStimulusEvents.java:161 |
| Resonant surface multiplier | x1.18 | ~/entity/DeepMawStimulusEvents.java:161 |
| Hard-landing threshold | over 2.25 blocks | ~/entity/DeepMawStimulusEvents.java:123 |
| Placed-light evidence | emission 8 or higher, within 40 blocks | ~/entity/DeepMawStimulusEvents.java:84 |
| Mimic source distance | 14 to 34 blocks | ~/entity/DeepMawEntity.java:759 |
| Mimic interval | 700 to 1800 ticks, first at 260 | ~/entity/DeepMawEntity.java:755 |
| Mimicry stops on | confirmed target | ~/entity/DeepMawEntity.java:2836 |
The floor you walk on changes how far your noise carries
Every sound a Deep Maw hears is scaled by the block under the event. A sound-dampening block multiplies both radius and strength by 0.62; a resonant block multiplies them by 1.18. Dampening covers wool, wool carpets, leaves, moss block, moss carpet, mud, sculk and the cyst mosses. Resonant covers overworld base stone, every ore tag, every storage-block tag, tuff, calcite and dripstone. Mining stone within 38 blocks of a Maw is close to the loudest thing available to you, and laying a wool path is a real, measurable reduction.
Armament
Every attack is a contract - a readable windup, then an active window, then a recovery. The bite is the one that kills. It commits out of a twelve-tick presentation with impact on the last seven, needs you inside 2.65 blocks of the mouth, and lands 46 skin damage, 38 muscle damage, 100 pain, 38 bleed, a 22 percent infection chance and a seven-point mood hit.
A tentacle lash is much cheaper: thirteen ticks of windup, four of strike, ten of retract, out to 7 blocks along a clipped capsule of radius 0.38, for 22 skin, 15 muscle, 62 pain, 14 bleed and 8 percent infection.
The suction inhale winds up 22 ticks and then pulls for 30, along a fixed 28-degree cone running 4.5 to 13.5 blocks. Speed toward the mouth is capped at 0.12 blocks a tick, which makes it a slow haul rather than a snatch, and crouching on solid ground cuts the force to 55 percent. Dragged inside mouth range, you get bitten.
The fog exhale is a 35-degree cone out to 12 blocks for 34 ticks. It applies Darkness and Slowness, pushes you, and doses you with cyst spores at 0.42 times your exposure every fourth tick. Respiratory protection filters that dose, which makes a fitted mask a real answer to this attack specifically.
Cave shear picks a solid face within 10 blocks of you and detonates it, hitting everything inside 4.5 blocks for 6 damage at the centre falling to 2 at the edge, plus a hard throw. A quarter of your body has to be exposed to it. Anchor impale and mouth sweep round out the set at 10.5 and 4.8 blocks.
The jaw snaps shut
subtitles.doomedmatu.deep_maw_bite_snap
Four words for the 2.65-block contract that carries 100 pain and a 22 percent infection roll.
Spores come from two attacks rather than one: the suction inhale doses everyone held in its cone at 0.18 times exposure every fifth tick, and both routes pass through the same respiratory filter that an exposed wound opens a way around. Disease and Infection
The grab
A grab picks one of twelve limbs at random out of the arms and legs, reaches for fourteen ticks, then holds for at most 72 while hauling you toward the mouth. The pull ramps from 0.145 to 0.215 blocks a tick over the first eighteen ticks. If it gets you inside 2.65 blocks with the mouth off cooldown, it bites, at full strength.
There are two ways out, on two meters that fight each other.
Struggling fills a meter to 18. Any accepted input is worth 0.28. Holding a movement key adds 0.32, and changing to a different movement key from the last one adds a further 0.76, so cycling directions is roughly three times as effective as mashing one. Jump and attack add 0.16 each. The whole effort is then scaled by 0.68 to 1.0 from the average muscle health of your remaining limbs, so a wrecked body escapes more slowly. Inputs are accepted at most every three ticks and the meter drains 0.045 a tick. Breaking free costs a laceration on the held limb, 22 pain and 4 trauma, and throws you clear.
Sacrifice fills a separate meter to 11 at 1.0 per input, and it wants crouch, attack and use held together. The awkwardness is the point. Filling it amputates the held limb, throws you a shorter distance, and puts the Maw into a feeding state for 200 to 300 ticks while it eats what you gave it. That is the window to get out of the room.
The two meters cancel. Struggling drains sacrifice by 0.30 and sacrificing drains struggle by 0.35, so half-committing to both is the worst available outcome. After any release, no Maw can grab you for 160 ticks.
A heavy mass drags closer
subtitles.doomedmatu.deep_maw_drag
The subtitle for the haul. The two meters deciding how it ends have no line of text anywhere.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Maximum hold | 72 ticks | ~/entity/DeepMawEntity.java:600 |
| Struggle threshold | 18.0 | ~/entity/DeepMawEntity.java:606 |
| Direction change bonus | +0.76 on top of +0.32 | ~/entity/DeepMawEntity.java:6004 |
| Sacrifice threshold | 11.0, at 1.0 per input | ~/entity/DeepMawEntity.java:607 |
| Sacrifice keys | crouch + attack + use together | ~/client/DeepMawGrabClient.java:53 |
| Feeding window after a sacrifice | 200 to 300 ticks | ~/entity/DeepMawEntity.java:608 |
| Re-grab immunity | 160 ticks | ~/entity/DeepMawEntity.java:604 |
| Input rate limit | one packet per 3 ticks | ~/entity/DeepMawEntity.java:605 |
Struggling out of a grab rewards alternating keys, not mashing
Each accepted struggle packet is worth 0.28 by itself. Holding any movement key adds 0.32. Changing to a different movement key from the one you last sent adds a further 0.76, more than twice the value of the key press itself. Jump and attack add 0.16 each. Inputs are accepted at most once every three ticks and the meter drains 0.045 a tick, so hammering one direction is roughly a third as effective as cycling W, A, S and D.
Struggle and sacrifice actively cancel each other
The escape meter and the limb-sacrifice meter are separate, and each drains the other. Every struggle input subtracts 0.30 from the sacrifice meter; every sacrifice input subtracts 0.35 from the struggle meter. Sacrifice also decays 0.16 a tick whenever you are not actively holding crouch, attack and use together. Committing halfway to both is the worst possible outcome, and it is exactly what panicking with 72 ticks on the clock produces.
Weaknesses
The core carries 280 health, 0.92 knockback resistance, and immunity to fire. Hitting the body directly is the slowest route on offer.
Each of the six tentacles carries 36. Damage there takes 90 percent off that limb and 12 percent off the core, so appendage fire is structural work rather than raw damage. Severing one staggers the animal and opens its throat for 24 ticks plus 8 per limb already lost. Every tentacle also ends in an anchor pad with 14 health, which takes 120 percent of a hit against the pad and 5 percent against the core; collapsing one drops whatever that limb was doing, opens the throat for 38 ticks, and takes 140 ticks to regrow.
The throat window is the whole point. While it is open, core damage is multiplied by 2.25; catching it merely in recovery multiplies by 1.55. Every missed committed attack opens a window on its own, from 24 ticks after a lash up to 44 after a cave shear. The three search lenses pass 8 percent of a hit into the core, so their value is sensory denial: 12 trauma blinds one for 100 ticks and caps its confirmed memory at 80, each further lens costs 65 percent more, and the last one stays online whatever you do to it. One projectile can only be credited against a given part once per 200 ticks.
When excavating beats a detour, it opens a corridor. The hardness ceiling is 8, which passes stone, deepslate and iron blocks and stops obsidian dead, and the breach-immune tag protects bedrock, barriers, portals, reinforced deepslate, obsidian and command blocks. The budget is 48 blocks per rolling minute and the blocks are destroyed rather than dropped. Its hard leash is 112 blocks from home, so running far enough genuinely ends a pursuit.
Anchors lose their purchase
subtitles.doomedmatu.deep_maw_stagger
The stagger has a sound. The 24-tick throat window it opens is a number in server code.
The animal has no entity loot table and no coded drop, and the only object a kill can leave behind is a single Sealed Maw Remains block fixed to a natural cave face, which deliberately drops nothing when broken. Items, World and Trade
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Core health | 280 | ~/entity/DeepMawEntity.java:1173 |
| Tentacle health | 36 each, six of them | ~/entity/DeepMawEntity.java:481 |
| Terminal anchor health | 14, regrows after 140 ticks | ~/entity/DeepMawEntity.java:482 |
| Open-throat damage multiplier | x2.25 | ~/entity/DeepMawEntity.java:6530 |
| Recovering damage multiplier | x1.55 | ~/entity/DeepMawEntity.java:6531 |
| Lens trauma to blind | 12, x(1 + 0.65 per lens already down) | ~/entity/DeepMawEntity.java:552 |
| Breach budget | 48 blocks per minute, no drops | ~/config/DoomedConfig.java:2255 |
| Breach hardness ceiling | 8.0 | ~/config/DoomedConfig.java:2241 |
| Hard pursuit leash from home | 112 blocks | ~/entity/DeepMawEntity.java:350 |
The Deep Maw's throat opens every time it misses
While the throat vulnerability window is open, core damage is multiplied by 2.25; catching it merely in recovery multiplies by 1.55. That window is opened by a missed committed attack, and its length depends on which one missed: 24 ticks after a lash, 30 after a suction, 38 after an anchor impale, 42 after a mouth sweep, 44 after a cave shear or a fog exhale. Collapsing a terminal anchor pad opens 38 ticks, and severing a tentacle opens 24 plus 8 per limb already lost. A landed attack usually opens nothing at all.
One projectile can only count against a given body part once per 200 ticks
Deep Maw parts keep a per-projectile memory mask for 200 ticks. If the same projectile resolves against the same anatomical part again, the hit is swallowed. This stops a shotgun volley or a multipart sweep multiplying one round across the same tentacle, and it means multi-pellet weapons are worth much less against a single limb than their pellet count suggests. Explosions are exempt.
Cave predators
Two ordinary cave creatures share one AI, and it behaves like an animal rather than a zombie chase. Each decision, the creature rolls against its aggro chance. Most of the time it holds its distance and circles. Now and then it darts straight in, bites, and is forced to retreat for several seconds.
The shade crawler has 14 health, spawns only below Y 40 with no sky above, and bites for 10 skin, 5 muscle, 25 pain, 6 bleed, 3 venom and a 10 percent infection chance. It works the broader cave band and is the first pressure a run meets.
The spider has 18 health, moves faster, and spawns only below Y 16. It lurks at 5 to 8 blocks where the crawler sits at 2 to 4.25, charges at 1.5 speed after a seven-tick windup, commits for up to 40 ticks, and retreats for 96 ticks after a bite lands. Its aggro is 0.18, so roughly four decisions in five it stays out at range. It carries 5 venom, and venom is an anticoagulant that scales your clotting down on a curve and reaches zero at a high enough dose. A spider bite hurts, and then it holds open every wound you already had. It flees outright below 4 health.
The deep dark and the mushroom islands stay clear of both, because vanilla ships those with empty monster lists and the mod keeps that promise. Their bite uses a fixed 0.28-block surface tolerance, so they genuinely have to touch you.
A spider commits to a lunge
subtitles.doomedmatu.spider_charge
The word commits is doing real work: the charge locks in for up to 40 ticks after a seven-tick windup, and it costs 96 ticks of retreat if the bite lands.
Venom scales clotting speed by one minus venom over 20, so four landed spider bites take a body to a dose where nothing clots and every wound already open stays open. Blood and Circulation
The tip
A grabber plant is a fleshy tentacle on a stalk. The arm reaches 5 blocks and the tip wanders that disc on a slow lissajous, feeling the ground. The catch happens within 2.6 blocks of wherever the tip is at that moment, or when the idle tentacle path physically touches you. Everything else inside the 5-block radius is walkable, and that is why the plant reads as random until somebody watches the tip. The vertical window runs from 2.5 blocks below the base to 6 above it, and neighbouring plants are phase-offset so they sweep out of step with one another.
Once it has you it swings you through a vertical half circle centred on the stalk - up and over the top, then down to slam the ground a full radius out, alternating sides. The swing is an integrated pendulum, so the crest is slow and heavy and maximum speed lands exactly at the ground impact. Each slam pins you in the dirt for four ticks and fires a wound. The hold runs 100 ticks: the seize plus three full hauls and slams, with release near the crest of the fourth.
Each slam takes 10 to 20 muscle off one limb, and half the time that limb is the shin or foot the tentacle has hold of. There is a 40 percent chance of 4 to 12 bleed on top. Shock is forced to at least 30 and you are downed throughout. A player with no Doomed body simply loses 10 percent of their health bar per slam.
Burning tissue loses its search rhythm. An ignited plant whips its tip through the same disc 2.35 times faster, so lighting one up while you are still inside its reach is a bad trade.
The hold runs its full 100 ticks and then hurls you along the swing tangent. There is no struggle channel here. Early release comes from the plant block being destroyed underneath you, from the tentacle path getting geometrically blocked for enough ticks, or from your death.
What protects you is the immunity afterwards. Once thrown, no plant may grab you for 120 ticks, scaled by the world's pace factor. That number has to outlast the shock decay keeping you prone, or you get picked back up while still on the floor. The per-plant cooldown of 100 ticks is no help where discs overlap, so the per-player immunity is the real defence.
Grabber plants are killed, not mined. Left-clicking one cancels mining progress entirely on both sides, so the block's hardness never gets a say. Each swing takes your actual attack damage, weapon and enchantments included, off a 60-point pool, and a swing only counts once vanilla's attack cooldown has refilled to 90 percent. Spam clicking earns nothing and bare hands are a genuinely bad plan. Fire Aspect ignites it on a non-killing blow.
Burning is the hands-off answer. Flint and steel or a fire charge used directly on the plant works even where no adjacent face could hold a fire block, and a flaming arrow ignites it too. A burn lasts 240 ticks at 1.25 damage every 5 ticks, which is exactly 60, so one uninterrupted burn kills a full-health plant.
Health persists. A plant you wounded and walked away from is still wounded when you come back, and logging out is not a heal. It drops one or two rotten flesh, never a placeable plant. Naturally generated plants within 48 blocks of world spawn delete themselves.
Grabber Plant
block.doomedmatu.grabber_plant
Two words are the whole of what the game says about it. The tip, the 2.6-block catch and the burning speed-up are nowhere in the language file.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Tentacle reach | 5.0 blocks | ~/block/GrabberPlantBlock.java:43 |
| Grab radius around the tip | 2.6 blocks | ~/body/GrabberFlingHandler.java:126 |
| Vertical window | -2.5 to +6.0 blocks from the base | ~/body/GrabberFlingHandler.java:570 |
| Hold duration | 100 ticks | ~/body/GrabberFlingHandler.java:106 |
| Wound per slam | 10-20 muscle, 40% chance of 4-12 bleed | ~/body/GrabberFlingHandler.java:412 |
| Vanilla player damage per slam | 10% of max health | ~/body/GrabberFlingHandler.java:370 |
| Burning tip speed | x2.35 | ~/block/GrabberPlantBlock.java:63 |
| Plant health | 60.0 | ~/block/entity/GrabberPlantBlockEntity.java:53 |
| Burn kill time | 240 ticks at 1.25 per 5 ticks | ~/block/entity/GrabberPlantBlockEntity.java:55 |
| Swing gate | attack strength scale 0.9 or higher | ~/body/GrabberPlantCombat.java:71 |
| Post-throw immunity | 120 ticks, pace-scaled | ~/body/GrabberFlingHandler.java:112 |
| Per-plant regrab cooldown | 100 ticks | ~/body/GrabberFlingHandler.java:107 |
| Drop | 1-2 rotten flesh | res/data/doomedmatu/loot_tables/blocks/grabber_plant.json |
| World spawn exclusion | 48 blocks | ~/block/entity/GrabberPlantBlockEntity.java:41 |
| Surface spawn chance | 3% per eligible cell x density | ~/worldgen/SurfaceScatterFeature.java:81 |
A grabber plant only takes you where its tip is
The arm reaches 5 blocks, but the catch test is 2.6 blocks around the wandering tip, or a physical touch by the idle tentacle path. The tip follows a slow lissajous over the reachable disc, phase-offset per plant so neighbours never sweep together. Standing well inside the 5-block radius is safe while the tip is elsewhere, and walking past the tip's current position at 4 blocks out is not.
Guns do not jam, they overheat and lose the chamber
There is no random malfunction anywhere in the firearm code. What exists is a physical chamber, feed and bolt state, plus heat. Heat rises per shot, caps at 8.0 on ordinary weapons, sheds 0.10 every 5 ticks, and adds 5.5 percent dispersion per point above 1.0. Only the quad minigun locks out: it latches overheated at 7.2, which is eight seconds of continuous fire, refuses to fire until heat falls back to 1.08, and needs twelve contiguous trigger ticks to spool before the first burst is ever accepted.
The revolver's sneak-reload puts the muzzle to your own head
Sneak plus R on the heavy revolver does not reload it. It spins the cylinder and arms a roulette state, and the next left click puts the muzzle to your own temple and drops the hammer. A live chamber under the hammer removes your head outright through the dismemberment service, and nothing brings that back. The sound that plays on a live chamber is named for luck ironically: it is the sound of losing.
FRAGMENT 14-B - ITEM TOOLTIP, MORROW HEAVY REVOLVER
SUMMARY: Sneak plus R on the heavy revolver spins the cylinder and arms a roulette state. The tooltip rewrites itself to "The muzzle is at your own temple. The next left click pulls that trigger.", and under it, "A live chamber under the hammer takes your head off, and nothing brings that back."
RESPONSE: Both lines are exact. The spin rolls a fresh chamber index from six and resolveRoulette reads it at the authored hammer contact rather than when the client asks; a live chamber routes through DismemberService.gibHead, zeroes consciousness and enters death, and a player with no active Doomed body is simply killed outright. The gun refuses on one ground only, an empty cylinder, and says so: "There is nothing in the cylinder to gamble with." A cylinder holding six live rounds used to be refused as well. It is allowed now, and it kills you.
FINAL NOTE: The sound registered for a live chamber is revolver_luck. It fires on the losing branch, never the surviving one - it was originally wired to the empty chamber, where it read as congratulation.
~/item/GunItem.java:684-803 and :2288-2295; assets/doomedmatu/lang/en_us.json line 11
Contact traps
Every floor trap is collisionless. You walk into the cell rather than onto the block, so a trap on a thin plate cannot be dodged by aiming at the block below it.
The bear trap bites once per placement and is spent for good afterwards. It clamps a foot or shin for 100 pain, a 50 percent fracture chance divided by armour, a crush wound of 70 to 100 skin and 50 to 100 muscle, and Slowness V for 100 ticks with your velocity zeroed.
The spike trap is one-shot as well, and the spike stays up. It is the worst of the floor set: 50 to 80 skin, 30 to 50 muscle, up to 40 bleed, internal bleeding, 70 to 100 pain, shock forced to 70, adrenaline to 100, a 30 percent fracture, and a flick upward.
The sawblade rearms every 12 ticks and can catch any of twelve body regions, cutting 60 to 80 skin and 20 to 30 muscle with 20 to 25 bleed and 75 to 90 pain, then flinging you bodily away from the blade. It leaves bone alone. It cuts.
Caltrops rearm every 14 ticks, bite only feet for 8 to 20 skin, and leave a brief limp.
The live wire rearms every 30 ticks and shocks at severity 45, seeding a non-forced fibrillation that settles if your vitals hold. The electrified coil rearms every 600 ticks and shocks at 62, plus burns and tears every limb, maxes pain, drops consciousness to zero and raises your core temperature by 5.
Depth decides the flavour. The upper band gives spike traps, caltrops and bear traps. The middle band adds live wiring and sawblades. The deep band is landmines, sawblades and coils. Density ramps from 0.12 to 0.52 as you descend.
Exposed, sparking wiring on the floor. Stepping on it
gives a moderate shock - burns and a jolt you can
usually ride out - but it re-zaps every ~1.5 s, so
lingering stacks burns and arrhythmia until it stops
your heart.
tooltip.doomedmatu.live_wire
The interval is right: 30 ticks is the ~1.5 s it promises. The ending is a stretch on its own, since severity 45 sits under the 70-point cardiac arrest threshold - it takes metal prosthetics multiplying the shock to carry a live wire across it.
Electrocution multiplies incoming severity by one plus 0.13 for every mechanical or titanium prosthetic limb fitted, so the live wire's 45 sits under the cardiac-arrest line for a biological body and over it for a heavily rebuilt one. Injury and Treatment
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Bear trap | 100 pain, 50% fracture, Slowness V for 100 ticks | ~/body/TrapEffects.java:80 |
| Spike trap | shock 70, adrenaline 100, 30% fracture | ~/body/TrapEffects.java:56 |
| Sawblade cooldown | 12 ticks | ~/block/SawbladeBlock.java:36 |
| Live wire severity | 45, every 30 ticks | ~/block/LiveWireBlock.java:34 |
| Coil severity | 62, every 600 ticks | ~/block/CoilBlock.java:32 |
| Cardiac arrest threshold | severity 70 | ~/body/Electrocution.java:25 |
| Fibrillation threshold | severity 35 | ~/body/Electrocution.java:27 |
| Floor trap chance by depth | 0.12 + depth x 0.40 | ~/worldgen/CaveScatterFeature.java:246 |
Metal prosthetics multiply every electrical shock you take
Electrocution multiplies the incoming severity by one plus 0.13 for each mechanical or titanium prosthetic limb you wear. A wooden improvised limb does not conduct. A live wire at severity 45 becomes 56.7 with two metal limbs and 74.3 with five, crossing the 70-point cardiac arrest threshold that the live wire is specifically tuned to sit below. The electrified coil at 62 crosses that threshold with a single metal prosthetic.
Landmines
Any entity trips a landmine. Players, mobs, animals and dropped items all arm it, the fuse is 16 ticks, and proximity has nothing to do with it. Breaking a mine by any external means detonates it. So does an explosion beside it. A completed defusal is the one safe removal.
The blast carries two radii that are deliberately different. Wounds reach 5 blocks; the crater is only 2, which is smaller than a creeper. Out to 12.5 blocks you are deafened, your consciousness is capped at 31, and the screen shakes hard.
Cover is total. The blast clips a ray from its centre to your body, and if a solid block stands more than half a block in front of you, the whole wound and knockback payload is skipped - every limb roll, the fracture and dislocation rolls, the head trauma, the disfigurement and eye rolls, the dismemberment roll, the throw. The deafening still arrives, which is why being fully sheltered feels almost identical to being hit.
Inside the blast, each intact part rolls its own damage, skin tear, bleed, internal bleeding and embedded fragment. A head hit zeroes your consciousness and can permanently disfigure you or blow an eye out, each at 34 percent divided by armour. Inside half the radius one limb can be torn off, at 35 percent scaled toward the centre and divided by armour, never more than one per blast.
Defusal is sneak-right-click on an unarmed mine. Four wires, one of them safe, and 90 seconds of probe budget. A wrench or a lockpicking kit sharpens the electrical clue, and you have to stay within 6 blocks. Cutting correctly leaves an inert husk you right-click later for the components, so salvage can never drop onto an adjacent live mine and set it off.
Pressure-fused. Step on, step off, goodbye.
Sneak-right-click a placed, unpressed mine to open its fuse panel and try to cut the one steady wire.
A wrench or lockpicking kit in your pack marks the stable circuit for you.
tooltip.doomedmatu.landmine
Exact on the defusal, and it undersells the trigger - any entity arms the mine, dropped items included. The husk a correct cut leaves behind gets no mention at all.
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Fuse | 16 ticks | ~/block/LandmineBlock.java:50 |
| Wound radius | 5.0 blocks | ~/body/Explosion.java:82 |
| Terrain radius | 2.0 blocks | ~/body/Explosion.java:97 |
| Deafening radius | 12.5 blocks (radius x 2.5) | ~/body/Explosion.java:136 |
| Cover test | solid block more than 0.5 blocks in front of you | ~/body/Explosion.java:304 |
| Dismemberment | 35% at centre, inside half radius, one limb max | ~/body/Explosion.java:252 |
| Defusal budget | 90 seconds, 4 wires | ~/block/LandmineBlock.java:66 |
| Minefield cluster | 14-20 mines across 24 blocks | ~/worldgen/SurfaceScatterFeature.java:146 |
Cover does not reduce explosion damage, it removes it entirely
An explosion clips a ray from its centre to your body. If a solid block is hit more than half a block short of you, the whole payload is skipped: every limb wound, the fracture and dislocation rolls, the head trauma, the disfigurement and eye rolls, the dismemberment roll and the knockback. You still take the deafening and the consciousness cap out to 2.5 times the blast radius.
A defused landmine leaves a husk on purpose
Cutting the correct wire does not pop the salvage. It replaces the mine with an inert deactivated landmine you right-click later to strip the fuse for components. Any entity trips a live mine, dropped items included, so the older behaviour of popping loot on the spot could drop items onto an adjacent armed mine and detonate it. Defusing a whole cluster first and collecting afterwards is the intended flow.
The guns
Six firearms exist. The pistol takes a 12-round magazine and does 7 damage at 60 blocks on a 6-tick cadence. The rifle takes 20 rounds and does 11 at 70 blocks on a 4-tick cadence, the fastest ordinary weapon. The shotgun is a 6-shell tube throwing 8 pellets at 3.6 each out to 35 blocks on a 16-tick cadence, pumped between shots. The heavy revolver has six physical chambers and does 15.5 at 110 blocks. The naval cannon holds one breech-loaded shell for 72 damage at 420 blocks, and it fires only when you are fully aimed, on the ground, off the sprint and nearly stationary. The quad minigun runs a 2000-round drum.
Guns and ammunition come out of locked crates. The pistol, rifle and shotgun each sit at weight 1 in a roster of roughly sixty entries, so the gun itself is a lucky pull, and the loose rounds are four to six times commoner. Naval shells and minigun drums appear at weight 1 while their weapons do not, so finding one is a promise rather than firepower. Guns drop unloaded. Traders stock anything with a trade value, and that includes the revolver.
Magazines fill one round per right-click, from loose rounds anywhere in your inventory. Bulk loading does not exist here, and neither does an ammunition recipe.
The revolver's .410 shell is a second cartridge for the same chambers, and the chamber's contents are read at the instant of the shot. A mixed cylinder alternates behaviours round by round: a shell throws 9 pellets at 3.2 damage with 5.5 times the dispersion, only 22 blocks of range, two and a half times the recoil, and a report of its own.
You have nothing to load it with.
message.doomedmatu.revolver_no_rounds
The line a crate-pulled revolver gives you. Guns drop unloaded, and the loose rounds are a separate roll.
Aim
Dispersion begins as an interpolation between hip and aimed values, driven by how far the sights have actually come up, and the server owns that progress - the viewmodel can only show accuracy already earned. The rifle runs 0.025 hip to 0.0030 aimed, the revolver 0.012 to 0.0038, the shotgun 0.042 to 0.022. Sights take 3 ticks on the pistol, 4 on the rifle, 6 on the revolver and shotgun, 28 on the naval cannon. The benefit is removed the instant the aim key is released, rather than when the visual finishes lowering.
Everything after that makes it worse. Movement multiplies by up to 2.8, sprinting doubles it again, being airborne multiplies by 1.8, crouching multiplies by 0.78. Heat above 1.0 adds 5.5 percent per point.
The body penalty is the one nobody sees. It is arm capability loss times 1.25, plus consciousness loss times 0.65, plus pain times 0.45, capped at 2.4. At the cap your dispersion is multiplied by 3.4 and your recoil by roughly 1.8. A bleeding, half-conscious body cannot shoot straight, and the game never says so.
Hands matter separately. The pistol, rifle and shotgun benefit from two. Firing one of them with a single usable arm multiplies handling by 0.62 and recoil by 1.55, and handling divides into the cooldown, so an injured shooter is slower as well as looser. Kuru's motor decline feeds the same channel.
Downed, a refusal pending, Corebound, or consciousness at zero: the trigger does nothing at all.
Hits scale by where they land - 2.2 times above 82 percent of the target's height, 1.0 through the torso, 0.75 on the legs, 0.6 on the feet, 0.5 on the arms. Damage also scales with the square of retained velocity, floored at 15 percent, so a round at the end of its range is a fraction of one at the muzzle.
The body penalty reads the same arm capability, consciousness and pain values that drive the downed state, so accuracy has been draining for a long while before the game finally refuses to let you fire. Pain, Consciousness and Death
| Quantity | Value as shipped | Defined in |
|---|---|---|
| Rifle dispersion | 0.025 hip, 0.0030 aimed | ~/item/GunItem.java:2080 |
| Body penalty formula | (1-arms)x1.25 + (1-consciousness)x0.65 + pain x0.45, cap 2.4 | ~/item/GunItem.java:1940 |
| One-handed penalty | handling x0.62, recoil x1.55 | ~/body/HandFunctionService.java:118 |
| Stance multipliers | sprint x2.0, airborne x1.8, crouch x0.78 | ~/item/GunItem.java:1908 |
| Hit location scale | head 2.2, torso 1.0, leg 0.75, foot 0.6, arm 0.5 | ~/entity/BulletEntity.java:380 |
| Velocity falloff | x(velocity/muzzle)^2, floor 0.15 | ~/entity/BulletEntity.java:385 |
| Cannot fire while | downed, refusal pending, Corebound, or consciousness 0 | ~/item/GunItem.java:1522 |
| Heat cooling | 0.10 every 5 ticks, ceiling 8.0 | ~/item/GunItem.java:862 |
Notes
- The Horrified moodle's own description ends "Escape its reach and put stone between you." The second half has no effect. Recognition latches to that exact Maw for as long as it stays your in-range encounter, and only leaving the 96-block territory or killing the animal clears it; breaking line of sight changes nothing. Whether the copy predates the latch, or the latch went in without anyone rereading the copy, is not recorded.
- LandmineBlock's class comment still documents the source's 50-block proximity gate as live behaviour. The entityInside method four lines below it carries a note saying any entity trips a mine and no proximity gate exists. One of the two was written later and nobody went back for the other, and nothing in the file says which of its other behaviours still follow the old spec.
- Focus arrives at 28 damage to the core, a flat tenth of 280. Severing all six tentacles costs 240 raw damage and bleeds 12 percent of that into the core, which comes to 28.8. Whether the threshold was placed to sit just under a full dismantling pass or simply landed there is not written down anywhere.
- Killing a Deep Maw yields nothing at all. The entity has no loot table, no advancement and no coded drop, and the sole aftermath is one Sealed Maw Remains block that itself drops nothing - placed only if a natural cave face turns up within six blocks during the handful of attempts between tick 54 and tick 80 of the collapse. A kill in open water or over a player-built floor leaves no mark. Whether the empty reward was decided or just never finished is not stated.
- reference/DEEP_MAW_SYSTEMS_AUDIT.md, dated 2026-08-07, still lists finding 40 - the enormous bite that never breaks bone - as a live CONFLICT. The bite now always attempts a fracture, and can tear a distal limb off outright at 72 percent once you have been dragged into the mouth; that code landed 2026-08-08, the day after. The audit has not been re-run since, so its six remaining CONFLICT entries carry the same doubt.
- Everything the firearms do while actually held and fired sits outside what the preflight checkers can reach, because a headless boot never holds an item. The body penalty's ceiling of x3.4 dispersion and roughly x1.8 recoil has been read off the arithmetic and never felt.
PART V - INDEX
Condition Index
Every state WITNESS can put on you, worst first. Severity is judged from what the code does to you rather than from how the name sounds: impairing degrades something, dangerous kills you if you leave it, lethal kills you on its own timer.
cardiacarrestlethalmaxbleedinglethalkurulethaloverdoselethalsepsislethalstrokelethalamputationdangerousarrythmiadangerousbleedingdangerousbraindamagedangerousburndangerouscolddangerousthoraxdestroyeddangerousdeepwounddangerousdepressiondangerousvenomdangerousfrostbitedangerousheavybleedingdangeroushemothoraxdangeroushypertensiondangeroushungerdangeroushypoventilationdangerousinfecteddangerousinternalbleeddangerousirradiateddangeroushypotensiondangerousoxygendangerousmarrowfeverdangerousmarrowwormdangerousmiserabledangeroussickdangeroushotdangerousoverhydrateddangerousoverweightdangerouspalpitationsdangerousrenalfailuredangerousrotlungdangerouspaindangerousshockdangerousdislocatedspinedangerousthirstdangerousunconsciousdangerousunderweightdangerousdislocatedjawdangerouswithdrawaldangerousbadsleepimpairingbrokenboneimpairingbrokenneckimpairingbrokenribsimpairingconcussionimpairingconfusedimpairingdislocationimpairingencumberedimpairingexertionimpairingdirtyimpairinggloomyimpairinghorrifiedimpairingsmallbleedingimpairingsadimpairingtiredimpairingtraumaimpairinglowimmunityimpairingclawdamageimpairingasleepcosmetichollowcosmetichappycosmeticenergizedcosmeticfocusedcosmeticimpendingdoomcosmeticjaundicecosmetickeratinboostercosmetichighimmunitycosmeticNot indexed
pulmonaryembolismwet
Item Index
What each item does when you use it, and where it comes from. An item with no obtain path recorded is an item you cannot currently get.
reagent_acetylreagent_acidactivatedcharcoaladhesivebandagealginatealoe_gelamiodarone_syringeanalgesicgauzeanimal_fatantibiotic_cultureantibioticsantidepressantantiparasiticantiradantisepticantisepticmushantiserum_syringeantivenom_syringeantiviralaedbandagereagent_basebiochem_syringebittermoss_clumpbittermoss_pulpbittermoss_washblood_bagsawboneweldingtoolborosilicate_flaskbruisekitburngelcadaver_torsocanteenceftriaxone_syringechest_drainclottingmushicepackcold_packcombatpencyst_carrier_spawn_eggcyst_parasite_spawn_eggcyst_fibredeep_maw_spawn_eggdonor_organdoomeddoomed_chemdoomed_cystdoomed_fooddoomed_geardoomed_devicesdoomed_weaponsdryingclothelectrolyte_saltsemptybloodbagepinephrine_syringeevaporatorfentanyl_precursorfentanyl_syringefermenterfern_fibrefeverbell_chewfeverbell_flowerfeverbell_powderfield_codexfield_journalfilter_pressforaging_knifeheatpackherbal_poulticeherbal_tonicheroinhot_drinkbloodbaghumanimmunosuppressantimprovised_charcoal_slurryimprovised_prostheticiodinekeratinbooster_syringekilnmindwipelightersoapdefibrillatorcigarettecigarette_packmechanical_prostheticmedicalsuturemorphine_syringenaloxone_precursornaloxone_syringenaltrexoneneuralboosterbraingrownocifenopium_syringeoverclock_chipoxyline_syringepainkillersparticulate_filterplasticbandageplushiepoppy_latexprocoagulant_syringeprosthetic_lubricantraw_opiumreagent_catalystrebreatherrecrystallizerlrdserumreliefcream_syringerevivolringersolution_syringerippeddressingsalinesedative_syringeslaking_vatsleepingpillssodiumnitroprusside_syringereagent_solventsplintspore_capsterilizedbandagestillstimulant_syringestreptokinase_syringesuppressantsyringethermometertitanium_prosthetictourniquettweezersactivated_carbon_unwashedvapor_filtervasopressin_syringewet_wipeswoundglue_syringewoundstaplerwoundwort_leafwoundwort_pastewrenchNot indexed
battery_recharger
Block Index
Placed blocks, what they do, and what they need to do it - power, heat, or a fluid.
banana_peelfluid_barrelbattery_rechargerbear_trapbittermossbittermoss_cropcyst_root_matbraziercaboose_landminecaltropscentrifugereactorcollapsed_pressure_vesselcoolercyst_creepcyst_cup_fanscyst_eyecyst_mosscyst_root_ribcyst_spore_bloomcyst_water_filmcyst_stonedeactivated_landminedead_archive_terminallifepod_consoledrop_capsuledrop_capsule_reservationdrop_capsule_shelldrying_ovencoilcyst_frondsfeverbellfeverbell_cropfreezerfrost_fernfuel_generatorfume_hoodglowcapgrabber_plantgun_turretgunminecyst_vineheatericeboxcrystal_irradiatedjump_padlandminelive_wirelocked_crateopium_poppyoxygen_compressorpestle_mortarradioactive_barrelcyst_rooted_cadaverruptured_process_unitsawbladedeep_maw_remainskeypad_podsound_cannonspike_trapcyst_spore_reedssun_ferncyst_bushsyringe_fillercyst_moss_carpetcrystal_unstableventilationwash_stationcyst_water_podwoundwortwoundwort_cropNot indexed
cyst_earopium_poppy_seeds
PART VI - THE RECORD
Trivia
- One of the blocks is named after a player. The author ran a guessing game asking which game's sound effect and name had inspired Doomed; Caboose answered correctly, and there is now a Caboose Landmine. It copies the surface beneath it so only the small trigger shows, and it does five times an ordinary mine's damage and terrain radius. The standard defusal panel still works, assuming the mine is noticed at all.registry/DoomedBlocks.java:56 and :388; lang block.doomedmatu.caboose_landmine
- The answer to that guessing game was Creedbreaker. The mod's own storefront credits Project Zomboid and Casualties Unknown as the heavier influences, and the underground pods are a direct nod to the second of those.the author, publicly; CurseForge subtitle; reference/codex_transcripts
- Funkin at Friday started inside Doomed and left. It is a standalone rhythm mod now, and the hook that stayed behind pays out brain function for a good performance - gated by a cooldown, a ceiling, and a minimum score, so a song cannot be farmed. Brain damage is the one injury in this mod you treat by playing a different one.compat/funkin/FunkinReward.java:9-28
- SOMNULL used to be required to run Doomed at all. It was cut to a runtime-only sibling after enough bug reports, and there is no code coupling between them any more.build.gradle:186-187
- The voice in your head was cast by open audition. One rule: the lines had to be acted by a human, writing their own words, because the author did not want to hear anybody reading a script he had written. No recording has shipped. sounds.json carries no imaginary-friend entry, so for now the friend is still silent.the author, publicly; absence confirmed in assets/doomedmatu/sounds.json
- The firearms were rebuilt, in the author's own words, out of spite. He has said he intends to overhaul them again for the same reason.the author, publicly
- The WITNESS tablet's clinical descriptions were rewritten by a contributor who asked to stay anonymous. Forty-eight of the pages in the device you carry are theirs.the author, publicly; client/tablet/WitnessWiki.java
Contributors
The mod is not the work of one person and the archive should not pretend otherwise.
This archive is complete in the sense that it covers every system the mod ships. It is not complete in the sense that matters, because a body simulation is only really documented by somebody dying in it, and no amount of reading the source is that.
Nothing in this file has been playtested. Everything in it is true about the code.