campaign
The campaign of the Verdigris Cloister: four rooms of the greenhouse, the progression between them, and the wounds the squad carries out of each one. Pure data and pure functions — it never touches the board, spawns nothing and draws nothing. The `Screens` component drives it.
game.campaign
The campaign of the Verdigris Cloister: four rooms of the greenhouse, the
progression between them, and the wounds the squad carries out of each one.
Pure data and pure functions — it never touches the board, spawns nothing and
draws nothing. The Screens component drives it.
local Campaign = require("game.campaign")
The four rooms
Campaign.MISSIONS — in order: the Propagation Hall (hold the line), the Brass
Nave (reach the seed vault), the Fern Vault (survive eight rounds), the Heart
Chamber (cleanse the heart). Each record carries its objective, the narrator's
briefing, the squad it fields, its round count, the share of the floor the
blight may hold before the room is lost, the growth it starts seeded with, and
the upgrade it banks.
shipped = false on a mission takes it out of the campaign: Campaign.shipped()
and Campaign.nextMission() skip it, and Campaign.isFinale() moves the ending
to whatever the last shipped room is. That is the honesty valve — the campaign
ends properly at whatever actually landed.
The run
Campaign.run() is the live run, held at Core.state().campaign so any slice
can read it:
{ screen, missionId, completed = { id, ... }, upgrades = { reward, ... },
outcome = nil | "won" | "lost",
roster = { [monkId] = { alive, wounds = { woundId, ... }, upgrades,
missionsFought, kills, fellIn } } }
Campaign.squad(missionId) returns the monks who can take the floor — on that
room's roster, still alive — with their aim, max health and range already folded
together with the wounds they carry.
The dead stay dead
Campaign.settle(missionId, units) reads a finished mission's unit table (the
Core.state().units shape) and writes what the room cost: anything not alive
is struck off the roster for the rest of the campaign, and a monk who came out
at 60% health or less picks up a wound. The wounds deepen down a fixed ladder,
so a monk who keeps getting hurt keeps getting worse rather than rolling dice.
It returns a report of what changed, which is what the seed catalogue prints.
Nothing heals a wound. Campaign.resetRun() is the only way back, and it starts
the whole campaign over.
The codex
Campaign.PLANT_PLATES and Campaign.BLIGHT_PLATES are the herbarium's eight
specimens — plate number, Latin binomial, habit, what it does on the board, and
a line in the order's own hand. The screens slice draws the figures.
Scoped to this part · feeds back into the world's score.