Ruleset Combat

Use this page to decide how your ruleset takes part in a fight: the battle block lends Marinara's combat the sheet, and the combat block resolves the whole fight by the ruleset's own rules, with its bestiary, board, reactions and contests. It is for ruleset authors. Before you start, read Writing Game Mode Rulesets.

Sections on this page:

Battles: lending the sheet to Marinara's combat

By default a battle knows nothing about the sheet. It builds its fighters the way it always has, and a character can walk out of a fight with their hit points on the sheet untouched.

An optional battle block changes that, in one direction only: it lends the fight the sheet's numbers, and writes the fight's outcome back. It does not make combat follow your rules. The dice math is still Marinara's, and so is who hits whom and for how much. Because of that, health is carried as a share of the maximum rather than as your own number: a character at half health on the sheet starts the fight at half of the health bar Marinara built for them. Your 9-point health pool is never dropped into a fight where one blow does 12.

"battle": {
  "health": { "pool": "grit" },
  "energy": { "pool": "luck" },
  "skills": [{ "list": "knacks" }]
}

the pools in sheet.live.pools, not a list whose rows are pools.

different pool from health, because a fight cannot spend hit points as fuel.

[{ "pool": "slots_1", "level": 1 }]. Levels and pools are each used once.

Only rows that came from one of your catalogs count, and only when the entry behind the row has a mechanics block: a row somebody typed by hand says nothing in numbers. onlyWhen names a boolean column the row must have set, such as a prepared spell. alwaysWhen names a column and a value that lets a row through anyway, such as the spells that are cast without being prepared. It is the exception to onlyWhen, so it is refused without one beside it.

What is carried in, and what is carried out

In, for each party member whose sheet the game has: the health pool's share of its maximum sets where the fighter starts on Marinara's own health bar, the energy pool becomes MP, each slot pool becomes that level's slots, and the marked rows become skills. Maximum hit points, attack, defense, speed and level stay Marinara's own numbers. A character at zero in the health pool starts the fight down, because that is what the sheet says, and a character above zero never starts below one hit point, so a small share cannot knock somebody out by rounding.

Out, once the fight is over: the share of the health bar the fighter ended on is read back onto the health pool's own scale, and the difference from where the fight began is applied as damage or healing. Energy and slots are counts, not shares, so they are written back as they are. Everything goes through the same rules the sheet's own buttons follow, and a change the sheet refuses is skipped and reported rather than forced. A fight that did not move a fighter's hit points writes no health change at all, so the two conversions can never move a sheet by themselves.

Neither: attack rolls, saving throws, concentration, and what a higher cost would add. Those are in the mechanics block for a real combat system to read one day; this bridge does not apply them, and a ruleset should not claim it does.

An abandoned battle writes nothing back. If you delete the message the fight started in, or the fight never reaches its end, the sheet is exactly as it was: the fight did not happen.

How an entry becomes a skill

A catalog entry's mechanics block is read like this:

because Marinara's combat has nowhere to put them.

damage number. Bigger dice never land softer, and the multiplier stays inside the range a generated skill already uses.

and never round down to nothing. A burst becomes its radius, a cone half of it, and a line one cell. Anything with an area targets every enemy it covers, and friendlyFire is honoured.

a heal, a buff or an attack can be pointed at from the skill's type.

exactly one slot spends one slot of that level. Marinara's combat charges one number of energy or one slot, never both, so an entry that costs two slots, slots of two levels, or a slot plus energy is left out of the fight. So is a cost on any other pool, such as hit points or a class resource, because the Engine would otherwise hand it out for free.

promises, such as clearing a condition on the sheet, is not applied in the fight. Leave mechanics off an entry whose effect only makes sense outside a battle.

coverage.combat is separate and still means what it meant: set it only when battles do follow your system's rules.