← Back to the gamebug or idea?Terrapin Trail//Code BibleIIhow the game works, archive to van
Reel 07 · 7 min read

Taping the show

The skill mini-game: stages, grading, combos, and turning accuracy into tape quality.

Taping is the show's skill challenge: a staged "lock the needle in the zone" mini-game whose output is a tape quality number. It runs tape -> mini -> result.

Setup and the loop

startTaping(spot) builds S.mini from a per-spot config (crowd / section / board): a list of stages, each with a target center, a half-width half (the green zone), and optional danger. Better spots get tighter zones and a faster needle; stealth paint (bustGuard) widens the danger zones. A blank tape is required. In the browser, startMiniLoop() bounces the needle via requestAnimationFrame; headless tests just call lockMini() directly.

Grading a lock

●assets/game/game.js : 1811–1832trace ↗
1811  function lockMini() {
1812    var m = S.mini; if (!m) return;
1813    if (m.raf) cancelAnimationFrame(m.raf);
1814    var st = m.stages[m.idx];
1815    var dist = Math.abs(m.pos - st.center);
1816    var inZone = dist <= st.half;
1817    var ratio = dist / st.half; // 0 = dead-center, 1 = edge of the sweet spot
1818    // Grade each lock: nailing the center is a PERFECT, and stringing perfects/greats
1819    // together builds a combo that pays off in the final tape quality.
1820    var rating = !inZone ? "miss" : (ratio <= 0.22 ? "perfect" : (ratio <= 0.6 ? "great" : "good"));
1821    var acc = inZone ? Math.round(100 - ratio * 25)
1822      : Math.max(0, Math.round(55 - (dist - st.half) * 1.3));
1823    if (rating === "perfect" || rating === "great") m.combo += 1;
1824    else if (rating === "miss") m.combo = 0;
1825    if (m.combo > m.bestCombo) m.bestCombo = m.combo;
1826    m.lastRating = rating;
1827    m.results.push({ inZone: inZone, acc: acc, danger: !!st.danger, rating: rating, combo: m.combo });
1828    Sound.lock(acc, inZone);
1829    if (st.danger && !inZone) m.busted = true;
1830    m.idx++;
1831    // The needle picks up speed as the recording goes on -- later stages bite harder.
1832    m.speed = Math.min(m.speed * 1.12, m.baseSpeed * 2.2 + 0.6);
lockMini: distance from center gives a ratio; ratio buckets into perfect/great/good/miss; perfect/great build a combo; missing a danger stage busts you; the needle speeds up each stage.

Two things to notice. First, accuracy is continuous (100 - ratio*25 in-zone, a falloff out-of-zone) but the rating is bucketed — the buckets drive combos and sound, the raw accuracy drives quality. Second, all randomness (rnd, chance) goes through the seedable helpers, so a seeded test plays the identical mini-game every time.

Turning accuracy into quality

●assets/game/game.js : 1838–1852trace ↗
1838  function finishMini() {
1839    var m = S.mini;
1840    var accs = m.results.map(function (r) { return r.acc; });
1841    var avg = accs.reduce(function (a, b) { return a + b; }, 0) / accs.length;
1842    var q;
1843    if (m.spot === "crowd") q = avg * 0.55;
1844    else if (m.spot === "section") q = avg * 0.82 + S.taper / 3 + S.cred / 8;
1845    else q = avg * 0.95 + 5 + S.taper / 2 + S.cred / 6;
1846    // Gear and perks: better deck, golden ears, the disputed sweet spot, a blessing.
1847    q += (S.buff.tapeQuality || 0) + (S.flags.goldenEars ? 8 : 0) + (S.flags.goodSpot ? 6 : 0) + (crewHas(S, "rita") ? 6 : 0);
1848    if (S.flags.goodSpot) S.flags.goodSpot = false;
1849    // Combo payoff: each link past the first adds quality and gets called out.
1850    var comboBonus = m.bestCombo >= 2 ? (m.bestCombo - 1) * 5 : 0;
1851    q += comboBonus;
1852    var extra = comboBonus ? [m.bestCombo + "-lock combo -- steady hands paid off. +" + comboBonus + " tape quality."] : [];
finishMini: average accuracy, weighted by spot, plus taper skill and cred, plus gear/perk bonuses, plus a combo payoff.

The spot weighting is the whole risk/reward: crowd is avg * 0.55, section adds your taping skill and cred, board adds the most but is the hardest to nail. On top come the tapeQuality buff (better deck), Golden Ears (+8), the disputed sweet spot (+6, one-shot), Rita (+6), and a combo bonus of (bestCombo-1)*5.

Outcome

applyTapeOutcome(spot, quality, busted, extra) consumes the blank and resolves the result: a bust means a fine plus Vibes/cred hits; otherwise +1 tape with tiered flavor. A legendary tape requires a legendary stop, a board/section spot, and quality ≥ 60 (+1 legendaryTapes, +12 cred). Every show — taped or just attended via attendOnly() — grants a Vibe boost (bigger at legendary stops, plus show-Vibes gear and Bird). Taping or attending the finale ends the game as a win.

Key takeaways
  • Continuous accuracy drives quality; bucketed ratings drive combos and feedback.
  • Spot choice is the risk/reward dial; gear and perks are additive bonuses on top.
  • Legendary tapes need a legendary stop + board/section + quality ≥ 60; the finale ends the run.