Initial prototype: TOW trailer-reversing trainer

Browser game teaching how to reverse a car with a trailer. Vanilla JS,
no build step, runs from file:// in Safari.

- Bicycle-model car kinematics + trailer articulation (jackknife behavior)
- WASD controls with steering input smoothing; rendered steering wheel and
  rig-angle HUD
- Tron-style vector rendering, OBB/SAT collision
- Four hand-built maps (dock, lot, roadside, driveway) plus a validated
  procedurally-generated 5th map

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erich Blume 2026-06-06 18:39:03 -07:00
commit 41efdecd93
9 changed files with 1238 additions and 0 deletions

54
index.html Normal file
View file

@ -0,0 +1,54 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TOW — trailer reversing trainer</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="shell">
<header class="topbar">
<div class="title">
<span class="logo">TOW</span>
<span class="sub">trailer reversing trainer</span>
</div>
<div id="mapTabs" class="tabs"></div>
</header>
<div class="stage">
<canvas id="game"></canvas>
<div id="winOverlay" class="overlay">
<div class="card">
<h1>PARKED.</h1>
<p>Nicely backed in.</p>
<div class="btns">
<button id="btnRetry" class="ghost">Retry (R)</button>
<button id="btnNext" class="primary">Next map (N)</button>
</div>
</div>
</div>
</div>
<footer class="bottombar">
<div class="mapinfo">
<span id="mapName" class="mname"></span>
<span id="mapHint" class="mhint"></span>
</div>
<div class="keys">
<kbd>W</kbd><kbd>A</kbd><kbd>S</kbd><kbd>D</kbd> drive ·
hold <kbd>A</kbd>/<kbd>D</kbd> to turn the wheel ·
<kbd>R</kbd> reset · <kbd>N</kbd> next · <kbd>1</kbd><kbd>5</kbd> maps (5 = random)
</div>
</footer>
</div>
<script src="js/physics.js"></script>
<script src="js/maps.js"></script>
<script src="js/input.js"></script>
<script src="js/render.js"></script>
<script src="js/hud.js"></script>
<script src="js/game.js"></script>
</body>
</html>