Build a text-based playable prototype of the core loop.

Before we build anything visual, we prove the loop works with text. If the loop is fun with just buttons and console messages, it will be fun with graphics. If it's boring with text, no amount of polish will fix it.

Ami — Combat Risk Engine

Build buttons for the full combat loop:

  • Explore — triggers an encounter chance
  • Fight — resolves with win/loss
  • Bank — moves unbanked XP to banked
  • Respawn — resets to safe zone

All output goes to the console or simple HTML text. No graphics.

Ida — Economic Growth Engine

Build buttons for the full economic loop:

  • Accept Job — generates a random job
  • Buy Materials — deducts from karma
  • Build — completes job, adds payout
  • Take Loan — adds debt

All output goes to the console or simple HTML text. No graphics.

// game/loop.js — Wiring the core loop import { gameState } from './state.js'; export function explore() { gameState.zone = "danger"; const encounter = Math.random() < 0.5; if (encounter) { console.log("Enemy appeared! Fight or flee."); } else { gameState.xp += 5; console.log("Safe exploration. +5 XP."); } console.log("State:", gameState); } export function fight() { const win = Math.random() < 0.6; if (win) { gameState.xp += 15; console.log("Victory! +15 XP."); } else { console.log("Defeated! Lost " + gameState.xp + " unbanked XP."); gameState.xp = 0; gameState.zone = "safe"; } console.log("State:", gameState); } export function bank() { console.log("Banked " + gameState.xp + " XP."); gameState.banked += gameState.xp; gameState.xp = 0; gameState.zone = "safe"; console.log("State:", gameState); } // main.js — Connect buttons to loop functions import { explore, fight, bank } from './game/loop.js'; document.getElementById('btn-explore').addEventListener('click', explore); document.getElementById('btn-fight').addEventListener('click', fight); document.getElementById('btn-bank').addEventListener('click', bank);
  • Wire up all core loop buttons
  • Connect buttons to gameState modifications
  • Show state after each action
  • Play through 3 complete loops
  • Time yourself — can you complete one loop in under 1 minute?
  • Checkpoint

    The core loop is playable as text for 3+ minutes. You can complete at least 3 full cycles.

    No graphics. No Three.js. No camera. Text only. The loop must work before we add the world.

    Adding too many features to the text prototype — keep it minimal. Only the core loop actions.

    Not testing the full cycle (start to finish) — play from the first action through banking/reset and back again.

    Forgetting to update state between actions — every button must read and write to gameState.

    This is the first playable moment. Let them play each other's games. Ask: "What feels tense?" and "What feels boring?" Their answers guide Week 2. This is also the v0.1 milestone — celebrate it.

    Both games have a working text-based core loop. State updates correctly. Risk exists. The loop can be played for 3+ minutes. This is your first playable prototype.