more fixes and tweaks

This commit is contained in:
Jesse
2026-08-01 12:00:27 -04:00
parent d1f689d4fc
commit f00255ce31
7 changed files with 94 additions and 8 deletions
+19 -3
View File
@@ -35,7 +35,7 @@ import type { Direction } from './content.ts';
import type { GameEvent } from './events.ts';
import { acceptsCar, areaOf } from './apply.ts';
import { legalActions } from './legal.ts';
import type { CrewTray, DivisionNode, GameState, PlayerIndex, TrayId } from './state.ts';
import type { CrewTray, DivisionNode, GameState, PlayerIndex, RollingStock, TrayId } from './state.ts';
import { coordKey, freshTurn, totalRevenue } from './state.ts';
export type AdvanceResult = {
@@ -630,7 +630,7 @@ function arriveAtOffice(
});
return 'moved';
}
collide(s, owner, [id], events, 'no free A/D track');
collide(s, owner, [id], events, 'no free A/D track', 'the Office');
return 'moved';
}
@@ -647,7 +647,7 @@ function arriveAtOffice(
// is not expecting them (§A.4), so this is a collision too, not a coupling.
const officeCard = area.grid.get(coordKey(area.officeCoord));
if (officeCard && officeCard.standing.length > 0) {
collide(s, owner, [id], events, 'cars fouling the Running Track');
collide(s, owner, [id], events, 'cars fouling the Running Track', 'the Running Track');
return 'moved';
}
@@ -672,10 +672,22 @@ function collide(
trains: TrayId[],
events: GameEvent[],
reason: string,
where = 'the Office',
): void {
// Record WHAT was lost before removing it. The log said only "COLLISION: NO FREE A/D TRACK", so a
// player could see the 5 points go without learning which train had just been written off, or
// what it was carrying.
const lost: { label: string; consist: RollingStock[] }[] = [];
for (const id of trains) {
const tray = s.trays.get(id);
if (!tray) continue;
lost.push({
label:
tray.trainNumber === null
? 'the local crew'
: `Train ${tray.trainIsExtra ? 'X' : ''}${tray.trainNumber}`,
consist: [...tray.consist],
});
// Gap 2c — engines and cabooses return to the Division Yard, everything else to Classification.
for (const car of tray.consist) {
if (car.type === 'caboose') s.yards.divisionYard.push(car);
@@ -685,6 +697,10 @@ function collide(
s.freeTrays.push(id);
}
if (lost.length > 0) {
events.push({ type: 'trainsDestroyed', player: faultPlayer, trains: lost, reason, where });
}
s.collisionsToday += 1;
const player = s.players[faultPlayer];
if (player) {