Forty cases
Ten cases each at Beginner, Intermediate, Advanced, and Expert difficulty.
Crime Cats · In Development
An original, clue-driven seating puzzle adapted into a focused Android prototype.
For players
Crime Cats tests whether a physical logic-puzzle concept feels good on a phone. Six recurring cats, a consistent board, and structured clues make every case a compact deduction problem.
Ten cases each at Beginner, Intermediate, Advanced, and Expert difficulty.
Drag and drop cats into clockwise seats, swap placements, and keep unneeded suspects in the tray.
Completed cases, the latest case, and a separate unfinished arrangement for every case are saved locally.
Solving clears that case’s unfinished arrangement, so a replay starts from a clean board.
Board landmarks and evidence remain fixed; each case changes the clue set, crime seat, seating solution, and culprit.
No account, networked features, social layer, or cloud dependency. The full case set lives on the device.
Current status: Private Android gameplay prototype in development. Contact support@wildonionlabs.com about playtesting.
For developers
Kotlin and Jetpack Compose UI over a pure Kotlin placement/swap/solve engine. Models define canonical geometry, cat traits, structured constraints, cases, and solutions.
The forty-case Kotlin repository is generated from an authoritative JSON source so supplied clue text, mappings, null seats, solutions, crime seats, and culprits remain exact.
Clockwise left/right semantics and physical across-seat pairs are encoded once. Every structured clue constraint is executable against a candidate arrangement.
A brute-force unit test enumerates legal arrangements and confirms every clue set has exactly one solution matching the supplied answer.
A small SharedPreferences repository stores completion, resume position, and independent in-progress placement state per case.
Domain logic stays separate from Compose interaction geometry, allowing placement, swapping, incomplete/wrong/solved outcomes, and catalog invariants to be tested without UI state.