Config: 10-minute board period and 10-hour rest
CI / check (push) Successful in 4m25s
Details
CI / check (push) Successful in 4m25s
Details
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
f4ddf1dc04
commit
81e71e8436
|
|
@ -868,3 +868,9 @@ Implementation decisions not spelled out in `memory-bank/implementation-plan.md`
|
||||||
|
|
||||||
- **Final screenshots are palette-quantized** (sharp `palette: true`, quality 90): 24 shots in 6 MB instead of 18 MB, with no visible banding in the art.
|
- **Final screenshots are palette-quantized** (sharp `palette: true`, quality 90): 24 shots in 6 MB instead of 18 MB, with no visible banding in the art.
|
||||||
- **The 500 KB chunk warning is accepted for now.** The UI kit and screens added about 27 KB to the main chunk; route-level code splitting (like the map's) can take it back under when the PWA work in Phase 11 looks at load size.
|
- **The 500 KB chunk warning is accepted for now.** The UI kit and screens added about 27 KB to the main chunk; route-level code splitting (like the map's) can take it back under when the PWA work in Phase 11 looks at load size.
|
||||||
|
|
||||||
|
## Config change: shorter board period and rest
|
||||||
|
|
||||||
|
- **`contractBoardPeriodRealMinutes` 60 → 10 and `restGameHours` 60 → 10** (user request, after Phase 10D). At 60× compression a rest is now 10 real minutes, exactly one board period, so decision 0.5.46 still holds and its content test (rest in real time ≥ board period) is unchanged and passing.
|
||||||
|
- **Effects:** boards refresh every 10 real minutes and every contract expires at the end of its period, so offers turn over six times as fast. A rested pilot is back in 10 minutes instead of an hour. This also resolves the earlier note that the CR-004 example expected a short rest.
|
||||||
|
- **Two tests assumed a 60-minute period** and now derive their timing from config instead: the server's `testContract` helper (expiry = end of the board period) and the board-refresh countdown test. No game code changed.
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import { content } from "@deadhead/content";
|
||||||
import { createGuestResponseSchema, playerStateSchema, type PlayerState } from "@deadhead/schema";
|
import { createGuestResponseSchema, playerStateSchema, type PlayerState } from "@deadhead/schema";
|
||||||
import {
|
import {
|
||||||
boardPeriodIndex,
|
boardPeriodIndex,
|
||||||
|
boardPeriodMs,
|
||||||
createDispatchRecord,
|
createDispatchRecord,
|
||||||
createRepositionRecord,
|
createRepositionRecord,
|
||||||
type Contract,
|
type Contract,
|
||||||
|
|
@ -105,7 +106,8 @@ export function testContract(overrides: Partial<Contract> = {}): Contract {
|
||||||
requiredSkill: null,
|
requiredSkill: null,
|
||||||
requiredLongHaulLevel: 0,
|
requiredLongHaulLevel: 0,
|
||||||
offeredAt: TEST_NOW,
|
offeredAt: TEST_NOW,
|
||||||
expiresAt: TEST_NOW + 3_600_000,
|
// Contracts expire at the end of their board period (TEST_NOW is a period start).
|
||||||
|
expiresAt: TEST_NOW + boardPeriodMs(content.config),
|
||||||
firstContact: false,
|
firstContact: false,
|
||||||
...overrides,
|
...overrides,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,12 @@ import { screen, waitFor, within } from "@testing-library/react";
|
||||||
import userEvent from "@testing-library/user-event";
|
import userEvent from "@testing-library/user-event";
|
||||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
import { useClock } from "../src/clock/clock";
|
import { useClock } from "../src/clock/clock";
|
||||||
|
import { formatClock } from "../src/format";
|
||||||
import { fakeApi, renderApp, samplePlayerState } from "./render";
|
import { fakeApi, renderApp, samplePlayerState } from "./render";
|
||||||
|
|
||||||
const period = boardPeriodMs(content.config);
|
const period = boardPeriodMs(content.config);
|
||||||
// 17.5 minutes into a board period.
|
// A quarter of the way into a board period (derived from config, whatever its length).
|
||||||
const NOW = Math.ceil(Date.parse("2100-01-01T00:00:00Z") / period) * period + 17.5 * 60_000;
|
const NOW = Math.ceil(Date.parse("2100-01-01T00:00:00Z") / period) * period + period / 4;
|
||||||
const periodEndsAt = (boardPeriodIndex(NOW, content.config) + 1) * period;
|
const periodEndsAt = (boardPeriodIndex(NOW, content.config) + 1) * period;
|
||||||
|
|
||||||
const courier: Ship = {
|
const courier: Ship = {
|
||||||
|
|
@ -79,7 +80,7 @@ describe("board refresh and the nothing-here case (Step 10D.8)", () => {
|
||||||
it("counts down to the next board period", async () => {
|
it("counts down to the next board period", async () => {
|
||||||
renderApp(api([heavyJob]), "/contracts?location=earth");
|
renderApp(api([heavyJob]), "/contracts?location=earth");
|
||||||
expect(await screen.findByLabelText("Board refresh")).toHaveTextContent(
|
expect(await screen.findByLabelText("Board refresh")).toHaveTextContent(
|
||||||
"New contracts in 42:30",
|
`New contracts in ${formatClock(periodEndsAt - NOW)}`,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,13 +23,13 @@ export const gameConfig: GameConfig = {
|
||||||
loanRepaymentShare: 0.3,
|
loanRepaymentShare: 0.3,
|
||||||
// Courier price + Earth bay lease.
|
// Courier price + Earth bay lease.
|
||||||
dealLoanAmount: 5000,
|
dealLoanAmount: 5000,
|
||||||
contractBoardPeriodRealMinutes: 60,
|
contractBoardPeriodRealMinutes: 10,
|
||||||
// Duty and rest (CR-004): about three Moon round trips, then rest.
|
// Duty and rest (CR-004): about three Moon round trips, then rest.
|
||||||
dutyLimitGameHours: 12,
|
dutyLimitGameHours: 12,
|
||||||
longHaulDutyBonusGameHours: 2,
|
longHaulDutyBonusGameHours: 2,
|
||||||
// One board period (60 real minutes at 60× compression), so a rested pilot
|
// One board period (10 real minutes at 60× compression), so a rested pilot
|
||||||
// always wakes to a fresh board (decision 0.5.46).
|
// always wakes to a fresh board (decision 0.5.46).
|
||||||
restGameHours: 60,
|
restGameHours: 10,
|
||||||
firstContactChance: 0.1,
|
firstContactChance: 0.1,
|
||||||
firstContactPayoutMultiplier: 2,
|
firstContactPayoutMultiplier: 2,
|
||||||
// One band per ship size, so every board has work for every ship (playtest fix):
|
// One band per ship size, so every board has work for every ship (playtest fix):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue