Wire up main module with event handling and game loop
This commit is contained in:
parent
87d2724c3c
commit
8a7facb35e
1 changed files with 110 additions and 0 deletions
110
src/main.js
Normal file
110
src/main.js
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
import { getCard } from "./cards.js";
|
||||||
|
import { checkCombatEnd, resolveEnemyTurn, startTurn } from "./combat.js";
|
||||||
|
import { createCombatState, endTurn, playCard } from "./state.js";
|
||||||
|
import { render } from "./render.js";
|
||||||
|
|
||||||
|
let state = null;
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
state = createCombatState("ironclad", "jaw_worm");
|
||||||
|
state = startTurn(state);
|
||||||
|
render(state);
|
||||||
|
bindEvents();
|
||||||
|
}
|
||||||
|
|
||||||
|
function bindEvents() {
|
||||||
|
document.getElementById("hand").addEventListener("click", (e) => {
|
||||||
|
const cardEl = e.target.closest(".card");
|
||||||
|
if (!cardEl || state.combat.phase !== "player_turn") return;
|
||||||
|
const index = Number(cardEl.dataset.index);
|
||||||
|
|
||||||
|
if (state.combat.selectedCard === index) {
|
||||||
|
state = { ...state, combat: { ...state.combat, selectedCard: null } };
|
||||||
|
render(state);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state = { ...state, combat: { ...state.combat, selectedCard: index } };
|
||||||
|
|
||||||
|
const cardId = state.player.hand[index];
|
||||||
|
const card = getCard(cardId);
|
||||||
|
|
||||||
|
if (card.type === "skill") {
|
||||||
|
// auto-play skills (they target self)
|
||||||
|
const result = playCard(state, index);
|
||||||
|
if (result === null) {
|
||||||
|
// not enough energy
|
||||||
|
state = { ...state, combat: { ...state.combat, selectedCard: null } };
|
||||||
|
render(state);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
state = { ...result, combat: { ...result.combat, selectedCard: null } };
|
||||||
|
const end = checkCombatEnd(state);
|
||||||
|
if (end) {
|
||||||
|
state = {
|
||||||
|
...state,
|
||||||
|
combat: { ...state.combat, phase: "ended", result: end },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
render(state);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
render(state);
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById("enemy-zone").addEventListener("click", () => {
|
||||||
|
if (state.combat.selectedCard === null) return;
|
||||||
|
if (state.combat.phase !== "player_turn") return;
|
||||||
|
|
||||||
|
const result = playCard(state, state.combat.selectedCard);
|
||||||
|
if (result === null) {
|
||||||
|
state = { ...state, combat: { ...state.combat, selectedCard: null } };
|
||||||
|
render(state);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state = { ...result, combat: { ...result.combat, selectedCard: null } };
|
||||||
|
|
||||||
|
const end = checkCombatEnd(state);
|
||||||
|
if (end) {
|
||||||
|
state = {
|
||||||
|
...state,
|
||||||
|
combat: { ...state.combat, phase: "ended", result: end },
|
||||||
|
};
|
||||||
|
render(state);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
render(state);
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById("end-turn-btn").addEventListener("click", async () => {
|
||||||
|
if (state.combat.phase !== "player_turn") return;
|
||||||
|
|
||||||
|
state = endTurn(state);
|
||||||
|
render(state);
|
||||||
|
|
||||||
|
await delay(800);
|
||||||
|
state = resolveEnemyTurn(state);
|
||||||
|
|
||||||
|
const end = checkCombatEnd(state);
|
||||||
|
if (end) {
|
||||||
|
state = {
|
||||||
|
...state,
|
||||||
|
combat: { ...state.combat, phase: "ended", result: end },
|
||||||
|
};
|
||||||
|
render(state);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
state = startTurn(state);
|
||||||
|
render(state);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function delay(ms) {
|
||||||
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||||
|
}
|
||||||
|
|
||||||
|
init();
|
||||||
Loading…
Reference in a new issue