roadmap: generic vessels + runtime contents (Noita-flask model)

Hooch reframed per user directive: not a bespoke item but FP_Hooch the substance,
in generic vessels whose contents are runtime state -- fill, ferment, pour, drink,
mix. Staged: runtime substance -> drink-any-fluid -> contraband content tag ->
pour+mix -> ferment-model overhaul (age+dilution+sealed/open+temperature+spoil,
mirroring CompRottable). Any fluid drinkable with different consequences; blood is
a substance; any drink can breed addiction at a per-fluid rarity, modified by
mental health + circumstances.
This commit is contained in:
flan
2026-07-15 03:48:54 +00:00
parent fcfb32fff7
commit 036facab29
+34 -2
View File
@@ -301,8 +301,30 @@ built on the existing `SubstanceDef` (data) + `CompVessel` (delivery) + `CompFer
disease + humiliation in one throw. "Mix everything": the blend is a runtime list on the vessel, disease + humiliation in one throw. "Mix everything": the blend is a runtime list on the vessel,
defaulting to the def's single substance when unmixed, so every existing vessel still works. defaulting to the def's single substance when unmixed, so every existing vessel still works.
Staged so each ships green: **hooch → liquid-container fermentation → mixing.** The vessel data model **Reframed 2026-07-15 (user directive): vessels are GENERIC, contents are RUNTIME.** Hooch is not a
is built mixture-capable and site-aware from the start so none of it is a later refactor. bespoke item — it 1:1 models piss *except it is flammable*. A vessel is a generic container; what is in
it (piss, hooch, feces, a blend) is instance state that can be **filled, fermented, poured between
vessels, drunk, and mixed**. So there is no `FP_Weapon_Hooch`; there is `FP_Hooch` (a substance with a
`Flame` damageDef) and a `CompVessel` whose `substance` is now runtime. Any fluid is **drinkable with
different consequences** — a substance carries a *drink outcome* (hooch → alcohol, piss → sickness,
feces → disease) alongside its *throw* outcome. Staged, each green, piss harness guarding throughout:
1. **Runtime substance on `CompVessel`** — instance field (default = def's substance), scribed;
throw/splash/label read it. Vessels become substance-agnostic. (Def names kept to avoid a
breaking rename; label shows contents at runtime — "jar of hooch".)
2. **Drink any fluid, with different consequences** — `SubstanceDef.drinkOutcome`; vessels
ingestible, applying the current substance's consequence (hooch → alcohol high, piss → sickness,
feces → gut rot, **blood** → nutrition + a disturbing thought / possible disease). Every fluid is
a valid drink, just a worse or better idea. **Blood is a substance too** — a liquid like any
other, drinkable and throwable. And **any drink can breed addiction like a drug**: each
`SubstanceDef` carries an addiction *rarity* (hooch common, most fluids extremely rare), and the
per-drink roll is modified by mental health + circumstances (a despairing, mistreated pawn
addicts to things a content one never would) — same nature×nurture spine as propensity.
3. **Contraband content tag** — a concealed vessel carries a generic content tag (Contraband stays
ignorant of `SubstanceDef`; the bridge interprets it), so "a hidden jar of hooch" redeems correctly.
4. **Pour between vessels + mixing** — transfer contents (substance + age); a blend is a list; splash
and drink apply every constituent's effect.
5. **Fermentation-model overhaul** — age + top-up dilution + sealed/open + temperature (mirror
`CompRottable`) + spoil threshold; applies to every vessel, piss included.
**Potency model (corrected 2026-07-15): age + storage, NOT container size.** A liquid's potency is a **Potency model (corrected 2026-07-15): age + storage, NOT container size.** A liquid's potency is a
function of how long it has fermented and how it is stored (a *sealed* vessel ripens and holds; an function of how long it has fermented and how it is stored (a *sealed* vessel ripens and holds; an
@@ -314,6 +336,16 @@ prisoner fills once and hides *ages to full potency*. So "a jar of old piss and
both make sense — it is the usage pattern, not the vessel, that decides. Implementation: track age as both make sense — it is the usage pattern, not the vessel, that decides. Implementation: track age as
a volume-weighted average, diluted on each add; sealed/open scales the ripen rate. a volume-weighted average, diluted on each add; sealed/open scales the ripen rate.
**Temperature + spoilage (2026-07-15): mirror vanilla food rot.** Fermentation is temperature-driven,
exactly like meat — warm speeds it, a freezer nearly halts it, and past a point it **spoils** (goes
from potent to ruined/maximally foul). Rather than invent this, reuse the vanilla mechanic:
`CompRottable` already tracks temperature-weighted rot progress for food. The ferment model should
lean on that same curve (or `GenTemperature`-driven accumulation) so "spoils like meat" is literally
the meat code path — a prisoner's stash left in a hot cell turns fast, one in a cold one keeps. This
makes the whole substance model a **fermentation-model overhaul** of `CompFerment` (age + dilution +
sealed/open + temperature + spoil threshold), sequenced AFTER the hooch item ships, since it applies
to every vessel — piss included — not just hooch.
## Compatibility — the non-negotiable ## Compatibility — the non-negotiable
The suite must load and run cleanly alongside the **all-time most-subscribed Workshop mods**, not The suite must load and run cleanly alongside the **all-time most-subscribed Workshop mods**, not