Three-agent fan-out. Opus pre-wrote Corpse class + 5 EventBus signals + World registries (corpses, grave_markers) before dispatch so all three slices ran fully parallel. Pattern proven across Phases 12/13/14. Death pipeline (Agent A): - Pawn.is_dead(), _check_death() — pawn_died signal → corpse spawn → corpse_spawned signal → World.unregister_pawn → queue_free - _last_damage_source carries cause from take_damage() (now StringName) - Bleed-out timeout: _bleed_ticks accumulates while bleeding active; at BLEED_OUT_TICKS=432000 (6 in-game hours) force-kills via take_damage - Pawn.portrait_color stored field for corpse head-color hand-off - Corpse: DECAY_PER_TICK=0.05 (~33 in-game min fresh→rotted at 1×), is_rotting()@50, queue_free@100 with corpse_rotted_away signal. Rotting bumps DirtinessSystem (Phase 13 hook) +0.04/tick (~+8/in-game-min) - DEMO_PHASE14_AUTOKILL toggle in world.gd (default false, gates safety) Graveyard + GraveSlot + GraveMarker + Hauling (Agent B): - scenes/world/graveyard_zone.gd — StorageDestination subclass, accepted_types=[corpse], brownish overlay, finds dug GraveSlots - scenes/entities/grave_slot.gd — buildable (ghost→dug) state machine, StorageDestination duck-type interface, accept_corpse() spawns GraveMarker + emits corpse_buried + queue_frees self - scenes/entities/grave_marker.gd — permanent memorial, procedural stone-cross _draw, carries deceased identity, save round-trip - TOOL_GRAVEYARD + TOOL_DIG_GRAVE paint modes (Designation dispatch) - KIND_PICKUP_CORPSE + KIND_DEPOSIT_CORPSE toils + JobRunner handlers - HaulingProvider.find_best_for iterates World.corpses in addition to items_needing_haul; corpse-payload stored as Node metadata on pawn - ConstructionProvider duck-type already accepts GraveSlot (no change) Cremation + Ash + Mood thoughts (Agent C): - scenes/entities/cremation_pyre.gd — extends Workbench, label 'Pyre', auto-populates FOREVER bill for cremate_corpse, on_craft_complete drops 1 ash + emits corpse_cremated + queue_frees corpse - Recipe.ingredient2_type/count added with save round-trip; recipe catalog entry cremate_corpse(TYPE_CORPSE primary + 5 wood secondary) NOTE: CraftingProvider still only enforces ingredient1 — documented gap, ships when crafting is generalized. - Item.TYPE_ASH added + ALL_TYPES filter array entry - 4 mood thoughts: saw_corpse (-3 EVENT 1200t max=3), buried_friend (+2 EVENT 2400t), cremated_friend (+2 EVENT 2400t), rotting_body_in_colony (-4 PERSISTENT stacks=count capped at 3) - Pawn sync hooks: proximity scan (saw_corpse), signal listeners (buried/cremated within 8-tile radius), count helper for rotting MCP runtime verified: - DEMO_PHASE14_AUTOKILL toggle force-killed Bram at tick 50 - 'Bram DIED (cause=demo_kill, tile=(20, 36))' + corpse spawned - 'Cora: saw_corpse thought added (corpse Bram at dist 5)' — mood -3 - Painted graveyard + dig_grave → grave dug to completion verified in build_queue (grave @(22, 39) complete=true) - Hauler round-trip (corpse → GraveSlot → GraveMarker) WIRED correctly but didn't land within decay window at ULTRA speed (12×) — corpse rotted before priority-3 corpse-haul scheduled. Tuning for Phase 20. - Screenshot captured: fresh corpse silhouette at cabin doorway Delegation: 3× gdscript-refactor (Sonnet) agents in parallel; integration + MCP runtime verify on Opus. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
215 lines
29 KiB
Markdown
215 lines
29 KiB
Markdown
# memory — rimlike
|
||
|
||
Durable memory for this project. Read at session start, update before session end. Date format: `YYYY-MM-DD`.
|
||
|
||
A 2D, tile-based **cute-farming-RPG-meets-colony-sim** — Rimworld DNA, Going Medieval × Stardew lodestars — shaped for mobile and handheld. Promoted from `~/claude/ideas/rimlike` on 2026-05-10 after a single deep brainstorm session. Realistic MVP timeline: **3–6 months solo**.
|
||
|
||
## How to read this project
|
||
|
||
`memory.md` is the index of decisions and open questions. The deep specs live alongside in `docs/`:
|
||
|
||
| File | Contents |
|
||
|---|---|
|
||
| [`docs/design.md`](./docs/design.md) | Game design — core loop, simplifications, skills, statuses, mood, weather, stockpiles, production, combat, death/burial, storyteller corpus |
|
||
| [`docs/architecture.md`](./docs/architecture.md) | Tech — pawn AI / job system, time/tick model, Godot 4 engine layout, TileMap split, all subsystems (mood, lighting, rooms, hauling, production, combat, storyteller) |
|
||
| [`docs/ui.md`](./docs/ui.md) | Touch UX — work-priority matrix, stockpile/container screens, mood/lighting/rooms cues, combat banners, storyteller event UI, screens still to design |
|
||
| [`docs/art.md`](./docs/art.md) | Owned assets (ElvGames bundle primary, Ventilatore secondary), license, autotile gotcha, audit list, candidates kept for record |
|
||
| [`docs/implementation.md`](./docs/implementation.md) | **Phased build plan** — 21 phases (audit → P0 scaffold → … → P20 export). Checklists, acceptance demos, scope-cut levers, de-risking spikes. Track progress here. |
|
||
|
||
When working on a feature, read `memory.md` first, then the relevant `docs/` file(s). For "what do I build next?" check the **Status** row at the top of `docs/implementation.md`.
|
||
|
||
## Decisions & rationale
|
||
|
||
Distilled from the brainstorm. Each lock has a "why" — change with deliberate intent.
|
||
|
||
### Pillars
|
||
|
||
| Decision | Choice | Why |
|
||
|---|---|---|
|
||
| **View** | Top-down grid for gameplay (pathfinding, designation, floor) **+ 3/4-perspective rendering for vertical structures** (walls, doors, furniture). | Re-decided 2026-05-10 after exhausting the asset library: every wall pack we own is RPG-style perspective (Stardew / Going Medieval style), not Rimworld-style top-down. Pivoting the renderer (Y-sorted entity sprites for walls) makes the entire library usable as-is and replaces the "we need to author or commission" bottleneck. Gameplay grid + pathfinding stay identical; only the rendering of vertical structures shifts. |
|
||
| **Wall layer rendering** | Walls are **entity sprites** (Sprite2D / Y-sorted Node2D), not TileMap cells. `Wall` TileMap layer (Layer 2) becomes data-only — used for pathfinding-impassable + room-detection BFS, but doesn't render. | Same source as the view-style pivot above. Consequence: doors, crates, furniture all live as entities with Y-sort; floor and designation-paint still tile-based. Architecture.md TileMap-layer section needs an annotation. |
|
||
| **Primary platforms** | iOS + Android touch, then Steam Deck / ROG Ally gamepad. Desktop falls out for free. | Mobile is the hard constraint; Deck inherits. |
|
||
| **Ambition** | itch.io + TestFlight release. Real artifact, small audience. | Drives engine choice; no app-store polish-tax. |
|
||
| **Engine** | Godot 4 (GDScript) | 2D-first, free, exports everywhere we need, fast iteration. |
|
||
| **Tile size / style** | 16×16 pixel art, **cute-farming-RPG primary** (ElvGames bundle), Ventilatore as medieval accent | ElvGames "Ultimate Farming RPG" Humble bundle owned (~2.8 GB, 70+ packs). Tone: Stardew × Going Medieval × Rimworld. |
|
||
| **Setting** | Medieval fantasy with cute palette | Owned-art alignment + clearer scope (no electricity / hydroponics / energy weapons) + underexplored on mobile. |
|
||
| **Run shape** | Open-ended sandbox, autosave, persistent world | Player picks up where they left off. |
|
||
| **Session length** | 5–15 min target | Drives every UI and pacing choice. |
|
||
| **Default speed** | Fast (5×), with auto-pause on event | 1 in-game day ≈ 5 min real time. Solves the "watch a pawn walk for 60s" problem; 1× exists for combat / fine work. |
|
||
| **Goal scaffolding** | Light storyteller prompts | Soft, dismissible nudges give each short session shape without forcing scenarios. |
|
||
| **Combat** | Realtime with auto-pause on threat | Rimworld-feel; touch-friendly. |
|
||
| **Health** | Single HP per pawn + status effects (Bleeding/Sick/Tired/Hungry/Wet/Cold/Downed/...) | ~80% of the drama for ~5% of Rimworld's health-system code. |
|
||
| **Scale** | 3–6 pawns, **80×80** MVP map (architecture sized to ~120² ceiling) | Roughly Stardew-farm size; readable when zoomed in, doesn't fit a phone screen — forces the world-view camera (pinch / pan / jump-to-alert) rather than strategic-overview-on-phone. |
|
||
| **Priority levels** | 5 (Critical / High / Normal / When idle / Off) | Matches Rimworld + Going Medieval contract. |
|
||
| **Failure state** | Ghost colony — no game over; storyteller drops wanderer in 3–5 days | Mobile-friendly; preserves player investment. |
|
||
| **Engine version** | Godot **4.6.2 stable** (Win64 binary at `D:\godot\Godot_v4.6.2-stable_win64.exe`) | Locked for reproducibility; pinned in `project.godot` features. |
|
||
| **Renderer** | GL Compatibility (mobile + desktop), **not** Forward+ | Max device reach; Forward+ would lock out older phones. |
|
||
| **Repo location** | Physical: `/mnt/d/godot/rimlike/` (D: drive, fast for Windows-side editor). Symlink: `~/claude/projects/rimlike` → physical. | Mirrors tavernkeep's pattern. Both WSL and Windows access without crossing the WSL net bridge. |
|
||
| **Player walls** | **Wood + stone via Pixel Crawler `Walls.png`** (entity sprites, Y-sorted; no autotile in Phase 5). Single-sprite-per-material is the Phase 5 ship; per-direction variants are a polish item. | After the rendering pivot to 3/4 perspective, the Pixel Crawler Walls.png pack becomes directly usable. It has 4 wood materials + a sandstone variant with clear corner/edge pieces. Phase 5 ships with one sprite per material (uniform-looking walls); Phase 17 can add per-direction variants if playtest reveals the visuals feel flat. Stardew-cabin warmth restored without authoring or commission. |
|
||
|
||
### Architecture (tech)
|
||
|
||
- **Sim tick 20 Hz, render 60 Hz, decoupled.** Pawn positions lerp between sim ticks. (`docs/architecture.md` Time / tick model)
|
||
- **Pawn AI: 5-layer pipeline** (Decision → WorkProvider → Job + JobRunner → Status interrupts → Player overrides). Slimmer than Rimworld's ThinkTree. ~800–1500 LOC GDScript for full MVP.
|
||
- **TileMap layers**: 0 Terrain · 1 Floor · 2 Wall · 3 Designation · 4 Roof · 5 Fog. Furniture / Pawn / Item / EffectFX as scene-instanced entities (not TileMap).
|
||
- **Pathfinding**: `AStarGrid2D` (built-in), updated on wall/door/furniture changes.
|
||
- **No background simulation** — app backgrounded = sim paused. Avoids "lost colony to a raid while at work."
|
||
- **Save format**: between sim ticks only; JobRunner mid-toil state round-trips from day one.
|
||
|
||
### Game design
|
||
|
||
- **5 skills** (Manual Labor / Crafting / Cooking / Medicine / Combat), 0–10 each, level by use, multiplicative speed/quality bonus. Skills modify duration and quality, never permission.
|
||
- **9 work categories** (Construction / Mining / Hauling / Cleaning / Crafting / Cooking / Plant / Doctor / Combat). 5-level priority matrix per pawn.
|
||
- **Storage**: floor zones AND independent crate furniture (4 stacks each), unified by `StorageDestination` interface. **16 filter chips** (Wd/St/Ir/Cu/Ag/Au/Cl/Veg/Mt/Gr/Ck/Md/Tl/Wp/Ar/Co), 5 priorities with Rimworld flow semantics. One stack per tile, one type per tile.
|
||
- **Production**: 2-step where medieval-sense (Iron→Ingot→Weapon, Grain→Flour→Bread); 1-step otherwise. 5 workbenches (Carpenter, Smelter, Smithy, Cooking hearth, Millstone), ~22 recipes. Full Rimworld bill semantics (one-shot count / forever / until-N + ingredient-quality filter + skill threshold).
|
||
- **Quality system** (Shoddy/Normal/Excellent/Masterwork/Legendary) on every crafted item; multiplicative stat bonus. Quality from crafter skill + RNG only (inputs are just resources).
|
||
- **Mood**: ~13 thoughts (data-driven registry, mix persistent + event-driven). Soft breaks at sustained mood < 25 for 30 in-game min — Sulking or Wandering, recover at mood ≥ 35.
|
||
- **Lighting** (real shader at night), **auto-detected rooms** (named by furniture, scored for beauty + dirtiness), **dirtiness + Cleaning** (8th work category), **beauty score** with Quality multiplier.
|
||
- **Roofing**: indoor = Layer-4 Roof flag, sim-data only (no rendering, just an indoor tint on floors). Auto-roof when walls enclose ≤8 cells (BFS); No-Roof designation for courtyards. Plants don't grow indoors.
|
||
- **Weather**: 4 types (Clear / Rain / Storm / Cold snap), daily roll, season-weighted. Wet status accumulates outside in rain, decays indoors. 4 seasons × 12 days = 48-day year.
|
||
- **Combat**: 3 weapons (sword/axe/bow), 3 armor slots (helm/cuirass/boots). Walls + trees provide cover. Two-roll resolution (hit, then damage with armor reduction). Downed-then-rescue death model; doctors auto-prioritize. Combat=Off "defends if cornered, won't volunteer." Friendly fire ON.
|
||
- **Death / corpses**: Both burial AND cremation. Graveyard = special stockpile (Corpses-only); pawns dig graves, place permanent grave markers (tap → deceased pawn-detail). Cremation pyre = furniture with single recipe (1 corpse + 5 wood). Corpses decay 0–50 fresh / 50–100 rotting (no butcher) / 100 rotted.
|
||
- **Storyteller**: 25 prompts written in `docs/design.md`. Daily 6am roll, weighted pool, per-category cooldowns, tension model alternates quiet/threat per Tynan Sylvester pacing. Ambient banner for low-stakes, modal auto-pause for choice events.
|
||
|
||
### Touch UX
|
||
|
||
- **Bottom-sheet menus** instead of right-side panels. **Long-press** = inspect/context. **Tap world** = select. Speed/pause buttons fixed top.
|
||
- **Work-priority matrix**: 9 columns × N pawns, sticky pawn-name column, horizontal scroll on phone. Tap-to-cycle priority, long-press for 5-chip picker, swipe column for bulk-set. Per-pawn and per-job views layered on top.
|
||
- **Stockpile/container UI**: 4×4 chip grid for the 16 filter categories; same UI for floor zones and crates.
|
||
- **Storyteller events**: ambient banners for nudges/seasonal/lore; modal auto-pause for wanderer/threat/disease/milestone. Events log + "while you were away" digest at resume.
|
||
- **Indoor tint** marks "this is inside" without needing roof rendering — matches Stardew/Rimworld convention.
|
||
- **World-view camera**: pinch-zoom + drag-pan + double-tap-to-center; selected pawn does **not** force-follow. Storyteller alerts/banners include a *Go there* tap that pans the camera to the event tile. **No minimap in MVP** — revisit if playtest shows people getting lost on the 80² map.
|
||
|
||
### Art strategy
|
||
|
||
- **ElvGames "Ultimate Farming RPG" Humble bundle** is the primary art (`/mnt/d/godot/assets/humble set new/`, ~2.8 GB, 70+ packs, all 16×16, ElvGames license: commercial OK with credit).
|
||
- **Ventilatore Fantasy Tileset Complete Bundle** stays as medieval accent for biome variety / decorative props / animated water.
|
||
- Mana Seed series considered but **dropped** from buy plan (the bundle covers what we'd planned).
|
||
- **Authoring still required**: designation overlays (~2 hrs custom), possibly autotile bits on bundle wall sheets, possibly wolf sprite, possibly grave marker.
|
||
|
||
## Open questions / TODOs
|
||
|
||
### Audit / unblock-the-prototype action items
|
||
|
||
Total ~75 min. **3 of 5 closed on 2026-05-10**; see session log + `docs/art.md` for findings. Two open.
|
||
|
||
- [ ] **Aesthetic harmony test** — needs your eye. ElvGames Forest tile vs Ventilatore tile, side-by-side. Decides whether Ventilatore stays as accent or gets shelved. ~15 min.
|
||
- [x] **ElvGames autotile audit** — done. **`FG_Fortress.png` IS autotile-solvable** (tan stone, ~20–30 modular pieces); **`FG_Houses.png` is NOT** (pre-built decorative house compositions, not modular wall variants). Iconic Homestead $19.99 fallback **not needed**. New decision required — see Open questions below.
|
||
- [x] **Wolf sprite source** — done. **No wolf in the bundle anywhere.** Need a custom commission, a CC0 sprite, or a Ventilatore find. New decision required — see Open questions below.
|
||
- [x] **Grave marker source** — done. `Retro Graveyard 16x16 Tileset [Kingdom Explorer]` confirmed in Tier 3, full graveyard suite. Direct use, no custom work.
|
||
- [ ] **License compilation** — maintain credits string for every pack used (ElvGames + Ventilatore + Kingdom Explorer + any others). Display in game's credits screen. Confirm specific terms per pack before any commercial release.
|
||
|
||
### Design topics still open
|
||
|
||
<!-- WALL MATERIAL — LOCKED 2026-05-10. Moved into Decisions table (above). Kept here as a back-reference. -->
|
||
|
||
**Resolved: wall material strategy.** Lock = **custom-author wood + stone walls** (option b). Player builds wood-cabin walls from day one (corner/T/cap variants authored on top of `FG_Houses.png` wood-and-blue-roof material, ~½ day work) then upgrades to stone fortress walls later (`FG_Fortress.png` autotile-solvable as-is, ~few hours). Phase 5 slips ~3 days but the Stardew-cabin-warmth aesthetic survives, which was the original anchor. See `docs/art.md` Wall-material decision.
|
||
- [ ] **Wolf sprite acquisition** (NEW from 2026-05-10 audit): bundle has nothing canine-predator; **Ventilatore checked 2026-05-10, also nothing** (Ventilatore is character + terrain + decoration; no animal/creature sprites at all besides player + slimes). Remaining options: (a) commission a 16×16 wolf (idle + 2–4-frame walk × 4 directions; ~$30–60 paid commission); (b) source a CC0 wolf from OpenGameArt; (c) reskin a bundle animal placeholder for MVP (e.g. recolor a dog from `Animal Sprites Pixelart`) and replace later. Phase 10 blocker — can defer until then; placeholder from option (c) unblocks the combat/AI work meanwhile.
|
||
- [ ] **Auto-roof big-room UX**: the ≤8-cell BFS cap silently fails on rooms larger than 8×8. Decide whether to (a) keep the cap and surface "this area is too large to roof — split with an interior wall" hint when the player encloses one, (b) bump the cap to ~16 with the same hint at the new threshold, or (c) detect any enclosed area regardless of size. Affects `EnclosureDetector` + a new room-feedback UI.
|
||
- [ ] **Onboarding / first 60 seconds**: mobile-specific. Don't copy Rimworld's tutorial.
|
||
- [ ] **Touch UI for non-priority screens**: world view, build drawer, alerts, day-summary, pawn detail. See `docs/ui.md` "Screens still to design."
|
||
- [ ] **Background time / "while you were away" mechanic** — locked to no background simulation in MVP; revisit if it feels bad in playtest.
|
||
- [ ] **Audio direction** — who/where for SFX + ambient track? Bundle has 11 music + 8 SFX packs covering most needs.
|
||
- [ ] **Steam Deck input parity** — gamepad-driven cursor, or full menu navigation by D-pad? Probably both.
|
||
- [ ] **Localization stance** — English-only for MVP, but architect strings for i18n (already locked in CLAUDE.md).
|
||
- [ ] **Pawn name/backstory generation** — hand-curated list vs simple generator.
|
||
- [ ] **Naming the game** — "rimlike" is a working title.
|
||
- [ ] **Monetization stance** — free? PWYW? Premium?
|
||
- [ ] **Tech / research progression** — medieval tech tree shape.
|
||
- [ ] **Map / world generation** — fixed seed for slice; procgen later.
|
||
|
||
### Tunable in prototype (not real "open Qs", just numbers to playtest)
|
||
|
||
- Sleep mood gradient values (`+5/+0/−2/−5/−8`)
|
||
- Wet status thresholds (25 / 60) and accumulation rates
|
||
- Season weather weights (Spring/Summer/Autumn/Winter distributions)
|
||
- Hit-chance bonuses (skill ×5%, range ×5%, cover 40/20%)
|
||
- Bleed-out timer (6 in-game hours)
|
||
- Various mood thought magnitudes and decay times
|
||
|
||
## Vertical slice (MVP target)
|
||
|
||
Same scope as locked in `~/claude/ideas/rimlike/plan.md`. Realistic timeline 3–6 months solo for an MVP this rich.
|
||
|
||
- **1 biome** (temperate forest, ElvGames Forest Tileset 4 Seasons; Ventilatore foliage accents).
|
||
- **1 map**, **80×80 tiles**, fixed seed for now.
|
||
- **3 starting pawns** ("settlers" / "villagers"), each with name + portrait + one-sentence backstory.
|
||
- **Verbs**: chop wood, mine stone & ore, build walls/floors/furniture/crates, plant/harvest crops (3–4 types), cook meals (recipes), haul, repair, clean.
|
||
- **Needs**: hunger, sleep, mood (~13 distinct thoughts, soft breaks at sustained mood < 25).
|
||
- **Status effects**: Hungry, Tired, Bleeding, Sick, Downed, Wet (Damp/Soaked), Cold.
|
||
- **Storage**: floor zones AND containers, 16 filter chips, 5 priorities.
|
||
- **Quality system** on all crafted items.
|
||
- **Lighting** — torches + hearths emit light; visual darkness at night.
|
||
- **Rooms** — auto-detected, named by contents, beauty + dirtiness scored.
|
||
- **Cleaning** as 8th work category.
|
||
- **Day/night cycle**, ~5 min per day at default speed. **Seasons** (Spring/Summer/Autumn/Winter, 12 days each).
|
||
- **Weather**: Clear / Rain / Storm / Cold snap.
|
||
- **One disaster type**: wolves at night (bandit raids deferred).
|
||
- **One storyteller**: random quiet/threat alternation, 25 prompt corpus.
|
||
- **Save/load**, autosave on suspend, single slot.
|
||
- **Touch UI** end-to-end (no desktop-only gestures).
|
||
- **Sound**: minimal — UI clicks, ambient day/night loop, alert sting.
|
||
|
||
## Session log
|
||
|
||
### 2026-05-10
|
||
- Promoted from `~/claude/ideas/rimlike/` (single multi-hour brainstorm session).
|
||
- Scaffolded `projects/rimlike/` from `_templates/project/`. Customized `CLAUDE.md`. Distilled `plan.md` into this `memory.md`. Moved companion files (design / architecture / ui / art) into `docs/`. `git init`, first commit "Initial scaffold". Created Forgejo repo `rimlike` (private), set HTTPS remote, pushed `main`. Archived idea folder to `~/claude/archive/ideas/rimlike/`.
|
||
- Wired Godot MCP Pro: `.mcp.json`, `.claude/settings.local.json` allowlist, three project-local subagents (`quick-edit`, `researcher`, `gdscript-refactor`). Added the MCP-Pro and tiered-delegation sections to `CLAUDE.md`. Editor plugin / `addons/godot_mcp/` re-copy still pending Godot project scaffold.
|
||
- Reviewed `docs/` against `memory.md` and `CLAUDE.md`. Decisions made:
|
||
- **Map size bumped from 40² → 80²** for the MVP slice; architecture sized to ~120² ceiling. Pawn count stays at 3 start / 6 cap (frontier feel was rejected in favor of "split-the-difference" sizing — Stardew-farm scale, not Going-Medieval scale).
|
||
- **World-view camera** = pinch-zoom + drag-pan + double-tap-to-center; storyteller alerts include a *Go there* tap. No minimap in MVP. No follow-cam (avoids fighting the player when issuing build orders across the map).
|
||
- Storyteller cooldown semantics: **per-event AND per-category, both gates must pass** (resolves the design.md vs architecture.md disagreement).
|
||
- `MAX_STACKS_PER_THOUGHT = 5` (was named-but-unset).
|
||
- Hauling-loop fallback: items that fail to find any valid destination after 3 retry passes drop on the floor and surface as a passive "No stockpile accepts X" alert.
|
||
- Cleaned up doc rot in `docs/design.md` and `docs/architecture.md` — both had stale "8 work categories" intermediate sections still next to the canonical "9" lists. Removed the (8) snapshots.
|
||
- Updated `docs/architecture.md` perf assumptions (60² → 80² with 120² ceiling).
|
||
- `docs/ui.md` got a new **World view camera (locked)** section; removed the world-view bullet from "Screens still to design".
|
||
- Open: auto-roof big-room UX (added to TODOs above) — the ≤8-cell BFS cap silently fails on bigger rooms; player feedback path needs a decision before EnclosureDetector lands.
|
||
- Wrote `docs/implementation.md` — 21-phase build plan with checkboxes, acceptance demos, scope-cut levers, and de-risking spikes. Status row at the top of that file is the canonical "where are we now" pointer.
|
||
- **Project location moved** from `/home/megaproxy/claude/projects/rimlike/` to `/mnt/d/godot/rimlike/` (D: drive). Symlink at the original WSL path preserves the home-CLAUDE.md layout convention. Set `git config core.filemode false` to silence DrvFs's everything-is-0777 false-positive. Mirrors tavernkeep's pattern; both WSL and Windows access without crossing the WSL net bridge.
|
||
- **Phase 0 scaffold landed.** `project.godot` + 7 autoloads + smoke-test scene + addons re-copy + folder layout. Used **GL Compatibility renderer** (not Forward+) for max mobile reach. Folder layout matches tavernkeep (`autoload/` at root, scripts co-located in `scenes/`) — *not* the `scripts/autoloads/` mirror layout originally sketched in `implementation.md`. Headless verification: `godot --headless --path . --quit` exits 0 with the smoke-test message. Editor-side green-dot check pending — needs you to open the editor once.
|
||
- **Asset audit ran via researcher subagent (Haiku).** 3 of 5 items closed. Findings:
|
||
- `FG_Fortress.png` autotile-solvable (tan stone). `FG_Houses.png` NOT autotile-solvable (pre-built decorative compositions). Iconic Homestead fallback not needed. **Opens a new wall-material decision** (see Open questions).
|
||
- No wolf sprite anywhere in the bundle. **Opens a wolf-acquisition decision** (see Open questions).
|
||
- `Retro Graveyard 16x16 Tileset [Kingdom Explorer]` confirmed in Tier 3 — full graveyard suite, ready for direct use in Phase 14.
|
||
|
||
### 2026-05-11
|
||
- **Phases 1–11 all shipped between 2026-05-10 and 2026-05-11** (the in-context session log lagged behind the commits). See `docs/implementation.md` Status table for canonical phase-by-phase state; below is just the headline.
|
||
- **Phase 9 (Status + Medicine) + Phase 10 (Combat + Wolves) shipped as the "drama pair"** via 3-agent fan-out (Agent A: HP/Status on pawn, Agent B: DoctorProvider + medical bed + Rescue/Treat toils, Agent C: Wolf entity + WolfSpawner). Opus integrated into `scenes/world/world.tscn` + `world.gd` (middle bed at (47,24) marked `is_medical=true`).
|
||
- **MCP runtime verified both phases.** Phase 9: injected 75 dmg + Bleeding(2) into Bram → went Downed (hp 25) → Edda+Cora both volunteered `doctor → 'Rescue Bram → bed at (47, 24)'` → treated → Bram healed to 94.2 hp, statuses cleared, returned to work. Phase 10: `[wolf] RAID: 1 wolf(ves) spawned at [(53, 2)]` fired at day 3 22:00 (darkness ≥ 0.8); 4 wolves alive across raid cycles by day 4 01:51. Screenshot confirms medical-bed red-cross marker and wolf silhouettes at night.
|
||
- **Phase 10 deliberately partial** — wolf-side combat (two-roll, bleed on hit) shipped, but pawn-side weapons/armor/cover/friendly-fire deferred. Acceptance demo's full chain (wolf → bites → pawn bleeds → doctor saves) awaits player weapons. WolfSpawner pack size 1–2 vs design target 1–4 — tune up post Phase 20 numbers pass.
|
||
- **Bleed-out timer shipped at demo value** `BLEED_OUT_TICKS = 1200` (~ minutes) instead of design value `432000` (6 in-game hours). Documented in `status_catalog.gd`; flip on first time-balance pass. Recorded so it doesn't ship to a release at the demo value.
|
||
- **Bed-claim bug noticed in passing** during ULTRA-speed run: `Bram bed claim failed at /root/Main/World/Bed — sleeping on floor` for two of three pawns even when beds free. Doesn't gate Phase 12; logged for separate triage.
|
||
- **Phase 12 (Seasons + Weather) shipped same day.** Three-agent fan-out (Agent A = clock seasons + season top-bar + terrain palette; Agent B = Weather autoload + procedural rain overlay + storm flash; Agent C = Wet/Cold statuses + mood thoughts + shelter check). Opus prepped contracts up front (event_bus signals, Clock season constants, Weather autoload stub) so all three could run fully parallel.
|
||
- **Pre-fan-out contract pattern was the key.** By writing the public API surface to disk *before* dispatching agents, each agent's slice compiled standalone and integrated on first try. Worth repeating for any future "multi-system phase" — pay the 5-minute scaffolding cost, save the round-trip merge fixup.
|
||
- One quick-edit fixup needed: Variant inference errors on `var old_sev := s.severity` (untyped Array loop var). Same trap as the Phase 7 crop fix. Pattern: always explicit-type any `:=` declaration assigned from a non-typed-Array element.
|
||
- **MCP runtime verified all paths.** Top-bar shows "Spring 1/12", rain droplets render across screen, storm white-flash caught mid-animation, wet status flipped 0→Damp(26)→Soaked(65) with mood thought sync, cold status fired on cold_snap with -4 mood. `_is_sheltered()` proxy (has floor) works for v1; Phase 13 Room BFS replaces it.
|
||
- Next: Phase 13 (Rooms, roofing, beauty, dirtiness, cleaning) is the natural follow-up — it pays the `_is_sheltered()` debt and unlocks beauty/dirty mood thoughts.
|
||
|
||
- **Phase 13 (Rooms + Beauty + Dirtiness + Cleaning) shipped same day.** Three-agent fan-out reusing the Phase 12 contracts-first pattern (`Room` class, `World.rooms`/`room_at_tile`/`is_indoor`, 4 EventBus signals pre-written by Opus before dispatch).
|
||
- **DECISION: Big-room UX = bump cap to 16, banner above.** Auto-roof activates for rooms ≤16 interior tiles; rooms above that emit `room_too_large` with no roof. Cabin (24 tiles) intentionally exceeds cap so the warning path is exercised at boot. Test shed (3×3 = 9 tiles) exercises the roof path.
|
||
- **Agent C wiring loss + recovery.** Agent C reported wiring `BeautySystem` / `DirtinessSystem` / `CleaningProvider` / `IndoorTintOverlay` into `world.gd` but the instantiation code never landed — only the autoload field declarations and the entity-side `register_furniture` hooks survived. Opus added the missing 4 instantiations + work-provider registration + pre-built furniture seed in a follow-up edit. Recovery time ~5 min via runtime probe. Pattern: **trust but verify agent reports against actual file state**, especially for "I wired this into the scene/autoload" claims. Don't repeat by asking for "show me the diff" alongside the report.
|
||
- **Demo seed extended.** Added `_prestamp_test_shed_for_room_detector` + `_spawn_complete_wall` / `_spawn_complete_floor` helpers — instantiates entities in completed state for a 5×5 walled shed at (34, 23). Demonstrates the auto-roof path side-by-side with the cabin's over-cap path.
|
||
- **Sheltering proxy debt paid.** `Pawn._is_sheltered()` now reads `World.is_indoor(tile)` first, falling back to the floor-has-cell proxy for graceful degradation while RoomDetector populates.
|
||
- Phase 10 wolves' raid cooldown is set to 4800 ticks (1 in-game day). Combined with `darkness_factor ≥ 0.8` trigger gate, wolves continue to spawn nightly. No tuning required this phase.
|
||
- Next: Phase 14 (Death + corpses + burial) — closes the death loop. Pairs naturally with Phase 13's `DirtinessSystem.bump()` API for combat-blood spikes.
|
||
|
||
- **Phase 14 (Death + corpses + burial) shipped same day.** Three-agent fan-out (A: death+corpse spawn, B: graveyard+grave_slot+marker+haul, C: cremation pyre+ash+4 mood thoughts). Opus pre-wrote Corpse class with `setup()`/save round-trip + 5 EventBus signals + World.corpses/grave_markers registries before dispatch. Pattern proven for the third time — this is the way.
|
||
- **Bleed-out timeout shipped at design value** (`BLEED_OUT_TICKS = 432000` = 6 in-game hours at 20 Hz). Previous memory entry's claim of "demo value 1200" was based on a misread; the constant has been at the design value since Phase 9 status_catalog.gd landed.
|
||
- **Throughput tuning surfaced as a real concern.** At ULTRA speed (12×), corpses decay (DECAY_PER_TICK=0.05) hit the 100-rotted threshold before HaulingProvider's priority-3 corpse-haul scheduling could chain pawn→pickup→graveyard. Pipeline is correct; numbers need a Phase 20 pass. Workaround for testing: pause + manual job assignment, or boost corpse-haul to priority 4+.
|
||
- **`recipe.gd` extended with `ingredient2_type/count`** for the cremation recipe (1 corpse + 5 wood). CraftingProvider's pickup step still only enforces ingredient1 — documented gap. Cremation pyre works as a corpse-only recipe today.
|
||
- **HaulingProvider corpse path uses Node metadata** (set_meta on the carrying pawn) to track the carried corpse. Agent B did this to keep Corpse class (Agent A's territory) untouched. If a proper `Pawn.carrying_corpse` field lands later, replace the metadata.
|
||
- **MCP runtime verified:** DEMO_PHASE14_AUTOKILL toggle force-kills first pawn at tick 50 — Bram DIED → corpse spawned → Cora's saw_corpse (-3) thought fired. Grave dig + designation paint chain verified to completion. Bleed-out + Wet status overlap firing correctly during ULTRA runs. Screenshot shows fresh corpse silhouette at cabin doorway.
|
||
- Next: Phase 15 (Storyteller) — the world prods the player. 25-event registry, daily 6 AM roll, per-event + per-category cooldowns (both gates locked), banner/modal UI, ghost-state recovery.
|
||
|
||
## External references
|
||
|
||
- **Forgejo repo:** https://git.rdx4.com/megaproxy/rimlike (private)
|
||
- **Owned art bundle (primary):** ElvGames "Ultimate Farming RPG" Humble bundle, local at `/mnt/d/godot/assets/humble set new/`. License: ElvGames terms (<https://elv-games.itch.io/terms>). Commercial OK with credit; no NFT/crypto/resale.
|
||
- **Owned art bundle (secondary):** Ventilatore Fantasy Tileset Complete Bundle — <https://itch.io/s/117124/the-fantasy-tileset-complete-bundle>
|
||
- **Mana Seed catalog (fallback if bundle gaps surface):** <https://seliel-the-shaper.itch.io/>
|
||
- **Iconic Homestead (autotile-ready wall fallback, $19.99):** <https://seliel-the-shaper.itch.io/iconic-homestead>
|
||
- **Lodestars:** Rimworld (Tynan Sylvester / Ludeon Studios), Going Medieval (Foxy Voxel), Stardew Valley (ConcernedApe).
|
||
- **Original brainstorm history:** archived to `~/claude/archive/ideas/rimlike/` after promotion. The session log there captures every decision's rationale.
|
||
- **Brainstorming-mode preference:** see `~/.claude/projects/-home-megaproxy-claude-ideas/memory/brainstorm-ask-dont-decide.md` (not directly applicable to projects but captures interaction style).
|