Angry Baseball
A first-person 3D batting game: a pig pitches, you time the swing with a crosshair, and the outfield is packed with destructible targets — animal towers, chain-explosive barrels and a flying JACKPOT golden pig.
The seven dimensions
memoryTechnical Depth 7/10
Real math where it matters: the pitch release solves initial velocity analytically compensating gravity and the breaking-ball's constant acceleration together, so curves still cross the strike zone precisely (game.js:229-239). Batting skips rigid-body bat collision for a tunable two-axis model — timing (early=pull, late=push) × aim (under the ball = fly) — blended into an impulse for cannon-es. Simplified per-tick Magnus force; every texture is procedural canvas (turf stripes, ball seams, sky). No shaders or post-processing; the hard physics problems are deliberately routed around.
stadia_controllerGame Design 7.5/10
The 'every pitch must pay off' juice philosophy fully executed: a shrinking timing ring that snaps green in the zone, a PERFECT metallic ring whose synthesis varies continuously with quality, combo pitch ladders, crowd volume scaling with distance, and full-screen record-break text. Intermittent reinforcement by design (golden balls on pitches 5 and 9, a bomb ball that rewards *not* swinging, a 4% chicken pitch, a JACKPOT pig crossing the outfield) — PLAN.md literally cites it as the addiction mechanism. Nine bats with real feel differences. Docked for inheriting most systems 90-100% from angry-pig.
securityBackend & Security 6.5/10
The most defense-aware backend of the five: per-mode plausibility caps (distance board 400 m; survival estimated from the note field which is itself capped to prevent bypass), an audit log, and an in-game read-only admin dashboard where the rate-limit hits column doubles as an attack signal. The staggered-submit fix (two boards hitting the same 3 s IP limit → frontend delays the second by 3.5 s) shows self-debugging, though it patches the backend with a client hack. Same family sins: the '0501' admin password sits in a test file, and names are identities.
codeCode Quality 7/10
Reasonable module boundaries where it counts: batting.js is a zero-dependency pure function ('pure math, no deps' says its header), fx.js uses dependency injection to break circular imports, dispose discipline is complete. But game.js is a 1,781-line everything-file — state machine, UI wiring, shop, leaderboard client, admin client, touch stick — contradicting PLAN.md's own module plan.
experimentTesting 3/10
The only project in the series with tests at all: 8 puppeteer-core E2E scripts, including a bot that actually plays baseball — polling a debug hook for the ball's z-position and clicking the swing at the right moment, completing full 10-pitch games. But none of them assert anything (console.log for eyeball judgment), there is no CI, the Chrome path is hardcoded to Windows, and the perfectly testable batting.js pure function has zero unit tests. Verification scripts for an AI workflow, not a regression suite.
verifiedCompleteness 8/10
A professional-grade delivery for ~a week: 4 modes, 12 challenges, a 9-bat shop, 4 leaderboards, threaded message board, admin dashboard, 7-day peak chart, mobile stick, settings, onboarding, opening camera sweep — deployed with a marketing page and YouTube embed, fully playable offline. Docked for documentation drift: the README still advertises the slow-motion ball-cam that a commit explicitly removed.
emoji_objectsOriginality 6.5/10
Home-run derby games are plentiful; putting destructible physics targets in the outfield is not. Bomb balls that reward restraint, a pitcher who throws chickens, a joke salted-fish bat — the comedy toolkit builds a personality. Still the fifth work in its own universe, on its predecessor's engine, with a rhythm-game timing core: clever recombination rather than invention.
trending_upHighlights
- Analytic pitch solution — initial velocity solved with gravity + break acceleration compensated together, one clear comment explaining the math (
game.js:229-239) - Two-axis batting model — timing × aim as a pure function with centralized tunables (
batting.js:45-86) - Cost-engineered backend — check-in presence, edge caches, and
Math.random()<0.13opportunistic table cleanup (online.js,_lib.js) - In-game attack-analytics dashboard — rate-limit hits as attack signals, audit event categories, presence-flooding detection (
admin.js) - A test bot that plays baseball — reads
window.__dbgBallZthrough a debug hook and completes full games headlessly (test/smoke.mjs)
trending_downWeaknesses
- Admin password
'0501'committed intest/admin.mjs:23— even as a dev key, it signals weak password habits - Names are identities — anyone can impersonate or merge onto another player's leaderboard entry (
leaderboard.js:16-26) - Tests without assertions, no CI, non-portable — hardcoded Windows Chrome path;
batting.jshas zero unit tests - 1,781-line monolith contradicting its own PLAN.md module split (
game.js) - Documentation drift — README advertises removed features; a self-admitted dead
hitStopvariable remains (README.md:20)
smart_toyAI-assisted development
All 16 commits co-authored by Claude Fable 5 — the author upgraded models mid-series (the first four games were Opus 4.8). The first commit lands ~3,600 lines of playable game including backend, tests and a plan document. The repo ships a custom Claude Code skill (.claude/skills/ui-assets) teaching the AI to cut sprite sheets with PIL flood-fill, and the game exposes window.__DBG hooks designed specifically for headless AI self-verification. Doc-driven development: PLAN.md precedes the code, with a reuse-ratio table against angry-pig.
summarizeFacts
| Stack | three.js r160 · cannon-es · JavaScript · Vite 5 · puppeteer E2E · CF Pages Functions · D1 |
|---|---|
| Genre | Batting × physics destruction |
| Period | 2026-07-11 → 2026-07-18 |
| Active dev days | 8 days |
| Commits | 16 |
| Lines of code | ~4,300 |
| Author | craig7351 (Book AI) |
Verdict
The most mature entry in the series: real math in the physics, the first appearance of tests (however assertion-less), the sharpest backend defenses — and the same monolith habit and weak-password signature carried over one more time.