diff --git a/src/main.ts b/src/main.ts index 099d736..f24dfdd 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,5 @@ import "./styles.css"; -console.log("[DEBUG] Starting main.ts import..."); - import { ROOT_SHIFT_COST, ROUND_ANIMATION_BONUS_MS, @@ -28,6 +26,7 @@ import { createInitiativeDraft, } from "./rules-initiative"; import { + WEATHER_CARDS, createWeatherDraft, getCurrentWeatherPlayerId, getWeatherCard, @@ -54,22 +53,17 @@ import type { import { keyFor, parseKey, tint, wait } from "./utils"; const app = document.querySelector("#app"); -console.log("[DEBUG] App element found:", app); if (!(app instanceof HTMLElement)) { - console.error("[DEBUG] #app container not found or not HTMLElement"); throw new Error("#app container not found"); } -console.log("[DEBUG] Initializing state..."); let roundAnimationToken = 0; let setup: SetupState = createSetupState(); -console.log("[DEBUG] Setup created:", setup); let state: GameState = createInitialState(setup); -console.log("[DEBUG] Initial state created:", state); let isNewGameModalOpen = false; let previousScoreSnapshot: ScoreSnapshot[] | null = null; -console.log("[DEBUG] State initialized, proceeding to render..."); +let setupTab: "board" | "rules" | "events" | "players" = "board"; function rebuildSetup(overrides: Partial = {}) { setup = createSetupState( @@ -84,6 +78,7 @@ function rebuildSetup(overrides: Partial = {}) { overrides.initiativeMode ?? setup.initiativeMode, overrides.biddingOrderRule ?? setup.biddingOrderRule, overrides.weatherDraftEnabled ?? setup.weatherDraftEnabled, + overrides.weatherDraftCount ?? setup.weatherDraftCount, overrides.winCondition ?? setup.winCondition, overrides.maxRounds ?? setup.maxRounds, overrides.topLeafTarget ?? setup.topLeafTarget, @@ -154,6 +149,10 @@ function getTurnLabel() { return state.gameOver ? "Game Over" : `${getCurrentPlayer().name}'s turn`; } +function isBankingEnabled() { + return state.activeRoundEffects.includes("storehouse"); +} + function awardGrowth(player: Player, amount: number) { if (amount <= 0) { return; @@ -207,7 +206,15 @@ function getSelectedRootShiftMoves() { } function getLegalMovesForSource(sourceKey: NodeKey, player: Player) { - return getLegalMovesForSourceForState(state, sourceKey, player); + const moves = getLegalMovesForSourceForState(state, sourceKey, player); + + if (!state.activeRoundEffects.includes("sun_ladder")) { + return moves; + } + + return moves.map((move) => move.direction === "vertical" + ? { ...move, cost: Math.max(0, move.cost - 1) } + : move); } function playerHasLegalMove(player: Player) { @@ -621,6 +628,10 @@ function endTurn() { } function bankGrowthAndEndTurn() { + if (!isBankingEnabled()) { + return; + } + const player = getCurrentPlayer(); if (player.growthPoints <= 0) { endTurn(); @@ -787,6 +798,11 @@ function randomizeStartingLocations() { render(); } +function setSetupTab(tab: typeof setupTab) { + setupTab = tab; + render(); +} + function renderNewGameModal() { if (!isNewGameModalOpen) { return ""; @@ -794,6 +810,7 @@ function renderNewGameModal() { const maxSeeds = getMaxStartingNodesPerPlayer(setup.playerCount, setup.columns); const previewPlayers = createPlayers(setup.playerCount, setup.paletteOrder); + const draftCountMax = WEATHER_CARDS.length; return ` + +
+

Starting columns

+

Use 1-based column numbers. Duplicate or invalid picks are auto-corrected.

+ +
+ ${previewPlayers.map((currentPlayer, index) => ` + + `).join("")} +
+
+ ` : ""}