diff --git a/index.html b/index.html
index 811e143..c8d8a69 100644
--- a/index.html
+++ b/index.html
@@ -40,6 +40,16 @@
+
+ campfire
+
+
+
+
+
+
+
+
diff --git a/src/main.js b/src/main.js
index be4122e..53f40b5 100644
--- a/src/main.js
+++ b/src/main.js
@@ -2,10 +2,19 @@ import { getCard, initCards } from "./cards.js";
import { checkCombatEnd, resolveEnemyTurn, startTurn } from "./combat.js";
import { initEnemies } from "./enemies.js";
import { advanceMap, getCurrentNode, getNodeEnemy } from "./map.js";
-import { render, renderMap, showGame } from "./render.js";
import {
+ hideCampfire,
+ render,
+ renderCampfire,
+ renderMap,
+ showGame,
+} from "./render.js";
+import {
+ campfireRest,
+ campfireSmith,
createRunState,
endCombat,
+ getUpgradableCards,
pickReward,
revealRewards,
skipRewards,
@@ -32,12 +41,14 @@ function showMapScreen() {
renderMap(run.map);
}
+function showCampfire() {
+ renderCampfire(run);
+}
+
function proceedFromMap() {
const node = getCurrentNode(run.map);
if (node.type === "campfire") {
- console.debug("campfire — rest not yet implemented");
- run = { ...run, map: advanceMap(run.map) };
- showMapScreen();
+ showCampfire();
return;
}
const enemyId = getNodeEnemy(node.type);
@@ -182,6 +193,30 @@ function bindEvents() {
.getElementById("map-proceed-btn")
.addEventListener("click", proceedFromMap);
+ document.getElementById("campfire-rest-btn").addEventListener("click", () => {
+ run = campfireRest(run);
+ run = { ...run, map: advanceMap(run.map) };
+ hideCampfire();
+ showMapScreen();
+ });
+
+ document
+ .getElementById("campfire-smith-btn")
+ .addEventListener("click", () => {
+ const upgradable = getUpgradableCards(run);
+ renderCampfire(run, upgradable);
+ });
+
+ document.getElementById("smith-cards").addEventListener("click", (e) => {
+ const btn = e.target.closest(".smith-card-btn");
+ if (!btn) return;
+ const cardId = btn.dataset.cardId;
+ run = campfireSmith(run, cardId);
+ run = { ...run, map: advanceMap(run.map) };
+ hideCampfire();
+ showMapScreen();
+ });
+
document.getElementById("overlay").addEventListener("click", (e) => {
if (e.target.closest("#reward-cards") || e.target.closest("#skip-btn"))
return;
diff --git a/src/render.js b/src/render.js
index c4dffb5..00675ea 100644
--- a/src/render.js
+++ b/src/render.js
@@ -126,11 +126,45 @@ export function renderMap(map) {
document.getElementById("map-screen").hidden = false;
document.getElementById("game").hidden = true;
document.getElementById("overlay").hidden = true;
+ document.getElementById("campfire-screen").hidden = true;
}
export function showGame() {
document.getElementById("game").hidden = false;
document.getElementById("map-screen").hidden = true;
+ document.getElementById("campfire-screen").hidden = true;
+}
+
+export function renderCampfire(run, upgradableCards) {
+ document.getElementById("game").hidden = true;
+ document.getElementById("map-screen").hidden = true;
+ document.getElementById("overlay").hidden = true;
+ document.getElementById("campfire-screen").hidden = false;
+ document.getElementById("campfire-hp").textContent =
+ `HP: ${run.hp}/${run.maxHp}`;
+
+ document.getElementById("smith-cards").hidden = true;
+ if (upgradableCards) {
+ document.getElementById("campfire-choices").hidden = true;
+ const smithEl = document.getElementById("smith-cards");
+ smithEl.hidden = false;
+ smithEl.innerHTML = "";
+ for (const id of upgradableCards) {
+ const card = getCard(id);
+ const btn = document.createElement("button");
+ btn.type = "button";
+ btn.className = "smith-card-btn";
+ btn.textContent = card.name;
+ btn.dataset.cardId = id;
+ smithEl.appendChild(btn);
+ }
+ } else {
+ document.getElementById("campfire-choices").hidden = false;
+ }
+}
+
+export function hideCampfire() {
+ document.getElementById("campfire-screen").hidden = true;
}
function renderOverlay(state, revealed) {