2.1 KiB
2.1 KiB
Architecture
Idlegame is split into four layers.
Engine
src/engine/ contains deterministic gameplay logic:
tickLoop.ts: fixed-timestep accumulator. Large elapsed deltas, including offline catch-up, drain through the same tick path as active play.game.ts: core game state, action queue, costs/unlocks on start, completion-driven queue advancement (actions do not auto-repeat when the queue is empty).save.ts: versioned save schema, serialized export/import strings, and offline elapsed calculation.story.ts: story graph traversal, triggers (boot, actionComplete, minResources), choices, outcomes.num.ts: branded numeric boundary and human-readable formatting.
The engine must stay pure. It does not import React, Zustand, browser APIs, storage, requestAnimationFrame, or Date scheduling.
Content
src/content/ contains authored definitions validated by Zod. M0 includes one
resource and one timed action. M1 expands this into real resources, actions,
story nodes, automation unlocks, and prestige definitions.
State
src/state/ owns environment coupling:
- persistence backend selection: IndexedDB via
idb-keyval, with localStorage fallback - load-on-boot and autosave orchestration
- requestAnimationFrame loop and lifecycle hooks
- mapping engine state to view models
- Zustand store updates for React
storyOrchestration.ts: evaluates triggers after boot/publish/action completion; maps prefs to panel auto-open.- Player prefs (
prefs.ts) in localStorage — not in save v1.
UI
src/ui/ renders the view model and calls runtime commands. Components should
not implement gameplay rules. The M0 shell includes a resource readout, action
panel, progress bar, and event log.
Verification
Run the full local gate before pushing:
pnpm typecheck
pnpm lint
pnpm test:coverage
pnpm build
Rendered checks for the walking skeleton:
- app loads without framework overlay or console errors
- starting the timed action increments Gold after completion
- reload preserves saved state
- reopening after time away credits offline progress