n
This is a historical implementation log for the Project Alchemy prototype. It is retained as an example of how a larger game can grow reusable framework systems, but active release planning now lives in Release Sprint Plan.
Sprint 0: Framework Foundation
Status: Complete.
- Add Project Alchemy menu entry and scene.
- Add
data/games/project_alchemy/ content packs.
- Add reusable alchemy, codex, and deck-rotation managers.
- Add headless smoke tests for reaction lookup, codex recording, and deck slots.
- Keep all new game state saveable as dictionaries.
Sprint 1: Movement And World Prototype
Status: Complete for MVP.
- Built a small lab/forest test room with
layoutManager.create_screen_shell.
- Added
prototype.json for player grid position, world grid, regions, material nodes, starter cards, targeting defaults, mobile controls, and training target data.
- Added reusable
topDownController2D support for cardinal grid stepping, bounds, blocked cells, line traces, and saveable dictionary state.
- Added simple tile collision, camera bounds, reusable D-pad mobile controls, and playtest sliders for step delay/tile size.
- Added health/energy/material/area HUD shell.
- Added first targeting loop: select a card, then press a direction for projectile/beam/lob-style spells. AOE and future homing spells can resolve without directional input.
Closeout: Sprint 1 delivered the save-friendly grid movement, world setup, mobile-control hooks, HUD shell, and first targeting loop needed by the MVP. Later movement/camera tuning is now tracked as playtest polish rather than blocking sprint work.
Sprint 2: Combat Prototype
Status: Complete for the first playable slice.
- Added reusable
gridCombatManager for enemy state, card damage resolution, hit logs, and saveable combat dictionaries.
- Added active-slot hotkeys
1-3, with room for 1-5 as active slots expand.
- Added an on-screen D-pad settings toggle; default is off for desktop/browser clarity.
- Added projectile/effect animation state and hit detection through grid traces.
- Added enemy archetypes in JSON: slime, ranged apprentice, tank dummy.
- Added floating damage numbers and per-enemy health bars.
- Added first enemy behavior turns for swarm/chase, ranged line attacks, and guard/tank roles.
- Added per-enemy behavior cooldown timing.
- Added player defeat and retry flow.
- Added energy recovery and Focus action so the first slice can be completed without dead-ending.
- Added an exit/victory flow that activates after all enemies are defeated.
- Keep combat card effects data-driven.
Later refinement: decide which projectile effects should graduate from grid traces into physicsEngine queries once richer projectile bodies, sensors, or hazards are needed.
Sprint 3: Alchemy Prototype
Status: Complete for the first playable slice.
- Expanded reactions from 4 starter reactions toward 20 prototype compounds.
- Added first tier-2 and tier-3 compounds in JSON, including ash, glass, obsidian, cloud, pressure, crystal, storm, arc core, soot, and geyser.
- Added discovery-unlocked card definitions for the new reactions.
- Added reusable
alchemyGraphManager to validate dangling ids, reachable compounds, and dead-end outputs as reaction data grows.
- Added reusable
combatCardFactory to resolve discovery unlocks into deck entries from JSON card catalogs.
- Added JSON-defined enemy material drops that feed combat victories back into the experiment loop.
- Records failed attempts permanently in
codexManager.
- Unlocks cards when discoveries happen.
- Added player and enemy attack trace feedback so combat outcomes are readable.
- Added reusable
targetingManager for projectile/beam ranges, lob landing areas, homing targets, AOE radii, and compact range/mode button labels.
- Added reusable
gridWorldManager for grid bounds, obstacle-cell expansion, movement blocker lists, and material node pickup checks.
- Promoted defeated-enemy material drop calculation into
gridCombatManager.
- Kept spells usable after combat victory so future respawns and environmental spell interactions can use the same casting flow.
- Removed stale scene-local canvas drawing helpers now that the board renderer is node-backed.
- Continue expanding material drops and reaction rewards in future biomes.
Sprint 4: Codex And Tools
- Status: Complete for the first playable lab/tooling slice.
- Added codex search/filter controls in the Project Alchemy scene.
- Split Project Alchemy into lab/menu pages and locked active battlefield runs.
- Added lab pages for Codex, Spells/Loadout, Inventory, and Game Selection.
- Added generated field tests through reusable
battlefieldGenerator.
- Added reusable
codexManager reaction history and collection-entry filters for discovery/failure/note rows.
- Added in-memory
alchemyGraphManager.load_graph_data() for validation fixtures and future editor tooling.
- Added graph validation smoke tests for duplicate reactions, missing inputs, and missing results.
- Added first environmental spell interaction prototype using
gridWorldManager.resolve_spell_interactions().
- Added Arena/Battle mode selection from the Game Selection lab page.
- Added split-side Battle boards with 3x3, 4x4, and 5x5 half sizes through
battlefieldGenerator.
- Added reusable
researchLabManager for inventory-consuming reaction attempts and explicit inventory deltas.
- Added a Codex Graph Health panel that summarizes reaction counts, reachable results, dead ends, and validation issues.
- Added first spell equip editing from the lab Loadout page. Unlocked spells can be equipped/unequipped into the active deck, and new discoveries auto-equip while slots are open.
Closeout: Sprint 4 established the MVP lab/menu split, Codex tooling, mode selection, Research page, and first equip flow. Richer graph detail views are post-MVP authoring polish.
Planned Lab And Mode Flow
- Project Alchemy should continue to open into the lab/menu layer after a new game or loaded save.
- Lab pages should include Game Selection, Codex, Spells, Loadout, Research, and Inventory.
- Starting a field test locks Codex, Spells, Loadout, Research, Inventory, and Game Selection until the active level or level chain is completed.
- Reaching an exit returns the player to the lab/menu layer with newly acquired resources, discoveries, and unlocked spell options.
Planned Game Modes
Arena mode keeps the current generated battlefield model: free movement, randomized battlefield layout, obstacles, material nodes, enemies, spell interactions, and exits.
Battle mode is a clean tactical duel format with no rocks, no reserved environment squares, no material nodes, and no random obstacle cells.
- Battle mode boards are split into two equal halves with a center line neither side can cross.
- Battle mode should support 3x3, 4x4, and 5x5 halves. A 3x3 battle therefore means a 3x3 player side on the left and a 3x3 enemy side on the right.
- Player-controlled units/cards remain on the left half. Enemies remain on the right half. All attacks must resolve across or within those sides by range, AOE, lob, beam, or future targeting rules.
Planned Research Lab Inventory Rules
- Research should use real inventory entries rather than free starter buttons.
- The player selects exactly two elements from current inventory and attempts to combine them.
- On success, both selected elements are consumed and the resulting element or compound is added to inventory.
- On failure, one selected element is randomly destroyed and the other is returned to inventory.
- Every attempt should still record to the codex history so failed experiments remain useful knowledge.
- The first implementation shows selected inputs, current inventory counts, and clear loss/reward messages after each attempt. Future UI should preview known discovered outputs without revealing unknown recipes.
Sprint 5: Card Framework
Status: Complete for the first card-creation/playtest slice.
Closeout: Sprint 5 now establishes data-driven card composition, created-card persistence, Project Alchemy save slots, a dedicated Research Lab page, inventory-refresh behavior, and known-recipe crafting. The remaining feedback items are deferred because they require a broader inventory/reward save-shape change or belong to Sprint 6 combat/deck pressure.
Goal: turn discovered compounds into authored/composed combat cards without hardcoding each card in scene scripts.
- Extend
combatCardFactory from catalog lookup into composition rules that can combine compound + manifestation + modifier data.
- Keep compounds, manifestations, modifiers, base costs, targeting modes, damage formulas, and unlock requirements in JSON.
- Add a Spells lab page that reads the player's discovered compounds and available manifestations/modifiers.
- Let the player preview a composed card before creating or equipping it: compound, form, modifiers, energy cost, damage, range/mode, and description.
- Store created cards as save-friendly dictionaries with stable ids and source recipe metadata.
- Feed created card ids into
spellLoadoutManager for equip/unequip rules and into deckRotationManager for active-hand play.
- Add validation tools for missing compound ids, invalid manifestation ids, invalid modifier ids, and cards that cannot be composed from known data.
- Add fixture save files before changing Project Alchemy save shape for created cards, equipped loadouts, discovered compounds, and lab progress.
- Add headless smoke tests for composition, preview formatting, save/restore, and using composed cards in
gridCombatManager.
Suggested first slice:
- Added composition metadata to
data/games/project_alchemy/cards.json.
- Added
combatCardFactory.compose_card(compound_id, manifestation_id, modifier_ids).
- Added composition preview and validation helpers for missing compounds and incomplete card data.
- Added a compact Card Creation section to the Spells lab page with compound, manifestation, modifier, preview, and create controls.
- Added
combatCardFactory.register_card(card) so composed cards can become normal deck/loadout entries.
- Added scene-level Project Alchemy
get_state() / apply_state() helpers that keep created cards, lab selections, materials, codex, spell loadout, and active field state save-friendly.
- Added a single Project Alchemy save path, Continue/New menu actions, and autosave hooks for lab changes, created cards, active runs, defeat, and exit completion.
- Added
GameState.set_project_alchemy_save_path() so tests and future save profiles can redirect Project Alchemy persistence without scene changes.
- Added three Project Alchemy save slots using the shared save-slot renderer. Slot summaries show materials, discoveries, created cards, and updated time.
- Moved Research Lab onto its own dedicated lab page.
- Added shared lab-control refresh after inventory changes so newly collected materials update Research and Card Creation controls.
- Added known-recipe previews. Known combinations show their result, disable
Attempt Research, and expose Craft.
- Keep the current authored starter cards as fallback cards until composed-card balance is stable.
Post-MVP polish after Sprint 5:
- Tune composed-card costs/damage/ranges against authored starter cards.
- Add richer validation for invalid manifestation/modifier combinations.
- Promote the Project Alchemy save-slot summary logic into a reusable profile/slot adapter if another game needs similar metadata.
- Improve the Card Creation lab UI into full card-like panels if playtesting proves the current explicit
Creates/Costs/Stats preview is not enough.
Playtest Feedback Triage
Completed from playtest feedback:
- Fixed Research Lab refresh so newly collected resources immediately update available research inputs/options.
- Moved Research Lab to its own dedicated lab page instead of sharing the Spells page.
- Track known recipes. Previously researched combinations now show their result, disable/grey out
Attempt Research, and expose a Craft button.
- Unknown combinations display
Unknown until discovered.
Inventory/reward feedback that later sprints absorbed:
- Done: split inventory display and save data into categories: Resources/Elements, Forms, Modifiers, Consumables, and Items.
- Done: update Card Creation so Forms and Modifiers come from inventory, are consumed when creating a spell, and are returned when a spell is deconstructed.
- Done: add spell deconstruction. Deconstructing should return the base Element, Form, and Modifier used by the created spell.
- Done: add reward preview text to game modes:
- Arena:
1x random Form, 1x random Modifier.
- Battle:
1x random Form or Modifier.
- Done: add an exit reward screen showing collected resources, random Form rewards, and random Modifier rewards before returning to the lab.
Status: implemented as the first Sprint 6 bridge. Project Alchemy now saves categorized inventory dictionaries, consumes Forms/Modifiers during spell creation, supports crafted spell deconstruction, and displays mode reward structures from JSON. Future work should polish the reward screen and add richer reward rarity tables.
Sprint 6 combat/deck feedback:
- Allow up to 10 active spells.
- Rotate spells randomly after each use during gameplay.
- Allow an Element with no Form/Modifier to cast a one-tile attack directly in front of the player for environmental interactions and short-range damage.
- Add
Auto Mode setting, default off. When enabled, CPU units act every few game steps instead of only after player actions.
- Increase enemy damage significantly, targeting roughly 10-20 damage per hit.
Sprint 6 status:
- Active spell loadouts now support up to 10 equipped spells.
deckRotationManager supports random draw replacement through a reusable random_draw option.
- Auto Mode is exposed in Project Alchemy settings and saved with the field state.
- Enemy movement/decision speed is exposed as a Project Alchemy field-test setting and saved with the field state.
- Raw element abilities resolve as one-tile directional attacks.
- Current enemy archetype damage is tuned into the 10-20 damage band.
- Lab navigation now separates
Spells from Loadout: spell creation/deconstruction belongs to Spells, while equip/unequip details live on Loadout.
Future inventory/equipment feedback:
- Consumables should include field-use items such as potions, energy restoration, bombs, and similar one-shot tools.
- Items should include gameplay modifiers such as armor, trinkets, relics, passive equipment, and run-wide modifiers.
Sprint 6: Deck Rotation
Status: Complete for MVP.
- Expand active slots, pinned slots, reforming queue, and energy costs.
- Test rotation under real-time combat pressure.
Closeout: The final MVP slice uses fixed visible slots 1-3 for readability, while deckRotationManager keeps reusable rotation support available for later games and post-MVP Project Alchemy expansion.
Sprint 7: Forest Vertical Slice
Status: Complete for the first forest vertical slice.
- Add forest biome data, material nodes, three enemies, one elite, and one boss.
- Add 20-30 minutes of playable progression.
Sprint 7 closeout:
prototype.json now seeds a larger Mosswood Edge arena with more material nodes, JSON-tuned obstacle density, and the first normal/elite/boss encounter set.
enemies.json now includes Thorn Guard, Spore Caller, and Old Growth Warden archetypes for higher-pressure forest playtests.
battlefieldGenerator reads Arena obstacle count from prototype data so biome tuning can happen in JSON.
- Field completion now shows a
Field Results popup after reaching the exit, including mode completion, victory text, random Form/Modifier rewards, and a continue-back-to-lab action.
- Add objective/reward panels for longer forest runs. Initial data-driven objective panel now appears during active field tests.
- Add at least one forest-specific environmental interaction chain. First pass adds Bramble Gate and Mist Pool interactions to Mosswood Edge.
- Tune enemy count and health after mobile/browser playtesting.
- Add richer reward rarity/weight tables so Forms and Modifiers are not purely uniform random picks. Initial weighted reward tables are now seeded in
prototype.json and used by field completion rewards.
- Add consumable/item examples once the reward screen and inventory categories feel stable. Initial examples now include Minor Potion, Energy Draught, Spark Bomb, Moss Charm, Bark Ward, and Warden Seed as JSON-defined inventory rewards/placeholders.
- Auto Mode now keeps enemy decisions on the timer path instead of advancing enemies directly from player movement or spell use.
Deferred Sprint 7 polish:
- Tune enemy count, health, rewards, and total run length after mobile/browser playtesting.
- Improve the active objective panel into a clearer checklist with reward and exit-unlock status.
- Polish the Project Alchemy settings UI.
Sprint 8: Progression And Adventure Scaffolding
Status: Complete for the first Adventure scaffolding/playtest slice.
Goal: establish data-driven multi-level progression without destabilizing the current Arena/Battle playtest slice.
- Add reusable
adventureManager for JSON adventure loading, validation, current-level lookup, objective completion, and save-friendly run state.
- Add first Project Alchemy adventure JSON:
mosswood_intro, a three-level forest chain mixing handcrafted and procedural level definitions.
- Add headless smoke coverage for adventure loading, required-field validation, objective-gated level completion, and level advancement.
- Added Adventure as a third Project Alchemy Game Selection mode.
- Added first reusable Adventure selector/detail controls to the Game Selection page. The current build has one Adventure, but the UI reads from
adventureManager.list_adventures().
- Added first scene-level conversion from Adventure level JSON into the existing active field data shape, keeping Arena/Battle paths intact.
- Added Project Alchemy save fields for selected Adventure id and Adventure run progress.
- Adventure level exits now advance to the next connected level; completed Adventures return to the lab and pay fixed JSON rewards.
- Health now carries between connected Adventure levels.
- Added a first Adventure transition popup between connected levels.
- Adventure objectives now persist during play from interaction triggers, material collection, and enemy defeat state instead of being mass-completed at exit.
- Adventure levels can define per-level rewards, and the transition popup now summarizes completed objectives, carried health, level rewards, and the next level.
- Added
project_alchemy_adventure.cfg as the first Adventure save fixture for selected Adventure id and connected-level progress.
Carried into Sprint 9:
- Add richer Adventure selector artwork, difficulty/rule previews, and multiple authored Adventures.
- Expand objective tracking for scripted events, optional secrets, puzzle chains, and non-combat objectives.
- Add dedicated level-transition reward cards instead of compact popup text.
- Playtest procedural Adventure level generation and tune reward pacing.
Sprint 9: Adventure Mode Expansion
Status: Closed.
- Added reusable
adventureManager.get_progress_summary() for current level, required objective, optional objective, and finished-state display.
- Adventure selector details now show saved Adventure progress when a run exists.
mosswood_intro now includes first Adventure-level rules metadata, an optional secret objective, and scripted-event placeholder entries.
- Objective tracking now recognizes optional
secret objectives through the same interaction-completion path used by required environmental objectives.
- Playtest fix: Research discoveries now only record knowledge and inventory results. They no longer auto-create or auto-equip spell cards.
- Playtest fix: new games start with no Forms; spell creation can use the always-available
None Form for a one-tile element attack.
- Playtest fix: spell creation now costs 3x compound. Deconstruction can target any loadout spell and returns only 1x compound plus any Form/Modifier used.
- Playtest fix: spell casts apply a short cooldown even when energy cost is 0, and active spell buttons render as a wider strip under the field.
- Playtest fix: field results include resources collected during the run.
- Playtest fix: the first Mosswood bramble objective is optional and includes a clearer hint so missing Fire no longer soft-locks Adventure progress.
- Started the sprite assignment framework for Project Alchemy. The new
data/games/project_alchemy/sprites.json sprite map declares required player/enemy/spell states, supports direct PNGs, spritesheet cells, spritesheet animation ranges, and reports placeholder assignments that still need art.
- Active battlefield rendering now resolves player, enemy, material, and projectile sprite ids through
spriteManager, falling back to colored markers when an assignment is still missing.
- Added reusable
sprite_animation_rect.gd and spriteManager.create_texture_node(). Project Alchemy now uses the helper so mapped spritesheet frame ranges can play as animations during active battlefield rendering.
- Seeded a reusable Godot sprite mapper at
scenes/sprite_mapper.tscn. It opens data/games/project_alchemy/sprites.json, previews direct PNGs/sheet cells/animations, highlights missing assignments, supports numeric remapping into the JSON editor, supports direct PNG path mappings, validates missing paths and out-of-bounds cells, creates .bak files before saving, and saves the edited JSON.
Closeout:
- Sprint 9 closes with Adventure progress visible in the selector, optional and required objective tracking seeded, the Mosswood soft-lock removed, the research/spell creation playtest rules corrected, and Project Alchemy sprites routed through a reusable JSON-driven sprite assignment layer.
- The remaining work is presentation and authoring depth rather than core plumbing: richer Adventure cards, in-game scripted-event display, more authored Adventure content, and sprite mapper usability polish.
Sprint 10: Sprite Mapper Polish And Adventure Presentation
Status: Complete for MVP.
- Done: polish the reusable sprite mapper with a visual sheet grid picker so artists can click cells/ranges instead of typing row and column values.
- Done: add file-picker browsing for direct PNG assignments.
- Done: add explicit source mode selection so direct PNG mappings do not accidentally override spritesheet cell or animation mappings.
- Done: refresh sprite previews immediately after applying JSON edits, before the file is saved.
- Done: add explicit save confirmation and backup restore actions for safer JSON editing.
- Done: extend
spriteManager required sprite generation with reusable directional contracts and have the sprite mapper materialize missing placeholders into editable JSON.
- Done: add first smooth grid-step rendering and projectile travel timing for Project Alchemy, with a Projectile Travel playtest slider.
- Done: audit current games and add per-game sprite maps for Reflecting Pool, Emoji Card Collector, and Arcade Pong so all active games can resolve
sprite_id through the same sprite framework.
- Done: add reusable canonical-direction sprite rotation support. Arcade Pong now draws
pong_ball_right rotated by velocity, with pong_ball as a compatibility fallback; the same pattern can be used for projectiles and thrown objects.
- Assign more real Project Alchemy player, enemy, material, spell, and tile sprites through
data/games/project_alchemy/sprites.json.
- Done: render Adventure scripted events in-game.
level_start dialogue now appears in the field status line, and objective_complete codex-note scripts are recorded through the codex manager with fired script ids saved per run.
- Done: replace compact Adventure transition text with dedicated objective and reward cards.
- Done: replace text-only inventory sections with reusable inventory category panels for Resources, Forms, Modifiers, Consumables, and Items.
- Done: add
Cinderwell Patrol as a second authored Adventure so the selector/detail UI can be tuned against multiple entries and distinct reward profiles.
Closeout:
- Current Sprint 10 work is stable enough for a break. The sprite mapper can switch between game sprite maps, browse direct PNGs, pick sheet cells/ranges, clear mistaken mappings back to missing, validate generated JSON, and restore backups.
- Project Alchemy now has two authored Adventures in the selector: Mosswood Initiation and Cinderwell Patrol.
- Remaining sprite work is art assignment, not framework functionality: assigning more final Project Alchemy sprites and continuing panel/card polish where detailed inventory interactions are added.
Sprint 11: Alpha MVP Hardening
Status: Complete for MVP.
Goal: make the existing vertical slice understandable and repeatable enough for alpha playtests before adding another large mechanic.
- Added reusable
guidancePanel for compact onboarding/objective copy that can be reused by lab pages, field runs, tutorials, pause overlays, and future games.
- Added
prototype.json guidance text for Project Alchemy lab pages and active field states so copy can be tuned without scene edits.
- Project Alchemy now shows lab-specific next-step guidance for Game Selection, Research, Spells, Loadout, Inventory, and Codex.
- Active field runs now show a field guidance panel that explains movement, spell selection, aiming, exit behavior, or defeat state depending on context.
- Added reusable
combatCardSlotPanel and routed Project Alchemy active spell slots through it so combat controls show cost, damage, targeting mode/range, cooldown, and aiming state more clearly.
- Added reusable
objectivePanel and routed Project Alchemy active objectives through structured required/optional rows with status marks and detail text.
- Added objective reward hints and clearer exit-lock/unlock text so alpha playtesters can tell what remains, what pays out, and when it is time to return to the lab.
MVP alpha closeout tasks:
- Assign final-enough player/enemy/material/projectile sprites for Mosswood Initiation.
- Tune the first Adventure into a beatable 8-12 minute alpha slice.
- Add a short first-run tutorial path for research -> spell creation -> loadout -> field deployment.
Closeout: Sprint 11 delivered reusable guidance panels, active spell mini-card controls, objective rows, reward hints, and exit-state clarity. The three closeout tasks above are now represented in Sprint 12 as playtest/art validation, not missing framework functionality.
Post-MVP art/playtest tasks:
- Continue replacing placeholder sprites as art arrives.
- Add richer Adventure cards, scripted event presentation, and biome variants after the MVP loop is validated.
- Revisit optional systems such as shops, consumable actions, equipment, and expanded achievements after the MVP is in playtest.
Playtest checklist for next session:
- Can a new player understand Game Selection, Research, Spells, Loadout, Inventory, and Codex from the page guidance alone?
- In field mode, are movement, spell selection, aiming, cooldown, and energy recovery obvious without outside explanation?
- Do objective rows clearly show required work, optional work, rewards, and exit state?
- Is Mosswood Gate completable without a soft lock or excessive backtracking?
- Does a full Mosswood Initiation run feel close to 8-12 minutes, or does enemy health/damage/reward pacing need adjustment?
- Which placeholder sprites hurt readability most: player, enemies, materials, projectiles, tiles, or UI?
Sprint 12: Playtest Feedback Intake
Status: Implementation wrapped for MVP; awaiting playtest/art validation.
Goal: finish only the MVP-critical playtest fixes needed to hand Project Alchemy to art and external playtesting, then pause new feature work while other framework prototypes continue.
MVP definition for closeout:
- A new or loaded save lands on the lab/menu layer.
- The player can understand Research, Spells, Loadout, Inventory, Codex, and Game Selection from the in-game guidance.
- Arena, Battle, and the first Adventure can be entered, completed, retried, or abandoned without dead controls or soft locks.
- Grid movement, spell selection, aiming, cooldowns, projectile/lob travel, enemy turns, objectives, exits, rewards, and return-to-lab flow work reliably.
- Research/crafting/deconstruction uses inventory correctly and saves cleanly.
- The first Adventure is beatable in roughly 8-12 minutes with placeholder art that is readable enough for playtesting.
- A first-run checklist guides the player through research, spell creation, loadout confirmation, and field deployment without adding another screen.
- The first Adventure exposes data-driven pacing metadata for playtest tuning: estimate, level count, encounter count, and required/optional objective counts.
Immediate UI and flow tasks:
- Done: Project Alchemy title menu hides
New Experiment when a continue save exists, showing Continue/Saves as the primary path. This should be handled by reusable menu visibility rules rather than scene-specific code.
- Done: active field mode removes prototype labels such as
Field Prototype and Combat Test, avoids dead bottom-bar navigation, and hides inactive lab page buttons during field play.
- Done: replace the Focus action with energy recovery rules. Movement grants energy while Auto Mode is off, and a timed recovery cadence grants energy while Auto Mode is on. The Focus button is now hidden from field controls.
- Done: field HUD moved health and energy into overlay bars inside the play area, with health in the lower-left using reusable
resourceBar and energy as segmented pips beneath it.
- Done: material collection, battle feedback, and short status messages appear as readable top-left stacked messages instead of expanding status text that shifts the board. New messages appear at the top, older messages move down, the stack expires after a few seconds without requiring input, and noisy aiming/cast/miss/enemy-damage messages are filtered out.
- Corrected: active field layout now keeps status/HUD text out of the vertical board stack and places fixed spell slots directly below the play area.
- Done: field spells are fixed slots 1-3 for the alpha slice. They no longer rotate after use. Future work may expand to 1-5 and add drag/drop slot assignment.
- Deferred: field-use consumables/items are not MVP-critical. Keep their JSON placeholders for future inventory/equipment work, but do not add field UI or actions before the MVP playtest handoff unless they become necessary for completing the first Adventure.
Combat and map tasks:
- Done: active field now uses a full-width field panel with a centered square playable area, leaving side gutters for health/status overlays when space is available. Spell slots stay below the field. The tactical camera renders a half-tile buffer beyond the 6-tile reveal radius in every direction, so the player can see when paths continue beyond the screen while enemies, items, exits, and interaction markers remain hidden past 6 tiles. The far edge grid line is omitted so half-cells read as partial visibility rather than a full tile boundary. Cells outside the camera's intersection with the actual world are black: no terrain color, no grid lines, and no offscreen markers. Follow-up camera work is playtest tuning only.
- Done: distance attack lifecycle now uses reusable
projectileLifecycleManager for projectile/lob queue decisions, visual travel state, save-friendly active effect dictionaries, and ready-effect handoff. Projectile and lob effects resolve through the existing grid combat and environment interaction path when travel completes, and impact cells are recalculated at impact time so moving targets/obstacles use the current board state rather than the cast-time snapshot. Remaining validation work is playtest readability only. Post-MVP work: mine/AOE timing polish and richer area preview/impact presentation.
- Done: enemies only hard-target the player after being hit or when the player enters configured aggro range; otherwise reusable grid combat behavior makes them wander instead of beelining across the whole map.
- Done: fixed Warden Root exit gating so completed combat objectives always allow returning to the lab, with no soft lock if the player lacks a specific spell.
- Done: Mosswood Initiation now uses explicit required/optional objective copy and per-instance enemy tuning so the first Adventure stays focused on MVP combat completion instead of feeling like a mandatory puzzle chain.
- Done: Arenas and battles use simple clear-threat objectives and return exits.
- Done: live monsters render above defeated monster remains.
- Post-MVP polish: smooth movement between tiles should continue improving for player and enemy actors so animation and movement read as one action.
Lab, spell, and inventory tasks:
- Done: Research Lab only shows unknown combinations. Known recipe crafting belongs on the Spells page.
- Done: removed the Recent Attempts section from the Codex page while recipe/crafting history is better surfaced elsewhere.
- Done: Spells page previews now clearly label
Creates, Costs, and Stats; deconstruction previews now show the selected spell, returned parts, and the fact that the spell is removed from unlocked/equipped lists. Full card-like panels remain post-MVP presentation polish.
- Post-MVP: known-recipe crafting can derive missing compounds through known sub-combinations where inventory allows. For MVP, crafting known recipes from currently held materials is sufficient.
- Keep labels consistent:
Fire (x1), Compound (x3), Form (x1), Modifier (x1), and the same phrasing in rewards/deconstruction.
- Done: added gold as a Project Alchemy currency. Gold is saved with inventory state and rewarded from Battle, Arena, and Adventure runs; later work will connect it to shops and selling.
- MVP: Elements, Forms, Modifiers, Consumables, and Items should remain visibly separate categories. Post-MVP: inventory items can gain icons, sell values, sell actions, and quantity confirmations.
- Corrected: Retry/Give Up stay out of the active play screen bottom bar. The defeat popup offers recovery choices, and Give Up returns to the lab with no collected materials or rewards.
- Corrected: using the header Menu during an active field opens a field menu with Resume, Retry Field, Give Up to Lab, Settings, and Main Menu choices. It does not abandon or exit unless the player chooses that action.
- Extracted: the active field menu now uses reusable
fieldMenuController instead of scene-local button construction.
- Done: the lab guidance panel now includes a data-enabled MVP tutorial checklist for early saves. It marks Research, Spells, Loadout, and Game steps from real state, shows one next action from
prototype.json, and hides after the onboarding loop is complete.
- Done: Project Alchemy lab navigation now uses shared sprite-framework icons for Game, Codex, Spells, Loadout, Research, and Inventory so the MVP lab pages are easier to scan on mobile/browser screens.
- Done: Adventure selection now shows MVP pacing metadata from
adventureManager.get_pacing_summary() so Mosswood Initiation can be tuned toward the 8-12 minute target without adding new mechanics.
- Done: reward previews and fixed Adventure rewards now use named categories such as
Gold, Elements, Forms, and Modifiers so players can understand what a mode pays out before and after completion.
Framework and tooling tasks:
- MVP: keep headless smoke coverage green for the active Project Alchemy loop, save/load, Adventure progress, field menu, status feed, resource bars, and projectile lifecycle.
- Done: Project Alchemy save migrations now backfill current MVP fields for old fixtures: categorized inventory resources, gold, selected Adventure, Adventure run progress, fired script ids, run pickups, active projectile lifecycle state, and enemy decision speed defaults.
- Post-MVP: game-specific achievement filtering, single-game export packaging, a Godot JSON map editor, and controller/remappable input expansion.
Sprint 12 Pause Notes
Validated in the current branch:
- The active field no longer exposes dead bottom navigation. During a run, the header Menu opens an explicit field menu with Resume, Retry Field, Give Up to Lab, Settings, and Main Menu.
- Retry/Give Up are now intentional menu choices instead of always-visible play controls or automatic exits.
- Active field labels that were pushing the board around are hidden from the main stack. Status updates use the overlay/toast path instead.
- Spell slots are fixed below the active field for the alpha slice.
- Enemies use JSON-configured aggro behavior. They wander or idle until hit or until the player enters their aggro range.
- Project Alchemy active field sizing now keeps the field panel full-width while drawing the playable grid as a centered square. The camera renders 6.5 tiles of directional context in each direction, keeps enemies/items capped to the 6-tile reveal radius, and leaves non-visible/non-world space black.
- Headless smoke coverage exists for the field menu behavior, hidden active HUD labels, fixed spell-slot placement, enemy aggro/wander behavior, the reusable field menu controller, the full-width field/centered-square playfield layout, the square camera window, named reward category summaries, current-state projectile impact resolution, scene-level active field state restore, and Project Alchemy save fixture migration into the current MVP state shape.
MVP Implementation Closeout
All sprint-scoped MVP functionality is implemented and covered by the current headless smoke suite where practical:
- Lab/menu entry, save slots, load/new flow, and save migrations.
- Research, known crafting, spell creation/deconstruction, loadout, inventory categories, gold rewards, and named reward summaries.
- Arena, Battle, and Adventure entry/exit flow, explicit retry/give-up menu choices, no-soft-lock Adventure exits, and return-to-lab handling.
- Grid movement, fixed active spell slots, cooldowns, energy recovery, enemy aggro/wander, projectile/lob lifecycle, field HUD/resource bars, status feed, objective rows, reward cards, and active-field restore.
- Data-driven tutorial checklist with next action, lab nav icons, Adventure pacing metadata, sprite-map assignment, and runtime sprite manifest support.
The remaining MVP closeout work is validation, not implementation: playtest the flow on desktop/mobile, tune Mosswood pacing, confirm projectile/lob readability, and replace only the placeholder sprites that block playtest comprehension.
MVP validation priorities:
- Playtest the revised active field menu and confirm Retry/Give Up behavior matches the intended flow.
- Playtest the field camera/fog follow-up so the visible grid remains a stable centered square on mobile and desktop, with side gutters available for HUD and status when the screen is wide enough.
- Verify projectile/lob travel, collision timing, and environment interactions are readable enough for the first Adventure. Defer mine/AOE polish unless it blocks MVP completion.
- Tune Mosswood Initiation pacing: enemy health/damage, rewards, resource availability, exit clarity, and total run length. The Adventure selector now exposes estimate, encounter count, objective counts, and named reward categories for this pass. The first pass of Mosswood-specific enemy health and objective copy tuning is in place; playtest should confirm the 8-12 minute target.
- Playtest the minimal first-run tutorial path that teaches research, spell creation, loadout, and field deployment. The data-driven checklist is in the lab guidance panel with one next action; playtest should confirm the copy is enough.
- Assign final-enough sprites only where placeholders block readability: player, enemies, materials, projectiles, tiles, and critical UI.
Post-MVP backlog:
- Consumable/item field actions, shops/selling, equipment, relics, and passive item effects.
- Expanded achievements and achievement filtering.
- Single-game export packaging.
- Godot JSON map editor.
- Controller/remappable input expansion beyond current MVP controls.
- Richer card-like Spells page panels and derived known-recipe crafting.
- Mine/AOE lifecycle polish, warning zones, and richer area previews.
MVP Playtest Feedback 2026-07-13
See MVP Playtest Feedback 2026-07-13 for the current cross-game MVP feedback list. The tracked implementation items are now closed. Remaining work is validation and art/content polish: replay the MVP loops on desktop/mobile, replace placeholder assets that block comprehension, and keep any new changes limited to playtest-proven issues.
Adventure Backlog
- Add Adventure as a third Project Alchemy mode alongside Arena and Battle.
- Adventures contain 3+ connected levels. Completing one level's objective unlocks the exit to the next; health persists between levels.
- Adventure rewards should exceed Arena/Battle rewards with more Forms, Modifiers, and Elements to compensate for the longer risk chain.
- Store each prebuilt Adventure as one JSON definition, even when it contains multiple connected levels.
- Support handcrafted levels and procedural generation templates in the same Adventure file.
- Allow level dimensions to vary per level, such as 4x4, 12x12, or 16x16.
- Each level should define metadata: name, theme/biome, background, tile set, music, ambient effects, and future weather/lighting.
- Tile data should define terrain and environmental properties such as walkability, elevation, destructibility, flammability, water, ice, lava, poison, and other interaction tags.
- Object placement should include player spawn/facing, enemies, facing, AI state, patrol routes, bosses, resources, NPCs, treasure, secrets, doors, traps, switches, and exits.
- Objectives and scripts should be data-driven: primary/optional objectives, triggers, environmental events, dialogue, cutscenes, rewards, and story flags.
- Environmental puzzles should use core alchemy mechanics: burning trees, freezing water into bridges, igniting oil, melting ice walls, conducting electricity through water, and chain reactions.
- Secrets should support hidden rooms, alternate paths, optional bosses, lore items, and unique rewards.