v0.4.9f — an Extra starts where you put it, a train card is never discarded
The 0.6.2 change, ported to the playtest line. Three from the v0.4.9e gameplay-testing round — Gitea#4 extras did not start where the player said, #6 train cards could be discarded, #7 four train cards had the wrong coach counts — plus two bugs found underneath #4. Gitea#2 is diagnosed but NOT fixed; it needs a ruling, and the reasoning is in TODO.md. GITEA#4 — AN EXTRA STARTS WHERE THE PLAYER PUTS IT. Both Division Points are offered now, and the START decides the direction rather than the number: an odd westbound Extra placed at the WEST end would otherwise leave the Division on its first move having crossed nothing and be paid for the run. At an Interchange or a Control Point the player picks the direction. The Interchange start is a YARD, off the running line, which is what makes the Superintendent clause work — placing an Extra there can never force a collision, a guaranteed one holds it for another Stage, and a potential one is the Superintendent's to rule on, which are §8.1's two existing answers. Where an Extra may start is a new setting in the New Game dialog, defaulting to what the engine already did so this build does not change under its testers mid-line. FOUND UNDERNEATH IT, both already shipping: an Extra started away from a Division Point could never be given a consist and ran empty, so the Control Point start has been broken since it was added; and collide left destroyed trains' transits on the Mainline card, permanently poisoning that card for every later train. THE MAINLINE CARDS ARE DEALT FROM THE PRINTED DECK NOW, without replacement. They were drawn from the nine types with replacement, so a Division could hold two Interchanges — and "an Extra may start at the Interchange if one is on the board" only reads as a rule if the board holds at most one. This re-deals every seed, so both published replays were retired and re-recorded. GITEA#6 — A TRAIN CARD IS NEVER DISCARDED, Timetabled and Extra alike. No forcing mechanism was needed: nothing discardable plus a hand over the limit leaves exactly one legal way to end the turn, and playing a train is unconditionally legal, so a hand of four cannot trap anyone. The hand panel says so on the train, and the blocked end-turn button changes its wording. GITEA#7 — COACH COUNTS. 1/2 Crack Limited 3 -> 2, 5/6 The Sparrow 2 -> 3. WHAT DIFFERS FROM THE MAIN LINE. The car-placement round rotation test that accompanies #7 there arrived with the 0.6 multiplayer work and does not exist here, so there was nothing for the coach-count change to follow. src/web/main.ts and test/web.test.ts needed hand-resolution: this line's New Game dialog has neither the mode radios nor the victory dials, so only the Extra-start parts were taken. The content.ts comment pass came across whole; main's TODO documentation item did not, since this line keeps its own TODO. 623 tests pass, tsc clean, site builds.
This commit is contained in:
+22
-5
@@ -255,14 +255,31 @@ export function narrate(e: GameEvent, ctx: NarrateContext = {}): Narration {
|
||||
tone: 'bad',
|
||||
text: `SECOND SECTION ordered on Train ${e.trainNumber} — an identical train will run right behind it, which forces the Superintendent to rule on a following train (§8.1)`,
|
||||
};
|
||||
case 'extraStarted':
|
||||
/**
|
||||
* WHERE THE PLAYER PUT IT, not where its number would have sent it.
|
||||
*
|
||||
* An Extra's direction comes from its start now (§7, Jesse's ruling), so the line that used to
|
||||
* explain the number's parity would be explaining a rule that no longer applies to this train.
|
||||
*/
|
||||
case 'extraStarted': {
|
||||
const where =
|
||||
e.at.kind === 'divisionPoint'
|
||||
? `the ${e.at.side === 'west' ? 'Western' : 'Eastern'} Division Point`
|
||||
: e.at.kind === 'mainline'
|
||||
? "the Interchange's yard"
|
||||
: `the Control Point in seat ${e.at.seat}`;
|
||||
const why =
|
||||
e.at.kind === 'divisionPoint'
|
||||
? 'the end it runs away from — an Extra may start at either, and the end chooses the run'
|
||||
: e.at.kind === 'mainline'
|
||||
? 'made up off the running line, so it highballs onto the Mainline once the Subdivision ' +
|
||||
'is clear and may be held in the yard until it is'
|
||||
: 'an Extra may begin at any Office above a Whistle Post, and the player chooses the run';
|
||||
return {
|
||||
tone: 'good',
|
||||
text:
|
||||
e.atSeat === null
|
||||
? `EXTRA X${e.trainNumber} started at the ${e.trainNumber % 2 === 0 ? 'Western' : 'Eastern'} Division Point, running ${e.trainNumber % 2 === 0 ? 'east' : 'west'} — odd numbers run west and even run east (§2.3), so its number chose the end`
|
||||
: `EXTRA X${e.trainNumber} started at the Control Point in seat ${e.atSeat}, running ${e.trainNumber % 2 === 0 ? 'east' : 'west'} — an Extra may begin at any Office above a Whistle Post instead of at a Division Point`,
|
||||
text: `EXTRA X${e.trainNumber} started at ${where}, running ${e.direction} — ${why}`,
|
||||
};
|
||||
}
|
||||
case 'trainMadeUp':
|
||||
return {
|
||||
tone: 'good',
|
||||
|
||||
Reference in New Issue
Block a user