feat: track total hits for logo letters and update related logic

This commit is contained in:
sha
2026-02-22 00:31:41 +02:00
parent 44d8b2d533
commit 6246e17f67
2 changed files with 20 additions and 5 deletions
+14 -4
View File
@@ -262,7 +262,8 @@ export class LogoController {
* @returns {number[]} * @returns {number[]}
*/ */
getHitCounts() { getHitCounts() {
return this.#letters.map(l => l.bumpCount); // return totalHits so previously stored values persist as totals
return this.#letters.map(l => l.totalHits);
} }
/** /**
@@ -273,9 +274,12 @@ export class LogoController {
setHitCounts(counts) { setHitCounts(counts) {
if (!Array.isArray(counts)) return; if (!Array.isArray(counts)) return;
for (let i = 0; i < this.#letters.length; i++) { for (let i = 0; i < this.#letters.length; i++) {
this.#letters[i].bumpCount = counts[i] ?? 0; const val = counts[i] ?? 0;
this.#letters[i].totalHits = val;
// keep bumpCount at least the same so ejection logic doesn't fire
this.#letters[i].bumpCount = Math.min(this.#letters[i].bumpCount, val);
if (this.#letters[i].debugEl) { if (this.#letters[i].debugEl) {
this.#letters[i].debugEl.textContent = String(this.#letters[i].bumpCount); this.#letters[i].debugEl.textContent = String(val);
} }
} }
} }
@@ -286,6 +290,7 @@ export class LogoController {
resetCounters() { resetCounters() {
for (const letter of this.#letters) { for (const letter of this.#letters) {
letter.bumpCount = 0; letter.bumpCount = 0;
letter.totalHits = 0;
if (letter.debugEl) letter.debugEl.textContent = '0'; if (letter.debugEl) letter.debugEl.textContent = '0';
// remove any red proximity colouring so letters appear white again // remove any red proximity colouring so letters appear white again
if (typeof letter._resetProximityColor === 'function') { if (typeof letter._resetProximityColor === 'function') {
@@ -327,9 +332,10 @@ export class LogoController {
slotIndex: i, slotIndex: i,
// no bumpThreshold argument -> constructor uses DEFAULTS range // no bumpThreshold argument -> constructor uses DEFAULTS range
}); });
// restore bumpCount/ejected/position if present // restore bumpCount/totalHits/ejected/position if present
if (saved) { if (saved) {
letter.bumpCount = saved.bumpCount ?? 0; letter.bumpCount = saved.bumpCount ?? 0;
letter.totalHits = saved.totalHits ?? 0;
letter.ejected = saved.ejected ?? false; letter.ejected = saved.ejected ?? false;
} }
return letter; return letter;
@@ -357,8 +363,12 @@ export class LogoController {
const saved = savedLetterStates?.[i]; const saved = savedLetterStates?.[i];
if (saved) { if (saved) {
letter.bumpCount = saved.bumpCount ?? 0; letter.bumpCount = saved.bumpCount ?? 0;
letter.totalHits = saved.totalHits ?? 0;
letter.ejected = saved.ejected ?? false; letter.ejected = saved.ejected ?? false;
// display restored total on debug label if visible
if (letter.debugEl) letter.debugEl.textContent = String(letter.totalHits);
// reflect proximity colour based on the restored bump count // reflect proximity colour based on the restored bump count
if (typeof letter._updateProximityColor === 'function') { if (typeof letter._updateProximityColor === 'function') {
letter._updateProximityColor(); letter._updateProximityColor();
+6 -1
View File
@@ -33,6 +33,8 @@ export class LogoLetter {
// ── Ejection state ─────────────────────────────────────── // ── Ejection state ───────────────────────────────────────
/** @type {boolean} */ ejected = false; /** @type {boolean} */ ejected = false;
/** @type {number} */ bumpCount = 0; /** @type {number} */ bumpCount = 0;
/** Total hits witnessed by this letter (never decremented). */
/** @type {number} */ totalHits = 0;
/** @type {number} */ bumpThreshold; /** @type {number} */ bumpThreshold;
// ── DOM ─────────────────────────────────────────────────── // ── DOM ───────────────────────────────────────────────────
@@ -183,7 +185,8 @@ export class LogoLetter {
*/ */
onBump() { onBump() {
this.bumpCount++; this.bumpCount++;
if (this.debugEl) this.debugEl.textContent = String(this.bumpCount); this.totalHits++;
if (this.debugEl) this.debugEl.textContent = String(this.totalHits);
// colour the letter based on how close it is to the threshold; we only // colour the letter based on how close it is to the threshold; we only
// start showing red when there are 10 or fewer hits remaining, interpolating // start showing red when there are 10 or fewer hits remaining, interpolating
@@ -236,6 +239,8 @@ export class LogoLetter {
*/ */
setDebugVisible(visible) { setDebugVisible(visible) {
this.el?.classList.toggle('logo-letter--show-debug', visible); this.el?.classList.toggle('logo-letter--show-debug', visible);
// when toggling on, ensure debug text reflects totalHits
if (visible && this.debugEl) this.debugEl.textContent = String(this.totalHits);
} }
/** /**