diff --git a/CHANGELOG.md b/CHANGELOG.md index 6052d9a..c03af27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## v0.43.0 — 2026-09-21 15:57 +- **Wear rate reduced 10× per ISS-085** — `WEAR_PER_KM` in `lib/game/catalog.ts` drops from 0.005 to 0.0005, so plane maintenance status degrades 1/10th as fast (~13 mid-range hops → ~130 hops to break a full-health plane) + ## v0.42.0 — 2026-09-21 15:02 - **Auto-refuel on dispatch (ISS-082).** Manual refueling is gone — planes top up automatically at dispatch, so a grounded plane can always start any leg that fits a full tank when cash allows. `flyPlane` (`lib/game/actions.ts`) tops the tank to `min(maxFuel, max(fuel, 1.5 × required))` before departure — the same target/price terms as the removed forFlight mode: liters × FUEL_PRICE_PER_L minus the rep-scaled discount (v0.38.0), deducted from cash; unaffordable → 409 `insufficient funds` with nothing mutated, and a leg that doesn't fit even a full tank still 409s `insufficient fuel` (the backstop). The engine's auto-chain (`deliverPackages`, `lib/sim/engine.ts`) does the same at landing: when the next queued leg exceeds the landed fuel it tops up to the identical target when cash allows and chains anyway — only an unaffordable top-up grounds the plane with the queue kept intact - **REMOVED** `POST /api/planes/:planeId/refuel` (route + route tests), the `refuelPlane()` action + `RefuelOptions` (`lib/game/actions.ts`), the left-pane "Refuel to full" section and per-leg Refuel button with their dead state/derived values (`components/LeftPane.tsx`), and the OpenAPI `/api/planes/{planeId}/refuel` path + `RefuelRequest` schema — endpoint count 14 → 13, stale refuel mentions reworded in info/state/queue/repair descriptions, and fly's description + 409 now document the auto-refuel diff --git a/lib/game/catalog.ts b/lib/game/catalog.ts index dadc743..efc7bc1 100644 --- a/lib/game/catalog.ts +++ b/lib/game/catalog.ts @@ -125,8 +125,8 @@ export const MAX_FUEL_DISCOUNT = 0.2; // --- Maintenance (v0.39.0, ISS-069) --- -// ponytail: balance-tunable — health lost per km of landed legs (~13 mid-range EDDF↔LEMD hops to break from full). -export const WEAR_PER_KM = 0.005; +// ponytail: balance-tunable — health lost per km of landed legs (~130 mid-range EDDF↔LEMD hops to break from full; 1/10× slower since v0.43.0, ISS-085). +export const WEAR_PER_KM = 0.0005; // ponytail: balance-tunable — burn multiplier for a broken plane (health ≤ 0): it still flies, just thirsty. export const BROKEN_BURN_MULTIPLIER = 1.5; diff --git a/lib/sim/engine.test.ts b/lib/sim/engine.test.ts index ae81103..b985e66 100644 --- a/lib/sim/engine.test.ts +++ b/lib/sim/engine.test.ts @@ -407,7 +407,7 @@ describe('wear on landed legs + broken burn (v0.39.0, ISS-069)', () => { expect(await deliverPackages(inst, T0 + travelMs(km, PLANE_TYPES.atr72.speedKmh))).toBe(1); const plane = (await inst.db.select().from(schema.planes))[0]; - expect(plane.health).toBeCloseTo(100 - WEAR_PER_KM * km, 9); // one mid-range hop ≈ −9.8 health + expect(plane.health).toBeCloseTo(100 - WEAR_PER_KM * km, 9); // one mid-range hop ≈ −0.98 health (v0.43.0, ISS-085) }); it('clamps at 0 across multiple legs', async () => { diff --git a/package.json b/package.json index 49b4ac3..60517a4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flight-ops", - "version": "0.42.0", + "version": "0.43.0", "private": true, "scripts": { "dev": "next dev -p 3000",