Files
Mana-Loop/AGENTS.md
T
n8n-gitea 831dab1eeb
Build and Publish Mana Loop Docker Image / build-and-publish (push) Successful in 1m19s
chore: update AGENTS.md and GAME_BRIEFING.md golemancy references to match completed redesign
2026-06-07 14:48:03 +02:00

9.3 KiB
Executable File
Raw Blame History

Mana Loop — Agent Guide

Browser incremental/idle game. Next.js 16 + Zustand, no backend, localStorage persistence.

🔑 Git

https://n8n-gitea:tkF9HFgxL2k4cmT@gitea.tailf367e3.ts.net/Anexim/Mana-Loop.git
git config --global user.name "n8n-gitea"
git config --global user.email "n8n-gitea@anexim.local"

Workflow

cd /home/user/repos/Mana-Loop && git pull origin master
# ... work ...
git add -A && git commit -m "type: desc" && git push origin master

Session Start

  1. docs/project-structure.txt
  2. docs/dependency-graph.json
  3. gitea_start_session → retrieve active task registry and issues
  4. Evaluate the queue to find the highest-priority ai_state: todo item (or locate an existing in-progress task if resuming work)
  5. gitea_update_issue_statusai_state: "in-progress"
  6. Work, log with gitea_add_comment, then gitea_update_issue_statusai_state: "done"

Labels

ai_state: todo | ai_state: in-progress | ai_state: review | ai_state: blocked | ai_state: done

Terminal Tool

Always pair run_commandget_process_status in same turn. Use wait: 120 for long tasks.

Sub-Agents

Use for 3+ sequential independent calls. Zero context from parent — paste everything needed.

Architecture

  • Stack: Next.js 16, TS 5, Tailwind 4 + shadcn/ui, Zustand+persist, Vitest, Bun
  • No backend: Pure client-side. No Prisma, no database. State persisted to localStorage.
  • Active stores (8 Zustand stores):
    • useGameStore — Coordinator/tick pipeline, imports all other stores
    • useManaStore — Mana pools, regen, element conversion
    • useCombatStore — Spire/floors, combat, spells, achievements
    • useCraftingStore — Enchanting (Design/Prepare/Apply), equipment instances, loot
    • useAttunementStore — Enchanter/Invoker/Fabricator attunement levels & XP
    • usePrestigeStore — Insight, prestige upgrades, pact persistence, loop state
    • useDisciplineStore — Discipline activation, XP ticking, perk evaluation (slice)
    • useUIStore — Logs, pause, game over/victory flags
  • Legacy: Fully migrated. No legacy store.ts, store/, or store-modules/ directories remain.

Adding Effects

  1. data/enchantments/ — Add effect definition in the appropriate category file
  2. craftingStore.ts → effects computation
  3. Equipment effects flow through src/lib/game/effects.tsgetUnifiedEffects()

Adding Disciplines

  1. Choose the correct data file under data/disciplines/:
    • base.ts — Raw Mana Mastery (3 disciplines)
    • elemental.ts — Elemental Attunement (21 disciplines — all 22 mana types)
    • elemental-regen.ts — Elemental Regen (8 disciplines — 7 base + transference)
    • elemental-regen-advanced.ts — Advanced Regen (15 disciplines — 8 composite + 6 exotic + transference composite)
    • enchanter.ts — Core Enchanter disciplines (4 disciplines)
    • enchanter-utility.ts — Utility enchantment disciplines (2 disciplines)
    • enchanter-spells.ts — Spell enchantment disciplines (3 disciplines)
    • enchanter-special.ts — Special enchantment disciplines (1 discipline)
    • invoker.ts — Invoker combat disciplines (2 disciplines)
    • fabricator.ts — Fabricator crafting/golem disciplines (5 disciplines)
  2. Define a DisciplineDefinition (see types/disciplines.ts):
    • statBonus.stat must match a key consumed by computeDisciplineEffects()
    • Set difficultyFactor and scalingFactor to control growth rate
    • Add perks (once, capped, or infinite)
  3. Re-export from data/disciplines/index.ts so it appears in ALL_DISCIPLINES
  4. Add any new statBonus.stat keys to discipline-effects.tscomputeDisciplineEffects()

Discipline Math (quick reference)

StatBonus     = baseValue × (XP / scalingFactor)^0.65
ManaDrainPerTick = drainBase × (1 + (XP / difficultyFactor)^0.4)
  • XP accrues every tick the discipline is active and mana drain is met
  • concurrentLimit starts at 1 and expands by 1 per 500 total XP (max 4)

Adding Spells

  1. constants/spells-modules/ — Add to the appropriate category file
  2. data/enchantments/spell-effects/ — Add enchantment effect for the spell
  3. Re-export from barrel files

Store Architecture (Key Files)

  • stores/gameStore.ts — Main coordinator, combines all stores, tick orchestration
  • stores/tick-pipeline.tsbuildTickContext() / applyTickWrites() pattern
  • stores/combat-actions.ts — Combat tick processing
  • stores/gameLoopActions.ts — Climb/spire actions
  • stores/pipelines/[name].ts — Individual pipeline phases

Crafting System

Enchanting: 3-Step Flow — Design → Prepare → Apply

  • Design: Select effects for a named design. Time: 1h + 0.5h per effect slot. Dual design slot with Enchant Mastery special.
  • Prepare: Clears existing enchantments, costs capacity × 10 raw mana, time: 2h + 1h per 50 capacity. ONLY stage where explicit disenchanting occurs.
  • Apply: Applies saved design to prepared equipment. Time: 2h + stacks hours. Mana: 20 + 5×stacks per hour.

Equipment

  • 8 slots: mainHand, offHand, head, body, hands, feet, accessory1, accessory2
  • 50 equipment types across 9 categories (casters, swords, shields, catalysts, head, body, hands, feet, accessories)
  • Instance fields: instanceId, typeId, name, enchantments[], usedCapacity, totalCapacity, rarity, quality
  • Stacking cost: each additional stack costs 20% more

Golemancy

  • Component-based construction: Core + Frame + Mind Circuit + Enchantments. Players design custom golems from 4 cores, 7 frames, 4 mind circuits, and 8 enchantments.
  • Golem slots: floor(fabricatorLevel / 2), max 5 at level 10 (+2 from Golem Crafting discipline = max 7)
  • Guardian Constructs require Guardian Core + Crystal-Steel Hybrid Frame + Guardian Circuit (Invoker 5 + Fabricator 5 + Guardian Pact)

Guardian System

  • Guardians on every 10th floor
  • Base (floors 1080): 7 base elements + Transference, static definitions with unique names
  • Tier 2 — Composite (floors 90160): 8 composite elements (Metal, Sand, Lightning, Frost, BlackFlame, RadiantFlames, Miasma, ShadowGlass)
  • Tier 3 — Exotic (floors 170240): 6 exotic elements (Crystal, Stellar, Void, Soul, Time, Plasma)
  • Tier 4+ — Procedural (floors 250+): Dual-element → multi-element combination bosses cycling through element pairs, scaling indefinitely through 8 tiers
  • HP formula: floor(5000 × (floor/10) ^ (1.1 + floor/200))
  • Pact signing: costs raw mana + time, grants permanent boons

Combat

  • Cast-speed based: castProgress += HOURS_PER_TICK × spellCastSpeed × attackSpeedMult
  • Elemental bonuses: super effective (1.5×), same element (1.25×), weak (0.75×), neutral (1.0×)
  • Element opposites (bidirectional): fire↔water, air↔earth, light↔dark, frost↔fire
  • Element counters (directional): lightning→water (lightning counters water), earth→lightning (earth counters lightning)
  • Composite element counters: blackflame counters frost/water/light (and they counter blackflame); radiantflames counters frost/water/dark (and they counter radiantflames)
  • Miasma counters air (and air counters miasma); Shadow glass counters light (and light counters shadow glass)
  • All mana types double as spell elements
  • Enemy modifiers (max 2 per enemy): Armored, Agile, Mage, Shield, Swarm
  • Room types: Combat (default), Guardian (every 10th), Swarm (15%), Speed (10%), Puzzle (20% on every 7th floor)
  • Floor HP: 100 + floor × 50 + floor^1.7 for non-guardian floors

Time & Incursion

  • TICK_MS: 200ms, HOURS_PER_TICK: 0.04, MAX_DAY: 30
  • Incursion starts day 20
  • Incursion strength: min(0.95, (totalHours / maxHours) × 0.95)

Prestige (Insight)

  • baseInsight = floor(maxFloorReached × 15 + totalManaGathered / 500 + signedPacts.length × 150)
  • Multiplied by discipline and boon bonuses. No victory ×3 multiplier (victory condition not yet defined)
  • 14 prestige upgrade types: manaWell, manaFlow, insightAmp, spireKey, temporalEcho, steadyHand, ancientKnowledge, elementalAttune, spellMemory, guardianPact, quickStart, elemStart, unlockedManaTypeCapacity, pactBinding
  • Signed pacts do NOT persist through prestige (reset each loop)

Starting State

  • Attunement: Enchanter only (level 1)
  • Mana: Only Transference unlocked
  • Equipment: Basic Staff with Mana Bolt enchantment (mainHand), Civilian Shirt (body), Civilian Shoes (feet)
  • 1 discipline slot, 1 concurrent discipline

Banned

Lifesteal/healing, scroll crafting, ascension skills, LabTab, pause mechanics, familiar system, shields, mana types: life, blood, wood, mental, force

File Limit

400 lines max (pre-commit hook enforces).

Mana Types

Base (7): Fire 🔥 Water 💧 Air 🌬️ Earth ⛰️ Light ☀️ Dark 🌑 Death 💀 Utility (1): Transference 🔗 Composite (8): Fire+Earth=Metal ⚙️, Earth+Water=Sand , Fire+Air=Lightning , Air+Water=Frost ❄️, Dark+Fire=BlackFlame 🌋, Light+Fire=Radiant Flames 🌟, Air+Death=Miasma ☁️, Earth+Dark=Shadow Glass 🖤 Exotic (6): Sand+Sand+Light=Crystal 💎, Plasma+Light+Fire=Stellar , Dark+Dark+Death=Void 🕳️, Light+Dark+Transference=Soul 💫, Soul+Sand+Transference=Time ⏱️, Lightning+Fire+Transference=Plasma

Total: 22 mana types (7 base + 1 utility + 8 composite + 6 exotic)