# Project Sacrifice — Android vertical slice An original landscape puzzle-platformer prototype inspired by the broad “death changes the puzzle” genre formula. It does not reuse the title, art, audio, text, characters, or level layouts of any commercial game. Project documents: - [`docs/DEVELOPMENT_PLAN.md`](docs/DEVELOPMENT_PLAN.md) — approved GDD + TDD + production roadmap; - [`docs/CURRENT_ROADMAP.md`](docs/CURRENT_ROADMAP.md) — execution roadmap for the existing vertical slice; - [`docs/LEVEL_SOLUTION_GRAPHS.md`](docs/LEVEL_SOLUTION_GRAPHS.md) — source-backed intended solution graph for every current level; - [`docs/STAGE4_CONTENT_FORMAT.md`](docs/STAGE4_CONTENT_FORMAT.md) — versioned JSON contract, validator, preview, and bot-trace format; - [`docs/STAGE5_ART_BIBLE.md`](docs/STAGE5_ART_BIBLE.md) — original visual language and articulated volunteer contract; - [`docs/STAGE5_PERFORMANCE_BUDGETS.md`](docs/STAGE5_PERFORMANCE_BUDGETS.md) — physics, replay, frame, memory, and complexity ceilings; - [`docs/STAGE5_QA_REPORT.md`](docs/STAGE5_QA_REPORT.md) — exact Vertical Slice candidate evidence; - [`docs/STAGE6_CORPSE_STATES.md`](docs/STAGE6_CORPSE_STATES.md) — burned/crushed body contracts and acceptance evidence; - [`docs/STAGE6_WEIGHTED_OBJECTS.md`](docs/STAGE6_WEIGHTED_OBJECTS.md) — shared mass contract, physical objects, and level 17 evidence; - [`docs/STAGE6_CHALLENGES.md`](docs/STAGE6_CHALLENGES.md) — stable level IDs, three-star challenges, collectibles, and level 18 evidence; - [`docs/STAGE5_HUMAN_PLAYTEST.md`](docs/STAGE5_HUMAN_PLAYTEST.md) — required external acceptance protocol; - [`docs/STAGE_REGISTRY.md`](docs/STAGE_REGISTRY.md) — mandatory Stage 0–10 ownership for every Bead; - [`docs/BEADS_WORKFLOW.md`](docs/BEADS_WORKFLOW.md) — local backlog structure and daily Beads commands. ## Playable content The APK contains eighteen sequential levels: 1. movement and jumping; 2. bodies covering a spike lane; 3. a corpse holding a pressure plate and door; 4. a toggle-controlled moving lift; 5. a saw launching a corpse onto a remote plate; 6. a frozen corpse becoming a stable step; 7. an electrified corpse completing a relay; 8. a timed switch and moving platform; 9. a two-signal door requiring weight and electricity; 10. a mastery level combining saw, freeze, electricity, pressure plate, pit, moving lift, and final gate; 11. a rhythmic crusher and its safe rest phase; 12. a fire lane with a staged jump; 13. two state-driven projectile crossings; 14. explosion delivery to a remote pressure door; 15. a crushed body whose low collider becomes a required step; 16. a burned body that stays solid but no longer powers a pressure bridge; 17. five physical object types sharing a mass-nine pressure gate; 18. a teaching route that combines casualty/time targets with an optional cache and persistent three-star result. Death does not reset the level. A new volunteer respawns after a short delay while retained bodies stay in the simulation. The restart button deliberately clears the puzzle state. Progress, best time, lowest volunteer count, collected caches, and earned stars are stored by stable level ID. ## Controls - Hold the left/right arrows to move. - Hold a direction and tap jump simultaneously; multitouch is supported. - `Restart` restores the current level. - `II` pauses the game and exposes level selection. - `Settings` on the level-select screen cycles three control sizes, three opacity presets, vibration on/off, Standard/Large text, high contrast, and English/Russian, reduced motion, and independent Music/Effects/Voice volumes. Changes persist across app restarts without resetting progress. The first level includes a three-step, non-blocking tutorial for movement, multitouch jumping, and using retained bodies. Completion shows the current run, saved best, targets, a next goal, and Level select/Replay/Next level routes. Critical signal, door, and respawn state remains visible when vibration is disabled. The movement constants include 130 ms coyote time and 140 ms input buffering. ## Build Requirements: JDK 17 and Android SDK Platform/Build Tools 34. ```sh ./gradlew testDebugUnitTest assembleDebug ``` Level content is stored in `level-format/src/main/resources/levels`. Android and the desktop tools use the same dependency-free parser and validator. Android packaging automatically depends on validation. To validate explicitly or export deterministic SVG/TSV previews: ```sh ./gradlew :level-format:validateLevels ./gradlew :level-format:previewLevels ``` Previews are written to `level-format/build/level-previews`. Invalid geometry, versions, moving-platform destinations, switch parameters, or signal references fail the build with a JSON path diagnostic. All eighteen levels have device-level acceptance bots. They drive the production `GameView` through the same movement and jump inputs as the touch controls and run each intended solution three times. Level 8 also has a dedicated recovery scenario for an expired timer on the far side of the pit. Stage 2 additionally checks clean restart and long-term stability of the saw-delivered body on the level 10 lift plate. The final Stage 2 build passed all 16 instrumentation methods (36 gameplay executions plus lifecycle and restart) on Android 16 in a single unfiltered run. With an emulator or phone connected, run the complete matrix with: ```sh ./gradlew connectedDebugAndroidTest ``` The Stage 3 device suite additionally checks persisted controls, RU/EN copy, accessibility presets, tutorial/result navigation, Back behavior, and safe viewports on 20:9, 16:9, and 16:10 tablet-sized displays. Stage 4 keeps the same gameplay and UI matrix after migrating all ten levels to JSON. Its final unfiltered Android 16 run passed all 30 instrumentation methods in one process (`OK (30 tests)`, 1,096.448 seconds). Acceptance bots now attach a versioned deterministic input/checkpoint trace and SHA-256 trace ID to their result diagnostics. Stage 5 replaces the prototype knight with an original articulated clockwork volunteer rig and three data-driven skins, adds procedural audio, camera focus and shake with reduced motion, save version 2 and active-session restoration. Its exact Android 16 candidate passed all 35 instrumentation methods in one unfiltered run (`493.521 s`) plus 72 JVM tests. Deterministic tapes replay all ten levels three times with identical state signatures. The product owner confirmed completion of external testing on 19 August 2026; the evidence boundary is recorded without invented session data in `docs/STAGE5_HUMAN_PLAYTEST_RESULT.md`. Stage 5 is accepted. Stage 6 production work has started. Its three completed foundation slices add a deterministic character state machine, a bounded `CorpseManager`, and an event-driven `PuzzleSystem` with explicit signal and door transitions. The first mechanics slice adds data-driven crusher, fire, projectile and explosion hazards, teaching levels 11–14, dynamic level pagination and production-input routes. Burned/crushed corpse states are taught in levels 15–16, level 17 adds five authored physical-object types over one shared pressure-mass contract, and level 18 teaches the casualty/time/cache challenge contract with persistent three-star progress keyed by stable `levelId`. The first bounded Foundations authoring wave adds levels 19–22: a two-jump movement route, a two-body spike bridge, a retained pressure-door body and a toggle-controlled horizontal ferry. All four routes pass three consecutive runs, and restart clears the stateful bridge/ferry setups. The second wave adds levels 23–26: remote saw delivery, a frozen-body step, a conductive-body relay and a timed ferry with an explicit far-side recovery relay. Five route methods prove all four levels three times, including both the original timer and expired-timer recovery routes for level 26. The final Foundations wave adds levels 27–30: a two-body AND gate, a three-state body sequence with clean restart, an exact-two-death challenge and a finale that combines corpse bridge, pressure, toggle/timer ferry and Door. The full Foundations world now occupies its accepted 18–30 matrix range. The first Physics wave adds levels 31–34: object-held mass, a real three-object support stack, a saw-delivery lift route and a crusher/pressure cycle. Vertical object-on-object support is deterministic and covered independently from player movement; all four routes pass three consecutive production-input runs. Scope and final evidence are in `docs/STAGE6_CHARACTER_STATES.md`, `docs/STAGE6_CORPSE_MANAGER.md`, and `docs/STAGE6_PUZZLE_SYSTEM.md`; the latest hazard evidence is in `docs/STAGE6_PRODUCTION_HAZARDS.md`, and the burned/crushed contract is in `docs/STAGE6_CORPSE_STATES.md`. Weighted-object evidence is in `docs/STAGE6_WEIGHTED_OBJECTS.md`; challenge and migration evidence is in `docs/STAGE6_CHALLENGES.md`. The executable content matrix fixes the release at 69 levels: 17 accepted workshop levels plus 52 production slots in Foundations, Physics, States and Mastery. Its contract and Level DoD pipeline are documented in `docs/STAGE6_CONTENT_MATRIX.md`; wave evidence is in `docs/STAGE6_FOUNDATIONS_WAVE1.md` and `docs/STAGE6_FOUNDATIONS_WAVE2.md`; the completed world evidence is in `docs/STAGE6_FOUNDATIONS_WAVE3.md`. Physics evidence starts in `docs/STAGE6_PHYSICS_WAVE1.md`. The latest exact gate is `122 app JVM + 7 content-tool JVM / 70 Android` on the thirty-four-level candidate (`70/70`, 611.991 seconds). The verified debug APK SHA-256 is `1d608168c5f44bc85aabb7bbe23e8e45cd4bb2b2611d6b5c2af5fa4451c63bd3`. The debug APK is written to `app/build/outputs/apk/debug/app-debug.apk`. It is signed with Android's standard debug key and can be installed with: ```sh adb install -r app/build/outputs/apk/debug/app-debug.apk ``` ## Scope This is a dependency-free vertical slice rendered through a custom Android Canvas view. It is intended for gameplay evaluation on phones and tablets, not as a content-complete commercial release.