fertig-classic-games/tools
Brian Fertig 10165547ae Add tunnels to Zuma: editor, engine, art, and audio
Introduce underground tunnel sections to Zuma levels, letting the
chain roll out of sight and back in. Tunnels are arc-length intervals
on the path; while a ball is submerged it is inert — ignored by shots,
the laser sight, and explosions — and the path itself is drawn as a
faint buried trace beneath any live section that crosses it.

Engine (ZumaLogic.js): TUNNEL constants, normalizeTunnels, isHidden,
visibilityAt, pathSpans, sampleRange, nearestS; createLevel,
syncPositions, applyPower, stepFlights, and rayHit all honour
submersion. validateLevel lints mouth placement, spacing, and the
40% max-hidden fraction.

Game (ZumaGame.js): depth layer reorg so a live path always wins an
overlap with a tunnel stone; addPortal draws the two-layer maw (stone
below the chain, mouth above it); drawPit replaces the old skull with
a broken-stone collar and vapour swirl; startPitFall rolls the lost
chain over the lip in order, shrinking marbles into the dark; the
level-start fanfare ducks the soundtrack via MusicPlayer pause/resume.

Editor (ZumaEditor.js): new Tunnels tool with click-to-place,
drag-to-slide, right-click-to-remove, ESC-to-cancel; three graphics
layers (buried path, live path, handles) matching the game's
stacking; queueGameAssets so editor Test Play has the lazy art ready.

Art: ZumaPortal.js (carved serpent-head maw, symmetric so one
texture serves both ends) and ZumaPit.js (shaft of darkening discs
read as depth, not a painted circle).

Audio: four Zuma SFX (shoot, hit, start, explode) and a three-track
soundtrack wired through data/zuma-music.json and the asset manifest;
genZuma.js gains a tunnels column (fractions of path length) and
verifyZuma.js gains a tunnel test suite.
2026-07-28 17:20:11 -06:00
..
lib
…
bloxorzMap.js feat: overhaul Bloxorz rendering, mechanics, and level design; update Total Annihilation visuals 2026-07-25 14:50:23 -06:00
buildCommonWords.js
…
fetchStarControlAssets.js
…
genBloxorz.js feat: overhaul Bloxorz rendering, mechanics, and level design; update Total Annihilation visuals 2026-07-25 14:50:23 -06:00
genDotLink.js
…
genGooTower.js Goo Tower Levels 2026-07-26 15:23:18 -06:00
genJumble.js
…
genKatamino.js
…
genMiniCrossword.js
…
genPeggleLevels.js
…
genPuddingMonsters.js feat: pudding monsters waves 1-3, mahjong match FX, background art 2026-07-26 01:27:36 -06:00
genRushHour.js
…
genSpireClimbCreatures.js
…
genSuperKartTracks.js
…
genTACampaign.js feat(totalannihilation): add victory conditions, new defensive towers, and combat improvements 2026-07-25 08:23:11 -06:00
genTetrisAttackPuzzles.js
…
genZuma.js Add tunnels to Zuma: editor, engine, art, and audio 2026-07-28 17:20:11 -06:00
verifyAdvanceWars.js
…
verifyBalatro.js
…
verifyBejeweled.js
…
verifyBlockFighter.js
…
verifyBloxorz.js feat: overhaul Bloxorz rendering, mechanics, and level design; update Total Annihilation visuals 2026-07-25 14:50:23 -06:00
verifyBookwork.js
…
verifyCanasta.js
…
verifyCivilization.js
…
verifyColoradoDefense.js
…
verifyCribbage.js
…
verifyDotLink.js
…
verifyDungeonBoss.js
…
verifyGinRummy.js
…
verifyGooTower.js Goo Tower Levels 2026-07-26 15:23:18 -06:00
verifyJewelQuest.js
…
verifyJumble.js
…
verifyMahjong.js
…
verifyMahjongMatch.js
…
verifyMiniMotorways.js
…
verifyPaiGowPoker.js
…
verifyPeggle.js
…
verifyPuddingMonsters.js feat: pudding monsters waves 1-3, mahjong match FX, background art 2026-07-26 01:27:36 -06:00
verifyRisk.js
…
verifyRummikub.js
…
verifySWDBG.js
…
verifySlots.js
…
verifySpireClimb.js
…
verifyStarControl.js
…
verifySuperKart.js
…
verifyTempest.js
…
verifyTetrisAttack.js
…
verifyTotalAnnihilation.js feat(totalannihilation): add auto-heal for idle builders 2026-07-25 20:36:50 -06:00
verifyZuma.js Add tunnels to Zuma: editor, engine, art, and audio 2026-07-28 17:20:11 -06:00