# 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/BEADS_WORKFLOW.md`](docs/BEADS_WORKFLOW.md) — local backlog structure and daily Beads commands. ## Playable content The APK contains ten 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. 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, and lowest volunteer count are stored locally. ## 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. 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 ``` All ten 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. 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.