From 99aa6d3cd60d86cace78b9594eb02a708a8b30e3 Mon Sep 17 00:00:00 2001 From: Daniel Meyer Date: Mon, 2 Nov 2026 18:41:16 -0800 Subject: [PATCH] Record the other shapes and the player south action frames. The world-shape note lists the kerb, solid foundation, extraction box, camera fields, patrol cone, sockets, markers, shadow, and closed gate already drawn. The action note tables the south dodge, recover, hurt, defeat, extraction, and complete frames. No pixels and no collision change. --- docs/review/device-qa/README.md | 2 + .../player-action-frames-2026-11-03.md | 89 +++++++++++++++++++ .../device-qa/world-shapes-2026-11-03.md | 53 +++++++++++ 3 files changed, 144 insertions(+) create mode 100644 docs/review/device-qa/player-action-frames-2026-11-03.md create mode 100644 docs/review/device-qa/world-shapes-2026-11-03.md diff --git a/docs/review/device-qa/README.md b/docs/review/device-qa/README.md index 9afb0198..02423c6f 100644 --- a/docs/review/device-qa/README.md +++ b/docs/review/device-qa/README.md @@ -44,5 +44,7 @@ Each note records one fact about bytes or draw calls already on main. None of th | [unplaced-images-2026-11-03.md](unplaced-images-2026-11-03.md) | Motif, telegraph, and objective PNGs the draw path does not place | | [hud-shapes-2026-11-03.md](hud-shapes-2026-11-03.md) | HUD and control PNGs, and the shapes the HUD draws instead | | [decoration-solid-overlap-2026-11-03.md](decoration-solid-overlap-2026-11-03.md) | No placed decoration canvas shares area with a blocking rectangle | +| [player-action-frames-2026-11-03.md](player-action-frames-2026-11-03.md) | South dodge, recover, hurt, defeat, extraction, and complete frames | +| [world-shapes-2026-11-03.md](world-shapes-2026-11-03.md) | Kerb, solid foundation, extraction, fields, cones, sockets, markers, shadow, and gate | Next session: follow [retest-checklist.md](retest-checklist.md) (D-105 allows device checks on any build). diff --git a/docs/review/device-qa/player-action-frames-2026-11-03.md b/docs/review/device-qa/player-action-frames-2026-11-03.md new file mode 100644 index 00000000..70141de9 --- /dev/null +++ b/docs/review/device-qa/player-action-frames-2026-11-03.md @@ -0,0 +1,89 @@ +# Player south action frames + +Measured 2026-11-03 from the runtime asset bytes on `c573052`. Those bytes are the same player frames as `c700b82`. No new frame was added. No facing was authored. The south idle and south move tables are in [player-sprite-bounds-2026-11-03.md](player-sprite-bounds-2026-11-03.md). This note tables the other south cycles. It does not close #65, #131, or #132, and it does not prove a live cycle. + +Image coordinates start at the top left of the PNG. Bounds are inclusive. A pixel counts as nontransparent when its alpha is greater than 0. + +The box, anchor, and radius are the ones in the player note: 64×64, anchor (32, 56), radius 18. Each of these clips also stores directions north, east, south, and west. This table is south only. + +Every frame below has canvas 64×64. The span line is the smallest and largest width, and the smallest and largest height, across the south frames of that state. Those four numbers are not one frame. + +## Dodge + +Clip `player_dodge`. Four south frames. + +| Frame | Bounds | Span | sha256 | +|---|---|---|---| +| `actor_player_dodge_s_01@1x.png` | x 7–59, y 19–55 | 53×37 | `bb3a906629ab03077cede402a8f5c28247e3538b2eb718ac49da739ef40c421f` | +| `actor_player_dodge_s_02@1x.png` | x 4–59, y 19–55 | 56×37 | `59d26b408d49f2a376d5081842458f923153833685c65cbd749b9b86cb3de311` | +| `actor_player_dodge_s_03@1x.png` | x 4–59, y 19–55 | 56×37 | `aa258e3ff0bdfe4278a27d6e09e2691f53c6f7929ec66e7463286968598d6e1f` | +| `actor_player_dodge_s_04@1x.png` | x 4–58, y 19–55 | 55×37 | `0770969db20d2bd99514ffb57783fb0a6d8a87d2f50168fbc65e9ccdc948f368` | + +Across these south frames, nontransparent width runs 53–56 and height runs 37–37. + +## Recover + +Clip `player_recover`. Two south frames. + +| Frame | Bounds | Span | sha256 | +|---|---|---|---| +| `actor_player_recover_s_01@1x.png` | x 37–56, y 37–53 | 20×17 | `52228fce8e816e3cb14b19d0045d06c0dc602f7fd63746a4fb3b4e6d32e9403e` | +| `actor_player_recover_s_02@1x.png` | x 8–29, y 26–55 | 22×30 | `911bbf57a8c7c08c3bd2e0061c328b1f05497bb9d39a6afe7328fb38649d9514` | + +Across these south frames, nontransparent width runs 20–22 and height runs 17–30. + +## Hurt + +Clip `player_hurt`. Three south frames. + +| Frame | Bounds | Span | sha256 | +|---|---|---|---| +| `actor_player_hurt_s_01@1x.png` | x 23–40, y 15–47 | 18×33 | `a83d382295db881c942d6d2b43185cd67a5aeefa2e397e6ca9599956d06c02d5` | +| `actor_player_hurt_s_02@1x.png` | x 21–45, y 10–50 | 25×41 | `67bc8428b344718c820d02d4f94d03566ef96435466fd6279da2319d2e05a796` | +| `actor_player_hurt_s_03@1x.png` | x 21–41, y 15–49 | 21×35 | `8b36a6783d4d4edbdd248971893e7d9fa42e493cf1c56ab08ef7bdc206113c1e` | + +Across these south frames, nontransparent width runs 18–25 and height runs 33–41. + +## Defeat + +Clip `player_defeat`. Five south frames. + +| Frame | Bounds | Span | sha256 | +|---|---|---|---| +| `actor_player_defeat_s_01@1x.png` | x 16–53, y 24–63 | 38×40 | `af78b84b61fc9b58ccc2c87d69183514d10dcb63668500633b6ad76bfaded22e` | +| `actor_player_defeat_s_02@1x.png` | x 10–53, y 25–63 | 44×39 | `cc738f69554bad101a1fb4cbc910dc91bf1bf2e44afa5bd6f29c172dcd3982db` | +| `actor_player_defeat_s_03@1x.png` | x 10–53, y 26–63 | 44×38 | `a34b0c653fd12d46bb8a1710325ca8acfc94c5b749378cefaef30c4d629d755f` | +| `actor_player_defeat_s_04@1x.png` | x 10–47, y 30–63 | 38×34 | `3712536e00ffaf6e88a2458e1b1f974f2ad34c2772ab35109fe0af71ddac86dd` | +| `actor_player_defeat_s_05@1x.png` | x 16–53, y 0–63 | 38×64 | `891fb31c613bbfacc9a9b160d67f663685ebd456f3fd61fb6bffa61b29e3dc15` | + +Across these south frames, nontransparent width runs 38–44 and height runs 34–64. + +## Extraction + +Clip `player_extraction`. Eight south frames. + +| Frame | Bounds | Span | sha256 | +|---|---|---|---| +| `actor_player_extraction_s_01@1x.png` | x 19–36, y 30–63 | 18×34 | `ccc143c741926fc05e6306315077db4b61e870144f99eab36e0d19f1dcd42fb9` | +| `actor_player_extraction_s_02@1x.png` | x 10–53, y 30–63 | 44×34 | `88ed193fec2a7de98710fc380b11fb0e0fec0f42ef328266d8cea853904e1275` | +| `actor_player_extraction_s_03@1x.png` | x 10–53, y 30–63 | 44×34 | `5ffb8c123452b1e31e78ef5d57fc4ffd675e2c7e2601c1564b9f5c9506689de4` | +| `actor_player_extraction_s_04@1x.png` | x 28–44, y 31–63 | 17×33 | `276648769e0a61ab4aa9c116995a0313bbc234a212fceef75d59510ed4ffed16` | +| `actor_player_extraction_s_05@1x.png` | x 18–53, y 0–63 | 36×64 | `1e301367802f73b79d88814de1edce947a80521a0a7d9e4854673f6effd7bde8` | +| `actor_player_extraction_s_06@1x.png` | x 10–53, y 0–63 | 44×64 | `98cd52dd9b1c90118dcb791bd9d0aa614536bab87870911afd10fd580389cf8d` | +| `actor_player_extraction_s_07@1x.png` | x 10–51, y 0–62 | 42×63 | `751d22c79b691656b83401a59c6c70a19dd61c8df5c2c07ecb690734f352a29a` | +| `actor_player_extraction_s_08@1x.png` | x 30–42, y 0–62 | 13×63 | `64a96c3bfaffaada4ce68cd25f32d035ef9440edcfd02026e6dec4ac9213bdc3` | + +Across these south frames, nontransparent width runs 13–44 and height runs 33–64. + +## Complete + +Clip `player_complete`. Four south frames. + +| Frame | Bounds | Span | sha256 | +|---|---|---|---| +| `actor_player_complete_s_01@1x.png` | x 7–59, y 0–55 | 53×56 | `18a1b0bdcaa0a6e810e889b7625ecab1a71902f6790359e495b5a7a7504b1244` | +| `actor_player_complete_s_02@1x.png` | x 4–59, y 0–53 | 56×54 | `ecfbba894aeaded59ad1da44d6819c4f971d5371973ac794ae79f882e6867c07` | +| `actor_player_complete_s_03@1x.png` | x 4–59, y 0–55 | 56×56 | `2ac8b8536b82689eb65a22138681339cc2699bb7f4c03f5d7d784ad251e00255` | +| `actor_player_complete_s_04@1x.png` | x 4–57, y 0–55 | 54×56 | `868467b88e1213c4ffff8f471235243dac1cc5e8bf3d649d8f343a2aba871019` | + +Across these south frames, nontransparent width runs 53–56 and height runs 54–56. diff --git a/docs/review/device-qa/world-shapes-2026-11-03.md b/docs/review/device-qa/world-shapes-2026-11-03.md new file mode 100644 index 00000000..a2b9d681 --- /dev/null +++ b/docs/review/device-qa/world-shapes-2026-11-03.md @@ -0,0 +1,53 @@ +# Shapes besides the projectile, mine, and telegraph + +Read 2026-11-03 from `WorldRenderer` on `c573052`. The projectile, mine, and telegraph shapes are in [shape-hazards-2026-11-03.md](shape-hazards-2026-11-03.md). This note records the other shapes that function already draws. No color, width, or fill was changed. No rect moves. This does not close T1046, and it does not merge #167. + +## Ground kerb + +Where two ground tiles meet, the south edge and the west edge get a kerb and a shadow. The other two edges are left to the neighbour, so a shared boundary is drawn once. The kerb is 3 units thick (`kerbThickness`). The shadow is 2 units thick (`kerbShadowThickness`) and sits on the neighbour's side. Fill is `Palette.kerb` (white 0.62, alpha 0.55) and `Palette.kerbShadow` (white 0.10, alpha 0.35). Stroke is clear. + +Three lip bands also cross that edge, each 5 units deep, at alpha 0.55, 0.32, and 0.14. Those bands are slices of the tile textures, not a new colour. + +## Solid foundation + +Each blocking solid draws a rectangle of its own box: width and height are `halfSize * 2`, centred on the solid. Fill `Palette.solidFill` (white 0.18), stroke `Palette.solidStroke` (white 0.32), line width 2. When the solid has upright art, that sprite is added on top of this rectangle at the same size. The rectangle is presentation of the box the simulation already uses. + +## Extraction zone + +`renderExtraction` draws one rectangle of the arena extraction box. `civic-seam-arena-004` places that box at center (2048, 192) with half-size (96, 64), so the drawn size is 192×128. Fill is `Palette.extractionArmed` (0.20, 0.45, 0.35, alpha 0.35) when armed, and `Palette.extractionLocked` (same RGB, alpha 0.12) otherwise. Stroke is `Palette.extractionStroke` (white 0.7, alpha 0.6). The function does not assign a line width. + +## Cameras and fields + +A backed camera draws its clip and, when the housing texture is present, the housing sprite. Both use a 64×96 box. The camera-frame note already records those frames. The radius-12 circle, filled with `Palette.cameraFill` for the presentation state and stroked clear, is the fallback `playCamera` uses when the clip is not backed. + +A visible camera field is a solid-clipped path. Fill is `Palette.cameraField` (0.90, 0.70, 0.10, alpha 0.12), or `Palette.cameraFieldDetecting` (same RGB, alpha 0.28) while detecting. Stroke is clear. The Captain field uses the same path construction with fill `Palette.captainField` (white 0.75, alpha 0.18) and a clear stroke. + +The bundle contains `env_camera_captain_idle` and `env_camera_captain_active`. `CaptainHousing.assetId` selects one of those, and the renderer draws it at 64×96 when the texture loads. + +Damage notches, when integrity is 1 or 2, are a 13×10 badge with corner radius 2, fill white 0.08, stroke white 0.8, line width 0.75, and up to two 2×6 ticks. + +## Patrol cone + +Each unaware patrol cone is the snapshot outline. The fill node uses `Palette.patrolCone` (0.55, 0.75, 0.95, alpha 0.14) and a clear stroke. The edge is the same path dashed `[10, 8]`, fill clear, stroke `Palette.patrolConeEdge` (0.70, 0.85, 1.0, alpha 0.75), line width 2. + +## Spawn sockets + +Each socket is a filled circle of radius 3. Fill `Palette.spawnSocket` (white 0.45, alpha 0.5). Stroke is clear. + +## Markers + +An unaware enemy gets a `?` label in Menlo-Bold at 18 points, colour `Palette.unawareMarker` (white 0.92, alpha 0.95). It sits `radius + 10` above the enemy centre. + +A daemon query ring is drawn while `improperSearchDaemon` is in `queryTelegraph` or `queryResolve`. The radius is `DaemonQuery.circleRadius`, 56. Fill is clear. Stroke is `Palette.queryMarker` (white 0.8, alpha 0.7). Line width is 2. + +## Actor shadow and the unbacked silhouette + +Every actor gets one shared shadow texture, a 64×32 ellipse at `ActorContrast.shadowOpacity` 0.35, feathered over the outer 0.3 of the radius, filtered linearly. The drawn size is `shadowSize`: width `1.4 × 2 × radius`, height half of that. For the player radius 18 that is 50.4 × 25.2. The shadow sits `0.3 × radius` below the actor. + +When a clip is backed, the faction outline is the texture from `OutlineTextures`. When it is not, the fallback is a silhouette: player fill white 0.92 and stroke white 1 at alpha 0.7, line width 2. The contrast pass then clears that stroke and adds an outline child. Enemies dash that outline with lengths `[4, 3]`. The player, the five standard enemies, and `algorithmicModerate` have clips in the bundle, so this silhouette is the unbacked path. + +A ghost, when one is passed in, is that same player silhouette at alpha `0.35 × fade`. + +## Closed gate + +An open gate draws nothing. A closed gate tiles `env_prop_barricade` through the gate box. That PNG is in the bundle, so the steel-and-hazard colour fallback is not the path this bundle takes. A rail 4 units thick (`GateBarrier.stripThickness`) sits on the open face, colour `Palette.barrierRail` (white 0.10, alpha 0.95). Amber lights (`Palette.barrierLight`, 1.0, 0.72, 0.18) run along it, length 10, gap 6, and one unit thinner than the rail. The tiles partition the collision box and the strip lies inside it. Collision is unchanged.