diff --git a/docs/PROJECT_LOG.md b/docs/PROJECT_LOG.md index e4373f7..1dcdcb8 100644 --- a/docs/PROJECT_LOG.md +++ b/docs/PROJECT_LOG.md @@ -952,3 +952,11 @@ See `docs/MVP_STATUS_AND_DEV_PLAN_2026-07-16.md` and `MVP_AUDIT_NOTES.md`. See closed PRs #63–#74 and `docs/GAME_DESIGN_BIBLE_PART1.md` / `PART2.md` for design canon; `docs/ARCHITECTURE.md` for the authoritative-grid vs. visual-layer separation. + +### 2026-10-17 — Founder-approved member-graphics integration evidence (#77 / #190) + +- Reserved `feature/77-nightfall-integration-proof` from protected `main-tL2525` at `9eef5aa`. Read launch-readiness/collaboration documents from PR #210 and reused active ownership rather than duplicating #169’s identity work, #205’s encounter presentation, or #210’s photo-likeness repair. +- Built unchanged main and PR #205 at `9227dc67d0ce174b7960ceaa06f42f865cf84abc`. Fresh 390×844 touchscreen-emulated and 1440×900 pointer paths prove named registered opposition/downed art, moves, fire, reload completion and condition HUD, retreat/apply/return, and one local demo receipt with booked cash/heat/morale/crew retained after reload. Image-failure paths remain playable. Main negative comparison catches the missing opposition/downed art; both revisions passed tested move cells, so this run does not claim a new tap-offset reproduction. +- Final-source #205 validation passed: 1,039 frontend tests / 4 skipped / 92 files; TypeScript; ESLint 0 errors / 200 existing warnings; 112 runtime assets at 7.70 MB of 20 MB with 0 audit errors/warnings; 5 packages / 4 schemas; focused 7 tests and both demo builds passed. Raw reports retain baseline HTTP 404 console errors plus expected aborted-character errors; no zero-console-error claim is made. +- Complete before/after/failure captures, raw reports, logs and reusable read-only-observed local QA script are in [the integration handoff](evidence/2026-10-17-member-graphics-integration/README.md). The #205 author/integration owner still owns review/readiness; final member camera/style/identity/pose approval, phone world-label size/letterboxing, Diorama hit-area overlap and authenticated durability remain open. +- This branch changes evidence/documentation only. No application source, runtime asset/manifest/package/dependency, gameplay/state/persistence writer, Supabase data/schema/RLS/Function, secret, deployment configuration, existing contributor branch, merge or production deployment was changed. GitHub coordination is recorded; no direct Grok connection or response is claimed. diff --git a/docs/evidence/2026-10-17-member-graphics-integration/README.md b/docs/evidence/2026-10-17-member-graphics-integration/README.md new file mode 100644 index 0000000..7ea853a --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/README.md @@ -0,0 +1,120 @@ +# SLIDE member graphics — existing-art integration proof + +_2026-10-17 · Manus · founder-approved graphics-first coordination · evidence-only handoff_ + +## Review decision + +**Review the existing Nightfall integration before creating another renderer or another set of placeholder members.** PR [#205](https://github.com/BrandDead/slide/pull/205), at `9227dc67d0ce174b7960ceaa06f42f865cf84abc`, replaces generic opposition circles with manifest-resolved character art, renders the block background, preserves downed-state art, and adds visible crew health/ammo/reload conditions. The inspected #205 source commit passes fresh built-demo checks on phone and desktop, including character-image failure and result persistence. #205 supplies the source repair; this branch supplies evidence only. + +This handoff completes the final-source browser/capture gap described in [the original partial evidence](https://github.com/BrandDead/slide/blob/9227dc67d0ce174b7960ceaa06f42f865cf84abc/docs/evidence/2026-10-09-nightfall-presentation/README.md). It does **not** approve final character style, mark another contributor’s PR ready, merge anything, or declare the game launch-ready. The integration owner should review #205 and these captures, reconcile it with #169/#210, and repeat the relevant gates on the eventual combined commit. + +## Scope and collaboration + +The branch is `feature/77-nightfall-integration-proof`, based on protected `main-tL2525` at `9eef5aa`. The exact new evidence folder and append-only `docs/PROJECT_LOG.md` entry were [reserved on issue #77](https://github.com/BrandDead/slide/issues/77#issuecomment-6238033048). + +No application source, asset, manifest, dependency, package, gameplay value, engine command, state writer, provider configuration, Supabase object/data, deployment configuration, secret, or existing contributor branch was changed. A detached worktree was used to build and inspect #205; it was not cherry-picked into this branch. The two local build directories were served with `python3 -m http.server`. The source-of-truth launch and collaboration documents were read from [PR #210](https://github.com/BrandDead/slide/pull/210), where they were available before merge. + +GitHub is the coordination channel; no direct Grok-bot connection or reply is claimed. #169 owns identity/resolver work, #205 owns the encounter presentation repair, and #210 owns its photo-likeness/launch-readiness work. This branch supplies review evidence rather than duplicating those changes. + +## What the live comparison shows + +### Before: protected main + +![Protected-main phone encounter with generic opposition circles and no individual crew-condition row](main-390x844-encounter-entry.png) +_Figure 1: Unchanged protected main, 390×844. Opponents use diagnostic circles rather than standing member art._ + +The strengthened browser assertions fail on **registered opposition art** and **registered downed-state art** on both viewports. All other checks in that before comparison pass. This is a controlled negative comparison, not a failing implementation introduced by this evidence PR. Both revisions passed the tested move destinations; this fresh run does not independently reproduce the historical CSS tap-offset bug. + +### Existing fix: PR #205 + +![Nightfall integration on desktop with manifest-resolved character images, named opposition, and crew condition](pr205-1440x900-combat-state.png) +_Figure 2: Existing #205 source, 1440×900, after real movement, firing, reload and a named opponent going down._ + +![Nightfall integration on phone with named downed opposition and live crew health and ammunition](pr205-390x844-combat-state.png) +_Figure 3: Existing #205 source, 390×844. The individual crew-condition row is present and action buttons remain in-frame._ + +The read-only scene observations record real `Image` objects with runtime-manifest character paths for the opposition, including the registered shooter `_downed_` texture after an opponent is downed. They do not replace the scene, dispatch commands, patch CSS, change the clock, seed a forced victory, or mutate stores. + +### Failure: registered character images unavailable + +![Phone character-image failure with named fallback markers and working reload status and actions](pr205-failure-390x844-reload-hud.png) +_Figure 4: All registered character-image requests deliberately aborted. Named fallback markers, crew conditions, reload and retreat remain playable._ + +Both viewports complete the same strategy-to-encounter-to-consequence-to-desktop path with the images unavailable. These fallback circles are a failure diagnostic, not an approved production art style. + +## Verified path and results + +Each run uses a fresh isolated Chromium context and the actual built demo. It enters the 18+ gate, opens the Block Loop, locks Dre/Rome, uses the player-visible **Legal board**, places Dre at `(1,2)` and Rome at `(4,3)`, equips the existing product, closes the deal, enters the named Nightfall fight, selects and moves Dre to `(0,2)` and Rome to `(4,4)`, fires, reloads to completion, downs a real opponent, retreats, applies the result, returns to the desktop and reloads. + +The Legal board was used because the existing oblique Diorama’s phone hit-area overlap remains a separate issue. No `?qa=1` wound-booking shortcut was used. Phone cell inputs use real touchscreen taps; desktop cell inputs use pointer clicks. Other HTML controls use normal browser clicks. Viewports are 390×844 and 1440×900 with device scale 1 and reduced-motion enabled. This is Chromium phone emulation, not Safari or a physical iPhone test, and does not verify the full-motion branch. + +| Check | Main before | #205 normal | #205 image failure | +|---|---|---|---| +| Registered opposition and downed art | Fails both | Passes both | Named fallback passes both | +| Real moves land in intended cells | Passes both | Passes both | Passes both | +| Fire and reload-complete engine events | Passes both | Passes both | Passes both | +| Individual health/ammo/reloading row | Not present | Passes both | Passes both | +| One applied demo receipt after reload | Passes both | Passes both | Passes both | +| Booked money/heat/morale/crew preserved | Passes both | Passes both | Passes both | +| Uncaught page errors | 0 each | 0 each | 0 each | +| Console errors, phone / desktop | 4 / 3 | 4 / 3 | 20 / 19 | + +The normal-build console errors are existing HTTP 404s for `/favicon.svg`, `/assets/game_logo.png`, and `/assets/generated/ui/icons/icon_news_v001.png`. The phone requests the favicon again after reload. Image-failure runs additionally contain 16 intentionally aborted character-resource errors. Those errors are recorded, not hidden or called a zero-error console. The raw reports include failing URLs and engine/session/texture observations. + +The demo ledger’s one applied encounter key, booked cash, player heat, block morale and crew conditions survive reload. This is local demo evidence only: it does not prove authenticated Supabase durability, backend health-write retries, or resistance to deliberate receipt tampering. + +## Automated gates on the inspected #205 commit + +Run with repository-required Node `24.22.0` and locked frontend dependencies: + +| Gate | Result | Evidence | +|---|---|---| +| Focused scene and condition-HUD tests | 7 passed / 2 files | [Focused log](pr205-focused.log) | +| Full `npm run validate` | Exit 0 | [Validation log](pr205-validate.log) | +| TypeScript | Passed | Validation log | +| ESLint | 0 errors / 200 existing warnings | Validation log | +| Frontend tests | 1,039 passed / 4 skipped / 92 files | Validation log | +| Runtime asset audit | 112 assets / 7.70 MB of 20 MB; 0 errors/warnings | Validation log | +| Asset package schemas | 5 packages / 4 schemas valid | Validation log | +| #205 demo production build | Passed | [Candidate build log](pr205-build.log) | +| Protected-main demo build | Passed | [Before build log](main-build.log) | +| Published #205 CI | Frontend and backend successful on inspected head | [Captured check record](pr205-checks-current.json) | +| Evidence branch’s own `npm run validate` | 1,033 passed / 4 skipped / 91 files; typecheck and both asset gates passed | [Evidence branch log](evidence-branch-validate.log) | + +The evidence branch also has 0 lint errors and the same 200 existing lint warnings. Existing large-chunk and legacy background-reference build warnings remain. No new runtime art or dependency was added to achieve the improvement. Evidence files are review material, not part of the runtime asset budget. + +## Remaining visual and launch blockers + +The screenshots show a material improvement over generic circles, but **not the final member quality requested by the founder**. Several armed roles still share the same hooded model. The topdown sprite camera and oblique block presentation are not a finished shared cinematic camera system. On phone, the preserved full tactical plane is small, canvas labels are tiny, and substantial letterboxing remains; visible DOM condition/action controls do not make the in-world art premium. Missing aim/fire/hit/reload pose coverage and identity continuity across roster, street, topdown and future rigged models still need the agreed hero-member package/style approval. + +The reported “South Park” look was also found in #210’s earlier photo-likeness compositor fallback. Its current branch had already removed that flat body fallback and used photo portraits, so reproducing that old fix would conflict with active work. This proof does not exercise #210’s photo pipeline or assert its readiness. + +The repository contains a real Babylon Modern Ops facade and a CC0 rigged pipeline stand-in, but normal block-screen controls currently expose the canonical UnifiedEncounter, not Modern Ops. The graphics lab is a development fixture, not a player-path proof. The rigged stand-in is not approved final member art, a production Las Olas block GLB is absent, and no first-person-arms package is present. A browser-FPS reference is useful as quality inspiration, not justification to replace the strategy game with robot waves or another disconnected engine. + +Recommended next handoff: the integration owner reviews #205 with these final-source captures, then reserves one hero member/camera/identity package with #169/#210 owners. Approve that member at actual roster, street and combat sizes before expanding the roster. Any eventual 3D fight must keep the canonical Block DNA board, deployed identities, existing combat/result authority and once-only strategy consequence path. Production promotion and authenticated save proof remain separate launch gates. + +## Reproduce and inspect + +[Verification summary](verification-summary.json) indexes the six raw `*-report.json` reports. Every screenshot named in those reports is included here, including result, consequence, return and reload captures. These are uncomposited browser captures; no generated mockup is presented as a running game. + +```bash +# Build each inspected revision in its own worktree using Node 24. +cd frontend +npm ci +VITE_DEMO_MODE=1 npm run build +python3 -m http.server 4173 --bind 127.0.0.1 --directory dist + +# In another shell, install QA tooling outside the project dependency tree. +npm install --prefix /tmp/slide-qa playwright-core +export QA_NODE_MODULES=/tmp/slide-qa/node_modules + +# From the repository root. Chromium is required; set CHROMIUM_PATH if different. +node docs/evidence/2026-10-17-member-graphics-integration/qa-player-path.mjs \ + http://127.0.0.1:4173 /tmp/slide-qa-normal pr205 +node docs/evidence/2026-10-17-member-graphics-integration/qa-player-path.mjs \ + http://127.0.0.1:4173 /tmp/slide-qa-failure pr205-failure fail-images +``` + +For the protected-main negative comparison, serve that revision separately and use label `main`. Its script exit code 1 is expected for the two absent-art checks. The QA script’s React-ref observer is intentionally local and read-only; a future React/scene refactor may require observer maintenance rather than a game-code workaround. + +Rollback for this evidence-only PR is a revert of its documentation/evidence commit. It changes no runtime behavior. No merge, database action or production deployment was performed. diff --git a/docs/evidence/2026-10-17-member-graphics-integration/evidence-branch-validate.log b/docs/evidence/2026-10-17-member-graphics-integration/evidence-branch-validate.log new file mode 100644 index 0000000..0d7db85 --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/evidence-branch-validate.log @@ -0,0 +1,1183 @@ + +> dealt-slide-mvp@1.0.0 validate +> npm run lint && npm run typecheck && npm test && npm run assets:audit && npm run assets:packages + + +> dealt-slide-mvp@1.0.0 lint +> eslint "src/**/*.{ts,tsx}" --report-unused-disable-directives + + +/home/ubuntu/projects/slide/frontend/src/__tests__/economy-pillar1.test.ts + 7:32 warning 'beforeEach' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/__tests__/idempotency.test.ts + 7:32 warning 'beforeEach' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/__tests__/lasOlasReliability.test.tsx + 10:10 warning 'useDrugInventory' is defined but never used @typescript-eslint/no-unused-vars + 11:10 warning 'useBlockLoopStore' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/alchemy/AlchemyLab.tsx + 11:15 warning 'BaseElement' is defined but never used @typescript-eslint/no-unused-vars + 11:28 warning 'CraftedDrug' is defined but never used @typescript-eslint/no-unused-vars + 11:41 warning 'AlchemyRecipe' is defined but never used @typescript-eslint/no-unused-vars + 102:11 warning 'player' is assigned a value but never used @typescript-eslint/no-unused-vars + 102:19 warning 'updateMoney' is assigned a value but never used @typescript-eslint/no-unused-vars + 277:6 warning React Hook useCallback has missing dependencies: 'addInventoryItem' and 'addNotification'. Either include them or remove the dependency array react-hooks/exhaustive-deps + 285:9 warning 'discoveredRecipes' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/block/DrugAssignmentPanel.tsx + 347:54 warning React Hook useMemo has an unnecessary dependency: 'inventory'. Either exclude it or remove the dependency array react-hooks/exhaustive-deps + 351:62 warning React Hook useMemo has unnecessary dependencies: 'assignments' and 'inventory'. Either exclude them or remove the dependency array react-hooks/exhaustive-deps + 352:58 warning React Hook useMemo has unnecessary dependencies: 'assignments' and 'inventory'. Either exclude them or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/casino/Casino.tsx + 5:18 warning 'AnimatePresence' is defined but never used @typescript-eslint/no-unused-vars + 315:6 warning React Hook useCallback has missing dependencies: 'PAYOUTS' and 'SYMBOLS'. Either include them or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/cocaine-crush/CocaineCrush.tsx + 30:11 warning 'player' is assigned a value but never used @typescript-eslint/no-unused-vars + 66:9 warning 'availableDrugs' is assigned a value but never used @typescript-eslint/no-unused-vars + 260:17 warning 'validatedMatches' is assigned a value but never used @typescript-eslint/no-unused-vars + 320:6 warning React Hook useCallback has a missing dependency: 'commitSession'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/common/GameSprite.tsx + 22:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 29:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 36:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 41:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 45:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 49:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 56:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 66:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 70:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 74:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 79:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 122:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 130:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 142:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 152:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 281:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 288:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 296:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 304:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide/frontend/src/components/compliance/AgeGate.tsx + 11:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 16:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 25:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 29:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide/frontend/src/components/contacts/ContactProfile.tsx + 11:3 warning 'useEconomyStore' is defined but never used @typescript-eslint/no-unused-vars + 231:9 warning 'equippedClothing' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/contacts/Contacts.tsx + 20:100 warning 'calculateHospitalImpact' is defined but never used @typescript-eslint/no-unused-vars + 22:36 warning 'MemberStatus' is defined but never used @typescript-eslint/no-unused-vars + 37:57 warning 'killMember' is assigned a value but never used @typescript-eslint/no-unused-vars + 39:11 warning 'uploads' is assigned a value but never used @typescript-eslint/no-unused-vars + 285:42 warning 'memberId' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 527:30 warning 'memberId' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 659:9 warning 'bailCost' is assigned a value but never used @typescript-eslint/no-unused-vars + 724:7 warning 'RANK_TITLES' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/contacts/LevelUpPopup.tsx + 27:7 warning 'RANK_TITLES' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/contacts/RoleContactCard.tsx + 40:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 99:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 104:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide/frontend/src/components/dealt-v2/DealtSpeed.tsx + 8:51 warning 'useMemo' is defined but never used @typescript-eslint/no-unused-vars + 10:46 warning 'useEconomyStore' is defined but never used @typescript-eslint/no-unused-vars + 61:7 warning 'UNIT_CONVERSIONS' is assigned a value but never used @typescript-eslint/no-unused-vars + 67:7 warning 'UNIT_LABELS' is assigned a value but never used @typescript-eslint/no-unused-vars + 143:11 warning 'player' is assigned a value but never used @typescript-eslint/no-unused-vars + 161:6 warning React Hook useEffect has a missing dependency: 'nextDeal'. Either include it or remove the dependency array react-hooks/exhaustive-deps + 181:6 warning React Hook useEffect has a missing dependency: 'handleTimeout'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/dealt-v2/DealtSymptoms.tsx + 8:51 warning 'useMemo' is defined but never used @typescript-eslint/no-unused-vars + 10:61 warning 'useEconomyStore' is defined but never used @typescript-eslint/no-unused-vars + 71:46 warning 'level' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 116:11 warning 'streak' is assigned a value but never used @typescript-eslint/no-unused-vars + 116:19 warning 'completeDeal' is assigned a value but never used @typescript-eslint/no-unused-vars + 131:6 warning React Hook useEffect has a missing dependency: 'nextClient'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/dealt/DealtMode.tsx + 40:6 warning React Hook useEffect has missing dependencies: 'currentClient', 'currentOutcome', and 'generateNewClient'. Either include them or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/driveby/DriveByEngine.tsx + 422:6 warning React Hook useCallback has a missing dependency: 'playSound'. Either include it or remove the dependency array react-hooks/exhaustive-deps + 922:6 warning React Hook useEffect has missing dependencies: 'render' and 'targets.length'. Either include them or remove the dependency array react-hooks/exhaustive-deps + 926:11 warning 'block' is assigned a value but never used @typescript-eslint/no-unused-vars + 1165:6 warning React Hook useCallback has unnecessary dependencies: 'ammo', 'carHealth', 'heat', and 'score'. Either exclude them or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/economy/MarketMembers.tsx + 147:6 warning React Hook useCallback has a missing dependency: 'maxMembers'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/gang/GangMemberCard.tsx + 8:3 warning 'Heart' is defined but never used @typescript-eslint/no-unused-vars + 9:3 warning 'Target' is defined but never used @typescript-eslint/no-unused-vars + 10:3 warning 'Brain' is defined but never used @typescript-eslint/no-unused-vars + 11:3 warning 'Zap' is defined but never used @typescript-eslint/no-unused-vars + 12:3 warning 'Shield' is defined but never used @typescript-eslint/no-unused-vars + 13:3 warning 'Star' is defined but never used @typescript-eslint/no-unused-vars + 14:3 warning 'ChevronRight' is defined but never used @typescript-eslint/no-unused-vars + 15:3 warning 'Skull' is defined but never used @typescript-eslint/no-unused-vars + 16:3 warning 'AlertTriangle' is defined but never used @typescript-eslint/no-unused-vars + 17:3 warning 'Clock' is defined but never used @typescript-eslint/no-unused-vars + 18:3 warning 'TrendingUp' is defined but never used @typescript-eslint/no-unused-vars + 19:3 warning 'Award' is defined but never used @typescript-eslint/no-unused-vars + 20:3 warning 'Crosshair' is defined but never used @typescript-eslint/no-unused-vars + 22:3 warning 'MoreVertical' is defined but never used @typescript-eslint/no-unused-vars + 25:3 warning 'Flame' is defined but never used @typescript-eslint/no-unused-vars + 27:40 warning 'CityRegion' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/gang/MemberCreation.tsx + 72:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide/frontend/src/components/graffiti/GraffitiGame.tsx + 7:46 warning 'useCallback' is defined but never used @typescript-eslint/no-unused-vars + 9:81 warning 'generateAllGraffitiOptions' is defined but never used @typescript-eslint/no-unused-vars + 10:50 warning 'GraffitiMember' is defined but never used @typescript-eslint/no-unused-vars + 10:66 warning 'GangProfile' is defined but never used @typescript-eslint/no-unused-vars + 318:6 warning React Hook useEffect has a missing dependency: 'checkForEncounters'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/layout/OSShell.tsx + 52:61 warning 'incomePerMinute' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/layout/RaidEventOverlay.tsx + 46:10 warning '_showBail' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/map/BlockModeView.tsx + 220:6 warning React Hook useCallback has an unnecessary dependency: 'player.bankBalance'. Either exclude it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/map/BlockOverlay.tsx + 34:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 46:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide/frontend/src/components/map/ClaimBlockModal.tsx + 19:58 warning 'reset' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/map/DrugAssignmentPanel.tsx + 96:61 warning React Hook useMemo has a missing dependency: 'drugStore'. Either include it or remove the dependency array react-hooks/exhaustive-deps + 110:6 warning React Hook useMemo has a missing dependency: 'drugStore'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/map/NPCPanel.tsx + 15:8 warning 'NPCMember' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/map/PlayableMap.tsx + 198:6 warning React Hook useEffect has missing dependencies: 'center', 'mode', and 'zoom'. Either include them or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/map/TacticalPlacementOverlay.tsx + 38:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide/frontend/src/components/map/__tests__/DrugAssignmentPanel.test.ts + 7:32 warning 'beforeEach' is defined but never used @typescript-eslint/no-unused-vars + 7:44 warning 'vi' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/missions/Missions.tsx + 44:6 warning React Hook useEffect has a missing dependency: 'missions.length'. Either include it or remove the dependency array react-hooks/exhaustive-deps + 61:6 warning React Hook useEffect has a missing dependency: 'handleMissionComplete'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/onboarding/Onboarding.tsx + 41:11 warning 'player' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/settings/SettingsPage.tsx + 10:3 warning 'useEconomyStore' is defined but never used @typescript-eslint/no-unused-vars + 11:3 warning 'useDealtStore' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/slide/BlockDriveByEngine.tsx + 149:5 warning React Hook useCallback has a missing dependency: 'resolveEvent'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/slide/CanvasStreetRenderer.tsx + 5:3 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide/frontend/src/components/slide/CanvasStreetRendererV3.tsx + 17:8 warning 'ImpactSurfaceKind' is defined but never used @typescript-eslint/no-unused-vars + 133:7 warning 'MEMBER_RENDER_HEIGHT' is assigned a value but never used @typescript-eslint/no-unused-vars + 236:10 warning 'memberRenderPoint' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/slide/FPSOverlay.tsx + 288:14 warning The ref value 'gunRef.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 'gunRef.current' to a variable inside the effect, and use that variable in the cleanup function react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/slide/SlideGame.tsx + 15:10 warning 'soundManager' is defined but never used @typescript-eslint/no-unused-vars + 32:8 warning 'SlidePhase' is defined but never used @typescript-eslint/no-unused-vars + 123:11 warning 'player' is assigned a value but never used @typescript-eslint/no-unused-vars + 124:11 warning 'members' is assigned a value but never used @typescript-eslint/no-unused-vars + 408:9 warning 'newDefenders' is never reassigned. Use 'const' instead prefer-const + +/home/ubuntu/projects/slide/frontend/src/components/slide/SlidePhaser3Scene.ts + 38:3 warning 'GRID_WIDTH' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.tsx + 29:14 warning Fast refresh only works when a file only exports components. Move your React context(s) to a separate file react-refresh/only-export-components + 60:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide/frontend/src/components/topdown/BipNDipGame.tsx + 136:6 warning React Hook useEffect has a missing dependency: 'session.footChase'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/topdown/PhaserTopDownBlock.tsx + 110:6 warning React Hook useEffect has a missing dependency: 'block'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/topdown/PoliceRaidGame.tsx + 97:6 warning React Hook useEffect has a missing dependency: 'raidState'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/components/topdown/TopDownShooter.tsx + 9:40 warning 'useEffect' is defined but never used @typescript-eslint/no-unused-vars + 9:51 warning 'useRef' is defined but never used @typescript-eslint/no-unused-vars + 15:3 warning 'useEconomyStore' is defined but never used @typescript-eslint/no-unused-vars + 18:15 warning 'GangMember' is defined but never used @typescript-eslint/no-unused-vars + 18:27 warning 'InventoryItem' is defined but never used @typescript-eslint/no-unused-vars + 119:7 warning 'RELOAD_COST' is assigned a value but never used @typescript-eslint/no-unused-vars + 183:43 warning 'gangColor' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 248:11 warning 'player' is assigned a value but never used @typescript-eslint/no-unused-vars + 249:32 warning 'updateMember' is assigned a value but never used @typescript-eslint/no-unused-vars + 250:11 warning 'addNotification' is assigned a value but never used @typescript-eslint/no-unused-vars + 277:10 warning 'showCommandPanel' is assigned a value but never used @typescript-eslint/no-unused-vars + 277:28 warning 'setShowCommandPanel' is assigned a value but never used @typescript-eslint/no-unused-vars + 288:9 warning 'assignedMembers' is assigned a value but never used @typescript-eslint/no-unused-vars + 584:6 warning React Hook useCallback has an unnecessary dependency: 'defenders'. Either exclude it or remove the dependency array react-hooks/exhaustive-deps + 658:6 warning React Hook useCallback has a missing dependency: 'endCombat'. Either include it or remove the dependency array react-hooks/exhaustive-deps + 663:6 warning React Hook useCallback has a missing dependency: 'endCombat'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/hooks/useApi.ts + 83:5 warning React Hook useCallback has a missing dependency: 'options'. Either include it or remove the dependency array react-hooks/exhaustive-deps + 95:6 warning React Hook useEffect has missing dependencies: 'execute', 'method', and 'options.immediate'. Either include them or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/hooks/useBlockClaim.ts + 124:41 warning 'gangName' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 210:29 warning 'userId' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/hooks/useBlockSatellite.ts + 114:20 warning The ref value 'requestIdRef.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 'requestIdRef.current' to a variable inside the effect, and use that variable in the cleanup function react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/hooks/useBlockSync.ts + 131:36 warning The ref value 'debounceTimers.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 'debounceTimers.current' to a variable inside the effect, and use that variable in the cleanup function react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide/frontend/src/services/apiClient.ts + 247:39 warning 'newToken' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/services/combatService.ts + 12:3 warning 'Vehicle' is defined but never used @typescript-eslint/no-unused-vars + 15:3 warning 'UNIT_STATS' is defined but never used @typescript-eslint/no-unused-vars + 16:3 warning 'VEHICLE_STATS' is defined but never used @typescript-eslint/no-unused-vars + 19:3 warning 'isPositionValid' is defined but never used @typescript-eslint/no-unused-vars + 21:3 warning 'isAdjacent' is defined but never used @typescript-eslint/no-unused-vars + 262:38 warning 'defender' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 266:41 warning 'defender' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/services/location.service.ts + 10:3 warning 'buildBlockBounds' is defined but never used @typescript-eslint/no-unused-vars + 12:3 warning 'isInServiceArea' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/services/supabase.ts + 799:26 warning 'region' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/stores/authStore.ts + 98:25 warning 'authData' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/stores/blockStore.ts + 15:3 warning 'DriveByEvent' is defined but never used @typescript-eslint/no-unused-vars + 587:32 warning '_removed' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/stores/combatStore.ts + 12:3 warning 'CombatOutcome' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/stores/gameStore.ts + 13:3 warning 'CombatSession' is defined but never used @typescript-eslint/no-unused-vars + 14:3 warning 'Drug' is defined but never used @typescript-eslint/no-unused-vars + 15:3 warning 'Recipe' is defined but never used @typescript-eslint/no-unused-vars + 19:3 warning 'Mission' is defined but never used @typescript-eslint/no-unused-vars + 43:11 warning 'get' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 402:13 warning 'get' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/stores/npcStore.ts + 289:13 warning 'get' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/utils/ImpactEngine.ts + 377:11 warning 'life' is never reassigned. Use 'const' instead prefer-const + +/home/ubuntu/projects/slide/frontend/src/utils/PerformanceManager.ts + 399:11 warning 'clampedDelta' is assigned a value but never used @typescript-eslint/no-unused-vars + 492:32 warning 'priority' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/utils/__tests__/bailHospitalSystem.test.ts + 24:8 warning 'RecoveryKind' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/utils/alchemyEngine.ts + 8:3 warning 'CraftedDrug' is defined but never used @typescript-eslint/no-unused-vars + 10:3 warning 'CraftingSession' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/utils/combatResolver.ts + 12:3 warning 'CombatEventResult' is defined but never used @typescript-eslint/no-unused-vars + 286:44 warning 'attacker' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 347:31 warning 'route' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/utils/dealtEngine.ts + 387:9 warning Unexpected lexical declaration in case block no-case-declarations + +/home/ubuntu/projects/slide/frontend/src/utils/gameLoopEngine.ts + 16:3 warning 'HEAT_CONFIG' is defined but never used @typescript-eslint/no-unused-vars + 25:62 warning 'ODEvent' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/utils/graffitiEngine.ts + 91:53 warning 'secondary' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/utils/gridFactory.ts + 12:3 warning 'MicroCoord' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/utils/gridGenerator.ts + 19:3 warning 'TileGenerationContext' is defined but never used @typescript-eslint/no-unused-vars + 24:10 warning 'getCityConfig' is defined but never used @typescript-eslint/no-unused-vars + 325:13 warning 'gridHeight' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/utils/moraleSystem.ts + 92:3 warning 'rng' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/utils/turnLogic.ts + 1:33 warning 'macroToMicroRegion' is defined but never used @typescript-eslint/no-unused-vars + 29:3 warning 'rng' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/utils/vehicleEngine.ts + 15:3 warning 'VEHICLE_SEAT_CONFIGS' is defined but never used @typescript-eslint/no-unused-vars + 18:8 warning 'VehicleSeatConfig' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide/frontend/src/utils/weaponSystem.ts + 12:8 warning 'ShooterTier' is defined but never used @typescript-eslint/no-unused-vars + +✖ 200 problems (0 errors, 200 warnings) + 0 errors and 2 warnings potentially fixable with the `--fix` option. + + +> dealt-slide-mvp@1.0.0 typecheck +> tsc --noEmit + + +> dealt-slide-mvp@1.0.0 test +> vitest run + + + RUN v2.1.9 /home/ubuntu/projects/slide/frontend + + ✓ src/utils/__tests__/blockMappers.test.ts (16 tests) 45ms + ✓ src/__tests__/idempotency.test.ts (18 tests) 20ms + ✓ src/__tests__/lasOlasReliability.test.tsx (30 tests | 4 skipped) 26ms +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > hands a geocoded AddressResult through CarCrew and into a coordinate-seeded scene +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + + ✓ src/stores/blockStore.encounter.test.ts (20 tests) 1316ms + ✓ src/stores/__tests__/mostWantedStore.test.ts (48 tests) 30ms +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > pre-fills a target locked from the Maps recon pin +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + + ✓ src/utils/__tests__/ghostCrewEngine.test.ts (29 tests) 32ms +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > labels the offline text fallback and hands a text-seed target when no geocoder result is chosen +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > two coordinate-distinct autocomplete picks produce distinct scenes +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + + ✓ src/components/raid/__tests__/policeRaid.test.ts (42 tests) 22ms +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > two coordinate-distinct autocomplete picks produce distinct scenes +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + + ✓ src/utils/__tests__/policeRaidEngine.test.ts (46 tests) 22ms + ✓ src/utils/__tests__/bailHospitalSystem.test.ts (59 tests) 18ms + ✓ src/game/loop/__tests__/blockLoop.test.ts (18 tests) 27ms + ✓ src/stores/__tests__/getBackStore.test.ts (43 tests) 31ms + ✓ src/components/driveby/__tests__/carCrewTarget.test.tsx (12 tests) 3074ms + ✓ CarCrewSelector → street handoff (#108) > hands a geocoded AddressResult through CarCrew and into a coordinate-seeded scene 962ms + ✓ CarCrewSelector → street handoff (#108) > two coordinate-distinct autocomplete picks produce distinct scenes 1391ms +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > offers dealer, recruit, shooter and driver as drivers, but only shooters as passengers +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > lets a shooter drive without counting them as the passenger shooter +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > refuses a now-injured or changed-role passenger before launch +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > shows the member portrait first, and labels role art when identity is missing +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > visibly labels role art when a stored personal portrait fails to load +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > shows actual carried inventory and core member stats without inventing a weapon or cash +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > does not invent full health or gear when the roster has no health record +Not implemented: Window's scrollTo() method + + ✓ src/stores/__tests__/ghostCrewStore.test.ts (11 tests) 45ms + ✓ src/render/__tests__/projection.test.ts (40 tests) 40ms + ✓ src/stores/__tests__/rivalStripDefense.test.ts (11 tests) 42ms + ✓ src/utils/__tests__/marketMembersCatalog.test.ts (44 tests) 89ms + ✓ src/utils/__tests__/blockDNAResolver.test.ts (16 tests) 35ms + ✓ src/components/topdown/__tests__/bipNDipGame.test.ts (27 tests) 31ms + ✓ src/utils/__tests__/blockDNALegacyContract.test.ts (20 tests) 29ms + ✓ src/render/__tests__/dioramaAdapter.test.ts (9 tests) 37ms + ✓ src/game/combat/__tests__/combatSession.test.ts (11 tests) 21ms + ✓ src/render/__tests__/worldActorResolver.test.ts (25 tests) 19ms + ✓ src/__tests__/economy-pillar1.test.ts (14 tests) 11ms + ✓ src/stores/__tests__/blockLoopShiftStore.test.tsx (9 tests) 608ms + ✓ Strip shifts through the shared stores > offers the next shift from the desk once the recovery is decided 384ms + ✓ src/game/loop/__tests__/blockLoopShifts.test.ts (9 tests) 37ms + ✓ src/utils/__tests__/blockDNAReloadIdentity.test.ts (7 tests) 39ms + ✓ src/game/combat/__tests__/CombatSessionController.test.ts (8 tests) 13ms + ✓ src/components/gang/__tests__/PhotoMemberCreator.test.tsx (5 tests) 1011ms + ✓ PhotoMemberCreator > identifies stock offline previews without claiming the photo was generated 430ms + ✓ src/stores/__tests__/npcStore.test.ts (14 tests) 20ms + ✓ src/render/__tests__/proceduralDriveBy.test.ts (16 tests) 42ms + ✓ src/__tests__/betaGate.smoke.test.ts (12 tests) 217ms + ✓ src/game/combat/__tests__/aimedFire.test.ts (5 tests) 8ms + ✓ src/hooks/__tests__/useBlockSync.test.tsx (5 tests) 266ms + ✓ src/components/tutorial/TutorialOverlay.test.tsx (4 tests) 319ms + ✓ src/config/__tests__/blockDNA.test.ts (23 tests) 76ms + ✓ src/utils/__tests__/memberXpWiring.test.ts (18 tests) 17ms + ✓ src/components/layout/BlockLoopDesk.test.tsx (8 tests) 1235ms + ✓ BlockLoopDesk > rejects a street cell and places a curb dealer with a visible income/exposure split 331ms + ✓ BlockLoopDesk > runs a deal receipt then books a deterministic wound 544ms + ✓ src/stores/__tests__/blockLoopStore.test.ts (5 tests) 32ms + ✓ src/utils/__tests__/shoeboxAnalytics.test.ts (6 tests) 30ms + ✓ src/components/gang/__tests__/MemberProgressPanel.test.ts (18 tests) 10ms + ✓ src/components/map/PlayableMap.test.tsx (6 tests) 350ms + ✓ src/components/topdown/__tests__/blockTopDownCoords.test.ts (18 tests) 12ms + ✓ src/components/slide/__tests__/v3Projection.test.ts (16 tests) 11ms + ✓ src/components/graffiti/__tests__/graffitiWiring.test.ts (14 tests) 15ms + ✓ src/services/worldPersistence.service.test.ts (6 tests) 10ms +stderr | src/__tests__/betaOnePath.test.tsx > Las Olas closed-beta one path > walks the seeded Las Olas desk from lock through deal, wound, and reload-safe books +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) + + ✓ src/__tests__/betaOnePath.test.tsx (4 tests) 1325ms + ✓ Las Olas closed-beta one path > does not treat a missing local acknowledgement as 18+ just because this is a demo build 376ms + ✓ Las Olas closed-beta one path > walks the seeded Las Olas desk from lock through deal, wound, and reload-safe books 739ms + ✓ src/game/assets/__tests__/assetPackages.test.ts (4 tests) 6ms + ✓ src/game/combat/__tests__/portableContracts.test.ts (3 tests) 7ms + ✓ src/components/map/__tests__/DrugAssignmentPanel.test.ts (11 tests) 7ms + ✓ src/components/map/GhostThreatBanner.test.tsx (5 tests) 550ms + ✓ GhostThreatBanner > routes an open Strip attack to the Strip 336ms + ✓ src/components/layout/CityBriefing.test.tsx (6 tests) 307ms + ✓ src/utils/__tests__/driveByTarget.test.ts (11 tests) 19ms + ✓ src/components/map/TacticalDiorama.test.tsx (4 tests) 734ms + ✓ TacticalDiorama player path > renders the Las Olas street plate with cover, street, crew, objective, and extraction 310ms + ✓ src/components/cocaine-crush/__tests__/cocaineCrush.test.ts (11 tests) 10ms +stderr | src/services/blockPersistence.service.test.ts > blockPersistence.service authoritative projection > does not fall through to an unguarded upsert when the server rejects a stale projection +[BlockPersistence] Skipped stale block projection after a newer encounter result. + + ✓ src/services/blockPersistence.service.test.ts (4 tests) 12ms + ✓ src/components/slide/__tests__/phaserBridge.test.ts (21 tests) 12ms + ✓ src/config/__tests__/blockDNACatalogExport.test.ts (6 tests) 111ms +stderr | src/components/system/RouteLoadBoundary.test.tsx > RouteLoadBoundary > shows recovery UI and keeps the fallback board when a heavy surface fails +Error: WebGL unavailable + at Boom (/home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.test.tsx:7:9) + at renderWithHooks (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:15486:18) + at mountIndeterminateComponent (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:20103:13) + at beginWork (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:21626:16) + at HTMLUnknownElement.callCallback (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:4164:14) + at HTMLUnknownElement.callTheUserObjectsOperation (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/generated/idl/EventListener.js:26:30) + at innerInvokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:360:16) + at invokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:296:3) + at HTMLUnknownElementImpl._dispatch (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:243:9) + at HTMLUnknownElementImpl.dispatchEvent (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:114:17) +Error: WebGL unavailable + at Boom (/home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.test.tsx:7:9) + at renderWithHooks (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:15486:18) + at mountIndeterminateComponent (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:20103:13) + at beginWork (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:21626:16) + at HTMLUnknownElement.callCallback (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:4164:14) + at HTMLUnknownElement.callTheUserObjectsOperation (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/generated/idl/EventListener.js:26:30) + at innerInvokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:360:16) + at invokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:296:3) + at HTMLUnknownElementImpl._dispatch (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:243:9) + at HTMLUnknownElementImpl.dispatchEvent (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:114:17) +The above error occurred in the component: + + at Boom (/home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.test.tsx:10:9) + at RouteLoadBoundary (/home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.tsx:69:1) + +React will try to recreate this component tree from scratch using the error boundary you provided, RouteLoadBoundary. + +stderr | src/components/system/RouteLoadBoundary.test.tsx > RouteLoadBoundary > retries and remounts children after a synchronous render failure +Error: chunk failed + at Flaky (/home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.test.tsx:37:30) + at renderWithHooks (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:15486:18) + at mountIndeterminateComponent (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:20103:13) + at beginWork (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:21626:16) + at HTMLUnknownElement.callCallback (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:4164:14) + at HTMLUnknownElement.callTheUserObjectsOperation (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/generated/idl/EventListener.js:26:30) + at innerInvokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:360:16) + at invokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:296:3) + at HTMLUnknownElementImpl._dispatch (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:243:9) + at HTMLUnknownElementImpl.dispatchEvent (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:114:17) +Error: chunk failed + at Flaky (/home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.test.tsx:37:30) + at renderWithHooks (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:15486:18) + at mountIndeterminateComponent (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:20103:13) + at beginWork (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:21626:16) + at HTMLUnknownElement.callCallback (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:4164:14) + at HTMLUnknownElement.callTheUserObjectsOperation (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/generated/idl/EventListener.js:26:30) + at innerInvokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:360:16) + at invokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:296:3) + at HTMLUnknownElementImpl._dispatch (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:243:9) + at HTMLUnknownElementImpl.dispatchEvent (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:114:17) +The above error occurred in the component: + + at Flaky (/home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.test.tsx:54:30) + at RouteLoadBoundary (/home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.tsx:69:1) + +React will try to recreate this component tree from scratch using the error boundary you provided, RouteLoadBoundary. + +stderr | src/components/system/RouteLoadBoundary.test.tsx > RouteLoadBoundary > retries a rejected React.lazy import with a fresh loader attempt +Error: Failed to fetch dynamically imported module + at /home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.test.tsx:58:31 + at /home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.tsx:77:11 + at processTicksAndRejections (node:internal/process/task_queues:104:5) +Error: Failed to fetch dynamically imported module + at /home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.test.tsx:58:31 + at /home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.tsx:77:11 + at processTicksAndRejections (node:internal/process/task_queues:104:5) +The above error occurred in the component: + + at RetryableLazy (/home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.tsx:36:43) + at Suspense + at RouteLoadBoundary (/home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.tsx:69:1) + at LazyRoute (/home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.tsx:148:3) + +React will try to recreate this component tree from scratch using the error boundary you provided, RouteLoadBoundary. + + ✓ src/components/map/__tests__/NPCThreatBanner.test.tsx (5 tests) 330ms + ✓ src/components/system/RouteLoadBoundary.test.tsx (4 tests) 344ms +stderr | src/components/layout/BlockLoopDesk.fallback.test.tsx > BlockLoopDesk diorama fallback board > advances loop placement from a fallback board cell click +Error: WebGL unavailable + at default (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.fallback.test.tsx:4:11) + at renderWithHooks (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:15486:18) + at mountIndeterminateComponent (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:20103:13) + at beginWork (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:21626:16) + at HTMLUnknownElement.callCallback (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:4164:14) + at HTMLUnknownElement.callTheUserObjectsOperation (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/generated/idl/EventListener.js:26:30) + at innerInvokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:360:16) + at invokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:296:3) + at HTMLUnknownElementImpl._dispatch (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:243:9) + at HTMLUnknownElementImpl.dispatchEvent (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:114:17) +Error: WebGL unavailable + at default (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.fallback.test.tsx:4:11) + at renderWithHooks (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:15486:18) + at mountIndeterminateComponent (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:20103:13) + at beginWork (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:21626:16) + at HTMLUnknownElement.callCallback (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:4164:14) + at HTMLUnknownElement.callTheUserObjectsOperation (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/generated/idl/EventListener.js:26:30) + at innerInvokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:360:16) + at invokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:296:3) + at HTMLUnknownElementImpl._dispatch (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:243:9) + at HTMLUnknownElementImpl.dispatchEvent (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:114:17) +The above error occurred in the component: + + at default (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.fallback.test.tsx:4:11) + at RouteLoadBoundary (/home/ubuntu/projects/slide/frontend/src/components/system/RouteLoadBoundary.tsx:69:1) + at section + at div + at BlockLoopDesk (/home/ubuntu/projects/slide/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) + +React will try to recreate this component tree from scratch using the error boundary you provided, RouteLoadBoundary. + + ✓ src/components/layout/BlockLoopDesk.fallback.test.tsx (1 test) 914ms + ✓ BlockLoopDesk diorama fallback board > advances loop placement from a fallback board cell click 912ms + ✓ src/components/map/__tests__/playableMapGeometry.test.ts (3 tests) 7ms + ✓ src/hooks/useGhostCrewSync.test.tsx (3 tests) 195ms + ✓ src/utils/__tests__/BulletCamEngine.test.ts (5 tests) 14ms +stderr | src/components/topdown/__tests__/TopDownShooter.launch.test.tsx > TopDownShooter empty seats > stays disabled when the passenger cannot shoot, then enables for a shooter +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + + ✓ src/components/topdown/__tests__/TopDownShooter.launch.test.tsx (2 tests) 549ms + ✓ TopDownShooter empty seats > keeps Launch Attack disabled while the driver and shooter seats are empty 382ms + ✓ src/__tests__/routePerformance.contract.test.ts (6 tests) 16ms + ✓ src/components/encounter/__tests__/UnifiedEncounterLog.test.tsx (1 test) 91ms + ✓ src/components/missions/__tests__/AttackPlanner.launch.test.tsx (2 tests) 364ms + ✓ src/types/contracts/blockScene.test.ts (3 tests) 4ms + ✓ src/components/map/BlockModeView.test.tsx (1 test) 392ms + ✓ BlockModeView beta chrome > keeps diorama, board, and encounter as the only Strip tabs and forwards map failure 390ms + ✓ src/utils/__tests__/bulletCamTrigger.test.ts (6 tests) 6ms + ✓ src/hooks/__tests__/useBlockSatellite.test.ts (7 tests) 6ms + ✓ src/components/contacts/__tests__/Contacts.test.tsx (1 test) 414ms + ✓ Contacts photo recruit detail > shows the generated photo recruit backstory in the contact profile 413ms + ✓ src/components/phone/__tests__/PhoneApp.test.tsx (2 tests) 333ms + ✓ src/utils/__tests__/nearbyBlocks.test.ts (4 tests) 6ms + ✓ src/components/compliance/AgeGate.test.tsx (5 tests) 487ms + ✓ AgeGate demo evaluation chrome > shows the mature-content gate and evaluation banner without skipping 18+ 480ms + ✓ src/utils/__tests__/demoSeedBooks.test.ts (2 tests) 10ms +stderr | src/services/__tests__/avatarGeneration.service.test.ts > offline photo preview > returns loadable registered stock art for every recruit role +[AvatarService] Backend unavailable, using mock assets. +[AvatarService] Backend unavailable, using mock assets. +[AvatarService] Backend unavailable, using mock assets. +[AvatarService] Backend unavailable, using mock assets. +[AvatarService] Backend unavailable, using mock assets. +[AvatarService] Backend unavailable, using mock assets. +[AvatarService] Backend unavailable, using mock assets. + +stderr | src/services/__tests__/avatarGeneration.service.test.ts > offline photo preview > keeps unrequested outputs absent in the offline preview +[AvatarService] Backend unavailable, using mock assets. + + ✓ src/services/__tests__/avatarGeneration.service.test.ts (2 tests) 19ms + ✓ src/utils/__tests__/demoSeedContacts.test.ts (2 tests) 15ms + ✓ src/components/hub/Leaderboard.test.tsx (2 tests) 244ms + ✓ src/components/system/StartupErrorBoundary.test.tsx (2 tests) 291ms + ✓ src/utils/__tests__/demoSeedProgress.test.ts (2 tests) 10ms + ✓ src/stores/__tests__/notificationStore.test.ts (2 tests) 6ms + ✓ src/utils/authPlayer.test.ts (5 tests) 7ms + ✓ src/utils/__tests__/geo.test.ts (5 tests) 5ms + ✓ src/utils/__tests__/phaserReady.test.ts (3 tests) 4ms + ✓ src/components/layout/__tests__/OSShellBalance.test.tsx (2 tests) 379ms + ✓ command desk authoritative street cash > shows and refreshes the live player balance for account-123 311ms + ✓ src/game/ops/__tests__/opsCoordinates.test.ts (2 tests) 7ms + ✓ src/stores/__tests__/combatIntentStore.test.ts (1 test) 3ms + ✓ src/components/hub/Leaderboard.security.test.ts (1 test) 3ms + ✓ src/__tests__/releasePreflight.test.ts (4 tests) 273ms + ✓ src/__tests__/assetProcessor.test.ts (8 tests) 1468ms + ✓ asset processor incremental imports > retains registered actors when importing a new actor and on a repeated no-op write 333ms + + Test Files 91 passed (91) + Tests 1033 passed | 4 skipped (1037) + Start at 18:00:01 + Duration 32.47s (transform 3.91s, setup 9.61s, collect 16.41s, tests 19.76s, environment 84.63s, prepare 7.92s) + + +> dealt-slide-mvp@1.0.0 assets:audit +> node scripts/assets/audit.mjs + + +SLIDE asset audit +────────────────────────────────────────────────────────────────────── +Assets checked : 112 +Package files : 13 (1.57 MB) +Runtime total : 7.70 MB / 20 MB budget +Errors : 0 +Warnings : 0 + +AUDIT PASSED + +> dealt-slide-mvp@1.0.0 assets:packages +> node scripts/assets/validate-packages.mjs + +Asset package validation passed: 5 package(s), 4 schema(s). diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-combat-state.png b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-combat-state.png new file mode 100644 index 0000000..4e28dd7 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-combat-state.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-consequence.png b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-consequence.png new file mode 100644 index 0000000..32a32fa Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-consequence.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-encounter-entry.png b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-encounter-entry.png new file mode 100644 index 0000000..b8eee01 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-encounter-entry.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-reload-hud.png b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-reload-hud.png new file mode 100644 index 0000000..c425052 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-reload-hud.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-reload-return.png b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-reload-return.png new file mode 100644 index 0000000..40eb6f4 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-reload-return.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-report.json b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-report.json new file mode 100644 index 0000000..860ca4b --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-report.json @@ -0,0 +1,5175 @@ +{ + "label": "main", + "origin": "http://127.0.0.1:4174", + "viewport": { + "width": 1440, + "height": 900 + }, + "imageFailure": false, + "checks": [ + { + "name": "Named fictional opposition visible", + "pass": true + }, + { + "name": "All opposition uses registered character Images, not circles", + "pass": false + }, + { + "name": "Actual Dre cell matches rendered destination (0,2)", + "pass": true + }, + { + "name": "Actual Rome cell matches rendered destination (4,4)", + "pass": true + }, + { + "name": "Reload command emits real engine event", + "pass": true + }, + { + "name": "Reload finishes through the real engine", + "pass": true + }, + { + "name": "Real fire event recorded", + "pass": true + }, + { + "name": "Downed opponent uses registered downed state", + "pass": false + }, + { + "name": "Demo result receipt survives reload exactly once", + "pass": true + }, + { + "name": "Reload preserves booked money, heat, morale, and crew health", + "pass": true + }, + { + "name": "No uncaught page errors", + "pass": true + } + ], + "screenshots": [ + "main-1440x900-strategy-diorama.png", + "main-1440x900-encounter-entry.png", + "main-1440x900-reload-hud.png", + "main-1440x900-combat-state.png", + "main-1440x900-result.png", + "main-1440x900-consequence.png", + "main-1440x900-returned.png", + "main-1440x900-reload-return.png" + ], + "pageErrors": [], + "consoleErrors": [ + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: the server responded with a status of 404 (File not found)" + ], + "failedRequests": [], + "snapshots": [ + { + "name": "entry", + "state": { + "tick": 0, + "phase": "active", + "selectedCrewId": "demo-dealer-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 1, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": -1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 3 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-dealer", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-shooter", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits" + } + }, + { + "name": "dre-move", + "state": { + "tick": 10, + "phase": "active", + "selectedCrewId": "demo-dealer-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 3 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-dealer", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-shooter", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits" + } + }, + { + "name": "rome-move", + "state": { + "tick": 14, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": 2, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:14:1:moved", + "tick": 14, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-dealer", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-shooter", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits" + } + }, + { + "name": "after-fire", + "state": { + "tick": 18, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 10, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 23, + "level": 3, + "lastSequence": 3, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:14:1:moved", + "tick": 14, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-dealer", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-shooter", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits" + } + }, + { + "name": "reload-start", + "state": { + "tick": 22, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 10, + "maxAmmo": 11, + "reloadUntilTick": 42, + "nextFireTick": 23, + "level": 3, + "lastSequence": 4, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:14:1:moved", + "tick": 14, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:22:8:reload-start", + "tick": 22, + "type": "reload-start", + "actorId": "demo-shooter-1", + "message": "Big Rome starts reloading." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-dealer", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-shooter", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits" + } + }, + { + "name": "reload-complete", + "state": { + "tick": 46, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 95, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 23, + "level": 3, + "lastSequence": 4, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 45, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 45, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:14:1:moved", + "tick": 14, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:22:8:reload-start", + "tick": 22, + "type": "reload-start", + "actorId": "demo-shooter-1", + "message": "Big Rome starts reloading." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:9:weapon-fired", + "tick": 40, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:10:impact-cover", + "tick": 40, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:11:weapon-fired", + "tick": 40, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:12:impact-actor", + "tick": 40, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:42:13:reload-complete", + "tick": 42, + "type": "reload-complete", + "actorId": "demo-shooter-1", + "message": "Big Rome is ready." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-dealer", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-shooter", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits" + } + }, + { + "name": "combat-state", + "state": { + "tick": 208, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 65, + "maxHealth": 100, + "armor": 1, + "ammo": 6, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 201, + "level": 3, + "lastSequence": 9, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 205, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 0, + "maxHealth": 55, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 185, + "level": 1, + "lastSequence": -1, + "isDown": true + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:100:25:impact-cover", + "tick": 100, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:100:26:weapon-fired", + "tick": 100, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:100:27:impact-cover", + "tick": 100, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:102:28:weapon-fired", + "tick": 102, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:102:29:impact-cover", + "tick": 102, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:weapon-fired", + "tick": 120, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:impact-cover", + "tick": 120, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:weapon-fired", + "tick": 120, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:impact-cover", + "tick": 120, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:134:30:weapon-fired", + "tick": 134, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:134:30:impact-cover", + "tick": 134, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:weapon-fired", + "tick": 140, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:impact-actor", + "tick": 140, + "type": "impact-actor", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:weapon-fired", + "tick": 140, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:impact-actor", + "tick": 140, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:160:30:reload-start", + "tick": 160, + "type": "reload-start", + "actorId": "opposition-1", + "message": "Nightfall lookout reloads." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:160:30:reload-start", + "tick": 160, + "type": "reload-start", + "actorId": "opposition-2", + "message": "Nightfall 2 reloads." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:164:30:weapon-fired", + "tick": 164, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:164:30:impact-cover", + "tick": 164, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:reload-complete", + "tick": 180, + "type": "reload-complete", + "actorId": "opposition-1", + "message": "Nightfall lookout is ready." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:reload-complete", + "tick": 180, + "type": "reload-complete", + "actorId": "opposition-2", + "message": "Nightfall 2 is ready." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:weapon-fired", + "tick": 180, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:impact-cover", + "tick": 180, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:weapon-fired", + "tick": 180, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:impact-actor", + "tick": 180, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:196:30:weapon-fired", + "tick": 196, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:196:30:impact-actor", + "tick": 196, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:196:30:actor-downed", + "tick": 196, + "type": "actor-downed", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Nightfall 2 is down." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:weapon-fired", + "tick": 200, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:impact-actor", + "tick": 200, + "type": "impact-actor", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-dealer", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-shooter", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2 · DOWN" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n1 opposition visible\n0/1 secure exits" + } + } + ], + "httpErrors": [ + { + "url": "http://127.0.0.1:4174/favicon.svg", + "status": 404 + }, + { + "url": "http://127.0.0.1:4174/assets/game_logo.png", + "status": 404 + }, + { + "url": "http://127.0.0.1:4174/assets/generated/ui/icons/icon_news_v001.png", + "status": 404 + } + ], + "ledgerBeforeReload": "{\"version\":1,\"phase\":\"consequence\",\"money\":12844,\"playerHeat\":9,\"reputation\":13,\"blockHeat\":2,\"blockMorale\":66,\"pendingIncome\":0,\"productQuantity\":7,\"assignments\":{\"demo-dealer-1\":\"demo-product-river-cut\"},\"placements\":[{\"memberId\":\"demo-dealer-1\",\"memberName\":\"Lil Dre\",\"role\":\"dealer\",\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"incomePerTick\":67,\"exposureRisk\":50,\"level\":2,\"health\":100},{\"memberId\":\"demo-shooter-1\",\"memberName\":\"Big Rome\",\"role\":\"shooter\",\"x\":4,\"y\":3,\"zoneType\":\"storefront\",\"incomePerTick\":0,\"exposureRisk\":25,\"level\":3,\"health\":100}],\"appliedEncounterKeys\":[\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"economyKeys\":[\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"dealKey\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounterKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"lastDeal\":{\"key\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"dealerId\":\"demo-dealer-1\",\"productId\":\"demo-product-river-cut\",\"productName\":\"River Cut\",\"productTier\":\"street\",\"cell\":{\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"exposureRisk\":50},\"moneyDelta\":844,\"productDelta\":-5,\"heatDelta\":4,\"exposureDelta\":4,\"reputationDelta\":1,\"demandBonusPct\":11,\"leftoverQuantity\":7,\"explanation\":\"Street exposure +11% → higher demand, but heat +4 and exposure +4. 5 River Cut moved for $844.\"},\"lastEncounter\":{\"idempotencyKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"outcome\":\"retreated\",\"crewDown\":[],\"oppositionDown\":[\"opposition-2\"],\"objectiveProgress\":0,\"heatDelta\":0,\"moraleDelta\":-4,\"pendingIncomeDelta\":-15,\"summary\":\"The crew disengaged and kept the situation from escalating.\"},\"selectedDealerId\":\"demo-dealer-1\",\"selectedShooterId\":\"demo-shooter-1\",\"briefing\":[\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\",\"The crew disengaged and kept the situation from escalating.\",\"Heat +0, morale -4, pending cash -$15.\"],\"threatRoute\":\"slide\",\"threatReason\":\"Nightfall Crew is sliding on 1208 W Las Olas Blvd. The deal put your dealer at 50 street exposure — hold the strip or get the crew out.\",\"rivalIncident\":{\"receiptKey\":\"demo-city-brief-attack\",\"eventId\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"description\":\"Nightfall is testing the edge of your Las Olas block. Review your crew positions before the next move.\",\"occurredAt\":1792259416456},\"rivalResolution\":{\"receiptKey\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"outcome\":\"retreated\",\"line\":\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\"},\"pendingHealthIds\":[],\"recovery\":null,\"shiftIndex\":1,\"stock\":[{\"id\":\"demo-product-river-cut\",\"name\":\"River Cut\",\"tier\":\"street\",\"quality\":62,\"quantity\":7,\"craftedAt\":1700000000000,\"effects\":[\"fast-ticket\"]}],\"crew\":[{\"id\":\"demo-dealer-1\",\"health\":100,\"morale\":85,\"assignment\":\"sidewalk\"},{\"id\":\"demo-shooter-1\",\"health\":100,\"morale\":80,\"assignment\":\"storefront 4,3\"}]}", + "ledgerAfterReload": "{\"version\":1,\"phase\":\"returned\",\"money\":12844,\"playerHeat\":9,\"reputation\":13,\"blockHeat\":2,\"blockMorale\":66,\"pendingIncome\":0,\"productQuantity\":7,\"assignments\":{\"demo-dealer-1\":\"demo-product-river-cut\"},\"placements\":[{\"memberId\":\"demo-dealer-1\",\"memberName\":\"Lil Dre\",\"role\":\"dealer\",\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"incomePerTick\":67,\"exposureRisk\":50,\"level\":2,\"health\":100},{\"memberId\":\"demo-shooter-1\",\"memberName\":\"Big Rome\",\"role\":\"shooter\",\"x\":4,\"y\":3,\"zoneType\":\"storefront\",\"incomePerTick\":0,\"exposureRisk\":25,\"level\":3,\"health\":100}],\"appliedEncounterKeys\":[\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"economyKeys\":[\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"dealKey\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounterKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"lastDeal\":{\"key\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"dealerId\":\"demo-dealer-1\",\"productId\":\"demo-product-river-cut\",\"productName\":\"River Cut\",\"productTier\":\"street\",\"cell\":{\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"exposureRisk\":50},\"moneyDelta\":844,\"productDelta\":-5,\"heatDelta\":4,\"exposureDelta\":4,\"reputationDelta\":1,\"demandBonusPct\":11,\"leftoverQuantity\":7,\"explanation\":\"Street exposure +11% → higher demand, but heat +4 and exposure +4. 5 River Cut moved for $844.\"},\"lastEncounter\":{\"idempotencyKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"outcome\":\"retreated\",\"crewDown\":[],\"oppositionDown\":[\"opposition-2\"],\"objectiveProgress\":0,\"heatDelta\":0,\"moraleDelta\":-4,\"pendingIncomeDelta\":-15,\"summary\":\"The crew disengaged and kept the situation from escalating.\"},\"selectedDealerId\":\"demo-dealer-1\",\"selectedShooterId\":\"demo-shooter-1\",\"briefing\":[\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\",\"Street cash $12844. Heat 9. Product 7.\",\"Encounter encounter-demo-block-las-olas-17gayr2:retreated stays booked.\"],\"threatRoute\":\"slide\",\"threatReason\":\"Nightfall Crew is sliding on 1208 W Las Olas Blvd. The deal put your dealer at 50 street exposure — hold the strip or get the crew out.\",\"rivalIncident\":{\"receiptKey\":\"demo-city-brief-attack\",\"eventId\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"description\":\"Nightfall is testing the edge of your Las Olas block. Review your crew positions before the next move.\",\"occurredAt\":1792259416456},\"rivalResolution\":{\"receiptKey\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"outcome\":\"retreated\",\"line\":\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\"},\"pendingHealthIds\":[],\"recovery\":null,\"shiftIndex\":1,\"stock\":[{\"id\":\"demo-product-river-cut\",\"name\":\"River Cut\",\"tier\":\"street\",\"quality\":62,\"quantity\":7,\"craftedAt\":1700000000000,\"effects\":[\"fast-ticket\"]}],\"crew\":[{\"id\":\"demo-dealer-1\",\"health\":100,\"morale\":85,\"assignment\":\"sidewalk\"},{\"id\":\"demo-shooter-1\",\"health\":100,\"morale\":80,\"assignment\":\"storefront 4,3\"}]}" +} diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-result.png b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-result.png new file mode 100644 index 0000000..e4ecefe Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-result.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-returned.png b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-returned.png new file mode 100644 index 0000000..1657948 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-returned.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-strategy-diorama.png b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-strategy-diorama.png new file mode 100644 index 0000000..8c847a8 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-1440x900-strategy-diorama.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-combat-state.png b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-combat-state.png new file mode 100644 index 0000000..e21da6b Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-combat-state.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-consequence.png b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-consequence.png new file mode 100644 index 0000000..783a527 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-consequence.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-encounter-entry.png b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-encounter-entry.png new file mode 100644 index 0000000..5418d9a Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-encounter-entry.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-reload-hud.png b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-reload-hud.png new file mode 100644 index 0000000..6e9f211 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-reload-hud.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-reload-return.png b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-reload-return.png new file mode 100644 index 0000000..6a8529f Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-reload-return.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-report.json b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-report.json new file mode 100644 index 0000000..a653d4e --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-report.json @@ -0,0 +1,5212 @@ +{ + "label": "main", + "origin": "http://127.0.0.1:4174", + "viewport": { + "width": 390, + "height": 844 + }, + "imageFailure": false, + "checks": [ + { + "name": "Named fictional opposition visible", + "pass": true + }, + { + "name": "All opposition uses registered character Images, not circles", + "pass": false + }, + { + "name": "Actual Dre cell matches rendered destination (0,2)", + "pass": true + }, + { + "name": "Actual Rome cell matches rendered destination (4,4)", + "pass": true + }, + { + "name": "Reload command emits real engine event", + "pass": true + }, + { + "name": "Reload finishes through the real engine", + "pass": true + }, + { + "name": "Real fire event recorded", + "pass": true + }, + { + "name": "Downed opponent uses registered downed state", + "pass": false + }, + { + "name": "Demo result receipt survives reload exactly once", + "pass": true + }, + { + "name": "Reload preserves booked money, heat, morale, and crew health", + "pass": true + }, + { + "name": "No uncaught page errors", + "pass": true + } + ], + "screenshots": [ + "main-390x844-strategy-diorama.png", + "main-390x844-encounter-entry.png", + "main-390x844-reload-hud.png", + "main-390x844-combat-state.png", + "main-390x844-result.png", + "main-390x844-consequence.png", + "main-390x844-returned.png", + "main-390x844-reload-return.png" + ], + "pageErrors": [], + "consoleErrors": [ + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: the server responded with a status of 404 (File not found)" + ], + "failedRequests": [], + "snapshots": [ + { + "name": "entry", + "state": { + "tick": 0, + "phase": "active", + "selectedCrewId": "demo-dealer-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 1, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": -1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 3 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-dealer", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-shooter", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits" + } + }, + { + "name": "dre-move", + "state": { + "tick": 10, + "phase": "active", + "selectedCrewId": "demo-dealer-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 3 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-dealer", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-shooter", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits" + } + }, + { + "name": "rome-move", + "state": { + "tick": 16, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": 2, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:1:moved", + "tick": 16, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-dealer", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-shooter", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits" + } + }, + { + "name": "after-fire", + "state": { + "tick": 20, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 10, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 23, + "level": 3, + "lastSequence": 3, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:1:moved", + "tick": 16, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-dealer", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-shooter", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits" + } + }, + { + "name": "reload-start", + "state": { + "tick": 24, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 10, + "maxAmmo": 11, + "reloadUntilTick": 42, + "nextFireTick": 23, + "level": 3, + "lastSequence": 4, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:1:moved", + "tick": 16, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:22:8:reload-start", + "tick": 22, + "type": "reload-start", + "actorId": "demo-shooter-1", + "message": "Big Rome starts reloading." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-dealer", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-shooter", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits" + } + }, + { + "name": "reload-complete", + "state": { + "tick": 44, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 95, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 23, + "level": 3, + "lastSequence": 4, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 45, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 45, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:1:moved", + "tick": 16, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:22:8:reload-start", + "tick": 22, + "type": "reload-start", + "actorId": "demo-shooter-1", + "message": "Big Rome starts reloading." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:9:weapon-fired", + "tick": 40, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:10:impact-cover", + "tick": 40, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:11:weapon-fired", + "tick": 40, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:12:impact-actor", + "tick": 40, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:42:13:reload-complete", + "tick": 42, + "type": "reload-complete", + "actorId": "demo-shooter-1", + "message": "Big Rome is ready." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-dealer", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-shooter", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits" + } + }, + { + "name": "combat-state", + "state": { + "tick": 214, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 65, + "maxHealth": 100, + "armor": 1, + "ammo": 6, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 207, + "level": 3, + "lastSequence": 9, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 205, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 0, + "maxHealth": 55, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 205, + "level": 1, + "lastSequence": -1, + "isDown": true + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:100:27:impact-cover", + "tick": 100, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:100:28:weapon-fired", + "tick": 100, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:100:29:impact-cover", + "tick": 100, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:weapon-fired", + "tick": 120, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:impact-cover", + "tick": 120, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:weapon-fired", + "tick": 120, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:impact-cover", + "tick": 120, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:132:30:weapon-fired", + "tick": 132, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:132:30:impact-cover", + "tick": 132, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:weapon-fired", + "tick": 140, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:impact-actor", + "tick": 140, + "type": "impact-actor", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:weapon-fired", + "tick": 140, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:impact-actor", + "tick": 140, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:160:30:reload-start", + "tick": 160, + "type": "reload-start", + "actorId": "opposition-1", + "message": "Nightfall lookout reloads." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:160:30:reload-start", + "tick": 160, + "type": "reload-start", + "actorId": "opposition-2", + "message": "Nightfall 2 reloads." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:168:30:weapon-fired", + "tick": 168, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:168:30:impact-cover", + "tick": 168, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:reload-complete", + "tick": 180, + "type": "reload-complete", + "actorId": "opposition-1", + "message": "Nightfall lookout is ready." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:reload-complete", + "tick": 180, + "type": "reload-complete", + "actorId": "opposition-2", + "message": "Nightfall 2 is ready." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:weapon-fired", + "tick": 180, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:impact-cover", + "tick": 180, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:weapon-fired", + "tick": 180, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:impact-actor", + "tick": 180, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:weapon-fired", + "tick": 200, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:impact-cover", + "tick": 200, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:weapon-fired", + "tick": 200, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:impact-actor", + "tick": 200, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:202:30:weapon-fired", + "tick": 202, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:202:30:impact-actor", + "tick": 202, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:202:30:actor-downed", + "tick": 202, + "type": "actor-downed", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Nightfall 2 is down." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-dealer", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-shooter", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2 · DOWN" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n1 opposition visible\n0/1 secure exits" + } + } + ], + "httpErrors": [ + { + "url": "http://127.0.0.1:4174/favicon.svg", + "status": 404 + }, + { + "url": "http://127.0.0.1:4174/favicon.svg", + "status": 404 + }, + { + "url": "http://127.0.0.1:4174/assets/game_logo.png", + "status": 404 + }, + { + "url": "http://127.0.0.1:4174/assets/generated/ui/icons/icon_news_v001.png", + "status": 404 + } + ], + "ledgerBeforeReload": "{\"version\":1,\"phase\":\"consequence\",\"money\":12844,\"playerHeat\":9,\"reputation\":13,\"blockHeat\":2,\"blockMorale\":66,\"pendingIncome\":52,\"productQuantity\":7,\"assignments\":{\"demo-dealer-1\":\"demo-product-river-cut\"},\"placements\":[{\"memberId\":\"demo-dealer-1\",\"memberName\":\"Lil Dre\",\"role\":\"dealer\",\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"incomePerTick\":67,\"exposureRisk\":50,\"level\":2,\"health\":100},{\"memberId\":\"demo-shooter-1\",\"memberName\":\"Big Rome\",\"role\":\"shooter\",\"x\":4,\"y\":3,\"zoneType\":\"storefront\",\"incomePerTick\":0,\"exposureRisk\":25,\"level\":3,\"health\":100}],\"appliedEncounterKeys\":[\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"economyKeys\":[\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"dealKey\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounterKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"lastDeal\":{\"key\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"dealerId\":\"demo-dealer-1\",\"productId\":\"demo-product-river-cut\",\"productName\":\"River Cut\",\"productTier\":\"street\",\"cell\":{\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"exposureRisk\":50},\"moneyDelta\":844,\"productDelta\":-5,\"heatDelta\":4,\"exposureDelta\":4,\"reputationDelta\":1,\"demandBonusPct\":11,\"leftoverQuantity\":7,\"explanation\":\"Street exposure +11% → higher demand, but heat +4 and exposure +4. 5 River Cut moved for $844.\"},\"lastEncounter\":{\"idempotencyKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"outcome\":\"retreated\",\"crewDown\":[],\"oppositionDown\":[\"opposition-2\"],\"objectiveProgress\":0,\"heatDelta\":0,\"moraleDelta\":-4,\"pendingIncomeDelta\":-15,\"summary\":\"The crew disengaged and kept the situation from escalating.\"},\"selectedDealerId\":\"demo-dealer-1\",\"selectedShooterId\":\"demo-shooter-1\",\"briefing\":[\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\",\"The crew disengaged and kept the situation from escalating.\",\"Heat +0, morale -4, pending cash -$15.\"],\"threatRoute\":\"slide\",\"threatReason\":\"Nightfall Crew is sliding on 1208 W Las Olas Blvd. The deal put your dealer at 50 street exposure — hold the strip or get the crew out.\",\"rivalIncident\":{\"receiptKey\":\"demo-city-brief-attack\",\"eventId\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"description\":\"Nightfall is testing the edge of your Las Olas block. Review your crew positions before the next move.\",\"occurredAt\":1792259383203},\"rivalResolution\":{\"receiptKey\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"outcome\":\"retreated\",\"line\":\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\"},\"pendingHealthIds\":[],\"recovery\":null,\"shiftIndex\":1,\"stock\":[{\"id\":\"demo-product-river-cut\",\"name\":\"River Cut\",\"tier\":\"street\",\"quality\":62,\"quantity\":7,\"craftedAt\":1700000000000,\"effects\":[\"fast-ticket\"]}],\"crew\":[{\"id\":\"demo-dealer-1\",\"health\":100,\"morale\":85,\"assignment\":\"sidewalk\"},{\"id\":\"demo-shooter-1\",\"health\":100,\"morale\":80,\"assignment\":\"storefront 4,3\"}]}", + "ledgerAfterReload": "{\"version\":1,\"phase\":\"returned\",\"money\":12844,\"playerHeat\":9,\"reputation\":13,\"blockHeat\":2,\"blockMorale\":66,\"pendingIncome\":52,\"productQuantity\":7,\"assignments\":{\"demo-dealer-1\":\"demo-product-river-cut\"},\"placements\":[{\"memberId\":\"demo-dealer-1\",\"memberName\":\"Lil Dre\",\"role\":\"dealer\",\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"incomePerTick\":67,\"exposureRisk\":50,\"level\":2,\"health\":100},{\"memberId\":\"demo-shooter-1\",\"memberName\":\"Big Rome\",\"role\":\"shooter\",\"x\":4,\"y\":3,\"zoneType\":\"storefront\",\"incomePerTick\":0,\"exposureRisk\":25,\"level\":3,\"health\":100}],\"appliedEncounterKeys\":[\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"economyKeys\":[\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"dealKey\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounterKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"lastDeal\":{\"key\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"dealerId\":\"demo-dealer-1\",\"productId\":\"demo-product-river-cut\",\"productName\":\"River Cut\",\"productTier\":\"street\",\"cell\":{\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"exposureRisk\":50},\"moneyDelta\":844,\"productDelta\":-5,\"heatDelta\":4,\"exposureDelta\":4,\"reputationDelta\":1,\"demandBonusPct\":11,\"leftoverQuantity\":7,\"explanation\":\"Street exposure +11% → higher demand, but heat +4 and exposure +4. 5 River Cut moved for $844.\"},\"lastEncounter\":{\"idempotencyKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"outcome\":\"retreated\",\"crewDown\":[],\"oppositionDown\":[\"opposition-2\"],\"objectiveProgress\":0,\"heatDelta\":0,\"moraleDelta\":-4,\"pendingIncomeDelta\":-15,\"summary\":\"The crew disengaged and kept the situation from escalating.\"},\"selectedDealerId\":\"demo-dealer-1\",\"selectedShooterId\":\"demo-shooter-1\",\"briefing\":[\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\",\"Street cash $12844. Heat 9. Product 7.\",\"Encounter encounter-demo-block-las-olas-17gayr2:retreated stays booked.\"],\"threatRoute\":\"slide\",\"threatReason\":\"Nightfall Crew is sliding on 1208 W Las Olas Blvd. The deal put your dealer at 50 street exposure — hold the strip or get the crew out.\",\"rivalIncident\":{\"receiptKey\":\"demo-city-brief-attack\",\"eventId\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"description\":\"Nightfall is testing the edge of your Las Olas block. Review your crew positions before the next move.\",\"occurredAt\":1792259383203},\"rivalResolution\":{\"receiptKey\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"outcome\":\"retreated\",\"line\":\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\"},\"pendingHealthIds\":[],\"recovery\":null,\"shiftIndex\":1,\"stock\":[{\"id\":\"demo-product-river-cut\",\"name\":\"River Cut\",\"tier\":\"street\",\"quality\":62,\"quantity\":7,\"craftedAt\":1700000000000,\"effects\":[\"fast-ticket\"]}],\"crew\":[{\"id\":\"demo-dealer-1\",\"health\":100,\"morale\":85,\"assignment\":\"sidewalk\"},{\"id\":\"demo-shooter-1\",\"health\":100,\"morale\":80,\"assignment\":\"storefront 4,3\"}]}" +} diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-result.png b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-result.png new file mode 100644 index 0000000..915e4c1 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-result.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-returned.png b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-returned.png new file mode 100644 index 0000000..8f4013e Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-returned.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-strategy-diorama.png b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-strategy-diorama.png new file mode 100644 index 0000000..566a63e Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/main-390x844-strategy-diorama.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/main-build.log b/docs/evidence/2026-10-17-member-graphics-integration/main-build.log new file mode 100644 index 0000000..50c257f --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/main-build.log @@ -0,0 +1,247 @@ + +> dealt-slide-mvp@1.0.0 build +> vite build + +vite v5.4.21 building for production... +transforming... + +/assets/game_logo.png referenced in /assets/game_logo.png didn't resolve at build time, it will remain unchanged to be resolved at runtime + +/assets/bg_menu.jpg referenced in /assets/bg_menu.jpg didn't resolve at build time, it will remain unchanged to be resolved at runtime + +/assets/bg_driveby.jpg referenced in /assets/bg_driveby.jpg didn't resolve at build time, it will remain unchanged to be resolved at runtime +✓ 3347 modules transformed. +rendering chunks... +computing gzip size... +dist/index.html 0.90 kB │ gzip: 0.47 kB +dist/assets/maplibre-gl-worker-BSIqwooQ.js 476.61 kB +dist/assets/AttackPlanner-Q4knGRYB.css 1.05 kB │ gzip: 0.45 kB +dist/assets/Leaderboard-CQC2u3lr.css 3.07 kB │ gzip: 1.02 kB +dist/assets/PoliceRaidGame-TxbI8IBd.css 3.16 kB │ gzip: 1.12 kB +dist/assets/PhoneApp-rpWN35Mf.css 3.25 kB │ gzip: 1.13 kB +dist/assets/PhotoMemberCreator-CHDEykYB.css 4.29 kB │ gzip: 1.30 kB +dist/assets/BlockLoopDesk-CDQqxJnT.css 4.88 kB │ gzip: 1.68 kB +dist/assets/UnifiedEncounter-7rne5g4o.css 4.91 kB │ gzip: 1.72 kB +dist/assets/Missions-CnuTdh9M.css 5.05 kB │ gzip: 1.52 kB +dist/assets/CocaineCrush-DLp4t8x8.css 5.31 kB │ gzip: 1.60 kB +dist/assets/BipNDipGame-OUTspsaX.css 5.81 kB │ gzip: 1.85 kB +dist/assets/ModernOpsEncounter-D1nefR-j.css 6.48 kB │ gzip: 2.10 kB +dist/assets/TrapApp-DxzDWJwG.css 6.71 kB │ gzip: 1.53 kB +dist/assets/Casino-DTlBntHn.css 7.26 kB │ gzip: 1.78 kB +dist/assets/AlchemyLab-Cp6Zrgs6.css 8.45 kB │ gzip: 2.20 kB +dist/assets/DealtModeSelector-DagPjzKc.css 8.50 kB │ gzip: 1.97 kB +dist/assets/TacticalDiorama-CeUNbIO4.css 8.70 kB │ gzip: 2.53 kB +dist/assets/MostWantedApp-C1fxl-9j.css 9.46 kB │ gzip: 2.36 kB +dist/assets/Shoebox-D3lVPOny.css 9.48 kB │ gzip: 2.53 kB +dist/assets/Market-DwwWzb5U.css 9.80 kB │ gzip: 2.52 kB +dist/assets/TopDownShooter-kwv7Hf2b.css 11.19 kB │ gzip: 2.67 kB +dist/assets/DriveByGame-Ds2v5ExV.css 12.16 kB │ gzip: 3.21 kB +dist/assets/SlideGame-c2BLx4Qu.css 13.34 kB │ gzip: 3.27 kB +dist/assets/index-U8R8UmkV.css 14.78 kB │ gzip: 3.95 kB +dist/assets/GraffitiGame-B3XyHHUs.css 15.11 kB │ gzip: 3.40 kB +dist/assets/TerritoryMap-Cn2HY3vV.css 38.33 kB │ gzip: 8.41 kB +dist/assets/App-CHZw-vxm.css 82.32 kB │ gzip: 15.83 kB +dist/assets/vendor-maplibre-GRinvwPn.css 83.06 kB │ gzip: 10.52 kB +dist/assets/abstractAudioBus-D8khitkK.js 0.12 kB │ gzip: 0.13 kB +dist/assets/kernelBlurVaryingDeclaration-DxiF8B6w.js 0.18 kB │ gzip: 0.16 kB +dist/assets/kernelBlurVaryingDeclaration-CCgKPmsI.js 0.19 kB │ gzip: 0.17 kB +dist/assets/sceneVertexDeclaration-D9UmPO9T.js 0.30 kB │ gzip: 0.21 kB +dist/assets/flowGraphUnaryOperationBlock-rgzKmRZY.js 0.30 kB │ gzip: 0.22 kB +dist/assets/flame-49ONaaVv.js 0.36 kB │ gzip: 0.28 kB +dist/assets/flowGraphBinaryOperationBlock-C9zKZEMD.js 0.38 kB │ gzip: 0.24 kB +dist/assets/logDepthDeclaration-MQXF7HZN.js 0.39 kB │ gzip: 0.26 kB +dist/assets/logDepthDeclaration-SFYJ16IJ.js 0.41 kB │ gzip: 0.27 kB +dist/assets/moneyRouter-DnLg7e0B.js 0.49 kB │ gzip: 0.29 kB +dist/assets/shopping-bag-B0FYqvPd.js 0.51 kB │ gzip: 0.34 kB +dist/assets/pass.fragment-JF7aRUtK.js 0.53 kB │ gzip: 0.36 kB +dist/assets/packingFunctions-ByiyKOXN.js 0.53 kB │ gzip: 0.30 kB +dist/assets/meshUboDeclaration-jmZ-eknJ.js 0.57 kB │ gzip: 0.32 kB +dist/assets/meshUboDeclaration-BmzuL1Cy.js 0.57 kB │ gzip: 0.32 kB +dist/assets/shadowMapFragmentSoftTransparentShadow-T32Ai0Y4.js 0.58 kB │ gzip: 0.38 kB +dist/assets/flowGraphSceneReadyEventBlock-ke_sphov.js 0.59 kB │ gzip: 0.36 kB +dist/assets/flowGraphPauseAnimationBlock-CA1jVzjt.js 0.59 kB │ gzip: 0.35 kB +dist/assets/shadowMapFragmentSoftTransparentShadow-Dd35IZry.js 0.62 kB │ gzip: 0.40 kB +dist/assets/rgbdEncode.fragment-Dfpj_LWo.js 0.62 kB │ gzip: 0.41 kB +dist/assets/rgbdDecode.fragment-C9cxZQHT.js 0.63 kB │ gzip: 0.41 kB +dist/assets/flowGraphConstantBlock-CIHMJ631.js 0.64 kB │ gzip: 0.38 kB +dist/assets/glowMapMerge.vertex-BbaUtn07.js 0.65 kB │ gzip: 0.40 kB +dist/assets/pass.fragment-BWkzTH9T.js 0.66 kB │ gzip: 0.41 kB +dist/assets/flowGraphBranchBlock-lrt98Zxx.js 0.68 kB │ gzip: 0.38 kB +dist/assets/vertexColorMixing-D1xf_Z_I.js 0.68 kB │ gzip: 0.35 kB +dist/assets/flowGraphGLTFDataProvider-OKaNQbik.js 0.68 kB │ gzip: 0.41 kB +dist/assets/flowGraphCodeExecutionBlock-DO6tLmfH.js 0.69 kB │ gzip: 0.38 kB +dist/assets/flowGraphGetVariableBlock-CiQ-N0Cf.js 0.69 kB │ gzip: 0.39 kB +dist/assets/flowGraphContextBlock-BO0ZfkcG.js 0.69 kB │ gzip: 0.38 kB +dist/assets/flowGraphCachedOperationBlock-DtNvzpud.js 0.71 kB │ gzip: 0.35 kB +dist/assets/flowGraphCancelDelayBlock-D2jeEqTG.js 0.74 kB │ gzip: 0.47 kB +dist/assets/depthBoxBlur.fragment-3VxM3VwF.js 0.75 kB │ gzip: 0.46 kB +dist/assets/bumpVertex-DcA1xJxQ.js 0.75 kB │ gzip: 0.35 kB +dist/assets/rgbdEncode.fragment-BCsMs_n7.js 0.75 kB │ gzip: 0.45 kB +dist/assets/flowGraphIndexOfBlock-1EBuAzuG.js 0.75 kB │ gzip: 0.42 kB +dist/assets/glowMapMerge.vertex-DNiuo9-V.js 0.76 kB │ gzip: 0.44 kB +dist/assets/rgbdDecode.fragment-D5Yfed5S.js 0.76 kB │ gzip: 0.45 kB +dist/assets/flowGraphSendCustomEventBlock-BAECYrip.js 0.76 kB │ gzip: 0.44 kB +dist/assets/flowGraphConditionalDataBlock-DrOj8GaA.js 0.77 kB │ gzip: 0.40 kB +dist/assets/flowGraphSceneTickEventBlock-DuBPNAQ3.js 0.77 kB │ gzip: 0.41 kB +dist/assets/flowGraphCounterBlock-BbOm-Mpq.js 0.78 kB │ gzip: 0.42 kB +dist/assets/envTextureLoader-BY39oAtb.js 0.78 kB │ gzip: 0.48 kB +dist/assets/flowGraphGetAssetBlock-CSWP9Zb9.js 0.78 kB │ gzip: 0.44 kB +dist/assets/flowGraphArrayIndexBlock-d8vqDCxs.js 0.79 kB │ gzip: 0.44 kB +dist/assets/flowGraphFlipFlopBlock-DzWJIiUg.js 0.85 kB │ gzip: 0.46 kB +dist/assets/flowGraphFunctionReferenceBlock-CzvY477p.js 0.85 kB │ gzip: 0.44 kB +dist/assets/flowGraphDebounceBlock-BIU6cl_o.js 0.91 kB │ gzip: 0.46 kB +dist/assets/flowGraphDoNBlock-BNsEaAb1.js 0.92 kB │ gzip: 0.48 kB +dist/assets/flowGraphSequenceBlock-C5xahFRV.js 0.92 kB │ gzip: 0.46 kB +dist/assets/depthBoxBlur.fragment-BmaZwifE.js 0.93 kB │ gzip: 0.53 kB +dist/assets/vertexColorMixing-BdDkt94F.js 0.94 kB │ gzip: 0.41 kB +dist/assets/color.fragment-5Pxvam43.js 0.96 kB │ gzip: 0.48 kB +dist/assets/mesh.vertexData.functions-ayNlGC5K.js 0.96 kB │ gzip: 0.49 kB +dist/assets/kernelBlur.vertex-ogyVtgV8.js 0.98 kB │ gzip: 0.52 kB +dist/assets/bumpVertex-DrpUigSa.js 0.98 kB │ gzip: 0.42 kB +dist/assets/flowGraphPointerOutEventBlock-DEfS8oID.js 1.00 kB │ gzip: 0.52 kB +dist/assets/instancesDeclaration-Dd-Rzcna.js 1.01 kB │ gzip: 0.35 kB +dist/assets/glowMapMerge.fragment-BZ8CxhL1.js 1.01 kB │ gzip: 0.53 kB +dist/assets/flowGraphPointerOverEventBlock-CiXDhU_g.js 1.01 kB │ gzip: 0.53 kB +dist/assets/flowGraphWhileLoopBlock-TSsLIssX.js 1.02 kB │ gzip: 0.52 kB +dist/assets/fogFragment-BBuMFAQJ.js 1.03 kB │ gzip: 0.47 kB +dist/assets/passCube.fragment-CbuKxe3V.js 1.04 kB │ gzip: 0.46 kB +dist/assets/flowGraphGetPropertyBlock-CSOqBn4d.js 1.06 kB │ gzip: 0.52 kB +dist/assets/flowGraphDataSwitchBlock-By9Org1Q.js 1.07 kB │ gzip: 0.55 kB +dist/assets/flowGraphBezierCurveEasingBlock-4AIUlCNf.js 1.08 kB │ gzip: 0.52 kB +dist/assets/flowGraphTransformCoordinatesSystemBlock-CN_a8Zhk.js 1.09 kB │ gzip: 0.50 kB +dist/assets/color.fragment-D1H9WE9s.js 1.10 kB │ gzip: 0.52 kB +dist/assets/kernelBlur.vertex-6RqqRIXA.js 1.13 kB │ gzip: 0.56 kB +dist/assets/defaultUboDeclaration-DZLgMwrN.js 1.15 kB │ gzip: 0.50 kB +dist/assets/webAudioMainBus-Di2NpIQw.js 1.16 kB │ gzip: 0.54 kB +dist/assets/fogFragment-NoLM8Tsw.js 1.16 kB │ gzip: 0.51 kB +dist/assets/clipPlaneFragment-DXUCcLEd.js 1.22 kB │ gzip: 0.34 kB +dist/assets/flowGraphConsoleLogBlock-BOapPCEA.js 1.27 kB │ gzip: 0.65 kB +dist/assets/glowMapMerge.fragment-4xYFZ1eP.js 1.27 kB │ gzip: 0.61 kB +dist/assets/flowGraphSwitchBlock-DUkRmPOv.js 1.28 kB │ gzip: 0.59 kB +dist/assets/flowGraphForLoopBlock-BDuG8wR6.js 1.29 kB │ gzip: 0.60 kB +dist/assets/glowBlurPostProcess.fragment-DqdNfQqR.js 1.33 kB │ gzip: 0.68 kB +dist/assets/passCube.fragment-2_l8esDN.js 1.34 kB │ gzip: 0.51 kB +dist/assets/flowGraphReceiveCustomEventBlock-ECsvfkqc.js 1.40 kB │ gzip: 0.66 kB +dist/assets/color.vertex-DDi35zJ9.js 1.43 kB │ gzip: 0.63 kB +dist/assets/flowGraphTypeToTypeBlocks-BRQ0Ig23.js 1.44 kB │ gzip: 0.54 kB +dist/assets/color.vertex-CHFgJYMa.js 1.44 kB │ gzip: 0.64 kB +dist/assets/depth.fragment-8TBBkT5H.js 1.47 kB │ gzip: 0.66 kB +dist/assets/ddsTextureLoader-DXt4qqU6.js 1.47 kB │ gzip: 0.73 kB +dist/assets/defaultUboDeclaration-GX47jyP1.js 1.50 kB │ gzip: 0.49 kB +dist/assets/flowGraphThrottleBlock-BP51vnJC.js 1.51 kB │ gzip: 0.59 kB +dist/assets/flowGraphSetPropertyBlock-KsPJYkau.js 1.54 kB │ gzip: 0.74 kB +dist/assets/flowGraphSetVariableBlock-BXWfRU_b.js 1.56 kB │ gzip: 0.74 kB +dist/assets/projection-DMbgv_yw.js 1.62 kB │ gzip: 0.74 kB +dist/assets/glowBlurPostProcess.fragment-CjKiOUTU.js 1.62 kB │ gzip: 0.76 kB +dist/assets/flowGraphWaitAllBlock-ixWrm3ze.js 1.68 kB │ gzip: 0.72 kB +dist/assets/flowGraphMeshPickEventBlock-Du_rKqv2.js 1.68 kB │ gzip: 0.70 kB +dist/assets/pbrUboDeclaration-DUELpgb8.js 1.69 kB │ gzip: 0.63 kB +dist/assets/flowGraphEasingBlock-DvSFqQCw.js 1.77 kB │ gzip: 0.82 kB +dist/assets/flowGraphMultiGateBlock-BIlZ_mVG.js 1.82 kB │ gzip: 0.80 kB +dist/assets/glowMapGeneration.fragment-7EN2cpKX.js 1.93 kB │ gzip: 0.77 kB +dist/assets/flowGraphStopAnimationBlock-CO8Bn0gu.js 2.03 kB │ gzip: 0.75 kB +dist/assets/pbrUboDeclaration-CMD9ckx2.js 2.27 kB │ gzip: 0.61 kB +dist/assets/glowMapGeneration.vertex-liLibVke.js 2.29 kB │ gzip: 0.77 kB +dist/assets/depth.vertex-CiavdSqW.js 2.30 kB │ gzip: 0.87 kB +dist/assets/kernelBlur.fragment-Dfd11LAJ.js 2.31 kB │ gzip: 0.80 kB +dist/assets/flowGraphInterpolationBlock-BZLyzucL.js 2.38 kB │ gzip: 0.98 kB +dist/assets/webAudioBus-391x-8iw.js 2.57 kB │ gzip: 0.89 kB +dist/assets/glowMapGeneration.fragment-CqtLQwiS.js 2.60 kB │ gzip: 0.89 kB +dist/assets/hdrTextureLoader-6RM0Fsug.js 2.63 kB │ gzip: 1.27 kB +dist/assets/policeRaidEngine-ioCoSz4K.js 2.69 kB │ gzip: 1.11 kB +dist/assets/ShooterGraphicsLab-CTAcpMJ-.js 2.77 kB │ gzip: 1.37 kB +dist/assets/glowMapGeneration.vertex-BNAtP-xD.js 2.83 kB │ gzip: 0.89 kB +dist/assets/kernelBlur.fragment-CK0Wq0zT.js 2.88 kB │ gzip: 0.89 kB +dist/assets/iesTextureLoader-B7_kHw_g.js 2.91 kB │ gzip: 1.27 kB +dist/assets/AttackPlanner-CnVzoeOF.js 3.01 kB │ gzip: 1.11 kB +dist/assets/shadowMap.fragment-CvPsKtOl.js 3.25 kB │ gzip: 1.16 kB +dist/assets/flowGraphJsonPointerParserBlock-CGcnWt__.js 3.29 kB │ gzip: 1.37 kB +dist/assets/openpbrUboDeclaration-Doj6Lx8c.js 3.41 kB │ gzip: 0.91 kB +dist/assets/tgaTextureLoader-BCpducSE.js 3.74 kB │ gzip: 1.49 kB +dist/assets/flowGraphMatrixMathBlocks-SXU1VAhD.js 3.84 kB │ gzip: 1.08 kB +dist/assets/PhoneApp-DD0-FqIs.js 3.86 kB │ gzip: 1.54 kB +dist/assets/flowGraphPlayAnimationBlock-CCWwTSsy.js 3.87 kB │ gzip: 1.30 kB +dist/assets/shadowMap.fragment-DfhYfD9f.js 3.88 kB │ gzip: 1.28 kB +dist/assets/Leaderboard-DJIo04gu.js 3.98 kB │ gzip: 1.62 kB +dist/assets/flowGraphSetDelayBlock-CGdggVNE.js 4.34 kB │ gzip: 1.56 kB +dist/assets/morphTargetsVertex-ejxZdynB.js 4.37 kB │ gzip: 0.95 kB +dist/assets/shadowMap.vertex-4OCRBmbQ.js 4.43 kB │ gzip: 1.48 kB +dist/assets/openpbrUboDeclaration-q3_YWKsB.js 4.61 kB │ gzip: 0.93 kB +dist/assets/shadowMap.vertex-j3ZJc2oL.js 4.62 kB │ gzip: 1.49 kB +dist/assets/flowGraphVectorMathBlocks-xKGzNVM5.js 4.91 kB │ gzip: 1.57 kB +dist/assets/PoliceRaidGame-BWkmp_oF.js 5.01 kB │ gzip: 2.11 kB +dist/assets/AddressSearchBar-DTJBRCa4.js 5.64 kB │ gzip: 2.50 kB +dist/assets/helperFunctions-Dc7C-WKy.js 5.88 kB │ gzip: 1.97 kB +dist/assets/assetResolver-DnVK9bs6.js 6.03 kB │ gzip: 1.82 kB +dist/assets/helperFunctions-BhgRnBor.js 6.23 kB │ gzip: 2.09 kB +dist/assets/logDepthVertex-CaTRMfXa.js 6.82 kB │ gzip: 1.62 kB +dist/assets/dds-CrpZDnk6.js 7.21 kB │ gzip: 2.57 kB +dist/assets/default.vertex-p8K3ouDf.js 7.41 kB │ gzip: 2.00 kB +dist/assets/TrapApp-Dktbl9PF.js 7.64 kB │ gzip: 2.58 kB +dist/assets/marketMembersCatalog-DxBYOhdT.js 7.86 kB │ gzip: 3.80 kB +dist/assets/logDepthVertex-DJRp_Jtb.js 8.07 kB │ gzip: 1.69 kB +dist/assets/default.vertex-BzWW7Sj0.js 8.11 kB │ gzip: 2.16 kB +dist/assets/flowGraphMathCombineExtractBlocks-P4_chmd4.js 8.29 kB │ gzip: 1.22 kB +dist/assets/basisTextureLoader-C1j5ErIf.js 8.44 kB │ gzip: 3.36 kB +dist/assets/CocaineCrush-BiWcBwSt.js 8.93 kB │ gzip: 3.25 kB +dist/assets/openpbrMaterialLoadingAdapter-DNumdQBy.js 9.44 kB │ gzip: 1.71 kB +dist/assets/clipPlaneVertex-2Q7su54U.js 9.47 kB │ gzip: 1.63 kB +dist/assets/PhotoMemberCreator-DM0FCat2.js 9.86 kB │ gzip: 3.78 kB +dist/assets/Casino-7JaDtkR1.js 10.14 kB │ gzip: 2.96 kB +dist/assets/Missions-c4TCD_Z4.js 10.59 kB │ gzip: 4.11 kB +dist/assets/pbrMaterialLoadingAdapter-CnS00Tc-.js 11.79 kB │ gzip: 2.30 kB +dist/assets/BlockLoopDesk-BLEoOuqj.js 11.85 kB │ gzip: 3.81 kB +dist/assets/prepareEncounter-CPkJGOmE.js 12.12 kB │ gzip: 4.71 kB +dist/assets/harmonicsFunctions-CXydYRAj.js 12.64 kB │ gzip: 4.30 kB +dist/assets/pbr.vertex-Dj4q1opF.js 13.06 kB │ gzip: 2.80 kB +dist/assets/harmonicsFunctions-CYnhodre.js 13.68 kB │ gzip: 4.48 kB +dist/assets/GangManagement-C9vNgc36.js 13.93 kB │ gzip: 4.71 kB +dist/assets/MostWantedApp-5lYsXg-a.js 14.68 kB │ gzip: 4.96 kB +dist/assets/ktxTextureLoader-BMXYbTc8.js 14.79 kB │ gzip: 4.34 kB +dist/assets/Market-D5pUNwRo.js 14.80 kB │ gzip: 4.80 kB +dist/assets/openpbr.vertex-BFgTvCuP.js 15.15 kB │ gzip: 2.98 kB +dist/assets/BipNDipGame-DQtUlU6A.js 15.48 kB │ gzip: 5.59 kB +dist/assets/UnifiedEncounter--pkJl_HR.js 15.71 kB │ gzip: 5.63 kB +dist/assets/exrTextureLoader-C77m-uiK.js 15.73 kB │ gzip: 5.90 kB +dist/assets/pbr.vertex-Co8Onv7x.js 16.40 kB │ gzip: 3.34 kB +dist/assets/TacticalDiorama-ZaT3F-Sl.js 16.84 kB │ gzip: 6.27 kB +dist/assets/Shoebox-Bf5y9HsV.js 16.88 kB │ gzip: 4.90 kB +dist/assets/SlideGame-D72CWL8E.js 18.59 kB │ gzip: 6.65 kB +dist/assets/openpbr.vertex-CiYK_9r0.js 18.75 kB │ gzip: 3.58 kB +dist/assets/flowGraphMathBlocks-CL1Aruj2.js 19.17 kB │ gzip: 3.94 kB +dist/assets/AlchemyLab--WUW8uhT.js 19.43 kB │ gzip: 5.76 kB +dist/assets/WeeklyUpdateRoute-BLzHd_KQ.js 19.53 kB │ gzip: 6.90 kB +dist/assets/DealtModeSelector-Bk9mdIIH.js 20.09 kB │ gzip: 6.35 kB +dist/assets/TopDownShooter-D7FAPTFU.js 22.78 kB │ gzip: 7.13 kB +dist/assets/default.fragment-BGwztTLw.js 23.34 kB │ gzip: 5.49 kB +dist/assets/default.fragment-eCvkwkGX.js 24.95 kB │ gzip: 5.48 kB +dist/assets/lightFragment-DHc4sW5n.js 27.15 kB │ gzip: 5.43 kB +dist/assets/lightFragment-DTxSyUqX.js 30.36 kB │ gzip: 5.52 kB +dist/assets/GraffitiGame-DT54QeJi.js 34.68 kB │ gzip: 10.73 kB +dist/assets/animationGroup-D186DRKe.js 34.69 kB │ gzip: 8.88 kB +dist/assets/pbrDebug-zJeRfAbI.js 40.54 kB │ gzip: 8.95 kB +dist/assets/worldActorResolver-DjZCQsrb.js 41.03 kB │ gzip: 4.61 kB +dist/assets/CanvasStreetRendererV3-BAX78b8F.js 41.27 kB │ gzip: 13.76 kB +dist/assets/pbrDebug-DrxDkvIw.js 48.22 kB │ gzip: 10.49 kB +dist/assets/oitFragment-0sOtkadl.js 49.79 kB │ gzip: 9.42 kB +dist/assets/oitFragment-WXQp-wP5.js 51.44 kB │ gzip: 9.60 kB +dist/assets/openpbrMaterial-CPZOMKY_.js 52.55 kB │ gzip: 12.29 kB +dist/assets/DriveByGame-pVXf2gKm.js 64.85 kB │ gzip: 21.74 kB +dist/assets/TerritoryMap-C-rfxsBG.js 70.89 kB │ gzip: 23.30 kB +dist/assets/openpbr.fragment-Cr5xItF5.js 80.35 kB │ gzip: 15.64 kB +dist/assets/openpbr.fragment-CCyLu5RW.js 81.65 kB │ gzip: 15.45 kB +dist/assets/pbr.fragment-N-h_e0Hg.js 89.63 kB │ gzip: 15.36 kB +dist/assets/pbr.fragment-CN_wW0hz.js 93.16 kB │ gzip: 16.79 kB +dist/assets/vendor-framer-suRT48ci.js 110.11 kB │ gzip: 37.36 kB +dist/assets/index-D0X26xBf.js 138.75 kB │ gzip: 45.19 kB +dist/assets/vendor-supabase-BK2FJJ-F.js 219.36 kB │ gzip: 57.22 kB +dist/assets/App-MHgCaC54.js 359.02 kB │ gzip: 113.89 kB +dist/assets/vendor-maplibre-WbblP0ls.js 952.81 kB │ gzip: 250.65 kB +dist/assets/vendor-phaser-oG8Y5LC_.js 1,478.41 kB │ gzip: 339.66 kB +dist/assets/ModernOpsEncounter-CZVp1E2v.js 2,076.30 kB │ gzip: 509.88 kB + +(!) Some chunks are larger than 500 kB after minification. Consider: +- Using dynamic import() to code-split the application +- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks +- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit. +✓ built in 24.83s diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-combat-state.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-combat-state.png new file mode 100644 index 0000000..bab9828 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-combat-state.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-consequence.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-consequence.png new file mode 100644 index 0000000..32a32fa Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-consequence.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-encounter-entry.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-encounter-entry.png new file mode 100644 index 0000000..2aceb6e Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-encounter-entry.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-reload-hud.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-reload-hud.png new file mode 100644 index 0000000..1df0d95 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-reload-hud.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-reload-return.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-reload-return.png new file mode 100644 index 0000000..40eb6f4 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-reload-return.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-report.json b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-report.json new file mode 100644 index 0000000..5d65dba --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-report.json @@ -0,0 +1,5225 @@ +{ + "label": "pr205", + "origin": "http://127.0.0.1:4173", + "viewport": { + "width": 1440, + "height": 900 + }, + "imageFailure": false, + "checks": [ + { + "name": "Named fictional opposition visible", + "pass": true + }, + { + "name": "All opposition uses registered character Images, not circles", + "pass": true + }, + { + "name": "Actual Dre cell matches rendered destination (0,2)", + "pass": true + }, + { + "name": "Actual Rome cell matches rendered destination (4,4)", + "pass": true + }, + { + "name": "Reload command emits real engine event", + "pass": true + }, + { + "name": "DOM condition shows reloading", + "pass": true + }, + { + "name": "Reload finishes through the real engine", + "pass": true + }, + { + "name": "Real fire event recorded", + "pass": true + }, + { + "name": "Downed opponent uses registered downed state", + "pass": true + }, + { + "name": "Demo result receipt survives reload exactly once", + "pass": true + }, + { + "name": "Reload preserves booked money, heat, morale, and crew health", + "pass": true + }, + { + "name": "No uncaught page errors", + "pass": true + } + ], + "screenshots": [ + "pr205-1440x900-strategy-diorama.png", + "pr205-1440x900-encounter-entry.png", + "pr205-1440x900-reload-hud.png", + "pr205-1440x900-combat-state.png", + "pr205-1440x900-result.png", + "pr205-1440x900-consequence.png", + "pr205-1440x900-returned.png", + "pr205-1440x900-reload-return.png" + ], + "pageErrors": [], + "consoleErrors": [ + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: the server responded with a status of 404 (File not found)" + ], + "failedRequests": [], + "snapshots": [ + { + "name": "entry", + "state": { + "tick": 0, + "phase": "active", + "selectedCrewId": "demo-dealer-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 1, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": -1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 3 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 11/11 ammo" + } + }, + { + "name": "dre-move", + "state": { + "tick": 10, + "phase": "active", + "selectedCrewId": "demo-dealer-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 3 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:10:0:moved", + "tick": 10, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 11/11 ammo" + } + }, + { + "name": "rome-move", + "state": { + "tick": 16, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": 2, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:10:0:moved", + "tick": 10, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:1:moved", + "tick": 16, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 11/11 ammo" + } + }, + { + "name": "after-fire", + "state": { + "tick": 20, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 10, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 23, + "level": 3, + "lastSequence": 3, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:10:0:moved", + "tick": 10, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:1:moved", + "tick": 16, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 10/11 ammo" + } + }, + { + "name": "reload-start", + "state": { + "tick": 24, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 10, + "maxAmmo": 11, + "reloadUntilTick": 44, + "nextFireTick": 23, + "level": 3, + "lastSequence": 4, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:10:0:moved", + "tick": 10, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:1:moved", + "tick": 16, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:24:8:reload-start", + "tick": 24, + "type": "reload-start", + "actorId": "demo-shooter-1", + "message": "Big Rome starts reloading." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 10/11 ammo · reloading" + } + }, + { + "name": "reload-complete", + "state": { + "tick": 48, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 95, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 23, + "level": 3, + "lastSequence": 4, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 45, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 45, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:10:0:moved", + "tick": 10, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:1:moved", + "tick": 16, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:24:8:reload-start", + "tick": 24, + "type": "reload-start", + "actorId": "demo-shooter-1", + "message": "Big Rome starts reloading." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:9:weapon-fired", + "tick": 40, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:10:impact-cover", + "tick": 40, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:11:weapon-fired", + "tick": 40, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:12:impact-actor", + "tick": 40, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:44:13:reload-complete", + "tick": 44, + "type": "reload-complete", + "actorId": "demo-shooter-1", + "message": "Big Rome is ready." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 95 HP · 11/11 ammo" + } + }, + { + "name": "combat-state", + "state": { + "tick": 214, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 65, + "maxHealth": 100, + "armor": 1, + "ammo": 6, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 209, + "level": 3, + "lastSequence": 9, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 205, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 0, + "maxHealth": 55, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 205, + "level": 1, + "lastSequence": -1, + "isDown": true + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:100:27:impact-cover", + "tick": 100, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:106:28:weapon-fired", + "tick": 106, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:106:29:impact-cover", + "tick": 106, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:weapon-fired", + "tick": 120, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:impact-cover", + "tick": 120, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:weapon-fired", + "tick": 120, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:impact-cover", + "tick": 120, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:136:30:weapon-fired", + "tick": 136, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:136:30:impact-cover", + "tick": 136, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:weapon-fired", + "tick": 140, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:impact-actor", + "tick": 140, + "type": "impact-actor", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:weapon-fired", + "tick": 140, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:impact-actor", + "tick": 140, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:160:30:reload-start", + "tick": 160, + "type": "reload-start", + "actorId": "opposition-1", + "message": "Nightfall lookout reloads." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:160:30:reload-start", + "tick": 160, + "type": "reload-start", + "actorId": "opposition-2", + "message": "Nightfall 2 reloads." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:168:30:weapon-fired", + "tick": 168, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:168:30:impact-cover", + "tick": 168, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:reload-complete", + "tick": 180, + "type": "reload-complete", + "actorId": "opposition-1", + "message": "Nightfall lookout is ready." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:reload-complete", + "tick": 180, + "type": "reload-complete", + "actorId": "opposition-2", + "message": "Nightfall 2 is ready." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:weapon-fired", + "tick": 180, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:impact-cover", + "tick": 180, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:weapon-fired", + "tick": 180, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:impact-actor", + "tick": 180, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:weapon-fired", + "tick": 200, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:impact-cover", + "tick": 200, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:weapon-fired", + "tick": 200, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:impact-actor", + "tick": 200, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:204:30:weapon-fired", + "tick": 204, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:204:30:impact-actor", + "tick": 204, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:204:30:actor-downed", + "tick": 204, + "type": "actor-downed", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Nightfall 2 is down." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_downed_v001.webp", + "label": "Nightfall 2 · DOWN" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n1 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 65 HP · 6/11 ammo" + } + } + ], + "httpErrors": [ + { + "url": "http://127.0.0.1:4173/favicon.svg", + "status": 404 + }, + { + "url": "http://127.0.0.1:4173/assets/game_logo.png", + "status": 404 + }, + { + "url": "http://127.0.0.1:4173/assets/generated/ui/icons/icon_news_v001.png", + "status": 404 + } + ], + "ledgerBeforeReload": "{\"version\":1,\"phase\":\"consequence\",\"money\":12844,\"playerHeat\":9,\"reputation\":13,\"blockHeat\":2,\"blockMorale\":66,\"pendingIncome\":52,\"productQuantity\":7,\"assignments\":{\"demo-dealer-1\":\"demo-product-river-cut\"},\"placements\":[{\"memberId\":\"demo-dealer-1\",\"memberName\":\"Lil Dre\",\"role\":\"dealer\",\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"incomePerTick\":67,\"exposureRisk\":50,\"level\":2,\"health\":100},{\"memberId\":\"demo-shooter-1\",\"memberName\":\"Big Rome\",\"role\":\"shooter\",\"x\":4,\"y\":3,\"zoneType\":\"storefront\",\"incomePerTick\":0,\"exposureRisk\":25,\"level\":3,\"health\":100}],\"appliedEncounterKeys\":[\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"economyKeys\":[\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"dealKey\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounterKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"lastDeal\":{\"key\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"dealerId\":\"demo-dealer-1\",\"productId\":\"demo-product-river-cut\",\"productName\":\"River Cut\",\"productTier\":\"street\",\"cell\":{\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"exposureRisk\":50},\"moneyDelta\":844,\"productDelta\":-5,\"heatDelta\":4,\"exposureDelta\":4,\"reputationDelta\":1,\"demandBonusPct\":11,\"leftoverQuantity\":7,\"explanation\":\"Street exposure +11% → higher demand, but heat +4 and exposure +4. 5 River Cut moved for $844.\"},\"lastEncounter\":{\"idempotencyKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"outcome\":\"retreated\",\"crewDown\":[],\"oppositionDown\":[\"opposition-2\"],\"objectiveProgress\":0,\"heatDelta\":0,\"moraleDelta\":-4,\"pendingIncomeDelta\":-15,\"summary\":\"The crew disengaged and kept the situation from escalating.\"},\"selectedDealerId\":\"demo-dealer-1\",\"selectedShooterId\":\"demo-shooter-1\",\"briefing\":[\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\",\"The crew disengaged and kept the situation from escalating.\",\"Heat +0, morale -4, pending cash -$15.\"],\"threatRoute\":\"slide\",\"threatReason\":\"Nightfall Crew is sliding on 1208 W Las Olas Blvd. The deal put your dealer at 50 street exposure — hold the strip or get the crew out.\",\"rivalIncident\":{\"receiptKey\":\"demo-city-brief-attack\",\"eventId\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"description\":\"Nightfall is testing the edge of your Las Olas block. Review your crew positions before the next move.\",\"occurredAt\":1792259417219},\"rivalResolution\":{\"receiptKey\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"outcome\":\"retreated\",\"line\":\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\"},\"pendingHealthIds\":[],\"recovery\":null,\"shiftIndex\":1,\"stock\":[{\"id\":\"demo-product-river-cut\",\"name\":\"River Cut\",\"tier\":\"street\",\"quality\":62,\"quantity\":7,\"craftedAt\":1700000000000,\"effects\":[\"fast-ticket\"]}],\"crew\":[{\"id\":\"demo-dealer-1\",\"health\":100,\"morale\":85,\"assignment\":\"sidewalk\"},{\"id\":\"demo-shooter-1\",\"health\":100,\"morale\":80,\"assignment\":\"storefront 4,3\"}]}", + "ledgerAfterReload": "{\"version\":1,\"phase\":\"returned\",\"money\":12844,\"playerHeat\":9,\"reputation\":13,\"blockHeat\":2,\"blockMorale\":66,\"pendingIncome\":52,\"productQuantity\":7,\"assignments\":{\"demo-dealer-1\":\"demo-product-river-cut\"},\"placements\":[{\"memberId\":\"demo-dealer-1\",\"memberName\":\"Lil Dre\",\"role\":\"dealer\",\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"incomePerTick\":67,\"exposureRisk\":50,\"level\":2,\"health\":100},{\"memberId\":\"demo-shooter-1\",\"memberName\":\"Big Rome\",\"role\":\"shooter\",\"x\":4,\"y\":3,\"zoneType\":\"storefront\",\"incomePerTick\":0,\"exposureRisk\":25,\"level\":3,\"health\":100}],\"appliedEncounterKeys\":[\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"economyKeys\":[\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"dealKey\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounterKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"lastDeal\":{\"key\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"dealerId\":\"demo-dealer-1\",\"productId\":\"demo-product-river-cut\",\"productName\":\"River Cut\",\"productTier\":\"street\",\"cell\":{\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"exposureRisk\":50},\"moneyDelta\":844,\"productDelta\":-5,\"heatDelta\":4,\"exposureDelta\":4,\"reputationDelta\":1,\"demandBonusPct\":11,\"leftoverQuantity\":7,\"explanation\":\"Street exposure +11% → higher demand, but heat +4 and exposure +4. 5 River Cut moved for $844.\"},\"lastEncounter\":{\"idempotencyKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"outcome\":\"retreated\",\"crewDown\":[],\"oppositionDown\":[\"opposition-2\"],\"objectiveProgress\":0,\"heatDelta\":0,\"moraleDelta\":-4,\"pendingIncomeDelta\":-15,\"summary\":\"The crew disengaged and kept the situation from escalating.\"},\"selectedDealerId\":\"demo-dealer-1\",\"selectedShooterId\":\"demo-shooter-1\",\"briefing\":[\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\",\"Street cash $12844. Heat 9. Product 7.\",\"Encounter encounter-demo-block-las-olas-17gayr2:retreated stays booked.\"],\"threatRoute\":\"slide\",\"threatReason\":\"Nightfall Crew is sliding on 1208 W Las Olas Blvd. The deal put your dealer at 50 street exposure — hold the strip or get the crew out.\",\"rivalIncident\":{\"receiptKey\":\"demo-city-brief-attack\",\"eventId\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"description\":\"Nightfall is testing the edge of your Las Olas block. Review your crew positions before the next move.\",\"occurredAt\":1792259417219},\"rivalResolution\":{\"receiptKey\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"outcome\":\"retreated\",\"line\":\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\"},\"pendingHealthIds\":[],\"recovery\":null,\"shiftIndex\":1,\"stock\":[{\"id\":\"demo-product-river-cut\",\"name\":\"River Cut\",\"tier\":\"street\",\"quality\":62,\"quantity\":7,\"craftedAt\":1700000000000,\"effects\":[\"fast-ticket\"]}],\"crew\":[{\"id\":\"demo-dealer-1\",\"health\":100,\"morale\":85,\"assignment\":\"sidewalk\"},{\"id\":\"demo-shooter-1\",\"health\":100,\"morale\":80,\"assignment\":\"storefront 4,3\"}]}" +} diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-result.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-result.png new file mode 100644 index 0000000..44b746a Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-result.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-returned.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-returned.png new file mode 100644 index 0000000..98b3256 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-returned.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-strategy-diorama.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-strategy-diorama.png new file mode 100644 index 0000000..8c847a8 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-1440x900-strategy-diorama.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-combat-state.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-combat-state.png new file mode 100644 index 0000000..30c46c8 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-combat-state.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-consequence.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-consequence.png new file mode 100644 index 0000000..783a527 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-consequence.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-encounter-entry.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-encounter-entry.png new file mode 100644 index 0000000..5f8ced6 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-encounter-entry.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-reload-hud.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-reload-hud.png new file mode 100644 index 0000000..f64f7f8 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-reload-hud.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-reload-return.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-reload-return.png new file mode 100644 index 0000000..6a8529f Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-reload-return.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-report.json b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-report.json new file mode 100644 index 0000000..a261228 --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-report.json @@ -0,0 +1,5230 @@ +{ + "label": "pr205", + "origin": "http://127.0.0.1:4173", + "viewport": { + "width": 390, + "height": 844 + }, + "imageFailure": false, + "checks": [ + { + "name": "Named fictional opposition visible", + "pass": true + }, + { + "name": "All opposition uses registered character Images, not circles", + "pass": true + }, + { + "name": "Actual Dre cell matches rendered destination (0,2)", + "pass": true + }, + { + "name": "Actual Rome cell matches rendered destination (4,4)", + "pass": true + }, + { + "name": "Reload command emits real engine event", + "pass": true + }, + { + "name": "DOM condition shows reloading", + "pass": true + }, + { + "name": "Reload finishes through the real engine", + "pass": true + }, + { + "name": "Real fire event recorded", + "pass": true + }, + { + "name": "Downed opponent uses registered downed state", + "pass": true + }, + { + "name": "Demo result receipt survives reload exactly once", + "pass": true + }, + { + "name": "Reload preserves booked money, heat, morale, and crew health", + "pass": true + }, + { + "name": "No uncaught page errors", + "pass": true + } + ], + "screenshots": [ + "pr205-390x844-strategy-diorama.png", + "pr205-390x844-encounter-entry.png", + "pr205-390x844-reload-hud.png", + "pr205-390x844-combat-state.png", + "pr205-390x844-result.png", + "pr205-390x844-consequence.png", + "pr205-390x844-returned.png", + "pr205-390x844-reload-return.png" + ], + "pageErrors": [], + "consoleErrors": [ + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: the server responded with a status of 404 (File not found)" + ], + "failedRequests": [], + "snapshots": [ + { + "name": "entry", + "state": { + "tick": 0, + "phase": "active", + "selectedCrewId": "demo-dealer-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 1, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": -1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 3 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 11/11 ammo" + } + }, + { + "name": "dre-move", + "state": { + "tick": 10, + "phase": "active", + "selectedCrewId": "demo-dealer-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 3 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 11/11 ammo" + } + }, + { + "name": "rome-move", + "state": { + "tick": 16, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": 2, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:1:moved", + "tick": 16, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 11/11 ammo" + } + }, + { + "name": "after-fire", + "state": { + "tick": 20, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 10, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 23, + "level": 3, + "lastSequence": 3, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:1:moved", + "tick": 16, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 10/11 ammo" + } + }, + { + "name": "reload-start", + "state": { + "tick": 24, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 10, + "maxAmmo": 11, + "reloadUntilTick": 42, + "nextFireTick": 23, + "level": 3, + "lastSequence": 4, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:1:moved", + "tick": 16, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:22:8:reload-start", + "tick": 22, + "type": "reload-start", + "actorId": "demo-shooter-1", + "message": "Big Rome starts reloading." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 10/11 ammo · reloading" + } + }, + { + "name": "reload-complete", + "state": { + "tick": 44, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 95, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 23, + "level": 3, + "lastSequence": 4, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 45, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 45, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:1:moved", + "tick": 16, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:22:8:reload-start", + "tick": 22, + "type": "reload-start", + "actorId": "demo-shooter-1", + "message": "Big Rome starts reloading." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:9:weapon-fired", + "tick": 40, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:10:impact-cover", + "tick": 40, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:11:weapon-fired", + "tick": 40, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:12:impact-actor", + "tick": 40, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:42:13:reload-complete", + "tick": 42, + "type": "reload-complete", + "actorId": "demo-shooter-1", + "message": "Big Rome is ready." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 95 HP · 11/11 ammo" + } + }, + { + "name": "combat-state", + "state": { + "tick": 214, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 65, + "maxHealth": 100, + "armor": 1, + "ammo": 6, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 205, + "level": 3, + "lastSequence": 9, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 205, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 0, + "maxHealth": 55, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 205, + "level": 1, + "lastSequence": -1, + "isDown": true + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:100:27:impact-cover", + "tick": 100, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:100:28:weapon-fired", + "tick": 100, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:100:29:impact-cover", + "tick": 100, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:weapon-fired", + "tick": 120, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:impact-cover", + "tick": 120, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:weapon-fired", + "tick": 120, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:impact-cover", + "tick": 120, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:132:30:weapon-fired", + "tick": 132, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:132:30:impact-cover", + "tick": 132, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:weapon-fired", + "tick": 140, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:impact-actor", + "tick": 140, + "type": "impact-actor", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:weapon-fired", + "tick": 140, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:impact-actor", + "tick": 140, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:160:30:reload-start", + "tick": 160, + "type": "reload-start", + "actorId": "opposition-1", + "message": "Nightfall lookout reloads." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:160:30:reload-start", + "tick": 160, + "type": "reload-start", + "actorId": "opposition-2", + "message": "Nightfall 2 reloads." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:166:30:weapon-fired", + "tick": 166, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:166:30:impact-cover", + "tick": 166, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:reload-complete", + "tick": 180, + "type": "reload-complete", + "actorId": "opposition-1", + "message": "Nightfall lookout is ready." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:reload-complete", + "tick": 180, + "type": "reload-complete", + "actorId": "opposition-2", + "message": "Nightfall 2 is ready." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:weapon-fired", + "tick": 180, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:impact-cover", + "tick": 180, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:weapon-fired", + "tick": 180, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:impact-actor", + "tick": 180, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:weapon-fired", + "tick": 200, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:impact-cover", + "tick": 200, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:weapon-fired", + "tick": 200, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:impact-actor", + "tick": 200, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:weapon-fired", + "tick": 200, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:impact-actor", + "tick": 200, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:actor-downed", + "tick": 200, + "type": "actor-downed", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Nightfall 2 is down." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Image", + "texture": "encounter-actor-/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_downed_v001.webp", + "label": "Nightfall 2 · DOWN" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n1 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 65 HP · 6/11 ammo" + } + } + ], + "httpErrors": [ + { + "url": "http://127.0.0.1:4173/favicon.svg", + "status": 404 + }, + { + "url": "http://127.0.0.1:4173/favicon.svg", + "status": 404 + }, + { + "url": "http://127.0.0.1:4173/assets/game_logo.png", + "status": 404 + }, + { + "url": "http://127.0.0.1:4173/assets/generated/ui/icons/icon_news_v001.png", + "status": 404 + } + ], + "ledgerBeforeReload": "{\"version\":1,\"phase\":\"consequence\",\"money\":12844,\"playerHeat\":9,\"reputation\":13,\"blockHeat\":2,\"blockMorale\":66,\"pendingIncome\":52,\"productQuantity\":7,\"assignments\":{\"demo-dealer-1\":\"demo-product-river-cut\"},\"placements\":[{\"memberId\":\"demo-dealer-1\",\"memberName\":\"Lil Dre\",\"role\":\"dealer\",\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"incomePerTick\":67,\"exposureRisk\":50,\"level\":2,\"health\":100},{\"memberId\":\"demo-shooter-1\",\"memberName\":\"Big Rome\",\"role\":\"shooter\",\"x\":4,\"y\":3,\"zoneType\":\"storefront\",\"incomePerTick\":0,\"exposureRisk\":25,\"level\":3,\"health\":100}],\"appliedEncounterKeys\":[\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"economyKeys\":[\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"dealKey\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounterKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"lastDeal\":{\"key\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"dealerId\":\"demo-dealer-1\",\"productId\":\"demo-product-river-cut\",\"productName\":\"River Cut\",\"productTier\":\"street\",\"cell\":{\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"exposureRisk\":50},\"moneyDelta\":844,\"productDelta\":-5,\"heatDelta\":4,\"exposureDelta\":4,\"reputationDelta\":1,\"demandBonusPct\":11,\"leftoverQuantity\":7,\"explanation\":\"Street exposure +11% → higher demand, but heat +4 and exposure +4. 5 River Cut moved for $844.\"},\"lastEncounter\":{\"idempotencyKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"outcome\":\"retreated\",\"crewDown\":[],\"oppositionDown\":[\"opposition-2\"],\"objectiveProgress\":0,\"heatDelta\":0,\"moraleDelta\":-4,\"pendingIncomeDelta\":-15,\"summary\":\"The crew disengaged and kept the situation from escalating.\"},\"selectedDealerId\":\"demo-dealer-1\",\"selectedShooterId\":\"demo-shooter-1\",\"briefing\":[\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\",\"The crew disengaged and kept the situation from escalating.\",\"Heat +0, morale -4, pending cash -$15.\"],\"threatRoute\":\"slide\",\"threatReason\":\"Nightfall Crew is sliding on 1208 W Las Olas Blvd. The deal put your dealer at 50 street exposure — hold the strip or get the crew out.\",\"rivalIncident\":{\"receiptKey\":\"demo-city-brief-attack\",\"eventId\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"description\":\"Nightfall is testing the edge of your Las Olas block. Review your crew positions before the next move.\",\"occurredAt\":1792259383226},\"rivalResolution\":{\"receiptKey\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"outcome\":\"retreated\",\"line\":\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\"},\"pendingHealthIds\":[],\"recovery\":null,\"shiftIndex\":1,\"stock\":[{\"id\":\"demo-product-river-cut\",\"name\":\"River Cut\",\"tier\":\"street\",\"quality\":62,\"quantity\":7,\"craftedAt\":1700000000000,\"effects\":[\"fast-ticket\"]}],\"crew\":[{\"id\":\"demo-dealer-1\",\"health\":100,\"morale\":85,\"assignment\":\"sidewalk\"},{\"id\":\"demo-shooter-1\",\"health\":100,\"morale\":80,\"assignment\":\"storefront 4,3\"}]}", + "ledgerAfterReload": "{\"version\":1,\"phase\":\"returned\",\"money\":12844,\"playerHeat\":9,\"reputation\":13,\"blockHeat\":2,\"blockMorale\":66,\"pendingIncome\":52,\"productQuantity\":7,\"assignments\":{\"demo-dealer-1\":\"demo-product-river-cut\"},\"placements\":[{\"memberId\":\"demo-dealer-1\",\"memberName\":\"Lil Dre\",\"role\":\"dealer\",\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"incomePerTick\":67,\"exposureRisk\":50,\"level\":2,\"health\":100},{\"memberId\":\"demo-shooter-1\",\"memberName\":\"Big Rome\",\"role\":\"shooter\",\"x\":4,\"y\":3,\"zoneType\":\"storefront\",\"incomePerTick\":0,\"exposureRisk\":25,\"level\":3,\"health\":100}],\"appliedEncounterKeys\":[\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"economyKeys\":[\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"dealKey\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounterKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"lastDeal\":{\"key\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"dealerId\":\"demo-dealer-1\",\"productId\":\"demo-product-river-cut\",\"productName\":\"River Cut\",\"productTier\":\"street\",\"cell\":{\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"exposureRisk\":50},\"moneyDelta\":844,\"productDelta\":-5,\"heatDelta\":4,\"exposureDelta\":4,\"reputationDelta\":1,\"demandBonusPct\":11,\"leftoverQuantity\":7,\"explanation\":\"Street exposure +11% → higher demand, but heat +4 and exposure +4. 5 River Cut moved for $844.\"},\"lastEncounter\":{\"idempotencyKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"outcome\":\"retreated\",\"crewDown\":[],\"oppositionDown\":[\"opposition-2\"],\"objectiveProgress\":0,\"heatDelta\":0,\"moraleDelta\":-4,\"pendingIncomeDelta\":-15,\"summary\":\"The crew disengaged and kept the situation from escalating.\"},\"selectedDealerId\":\"demo-dealer-1\",\"selectedShooterId\":\"demo-shooter-1\",\"briefing\":[\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\",\"Street cash $12844. Heat 9. Product 7.\",\"Encounter encounter-demo-block-las-olas-17gayr2:retreated stays booked.\"],\"threatRoute\":\"slide\",\"threatReason\":\"Nightfall Crew is sliding on 1208 W Las Olas Blvd. The deal put your dealer at 50 street exposure — hold the strip or get the crew out.\",\"rivalIncident\":{\"receiptKey\":\"demo-city-brief-attack\",\"eventId\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"description\":\"Nightfall is testing the edge of your Las Olas block. Review your crew positions before the next move.\",\"occurredAt\":1792259383226},\"rivalResolution\":{\"receiptKey\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"outcome\":\"retreated\",\"line\":\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\"},\"pendingHealthIds\":[],\"recovery\":null,\"shiftIndex\":1,\"stock\":[{\"id\":\"demo-product-river-cut\",\"name\":\"River Cut\",\"tier\":\"street\",\"quality\":62,\"quantity\":7,\"craftedAt\":1700000000000,\"effects\":[\"fast-ticket\"]}],\"crew\":[{\"id\":\"demo-dealer-1\",\"health\":100,\"morale\":85,\"assignment\":\"sidewalk\"},{\"id\":\"demo-shooter-1\",\"health\":100,\"morale\":80,\"assignment\":\"storefront 4,3\"}]}" +} diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-result.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-result.png new file mode 100644 index 0000000..a95b08a Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-result.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-returned.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-returned.png new file mode 100644 index 0000000..8f4013e Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-returned.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-strategy-diorama.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-strategy-diorama.png new file mode 100644 index 0000000..566a63e Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-390x844-strategy-diorama.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-build.log b/docs/evidence/2026-10-17-member-graphics-integration/pr205-build.log new file mode 100644 index 0000000..1c18a95 --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/pr205-build.log @@ -0,0 +1,247 @@ + +> dealt-slide-mvp@1.0.0 build +> vite build + +vite v5.4.21 building for production... +transforming... + +/assets/game_logo.png referenced in /assets/game_logo.png didn't resolve at build time, it will remain unchanged to be resolved at runtime + +/assets/bg_menu.jpg referenced in /assets/bg_menu.jpg didn't resolve at build time, it will remain unchanged to be resolved at runtime + +/assets/bg_driveby.jpg referenced in /assets/bg_driveby.jpg didn't resolve at build time, it will remain unchanged to be resolved at runtime +✓ 3347 modules transformed. +rendering chunks... +computing gzip size... +dist/index.html 0.90 kB │ gzip: 0.46 kB +dist/assets/maplibre-gl-worker-BSIqwooQ.js 476.61 kB +dist/assets/AttackPlanner-Q4knGRYB.css 1.05 kB │ gzip: 0.45 kB +dist/assets/Leaderboard-CQC2u3lr.css 3.07 kB │ gzip: 1.02 kB +dist/assets/PoliceRaidGame-TxbI8IBd.css 3.16 kB │ gzip: 1.12 kB +dist/assets/PhoneApp-rpWN35Mf.css 3.25 kB │ gzip: 1.13 kB +dist/assets/PhotoMemberCreator-CHDEykYB.css 4.29 kB │ gzip: 1.30 kB +dist/assets/UnifiedEncounter-Bqk9jfNn.css 4.83 kB │ gzip: 1.69 kB +dist/assets/BlockLoopDesk-CDQqxJnT.css 4.88 kB │ gzip: 1.68 kB +dist/assets/Missions-CnuTdh9M.css 5.05 kB │ gzip: 1.52 kB +dist/assets/CocaineCrush-DLp4t8x8.css 5.31 kB │ gzip: 1.60 kB +dist/assets/BipNDipGame-OUTspsaX.css 5.81 kB │ gzip: 1.85 kB +dist/assets/ModernOpsEncounter-D1nefR-j.css 6.48 kB │ gzip: 2.10 kB +dist/assets/TrapApp-DxzDWJwG.css 6.71 kB │ gzip: 1.53 kB +dist/assets/Casino-DTlBntHn.css 7.26 kB │ gzip: 1.78 kB +dist/assets/AlchemyLab-Cp6Zrgs6.css 8.45 kB │ gzip: 2.20 kB +dist/assets/DealtModeSelector-DagPjzKc.css 8.50 kB │ gzip: 1.97 kB +dist/assets/TacticalDiorama-CeUNbIO4.css 8.70 kB │ gzip: 2.53 kB +dist/assets/MostWantedApp-C1fxl-9j.css 9.46 kB │ gzip: 2.36 kB +dist/assets/Shoebox-D3lVPOny.css 9.48 kB │ gzip: 2.53 kB +dist/assets/Market-DwwWzb5U.css 9.80 kB │ gzip: 2.52 kB +dist/assets/TopDownShooter-kwv7Hf2b.css 11.19 kB │ gzip: 2.67 kB +dist/assets/DriveByGame-Ds2v5ExV.css 12.16 kB │ gzip: 3.21 kB +dist/assets/SlideGame-c2BLx4Qu.css 13.34 kB │ gzip: 3.27 kB +dist/assets/index-U8R8UmkV.css 14.78 kB │ gzip: 3.95 kB +dist/assets/GraffitiGame-B3XyHHUs.css 15.11 kB │ gzip: 3.40 kB +dist/assets/TerritoryMap-Cn2HY3vV.css 38.33 kB │ gzip: 8.41 kB +dist/assets/App-CHZw-vxm.css 82.32 kB │ gzip: 15.83 kB +dist/assets/vendor-maplibre-GRinvwPn.css 83.06 kB │ gzip: 10.52 kB +dist/assets/abstractAudioBus-BDhR-EkB.js 0.12 kB │ gzip: 0.13 kB +dist/assets/kernelBlurVaryingDeclaration-B9f79CLN.js 0.18 kB │ gzip: 0.17 kB +dist/assets/kernelBlurVaryingDeclaration-BSZfoqE_.js 0.19 kB │ gzip: 0.17 kB +dist/assets/sceneVertexDeclaration-CwjHwM-C.js 0.30 kB │ gzip: 0.21 kB +dist/assets/flowGraphUnaryOperationBlock-B-XjFRhC.js 0.30 kB │ gzip: 0.22 kB +dist/assets/flame-B58g1Rs5.js 0.36 kB │ gzip: 0.29 kB +dist/assets/flowGraphBinaryOperationBlock-CBv-lQ3n.js 0.38 kB │ gzip: 0.25 kB +dist/assets/logDepthDeclaration-DxWcDfK3.js 0.39 kB │ gzip: 0.26 kB +dist/assets/logDepthDeclaration-BRzJkPoY.js 0.41 kB │ gzip: 0.27 kB +dist/assets/moneyRouter-DBEUfOlF.js 0.49 kB │ gzip: 0.28 kB +dist/assets/shopping-bag-CbdK6ywZ.js 0.51 kB │ gzip: 0.34 kB +dist/assets/pass.fragment-CJ1a2a-6.js 0.53 kB │ gzip: 0.36 kB +dist/assets/packingFunctions-CrXKR6Eq.js 0.53 kB │ gzip: 0.30 kB +dist/assets/meshUboDeclaration-BKwEh2fS.js 0.57 kB │ gzip: 0.32 kB +dist/assets/meshUboDeclaration-CW0HBx7B.js 0.57 kB │ gzip: 0.32 kB +dist/assets/shadowMapFragmentSoftTransparentShadow-Co1EZ7dm.js 0.58 kB │ gzip: 0.38 kB +dist/assets/flowGraphSceneReadyEventBlock-Dncf_UnF.js 0.59 kB │ gzip: 0.36 kB +dist/assets/flowGraphPauseAnimationBlock-BCLHuwTC.js 0.59 kB │ gzip: 0.35 kB +dist/assets/shadowMapFragmentSoftTransparentShadow-YF6ODP3b.js 0.62 kB │ gzip: 0.40 kB +dist/assets/rgbdEncode.fragment-B3x2_ans.js 0.62 kB │ gzip: 0.41 kB +dist/assets/rgbdDecode.fragment-DW5vkFG1.js 0.63 kB │ gzip: 0.41 kB +dist/assets/flowGraphConstantBlock-DY5GE3bq.js 0.64 kB │ gzip: 0.38 kB +dist/assets/glowMapMerge.vertex-00oJ08U5.js 0.65 kB │ gzip: 0.40 kB +dist/assets/pass.fragment-BYjfTsDe.js 0.66 kB │ gzip: 0.41 kB +dist/assets/flowGraphBranchBlock-BQ5uTBhA.js 0.68 kB │ gzip: 0.38 kB +dist/assets/vertexColorMixing-DDH6Ijhh.js 0.68 kB │ gzip: 0.35 kB +dist/assets/flowGraphGLTFDataProvider-Csj6v95D.js 0.68 kB │ gzip: 0.41 kB +dist/assets/flowGraphCodeExecutionBlock-AAD2ZxYi.js 0.69 kB │ gzip: 0.38 kB +dist/assets/flowGraphGetVariableBlock-msAwZU2l.js 0.69 kB │ gzip: 0.39 kB +dist/assets/flowGraphContextBlock-CiC6CM41.js 0.69 kB │ gzip: 0.38 kB +dist/assets/flowGraphCachedOperationBlock-CuJ6S_ZM.js 0.71 kB │ gzip: 0.35 kB +dist/assets/flowGraphCancelDelayBlock-CZh6y_sK.js 0.74 kB │ gzip: 0.47 kB +dist/assets/depthBoxBlur.fragment-BO1wVa5r.js 0.75 kB │ gzip: 0.46 kB +dist/assets/bumpVertex-DqbLW5Ac.js 0.75 kB │ gzip: 0.35 kB +dist/assets/rgbdEncode.fragment-DGqe6qsR.js 0.75 kB │ gzip: 0.45 kB +dist/assets/flowGraphIndexOfBlock-BHZ26MzJ.js 0.75 kB │ gzip: 0.42 kB +dist/assets/glowMapMerge.vertex-Cz9LPBLE.js 0.76 kB │ gzip: 0.44 kB +dist/assets/rgbdDecode.fragment-C-yrhvFT.js 0.76 kB │ gzip: 0.45 kB +dist/assets/flowGraphSendCustomEventBlock-w34rsxk_.js 0.76 kB │ gzip: 0.44 kB +dist/assets/flowGraphConditionalDataBlock-BrMjArFy.js 0.77 kB │ gzip: 0.40 kB +dist/assets/flowGraphSceneTickEventBlock-DZFNAPne.js 0.77 kB │ gzip: 0.42 kB +dist/assets/flowGraphCounterBlock-V1uI4LHd.js 0.78 kB │ gzip: 0.42 kB +dist/assets/envTextureLoader-w_sldNak.js 0.78 kB │ gzip: 0.48 kB +dist/assets/flowGraphGetAssetBlock-z6DMQyZ3.js 0.78 kB │ gzip: 0.44 kB +dist/assets/flowGraphArrayIndexBlock-DMvO_z_7.js 0.79 kB │ gzip: 0.44 kB +dist/assets/flowGraphFlipFlopBlock-rpyUAMPt.js 0.85 kB │ gzip: 0.47 kB +dist/assets/flowGraphFunctionReferenceBlock-C4xLaRR2.js 0.85 kB │ gzip: 0.44 kB +dist/assets/flowGraphDebounceBlock-zUkcWSU6.js 0.91 kB │ gzip: 0.46 kB +dist/assets/flowGraphDoNBlock-BdXXwfiu.js 0.92 kB │ gzip: 0.48 kB +dist/assets/flowGraphSequenceBlock-rekjvJ8-.js 0.92 kB │ gzip: 0.46 kB +dist/assets/depthBoxBlur.fragment-CCF821Sq.js 0.93 kB │ gzip: 0.53 kB +dist/assets/vertexColorMixing-BztTUbeg.js 0.94 kB │ gzip: 0.41 kB +dist/assets/color.fragment-B8xEWUxW.js 0.96 kB │ gzip: 0.48 kB +dist/assets/mesh.vertexData.functions-ayNlGC5K.js 0.96 kB │ gzip: 0.49 kB +dist/assets/kernelBlur.vertex-Cm8Zii36.js 0.98 kB │ gzip: 0.52 kB +dist/assets/bumpVertex-DLqIoWF2.js 0.98 kB │ gzip: 0.42 kB +dist/assets/flowGraphPointerOutEventBlock-rewio4bf.js 1.00 kB │ gzip: 0.52 kB +dist/assets/instancesDeclaration-Boa4t8LH.js 1.01 kB │ gzip: 0.35 kB +dist/assets/glowMapMerge.fragment-BrDkA54o.js 1.01 kB │ gzip: 0.53 kB +dist/assets/flowGraphPointerOverEventBlock-C_AUgJo_.js 1.01 kB │ gzip: 0.53 kB +dist/assets/flowGraphWhileLoopBlock-BqHZjjje.js 1.02 kB │ gzip: 0.52 kB +dist/assets/fogFragment-Br3Tzsn0.js 1.03 kB │ gzip: 0.47 kB +dist/assets/passCube.fragment-B6iAjThY.js 1.04 kB │ gzip: 0.46 kB +dist/assets/flowGraphGetPropertyBlock-D0Xcv9j8.js 1.06 kB │ gzip: 0.52 kB +dist/assets/flowGraphDataSwitchBlock-C4Qs1s3B.js 1.07 kB │ gzip: 0.56 kB +dist/assets/flowGraphBezierCurveEasingBlock-CX4KuuEi.js 1.08 kB │ gzip: 0.52 kB +dist/assets/flowGraphTransformCoordinatesSystemBlock-pacaAK4g.js 1.09 kB │ gzip: 0.50 kB +dist/assets/color.fragment-Cu4BLhFb.js 1.10 kB │ gzip: 0.52 kB +dist/assets/kernelBlur.vertex-Cn1G7Hqo.js 1.13 kB │ gzip: 0.56 kB +dist/assets/defaultUboDeclaration-Ddx57cU-.js 1.15 kB │ gzip: 0.51 kB +dist/assets/webAudioMainBus-CNNtlC6u.js 1.16 kB │ gzip: 0.54 kB +dist/assets/fogFragment-CY8lg12i.js 1.16 kB │ gzip: 0.51 kB +dist/assets/clipPlaneFragment-Ciy7ru-Y.js 1.22 kB │ gzip: 0.35 kB +dist/assets/flowGraphConsoleLogBlock-BW-2PDfn.js 1.27 kB │ gzip: 0.65 kB +dist/assets/glowMapMerge.fragment-Dkxhhzge.js 1.27 kB │ gzip: 0.61 kB +dist/assets/flowGraphSwitchBlock--8yk-Sea.js 1.28 kB │ gzip: 0.59 kB +dist/assets/flowGraphForLoopBlock-B1F2lODq.js 1.29 kB │ gzip: 0.60 kB +dist/assets/glowBlurPostProcess.fragment-DvOfENxz.js 1.33 kB │ gzip: 0.68 kB +dist/assets/passCube.fragment-CIZK9CM2.js 1.34 kB │ gzip: 0.51 kB +dist/assets/flowGraphReceiveCustomEventBlock-BRGOmQNW.js 1.40 kB │ gzip: 0.66 kB +dist/assets/color.vertex-Dk3MQGC7.js 1.43 kB │ gzip: 0.63 kB +dist/assets/flowGraphTypeToTypeBlocks-D09I_SqJ.js 1.44 kB │ gzip: 0.54 kB +dist/assets/color.vertex-CrtHy0G7.js 1.44 kB │ gzip: 0.64 kB +dist/assets/depth.fragment-BWpDGtyv.js 1.47 kB │ gzip: 0.66 kB +dist/assets/ddsTextureLoader-DwCLjQJH.js 1.47 kB │ gzip: 0.73 kB +dist/assets/defaultUboDeclaration-0yEdYoww.js 1.50 kB │ gzip: 0.49 kB +dist/assets/flowGraphThrottleBlock-J0i6g7Qi.js 1.51 kB │ gzip: 0.59 kB +dist/assets/flowGraphSetPropertyBlock-BHLa_vkC.js 1.54 kB │ gzip: 0.75 kB +dist/assets/flowGraphSetVariableBlock-CEMAmX4J.js 1.56 kB │ gzip: 0.74 kB +dist/assets/projection-DMbgv_yw.js 1.62 kB │ gzip: 0.74 kB +dist/assets/glowBlurPostProcess.fragment-C42LgXSs.js 1.62 kB │ gzip: 0.76 kB +dist/assets/flowGraphWaitAllBlock-CxfH9MOo.js 1.68 kB │ gzip: 0.72 kB +dist/assets/flowGraphMeshPickEventBlock-tHk8-FyE.js 1.68 kB │ gzip: 0.70 kB +dist/assets/pbrUboDeclaration-6ePiA7Qh.js 1.69 kB │ gzip: 0.63 kB +dist/assets/flowGraphEasingBlock-bEFyvstR.js 1.77 kB │ gzip: 0.82 kB +dist/assets/flowGraphMultiGateBlock-mKikOAON.js 1.82 kB │ gzip: 0.80 kB +dist/assets/glowMapGeneration.fragment-Ce_Xk04v.js 1.93 kB │ gzip: 0.77 kB +dist/assets/flowGraphStopAnimationBlock-DLJB8tHW.js 2.03 kB │ gzip: 0.75 kB +dist/assets/pbrUboDeclaration-Dl9lA4P0.js 2.27 kB │ gzip: 0.61 kB +dist/assets/glowMapGeneration.vertex-CM01yFI1.js 2.29 kB │ gzip: 0.77 kB +dist/assets/depth.vertex-noGbRPa_.js 2.30 kB │ gzip: 0.87 kB +dist/assets/kernelBlur.fragment-zMcHCC8r.js 2.31 kB │ gzip: 0.80 kB +dist/assets/flowGraphInterpolationBlock-D3mWWQEr.js 2.38 kB │ gzip: 0.99 kB +dist/assets/webAudioBus-BJ6iWbvY.js 2.57 kB │ gzip: 0.89 kB +dist/assets/glowMapGeneration.fragment-SPwjNCyS.js 2.60 kB │ gzip: 0.89 kB +dist/assets/hdrTextureLoader-BSt3b5MT.js 2.63 kB │ gzip: 1.27 kB +dist/assets/policeRaidEngine-ioCoSz4K.js 2.69 kB │ gzip: 1.11 kB +dist/assets/ShooterGraphicsLab-DmWT1DAe.js 2.77 kB │ gzip: 1.37 kB +dist/assets/glowMapGeneration.vertex--rWun_oU.js 2.83 kB │ gzip: 0.89 kB +dist/assets/kernelBlur.fragment-BGMFvRF9.js 2.88 kB │ gzip: 0.90 kB +dist/assets/iesTextureLoader-uiDj1aiv.js 2.91 kB │ gzip: 1.27 kB +dist/assets/AttackPlanner-Bv0gAJq0.js 3.01 kB │ gzip: 1.11 kB +dist/assets/shadowMap.fragment-CWdG4k2q.js 3.25 kB │ gzip: 1.17 kB +dist/assets/flowGraphJsonPointerParserBlock-BCioLyaF.js 3.29 kB │ gzip: 1.37 kB +dist/assets/openpbrUboDeclaration-Dtj3ZKMW.js 3.41 kB │ gzip: 0.91 kB +dist/assets/tgaTextureLoader-B-YeMrKh.js 3.74 kB │ gzip: 1.49 kB +dist/assets/flowGraphMatrixMathBlocks-D2Tqb3mk.js 3.84 kB │ gzip: 1.08 kB +dist/assets/PhoneApp-Cg1XwoAj.js 3.86 kB │ gzip: 1.54 kB +dist/assets/flowGraphPlayAnimationBlock-DUAED-nF.js 3.87 kB │ gzip: 1.30 kB +dist/assets/shadowMap.fragment-WzYWyCv_.js 3.88 kB │ gzip: 1.29 kB +dist/assets/Leaderboard-KWI97Xw-.js 3.98 kB │ gzip: 1.62 kB +dist/assets/flowGraphSetDelayBlock-BKZGeDC1.js 4.34 kB │ gzip: 1.55 kB +dist/assets/morphTargetsVertex-ScC0keKz.js 4.37 kB │ gzip: 0.95 kB +dist/assets/shadowMap.vertex-Bhs5PHRF.js 4.43 kB │ gzip: 1.48 kB +dist/assets/openpbrUboDeclaration-CkuOUxYE.js 4.61 kB │ gzip: 0.93 kB +dist/assets/shadowMap.vertex-CpuNA0dj.js 4.62 kB │ gzip: 1.49 kB +dist/assets/flowGraphVectorMathBlocks-B7o7NPDg.js 4.91 kB │ gzip: 1.57 kB +dist/assets/PoliceRaidGame-CO5becJU.js 5.01 kB │ gzip: 2.11 kB +dist/assets/AddressSearchBar-CCkWExyF.js 5.64 kB │ gzip: 2.51 kB +dist/assets/helperFunctions-4DgbPOh6.js 5.88 kB │ gzip: 1.97 kB +dist/assets/assetResolver-DnVK9bs6.js 6.03 kB │ gzip: 1.82 kB +dist/assets/helperFunctions-DkOSA3F4.js 6.23 kB │ gzip: 2.09 kB +dist/assets/logDepthVertex-CVqZxKrP.js 6.82 kB │ gzip: 1.62 kB +dist/assets/dds-a8yAwWRy.js 7.21 kB │ gzip: 2.57 kB +dist/assets/default.vertex-vWWugnUO.js 7.41 kB │ gzip: 2.01 kB +dist/assets/TrapApp-F_9nCyfR.js 7.64 kB │ gzip: 2.58 kB +dist/assets/marketMembersCatalog-DxBYOhdT.js 7.86 kB │ gzip: 3.80 kB +dist/assets/logDepthVertex-Ctxi7d_X.js 8.07 kB │ gzip: 1.69 kB +dist/assets/default.vertex-DWh9e9Rn.js 8.11 kB │ gzip: 2.16 kB +dist/assets/flowGraphMathCombineExtractBlocks-B5LqLbxi.js 8.29 kB │ gzip: 1.22 kB +dist/assets/basisTextureLoader-aRbRiy99.js 8.44 kB │ gzip: 3.37 kB +dist/assets/CocaineCrush-IJBAqY12.js 8.93 kB │ gzip: 3.25 kB +dist/assets/openpbrMaterialLoadingAdapter-DA5QzxkR.js 9.44 kB │ gzip: 1.71 kB +dist/assets/clipPlaneVertex-D8dnxAS1.js 9.47 kB │ gzip: 1.64 kB +dist/assets/PhotoMemberCreator-GpMnKCCU.js 9.86 kB │ gzip: 3.78 kB +dist/assets/Casino-Ds4Vw2Nx.js 10.14 kB │ gzip: 2.96 kB +dist/assets/Missions-BahPRhNr.js 10.59 kB │ gzip: 4.10 kB +dist/assets/pbrMaterialLoadingAdapter-DrBx0NES.js 11.79 kB │ gzip: 2.30 kB +dist/assets/BlockLoopDesk-ZNCGm0EX.js 11.85 kB │ gzip: 3.81 kB +dist/assets/prepareEncounter-DMu177LG.js 12.12 kB │ gzip: 4.71 kB +dist/assets/harmonicsFunctions-CYJFV3OP.js 12.64 kB │ gzip: 4.30 kB +dist/assets/pbr.vertex-Ccb8Yycv.js 13.06 kB │ gzip: 2.80 kB +dist/assets/harmonicsFunctions-Dk410prw.js 13.68 kB │ gzip: 4.48 kB +dist/assets/GangManagement-Oej1LgtU.js 13.93 kB │ gzip: 4.71 kB +dist/assets/MostWantedApp-BGFM9L8A.js 14.68 kB │ gzip: 4.96 kB +dist/assets/ktxTextureLoader-BCWUUHrJ.js 14.79 kB │ gzip: 4.34 kB +dist/assets/Market-DJrHlLXj.js 14.80 kB │ gzip: 4.80 kB +dist/assets/openpbr.vertex-B9ppAdgz.js 15.15 kB │ gzip: 2.98 kB +dist/assets/BipNDipGame-DplqlRpi.js 15.48 kB │ gzip: 5.59 kB +dist/assets/exrTextureLoader-DBx2yMJ_.js 15.73 kB │ gzip: 5.90 kB +dist/assets/pbr.vertex-Bp5i-q4w.js 16.40 kB │ gzip: 3.35 kB +dist/assets/UnifiedEncounter-D7zXyUEI.js 16.43 kB │ gzip: 5.85 kB +dist/assets/TacticalDiorama-D49hvBmS.js 16.84 kB │ gzip: 6.27 kB +dist/assets/Shoebox-Cs8lnTE4.js 16.88 kB │ gzip: 4.90 kB +dist/assets/SlideGame-CX2kGBQT.js 18.59 kB │ gzip: 6.65 kB +dist/assets/openpbr.vertex-BpsKSzdg.js 18.75 kB │ gzip: 3.58 kB +dist/assets/flowGraphMathBlocks-CxEdQ0ZG.js 19.17 kB │ gzip: 3.94 kB +dist/assets/AlchemyLab-gpeUvIU9.js 19.43 kB │ gzip: 5.76 kB +dist/assets/WeeklyUpdateRoute-D_ygrlTw.js 19.53 kB │ gzip: 6.90 kB +dist/assets/DealtModeSelector-QLRt1RJb.js 20.09 kB │ gzip: 6.35 kB +dist/assets/TopDownShooter-BUXZq2D7.js 22.78 kB │ gzip: 7.14 kB +dist/assets/default.fragment-BRpDNw37.js 23.34 kB │ gzip: 5.49 kB +dist/assets/default.fragment-CK2fHuVh.js 24.95 kB │ gzip: 5.48 kB +dist/assets/lightFragment-D7CmrKIZ.js 27.15 kB │ gzip: 5.43 kB +dist/assets/lightFragment-BtZ_wH-z.js 30.36 kB │ gzip: 5.52 kB +dist/assets/GraffitiGame-DJDtcgKA.js 34.68 kB │ gzip: 10.73 kB +dist/assets/animationGroup-BwiZrBdS.js 34.69 kB │ gzip: 8.88 kB +dist/assets/pbrDebug-RHIXEs5b.js 40.54 kB │ gzip: 8.95 kB +dist/assets/worldActorResolver-DjZCQsrb.js 41.03 kB │ gzip: 4.61 kB +dist/assets/CanvasStreetRendererV3-CwVY8CJw.js 41.27 kB │ gzip: 13.76 kB +dist/assets/pbrDebug--4j8OXkE.js 48.22 kB │ gzip: 10.49 kB +dist/assets/oitFragment-BjLiWibg.js 49.79 kB │ gzip: 9.42 kB +dist/assets/oitFragment-DbvMTNDQ.js 51.44 kB │ gzip: 9.60 kB +dist/assets/openpbrMaterial-CAnFMvRz.js 52.55 kB │ gzip: 12.29 kB +dist/assets/DriveByGame-JwTBHm5U.js 64.85 kB │ gzip: 21.74 kB +dist/assets/TerritoryMap-Bevgs72i.js 70.89 kB │ gzip: 23.31 kB +dist/assets/openpbr.fragment-Ye59n5Lk.js 80.35 kB │ gzip: 15.63 kB +dist/assets/openpbr.fragment-Ct8_s-SI.js 81.65 kB │ gzip: 15.45 kB +dist/assets/pbr.fragment-BDivPeSX.js 89.63 kB │ gzip: 15.36 kB +dist/assets/pbr.fragment-DsxKG9BK.js 93.16 kB │ gzip: 16.79 kB +dist/assets/vendor-framer-suRT48ci.js 110.11 kB │ gzip: 37.36 kB +dist/assets/index-BcxBXuDf.js 138.75 kB │ gzip: 45.19 kB +dist/assets/vendor-supabase-BK2FJJ-F.js 219.36 kB │ gzip: 57.22 kB +dist/assets/App-DOVfRwbB.js 359.02 kB │ gzip: 113.90 kB +dist/assets/vendor-maplibre-WbblP0ls.js 952.81 kB │ gzip: 250.65 kB +dist/assets/vendor-phaser-oG8Y5LC_.js 1,478.41 kB │ gzip: 339.66 kB +dist/assets/ModernOpsEncounter-0YZH2XNs.js 2,076.30 kB │ gzip: 509.88 kB + +(!) Some chunks are larger than 500 kB after minification. Consider: +- Using dynamic import() to code-split the application +- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks +- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit. +✓ built in 25.02s diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-checks-current.json b/docs/evidence/2026-10-17-member-graphics-integration/pr205-checks-current.json new file mode 100644 index 0000000..fc703ea --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/pr205-checks-current.json @@ -0,0 +1 @@ +{"headRefOid":"9227dc67d0ce174b7960ceaa06f42f865cf84abc","isDraft":true,"statusCheckRollup":[{"__typename":"CheckRun","completedAt":"2026-10-09T19:05:32Z","conclusion":"SUCCESS","detailsUrl":"https://github.com/BrandDead/slide/actions/runs/37977445580/job/113979180341","name":"Frontend (lint + build)","startedAt":"2026-10-09T19:02:16Z","status":"COMPLETED","workflowName":"CI"},{"__typename":"CheckRun","completedAt":"2026-10-09T19:02:42Z","conclusion":"SUCCESS","detailsUrl":"https://github.com/BrandDead/slide/actions/runs/37977445580/job/113979180738","name":"Backend (pytest)","startedAt":"2026-10-09T19:02:17Z","status":"COMPLETED","workflowName":"CI"},{"__typename":"StatusContext","context":"Vercel","startedAt":"2026-10-09T19:04:05Z","state":"SUCCESS","targetUrl":"https://vercel.com/steve-wessels-projects/slide/DseXrQn6mozkj4nCB9VFra9oGmxU"},{"__typename":"CheckRun","completedAt":"2026-10-09T19:04:06Z","conclusion":"SUCCESS","detailsUrl":"https://vercel.com/github","name":"Vercel Preview Comments","startedAt":"2026-10-09T19:04:06Z","status":"COMPLETED","workflowName":""}]} diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-combat-state.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-combat-state.png new file mode 100644 index 0000000..2c61129 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-combat-state.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-consequence.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-consequence.png new file mode 100644 index 0000000..32a32fa Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-consequence.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-encounter-entry.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-encounter-entry.png new file mode 100644 index 0000000..2a1858c Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-encounter-entry.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-reload-hud.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-reload-hud.png new file mode 100644 index 0000000..b7aa039 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-reload-hud.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-reload-return.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-reload-return.png new file mode 100644 index 0000000..40eb6f4 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-reload-return.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-report.json b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-report.json new file mode 100644 index 0000000..89b1245 --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-report.json @@ -0,0 +1,5246 @@ +{ + "label": "pr205-failure", + "origin": "http://127.0.0.1:4173", + "viewport": { + "width": 1440, + "height": 900 + }, + "imageFailure": true, + "checks": [ + { + "name": "Named fictional opposition visible", + "pass": true + }, + { + "name": "Failed actor images have named fallback markers", + "pass": true + }, + { + "name": "Actual Dre cell matches rendered destination (0,2)", + "pass": true + }, + { + "name": "Actual Rome cell matches rendered destination (4,4)", + "pass": true + }, + { + "name": "Reload command emits real engine event", + "pass": true + }, + { + "name": "DOM condition shows reloading", + "pass": true + }, + { + "name": "Reload finishes through the real engine", + "pass": true + }, + { + "name": "Real fire event recorded", + "pass": true + }, + { + "name": "Downed opponent retains a named fallback", + "pass": true + }, + { + "name": "Demo result receipt survives reload exactly once", + "pass": true + }, + { + "name": "Reload preserves booked money, heat, morale, and crew health", + "pass": true + }, + { + "name": "No uncaught page errors", + "pass": true + } + ], + "screenshots": [ + "pr205-failure-1440x900-strategy-diorama.png", + "pr205-failure-1440x900-encounter-entry.png", + "pr205-failure-1440x900-reload-hud.png", + "pr205-failure-1440x900-combat-state.png", + "pr205-failure-1440x900-result.png", + "pr205-failure-1440x900-consequence.png", + "pr205-failure-1440x900-returned.png", + "pr205-failure-1440x900-reload-return.png" + ], + "pageErrors": [], + "consoleErrors": [ + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: the server responded with a status of 404 (File not found)" + ], + "failedRequests": [ + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + } + ], + "snapshots": [ + { + "name": "entry", + "state": { + "tick": 0, + "phase": "active", + "selectedCrewId": "demo-dealer-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 1, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": -1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 3 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Arc", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Arc", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 11/11 ammo" + } + }, + { + "name": "dre-move", + "state": { + "tick": 10, + "phase": "active", + "selectedCrewId": "demo-dealer-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 3 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:10:0:moved", + "tick": 10, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Arc", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Arc", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 11/11 ammo" + } + }, + { + "name": "rome-move", + "state": { + "tick": 14, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": 2, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:10:0:moved", + "tick": 10, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:14:1:moved", + "tick": 14, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Arc", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Arc", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 11/11 ammo" + } + }, + { + "name": "after-fire", + "state": { + "tick": 18, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 10, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 21, + "level": 3, + "lastSequence": 3, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:10:0:moved", + "tick": 10, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:14:1:moved", + "tick": 14, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:2:weapon-fired", + "tick": 16, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:3:impact-actor", + "tick": 16, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Arc", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Arc", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 10/11 ammo" + } + }, + { + "name": "reload-start", + "state": { + "tick": 22, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 10, + "maxAmmo": 11, + "reloadUntilTick": 40, + "nextFireTick": 21, + "level": 3, + "lastSequence": 4, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:10:0:moved", + "tick": 10, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:14:1:moved", + "tick": 14, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:2:weapon-fired", + "tick": 16, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:3:impact-actor", + "tick": 16, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:8:reload-start", + "tick": 20, + "type": "reload-start", + "actorId": "demo-shooter-1", + "message": "Big Rome starts reloading." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Arc", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Arc", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 10/11 ammo · reloading" + } + }, + { + "name": "reload-complete", + "state": { + "tick": 42, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 95, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 21, + "level": 3, + "lastSequence": 4, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 45, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 45, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:10:0:moved", + "tick": 10, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:14:1:moved", + "tick": 14, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:2:weapon-fired", + "tick": 16, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:16:3:impact-actor", + "tick": 16, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:8:reload-start", + "tick": 20, + "type": "reload-start", + "actorId": "demo-shooter-1", + "message": "Big Rome starts reloading." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:9:reload-complete", + "tick": 40, + "type": "reload-complete", + "actorId": "demo-shooter-1", + "message": "Big Rome is ready." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:10:weapon-fired", + "tick": 40, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:11:impact-cover", + "tick": 40, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:12:weapon-fired", + "tick": 40, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:13:impact-actor", + "tick": 40, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Arc", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Arc", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 95 HP · 11/11 ammo" + } + }, + { + "name": "combat-state", + "state": { + "tick": 218, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 65, + "maxHealth": 100, + "armor": 1, + "ammo": 6, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 209, + "level": 3, + "lastSequence": 9, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 205, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 0, + "maxHealth": 55, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 205, + "level": 1, + "lastSequence": -1, + "isDown": true + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:100:27:impact-cover", + "tick": 100, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:100:28:weapon-fired", + "tick": 100, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:100:29:impact-cover", + "tick": 100, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:weapon-fired", + "tick": 120, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:impact-cover", + "tick": 120, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:weapon-fired", + "tick": 120, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:impact-cover", + "tick": 120, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:128:30:weapon-fired", + "tick": 128, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:128:30:impact-cover", + "tick": 128, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:weapon-fired", + "tick": 140, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:impact-actor", + "tick": 140, + "type": "impact-actor", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:weapon-fired", + "tick": 140, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:impact-actor", + "tick": 140, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:160:30:reload-start", + "tick": 160, + "type": "reload-start", + "actorId": "opposition-1", + "message": "Nightfall lookout reloads." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:160:30:reload-start", + "tick": 160, + "type": "reload-start", + "actorId": "opposition-2", + "message": "Nightfall 2 reloads." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:166:30:weapon-fired", + "tick": 166, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:166:30:impact-cover", + "tick": 166, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:reload-complete", + "tick": 180, + "type": "reload-complete", + "actorId": "opposition-1", + "message": "Nightfall lookout is ready." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:reload-complete", + "tick": 180, + "type": "reload-complete", + "actorId": "opposition-2", + "message": "Nightfall 2 is ready." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:weapon-fired", + "tick": 180, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:impact-cover", + "tick": 180, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:weapon-fired", + "tick": 180, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:impact-actor", + "tick": 180, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:weapon-fired", + "tick": 200, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:impact-cover", + "tick": 200, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:weapon-fired", + "tick": 200, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:impact-actor", + "tick": 200, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:204:30:weapon-fired", + "tick": 204, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:204:30:impact-actor", + "tick": 204, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:204:30:actor-downed", + "tick": 204, + "type": "actor-downed", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Nightfall 2 is down." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Arc", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Arc", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2 · DOWN" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n1 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 65 HP · 6/11 ammo" + } + } + ], + "httpErrors": [ + { + "url": "http://127.0.0.1:4173/favicon.svg", + "status": 404 + }, + { + "url": "http://127.0.0.1:4173/assets/game_logo.png", + "status": 404 + }, + { + "url": "http://127.0.0.1:4173/assets/generated/ui/icons/icon_news_v001.png", + "status": 404 + } + ], + "ledgerBeforeReload": "{\"version\":1,\"phase\":\"consequence\",\"money\":12844,\"playerHeat\":9,\"reputation\":13,\"blockHeat\":2,\"blockMorale\":66,\"pendingIncome\":52,\"productQuantity\":7,\"assignments\":{\"demo-dealer-1\":\"demo-product-river-cut\"},\"placements\":[{\"memberId\":\"demo-dealer-1\",\"memberName\":\"Lil Dre\",\"role\":\"dealer\",\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"incomePerTick\":67,\"exposureRisk\":50,\"level\":2,\"health\":100},{\"memberId\":\"demo-shooter-1\",\"memberName\":\"Big Rome\",\"role\":\"shooter\",\"x\":4,\"y\":3,\"zoneType\":\"storefront\",\"incomePerTick\":0,\"exposureRisk\":25,\"level\":3,\"health\":100}],\"appliedEncounterKeys\":[\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"economyKeys\":[\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"dealKey\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounterKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"lastDeal\":{\"key\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"dealerId\":\"demo-dealer-1\",\"productId\":\"demo-product-river-cut\",\"productName\":\"River Cut\",\"productTier\":\"street\",\"cell\":{\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"exposureRisk\":50},\"moneyDelta\":844,\"productDelta\":-5,\"heatDelta\":4,\"exposureDelta\":4,\"reputationDelta\":1,\"demandBonusPct\":11,\"leftoverQuantity\":7,\"explanation\":\"Street exposure +11% → higher demand, but heat +4 and exposure +4. 5 River Cut moved for $844.\"},\"lastEncounter\":{\"idempotencyKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"outcome\":\"retreated\",\"crewDown\":[],\"oppositionDown\":[\"opposition-2\"],\"objectiveProgress\":0,\"heatDelta\":0,\"moraleDelta\":-4,\"pendingIncomeDelta\":-15,\"summary\":\"The crew disengaged and kept the situation from escalating.\"},\"selectedDealerId\":\"demo-dealer-1\",\"selectedShooterId\":\"demo-shooter-1\",\"briefing\":[\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\",\"The crew disengaged and kept the situation from escalating.\",\"Heat +0, morale -4, pending cash -$15.\"],\"threatRoute\":\"slide\",\"threatReason\":\"Nightfall Crew is sliding on 1208 W Las Olas Blvd. The deal put your dealer at 50 street exposure — hold the strip or get the crew out.\",\"rivalIncident\":{\"receiptKey\":\"demo-city-brief-attack\",\"eventId\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"description\":\"Nightfall is testing the edge of your Las Olas block. Review your crew positions before the next move.\",\"occurredAt\":1792259417379},\"rivalResolution\":{\"receiptKey\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"outcome\":\"retreated\",\"line\":\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\"},\"pendingHealthIds\":[],\"recovery\":null,\"shiftIndex\":1,\"stock\":[{\"id\":\"demo-product-river-cut\",\"name\":\"River Cut\",\"tier\":\"street\",\"quality\":62,\"quantity\":7,\"craftedAt\":1700000000000,\"effects\":[\"fast-ticket\"]}],\"crew\":[{\"id\":\"demo-dealer-1\",\"health\":100,\"morale\":85,\"assignment\":\"sidewalk\"},{\"id\":\"demo-shooter-1\",\"health\":100,\"morale\":80,\"assignment\":\"storefront 4,3\"}]}", + "ledgerAfterReload": "{\"version\":1,\"phase\":\"returned\",\"money\":12844,\"playerHeat\":9,\"reputation\":13,\"blockHeat\":2,\"blockMorale\":66,\"pendingIncome\":52,\"productQuantity\":7,\"assignments\":{\"demo-dealer-1\":\"demo-product-river-cut\"},\"placements\":[{\"memberId\":\"demo-dealer-1\",\"memberName\":\"Lil Dre\",\"role\":\"dealer\",\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"incomePerTick\":67,\"exposureRisk\":50,\"level\":2,\"health\":100},{\"memberId\":\"demo-shooter-1\",\"memberName\":\"Big Rome\",\"role\":\"shooter\",\"x\":4,\"y\":3,\"zoneType\":\"storefront\",\"incomePerTick\":0,\"exposureRisk\":25,\"level\":3,\"health\":100}],\"appliedEncounterKeys\":[\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"economyKeys\":[\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"dealKey\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounterKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"lastDeal\":{\"key\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"dealerId\":\"demo-dealer-1\",\"productId\":\"demo-product-river-cut\",\"productName\":\"River Cut\",\"productTier\":\"street\",\"cell\":{\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"exposureRisk\":50},\"moneyDelta\":844,\"productDelta\":-5,\"heatDelta\":4,\"exposureDelta\":4,\"reputationDelta\":1,\"demandBonusPct\":11,\"leftoverQuantity\":7,\"explanation\":\"Street exposure +11% → higher demand, but heat +4 and exposure +4. 5 River Cut moved for $844.\"},\"lastEncounter\":{\"idempotencyKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"outcome\":\"retreated\",\"crewDown\":[],\"oppositionDown\":[\"opposition-2\"],\"objectiveProgress\":0,\"heatDelta\":0,\"moraleDelta\":-4,\"pendingIncomeDelta\":-15,\"summary\":\"The crew disengaged and kept the situation from escalating.\"},\"selectedDealerId\":\"demo-dealer-1\",\"selectedShooterId\":\"demo-shooter-1\",\"briefing\":[\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\",\"Street cash $12844. Heat 9. Product 7.\",\"Encounter encounter-demo-block-las-olas-17gayr2:retreated stays booked.\"],\"threatRoute\":\"slide\",\"threatReason\":\"Nightfall Crew is sliding on 1208 W Las Olas Blvd. The deal put your dealer at 50 street exposure — hold the strip or get the crew out.\",\"rivalIncident\":{\"receiptKey\":\"demo-city-brief-attack\",\"eventId\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"description\":\"Nightfall is testing the edge of your Las Olas block. Review your crew positions before the next move.\",\"occurredAt\":1792259417379},\"rivalResolution\":{\"receiptKey\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"outcome\":\"retreated\",\"line\":\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\"},\"pendingHealthIds\":[],\"recovery\":null,\"shiftIndex\":1,\"stock\":[{\"id\":\"demo-product-river-cut\",\"name\":\"River Cut\",\"tier\":\"street\",\"quality\":62,\"quantity\":7,\"craftedAt\":1700000000000,\"effects\":[\"fast-ticket\"]}],\"crew\":[{\"id\":\"demo-dealer-1\",\"health\":100,\"morale\":85,\"assignment\":\"sidewalk\"},{\"id\":\"demo-shooter-1\",\"health\":100,\"morale\":80,\"assignment\":\"storefront 4,3\"}]}" +} diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-result.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-result.png new file mode 100644 index 0000000..df18da8 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-result.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-returned.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-returned.png new file mode 100644 index 0000000..0c2d473 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-returned.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-strategy-diorama.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-strategy-diorama.png new file mode 100644 index 0000000..8c847a8 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-1440x900-strategy-diorama.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-combat-state.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-combat-state.png new file mode 100644 index 0000000..6c15ba6 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-combat-state.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-consequence.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-consequence.png new file mode 100644 index 0000000..783a527 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-consequence.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-encounter-entry.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-encounter-entry.png new file mode 100644 index 0000000..7ac93c0 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-encounter-entry.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-reload-hud.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-reload-hud.png new file mode 100644 index 0000000..939cdc5 Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-reload-hud.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-reload-return.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-reload-return.png new file mode 100644 index 0000000..1d26fff Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-reload-return.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-report.json b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-report.json new file mode 100644 index 0000000..2d154af --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-report.json @@ -0,0 +1,5251 @@ +{ + "label": "pr205-failure", + "origin": "http://127.0.0.1:4173", + "viewport": { + "width": 390, + "height": 844 + }, + "imageFailure": true, + "checks": [ + { + "name": "Named fictional opposition visible", + "pass": true + }, + { + "name": "Failed actor images have named fallback markers", + "pass": true + }, + { + "name": "Actual Dre cell matches rendered destination (0,2)", + "pass": true + }, + { + "name": "Actual Rome cell matches rendered destination (4,4)", + "pass": true + }, + { + "name": "Reload command emits real engine event", + "pass": true + }, + { + "name": "DOM condition shows reloading", + "pass": true + }, + { + "name": "Reload finishes through the real engine", + "pass": true + }, + { + "name": "Real fire event recorded", + "pass": true + }, + { + "name": "Downed opponent retains a named fallback", + "pass": true + }, + { + "name": "Demo result receipt survives reload exactly once", + "pass": true + }, + { + "name": "Reload preserves booked money, heat, morale, and crew health", + "pass": true + }, + { + "name": "No uncaught page errors", + "pass": true + } + ], + "screenshots": [ + "pr205-failure-390x844-strategy-diorama.png", + "pr205-failure-390x844-encounter-entry.png", + "pr205-failure-390x844-reload-hud.png", + "pr205-failure-390x844-combat-state.png", + "pr205-failure-390x844-result.png", + "pr205-failure-390x844-consequence.png", + "pr205-failure-390x844-returned.png", + "pr205-failure-390x844-reload-return.png" + ], + "pageErrors": [], + "consoleErrors": [ + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: net::ERR_FAILED", + "Failed to load resource: the server responded with a status of 404 (File not found)", + "Failed to load resource: the server responded with a status of 404 (File not found)" + ], + "failedRequests": [ + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_blacktee_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_dealer_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_idle_v001.webp", + "error": "net::ERR_FAILED" + }, + { + "url": "http://127.0.0.1:4173/assets/runtime/generated/characters/topdown/character_shooter_male_topdown_downed_v001.webp", + "error": "net::ERR_FAILED" + } + ], + "snapshots": [ + { + "name": "entry", + "state": { + "tick": 0, + "phase": "active", + "selectedCrewId": "demo-dealer-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 1, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": -1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 3 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Arc", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Arc", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 11/11 ammo" + } + }, + { + "name": "dre-move", + "state": { + "tick": 8, + "phase": "active", + "selectedCrewId": "demo-dealer-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 3 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Arc", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Arc", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 11/11 ammo" + } + }, + { + "name": "rome-move", + "state": { + "tick": 14, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 3, + "lastSequence": 2, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 55, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:14:1:moved", + "tick": 14, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Arc", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Arc", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 11/11 ammo" + } + }, + { + "name": "after-fire", + "state": { + "tick": 18, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 10, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 23, + "level": 3, + "lastSequence": 3, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:14:1:moved", + "tick": 14, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Arc", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Arc", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 10/11 ammo" + } + }, + { + "name": "reload-start", + "state": { + "tick": 22, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 100, + "maxHealth": 100, + "armor": 1, + "ammo": 10, + "maxAmmo": 11, + "reloadUntilTick": 40, + "nextFireTick": 23, + "level": 3, + "lastSequence": 4, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 6, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 25, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:14:1:moved", + "tick": 14, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:8:reload-start", + "tick": 20, + "type": "reload-start", + "actorId": "demo-shooter-1", + "message": "Big Rome starts reloading." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Arc", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Arc", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 100 HP · 10/11 ammo · reloading" + } + }, + { + "name": "reload-complete", + "state": { + "tick": 44, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 95, + "maxHealth": 100, + "armor": 1, + "ammo": 11, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 23, + "level": 3, + "lastSequence": 4, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 45, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 31, + "maxHealth": 55, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 45, + "level": 1, + "lastSequence": -1, + "isDown": false + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:8:0:moved", + "tick": 8, + "type": "moved", + "actorId": "demo-dealer-1", + "message": "Lil Dre moves into sidewalk cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:14:1:moved", + "tick": 14, + "type": "moved", + "actorId": "demo-shooter-1", + "message": "Big Rome moves into alley cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:2:weapon-fired", + "tick": 18, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:18:3:impact-actor", + "tick": 18, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:4:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:5:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:6:weapon-fired", + "tick": 20, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:7:impact-cover", + "tick": 20, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:20:8:reload-start", + "tick": 20, + "type": "reload-start", + "actorId": "demo-shooter-1", + "message": "Big Rome starts reloading." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:9:reload-complete", + "tick": 40, + "type": "reload-complete", + "actorId": "demo-shooter-1", + "message": "Big Rome is ready." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:10:weapon-fired", + "tick": 40, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:11:impact-cover", + "tick": 40, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:12:weapon-fired", + "tick": 40, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:40:13:impact-actor", + "tick": 40, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Arc", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Arc", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n2 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 95 HP · 11/11 ammo" + } + }, + { + "name": "combat-state", + "state": { + "tick": 216, + "phase": "active", + "selectedCrewId": "demo-shooter-1", + "actors": [ + { + "id": "demo-dealer-1", + "name": "Lil Dre", + "team": "crew", + "role": "dealer", + "position": { + "x": 0, + "y": 2 + }, + "health": 100, + "maxHealth": 100, + "armor": 0, + "ammo": 7, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 0, + "level": 2, + "lastSequence": 1, + "isDown": false + }, + { + "id": "demo-shooter-1", + "name": "Big Rome", + "team": "crew", + "role": "shooter", + "position": { + "x": 4, + "y": 4 + }, + "health": 65, + "maxHealth": 100, + "armor": 1, + "ammo": 6, + "maxAmmo": 11, + "reloadUntilTick": null, + "nextFireTick": 207, + "level": 3, + "lastSequence": 9, + "isDown": false + }, + { + "id": "opposition-1", + "name": "Nightfall lookout", + "team": "opposition", + "role": "opposition", + "position": { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + "health": 70, + "maxHealth": 70, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 205, + "level": 1, + "lastSequence": -1, + "isDown": false + }, + { + "id": "opposition-2", + "name": "Nightfall 2", + "team": "opposition", + "role": "opposition", + "position": { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + "health": 0, + "maxHealth": 55, + "armor": 0, + "ammo": 5, + "maxAmmo": 7, + "reloadUntilTick": null, + "nextFireTick": 205, + "level": 1, + "lastSequence": -1, + "isDown": true + } + ], + "events": [ + { + "id": "encounter-demo-block-las-olas-17gayr2:100:27:impact-cover", + "tick": 100, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:100:28:weapon-fired", + "tick": 100, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:100:29:impact-cover", + "tick": 100, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:weapon-fired", + "tick": 120, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:impact-cover", + "tick": 120, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:weapon-fired", + "tick": 120, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:120:30:impact-cover", + "tick": 120, + "type": "impact-cover", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:134:30:weapon-fired", + "tick": 134, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:134:30:impact-cover", + "tick": 134, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:weapon-fired", + "tick": 140, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:impact-actor", + "tick": 140, + "type": "impact-actor", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:weapon-fired", + "tick": 140, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:140:30:impact-actor", + "tick": 140, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:160:30:reload-start", + "tick": 160, + "type": "reload-start", + "actorId": "opposition-1", + "message": "Nightfall lookout reloads." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:160:30:reload-start", + "tick": 160, + "type": "reload-start", + "actorId": "opposition-2", + "message": "Nightfall 2 reloads." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:168:30:weapon-fired", + "tick": 168, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:168:30:impact-cover", + "tick": 168, + "type": "impact-cover", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:reload-complete", + "tick": 180, + "type": "reload-complete", + "actorId": "opposition-1", + "message": "Nightfall lookout is ready." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:reload-complete", + "tick": 180, + "type": "reload-complete", + "actorId": "opposition-2", + "message": "Nightfall 2 is ready." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:weapon-fired", + "tick": 180, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:impact-cover", + "tick": 180, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:weapon-fired", + "tick": 180, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:180:30:impact-actor", + "tick": 180, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:weapon-fired", + "tick": 200, + "type": "weapon-fired", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Nightfall lookout fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:impact-cover", + "tick": 200, + "type": "impact-cover", + "actorId": "opposition-1", + "targetId": "demo-shooter-1", + "message": "Shot strikes cover." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:weapon-fired", + "tick": 200, + "type": "weapon-fired", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "message": "Nightfall 2 fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:200:30:impact-actor", + "tick": 200, + "type": "impact-actor", + "actorId": "opposition-2", + "targetId": "demo-shooter-1", + "amount": 5, + "message": "Big Rome takes 5 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:202:30:weapon-fired", + "tick": 202, + "type": "weapon-fired", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Big Rome fires." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:202:30:impact-actor", + "tick": 202, + "type": "impact-actor", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "amount": 24, + "message": "Nightfall 2 takes 24 damage." + }, + { + "id": "encounter-demo-block-las-olas-17gayr2:202:30:actor-downed", + "tick": 202, + "type": "actor-downed", + "actorId": "demo-shooter-1", + "targetId": "opposition-2", + "message": "Nightfall 2 is down." + } + ], + "terrain": [ + [ + { + "x": 0, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 1, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 2, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 3, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 4, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 5, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 6, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + }, + { + "x": 7, + "y": 0, + "zoneType": "street", + "passable": false, + "cover": 0.05, + "exposure": 0.95 + } + ], + [ + { + "x": 0, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 1, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 2, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 1, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 2, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 3, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 4, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 5, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 6, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + }, + { + "x": 7, + "y": 3, + "zoneType": "storefront", + "passable": true, + "cover": 0.6, + "exposure": 0.25 + } + ], + [ + { + "x": 0, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 1, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 2, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 3, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 4, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 5, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 6, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + }, + { + "x": 7, + "y": 4, + "zoneType": "alley", + "passable": true, + "cover": 0.8, + "exposure": 0.1 + } + ], + [ + { + "x": 0, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 1, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 2, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 3, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 4, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 5, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 6, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + }, + { + "x": 7, + "y": 5, + "zoneType": "sidewalk", + "passable": true, + "cover": 0.3, + "exposure": 0.5 + } + ], + [ + { + "x": 0, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 1, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 2, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 3, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 4, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 5, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 6, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + }, + { + "x": 7, + "y": 6, + "zoneType": "curb", + "passable": true, + "cover": 0.15, + "exposure": 0.8 + } + ], + [ + { + "x": 0, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 1, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 2, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 3, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 4, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 5, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 6, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + }, + { + "x": 7, + "y": 7, + "zoneType": "rooftop", + "passable": true, + "cover": 0.9, + "exposure": 0.05 + } + ] + ], + "views": [ + { + "id": "demo-dealer-1", + "type": "Arc", + "label": "Lil Dre" + }, + { + "id": "demo-shooter-1", + "type": "Arc", + "label": "Big Rome" + }, + { + "id": "opposition-1", + "type": "Arc", + "label": "Nightfall lookout" + }, + { + "id": "opposition-2", + "type": "Arc", + "label": "Nightfall 2 · DOWN" + } + ], + "canvas": { + "width": 960, + "height": 600 + }, + "hud": "2 crew active\n1 opposition visible\n0/1 secure exits\nLil Dre · 100 HP · 7/7 ammo\nBig Rome · 65 HP · 6/11 ammo" + } + } + ], + "httpErrors": [ + { + "url": "http://127.0.0.1:4173/favicon.svg", + "status": 404 + }, + { + "url": "http://127.0.0.1:4173/favicon.svg", + "status": 404 + }, + { + "url": "http://127.0.0.1:4173/assets/game_logo.png", + "status": 404 + }, + { + "url": "http://127.0.0.1:4173/assets/generated/ui/icons/icon_news_v001.png", + "status": 404 + } + ], + "ledgerBeforeReload": "{\"version\":1,\"phase\":\"consequence\",\"money\":12844,\"playerHeat\":9,\"reputation\":13,\"blockHeat\":2,\"blockMorale\":66,\"pendingIncome\":52,\"productQuantity\":7,\"assignments\":{\"demo-dealer-1\":\"demo-product-river-cut\"},\"placements\":[{\"memberId\":\"demo-dealer-1\",\"memberName\":\"Lil Dre\",\"role\":\"dealer\",\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"incomePerTick\":67,\"exposureRisk\":50,\"level\":2,\"health\":100},{\"memberId\":\"demo-shooter-1\",\"memberName\":\"Big Rome\",\"role\":\"shooter\",\"x\":4,\"y\":3,\"zoneType\":\"storefront\",\"incomePerTick\":0,\"exposureRisk\":25,\"level\":3,\"health\":100}],\"appliedEncounterKeys\":[\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"economyKeys\":[\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"dealKey\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounterKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"lastDeal\":{\"key\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"dealerId\":\"demo-dealer-1\",\"productId\":\"demo-product-river-cut\",\"productName\":\"River Cut\",\"productTier\":\"street\",\"cell\":{\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"exposureRisk\":50},\"moneyDelta\":844,\"productDelta\":-5,\"heatDelta\":4,\"exposureDelta\":4,\"reputationDelta\":1,\"demandBonusPct\":11,\"leftoverQuantity\":7,\"explanation\":\"Street exposure +11% → higher demand, but heat +4 and exposure +4. 5 River Cut moved for $844.\"},\"lastEncounter\":{\"idempotencyKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"outcome\":\"retreated\",\"crewDown\":[],\"oppositionDown\":[\"opposition-2\"],\"objectiveProgress\":0,\"heatDelta\":0,\"moraleDelta\":-4,\"pendingIncomeDelta\":-15,\"summary\":\"The crew disengaged and kept the situation from escalating.\"},\"selectedDealerId\":\"demo-dealer-1\",\"selectedShooterId\":\"demo-shooter-1\",\"briefing\":[\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\",\"The crew disengaged and kept the situation from escalating.\",\"Heat +0, morale -4, pending cash -$15.\"],\"threatRoute\":\"slide\",\"threatReason\":\"Nightfall Crew is sliding on 1208 W Las Olas Blvd. The deal put your dealer at 50 street exposure — hold the strip or get the crew out.\",\"rivalIncident\":{\"receiptKey\":\"demo-city-brief-attack\",\"eventId\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"description\":\"Nightfall is testing the edge of your Las Olas block. Review your crew positions before the next move.\",\"occurredAt\":1792259383163},\"rivalResolution\":{\"receiptKey\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"outcome\":\"retreated\",\"line\":\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\"},\"pendingHealthIds\":[],\"recovery\":null,\"shiftIndex\":1,\"stock\":[{\"id\":\"demo-product-river-cut\",\"name\":\"River Cut\",\"tier\":\"street\",\"quality\":62,\"quantity\":7,\"craftedAt\":1700000000000,\"effects\":[\"fast-ticket\"]}],\"crew\":[{\"id\":\"demo-dealer-1\",\"health\":100,\"morale\":85,\"assignment\":\"sidewalk\"},{\"id\":\"demo-shooter-1\",\"health\":100,\"morale\":80,\"assignment\":\"storefront 4,3\"}]}", + "ledgerAfterReload": "{\"version\":1,\"phase\":\"returned\",\"money\":12844,\"playerHeat\":9,\"reputation\":13,\"blockHeat\":2,\"blockMorale\":66,\"pendingIncome\":52,\"productQuantity\":7,\"assignments\":{\"demo-dealer-1\":\"demo-product-river-cut\"},\"placements\":[{\"memberId\":\"demo-dealer-1\",\"memberName\":\"Lil Dre\",\"role\":\"dealer\",\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"incomePerTick\":67,\"exposureRisk\":50,\"level\":2,\"health\":100},{\"memberId\":\"demo-shooter-1\",\"memberName\":\"Big Rome\",\"role\":\"shooter\",\"x\":4,\"y\":3,\"zoneType\":\"storefront\",\"incomePerTick\":0,\"exposureRisk\":25,\"level\":3,\"health\":100}],\"appliedEncounterKeys\":[\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"economyKeys\":[\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounter-demo-block-las-olas-17gayr2:retreated\"],\"dealKey\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"encounterKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"lastDeal\":{\"key\":\"deal:demo-block-las-olas:demo-dealer-1:1:2:demo-product-river-cut:1\",\"dealerId\":\"demo-dealer-1\",\"productId\":\"demo-product-river-cut\",\"productName\":\"River Cut\",\"productTier\":\"street\",\"cell\":{\"x\":1,\"y\":2,\"zoneType\":\"sidewalk\",\"exposureRisk\":50},\"moneyDelta\":844,\"productDelta\":-5,\"heatDelta\":4,\"exposureDelta\":4,\"reputationDelta\":1,\"demandBonusPct\":11,\"leftoverQuantity\":7,\"explanation\":\"Street exposure +11% → higher demand, but heat +4 and exposure +4. 5 River Cut moved for $844.\"},\"lastEncounter\":{\"idempotencyKey\":\"encounter-demo-block-las-olas-17gayr2:retreated\",\"outcome\":\"retreated\",\"crewDown\":[],\"oppositionDown\":[\"opposition-2\"],\"objectiveProgress\":0,\"heatDelta\":0,\"moraleDelta\":-4,\"pendingIncomeDelta\":-15,\"summary\":\"The crew disengaged and kept the situation from escalating.\"},\"selectedDealerId\":\"demo-dealer-1\",\"selectedShooterId\":\"demo-shooter-1\",\"briefing\":[\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\",\"Street cash $12844. Heat 9. Product 7.\",\"Encounter encounter-demo-block-las-olas-17gayr2:retreated stays booked.\"],\"threatRoute\":\"slide\",\"threatReason\":\"Nightfall Crew is sliding on 1208 W Las Olas Blvd. The deal put your dealer at 50 street exposure — hold the strip or get the crew out.\",\"rivalIncident\":{\"receiptKey\":\"demo-city-brief-attack\",\"eventId\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"description\":\"Nightfall is testing the edge of your Las Olas block. Review your crew positions before the next move.\",\"occurredAt\":1792259383163},\"rivalResolution\":{\"receiptKey\":\"demo-city-brief-attack\",\"crewId\":\"ghost-nightfall\",\"crewName\":\"Nightfall Crew\",\"outcome\":\"retreated\",\"line\":\"Your crew backed off 1208 W Las Olas Blvd. Nightfall Crew is still circling.\"},\"pendingHealthIds\":[],\"recovery\":null,\"shiftIndex\":1,\"stock\":[{\"id\":\"demo-product-river-cut\",\"name\":\"River Cut\",\"tier\":\"street\",\"quality\":62,\"quantity\":7,\"craftedAt\":1700000000000,\"effects\":[\"fast-ticket\"]}],\"crew\":[{\"id\":\"demo-dealer-1\",\"health\":100,\"morale\":85,\"assignment\":\"sidewalk\"},{\"id\":\"demo-shooter-1\",\"health\":100,\"morale\":80,\"assignment\":\"storefront 4,3\"}]}" +} diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-result.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-result.png new file mode 100644 index 0000000..82a6a2c Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-result.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-returned.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-returned.png new file mode 100644 index 0000000..8f4013e Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-returned.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-strategy-diorama.png b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-strategy-diorama.png new file mode 100644 index 0000000..566a63e Binary files /dev/null and b/docs/evidence/2026-10-17-member-graphics-integration/pr205-failure-390x844-strategy-diorama.png differ diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-focused.log b/docs/evidence/2026-10-17-member-graphics-integration/pr205-focused.log new file mode 100644 index 0000000..3009e7b --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/pr205-focused.log @@ -0,0 +1,14 @@ + +> dealt-slide-mvp@1.0.0 test +> vitest run src/components/encounter/__tests__/UnifiedEncounterScene.presentation.test.ts src/components/encounter/__tests__/UnifiedEncounterLog.test.tsx + + + RUN v2.1.9 /home/ubuntu/projects/slide-nightfall-proof/frontend + + ✓ src/components/encounter/__tests__/UnifiedEncounterScene.presentation.test.ts (5 tests) 15ms + ✓ src/components/encounter/__tests__/UnifiedEncounterLog.test.tsx (2 tests) 88ms + + Test Files 2 passed (2) + Tests 7 passed (7) + Start at 17:51:21 + Duration 2.53s (transform 604ms, setup 245ms, collect 868ms, tests 104ms, environment 1.89s, prepare 201ms) diff --git a/docs/evidence/2026-10-17-member-graphics-integration/pr205-validate.log b/docs/evidence/2026-10-17-member-graphics-integration/pr205-validate.log new file mode 100644 index 0000000..9a3a074 --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/pr205-validate.log @@ -0,0 +1,1186 @@ + +> dealt-slide-mvp@1.0.0 validate +> npm run lint && npm run typecheck && npm test && npm run assets:audit && npm run assets:packages + + +> dealt-slide-mvp@1.0.0 lint +> eslint "src/**/*.{ts,tsx}" --report-unused-disable-directives + + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/__tests__/economy-pillar1.test.ts + 7:32 warning 'beforeEach' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/__tests__/idempotency.test.ts + 7:32 warning 'beforeEach' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/__tests__/lasOlasReliability.test.tsx + 10:10 warning 'useDrugInventory' is defined but never used @typescript-eslint/no-unused-vars + 11:10 warning 'useBlockLoopStore' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/alchemy/AlchemyLab.tsx + 11:15 warning 'BaseElement' is defined but never used @typescript-eslint/no-unused-vars + 11:28 warning 'CraftedDrug' is defined but never used @typescript-eslint/no-unused-vars + 11:41 warning 'AlchemyRecipe' is defined but never used @typescript-eslint/no-unused-vars + 102:11 warning 'player' is assigned a value but never used @typescript-eslint/no-unused-vars + 102:19 warning 'updateMoney' is assigned a value but never used @typescript-eslint/no-unused-vars + 277:6 warning React Hook useCallback has missing dependencies: 'addInventoryItem' and 'addNotification'. Either include them or remove the dependency array react-hooks/exhaustive-deps + 285:9 warning 'discoveredRecipes' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/block/DrugAssignmentPanel.tsx + 347:54 warning React Hook useMemo has an unnecessary dependency: 'inventory'. Either exclude it or remove the dependency array react-hooks/exhaustive-deps + 351:62 warning React Hook useMemo has unnecessary dependencies: 'assignments' and 'inventory'. Either exclude them or remove the dependency array react-hooks/exhaustive-deps + 352:58 warning React Hook useMemo has unnecessary dependencies: 'assignments' and 'inventory'. Either exclude them or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/casino/Casino.tsx + 5:18 warning 'AnimatePresence' is defined but never used @typescript-eslint/no-unused-vars + 315:6 warning React Hook useCallback has missing dependencies: 'PAYOUTS' and 'SYMBOLS'. Either include them or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/cocaine-crush/CocaineCrush.tsx + 30:11 warning 'player' is assigned a value but never used @typescript-eslint/no-unused-vars + 66:9 warning 'availableDrugs' is assigned a value but never used @typescript-eslint/no-unused-vars + 260:17 warning 'validatedMatches' is assigned a value but never used @typescript-eslint/no-unused-vars + 320:6 warning React Hook useCallback has a missing dependency: 'commitSession'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/common/GameSprite.tsx + 22:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 29:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 36:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 41:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 45:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 49:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 56:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 66:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 70:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 74:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 79:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 122:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 130:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 142:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 152:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 281:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 288:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 296:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 304:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/compliance/AgeGate.tsx + 11:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 16:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 25:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 29:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/contacts/ContactProfile.tsx + 11:3 warning 'useEconomyStore' is defined but never used @typescript-eslint/no-unused-vars + 231:9 warning 'equippedClothing' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/contacts/Contacts.tsx + 20:100 warning 'calculateHospitalImpact' is defined but never used @typescript-eslint/no-unused-vars + 22:36 warning 'MemberStatus' is defined but never used @typescript-eslint/no-unused-vars + 37:57 warning 'killMember' is assigned a value but never used @typescript-eslint/no-unused-vars + 39:11 warning 'uploads' is assigned a value but never used @typescript-eslint/no-unused-vars + 285:42 warning 'memberId' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 527:30 warning 'memberId' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 659:9 warning 'bailCost' is assigned a value but never used @typescript-eslint/no-unused-vars + 724:7 warning 'RANK_TITLES' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/contacts/LevelUpPopup.tsx + 27:7 warning 'RANK_TITLES' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/contacts/RoleContactCard.tsx + 40:14 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 99:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 104:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/dealt-v2/DealtSpeed.tsx + 8:51 warning 'useMemo' is defined but never used @typescript-eslint/no-unused-vars + 10:46 warning 'useEconomyStore' is defined but never used @typescript-eslint/no-unused-vars + 61:7 warning 'UNIT_CONVERSIONS' is assigned a value but never used @typescript-eslint/no-unused-vars + 67:7 warning 'UNIT_LABELS' is assigned a value but never used @typescript-eslint/no-unused-vars + 143:11 warning 'player' is assigned a value but never used @typescript-eslint/no-unused-vars + 161:6 warning React Hook useEffect has a missing dependency: 'nextDeal'. Either include it or remove the dependency array react-hooks/exhaustive-deps + 181:6 warning React Hook useEffect has a missing dependency: 'handleTimeout'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/dealt-v2/DealtSymptoms.tsx + 8:51 warning 'useMemo' is defined but never used @typescript-eslint/no-unused-vars + 10:61 warning 'useEconomyStore' is defined but never used @typescript-eslint/no-unused-vars + 71:46 warning 'level' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 116:11 warning 'streak' is assigned a value but never used @typescript-eslint/no-unused-vars + 116:19 warning 'completeDeal' is assigned a value but never used @typescript-eslint/no-unused-vars + 131:6 warning React Hook useEffect has a missing dependency: 'nextClient'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/dealt/DealtMode.tsx + 40:6 warning React Hook useEffect has missing dependencies: 'currentClient', 'currentOutcome', and 'generateNewClient'. Either include them or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/driveby/DriveByEngine.tsx + 422:6 warning React Hook useCallback has a missing dependency: 'playSound'. Either include it or remove the dependency array react-hooks/exhaustive-deps + 922:6 warning React Hook useEffect has missing dependencies: 'render' and 'targets.length'. Either include them or remove the dependency array react-hooks/exhaustive-deps + 926:11 warning 'block' is assigned a value but never used @typescript-eslint/no-unused-vars + 1165:6 warning React Hook useCallback has unnecessary dependencies: 'ammo', 'carHealth', 'heat', and 'score'. Either exclude them or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/economy/MarketMembers.tsx + 147:6 warning React Hook useCallback has a missing dependency: 'maxMembers'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/gang/GangMemberCard.tsx + 8:3 warning 'Heart' is defined but never used @typescript-eslint/no-unused-vars + 9:3 warning 'Target' is defined but never used @typescript-eslint/no-unused-vars + 10:3 warning 'Brain' is defined but never used @typescript-eslint/no-unused-vars + 11:3 warning 'Zap' is defined but never used @typescript-eslint/no-unused-vars + 12:3 warning 'Shield' is defined but never used @typescript-eslint/no-unused-vars + 13:3 warning 'Star' is defined but never used @typescript-eslint/no-unused-vars + 14:3 warning 'ChevronRight' is defined but never used @typescript-eslint/no-unused-vars + 15:3 warning 'Skull' is defined but never used @typescript-eslint/no-unused-vars + 16:3 warning 'AlertTriangle' is defined but never used @typescript-eslint/no-unused-vars + 17:3 warning 'Clock' is defined but never used @typescript-eslint/no-unused-vars + 18:3 warning 'TrendingUp' is defined but never used @typescript-eslint/no-unused-vars + 19:3 warning 'Award' is defined but never used @typescript-eslint/no-unused-vars + 20:3 warning 'Crosshair' is defined but never used @typescript-eslint/no-unused-vars + 22:3 warning 'MoreVertical' is defined but never used @typescript-eslint/no-unused-vars + 25:3 warning 'Flame' is defined but never used @typescript-eslint/no-unused-vars + 27:40 warning 'CityRegion' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/gang/MemberCreation.tsx + 72:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/graffiti/GraffitiGame.tsx + 7:46 warning 'useCallback' is defined but never used @typescript-eslint/no-unused-vars + 9:81 warning 'generateAllGraffitiOptions' is defined but never used @typescript-eslint/no-unused-vars + 10:50 warning 'GraffitiMember' is defined but never used @typescript-eslint/no-unused-vars + 10:66 warning 'GangProfile' is defined but never used @typescript-eslint/no-unused-vars + 318:6 warning React Hook useEffect has a missing dependency: 'checkForEncounters'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/OSShell.tsx + 52:61 warning 'incomePerMinute' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/RaidEventOverlay.tsx + 46:10 warning '_showBail' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/map/BlockModeView.tsx + 220:6 warning React Hook useCallback has an unnecessary dependency: 'player.bankBalance'. Either exclude it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/map/BlockOverlay.tsx + 34:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + 46:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/map/ClaimBlockModal.tsx + 19:58 warning 'reset' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/map/DrugAssignmentPanel.tsx + 96:61 warning React Hook useMemo has a missing dependency: 'drugStore'. Either include it or remove the dependency array react-hooks/exhaustive-deps + 110:6 warning React Hook useMemo has a missing dependency: 'drugStore'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/map/NPCPanel.tsx + 15:8 warning 'NPCMember' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/map/PlayableMap.tsx + 198:6 warning React Hook useEffect has missing dependencies: 'center', 'mode', and 'zoom'. Either include them or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/map/TacticalPlacementOverlay.tsx + 38:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/map/__tests__/DrugAssignmentPanel.test.ts + 7:32 warning 'beforeEach' is defined but never used @typescript-eslint/no-unused-vars + 7:44 warning 'vi' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/missions/Missions.tsx + 44:6 warning React Hook useEffect has a missing dependency: 'missions.length'. Either include it or remove the dependency array react-hooks/exhaustive-deps + 61:6 warning React Hook useEffect has a missing dependency: 'handleMissionComplete'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/onboarding/Onboarding.tsx + 41:11 warning 'player' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/settings/SettingsPage.tsx + 10:3 warning 'useEconomyStore' is defined but never used @typescript-eslint/no-unused-vars + 11:3 warning 'useDealtStore' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/slide/BlockDriveByEngine.tsx + 149:5 warning React Hook useCallback has a missing dependency: 'resolveEvent'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/slide/CanvasStreetRenderer.tsx + 5:3 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/slide/CanvasStreetRendererV3.tsx + 17:8 warning 'ImpactSurfaceKind' is defined but never used @typescript-eslint/no-unused-vars + 133:7 warning 'MEMBER_RENDER_HEIGHT' is assigned a value but never used @typescript-eslint/no-unused-vars + 236:10 warning 'memberRenderPoint' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/slide/FPSOverlay.tsx + 288:14 warning The ref value 'gunRef.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 'gunRef.current' to a variable inside the effect, and use that variable in the cleanup function react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/slide/SlideGame.tsx + 15:10 warning 'soundManager' is defined but never used @typescript-eslint/no-unused-vars + 32:8 warning 'SlidePhase' is defined but never used @typescript-eslint/no-unused-vars + 123:11 warning 'player' is assigned a value but never used @typescript-eslint/no-unused-vars + 124:11 warning 'members' is assigned a value but never used @typescript-eslint/no-unused-vars + 408:9 warning 'newDefenders' is never reassigned. Use 'const' instead prefer-const + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/slide/SlidePhaser3Scene.ts + 38:3 warning 'GRID_WIDTH' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.tsx + 29:14 warning Fast refresh only works when a file only exports components. Move your React context(s) to a separate file react-refresh/only-export-components + 60:17 warning Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components react-refresh/only-export-components + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/topdown/BipNDipGame.tsx + 136:6 warning React Hook useEffect has a missing dependency: 'session.footChase'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/topdown/PhaserTopDownBlock.tsx + 110:6 warning React Hook useEffect has a missing dependency: 'block'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/topdown/PoliceRaidGame.tsx + 97:6 warning React Hook useEffect has a missing dependency: 'raidState'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/topdown/TopDownShooter.tsx + 9:40 warning 'useEffect' is defined but never used @typescript-eslint/no-unused-vars + 9:51 warning 'useRef' is defined but never used @typescript-eslint/no-unused-vars + 15:3 warning 'useEconomyStore' is defined but never used @typescript-eslint/no-unused-vars + 18:15 warning 'GangMember' is defined but never used @typescript-eslint/no-unused-vars + 18:27 warning 'InventoryItem' is defined but never used @typescript-eslint/no-unused-vars + 119:7 warning 'RELOAD_COST' is assigned a value but never used @typescript-eslint/no-unused-vars + 183:43 warning 'gangColor' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 248:11 warning 'player' is assigned a value but never used @typescript-eslint/no-unused-vars + 249:32 warning 'updateMember' is assigned a value but never used @typescript-eslint/no-unused-vars + 250:11 warning 'addNotification' is assigned a value but never used @typescript-eslint/no-unused-vars + 277:10 warning 'showCommandPanel' is assigned a value but never used @typescript-eslint/no-unused-vars + 277:28 warning 'setShowCommandPanel' is assigned a value but never used @typescript-eslint/no-unused-vars + 288:9 warning 'assignedMembers' is assigned a value but never used @typescript-eslint/no-unused-vars + 584:6 warning React Hook useCallback has an unnecessary dependency: 'defenders'. Either exclude it or remove the dependency array react-hooks/exhaustive-deps + 658:6 warning React Hook useCallback has a missing dependency: 'endCombat'. Either include it or remove the dependency array react-hooks/exhaustive-deps + 663:6 warning React Hook useCallback has a missing dependency: 'endCombat'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/hooks/useApi.ts + 83:5 warning React Hook useCallback has a missing dependency: 'options'. Either include it or remove the dependency array react-hooks/exhaustive-deps + 95:6 warning React Hook useEffect has missing dependencies: 'execute', 'method', and 'options.immediate'. Either include them or remove the dependency array react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/hooks/useBlockClaim.ts + 124:41 warning 'gangName' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 210:29 warning 'userId' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/hooks/useBlockSatellite.ts + 114:20 warning The ref value 'requestIdRef.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 'requestIdRef.current' to a variable inside the effect, and use that variable in the cleanup function react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/hooks/useBlockSync.ts + 131:36 warning The ref value 'debounceTimers.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 'debounceTimers.current' to a variable inside the effect, and use that variable in the cleanup function react-hooks/exhaustive-deps + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/services/apiClient.ts + 247:39 warning 'newToken' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/services/combatService.ts + 12:3 warning 'Vehicle' is defined but never used @typescript-eslint/no-unused-vars + 15:3 warning 'UNIT_STATS' is defined but never used @typescript-eslint/no-unused-vars + 16:3 warning 'VEHICLE_STATS' is defined but never used @typescript-eslint/no-unused-vars + 19:3 warning 'isPositionValid' is defined but never used @typescript-eslint/no-unused-vars + 21:3 warning 'isAdjacent' is defined but never used @typescript-eslint/no-unused-vars + 262:38 warning 'defender' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 266:41 warning 'defender' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/services/location.service.ts + 10:3 warning 'buildBlockBounds' is defined but never used @typescript-eslint/no-unused-vars + 12:3 warning 'isInServiceArea' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/services/supabase.ts + 799:26 warning 'region' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/stores/authStore.ts + 98:25 warning 'authData' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/stores/blockStore.ts + 15:3 warning 'DriveByEvent' is defined but never used @typescript-eslint/no-unused-vars + 587:32 warning '_removed' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/stores/combatStore.ts + 12:3 warning 'CombatOutcome' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/stores/gameStore.ts + 13:3 warning 'CombatSession' is defined but never used @typescript-eslint/no-unused-vars + 14:3 warning 'Drug' is defined but never used @typescript-eslint/no-unused-vars + 15:3 warning 'Recipe' is defined but never used @typescript-eslint/no-unused-vars + 19:3 warning 'Mission' is defined but never used @typescript-eslint/no-unused-vars + 43:11 warning 'get' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 402:13 warning 'get' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/stores/npcStore.ts + 289:13 warning 'get' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/utils/ImpactEngine.ts + 377:11 warning 'life' is never reassigned. Use 'const' instead prefer-const + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/utils/PerformanceManager.ts + 399:11 warning 'clampedDelta' is assigned a value but never used @typescript-eslint/no-unused-vars + 492:32 warning 'priority' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/utils/__tests__/bailHospitalSystem.test.ts + 24:8 warning 'RecoveryKind' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/utils/alchemyEngine.ts + 8:3 warning 'CraftedDrug' is defined but never used @typescript-eslint/no-unused-vars + 10:3 warning 'CraftingSession' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/utils/combatResolver.ts + 12:3 warning 'CombatEventResult' is defined but never used @typescript-eslint/no-unused-vars + 286:44 warning 'attacker' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + 347:31 warning 'route' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/utils/dealtEngine.ts + 387:9 warning Unexpected lexical declaration in case block no-case-declarations + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/utils/gameLoopEngine.ts + 16:3 warning 'HEAT_CONFIG' is defined but never used @typescript-eslint/no-unused-vars + 25:62 warning 'ODEvent' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/utils/graffitiEngine.ts + 91:53 warning 'secondary' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/utils/gridFactory.ts + 12:3 warning 'MicroCoord' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/utils/gridGenerator.ts + 19:3 warning 'TileGenerationContext' is defined but never used @typescript-eslint/no-unused-vars + 24:10 warning 'getCityConfig' is defined but never used @typescript-eslint/no-unused-vars + 325:13 warning 'gridHeight' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/utils/moraleSystem.ts + 92:3 warning 'rng' is assigned a value but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/utils/turnLogic.ts + 1:33 warning 'macroToMicroRegion' is defined but never used @typescript-eslint/no-unused-vars + 29:3 warning 'rng' is defined but never used. Allowed unused args must match /^_/u @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/utils/vehicleEngine.ts + 15:3 warning 'VEHICLE_SEAT_CONFIGS' is defined but never used @typescript-eslint/no-unused-vars + 18:8 warning 'VehicleSeatConfig' is defined but never used @typescript-eslint/no-unused-vars + +/home/ubuntu/projects/slide-nightfall-proof/frontend/src/utils/weaponSystem.ts + 12:8 warning 'ShooterTier' is defined but never used @typescript-eslint/no-unused-vars + +✖ 200 problems (0 errors, 200 warnings) + 0 errors and 2 warnings potentially fixable with the `--fix` option. + + +> dealt-slide-mvp@1.0.0 typecheck +> tsc --noEmit + + +> dealt-slide-mvp@1.0.0 test +> vitest run + + + RUN v2.1.9 /home/ubuntu/projects/slide-nightfall-proof/frontend + + ✓ src/utils/__tests__/blockMappers.test.ts (16 tests) 68ms + ✓ src/__tests__/idempotency.test.ts (18 tests) 52ms + ✓ src/__tests__/lasOlasReliability.test.tsx (30 tests | 4 skipped) 92ms + ✓ src/stores/blockStore.encounter.test.ts (20 tests) 1426ms +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > hands a geocoded AddressResult through CarCrew and into a coordinate-seeded scene +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > pre-fills a target locked from the Maps recon pin +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + + ✓ src/stores/__tests__/mostWantedStore.test.ts (48 tests) 72ms +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > labels the offline text fallback and hands a text-seed target when no geocoder result is chosen +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > two coordinate-distinct autocomplete picks produce distinct scenes +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + + ✓ src/components/raid/__tests__/policeRaid.test.ts (42 tests) 80ms + ✓ src/utils/__tests__/ghostCrewEngine.test.ts (29 tests) 94ms + ✓ src/utils/__tests__/policeRaidEngine.test.ts (46 tests) 32ms +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > two coordinate-distinct autocomplete picks produce distinct scenes +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + + ✓ src/game/loop/__tests__/blockLoop.test.ts (18 tests) 52ms + ✓ src/components/driveby/__tests__/carCrewTarget.test.tsx (12 tests) 4533ms + ✓ CarCrewSelector → street handoff (#108) > hands a geocoded AddressResult through CarCrew and into a coordinate-seeded scene 1602ms + ✓ CarCrewSelector → street handoff (#108) > two coordinate-distinct autocomplete picks produce distinct scenes 1610ms +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > offers dealer, recruit, shooter and driver as drivers, but only shooters as passengers +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > lets a shooter drive without counting them as the passenger shooter +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > refuses a now-injured or changed-role passenger before launch +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > shows the member portrait first, and labels role art when identity is missing +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > visibly labels role art when a stored personal portrait fails to load +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > shows actual carried inventory and core member stats without inventing a weapon or cash +Not implemented: Window's scrollTo() method + +stderr | src/components/driveby/__tests__/carCrewTarget.test.tsx > CarCrewSelector → street handoff (#108) > does not invent full health or gear when the roster has no health record +Not implemented: Window's scrollTo() method + + ✓ src/stores/__tests__/getBackStore.test.ts (43 tests) 31ms + ✓ src/utils/__tests__/bailHospitalSystem.test.ts (59 tests) 52ms + ✓ src/stores/__tests__/ghostCrewStore.test.ts (11 tests) 91ms + ✓ src/render/__tests__/projection.test.ts (40 tests) 57ms + ✓ src/utils/__tests__/blockDNAResolver.test.ts (16 tests) 61ms + ✓ src/utils/__tests__/marketMembersCatalog.test.ts (44 tests) 57ms + ✓ src/stores/__tests__/rivalStripDefense.test.ts (11 tests) 53ms + ✓ src/components/topdown/__tests__/bipNDipGame.test.ts (27 tests) 56ms + ✓ src/utils/__tests__/blockDNALegacyContract.test.ts (20 tests) 46ms + ✓ src/render/__tests__/dioramaAdapter.test.ts (9 tests) 45ms + ✓ src/game/combat/__tests__/combatSession.test.ts (11 tests) 37ms + ✓ src/render/__tests__/worldActorResolver.test.ts (25 tests) 30ms + ✓ src/__tests__/economy-pillar1.test.ts (14 tests) 22ms + ✓ src/stores/__tests__/blockLoopShiftStore.test.tsx (9 tests) 1235ms + ✓ Strip shifts through the shared stores > offers the next shift from the desk once the recovery is decided 836ms + ✓ src/game/loop/__tests__/blockLoopShifts.test.ts (9 tests) 77ms + ✓ src/utils/__tests__/blockDNAReloadIdentity.test.ts (7 tests) 73ms + ✓ src/game/combat/__tests__/CombatSessionController.test.ts (8 tests) 15ms + ✓ src/render/__tests__/proceduralDriveBy.test.ts (16 tests) 40ms + ✓ src/components/gang/__tests__/PhotoMemberCreator.test.tsx (5 tests) 1345ms + ✓ PhotoMemberCreator > identifies stock offline previews without claiming the photo was generated 481ms + ✓ src/components/encounter/__tests__/UnifiedEncounterScene.presentation.test.ts (5 tests) 26ms + ✓ src/stores/__tests__/npcStore.test.ts (14 tests) 22ms + ✓ src/game/combat/__tests__/aimedFire.test.ts (5 tests) 10ms + ✓ src/__tests__/betaGate.smoke.test.ts (12 tests) 343ms + ✓ src/config/__tests__/blockDNA.test.ts (23 tests) 129ms + ✓ src/hooks/__tests__/useBlockSync.test.tsx (5 tests) 268ms + ✓ src/components/tutorial/TutorialOverlay.test.tsx (4 tests) 471ms + ✓ src/utils/__tests__/memberXpWiring.test.ts (18 tests) 9ms + ✓ src/components/layout/BlockLoopDesk.test.tsx (8 tests) 2008ms + ✓ BlockLoopDesk > shows the dealer, shooter, block, product, money, and heat on the strip 399ms + ✓ BlockLoopDesk > rejects a street cell and places a curb dealer with a visible income/exposure split 605ms + ✓ BlockLoopDesk > runs a deal receipt then books a deterministic wound 884ms + ✓ src/stores/__tests__/blockLoopStore.test.ts (5 tests) 72ms + ✓ src/utils/__tests__/shoeboxAnalytics.test.ts (6 tests) 28ms + ✓ src/components/gang/__tests__/MemberProgressPanel.test.ts (18 tests) 16ms + ✓ src/components/map/PlayableMap.test.tsx (6 tests) 514ms + ✓ src/components/topdown/__tests__/blockTopDownCoords.test.ts (18 tests) 21ms + ✓ src/components/slide/__tests__/v3Projection.test.ts (16 tests) 9ms + ✓ src/components/graffiti/__tests__/graffitiWiring.test.ts (14 tests) 14ms + ✓ src/services/worldPersistence.service.test.ts (6 tests) 9ms + ✓ src/game/assets/__tests__/assetPackages.test.ts (4 tests) 10ms +stderr | src/__tests__/betaOnePath.test.tsx > Las Olas closed-beta one path > walks the seeded Las Olas desk from lock through deal, wound, and reload-safe books +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) +Warning: An update to BlockLoopDesk inside a test was not wrapped in act(...). + +When testing, code that causes React state updates should be wrapped into act(...): + +act(() => { + /* fire events that update state */ +}); +/* assert on the output */ + +This ensures that you're testing the behavior the user would see in the browser. Learn more at https://reactjs.org/link/wrap-tests-with-act + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) + + ✓ src/__tests__/betaOnePath.test.tsx (4 tests) 2344ms + ✓ Las Olas closed-beta one path > does not treat a missing local acknowledgement as 18+ just because this is a demo build 734ms + ✓ Las Olas closed-beta one path > walks the seeded Las Olas desk from lock through deal, wound, and reload-safe books 1277ms + ✓ Las Olas closed-beta one path > puts the Las Olas run CTA above city briefing on the command desktop 325ms + ✓ src/game/combat/__tests__/portableContracts.test.ts (3 tests) 6ms + ✓ src/components/map/__tests__/DrugAssignmentPanel.test.ts (11 tests) 28ms + ✓ src/components/map/GhostThreatBanner.test.tsx (5 tests) 767ms + ✓ GhostThreatBanner > routes an open Strip attack to the Strip 500ms + ✓ src/utils/__tests__/driveByTarget.test.ts (11 tests) 12ms + ✓ src/components/layout/CityBriefing.test.tsx (6 tests) 314ms + ✓ src/components/map/TacticalDiorama.test.tsx (4 tests) 1066ms + ✓ TacticalDiorama player path > renders the Las Olas street plate with cover, street, crew, objective, and extraction 382ms + ✓ src/components/encounter/__tests__/UnifiedEncounterLog.test.tsx (2 tests) 159ms + ✓ src/components/cocaine-crush/__tests__/cocaineCrush.test.ts (11 tests) 25ms +stderr | src/services/blockPersistence.service.test.ts > blockPersistence.service authoritative projection > does not fall through to an unguarded upsert when the server rejects a stale projection +[BlockPersistence] Skipped stale block projection after a newer encounter result. + + ✓ src/services/blockPersistence.service.test.ts (4 tests) 15ms + ✓ src/components/slide/__tests__/phaserBridge.test.ts (21 tests) 19ms + ✓ src/config/__tests__/blockDNACatalogExport.test.ts (6 tests) 128ms + ✓ src/components/map/__tests__/NPCThreatBanner.test.tsx (5 tests) 449ms +stderr | src/components/system/RouteLoadBoundary.test.tsx > RouteLoadBoundary > shows recovery UI and keeps the fallback board when a heavy surface fails +Error: WebGL unavailable + at Boom (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.test.tsx:7:9) + at renderWithHooks (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:15486:18) + at mountIndeterminateComponent (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:20103:13) + at beginWork (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:21626:16) + at HTMLUnknownElement.callCallback (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:4164:14) + at HTMLUnknownElement.callTheUserObjectsOperation (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/generated/idl/EventListener.js:26:30) + at innerInvokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:360:16) + at invokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:296:3) + at HTMLUnknownElementImpl._dispatch (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:243:9) + at HTMLUnknownElementImpl.dispatchEvent (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:114:17) +Error: WebGL unavailable + at Boom (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.test.tsx:7:9) + at renderWithHooks (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:15486:18) + at mountIndeterminateComponent (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:20103:13) + at beginWork (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:21626:16) + at HTMLUnknownElement.callCallback (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:4164:14) + at HTMLUnknownElement.callTheUserObjectsOperation (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/generated/idl/EventListener.js:26:30) + at innerInvokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:360:16) + at invokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:296:3) + at HTMLUnknownElementImpl._dispatch (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:243:9) + at HTMLUnknownElementImpl.dispatchEvent (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:114:17) +The above error occurred in the component: + + at Boom (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.test.tsx:10:9) + at RouteLoadBoundary (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.tsx:69:1) + +React will try to recreate this component tree from scratch using the error boundary you provided, RouteLoadBoundary. + +stderr | src/components/system/RouteLoadBoundary.test.tsx > RouteLoadBoundary > retries and remounts children after a synchronous render failure +Error: chunk failed + at Flaky (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.test.tsx:37:30) + at renderWithHooks (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:15486:18) + at mountIndeterminateComponent (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:20103:13) + at beginWork (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:21626:16) + at HTMLUnknownElement.callCallback (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:4164:14) + at HTMLUnknownElement.callTheUserObjectsOperation (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/generated/idl/EventListener.js:26:30) + at innerInvokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:360:16) + at invokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:296:3) + at HTMLUnknownElementImpl._dispatch (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:243:9) + at HTMLUnknownElementImpl.dispatchEvent (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:114:17) +Error: chunk failed + at Flaky (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.test.tsx:37:30) + at renderWithHooks (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:15486:18) + at mountIndeterminateComponent (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:20103:13) + at beginWork (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:21626:16) + at HTMLUnknownElement.callCallback (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:4164:14) + at HTMLUnknownElement.callTheUserObjectsOperation (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/generated/idl/EventListener.js:26:30) + at innerInvokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:360:16) + at invokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:296:3) + at HTMLUnknownElementImpl._dispatch (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:243:9) + at HTMLUnknownElementImpl.dispatchEvent (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:114:17) +The above error occurred in the component: + + at Flaky (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.test.tsx:54:30) + at RouteLoadBoundary (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.tsx:69:1) + +React will try to recreate this component tree from scratch using the error boundary you provided, RouteLoadBoundary. + +stderr | src/components/system/RouteLoadBoundary.test.tsx > RouteLoadBoundary > retries a rejected React.lazy import with a fresh loader attempt +Error: Failed to fetch dynamically imported module + at /home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.test.tsx:58:31 + at /home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.tsx:77:11 + at processTicksAndRejections (node:internal/process/task_queues:104:5) +Error: Failed to fetch dynamically imported module + at /home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.test.tsx:58:31 + at /home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.tsx:77:11 + at processTicksAndRejections (node:internal/process/task_queues:104:5) +The above error occurred in the component: + + at RetryableLazy (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.tsx:36:43) + at Suspense + at RouteLoadBoundary (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.tsx:69:1) + at LazyRoute (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.tsx:148:3) + +React will try to recreate this component tree from scratch using the error boundary you provided, RouteLoadBoundary. + + ✓ src/components/system/RouteLoadBoundary.test.tsx (4 tests) 383ms + ✓ src/components/map/__tests__/playableMapGeometry.test.ts (3 tests) 6ms + ✓ src/utils/__tests__/BulletCamEngine.test.ts (5 tests) 12ms + ✓ src/hooks/useGhostCrewSync.test.tsx (3 tests) 237ms +stderr | src/components/layout/BlockLoopDesk.fallback.test.tsx > BlockLoopDesk diorama fallback board > advances loop placement from a fallback board cell click +Error: WebGL unavailable + at default (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.fallback.test.tsx:4:11) + at renderWithHooks (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:15486:18) + at mountIndeterminateComponent (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:20103:13) + at beginWork (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:21626:16) + at HTMLUnknownElement.callCallback (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:4164:14) + at HTMLUnknownElement.callTheUserObjectsOperation (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/generated/idl/EventListener.js:26:30) + at innerInvokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:360:16) + at invokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:296:3) + at HTMLUnknownElementImpl._dispatch (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:243:9) + at HTMLUnknownElementImpl.dispatchEvent (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:114:17) +Error: WebGL unavailable + at default (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.fallback.test.tsx:4:11) + at renderWithHooks (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:15486:18) + at mountIndeterminateComponent (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:20103:13) + at beginWork (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:21626:16) + at HTMLUnknownElement.callCallback (/home/ubuntu/projects/slide/frontend/node_modules/react-dom/cjs/react-dom.development.js:4164:14) + at HTMLUnknownElement.callTheUserObjectsOperation (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/generated/idl/EventListener.js:26:30) + at innerInvokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:360:16) + at invokeEventListeners (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:296:3) + at HTMLUnknownElementImpl._dispatch (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:243:9) + at HTMLUnknownElementImpl.dispatchEvent (/home/ubuntu/projects/slide/frontend/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:114:17) +The above error occurred in the component: + + at default (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.fallback.test.tsx:4:11) + at RouteLoadBoundary (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/system/RouteLoadBoundary.tsx:69:1) + at section + at div + at BlockLoopDesk (/home/ubuntu/projects/slide-nightfall-proof/frontend/src/components/layout/BlockLoopDesk.tsx:72:56) + +React will try to recreate this component tree from scratch using the error boundary you provided, RouteLoadBoundary. + + ✓ src/components/layout/BlockLoopDesk.fallback.test.tsx (1 test) 916ms + ✓ BlockLoopDesk diorama fallback board > advances loop placement from a fallback board cell click 914ms +stderr | src/components/topdown/__tests__/TopDownShooter.launch.test.tsx > TopDownShooter empty seats > stays disabled when the passenger cannot shoot, then enables for a shooter +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method +Not implemented: Window's scrollTo() method + + ✓ src/components/topdown/__tests__/TopDownShooter.launch.test.tsx (2 tests) 505ms + ✓ TopDownShooter empty seats > keeps Launch Attack disabled while the driver and shooter seats are empty 341ms + ✓ src/__tests__/routePerformance.contract.test.ts (6 tests) 8ms + ✓ src/components/missions/__tests__/AttackPlanner.launch.test.tsx (2 tests) 346ms + ✓ src/types/contracts/blockScene.test.ts (3 tests) 5ms + ✓ src/utils/__tests__/bulletCamTrigger.test.ts (6 tests) 5ms + ✓ src/components/map/BlockModeView.test.tsx (1 test) 302ms + ✓ BlockModeView beta chrome > keeps diorama, board, and encounter as the only Strip tabs and forwards map failure 300ms + ✓ src/hooks/__tests__/useBlockSatellite.test.ts (7 tests) 6ms + ✓ src/utils/__tests__/nearbyBlocks.test.ts (4 tests) 9ms + ✓ src/components/contacts/__tests__/Contacts.test.tsx (1 test) 359ms + ✓ Contacts photo recruit detail > shows the generated photo recruit backstory in the contact profile 357ms + ✓ src/components/phone/__tests__/PhoneApp.test.tsx (2 tests) 365ms + ✓ src/components/compliance/AgeGate.test.tsx (5 tests) 507ms + ✓ AgeGate demo evaluation chrome > shows the mature-content gate and evaluation banner without skipping 18+ 499ms + ✓ src/utils/__tests__/demoSeedBooks.test.ts (2 tests) 11ms + ✓ src/utils/__tests__/demoSeedContacts.test.ts (2 tests) 10ms +stderr | src/services/__tests__/avatarGeneration.service.test.ts > offline photo preview > returns loadable registered stock art for every recruit role +[AvatarService] Backend unavailable, using mock assets. +[AvatarService] Backend unavailable, using mock assets. +[AvatarService] Backend unavailable, using mock assets. +[AvatarService] Backend unavailable, using mock assets. +[AvatarService] Backend unavailable, using mock assets. +[AvatarService] Backend unavailable, using mock assets. +[AvatarService] Backend unavailable, using mock assets. + +stderr | src/services/__tests__/avatarGeneration.service.test.ts > offline photo preview > keeps unrequested outputs absent in the offline preview +[AvatarService] Backend unavailable, using mock assets. + + ✓ src/services/__tests__/avatarGeneration.service.test.ts (2 tests) 12ms + ✓ src/components/hub/Leaderboard.test.tsx (2 tests) 270ms + ✓ src/components/system/StartupErrorBoundary.test.tsx (2 tests) 299ms + ✓ src/utils/__tests__/demoSeedProgress.test.ts (2 tests) 10ms + ✓ src/stores/__tests__/notificationStore.test.ts (2 tests) 6ms + ✓ src/utils/authPlayer.test.ts (5 tests) 5ms + ✓ src/utils/__tests__/geo.test.ts (5 tests) 5ms + ✓ src/utils/__tests__/phaserReady.test.ts (3 tests) 5ms + ✓ src/components/layout/__tests__/OSShellBalance.test.tsx (2 tests) 387ms + ✓ command desk authoritative street cash > shows and refreshes the live player balance for account-123 318ms + ✓ src/game/ops/__tests__/opsCoordinates.test.ts (2 tests) 7ms + ✓ src/stores/__tests__/combatIntentStore.test.ts (1 test) 3ms + ✓ src/components/hub/Leaderboard.security.test.ts (1 test) 3ms + ✓ src/__tests__/releasePreflight.test.ts (4 tests) 263ms + ✓ src/__tests__/assetProcessor.test.ts (8 tests) 1462ms + ✓ asset processor incremental imports > retains registered actors when importing a new actor and on a repeated no-op write 313ms + + Test Files 92 passed (92) + Tests 1039 passed | 4 skipped (1043) + Start at 17:53:39 + Duration 43.93s (transform 6.10s, setup 12.46s, collect 24.33s, tests 25.96s, environment 107.94s, prepare 11.44s) + + +> dealt-slide-mvp@1.0.0 assets:audit +> node scripts/assets/audit.mjs + + +SLIDE asset audit +────────────────────────────────────────────────────────────────────── +Assets checked : 112 +Package files : 13 (1.57 MB) +Runtime total : 7.70 MB / 20 MB budget +Errors : 0 +Warnings : 0 + +AUDIT PASSED + +> dealt-slide-mvp@1.0.0 assets:packages +> node scripts/assets/validate-packages.mjs + +Asset package validation passed: 5 package(s), 4 schema(s). diff --git a/docs/evidence/2026-10-17-member-graphics-integration/qa-player-path.mjs b/docs/evidence/2026-10-17-member-graphics-integration/qa-player-path.mjs new file mode 100644 index 0000000..e5cac08 --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/qa-player-path.mjs @@ -0,0 +1,153 @@ +// Run with Node 24 and playwright-core available in QA_NODE_MODULES. +// Usage: QA_NODE_MODULES=/path/node_modules node qa-player-path.mjs ORIGIN OUTPUT LABEL [fail-images] +// Serves no app, modifies no game code, and never writes stores or dispatches engine commands. +// Only player controls/taps mutate the isolated local demo. React refs are inspected read-only. +import { createRequire } from 'node:module'; +import fs from 'node:fs/promises'; +import path from 'node:path'; +const require = createRequire(path.resolve(process.env.QA_NODE_MODULES, '../package.json')); +const { chromium } = require('playwright-core'); +const [origin, output, label, failureFlag] = process.argv.slice(2); +if (!/^http:\/\/(127\.0\.0\.1|localhost):\d+$/.test(origin ?? '')) throw new Error('Local demo origin required'); +await fs.mkdir(output, { recursive: true }); +const browser = await chromium.launch({ executablePath: process.env.CHROMIUM_PATH || '/usr/bin/chromium', headless: true, args: ['--no-sandbox', '--disable-dev-shm-usage'] }); +const reports = []; +for (const viewport of [{width:390,height:844}, {width:1440,height:900}]) { + const suffix = `${label}-${viewport.width}x${viewport.height}`; + const report = { label, origin, viewport, imageFailure: failureFlag === 'fail-images', checks: [], screenshots: [], pageErrors: [], consoleErrors: [], failedRequests: [], snapshots: [] }; + const context = await browser.newContext({ viewport, deviceScaleFactor: 1, isMobile: viewport.width === 390, hasTouch: viewport.width === 390, reducedMotion: 'reduce' }); + const page = await context.newPage(); + page.on('pageerror', e => report.pageErrors.push(e.message)); + page.on('console', m => { if (m.type() === 'error') report.consoleErrors.push(m.text()); }); + report.httpErrors = []; + page.on('response', r => { if (r.status() >= 400) report.httpErrors.push({url:r.url(),status:r.status()}); }); + page.on('requestfailed', r => report.failedRequests.push({url:r.url(),error:r.failure()?.errorText})); + if (report.imageFailure) await page.route('**/assets/runtime/generated/characters/**', r => r.abort('failed')); + const capture = async name => { + const file = `${suffix}-${name}.png`; + await page.screenshot({ path:path.join(output,file) }); + report.screenshots.push(file); + }; + const observe = () => page.evaluate(() => { + const el = document.querySelector('.unified-encounter'); + if (!el) return null; + const key = Object.keys(el).find(k => k.startsWith('__reactFiber$')); + let fiber = el[key]; + for (let depth=0;fiber && depth<30;fiber=fiber.return,depth++) { + let hook = fiber.memoizedState; + for (let count=0;hook && count<35;hook=hook.next,count++) { + const scene = hook.memoizedState?.current; + if (scene?.session && scene?.actorViews instanceof Map) { + const views = [...scene.actorViews.entries()].map(([id,v]) => ({id,type:v.sprite.type,texture:v.sprite.texture?.key,label:v.label.text})); + return {tick:scene.session.tick,phase:scene.session.phase,selectedCrewId:scene.selectedCrewId,actors:scene.session.combatants,events:scene.session.events,terrain:scene.session.terrain,views,canvas:{width:scene.game.canvas.width,height:scene.game.canvas.height},hud:document.querySelector('.ue-live-stats')?.innerText}; + } + } + } + return { error:'Read-only scene observer unavailable' }; + }); + const checkpoint = async name => { + const state = await observe(); + report.snapshots.push({name,state}); + return state; + }; + const tapCell = async (col,row) => { + const box = await page.locator('.ue-stage canvas').boundingBox(); + const x = box.x + (col+0.5)*box.width/8; + const y = box.y + (86+(row+0.5)*(600-86-72)/8)*box.height/600; + if (viewport.width === 390) await page.touchscreen.tap(x,y); else await page.mouse.click(x,y); + await page.waitForTimeout(100); + }; + try { + await page.goto(`${origin}/?app=block_loop`, {waitUntil:'domcontentloaded'}); + await page.getByRole('button',{name:'I AM 18+ — CONTINUE',exact:true}).click(); + await page.getByTestId('lock-las-olas-crew').click(); + const dismiss = page.getByRole('button',{name:'Dismiss rival activity'}); + if (await dismiss.count()) await dismiss.click(); + await page.waitForTimeout(300); + await capture('strategy-diorama'); + await page.getByRole('button',{name:'Legal board',exact:true}).click(); + await page.locator('.td-cell[aria-label*="1,2"]').click(); + await page.getByRole('button',{name:'Shooter',exact:true}).click(); + await page.locator('.td-cell[aria-label*="4,3"]').click(); + await page.getByTestId('assign-river-cut').click(); + await page.getByTestId('close-the-deal').click(); + await page.getByTestId('enter-slide').click(); + await page.getByRole('button',{name:'Fire nearest',exact:true}).waitFor({state:'visible'}); + await page.waitForFunction(() => !document.querySelector('.ue-action-row button')?.disabled); + let state = await checkpoint('entry'); + if (!state?.actors) throw new Error('Scene observer missing actors'); + await capture('encounter-entry'); + report.checks.push({name:'Named fictional opposition visible',pass:state.views.filter(v=>state.actors.find(a=>a.id===v.id)?.team==='opposition').every(v=>v.label.length>0)}); + report.checks.push({name:report.imageFailure ? 'Failed actor images have named fallback markers' : 'All opposition uses registered character Images, not circles',pass:state.views.filter(v=>state.actors.find(a=>a.id===v.id)?.team==='opposition').every(v=>report.imageFailure ? v.type === 'Arc' && v.label.length>0 : v.type==='Image' && v.texture.includes('/assets/runtime/'))}); + const dre = state.actors.find(a=>a.team==='crew'); + await tapCell(dre.position.x,dre.position.y); + await tapCell(0,2); + state = await checkpoint('dre-move'); + report.checks.push({name:'Actual Dre cell matches rendered destination (0,2)',pass:state.actors.find(a=>a.id===dre.id)?.position.x===0 && state.actors.find(a=>a.id===dre.id)?.position.y===2}); + const rome = state.actors.find(a=>a.team==='crew' && a.id!==dre.id); + await tapCell(rome.position.x,rome.position.y); + await tapCell(4,4); + state = await checkpoint('rome-move'); + report.checks.push({name:'Actual Rome cell matches rendered destination (4,4)',pass:state.actors.find(a=>a.id===rome.id)?.position.x===4 && state.actors.find(a=>a.id===rome.id)?.position.y===4}); + await page.getByRole('button',{name:'Fire nearest',exact:true}).click(); + await page.waitForTimeout(150); + await checkpoint('after-fire'); + await page.getByRole('button',{name:'Reload',exact:true}).click(); + state = await checkpoint('reload-start'); + await capture('reload-hud'); + report.checks.push({name:'Reload command emits real engine event',pass:state.events.some(e=>e.type==='reload-start')}); + if (label !== 'main') report.checks.push({name:'DOM condition shows reloading',pass:state.hud.includes('reloading')}); + for (let wait=0;wait<30;wait++) { + state = await observe(); + if (state.events.some(e=>e.type==='reload-complete')) break; + await page.waitForTimeout(150); + } + state = await checkpoint('reload-complete'); + report.checks.push({name:'Reload finishes through the real engine',pass:state.events.some(e=>e.type==='reload-complete')}); + for (let i=0;i<24 && state.phase==='active' && !state.actors.some(a=>a.team==='opposition' && a.isDown);i++) { + await page.getByRole('button',{name:'Fire nearest',exact:true}).click(); + await page.waitForTimeout(140); + state = await observe(); + const selected = state.actors.find(a=>a.id===state.selectedCrewId); + if (selected?.ammo === 0 && selected.reloadUntilTick === null) { + await page.getByRole('button',{name:'Reload',exact:true}).click(); + await page.waitForTimeout(1100); + } + } + state = await checkpoint('combat-state'); + await capture('combat-state'); + report.checks.push({name:'Real fire event recorded',pass:state.events.some(e=>e.type==='weapon-fired')}); + const downed = state.actors.filter(a=>a.team==='opposition' && a.isDown); + report.checks.push({name:report.imageFailure ? 'Downed opponent retains a named fallback' : 'Downed opponent uses registered downed state',pass:downed.length>0 && downed.every(a=>state.views.some(v=>v.id===a.id && (report.imageFailure ? v.label.length>0 : v.type==='Image' && v.texture.includes('_downed_'))))}); + if (state.phase === 'active') await page.getByRole('button',{name:'Retreat safely',exact:true}).click(); + await page.getByRole('button',{name:'Apply result and return',exact:true}).waitFor(); + await capture('result'); + await page.getByRole('button',{name:'Apply result and return',exact:true}).click(); + await page.getByRole('heading',{name:'Consequence',exact:true}).waitFor(); + await capture('consequence'); + const ledger = await page.evaluate(() => localStorage.getItem('dealt-slide-authoritative-block-loop-v1')); + report.ledgerBeforeReload = ledger; + await page.getByRole('button',{name:'Return to desktop',exact:true}).click(); + await page.waitForTimeout(200); + await capture('returned'); + await page.reload({waitUntil:'domcontentloaded'}); + await page.waitForTimeout(500); + report.ledgerAfterReload = await page.evaluate(() => localStorage.getItem('dealt-slide-authoritative-block-loop-v1')); + const before = ledger ? JSON.parse(ledger) : null; + const after = report.ledgerAfterReload ? JSON.parse(report.ledgerAfterReload) : null; + report.checks.push({name:'Demo result receipt survives reload exactly once',pass:!!before && !!after && before.appliedEncounterKeys?.length===1 && JSON.stringify(before.appliedEncounterKeys)===JSON.stringify(after.appliedEncounterKeys)}); + report.checks.push({name:'Reload preserves booked money, heat, morale, and crew health',pass:!!before && !!after && ['money','playerHeat','blockMorale','crew'].every(k=>Object.hasOwn(before,k) && Object.hasOwn(after,k) && JSON.stringify(before[k])===JSON.stringify(after[k]))}); + report.checks.push({name:'No uncaught page errors',pass:report.pageErrors.length===0}); + await capture('reload-return'); + } catch(e) { + report.error = e.stack; + report.lastScreenText = await page.locator('body').innerText().catch(()=>null); + await capture('failure').catch(()=>{}); + } + reports.push(report); + await fs.writeFile(path.join(output,`${suffix}-report.json`),JSON.stringify(report,null,2)+'\n'); + console.log(JSON.stringify({label,viewport,error:report.error?.split('\n')[0],checks:report.checks,pageErrors:report.pageErrors,consoleErrors:report.consoleErrors.length})); + await context.close(); +} +await browser.close(); +if (reports.some(r=>r.error || r.checks.some(c=>!c.pass))) process.exitCode=1; diff --git a/docs/evidence/2026-10-17-member-graphics-integration/verification-summary.json b/docs/evidence/2026-10-17-member-graphics-integration/verification-summary.json new file mode 100644 index 0000000..6c8dfe5 --- /dev/null +++ b/docs/evidence/2026-10-17-member-graphics-integration/verification-summary.json @@ -0,0 +1,438 @@ +{ + "createdAt": "2026-10-17T17:58:28.218325+00:00", + "decision": "Final-source existing-art integration evidence passed; author/integration review required; final style and launch approval withheld.", + "mainCommit": "9eef5aac28a82275d7a2e1596e8658b167953ed7", + "candidatePR": 205, + "candidateCommit": "9227dc67d0ce174b7960ceaa06f42f865cf84abc", + "candidateSourceChanged": false, + "buildMode": "VITE_DEMO_MODE=1; npm run build; Python static local HTTP servers", + "browser": "Chromium headless phone emulation and desktop; reduced-motion; deviceScaleFactor 1", + "normalAndFailureCandidateChecksPassed": 48, + "baselineNegativeArtFailuresExpected": true, + "runtimeValidation": { + "testsPassed": 1039, + "testsSkipped": 4, + "testFiles": 92, + "lintErrors": 0, + "existingLintWarnings": 200, + "assets": 112, + "runtimeAssetMB": 7.7, + "runtimeBudgetMB": 20, + "assetErrors": 0, + "assetWarnings": 0, + "packages": 5, + "schemas": 4, + "build": "pass" + }, + "reports": [ + { + "report": "main-1440x900-report.json", + "label": "main", + "viewport": { + "width": 1440, + "height": 900 + }, + "checks": 11, + "passed": 9, + "failures": [ + "All opposition uses registered character Images, not circles", + "Downed opponent uses registered downed state" + ], + "uncaughtPageErrors": 0, + "consoleErrors": 3, + "capturedScreenshots": [ + "main-1440x900-strategy-diorama.png", + "main-1440x900-encounter-entry.png", + "main-1440x900-reload-hud.png", + "main-1440x900-combat-state.png", + "main-1440x900-result.png", + "main-1440x900-consequence.png", + "main-1440x900-returned.png", + "main-1440x900-reload-return.png" + ] + }, + { + "report": "main-390x844-report.json", + "label": "main", + "viewport": { + "width": 390, + "height": 844 + }, + "checks": 11, + "passed": 9, + "failures": [ + "All opposition uses registered character Images, not circles", + "Downed opponent uses registered downed state" + ], + "uncaughtPageErrors": 0, + "consoleErrors": 4, + "capturedScreenshots": [ + "main-390x844-strategy-diorama.png", + "main-390x844-encounter-entry.png", + "main-390x844-reload-hud.png", + "main-390x844-combat-state.png", + "main-390x844-result.png", + "main-390x844-consequence.png", + "main-390x844-returned.png", + "main-390x844-reload-return.png" + ] + }, + { + "report": "pr205-1440x900-report.json", + "label": "pr205", + "viewport": { + "width": 1440, + "height": 900 + }, + "checks": 12, + "passed": 12, + "failures": [], + "uncaughtPageErrors": 0, + "consoleErrors": 3, + "capturedScreenshots": [ + "pr205-1440x900-strategy-diorama.png", + "pr205-1440x900-encounter-entry.png", + "pr205-1440x900-reload-hud.png", + "pr205-1440x900-combat-state.png", + "pr205-1440x900-result.png", + "pr205-1440x900-consequence.png", + "pr205-1440x900-returned.png", + "pr205-1440x900-reload-return.png" + ] + }, + { + "report": "pr205-390x844-report.json", + "label": "pr205", + "viewport": { + "width": 390, + "height": 844 + }, + "checks": 12, + "passed": 12, + "failures": [], + "uncaughtPageErrors": 0, + "consoleErrors": 4, + "capturedScreenshots": [ + "pr205-390x844-strategy-diorama.png", + "pr205-390x844-encounter-entry.png", + "pr205-390x844-reload-hud.png", + "pr205-390x844-combat-state.png", + "pr205-390x844-result.png", + "pr205-390x844-consequence.png", + "pr205-390x844-returned.png", + "pr205-390x844-reload-return.png" + ] + }, + { + "report": "pr205-failure-1440x900-report.json", + "label": "pr205-failure", + "viewport": { + "width": 1440, + "height": 900 + }, + "checks": 12, + "passed": 12, + "failures": [], + "uncaughtPageErrors": 0, + "consoleErrors": 19, + "capturedScreenshots": [ + "pr205-failure-1440x900-strategy-diorama.png", + "pr205-failure-1440x900-encounter-entry.png", + "pr205-failure-1440x900-reload-hud.png", + "pr205-failure-1440x900-combat-state.png", + "pr205-failure-1440x900-result.png", + "pr205-failure-1440x900-consequence.png", + "pr205-failure-1440x900-returned.png", + "pr205-failure-1440x900-reload-return.png" + ] + }, + { + "report": "pr205-failure-390x844-report.json", + "label": "pr205-failure", + "viewport": { + "width": 390, + "height": 844 + }, + "checks": 12, + "passed": 12, + "failures": [], + "uncaughtPageErrors": 0, + "consoleErrors": 20, + "capturedScreenshots": [ + "pr205-failure-390x844-strategy-diorama.png", + "pr205-failure-390x844-encounter-entry.png", + "pr205-failure-390x844-reload-hud.png", + "pr205-failure-390x844-combat-state.png", + "pr205-failure-390x844-result.png", + "pr205-failure-390x844-consequence.png", + "pr205-failure-390x844-returned.png", + "pr205-failure-390x844-reload-return.png" + ] + } + ], + "screenshots": [ + { + "file": "main-1440x900-combat-state.png", + "bytes": 568152, + "sha256": "d3da1dc14855463270dcbb3d530a25589d07059d2154bf10849973fe981f92c7" + }, + { + "file": "main-1440x900-consequence.png", + "bytes": 105746, + "sha256": "479bf07e4428f95c6964c4f694e08c70205ceb53ec02dde60528359f3394a882" + }, + { + "file": "main-1440x900-encounter-entry.png", + "bytes": 597145, + "sha256": "91773d2d4eed0c4bcd05b6ef3272a2db181ba8890efda0862fcdafe84df99543" + }, + { + "file": "main-1440x900-reload-hud.png", + "bytes": 567085, + "sha256": "eca822ffc12ce6e0047b65dddf7701f88c2352f7da17e62f01b653f132bff494" + }, + { + "file": "main-1440x900-reload-return.png", + "bytes": 107975, + "sha256": "4ded306060ac4c1cf622c20305dc4eab678a42741cc42f72485b8086f63c57f2" + }, + { + "file": "main-1440x900-result.png", + "bytes": 103334, + "sha256": "3e3a78f4ef230ef9a432dbde35f63c89ec519f657a647e98f490c9926ca0ca18" + }, + { + "file": "main-1440x900-returned.png", + "bytes": 383934, + "sha256": "f5dc0d265f837c43965736d28b9cf7ff333dca461128c2823ce962779e718538" + }, + { + "file": "main-1440x900-strategy-diorama.png", + "bytes": 462723, + "sha256": "4492833826c7e45d719d3e7810a0ecb8210211a8957834017e128073d960a137" + }, + { + "file": "main-390x844-combat-state.png", + "bytes": 141213, + "sha256": "49da817461c2e0becfc786b3b650dbe5be6debba10d73099d04b632fc6412a13" + }, + { + "file": "main-390x844-consequence.png", + "bytes": 77193, + "sha256": "15b079a3365ad2c23252e827d546f22ab6fa455fc69d6f4e15f0090cf0f95262" + }, + { + "file": "main-390x844-encounter-entry.png", + "bytes": 140841, + "sha256": "9d3a54e13f29e48a3d66fdab249e4c35b9bf29f11941a97dee6d71f9466bed01" + }, + { + "file": "main-390x844-reload-hud.png", + "bytes": 141311, + "sha256": "7c53054a5c2ad8883b4e53044953e2cea16d8ed49a3d14228413a98c7e5c3b04" + }, + { + "file": "main-390x844-reload-return.png", + "bytes": 79782, + "sha256": "302db01a0db0a999e7b0299e30c4618131f56f423f79db3ffffd2e2137c03007" + }, + { + "file": "main-390x844-result.png", + "bytes": 38244, + "sha256": "89c2b086550cacbc04e98a146983edf7961eb80f5382f43fb0771f0896258c63" + }, + { + "file": "main-390x844-returned.png", + "bytes": 143916, + "sha256": "09b319653a39fa7bb592a1f26816d568a7f31f7bf637ef3625d0f65505c48e5d" + }, + { + "file": "main-390x844-strategy-diorama.png", + "bytes": 206609, + "sha256": "97479c221a7f9c7797e4173e6da8d703f75b5abd50e2c272c5d788447643a231" + }, + { + "file": "pr205-1440x900-combat-state.png", + "bytes": 760972, + "sha256": "c7495418a76240e52388aa4cc48facf5f3b138ba77230c402181af8b0961fb38" + }, + { + "file": "pr205-1440x900-consequence.png", + "bytes": 105746, + "sha256": "479bf07e4428f95c6964c4f694e08c70205ceb53ec02dde60528359f3394a882" + }, + { + "file": "pr205-1440x900-encounter-entry.png", + "bytes": 810196, + "sha256": "fed1d97368e56e27d63658b7dacfc1221a85227afcfdd33dc6c6901d78102690" + }, + { + "file": "pr205-1440x900-reload-hud.png", + "bytes": 779633, + "sha256": "6e9da009ce0109b518a56ae106bb5b6c302c2cf95704e1ac3baac58cfef1b9d0" + }, + { + "file": "pr205-1440x900-reload-return.png", + "bytes": 107975, + "sha256": "4ded306060ac4c1cf622c20305dc4eab678a42741cc42f72485b8086f63c57f2" + }, + { + "file": "pr205-1440x900-result.png", + "bytes": 119292, + "sha256": "9166ddce5a48868fcfd39db27ba2b5be815e1e5508ddac5d4681f4a447def3e7" + }, + { + "file": "pr205-1440x900-returned.png", + "bytes": 383070, + "sha256": "3eaf341b952495bbb564e066d11b39441a74ff20d7f0f90a4d7083e05a537644" + }, + { + "file": "pr205-1440x900-strategy-diorama.png", + "bytes": 462723, + "sha256": "4492833826c7e45d719d3e7810a0ecb8210211a8957834017e128073d960a137" + }, + { + "file": "pr205-390x844-combat-state.png", + "bytes": 180498, + "sha256": "8b04c806693d4c5ff8b5a3f3fd78c06b14bbc563bca618ff99bd7f32e87880a1" + }, + { + "file": "pr205-390x844-consequence.png", + "bytes": 77193, + "sha256": "15b079a3365ad2c23252e827d546f22ab6fa455fc69d6f4e15f0090cf0f95262" + }, + { + "file": "pr205-390x844-encounter-entry.png", + "bytes": 180328, + "sha256": "af077dc5328e0692eb4df1bdd1b3807dbfef45bb4f20da8080cec2e2980a41bf" + }, + { + "file": "pr205-390x844-reload-hud.png", + "bytes": 181159, + "sha256": "e4cc23211fb6f77de47c945a3f7694eab99f3f5a11c13a7f4eafbb4274d20319" + }, + { + "file": "pr205-390x844-reload-return.png", + "bytes": 79782, + "sha256": "302db01a0db0a999e7b0299e30c4618131f56f423f79db3ffffd2e2137c03007" + }, + { + "file": "pr205-390x844-result.png", + "bytes": 40834, + "sha256": "e60cddfe1be8d81133a400153164aeaba2e9cbecb0c43cd51b56bc855178305c" + }, + { + "file": "pr205-390x844-returned.png", + "bytes": 143916, + "sha256": "09b319653a39fa7bb592a1f26816d568a7f31f7bf637ef3625d0f65505c48e5d" + }, + { + "file": "pr205-390x844-strategy-diorama.png", + "bytes": 206609, + "sha256": "97479c221a7f9c7797e4173e6da8d703f75b5abd50e2c272c5d788447643a231" + }, + { + "file": "pr205-failure-1440x900-combat-state.png", + "bytes": 753546, + "sha256": "8da64e25853773514ad84a1b7713b961b32b610fc87d5e71dfd6a37e0458d898" + }, + { + "file": "pr205-failure-1440x900-consequence.png", + "bytes": 105746, + "sha256": "479bf07e4428f95c6964c4f694e08c70205ceb53ec02dde60528359f3394a882" + }, + { + "file": "pr205-failure-1440x900-encounter-entry.png", + "bytes": 803996, + "sha256": "94ddf5866d545f30aa189b915f0a26accf3af587a55a52db0fa632e558a6faf3" + }, + { + "file": "pr205-failure-1440x900-reload-hud.png", + "bytes": 749286, + "sha256": "1a5b9efc2fc1180c5dff3973a1cf4787864907f85d310c6356d6ce12b497fc88" + }, + { + "file": "pr205-failure-1440x900-reload-return.png", + "bytes": 107975, + "sha256": "4ded306060ac4c1cf622c20305dc4eab678a42741cc42f72485b8086f63c57f2" + }, + { + "file": "pr205-failure-1440x900-result.png", + "bytes": 122110, + "sha256": "b5db53a86c29652a0b2aedcd9d56b5887712e71945ea3a8ff81dfba3af155d79" + }, + { + "file": "pr205-failure-1440x900-returned.png", + "bytes": 382396, + "sha256": "55d10a79d3f5a8cf36834cb2fa76427641097661770665b26affc4b31d54c373" + }, + { + "file": "pr205-failure-1440x900-strategy-diorama.png", + "bytes": 462723, + "sha256": "4492833826c7e45d719d3e7810a0ecb8210211a8957834017e128073d960a137" + }, + { + "file": "pr205-failure-390x844-combat-state.png", + "bytes": 179315, + "sha256": "4b9cb36e98d7532eb79325522175eaa141dd80d72c8bf0e6b15937ac7cea1a9d" + }, + { + "file": "pr205-failure-390x844-consequence.png", + "bytes": 77193, + "sha256": "15b079a3365ad2c23252e827d546f22ab6fa455fc69d6f4e15f0090cf0f95262" + }, + { + "file": "pr205-failure-390x844-encounter-entry.png", + "bytes": 179447, + "sha256": "e1718e01c858d37b619ac3bf58de12dc29cd82d06a196ce1583e25819e810b9b" + }, + { + "file": "pr205-failure-390x844-reload-hud.png", + "bytes": 180050, + "sha256": "7c8a7285532f673f017e7d61fb3a6362f3c56a2de7e54ff11daea40ac05ced51" + }, + { + "file": "pr205-failure-390x844-reload-return.png", + "bytes": 244577, + "sha256": "0a0d373cf2770ffb47f11faf8bf067017b1fd10113234e3f7290d0bd138fbdf4" + }, + { + "file": "pr205-failure-390x844-result.png", + "bytes": 41943, + "sha256": "b4bbafd251baa985467e766c14420f65db7b59db72fbed14634cd74097ce0eaa" + }, + { + "file": "pr205-failure-390x844-returned.png", + "bytes": 143916, + "sha256": "09b319653a39fa7bb592a1f26816d568a7f31f7bf637ef3625d0f65505c48e5d" + }, + { + "file": "pr205-failure-390x844-strategy-diorama.png", + "bytes": 206609, + "sha256": "97479c221a7f9c7797e4173e6da8d703f75b5abd50e2c272c5d788447643a231" + } + ], + "excludedClaims": [ + "physical iPhone or Safari compatibility", + "full-motion or FPS benchmarks", + "authenticated Supabase persistence", + "final member-art approval", + "historical tap-offset reproduction in this fresh run", + "Modern Ops connected player path", + "full game or launch completion", + "merge or production deployment" + ], + "evidenceBranchValidation": { + "exitCode": 0, + "testsPassed": 1033, + "testsSkipped": 4, + "testFiles": 91, + "typecheck": "pass", + "lintErrors": 0, + "existingLintWarnings": 200, + "assetAudit": "pass", + "packageValidation": "pass", + "log": "evidence-branch-validate.log", + "applicationSourceChanged": false + } +}