Wire map into game loop with node-driven combat
This commit is contained in:
parent
4d0692cf44
commit
febb05764b
3 changed files with 61 additions and 14 deletions
62
src/main.js
62
src/main.js
|
|
@ -1,7 +1,8 @@
|
||||||
import { getCard, initCards } from "./cards.js";
|
import { getCard, initCards } from "./cards.js";
|
||||||
import { checkCombatEnd, resolveEnemyTurn, startTurn } from "./combat.js";
|
import { checkCombatEnd, resolveEnemyTurn, startTurn } from "./combat.js";
|
||||||
import { initEnemies } from "./enemies.js";
|
import { initEnemies } from "./enemies.js";
|
||||||
import { render } from "./render.js";
|
import { advanceMap, getCurrentNode, getNodeEnemy } from "./map.js";
|
||||||
|
import { render, renderMap, showGame } from "./render.js";
|
||||||
import {
|
import {
|
||||||
createRunState,
|
createRunState,
|
||||||
endCombat,
|
endCombat,
|
||||||
|
|
@ -24,18 +25,47 @@ async function init() {
|
||||||
function startNewRun() {
|
function startNewRun() {
|
||||||
run = createRunState("ironclad");
|
run = createRunState("ironclad");
|
||||||
revealed = null;
|
revealed = null;
|
||||||
startNextCombat();
|
showMapScreen();
|
||||||
}
|
}
|
||||||
|
|
||||||
function startNextCombat() {
|
function showMapScreen() {
|
||||||
state = createCombatFromRun(run, "jaw_worm");
|
renderMap(run.map);
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const enemyId = getNodeEnemy(node.type);
|
||||||
|
startNextCombat(enemyId);
|
||||||
|
}
|
||||||
|
|
||||||
|
function startNextCombat(enemyId) {
|
||||||
|
showGame();
|
||||||
|
state = createCombatFromRun(run, enemyId);
|
||||||
state = startTurn(state);
|
state = startTurn(state);
|
||||||
revealed = null;
|
revealed = null;
|
||||||
render(state, revealed);
|
render(state, revealed);
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleVictory() {
|
function handleVictory() {
|
||||||
|
const clearedNode = getCurrentNode(run.map);
|
||||||
run = endCombat(run, state.players[0].hp);
|
run = endCombat(run, state.players[0].hp);
|
||||||
|
run = { ...run, map: advanceMap(run.map) };
|
||||||
|
|
||||||
|
if (clearedNode.type === "boss") {
|
||||||
|
state = {
|
||||||
|
...state,
|
||||||
|
combat: { ...state.combat, phase: "ended", result: "act_complete" },
|
||||||
|
};
|
||||||
|
render(state, revealed);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const result = revealRewards(run);
|
const result = revealRewards(run);
|
||||||
revealed = result.revealed;
|
revealed = result.revealed;
|
||||||
run = result.run;
|
run = result.run;
|
||||||
|
|
@ -139,22 +169,34 @@ function bindEvents() {
|
||||||
const index = revealed.indexOf(cardId);
|
const index = revealed.indexOf(cardId);
|
||||||
if (index === -1) return;
|
if (index === -1) return;
|
||||||
run = pickReward(run, revealed, index);
|
run = pickReward(run, revealed, index);
|
||||||
startNextCombat();
|
showMapScreen();
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById("skip-btn").addEventListener("click", () => {
|
document.getElementById("skip-btn").addEventListener("click", () => {
|
||||||
if (!revealed) return;
|
if (!revealed) return;
|
||||||
run = skipRewards(run, revealed);
|
run = skipRewards(run, revealed);
|
||||||
startNextCombat();
|
showMapScreen();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
document
|
||||||
|
.getElementById("map-proceed-btn")
|
||||||
|
.addEventListener("click", proceedFromMap);
|
||||||
|
|
||||||
document.getElementById("overlay").addEventListener("click", (e) => {
|
document.getElementById("overlay").addEventListener("click", (e) => {
|
||||||
// only restart on defeat overlay click (not reward cards or skip btn)
|
|
||||||
if (state.combat.phase !== "ended" || state.combat.result !== "defeat")
|
|
||||||
return;
|
|
||||||
if (e.target.closest("#reward-cards") || e.target.closest("#skip-btn"))
|
if (e.target.closest("#reward-cards") || e.target.closest("#skip-btn"))
|
||||||
return;
|
return;
|
||||||
startNewRun();
|
// restart on defeat overlay click
|
||||||
|
if (state.combat.phase === "ended" && state.combat.result === "defeat") {
|
||||||
|
startNewRun();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// restart on act complete overlay click
|
||||||
|
if (
|
||||||
|
state.combat.phase === "ended" &&
|
||||||
|
state.combat.result === "act_complete"
|
||||||
|
) {
|
||||||
|
startNewRun();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -156,10 +156,13 @@ function renderOverlay(state, revealed) {
|
||||||
skipBtn.hidden = false;
|
skipBtn.hidden = false;
|
||||||
} else if (state.combat.phase === "ended") {
|
} else if (state.combat.phase === "ended") {
|
||||||
overlay.hidden = false;
|
overlay.hidden = false;
|
||||||
overlayText.textContent =
|
if (state.combat.result === "defeat") {
|
||||||
state.combat.result === "defeat"
|
overlayText.textContent = "defeat — click to restart";
|
||||||
? "defeat — click to restart"
|
} else if (state.combat.result === "act_complete") {
|
||||||
: "victory";
|
overlayText.textContent = "act 1 complete! — click to start new run";
|
||||||
|
} else {
|
||||||
|
overlayText.textContent = "victory";
|
||||||
|
}
|
||||||
rewardCards.innerHTML = "";
|
rewardCards.innerHTML = "";
|
||||||
skipBtn.hidden = true;
|
skipBtn.hidden = true;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import { getAllCards, getStarterDeck } from "./cards.js";
|
import { getAllCards, getStarterDeck } from "./cards.js";
|
||||||
|
import { createMap } from "./map.js";
|
||||||
import { shuffle } from "./state.js";
|
import { shuffle } from "./state.js";
|
||||||
|
|
||||||
export function createRunState(character) {
|
export function createRunState(character) {
|
||||||
|
|
@ -10,6 +11,7 @@ export function createRunState(character) {
|
||||||
cardRewardsDeck: buildRewardsDeck(character),
|
cardRewardsDeck: buildRewardsDeck(character),
|
||||||
potions: [],
|
potions: [],
|
||||||
combatCount: 0,
|
combatCount: 0,
|
||||||
|
map: createMap(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue