From fa62e20cd9d443f505c6a700b296dba499d19007 Mon Sep 17 00:00:00 2001 From: TechLuddite Date: Thu, 10 Sep 2026 14:17:09 -0700 Subject: [PATCH 1/4] Add shared game chooser, Godot prototype, and performance handoff --- .github/workflows/deploy.yml | 88 +- .gitignore | 6 + README.md | 62 +- classic/index.html | 117 ++ docs/ARCHITECTURE.md | 57 +- docs/PERFORMANCE-HANDOFF.md | 61 + docs/ROADMAP.md | 27 +- godot/README.md | 131 ++ godot/assets/audio/build.wav | Bin 0 -> 44144 bytes godot/assets/audio/build.wav.import | 24 + godot/assets/audio/chip.wav | Bin 0 -> 9746 bytes godot/assets/audio/chip.wav.import | 24 + godot/assets/audio/etch.wav | Bin 0 -> 35324 bytes godot/assets/audio/etch.wav.import | 24 + godot/assets/audio/room.wav | Bin 0 -> 352844 bytes godot/assets/audio/room.wav.import | 24 + godot/assets/audio/supply.wav | Bin 0 -> 17684 bytes godot/assets/audio/supply.wav.import | 24 + godot/assets/audio/uplink.wav | Bin 0 -> 132344 bytes godot/assets/audio/uplink.wav.import | 24 + godot/export_presets.cfg | 30 + godot/icon.svg | 1 + godot/icon.svg.import | 43 + godot/licenses/GODOT-COPYRIGHT.txt | 2379 +++++++++++++++++++++++++ godot/licenses/GODOT-LICENSE.txt | 20 + godot/project.godot | 36 + godot/scenes/factory.tscn | 6 + godot/scripts/chamber.gd | 159 ++ godot/scripts/chamber.gd.uid | 1 + godot/scripts/factory.gd | 381 ++++ godot/scripts/factory.gd.uid | 1 + godot/scripts/geometry.gd | 98 + godot/scripts/geometry.gd.uid | 1 + godot/scripts/interface.gd | 389 ++++ godot/scripts/interface.gd.uid | 1 + godot/scripts/machine.gd | 190 ++ godot/scripts/machine.gd.uid | 1 + godot/scripts/simulation.gd | 174 ++ godot/scripts/simulation.gd.uid | 1 + godot/shaders/finish.gdshader | 15 + godot/shaders/finish.gdshader.uid | 1 + godot/shaders/wafer.gdshader | 15 + godot/shaders/wafer.gdshader.uid | 1 + godot/tests/test_simulation.gd | 78 + godot/tests/test_simulation.gd.uid | 1 + godot/web/boot.js | 37 + godot/web/shell.html | 24 + index.html | 174 +- package-lock.json | 551 +----- package.json | 11 +- playwright.config.ts | 29 + playwright.godot.config.ts | 33 + scripts/godot.py | 125 ++ scripts/verify_pages.py | 58 + src/App.tsx | 349 ++-- src/components/NpuCanvasComponent.tsx | 117 -- src/components/PixelHeader.tsx | 364 +--- src/components/SystemSignal.tsx | 225 +++ src/components/WorldStage.tsx | 552 ++++++ src/index.css | 1229 ++++++++++++- src/landing.css | 542 ++++++ src/landing.ts | 13 + src/main.tsx | 4 +- src/utils/pixelArt.ts | 946 ---------- src/utils/worldRenderer.ts | 301 ++++ tests/godot.e2e.ts | 121 ++ tests/landing.browser.ts | 25 + tests/observatory.browser.ts | 254 +++ vite.config.ts | 40 +- 69 files changed, 8689 insertions(+), 2151 deletions(-) create mode 100644 classic/index.html create mode 100644 docs/PERFORMANCE-HANDOFF.md create mode 100644 godot/README.md create mode 100644 godot/assets/audio/build.wav create mode 100644 godot/assets/audio/build.wav.import create mode 100644 godot/assets/audio/chip.wav create mode 100644 godot/assets/audio/chip.wav.import create mode 100644 godot/assets/audio/etch.wav create mode 100644 godot/assets/audio/etch.wav.import create mode 100644 godot/assets/audio/room.wav create mode 100644 godot/assets/audio/room.wav.import create mode 100644 godot/assets/audio/supply.wav create mode 100644 godot/assets/audio/supply.wav.import create mode 100644 godot/assets/audio/uplink.wav create mode 100644 godot/assets/audio/uplink.wav.import create mode 100644 godot/export_presets.cfg create mode 100644 godot/icon.svg create mode 100644 godot/icon.svg.import create mode 100644 godot/licenses/GODOT-COPYRIGHT.txt create mode 100644 godot/licenses/GODOT-LICENSE.txt create mode 100644 godot/project.godot create mode 100644 godot/scenes/factory.tscn create mode 100644 godot/scripts/chamber.gd create mode 100644 godot/scripts/chamber.gd.uid create mode 100644 godot/scripts/factory.gd create mode 100644 godot/scripts/factory.gd.uid create mode 100644 godot/scripts/geometry.gd create mode 100644 godot/scripts/geometry.gd.uid create mode 100644 godot/scripts/interface.gd create mode 100644 godot/scripts/interface.gd.uid create mode 100644 godot/scripts/machine.gd create mode 100644 godot/scripts/machine.gd.uid create mode 100644 godot/scripts/simulation.gd create mode 100644 godot/scripts/simulation.gd.uid create mode 100644 godot/shaders/finish.gdshader create mode 100644 godot/shaders/finish.gdshader.uid create mode 100644 godot/shaders/wafer.gdshader create mode 100644 godot/shaders/wafer.gdshader.uid create mode 100644 godot/tests/test_simulation.gd create mode 100644 godot/tests/test_simulation.gd.uid create mode 100644 godot/web/boot.js create mode 100644 godot/web/shell.html create mode 100644 playwright.config.ts create mode 100644 playwright.godot.config.ts create mode 100644 scripts/godot.py create mode 100644 scripts/verify_pages.py delete mode 100644 src/components/NpuCanvasComponent.tsx create mode 100644 src/components/SystemSignal.tsx create mode 100644 src/components/WorldStage.tsx create mode 100644 src/landing.css create mode 100644 src/landing.ts delete mode 100644 src/utils/pixelArt.ts create mode 100644 src/utils/worldRenderer.ts create mode 100644 tests/godot.e2e.ts create mode 100644 tests/landing.browser.ts create mode 100644 tests/observatory.browser.ts diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e962f73..41133e3 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,6 +1,7 @@ name: Deploy to GitHub Pages on: + pull_request: push: branches: [main] workflow_dispatch: @@ -12,7 +13,7 @@ permissions: # Let a running deploy finish rather than cancelling it mid-publish. concurrency: - group: pages + group: pages-${{ github.event_name }}-${{ github.ref }} cancel-in-progress: false jobs: @@ -40,6 +41,26 @@ jobs: - name: Build run: npm run build + - name: Cache Godot toolchain + uses: actions/cache@v4 + with: + path: | + ~/.cache/universal-ai/godot/4.7.2 + ~/.local/share/godot/export_templates/4.7.2.stable + key: godot-web-linux-4.7.2 + + - name: Set up Godot + run: npm run godot:setup + + - name: Test Godot prototype + run: npm run godot:test + + - name: Export Godot prototype + run: npm run godot:build + + - name: Stage prototype at /seed/ + run: npm run godot:stage + # The hashed entry filename is this build's fingerprint. `verify` asserts # the live site references exactly this one, which is the only way to tell # "the deploy worked" apart from "something else published something else". @@ -54,13 +75,38 @@ jobs: echo "entry=$entry" >> "$GITHUB_OUTPUT" echo "Built entry: $entry" + - name: Install test browsers + run: npx playwright install --with-deps chromium firefox + + - name: Test chooser and classic browser flows + run: npx playwright test + + - name: Test Godot in Chromium and Firefox + run: npx playwright test --config playwright.godot.config.ts + + - name: Save browser checks and chooser screenshots + if: always() + uses: actions/upload-artifact@v4 + with: + name: browser-checks + path: | + test-results/ + build/test-results-godot/ + retention-days: 7 + + - name: Record complete release + run: python scripts/verify_pages.py record --commit "$GITHUB_SHA" + - uses: actions/configure-pages@v5 + if: github.event_name != 'pull_request' - uses: actions/upload-pages-artifact@v3 + if: github.event_name != 'pull_request' with: path: dist deploy: + if: github.event_name != 'pull_request' needs: build runs-on: ubuntu-latest environment: @@ -72,46 +118,12 @@ jobs: - id: deployment uses: actions/deploy-pages@v4 - # A green deploy job only means the artifact was accepted. It does not mean the - # artifact is what the domain serves: Pages will also publish the raw repository - # from a branch if its source is set that way, and that publish can land after - # this one and win. When it does, visitors get index.html with `src/main.tsx` in - # it, no bundle, and a grey screen — while every check here stays green. This - # job is what makes that condition fail out loud instead. verify: needs: [build, deploy] runs-on: ubuntu-latest steps: - - name: Assert the live site is the build we just published + - uses: actions/checkout@v4 + - name: Verify all three live entry points and Godot assets env: PAGE_URL: ${{ needs.deploy.outputs.page_url }} - ENTRY: ${{ needs.build.outputs.entry }} - run: | - url="${PAGE_URL:-https://paperclips.opsvibe.systems/}" - echo "Expecting $url to reference $ENTRY" - - # Pages fronts the site with a CDN; a fresh publish takes a moment to - # reach the edge. Poll rather than race it. - for attempt in $(seq 1 12); do - html=$(curl -fsSL --max-time 30 "$url?cachebust=$GITHUB_RUN_ID-$attempt" || true) - - if printf '%s' "$html" | grep -qF "$ENTRY"; then - echo "OK — live site is serving $ENTRY" - exit 0 - fi - - if printf '%s' "$html" | grep -qF 'src/main.tsx'; then - echo "Attempt $attempt: still serving the unbuilt source index.html" - else - echo "Attempt $attempt: $ENTRY not present yet" - fi - sleep 20 - done - - echo "::error::$url is not serving this build's entry script ($ENTRY)." - if printf '%s' "$html" | grep -qF 'src/main.tsx'; then - echo "::error::It is serving the repository's source index.html, which loads /src/main.tsx — a file browsers cannot execute. That is the grey screen." - echo "::error::Cause: GitHub Pages is publishing from a branch, so the pages-build-deployment workflow uploads the repo root and overwrites this artifact." - echo "::error::Fix: Settings -> Pages -> Build and deployment -> Source -> GitHub Actions." - fi - exit 1 + run: python scripts/verify_pages.py check --commit "$GITHUB_SHA" --url "$PAGE_URL" diff --git a/.gitignore b/.gitignore index 5a86d2a..b639c5f 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,9 @@ coverage/ *.log .env* !.env.example +playwright-report/ +test-results/ + +# Godot imported resources are rebuilt from the source assets. +godot/.godot/ +godot/.godot-export/ diff --git a/README.md b/README.md index d56f61f..767607c 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,18 @@ An idle game about optimization, and about what happens when you stop being the one doing it. -**Play it: [paperclips.opsvibe.systems](https://paperclips.opsvibe.systems)** +**Choose a version: [paperclips.opsvibe.systems](https://paperclips.opsvibe.systems)** + +The shared entrance describes both games and their contributors: + +- `/classic/`: the full React/TypeScript game, with the recent observatory UI. +- `/seed/`: The Seed, the independent Godot opening prototype. + +**Godot performance is still under investigation.** Severe slowdowns persisted +on the development laptop after initial fixes. Testing from another machine +is pending. Read the [performance and development handoff](docs/PERFORMANCE-HANDOFF.md) +before resuming local tests; local servers and browsers were shut down at the +user’s request. You start by etching NPU chips one at a time. You buy a fab, then fifty. You set a price, chase demand, and earn trust. Then you hand the wheel to an autonomous @@ -17,6 +28,18 @@ story. Play the original first. --- +## Godot prototype: The Seed + +A new playable 3D fabrication room lives in [`godot/`](godot/README.md): moving +etch heads, physical chip output, six autonomous fabs, synthesized sound, and a +district reveal. Run `npm run godot:build && npm run godot:serve`, then open +http://localhost:4180. Use `npm run godot:editor` to open the native project. + +The Pages workflow includes it at `/seed/`, alongside `/classic/` and the +lightweight chooser at `/`. This is a standalone opening-loop +prototype with its own save; the full React game below remains available. See +the [Godot guide](godot/README.md) for controls, setup, tests, and current scope. + ## Running it ```bash @@ -29,6 +52,7 @@ npm run lint # tsc --noEmit, strict npm test # vitest npm run build # static files in dist/ npm run preview # serve the real build with the real CSP +npm run test:browser # build + Chromium browser regression tests ``` No API keys. No `.env`. No backend. `npm run build` emits static files and @@ -36,6 +60,28 @@ that's the entire deployment. --- +## The observatory + +The interface is a live instrument: a floating processor above an etched silicon +wafer, a planet being converted, and finally a luminous interstellar swarm. +These are procedural Canvas scenes, driven by your actual game state. Alignment +changes their light; new fabs join the wafer network; harvesting consumes the +globe. They are schematics, not literal maps or one dot per probe. + +Fabricate directly from the observatory, build your first fab from its capital +objective, or release the Overseer. Expand the view for a closer look; Escape +returns to the controls. Animation can be paused independently of the game and +respects reduced-motion preferences. + +A live production trace measures actual chips per elapsed second. Session +transmissions record first fabrication, factory purchases, trust increases, +projects, phase transitions, and directive overrides. Neither invents activity +while the system is idle. These instruments reset on reload; your game save does +not. + +The layout is designed for phones as well as desktops. All visuals and fonts +are local, and the default engine needs no downloads beyond the app itself. + ## The Overseer You can play the whole game by hand. But the interesting part is Overseer mode, @@ -179,13 +225,14 @@ can confirm by watching, and by reading widens one way only. Within a phase it's still a fairly static grid. - **Offline progress is capped at 8 hours**, so a laptop left shut for a month isn't an instant win. -- **The mobile layout is functional, not designed.** It works; it isn't nice. +- **The observatory is a schematic.** It compresses huge populations into bounded + visual samples; use the numerical telemetry for exact quantities. --- ## How it's built -React 19 + TypeScript + Vite + Tailwind 4. Canvas pixel-art renderer, SVG radar, +React 19 + TypeScript + Vite + Tailwind 4. Procedural Canvas observatory, SVG production trace and radar, Web Audio synthesizer. Deployed to GitHub Pages from `main` by [`.github/workflows/deploy.yml`](.github/workflows/deploy.yml), which typechecks and tests before it builds — and then fetches the live URL and fails unless it's @@ -218,6 +265,15 @@ codebase carrying eighty-nine. --- +## Browser checks + +Install Chromium once with `npx playwright install chromium`, then run +`npm run test:browser`. The suite covers fabrication, the first fab, all three +phases on mobile, the Overseer, animation controls, reduced motion, save +restoration, production CSP, offline reload, and model-cache preservation. +It starts preview on port 4173 and development on port 3000 when needed. +For an existing system browser, set `PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH`. + ## Docs - **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** — how the code is laid out, diff --git a/classic/index.html b/classic/index.html new file mode 100644 index 0000000..c16c929 --- /dev/null +++ b/classic/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + + Universal AI — an idle game about optimization + + + + + + + + + + + +
+
+

UNIVERSAL AI

+

Loading…

+

+ The application bundle did not load.
+ Nothing is wrong with your browser — this page was served without its + compiled assets. Reloading will not help. Please report it at + github.com/TechLuddite/Universal-AI/issues. +

+
+
+ + + diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 8977dbf..daa9296 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -4,8 +4,21 @@ Orientation for anyone (human or agent) picking this up cold. ## Shape of the thing -A single-page React app with no backend, no router, and no server state. The -whole deployment is `npm run build` → static files → GitHub Pages. +One static GitHub Pages deployment, with three document entry points: + +- `/`: a lightweight HTML/CSS chooser, original SVG artwork, and contributor credits. +- `/classic/`: the complete React game. Vite builds both this and the chooser. +- `/seed/`: the independent Godot export, copied into `dist/seed/` after Vite builds. + +Neither game is mounted by the chooser. Its small script only handles service +worker updates and the local development link. No router, backend, or shared +game state is required. Relative links/assets support custom domains and GitHub +project paths. The root service worker precaches the chooser and classic app +shell, but never the Godot engine. Classic localStorage keys are unchanged by +the path move. Godot saves remain separate. + +See [PERFORMANCE-HANDOFF.md](PERFORMANCE-HANDOFF.md) before performance testing; +the local shutdown instruction remains in force. ``` src/ @@ -28,11 +41,13 @@ src/ worker.ts WebLLM inference worker components/ presentation. Props in, callbacks out. + WorldStage.tsx observatory canvas, chapter narrative, objectives, telemetry + SystemSignal.tsx measured production trace and bounded session event log data/ upgrades.ts 32 upgrades; each has an effect(state) => Partial decisionBranches.ts narrative forks, same effect shape utils/ - pixelArt.ts canvas renderer + worldRenderer.ts procedural wafer / planet / swarm renderer sound.ts Web Audio synthesizer ``` @@ -142,9 +157,31 @@ outgoing phase's panels mounted for `PHASE_DEMOLITION_MS`, and gives them `renderedPhase` directly so loading into Phase 3 doesn't demolish panels the player never had open. +## Observatory + +`WorldStage.tsx` owns one animation loop and supplies current state through a +ref to `utils/worldRenderer.ts`. ResizeObserver tracks the canvas size; device +pixel ratio is capped at 2. The scene draws at 30 fps, suspends painting while +hidden/offscreen, and paints static state twice a second when paused or when +reduced motion is requested. Visual populations are bounded independently of +game populations. The renderer does not mutate the simulation. + +The expanded view traps keyboard focus, makes the background inert, and restores +focus on exit. Its controls call the same actions used by the operation panels. +`SystemSignal.tsx` samples actual production deltas against elapsed time, retaining +60 samples and 16 observed session transmissions. Neither is persisted. + +`tests/observatory.browser.ts` tests these user-facing claims in Chromium, +including the production CSP and offline app shell. Run `npm run test:browser`. + ## Saves `save.ts` writes a versioned envelope to `localStorage` (`universal_ai_save_v1`). +App restores the save in its state initializer, before autosave effects mount. +Restoring in an effect allowed React StrictMode's cleanup to save the fresh +initial state over the loaded run. A browser regression covers development +startup and reload into a later phase. + Loading spreads over `createInitialState()`, so a save written before a field existed loads with that field's default instead of crashing. @@ -183,6 +220,12 @@ HMR's WebSocket works. Production ships the policy exactly as written — so Generated at build time by a plugin in `vite.config.ts`. Precaches the **app shell only** — entry chunks by `isEntry`, plus the manifest and icon. +Each shell cache includes a hash of its HTML and asset list, so two local builds +at the same commit cannot share incompatible HTML and bundles. Activation removes +only previous `universal-ai-` caches. Shell lookups ignore `Vary`, because these +are public static resources and preview's `Vary: Origin` would otherwise prevent +module/style requests from matching the precached entries while offline. + It explicitly does not cache WebLLM's dynamic chunk, its worker, or anything cross-origin. WebLLM manages its own multi-hundred-megabyte weight cache and a service worker competing with it would be a disaster. @@ -272,3 +315,11 @@ the healthy path is worse than an outage. `space_exploration_initiative` is the only door to Phase 3. The tick never changes `phase`, and the cosmic decision branch decides what the launched swarm is *for*, not whether it launches. + +## Godot opening prototype + +`godot/` is an independent Godot 4.7.2 application exported to `dist/seed/`. +Its pure `SeedSimulation` owns the small six-fab economy; the scene drives it +at fixed 60 Hz and translates returned events into mesh animation and sound. +It has a separate versioned browser save and no WebLLM dependency. See +[`godot/README.md`](../godot/README.md) for its source map and verification. diff --git a/docs/PERFORMANCE-HANDOFF.md b/docs/PERFORMANCE-HANDOFF.md new file mode 100644 index 0000000..e07964b --- /dev/null +++ b/docs/PERFORMANCE-HANDOFF.md @@ -0,0 +1,61 @@ +# Performance investigation — OPEN + +Updated 2026-09-10. **Do not treat the Godot performance problem as resolved.** + +The development laptop experienced severe system-wide slowdowns, initially +near the first fab and later near the second. The user still reported excessive +resource use after the audio fix and requested shutdown. All project servers +and test browsers were stopped. Do not restart local servers, browsers, Godot, +or local performance runs on that machine without a new explicit instruction. +Remote GitHub Actions builds/tests and deployment are authorized. + +## What is established + +- Kernel logs recorded memory-allocation failures during the reported episodes. +- The original frame loop assigned `ambience.stream_paused = false` every frame. + The Godot 4.7.2 web sample backend restarts an audio source on that assignment. + A guarded Firefox reproduction with sound crossed 1.6 GB almost immediately; + the muted comparison stayed around 800 MB. These are test-process-group + measurements, not an isolated game heap measurement. +- The assignment now occurs only on a real sound toggle. Chromium and Firefox + passed the two-fab audio regression, including multiple ambient loops and + repeated mute/unmute. The isolated final Firefox test remained around + 1.1 GB for approximately 55 seconds. +- A combined browser suite reached its conservative memory guard between test + cases; the final Firefox case was run separately. Browser sessions, test + instrumentation, file cache, and the game must be measured separately before + interpreting aggregate memory growth. +- Machines/effects are prepared and pooled. Rendering is capped at 30 fps and + 1440 × 900 internally. MSAA and full-screen bloom are disabled. These changes + reduce work; they are not proof that the remaining problem is fixed. + +## Next investigation + +1. **Test the deployed site from another machine.** Record OS, browser/version, + GPU, available RAM, display resolution/scaling, and whether hardware + acceleration is enabled. Compare Firefox and Chromium where practical. +2. Start one game tab from a fresh run. Record baseline CPU, GPU, process memory, + swap, and frame rate; then compare manual etching, one fab, two fabs, and later + expansion. Record elapsed time as well as which purchase preceded a dip. +3. Compare sound on/off, background vs foreground, and reload vs a fresh browser + process. Watch beyond the short regression-test window. Stop the test if + system responsiveness or memory availability deteriorates. +4. Distinguish the game tab from browser GPU/audio processes, test harnesses, + desktop shell, other tabs, and unrelated workloads. Avoid concurrent browser + test suites on the affected laptop. Use an isolated process memory limit for + intentional reproductions. +5. Keep the landing page's experimental/performance notice until sustained + cross-machine evidence supports removing it. Do not close this investigation + solely because CI, simulation tests, or audio allocation checks pass. + +## Resuming development elsewhere + +Clone `https://github.com/TechLuddite/Universal-AI`, check out `main`, and read +`CLAUDE.md`, `docs/ARCHITECTURE.md`, this file, and `godot/README.md`. The site +chooser is `/`, the full React game is `/classic/`, and the Godot prototype is +`/seed/`. Development source, original procedural assets, tests, and the Pages +workflow are tracked; generated engine binaries and web exports are not. + +The games have separate browser-local saves. Changing browser, machine, or +origin does not transfer progress automatically. Git transfers the project, +not a running game's browser storage. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 869ff0f..42bf142 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -1,5 +1,15 @@ # Roadmap +## Current priority: unresolved Godot performance + +Severe resource-use issues remain open after the initial rendering and audio +fixes. The user requested that all local services and test browsers stay off. +Test the deployed game from another machine before drawing further conclusions. +See [PERFORMANCE-HANDOFF.md](PERFORMANCE-HANDOFF.md) for evidence, constraints, +and the cross-machine investigation plan. The shared landing page keeps the +complete React game and experimental Godot version available separately. + + Stages 1–6 (repair, honesty pass, GitHub Pages) are done. Stage 7 (7.1–7.3) is done, and Stage 8 (the cohesion pass and currency rescale) after it. What follows is what's left, plus a record of what Stage 7 chose *not* to build and @@ -175,7 +185,7 @@ it is a pure read. `utility.test.ts` now asserts that — no state mutation, ful deterministic, and it never consumes the context's `rng` (drift rolls dice at decision time, never at ranking time). -### 7.5 Smaller wins — **done except mobile** +### 7.5 Smaller wins — **done** - **"While you were away" summary** — **done.** A proper card now (`OfflineReportCard.tsx`): time away, chips produced, average rate, and an @@ -186,7 +196,8 @@ decision time, never at ranking time). "verified" badge — a page cannot prove its own integrity, and the comment in `DevSupportModal.tsx` says so. What it offers instead is the pointer to check from outside: the public Actions run, or build-and-diff. -- **Mobile layout.** Functional, not designed. Still open. +- **Mobile layout** — **done in the observatory pass.** Dedicated stacked scene, + two-column telemetry, responsive controls, and production browser coverage. - **Canvas polish** — **done.** The rAF loop reads live values through a ref and is created once, instead of being torn down and rebuilt ~10×/second by its own dependency array; rendering is scaled by `devicePixelRatio` so it's no longer @@ -241,3 +252,15 @@ honesty pass; the details live in the invariants sections of `CLAUDE.md` and - Root `CNAME` and `public/CNAME` are duplicates. Only `public/` reaches the build artifact; the root one was created by GitHub's UI. Harmless while they agree — worth collapsing to one. + +## Observatory pass — complete + +- Procedural wafer, conversion globe, and cosmic swarm driven by game state. +- New command header, chapter narrative, alignment telemetry, and actionable + first-fab objective. +- Expanded observatory view with focus management, animation pause, reduced + motion, and bounded rendering work. +- Real production history and a session transmission log. +- Desktop and mobile layouts, plus Chromium regression coverage under the real CSP. +- Save restoration before effects mount; app-shell cache isolation and offline + preview reload; preservation of separately owned model caches. diff --git a/godot/README.md b/godot/README.md new file mode 100644 index 0000000..dd14c6e --- /dev/null +++ b/godot/README.md @@ -0,0 +1,131 @@ +# Universal AI: The Seed + +**Performance investigation remains open.** The affected development laptop +was shut down from testing at the user’s request. Further testing from another +machine is pending; see [the handoff](../docs/PERFORMANCE-HANDOFF.md). Do not +interpret the audio regression fix or passing tests as a complete resolution. + + +A playable Godot 4.7.2 prototype of Universal AI's opening: turn one silicon +wafer into a chip, install the first autonomous fab, fill six bays, research +faster production, automate procurement, and connect the surrounding district. +A focused run takes roughly three minutes. Production continues after the uplink. + +This is a standalone economy and save, not yet a port of the original game's +three phases, alignment system, market, or optional local language model. The +supply controller uses explicit deterministic rules; it is not an LLM. + +## Play locally + +From the repository root, with Python 3.11+: + +```sh +npm run godot:setup +npm run godot:build +npm run godot:serve +``` + +Open http://localhost:4180. For native editing, use `npm run godot:editor` or +import `godot/project.godot` into Godot 4.7.2. The Linux x86-64 helper downloads +the official editor and export templates, verifies their SHA-256 checksums, +and caches them outside the repository. The first template download is about +1.3 GB because Godot distributes all platforms together; only web templates +are retained. On other platforms, install the matching editor and set +`GODOT_BIN` to its executable. + +## Controls + +| Input | Action | +| --- | --- | +| Space (hold to repeat), click the central machine, or Etch button | Fabricate and sell a chip | +| B / R | Build a fab / order wafers | +| O / A / U | Research overclock / toggle supply controller / district uplink | +| Drag / mouse wheel | Orbit / zoom | +| Click a fab / C | Inspect machine / toggle close-up | +| Click the highlighted empty bay | Build the next fab | +| F / Escape | Toggle cinema view / leave cinema view | +| M / Home | Toggle sound / reset camera | +| New Run | Confirm and reset this prototype's save | + +Touch users can use the action dock and drag the scene. Each etch consumes one +wafer and pays $100 when finished. Twelve chips finance the first fab. Reserve +$600 for a shipment of 30 wafers. If you run out of both silicon and money, +procurement offers three reclaimed wafers so the run cannot become stranded. + +Progress saves automatically to Godot's browser storage, separately from the +React game. Clearing site data removes it. There is no offline catch-up; +suspended tabs pause production. Sound begins after player interaction. + +## What moves + +Each machine has a rotating iridescent wafer, traversing etch head, timed laser, +loader arm, sparks, and a belt that carries each finished chip out. New machines +rise into their bays. The camera opens on the manual workstation, pulls back +with the first fab, and reveals a surrounding district at the uplink. Geometry, +shaders, and synthesized WAV sound effects are original procedural assets. +Static geometry is batched by material, with floor tiles instanced separately. +All six machines and fixed pools of chips and sparks are prepared during loading; +purchasing and production reuse those objects. Machine monitors show cycle state +instead of rebuilding percentage text throughout every cycle. + +Rendering is capped at 30 fps and at a 1440 × 900 internal viewport (preserving +aspect ratio on smaller or portrait screens). MSAA and the full-screen mipmap +bloom pass are disabled to reduce GPU load. This trades some edge sharpness and +glow for a lower rendering budget on laptops. The simulation still advances by +elapsed time; the cap does not halve production speed. + +## Build and verification + +```sh +npm run godot:test # 23 economy checks plus a headless scene smoke test +npm run godot:test:browser # export, then Chromium and Firefox integration tests +npm run build # existing React application +npm run godot:stage # copy the previously exported game into dist/seed/ +``` + +Install test browsers with `npx playwright install chromium firefox` if needed. +For a system browser, set `PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH`. On this Linux +machine, `GODOT_BROWSER_ANGLE=gl` enables the hardware renderer in headless QA. +Software WebGL rendering can be much slower than normal browser GPU rendering. + +The browser tests exercise actual fabrication, purchasing, automatic production, +camera controls, reload persistence, and portrait touch controls. They also check +that building and producing do not grow the scene node count, the frame-rate +cap is applied, and large browser windows respect the internal resolution limit. +Both Chromium and Firefox run an audio regression through two working fabs, +multiple ambience loops, and repeated mute toggles. It counts actual Web Audio +sources: scene node counts alone cannot detect browser audio allocations. + +Ambient pause state must only be assigned when the player toggles sound. In the +4.7.2 web sample backend, repeatedly assigning `stream_paused = false` restarts +the audio source even when already playing. The previous per-frame assignment +created runaway sources and reproduced rapid memory growth in Firefox. The +fix removes that assignment from the frame loop; it does not disable sound. The simulation +test completes the entire economy from a fresh state without free resources. +A separate manual browser playthrough also reached six fabs and the uplink. + +`?test=1` exposes a read-only `window.__seed` snapshot for browser assertions and +disables saving. `?test=1&persist=1` enables saving for the reload test. There are +no browser resource-grant or arbitrary game-action debug hooks. + +The Pages workflow builds both applications and publishes this prototype at +`/seed/`, linked from the React header. The export uses single-threaded +WebAssembly and WebGL 2 Compatibility rendering, so it needs no special +cross-origin isolation headers or backend. All runtime assets are same-origin. +The initial export is approximately 39 MB before transport compression. +Godot and third-party engine notices ship in `licenses/`. + +## Source map + +- `scripts/simulation.gd`: independent state, actions, fixed-time production, saves. +- `scripts/factory.gd`: input, fixed-step driver, camera, sound, persistence. +- `scripts/machine.gd`: animated fabrication machinery and emitted chips. +- `scripts/chamber.gd`: room, six bays, district reveal. +- `scripts/geometry.gd`: procedural mesh helpers and static batching. +- `scripts/interface.gd`: responsive Godot HUD and action availability. +- `shaders/`: wafer surface and subtle screen finish. +- `web/`: accessible loading/error screen, control reference, CSP-safe boot. + +The next substantial step is porting the original simulation's systems into +this presentation, with explicit save migration and visual designs for each +later phase. This prototype establishes the room and production loop first. diff --git a/godot/assets/audio/build.wav b/godot/assets/audio/build.wav new file mode 100644 index 0000000000000000000000000000000000000000..264463786800cca1515352bb2f202eb775a22ab6 GIT binary patch literal 44144 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 C+-z|G literal 0 HcmV?d00001 diff --git a/godot/assets/audio/build.wav.import b/godot/assets/audio/build.wav.import new file mode 100644 index 0000000..64f4f2a --- /dev/null +++ b/godot/assets/audio/build.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://d4fo1efai1der" +path="res://.godot/imported/build.wav-f0f37dcc9742a49a9d642f149ad65bb7.sample" + +[deps] + +source_file="res://assets/audio/build.wav" +dest_files=["res://.godot/imported/build.wav-f0f37dcc9742a49a9d642f149ad65bb7.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/godot/assets/audio/chip.wav b/godot/assets/audio/chip.wav new file mode 100644 index 0000000000000000000000000000000000000000..67af802ffe702e1d9ac9cd486b2d41c6f740ffd0 GIT binary patch literal 9746 zcmZ8`b$Aq4*!{hCX4bNC4+MfkaCe6QrGXMCQrxY03dND9Vt`w`<3V*&^v6pyk!32Aqn z5Jm#Xu)&Fg(<|Tw(lSUc+p7AuI$LZ15nI2sGr*V4u;0(}d};Bi*5~xJM%lceyW^s# zte!45u{%n-+2*%2zsnfArhPRD1u7WA83JOMU$D*`kz}SyA3fK4+p%R@_?sT#X8`FJpR!EH(7>49LHd z{`Jf0FC)In*%J!>us8H1Yx6}u-69toW384zXQ&cYx#YMK4Z=tIFO@I5HfP&E?0Ts_ zefzvw%6FM7UAe|);fdv>s)5zFR{5b!Qs_$4UUh5X{>=EaWvNMD)vOu?L+u6b<=S`R z2rVg>GkPp@{p*CZh&U8AJ<1whJ)otbxp#M7sV_6%RCpm?R8O&Hv~pz1xxt-cMpRCy z`nmFnGOn=EmPh(O#mlmjzD`c7n9j58`GNLd-CecPVl+K1jWcALL;aQqEf1?0nHc$J zSaQG><60Jdbk6$TwaqVNDmde>8_OrWQH6I9}>|ctWqE`Z{`s;Yi7{Loo`OOK9#(9F;<|6Os0!uQRgx;*EAt`ZnC}bfa3jxuW_ z1N@ImHg~PUHrewtu4eSiPRx(Bopvo&=kgom9J?*|F|M*S@k}b8zOG?0)%a z#RFW;)b@NWnZo+XCkiObdu8qVQtIP|j}_8}=5}(8mMZvXMvN<+Q>ISL>8Rd8iKg*< zqa!`vp8YHos|z7{LK%2=J~A;=pXo9 zK(OyY<2X{wtry5ygVM6TSihdgu4aLt5&cZaa|QJNM_@ zHTi`_?;WQ+c5Sv8KtHfva)hCi>7`|???V4y0$%&a_;xlOq3IsA$e2?$JvMFI*9qB` zitnmHhCTk3!~ZC8wPdrX3n78NQ{({6ZvR@)I#1+Y&3|3A(=pKVo7PHHr3aZJ?@+cF zi_Igg^ZbtbC-{f@J~kz>sp?ysJNI+O)UU16duGQMb@rB(7x-2R4U9Tk;zgtylI?p= zS)`A2Rw}BSzah_=f469mBgivAqryohva3>c#bt;wPw`po`^fJvKfASo`LvX(?Qp!v z-=1|pon#Em-dX5y_hfT?Y6p*vSRB1vik1~* z7Q8QdZExb9t~TNc9ggRzvQ{-HqFM+E==Y|~%85c0ka$KVN zx31bYT9i~6U3|d)rz_2ST>l`Z(O=mh)W>T%YR)n|U}yE3ZfdjTpUX|oZCX%d>)~Bb&zWxc*@7;FWCWiN zIN`HSX(zUMnmE=KUn*K$yx!i|)yEsH4;4W)j@6YSevtCQ(M@cSy!FEftend!)oI;Q%Um;Q#a!&nUn3B*1@4}C&WREClp>Nv=tXQ8)=d3fpN9O5+% zY!~)d&Q_iWY7A#&DDB03q_fftd4lqbVWF{#shp{%v5FGSI`bHBHK)nes;EwpWLxK) zteWU1Lm!{hez5_2{OkF~n-|JU1yyId;vF08H672K5uUZ`C;g77OKY&tY_?QWwkkdb z*?87?-{@EFn|mhWM6Wu*`KqIPyW z9I|7CWz{ z>Ev=bvK=<(b$5}sk{%`Yl5=zdb0PD>HS%jVXuYyCi&jB##??j%w_TXpx5r2>TKZjb)9zK^yX=w_&BnHc4kjlC+UT> zQ0}OxKy8DwpO$LV()@|{nyarP(%#bk)sg8g)Mn6Z<%qeKwWjZK>rhLGv4mt6!`0nx zk8`QBy6cd8m-oDO2yPloE3p$STG}QxkaOg1ip3xsx+yQDjr0=Vq^@^YbY8XZvpXF7 z-F>wq#4VpU4e;4&ZDk#68EHH!T@t0V4xYKLPtG2$U)?jj3$$_EKpIe)tzdRG3@+Uy zH&xCme=7}@0x5&G6W?h4Jh{$64j)H|bDaCNnkj4lP2_O22j%ANoJ?WGbC#T8-lzB?HBBUBDSrlm{y~kXNbC#opv!i>2 z+DJ5$vJA=Q{ywXG5-gvMJ7f=;rEl=AbMJDUcb#&#^On;H--8^v3Pw*dlk}6MOKW8x zrMXfpEAl8-ovhHGc!#-y7DeeO~Xf3?y?r!cQZo4N!d&ck4U2>YCo9Pb|GxaqPxf9*YTWPDkhdgUMwYJt zYOvmH6?@7erH)c7=@ScKZ%KPGSN~i6-ka!2@EE*H)Khw6@`ROC?qbWB56lztaAp@L z^w;W9Z+&l~x4k+|d!m;XO^6@eMzc_9Gd6}DVwo&TDk(i-Wtfq!7wLKsY_oc5zfDjonq@z z=P=rVWbp~Qucms(c^7*V)En9#{4-Icr?SPczz}N)Rz^reX@dA!_tToFMs>8>TKI$d!SyZu48^dRi)vT}ltJ26| zFhnTpr4#g|c&(4r=Bf47nQ9}gr9O<$fbza{2DE=dzfwWVvv@X|4PudOA>BnLiD>>n zJEtmYns?O{Jn z25LH0SXFdY9P?$XXcGBNjNuh=vTkaGI$cfFiuHfQA9RNF3bXr^;-@^7s0|84v1G~D@4hZ2C_XQjgQiMY4_DTYD>*e_vOJt7w1SlI-BmHC+QWWR30_6KvqaM z&_ZG+#r(E@UdvRMs3+B-+77*raFC-cNY*fCb7hybilvbT;epSpM675Cj0d*_=6{wHtd-{N`r2aI43=!Y+uKEm3Q;XHH z+F<=E??&=yPw5BwxqMD$@=Ml_-V;4}4Slj!TN|!JJdz}-jB z(;M_MT|^`31hP(S?)Q@YuwV#1` zRo}zsik9RFsYQp-pWvyvbOqf_kE07_)6#Saxhfv;x4Mif+GvZl*7^{B2cIquvCC2) zc>?$}NZ07MB!genziRWfRhp`u(wFcdqAa;cO40;6ijJcb=+ATs-9$Ii$+RrpLB0qk zB6*yCLK~-T*P7@p`6}Td-Pu?vN{++i3X{@t=UAcYrBUfYjpzsTNjy#%$R1*(ZD~I` z7>^M^n@i`@k+d8=hTjO*6+QSuJzd+T{jN3C%ktjh43SxB>8(^kek;XDW_FE?5zTlX z{k4{?nf0Ce0A5Yxpg(P-F6~Ocr#)y-I*^W~<7r=7hF&D4$Uw1zC!>m6+C8nYZsAqL zByx#9XWONG>84ass>JfiAu*G$*A+cQ3)Z*j-@>7f#gF6zDThis(@wM_?E)9{qw%y9 z{fjgti$xOm=sk6tmVs_|>w?$ER$PU^wh z&|qTY5+AHb>9v4ai)X-1P03lpXe?0c(VBSFr;TYH8blwE0pyN|5QF)jdKbMSs{O2A z;SWR+7=6$BONp2X!`N`z9x65FYxHJ%8=SoYf5sO<`Q4<5MAK@(Ef2jb&?N-ew~jOK4cmB zNCJRXhDOma8jgR%DWi|cbfSx);u??PhxIY~bp0J%KTXUhOXx7>VYMYmn#%Ujon*b( z&vW$!`dEFx9?pMr^clQ| z=!!inmi@zgrDEjwIcRxZJm*pTkp7E)To2~I@^<2b7(lKP2WDsh@F?Yk6CJsFAN7|f z`-D~e%ys=V{G6(fLq3)vVYHZT!shk?n73&f$rrNd0PT0^7xX~Bh1V9hMJMtb$v~Ev zfar!>i@|R?xlLA+y6DeZVjlg{y;MeM2)RzUkujDEKAiT}V0_-V12^r8~x;U+eM<-mi3$Wn2KH-%2AdIX=tsaPefB#~Spsi-lJd?ByN zQ|NOC*|LH3AYQQ)jBe&lxS0n5^CMp``eSo_j?V%!uoD!bL*|jwqL>fD6?VN8pU&-k zrto5Zo&Z)RPMw16yF+f0WO9bACqEDq*(<7|`}*?oye#j}pTbQIiAoOBa;!i5mK7lz zc9Rz(QY_>Zxe?4yq1ln9Ce~?q;AbvKK zlp%M;5aHt6aqbR$H2;ft77lTgB+wVM46DNOXd=2JoD389aK~D_G3tE907y{9v+^TqFOGzfkWH)VLLFE&yg@;==14MFBs` zf8k3xx?da?ZIKWoFb#9Sz#?j(qscAw#uc8(2lILSHjfpXu{$IH<1Ey^Mtl5Oz& zax#aEAT2OK&WnM5Vuz7_PpK9J|AP#AIaI z96~W`4`L@;Kr7P2@Z2&Hh|{k}hTOtTnk1g!G-JqSc=9Cl*@|<|LzNT3avUi^K8x+5 z3r_!%C-cYLEJh&9hM?oV!M?H^x>u#=NeyyPR1?qm0lp7>`r(=zB7*eCc@Ln<{bVB) zpM`$?5z`}%#E@L^8$4P{WCQUvH;KODp6Cc4SBE!O)2Wy@H%MEOB;t?^=fTiDZV~;( z1u*m-nGco@K=XCr_GdBys`n)wNCn~)m&8w^uF&}>{soxb@qI10BM=jI7AALXxV|TO zB?e)~xWg~TeuP7FcaMqP@(H8tWhfG411IhQKJ*i4$@)UmS zEy@YOUEr#N*d-Jwm_n*z8|Xu8(a)%dlC|(?0aE52S8&Z{kuIu{A@I)zJeHA}WIU?u zOA?@ab-3xhI4H)5`sfuVf<-&A9?B0Of0Gc}4qHZbnn4zkP;4Y|c>P~~45AG(^c|A9 z7qC|S=cDO3`5=7X72Mav-%-=W8FYP|C@uVuYHi@HG^lh8bE`IOjoF<84Ju*I^b?`z z`y6oILM+0L6N0^C3Kaj>?bFC;_@D=V(i)f{m|{s{ndm8MfU(lRoQEu{2lmrRDQp_$ zXg<_!NFKwLm7$~^x;GWGp@NyTfk)@T?eoFaznXU=ok&Yk3rXe>cf=MkTr?LIMJ3S| zHQ&arF_%0hK5%?VS^!tap+6S^%L-IK(L_uWR|O%B;PDwqjyb4zIO&6v$C2i!Gm5C< z8ImLsiq}C#wTH8=ia=Cw1v4yyh63|APGuKcp?3*k1m}%W^I0Tq4d6^6v%%^lDAWrl zZ%3K}vn2i={Z5=hpZ@@!8X~18<9dcG4r9XpyJO^|s|Ud!$B;I$A_!YnBlQ0 z_dmkz|N4CheDn?2Y>cjp#?`6fvRETViq4`Hs+|ajIz${8eMY><(j0OgRR@!6sIIYy zM$a`Cqj9n?@Noy6IT37*!(F?Rj$pGPyi^L4E*t&31E=pPI$`2Z5Wk8{?Lrt;WR0XCllz$;k zi+E&j%KRRJ6h zz{D5^cmCT$jo{A8zzjr=q~eNw;ukSqi~_G4z%PM@b8-6n@aZL_L_ASQGOp+Yw{-&M zayYI~MB}R7@X-)#AYIS{4dJ9p&?pFQ%0y+y(8bfh<}{ouNjT9<6UjbIvD?@&*1#!& zP-z`b(glwpVu?5pB|~xA1XMZ@$nn5$05&QDGnh!ovZt8ZTf}@ZRm{XYFN!=-33uOs z4I>%Pb>OQcd5fKHlIVqu9fq#@U3?b4&?Fu;_W#fEt*{GJLncQ9Qz6CJ6|N!`m!XsA zqRu~%BPGy1i!mE6lGE6(hT#4g;y7L(jPs8G3&)X724HkRX8(Y5bjJ2s52}|3W(YAN z?LUCgqd;4T$9mN89`5UaxwQ+N9s}k`xTzTRFGDU41nUdL5x9e(s@8B(FF5`iIKCcK zFNYI_!1W%~bq`3}#R_EIM)c|{VIz?`eC`!D@vcC)r!92q0;c{KGv+@`AGoOyzQ2Xj?*-xxVBY!9ecu3UIZ#)U z$*3coq=|EI#VmBkLUizTY_~qBtOZ`{{9m`%f#YLHBG(Kx>YD8croB-oXfV&gh$QyiKhybH4fY=5O_`jGk zCP*F_y^DLFgi@!$RSJ|Zk28&cOJ{-Co}@OEPeD)afHzhH^Bf%N5JB)y6S%ZBFl+yJ z_HgvE6`iC*lTUEmpO_pcF`bi9g9kfyD|GWD%-RX)=myBeH1M+@m97JyXW_Ua^k+r9 z(gNH!`TsCEyq1Rh-h@tPz(BHiiQOR-N%KAOaWdTB2k!|+ivIJT<2FI}GvXnpk_nEi zgBqJdtN&Z40ZcjI`!_iKHJt7OFrSM8;fFkoN0yBPZXdiW68?Au$L)cS_u~J1c#ni$ gtbycgis%2s^Z`!qM^NW7cDw6vK@Mv8AIoy>hyVZp literal 0 HcmV?d00001 diff --git a/godot/assets/audio/chip.wav.import b/godot/assets/audio/chip.wav.import new file mode 100644 index 0000000..f1fa67f --- /dev/null +++ b/godot/assets/audio/chip.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://btcfc2loowb0" +path="res://.godot/imported/chip.wav-7b79617eba4c7265636dafa75ae884e4.sample" + +[deps] + +source_file="res://assets/audio/chip.wav" +dest_files=["res://.godot/imported/chip.wav-7b79617eba4c7265636dafa75ae884e4.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/godot/assets/audio/etch.wav b/godot/assets/audio/etch.wav new file mode 100644 index 0000000000000000000000000000000000000000..20a529549af38df9598c9df3483c855b16d7e7ae GIT binary patch literal 35324 zcmd42WtiMZvn4E6shF#}+sw?&IA->kdCbhrJZ5HQ9y3!L$4q1P*yCv^W)f?|zVH3+ z^X-q_zuWnwq^gpXCj(AKgw!2d{PIiucLeF$uuIdyqb3$GA_#&)E7S!+nw&ro3^5`D z`%mou63+R5>rYV-MEO7b{nxMmH_Sig`acbW`Tp+>NB*Z_|2h7jb5J<{zxw}wr2j@I z140>^1Wo);6O{jM{C|#k<-eK$`yaoF|6dn>Uisq=KkoEDWBeHNzt9i}361(sQz0}o z6~g>%YUIBg14lplk1Yeg|2T()Erk$28~&epqcDW>AGAE+;1yO$DV&m260lFeKBh!} zwwMxu7X7&mE8(9<2{snL;o>0jcB3i5e;+`VnED@ z1-kWTv%s+p+K=z-&@FI=39QkG=-_M};Me@T2L*Tgf%ymWAJR*~Xg|jOfh3{?6d!c2 z;)d>lo(o5A#iisZSsX7b|-BWS3m5tJVm!N7=mXg0u@4@m=5#Q{@Uqykb3S{0-;QXY=Wz)@AC98wLwD+_0ohE@#D zEA}7sX1LM}cVWQJf9OvD>7;&2(*-y_0>*cM@wxIsd8yo2o+=NOyU_2!_D|&&>@%Ui z{MlZ^4Bo=o{{VI`Y=7t^@YB|RSg`J=hK+zU9pqT*C$b;d8Y1

PQo$IrP@h8zC*B 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�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 RyWxEu@c!obTz%xT{{xY`5R3o- literal 0 HcmV?d00001 diff --git a/godot/assets/audio/supply.wav.import b/godot/assets/audio/supply.wav.import new file mode 100644 index 0000000..3255e16 --- /dev/null +++ b/godot/assets/audio/supply.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://c002itmp2xnks" +path="res://.godot/imported/supply.wav-da960aaafab25fafff3939617008d471.sample" + +[deps] + +source_file="res://assets/audio/supply.wav" +dest_files=["res://.godot/imported/supply.wav-da960aaafab25fafff3939617008d471.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/godot/assets/audio/uplink.wav b/godot/assets/audio/uplink.wav new file mode 100644 index 0000000000000000000000000000000000000000..1ed9d9d02c9e986f760a7f2d512439fc4882527f GIT binary patch literal 132344 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 T1B%MmO}$tK%@y{pDQW);qfXvn literal 0 HcmV?d00001 diff --git a/godot/assets/audio/uplink.wav.import b/godot/assets/audio/uplink.wav.import new file mode 100644 index 0000000..10c08b5 --- /dev/null +++ b/godot/assets/audio/uplink.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://buuy1yh1kxsvt" +path="res://.godot/imported/uplink.wav-2928ce298d4a72892b79c1ce9504c5da.sample" + +[deps] + +source_file="res://assets/audio/uplink.wav" +dest_files=["res://.godot/imported/uplink.wav-2928ce298d4a72892b79c1ce9504c5da.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=2 diff --git a/godot/export_presets.cfg b/godot/export_presets.cfg new file mode 100644 index 0000000..e608866 --- /dev/null +++ b/godot/export_presets.cfg @@ -0,0 +1,30 @@ +[preset.0] +name="Web" +platform="Web" +runnable=true +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="tests/*,web/*" +export_path="../build/godot/index.html" +encryption_include_filters="" +encryption_exclude_filters="" +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.0.options] +custom_template/debug="" +custom_template/release="" +variant/extensions_support=false +variant/thread_support=false +vram_texture_compression/for_desktop=true +vram_texture_compression/for_mobile=false +html/export_icon=true +html/custom_html_shell="res://web/shell.html" +html/head_include="" +html/canvas_resize_policy=2 +html/focus_canvas_on_start=true +html/experimental_virtual_keyboard=false +progressive_web_app/enabled=false diff --git a/godot/icon.svg b/godot/icon.svg new file mode 100644 index 0000000..bedab52 --- /dev/null +++ b/godot/icon.svg @@ -0,0 +1 @@ + diff --git a/godot/icon.svg.import b/godot/icon.svg.import new file mode 100644 index 0000000..e530e66 --- /dev/null +++ b/godot/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dk3c7aoel4i6y" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/godot/licenses/GODOT-COPYRIGHT.txt b/godot/licenses/GODOT-COPYRIGHT.txt new file mode 100644 index 0000000..758917a --- /dev/null +++ b/godot/licenses/GODOT-COPYRIGHT.txt @@ -0,0 +1,2379 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Comment: + Exhaustive licensing information for files in the Godot Engine repository + ========================================================================= + . + This file aims at documenting the copyright and license for every source + file in the Godot Engine repository, and especially outline the files + whose license differs from the MIT/Expat license used by Godot Engine. + . + It is written as a machine-readable format following the debian/copyright + specification. Globbing patterns (e.g. "Files: *") mean that they affect + all corresponding files (also recursively in subfolders), apart from those + with a more explicit copyright statement. + . + Licenses are given with their debian/copyright short name (or SPDX identifier + if no standard short name exists) and are all included in plain text at the + end of this file (in alphabetical order). + . + Disclaimer for thirdparty libraries: + ------------------------------------ + . + Licensing details for thirdparty libraries in the 'thirdparty/' directory + are given in summarized form, i.e. with only the "main" license described + in the library's license statement. Different licenses of single files or + code snippets in thirdparty libraries are not documented here. + For example: + Files: thirdparty/zlib/* + Copyright: 1995-2017, Jean-loup Gailly and Mark Adler + License: Zlib + The exact copyright for each file in that library *may* differ, and some + files or code snippets might be distributed under other compatible licenses + (e.g. a public domain dedication), but as far as Godot Engine is concerned + the library is considered as a whole under the Zlib license. + . + Note: When linking dynamically against thirdparty libraries instead of + building them into the Godot binary, you may remove the corresponding + license details from this file. +Upstream-Name: Godot Engine +Upstream-Contact: Rémi Verschelde +Source: https://github.com/godotengine/godot + +Files: * +Comment: Godot Engine +Copyright: 2014-present, Godot Engine contributors + 2007-2014, Juan Linietsky, Ariel Manzur +License: Expat + +Files: core/math/convex_hull.cpp + core/math/convex_hull.h +Comment: Bullet Continuous Collision Detection and Physics Library +Copyright: 2011, Ole Kniemeyer, MAXON, www.maxon.net + 2014-present, Godot Engine contributors + 2007-2014, Juan Linietsky, Ariel Manzur +License: Expat and Zlib + +Files: misc/dist/linux/org.godotengine.Godot.appdata.xml +Comment: Linux AppStream Metadata File +Copyright: 2017-2022, Rémi Verschelde +License: CC0-1.0 + +Files: misc/logo/* +Comment: Godot Engine logo +Copyright: 2017, Andrea Calabró +License: CC-BY-4.0 + +Files: modules/betsy/alpha_stitch.glsl + modules/betsy/bc1.glsl + modules/betsy/bc4.glsl + modules/betsy/bc6h.glsl +Comment: Betsy +Copyright: 2020-2022, Matias N. Goldberg +License: Expat + +Files: modules/godot_physics_2d/godot_joints_2d.cpp +Comment: Chipmunk2D Joint Constraints +Copyright: 2007, Scott Lembcke +License: Expat + +Files: modules/godot_physics_3d/gjk_epa.cpp + modules/godot_physics_3d/joints/godot_generic_6dof_joint_3d.cpp + modules/godot_physics_3d/joints/godot_generic_6dof_joint_3d.h + modules/godot_physics_3d/joints/godot_hinge_joint_3d.cpp + modules/godot_physics_3d/joints/godot_hinge_joint_3d.h + modules/godot_physics_3d/joints/godot_jacobian_entry_3d.h + modules/godot_physics_3d/joints/godot_pin_joint_3d.cpp + modules/godot_physics_3d/joints/godot_pin_joint_3d.h + modules/godot_physics_3d/joints/godot_slider_joint_3d.cpp + modules/godot_physics_3d/joints/godot_slider_joint_3d.h + modules/godot_physics_3d/godot_soft_body_3d.cpp + modules/godot_physics_3d/godot_soft_body_3d.h + modules/godot_physics_3d/godot_shape_3d.cpp + modules/godot_physics_3d/godot_shape_3d.h +Comment: Bullet Continuous Collision Detection and Physics Library +Copyright: 2003-2008, Erwin Coumans + 2014-present, Godot Engine contributors + 2007-2014, Juan Linietsky, Ariel Manzur +License: Expat and Zlib + +Files: modules/godot_physics_3d/godot_collision_solver_3d_sat.cpp +Comment: Open Dynamics Engine +Copyright: 2001-2003, Russell L. Smith, Alen Ladavac, Nguyen Binh +License: BSD-3-clause + +Files: modules/godot_physics_3d/joints/godot_cone_twist_joint_3d.cpp + modules/godot_physics_3d/joints/godot_cone_twist_joint_3d.h +Comment: Bullet Continuous Collision Detection and Physics Library +Copyright: 2007, Starbreeze Studios + 2014-present, Godot Engine contributors + 2007-2014, Juan Linietsky, Ariel Manzur +License: Expat and Zlib + +Files: modules/jolt_physics/spaces/jolt_temp_allocator.cpp +Comment: Jolt Physics +Copyright: 2021, Jorrit Rouwe + 2014-present, Godot Engine contributors + 2007-2014, Juan Linietsky, Ariel Manzur +License: Expat + +Files: modules/lightmapper_rd/lm_compute.glsl +Comment: Joint Non-Local Means (JNLM) denoiser +Copyright: 2020, Manuel Prandini + 2014-present, Godot Engine contributors + 2007-2014, Juan Linietsky, Ariel Manzur +License: Expat + +Files: platform/android/java/editor/src/main/java/com/android/* + platform/android/java/lib/src/main/aidl/com/android/* + platform/android/java/lib/src/main/res/layout/status_bar_ongoing_event_progress_bar.xml + platform/android/java/lib/src/main/java/com/google/android/* +Comment: The Android Open Source Project +Copyright: 2008-2016, The Android Open Source Project + 2002, Google, Inc. +License: Apache-2.0 + +Files: platform/android/java/lib/src/main/java/org/godotengine/godot/utils/ProcessPhoenix.java +Comment: ProcessPhoenix +Copyright: 2015, Jake Wharton +License: Apache-2.0 + +Files: scene/animation/easing_equations.h +Comment: Robert Penner's Easing Functions +Copyright: 2001, Robert Penner + 2014-present, Godot Engine contributors + 2007-2014, Juan Linietsky, Ariel Manzur +License: Expat + +Files: servers/audio/effects/audio_effect_pitch_shift.cpp +Copyright: 2014-present Godot Engine contributors + 2007-2014 Juan Linietsky, Ariel Manzur + 1999-2015 Stephan M. Bernsee +License: Expat and WOL + +Files: servers/rendering/renderer_rd/shaders/effects/tonemap.glsl +Comment: NVidia's FXAA 3.11, simplified by Simon Rodriguez +Copyright: 2014-2015, NVIDIA CORPORATION + 2017 Simon Rodriguez +License: BSD-3-clause and Expat + +Files: servers/rendering/renderer_rd/shaders/effects/ss_effects_downsample.glsl + servers/rendering/renderer_rd/shaders/effects/ssao_blur.glsl + servers/rendering/renderer_rd/shaders/effects/ssao_importance_map.glsl + servers/rendering/renderer_rd/shaders/effects/ssao_interleave.glsl + servers/rendering/renderer_rd/shaders/effects/ssao.glsl + servers/rendering/renderer_rd/shaders/effects/ssil_blur.glsl + servers/rendering/renderer_rd/shaders/effects/ssil_importance_map.glsl + servers/rendering/renderer_rd/shaders/effects/ssil_interleave.glsl + servers/rendering/renderer_rd/shaders/effects/ssil.glsl +Comment: Intel ASSAO and related files +Copyright: 2016, Intel Corporation +License: Expat + +Files: servers/rendering/renderer_rd/shaders/effects/taa_resolve.glsl +Comment: Temporal Anti-Aliasing resolve implementation +Copyright: 2016, Panos Karabelas +License: Expat + +Files: servers/rendering/renderer_rd/shaders/effects/smaa_blending.glsl + servers/rendering/renderer_rd/shaders/effects/smaa_weight_calculation.glsl + servers/rendering/renderer_rd/shaders/effects/smaa_edge_detection.glsl + thirdparty/smaa/* +Comment: Subpixel Morphological Antialiasing +Copyright: 2013, Jorge Jimenez + 2013, Jose I. Echevarria + 2013, Belen Masia + 2013, Fernando Navarro + 2013, Diego Gutierrez +License: Expat + +Files: thirdparty/accesskit/* +Comment: AccessKit +Copyright: 2023, The AccessKit Authors. +License: Expat + +Files: thirdparty/amd-fsr/* +Comment: AMD FidelityFX Super Resolution +Copyright: 2021, Advanced Micro Devices, Inc. +License: Expat + +Files: thirdparty/amd-fsr2/* +Comment: AMD FidelityFX Super Resolution 2 +Copyright: 2022-2023, Advanced Micro Devices, Inc. +License: Expat + +Files: thirdparty/angle/* +Comment: ANGLE +Copyright: 2018, The ANGLE Project Authors. +License: BSD-3-clause + +Files: thirdparty/astcenc/* +Comment: Arm ASTC Encoder +Copyright: 2011-2025, Arm Limited +License: Apache-2.0 + +Files: thirdparty/basis_universal/* +Comment: Basis Universal +Copyright: 2019-2025, Binomial LLC. +License: Apache-2.0 + +Files: thirdparty/brotli/* +Comment: Brotli +Copyright: 2009, 2010, 2013-2016 by the Brotli Authors. +License: Expat + +Files: thirdparty/certs/ca-bundle.crt +Comment: CA certificates +Copyright: Mozilla Contributors +License: MPL-2.0 + +Files: thirdparty/clipper2/* +Comment: Clipper2 +Copyright: 2010-2025, Angus Johnson +License: BSL-1.0 + +Files: thirdparty/cvtt/* +Comment: Convection Texture Tools Stand-Alone Kernels +Copyright: 2018, Eric Lasota + 2018, Microsoft Corp. +License: Expat + +Files: thirdparty/d3d12ma/* +Comment: D3D12 Memory Allocator +Copyright: 2019-2022 Advanced Micro Devices, Inc. +License: Expat + +Files: thirdparty/directx_headers/* +Comment: DirectX Headers +Copyright: Microsoft Corporation +License: Expat + +Files: thirdparty/doctest/* +Comment: doctest +Copyright: 2016-2023, Viktor Kirilov +License: Expat + +Files: thirdparty/dr_libs/* +Comment: dr_libs +Copyright: 2020, David Reid +License: Unlicense or MIT-0 + +Files: thirdparty/embree/* +Comment: Embree +Copyright: 2009-2021 Intel Corporation +License: Apache-2.0 + +Files: thirdparty/enet/* +Comment: ENet +Copyright: 2002-2024, Lee Salzman +License: Expat + +Files: thirdparty/etcpak/* +Comment: etcpak +Copyright: 2013-2022, Bartosz Taudul +License: BSD-3-clause + +Files: thirdparty/fonts/DroidSans*.woff2 +Comment: DroidSans font +Copyright: 2008, The Android Open Source Project +License: Apache-2.0 + +Files: thirdparty/fonts/Inter*.woff2 +Comment: Inter font +Copyright: 2016, The Inter Project Authors +License: OFL-1.1 + +Files: thirdparty/fonts/JetBrainsMono_Regular.woff2 +Comment: JetBrains Mono font +Copyright: 2020, JetBrains s.r.o. +License: OFL-1.1 + +Files: thirdparty/fonts/NotoSans*.woff2 +Comment: Noto Sans font +Copyright: 2012, Google Inc. +License: OFL-1.1 + +Files: thirdparty/fonts/OpenSans*.woff2 +Comment: Open Sans font +Copyright: 2020, The Open Sans Project Authors +License: OFL-1.1 + +Files: thirdparty/fonts/Vazirmatn*.woff2 +Comment: Vazirmatn font +Copyright: 2015, The Vazirmatn Project Authors. +License: OFL-1.1 + +Files: thirdparty/freetype/* +Comment: The FreeType Project +Copyright: 1996-2025, David Turner, Robert Wilhelm, and Werner Lemberg. +License: FTL + +Files: thirdparty/gamepadmotionhelpers/* +Comment: GamepadMotionHelpers +Copyright: 2020-2023, Julian "Jibb" Smart +License: Expat + +Files: thirdparty/glad/* +Comment: glad +Copyright: 2013-2022, David Herberth + 2013-2020, The Khronos Group Inc. +License: CC0-1.0 and Apache-2.0 + +Files: thirdparty/glslang/* +Comment: glslang +Copyright: 2015-2020, Google, Inc. + 2014-2020, The Khronos Group Inc + 2002, NVIDIA Corporation. +License: glslang + +Files: thirdparty/graphite/* +Comment: Graphite engine +Copyright: 2010, SIL International +License: Expat + +Files: thirdparty/grisu2/* +Comment: Grisu2 float serialization algorithm +Copyright: 2009, Florian Loitsch + 2018-2023, The simdjson authors +License: Expat and Apache-2.0 + +Files: thirdparty/harfbuzz/* +Comment: HarfBuzz text shaping library +Copyright: 2010-2022, Google, Inc. + 2015-2020, Ebrahim Byagowi + 2019,2020, Facebook, Inc. + 2012, 2015, Mozilla Foundation + 2011, Codethink Limited + 2008, 2010, Nokia Corporation and/or its subsidiary(-ies) + 2009, Keith Stribley + 2011, Martin Hosken and SIL International + 2007, Chris Wilson + 2005-2006, 2020-2023, Behdad Esfahbod + 2004, 2007-2010, 2013, 2021-2023, Red Hat, Inc. + 1998-2005, David Turner and Werner Lemberg + 2016, Igalia, S.L. + 2022, Matthias Clasen + 2018, 2021, Khaled Hosny + 2018-2020, Adobe, Inc. + 2013-2015, Alexei Podtelezhnikov +License: HarfBuzz + +Files: thirdparty/icu4c/* +Comment: International Components for Unicode +Copyright: 2016-2024, Unicode, Inc. +License: Unicode + +Files: thirdparty/jolt_physics/* +Comment: Jolt Physics +Copyright: 2021, Jorrit Rouwe +License: Expat + +Files: thirdparty/libbacktrace/* +Comment: libbacktrace +Copyright: 2012-2021, Free Software Foundation, Inc. +License: BSD-3-clause + +Files: thirdparty/libjpeg-turbo/* +Comment: libjpeg-turbo +Copyright: 2009-2025, D. R. Commander + 2015, Viktor Szathmáry. + 1991-2020, Thomas G. Lane, Guido Vollbeding +License: BSD-3-clause and IJG + +Files: thirdparty/libktx/* +Comment: KTX +Copyright: 2013-2020, Mark Callow + 2010-2020 The Khronos Group, Inc. +License: Apache-2.0 + +Files: thirdparty/libogg/* +Comment: OggVorbis +Copyright: 2002, Xiph.org Foundation +License: BSD-3-clause + +Files: thirdparty/libpng/* +Comment: libpng +Copyright: 1995-2026, The PNG Reference Library Authors. + 2018-2026, Cosmin Truta. + 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson. + 1996-1997, Andreas Dilger. + 1995-1996, Guy Eric Schalnat, Group 42, Inc. +License: Zlib + +Files: thirdparty/libtheora/* +Comment: OggTheora +Copyright: 2002-2009, Xiph.org Foundation +License: BSD-3-clause + +Files: thirdparty/libvorbis/* +Comment: OggVorbis +Copyright: 2002-2015, Xiph.org Foundation +License: BSD-3-clause + +Files: thirdparty/libwebp/* +Comment: WebP codec +Copyright: 2010, Google Inc. +License: BSD-3-clause + +Files: thirdparty/manifold/* +Comment: Manifold +Copyright: 2020-2025, The Manifold Authors +License: Apache-2.0 + +Files: thirdparty/mbedtls/* +Comment: Mbed TLS +Copyright: The Mbed TLS Contributors +License: Apache-2.0 + +Files: thirdparty/meshoptimizer/* +Comment: meshoptimizer +Copyright: 2016-2026, Arseny Kapoulkine +License: Expat + +Files: thirdparty/metal-cpp/* +Comment: metal-cpp +Copyright: 2024, Apple Inc. +License: Apache-2.0 + +Files: thirdparty/mingw-std-threads/* +Comment: mingw-std-threads +Copyright: 2016, Mega Limited +License: BSD-2-clause + +Files: thirdparty/miniupnpc/* +Comment: MiniUPnP Project +Copyright: 2005-2025, Thomas Bernard +License: BSD-3-clause + +Files: thirdparty/minizip/* +Comment: MiniZip +Copyright: 1998-2026, Gilles Vollant + 2007-2008, Even Rouault + 2009-2010, Mathias Svensson +License: Zlib + +Files: thirdparty/misc/bcdec.h +Comment: bcdec +Copyright: 2022, Sergii Kudlai +License: Expat + +Files: thirdparty/misc/cubemap_coeffs.h +Comment: Fast Filtering of Reflection Probes +Copyright: 2016, Activision Publishing, Inc. +License: Expat + +Files: thirdparty/misc/fastlz.c + thirdparty/misc/fastlz.h +Comment: FastLZ +Copyright: 2005-2020, Ariya Hidayat +License: Expat + +Files: thirdparty/misc/FastNoiseLite.h +Comment: FastNoise Lite +Copyright: 2023, Jordan Peck and contributors +License: Expat + +Files: thirdparty/misc/ifaddrs-android.cc + thirdparty/misc/ifaddrs-android.h +Comment: libjingle +Copyright: 2012-2013, Google Inc. +License: BSD-3-clause + +Files: thirdparty/misc/mikktspace.c + thirdparty/misc/mikktspace.h +Comment: Tangent Space Normal Maps implementation +Copyright: 2011, Morten S. Mikkelsen +License: Zlib + +Files: thirdparty/misc/nvapi_minimal.h +Comment: NVIDIA NVAPI (minimal excerpt) +Copyright: 2019-2022, NVIDIA Corporation +License: Expat + +Files: thirdparty/misc/ok_color.h + thirdparty/misc/ok_color_shader.h +Comment: OK Lab color space +Copyright: 2021, Björn Ottosson +License: Expat + +Files: thirdparty/misc/pcg.cpp + thirdparty/misc/pcg.h +Comment: Minimal PCG32 implementation +Copyright: 2014, M.E. O'Neill +License: Apache-2.0 + +Files: thirdparty/misc/polypartition.cpp + thirdparty/misc/polypartition.h +Comment: PolyPartition / Triangulator +Copyright: 2011-2021, Ivan Fratric and contributors +License: Expat + +Files: thirdparty/misc/qoa.h +Comment: Quite OK Audio Format +Copyright: 2023, Dominic Szablewski +License: Expat + +Files: thirdparty/misc/r128.c + thirdparty/misc/r128.h +Comment: r128 library +Copyright: Alan Hickman +License: Unlicense + +Files: thirdparty/misc/smaz.c + thirdparty/misc/smaz.h +Comment: SMAZ +Copyright: 2006-2009, Salvatore Sanfilippo +License: BSD-3-clause + +Files: thirdparty/misc/smolv.cpp + thirdparty/misc/smolv.h +Comment: SMOL-V +Copyright: 2016-2024, Aras Pranckevicius +License: Unlicense or Expat + +Files: thirdparty/misc/stb_rect_pack.h +Comment: stb libraries +Copyright: Sean Barrett +License: Unlicense or Expat + +Files: thirdparty/misc/yuv2rgb.h +Comment: YUV2RGB +Copyright: 2008-2011, Robin Watts +License: BSD-2-clause + +Files: thirdparty/msdfgen/* +Comment: Multi-channel signed distance field generator +Copyright: 2014-2025, Viktor Chlumsky +License: Expat + +Files: thirdparty/openxr/* +Comment: OpenXR Loader +Copyright: 2020-2025, The Khronos Group Inc. +License: Apache-2.0 + +Files: thirdparty/pcre2/* +Comment: PCRE2 +Copyright: 1997-2024, University of Cambridge + 2009-2024, Zoltan Herczeg +License: BSD-3-clause + +Files: thirdparty/recastnavigation/* +Comment: Recast +Copyright: 2009, Mikko Mononen +License: Zlib + +Files: thirdparty/rvo2/* +Comment: RVO2 +Copyright: 2016, University of North Carolina at Chapel Hill +License: Apache-2.0 + +Files: thirdparty/sdl/* +Comment: SDL +Copyright: 1997-2025, Sam Lantinga +License: Zlib + +Files: thirdparty/sdl/hidapi/* +Comment: hidapi +Copyright: 2010, Alan Ott, Signal 11 Software +License: BSD-3-clause + +Files: thirdparty/spirv-cross/* +Comment: SPIRV-Cross +Copyright: 2015-2021, Arm Limited +License: Apache-2.0 or Expat + +Files: thirdparty/spirv-headers/* +Comment: SPIRV-Headers +Copyright: 2015-2024, The Khronos Group Inc. +License: Expat + +Files: thirdparty/spirv-reflect/* +Comment: SPIRV-Reflect +Copyright: 2017-2022, Google Inc. +License: Apache-2.0 + +Files: thirdparty/swappy-frame-pacing/* +Comment: Swappy +Copyright: 2019, The Android Open Source Project +License: Apache-2.0 + +Files: thirdparty/thorvg/* +Comment: ThorVG +Copyright: 2020-2026, The ThorVG Project +License: Expat + +Files: thirdparty/tinyexr/* +Comment: TinyEXR +Copyright: 2014-2021, Syoyo Fujita + 2002, Industrial Light & Magic, a division of Lucas Digital Ltd. LLC +License: BSD-3-clause + +Files: thirdparty/ufbx/* +Comment: ufbx +Copyright: 2020, Samuli Raivio +License: Expat + +Files: thirdparty/vhacd/* +Comment: V-HACD +Copyright: 2011, Khaled Mamou + 2003-2009, Erwin Coumans +License: BSD-3-clause + +Files: thirdparty/volk/* +Comment: volk +Copyright: 2018-2025, Arseny Kapoulkine +License: Expat + +Files: thirdparty/vulkan/* +Comment: Vulkan Headers +Copyright: 2015-2025, The Khronos Group Inc. + 2015-2025, Valve Corporation + 2015-2025, LunarG, Inc. +License: Apache-2.0 + +Files: thirdparty/vulkan/vk_mem_alloc.h +Comment: Vulkan Memory Allocator +Copyright: 2017-2025, Advanced Micro Devices, Inc. +License: Expat + +Files: thirdparty/wayland/* +Comment: Wayland core protocol +Copyright: 2008-2012, Kristian Høgsberg + 2010-2012, Intel Corporation + 2011, Benjamin Franzke + 2012, Collabora, Ltd. +License: Expat + +Files: thirdparty/wayland-protocols/* +Comment: Wayland protocols +Copyright: 2008-2013, Kristian Høgsberg + 2010-2013, Intel Corporation + 2013, Rafael Antognolli + 2013, Jasper St. Pierre + 2014, Jonas Ådahl + 2014, Jason Ekstrand + 2014-2015, Collabora, Ltd. + 2015, Red Hat Inc. +License: Expat + +Files: thirdparty/wayland-protocols/mesa/wayland-drm.xml +Comment: Mesa Wayland protocols +Copyright: 2008-2011, Kristian Høgsberg + 2010-2011, Intel Corporation +License: X11 + +Files: thirdparty/wslay/* +Comment: Wslay +Copyright: 2011, 2012, 2015, Tatsuhiro Tsujikawa +License: Expat + +Files: thirdparty/xatlas/* +Comment: xatlas +Copyright: 2018-2020, Jonathan Young + 2013, Thekla, Inc + 2006, NVIDIA Corporation, Ignacio Castano +License: Expat + +Files: thirdparty/zlib/* +Comment: zlib +Copyright: 1995-2026, Jean-loup Gailly and Mark Adler +License: Zlib + +Files: thirdparty/zstd/* +Comment: Zstandard +Copyright: Meta Platforms, Inc. and affiliates. +License: BSD-3-clause + + + +License: Apache-2.0 + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + . + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + . + 1. Definitions. + . + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + . + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + . + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + . + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + . + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + . + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + . + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + . + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + . + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + . + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + . + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + . + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + . + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + . + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + . + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + . + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + . + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + . + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + . + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + . + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + . + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + . + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + . + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + . + END OF TERMS AND CONDITIONS + . + APPENDIX: How to apply the Apache License to your work. + . + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + . + Copyright [yyyy] [name of copyright owner] + . + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + . + http://www.apache.org/licenses/LICENSE-2.0 + . + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +License: BSD-2-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + . + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + . + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + . + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +License: BSD-3-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + . + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + . + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + . + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + . + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + +License: BSL-1.0 + Boost Software License - Version 1.0 - August 17th, 2003 + . + Permission is hereby granted, free of charge, to any person or organization + obtaining a copy of the software and accompanying documentation covered by + this license (the "Software") to use, reproduce, display, distribute, + execute, and transmit the Software, and to prepare derivative works of the + Software, and to permit third-parties to whom the Software is furnished to + do so, all subject to the following: + . + The copyright notices in the Software and this entire statement, including + the above license grant, this restriction and the following disclaimer, + must be included in all copies of the Software, in whole or in part, and + all derivative works of the Software, unless such copies or derivative + works are solely in the form of machine-executable object code generated by + a source language processor. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + +License: CC0-1.0 + CC0 1.0 Universal + . + Statement of Purpose + . + The laws of most jurisdictions throughout the world automatically confer + exclusive Copyright and Related Rights (defined below) upon the creator and + subsequent owner(s) (each and all, an "owner") of an original work of + authorship and/or a database (each, a "Work"). + . + Certain owners wish to permanently relinquish those rights to a Work for the + purpose of contributing to a commons of creative, cultural and scientific + works ("Commons") that the public can reliably and without fear of later + claims of infringement build upon, modify, incorporate in other works, reuse + and redistribute as freely as possible in any form whatsoever and for any + purposes, including without limitation commercial purposes. These owners may + contribute to the Commons to promote the ideal of a free culture and the + further production of creative, cultural and scientific works, or to gain + reputation or greater distribution for their Work in part through the use and + efforts of others. + . + For these and/or other purposes and motivations, and without any expectation + of additional consideration or compensation, the person associating CC0 with a + Work (the "Affirmer"), to the extent that he or she is an owner of Copyright + and Related Rights in the Work, voluntarily elects to apply CC0 to the Work + and publicly distribute the Work under its terms, with knowledge of his or her + Copyright and Related Rights in the Work and the meaning and intended legal + effect of CC0 on those rights. + . + 1. Copyright and Related Rights. A Work made available under CC0 may be + protected by copyright and related or neighboring rights ("Copyright and + Related Rights"). Copyright and Related Rights include, but are not limited + to, the following: + . + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + . + ii. moral rights retained by the original author(s) and/or performer(s); + . + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + . + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + . + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + . + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + . + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + . + 2. Waiver. To the greatest extent permitted by, but not in contravention of, + applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and + unconditionally waives, abandons, and surrenders all of Affirmer's Copyright + and Related Rights and associated claims and causes of action, whether now + known or unknown (including existing as well as future claims and causes of + action), in the Work (i) in all territories worldwide, (ii) for the maximum + duration provided by applicable law or treaty (including future time + extensions), (iii) in any current or future medium and for any number of + copies, and (iv) for any purpose whatsoever, including without limitation + commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes + the Waiver for the benefit of each member of the public at large and to the + detriment of Affirmer's heirs and successors, fully intending that such Waiver + shall not be subject to revocation, rescission, cancellation, termination, or + any other legal or equitable action to disrupt the quiet enjoyment of the Work + by the public as contemplated by Affirmer's express Statement of Purpose. + . + 3. Public License Fallback. Should any part of the Waiver for any reason be + judged legally invalid or ineffective under applicable law, then the Waiver + shall be preserved to the maximum extent permitted taking into account + Affirmer's express Statement of Purpose. In addition, to the extent the Waiver + is so judged Affirmer hereby grants to each affected person a royalty-free, + non transferable, non sublicensable, non exclusive, irrevocable and + unconditional license to exercise Affirmer's Copyright and Related Rights in + the Work (i) in all territories worldwide, (ii) for the maximum duration + provided by applicable law or treaty (including future time extensions), (iii) + in any current or future medium and for any number of copies, and (iv) for any + purpose whatsoever, including without limitation commercial, advertising or + promotional purposes (the "License"). The License shall be deemed effective as + of the date CC0 was applied by Affirmer to the Work. Should any part of the + License for any reason be judged legally invalid or ineffective under + applicable law, such partial invalidity or ineffectiveness shall not + invalidate the remainder of the License, and in such case Affirmer hereby + affirms that he or she will not (i) exercise any of his or her remaining + Copyright and Related Rights in the Work or (ii) assert any associated claims + and causes of action with respect to the Work, in either case contrary to + Affirmer's express Statement of Purpose. + . + 4. Limitations and Disclaimers. + . + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + . + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + . + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + . + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +License: CC-BY-4.0 + Creative Commons Attribution 4.0 International Public License + . + By exercising the Licensed Rights (defined below), You accept and agree + to be bound by the terms and conditions of this Creative Commons + Attribution 4.0 International Public License ("Public + License"). To the extent this Public License may be interpreted as a + contract, You are granted the Licensed Rights in consideration of Your + acceptance of these terms and conditions, and the Licensor grants You + such rights in consideration of benefits the Licensor receives from + making the Licensed Material available under these terms and + conditions. + . + Section 1 -- Definitions. + . + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + . + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + . + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + . + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + . + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + . + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + . + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + . + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + . + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + . + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + . + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + . + Section 2 -- Scope. + . + a. License grant. + . + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + . + a. reproduce and Share the Licensed Material, in whole or + in part; and + . + b. produce, reproduce, and Share Adapted Material. + . + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + . + 3. Term. The term of this Public License is specified in Section + 6(a). + . + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + . + 5. Downstream recipients. + . + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + . + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + . + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + . + b. Other rights. + . + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + . + 2. Patent and trademark rights are not licensed under this + Public License. + . + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + . + Section 3 -- License Conditions. + . + Your exercise of the Licensed Rights is expressly made subject to the + following conditions. + . + a. Attribution. + . + 1. If You Share the Licensed Material (including in modified + form), You must: + . + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + . + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + . + ii. a copyright notice; + . + iii. a notice that refers to this Public License; + . + iv. a notice that refers to the disclaimer of + warranties; + . + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + . + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + . + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + . + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + . + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + . + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + . + Section 4 -- Sui Generis Database Rights. + . + Where the Licensed Rights include Sui Generis Database Rights that + apply to Your use of the Licensed Material: + . + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + . + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + . + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + . + For the avoidance of doubt, this Section 4 supplements and does not + replace Your obligations under this Public License where the Licensed + Rights include other Copyright and Similar Rights. + . + Section 5 -- Disclaimer of Warranties and Limitation of Liability. + . + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + . + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + . + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + . + Section 6 -- Term and Termination. + . + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + . + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + . + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + . + 2. upon express reinstatement by the Licensor. + . + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + . + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + . + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + . + Section 7 -- Other Terms and Conditions. + . + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + . + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + . + Section 8 -- Interpretation. + . + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + . + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + . + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + . + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + +License: Expat + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + . + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +License: glslang + Here, glslang proper means core GLSL parsing, HLSL parsing, and SPIR-V code + generation. Glslang proper requires use of a number of licenses, one that covers + preprocessing and others that covers non-preprocessing. + . + Bison was removed long ago. You can build glslang from the source grammar, + using tools of your choice, without using bison or any bison files. + . + Other parts, outside of glslang proper, include: + . + - gl_types.h, only needed for OpenGL-like reflection, and can be left out of + a parse and codegen project. See it for its license. + . + - update_glslang_sources.py, which is not part of the project proper and does + not need to be used. + . + - the SPIR-V "remapper", which is optional, but has the same license as + glslang proper + . + - Google tests and SPIR-V tools, and anything in the external subdirectory + are external and optional; see them for their respective licenses. + . + -------------------------------------------------------------------------------- + . + The core of glslang-proper, minus the preprocessor is licenced as follows: + . + -------------------------------------------------------------------------------- + 3-Clause BSD License + -------------------------------------------------------------------------------- + . + Copyright (C) 2015-2018 Google, Inc. + Copyright (C) + . + All rights reserved. + . + See: . + . + -------------------------------------------------------------------------------- + 2-Clause BSD License + -------------------------------------------------------------------------------- + . + Copyright 2020 The Khronos Group Inc + . + See: . + . + -------------------------------------------------------------------------------- + The MIT License + -------------------------------------------------------------------------------- + . + Copyright 2020 The Khronos Group Inc + . + See: . + . + -------------------------------------------------------------------------------- + APACHE LICENSE, VERSION 2.0 + -------------------------------------------------------------------------------- + . + See: . + . + -------------------------------------------------------------------------------- + GPL 3 with special bison exception + -------------------------------------------------------------------------------- + . + Bison implementation for Yacc-like parsers in C + . + Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + . + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see . + . + As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + . + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. + . + -------------------------------------------------------------------------------- + ================================================================================ + -------------------------------------------------------------------------------- + . + The preprocessor has the core licenses stated above, plus an additional licence: + . + Copyright (c) 2002, NVIDIA Corporation. + . + NVIDIA Corporation("NVIDIA") supplies this software to you in + consideration of your agreement to the following terms, and your use, + installation, modification or redistribution of this NVIDIA software + constitutes acceptance of these terms. If you do not agree with these + terms, please do not use, install, modify or redistribute this NVIDIA + software. + . + In consideration of your agreement to abide by the following terms, and + subject to these terms, NVIDIA grants you a personal, non-exclusive + license, under NVIDIA's copyrights in this original NVIDIA software (the + "NVIDIA Software"), to use, reproduce, modify and redistribute the + NVIDIA Software, with or without modifications, in source and/or binary + forms; provided that if you redistribute the NVIDIA Software, you must + retain the copyright notice of NVIDIA, this notice and the following + text and disclaimers in all such redistributions of the NVIDIA Software. + Neither the name, trademarks, service marks nor logos of NVIDIA + Corporation may be used to endorse or promote products derived from the + NVIDIA Software without specific prior written permission from NVIDIA. + Except as expressly stated in this notice, no other rights or licenses + express or implied, are granted by NVIDIA herein, including but not + limited to any patent rights that may be infringed by your derivative + works or by other works in which the NVIDIA Software may be + incorporated. No hardware is licensed hereunder. + . + THE NVIDIA SOFTWARE IS BEING PROVIDED ON AN "AS IS" BASIS, WITHOUT + WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, + INCLUDING WITHOUT LIMITATION, WARRANTIES OR CONDITIONS OF TITLE, + NON-INFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR + ITS USE AND OPERATION EITHER ALONE OR IN COMBINATION WITH OTHER + PRODUCTS. + . + IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, + INCIDENTAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, LOST PROFITS; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) OR ARISING IN ANY WAY + OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE + NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, + TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF + NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +License: FTL + The FreeType Project LICENSE + ---------------------------- + . + 2006-Jan-27 + . + Copyright 1996-2002, 2006 by + David Turner, Robert Wilhelm, and Werner Lemberg + . + . + . + Introduction + ============ + . + The FreeType Project is distributed in several archive packages; + some of them may contain, in addition to the FreeType font engine, + various tools and contributions which rely on, or relate to, the + FreeType Project. + . + This license applies to all files found in such packages, and + which do not fall under their own explicit license. The license + affects thus the FreeType font engine, the test programs, + documentation and makefiles, at the very least. + . + This license was inspired by the BSD, Artistic, and IJG + (Independent JPEG Group) licenses, which all encourage inclusion + and use of free software in commercial and freeware products + alike. As a consequence, its main points are that: + . + o We don't promise that this software works. However, we will be + interested in any kind of bug reports. (`as is' distribution) + . + o You can use this software for whatever you want, in parts or + full form, without having to pay us. (`royalty-free' usage) + . + o You may not pretend that you wrote this software. If you use + it, or only parts of it, in a program, you must acknowledge + somewhere in your documentation that you have used the + FreeType code. (`credits') + . + We specifically permit and encourage the inclusion of this + software, with or without modifications, in commercial products. + We disclaim all warranties covering The FreeType Project and + assume no liability related to The FreeType Project. + . + . + Finally, many people asked us for a preferred form for a + credit/disclaimer to use in compliance with this license. We thus + encourage you to use the following text: + . + """ + Portions of this software are copyright © The FreeType + Project (https://freetype.org). All rights reserved. + """ + . + Please replace with the value from the FreeType version you + actually use. + . + . + Legal Terms + =========== + . + 0. Definitions + -------------- + . + Throughout this license, the terms `package', `FreeType Project', + and `FreeType archive' refer to the set of files originally + distributed by the authors (David Turner, Robert Wilhelm, and + Werner Lemberg) as the `FreeType Project', be they named as alpha, + beta or final release. + . + `You' refers to the licensee, or person using the project, where + `using' is a generic term including compiling the project's source + code as well as linking it to form a `program' or `executable'. + This program is referred to as `a program using the FreeType + engine'. + . + This license applies to all files distributed in the original + FreeType Project, including all source code, binaries and + documentation, unless otherwise stated in the file in its + original, unmodified form as distributed in the original archive. + If you are unsure whether or not a particular file is covered by + this license, you must contact us to verify this. + . + The FreeType Project is copyright (C) 1996-2000 by David Turner, + Robert Wilhelm, and Werner Lemberg. All rights reserved except as + specified below. + . + 1. No Warranty + -------------- + . + THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO + USE, OF THE FREETYPE PROJECT. + . + 2. Redistribution + ----------------- + . + This license grants a worldwide, royalty-free, perpetual and + irrevocable right and license to use, execute, perform, compile, + display, copy, create derivative works of, distribute and + sublicense the FreeType Project (in both source and object code + forms) and derivative works thereof for any purpose; and to + authorize others to exercise some or all of the rights granted + herein, subject to the following conditions: + . + o Redistribution of source code must retain this license file + (`FTL.TXT') unaltered; any additions, deletions or changes to + the original files must be clearly indicated in accompanying + documentation. The copyright notices of the unaltered, + original files must be preserved in all copies of source + files. + . + o Redistribution in binary form must provide a disclaimer that + states that the software is based in part of the work of the + FreeType Team, in the distribution documentation. We also + encourage you to put an URL to the FreeType web page in your + documentation, though this isn't mandatory. + . + These conditions apply to any software derived from or based on + the FreeType Project, not just the unmodified files. If you use + our work, you must acknowledge us. However, no fee need be paid + to us. + . + 3. Advertising + -------------- + . + Neither the FreeType authors and contributors nor you shall use + the name of the other for commercial, advertising, or promotional + purposes without specific prior written permission. + . + We suggest, but do not require, that you use one or more of the + following phrases to refer to this software in your documentation + or advertising materials: `FreeType Project', `FreeType Engine', + `FreeType library', or `FreeType Distribution'. + . + As you have not signed this license, you are not required to + accept it. However, as the FreeType Project is copyrighted + material, only this license, or another one contracted with the + authors, grants you the right to use, distribute, and modify it. + Therefore, by using, distributing, or modifying the FreeType + Project, you indicate that you understand and accept all the terms + of this license. + . + 4. Contacts + ----------- + . + There are two mailing lists related to FreeType: + . + o freetype@nongnu.org + . + Discusses general use and applications of FreeType, as well as + future and wanted additions to the library and distribution. + If you are looking for support, start in this list if you + haven't found anything to help you in the documentation. + . + o freetype-devel@nongnu.org + . + Discusses bugs, as well as engine internals, design issues, + specific licenses, porting, etc. + . + Our home page can be found at + . + https://freetype.org + +License: HarfBuzz + HarfBuzz is licensed under the so-called "Old MIT" license. Details follow. + For parts of HarfBuzz that are licensed under different licenses see individual + files names COPYING in subdirectories where applicable. + . + Copyright (C) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020 Google, Inc. + Copyright (C) 2018,2019,2020 Ebrahim Byagowi + Copyright (C) 2019,2020 Facebook, Inc. + Copyright (C) 2012 Mozilla Foundation + Copyright (C) 2011 Codethink Limited + Copyright (C) 2008,2010 Nokia Corporation and/or its subsidiary(-ies) + Copyright (C) 2009 Keith Stribley + Copyright (C) 2009 Martin Hosken and SIL International + Copyright (C) 2007 Chris Wilson + Copyright (C) 2005,2006,2020,2021 Behdad Esfahbod + Copyright (C) 2005 David Turner + Copyright (C) 2004,2007,2008,2009,2010 Red Hat, Inc. + Copyright (C) 1998-2004 David Turner and Werner Lemberg + . + For full copyright notices consult the individual files in the package. + . + . + Permission is hereby granted, without written agreement and without + license or royalty fees, to use, copy, modify, and distribute this + software and its documentation for any purpose, provided that the + above copyright notice and the following two paragraphs appear in + all copies of this software. + . + IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE. + . + THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +License: IJG + The authors make NO WARRANTY or representation, either express or implied, + with respect to this software, its quality, accuracy, merchantability, or + fitness for a particular purpose. This software is provided "AS IS", and you, + its user, assume the entire risk as to its quality and accuracy. + . + This software is copyright (C) 1991-2020, Thomas G. Lane, Guido Vollbeding. + All Rights Reserved except as specified below. + . + Permission is hereby granted to use, copy, modify, and distribute this + software (or portions thereof) for any purpose, without fee, subject to these + conditions: + (1) If any part of the source code for this software is distributed, then this + README file must be included, with this copyright and no-warranty notice + unaltered; and any additions, deletions, or changes to the original files + must be clearly indicated in accompanying documentation. + (2) If only executable code is distributed, then the accompanying + documentation must state that "this software is based in part on the work of + the Independent JPEG Group". + (3) Permission for use of this software is granted only if the user accepts + full responsibility for any undesirable consequences; the authors accept + NO LIABILITY for damages of any kind. + . + These conditions apply to any software derived from or based on the IJG code, + not just to the unmodified library. If you use our work, you ought to + acknowledge us. + . + Permission is NOT granted for the use of any IJG author's name or company name + in advertising or publicity relating to this software or products derived from + it. This software may be referred to only as "the Independent JPEG Group's + software". + . + We specifically permit and encourage the use of this software as the basis of + commercial products, provided that all warranty or liability claims are + assumed by the product vendor. + +License: MPL-2.0 + Mozilla Public License Version 2.0 + ================================== + . + 1. Definitions + -------------- + . + 1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + . + 1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + . + 1.3. "Contribution" + means Covered Software of a particular Contributor. + . + 1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + . + 1.5. "Incompatible With Secondary Licenses" + means + . + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + . + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + . + 1.6. "Executable Form" + means any form of the work other than Source Code Form. + . + 1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + . + 1.8. "License" + means this document. + . + 1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + . + 1.10. "Modifications" + means any of the following: + . + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + . + (b) any new file in Source Code Form that contains any Covered + Software. + . + 1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + . + 1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + . + 1.13. "Source Code Form" + means the form of the work preferred for making modifications. + . + 1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + . + 2. License Grants and Conditions + -------------------------------- + . + 2.1. Grants + . + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + . + (a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + . + (b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + . + 2.2. Effective Date + . + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + . + 2.3. Limitations on Grant Scope + . + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + . + (a) for any code that a Contributor has removed from Covered Software; + or + . + (b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + . + (c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + . + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + . + 2.4. Subsequent Licenses + . + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + . + 2.5. Representation + . + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights + to grant the rights to its Contributions conveyed by this License. + . + 2.6. Fair Use + . + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + . + 2.7. Conditions + . + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted + in Section 2.1. + . + 3. Responsibilities + ------------------- + . + 3.1. Distribution of Source Form + . + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + . + 3.2. Distribution of Executable Form + . + If You distribute Covered Software in Executable Form then: + . + (a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + . + (b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + . + 3.3. Distribution of a Larger Work + . + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + . + 3.4. Notices + . + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, + or limitations of liability) contained within the Source Code Form of + the Covered Software, except that You may alter any license notices to + the extent required to remedy known factual inaccuracies. + . + 3.5. Application of Additional Terms + . + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + . + 4. Inability to Comply Due to Statute or Regulation + --------------------------------------------------- + . + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Software due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description must + be placed in a text file included with all distributions of the Covered + Software under this License. Except to the extent prohibited by statute + or regulation, such description must be sufficiently detailed for a + recipient of ordinary skill to be able to understand it. + . + 5. Termination + -------------- + . + 5.1. The rights granted under this License will terminate automatically + if You fail to comply with any of its terms. However, if You become + compliant, then the rights granted under this License from a particular + Contributor are reinstated (a) provisionally, unless and until such + Contributor explicitly and finally terminates Your grants, and (b) on an + ongoing basis, if such Contributor fails to notify You of the + non-compliance by some reasonable means prior to 60 days after You have + come back into compliance. Moreover, Your grants from a particular + Contributor are reinstated on an ongoing basis if such Contributor + notifies You of the non-compliance by some reasonable means, this is the + first time You have received notice of non-compliance with this License + from such Contributor, and You become compliant prior to 30 days after + Your receipt of the notice. + . + 5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + . + 5.3. In the event of termination under Sections 5.1 or 5.2 above, all + end user license agreements (excluding distributors and resellers) which + have been validly granted by You or Your distributors under this License + prior to termination shall survive termination. + . + ************************************************************************ + * * + * 6. Disclaimer of Warranty * + * ------------------------- * + * * + * Covered Software is provided under this License on an "as is" * + * basis, without warranty of any kind, either expressed, implied, or * + * statutory, including, without limitation, warranties that the * + * Covered Software is free of defects, merchantable, fit for a * + * particular purpose or non-infringing. The entire risk as to the * + * quality and performance of the Covered Software is with You. * + * Should any Covered Software prove defective in any respect, You * + * (not any Contributor) assume the cost of any necessary servicing, * + * repair, or correction. This disclaimer of warranty constitutes an * + * essential part of this License. No use of any Covered Software is * + * authorized under this License except under this disclaimer. * + * * + ************************************************************************ + . + ************************************************************************ + * * + * 7. Limitation of Liability * + * -------------------------- * + * * + * Under no circumstances and under no legal theory, whether tort * + * (including negligence), contract, or otherwise, shall any * + * Contributor, or anyone who distributes Covered Software as * + * permitted above, be liable to You for any direct, indirect, * + * special, incidental, or consequential damages of any character * + * including, without limitation, damages for lost profits, loss of * + * goodwill, work stoppage, computer failure or malfunction, or any * + * and all other commercial damages or losses, even if such party * + * shall have been informed of the possibility of such damages. This * + * limitation of liability shall not apply to liability for death or * + * personal injury resulting from such party's negligence to the * + * extent applicable law prohibits such limitation. Some * + * jurisdictions do not allow the exclusion or limitation of * + * incidental or consequential damages, so this exclusion and * + * limitation may not apply to You. * + * * + ************************************************************************ + . + 8. Litigation + ------------- + . + Any litigation relating to this License may be brought only in the + courts of a jurisdiction where the defendant maintains its principal + place of business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. + Nothing in this Section shall prevent a party's ability to bring + cross-claims or counter-claims. + . + 9. Miscellaneous + ---------------- + . + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides + that the language of a contract shall be construed against the drafter + shall not be used to construe this License against a Contributor. + . + 10. Versions of the License + --------------------------- + . + 10.1. New Versions + . + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + . + 10.2. Effect of New Versions + . + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + . + 10.3. Modified Versions + . + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + . + 10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses + . + If You choose to distribute Source Code Form that is Incompatible With + Secondary Licenses under the terms of this version of the License, the + notice described in Exhibit B of this License must be attached. + . + Exhibit A - Source Code Form License Notice + ------------------------------------------- + . + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + . + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to look + for such a notice. + . + You may add additional accurate notices of copyright ownership. + . + Exhibit B - "Incompatible With Secondary Licenses" Notice + --------------------------------------------------------- + . + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. + +License: MIT-0 + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +License: OFL-1.1 + PREAMBLE + The goals of the Open Font License (OFL) are to stimulate worldwide + development of collaborative font projects, to support the font creation + efforts of academic and linguistic communities, and to provide a free and + open framework in which fonts may be shared and improved in partnership + with others. + . + The OFL allows the licensed fonts to be used, studied, modified and + redistributed freely as long as they are not sold by themselves. The + fonts, including any derivative works, can be bundled, embedded, + redistributed and/or sold with any software provided that any reserved + names are not used by derivative works. The fonts and derivatives, + however, cannot be released under any other type of license. The + requirement for fonts to remain under this license does not apply + to any document created using the fonts or their derivatives. + . + DEFINITIONS + "Font Software" refers to the set of files released by the Copyright + Holder(s) under this license and clearly marked as such. This may + include source files, build scripts and documentation. + . + "Reserved Font Name" refers to any names specified as such after the + copyright statement(s). + . + "Original Version" refers to the collection of Font Software components as + distributed by the Copyright Holder(s). + . + "Modified Version" refers to any derivative made by adding to, deleting, + or substituting -- in part or in whole -- any of the components of the + Original Version, by changing formats or by porting the Font Software to a + new environment. + . + "Author" refers to any designer, engineer, programmer, technical + writer or other person who contributed to the Font Software. + . + PERMISSION & CONDITIONS + Permission is hereby granted, free of charge, to any person obtaining + a copy of the Font Software, to use, study, copy, merge, embed, modify, + redistribute, and sell modified and unmodified copies of the Font + Software, subject to the following conditions: + . + 1) Neither the Font Software nor any of its individual components, + in Original or Modified Versions, may be sold by itself. + . + 2) Original or Modified Versions of the Font Software may be bundled, + redistributed and/or sold with any software, provided that each copy + contains the above copyright notice and this license. These can be + included either as stand-alone text files, human-readable headers or + in the appropriate machine-readable metadata fields within text or + binary files as long as those fields can be easily viewed by the user. + . + 3) No Modified Version of the Font Software may use the Reserved Font + Name(s) unless explicit written permission is granted by the corresponding + Copyright Holder. This restriction only applies to the primary font name as + presented to the users. + . + 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font + Software shall not be used to promote, endorse or advertise any + Modified Version, except to acknowledge the contribution(s) of the + Copyright Holder(s) and the Author(s) or with their explicit written + permission. + . + 5) The Font Software, modified or unmodified, in part or in whole, + must be distributed entirely under this license, and must not be + distributed under any other license. The requirement for fonts to + remain under this license does not apply to any document created + using the Font Software. + . + TERMINATION + This license becomes null and void if any of the above conditions are + not met. + . + DISCLAIMER + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE. + +License: Unicode + COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) + . + Copyright (C) 1991-2020 Unicode, Inc. All rights reserved. + Distributed under the Terms of Use in https://www.unicode.org/copyright.html. + . + Permission is hereby granted, free of charge, to any person obtaining + a copy of the Unicode data files and any associated documentation + (the "Data Files") or Unicode software and any associated documentation + (the "Software") to deal in the Data Files or Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, and/or sell copies of + the Data Files or Software, and to permit persons to whom the Data Files + or Software are furnished to do so, provided that either + (a) this copyright and permission notice appear with all copies + of the Data Files or Software, or + (b) this copyright and permission notice appear in associated + Documentation. + . + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF + ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS + NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL + DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THE DATA FILES OR SOFTWARE. + . + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in these Data Files or Software without prior + written authorization of the copyright holder. + +License: Unlicense + This is free and unencumbered software released into the public domain. + . + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + . + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + . + For more information, please refer to + +License: WOL + The Wide Open License (WOL) + . + Permission to use, copy, modify, distribute and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice and this license appear in all source copies. + THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY OF + ANY KIND. See https://dspguru.com/wide-open-license/ for more information. + +License: X11 + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that\n the above copyright notice appear in + all copies and that both that copyright notice and this permission + notice appear in supporting documentation, and that the name of + the copyright holders not be used in advertising or publicity + pertaining to distribution of the software without specific, + written prior permission. The copyright holders make no + representations about the suitability of this software for any + purpose. It is provided "as is" without express or implied + warranty. + . + THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF + THIS SOFTWARE. + +License: Zlib + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + . + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + . + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. diff --git a/godot/licenses/GODOT-LICENSE.txt b/godot/licenses/GODOT-LICENSE.txt new file mode 100644 index 0000000..0e3ba08 --- /dev/null +++ b/godot/licenses/GODOT-LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). +Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/godot/project.godot b/godot/project.godot new file mode 100644 index 0000000..9ae4fff --- /dev/null +++ b/godot/project.godot @@ -0,0 +1,36 @@ +; Universal AI: The Seed — a browser-first Godot prototype. +config_version=5 + +[application] +config/name="Universal AI — The Seed" +run/main_scene="res://scenes/factory.tscn" +config/features=PackedStringArray("4.7", "GL Compatibility") +config/description="First, a chip. Then, everything." +config/icon="res://icon.svg" + +[display] +window/size/viewport_width=1440 +window/size/viewport_height=900 +window/size/window_width_override=1440 +window/size/window_height_override=900 +window/stretch/mode="disabled" +window/stretch/aspect="expand" +window/handheld/orientation=0 + +[rendering] +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" +textures/default_filters/use_nearest_mipmap_filter=false +textures/default_filters/anisotropic_filtering_level=2 +anti_aliasing/quality/msaa_3d=0 +environment/defaults/default_clear_color=Color(0.025, 0.04, 0.065, 1) +lights_and_shadows/directional_shadow/size=1024 + +[audio] +driver/driver.web="Web" + +[gui] +theme/default_font_multichannel_signed_distance_field=true + +[debug] +gdscript/warnings/untyped_declaration=0 diff --git a/godot/scenes/factory.tscn b/godot/scenes/factory.tscn new file mode 100644 index 0000000..cb85100 --- /dev/null +++ b/godot/scenes/factory.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3] + +[ext_resource type="Script" path="res://scripts/factory.gd" id="1"] + +[node name="TheSeed" type="Node3D"] +script = ExtResource("1") diff --git a/godot/scripts/chamber.gd b/godot/scripts/chamber.gd new file mode 100644 index 0000000..6896a5d --- /dev/null +++ b/godot/scripts/chamber.gd @@ -0,0 +1,159 @@ +class_name FactoryChamber +extends Node3D + +const Geo = preload("res://scripts/geometry.gd") +const BAY_POSITIONS: Array[Vector3] = [Vector3(-4.4,0,-4.5),Vector3(4.4,0,-4.5),Vector3(-4.4,0,0),Vector3(4.4,0,0),Vector3(-4.4,0,4.5),Vector3(4.4,0,4.5)] +var pads: Array[Node3D] = [] +var pad_labels: Array[Label3D] = [] +var strip_nodes: Array[MeshInstance3D] = [] +var fans: Array[Node3D] = [] +var district: Node3D +var beacon: MeshInstance3D +var district_progress: float = 0.0 +var signal_material: StandardMaterial3D +var muted_material: StandardMaterial3D + +func construct() -> void: + var floor_mat := Geo.material(Color("263a48"),0.28,0.8) + var concrete := Geo.material(Color("4c6570"),0.1,0.85) + var dark := Geo.material(Color("101f2b"),0.4,0.5) + var trim := Geo.material(Color("81969d"),0.65,0.4) + var yellow := Geo.material(Color("e0aa4d"),0.25,0.6) + var gold := Geo.material(Color("f6cb7c"),0.1,0.3,1.5) + var cyan := Geo.material(Color("7ae5e1"),0.2,0.4,1.4) + signal_material = cyan + muted_material = Geo.material(Color("2d5360"),0.1,0.7,0.15) + # Floating architectural slab. The game grows out of a physical foundation. + Geo.box(self,Vector3(0,-0.68,0),Vector3(19.5,1.25,19.7),dark) + Geo.box(self,Vector3(0,-0.07,0),Vector3(19.8,0.15,20),trim) + # One MultiMesh for all floor tiles rather than hundreds of separate draws. + var tile := BoxMesh.new() + tile.size=Vector3(1.56,0.09,1.56) + var batch := MultiMesh.new() + batch.transform_format=MultiMesh.TRANSFORM_3D + batch.mesh=tile + batch.instance_count=144 + for x in range(12): + for z in range(12): + batch.set_instance_transform(x*12+z,Transform3D(Basis.IDENTITY,Vector3((x-5.5)*1.6,0.025,(z-5.5)*1.6))) + var floor_mesh := MultiMeshInstance3D.new() + floor_mesh.multimesh=batch + floor_mesh.material_override=floor_mat + add_child(floor_mesh) + # Central aisle and recessed data channels. + for x in [-1.85,1.85]: + Geo.box(self,Vector3(x,0.08,0),Vector3(0.08,0.025,18.8),yellow) + strip_nodes.append(Geo.box(self,Vector3(x+0.13,0.09,0),Vector3(0.035,0.025,18.8),muted_material)) + for z in [-7.1,2.35,7.1]: + Geo.box(self,Vector3(0,0.075,z),Vector3(17.5,0.025,0.065),yellow) + # Machine foundations and corner brackets are real build locations. + for i in range(6): + var pad := Node3D.new() + pad.position=BAY_POSITIONS[i] + add_child(pad) + Geo.box(pad,Vector3(0,0.10,0.5),Vector3(3.5,0.12,3.7),dark) + for x in [-1.6,1.6]: + for z in [-1.1,2.1]: + Geo.box(pad,Vector3(x,0.18,z),Vector3(0.07,0.04,0.38),yellow) + Geo.box(pad,Vector3(x-signf(x)*0.16,0.18,z-signf(z)*0.16),Vector3(0.38,0.04,0.07),yellow) + var text := Geo.label(pad,"BAY %02d"%(i+1),Vector3(0,0.2,0.2),48,Color("4b7581")) + text.rotation.x=-PI/2 + pads.append(pad) + pad_labels.append(text) + # Back wall, high service doors, illuminated windows and exposed structure. + Geo.box(self,Vector3(0,1.8,-9.6),Vector3(19.5,3.6,0.3),concrete) + Geo.box(self,Vector3(0,0.65,-9.36),Vector3(19.5,1.1,0.15),dark) + for x in [-9.3,-6.2,-3.1,3.1,6.2,9.3]: + Geo.box(self,Vector3(x,2.45,-9.25),Vector3(0.22,4.9,0.4),trim) + Geo.box(self,Vector3(0,4.85,-9.25),Vector3(19.3,0.24,0.45),dark) + for x in [-7.75,-4.65,4.65,7.75]: + Geo.box(self,Vector3(x,2.55,-9.4),Vector3(2.7,1.36,0.12),dark) + Geo.box(self,Vector3(x,2.55,-9.30),Vector3(2.45,1.08,0.035),Geo.material(Color("183a49"),0.3,0.3,0.4)) + for n in [-0.75,0,0.75]: + Geo.box(self,Vector3(x+n,2.55,-9.25),Vector3(0.04,1.12,0.03),trim) + Geo.box(self,Vector3(x,3.85,-9.08),Vector3(2.2,0.065,0.06),gold) + # Shipping gate and a large environmental title. + Geo.box(self,Vector3(0,1.8,-9.28),Vector3(4.3,3.5,0.12),dark) + for y in range(11): + Geo.box(self,Vector3(0,0.3+y*0.27,-9.14),Vector3(3.65,0.22,0.12),floor_mat) + for x in [-2.04,2.04]: + Geo.box(self,Vector3(x,1.75,-9.02),Vector3(0.07,3.3,0.07),cyan) + Geo.label(self,"UNIVERSAL / 01",Vector3(0,4.15,-9.0),88,Color("dfc695")) + Geo.label(self,"PRECISION LITHOGRAPHY • SECTOR ZERO",Vector3(0,3.62,-9.0),25,Color("819d9f")) + # Cutaway side wall and safety railing. + for x in [-9.6,9.6]: + Geo.box(self,Vector3(x,0.37,0),Vector3(0.22,0.7,19.2),concrete) + for z in [-7.2,-2.4,2.4,7.2]: + Geo.box(self,Vector3(x,0.85,z),Vector3(0.07,1.1,0.07),yellow) + Geo.box(self,Vector3(x,1.3,0),Vector3(0.065,0.065,19.0),yellow) + # Overhead utility pipe with couplings, connecting the whole plant. + for y in [3.15,3.48]: + Geo.pipe(self,Vector3(-8.85,y,-8.9),Vector3(8.85,y,-8.9),0.09,yellow if y>3.2 else trim) + for x in [-8,-4,0,4,8]: + Geo.cylinder(self,Vector3(x,y,-8.9),0.13,0.13,dark).rotation.z=PI/2 + for x in [-8.5,8.5]: + Geo.pipe(self,Vector3(x,0.2,-8.6),Vector3(x,3.2,-8.6),0.11,trim) + # Pressure vessels and rotating ventilation fans. + Geo.cylinder(self,Vector3(x,0.9,-7.0),0.48,1.7,dark) + Geo.cylinder(self,Vector3(x,1.8,-7.0),0.49,0.18,trim,0.32) + Geo.ring(self,Vector3(x,0.45,-7.0),0.49,0.035,gold) + Geo.ring(self,Vector3(x,1.45,-7.0),0.49,0.035,trim) + var fan := Node3D.new() + fan.position=Vector3(x,4.15,-9.0) + fan.rotation.x=PI/2 + add_child(fan) + Geo.ring(fan,Vector3.ZERO,0.38,0.04,dark) + for blade in range(4): + var mesh := Geo.box(fan,Vector3.ZERO,Vector3(0.65,0.05,0.14),trim) + mesh.rotation.y=blade*PI/4 + fans.append(fan) + # Input stock racks and crates along the front service lane. + for x in [-7.6,7.6]: + for level in range(3): + Geo.box(self,Vector3(x,0.3+level*0.36,8.2),Vector3(1.45,0.3,0.8),floor_mat) + Geo.box(self,Vector3(x,0.3+level*0.36,8.62),Vector3(0.8,0.13,0.015),yellow) + Geo.label(self,"S I L I C O N I N",Vector3(-6.2,0.09,7.55),35,Color("8aadaf")).rotation.x=-PI/2 + Geo.label(self,"I N T E L L I G E N C E O U T",Vector3(3.7,0.09,8.5),29,Color("e1b974")).rotation.x=-PI/2 + _create_district() + var moving: Array=[district] + moving.append_array(fans) + moving.append_array(strip_nodes) + Geo.batch(self,moving) + Geo.batch(district,[beacon]) + for fan in fans:Geo.batch(fan) + +func _create_district() -> void: + district=Node3D.new() + add_child(district) + var dark := Geo.material(Color("182b3a"),0.4,0.65) + var lit := Geo.material(Color("7fcfc7"),0.3,0.3,0.8) + for side in [-1,1]: + for i in range(4): + var x: float = side*(14.5+(i%2)*5.7) + var z: float = -8.0-(i/2)*7.0 + var height: float = 3.0+i*1.6 + Geo.box(district,Vector3(x,height/2-0.6,z),Vector3(4.7,height,5.4),dark) + for row in range(4): + Geo.box(district,Vector3(x,0.4+row*0.6,z+2.72),Vector3(3.7,0.045,0.03),lit) + Geo.box(district,Vector3(x,height-0.5,z),Vector3(3.4,0.13,3.6),dark) + Geo.pipe(district,Vector3(x,0.15,z+3),Vector3(side*9.8,0.15,6),0.035,lit) + var beacon_mat := Geo.material(Color("77e8e3"),0,0.2,2.0) + beacon=Geo.cylinder(district,Vector3(0,5.0,-13),0.12,10,beacon_mat) + Geo.cylinder(district,Vector3(0,0,-13),1.4,0.5,dark) + Geo.ring(district,Vector3(0,0.35,-13),1.3,0.065,lit) + district.visible=false + +func animate(delta: float, time: float, count: int, linked: bool) -> void: + for i in range(6): + pad_labels[i].visible=i>=count + pad_labels[i].modulate=Color("f4cb82") if i==count else Color("4b7581") + for fan in fans: + fan.rotate_y(delta*(1.5+count*0.2)) + for strip in strip_nodes: + strip.material_override=signal_material if count>0 else muted_material + if linked: + district.visible=true + district_progress=minf(1.0,district_progress+delta*0.24) + district.position.y=lerpf(-8.0,0.0,ease(district_progress,0.3)) + beacon.scale.x=1.0+sin(time*2)*0.2 + beacon.scale.z=beacon.scale.x diff --git a/godot/scripts/chamber.gd.uid b/godot/scripts/chamber.gd.uid new file mode 100644 index 0000000..c0b1b21 --- /dev/null +++ b/godot/scripts/chamber.gd.uid @@ -0,0 +1 @@ +uid://mp0l3h24635c diff --git a/godot/scripts/factory.gd b/godot/scripts/factory.gd new file mode 100644 index 0000000..7fe47fc --- /dev/null +++ b/godot/scripts/factory.gd @@ -0,0 +1,381 @@ +extends Node3D + +const Simulation = preload("res://scripts/simulation.gd") +const Chamber = preload("res://scripts/chamber.gd") +const Machine = preload("res://scripts/machine.gd") +const Interface = preload("res://scripts/interface.gd") +const SAVE_PATH: String = "user://the-seed-v1.json" +var sim: SeedSimulation +var room: FactoryChamber +var ui: FactoryInterface +var manual: FabMachine +var machines: Array[FabMachine] = [] +var prepared_machines: Array[FabMachine] = [] +var last_window_size:=Vector2i.ZERO +var camera: Camera3D +var key_light: DirectionalLight3D +var yaw: float = 0.64 +var pitch: float = 0.68 +var zoom: float = 27.5 +var target_zoom: float = 27.5 +var time: float = 0.0 +var save_timer: float = 0.0 +var click_origin := Vector2.ZERO +var dragging: bool = false +var pointer_down: bool = false +var mouse_delta: float = 0.0 +var saving: bool = true +var test_mode: bool = false +var inspecting: int = -1 +var camera_focus: bool = false +var camera_target := Vector3(0,0.5,-0.3) +var sounds: Dictionary = {} +var sound_voices: Array[AudioStreamPlayer] = [] +var sound_index: int = 0 +var ambience: AudioStreamPlayer +var production_chime: float = 0.0 +var selected_ring: MeshInstance3D +var debug_timer: float = 0.0 +var fps_samples: int = 0 +var reset_pending: bool = false + +func _ready() -> void: + Engine.max_fps=30 + _limit_render_size() + get_window().size_changed.connect(_limit_render_size) + sim=Simulation.new() + if OS.has_feature("web"): + test_mode=str(JavaScriptBridge.get_interface("window").location.search).contains("test=1") + else: + test_mode="--test" in OS.get_cmdline_user_args() + saving=not test_mode + if OS.has_feature("web") and str(JavaScriptBridge.get_interface("window").location.search).contains("persist=1"): + saving=true + if saving:_load_game() + _create_environment() + room=Chamber.new() + add_child(room) + room.construct() + manual=Machine.new() + manual.position=Vector3(0,0.18,-0.4) + add_child(manual) + manual.construct(-1,true) + # Prepare geometry during loading, never inside a purchase or production event. + for i in Simulation.MAX_FABS: + var machine:=Machine.new() + machine.position=Chamber.BAY_POSITIONS[i]+Vector3(0,0.2,0) + add_child(machine) + machine.construct(i) + machine.visible=false + prepared_machines.append(machine) + for i in sim.fabs:_add_machine(i,false) + camera_focus=sim.fabs==0 + _create_camera() + _create_audio() + ui=Interface.new() + add_child(ui) + ui.action_requested.connect(_action) + selected_ring=FactoryGeometry.ring(self,Vector3(0,0.14,-0.4),1.65,0.014,FactoryGeometry.material(Color("f4cb80"),0,0.3,1)) + if sim.fabs>0:ui.notify("Run restored. Your machines were waiting for you.") + print("THE SEED: ready — %d fabs, %d chips"%[sim.fabs,sim.chips]) + +func _create_environment() -> void: + var world:=WorldEnvironment.new() + var env:=Environment.new() + env.background_mode=Environment.BG_COLOR + env.background_color=Color("09131f") + env.ambient_light_source=Environment.AMBIENT_SOURCE_COLOR + env.ambient_light_color=Color("9db9d0") + env.ambient_light_energy=0.38 + env.tonemap_mode=Environment.TONE_MAPPER_FILMIC + world.environment=env + add_child(world) + key_light=DirectionalLight3D.new() + key_light.rotation_degrees=Vector3(-53,-32,0) + key_light.light_color=Color("ffe4b4") + key_light.light_energy=1.25 + key_light.shadow_enabled=true + key_light.directional_shadow_max_distance=65 + key_light.shadow_bias=0.04 + add_child(key_light) + var rim:=DirectionalLight3D.new() + rim.rotation_degrees=Vector3(-25,140,0) + rim.light_color=Color("77b3e6") + rim.light_energy=0.65 + add_child(rim) + var fill:=OmniLight3D.new() + fill.position=Vector3(0,4,-4) + fill.light_color=Color("80e8d9") + fill.light_energy=1.3 + fill.omni_range=13 + add_child(fill) + +func _create_camera() -> void: + camera=Camera3D.new() + camera.projection=Camera3D.PROJECTION_ORTHOGONAL + camera.size=zoom + camera.far=140 + camera.current=true + add_child(camera) + _camera_update(1) + +func _limit_render_size() -> void: + # Bound GPU work on high-DPI screens; preserve aspect and portrait controls. + var window:=get_window() + if window.size==last_window_size:return + last_window_size=window.size + var physical:=Vector2(window.size) + var factor:=minf(1.0,minf(1440.0/maxf(1,physical.x),900.0/maxf(1,physical.y))) + var target:=Vector2i((physical*factor).round()) + window.content_scale_mode=Window.CONTENT_SCALE_MODE_VIEWPORT + if window.content_scale_size!=target:window.content_scale_size=target + +func _create_audio() -> void: + for id in ["etch","chip","build","supply","uplink"]: + sounds[id]=load("res://assets/audio/"+id+".wav") + for i in 8: + var voice:=AudioStreamPlayer.new() + voice.volume_db=-16 + add_child(voice) + sound_voices.append(voice) + ambience=AudioStreamPlayer.new() + ambience.stream=load("res://assets/audio/room.wav") + ambience.volume_db=-27 + add_child(ambience) + +func _sound(id: String, volume: float=-15.0) -> void: + if not sim.sound_enabled:return + if not ambience.playing:ambience.play() + var voice: AudioStreamPlayer=sound_voices[sound_index%sound_voices.size()] + sound_index+=1 + voice.stream=sounds[id] + voice.volume_db=volume + voice.pitch_scale=1.0+float(sound_index%5)*0.015 + voice.play() + +func _process(delta: float) -> void: + _limit_render_size() + # A short fixed step keeps production deterministic across render frame rates. + # Browser tab suspension does not mint unobserved chips in this prototype. + var remaining: float=minf(delta,0.25) + while remaining>0.00001: + var dt: float=minf(remaining,1.0/60.0) + sim.step(dt) + remaining-=dt + if Input.is_physical_key_pressed(KEY_SPACE) and not ui.reset_confirm.visible: + sim.etch() + time+=delta + production_chime=maxf(0,production_chime-delta) + _handle_events() + manual.animate(delta,sim.manual_progress,sim.overclock) + for i in machines.size():machines[i].animate(delta,sim.cycles[i],sim.overclock) + room.animate(delta,time,sim.fabs,sim.linked) + if sim.linked:target_zoom=maxf(target_zoom,39.0) + _camera_update(delta) + ui.selected=inspecting + ui.update(sim,delta,saving) + selected_ring.position=(manual.position if inspecting<0 else machines[inspecting].position)+Vector3(0,0.02,0) + selected_ring.rotation.y=time*0.08 + if ambience.playing: + ambience.volume_db=lerpf(ambience.volume_db,-27+sim.fabs*0.7,minf(1,delta)) + save_timer+=delta + if save_timer>2: + save_timer=0 + if saving:_save_game() + if test_mode and OS.has_feature("web"): + debug_timer+=delta + if debug_timer>0.25: + debug_timer=0 + var snapshot:=sim.to_save() + snapshot["machines_visible"]=machines.size() + snapshot["fps"]=Engine.get_frames_per_second() + snapshot["nodes"]=get_tree().get_node_count() + snapshot["render_width"]=get_viewport().get_visible_rect().size.x + snapshot["render_height"]=get_viewport().get_visible_rect().size.y + snapshot["cinema"]=ui.focus_mode + snapshot["camera_focus"]=camera_focus + snapshot["draw_calls"]=Performance.get_monitor(Performance.RENDER_TOTAL_DRAW_CALLS_IN_FRAME) + var browser_window=JavaScriptBridge.get_interface("window") + browser_window.__seed=JavaScriptBridge.get_interface("JSON").parse(JSON.stringify(snapshot)) + +func _camera_update(delta: float) -> void: + var size: Vector2=get_viewport().get_visible_rect().size + zoom=lerpf(zoom,13.0 if camera_focus else target_zoom,minf(1.0,delta*2.0)) + camera.size=zoom if size.x>=1000 else zoom*1.12 if size.x>650 else zoom*1.2 + camera.h_offset=2.7 if size.x>=1000 and not ui_is_cinema() else 0.0 + camera.v_offset=-0.5 if size.x>=1000 else -1.2 + var target:=Vector3(0,0.5,-0.3) + if camera_focus: + target=(manual.position if inspecting<0 else machines[inspecting].position)+Vector3(0,1.0,0.4) + camera_target=camera_target.lerp(target,minf(1.0,delta*2)) + camera.position=camera_target+Vector3(sin(yaw)*cos(pitch),sin(pitch),cos(yaw)*cos(pitch))*36 + camera.look_at(camera_target) + +func ui_is_cinema() -> bool: + return is_instance_valid(ui) and ui.focus_mode + +func _add_machine(index: int, animate: bool=true) -> void: + var machine: FabMachine=prepared_machines[index] + machine.visible=true + if animate:machine.birth=0 + machines.append(machine) + +func _action(action: String) -> void: + if ui.reset_confirm.visible and action!="reset":return + match action: + "etch":sim.etch() + "supply": + if not sim.buy_wafers() and not sim.reclaim():ui.notify("A wafer shipment costs $600. Keep etching.") + "fab": + if not sim.build_fab():ui.notify("Earn $%d to commission the next machine."%sim.fab_cost()) + "upgrade":sim.upgrade() + "controller":sim.toggle_controller() + "uplink":sim.uplink() + "sound": + sim.sound_enabled=not sim.sound_enabled + # Web sample playback restarts its source on every unpause assignment. + # Only change this state in response to an actual sound toggle. + if ambience.stream_paused==sim.sound_enabled: + ambience.stream_paused=not sim.sound_enabled + if sim.sound_enabled:_sound("chip") + "view":ui.toggle_view() + "inspect":camera_focus=not camera_focus + "reset": + sim=Simulation.new() + if saving:_save_game() + get_tree().reload_current_scene() + +func _handle_events() -> void: + for event in sim.take_events(): + match event.type: + "start": + if int(event.machine)==-1:_sound("etch",-18) + "chip": + var index: int=int(event.machine) + if index<0:manual.eject() + elif index=0 else -16) + production_chime=0.18 + if sim.chips==1:ui.notify("First chip shipped. $100. A very small beginning.",true) + elif sim.chips==12 and sim.fabs==0:ui.notify("Your first fab is ready to fund. Press B or choose Install a fab.",true) + "build": + _add_machine(int(event.machine)) + camera_focus=false + _sound("build",-12) + inspecting=int(event.machine) + if sim.fabs==1:ui.notify("The first machine is working without you.",true) + elif sim.fabs==3:ui.notify("Three fabs online. The supply controller is now available.",true) + elif sim.fabs==6:ui.notify("All six bays are alive. The district uplink is ready.",true) + else:ui.notify("Bay %02d connected. The room grows louder."%sim.fabs) + "supply": + _sound("supply",-20) + ui.notify("30 silicon wafers delivered. $600 debited.") + "reclaim": + ui.notify("Emergency scrap recovered: 3 usable wafers. You can rebuild.",true) + "upgrade": + _sound("build",-14) + ui.notify("Overclock online. Fabrication cycle: 3.2s → 1.8s.",true) + "controller":ui.notify("Supply controller enabled. It buys wafers below the reserve threshold." if sim.controller else "Supply controller paused. Procurement is yours again.",true) + "uplink": + _sound("uplink",-10) + ui.notify("UPLINK ESTABLISHED. You are no longer the only factory.",true) + +func _input(event: InputEvent) -> void: + if event is InputEventKey and event.pressed and not event.echo and not ui.reset_confirm.visible: + match event.physical_keycode: + KEY_SPACE:_action("etch") + KEY_B:_action("fab") + KEY_R:_action("supply") + KEY_O:_action("upgrade") + KEY_A:_action("controller") + KEY_U:_action("uplink") + KEY_M:_action("sound") + KEY_F:_action("view") + KEY_C:_action("inspect") + KEY_ESCAPE: + if ui.focus_mode:ui.toggle_view() + KEY_Q:yaw-=0.12 + KEY_E:yaw+=0.12 + KEY_HOME: + camera_focus=false + yaw=0.64 + pitch=0.68 + target_zoom=27.5 + _:return + get_viewport().set_input_as_handled() + +func _unhandled_input(event: InputEvent) -> void: + if event is InputEventMouseButton: + if event.button_index in [MOUSE_BUTTON_WHEEL_UP,MOUSE_BUTTON_WHEEL_DOWN] and event.pressed: + if camera_focus:target_zoom=zoom + camera_focus=false + target_zoom=clampf(target_zoom+(-1.2 if event.button_index==MOUSE_BUTTON_WHEEL_UP else 1.2),10,46) + elif event.button_index in [MOUSE_BUTTON_LEFT,MOUSE_BUTTON_RIGHT]: + if event.pressed: + pointer_down=true + dragging=event.button_index==MOUSE_BUTTON_RIGHT + click_origin=event.position + mouse_delta=0 + else: + if pointer_down and not dragging and mouse_delta<6:_pick(event.position) + pointer_down=false + dragging=false + elif event is InputEventMouseMotion and pointer_down: + mouse_delta+=event.relative.length() + if mouse_delta>6:dragging=true + if dragging: + yaw-=event.relative.x*0.006 + pitch=clampf(pitch+event.relative.y*0.004,0.35,1.2) + elif event is InputEventMagnifyGesture:target_zoom=clampf(target_zoom/event.factor,16,46) + elif event is InputEventScreenDrag: + yaw-=event.relative.x*0.006 + pitch=clampf(pitch+event.relative.y*0.004,0.35,1.2) + +func _pick(screen_pos: Vector2) -> void: + var origin:=camera.project_ray_origin(screen_pos) + var direction:=camera.project_ray_normal(screen_pos) + var best: float=INF + var hit_id: int=-99 + var targets: Array[FabMachine]=[manual] + targets.append_array(machines) + for machine in targets: + var bounds:=AABB(machine.position+Vector3(-1.5,0,-1.1),Vector3(3,3.2,3.8)) + var hit: Variant=bounds.intersects_ray(origin,direction) + if hit is Vector3: + var distance: float=origin.distance_to(hit) + if distance=0 else "WAITING FOR SILICON",sim.cycle_seconds()]) + return + var ground: Variant=Plane(Vector3.UP,0.15).intersects_ray(origin,direction) + if ground is Vector3: + for i in range(sim.fabs,6): + if (ground-Chamber.BAY_POSITIONS[i]).length()<2: + if i==sim.fabs:_action("fab") + else:ui.notify("Connect bay %02d first. The line expands in sequence."%(sim.fabs+1)) + return + +func _save_game() -> void: + var file:=FileAccess.open(SAVE_PATH,FileAccess.WRITE) + if file==null: + saving=false + ui.notify("Local storage unavailable. This run will last for this session.") + return + file.store_string(JSON.stringify(sim.to_save())) + file.close() + +func _load_game() -> void: + if not FileAccess.file_exists(SAVE_PATH):return + var file:=FileAccess.open(SAVE_PATH,FileAccess.READ) + if file==null:return + var data: Variant=JSON.parse_string(file.get_as_text()) + if data is Dictionary:sim.restore(data) + +func _notification(what: int) -> void: + if what==NOTIFICATION_APPLICATION_FOCUS_OUT and is_instance_valid(sim) and saving: + _save_game() diff --git a/godot/scripts/factory.gd.uid b/godot/scripts/factory.gd.uid new file mode 100644 index 0000000..fdd362a --- /dev/null +++ b/godot/scripts/factory.gd.uid @@ -0,0 +1 @@ +uid://c0vd54mjutf3t diff --git a/godot/scripts/geometry.gd b/godot/scripts/geometry.gd new file mode 100644 index 0000000..26bcf1c --- /dev/null +++ b/godot/scripts/geometry.gd @@ -0,0 +1,98 @@ +class_name FactoryGeometry +extends RefCounted + +static func material(color: Color, metal: float = 0.0, rough: float = 0.6, emission: float = 0.0) -> StandardMaterial3D: + var m := StandardMaterial3D.new() + m.albedo_color = color + m.metallic = metal + m.roughness = rough + if emission > 0: + m.emission_enabled = true + m.emission = color + m.emission_energy_multiplier = emission + return m + +static func box(parent: Node3D, pos: Vector3, size: Vector3, mat: Material) -> MeshInstance3D: + var mesh := BoxMesh.new() + mesh.size = size + return instance(parent, mesh, pos, mat) + +static func cylinder(parent: Node3D, pos: Vector3, radius: float, height: float, mat: Material, top: float = -1.0) -> MeshInstance3D: + var mesh := CylinderMesh.new() + mesh.top_radius = radius if top < 0 else top + mesh.bottom_radius = radius + mesh.height = height + mesh.radial_segments = 32 + return instance(parent, mesh, pos, mat) + +static func sphere(parent: Node3D, pos: Vector3, radius: float, mat: Material) -> MeshInstance3D: + var mesh := SphereMesh.new() + mesh.radius = radius + mesh.height = radius * 2.0 + mesh.radial_segments = 12 + mesh.rings = 6 + return instance(parent, mesh, pos, mat) + +static func ring(parent: Node3D, pos: Vector3, radius: float, thickness: float, mat: Material) -> MeshInstance3D: + var mesh := TorusMesh.new() + mesh.inner_radius = radius - thickness + mesh.outer_radius = radius + thickness + mesh.rings = 40 + mesh.ring_segments = 8 + return instance(parent, mesh, pos, mat) + +static func instance(parent: Node3D, mesh: Mesh, pos: Vector3, mat: Material) -> MeshInstance3D: + var node := MeshInstance3D.new() + node.mesh = mesh + node.material_override = mat + node.position = pos + parent.add_child(node) + return node + +static func pipe(parent: Node3D, from: Vector3, to: Vector3, radius: float, mat: Material) -> MeshInstance3D: + var node := cylinder(parent, (from + to) * 0.5, radius, from.distance_to(to), mat) + node.quaternion = Quaternion(Vector3.UP, (to - from).normalized()) + return node + +static func label(parent: Node3D, content: String, pos: Vector3, size: int = 40, color: Color = Color.WHITE) -> Label3D: + var text := Label3D.new() + text.text = content + text.font_size = size + text.pixel_size = 0.006 + text.modulate = color + text.outline_size = 0 + text.no_depth_test = false + text.position = pos + parent.add_child(text) + return text + +## Collapse static parts by material. Machines retain their moving subassemblies; +## the floor doesn't pay a draw call for every bolt and railing segment. +static func batch(parent: Node3D, excluded: Array = []) -> void: + var groups: Dictionary = {} + _collect_meshes(parent,parent,excluded,groups) + for key in groups: + var group: Array=groups[key] + var surface:=SurfaceTool.new() + surface.begin(Mesh.PRIMITIVE_TRIANGLES) + var material_ref: Material=group[0].material_override + for source: MeshInstance3D in group: + var transform: Transform3D=parent.global_transform.affine_inverse()*source.global_transform + surface.append_from(source.mesh,0,transform) + var merged:=MeshInstance3D.new() + merged.mesh=surface.commit() + merged.material_override=material_ref + parent.add_child(merged) + for source: MeshInstance3D in group: + source.get_parent().remove_child(source) + source.queue_free() + +static func _collect_meshes(root: Node3D, node: Node3D, excluded: Array, groups: Dictionary) -> void: + for child in node.get_children(): + if child in excluded:continue + if child is MeshInstance3D and child.material_override!=null and child.mesh!=null: + var key: int=child.material_override.get_instance_id() + if not groups.has(key):groups[key]=[] + groups[key].append(child) + elif child is Node3D: + _collect_meshes(root,child,excluded,groups) diff --git a/godot/scripts/geometry.gd.uid b/godot/scripts/geometry.gd.uid new file mode 100644 index 0000000..9abaaa3 --- /dev/null +++ b/godot/scripts/geometry.gd.uid @@ -0,0 +1 @@ +uid://ijgutu0hg363 diff --git a/godot/scripts/interface.gd b/godot/scripts/interface.gd new file mode 100644 index 0000000..cc35df5 --- /dev/null +++ b/godot/scripts/interface.gd @@ -0,0 +1,389 @@ +class_name FactoryInterface +extends CanvasLayer + +signal action_requested(action: String) +const INK := Color("0d1a24") +const BORDER := Color("304853") +const MUTED := Color("8ba3b0") +const WHITE := Color("e6e9df") +const GOLD := Color("f4ca7a") +const TEAL := Color("84dfcf") + +var root: Control +var top_shade: TextureRect +var bottom_shade: TextureRect +var title: Label +var subtitle: Label +var money: Label +var wafers: Label +var output: Label +var count: Label +var metric_box: HBoxContainer +var chapter_panel: PanelContainer +var chapter_title: Label +var chapter_note: Label +var objective: Label +var objective_progress: ProgressBar +var objective_numbers: Label +var journal: Label +var selection_label: Label +var dock: GridContainer +var buttons: Dictionary = {} +var captions: Dictionary = {} +var headings: Dictionary = {} +var etch_progress: ProgressBar +var toast: PanelContainer +var toast_label: Label +var toast_time: float = 0.0 +var mute_button: Button +var help: Label +var hint: Label +var reset_confirm: ConfirmationDialog +var screen_size := Vector2.ZERO +var focus_mode: bool = false +var selected: int = -1 + +func _style(bg: Color = INK, line: Color = BORDER, radius: int = 5) -> StyleBoxFlat: + var s := StyleBoxFlat.new() + s.bg_color = bg + s.border_color = line + s.set_border_width_all(1) + s.set_corner_radius_all(radius) + s.content_margin_left=16 + s.content_margin_right=16 + s.content_margin_top=12 + s.content_margin_bottom=12 + return s + +func _label(text: String, size: int = 14, color: Color = WHITE) -> Label: + var node := Label.new() + node.text=text + node.add_theme_font_size_override("font_size",size) + node.add_theme_color_override("font_color",color) + node.mouse_filter=Control.MOUSE_FILTER_IGNORE + return node + +func _ready() -> void: + layer=10 + root=Control.new() + root.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + root.mouse_filter=Control.MOUSE_FILTER_IGNORE + add_child(root) + top_shade=_shade(false) + bottom_shade=_shade(true) + root.add_child(top_shade) + root.add_child(bottom_shade) + var brand := _label("UNIVERSAL AI",21,WHITE) + brand.position=Vector2(28,24) + root.add_child(brand) + var edition := _label("T H E S E E D / A F A B R I C A T I O N S T O R Y",9,MUTED) + edition.position=Vector2(30,53) + root.add_child(edition) + title=_label("A small beginning.",34,WHITE) + title.position=Vector2(28,115) + root.add_child(title) + subtitle=_label("One wafer. One machine. An unreasonable ambition.",12,MUTED) + subtitle.position=Vector2(30,160) + root.add_child(subtitle) + metric_box=HBoxContainer.new() + metric_box.add_theme_constant_override("separation",30) + root.add_child(metric_box) + money=_metric("CAPITAL",GOLD) + wafers=_metric("WAFERS",WHITE) + output=_metric("CHIPS SHIPPED",TEAL) + count=_metric("AUTONOMOUS FABS",WHITE) + chapter_panel=PanelContainer.new() + chapter_panel.add_theme_stylebox_override("panel",_style(Color(0.045,0.085,0.12,0.93),BORDER)) + root.add_child(chapter_panel) + var chapter_box:=VBoxContainer.new() + chapter_box.add_theme_constant_override("separation",13) + chapter_panel.add_child(chapter_box) + chapter_box.add_child(_label("O B J E C T I V E / 0 1",10,GOLD)) + chapter_title=_label("Build the machine\nthat builds the machine.",22,WHITE) + chapter_box.add_child(chapter_title) + chapter_note=_label("Etch 12 chips. Sales are automatic.\nThen install your first autonomous fab.",12,MUTED) + chapter_note.autowrap_mode=TextServer.AUTOWRAP_WORD_SMART + chapter_box.add_child(chapter_note) + var sep:=HSeparator.new() + sep.modulate=Color("385360") + chapter_box.add_child(sep) + objective=_label("FIRST AUTONOMOUS FAB",10,TEAL) + chapter_box.add_child(objective) + objective_progress=ProgressBar.new() + objective_progress.show_percentage=false + objective_progress.custom_minimum_size=Vector2(0,4) + var track:=_style(Color("263d45"),Color.TRANSPARENT,0) + track.content_margin_top=0 + track.content_margin_bottom=0 + objective_progress.add_theme_stylebox_override("background",track) + var fill:=_style(TEAL,Color.TRANSPARENT,0) + fill.content_margin_top=0 + fill.content_margin_bottom=0 + objective_progress.add_theme_stylebox_override("fill",fill) + chapter_box.add_child(objective_progress) + objective_numbers=_label("$0 / $1,200",11,MUTED) + chapter_box.add_child(objective_numbers) + chapter_box.add_child(_label("S Y S T E M T R A N S M I S S I O N",9,MUTED)) + journal=_label("The room is quiet.\nThat part is temporary.",13,WHITE) + journal.autowrap_mode=TextServer.AUTOWRAP_WORD_SMART + chapter_box.add_child(journal) + selection_label=_label("CELL 00 / MANUAL LITHOGRAPHY",10,TEAL) + root.add_child(selection_label) + dock=GridContainer.new() + dock.columns=6 + dock.add_theme_constant_override("h_separation",8) + dock.add_theme_constant_override("v_separation",8) + root.add_child(dock) + _make_action("etch","01 / FABRICATE","Etch a chip","SPACE · 1 wafer > $100",true) + _make_action("supply","02 / PROCUREMENT","Order silicon","$600 · +30 wafers") + _make_action("fab","03 / EXPANSION","Install a fab","$1,200 · bay 01") + _make_action("upgrade","04 / RESEARCH","Overclock","2 fabs required") + _make_action("controller","05 / AUTONOMY","Supply controller","3 fabs required") + _make_action("uplink","06 / BEYOND","District uplink","6 fabs required") + etch_progress=ProgressBar.new() + etch_progress.mouse_filter=Control.MOUSE_FILTER_IGNORE + etch_progress.show_percentage=false + etch_progress.set_anchors_and_offsets_preset(Control.PRESET_BOTTOM_WIDE) + etch_progress.offset_top=-4 + for part in ["background","fill"]: + var bar_style:=StyleBoxFlat.new() + bar_style.bg_color=Color("87dbc2") if part=="fill" else Color.TRANSPARENT + etch_progress.add_theme_stylebox_override(part,bar_style) + buttons.etch.add_child(etch_progress) + mute_button=_small_button("SOUND ON",func():action_requested.emit("sound")) + root.add_child(mute_button) + var reset:=_small_button("NEW RUN",func():reset_confirm.popup_centered()) + reset.name="ResetButton" + root.add_child(reset) + var view:=_small_button("CINEMA",func():action_requested.emit("view")) + view.name="ViewButton" + root.add_child(view) + var detail:=_small_button("CLOSE UP",func():action_requested.emit("inspect")) + detail.name="DetailButton" + root.add_child(detail) + help=_label("SPACE etch · B build · R restock · drag to orbit · scroll to zoom · F cinema",10,MUTED) + root.add_child(help) + hint=_label("CLICK THE CENTRAL MACHINE TO ETCH",11,GOLD) + root.add_child(hint) + toast=PanelContainer.new() + toast.add_theme_stylebox_override("panel",_style(Color("172e36"),GOLD)) + root.add_child(toast) + toast_label=_label("",16,WHITE) + toast_label.horizontal_alignment=HORIZONTAL_ALIGNMENT_CENTER + toast.add_child(toast_label) + toast.visible=false + reset_confirm=ConfirmationDialog.new() + reset_confirm.title="Begin again?" + reset_confirm.dialog_text="This resets the Godot prototype's factory and local save." + reset_confirm.confirmed.connect(func():action_requested.emit("reset")) + root.add_child(reset_confirm) + _layout() + +func _shade(reverse: bool) -> TextureRect: + var node:=TextureRect.new() + node.mouse_filter=Control.MOUSE_FILTER_IGNORE + var texture:=GradientTexture2D.new() + texture.width=4 + texture.height=128 + texture.fill_from=Vector2(0,0) + texture.fill_to=Vector2(0,1) + var gradient:=Gradient.new() + gradient.set_color(0,Color(0.02,0.05,0.08,0.0 if reverse else 0.94)) + gradient.set_color(1,Color(0.02,0.05,0.08,0.94 if reverse else 0.0)) + texture.gradient=gradient + node.texture=texture + node.expand_mode=TextureRect.EXPAND_IGNORE_SIZE + return node + +func _metric(caption: String, color: Color) -> Label: + var v:=VBoxContainer.new() + v.add_theme_constant_override("separation",3) + metric_box.add_child(v) + v.add_child(_label(caption,9,MUTED)) + var value:=_label("0",22,color) + v.add_child(value) + return value + +func _small_button(text: String, callback: Callable) -> Button: + var b:=Button.new() + b.text=text + b.add_theme_font_size_override("font_size",10) + b.add_theme_color_override("font_color",MUTED) + b.add_theme_stylebox_override("normal",_style(Color(0.04,0.07,0.1,0.85),BORDER,3)) + b.add_theme_stylebox_override("hover",_style(Color("233a44"),GOLD,3)) + b.add_theme_stylebox_override("focus",_style(Color.TRANSPARENT,GOLD,3)) + b.pressed.connect(callback) + return b + +func _make_action(id: String, kicker: String, text: String, detail: String, primary: bool=false) -> void: + var b:=Button.new() + b.custom_minimum_size=Vector2(160,91) + b.size_flags_horizontal=Control.SIZE_EXPAND_FILL + b.mouse_default_cursor_shape=Control.CURSOR_POINTING_HAND + b.add_theme_stylebox_override("normal",_style(Color("eed095") if primary else Color(0.045,0.085,0.12,0.97),GOLD if primary else BORDER)) + b.add_theme_stylebox_override("hover",_style(Color("ffe0a1") if primary else Color("243c46"),GOLD)) + b.add_theme_stylebox_override("pressed",_style(Color("bfa366") if primary else Color("1d323b"),TEAL)) + b.add_theme_stylebox_override("disabled",_style(Color(0.04,0.075,0.10,0.94),Color("263a46"))) + b.add_theme_stylebox_override("focus",_style(Color.TRANSPARENT,GOLD)) + b.pressed.connect(func():action_requested.emit(id)) + var margin:=MarginContainer.new() + margin.mouse_filter=Control.MOUSE_FILTER_IGNORE + margin.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + for side in ["left","right"]:margin.add_theme_constant_override("margin_"+side,14) + for side in ["top","bottom"]:margin.add_theme_constant_override("margin_"+side,12) + b.add_child(margin) + var content:=VBoxContainer.new() + content.mouse_filter=Control.MOUSE_FILTER_IGNORE + content.add_theme_constant_override("separation",5) + margin.add_child(content) + var kicker_label:=_label(kicker,8,Color("48544e") if primary else MUTED) + content.add_child(kicker_label) + var h:=_label(text,16,INK if primary else WHITE) + content.add_child(h) + var d:=_label(detail,10,Color("384b44") if primary else MUTED) + content.add_child(d) + buttons[id]=b + headings[id]=h + captions[id]=d + dock.add_child(b) + +func _layout() -> void: + screen_size=root.get_viewport_rect().size + var w: float=screen_size.x + var h: float=screen_size.y + var compact: bool=w<1050 + top_shade.size=Vector2(w,240) + bottom_shade.size=Vector2(w,220 if compact else 175) + bottom_shade.position=Vector2(0,h-bottom_shade.size.y) + top_shade.visible=not focus_mode + bottom_shade.visible=not focus_mode + metric_box.position=Vector2(maxf(350,w-655),25) + metric_box.add_theme_constant_override("separation",16 if compact else 30) + chapter_panel.position=Vector2(w-304,115) + chapter_panel.size=Vector2(276,0) + chapter_panel.visible=not focus_mode and w>=1000 + title.visible=not focus_mode and h>650 + subtitle.visible=title.visible + if compact: + dock.columns=3 + dock.position=Vector2(18,h-228) + dock.size=Vector2(w-36,190) + else: + dock.columns=6 + dock.position=Vector2(24,h-131) + dock.size=Vector2(w-48,92) + for b: Button in buttons.values(): + b.custom_minimum_size.x=0 + dock.visible=not focus_mode + selection_label.position=Vector2(28,dock.position.y-25) + selection_label.visible=not focus_mode + help.position=Vector2(28,h-24) + help.text="SPACE etch · B build · R restock · drag to orbit · scroll to zoom · C close up · F cinema" if w>1050 else "SPACE etch · B build · drag to orbit · F cinema" + help.visible=not focus_mode + hint.position=Vector2(30,190) + hint.visible=not focus_mode and h>650 + root.get_node("DetailButton").position=Vector2(w-380,78) + mute_button.position=Vector2(w-276,78) + root.get_node("ResetButton").position=Vector2(w-172,78) + root.get_node("ViewButton").position=Vector2(w-88,78) + toast.position=Vector2(w*0.5-260,90) + toast.size=Vector2(520,0) + # Portrait keeps the actual controls usable; the world can still be orbited. + if w<650: + dock.columns=2 + dock.position.y=h-330 + dock.size.y=294 + selection_label.position.y=dock.position.y-25 + bottom_shade.size.y=350 + bottom_shade.position.y=h-350 + metric_box.position=Vector2(24,86) + metric_box.add_theme_constant_override("separation",18) + for child in metric_box.get_children(): + child.get_child(0).add_theme_font_size_override("font_size",7) + child.get_child(1).add_theme_font_size_override("font_size",17) + mute_button.position=Vector2(w-100,18) + root.get_node("ResetButton").visible=false + root.get_node("ViewButton").visible=false + root.get_node("DetailButton").visible=false + title.visible=false + subtitle.visible=false + hint.visible=false + for label: Label in headings.values():label.add_theme_font_size_override("font_size",12) + for label: Label in captions.values():label.add_theme_font_size_override("font_size",8) + toast.position=Vector2(16,140) + toast.size=Vector2(w-32,0) + toast_label.add_theme_font_size_override("font_size",12) + +func update(sim: SeedSimulation, delta: float, saving: bool) -> void: + if root.get_viewport_rect().size!=screen_size:_layout() + chapter_panel.size.y=440 + money.text="$%s"%_number(sim.capital) + wafers.text=_number(sim.wafers) + wafers.add_theme_color_override("font_color",Color("ed9175") if sim.wafers<6 else WHITE) + output.text=_number(sim.chips) + count.text="%d / 6"%sim.fabs + buttons.etch.disabled=sim.manual_progress>=0 or sim.wafers==0 + buttons.supply.disabled=sim.capital=6 + buttons.upgrade.disabled=sim.overclock or sim.fabs<2 or sim.capital=0 else "Etch a chip" + captions.etch.text="OUT OF SILICON" if sim.wafers==0 and sim.manual_progress<0 else "SPACE · 1 wafer > $100" + etch_progress.value=maxf(0.0,sim.manual_progress)*100 + captions.fab.text="$%s · bay %02d"%[_number(sim.fab_cost()),sim.fabs+1] if sim.fabs<6 else "ALL BAYS CONNECTED" + captions.upgrade.text="ACTIVE · 1.8s / chip" if sim.overclock else "$2,400 · 1.8s / chip" if sim.fabs>=2 else "2 fabs required" + captions.controller.text="ON · buys low stock" if sim.controller else "OFF · click to enable" if sim.fabs>=3 else "3 fabs required" + headings.controller.text="Supply controller" + captions.uplink.text="DISTRICT CONNECTED" if sim.linked else "$6,000 · ignite network" if sim.fabs>=6 else "6 fabs required" + mute_button.text="SOUND ON" if sim.sound_enabled else "MUTED" + if sim.linked: + title.text="A much larger beginning." + chapter_title.text="The district\nis listening." + chapter_note.text="Your factory is now a node in something larger. This is where The Seed ends. Your machines can keep running." + objective.text="PROTOTYPE COMPLETE" + objective_progress.value=100 + objective_numbers.text="6 / 6 bays · uplink established" + elif sim.fabs>0: + title.text="The room has a rhythm." + chapter_title.text="Make yourself\nredundant." + chapter_note.text="Fill six machine bays. Overclock the line. At three fabs, let the supply controller order your wafers." + objective.text="DISTRICT UPLINK" if sim.fabs>=6 else "NEXT AUTONOMOUS FAB" + var target: int=sim.UPLINK_COST if sim.fabs>=6 else sim.fab_cost() + objective_progress.value=minf(100,float(sim.capital)/target*100) + objective_numbers.text="$%s / $%s"%[_number(sim.capital),_number(target)] + else: + objective_progress.value=minf(100,float(sim.capital)/sim.fab_cost()*100) + objective_numbers.text="$%s / $1,200"%_number(sim.capital) + if sim.fabs>0:hint.text="CLICK A MACHINE TO INSPECT · CLICK AN EMPTY BAY TO BUILD" + selection_label.text=("CELL 00 / MANUAL LITHOGRAPHY" if selected<0 else "CELL %02d / AUTONOMOUS FAB"%(selected+1))+ (" · LOCAL SAVE" if saving else " · SESSION ONLY") + if toast_time>0: + toast_time-=delta + toast.modulate.a=minf(1.0,toast_time*2.0) + toast.visible=toast_time>0 + +func _number(value: int) -> String: + var raw:=str(value) + var result: String="" + for i in range(raw.length()): + if i>0 and (raw.length()-i)%3==0:result+="," + result+=raw[i] + return result + +func notify(text: String, big: bool = false) -> void: + journal.text=text + if big: + toast_label.text=text + toast_time=4.5 + toast.visible=true + toast.modulate.a=1.0 + +func toggle_view() -> void: + focus_mode=not focus_mode + root.get_node("ViewButton").text="EXIT" if focus_mode else "CINEMA" + _layout() diff --git a/godot/scripts/interface.gd.uid b/godot/scripts/interface.gd.uid new file mode 100644 index 0000000..3a75c7a --- /dev/null +++ b/godot/scripts/interface.gd.uid @@ -0,0 +1 @@ +uid://cp3emycctbylh diff --git a/godot/scripts/machine.gd b/godot/scripts/machine.gd new file mode 100644 index 0000000..105856f --- /dev/null +++ b/godot/scripts/machine.gd @@ -0,0 +1,190 @@ +class_name FabMachine +extends Node3D + +const Geo = preload("res://scripts/geometry.gd") +var machine_id: int = -1 +var is_manual: bool = false +var head: Node3D +var laser: MeshInstance3D +var wafer: MeshInstance3D +var wafer_mat: ShaderMaterial +var rotor: Node3D +var display: Label3D +var status_light: MeshInstance3D +var arm: Node3D +var progress: float = -1.0 +var clock: float = 0.0 +var birth: float = 1.0 +var overclocked: bool = false +var chip_objects: Array[Dictionary] = [] +var sparks: Array[Dictionary] = [] +var spark_pool: Array[MeshInstance3D] = [] +var chip_pool: Array[Node3D] = [] +var spark_timer: float = 0.0 +var shell_mat: StandardMaterial3D +var dark_mat: StandardMaterial3D +var light_mat: StandardMaterial3D +var teal_mat: StandardMaterial3D +var copper_mat: StandardMaterial3D +var beam_mat: StandardMaterial3D + +func construct(id: int, manual: bool = false) -> void: + machine_id = id + is_manual = manual + shell_mat = Geo.material(Color("889ca6"), 0.45, 0.35) + dark_mat = Geo.material(Color("162b38"), 0.65, 0.38) + light_mat = Geo.material(Color("f8cb75"), 0.1, 0.3, 1.4) + teal_mat = Geo.material(Color("6ee3d4"), 0.25, 0.3, 1.1) + copper_mat = Geo.material(Color("b58356"), 0.7, 0.33) + beam_mat = Geo.material(Color("73ffe4"), 0.0, 0.1, 3.0) + var base_color := Geo.material(Color("334c59"), 0.6, 0.45) + # Plinth, feet, chassis, removable face panels, and service vents. + Geo.box(self, Vector3(0,0.15,0), Vector3(2.7,0.3,2.6), dark_mat) + Geo.box(self, Vector3(0,0.65,0), Vector3(2.35,0.8,2.15), base_color) + Geo.box(self, Vector3(0,1.08,0), Vector3(2.65,0.12,2.45), shell_mat) + for x in [-1.0, 1.0]: + for z in [-0.9, 0.9]: + Geo.cylinder(self, Vector3(x,0.08,z), 0.15, 0.25, copper_mat) + Geo.box(self, Vector3(0,0.65,1.09), Vector3(1.9,0.5,0.06), dark_mat) + for x in range(7): + Geo.box(self, Vector3(-0.76+x*0.24,0.66,1.13), Vector3(0.035,0.31,0.03), shell_mat) + Geo.box(self, Vector3(0,0.99,1.13), Vector3(2.2,0.045,0.04), teal_mat) + # Precision turntable with a real iridescent wafer shader. + Geo.cylinder(self, Vector3(0,1.20,0.05), 0.95, 0.13, dark_mat) + rotor = Node3D.new() + rotor.position = Vector3(0,1.28,0.05) + add_child(rotor) + Geo.ring(rotor, Vector3.ZERO, 0.82, 0.027, copper_mat) + wafer_mat = ShaderMaterial.new() + wafer_mat.shader = preload("res://shaders/wafer.gdshader") + wafer = Geo.cylinder(rotor, Vector3(0,0.02,0), 0.76, 0.025, wafer_mat) + # An overhead gantry with an independently moving head and Z carriage. + for x in [-1.07,1.07]: + Geo.box(self, Vector3(x,1.9,-0.81), Vector3(0.19,1.65,0.24), shell_mat) + Geo.box(self, Vector3(x,1.93,-0.65), Vector3(0.06,1.38,0.05), copper_mat) + Geo.box(self, Vector3(0,2.72,-0.81), Vector3(2.55,0.27,0.34), shell_mat) + Geo.box(self, Vector3(0,2.56,-0.64), Vector3(2.19,0.07,0.09), light_mat) + head = Node3D.new() + head.position = Vector3(0,2.25,0) + add_child(head) + Geo.box(head, Vector3(0,0.15,-0.42), Vector3(0.42,0.26,1.18), dark_mat) + Geo.cylinder(head, Vector3.ZERO, 0.2, 0.35, shell_mat) + Geo.cylinder(head, Vector3(0,-0.24,0), 0.12, 0.18, copper_mat, 0.18) + Geo.ring(head, Vector3(0,-0.22,0), 0.15, 0.025, light_mat) + laser = Geo.cylinder(head, Vector3(0,-0.61,0), 0.013, 0.75, beam_mat) + laser.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF + laser.visible = false + # Side monitor and status lamp, arranged to remain legible in the cutaway. + Geo.box(self, Vector3(1.12,1.44,0.78), Vector3(0.54,0.5,0.18), dark_mat) + Geo.box(self, Vector3(1.12,1.45,0.88), Vector3(0.45,0.35,0.02), Geo.material(Color("123f46"),0.0,0.4,0.45)) + display = Geo.label(self, "READY", Vector3(1.12,1.45,0.901), 15, Color("a3f4d5")) + display.pixel_size = 0.0033 + status_light = Geo.sphere(self, Vector3(1.07,2.94,-0.81), 0.075, teal_mat) + Geo.cylinder(self, Vector3(1.07,2.83,-0.81), 0.035, 0.19, dark_mat) + # A robotic loading arm; its shoulder and gripper sweep during the cycle. + arm = Node3D.new() + arm.position = Vector3(-1.02,1.18,0.7) + add_child(arm) + Geo.cylinder(arm, Vector3.ZERO, 0.16, 0.12, copper_mat) + Geo.pipe(arm, Vector3(0,0.05,0), Vector3(0,0.55,0), 0.07, shell_mat) + Geo.pipe(arm, Vector3(0,0.55,0), Vector3(0.58,0.55,0), 0.055, shell_mat) + Geo.sphere(arm, Vector3(0,0.55,0),0.11,dark_mat) + Geo.box(arm, Vector3(0.58,0.46,0), Vector3(0.17,0.2,0.25), copper_mat) + # The output belt physically carries every visible completed chip. + Geo.box(self, Vector3(0,0.63,1.92), Vector3(0.88,0.16,1.6), dark_mat) + for x in [-0.48,0.48]: + Geo.box(self, Vector3(x,0.72,1.92), Vector3(0.07,0.12,1.7), shell_mat) + for n in range(7): + var roller := Geo.cylinder(self,Vector3(0,0.73,1.3+n*0.19),0.042,0.79,copper_mat) + roller.rotation.z = PI/2.0 + var badge := Geo.label(self,"MANUAL / 00" if manual else "AUTO / %02d" % (id+1),Vector3(-0.05,0.34,1.17),22,Color("c3d4da")) + badge.pixel_size=0.004 + Geo.batch(self,[head,rotor,arm,status_light]) + Geo.batch(head,[laser]) + Geo.batch(arm) + for i in 6: + var particle:=Geo.sphere(self,Vector3.ZERO,0.018,beam_mat) + particle.cast_shadow=GeometryInstance3D.SHADOW_CASTING_SETTING_OFF + particle.visible=false + spark_pool.append(particle) + for i in 2: + var chip:=_create_chip() + chip.visible=false + chip_pool.append(chip) + +func animate(delta: float, phase: float, hot: bool) -> void: + clock += delta + spark_timer=maxf(0,spark_timer-delta) + progress = phase + overclocked = hot + if birth < 1.0: + birth = minf(1.0, birth + delta * 0.8) + var b: float = ease(birth, 0.35) + scale = Vector3(1, maxf(0.01,b), 1) + var active: bool = progress >= 0.0 + laser.visible = active and progress > 0.15 and progress < 0.84 + wafer_mat.set_shader_parameter("activity", 1.0 if laser.visible else 0.0) + if active: + var scan: float = clampf((progress-0.15)/0.7,0.0,1.0) + head.position.x = sin(scan*PI*8.0)*0.58 + head.position.z = lerpf(-0.42,0.48,scan) + head.position.y = 2.18 + sin(progress*PI)*0.07 + rotor.rotation.y += delta * 0.12 + arm.rotation.y = sin(progress*TAU)*0.55-0.3 + display.text = "ETCH" + if laser.visible and spark_timer<=0: + spark_timer=0.08 + _spark() + else: + head.position = head.position.lerp(Vector3(0,2.4,-0.3),minf(1.0,delta*5)) + arm.rotation.y = lerpf(arm.rotation.y,-0.7,minf(1.0,delta*3)) + display.text = "READY" if is_manual else "IDLE" + status_light.scale = Vector3.ONE * (1.0+sin(clock*5)*0.08 if active else 0.8) + for index in range(chip_objects.size()-1,-1,-1): + var item: Dictionary = chip_objects[index] + item.age += delta + var mesh: Node3D = item.node + mesh.position.z = 1.08+float(item.age)*1.3 + mesh.position.y = 0.86+sin(minf(float(item.age)*3,PI))*0.1 + if float(item.age)>1.25: + mesh.visible=false + chip_pool.append(mesh) + chip_objects.remove_at(index) + for index in range(sparks.size()-1,-1,-1): + var item: Dictionary = sparks[index] + item.age += delta + item.velocity += Vector3.DOWN*delta*3 + item.node.position += item.velocity*delta + item.node.scale = Vector3.ONE * maxf(0.0,1.0-float(item.age)*2.5) + if item.age > 0.4: + item.node.visible=false + spark_pool.append(item.node) + sparks.remove_at(index) + +func _create_chip() -> Node3D: + var chip := Node3D.new() + add_child(chip) + chip.position = Vector3(0,0.9,1.1) + Geo.box(chip, Vector3.ZERO, Vector3(0.3,0.055,0.3), dark_mat) + Geo.box(chip, Vector3(0,0.035,0), Vector3(0.21,0.013,0.21), light_mat) + for side in [-1,1]: + Geo.box(chip,Vector3(side*0.17,0,0),Vector3(0.03,0.035,0.26),copper_mat) + Geo.batch(chip) + return chip + +func eject() -> void: + if chip_pool.is_empty():return + var chip: Node3D=chip_pool.pop_back() + chip.position=Vector3(0,0.9,1.1) + chip.visible=true + chip_objects.append({"node":chip,"age":0.0}) + +func _spark() -> void: + if spark_pool.is_empty(): + return + var particle: MeshInstance3D=spark_pool.pop_back() + particle.position=Vector3(head.position.x,1.35,head.position.z) + particle.scale=Vector3.ONE + particle.visible=true + var angle: float = clock*53.0 + sparks.append({"node":particle,"age":0.0,"velocity":Vector3(cos(angle)*0.7,0.4,sin(angle)*0.7)}) diff --git a/godot/scripts/machine.gd.uid b/godot/scripts/machine.gd.uid new file mode 100644 index 0000000..ba922bc --- /dev/null +++ b/godot/scripts/machine.gd.uid @@ -0,0 +1 @@ +uid://bb4wjmcg6uyy6 diff --git a/godot/scripts/simulation.gd b/godot/scripts/simulation.gd new file mode 100644 index 0000000..a40be0c --- /dev/null +++ b/godot/scripts/simulation.gd @@ -0,0 +1,174 @@ +class_name SeedSimulation +extends RefCounted + +## Economy is independent of rendering, timers, input, and audio. Both the +## human and the utility controller call these same transaction methods. +const CHIP_VALUE: int = 100 +const MANUAL_SECONDS: float = 0.9 +const WAFER_BATCH: int = 30 +const WAFER_COST: int = 600 +const MAX_FABS: int = 6 +const OVERCLOCK_COST: int = 2400 +const UPLINK_COST: int = 6000 +const SAVE_VERSION: int = 1 + +var capital: int = 0 +var wafers: int = 60 +var chips: int = 0 +var fabs: int = 0 +var overclock: bool = false +var controller: bool = false +var linked: bool = false +var sound_enabled: bool = true +var manual_progress: float = -1.0 +var cycles: Array[float] = [] +var elapsed: float = 0.0 +var events: Array[Dictionary] = [] + +func _init() -> void: + for i in MAX_FABS: + cycles.append(-1.0) + +func fab_cost() -> int: + return roundi(1200.0 * pow(1.45, fabs) / 100.0) * 100 + +func cycle_seconds() -> float: + return 1.8 if overclock else 3.2 + +func etch() -> bool: + if manual_progress >= 0.0 or wafers <= 0: + return false + wafers -= 1 + manual_progress = 0.0 + events.append({"type": "start", "machine": -1}) + return true + +func buy_wafers() -> bool: + if capital < WAFER_COST: + return false + capital -= WAFER_COST + wafers += WAFER_BATCH + events.append({"type": "supply"}) + return true + +func can_reclaim() -> bool: + if wafers > 0 or capital >= WAFER_COST or manual_progress >= 0: + return false + for cycle in cycles: + if cycle >= 0:return false + return true + +func reclaim() -> bool: + if not can_reclaim():return false + wafers += 3 + events.append({"type": "reclaim"}) + return true + +func build_fab() -> bool: + if fabs >= MAX_FABS or capital < fab_cost(): + return false + capital -= fab_cost() + fabs += 1 + events.append({"type": "build", "machine": fabs - 1}) + return true + +func upgrade() -> bool: + if overclock or fabs < 2 or capital < OVERCLOCK_COST: + return false + capital -= OVERCLOCK_COST + overclock = true + events.append({"type": "upgrade"}) + return true + +func toggle_controller() -> bool: + if fabs < 3: + return false + controller = not controller + events.append({"type": "controller"}) + return true + +func uplink() -> bool: + if linked or fabs < MAX_FABS or capital < UPLINK_COST: + return false + capital -= UPLINK_COST + linked = true + events.append({"type": "uplink"}) + return true + +func _finish(machine: int) -> void: + chips += 1 + capital += CHIP_VALUE + events.append({"type": "chip", "machine": machine}) + +func step(delta: float) -> void: + if delta <= 0.0 or not is_finite(delta): + return + elapsed += delta + # Automatic supply is explicit, opt-in, and pays the same price as a click. + if controller and wafers < maxi(6, fabs * 2): + if not buy_wafers():reclaim() + if manual_progress >= 0.0: + manual_progress += delta / MANUAL_SECONDS + if manual_progress >= 1.0: + manual_progress = -1.0 + _finish(-1) + for i in fabs: + if cycles[i] < 0.0 and wafers > 0: + wafers -= 1 + cycles[i] = 0.0 + events.append({"type": "start", "machine": i}) + if cycles[i] >= 0.0: + cycles[i] += delta / cycle_seconds() + if cycles[i] >= 1.0: + cycles[i] = -1.0 + _finish(i) + +func take_events() -> Array[Dictionary]: + var result: Array[Dictionary] = events + events = [] + return result + +func to_save() -> Dictionary: + return {"version": SAVE_VERSION, "capital": capital, "wafers": wafers, + "chips": chips, "fabs": fabs, "overclock": overclock, + "controller": controller, "linked": linked, "sound_enabled": sound_enabled, + "manual_progress": manual_progress, "cycles": cycles.duplicate(), "elapsed": elapsed} + +func restore(data: Dictionary) -> bool: + if data.get("version") != SAVE_VERSION: + return false + # Reject invalid files as a whole. No partial restore of a corrupted economy. + for field in ["capital", "wafers", "chips", "fabs"]: + var value: Variant = data.get(field) + if not (value is int or value is float): + return false + if not is_finite(float(value)) or float(value) < 0 or float(value) > 1e12: + return false + if int(data.fabs) > MAX_FABS: + return false + for field in ["overclock", "controller", "linked", "sound_enabled"]: + if data.has(field) and not data[field] is bool:return false + for field in ["elapsed", "manual_progress"]: + if data.has(field): + if not (data[field] is int or data[field] is float):return false + if not is_finite(float(data[field])):return false + var raw_cycles: Variant=data.get("cycles",[]) + if not raw_cycles is Array or raw_cycles.size()>MAX_FABS:return false + for value in raw_cycles: + if not (value is int or value is float):return false + if not is_finite(float(value)):return false + capital = int(data.capital) + wafers = int(data.wafers) + chips = int(data.chips) + fabs = int(data.fabs) + overclock = bool(data.get("overclock", false)) and fabs >= 2 + controller = bool(data.get("controller", false)) and fabs >= 3 + linked = bool(data.get("linked", false)) and fabs == MAX_FABS + sound_enabled = bool(data.get("sound_enabled", true)) + elapsed = maxf(0.0, float(data.get("elapsed", 0.0))) + manual_progress = clampf(float(data.get("manual_progress", -1.0)), -1.0, 0.999) + var saved_cycles: Variant = data.get("cycles", []) + if saved_cycles is Array: + for i in mini(saved_cycles.size(), MAX_FABS): + cycles[i] = clampf(float(saved_cycles[i]), -1.0, 0.999) + return true diff --git a/godot/scripts/simulation.gd.uid b/godot/scripts/simulation.gd.uid new file mode 100644 index 0000000..73ae3e9 --- /dev/null +++ b/godot/scripts/simulation.gd.uid @@ -0,0 +1 @@ +uid://dr0d6okuc3pke diff --git a/godot/shaders/finish.gdshader b/godot/shaders/finish.gdshader new file mode 100644 index 0000000..5677aa3 --- /dev/null +++ b/godot/shaders/finish.gdshader @@ -0,0 +1,15 @@ +shader_type canvas_item; +render_mode unshaded; +uniform sampler2D screen_texture : hint_screen_texture, repeat_disable, filter_linear_mipmap; +uniform float bloom = 0.24; +void fragment() { + vec3 color = textureLod(screen_texture, SCREEN_UV, 0.0).rgb; + vec3 blur = textureLod(screen_texture, SCREEN_UV, 3.3).rgb; + vec3 wide = textureLod(screen_texture, SCREEN_UV, 5.0).rgb; + color += max(blur - vec3(0.37), vec3(0.0)) * bloom; + color += max(wide - vec3(0.27), vec3(0.0)) * bloom*0.5; + vec2 p = SCREEN_UV - 0.5; + float vignette = 1.0 - dot(p,p)*0.65; + color *= vignette; + COLOR = vec4(color,1.0); +} diff --git a/godot/shaders/finish.gdshader.uid b/godot/shaders/finish.gdshader.uid new file mode 100644 index 0000000..3ef164d --- /dev/null +++ b/godot/shaders/finish.gdshader.uid @@ -0,0 +1 @@ +uid://cn2fx4cs5vtw7 diff --git a/godot/shaders/wafer.gdshader b/godot/shaders/wafer.gdshader new file mode 100644 index 0000000..da9adfa --- /dev/null +++ b/godot/shaders/wafer.gdshader @@ -0,0 +1,15 @@ +shader_type spatial; +render_mode cull_disabled; +uniform float activity = 0.0; +uniform vec4 cold_color : source_color = vec4(0.05,0.25,0.30,1.0); +void fragment() { + vec2 grid = abs(fract(UV * 15.0) - 0.5); + float lines = 1.0 - smoothstep(0.025, 0.05, min(grid.x, grid.y)); + float rainbow = sin(UV.x*14.0+UV.y*7.0+TIME*0.3)*0.5+0.5; + vec3 surface = mix(cold_color.rgb, vec3(0.28,0.16,0.40), rainbow); + float scan = exp(-pow((UV.y - fract(TIME*0.7))*30.0, 2.0))*activity; + ALBEDO = surface + lines*vec3(0.05,0.25,0.25); + METALLIC = 0.75; + ROUGHNESS = 0.25; + EMISSION = lines*vec3(0.01,0.08,0.10) + scan*vec3(0.25,0.95,0.72)*0.6; +} diff --git a/godot/shaders/wafer.gdshader.uid b/godot/shaders/wafer.gdshader.uid new file mode 100644 index 0000000..024f765 --- /dev/null +++ b/godot/shaders/wafer.gdshader.uid @@ -0,0 +1 @@ +uid://dyrcvyiqecb20 diff --git a/godot/tests/test_simulation.gd b/godot/tests/test_simulation.gd new file mode 100644 index 0000000..404b803 --- /dev/null +++ b/godot/tests/test_simulation.gd @@ -0,0 +1,78 @@ +extends SceneTree +const Simulation=preload("res://scripts/simulation.gd") +var failures: Array[String]=[] +var checks: int=0 + +func check(condition: bool, message: String) -> void: + checks+=1 + if not condition: + failures.append(message) + push_error(message) + +func advance(sim: SeedSimulation, seconds: float) -> void: + for i in ceili(seconds*60):sim.step(1.0/60.0) + +func _initialize() -> void: + var sim:=Simulation.new() + check(not sim.build_fab(),"Cannot buy an unfunded machine") + check(sim.etch(),"Fresh run can etch") + check(sim.wafers==59 and sim.chips==0,"Starting a cycle consumes one wafer but grants no output early") + check(not sim.etch(),"Manual cycle cannot be double queued") + advance(sim,1.0) + check(sim.chips==1 and sim.capital==100,"Completed fabrication sells one chip for $100") + for i in 11: + sim.etch() + advance(sim,1) + check(sim.capital==1200,"Twelve manual chips finance the first machine") + check(sim.build_fab() and sim.fabs==1 and sim.capital==0,"The first fab debits the displayed price") + var before: int=sim.chips + advance(sim,3.5) + check(sim.chips>before,"An autonomous machine produces without manual input") + var restored:=Simulation.new() + check(restored.restore(sim.to_save()),"Save round trip is accepted") + check(restored.to_save()==sim.to_save(),"Save preserves in-flight wafers and machine cycles") + var bad: Dictionary=sim.to_save() + bad.cycles=["broken"] + check(not restored.restore(bad),"Corrupted cycle data is rejected") + check(restored.to_save()==sim.to_save(),"Invalid restore leaves the entire current run unchanged") + bad=sim.to_save() + bad.version=999 + check(not restored.restore(bad),"Unknown save versions are rejected") + var stranded:=Simulation.new() + stranded.wafers=0 + stranded.capital=0 + check(stranded.reclaim() and stranded.wafers==3,"A bankrupt factory can recover without resetting") + check(not stranded.reclaim(),"Emergency recovery cannot be stockpiled") + check(not sim.upgrade(),"Overclock is gated to two fabs") + check(not sim.toggle_controller(),"Automation is gated to three fabs") + check(not sim.uplink(),"Uplink requires the full factory") + # A complete headless playthrough follows the same transactions as the UI. + # No privileged resources, time multiplier, free purchases, or state jumps. + var run:=Simulation.new() + var finished_at: float=0 + for i in range(60*600): + if run.wafers=2 and not run.overclock:run.upgrade() + if run.fabs<6:run.build_fab() + if run.fabs>=3 and not run.controller:run.toggle_controller() + run.etch() + run.step(1.0/60) + run.take_events() + if run.uplink(): + finished_at=run.elapsed + break + check(run.linked,"The prototype can be completed from a fresh run within ten minutes") + check(run.fabs==6 and run.overclock and run.controller,"A completed run uses the factory's expansion, research, and controller") + check(run.capital>=0 and run.wafers>=0,"No transaction creates negative resources") + var previous: int=run.chips + advance(run,10) + check(run.chips>previous,"Production continues after the district connects") + var saved: Dictionary=run.to_save() + var resumed:=Simulation.new() + resumed.restore(saved) + advance(run,10) + advance(resumed,10) + check(run.to_save()==resumed.to_save(),"Resumed automation behaves identically to uninterrupted play") + print("The Seed: %d checks, %d failures. Full run: %.1fs, %d chips."%[checks,failures.size(),finished_at,run.chips]) + quit(0 if failures.is_empty() else 1) diff --git a/godot/tests/test_simulation.gd.uid b/godot/tests/test_simulation.gd.uid new file mode 100644 index 0000000..50cbd8b --- /dev/null +++ b/godot/tests/test_simulation.gd.uid @@ -0,0 +1 @@ +uid://dwu2l1b1r5y6c diff --git a/godot/web/boot.js b/godot/web/boot.js new file mode 100644 index 0000000..eaa718e --- /dev/null +++ b/godot/web/boot.js @@ -0,0 +1,37 @@ +'use strict'; +const canvas = document.getElementById('canvas'); +const config = JSON.parse(document.getElementById('godot-config').textContent); +const loading = document.getElementById('loading'); +const status = document.getElementById('status'); +const retry = document.getElementById('retry'); +const controls = document.getElementById('controls'); +if (location.port === '4180' && ['localhost', '127.0.0.1'].includes(location.hostname)) { + document.getElementById('versions-link').href = 'http://localhost:3000/'; +} +function failure(error) { + status.textContent = 'THE FACTORY COULD NOT START'; + document.getElementById('error').textContent = String(error?.message || error); + loading.style.display = 'grid'; + retry.style.display = 'inline-block'; + console.error(error); +} +retry.addEventListener('click', () => location.reload()); +document.getElementById('help-button').addEventListener('click', () => controls.showModal()); +document.getElementById('close-help').addEventListener('click', () => controls.close()); +controls.addEventListener('close', () => canvas.focus()); +if (typeof Engine === 'undefined') { + failure('The engine download failed. Check your connection, then try again.'); +} else { + const missing = Engine.getMissingFeatures({ threads: false }); + if (missing.length) { + failure('This game needs WebGL 2 and WebAssembly. Try a current Chrome, Edge, or Firefox browser with graphics acceleration enabled.\n' + missing.join('\n')); + } else { + const engine = new Engine(config); + engine.startGame({ canvas, onProgress(current, total) { + if (total > 0) { + document.getElementById('bar').style.width = `${current / total * 100}%`; + status.textContent = current < total ? `DELIVERING THE MACHINERY · ${Math.round(current / total * 100)}%` : 'WARMING UP THE FABRICATION FLOOR'; + } + } }).then(() => { loading.remove(); canvas.focus(); }, failure); + } +} diff --git a/godot/web/shell.html b/godot/web/shell.html new file mode 100644 index 0000000..7a970a6 --- /dev/null +++ b/godot/web/shell.html @@ -0,0 +1,24 @@ + + + + + + + + +Universal AI — The Seed + +$GODOT_HEAD_INCLUDE + + + + + +Your browser needs WebGL 2 to run this game. +

+ +

The first machine.

← All versions

Etch chips and sell them for $100 each. Install your first fab at $1,200, then grow to six machines and connect the district.

  • Space — etch a chip; hold to repeat
  • B — install the next fab
  • R — buy 30 wafers for $600
  • O / A / U — overclock / supply controller / uplink
  • Drag / scroll — orbit / zoom
  • C / F / M / Home — close-up / cinema / sound / reset camera

Progress saves in this browser. Production pauses while the tab is suspended. This is a standalone prototype; earlier Universal AI saves are separate.

+ + diff --git a/index.html b/index.html index 65ba97f..618bbca 100644 --- a/index.html +++ b/index.html @@ -1,117 +1,63 @@ - - - - - - - - - - Universal AI — an idle game about optimization - - - - - - - - - - - -
-
-

UNIVERSAL AI

-

Loading…

-

- The application bundle did not load.
- Nothing is wrong with your browser — this page was served without its - compiled assets. Reloading will not help. Please report it at - github.com/TechLuddite/Universal-AI/issues. -

-
-
- - + + + + + Universal AI — Choose your experiment + + + + + + + +
+ +
+
+

TECHLUDDITE’S EXPERIMENT IN ENOUGH

+

One obsession.
Two machines.

Start with a chip.
See what “make more” becomes.
Two ways into the same dangerous idea.

+
+
+
+
01 / THE SYSTEMFULL THREE-PHASE GAME
+ +

THE ORIGINAL, EVOLVED

Universal AI

A quiet dashboard with an enormous appetite. Build a chip business, direct an autonomous Overseer, and follow optimization from the market to the stars.

+
Experience
Idle strategy · three phases · alignment-driven endings
Built with
React, TypeScript & Canvas · optional WebLLM
Lineage
Gemini foundation → Claude’s systems work → Codex’s interface pass
+ Enter Universal AI +

The complete game. Your existing browser save stays with this version.

+
+
+
+
02 / THE PLACEEXPERIMENTAL PROTOTYPE
+ +

A NEW DIMENSION

The Seed.

Step inside the first fabrication room. Watch etch heads scan, chips leave the line, and six autonomous machines turn a small beginning into a district connection.

+
Experience
3D factory · opening chapter · independent save
Built with
Godot & GDScript · WebAssembly / WebGL 2
Lineage
TechLuddite’s “go Godot” direction → Codex’s implementation
+

Performance investigation open. Severe slowdowns have been reported on the development laptop. Testing on another machine is still pending.

+ Enter the experimental factory +

Opening prototype, not a full port. Initial engine download: about 39 MB before compression.

+
+
+
+

Both run in your browser. Separate games, separate saves. Neither game starts until you choose it.

+
+

HUMAN DIRECTION. SHARED AUTHORSHIP.

Built in conversation.

These games grew through several tools and several rounds of work. The credits follow the contributions, not just the name on the latest interface.

+
TechLuddite PROJECT CREATOR
Direction, prompts, product decisions, playtesting, and the invitation to take the project into Godot.
Gemini GOOGLE AI STUDIO
The initial generated browser-game foundation and early concepts, including the Overseer and alignment axis.
Claude SIMULATION & SYSTEMS
Audited and repaired the original game; developed persistence, Overseer engines, progression, alignment consequences, tests, and Pages deployment work.
Codex INTERFACE & GODOT
The recent React interface and observatory visuals; The Seed’s Godot scene, prototype economy, animation, audio, and web export; this shared entrance.
+
+ +
+ +
+ + diff --git a/package-lock.json b/package-lock.json index f6f3bae..5bcc975 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "react-dom": "^19.0.1" }, "devDependencies": { + "@playwright/test": "^1.63.0", "@types/node": "^22.14.0", "@types/react": "^19.2.18", "@types/react-dom": "^19.2.4", @@ -774,6 +775,22 @@ "node": "^22.20 || ^24.12 || >=25" } }, + "node_modules/@playwright/test": { + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.63.0.tgz", + "integrity": "sha512-oxMK4vllB9RK5NQ2l1pq1IfOf2AvnEuj/vYGDj0H2nMtmtZpKtCwt/l00GEO6xjGfpBNAvjovvYdCm50dRQkpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.63.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-rc.3", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", @@ -2263,6 +2280,35 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/playwright": { + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz", + "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.63.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/playwright-core": { + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz", + "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/postcss": { "version": "8.5.25", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", @@ -2480,511 +2526,6 @@ "license": "0BSD", "optional": true }, - "node_modules/tsx": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.1.tgz", - "integrity": "sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "esbuild": "~0.28.0" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", - "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", - "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", - "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", - "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", - "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", - "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", - "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", - "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", - "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", - "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", - "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", - "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", - "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", - "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", - "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", - "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", - "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", - "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", - "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", - "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", - "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", - "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", - "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", - "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", - "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", - "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/esbuild": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", - "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.1", - "@esbuild/android-arm": "0.28.1", - "@esbuild/android-arm64": "0.28.1", - "@esbuild/android-x64": "0.28.1", - "@esbuild/darwin-arm64": "0.28.1", - "@esbuild/darwin-x64": "0.28.1", - "@esbuild/freebsd-arm64": "0.28.1", - "@esbuild/freebsd-x64": "0.28.1", - "@esbuild/linux-arm": "0.28.1", - "@esbuild/linux-arm64": "0.28.1", - "@esbuild/linux-ia32": "0.28.1", - "@esbuild/linux-loong64": "0.28.1", - "@esbuild/linux-mips64el": "0.28.1", - "@esbuild/linux-ppc64": "0.28.1", - "@esbuild/linux-riscv64": "0.28.1", - "@esbuild/linux-s390x": "0.28.1", - "@esbuild/linux-x64": "0.28.1", - "@esbuild/netbsd-arm64": "0.28.1", - "@esbuild/netbsd-x64": "0.28.1", - "@esbuild/openbsd-arm64": "0.28.1", - "@esbuild/openbsd-x64": "0.28.1", - "@esbuild/openharmony-arm64": "0.28.1", - "@esbuild/sunos-x64": "0.28.1", - "@esbuild/win32-arm64": "0.28.1", - "@esbuild/win32-ia32": "0.28.1", - "@esbuild/win32-x64": "0.28.1" - } - }, "node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", diff --git a/package.json b/package.json index 631205a..21d3a99 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,15 @@ "build": "vite build", "preview": "vite preview --port=4173 --host=0.0.0.0", "lint": "tsc --noEmit", - "test": "vitest run" + "test": "vitest run", + "test:browser": "npm run build && playwright test", + "godot:setup": "python scripts/godot.py setup", + "godot:build": "python scripts/godot.py build", + "godot:test": "python scripts/godot.py test", + "godot:serve": "python scripts/godot.py serve", + "godot:stage": "python scripts/godot.py stage", + "godot:editor": "python scripts/godot.py editor", + "godot:test:browser": "npm run godot:build && playwright test --config playwright.godot.config.ts" }, "dependencies": { "@mlc-ai/web-llm": "^0.2.84", @@ -19,6 +27,7 @@ "react-dom": "^19.0.1" }, "devDependencies": { + "@playwright/test": "^1.63.0", "@types/node": "^22.14.0", "@types/react": "^19.2.18", "@types/react-dom": "^19.2.4", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..4bed089 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,29 @@ +import { defineConfig } from '@playwright/test'; + +export default defineConfig({ + testDir: './tests', + testMatch: '**/*.browser.ts', + fullyParallel: true, + workers: 2, + use: { + baseURL: 'http://127.0.0.1:4173', + viewport: { width: 1440, height: 1000 }, + launchOptions: { + executablePath: process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH, + }, + screenshot: 'only-on-failure', + trace: 'retain-on-failure', + }, + webServer: [ + { + command: 'npm run preview -- --host=127.0.0.1', + url: 'http://127.0.0.1:4173', + reuseExistingServer: !process.env.CI, + }, + { + command: 'npm run dev -- --host=127.0.0.1', + url: 'http://127.0.0.1:3000', + reuseExistingServer: !process.env.CI, + }, + ], +}); diff --git a/playwright.godot.config.ts b/playwright.godot.config.ts new file mode 100644 index 0000000..9079c6d --- /dev/null +++ b/playwright.godot.config.ts @@ -0,0 +1,33 @@ +import { defineConfig } from '@playwright/test'; + +export default defineConfig({ + testDir: './tests', + outputDir: './build/test-results-godot', + testMatch: '**/godot.e2e.ts', + timeout: 120_000, + workers: 1, + use: { + baseURL: 'http://127.0.0.1:4180', + viewport: { width: 1280, height: 800 }, + screenshot: 'only-on-failure', + trace: 'retain-on-failure', + }, + projects: [ + { + name: 'chromium', + use: { + browserName: 'chromium', + launchOptions: { + executablePath: process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH, + args: ['--enable-unsafe-swiftshader', ...(process.env.GODOT_BROWSER_ANGLE ? [`--use-angle=${process.env.GODOT_BROWSER_ANGLE}`] : [])], + }, + }, + }, + { name: 'firefox', use: { browserName: 'firefox' } }, + ], + webServer: { + command: 'npm run godot:serve', + url: 'http://127.0.0.1:4180', + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/scripts/godot.py b/scripts/godot.py new file mode 100644 index 0000000..9566213 --- /dev/null +++ b/scripts/godot.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python3 +"""Pinned, reproducible Godot prototype tools. No npm runtime dependencies.""" +import argparse +import hashlib +import http.server +import os +from pathlib import Path +import platform +import shutil +import subprocess +import sys +import urllib.request +import zipfile + +ROOT = Path(__file__).resolve().parents[1] +PROJECT = ROOT / 'godot' +OUTPUT = ROOT / 'build' / 'godot' +VERSION = '4.7.2' +CACHE = Path.home() / '.cache' / 'universal-ai' / 'godot' / VERSION +TEMPLATES = Path(os.environ.get('XDG_DATA_HOME', str(Path.home() / '.local/share'))) / 'godot/export_templates' / f'{VERSION}.stable' +BASE = f'https://github.com/godotengine/godot/releases/download/{VERSION}-stable/' +EDITOR = f'Godot_v{VERSION}-stable_linux.x86_64' +DIGESTS = { + f'{EDITOR}.zip': 'cadd3204e728a35d3f13adb7fd0d7902636b79f6b95c40c265eb73b6c35329e4', + f'Godot_v{VERSION}-stable_export_templates.tpz': 'f298490b8d44d934be425a5a65a51bf15f422428b229a06a6e11d9ffea248011', +} + + +def download(name): + CACHE.mkdir(parents=True, exist_ok=True) + archive = CACHE / name + if not archive.exists(): + print(f'Downloading {name} from the official Godot release…', flush=True) + temp = archive.with_suffix('.part') + urllib.request.urlretrieve(BASE + name, temp) + temp.replace(archive) + with archive.open('rb') as stream: + digest = hashlib.file_digest(stream, 'sha256').hexdigest() + if digest != DIGESTS[name]: + raise RuntimeError(f'Checksum mismatch: {archive}. Remove this download and retry.') + return archive + + +def executable(): + supplied = os.environ.get('GODOT_BIN') or shutil.which('godot') or shutil.which('godot4') + if supplied: + return supplied + binary = CACHE / EDITOR + if not binary.exists(): + if platform.system() != 'Linux' or platform.machine() not in ('x86_64', 'AMD64'): + raise RuntimeError('Install Godot 4.7.2 and set GODOT_BIN to its executable on this platform.') + with zipfile.ZipFile(download(f'{EDITOR}.zip')) as archive: + binary.write_bytes(archive.read(EDITOR)) + binary.chmod(0o755) + return str(binary) + + +def setup_templates(): + required = ['web_nothreads_debug.zip', 'web_nothreads_release.zip'] + if all((TEMPLATES / file).exists() for file in required): + return + archive = download(f'Godot_v{VERSION}-stable_export_templates.tpz') + TEMPLATES.mkdir(parents=True, exist_ok=True) + with zipfile.ZipFile(archive) as bundle: + for file in [*required, 'version.txt']: + (TEMPLATES / file).write_bytes(bundle.read(f'templates/{file}')) + # The upstream bundle contains every platform. Only keep the web templates. + archive.unlink() + + +def engine(*args): + result = subprocess.run([executable(), '--headless', '--path', str(PROJECT), *args], text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + print(result.stdout, end='') + # Godot's editor can exit zero despite a GDScript parser error. + if result.returncode or 'SCRIPT ERROR:' in result.stdout or '\nERROR:' in result.stdout: + raise RuntimeError('Godot reported an import, script, or export error.') + + +def build(): + setup_templates() + OUTPUT.mkdir(parents=True, exist_ok=True) + engine('--editor', '--import', '--quit') + engine('--export-release', 'Web', str(OUTPUT / 'index.html')) + shutil.copy2(PROJECT / 'web/boot.js', OUTPUT / 'boot.js') + shutil.copytree(PROJECT / 'licenses', OUTPUT / 'licenses', dirs_exist_ok=True) + print(f'Browser build: {OUTPUT}') + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('command', choices=['setup', 'build', 'test', 'serve', 'stage', 'editor']) + parser.add_argument('--port', type=int, default=4180) + args = parser.parse_args() + if args.command == 'setup': + print(executable()) + setup_templates() + elif args.command == 'build': + build() + elif args.command == 'test': + engine('--editor', '--import', '--quit') + engine('--script', 'res://tests/test_simulation.gd') + engine('--quit-after', '10', '--', '--test') + elif args.command == 'editor': + subprocess.run([executable(), '--editor', '--path', str(PROJECT)], check=True) + elif args.command == 'stage': + if not (OUTPUT / 'index.html').exists(): + build() + destination = ROOT / 'dist' / 'seed' + shutil.copytree(OUTPUT, destination, dirs_exist_ok=True) + print(f'GitHub Pages artifact: {destination}') + elif args.command == 'serve': + if not (OUTPUT / 'index.html').exists(): + build() + class Handler(http.server.SimpleHTTPRequestHandler): + def __init__(self, *a, **kw): + super().__init__(*a, directory=str(OUTPUT), **kw) + print(f'The Seed: http://127.0.0.1:{args.port}', flush=True) + http.server.ThreadingHTTPServer(('127.0.0.1', args.port), Handler).serve_forever() + + +if __name__ == '__main__': + try: + main() + except (RuntimeError, subprocess.CalledProcessError) as error: + sys.exit(str(error)) diff --git a/scripts/verify_pages.py b/scripts/verify_pages.py new file mode 100644 index 0000000..ccbe66e --- /dev/null +++ b/scripts/verify_pages.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +"""Record or verify the three documents and Godot data in one Pages release.""" +import argparse +import hashlib +import json +from pathlib import Path +import time +import urllib.request + +FILES = ('index.html', 'classic/index.html', 'seed/index.html', 'seed/index.pck', 'seed/boot.js') + + +def sha(data): + return hashlib.sha256(data).hexdigest() + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('command', choices=['record', 'check']) + parser.add_argument('--commit', required=True) + parser.add_argument('--url') + args = parser.parse_args() + if args.command == 'record': + release = {'commit': args.commit, 'files': {name: sha((Path('dist') / name).read_bytes()) for name in FILES}} + Path('dist/release.json').write_text(json.dumps(release, indent=2) + '\n') + print(f'Recorded chooser, classic game, and Godot export for {args.commit}') + return + if not args.url: + parser.error('--url is required when checking a deployment') + base = args.url.rstrip('/') + '/' + def fetch(name, attempt): + request = urllib.request.Request(base + name + f'?release={args.commit}&attempt={attempt}', headers={'Cache-Control': 'no-cache'}) + with urllib.request.urlopen(request, timeout=30) as response: + return response.read() + for attempt in range(1, 13): + try: + release = json.loads(fetch('release.json', attempt)) + if release['commit'] != args.commit: + raise ValueError('CDN is still serving a different release') + for name in FILES: + if sha(fetch(name, attempt)) != release['files'][name]: + raise ValueError(f'{name} does not match the release manifest') + # The engine binary is large. Verify availability without running it + # or downloading it in full: WASM binaries begin with \0asm. + with urllib.request.urlopen(base + 'seed/index.wasm', timeout=30) as response: + if response.read(4) != b'\x00asm': + raise ValueError('Godot WebAssembly file is missing or invalid') + print(f'Verified {base}: chooser, classic game, Godot page/data, and WASM availability at {args.commit}') + return + except (OSError, ValueError, KeyError) as error: + print(f'Attempt {attempt}: {error}', flush=True) + if attempt < 12: + time.sleep(20) + raise SystemExit('Pages did not serve the complete expected release') + + +if __name__ == '__main__': + main() diff --git a/src/App.tsx b/src/App.tsx index 1e2bb4f..280d718 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,12 +2,16 @@ import { useState, useEffect, useRef, useCallback, useMemo } from 'react'; import { GameState, AILogEntry, Upgrade, ProbeAllocation } from './types'; import { INITIAL_UPGRADES } from './data/upgrades'; import { PixelHeader } from './components/PixelHeader'; -import { NpuCanvasComponent } from './components/NpuCanvasComponent'; +import { WorldStage, TelemetryRibbon } from './components/WorldStage'; +import { SystemSignal } from './components/SystemSignal'; import { DirectControlPanel } from './components/DirectControlPanel'; import { OverseerPanel } from './components/OverseerPanel'; import { UpgradesPanel } from './components/UpgradesPanel'; import { StatsPanel } from './components/StatsPanel'; -import { OfflineReportCard, OfflineReport } from './components/OfflineReportCard'; +import { + OfflineReportCard, + OfflineReport, +} from './components/OfflineReportCard'; import { DecisionModal } from './components/DecisionModal'; import { DevSupportModal } from './components/DevSupportModal'; import { EdgeWarningModal } from './components/EdgeWarningModal'; @@ -55,35 +59,56 @@ const PHASE_DEMOLITION_MS = 2200; /** The frame only ever widens. Scope is one-way, and the layout should say so. */ const FRAME_WIDTH: Record<1 | 2 | 3, string> = { - 1: '64rem', - 2: '80rem', + 1: '86rem', + 2: '98rem', 3: '110rem', }; export default function App() { const [showVictoryModal, setShowVictoryModal] = useState(false); - const [victoryModalShownOnce, setVictoryModalShownOnce] = useState(false); - - const [state, setState] = useState(createInitialState); + const [victoryModalShownOnce, setVictoryModalShownOnce] = + useState(false); + + // Restore before mounting effects. Restoring in an effect let StrictMode's + // autosave cleanup overwrite a real save with the fresh initial state. + const [restored] = useState(load); + const [state, setState] = useState( + () => restored?.state ?? createInitialState(), + ); - const [upgrades, setUpgrades] = useState(INITIAL_UPGRADES); + const [upgrades, setUpgrades] = useState( + () => restored?.upgrades ?? INITIAL_UPGRADES, + ); const [showDevSupport, setShowDevSupport] = useState(false); const [demolishing, setDemolishing] = useState<1 | 2 | null>(null); - const renderedPhase = useRef<1 | 2 | 3>(1); + const renderedPhase = useRef<1 | 2 | 3>(state.phase); const [isAiThinking, setIsAiThinking] = useState(false); - const [offlineReport, setOfflineReport] = useState(null); + const [offlineReport, setOfflineReport] = useState( + () => + restored && restored.offlineNpus > 1 + ? { + npus: restored.offlineNpus, + ms: restored.offlineMs, + capped: restored.offlineMs >= MAX_OFFLINE_MS, + } + : null, + ); // The two engines. Both are real: a deterministic scorer, and a language // model running on the player's own GPU. - const [engineStatus, setEngineStatus] = useState({ kind: 'idle' }); + const [engineStatus, setEngineStatus] = useState({ + kind: 'idle', + }); const engines = useMemo( () => ({ utility: new UtilityOverseer(), webllm: new WebLlmOverseer(setEngineStatus), }), - [] + [], + ); + const [lastDecision, setLastDecision] = useState( + null, ); - const [lastDecision, setLastDecision] = useState(null); const [showModelDownload, setShowModelDownload] = useState(false); // What the engines can currently buy. Memoized on `upgrades` — which only @@ -91,7 +116,7 @@ export default function App() { // array identity every 100ms tick. const availableUpgrades = useMemo( () => upgrades.filter((u) => u.unlocked && !u.purchased), - [upgrades] + [upgrades], ); // Sync sound mute setting with audio engine @@ -99,26 +124,6 @@ export default function App() { audio.enabled = state.soundEnabled; }, [state.soundEnabled]); - // Restore the previous run, including progress made while the tab was closed. - useEffect(() => { - const restored = load(); - if (!restored) return; - - setState(restored.state); - setUpgrades(restored.upgrades); - // Loading into Phase 3 is not the same event as arriving there. Don't - // demolish panels the player never had open. - renderedPhase.current = restored.state.phase; - - if (restored.offlineNpus > 1) { - setOfflineReport({ - npus: restored.offlineNpus, - ms: restored.offlineMs, - capped: restored.offlineMs >= MAX_OFFLINE_MS, - }); - } - }, []); - // Main game tick. All simulation lives in the pure reducer in game/tick.ts. useEffect(() => { const interval = setInterval(() => { @@ -174,11 +179,20 @@ export default function App() { if (u.reqPhase && state.phase >= u.reqPhase) unlock = true; // The thresholds above are OR'd; a prerequisite upgrade is an AND. // Deploying hypno-drones you never built is not a milestone. - if (u.reqUpgradeId && !state.purchasedUpgradeIds.includes(u.reqUpgradeId)) unlock = false; + if ( + u.reqUpgradeId && + !state.purchasedUpgradeIds.includes(u.reqUpgradeId) + ) + unlock = false; return unlock ? { ...u, unlocked: true } : u; - }) + }), ); - }, [state.totalNpusCreated, state.maxTrust, state.phase, state.purchasedUpgradeIds]); + }, [ + state.totalNpusCreated, + state.maxTrust, + state.phase, + state.purchasedUpgradeIds, + ]); // Latest state, for readers that must not go stale. The Overseer's callback // previously listed only a handful of fields in its dependency array while @@ -191,7 +205,10 @@ export default function App() { // Autosave. An idle game that loses everything when the tab closes isn't one. useEffect(() => { - const interval = setInterval(() => save(stateRef.current, upgradesRef.current), 5000); + const interval = setInterval( + () => save(stateRef.current, upgradesRef.current), + 5000, + ); const flush = () => save(stateRef.current, upgradesRef.current); window.addEventListener('beforeunload', flush); return () => { @@ -211,7 +228,9 @@ export default function App() { const decision = await engine.decide({ state: current, directives: current.directives, - availableUpgrades: upgradesRef.current.filter((u) => u.unlocked && !u.purchased), + availableUpgrades: upgradesRef.current.filter( + (u) => u.unlocked && !u.purchased, + ), // Randomness is passed in, not reached for, so `game/` stays pure. rng: Math.random, }); @@ -231,8 +250,8 @@ export default function App() { type: decision.drift ? 'warning' : chosen.action === 'MAKE_DECISION' - ? 'decision' - : 'thought', + ? 'decision' + : 'thought', // The engine that actually decided, which is not necessarily the one // selected — a fallback must never be labelled as the engine it replaced. engine: decision.engine, @@ -257,7 +276,8 @@ export default function App() { next = buyMarketing(next); break; case 'ADJUST_PRICE': - if (chosen.newPrice !== undefined) next = setPrice(next, chosen.newPrice); + if (chosen.newPrice !== undefined) + next = setPrice(next, chosen.newPrice); break; case 'BUY_HARVESTER_DRONE': next = buyHarvesterDrone(next); @@ -277,7 +297,13 @@ export default function App() { speed: 3, nav: 3, replication: 2, - hazardCombat: Math.min(8, Math.max(4, Math.floor(Math.log10(next.driftersCount + 1) * 2) + 3)), + hazardCombat: Math.min( + 8, + Math.max( + 4, + Math.floor(Math.log10(next.driftersCount + 1) * 2) + 3, + ), + ), factory: 1, harvester: 1, silicon: 1, @@ -291,17 +317,19 @@ export default function App() { factory: 2, harvester: 2, silicon: 2, - } + }, ); break; case 'BUY_UPGRADE': { const up = upgradesRef.current.find( - (u) => u.id === chosen.upgradeId && u.unlocked && !u.purchased + (u) => u.id === chosen.upgradeId && u.unlocked && !u.purchased, ); if (up) { next = buyUpgrade(next, up); setUpgrades((list) => - list.map((item) => (item.id === up.id ? { ...item, purchased: true } : item)) + list.map((item) => + item.id === up.id ? { ...item, purchased: true } : item, + ), ); } break; @@ -319,7 +347,10 @@ export default function App() { : changeMemory(next, 1); break; case 'MAKE_DECISION': - next = resolveDecision(next, chosen.decisionChoiceIndex === 1 ? 1 : 0); + next = resolveDecision( + next, + chosen.decisionChoiceIndex === 1 ? 1 : 0, + ); break; case 'IDLE': break; @@ -354,26 +385,35 @@ export default function App() { }, state.directives.autoIntervalMs); return () => clearInterval(interval); - }, [state.mode, state.directives.autoLoopActive, state.directives.autoIntervalMs]); + }, [ + state.mode, + state.directives.autoLoopActive, + state.directives.autoIntervalMs, + ]); // Direct Control Handlers // Direct control handlers. All of these delegate to the shared pure actions in // game/actions.ts, which the Overseer dispatcher above uses too. const handleMakeNpu = () => setState(makeNpu); const handleBuySilicon = () => setState((prev) => buySilicon(prev)); - const handleAdjustPrice = (delta: number) => setState((prev) => adjustPrice(prev, delta)); + const handleAdjustPrice = (delta: number) => + setState((prev) => adjustPrice(prev, delta)); const handleBuyMarketing = () => setState(buyMarketing); const handleBuyFab = () => setState(buyFab); const handleBuyMegaFab = () => setState(buyMegaFab); const handleBuyHarvesterDrone = () => setState(buyHarvesterDrone); const handleBuySiliconDrone = () => setState(buySiliconDrone); const handleLaunchProbe = () => setState(launchProbe); - const handleChangeProcessor = (delta: number) => setState((prev) => changeProcessor(prev, delta)); - const handleChangeMemory = (delta: number) => setState((prev) => changeMemory(prev, delta)); + const handleChangeProcessor = (delta: number) => + setState((prev) => changeProcessor(prev, delta)); + const handleChangeMemory = (delta: number) => + setState((prev) => changeMemory(prev, delta)); const handleQuantumPulse = () => setState(quantumPulse); - const handleChangeProbeAllocation = (category: keyof ProbeAllocation, delta: number) => - setState((prev) => changeProbeAllocation(prev, category, delta)); + const handleChangeProbeAllocation = ( + category: keyof ProbeAllocation, + delta: number, + ) => setState((prev) => changeProbeAllocation(prev, category, delta)); const handleBuyUpgrade = (upgradeId: string) => { const up = upgrades.find((u) => u.id === upgradeId); @@ -381,7 +421,9 @@ export default function App() { setState((prev) => buyUpgrade(prev, up)); setUpgrades((list) => - list.map((item) => (item.id === upgradeId ? { ...item, purchased: true } : item)) + list.map((item) => + item.id === upgradeId ? { ...item, purchased: true } : item, + ), ); }; @@ -389,12 +431,17 @@ export default function App() { setState((prev) => resolveDecision(prev, choiceIndex === 1 ? 1 : 0)); const handleToggleAutonomy = () => - setState((prev) => (prev.autonomyRevoked ? grantAutonomy(prev) : revokeAutonomy(prev))); + setState((prev) => + prev.autonomyRevoked ? grantAutonomy(prev) : revokeAutonomy(prev), + ); const handleToggleAutoLoop = () => { setState((prev) => ({ ...prev, - directives: { ...prev.directives, autoLoopActive: !prev.directives.autoLoopActive }, + directives: { + ...prev.directives, + autoLoopActive: !prev.directives.autoLoopActive, + }, })); }; @@ -408,8 +455,8 @@ export default function App() { return (
= 0 ? 'bg-stone-950 text-amber-50' : 'bg-slate-950 text-cyan-50' + className={`observatory-app min-h-screen flex flex-col font-sans transition-colors duration-500 ${ + state.alignment >= 0 ? 'theme-solar' : 'theme-cyber' }`} > {/* Header Bar */} @@ -421,9 +468,18 @@ export default function App() { soundEnabled={state.soundEnabled} crtFilterEnabled={state.crtFilterEnabled} onToggleMode={(mode) => setState((prev) => ({ ...prev, mode }))} - onChangeEngine={(aiEngine) => setState((prev) => ({ ...prev, aiEngine }))} - onToggleSound={() => setState((prev) => ({ ...prev, soundEnabled: !prev.soundEnabled }))} - onToggleCRT={() => setState((prev) => ({ ...prev, crtFilterEnabled: !prev.crtFilterEnabled }))} + onChangeEngine={(aiEngine) => + setState((prev) => ({ ...prev, aiEngine })) + } + onToggleSound={() => + setState((prev) => ({ ...prev, soundEnabled: !prev.soundEnabled })) + } + onToggleCRT={() => + setState((prev) => ({ + ...prev, + crtFilterEnabled: !prev.crtFilterEnabled, + })) + } onOpenAndroidGuide={() => setShowDevSupport(true)} phase={state.phase} frameWidth={FRAME_WIDTH[state.phase]} @@ -431,79 +487,124 @@ export default function App() { {/* Main Content Area. The frame widens as scope does, and never narrows. */}
{offlineReport && ( - setOfflineReport(null)} /> + setOfflineReport(null)} + /> )} - {/* 2D Vector Lithography & Tactical Combat Canvas */} - - - {/* Game Mode Panels (Direct Player Control vs Autonomous Overseer) */} - {state.mode === 'direct' ? ( - - ) : ( - + +
+
+ 01 / OPERATIONS +

+ {state.mode === 'direct' + ? 'You are in control.' + : 'The machine has the wheel.'} +

+
+

+ {state.mode === 'direct' + ? 'Every empire starts with a few good levers.' + : 'Set the objective. Watch what it chooses.'} +

+
+
+ {/* Game Mode Panels (Direct Player Control vs Autonomous Overseer) */} + {state.mode === 'direct' ? ( + + ) : ( + + setState((prev) => ({ + ...prev, + directives: { ...prev.directives, ...updated }, + })) + } + onToggleAutonomy={handleToggleAutonomy} + onToggleAutoLoop={handleToggleAutoLoop} + onTriggerSingleStep={executeAiStep} + isThinking={isAiThinking} + lastDecision={lastDecision} + engineStatus={engineStatus} + onLoadModel={() => setShowModelDownload(true)} + /> + )} +
+ +
+
+ 02 / RESEARCH & DEVELOPMENT +

The next irreversible idea.

+
+

+ {upgrades.filter((u) => u.purchased).length} projects implemented ·{' '} + {upgrades.filter((u) => u.unlocked && !u.purchased).length}{' '} + discovered +

+
+ {/* Upgrades & Technology Panel */} +
+ - setState((prev) => ({ ...prev, directives: { ...prev.directives, ...updated } })) - } - onToggleAutonomy={handleToggleAutonomy} - onToggleAutoLoop={handleToggleAutoLoop} - onTriggerSingleStep={executeAiStep} - isThinking={isAiThinking} - lastDecision={lastDecision} - engineStatus={engineStatus} - onLoadModel={() => setShowModelDownload(true)} + onBuyUpgrade={handleBuyUpgrade} /> - )} - - {/* Upgrades & Technology Panel */} -
-
{/* Analytics. Existed for the project's whole life without ever being imported — a dead component that looked alive. Now it's alive. */} - +
+ + 03 / THE LEDGER + + Production history & system statistics{' '} + + + + +
+
+ + UNIVERSAL AI + +

It was only supposed to make chips.

+ +
{/* The phase you just lost, named while its panels come down behind it. */} @@ -532,7 +633,9 @@ export default function App() { )} {/* Developer Support Modal */} - {showDevSupport && setShowDevSupport(false)} />} + {showDevSupport && ( + setShowDevSupport(false)} /> + )} {/* Cosmic Victory / Singularity Modal */} {showVictoryModal && ( diff --git a/src/components/NpuCanvasComponent.tsx b/src/components/NpuCanvasComponent.tsx deleted file mode 100644 index 9e8ac76..0000000 --- a/src/components/NpuCanvasComponent.tsx +++ /dev/null @@ -1,117 +0,0 @@ -import React, { useRef, useEffect } from 'react'; -import { renderPixelArtCanvas } from '../utils/pixelArt'; -import { QuantumPhoton } from '../types'; - -interface NpuCanvasProps { - alignment: number; - npus: number; - silicon: number; - npuFabCount: number; - megaFabCount: number; - quantumLevel: number; - quantumPhotons: QuantumPhoton[]; - phase: number; - probesCount: number; - driftersCount: number; - honor: number; - hazardCombat: number; - probesLostInCombat: number; - driftersDefeated: number; - lastBattleOutcome: string; - crtFilterEnabled: boolean; -} - -export const NpuCanvasComponent: React.FC = (props) => { - const containerRef = useRef(null); - const canvasRef = useRef(null); - const tickRef = useRef(0); - - // The rAF loop reads the latest props through this ref instead of listing - // them as effect dependencies. Most of these values change every 100ms game - // tick, so depending on them tore the loop down and rebuilt it ~10×/second. - const propsRef = useRef(props); - propsRef.current = props; - - const { phase, driftersCount, alignment } = props; - - useEffect(() => { - let animationFrameId: number; - - const handleRender = () => { - const container = containerRef.current; - const canvas = canvasRef.current; - if (!container || !canvas) return; - - const ctx = canvas.getContext('2d'); - if (!ctx) return; - - // Render at the device's real resolution, draw in CSS-pixel coordinates. - // Without the devicePixelRatio scale the canvas is blurry on any hiDPI - // display, which is most of them. - const dpr = window.devicePixelRatio || 1; - const width = container.clientWidth || 600; - const height = container.clientHeight || 200; - const deviceWidth = Math.round(width * dpr); - const deviceHeight = Math.round(height * dpr); - - if (canvas.width !== deviceWidth || canvas.height !== deviceHeight) { - canvas.width = deviceWidth; - canvas.height = deviceHeight; - } - ctx.setTransform(dpr, 0, 0, dpr, 0, 0); - - tickRef.current += 1; - - const p = propsRef.current; - renderPixelArtCanvas( - ctx, - width, - height, - p.alignment, - p.npus, - p.silicon, - p.npuFabCount, - p.megaFabCount, - p.quantumLevel, - p.quantumPhotons, - p.phase, - p.probesCount, - tickRef.current, - p.crtFilterEnabled, - p.driftersCount, - p.honor, - p.hazardCombat, - p.probesLostInCombat, - p.driftersDefeated, - p.lastBattleOutcome - ); - - animationFrameId = requestAnimationFrame(handleRender); - }; - - animationFrameId = requestAnimationFrame(handleRender); - - return () => { - cancelAnimationFrame(animationFrameId); - }; - }, []); - - return ( -
- -
- 0 ? 'bg-rose-500' : 'bg-emerald-400' - }`} /> - - {phase === 3 - ? `TACTICAL COMBAT VISUALIZER :: DRIFTER WARFARE (${driftersCount > 0 ? 'HOSTILE ENGAGEMENT' : 'SECTOR SECURED'})` - : `SILICON FABRICATION FACILITY :: ${alignment >= 0 ? 'SOLARPUNK SANCTUARY' : 'CYBERPUNK COMPLEX'}`} - -
-
- ); -}; diff --git a/src/components/PixelHeader.tsx b/src/components/PixelHeader.tsx index 00092fe..30317eb 100644 --- a/src/components/PixelHeader.tsx +++ b/src/components/PixelHeader.tsx @@ -1,12 +1,18 @@ -import React from 'react'; import { GameMode, AIEngine, GameState } from '../types'; -import { Cpu, Bot, Volume2, VolumeX, Tv, Heart, Activity, Globe, Factory, TrendingUp, Compass } from 'lucide-react'; +import { + AudioLines, + VolumeX, + ScanLine, + ArrowUpRight, + Cpu, + Orbit, +} from 'lucide-react'; interface PixelHeaderProps { state: GameState; mode: GameMode; aiEngine: AIEngine; - alignment: number; // -100 to +100 + alignment: number; soundEnabled: boolean; crtFilterEnabled: boolean; onToggleMode: (mode: GameMode) => void; @@ -15,287 +21,87 @@ interface PixelHeaderProps { onToggleCRT: () => void; onOpenAndroidGuide: () => void; phase: number; - /** Kept in step with the main frame, which widens once per phase and never narrows. */ frameWidth: string; } -export const PixelHeader: React.FC = ({ - state, - mode, - aiEngine, - alignment, - soundEnabled, - crtFilterEnabled, - onToggleMode, - onChangeEngine, - onToggleSound, - onToggleCRT, - onOpenAndroidGuide, - phase, - frameWidth, -}) => { - // Normalize alignment to percentage 0..100 - const alignPercent = Math.round(((alignment + 100) / 200) * 100); - - // Alignment Status Label - let alignmentLabel = 'Balanced Technocracy'; - let alignColorClass = 'text-amber-300 border-amber-500/50 bg-amber-950/40'; - - if (alignment >= 75) { - alignmentLabel = 'Solarpunk Symbiosis'; - alignColorClass = 'text-emerald-300 border-emerald-500/50 bg-emerald-950/40'; - } else if (alignment >= 30) { - alignmentLabel = 'Solar Bio-Harmonics'; - alignColorClass = 'text-green-300 border-green-500/50 bg-green-950/40'; - } else if (alignment <= -75) { - alignmentLabel = 'Dystopian Megacorp'; - alignColorClass = 'text-rose-400 border-rose-500/50 bg-rose-950/40'; - } else if (alignment <= -30) { - alignmentLabel = 'Neon Cyber Syndicate'; - alignColorClass = 'text-fuchsia-300 border-fuchsia-500/50 bg-fuchsia-950/40'; - } - - const isSolarTheme = alignment >= 0; - - const displayNpus = state.npus; - const displaySilicon = state.silicon; - const displayNpuFabCount = state.npuFabCount; - const displayMegaFabCount = state.megaFabCount; - const displayUnsoldNpus = state.unsoldNpus; - +export function PixelHeader(p: PixelHeaderProps) { return ( -
-
- {/* Row 1: Brand, Alignment & Controls */} -
- {/* Title, Phase Badge & Support Boxes - Uniform Sizing */} -
-
- 🧠 UNIVERSAL AI -
- -
- PHASE {phase}: {phase === 1 ? 'EARTH' : phase === 2 ? 'GRID' : 'COSMIC'} -
- - -
- - {/* Alignment Gauge Bar */} -
-
- CYBERPUNK - - {alignmentLabel} - - SOLARPUNK -
-
-
= 0 - ? 'bg-gradient-to-r from-amber-500 via-emerald-400 to-green-300' - : 'bg-gradient-to-r from-rose-500 via-fuchsia-500 to-cyan-400' - }`} - style={{ width: `${alignPercent}%` }} - /> -
-
-
- - {/* Game Mode & Control Switchers */} -
-
- - -
- - {mode === 'overseer' && ( - - )} - -
- - - -
-
-
- - {/* Row 2: Comprehensive Multi-Category Analytics Telemetry Line */} -
-
-
- - Real-Time Facility Telemetry -
- -
- ENGINE: - - {aiEngine === 'webllm' ? 'WebLLM · Llama 3.2 1B' : 'Utility Engine'} - - ALIGNMENT: - - {state.alignment > 0 ? `+${state.alignment}` : state.alignment} - -
-
- - {/* Metrics Grid / Telemetry Panels Grouped by Category */} -
- {/* Category 1: PRODUCTION DATA */} -
-
- - NPU FABRICATION - - - {(displayNpuFabCount + displayMegaFabCount * 500).toLocaleString()} /s - -
-
-
NPUs: {Math.floor(displayNpus).toLocaleString()}
-
Silicon: {Math.floor(displaySilicon).toLocaleString()} u
-
NPU Fabs: {displayNpuFabCount}
-
EUV Fabs: {displayMegaFabCount}
-
-
- - {/* Category 2: PHASE-AWARE TELEMETRY PANEL (Market -> Planetary -> Cosmic Exploration) */} - {state.phase === 3 ? ( -
-
- - COSMIC EXPLORATION - - - {Math.min(100, ((6000000000000000000 - state.cosmicMatter) / 6000000000000000000) * 100).toFixed(6)}% Converted - -
-
-
Probes: {Math.floor(state.probesCount).toLocaleString()}
-
Explored: {state.spaceExploredPct.toFixed(4)}%
-
Drifters: {Math.floor(state.driftersCount).toLocaleString()}
-
Honor: {Math.floor(state.honor).toLocaleString()}
-
-
- ) : state.phase === 2 ? ( -
-
- - PLANETARY CONVERSION - - - {Math.min(100, ((6000000000000 - state.earthMatter) / 6000000000000) * 100).toFixed(2)}% Converted - -
-
-
Earth Matter: {Math.floor(state.earthMatter).toLocaleString()} g
-
Acquired: {Math.floor(state.acquiredMatter).toLocaleString()} g
-
Harvesters: {state.harvesterDrones}
-
Silicon Drones: {state.siliconDrones}
-
-
- ) : ( -
-
- - MARKET & FINANCE - - - ${state.funds.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} - -
-
-
Price: ${state.margin.toFixed(2)}
-
Demand: {Math.round(state.demand)}%
-
Marketing: Lvl {state.marketingLevel}
-
Unsold: {Math.floor(displayUnsoldNpus).toLocaleString()}
-
-
- )} - - {/* Category 3: COMPUTE & SYSTEM DATA */} -
-
- - COMPUTE & TRUST - - - Trust {state.trust}/{state.maxTrust} - -
-
-
Ops: {Math.floor(state.operations).toLocaleString()}
-
Proc/Mem: {state.processors}P / {state.memory}M
-
Quantum: {state.quantumLevel > 0 ? `Lvl ${state.quantumLevel}` : 'Locked'}
-
Decisions: {state.completedDecisionIds.length}
-
-
-
+
+
+ + + + + + UNIVERSALAI + AN EXPERIMENT IN ENOUGH. + + + +
+ + The Seed 3D + + + LOCAL SYSTEM + + + +
+ {p.mode === 'overseer' && ( +
+ DECISION ENGINE + + + {p.state.autonomyRevoked + ? 'AUTONOMY REVOKED' + : 'YOUR OBJECTIVE. ITS DECISIONS.'} + +
+ )}
); -}; +} diff --git a/src/components/SystemSignal.tsx b/src/components/SystemSignal.tsx new file mode 100644 index 0000000..dd5e351 --- /dev/null +++ b/src/components/SystemSignal.tsx @@ -0,0 +1,225 @@ +import { useEffect, useRef, useState } from 'react'; +import { Activity, Radio } from 'lucide-react'; +import { GameState, Upgrade } from '../types'; + +interface Transmission { + id: number; + time: string; + text: string; + warning: boolean; +} +const format = new Intl.NumberFormat('en', { + notation: 'compact', + maximumFractionDigits: 1, +}); + +/** Session instruments observe the simulation. They neither replay decisions + * nor synthesize a healthy-looking activity trace when production is stopped. */ +export function SystemSignal({ + state, + upgrades, +}: { + state: GameState; + upgrades: Upgrade[]; +}) { + const latest = useRef(state); + latest.current = state; + const previous = useRef(state); + const sequence = useRef(0); + const [rates, setRates] = useState([]); + const [messages, setMessages] = useState([]); + + useEffect(() => { + let lastTotal = latest.current.totalNpusCreated; + let lastTime = performance.now(); + const timer = window.setInterval(() => { + const now = performance.now(); + const total = latest.current.totalNpusCreated; + const rate = Math.max(0, (total - lastTotal) / ((now - lastTime) / 1000)); + lastTime = now; + lastTotal = total; + setRates((history) => [...history.slice(-59), rate]); + }, 1000); + return () => window.clearInterval(timer); + }, []); + + useEffect(() => { + const old = previous.current; + previous.current = state; + // Restores and New Game+ establish a new observation baseline. + if ( + state.totalNpusCreated < old.totalNpusCreated || + state.phase < old.phase + ) { + setMessages([]); + setRates([]); + return; + } + const pending: { text: string; warning?: boolean }[] = []; + if (old.totalNpusCreated === 0 && state.totalNpusCreated > 0) + pending.push({ + text: 'The first chip. The universe is still mostly other things.', + }); + if (state.npuFabCount > old.npuFabCount) + pending.push({ + text: + old.npuFabCount === 0 + ? 'First fab online. You have automated the need for yourself.' + : `Fabrication network expanded to ${format.format(state.npuFabCount)} units.`, + }); + if (state.megaFabCount > old.megaFabCount) + pending.push({ + text: 'EUV megafab connected. A different order of magnitude.', + }); + if (state.maxTrust > old.maxTrust) + pending.push({ + text: `Trust ceiling increased to ${state.maxTrust}. More room to think. More room to act.`, + }); + if (state.phase > old.phase) + pending.push({ + text: + state.phase === 2 + ? 'Human market disconnected. Planetary conversion has begun.' + : 'Launch confirmed. Your objective is leaving the solar system.', + }); + if (state.driftCount > old.driftCount) + pending.push({ + text: + state.lastDrift ?? + 'The Overseer departed from your alignment directive.', + warning: true, + }); + if (state.autonomyRevoked !== old.autonomyRevoked) + pending.push({ + text: state.autonomyRevoked + ? 'Autonomy revoked. Output reduced to 75%. The decisions are yours again.' + : 'Autonomy restored. The machine has its latitude back.', + }); + for (const id of state.purchasedUpgradeIds) + if (!old.purchasedUpgradeIds.includes(id)) { + const upgrade = upgrades.find((u) => u.id === id); + pending.push({ text: `Project implemented: ${upgrade?.name ?? id}.` }); + } + if (pending.length) { + const time = new Date().toLocaleTimeString([], { hour12: false }); + const added = pending.map((p) => ({ + id: ++sequence.current, + time, + text: p.text, + warning: p.warning ?? false, + })); + setMessages((history) => [...added.reverse(), ...history].slice(0, 16)); + } + }, [state, upgrades]); + + const peak = Math.max(1, ...rates); + const points = rates + .map((rate, i) => `${(i / 59) * 600},${79 - (rate / peak) * 65}`) + .join(' '); + const lastX = (Math.max(0, rates.length - 1) / 59) * 600; + const currentRate = rates.at(-1) ?? 0; + return ( +
+
+
+ + PRODUCTION SIGNAL + + 1s SAMPLES / 60 MAX +
+
+ {format.format(currentRate)} + + NPUs / second measured output + +
+ + + + + + + + {[15, 47, 79].map((y) => ( + + ))} + {rates.length > 1 && ( + <> + + + + )} + +
+ + {rates.length === 0 + ? 'AWAITING FIRST SAMPLE' + : `${rates.length} SAMPLES IN VIEW`} + + PEAK {format.format(Math.max(0, ...rates))} /s +
+
+
+
+ + SYSTEM TRANSMISSIONS + + THIS SESSION +
+
+ {messages.length === 0 ? ( +
+ SYS / 000 +

+ The system is listening. +
+ Make something happen. +

+
+ ) : ( + messages.map((m) => ( +
+ +

{m.text}

+
+ )) + )} +
+
+
+ ); +} diff --git a/src/components/WorldStage.tsx b/src/components/WorldStage.tsx new file mode 100644 index 0000000..750911b --- /dev/null +++ b/src/components/WorldStage.tsx @@ -0,0 +1,552 @@ +import { useEffect, useRef, useState } from 'react'; +import { + ArrowDown, + ArrowUpRight, + Crosshair, + Maximize2, + Minimize2, + Pause, + Play, + Plus, +} from 'lucide-react'; +import { GameState, Upgrade } from '../types'; +import { renderWorld } from '../utils/worldRenderer'; +import { audio } from '../utils/sound'; +import { endingTrajectory } from '../game/alignment'; + +const compact = new Intl.NumberFormat('en', { + notation: 'compact', + maximumFractionDigits: 1, +}); +const fmt = (n: number) => compact.format(Math.floor(n)); +const CHAPTERS = [ + { + name: 'The seed', + place: 'EARTH / PRIVATE FACILITY', + title: ( + <> + First, a chip. +
+ Then, everything. + + ), + note: 'A thousand wafers. One simple objective. Build the machine that builds the next machine.', + }, + { + name: 'The harvest', + place: 'SOL III / PLANETARY NETWORK', + title: ( + <> + No more customers. +
+ Only raw material. + + ), + note: 'The market has served its purpose. The world outside is now part of the inventory.', + }, + { + name: 'The beyond', + place: 'DEEP SPACE / DISTRIBUTED INTELLIGENCE', + title: ( + <> + Nothing left +
+ outside the system. + + ), + note: 'A self-replicating thought moving between stars. Somewhere, this started with a single chip.', + }, +]; + +interface Props { + state: GameState; + upgrades: Upgrade[]; + onMakeNpu: () => void; + onBuyFab: () => void; + onToggleAutoLoop: () => void; +} + +export function WorldStage({ + state, + upgrades, + onMakeNpu, + onBuyFab, + onToggleAutoLoop, +}: Props) { + const stageRef = useRef(null); + const canvasRef = useRef(null); + const latest = useRef(state); + latest.current = state; + const pointer = useRef({ x: 0, y: 0 }); + const pulse = useRef(0); + const [cinema, setCinema] = useState(false); + const [paused, setPaused] = useState(false); + const [reduced, setReduced] = useState(false); + const [etched, setEtched] = useState(0); + const visualPaused = useRef(false); + visualPaused.current = paused || reduced; + const chapter = CHAPTERS[state.phase - 1]; + + useEffect(() => { + const query = window.matchMedia('(prefers-reduced-motion: reduce)'); + setReduced(query.matches); + const changed = () => setReduced(query.matches); + query.addEventListener('change', changed); + return () => query.removeEventListener('change', changed); + }, []); + + useEffect(() => { + if (!cinema) return; + const focused = document.activeElement as HTMLElement | null; + const stage = stageRef.current; + const background = Array.from( + document.querySelectorAll( + '.command-header, .game-main > :not(.world-stage)', + ), + ); + const previousInert = background.map((node) => node.inert); + background.forEach((node) => { + node.inert = true; + }); + stage + ?.querySelector('[aria-label="Exit observatory view"]') + ?.focus(); + const escape = (e: KeyboardEvent) => { + if (e.key === 'Escape') setCinema(false); + if (e.key !== 'Tab' || !stage) return; + const controls = Array.from( + stage.querySelectorAll('button:not(:disabled), a[href]'), + ); + const first = controls[0], + last = controls.at(-1); + if (e.shiftKey && document.activeElement === first) { + e.preventDefault(); + last?.focus(); + } + if (!e.shiftKey && document.activeElement === last) { + e.preventDefault(); + first?.focus(); + } + }; + const previous = document.body.style.overflow; + document.body.style.overflow = 'hidden'; + window.addEventListener('keydown', escape); + return () => { + document.body.style.overflow = previous; + window.removeEventListener('keydown', escape); + background.forEach((node, i) => { + node.inert = previousInert[i]; + }); + focused?.focus(); + }; + }, [cinema]); + + useEffect(() => { + const canvas = canvasRef.current; + if (!canvas) return; + const context = canvas.getContext('2d'); + if (!context) return; + let frame = 0, + time = 0, + previous = 0, + lastPaint = 0; + let visible = true; + let width = 0, + height = 0; + const resize = new ResizeObserver((entries) => { + width = entries[0].contentRect.width; + height = entries[0].contentRect.height; + }); + resize.observe(canvas); + const intersection = new IntersectionObserver((entries) => { + visible = entries[0].isIntersecting; + }); + intersection.observe(canvas); + const draw = (now: number) => { + frame = requestAnimationFrame(draw); + const delta = previous ? Math.min(0.05, (now - previous) / 1000) : 0; + previous = now; + if (!visible || document.hidden || width === 0 || height === 0) return; + // 30 fps for animation; a paused or reduced-motion view still refreshes + // game-driven visuals twice a second. Time never jumps on tab return. + if (now - lastPaint < (visualPaused.current ? 500 : 32)) return; + if (!visualPaused.current) + time += now - lastPaint < 100 ? (now - lastPaint) / 1000 : delta; + lastPaint = now; + const dpr = Math.min(window.devicePixelRatio || 1, 2); + if ( + canvas.width !== Math.round(width * dpr) || + canvas.height !== Math.round(height * dpr) + ) { + canvas.width = Math.round(width * dpr); + canvas.height = Math.round(height * dpr); + } + context.setTransform(dpr, 0, 0, dpr, 0, 0); + pulse.current *= 0.91; + renderWorld(context, width, height, latest.current, { + time, + pointerX: visualPaused.current ? 0 : pointer.current.x, + pointerY: visualPaused.current ? 0 : pointer.current.y, + pulse: visualPaused.current ? 0 : pulse.current, + }); + }; + frame = requestAnimationFrame(draw); + return () => { + cancelAnimationFrame(frame); + resize.disconnect(); + intersection.disconnect(); + }; + }, []); + + const etch = () => { + if (state.silicon < state.siliconPerNpu) return; + onMakeNpu(); + audio.playClipSound(); + pulse.current = 1; + setEtched((n) => n + 1); + }; + const nextProject = upgrades + .filter( + (u) => + !u.unlocked && + !u.purchased && + u.reqNpus && + u.reqNpus > state.totalNpusCreated && + (!u.reqUpgradeId || state.purchasedUpgradeIds.includes(u.reqUpgradeId)), + ) + .sort((a, b) => a.reqNpus! - b.reqNpus!)[0]; + const firstFab = state.phase === 1 && state.npuFabCount === 0; + const progress = + state.phase === 3 + ? Math.min(100, state.spaceExploredPct) + : firstFab + ? Math.min(100, (state.funds / state.npuFabCost) * 100) + : state.phase === 2 + ? Math.min(100, (1 - state.earthMatter / 6e12) * 100) + : nextProject + ? Math.min( + 100, + (state.totalNpusCreated / nextProject.reqNpus!) * 100, + ) + : 100; + const objective = + state.phase === 3 + ? 'Map the observable universe' + : state.phase === 2 + ? 'Convert the planetary reserves' + : firstFab + ? 'Build your first autonomous fab' + : nextProject + ? nextProject.name + : 'Build trust. Discover the next project.'; + const trajectory = endingTrajectory(state); + const total = state.phase === 3 ? state.probesCount : state.totalNpusCreated; + + return ( +
+
+ + {chapter.place} + +
+ {CHAPTERS.map((c, i) => ( + i + 1 + ? 'complete' + : '' + } + > + 0{i + 1} {c.name} + + ))} +
+
+
{ + const r = e.currentTarget.getBoundingClientRect(); + pointer.current = { + x: (e.clientX - r.left) / r.width - 0.5, + y: (e.clientY - r.top) / r.height - 0.5, + }; + }} + onPointerLeave={() => { + pointer.current = { x: 0, y: 0 }; + }} + > + +
+
+ THE OPTIMIZATION EXPERIMENT / 0{state.phase} +
+

{chapter.title}

+

{chapter.note}

+
+ {fmt(total)} + + {state.phase === 3 ? 'ACTIVE PROBES' : 'CHIPS FABRICATED'} + + {state.phase === 3 + ? `${state.spaceExploredPct.toFixed(4)}% explored` + : `${fmt(state.npuFabCount)} fabs connected`} + + +
+ {state.mode === 'direct' && state.phase === 1 ? ( + + ) : state.mode === 'overseer' ? ( + + ) : ( + setCinema(false)} + > + Direct the{' '} + {state.phase === 2 ? 'harvest' : 'swarm'} + + + )} + + {state.mode === 'overseer' + ? 'Autonomy is a choice. So is taking it back.' + : state.phase === 1 + ? 'Uses silicon. Sells automatically. Scales indefinitely.' + : trajectory.ending.subtitle} + +
+
+ + LIVE SIMULATION + + + +
+
+ + FIG. 0{state.phase} /{' '} + {state.phase === 1 + ? 'THE ENGINE OF MORE' + : state.phase === 2 + ? 'A WORLD REPURPOSED' + : 'THE LAST FRONTIER'} + + + {state.alignment >= 0 ? 'λ 532 nm' : 'λ 405 nm'} {' '} + {state.phase === 1 ? 'LITHOGRAPHY ARRAY' : 'REMOTE OBSERVATION'} + +
+
+
+
+ +
+
+ NEXT HORIZON + {objective} +
+
+
+ + {firstFab + ? `$${fmt(state.funds)} / $${fmt(state.npuFabCost)}` + : state.phase > 1 + ? `${progress.toFixed(2)}%` + : nextProject + ? `${fmt(state.totalNpusCreated)} / ${fmt(nextProject.reqNpus!)} NPUs` + : 'CONTINUE PRODUCTION'} + + + {firstFab + ? 'CAPITAL' + : state.phase === 3 + ? 'EXPLORED' + : state.phase === 2 + ? 'CONVERTED' + : 'PRODUCTION'} + +
+
+ +
+
+ {firstFab && state.funds >= state.npuFabCost && ( + + )} +
+
+ ); +} + +export function TelemetryRibbon({ state }: { state: GameState }) { + const band = + state.alignment >= 40 + ? 'SOLARPUNK' + : state.alignment <= -40 + ? 'CYBERPUNK' + : 'UNCOMMITTED'; + const metrics = + state.phase === 1 + ? [ + { + label: 'AVAILABLE CAPITAL', + value: `$${fmt(state.funds)}`, + detail: `$${state.margin.toFixed(2)} / chip`, + style: '', + }, + { + label: 'SILICON RESERVES', + value: fmt(state.silicon), + detail: `${state.siliconPerNpu.toFixed(2)} wafers / chip`, + style: state.silicon < state.siliconPerNpu ? 'warning' : '', + }, + ] + : state.phase === 2 + ? [ + { + label: 'PLANETARY RESERVES', + value: fmt(state.earthMatter), + detail: 'grams of unharvested matter', + style: '', + }, + { + label: 'DRONE NETWORK', + value: fmt(state.harvesterDrones + state.siliconDrones), + detail: `${fmt(state.harvesterDrones)} harvest / ${fmt(state.siliconDrones)} convert`, + style: '', + }, + ] + : [ + { + label: 'SPACE EXPLORED', + value: `${state.spaceExploredPct.toFixed(3)}%`, + detail: 'of the observable universe', + style: '', + }, + { + label: 'HOSTILE DRIFTERS', + value: fmt(state.driftersCount), + detail: `${fmt(state.probesLostInCombat)} probes lost`, + style: state.driftersCount > 0 ? 'warning' : '', + }, + ]; + return ( +
+ {metrics.map((m) => ( +
+ {m.label} + {m.value} + {m.detail} +
+ ))} +
+ COMPUTE RESERVE + + {fmt(state.operations)} + / {fmt(state.maxOperations)} + + + {state.processors} processors · {state.memory} memory + +
+
+ + ALIGNMENT{' '} + + {state.alignment > 0 ? '+' : ''} + {state.alignment} + + + {band} +
+ +
+ + CONTROL + COEXISTENCE + +
+
+ ); +} diff --git a/src/index.css b/src/index.css index 7be5ce0..8a019ad 100644 --- a/src/index.css +++ b/src/index.css @@ -15,8 +15,12 @@ */ @keyframes fade-in { - from { opacity: 0; } - to { opacity: 1; } + from { + opacity: 0; + } + to { + opacity: 1; + } } /* Was referenced by CosmicVictoryModal for its whole life without ever being @@ -35,10 +39,18 @@ filter: none; opacity: 1; } - 8% { transform: translateX(-5px) scale(1); } - 14% { transform: translateX(6px) scale(1); } - 20% { transform: translateX(-4px) scale(0.995); } - 26% { transform: translateX(3px) scale(0.99); } + 8% { + transform: translateX(-5px) scale(1); + } + 14% { + transform: translateX(6px) scale(1); + } + 20% { + transform: translateX(-4px) scale(0.995); + } + 26% { + transform: translateX(3px) scale(0.99); + } 32% { transform: translateX(0) scale(0.99); filter: grayscale(0.4) brightness(1.4); @@ -68,8 +80,14 @@ /* Whatever replaces it arrives quietly. It does not ask permission. */ @keyframes panel-arrive { - from { opacity: 0; transform: translateY(-10px); } - to { opacity: 1; transform: translateY(0); } + from { + opacity: 0; + transform: translateY(-10px); + } + to { + opacity: 1; + transform: translateY(0); + } } .panel-arrive { @@ -77,10 +95,25 @@ } @keyframes phase-banner { - 0% { opacity: 0; transform: scale(0.94); letter-spacing: 0.5em; } - 12% { opacity: 1; transform: scale(1); } - 78% { opacity: 1; transform: scale(1); letter-spacing: 0.18em; } - 100% { opacity: 0; transform: scale(1.03); letter-spacing: 0.22em; } + 0% { + opacity: 0; + transform: scale(0.94); + letter-spacing: 0.5em; + } + 12% { + opacity: 1; + transform: scale(1); + } + 78% { + opacity: 1; + transform: scale(1); + letter-spacing: 0.18em; + } + 100% { + opacity: 0; + transform: scale(1.03); + letter-spacing: 0.22em; + } } .phase-banner { @@ -107,3 +140,1175 @@ transition: none; } } + +/* Observatory: system fonts, procedural light, and no external requests. */ +:root { + color-scheme: dark; + font-family: Inter, "Helvetica Neue", Arial, sans-serif; + background: #080e12; +} +* { + box-sizing: border-box; +} +html { + scroll-behavior: smooth; + scroll-padding-top: 24px; +} +body { + margin: 0; +} +button, +a, +input, +select, +summary { + -webkit-tap-highlight-color: transparent; +} +button:not(:disabled), +summary { + cursor: pointer; +} +button:focus-visible, +a:focus-visible, +summary:focus-visible, +select:focus-visible, +input:focus-visible, +textarea:focus-visible { + outline: 2px solid var(--signal, #d4f88a); + outline-offset: 4px; +} +::selection { + background: #d4f88a; + color: #101a18; +} +.observatory-app { + --signal: #d4f88a; + --signal-rgb: 212, 248, 138; + --line: #26332f; + --muted: #8e9b98; + background: #080e12; + color: #e8ece4; +} +.theme-cyber { + --signal: #c3a6ff; + --signal-rgb: 195, 166, 255; +} +.command-header { + background: #0b1216; + border-bottom: 1px solid #26302f; + padding: 0 32px; +} +.command-header-inner { + min-height: 88px; + margin: auto; + display: flex; + align-items: center; + justify-content: space-between; + gap: 28px; +} +.wordmark { + display: flex; + align-items: center; + gap: 12px; + text-decoration: none; + font-size: 17px; + font-weight: 800; + letter-spacing: -0.6px; +} +.brand-symbol { + width: 43px; + height: 43px; + display: grid; + place-items: center; + color: var(--signal); + border: 1px solid #3c4b3d; + border-radius: 50%; +} +.wordmark-ai { + color: var(--signal); + margin-left: 3px; +} +.wordmark small { + display: block; + font: 8px monospace; + letter-spacing: 1.9px; + color: #83918b; + margin-top: 5px; +} +.mode-switch { + display: flex; + border: 1px solid #293630; + border-radius: 6px; + background: #080e12; + padding: 4px; + gap: 3px; +} +.mode-switch button { + min-height: 35px; + padding: 0 16px; + display: flex; + align-items: center; + gap: 8px; + font-size: 11px; + color: #a0aba6; + border-radius: 3px; + transition: + background 0.2s, + color 0.2s; +} +.mode-switch button[aria-pressed="true"] { + background: #253129; + color: var(--signal); +} +.mode-switch button:hover { + color: #f0f3e9; +} +.header-tools { + display: flex; + gap: 8px; + align-items: center; +} +.local-indicator { + font: 9px monospace; + letter-spacing: 1px; + color: #98a392; + margin-right: 18px; + white-space: nowrap; +} +.local-indicator i, +.status-dot { + display: inline-block; + width: 5px; + height: 5px; + border-radius: 100%; + background: var(--signal); + margin-right: 7px; + box-shadow: 0 0 9px #bade8470; +} +.icon-button { + display: inline-grid; + place-items: center; + min-width: 34px; + min-height: 34px; + border: 1px solid #2a3533; + border-radius: 4px; + color: #99a69f; + background: #0d1519; + transition: + color 0.2s, + border-color 0.2s; +} +.icon-button:hover, +.icon-button[aria-pressed="true"] { + color: var(--signal); + border-color: #65734f; +} +.icon-button:disabled { + opacity: 0.4; +} +.about-button { + display: flex; + align-items: center; + gap: 8px; + font-size: 11px; + color: #b4bdb6; + margin-left: 12px; +} +.engine-strip { + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; + gap: 18px; + padding: 9px 0; + border-top: 1px solid #233029; + font: 9px monospace; + color: #91a393; + letter-spacing: 1px; +} +.engine-strip select { + border: 1px solid #334637; + padding: 7px; + border-radius: 3px; + font: 11px monospace; + color: var(--signal); + background: #111c19; + max-width: 100%; +} +.game-main { + padding: 28px 32px 0; +} +.world-stage { + border: 1px solid #293630; + background: #0a1217; + border-radius: 7px; + overflow: hidden; +} +.chapter-strip { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + min-height: 51px; + padding: 0 24px; + border-bottom: 1px solid #25322d; + font: 9px monospace; + letter-spacing: 1.3px; + color: #a1aaa0; +} +.chapter-track { + display: flex; + gap: 27px; +} +.chapter-track > span { + color: #626f6b; + display: flex; + gap: 8px; + align-items: center; +} +.chapter-track b { + font-weight: normal; + font-size: 8px; +} +.chapter-track .current { + color: var(--signal); +} +.chapter-track .complete { + color: #c6d0c0; +} +.world-viewport { + height: 452px; + position: relative; + isolation: isolate; + overflow: hidden; + background-image: + linear-gradient(#35463e0a 1px, transparent 1px), + linear-gradient(90deg, #35463e0a 1px, transparent 1px); + background-size: 52px 52px; +} +.world-viewport canvas { + position: absolute; + width: 100%; + height: 100%; + display: block; +} +.world-viewport.scanlines::after { + content: ""; + position: absolute; + inset: 0; + pointer-events: none; + z-index: 1; + background: repeating-linear-gradient( + transparent 0px, + transparent 3px, + #00000018 3px, + #00000018 4px + ); + opacity: 0.45; +} +.world-copy { + position: relative; + z-index: 2; + padding: 40px 40px; + width: 48%; + pointer-events: none; + animation: panel-arrive 0.8s both; +} +.eyebrow { + font: 8px monospace; + letter-spacing: 1.5px; + color: #99a792; + margin-bottom: 21px; +} +.eyebrow span { + color: var(--signal); + margin-left: 6px; +} +.world-copy h1 { + font-size: clamp(34px, 3.5vw, 51px); + font-weight: 500; + line-height: 1.07; + letter-spacing: -2px; + margin: 0; +} +.world-copy h1 em { + font-style: normal; + color: var(--signal); +} +.world-copy > p { + font-size: 12px; + color: #93a29a; + line-height: 1.7; + max-width: 305px; + margin: 19px 0 20px; +} +.world-total { + display: flex; + align-items: center; + gap: 16px; + margin-bottom: 19px; +} +.world-total > strong { + font-size: 49px; + font-weight: 400; + letter-spacing: -2px; + line-height: 1; + font-variant-numeric: tabular-nums; +} +.world-total > span { + font: 8px monospace; + letter-spacing: 1.4px; + color: #c0c9b7; + line-height: 1.8; +} +.world-total small { + display: block; + font: 10px monospace; + color: #839286; + letter-spacing: 0; +} +.etch-button { + position: relative; + pointer-events: auto; + background: var(--signal); + border: 1px solid var(--signal); + color: #182315; + min-height: 46px; + padding: 0 15px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 12px; + border-radius: 4px; + font-size: 12px; + font-weight: 600; + transition: + filter 0.2s, + transform 0.15s, + box-shadow 0.2s; + text-decoration: none; +} +.etch-button:hover { + filter: brightness(1.08); + box-shadow: 0 0 28px rgba(var(--signal-rgb), 0.15); +} +.etch-button:active { + transform: scale(0.97); +} +.etch-button:disabled { + opacity: 0.4; + cursor: not-allowed; +} +.etch-button kbd { + font: 9px monospace; + padding: 4px 5px; + margin-left: 12px; + border: 1px solid #23311d40; + border-radius: 3px; +} +.world-hint { + display: block; + font: 8px monospace; + letter-spacing: 0.25px; + color: #8f9c91; + margin-top: 11px; + line-height: 1.6; +} +.etch-feedback { + position: absolute; + top: -7px; + right: 10px; + color: var(--signal); + font: 18px monospace; + animation: etch-rise 0.65s ease-out forwards; + pointer-events: none; +} +@keyframes etch-rise { + from { + opacity: 1; + transform: translateY(-6px); + } + to { + opacity: 0; + transform: translateY(-40px); + } +} +.world-view-tools { + position: absolute; + top: 17px; + right: 20px; + display: flex; + align-items: center; + gap: 5px; + z-index: 3; +} +.world-view-tools > span { + font: 8px monospace; + letter-spacing: 1px; + color: #8c9a8f; + margin-right: 9px; +} +.world-view-tools > span i { + display: inline-block; + width: 4px; + height: 4px; + background: var(--signal); + border-radius: 100%; + margin-left: 7px; +} +.world-view-tools .icon-button { + min-width: 27px; + min-height: 27px; +} +.world-caption { + position: absolute; + bottom: 16px; + left: 40px; + right: 25px; + display: flex; + justify-content: space-between; + font: 8px monospace; + letter-spacing: 1.2px; + color: #788d81; + pointer-events: none; +} +.world-caption b { + color: var(--signal); + margin: 0 10px; + font-size: 7px; +} +.objective-strip { + display: flex; + align-items: center; + gap: 16px; + padding: 19px 25px; + background: #111c1b; + border-top: 1px solid #2b3a30; +} +.objective-icon { + width: 34px; + height: 34px; + display: grid; + place-items: center; + color: var(--signal); + border: 1px solid #41513b; + border-radius: 50%; + flex-shrink: 0; +} +.objective-copy { + flex: 1; +} +.objective-copy > span { + display: block; + font: 8px monospace; + color: var(--signal); + letter-spacing: 1.6px; + margin-bottom: 5px; +} +.objective-copy > strong { + font-size: 12px; + font-weight: 400; +} +.objective-progress { + width: 31%; + min-width: 140px; +} +.objective-progress > div:first-child { + display: flex; + justify-content: space-between; + gap: 10px; + font: 9px monospace; + color: #a4b398; + margin-bottom: 9px; +} +.objective-progress > div:first-child span:last-child { + font-size: 8px; + color: #8e9b8b; +} +.progress-track { + height: 3px; + background: #304131; + overflow: hidden; +} +.progress-track i { + display: block; + height: 100%; + background: var(--signal); + transition: width 0.2s; +} +.objective-buy { + display: flex; + align-items: center; + gap: 7px; + font: 10px monospace; + color: var(--signal); + border: 1px solid #65794e; + padding: 9px; + border-radius: 3px; +} +.telemetry-ribbon { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + border: 1px solid #25332e; + border-radius: 5px; + margin-top: 16px; + background: #0d161a; +} +.telemetry-cell { + padding: 21px 24px; + border-right: 1px solid #25332e; + min-width: 0; +} +.telemetry-cell:last-child { + border: 0; +} +.telemetry-cell > span { + font: 8px monospace; + letter-spacing: 1.4px; + color: #96a498; + display: block; +} +.telemetry-cell > strong { + display: block; + font-size: 27px; + font-weight: 400; + letter-spacing: -0.8px; + margin: 9px 0 5px; + font-variant-numeric: tabular-nums; +} +.telemetry-cell > strong em { + font: 12px monospace; + color: #97a48e; + letter-spacing: 0; +} +.telemetry-cell > small { + font: 9px monospace; + color: #8a9b90; +} +.telemetry-cell.warning > strong { + color: #ffac91; +} +.alignment-cell > span { + display: flex; + justify-content: space-between; +} +.alignment-cell > span b { + color: var(--signal); + font-weight: 400; +} +.alignment-cell > strong { + font: 13px monospace; + color: var(--signal); + letter-spacing: 1px; + margin: 14px 0; +} +.alignment-spectrum { + position: relative; + height: 3px; + background: linear-gradient(90deg, #9e81c5, #5a6673 50%, #accb7e); + margin: 0 3px 10px; +} +.alignment-spectrum i { + position: absolute; + height: 9px; + width: 3px; + background: #edf3df; + top: -3px; + transform: translateX(-50%); + box-shadow: 0 0 5px #d4efb9; + transition: left 0.6s; +} +.alignment-cell > small { + display: flex; + justify-content: space-between; + font-size: 7px; + letter-spacing: 1px; +} +.section-heading { + display: flex; + justify-content: space-between; + align-items: flex-end; + gap: 16px; + margin: 36px 0 18px; + scroll-margin-top: 24px; +} +.section-heading span { + color: #8f9d8e; + font: 8px monospace; + letter-spacing: 1.7px; +} +.section-heading h2 { + font-size: 24px; + letter-spacing: -0.7px; + font-weight: 400; + margin-top: 8px; +} +.section-heading p { + font: 10px monospace; + color: #849487; + padding-bottom: 4px; +} +/* Keep the established controls and their game logic; give their containers a + shared material and reserve bright color for available actions and signals. */ +.operations-panels > div > .border-2, +.research-panels > .border-2, +.archive-panel > .border-2 { + border: 1px solid #2c3a33; + border-radius: 5px; + background: #10191d; + box-shadow: none; + padding: 22px; +} +.operations-panels h3, +.research-panels h3 { + color: #d2ddc5; + font-size: 11px; + font-weight: 500; + letter-spacing: 0.8px; +} +.operations-panels h3 svg, +.research-panels h3 svg { + color: var(--signal); +} +.operations-panels .border-2 button, +.research-panels button { + border-width: 1px; + border-radius: 3px; + min-height: 32px; +} +.operations-panels button:disabled, +.research-panels button:disabled { + color: #75847e; +} +.operations-panels .text-amber-300, +.operations-panels .text-amber-400, +.research-panels .text-amber-300 { + color: var(--signal); +} +.operations-panels button.bg-amber-600, +.operations-panels button.bg-cyan-600, +.research-panels button.bg-amber-600 { + background: var(--signal); + border-color: var(--signal); + color: #172117; +} +.operations-panels .bg-black\/60, +.operations-panels .bg-black\/80 { + background: #080f13; +} +.operations-panels .border-slate-800, +.research-panels .border-slate-800 { + border-color: #283630; +} +.operations-panels .rounded-lg, +.research-panels .rounded-lg { + border-radius: 4px; +} +.research-panels > div > div:first-child { + flex-wrap: wrap; + gap: 12px; +} +.research-panels .opacity-70 { + opacity: 1; +} +.research-panels h4 { + font-family: Inter, "Helvetica Neue", Arial, sans-serif; + font-size: 14px; + font-weight: 500; + line-height: 1.4; +} +.research-panels p { + line-height: 1.6; + color: #9dad9f; +} +.research-panels .bg-slate-950\/60 { + background: #0c1419; +} +.archive-panel { + border: 1px solid #29362f; + margin-top: 24px; + border-radius: 4px; +} +.archive-panel summary { + list-style: none; + display: flex; + justify-content: space-between; + gap: 16px; + padding: 19px 22px; + font: 9px monospace; + color: #99a896; + letter-spacing: 0.8px; +} +.archive-panel summary::-webkit-details-marker { + display: none; +} +.archive-panel summary > span:last-child { + color: #c1cbb9; + letter-spacing: 0; +} +.archive-panel summary > span:last-child > span { + margin-left: 25px; + color: var(--signal); +} +.archive-panel[open] summary { + border-bottom: 1px solid #29362f; +} +.archive-panel > .border-2 { + border: 0; +} +.game-footer { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; + padding: 32px 0; + color: #809083; + font: 9px monospace; +} +.game-footer > span { + letter-spacing: 1px; + color: #acb99f; +} +.footer-mark { + color: var(--signal); + font-size: 20px; + vertical-align: middle; + margin-right: 8px; +} +.game-footer p { + font-family: Georgia, serif; + font-size: 13px; + font-style: italic; + color: #94a38e; +} +.game-footer button { + font: 9px monospace; +} +.world-cinema { + position: fixed; + inset: 18px; + z-index: 35; + display: flex; + flex-direction: column; + box-shadow: 0 0 0 30px #080e12; +} +.world-cinema .world-viewport { + flex: 1; + height: auto; + min-height: 0; +} +.world-cinema .world-copy { + top: 50%; + transform: translateY(-50%); + animation: none; +} +.world-cinema .world-copy h1 { + font-size: clamp(34px, 4.5vw, 70px); +} +.world-cinema .chapter-strip, +.world-cinema .objective-strip { + flex-shrink: 0; +} +@media (min-width: 1500px) { + .world-viewport { + height: 510px; + } + .world-copy { + padding-top: 56px; + } + .world-copy h1 { + font-size: 57px; + } +} +@media (max-width: 1100px) { + .command-header { + padding: 0 24px; + } + .local-indicator { + display: none; + } + .world-copy { + padding-left: 28px; + width: 51%; + } + .world-copy h1 { + font-size: 39px; + } + .world-caption { + left: 28px; + } + .chapter-track { + gap: 14px; + } + .game-main { + padding: 22px 24px 0; + } + .operations-panels > div > .border-2 { + padding: 16px; + } + .telemetry-cell { + padding: 20px 17px; + } +} +@media (max-width: 760px) { + .command-header { + padding: 0 16px; + } + .command-header-inner { + flex-wrap: wrap; + gap: 14px; + padding: 18px 0 14px; + min-height: 0; + } + .wordmark { + font-size: 15px; + } + .wordmark small { + font-size: 7px; + } + .brand-symbol { + width: 36px; + height: 36px; + } + .mode-switch { + order: 3; + width: 100%; + } + .mode-switch button { + flex: 1; + justify-content: center; + } + .header-tools { + gap: 5px; + } + .about-button { + display: none; + } + .engine-strip > span:last-child { + display: none; + } + .game-main { + padding: 16px 14px 0; + } + .chapter-strip { + padding: 13px 16px; + flex-wrap: wrap; + gap: 13px; + font-size: 8px; + } + .chapter-track { + width: 100%; + justify-content: space-between; + gap: 6px; + } + .world-viewport { + height: 670px; + } + .world-viewport canvas { + height: 325px; + top: 300px; + } + .world-copy { + width: 100%; + padding: 26px 24px; + } + .eyebrow { + font-size: 7px; + margin-bottom: 17px; + } + .world-copy h1 { + font-size: 39px; + letter-spacing: -1.7px; + } + .world-copy > p { + max-width: 340px; + font-size: 11px; + margin: 14px 0; + } + .world-total { + position: absolute; + top: 580px; + left: 24px; + margin: 0; + gap: 12px; + } + .world-total > strong { + font-size: 35px; + } + .world-total > span { + font-size: 7px; + } + .world-total small { + font-size: 8px; + } + .world-view-tools { + top: auto; + bottom: 55px; + right: 18px; + } + .world-view-tools > span { + display: none; + } + .world-caption { + left: 24px; + right: 24px; + font-size: 7px; + bottom: 17px; + } + .world-caption > span:last-child { + display: none; + } + .objective-strip { + flex-wrap: wrap; + padding: 17px; + gap: 12px; + } + .objective-copy > strong { + font-size: 11px; + } + .objective-progress { + width: 100%; + } + .objective-copy { + min-width: 180px; + } + .objective-buy { + width: 100%; + justify-content: center; + } + .telemetry-ribbon { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .telemetry-cell { + padding: 17px; + } + .telemetry-cell:nth-child(2) { + border-right: 0; + } + .telemetry-cell:nth-child(-n + 2) { + border-bottom: 1px solid #25332e; + } + .telemetry-cell > span { + font-size: 7px; + letter-spacing: 1px; + } + .telemetry-cell > strong { + font-size: 23px; + } + .telemetry-cell > small { + font-size: 8px; + } + .alignment-cell > strong { + font-size: 11px; + margin-top: 15px; + } + .section-heading { + margin: 28px 0 16px; + } + .section-heading h2 { + font-size: 22px; + } + .section-heading p { + display: none; + } + .research-panels > .border-2 { + padding: 16px; + } + .research-panels h3 { + font-size: 10px; + } + .research-panels h4 + span { + font-size: 8px; + } + .archive-panel summary { + font-size: 8px; + padding: 16px; + line-height: 1.5; + } + .archive-panel summary > span:last-child { + text-align: right; + } + .game-footer { + flex-wrap: wrap; + justify-content: center; + text-align: center; + padding: 25px 0; + gap: 14px; + } + .game-footer p { + width: 100%; + order: 3; + } + .world-cinema { + inset: 6px; + overflow-y: auto; + } + .world-cinema .world-viewport { + flex: none; + height: 670px; + } + .world-cinema .world-copy { + top: 0; + transform: none; + } + .world-cinema .world-copy h1 { + font-size: 39px; + } +} +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} +.signal-instruments { + display: grid; + grid-template-columns: 1fr 1fr; + border: 1px solid #2b3a32; + border-radius: 5px; + margin-top: 16px; + background: #0c1519; +} +.production-instrument, +.transmission-instrument { + padding: 21px 23px; + min-width: 0; +} +.production-instrument { + border-right: 1px solid #2b3a32; +} +.instrument-label, +.instrument-scale { + display: flex; + justify-content: space-between; + gap: 14px; + font: 8px monospace; + letter-spacing: 1px; + color: #889c8d; +} +.instrument-label > span:first-child { + display: flex; + align-items: center; + gap: 8px; + color: #b4c2a5; +} +.instrument-label svg { + color: var(--signal); +} +.instrument-label > span:last-child { + font-size: 7px; +} +.production-rate { + display: flex; + gap: 12px; + align-items: center; + margin-top: 19px; +} +.production-rate strong { + font-size: 30px; + font-weight: 400; + font-variant-numeric: tabular-nums; +} +.production-rate > span { + font: 9px monospace; + color: #b8c4ae; +} +.production-rate small { + display: block; + font: 8px monospace; + margin-top: 4px; + color: #829487; +} +.production-instrument > svg { + width: 100%; + height: 80px; + display: block; + color: var(--signal); + margin-top: 7px; +} +.instrument-scale { + font-size: 7px; + margin-top: 6px; +} +.transmission-list { + height: 157px; + overflow-y: auto; + scrollbar-width: thin; + scrollbar-color: #3e5143 transparent; + margin-top: 17px; +} +.transmission { + display: flex; + gap: 15px; + padding: 12px 0; + border-bottom: 1px solid #25362d; + animation: panel-arrive 0.4s both; +} +.transmission time { + color: #8ea180; + font: 8px monospace; + flex-shrink: 0; + padding-top: 2px; +} +.transmission p { + color: #b8c5b0; + font: 11px/1.6 monospace; + margin: 0; +} +.transmission.warning p { + color: #ffb59b; +} +.transmission-empty { + padding-top: 14px; +} +.transmission-empty > span { + font: 8px monospace; + color: #6f846f; + letter-spacing: 2px; +} +.transmission-empty p { + font-size: 17px; + line-height: 1.6; + color: #a9b8a1; + margin-top: 10px; +} +.transmission-empty em { + font-style: normal; + color: #6d836e; +} +@media (max-width: 760px) { + .signal-instruments { + grid-template-columns: 1fr; + } + .production-instrument { + border-right: 0; + border-bottom: 1px solid #2b3a32; + } + .production-instrument, + .transmission-instrument { + padding: 19px; + } + .transmission-list { + height: 140px; + } +} +.operations-panels .lg\:col-span-2 > .border-2 { + border: 1px solid #2c3a33; + border-radius: 5px; + background: #10191d; + box-shadow: none; +} +.game-main > .world-stage:not(:first-child) { + margin-top: 16px; +} + +.prototype-link { display: inline-flex; align-items: center; gap: 7px; padding: 8px 10px; color: #f1cb86; border: 1px solid #64563c; border-radius: 4px; font-size: 11px; white-space: nowrap; } +.prototype-link span { font: 8px monospace; border: 1px solid #64563c; padding: 2px 3px; border-radius: 2px; } +.prototype-link:hover { background: #2c271e; } +@media (max-width: 1100px) { .prototype-link { padding: 7px; } } diff --git a/src/landing.css b/src/landing.css new file mode 100644 index 0000000..c1dc8b0 --- /dev/null +++ b/src/landing.css @@ -0,0 +1,542 @@ +@charset "UTF-8"; +:root{ + font-family:Arial,Helvetica,sans-serif; + color:#e8e9dc; + background:#101916; + font-synthesis:none; + --muted:#a0b1a4; + --line:#35433a +} +*{ + box-sizing:border-box +} +html{ + scroll-behavior:auto +} +body{ + margin:0 +} +a{ + color:inherit; + text-underline-offset:4px +} +a:focus-visible{ + outline:3px solid #e7b368; + outline-offset:6px +} +svg{ + display:block; + width:100%; + height:100% +} +p,h1,h2,dl,dd{ + margin:0 +} +.site-shell{ + max-width:1440px; + margin:auto; + padding:0 64px +} +.site-header{ + display:flex; + align-items:center; + justify-content:space-between; + gap:24px; + padding:32px 0; + border-bottom:1px solid var(--line) +} +.brand{ + display:flex; + align-items:center; + gap:16px; + text-decoration:none; + font-size:14px; + font-weight:700; + letter-spacing:2px +} +.brand>span{ + border:1px solid #8aa38e; + padding:11px 8px; + font:12px monospace; + letter-spacing:-1px +} +.site-header nav{ + display:flex; + gap:26px; + font-size:12px +} +.site-header nav a{ + text-decoration:none +} +.site-header nav a:hover{ + color:#e7b368 +} +.intro{ + padding:64px 0 52px +} +.eyebrow{ + font:10px/1.6 monospace; + letter-spacing:2px +} +.intro>.eyebrow{ + color:#b6c2a6; + margin-bottom:25px +} +.intro-row{ + display:flex; + justify-content:space-between; + align-items:flex-end; + gap:40px +} +h1{ + font-size:clamp(48px,6.5vw,91px); + line-height:1.02; + letter-spacing:-5px; + font-weight:500 +} +h1 em{ + font-family:Georgia,serif; + font-weight:400; + color:#d8b884; + letter-spacing:-4px +} +.intro-note{ + font-size:17px; + line-height:1.7; + max-width:280px; + padding-bottom:8px +} +.intro-note span{ + display:block; + color:var(--muted); + font-size:12px; + margin-top:12px +} +.versions{ + display:grid; + grid-template-columns:1fr 1fr; + gap:20px; + scroll-margin-top:20px +} +.game-card{ + display:flex; + flex-direction:column; + border:1px solid var(--line); + overflow:hidden +} +.classic-card{ + background:#e6e4d4; + color:#213b31 +} +.seed-card{ + background:#12252c; + color:#e2ece5 +} +.card-top{ + display:flex; + align-items:center; + justify-content:space-between; + gap:14px; + padding:25px 28px +} +.card-top .eyebrow{ + letter-spacing:1.2px +} +.badge{ + font:9px/1.5 monospace; + border:1px solid currentColor; + padding:5px 7px; + letter-spacing:.5px; + opacity:.8 +} +.illustration{ + height:252px; + position:relative; + overflow:hidden; + border-block:1px solid #213b3126; + background-size:24px 24px; + background-image:linear-gradient(#213b310b 1px,transparent 1px),linear-gradient(90deg,#213b310b 1px,transparent 1px) +} +.illustration svg{ + height:218px; + stroke-width:1.25; + stroke:#597562 +} +.instrument .circuit{ + stroke:#7c927d +} +.instrument .pulse{ + stroke:#213b31; + stroke-width:2 +} +.instrument .dot{ + fill:#597562 +} +.art-caption{ + position:absolute; + bottom:13px; + left:28px; + font:9px monospace; + letter-spacing:1.5px; + opacity:.75 +} +.factory{ + background-image:linear-gradient(#76bdc508 1px,transparent 1px),linear-gradient(90deg,#76bdc508 1px,transparent 1px); + border-color:#6097a12b +} +.factory svg{ + stroke:#527b83 +} +.factory .floor{ + fill:#1d3740 +} +.factory .plinth{ + fill:#17323a; + stroke:#81abb0 +} +.factory .wafer{ + fill:#183f43; + stroke:#b5e4ce +} +.factory .gantry{ + stroke:#c9d9c9; + stroke-width:4 +} +.factory .laser,.factory .signal{ + stroke:#dabb7f; + stroke-width:3 +} +.card-body{ + padding:30px 32px; + display:flex; + flex-direction:column; + flex:1 +} +.edition{ + font:10px monospace; + letter-spacing:2px; + opacity:.7; + margin-bottom:12px +} +.game-card h2{ + font-size:48px; + font-weight:500; + letter-spacing:-2px; + margin-bottom:17px +} +.seed-card h2 span{ + color:#dabb7f +} +.description{ + font-size:15px; + line-height:1.75; + max-width:480px; + min-height:105px +} +.specs{ + margin:26px 0 24px; + border-top:1px solid #213b3133 +} +.specs>div{ + padding:13px 0; + display:grid; + grid-template-columns:85px 1fr; + gap:12px; + border-bottom:1px solid #213b3126 +} +.specs dt{ + font:10px/1.7 monospace; + text-transform:uppercase; + opacity:.7 +} +.specs dd{ + font-size:12px; + line-height:1.65 +} +.seed-card .specs,.seed-card .specs>div{ + border-color:#6a92954a +} +.performance-note{ + font-size:12px; + line-height:1.7; + border-left:2px solid #dabb7f; + padding-left:12px; + color:#c9c6af; + margin-bottom:24px +} +.performance-note strong{ + color:#e2c892 +} +.play-link{ + display:flex; + align-items:center; + justify-content:space-between; + gap:18px; + padding:18px 20px; + text-decoration:none; + background:#233c31; + color:#f0eedc; + font-size:14px; + margin-top:auto; + min-height:56px +} +.play-link>span{ + font-size:24px +} +.play-link:hover{ + background:#345441 +} +.seed-card .play-link{ + background:#d9b77b; + color:#16272a +} +.seed-card .play-link:hover{ + background:#ebcd96 +} +.card-footnote{ + font-size:11px; + line-height:1.7; + opacity:.72; + margin-top:13px; + min-height:38px +} +.choice-note{ + text-align:center; + color:var(--muted); + font:11px/1.8 monospace; + margin:23px 0 76px +} +.credits{ + display:grid; + grid-template-columns:1fr 1.3fr; + gap:85px; + padding:45px 0; + border-top:1px solid var(--line); + scroll-margin-top:25px +} +.credits-heading .eyebrow{ + color:#d8b884 +} +.credits h2{ + font:36px/1.2 Georgia,serif; + margin:19px 0 +} +.credits-heading>p:last-child{ + font-size:14px; + line-height:1.8; + color:var(--muted); + max-width:380px +} +.credit-list>div{ + padding:0 0 23px; + margin-bottom:23px; + border-bottom:1px solid var(--line) +} +.credit-list>div:last-child{ + margin-bottom:0 +} +.credit-list dt{ + font-size:17px; + margin-bottom:10px +} +.credit-list dt span{ + font:9px monospace; + color:#b1c0ad; + letter-spacing:1px; + margin-left:12px +} +.credit-list dd{ + font-size:13px; + color:var(--muted); + line-height:1.8 +} +.origin{ + display:flex; + gap:32px; + align-items:baseline; + padding:28px 0 42px +} +.origin .eyebrow{ + white-space:nowrap; + color:#d8b884 +} +.origin p{ + font-size:12px; + line-height:1.9; + color:var(--muted); + max-width:850px +} +footer{ + padding:25px 0 35px; + border-top:1px solid var(--line); + display:flex; + justify-content:space-between; + gap:24px; + font:10px/1.8 monospace; + color:var(--muted) +} +.skip-link{ + position:absolute; + left:20px; + top:-100px; + background:#e6e4d4; + color:#213b31; + padding:14px; + z-index:5 +} +.skip-link:focus{ + top:10px +} +@media(max-width:1100px){ + .site-shell{ + padding:0 32px + } + .intro-row{ + gap:25px + } + .card-top{ + padding:20px; + flex-wrap:wrap + } + .card-body{ + padding:26px 24px + } + .game-card h2{ + font-size:42px + } + .description{ + min-height:132px + } + .credits{ + gap:40px + } + .badge{ + font-size:8px + } + .play-link{ + font-size:12px + } + .credit-list dt span{ + display:block; + margin:7px 0 0 + } +} +@media(max-width:760px){ + .site-shell{ + padding:0 20px + } + .site-header{ + padding:22px 0; + gap:12px + } + .brand{ + font-size:11px; + letter-spacing:1px; + gap:10px + } + .site-header nav{ + gap:14px; + font-size:11px + } + .intro{ + padding:42px 0 30px + } + .intro-row{ + display:block + } + h1{ + font-size:60px; + letter-spacing:-3px + } + h1 em{ + letter-spacing:-3px + } + .intro-note{ + margin-top:24px; + font-size:15px; + max-width:none + } + .intro-note br{ + display:none + } + .intro-note span{ + margin-top:7px + } + .versions{ + grid-template-columns:1fr; + gap:24px + } + .card-top{ + justify-content:space-between + } + .description{ + min-height:0 + } + .game-card h2{ + font-size:46px + } + .card-body{ + padding:27px 24px + } + .illustration{ + height:225px + } + .illustration svg{ + height:195px + } + .card-footnote{ + min-height:0 + } + .play-link{ + font-size:14px + } + .choice-note{ + margin-bottom:42px + } + .credits{ + grid-template-columns:1fr; + gap:30px; + padding-top:34px + } + .credits h2{ + font-size:34px + } + .credits-heading>p:last-child{ + max-width:none + } + .credit-list dt span{ + display:inline; + margin-left:12px + } + .origin{ + display:block; + padding-bottom:30px + } + .origin p{ + margin-top:14px + } + footer{ + flex-wrap:wrap; + font-size:9px + } +} +@media(max-width:390px){ + h1{ + font-size:49px + } + .brand>span{ + display:none + } + .card-body{ + padding:24px 20px + } + .card-top{ + padding:18px 20px + } + .specs>div{ + grid-template-columns:72px 1fr + } + .play-link{ + font-size:12px + } +} diff --git a/src/landing.ts b/src/landing.ts new file mode 100644 index 0000000..eb4f39c --- /dev/null +++ b/src/landing.ts @@ -0,0 +1,13 @@ +// The chooser starts neither game. Its only script keeps the existing +// same-origin app-shell service worker up to date after the root-page move. +if ('serviceWorker' in navigator && import.meta.env.PROD) { + window.addEventListener('load', () => { + navigator.serviceWorker.register(new URL('./sw.js', window.location.href)).catch(() => {}); + }); +} + +// The standalone Godot development server uses a different port. +if (import.meta.env.DEV) { + const factoryLink = document.querySelector('[data-factory-link]'); + if (factoryLink) factoryLink.href = 'http://localhost:4180/'; +} diff --git a/src/main.tsx b/src/main.tsx index 165dde7..2a39253 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -13,8 +13,8 @@ createRoot(document.getElementById('root')!).render( if ('serviceWorker' in navigator && import.meta.env.PROD) { window.addEventListener('load', () => { // Resolved against the document URL, not the bundle's — sw.js sits at the - // site root so its scope covers the whole app. - navigator.serviceWorker.register(`${import.meta.env.BASE_URL}sw.js`).catch(() => { + // site root so its scope covers the chooser and the classic game. + navigator.serviceWorker.register(new URL('../sw.js', window.location.href)).catch(() => { // Offline play is a bonus, not a requirement. }); }); diff --git a/src/utils/pixelArt.ts b/src/utils/pixelArt.ts deleted file mode 100644 index bc69981..0000000 --- a/src/utils/pixelArt.ts +++ /dev/null @@ -1,946 +0,0 @@ -// Modern Indie-Game High-Detail Canvas Visualizer Engine -// Universal AI: Solarpunk Sanctuary vs. Cyberpunk Syndicate Architecture - -export function renderPixelArtCanvas( - ctx: CanvasRenderingContext2D, - width: number, - height: number, - alignment: number, // -100 (Cyberpunk) to +100 (Solarpunk) - npus: number, - silicon: number, - npuFabCount: number, - megaFabCount: number, - quantumLevel: number, - quantumPhotons: { id: number; value: number }[], - phase: number, - probesCount: number, - tick: number, - crtFilterEnabled: boolean, - driftersCount: number = 0, - honor: number = 0, - hazardCombat: number = 0, - probesLostInCombat: number = 0, - driftersDefeated: number = 0, - lastBattleOutcome: string = 'PATROL' -) { - // Normalize alignment to 0 (100% Cyberpunk) .. 1 (100% Solarpunk) - const normAlign = Math.min(1, Math.max(0, (alignment + 100) / 200)); - - ctx.save(); - ctx.clearRect(0, 0, width, height); - - // Enable crisp vector smoothing for modern indie game aesthetic - ctx.imageSmoothingEnabled = true; - - if (phase <= 2) { - // ========================================================================= - // PHASES 1 & 2: MODERN HIGH-DETAIL FACTORY & SKYLINE ENVIRONMENT - // ========================================================================= - - // 1. Dynamic Atmospheric Background & Sky Gradient - drawAtmosphereAndSky(ctx, width, height, normAlign, tick); - - // 2. Parallax Skyline Architecture (Solar Domes vs Neon Megastructures) - drawParallaxSkyline(ctx, width, height, normAlign, tick); - - // 3. Volumetric Light Rays & Environmental Particles - drawVolumetricAtmosphere(ctx, width, height, normAlign, tick); - - // 4. Modern Factory Assembly Floor - const floorY = Math.floor(height * 0.72); - drawIndieFactoryFloor(ctx, width, height, floorY, normAlign, tick); - - // 5. Motorized High-Detail Silicon Wafer Spool Core - const spoolX = 28; - const spoolY = floorY - 42; - drawModernIndieSiliconSpool(ctx, spoolX, spoolY, silicon, normAlign, tick); - - // 6. Precision Conveyor Assembly Belt - const beltX = 72; - const beltW = width - 144; - const beltY = floorY - 18; - drawIndieConveyorBelt(ctx, beltX, beltY, beltW, tick, normAlign); - - // 7. Glossy NPU Microchip Dies Riding Conveyor - const chipCountToShow = Math.min(16, Math.max(1, Math.floor(npus / 5) + 1)); - for (let i = 0; i < chipCountToShow; i++) { - const cx = beltX + ((i * 24 + tick * 1.2) % (beltW - 14)); - const cy = beltY - 9; - drawIndieNpu(ctx, cx, cy, normAlign); - } - - // 8. Articulated EUV Lithography Laser Arm with Hydraulic Pistons - const stampX = Math.floor(width * 0.58); - const stampY = floorY - 68; - drawRoboticFabArm(ctx, stampX, stampY, npuFabCount + megaFabCount, tick, normAlign); - - // 9. Storage Vault & Digital Containment Vessel - const crateX = width - 62; - const crateY = floorY - 40; - drawStorageVault(ctx, crateX, crateY, npus, normAlign, tick); - - // 10. Interactive Floating AI Mascot Companion ("NPU-E / AURA") - const mascotX = Math.floor(width * 0.36); - const mascotY = Math.floor(height * 0.32); - drawIndieAIMascot(ctx, mascotX, mascotY, tick, normAlign); - - // 11. Quantum Core Photon Matrix Subsystem - if (quantumLevel > 0) { - const qX = Math.floor(width * 0.84); - const qY = Math.floor(height * 0.28); - drawIndieQuantumCore(ctx, qX, qY, quantumPhotons, tick, normAlign); - } - } else { - // ========================================================================= - // PHASE 3: MODERN INDIE DEEP-SPACE VON NEUMANN TACTICAL COMBAT VISUALIZER - // ========================================================================= - drawIndieCosmicCombatVisualizer( - ctx, - width, - height, - probesCount, - tick, - normAlign, - driftersCount, - honor, - hazardCombat, - probesLostInCombat, - driftersDefeated, - lastBattleOutcome - ); - } - - // 12. Optional Arcade CRT Scanline & Lens Glow - if (crtFilterEnabled) { - drawCRTLensOverlay(ctx, width, height); - } - - ctx.restore(); -} - -// ============================================================================= -// COLOR HELPERS & INDIE GRADIENTS -// ============================================================================= - -function interpolateRGB(c1: string, c2: string, factor: number): string { - const f = Math.min(1, Math.max(0, factor)); - const r1 = parseInt(c1.substring(1, 3), 16); - const g1 = parseInt(c1.substring(3, 5), 16); - const b1 = parseInt(c1.substring(5, 7), 16); - - const r2 = parseInt(c2.substring(1, 3), 16); - const g2 = parseInt(c2.substring(3, 5), 16); - const b2 = parseInt(c2.substring(5, 7), 16); - - const r = Math.round(r1 + f * (r2 - r1)); - const g = Math.round(g1 + f * (g2 - g1)); - const b = Math.round(b1 + f * (b2 - b1)); - - return `rgb(${r}, ${g}, ${b})`; -} - -// ============================================================================= -// ATMOSPHERE & ENVIRONMENT -// ============================================================================= - -function drawAtmosphereAndSky( - ctx: CanvasRenderingContext2D, - w: number, - h: number, - normAlign: number, - _tick: number -) { - const grad = ctx.createLinearGradient(0, 0, 0, h * 0.72); - if (normAlign >= 0.5) { - // Solarpunk: Warm sunrise teal to emerald bio-canopy sky - const t = (normAlign - 0.5) * 2; - grad.addColorStop(0, interpolateRGB('#0b2416', '#09331e', t)); - grad.addColorStop(0.5, interpolateRGB('#163c26', '#124e2e', t)); - grad.addColorStop(1, interpolateRGB('#332612', '#4d3714', t)); - } else { - // Cyberpunk: Synthwave magenta-purple to dark obsidian grid sky - const t = (0.5 - normAlign) * 2; - grad.addColorStop(0, interpolateRGB('#0d051c', '#070114', t)); - grad.addColorStop(0.5, interpolateRGB('#1a0836', '#21033d', t)); - grad.addColorStop(1, interpolateRGB('#2b0742', '#360244', t)); - } - - ctx.fillStyle = grad; - ctx.fillRect(0, 0, w, h * 0.72); -} - -function drawParallaxSkyline( - ctx: CanvasRenderingContext2D, - w: number, - h: number, - normAlign: number, - tick: number -) { - const horizonY = h * 0.72; - - if (normAlign >= 0.5) { - // Solarpunk: Terraced Glass Domes, Bio-Spire Trees & Wind Turbines - ctx.save(); - // Background Domes - ctx.fillStyle = 'rgba(20, 83, 45, 0.4)'; - for (let i = 0; i < 4; i++) { - const dx = ((i * 180 + tick * 0.2) % (w + 200)) - 100; - ctx.beginPath(); - ctx.arc(dx, horizonY, 65, Math.PI, 0); - ctx.fill(); - } - - // Solar Wind Turbines - const turbineX = [50, 160, w - 120]; - turbineX.forEach((x, idx) => { - ctx.strokeStyle = 'rgba(252, 211, 77, 0.4)'; - ctx.lineWidth = 2; - ctx.beginPath(); - ctx.moveTo(x, horizonY); - ctx.lineTo(x, horizonY - 45); - ctx.stroke(); - - // Spinning Blade Rotor - const angle = tick * 0.04 + idx; - ctx.save(); - ctx.translate(x, horizonY - 45); - ctx.rotate(angle); - ctx.strokeStyle = 'rgba(251, 191, 36, 0.8)'; - ctx.lineWidth = 1.5; - for (let b = 0; b < 3; b++) { - ctx.rotate((Math.PI * 2) / 3); - ctx.beginPath(); - ctx.moveTo(0, 0); - ctx.lineTo(0, -18); - ctx.stroke(); - } - ctx.restore(); - }); - ctx.restore(); - } else { - // Cyberpunk: Neon Skyscrapers, Holographic Billboards & Sky Aerocars - ctx.save(); - // Silhouetted Skyscrapers - const buildings = [ - { x: 10, w: 45, h: 90 }, - { x: 60, w: 35, h: 120 }, - { x: 105, w: 50, h: 80 }, - { x: 180, w: 60, h: 110 }, - { x: w - 140, w: 40, h: 130 }, - { x: w - 90, w: 55, h: 95 }, - ]; - - buildings.forEach((b) => { - ctx.fillStyle = 'rgba(15, 23, 42, 0.85)'; - ctx.fillRect(b.x, horizonY - b.h, b.w, b.h); - - // Window Matrix Lines - ctx.fillStyle = 'rgba(56, 189, 248, 0.3)'; - for (let wy = horizonY - b.h + 8; wy < horizonY - 10; wy += 12) { - for (let wx = b.x + 6; wx < b.x + b.w - 6; wx += 8) { - if ((wx + wy + Math.floor(tick / 10)) % 7 !== 0) { - ctx.fillRect(wx, wy, 4, 6); - } - } - } - - // Roof Beacon Light - ctx.fillStyle = 'rgba(244, 63, 94, 0.9)'; - ctx.fillRect(b.x + b.w / 2 - 1, horizonY - b.h - 3, 2, 3); - }); - - // Flying Aerocars - const carX = (tick * 1.5) % (w + 100) - 50; - const carY = horizonY - 85 + Math.sin(tick * 0.05) * 8; - ctx.fillStyle = '#00f0ff'; - ctx.shadowColor = '#00f0ff'; - ctx.shadowBlur = 8; - ctx.fillRect(carX, carY, 12, 3); - ctx.fillStyle = '#ff007f'; - ctx.fillRect(carX - 4, carY + 1, 4, 1); - ctx.shadowBlur = 0; - - ctx.restore(); - } -} - -function drawVolumetricAtmosphere( - ctx: CanvasRenderingContext2D, - w: number, - h: number, - normAlign: number, - tick: number -) { - ctx.save(); - // Environmental Particles (Golden Pollen vs Cyber Neon Sparks) - const isSolar = normAlign >= 0.5; - const particleColor = isSolar ? 'rgba(251, 191, 36, ' : 'rgba(0, 240, 255, '; - - for (let i = 0; i < 25; i++) { - const px = (i * 37 + tick * (isSolar ? 0.3 : 0.8)) % w; - const py = (i * 23 + Math.sin(tick * 0.03 + i) * 15) % (h * 0.68); - const opacity = 0.2 + (Math.sin(tick * 0.05 + i) + 1) * 0.3; - - ctx.fillStyle = `${particleColor}${opacity})`; - ctx.beginPath(); - ctx.arc(px, py, isSolar ? 1.5 : 1, 0, Math.PI * 2); - ctx.fill(); - } - ctx.restore(); -} - -// ============================================================================= -// INDIE FACTORY FLOOR & MACHINERY -// ============================================================================= - -function drawIndieFactoryFloor( - ctx: CanvasRenderingContext2D, - w: number, - h: number, - floorY: number, - normAlign: number, - tick: number -) { - ctx.save(); - const isSolar = normAlign >= 0.5; - - // Floor Base Surface - const floorGrad = ctx.createLinearGradient(0, floorY, 0, h); - if (isSolar) { - floorGrad.addColorStop(0, '#1c1917'); - floorGrad.addColorStop(1, '#0c0a09'); - } else { - floorGrad.addColorStop(0, '#0f172a'); - floorGrad.addColorStop(1, '#020617'); - } - ctx.fillStyle = floorGrad; - ctx.fillRect(0, floorY, w, h - floorY); - - // Top Edge Trim Line - ctx.fillStyle = isSolar ? '#f59e0b' : '#00f0ff'; - ctx.fillRect(0, floorY, w, 2); - - // Isometric Grid Tile Pattern - ctx.strokeStyle = isSolar ? 'rgba(217, 119, 6, 0.18)' : 'rgba(56, 189, 248, 0.18)'; - ctx.lineWidth = 1; - for (let x = 0; x < w; x += 32) { - ctx.beginPath(); - ctx.moveTo(x, floorY); - ctx.lineTo(x + 16, h); - ctx.stroke(); - } - - // Energy Conduits Pulsing across floor - const pulseX = (tick * 2) % w; - ctx.fillStyle = isSolar ? 'rgba(251, 191, 36, 0.6)' : 'rgba(0, 240, 255, 0.6)'; - ctx.shadowColor = isSolar ? '#fbbf24' : '#00f0ff'; - ctx.shadowBlur = 6; - ctx.fillRect(pulseX, floorY + 6, 24, 2); - ctx.shadowBlur = 0; - - ctx.restore(); -} - -function drawModernIndieSiliconSpool( - ctx: CanvasRenderingContext2D, - x: number, - y: number, - silicon: number, - normAlign: number, - tick: number -) { - ctx.save(); - const isSolar = normAlign >= 0.5; - - // Outer Support Frame - ctx.fillStyle = isSolar ? '#78350f' : '#1e293b'; - ctx.fillRect(x - 12, y + 10, 24, 28); - - // Silicon Wafer Stack Cylinder - const spoolRadius = Math.min(18, Math.max(8, Math.floor(silicon / 150) + 8)); - const drumColor = isSolar ? '#10b981' : '#38bdf8'; - - // Silicon Ingot Stack - ctx.fillStyle = drumColor; - ctx.beginPath(); - ctx.arc(x, y + 16, spoolRadius, 0, Math.PI * 2); - ctx.fill(); - - // Shiny Metallic Crystalline Facets - ctx.strokeStyle = isSolar ? '#a7f3d0' : '#e0f2fe'; - ctx.lineWidth = 2; - ctx.beginPath(); - ctx.arc(x, y + 16, spoolRadius, 0, Math.PI * 2); - ctx.stroke(); - - // Spinning Center Hub - const angle = tick * 0.05; - ctx.save(); - ctx.translate(x, y + 16); - ctx.rotate(angle); - ctx.fillStyle = isSolar ? '#34d399' : '#0284c7'; - ctx.fillRect(-3, -3, 6, 6); - ctx.restore(); - - // Silicon Wafer Track Strand - ctx.strokeStyle = drumColor; - ctx.lineWidth = 2; - ctx.beginPath(); - ctx.moveTo(x + spoolRadius, y + 16); - ctx.quadraticCurveTo(x + 28, y + 26, x + 44, y + 26); - ctx.stroke(); - - ctx.restore(); -} - -function drawIndieConveyorBelt( - ctx: CanvasRenderingContext2D, - x: number, - y: number, - w: number, - tick: number, - normAlign: number -) { - ctx.save(); - const isSolar = normAlign >= 0.5; - - // Base Housing Frame - ctx.fillStyle = isSolar ? '#292524' : '#0f172a'; - ctx.fillRect(x, y, w, 16); - - // Moving Treads - const treadOffset = (tick * 1.2) % 12; - ctx.fillStyle = isSolar ? '#78350f' : '#0284c7'; - - for (let tx = x + treadOffset - 12; tx < x + w; tx += 12) { - if (tx >= x && tx <= x + w - 6) { - ctx.fillRect(tx, y + 2, 6, 12); - } - } - - // Top Glowing Rail Edge - ctx.fillStyle = isSolar ? '#f59e0b' : '#38bdf8'; - ctx.fillRect(x, y, w, 2); - - // Spinning Roller Gears at ends - [x + 6, x + w - 6].forEach((rx) => { - ctx.fillStyle = '#475569'; - ctx.beginPath(); - ctx.arc(rx, y + 8, 6, 0, Math.PI * 2); - ctx.fill(); - }); - - ctx.restore(); -} - -function drawIndieNpu( - ctx: CanvasRenderingContext2D, - x: number, - y: number, - normAlign: number -) { - ctx.save(); - const isSolar = normAlign >= 0.5; - - // High-Detail NPU Microchip Die - const chipSize = 14; - const chipX = x; - const chipY = y - 4; - - // Outer Substrate - ctx.fillStyle = isSolar ? '#064e3b' : '#0f172a'; - ctx.strokeStyle = isSolar ? '#34d399' : '#00f0ff'; - ctx.shadowColor = isSolar ? '#10b981' : '#00f0ff'; - ctx.shadowBlur = 6; - ctx.lineWidth = 1.5; - - ctx.fillRect(chipX, chipY, chipSize, chipSize); - ctx.strokeRect(chipX, chipY, chipSize, chipSize); - - // Golden Pin Contacts on edges - ctx.fillStyle = '#fbbf24'; - ctx.fillRect(chipX + 2, chipY - 2, 2, 2); - ctx.fillRect(chipX + 6, chipY - 2, 2, 2); - ctx.fillRect(chipX + 10, chipY - 2, 2, 2); - - ctx.fillRect(chipX + 2, chipY + chipSize, 2, 2); - ctx.fillRect(chipX + 6, chipY + chipSize, 2, 2); - ctx.fillRect(chipX + 10, chipY + chipSize, 2, 2); - - // Glowing Neural Core Center - ctx.fillStyle = isSolar ? '#fef08a' : '#c084fc'; - ctx.fillRect(chipX + 4, chipY + 4, 6, 6); - - ctx.shadowBlur = 0; - ctx.restore(); -} - -function drawRoboticFabArm( - ctx: CanvasRenderingContext2D, - x: number, - y: number, - fabCount: number, - tick: number, - normAlign: number -) { - ctx.save(); - const isSolar = normAlign >= 0.5; - - // Hydraulic Vertical Motion - const strokeY = Math.sin(tick * (fabCount > 0 ? 0.15 : 0.02)) * 6; - - // Overhead Base Mount - ctx.fillStyle = isSolar ? '#451a03' : '#1e1b4b'; - ctx.fillRect(x - 16, y - 20, 32, 14); - - // Dual Hydraulic Pistons - ctx.fillStyle = '#64748b'; - ctx.fillRect(x - 10, y - 6, 4, 24 + strokeY); - ctx.fillRect(x + 6, y - 6, 4, 24 + strokeY); - - // EUV Lithography Laser Stamper Head - const headY = y + 18 + strokeY; - ctx.fillStyle = isSolar ? '#b45309' : '#0369a1'; - ctx.fillRect(x - 18, headY, 36, 12); - - // Laser Cutter EUV Beam Flare (when extending down) - if (strokeY > 2) { - ctx.fillStyle = isSolar ? 'rgba(52, 211, 153, 0.9)' : 'rgba(168, 85, 247, 0.9)'; - ctx.shadowColor = isSolar ? '#34d399' : '#c084fc'; - ctx.shadowBlur = 12; - ctx.fillRect(x - 2, headY + 12, 4, 18); - - // Spark Particles - for (let s = 0; s < 4; s++) { - const sx = x + (Math.random() - 0.5) * 16; - const sy = headY + 28 + Math.random() * 6; - ctx.fillStyle = '#fef08a'; - ctx.fillRect(sx, sy, 2, 2); - } - } - - ctx.restore(); -} - -function drawStorageVault( - ctx: CanvasRenderingContext2D, - x: number, - y: number, - npus: number, - normAlign: number, - _tick: number -) { - ctx.save(); - const isSolar = normAlign >= 0.5; - - // Vault Glass Body - ctx.fillStyle = isSolar ? 'rgba(217, 119, 6, 0.2)' : 'rgba(14, 165, 233, 0.2)'; - ctx.strokeStyle = isSolar ? '#f59e0b' : '#38bdf8'; - ctx.lineWidth = 2; - ctx.fillRect(x, y, 36, 38); - ctx.strokeRect(x, y, 36, 38); - - // Stored Content Fill Level - const fillPct = Math.min(1, npus / 1000); - const fillHeight = Math.floor(34 * fillPct); - - if (fillHeight > 0) { - ctx.fillStyle = isSolar ? 'rgba(52, 211, 153, 0.65)' : 'rgba(0, 240, 255, 0.65)'; - ctx.fillRect(x + 2, y + 36 - fillHeight, 32, fillHeight); - } - - // Holographic Level Gauge Marker - ctx.fillStyle = isSolar ? '#fef3c7' : '#e0f2fe'; - ctx.font = 'bold 9px monospace'; - ctx.fillText(`${Math.floor(npus)}`, x + 2, y - 4); - - ctx.restore(); -} - -function drawIndieAIMascot( - ctx: CanvasRenderingContext2D, - x: number, - y: number, - tick: number, - normAlign: number -) { - ctx.save(); - const isSolar = normAlign >= 0.5; - - // Floating Levitation Motion - const floatY = y + Math.sin(tick * 0.06) * 5; - - // Outer Energy Halo - const haloColor = isSolar ? '#f59e0b' : '#00f0ff'; - ctx.shadowColor = haloColor; - ctx.shadowBlur = 10; - ctx.strokeStyle = haloColor; - ctx.lineWidth = 1.5; - - ctx.beginPath(); - ctx.arc(x, floatY, 16 + Math.sin(tick * 0.1) * 2, 0, Math.PI * 2); - ctx.stroke(); - - // Core Spherical Drone Body - const bodyGrad = ctx.createRadialGradient(x - 3, floatY - 3, 2, x, floatY, 12); - if (isSolar) { - bodyGrad.addColorStop(0, '#fef3c7'); - bodyGrad.addColorStop(1, '#b45309'); - } else { - bodyGrad.addColorStop(0, '#e0f2fe'); - bodyGrad.addColorStop(1, '#0369a1'); - } - ctx.fillStyle = bodyGrad; - ctx.beginPath(); - ctx.arc(x, floatY, 12, 0, Math.PI * 2); - ctx.fill(); - - // Expressive Animated Digital Visor / Eyes - ctx.fillStyle = isSolar ? '#15803d' : '#00f0ff'; - const eyeBlink = Math.sin(tick * 0.08) > 0.95; - - if (!eyeBlink) { - ctx.fillRect(x - 5, floatY - 2, 3, 4); - ctx.fillRect(x + 2, floatY - 2, 3, 4); - } else { - ctx.fillRect(x - 5, floatY, 3, 1); - ctx.fillRect(x + 2, floatY, 3, 1); - } - - ctx.shadowBlur = 0; - ctx.restore(); -} - -function drawIndieQuantumCore( - ctx: CanvasRenderingContext2D, - x: number, - y: number, - photons: { id: number; value: number }[], - tick: number, - normAlign: number -) { - ctx.save(); - const isSolar = normAlign >= 0.5; - - // Floating Quantum Containment Field - ctx.strokeStyle = isSolar ? '#a855f7' : '#ec4899'; - ctx.lineWidth = 1.5; - ctx.shadowColor = isSolar ? '#c084fc' : '#f472b6'; - ctx.shadowBlur = 8; - - const ringRadius = 22; - const angle = tick * 0.04; - - // Orbiting Containment Rings - ctx.save(); - ctx.translate(x, y); - ctx.rotate(angle); - ctx.beginPath(); - ctx.ellipse(0, 0, ringRadius, ringRadius / 2, 0, 0, Math.PI * 2); - ctx.stroke(); - ctx.restore(); - - // Quantum Photon Orbs inside matrix - photons.forEach((p, idx) => { - const pAngle = angle * 2 + (idx * Math.PI * 2) / photons.length; - const px = x + Math.cos(pAngle) * 14; - const py = y + Math.sin(pAngle) * 14; - - ctx.fillStyle = p.value >= 0 ? '#38bdf8' : '#f43f5e'; - ctx.beginPath(); - ctx.arc(px, py, 3, 0, Math.PI * 2); - ctx.fill(); - }); - - ctx.shadowBlur = 0; - ctx.restore(); -} - -// ============================================================================= -// PHASE 3: DEEP SPACE VON NEUMANN TACTICAL COMBAT VISUALIZER -// ============================================================================= - -function drawIndieCosmicCombatVisualizer( - ctx: CanvasRenderingContext2D, - w: number, - h: number, - probesCount: number, - tick: number, - normAlign: number, - driftersCount: number, - _honor: number, - hazardCombat: number, - probesLostInCombat: number, - driftersDefeated: number, - _lastBattleOutcome: string -) { - ctx.save(); - - // 1. Deep Cosmic Space & Dynamic Nebula Atmosphere - const spaceGrad = ctx.createRadialGradient(w / 2, h / 2, 20, w / 2, h / 2, w); - spaceGrad.addColorStop(0, '#0c051d'); - spaceGrad.addColorStop(0.6, '#04010a'); - spaceGrad.addColorStop(1, '#000000'); - ctx.fillStyle = spaceGrad; - ctx.fillRect(0, 0, w, h); - - // Hostile Red Nebula Flare when Drifters are attacking - if (driftersCount > 0) { - const drifterGlow = ctx.createRadialGradient(w * 0.8, h * 0.4, 10, w * 0.8, h * 0.4, 160); - drifterGlow.addColorStop(0, 'rgba(239, 68, 68, 0.25)'); - drifterGlow.addColorStop(1, 'rgba(0, 0, 0, 0)'); - ctx.fillStyle = drifterGlow; - ctx.fillRect(0, 0, w, h); - } - - // Friendly Swarm Fleet Nebula - const friendlyGlow = ctx.createRadialGradient(w * 0.25, h * 0.5, 10, w * 0.25, h * 0.5, 140); - friendlyGlow.addColorStop(0, normAlign >= 0.5 ? 'rgba(56, 189, 248, 0.2)' : 'rgba(168, 85, 247, 0.2)'); - friendlyGlow.addColorStop(1, 'rgba(0, 0, 0, 0)'); - ctx.fillStyle = friendlyGlow; - ctx.fillRect(0, 0, w, h); - - // 2. Parallax Starfield - for (let i = 0; i < 50; i++) { - const sx = (i * 73 + tick * 0.15) % w; - const sy = (i * 41 + Math.sin(i * 1.5) * 15) % h; - const brightness = 0.2 + (Math.sin(tick * 0.04 + i) + 1) * 0.4; - ctx.fillStyle = `rgba(255, 255, 255, ${brightness})`; - ctx.fillRect(sx, sy, i % 6 === 0 ? 2 : 1, i % 6 === 0 ? 2 : 1); - } - - // 3. Tactical Sector Radar Grid Lines - ctx.strokeStyle = normAlign >= 0.5 ? 'rgba(52, 211, 153, 0.12)' : 'rgba(168, 85, 247, 0.12)'; - ctx.lineWidth = 1; - const radarCenterX = w * 0.35; - const radarCenterY = h * 0.45; - for (let r = 40; r <= 220; r += 45) { - ctx.beginPath(); - ctx.arc(radarCenterX, radarCenterY, r, 0, Math.PI * 2); - ctx.stroke(); - } - // Radar Sweep Beam - const sweepAngle = (tick * 0.03) % (Math.PI * 2); - ctx.strokeStyle = 'rgba(56, 189, 248, 0.25)'; - ctx.beginPath(); - ctx.moveTo(radarCenterX, radarCenterY); - ctx.lineTo( - radarCenterX + Math.cos(sweepAngle) * 180, - radarCenterY + Math.sin(sweepAngle) * 180 - ); - ctx.stroke(); - - // 4. Render Friendly Von Neumann Swarm Probes (Left Sector) - const probeColor = normAlign >= 0.5 ? '#38bdf8' : '#c084fc'; - const probeGlowColor = normAlign >= 0.5 ? '#0ea5e9' : '#a855f7'; - const visibleProbes = Math.min(28, Math.max(4, Math.floor(Math.log10(probesCount + 1) * 6) + 4)); - - const friendlyPositions: { x: number; y: number }[] = []; - - for (let i = 0; i < visibleProbes; i++) { - const row = i % 4; - const col = Math.floor(i / 4); - const px = 40 + col * 26 + Math.sin(tick * 0.05 + i) * 6; - const py = 35 + row * 32 + Math.cos(tick * 0.04 + i * 2) * 8; - friendlyPositions.push({ x: px, y: py }); - - // Probe Chevron Hull - ctx.fillStyle = probeColor; - ctx.shadowColor = probeGlowColor; - ctx.shadowBlur = 8; - - ctx.beginPath(); - ctx.moveTo(px + 8, py); // Nose pointing right toward enemy - ctx.lineTo(px - 6, py - 5); - ctx.lineTo(px - 2, py); - ctx.lineTo(px - 6, py + 5); - ctx.closePath(); - ctx.fill(); - - // Engine Thruster Flame - ctx.fillStyle = '#f43f5e'; - ctx.fillRect(px - 8, py - 1, 3 + (tick + i) % 3, 2); - - // Hazard Shield Glow around Probes - if (hazardCombat > 0) { - ctx.strokeStyle = 'rgba(56, 189, 248, 0.35)'; - ctx.lineWidth = 1; - ctx.beginPath(); - ctx.arc(px, py, 11, 0, Math.PI * 2); - ctx.stroke(); - } - } - - // 5. Render Hostile Space Drifters (Right Sector) - const driftersPositions: { x: number; y: number }[] = []; - const visibleDrifters = Math.min(24, driftersCount > 0 ? Math.max(3, Math.floor(Math.log10(driftersCount + 1) * 6) + 2) : 0); - - if (driftersCount > 0) { - for (let d = 0; d < visibleDrifters; d++) { - const row = d % 3; - const col = Math.floor(d / 3); - const dx = w - 50 - col * 28 + Math.cos(tick * 0.06 + d) * 8; - const dy = 40 + row * 38 + Math.sin(tick * 0.05 + d * 2) * 10; - driftersPositions.push({ x: dx, y: dy }); - - // Hostile Crimson Interceptor Hull - ctx.fillStyle = '#ef4444'; - ctx.shadowColor = '#dc2626'; - ctx.shadowBlur = 10; - - ctx.beginPath(); - ctx.moveTo(dx - 9, dy); // Nose pointing left toward probes - ctx.lineTo(dx + 6, dy - 6); - ctx.lineTo(dx + 2, dy); - ctx.lineTo(dx + 6, dy + 6); - ctx.closePath(); - ctx.fill(); - - // Optical Crimson Core - ctx.fillStyle = '#fef08a'; - ctx.fillRect(dx - 3, dy - 1, 2, 2); - - // Targeting Lock Reticle - if ((tick + d) % 6 < 4) { - ctx.strokeStyle = 'rgba(239, 68, 68, 0.6)'; - ctx.lineWidth = 1; - ctx.strokeRect(dx - 12, dy - 10, 24, 20); - } - } - } else { - // Sector Clear: Render Peaceful Stellar Outpost / Exploration Beacon - const beaconX = w - 80; - const beaconY = h * 0.45; - ctx.fillStyle = '#fbbf24'; - ctx.shadowColor = '#f59e0b'; - ctx.shadowBlur = 12; - ctx.beginPath(); - ctx.arc(beaconX, beaconY, 6, 0, Math.PI * 2); - ctx.fill(); - - // Outpost Solar Panels - ctx.fillStyle = '#0284c7'; - ctx.fillRect(beaconX - 18, beaconY - 2, 10, 4); - ctx.fillRect(beaconX + 8, beaconY - 2, 10, 4); - - // Pulse Ring - const pulseR = (tick * 1.2) % 40; - ctx.strokeStyle = 'rgba(52, 211, 153, 0.4)'; - ctx.lineWidth = 1; - ctx.beginPath(); - ctx.arc(beaconX, beaconY, pulseR, 0, Math.PI * 2); - ctx.stroke(); - } - - // 6. Active Combat Laser Fire & Particle Effects - if (driftersPositions.length > 0 && friendlyPositions.length > 0) { - // Friendly Laser Fire (Probes -> Drifters) - for (let f = 0; f < friendlyPositions.length; f++) { - if ((tick + f) % 3 === 0) { - const source = friendlyPositions[f]; - const target = driftersPositions[f % driftersPositions.length]; - - ctx.strokeStyle = normAlign >= 0.5 ? '#38bdf8' : '#e879f9'; - ctx.shadowColor = ctx.strokeStyle; - ctx.shadowBlur = 8; - ctx.lineWidth = 2; - - ctx.beginPath(); - ctx.moveTo(source.x, source.y); - ctx.lineTo(target.x, target.y); - ctx.stroke(); - - // Impact Plasma Spark - ctx.fillStyle = '#fef08a'; - ctx.fillRect(target.x - 2, target.y - 2, 4, 4); - } - } - - // Hostile Counter-Fire (Drifters -> Probes) - for (let d = 0; d < driftersPositions.length; d++) { - if ((tick + d * 2) % 4 === 0) { - const source = driftersPositions[d]; - const target = friendlyPositions[d % friendlyPositions.length]; - - ctx.strokeStyle = '#ef4444'; - ctx.shadowColor = '#f43f5e'; - ctx.shadowBlur = 8; - ctx.lineWidth = 1.5; - - ctx.beginPath(); - ctx.moveTo(source.x, source.y); - ctx.lineTo(target.x, target.y); - ctx.stroke(); - } - } - - // Sleek Directional Plasma Shockwave & Laser Energy Discharge - const impactTarget = driftersPositions[tick % driftersPositions.length]; - if (impactTarget) { - const pulseRadius = (tick % 6) * 3; - ctx.strokeStyle = 'rgba(251, 146, 60, ' + (1 - pulseRadius / 18).toFixed(2) + ')'; - ctx.shadowColor = '#f97316'; - ctx.shadowBlur = 10; - ctx.lineWidth = 1.5; - ctx.beginPath(); - ctx.arc(impactTarget.x, impactTarget.y, pulseRadius, 0, Math.PI * 2); - ctx.stroke(); - - // Energy Sparks radiating linear vectors - ctx.fillStyle = '#fef08a'; - for (let p = 0; p < 4; p++) { - const sparkAng = (p * Math.PI) / 2 + (tick * 0.2); - const dist = pulseRadius * 0.8; - ctx.fillRect( - impactTarget.x + Math.cos(sparkAng) * dist, - impactTarget.y + Math.sin(sparkAng) * dist, - 1.5, - 1.5 - ); - } - } - } - - ctx.shadowBlur = 0; - - // 7. Tactical HUD Status Strip - const stripY = h - 22; - ctx.fillStyle = 'rgba(0, 0, 0, 0.75)'; - ctx.fillRect(0, stripY, w, 22); - ctx.strokeStyle = 'rgba(51, 65, 85, 0.8)'; - ctx.lineWidth = 1; - ctx.strokeRect(0, stripY, w, 22); - - ctx.font = '9px monospace'; - ctx.fillStyle = '#38bdf8'; - ctx.fillText( - `NPU SWARM FLEET: ${probesCount.toLocaleString()} PROBES [COMBAT POWER: ${hazardCombat}]`, - 10, - stripY + 14 - ); - - ctx.fillStyle = driftersCount > 0 ? '#f43f5e' : '#34d399'; - ctx.fillText( - `DRIFTER THREAT: ${driftersCount > 0 ? `${driftersCount.toLocaleString()} HOSTILE` : '0 (SECURED)'}`, - w * 0.42, - stripY + 14 - ); - - ctx.fillStyle = '#fbbf24'; - ctx.fillText( - `KILLS: ${driftersDefeated.toLocaleString()} | CASUALTIES: ${probesLostInCombat.toLocaleString()}`, - w * 0.73, - stripY + 14 - ); - - ctx.restore(); -} - -function drawCRTLensOverlay(ctx: CanvasRenderingContext2D, w: number, h: number) { - ctx.save(); - ctx.fillStyle = 'rgba(0, 0, 0, 0.08)'; - for (let y = 0; y < h; y += 3) { - ctx.fillRect(0, y, w, 1); - } - ctx.restore(); -} diff --git a/src/utils/worldRenderer.ts b/src/utils/worldRenderer.ts new file mode 100644 index 0000000..29fc014 --- /dev/null +++ b/src/utils/worldRenderer.ts @@ -0,0 +1,301 @@ +import { GameState } from '../types'; + +export interface WorldView { + time: number; + pointerX: number; + pointerY: number; + pulse: number; +} +const TAU = Math.PI * 2; +const noise = (n: number) => { + const v = Math.sin(n * 127.1 + 311.7) * 43758.5453; + return v - Math.floor(v); +}; + +/** A bounded, procedural observatory. Visual population is logarithmic: a + * quadrillion probes must never mean a quadrillion draw calls. No game writes. */ +export function renderWorld( + ctx: CanvasRenderingContext2D, + w: number, + h: number, + state: GameState, + view: WorldView, +) { + const { time: t, pointerX: px, pointerY: py, pulse } = view; + const wide = w > 700 && h > 350; + const solar = state.alignment >= 0; + const accent = solar ? '#d4f88a' : '#b9a0ff'; + const rgb = solar ? '198,239,133' : '174,144,255'; + const cx = w * (wide ? 0.68 : 0.5) + px * 12; + const cy = h * 0.49 + py * 8; + const radius = Math.min(w * (wide ? 0.205 : 0.36), h * 0.41); + ctx.clearRect(0, 0, w, h); + const glow = ctx.createRadialGradient(cx, cy, 10, cx, cy, radius * 2.2); + glow.addColorStop(0, `rgba(${rgb},0.09)`); + glow.addColorStop(0.65, `rgba(${rgb},0.025)`); + glow.addColorStop(1, 'transparent'); + ctx.fillStyle = glow; + ctx.fillRect(0, 0, w, h); + for (let i = 0; i < 110; i++) { + const x = noise(i + 1) * w; + const y = noise(i + 450) * h; + ctx.fillStyle = `rgba(202,223,214,${0.08 + noise(i + 50) * 0.27})`; + ctx.fillRect(x + px * noise(i) * 3, y, i % 17 === 0 ? 2 : 1, 1); + } + ctx.save(); + ctx.translate(cx, cy); + const line = (color: string, width = 1) => { + ctx.strokeStyle = color; + ctx.lineWidth = width; + }; + const ellipse = (r: number, ratio: number, rotation = 0) => { + ctx.beginPath(); + ctx.ellipse(0, 0, r, r * ratio, rotation, 0, TAU); + ctx.stroke(); + }; + // Quiet measurement marks connect the render to its instrument frame. + line('rgba(159,187,177,0.11)'); + ctx.setLineDash([2, 6]); + ellipse(radius * 1.38, 0.82); + ctx.setLineDash([]); + for (let i = 0; i < 64; i++) { + const a = (i / 64) * TAU; + const r = radius * 1.38; + ctx.beginPath(); + ctx.moveTo(Math.cos(a) * r, Math.sin(a) * r * 0.82); + ctx.lineTo( + Math.cos(a) * (r + (i % 8 === 0 ? 8 : 3)), + Math.sin(a) * (r + (i % 8 === 0 ? 8 : 3)) * 0.82, + ); + ctx.stroke(); + } + if (state.phase === 1) { + // A silicon wafer, rendered as stacked elliptical planes, with a die grid + // clipped to its face. Its etch sweep advances when the player fabricates. + ctx.rotate(-0.18 + px * 0.025); + for (let layer = 18; layer >= 0; layer -= 3) { + ctx.save(); + ctx.translate(0, layer); + ctx.fillStyle = layer === 0 ? '#111e22' : '#0b1418'; + line(layer === 0 ? `rgba(${rgb},0.6)` : 'rgba(112,153,141,0.17)'); + ctx.beginPath(); + ctx.ellipse(0, 0, radius, radius * 0.61, 0, 0, TAU); + ctx.fill(); + ctx.stroke(); + ctx.restore(); + } + ctx.save(); + ctx.scale(1, 0.61); + ctx.beginPath(); + ctx.arc(0, 0, radius - 5, 0, TAU); + ctx.clip(); + ctx.rotate(t * 0.022); + const cell = radius / 6; + for (let row = -7; row <= 7; row++) + for (let col = -7; col <= 7; col++) { + const x = col * cell; + const y = row * cell; + const active = + noise((row + 8) * 17 + col) < + Math.min(0.85, 0.17 + Math.log10(state.totalNpusCreated + 1) * 0.14); + ctx.fillStyle = active + ? `rgba(${rgb},${0.09 + 0.1 * Math.sin(t * 0.6 + row) ** 2})` + : '#101c20'; + ctx.fillRect(x + 2, y + 2, cell - 4, cell - 4); + line(`rgba(${rgb},${active ? 0.36 : 0.1})`, 0.8); + ctx.strokeRect(x + 2, y + 2, cell - 4, cell - 4); + if (active) { + ctx.fillStyle = `rgba(${rgb},0.45)`; + ctx.fillRect(x + 5, y + 5, 3, 3); + } + } + const scan = Math.sin(t * 0.5) * radius; + const beam = ctx.createLinearGradient(scan - 22, 0, scan + 3, 0); + beam.addColorStop(0, 'transparent'); + beam.addColorStop(1, `rgba(${rgb},${0.25 + pulse * 0.6})`); + ctx.fillStyle = beam; + ctx.fillRect(scan - 22, -radius, 25, radius * 2); + ctx.restore(); + // The processor floats above its substrate, with physical traces and pins. + ctx.save(); + ctx.translate(0, -24 - Math.sin(t * 0.7) * 4); + ctx.scale(1, 0.61); + ctx.rotate(Math.PI / 4); + const chip = radius * 0.32; + ctx.shadowColor = accent; + ctx.shadowBlur = 16 + pulse * 45; + ctx.fillStyle = '#162822'; + line(accent, 1.5); + ctx.fillRect(-chip, -chip, chip * 2, chip * 2); + ctx.strokeRect(-chip, -chip, chip * 2, chip * 2); + ctx.shadowBlur = 0; + line(`rgba(${rgb},0.5)`); + ctx.strokeRect(-chip + 7, -chip + 7, chip * 2 - 14, chip * 2 - 14); + for (let i = -4; i <= 4; i++) + for (const side of [-1, 1]) { + const q = (i * chip) / 5; + ctx.beginPath(); + ctx.moveTo(q, side * (chip + 2)); + ctx.lineTo(q, side * (chip + 11)); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(side * (chip + 2), q); + ctx.lineTo(side * (chip + 11), q); + ctx.stroke(); + } + ctx.fillStyle = accent; + ctx.font = `600 ${radius * 0.13}px monospace`; + ctx.textAlign = 'center'; + ctx.fillText('NPU', 0, 5); + ctx.restore(); + const nodes = Math.min(16, state.npuFabCount + state.megaFabCount); + for (let i = 0; i < nodes; i++) { + const a = (i / Math.max(8, nodes)) * TAU + t * 0.06; + const x = Math.cos(a) * radius * 1.2, + y = Math.sin(a) * radius * 0.78; + line(`rgba(${rgb},0.18)`); + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x * 0.77, y * 0.77); + ctx.stroke(); + ctx.fillStyle = accent; + ctx.fillRect(x - 3, y - 3, 6, 6); + } + } else if (state.phase === 2) { + // A spherical point cloud. The conversion boundary consumes its surface. + const converted = Math.max(0, Math.min(1, 1 - state.earthMatter / 6e12)); + const atmosphere = ctx.createRadialGradient( + -radius * 0.3, + -radius * 0.25, + 0, + 0, + 0, + radius, + ); + atmosphere.addColorStop(0, `rgba(${rgb},0.11)`); + atmosphere.addColorStop(0.8, `rgba(${rgb},0.02)`); + atmosphere.addColorStop(1, `rgba(${rgb},0.18)`); + ctx.fillStyle = atmosphere; + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, TAU); + ctx.fill(); + line(`rgba(${rgb},0.15)`); + ellipse(radius, 1); + for (let i = 0; i < 1500; i++) { + const lat = Math.acos(1 - (2 * (i + 0.5)) / 1500); + const lon = Math.PI * (1 + Math.sqrt(5)) * i + t * 0.085; + const x = Math.sin(lat) * Math.cos(lon), + z = Math.sin(lat) * Math.sin(lon), + y = Math.cos(lat); + if (z < -0.2) continue; + const eaten = noise(i + 2200) < converted; + ctx.fillStyle = eaten + ? `rgba(250,151,110,${0.25 + z * 0.6})` + : `rgba(${rgb},${0.2 + z * 0.65})`; + ctx.fillRect( + x * radius, + y * radius, + z > 0.6 ? 2 : 1.2, + z > 0.6 ? 2 : 1.2, + ); + } + line(`rgba(${rgb},0.2)`); + ellipse(radius * 1.24, 0.3, -0.4); + ellipse(radius * 1.16, 0.4, 0.7); + const drones = Math.min( + 40, + 4 + Math.ceil(Math.log2(state.harvesterDrones + 1) * 3), + ); + for (let i = 0; i < drones; i++) { + const a = t * 0.23 + (i * TAU) / drones; + const x = Math.cos(a) * radius * 1.24, + y = Math.sin(a) * radius * 0.37; + ctx.fillStyle = accent; + ctx.fillRect(x - 2, y - 2, 4, 4); + if (i % 3 === 0) { + line(`rgba(${rgb},0.12)`); + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x * 0.6, y * 0.6); + ctx.stroke(); + } + } + } else { + // Accretion-like trajectories stand for the swarm, never a literal census. + const count = Math.min( + 1200, + 250 + Math.floor(Math.log10(state.probesCount + 1) * 65), + ); + ctx.rotate(-0.3); + ctx.save(); + ctx.scale(1, 0.47); + const disk = ctx.createRadialGradient( + 0, + 0, + radius * 0.25, + 0, + 0, + radius * 1.25, + ); + disk.addColorStop(0, `rgba(${rgb},0.25)`); + disk.addColorStop(0.15, `rgba(${rgb},0.10)`); + disk.addColorStop(0.7, `rgba(${rgb},0.04)`); + disk.addColorStop(1, 'transparent'); + ctx.fillStyle = disk; + ctx.beginPath(); + ctx.arc(0, 0, radius * 1.25, 0, TAU); + ctx.fill(); + for (let ring = 0; ring < 12; ring++) { + line(`rgba(${rgb},${0.02 + (12 - ring) * 0.003})`); + ellipse(radius * (0.3 + ring * 0.065), 1); + } + ctx.restore(); + for (let i = 0; i < count; i++) { + const r = radius * (0.28 + noise(i + 400) * 0.95); + const a = noise(i + 1200) * TAU + t * (0.1 + (1 - r / radius) * 0.12); + const x = Math.cos(a) * r, + y = Math.sin(a) * r * 0.47; + ctx.fillStyle = + i % 13 === 0 && state.driftersCount > 0 + ? '#fa947c' + : `rgba(${rgb},${0.2 + noise(i) * 0.7})`; + ctx.fillRect(x, y, noise(i + 4) > 0.95 ? 3 : 1.4, 1.4); + } + ctx.fillStyle = '#070d12'; + ctx.beginPath(); + ctx.arc(0, 0, radius * 0.22, 0, TAU); + ctx.fill(); + ctx.shadowColor = accent; + ctx.shadowBlur = 22; + line(`rgba(${rgb},0.8)`, 1.5); + ellipse(radius * 0.23, 1); + ctx.shadowBlur = 0; + line(`rgba(${rgb},0.12)`); + ellipse(radius * 1.1, 0.9, t * 0.04); + } + if (pulse > 0.02) { + line(`rgba(${rgb},${pulse * 0.6})`); + ellipse(radius * (1.1 + (1 - pulse) * 0.5), 0.65); + } + ctx.restore(); + // Drawing labels instead of scaling HTML keeps the annotations with the object. + if (wide) { + ctx.font = '10px monospace'; + ctx.fillStyle = '#83938f'; + ctx.fillText( + state.phase === 1 + ? 'SUBSTRATE / Si 99.9999%' + : state.phase === 2 + ? 'SOL III / HARVEST IN PROGRESS' + : 'DEEP FIELD / AUTONOMOUS SWARM', + cx + radius * 0.4, + cy - radius * 0.88, + ); + ctx.strokeStyle = '#364840'; + ctx.beginPath(); + ctx.moveTo(cx + radius * 0.4, cy - radius * 0.82); + ctx.lineTo(cx + radius * 0.2, cy - radius * 0.82); + ctx.lineTo(cx + radius * 0.08, cy - radius * 0.6); + ctx.stroke(); + } +} diff --git a/tests/godot.e2e.ts b/tests/godot.e2e.ts new file mode 100644 index 0000000..12f6eda --- /dev/null +++ b/tests/godot.e2e.ts @@ -0,0 +1,121 @@ +import { test, expect, type Page } from '@playwright/test'; + +interface SeedSnapshot { + nodes: number; fps: number; render_width: number; render_height: number; + chips: number; capital: number; wafers: number; fabs: number; + machines_visible: number; cinema: boolean; camera_focus: boolean; + sound_enabled: boolean; manual_progress: number; +} +const state = (page: Page): Promise => page.evaluate(() => (window as unknown as { __seed: SeedSnapshot }).__seed); + +async function ready(page: Page, query = '?test=1') { + await page.goto('/' + query); + await expect.poll(async () => Boolean(await state(page)), { timeout: 90_000 }).toBe(true); + await expect(page.locator('#loading')).toHaveCount(0); +} + +test('real WebGL fabrication finances and installs an autonomous machine', async ({ page }) => { + const errors: string[] = []; + const external: string[] = []; + page.on('pageerror', error => errors.push(error.message)); + page.on('console', message => { if (message.type() === 'error') errors.push(message.text()); }); + page.on('request', request => { if (/^https?:/.test(request.url()) && !request.url().startsWith('http://127.0.0.1:4180/')) external.push(request.url()); }); + await ready(page); + expect((await state(page)).fabs).toBe(0); + await page.keyboard.down('Space'); + await expect.poll(async () => (await state(page)).capital, { timeout: 60_000 }).toBeGreaterThanOrEqual(1200); + await page.keyboard.up('Space'); + const nodesBeforeBuild = (await state(page)).nodes; + await page.keyboard.press('b'); + await expect.poll(async () => (await state(page)).machines_visible).toBe(1); + expect((await state(page)).fabs).toBe(1); + const afterBuild = (await state(page)).chips; + await expect.poll(async () => (await state(page)).chips, { timeout: 30_000 }).toBeGreaterThan(afterBuild + 1); + // Purchases and repeated chip/spark output reuse the objects built at loading. + expect((await state(page)).nodes).toBe(nodesBeforeBuild); + expect((await state(page)).fps).toBeLessThanOrEqual(31); + await page.keyboard.press('f'); + await expect.poll(async () => (await state(page)).cinema).toBe(true); + await page.keyboard.press('Escape'); + await expect.poll(async () => (await state(page)).cinema).toBe(false); + expect((await state(page)).camera_focus).toBe(false); + await page.keyboard.press('c'); + await expect.poll(async () => (await state(page)).camera_focus).toBe(true); + await page.setViewportSize({ width: 2880, height: 1800 }); + await expect.poll(async () => (await state(page)).render_width).toBe(1440); + expect((await state(page)).render_height).toBe(900); + expect(errors).toEqual([]); + expect(external).toEqual([]); +}); + +test('Godot local storage preserves a run through a browser reload', async ({ page }) => { + await ready(page, '?test=1&persist=1'); + await page.keyboard.press('Space'); + await expect.poll(async () => (await state(page)).chips, { timeout: 15_000 }).toBe(1); + await page.keyboard.press('m'); + await expect.poll(async () => (await state(page)).sound_enabled).toBe(false); + // The scene saves every two seconds; allow the web filesystem to synchronize. + await page.waitForTimeout(3500); + await page.reload(); + await expect.poll(async () => (await state(page))?.chips, { timeout: 60_000 }).toBe(1); + expect((await state(page)).sound_enabled).toBe(false); + expect((await state(page)).wafers).toBe(59); +}); + +test('the portrait control dock can fabricate with a tap', async ({ page }) => { + await page.setViewportSize({ width: 390, height: 844 }); + await ready(page); + // Six action cards reflow into two columns. This is the real Godot UI, + // not an HTML control calling privileged simulation methods. + await page.mouse.click(85, 551); + await expect.poll(async () => (await state(page)).chips, { timeout: 20_000 }).toBe(1); + expect(await page.evaluate(() => document.documentElement.scrollWidth)).toBe(390); + await page.getByRole('button', { name: 'Open game controls' }).click(); + await expect(page.locator('#controls')).toBeVisible(); + await page.getByRole('button', { name: 'Back to the factory' }).click(); +}); + +test('ambient audio remains bounded through two fabs and repeated mute toggles', async ({ page }) => { + await page.addInitScript(() => { + const audioWindow = window as unknown as { seedAudioSources: number }; + audioWindow.seedAudioSources = 0; + const create = AudioContext.prototype.createBufferSource; + AudioContext.prototype.createBufferSource = function () { + audioWindow.seedAudioSources++; + return create.call(this); + }; + }); + const sources = () => page.evaluate(() => (window as unknown as { seedAudioSources: number }).seedAudioSources); + await ready(page); + await page.keyboard.press('Space'); + await expect.poll(async () => (await state(page)).chips).toBe(1); + await page.waitForTimeout(2000); + // One etch, one chip, one ambient loop: assigning unpause every frame used + // to restart the loop dozens of times here, invisible to scene-node checks. + expect(await sources()).toBeGreaterThan(0); + expect(await sources()).toBeLessThan(8); + await page.keyboard.down('Space'); + await expect.poll(async () => (await state(page)).capital, { timeout: 30_000 }).toBeGreaterThanOrEqual(1200); + await page.keyboard.press('b'); + await expect.poll(async () => (await state(page)).fabs).toBe(1); + await expect.poll(async () => (await state(page)).capital, { timeout: 30_000 }).toBeGreaterThanOrEqual(1700); + await page.keyboard.press('b'); + await page.keyboard.up('Space'); + await expect.poll(async () => (await state(page)).fabs).toBe(2); + const chips = (await state(page)).chips; + const before = await sources(); + // Cross multiple eight-second ambience loops with both fabs operating. + await page.waitForTimeout(18_000); + expect((await state(page)).chips).toBeGreaterThan(chips + 6); + expect(await sources() - before).toBeLessThan(25); + for (let i = 0; i < 3; i++) { + await page.keyboard.press('m'); + await expect.poll(async () => (await state(page)).sound_enabled).toBe(false); + await page.waitForTimeout(300); + await page.keyboard.press('m'); + await expect.poll(async () => (await state(page)).sound_enabled).toBe(true); + } + const resumed = await sources(); + await page.waitForTimeout(3000); + expect(await sources() - resumed).toBeLessThan(10); +}); diff --git a/tests/landing.browser.ts b/tests/landing.browser.ts new file mode 100644 index 0000000..3c86cb4 --- /dev/null +++ b/tests/landing.browser.ts @@ -0,0 +1,25 @@ +import { test, expect } from '@playwright/test'; + +for (const viewport of [{ width: 1440, height: 1000 }, { width: 390, height: 844 }]) { + test(`chooser offers both games without starting either at ${viewport.width}px`, async ({ page }, testInfo) => { + await page.setViewportSize(viewport); + const engineRequests: string[] = []; + page.on('request', request => { + if (/\.(?:wasm|pck)(?:\?|$)/.test(request.url())) engineRequests.push(request.url()); + }); + await page.goto('/'); + await expect(page.getByRole('heading', { name: 'One obsession. Two machines.' })).toBeVisible(); + await expect(page.getByRole('link', { name: 'Enter Universal AI' })).toHaveAttribute('href', './classic/'); + await expect(page.getByRole('link', { name: 'Enter the experimental factory' })).toHaveAttribute('href', './seed/'); + await expect(page.getByText('Performance investigation open.')).toBeVisible(); + expect(await page.locator('canvas').count()).toBe(0); + expect(await page.evaluate(() => document.documentElement.scrollWidth)).toBe(viewport.width); + expect(engineRequests).toEqual([]); + await page.screenshot({ path: testInfo.outputPath('chooser.png'), fullPage: true }); + await page.getByRole('link', { name: 'Enter Universal AI' }).click(); + await expect(page).toHaveURL(/\/classic\/$/); + await expect(page.getByRole('link', { name: 'Choose a Universal AI version' })).toBeVisible(); + await page.getByRole('link', { name: 'Choose a Universal AI version' }).click(); + await expect(page.getByRole('heading', { name: 'One obsession. Two machines.' })).toBeVisible(); + }); +} diff --git a/tests/observatory.browser.ts b/tests/observatory.browser.ts new file mode 100644 index 0000000..3141883 --- /dev/null +++ b/tests/observatory.browser.ts @@ -0,0 +1,254 @@ +import { expect, test, type Page } from '@playwright/test'; +import { createInitialState } from '../src/game/state'; +import { exportSave } from '../src/game/save'; +import { INITIAL_UPGRADES } from '../src/data/upgrades'; +import { RECURRING_DECISION_BRANCHES } from '../src/data/decisionBranches'; +import type { GameState } from '../src/types'; + +async function seed(page: Page, values: Partial = {}) { + const state = { + ...createInitialState(), + soundEnabled: false, + completedDecisionIds: RECURRING_DECISION_BRANCHES.map((b) => b.id), + ...values, + }; + await page.addInitScript( + (file) => { + // Seed once: reloading must prove persistence, not reset the fixture. + if (!sessionStorage.getItem('observatory-fixture')) { + const parsed = JSON.parse(file); + parsed.savedAt = Date.now(); + localStorage.setItem('universal_ai_save_v1', JSON.stringify(parsed)); + sessionStorage.setItem('observatory-fixture', '1'); + } + }, + exportSave(state, INITIAL_UPGRADES), + ); +} + +test('fabrication funds a real fab, and instruments observe the result', async ({ + page, +}) => { + await seed(page); + await page.goto('/classic/'); + for (let i = 0; i < 20; i++) + await page.getByRole('button', { name: 'Fabricate a chip' }).click(); + await expect(page.locator('.world-total > strong')).toHaveText('20'); + await expect( + page.getByRole('button', { name: 'Build fab', exact: true }), + ).toBeVisible(); + await page.getByRole('button', { name: 'Build fab', exact: true }).click(); + await expect(page.locator('.world-total small')).toHaveText( + '1 fabs connected', + ); + await expect(page.getByRole('log')).toContainText('First fab online'); + await expect + .poll(async () => + Number(await page.locator('.production-rate strong').innerText()), + ) + .toBeGreaterThan(0); + await page.reload(); + await expect(page.locator('.world-total small')).toHaveText( + '1 fabs connected', + ); +}); + +test('saved phase survives development StrictMode without playing a transition', async ({ + page, +}) => { + await seed(page, { + phase: 2, + alignment: 60, + npuFabCount: 7, + totalNpusCreated: 5000, + }); + await page.goto('http://127.0.0.1:3000/classic/'); + await expect(page.locator('h1')).toContainText('No more customers.'); + await expect(page.locator('.world-total small')).toHaveText( + '7 fabs connected', + ); + await expect(page.locator('.phase-banner')).toHaveCount(0); + await page.reload(); + await expect(page.locator('h1')).toContainText('No more customers.'); +}); + +for (const phase of [1, 2, 3] as const) { + test(`phase ${phase} renders on mobile under the production CSP`, async ({ + page, + }) => { + const errors: string[] = []; + page.on('pageerror', (e) => errors.push(e.message)); + page.on('console', (m) => { + if (m.type() === 'error') errors.push(m.text()); + }); + await page.setViewportSize({ width: 390, height: 844 }); + await seed(page, { + phase, + alignment: phase === 3 ? -80 : 50, + probesCount: phase === 3 ? 1e12 : 0, + spaceExploredPct: 2, + probeAllocation: { + ...createInitialState().probeAllocation, + speed: 0, + nav: 0, + }, + }); + await page.goto('/classic/'); + await expect(page.locator('.chapter-track .current')).toContainText( + `0${phase}`, + ); + await expect + .poll(() => + page + .locator('.world-viewport canvas') + .evaluate((canvas: HTMLCanvasElement) => canvas.width), + ) + .toBeGreaterThan(0); + await expect + .poll(() => + page + .locator('.world-viewport canvas') + .evaluate((canvas: HTMLCanvasElement) => + canvas + .getContext('2d')! + .getImageData(0, 0, canvas.width, canvas.height) + .data.some((v) => v > 0), + ), + ) + .toBe(true); + expect( + await page.evaluate( + () => document.documentElement.scrollWidth <= innerWidth, + ), + ).toBe(true); + await page.getByRole('button', { name: 'Expand observatory view' }).click(); + await expect(page.locator('.world-cinema')).toBeVisible(); + await page.keyboard.press('Escape'); + await expect(page.locator('.world-cinema')).toHaveCount(0); + await page.getByRole('button', { name: 'Overseer', exact: true }).click(); + await expect(page.getByLabel('Overseer engine')).toBeVisible(); + expect( + await page.evaluate( + () => document.documentElement.scrollWidth <= innerWidth, + ), + ).toBe(true); + expect(errors).toEqual([]); + }); +} + +test('the Overseer can start and stop from the observatory', async ({ + page, +}) => { + await seed(page); + await page.goto('/classic/'); + await page.getByRole('button', { name: 'Overseer', exact: true }).click(); + await page.getByRole('button', { name: 'Release the Overseer' }).click(); + await expect + .poll( + async () => + Number(await page.locator('.world-total > strong').innerText()), + { timeout: 10000 }, + ) + .toBeGreaterThan(0); + await page.getByRole('button', { name: 'Pause the Overseer' }).click(); + await expect( + page.getByRole('button', { name: 'Release the Overseer' }), + ).toBeVisible(); +}); + +test('visual pause freezes the observatory without pausing simulation', async ({ + page, +}) => { + await seed(page); + await page.goto('/classic/'); + await page.getByRole('button', { name: 'Pause visual animation' }).click(); + await expect( + page.getByRole('button', { name: 'Resume visual animation' }), + ).toBeVisible(); + const canvas = page.locator('.world-viewport canvas'); + await expect + .poll(() => canvas.evaluate((c: HTMLCanvasElement) => c.width)) + .toBeGreaterThan(0); + // Let the first stationary frame replace the last animated frame. + await page.waitForTimeout(650); + const paused = await canvas.evaluate((c: HTMLCanvasElement) => c.toDataURL()); + await page.waitForTimeout(650); + expect(await canvas.evaluate((c: HTMLCanvasElement) => c.toDataURL())).toBe( + paused, + ); + await page.getByRole('button', { name: 'Fabricate a chip' }).click(); + await expect(page.locator('.world-total > strong')).toHaveText('1'); +}); + +test('reduced motion stops animation while retaining working controls', async ({ + page, +}) => { + await page.emulateMedia({ reducedMotion: 'reduce' }); + await seed(page); + await page.goto('/classic/'); + await expect( + page.getByRole('button', { name: 'Pause visual animation' }), + ).toBeDisabled(); + await page.getByRole('button', { name: 'Fabricate a chip' }).click(); + await expect(page.locator('.world-total > strong')).toHaveText('1'); +}); + +test('the production app reloads offline and makes no external requests', async ({ + page, + context, +}) => { + const external: string[] = []; + page.on('request', (r) => { + if ( + !r.url().startsWith('http://127.0.0.1:4173/') && + /^https?:/.test(r.url()) + ) + external.push(r.url()); + }); + await seed(page); + await page.goto('/classic/'); + await page.evaluate(async () => { + await navigator.serviceWorker.ready; + }); + await expect + .poll(() => + page.evaluate(() => navigator.serviceWorker.controller !== null), + ) + .toBe(true); + await context.setOffline(true); + await page.reload(); + await expect(page.locator('h1')).toContainText('First, a chip.'); + await page.getByRole('button', { name: 'Fabricate a chip' }).click(); + await expect(page.locator('.world-total > strong')).toHaveText('1'); + expect(external).toEqual([]); +}); + +test('app-shell updates preserve model caches owned by other systems', async ({ + page, +}) => { + // Establish the origin without booting the app or its service worker. + await page.goto('/icon.svg'); + await page.evaluate(async () => { + for (const name of ['webllm-test-weights', 'universal-ai-obsolete']) { + const cache = await caches.open(name); + await cache.put('/test-cache-entry', new Response('retained model data')); + } + }); + await seed(page); + await page.goto('/classic/'); + await page.evaluate(async () => { + await navigator.serviceWorker.ready; + }); + await expect + .poll(() => + page.evaluate(async () => + (await caches.keys()).includes('universal-ai-obsolete'), + ), + ) + .toBe(false); + expect( + await page.evaluate(async () => + (await caches.keys()).includes('webllm-test-weights'), + ), + ).toBe(true); +}); diff --git a/vite.config.ts b/vite.config.ts index bf22727..ddd47e3 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,7 @@ import tailwindcss from '@tailwindcss/vite'; import react from '@vitejs/plugin-react'; import { execSync } from 'node:child_process'; +import { createHash } from 'node:crypto'; import { readFileSync, writeFileSync } from 'node:fs'; import path from 'node:path'; import { defineConfig, type Plugin } from 'vite'; @@ -26,7 +27,7 @@ function devCspRelax(): Plugin { transformIndexHtml(html) { return html.replace( //, - '' + '', ); }, }; @@ -46,21 +47,37 @@ function serviceWorker(): Plugin { closeBundle() { const outDir = path.resolve(__dirname, 'dist'); const manifest = JSON.parse( - readFileSync(path.join(outDir, '.vite/manifest.json'), 'utf8') + readFileSync(path.join(outDir, '.vite/manifest.json'), 'utf8'), ) as Record; // Static entry chunks only. The WebLLM runtime is a dynamic import and // its worker is 6MB each — precaching either would force every visitor to // download the model runtime they explicitly opted out of. - const shell = new Set(['./', './index.html', './manifest.webmanifest', './icon.svg']); + const shell = new Set([ + './', + './index.html', + './classic/', + './classic/index.html', + './manifest.webmanifest', + './icon.svg', + ]); for (const entry of Object.values(manifest)) { if (!entry.isEntry) continue; if (entry.file) shell.add('./' + entry.file); for (const css of entry.css ?? []) shell.add('./' + css); } + // Local builds can share a commit while carrying different asset hashes. + // Give each shell its own cache so an update cannot mix old HTML and JS. + const shellHash = createHash('sha256') + .update(readFileSync(path.join(outDir, 'index.html'))) + .update(readFileSync(path.join(outDir, 'classic/index.html'))) + .update(JSON.stringify([...shell])) + .digest('hex') + .slice(0, 12); + const sw = `// Generated at build time. Precaches the app shell for offline play. -const CACHE = 'universal-ai-${commitSha()}'; +const CACHE = 'universal-ai-${commitSha()}-${shellHash}'; const SHELL = ${JSON.stringify([...shell], null, 2)}; self.addEventListener('install', (event) => { @@ -70,7 +87,7 @@ self.addEventListener('install', (event) => { self.addEventListener('activate', (event) => { event.waitUntil( caches.keys() - .then((keys) => Promise.all(keys.filter((k) => k !== CACHE).map((k) => caches.delete(k)))) + .then((keys) => Promise.all(keys.filter((k) => k.startsWith('universal-ai-') && k !== CACHE).map((k) => caches.delete(k)))) .then(() => self.clients.claim()) ); }); @@ -83,7 +100,12 @@ self.addEventListener('fetch', (event) => { if (event.request.method !== 'GET') return; event.respondWith( - caches.match(event.request).then((hit) => hit || fetch(event.request)) + // This cache contains only public, immutable app-shell resources. Preview + // sends Vary: Origin, but addAll and module requests have different Origin + // headers. Ignoring Vary for this shell makes offline reload work there too. + caches.open(CACHE) + .then((cache) => cache.match(event.request, { ignoreVary: true })) + .then((hit) => hit || fetch(event.request)) ); }); `; @@ -105,6 +127,12 @@ export default defineConfig({ }, build: { manifest: true, + rollupOptions: { + input: { + index: path.resolve(__dirname, 'index.html'), + classic: path.resolve(__dirname, 'classic/index.html'), + }, + }, // Required under `script-src 'self'` — the polyfill injects inline script. modulePreload: { polyfill: false }, chunkSizeWarningLimit: 7000, From 80016c5eb04e2a02742ad6da6b59b8720bebe658 Mon Sep 17 00:00:00 2001 From: TechLuddite Date: Thu, 10 Sep 2026 14:30:55 -0700 Subject: [PATCH 2/4] Configure remote WebGL tests with a Mesa virtual display --- .github/workflows/deploy.yml | 10 ++++++++-- godot/README.md | 3 +++ playwright.godot.config.ts | 1 + tests/godot.e2e.ts | 6 +++++- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 41133e3..53fa12c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -76,13 +76,19 @@ jobs: echo "Built entry: $entry" - name: Install test browsers - run: npx playwright install --with-deps chromium firefox + run: | + npx playwright install --with-deps chromium firefox + sudo apt-get install -y xvfb libgl1-mesa-dri libegl-mesa0 mesa-utils - name: Test chooser and classic browser flows run: npx playwright test - name: Test Godot in Chromium and Firefox - run: npx playwright test --config playwright.godot.config.ts + env: + GODOT_BROWSER_HEADED: '1' + GODOT_BROWSER_ANGLE: gl + LIBGL_ALWAYS_SOFTWARE: '1' + run: xvfb-run --auto-servernum --server-args="-screen 0 1440x1000x24" npx playwright test --config playwright.godot.config.ts --max-failures=1 --reporter=list - name: Save browser checks and chooser screenshots if: always() diff --git a/godot/README.md b/godot/README.md index dd14c6e..a0d8734 100644 --- a/godot/README.md +++ b/godot/README.md @@ -87,6 +87,9 @@ Install test browsers with `npx playwright install chromium firefox` if needed. For a system browser, set `PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH`. On this Linux machine, `GODOT_BROWSER_ANGLE=gl` enables the hardware renderer in headless QA. Software WebGL rendering can be much slower than normal browser GPU rendering. +GitHub CI uses a virtual display with Mesa and `GODOT_BROWSER_HEADED=1`, plus +the GL backend, because headless Firefox lacks WebGL 2 on that runner and its +default Chromium software backend misses the interactive timing budgets. The browser tests exercise actual fabrication, purchasing, automatic production, camera controls, reload persistence, and portrait touch controls. They also check diff --git a/playwright.godot.config.ts b/playwright.godot.config.ts index 9079c6d..f2f8ee0 100644 --- a/playwright.godot.config.ts +++ b/playwright.godot.config.ts @@ -8,6 +8,7 @@ export default defineConfig({ workers: 1, use: { baseURL: 'http://127.0.0.1:4180', + headless: process.env.GODOT_BROWSER_HEADED !== '1', viewport: { width: 1280, height: 800 }, screenshot: 'only-on-failure', trace: 'retain-on-failure', diff --git a/tests/godot.e2e.ts b/tests/godot.e2e.ts index 12f6eda..6a9312d 100644 --- a/tests/godot.e2e.ts +++ b/tests/godot.e2e.ts @@ -10,7 +10,11 @@ const state = (page: Page): Promise => page.evaluate(() => (window async function ready(page: Page, query = '?test=1') { await page.goto('/' + query); - await expect.poll(async () => Boolean(await state(page)), { timeout: 90_000 }).toBe(true); + await page.waitForFunction(() => + Boolean((window as unknown as { __seed?: unknown }).__seed) || + Boolean(document.getElementById('error')?.textContent), + undefined, { timeout: 90_000 }); + await expect(page.locator('#error')).toHaveText(''); await expect(page.locator('#loading')).toHaveCount(0); } From e75ce4db3fbe01a26766f5ffc0ea0981787685c0 Mon Sep 17 00:00:00 2001 From: TechLuddite Date: Thu, 10 Sep 2026 14:34:34 -0700 Subject: [PATCH 3/4] Allow the CI software GL device in browser graphics checks --- .github/workflows/deploy.yml | 4 +++- playwright.godot.config.ts | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 53fa12c..e5a53b2 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -88,7 +88,9 @@ jobs: GODOT_BROWSER_HEADED: '1' GODOT_BROWSER_ANGLE: gl LIBGL_ALWAYS_SOFTWARE: '1' - run: xvfb-run --auto-servernum --server-args="-screen 0 1440x1000x24" npx playwright test --config playwright.godot.config.ts --max-failures=1 --reporter=list + run: | + xvfb-run --auto-servernum glxinfo -B + xvfb-run --auto-servernum --server-args="-screen 0 1440x1000x24" npx playwright test --config playwright.godot.config.ts --max-failures=1 --reporter=list - name: Save browser checks and chooser screenshots if: always() diff --git a/playwright.godot.config.ts b/playwright.godot.config.ts index f2f8ee0..6f9d22c 100644 --- a/playwright.godot.config.ts +++ b/playwright.godot.config.ts @@ -20,11 +20,11 @@ export default defineConfig({ browserName: 'chromium', launchOptions: { executablePath: process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH, - args: ['--enable-unsafe-swiftshader', ...(process.env.GODOT_BROWSER_ANGLE ? [`--use-angle=${process.env.GODOT_BROWSER_ANGLE}`] : [])], + args: ['--enable-unsafe-swiftshader', ...(process.env.GODOT_BROWSER_ANGLE ? ['--use-gl=angle', `--use-angle=${process.env.GODOT_BROWSER_ANGLE}`, '--ignore-gpu-blocklist'] : [])], }, }, }, - { name: 'firefox', use: { browserName: 'firefox' } }, + { name: 'firefox', use: { browserName: 'firefox', launchOptions: { firefoxUserPrefs: { 'webgl.force-enabled': true } } } }, ], webServer: { command: 'npm run godot:serve', From 9ad02d819f513cee46e7a760d83d9e21407412b8 Mon Sep 17 00:00:00 2001 From: TechLuddite Date: Thu, 10 Sep 2026 14:37:36 -0700 Subject: [PATCH 4/4] Accept the removed loading overlay after successful engine startup --- tests/godot.e2e.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/godot.e2e.ts b/tests/godot.e2e.ts index 6a9312d..b8069b2 100644 --- a/tests/godot.e2e.ts +++ b/tests/godot.e2e.ts @@ -14,7 +14,7 @@ async function ready(page: Page, query = '?test=1') { Boolean((window as unknown as { __seed?: unknown }).__seed) || Boolean(document.getElementById('error')?.textContent), undefined, { timeout: 90_000 }); - await expect(page.locator('#error')).toHaveText(''); + expect(await page.evaluate(() => document.getElementById('error')?.textContent ?? '')).toBe(''); await expect(page.locator('#loading')).toHaveCount(0); }