From 16650df85b64a2ea4a5d63878a3276d888d4688c Mon Sep 17 00:00:00 2001 From: Stephanie Gredell Date: Tue, 2 Sep 2025 17:37:55 -0700 Subject: [PATCH] think this is the final gameplay commit --- assets/sounds/played-card.mp3 | Bin 0 -> 35520 bytes assets/sounds/would-you-like-to-play.mp3 | Bin 0 -> 115200 bytes src/data/cards.js | 5 +- src/data/enemies.js | 53 +- src/data/maps.js | 28 +- src/main.js | 68 +- src/ui/render.js | 1263 +++++++++++----------- 7 files changed, 718 insertions(+), 699 deletions(-) create mode 100644 assets/sounds/played-card.mp3 create mode 100644 assets/sounds/would-you-like-to-play.mp3 diff --git a/assets/sounds/played-card.mp3 b/assets/sounds/played-card.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4564ffbdf3996a2c1bedf78e24173f7f66f60742 GIT binary patch literal 35520 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 Q@}2_OWd8dgOXK_IWR4oY*Ko$js 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 yhzgLhzwS#J) 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 d { - ctx.draw(1); ctx.log("Code review reveals useful insights. You draw a card."); } @@ -338,7 +335,7 @@ export const CARDS = { export const STARTER_DECK = [ "strike", "strike", "defend", "defend", "segfault", "coffee_rush", "skill_issue", "git_commit", - "stack_trace", "raw_dog" + "stack_trace", "stack_trace" ]; export const CARD_POOL = [ diff --git a/src/data/enemies.js b/src/data/enemies.js index 66745ad..a7e11f0 100644 --- a/src/data/enemies.js +++ b/src/data/enemies.js @@ -22,8 +22,15 @@ export const ENEMIES = { ctx.log("Codegirl resolves the merge conflict and heals 8 HP!"); } }, + lowkeyabu: { + id: "lowkeyabu", name: "LowKeyAbu", maxHp: 85, + avatar: "assets/avatars/7.png", // Powerful demon/witch + background: "assets/backgrounds/castle.png", // Repeat background + ai: (turn) => turn % 3 === 1 ? { type: "debuff", value: 1 } : { type: "attack", value: 10 }, + onDebuff: (ctx) => ctx.applyVulnerable(ctx.player, 1) + }, nightshadedude: { - id: "nightshadedude", name: "Nightshadedude", maxHp: 85, + id: "nightshadedude", name: "Nightshadedude", maxHp: 120, avatar: "assets/avatars/11.png", // Powerful demon/witch background: "assets/backgrounds/dead forest.png", // Repeat background ai: (turn) => turn % 3 === 1 ? { type: "debuff", value: 1 } : { type: "attack", value: 14 }, @@ -57,28 +64,28 @@ export const ENEMIES = { }, // ACT 2 ENEMIES - Harder versions - senior_dev: { - id: "senior_dev", name: "Senior Dev", maxHp: 65, + teej: { + id: "teej", name: "Teej", maxHp: 65, avatar: "assets/avatars/elite_ts_demon.png", background: "assets/backgrounds/castle.png", ai: (turn) => turn % 3 === 0 ? { type: "debuff", value: 2 } : { type: "attack", value: turn % 2 === 0 ? 12 : 14 }, onDebuff: (ctx) => ctx.applyWeak(ctx.player, 2) }, - tech_lead: { - id: "tech_lead", name: "Tech Lead", maxHp: 80, + begin: { + id: "begin", name: "Begin", maxHp: 80, avatar: "assets/avatars/infinite_loop.png", background: "assets/backgrounds/dead forest.png", ai: (turn) => (turn % 2 === 0) ? { type: "attack", value: 16 } : { type: "block", value: 12 } }, - code_reviewer: { - id: "code_reviewer", name: "Code Reviewer", maxHp: 70, + adam: { + id: "adam", name: "Adam", maxHp: 70, avatar: "assets/avatars/chat_gremlin.png", background: "assets/backgrounds/terrace.png", ai: (turn) => turn % 4 === 0 ? { type: "debuff", value: 1 } : { type: "attack", value: 13 }, - onDebuff: (ctx) => { ctx.applyVulnerable(ctx.player, 1); ctx.log("Code Reviewer finds bugs in your logic!"); } + onDebuff: (ctx) => { ctx.applyVulnerable(ctx.player, 1); ctx.log("Adam finds bugs in your logic!"); } }, - scrum_master: { - id: "scrum_master", name: "Scrum Master", maxHp: 90, + david: { + id: "david", name: "David", maxHp: 90, avatar: "assets/avatars/js_blob.png", background: "assets/backgrounds/castle.png", ai: (turn) => { @@ -87,10 +94,10 @@ export const ENEMIES = { if (cyc === 1) return { type: "attack", value: 11 }; return { type: "debuff", value: 1 }; }, - onDebuff: (ctx) => { ctx.flags.nextTurnEnergyPenalty = (ctx.flags.nextTurnEnergyPenalty || 0) + 1; ctx.log("Scrum Master schedules another meeting! Lose 1 energy next turn."); } + onDebuff: (ctx) => { ctx.flags.nextTurnEnergyPenalty = (ctx.flags.nextTurnEnergyPenalty || 0) + 1; ctx.log("David schedules another meeting! Lose 1 energy next turn."); } }, - architect: { - id: "architect", name: "The Architect", maxHp: 150, + dax: { + id: "dax", name: "Dax", maxHp: 150, avatar: "assets/avatars/bug_404.png", background: "assets/backgrounds/throne room.png", ai: (turn) => { @@ -101,7 +108,23 @@ export const ENEMIES = { if (cyc === 4) return { type: "attack", value: 30 }; return { type: "attack", value: 20 }; }, - onDebuff: (ctx) => { ctx.applyWeak(ctx.player, 2); ctx.applyVulnerable(ctx.player, 1); ctx.log("The Architect redesigns your entire approach!"); }, - onBlock: (ctx) => { ctx.enemy.hp = Math.min(ctx.enemy.maxHp, ctx.enemy.hp + 12); ctx.log("The Architect refactors and optimizes, healing 12 HP!"); } + onDebuff: (ctx) => { ctx.applyWeak(ctx.player, 2); ctx.applyVulnerable(ctx.player, 1); ctx.log("Dax redesigns your entire approach!"); }, + onBlock: (ctx) => { ctx.enemy.hp = Math.min(ctx.enemy.maxHp, ctx.enemy.hp + 12); ctx.log("Dax refactors and optimizes, healing 12 HP!"); } + }, + taylor: { + id: "taylor", name: "Taylor Otwell", maxHp: 150, + avatar: "assets/avatars/bug_404.png", + background: "assets/backgrounds/throne room.png", + ai: (turn) => { + const cyc = turn % 5; + if (cyc === 1) return { type: "debuff", value: 2 }; + if (cyc === 2) return { type: "attack", value: 25 }; + if (cyc === 3) return { type: "block", value: 15 }; + if (cyc === 4) return { type: "attack", value: 30 }; + return { type: "attack", value: 20 }; + }, + onDebuff: (ctx) => { ctx.applyWeak(ctx.player, 2); ctx.applyVulnerable(ctx.player, 1); ctx.log("Taylor redesigns your entire approach!"); }, + onBlock: (ctx) => { ctx.enemy.hp = Math.min(ctx.enemy.maxHp, ctx.enemy.hp + 12); ctx.log("Taylor refactors and optimizes, healing 12 HP!"); } } + }; diff --git a/src/data/maps.js b/src/data/maps.js index 26c5f07..9b772c4 100644 --- a/src/data/maps.js +++ b/src/data/maps.js @@ -14,27 +14,27 @@ export const MAPS = { { id: "n9", kind: "rest", next: ["n11"], x: 350, y: 330 }, { id: "n10", kind: "shop", next: ["n11"], x: 650, y: 330 }, { id: "n11", kind: "battle", enemy: "lithium", next: ["n12"], x: 500, y: 280 }, - { id: "n12", kind: "elite", enemy: "nightshadedude", next: ["n13"], x: 500, y: 205 }, + { id: "n12", kind: "elite", enemy: "lowkeyabu", next: ["n13"], x: 500, y: 205 }, { id: "n13", kind: "rest", next: ["n14"], x: 500, y: 125 }, - { id: "n14", kind: "boss", enemy: "teej", next: [], x: 500, y: 40 }, + { id: "n14", kind: "boss", enemy: "nightshadedude", next: [], x: 500, y: 40 }, ] }, act2: { id: "act2", name: "Birthday Spire — Act II: The Corporate Ladder", nodes: [ { id: "a2n1", kind: "start", next: ["a2n2", "a2n3"], x: 500, y: 760 }, - { id: "a2n2", kind: "battle", enemy: "senior_dev", next: ["a2n4", "a2n5"], x: 400, y: 680 }, - { id: "a2n3", kind: "event", next: ["a2n5"], x: 600, y: 680 }, - { id: "a2n4", kind: "shop", next: ["a2n6"], x: 300, y: 600 }, - { id: "a2n5", kind: "battle", enemy: "tech_lead", next: ["a2n6", "a2n7"], x: 500, y: 600 }, - { id: "a2n6", kind: "battle", enemy: "code_reviewer", next: ["a2n8"], x: 400, y: 520 }, - { id: "a2n7", kind: "rest", next: ["a2n8"], x: 600, y: 520 }, - { id: "a2n8", kind: "battle", enemy: "scrum_master", next: ["a2n9", "a2n10"], x: 500, y: 440 }, - { id: "a2n9", kind: "event", next: ["a2n11"], x: 350, y: 360 }, - { id: "a2n10", kind: "shop", next: ["a2n11"], x: 650, y: 360 }, - { id: "a2n11", kind: "elite", enemy: "senior_dev", next: ["a2n12"], x: 500, y: 280 }, - { id: "a2n12", kind: "rest", next: ["a2n13"], x: 500, y: 200 }, - { id: "a2n13", kind: "boss", enemy: "architect", next: [], x: 500, y: 120 }, + { id: "a2n2", kind: "battle", enemy: "teej", next: ["a2n5"], x: 300, y: 695 }, + { id: "a2n3", kind: "event", next: ["a2n5"], x: 650, y: 695 }, + { id: "a2n5", kind: "battle", enemy: "begin", next: ["a2n4", "a2n7"], x: 500, y: 600 }, + { id: "a2n4", kind: "shop", next: ["a2n6"], x: 350, y: 525 }, + { id: "a2n7", kind: "rest", next: ["a2n6"], x: 650, y: 525 }, + { id: "a2n6", kind: "battle", enemy: "adam", next: ["a2n8"], x: 500, y: 460 }, + { id: "a2n8", kind: "battle", enemy: "david", next: ["a2n9", "a2n10"], x: 500, y: 360 }, + { id: "a2n9", kind: "rest", next: ["a2n11"], x: 350, y: 320 }, + { id: "a2n10", kind: "shop", next: ["a2n11"], x: 650, y: 320 }, + { id: "a2n11", kind: "elite", enemy: "dax", next: ["a2n12"], x: 500, y: 250 }, + { id: "a2n12", kind: "rest", next: ["a2n13"], x: 500, y: 140 }, + { id: "a2n13", kind: "boss", enemy: "taylor", next: [], x: 500, y: 40 }, ] } }; diff --git a/src/main.js b/src/main.js index b5d4bd0..3020457 100644 --- a/src/main.js +++ b/src/main.js @@ -28,7 +28,7 @@ const root = { this.nodeId = nextId; // Always set nodeId (needed for battle logic) const node = this.map.nodes.find(n => n.id === nextId); if (!node) return; - + if (node.kind === "battle" || node.kind === "elite" || node.kind === "boss") { this._battleInProgress = true; @@ -53,7 +53,7 @@ const root = { if (this.nodeId && !this.completedNodes.includes(this.nodeId)) { this.completedNodes.push(this.nodeId); } - + const node = this.map.nodes.find(n => n.id === this.nodeId); if (node.kind === "battle" || node.kind === "elite") { @@ -79,10 +79,10 @@ const root = { this.save(); await renderMap(this); }, - async skipReward() { - this._pendingChoices = null; + async skipReward() { + this._pendingChoices = null; this.save(); - await renderMap(this); + await renderMap(this); }, async onWin() { @@ -91,12 +91,12 @@ const root = { const goldReward = Math.floor(Math.random() * 20) + 15; // 15-35 gold this.player.gold = (this.player.gold || 0) + goldReward; this.log(`+${goldReward} gold`); - + this._battleInProgress = false; - + const node = this.map.nodes.find(n => n.id === this.nodeId); - if (node.kind === "boss") { + if (node.kind === "boss") { // Check if there's a next act const nextAct = this.currentAct === "act1" ? "act2" : null; if (nextAct && MAPS[nextAct]) { @@ -112,20 +112,19 @@ const root = { // Final victory this.save(); // Save progress before clearing on victory this.clearSave(); // Clear save on victory - await renderWin(this); + await renderWin(this); } } else { - this.save(); this.afterNode(); } }, - async onLose() { + async onLose() { this._battleInProgress = false; this.clearSave(); // Clear save on defeat - await renderLose(this); + await renderLose(this); }, reset() { @@ -142,7 +141,6 @@ const root = { async selectStartingRelic(relicId) { attachRelics(this, [relicId]); - this.log(`Selected starting relic: ${relicId}`); this.save(); await renderMap(this); }, @@ -170,20 +168,20 @@ const root = { const saveData = localStorage.getItem('birthday-spire-save'); if (saveData) { const data = JSON.parse(saveData); - + // Validate essential save data if (!data || typeof data !== 'object') { throw new Error('Invalid save data format'); } - + if (!data.player || typeof data.player !== 'object') { throw new Error('Invalid player data'); } - + if (!data.nodeId || typeof data.nodeId !== 'string') { throw new Error('Invalid node ID'); } - + // Validate current act and ensure map exists const actId = data.currentAct || "act1"; if (!MAPS[actId]) { @@ -192,9 +190,9 @@ const root = { } else { this.currentAct = actId; } - + this.map = MAPS[this.currentAct]; - + // Validate that the nodeId exists in the current map const nodeExists = this.map.nodes.some(n => n.id === data.nodeId); if (!nodeExists) { @@ -203,7 +201,7 @@ const root = { } else { this.nodeId = data.nodeId; } - + // Validate player data has required fields if (typeof data.player.hp !== 'number' || data.player.hp < 0) { throw new Error('Invalid player HP'); @@ -214,15 +212,15 @@ const root = { if (!Array.isArray(data.player.deck)) { throw new Error('Invalid player deck'); } - + this.player = data.player; this.relicStates = Array.isArray(data.relicStates) ? data.relicStates : []; this.completedNodes = Array.isArray(data.completedNodes) ? data.completedNodes : []; this.logs = Array.isArray(data.logs) ? data.logs : []; this._battleInProgress = Boolean(data.battleInProgress); - + this.restoreCardEffects(); - + this.log('Game loaded from save.'); return true; } @@ -255,7 +253,7 @@ const root = { clearSave() { localStorage.removeItem('birthday-spire-save'); }, - + // Clear any old saves with outdated card IDs clearOldSaves() { localStorage.removeItem('birthday-spire-save'); @@ -295,21 +293,21 @@ async function initializeGame() { const urlParams = new URLSearchParams(window.location.search); const screenParam = urlParams.get('screen'); const dev = urlParams.get('dev'); - + // Check if it's ThePrimeagen's birthday yet (September 9, 2025) // Skip countdown if ?dev=true is in URL const now = new Date(); const birthday = new Date('2025-09-09T00:00:00'); - - + + if (now < birthday && dev !== 'true') { showCountdown(birthday); return; } - + if (screenParam) { setupMockData(); - + switch (screenParam.toLowerCase()) { case 'victory': case 'win': @@ -364,9 +362,9 @@ function setupMockData() { root.player.hand = ['strike', 'coffee_rush', 'raw_dog']; root.player.draw = ['defend', 'segfault']; root.player.discard = ['virgin']; - + attachRelics(root, ['coffee_thermos', 'cpp_compiler']); - + // Test Act 2 if ?act2=true is in URL const urlParams = new URLSearchParams(window.location.search); if (urlParams.get('act2') === 'true') { @@ -424,24 +422,24 @@ function showCountdown(birthday) { `; - + // Start the countdown timer const timer = setInterval(() => { const now = new Date(); const timeLeft = birthday - now; - + if (timeLeft <= 0) { clearInterval(timer); // Birthday reached! Reload to show the game window.location.reload(); return; } - + const days = Math.floor(timeLeft / (1000 * 60 * 60 * 24)); const hours = Math.floor((timeLeft % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); const minutes = Math.floor((timeLeft % (1000 * 60 * 60)) / (1000 * 60)); const seconds = Math.floor((timeLeft % (1000 * 60)) / 1000); - + document.getElementById('days').textContent = days.toString().padStart(2, '0'); document.getElementById('hours').textContent = hours.toString().padStart(2, '0'); document.getElementById('minutes').textContent = minutes.toString().padStart(2, '0'); diff --git a/src/ui/render.js b/src/ui/render.js index 175f339..ef77813 100644 --- a/src/ui/render.js +++ b/src/ui/render.js @@ -1,66 +1,66 @@ // Simple audio utility function playSound(soundFile) { - try { - const audio = new Audio(`assets/sounds/${soundFile}`); - audio.volume = 0.3; - audio.play().catch(e => { }); // Silently fail if no audio - } catch (e) { - // Silently fail if audio not available - } + try { + const audio = new Audio(`assets/sounds/${soundFile}`); + audio.volume = 0.3; + audio.play().catch(e => { console.log(e) }); // Silently fail if no audio + } catch (e) { + // Silently fail if audio not available + } } export function showDamageNumber(damage, target, isPlayer = false) { - const targetElement = isPlayer ? - document.querySelector('.player-battle-zone') : - document.querySelector('.enemy-battle-zone'); + const targetElement = isPlayer ? + document.querySelector('.player-battle-zone') : + document.querySelector('.enemy-battle-zone'); - if (!targetElement) return; + if (!targetElement) return; - const damageNumber = document.createElement('div'); - damageNumber.className = 'damage-number'; - damageNumber.textContent = damage; + const damageNumber = document.createElement('div'); + damageNumber.className = 'damage-number'; + damageNumber.textContent = damage; - const rect = targetElement.getBoundingClientRect(); - damageNumber.style.left = `${rect.left + rect.width / 2}px`; - damageNumber.style.top = `${rect.top + rect.height / 2}px`; + const rect = targetElement.getBoundingClientRect(); + damageNumber.style.left = `${rect.left + rect.width / 2}px`; + damageNumber.style.top = `${rect.top + rect.height / 2}px`; - document.body.appendChild(damageNumber); + document.body.appendChild(damageNumber); - requestAnimationFrame(() => { - damageNumber.classList.add('damage-number-animate'); - }); + requestAnimationFrame(() => { + damageNumber.classList.add('damage-number-animate'); + }); - setTimeout(() => { - if (damageNumber.parentNode) { - damageNumber.parentNode.removeChild(damageNumber); - } - }, 1000); + setTimeout(() => { + if (damageNumber.parentNode) { + damageNumber.parentNode.removeChild(damageNumber); + } + }, 1000); } export async function renderBattle(root) { - const app = root.app; - const p = root.player, e = root.enemy; + const app = root.app; + const p = root.player, e = root.enemy; - const { ENEMIES } = await import("../data/enemies.js"); - const { CARDS } = await import("../data/cards.js"); - const { RELICS } = await import("../data/relics.js"); - const enemyData = ENEMIES[e.id]; - const backgroundImage = enemyData?.background || null; + const { ENEMIES } = await import("../data/enemies.js"); + const { CARDS } = await import("../data/cards.js"); + const { RELICS } = await import("../data/relics.js"); + const enemyData = ENEMIES[e.id]; + const backgroundImage = enemyData?.background || null; - const intentInfo = { - attack: { emoji: '', text: `Will attack for ${e.intent.value} damage`, color: 'danger' }, - block: { emoji: '', text: `Will gain ${e.intent.value} block`, color: 'info' }, - debuff: { emoji: '', text: 'Will apply a debuff', color: 'warning' }, - heal: { emoji: '', text: `Will heal for ${e.intent.value} HP`, color: 'success' } - }[e.intent.type] || { emoji: '', text: 'Unknown intent', color: 'neutral' }; + const intentInfo = { + attack: { emoji: '', text: `Will attack for ${e.intent.value} damage`, color: 'danger' }, + block: { emoji: '', text: `Will gain ${e.intent.value} block`, color: 'info' }, + debuff: { emoji: '', text: 'Will apply a debuff', color: 'warning' }, + heal: { emoji: '', text: `Will heal for ${e.intent.value} HP`, color: 'success' } + }[e.intent.type] || { emoji: '', text: 'Unknown intent', color: 'neutral' }; - app.innerHTML = ` + app.innerHTML = `
@@ -168,8 +168,8 @@ export async function renderBattle(root) {
${Array.from({ length: p.maxEnergy }, (_, i) => - `
` - ).join('')} + `
` + ).join('')}
@@ -187,11 +187,11 @@ export async function renderBattle(root) {
${p.hand.length === 0 ? - '
🎴 No cards in hand - End turn to draw new cards
' : - p.hand.map((card, i) => { - const canPlay = p.energy >= card.cost; - const cardType = card.type === 'attack' ? 'attack' : card.type === 'skill' ? 'skill' : 'power'; - return ` + '
🎴 No cards in hand - End turn to draw new cards
' : + p.hand.map((card, i) => { + const canPlay = p.energy >= card.cost; + const cardType = card.type === 'attack' ? 'attack' : card.type === 'skill' ? 'skill' : 'power'; + return `
@@ -212,8 +212,8 @@ export async function renderBattle(root) { ${!canPlay ? `
Need ${card.cost} energy
` : ''}
`; - }).join('') - } + }).join('') + }
@@ -238,147 +238,148 @@ export async function renderBattle(root) {
`; - app.querySelectorAll("[data-play]").forEach(btn => { - btn.addEventListener("mouseenter", () => { - if (btn.classList.contains('playable')) { - playSound('swipe.mp3'); - root.selectedCardIndex = null; - updateCardSelection(root); - } - }); + app.querySelectorAll("[data-play]").forEach(btn => { + btn.addEventListener("mouseenter", () => { + if (btn.classList.contains('playable')) { + playSound('swipe.mp3'); + root.selectedCardIndex = null; + updateCardSelection(root); + } + }); - btn.addEventListener("click", () => { - const index = parseInt(btn.dataset.play, 10); - const card = p.hand[index]; - if (p.energy >= card.cost) { - root.play(index); - // Clear selection when card is played via mouse - root.selectedCardIndex = null; - updateCardSelection(root); - } + btn.addEventListener("click", () => { + const index = parseInt(btn.dataset.play, 10); + const card = p.hand[index]; + if (p.energy >= card.cost) { + playSound('played-card.mp3') + root.play(index); + // Clear selection when card is played via mouse + root.selectedCardIndex = null; + updateCardSelection(root); + } + }); }); - }); - const endTurnBtn = app.querySelector("[data-action='end']"); - if (endTurnBtn) { + const endTurnBtn = app.querySelector("[data-action='end']"); + if (endTurnBtn) { - endTurnBtn.addEventListener("click", () => { + endTurnBtn.addEventListener("click", () => { - try { - root.end(); - } catch (error) { - console.error("Error ending turn:", error); - } - }); - } - - // Initialize card selection state if not exists - if (!root.selectedCardIndex) { - root.selectedCardIndex = null; - } - - window.onkeydown = (e) => { - if (e.key.toLowerCase() === "e") { - try { - root.end(); - } catch (error) { - console.error("Error ending turn via keyboard:", error); - } + try { + root.end(); + } catch (error) { + console.error("Error ending turn:", error); + } + }); } - const n = parseInt(e.key, 10); - if (n >= 1 && n <= p.hand.length) { - const cardIndex = n - 1; - const card = p.hand[cardIndex]; - - if (root.selectedCardIndex === cardIndex) { - // Second press of same key - play the card - if (p.energy >= card.cost) { - root.play(cardIndex); - root.selectedCardIndex = null; // Clear selection - updateCardSelection(root); - } - } else { - // First press or different key - select the card - root.selectedCardIndex = cardIndex; - updateCardSelection(root); - playSound('swipe.mp3'); // Play swipe sound on keyboard selection - } + // Initialize card selection state if not exists + if (!root.selectedCardIndex) { + root.selectedCardIndex = null; } - }; - // Auto-scroll fight log to bottom - const logContent = document.getElementById('fight-log-content'); - if (logContent) { - logContent.scrollTop = logContent.scrollHeight; - } + window.onkeydown = (e) => { + if (e.key.toLowerCase() === "e") { + try { + root.end(); + } catch (error) { + console.error("Error ending turn via keyboard:", error); + } + } + + const n = parseInt(e.key, 10); + if (n >= 1 && n <= p.hand.length) { + const cardIndex = n - 1; + const card = p.hand[cardIndex]; + + if (root.selectedCardIndex === cardIndex) { + // Second press of same key - play the card + if (p.energy >= card.cost) { + root.play(cardIndex); + root.selectedCardIndex = null; // Clear selection + updateCardSelection(root); + } + } else { + // First press or different key - select the card + root.selectedCardIndex = cardIndex; + updateCardSelection(root); + playSound('swipe.mp3'); // Play swipe sound on keyboard selection + } + } + }; + + // Auto-scroll fight log to bottom + const logContent = document.getElementById('fight-log-content'); + if (logContent) { + logContent.scrollTop = logContent.scrollHeight; + } - // Apply initial card selection visual state - updateCardSelection(root); + // Apply initial card selection visual state + updateCardSelection(root); } export async function renderMap(root) { - const { CARDS } = await import("../data/cards.js"); - const { ENEMIES } = await import("../data/enemies.js"); - const { RELICS } = await import("../data/relics.js"); - const m = root.map; - const currentId = root.nodeId; - - const currentNode = m.nodes.find(n => n.id === currentId); - const nextIds = currentNode ? currentNode.next : []; - - const getNodeEmoji = (kind) => { - const emojis = { - start: 'Start', - battle: 'Battle', - elite: 'Battle', - boss: 'Boss', - rest: 'Rest', - shop: 'Shop', - event: 'Event' + const { CARDS } = await import("../data/cards.js"); + const { ENEMIES } = await import("../data/enemies.js"); + const { RELICS } = await import("../data/relics.js"); + const m = root.map; + const currentId = root.nodeId; + + const currentNode = m.nodes.find(n => n.id === currentId); + const nextIds = currentNode ? currentNode.next : []; + + const getNodeEmoji = (kind) => { + const emojis = { + start: 'Start', + battle: 'Battle', + elite: 'Battle', + boss: 'Boss', + rest: 'Rest', + shop: 'Shop', + event: 'Event' + }; + return emojis[kind] || '❓'; }; - return emojis[kind] || '❓'; - }; - - const getNodeDescription = (node) => { - switch (node.kind) { - case 'start': - return 'Starting Point\nBegin your journey up ThePrimeagen Spire'; - case 'battle': - const enemy = ENEMIES[node.enemy]; - return `Battle\nFight: ${enemy?.name || 'Unknown Enemy'}\nHP: ${enemy?.maxHp || '?'}`; - case 'elite': - const elite = ENEMIES[node.enemy]; - return `Elite Battle\nFight: ${elite?.name || 'Unknown Elite'}\nHP: ${elite?.maxHp || '?'}\nTough enemy with better rewards`; - case 'boss': - const boss = ENEMIES[node.enemy]; - return `Boss Battle\nFight: ${boss?.name || 'Unknown Boss'}\nHP: ${boss?.maxHp || '?'}\nFinal challenge of the act`; - case 'rest': - return 'Rest Site\nHeal up to 30% max HP\nor upgrade a card'; - case 'shop': - return 'Shop\nSpend your hard-earned gold'; - case 'event': - return 'Random Event\nBirthday-themed encounter\nUnknown outcome\nPotential rewards or challenges'; - default: - return 'Unknown\nMysterious node'; - } - }; - const getNodeTooltipData = (node) => { - const description = getNodeDescription(node); - let avatarPath = null; + const getNodeDescription = (node) => { + switch (node.kind) { + case 'start': + return 'Starting Point\nBegin your journey up ThePrimeagen Spire'; + case 'battle': + const enemy = ENEMIES[node.enemy]; + return `Battle\nFight: ${enemy?.name || 'Unknown Enemy'}\nHP: ${enemy?.maxHp || '?'}`; + case 'elite': + const elite = ENEMIES[node.enemy]; + return `Elite Battle\nFight: ${elite?.name || 'Unknown Elite'}\nHP: ${elite?.maxHp || '?'}\nTough enemy with better rewards`; + case 'boss': + const boss = ENEMIES[node.enemy]; + return `Boss Battle\nFight: ${boss?.name || 'Unknown Boss'}\nHP: ${boss?.maxHp || '?'}\nFinal challenge of the act`; + case 'rest': + return 'Rest Site\nHeal up to 30% max HP\nor upgrade a card'; + case 'shop': + return 'Shop\nSpend your hard-earned gold'; + case 'event': + return 'Random Event\nBirthday-themed encounter\nUnknown outcome\nPotential rewards or challenges'; + default: + return 'Unknown\nMysterious node'; + } + }; - if (['battle', 'elite', 'boss'].includes(node.kind) && node.enemy) { - const enemy = ENEMIES[node.enemy]; - if (enemy?.avatar) { - avatarPath = enemy.avatar; - } - } + const getNodeTooltipData = (node) => { + const description = getNodeDescription(node); + let avatarPath = null; - return { description, avatarPath }; - }; + if (['battle', 'elite', 'boss'].includes(node.kind) && node.enemy) { + const enemy = ENEMIES[node.enemy]; + if (enemy?.avatar) { + avatarPath = enemy.avatar; + } + } - root.app.innerHTML = ` + return { description, avatarPath }; + }; + + root.app.innerHTML = `
@@ -587,17 +588,17 @@ May this birthday bring joy in each moment you’ve got.

${Object.entries( - root.player.deck.reduce((acc, cardId) => { - acc[cardId] = (acc[cardId] || 0) + 1; - return acc; - }, {}) - ).map(([cardId, count], index) => { - const card = CARDS[cardId]; - if (!card) return ''; + root.player.deck.reduce((acc, cardId) => { + acc[cardId] = (acc[cardId] || 0) + 1; + return acc; + }, {}) + ).map(([cardId, count], index) => { + const card = CARDS[cardId]; + if (!card) return ''; - const cardType = card.type === 'attack' ? 'attack' : card.type === 'skill' ? 'skill' : 'power'; + const cardType = card.type === 'attack' ? 'attack' : card.type === 'skill' ? 'skill' : 'power'; - return ` + return `
@@ -612,7 +613,7 @@ May this birthday bring joy in each moment you’ve got.

`; - }).join('')} + }).join('')}
@@ -621,20 +622,20 @@ May this birthday bring joy in each moment you’ve got.

`; - root.app.querySelectorAll("[data-node]").forEach(el => { - if (!el.dataset.node) return; - el.addEventListener("click", () => root.go(el.dataset.node)); - }); + root.app.querySelectorAll("[data-node]").forEach(el => { + if (!el.dataset.node) return; + el.addEventListener("click", () => root.go(el.dataset.node)); + }); - window.showTooltip = function (event) { - const tooltip = document.getElementById('custom-tooltip'); - const node = event.target.closest('.spire-node'); - const content = node.dataset.tooltip; - const avatarPath = node.dataset.avatar; + window.showTooltip = function(event) { + const tooltip = document.getElementById('custom-tooltip'); + const node = event.target.closest('.spire-node'); + const content = node.dataset.tooltip; + const avatarPath = node.dataset.avatar; - let tooltipHTML = ''; - if (avatarPath) { - tooltipHTML = ` + let tooltipHTML = ''; + if (avatarPath) { + tooltipHTML = `
Enemy Avatar

${content}
`; - } else { - tooltipHTML = content; - } + } else { + tooltipHTML = content; + } - tooltip.innerHTML = tooltipHTML; - tooltip.style.display = 'block'; + tooltip.innerHTML = tooltipHTML; + tooltip.style.display = 'block'; - const rect = node.getBoundingClientRect(); - tooltip.style.left = (rect.right + 15) + 'px'; - tooltip.style.top = (rect.top + rect.height / 2 - tooltip.offsetHeight / 2) + 'px'; + const rect = node.getBoundingClientRect(); + tooltip.style.left = (rect.right + 15) + 'px'; + tooltip.style.top = (rect.top + rect.height / 2 - tooltip.offsetHeight / 2) + 'px'; - const tooltipRect = tooltip.getBoundingClientRect(); - if (tooltipRect.right > window.innerWidth) { - tooltip.style.left = (rect.left - tooltip.offsetWidth - 15) + 'px'; - } - if (tooltipRect.top < 0) { - tooltip.style.top = '10px'; - } - if (tooltipRect.bottom > window.innerHeight) { - tooltip.style.top = (window.innerHeight - tooltip.offsetHeight - 10) + 'px'; - } - }; + const tooltipRect = tooltip.getBoundingClientRect(); + if (tooltipRect.right > window.innerWidth) { + tooltip.style.left = (rect.left - tooltip.offsetWidth - 15) + 'px'; + } + if (tooltipRect.top < 0) { + tooltip.style.top = '10px'; + } + if (tooltipRect.bottom > window.innerHeight) { + tooltip.style.top = (window.innerHeight - tooltip.offsetHeight - 10) + 'px'; + } + }; - window.hideTooltip = function () { - const tooltip = document.getElementById('custom-tooltip'); - tooltip.style.display = 'none'; - }; + window.hideTooltip = function() { + const tooltip = document.getElementById('custom-tooltip'); + tooltip.style.display = 'none'; + }; - const resetBtn = root.app.querySelector("[data-reset]"); - resetBtn.addEventListener("click", () => { - root.clearSave(); - root.reset(); - }); + const resetBtn = root.app.querySelector("[data-reset]"); + resetBtn.addEventListener("click", () => { + root.clearSave(); + root.reset(); + }); } export async function renderReward(root, choices) { - const { CARDS } = await import("../data/cards.js"); - root.app.innerHTML = ` + const { CARDS } = await import("../data/cards.js"); + root.app.innerHTML = `

Choose a Card

${choices.map((c, idx) => { - const cardType = c.type === 'attack' ? 'attack' : c.type === 'skill' ? 'skill' : 'power'; - return ` + const cardType = c.type === 'attack' ? 'attack' : c.type === 'skill' ? 'skill' : 'power'; + return `
@@ -713,25 +714,25 @@ export async function renderReward(root, choices) {
`; - }).join("")} + }).join("")}
`; - root.app.querySelectorAll("[data-pick]").forEach(btn => { - btn.addEventListener("click", () => { - const idx = parseInt(btn.dataset.pick, 10); - root.takeReward(idx); + root.app.querySelectorAll("[data-pick]").forEach(btn => { + btn.addEventListener("click", () => { + const idx = parseInt(btn.dataset.pick, 10); + root.takeReward(idx); + }); }); - }); - root.app.querySelector("[data-skip]").addEventListener("click", () => root.skipReward()); + root.app.querySelector("[data-skip]").addEventListener("click", () => root.skipReward()); } export async function renderRest(root) { - const { CARDS } = await import("../data/cards.js"); - root.app.innerHTML = ` + const { CARDS } = await import("../data/cards.js"); + root.app.innerHTML = `

Rest and Recover

@@ -761,35 +762,35 @@ export async function renderRest(root) {
`; - root.app.querySelector("[data-act='heal']").addEventListener("click", () => { - const heal = Math.floor(root.player.maxHp * 0.2); - root.player.hp = Math.min(root.player.maxHp, root.player.hp + heal); - root.log(`Rested: +${heal} HP`); - root.afterNode(); - }); - root.app.querySelector("[data-act='upgrade']").addEventListener("click", () => { - renderUpgrade(root); - }); + root.app.querySelector("[data-act='heal']").addEventListener("click", () => { + const heal = Math.floor(root.player.maxHp * 0.2); + root.player.hp = Math.min(root.player.maxHp, root.player.hp + heal); + root.log(`Rested: +${heal} HP`); + root.afterNode(); + }); + root.app.querySelector("[data-act='upgrade']").addEventListener("click", () => { + renderUpgrade(root); + }); } export function renderUpgrade(root) { - import("../data/cards.js").then(({ CARDS }) => { - const upgradableCards = root.player.deck - .map((cardId, index) => ({ cardId, index })) - .filter(({ cardId }) => { - const card = CARDS[cardId]; - - return card?.upgrades && !cardId.endsWith('+'); - }) - .slice(0, 3); // Show max 3 options - - if (upgradableCards.length === 0) { - root.log("No cards can be upgraded."); - root.afterNode(); - return; - } + import("../data/cards.js").then(({ CARDS }) => { + const upgradableCards = root.player.deck + .map((cardId, index) => ({ cardId, index })) + .filter(({ cardId }) => { + const card = CARDS[cardId]; + + return card?.upgrades && !cardId.endsWith('+'); + }) + .slice(0, 3); // Show max 3 options + + if (upgradableCards.length === 0) { + root.log("No cards can be upgraded."); + root.afterNode(); + return; + } - root.app.innerHTML = ` + root.app.innerHTML = `

⬆️ Upgrade a Card

@@ -798,14 +799,14 @@ export function renderUpgrade(root) {
${upgradableCards.map(({ cardId, index }) => { - const card = CARDS[cardId]; - const upgradedCard = CARDS[card.upgrades]; + const card = CARDS[cardId]; + const upgradedCard = CARDS[card.upgrades]; - if (!upgradedCard) { - return ''; // Skip if no upgrade found - } + if (!upgradedCard) { + return ''; // Skip if no upgrade found + } - return ` + return `
@@ -861,7 +862,7 @@ export function renderUpgrade(root) {
`; - }).join("")} + }).join("")}
@@ -870,38 +871,38 @@ export function renderUpgrade(root) {
`; - root.app.querySelectorAll("[data-upgrade]").forEach(btn => { - btn.addEventListener("click", () => { - const deckIndex = parseInt(btn.dataset.upgrade, 10); - const oldCardId = root.player.deck[deckIndex]; - const newCardId = CARDS[oldCardId].upgrades; - root.player.deck[deckIndex] = newCardId; - root.log(`Upgraded ${CARDS[oldCardId].name} → ${CARDS[newCardId].name}`); - root.afterNode(); - }); + root.app.querySelectorAll("[data-upgrade]").forEach(btn => { + btn.addEventListener("click", () => { + const deckIndex = parseInt(btn.dataset.upgrade, 10); + const oldCardId = root.player.deck[deckIndex]; + const newCardId = CARDS[oldCardId].upgrades; + root.player.deck[deckIndex] = newCardId; + root.log(`Upgraded ${CARDS[oldCardId].name} → ${CARDS[newCardId].name}`); + root.afterNode(); + }); + }); + root.app.querySelector("[data-skip]").addEventListener("click", () => root.afterNode()); }); - root.app.querySelector("[data-skip]").addEventListener("click", () => root.afterNode()); - }); } export function renderShop(root) { - import("../data/cards.js").then(({ CARDS, CARD_POOL }) => { - import("../data/relics.js").then(({ RELICS, START_RELIC_CHOICES }) => { + import("../data/cards.js").then(({ CARDS, CARD_POOL }) => { + import("../data/relics.js").then(({ RELICS, START_RELIC_CHOICES }) => { - const availableCards = CARD_POOL.filter(cardId => { + const availableCards = CARD_POOL.filter(cardId => { - const ownedCount = root.player.deck.filter(deckCardId => deckCardId === cardId).length; + const ownedCount = root.player.deck.filter(deckCardId => deckCardId === cardId).length; - return ownedCount < 3; - }); + return ownedCount < 3; + }); - const cardsToShow = availableCards.length >= 3 ? availableCards : CARD_POOL; - const shopCards = shuffle(cardsToShow.slice()).slice(0, 3).map(id => CARDS[id]); - const ownedRelicIds = root.relicStates.map(r => r.id); - const availableRelics = START_RELIC_CHOICES.filter(id => !ownedRelicIds.includes(id)); - const shopRelic = availableRelics.length > 0 ? RELICS[availableRelics[0]] : null; + const cardsToShow = availableCards.length >= 3 ? availableCards : CARD_POOL; + const shopCards = shuffle(cardsToShow.slice()).slice(0, 3).map(id => CARDS[id]); + const ownedRelicIds = root.relicStates.map(r => r.id); + const availableRelics = START_RELIC_CHOICES.filter(id => !ownedRelicIds.includes(id)); + const shopRelic = availableRelics.length > 0 ? RELICS[availableRelics[0]] : null; - root.app.innerHTML = ` + root.app.innerHTML = `

Merchant's Shop

@@ -920,10 +921,10 @@ export function renderShop(root) {
${shopCards.map((card, idx) => { - const cardType = card.type === 'attack' ? 'attack' : card.type === 'skill' ? 'skill' : 'power'; - const canAfford = (root.player.gold || 100) >= 50; - const ownedCount = root.player.deck.filter(deckCardId => deckCardId === card.id).length; - return ` + const cardType = card.type === 'attack' ? 'attack' : card.type === 'skill' ? 'skill' : 'power'; + const canAfford = (root.player.gold || 100) >= 50; + const ownedCount = root.player.deck.filter(deckCardId => deckCardId === card.id).length; + return `
@@ -951,7 +952,7 @@ export function renderShop(root) {
`; - }).join("")} + }).join("")}
@@ -989,185 +990,185 @@ export function renderShop(root) {
`; - if (!root.player.gold) root.player.gold = 100; - - root.app.querySelectorAll("[data-buy-card]").forEach(btn => { - btn.addEventListener("click", () => { - const idx = parseInt(btn.dataset.buyCard, 10); - const card = shopCards[idx]; - if (root.player.gold >= 50) { - root.player.gold -= 50; - root.player.deck.push(card.id); - root.log(`Bought ${card.name} for 50 gold.`); - btn.disabled = true; - btn.textContent = "SOLD"; - - // Update gold display - const goldDisplay = root.app.querySelector('.gold-amount'); - if (goldDisplay) { - goldDisplay.textContent = root.player.gold; - } - - // Update affordability of remaining items - updateShopAffordability(root); - } else { - root.log("Not enough gold!"); - } - }); - }); - - - if (shopRelic) { - root.app.querySelector("[data-buy-relic]").addEventListener("click", () => { - if (root.player.gold >= 100) { - root.player.gold -= 100; - root.log(`Bought ${shopRelic.name} for 100 gold.`); - - import("../engine/battle.js").then(({ attachRelics }) => { - - const currentRelicIds = root.relicStates.map(r => r.id); - const newRelicIds = [...currentRelicIds, shopRelic.id]; - attachRelics(root, newRelicIds); + if (!root.player.gold) root.player.gold = 100; + + root.app.querySelectorAll("[data-buy-card]").forEach(btn => { + btn.addEventListener("click", () => { + const idx = parseInt(btn.dataset.buyCard, 10); + const card = shopCards[idx]; + if (root.player.gold >= 50) { + root.player.gold -= 50; + root.player.deck.push(card.id); + root.log(`Bought ${card.name} for 50 gold.`); + btn.disabled = true; + btn.textContent = "SOLD"; + + // Update gold display + const goldDisplay = root.app.querySelector('.gold-amount'); + if (goldDisplay) { + goldDisplay.textContent = root.player.gold; + } + + // Update affordability of remaining items + updateShopAffordability(root); + } else { + root.log("Not enough gold!"); + } + }); }); - root.app.querySelector("[data-buy-relic]").disabled = true; - root.app.querySelector("[data-buy-relic]").textContent = "SOLD"; - // Update gold display - const goldDisplay = root.app.querySelector('.gold-amount'); - if (goldDisplay) { - goldDisplay.textContent = root.player.gold; + + if (shopRelic) { + root.app.querySelector("[data-buy-relic]").addEventListener("click", () => { + if (root.player.gold >= 100) { + root.player.gold -= 100; + root.log(`Bought ${shopRelic.name} for 100 gold.`); + + import("../engine/battle.js").then(({ attachRelics }) => { + + const currentRelicIds = root.relicStates.map(r => r.id); + const newRelicIds = [...currentRelicIds, shopRelic.id]; + attachRelics(root, newRelicIds); + }); + root.app.querySelector("[data-buy-relic]").disabled = true; + root.app.querySelector("[data-buy-relic]").textContent = "SOLD"; + + // Update gold display + const goldDisplay = root.app.querySelector('.gold-amount'); + if (goldDisplay) { + goldDisplay.textContent = root.player.gold; + } + + // Update affordability of remaining items + updateShopAffordability(root); + } else { + root.log("Not enough gold!"); + } + }); } - // Update affordability of remaining items - updateShopAffordability(root); - } else { - root.log("Not enough gold!"); - } + root.app.querySelector("[data-leave]").addEventListener("click", () => root.afterNode()); }); - } - - root.app.querySelector("[data-leave]").addEventListener("click", () => root.afterNode()); }); - }); } function updateCardSelection(root) { - // Remove selection from all cards - root.app.querySelectorAll('.battle-card').forEach(card => { - card.classList.remove('card-selected'); - }); - - // Add selection to currently selected card - if (root.selectedCardIndex !== null) { - const selectedCard = root.app.querySelector(`[data-play="${root.selectedCardIndex}"]`); - if (selectedCard) { - selectedCard.classList.add('card-selected'); + // Remove selection from all cards + root.app.querySelectorAll('.battle-card').forEach(card => { + card.classList.remove('card-selected'); + }); + + // Add selection to currently selected card + if (root.selectedCardIndex !== null) { + const selectedCard = root.app.querySelector(`[data-play="${root.selectedCardIndex}"]`); + if (selectedCard) { + selectedCard.classList.add('card-selected'); + } } - } } function updateShopAffordability(root) { - // Update card affordability - root.app.querySelectorAll("[data-buy-card]").forEach(btn => { - if (!btn.disabled) { - const cardContainer = btn.closest('.shop-card-container'); - const overlay = cardContainer.querySelector('.card-disabled-overlay'); - - if (root.player.gold < 50) { - btn.classList.remove('playable'); - btn.classList.add('unplayable'); - if (!overlay) { - const newOverlay = document.createElement('div'); - newOverlay.className = 'card-disabled-overlay'; - newOverlay.innerHTML = 'Need 50 gold'; - cardContainer.appendChild(newOverlay); + // Update card affordability + root.app.querySelectorAll("[data-buy-card]").forEach(btn => { + if (!btn.disabled) { + const cardContainer = btn.closest('.shop-card-container'); + const overlay = cardContainer.querySelector('.card-disabled-overlay'); + + if (root.player.gold < 50) { + btn.classList.remove('playable'); + btn.classList.add('unplayable'); + if (!overlay) { + const newOverlay = document.createElement('div'); + newOverlay.className = 'card-disabled-overlay'; + newOverlay.innerHTML = 'Need 50 gold'; + cardContainer.appendChild(newOverlay); + } + } else { + btn.classList.remove('unplayable'); + btn.classList.add('playable'); + if (overlay) { + overlay.remove(); + } + } } - } else { - btn.classList.remove('unplayable'); - btn.classList.add('playable'); - if (overlay) { - overlay.remove(); + }); + + // Update relic affordability + const relicBtn = root.app.querySelector("[data-buy-relic]"); + if (relicBtn && !relicBtn.disabled) { + const relicContainer = relicBtn.closest('.shop-relic-container'); + const overlay = relicContainer.querySelector('.relic-disabled-overlay'); + + if (root.player.gold < 100) { + relicBtn.classList.remove('affordable'); + relicBtn.classList.add('unaffordable'); + if (!overlay) { + const newOverlay = document.createElement('div'); + newOverlay.className = 'relic-disabled-overlay'; + newOverlay.innerHTML = 'Need 100 gold'; + relicContainer.appendChild(newOverlay); + } + } else { + relicBtn.classList.remove('unaffordable'); + relicBtn.classList.add('affordable'); + if (overlay) { + overlay.remove(); + } } - } } - }); - - // Update relic affordability - const relicBtn = root.app.querySelector("[data-buy-relic]"); - if (relicBtn && !relicBtn.disabled) { - const relicContainer = relicBtn.closest('.shop-relic-container'); - const overlay = relicContainer.querySelector('.relic-disabled-overlay'); - - if (root.player.gold < 100) { - relicBtn.classList.remove('affordable'); - relicBtn.classList.add('unaffordable'); - if (!overlay) { - const newOverlay = document.createElement('div'); - newOverlay.className = 'relic-disabled-overlay'; - newOverlay.innerHTML = 'Need 100 gold'; - relicContainer.appendChild(newOverlay); - } - } else { - relicBtn.classList.remove('unaffordable'); - relicBtn.classList.add('affordable'); - if (overlay) { - overlay.remove(); - } - } - } } function shuffle(array) { - for (let i = array.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [array[i], array[j]] = [array[j], array[i]]; - } - return array; + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + return array; } function getRelicArt(relicId, RELICS = null) { - if (RELICS && RELICS[relicId]?.art) { - const imagePath = RELICS[relicId].art; - return `${relicId}`; - } - return '💎'; + if (RELICS && RELICS[relicId]?.art) { + const imagePath = RELICS[relicId].art; + return `${relicId}`; + } + return '💎'; } function getRelicName(relicId, RELICS = null) { - return RELICS?.[relicId]?.name || relicId; + return RELICS?.[relicId]?.name || relicId; } function getRelicText(relicId, RELICS = null) { - return RELICS?.[relicId]?.text || 'Unknown relic'; + return RELICS?.[relicId]?.text || 'Unknown relic'; } function getCardArt(cardId, CARDS = null) { - if (CARDS && CARDS[cardId]?.art) { - const imagePath = CARDS[cardId].art; - return `${cardId}`; - } - - // Fallback for cases where CARDS is not passed (shouldn't happen in normal operation) - return `🃏`; + if (CARDS && CARDS[cardId]?.art) { + const imagePath = CARDS[cardId].art; + return `${cardId}`; + } + + // Fallback for cases where CARDS is not passed (shouldn't happen in normal operation) + return `🃏`; } function getEnemyArt(enemyId, ENEMIES = null) { - const enemyData = ENEMIES?.[enemyId]; - const avatarPath = enemyData?.avatar || `assets/avatars/${enemyId}.png`; - return `${enemyId}`; + const enemyData = ENEMIES?.[enemyId]; + const avatarPath = enemyData?.avatar || `assets/avatars/${enemyId}.png`; + return `${enemyId}`; } function getEnemyType(enemyId) { - if (enemyId.includes('boss_')) return 'BOSS'; - if (enemyId.includes('elite_')) return 'ELITE'; - return 'ENEMY'; + if (enemyId.includes('boss_')) return 'BOSS'; + if (enemyId.includes('elite_')) return 'ELITE'; + return 'ENEMY'; } export function renderRelicSelection(root) { - import("../data/relics.js").then(({ RELICS, START_RELIC_CHOICES }) => { - const relicChoices = START_RELIC_CHOICES.slice(0, 3); // Show first 3 relics + import("../data/relics.js").then(({ RELICS, START_RELIC_CHOICES }) => { + const relicChoices = START_RELIC_CHOICES.slice(0, 3); // Show first 3 relics - root.app.innerHTML = ` + root.app.innerHTML = `
`; - root.app.querySelectorAll("[data-relic]").forEach(btn => { - btn.addEventListener("click", () => { - const relicId = btn.dataset.relic; - root.selectStartingRelic(relicId); - }); + root.app.querySelectorAll("[data-relic]").forEach(btn => { + btn.addEventListener("click", () => { + const relicId = btn.dataset.relic; + root.selectStartingRelic(relicId); + }); + }); }); - }); } export function renderEvent(root) { - const events = [ - { - title: "Birthday Cake", - text: "You find a delicious birthday cake! But it looks suspicious...", - artwork: "assets/card-art/bread.png", - choices: [ - { - text: "Eat the whole cake (+15 HP, gain Sugar Crash curse)", - icon: "assets/card-art/apple.png", - risk: "high", - effect: () => { - root.player.hp = Math.min(root.player.maxHp, root.player.hp + 15); - root.player.deck.push("sugar_crash"); - root.log("Ate cake: +15 HP, added Sugar Crash curse"); - } - }, - { - text: "Take a small bite (+8 HP)", - icon: "assets/card-art/heart.png", - risk: "low", - effect: () => { - root.player.hp = Math.min(root.player.maxHp, root.player.hp + 8); - root.log("Small bite: +8 HP"); - } - }, - { - text: "Leave it alone (gain 25 gold)", - icon: "assets/card-art/bag_of_gold.png", - risk: "none", - effect: () => { - root.player.gold += 25; - root.log("Resisted temptation: +25 gold"); - } - } - ] - }, - { - title: "Birthday Present", - text: "A mysterious gift box sits before you. What could be inside?", - artwork: "assets/card-art/chest_closed.png", - choices: [ - { - text: "Open it eagerly (Random card or lose 10 HP)", - icon: "assets/card-art/key.png", - risk: "high", - effect: () => { - if (Math.random() < 0.7) { - import("../data/cards.js").then(({ CARDS, CARD_POOL }) => { - const randomCard = CARD_POOL[Math.floor(Math.random() * CARD_POOL.length)]; - root.player.deck.push(randomCard); - root.log(`Found ${CARDS[randomCard].name}!`); - }); - } else { - root.player.hp = Math.max(1, root.player.hp - 10); - root.log("It was a trap! -10 HP"); - } - } - }, - { - text: "Open it carefully (+5 Max HP)", - icon: "assets/card-art/potion_heal.png", - risk: "low", - effect: () => { - root.player.maxHp += 5; - root.player.hp += 5; - root.log("Careful approach: +5 Max HP"); - } - }, - { - text: "Don't touch it (gain 30 gold)", - icon: "assets/card-art/bag_of_gold.png", - risk: "none", - effect: () => { - root.player.gold += 30; - root.log("Played it safe: +30 gold"); - } - } - ] - }, - { - title: "Birthday Balloons", - text: "Colorful balloons float by. One has a note attached: 'Pop me for a surprise!'", - artwork: "assets/card-art/feather.png", - choices: [ + const events = [ { - text: "Pop the balloon (Remove a random basic card from deck)", - icon: "assets/card-art/scroll.png", - risk: "medium", - effect: () => { - const basicCards = root.player.deck.filter(id => id === "strike" || id === "defend"); - if (basicCards.length > 0) { - const toRemove = basicCards[0]; - const index = root.player.deck.indexOf(toRemove); - root.player.deck.splice(index, 1); - root.log(`Removed ${toRemove} from deck`); - } else { - root.log("No basic cards to remove"); - } - } + title: "Birthday Cake", + text: "You find a delicious birthday cake! But it looks suspicious...", + artwork: "assets/card-art/bread.png", + choices: [ + { + text: "Eat the whole cake (+15 HP, gain Sugar Crash curse)", + icon: "assets/card-art/apple.png", + risk: "high", + effect: () => { + root.player.hp = Math.min(root.player.maxHp, root.player.hp + 15); + root.player.deck.push("sugar_crash"); + root.log("Ate cake: +15 HP, added Sugar Crash curse"); + } + }, + { + text: "Take a small bite (+8 HP)", + icon: "assets/card-art/heart.png", + risk: "low", + effect: () => { + root.player.hp = Math.min(root.player.maxHp, root.player.hp + 8); + root.log("Small bite: +8 HP"); + } + }, + { + text: "Leave it alone (gain 25 gold)", + icon: "assets/card-art/bag_of_gold.png", + risk: "none", + effect: () => { + root.player.gold += 25; + root.log("Resisted temptation: +25 gold"); + } + } + ] }, { - text: "Collect the balloons (+1 Energy next 3 fights)", - icon: "assets/card-art/magic_sphere.png", - risk: "low", - effect: () => { - root.flags.bonusEnergyFights = 3; - root.log("Collected balloons: +1 Energy next 3 fights"); - } + title: "Birthday Present", + text: "A mysterious gift box sits before you. What could be inside?", + artwork: "assets/card-art/chest_closed.png", + choices: [ + { + text: "Open it eagerly (Random card or lose 10 HP)", + icon: "assets/card-art/key.png", + risk: "high", + effect: () => { + if (Math.random() < 0.7) { + import("../data/cards.js").then(({ CARDS, CARD_POOL }) => { + const randomCard = CARD_POOL[Math.floor(Math.random() * CARD_POOL.length)]; + root.player.deck.push(randomCard); + root.log(`Found ${CARDS[randomCard].name}!`); + }); + } else { + root.player.hp = Math.max(1, root.player.hp - 10); + root.log("It was a trap! -10 HP"); + } + } + }, + { + text: "Open it carefully (+5 Max HP)", + icon: "assets/card-art/potion_heal.png", + risk: "low", + effect: () => { + root.player.maxHp += 5; + root.player.hp += 5; + root.log("Careful approach: +5 Max HP"); + } + }, + { + text: "Don't touch it (gain 30 gold)", + icon: "assets/card-art/bag_of_gold.png", + risk: "none", + effect: () => { + root.player.gold += 30; + root.log("Played it safe: +30 gold"); + } + } + ] }, { - text: "Ignore them (heal 12 HP)", - icon: "assets/card-art/heart.png", - risk: "none", - effect: () => { - root.player.hp = Math.min(root.player.maxHp, root.player.hp + 12); - root.log("Focused on rest: +12 HP"); - } + title: "Birthday Balloons", + text: "Colorful balloons float by. One has a note attached: 'Pop me for a surprise!'", + artwork: "assets/card-art/feather.png", + choices: [ + { + text: "Pop the balloon (Remove a random basic card from deck)", + icon: "assets/card-art/scroll.png", + risk: "medium", + effect: () => { + const basicCards = root.player.deck.filter(id => id === "strike" || id === "defend"); + if (basicCards.length > 0) { + const toRemove = basicCards[0]; + const index = root.player.deck.indexOf(toRemove); + root.player.deck.splice(index, 1); + root.log(`Removed ${toRemove} from deck`); + } else { + root.log("No basic cards to remove"); + } + } + }, + { + text: "Collect the balloons (+1 Energy next 3 fights)", + icon: "assets/card-art/magic_sphere.png", + risk: "low", + effect: () => { + root.flags.bonusEnergyFights = 3; + root.log("Collected balloons: +1 Energy next 3 fights"); + } + }, + { + text: "Ignore them (heal 12 HP)", + icon: "assets/card-art/heart.png", + risk: "none", + effect: () => { + root.player.hp = Math.min(root.player.maxHp, root.player.hp + 12); + root.log("Focused on rest: +12 HP"); + } + } + ] } - ] - } - ]; + ]; - const event = events[Math.floor(Math.random() * events.length)]; + const event = events[Math.floor(Math.random() * events.length)]; - root.app.innerHTML = ` + root.app.innerHTML = `

${event.title}

@@ -1416,28 +1417,28 @@ export function renderEvent(root) {
`; - root.app.querySelectorAll("[data-choice]").forEach(btn => { - btn.addEventListener("click", () => { - const idx = parseInt(btn.dataset.choice, 10); - event.choices[idx].effect(); - root.afterNode(); + root.app.querySelectorAll("[data-choice]").forEach(btn => { + btn.addEventListener("click", () => { + const idx = parseInt(btn.dataset.choice, 10); + event.choices[idx].effect(); + root.afterNode(); + }); }); - }); } export async function renderWin(root) { - const { RELICS } = await import("../data/relics.js"); - const finalStats = { - totalTurns: root.turnCount || 0, - cardsPlayed: root.cardsPlayedCount || 0, - finalHP: root.player.hp, - maxHP: root.player.maxHp, - finalGold: root.player.gold || 0, - deckSize: root.player.deck.length, - relicsCollected: root.relicStates.length - }; - - root.app.innerHTML = ` + const { RELICS } = await import("../data/relics.js"); + const finalStats = { + totalTurns: root.turnCount || 0, + cardsPlayed: root.cardsPlayedCount || 0, + finalHP: root.player.hp, + maxHP: root.player.maxHp, + finalGold: root.player.gold || 0, + deckSize: root.player.deck.length, + relicsCollected: root.relicStates.length + }; + + root.app.innerHTML = `
@@ -1494,14 +1495,14 @@ export async function renderWin(root) {

Relics Mastered

${root.relicStates.length > 0 ? - root.relicStates.map(r => ` + root.relicStates.map(r => `
${getRelicArt(r.id, RELICS)}
${getRelicName(r.id, RELICS)}
`).join('') : - '
No relics collected this run
' - } + '
No relics collected this run
' + }
@@ -1522,23 +1523,23 @@ export async function renderWin(root) {
`; - root.app.querySelector("[data-replay]").addEventListener("click", () => root.reset()); + root.app.querySelector("[data-replay]").addEventListener("click", () => root.reset()); } export async function renderLose(root) { - const { RELICS } = await import("../data/relics.js"); - const finalStats = { - totalTurns: root.turnCount || 0, - cardsPlayed: root.cardsPlayedCount || 0, - finalHP: 0, // Player is defeated - maxHP: root.player.maxHp, - finalGold: root.player.gold || 0, - deckSize: root.player.deck.length, - relicsCollected: root.relicStates.length, - nodeId: root.nodeId || 'unknown' - }; - - root.app.innerHTML = ` + const { RELICS } = await import("../data/relics.js"); + const finalStats = { + totalTurns: root.turnCount || 0, + cardsPlayed: root.cardsPlayedCount || 0, + finalHP: 0, // Player is defeated + maxHP: root.player.maxHp, + finalGold: root.player.gold || 0, + deckSize: root.player.deck.length, + relicsCollected: root.relicStates.length, + nodeId: root.nodeId || 'unknown' + }; + + root.app.innerHTML = `

You Failed!

@@ -1634,12 +1635,12 @@ Better luck on the next run!

`; - root.app.querySelector("[data-replay]").addEventListener("click", () => { - root.reset(); - }); + root.app.querySelector("[data-replay]").addEventListener("click", () => { + root.reset(); + }); - root.app.querySelector("[data-menu]").addEventListener("click", () => { - root.reset(); - }); + root.app.querySelector("[data-menu]").addEventListener("click", () => { + root.reset(); + }); }