* Write the Unreal documentation set: design, steps, ideas, decisions and specs Rewrites the design and engineering docs of the two earlier Unity projects (Adventurer Guild, Project Malleable) for an Unreal Engine 5 prototype that builds and proves three things in order: a movement controller, fighting and crafting. Neither earlier core loop is carried; their ideas are catalogued as features with what each needs. - Docs/Design.md: the human summary (pillars, fixed decisions, glossary) - Docs/Steps.md: a ladder of fifteen proofs, the first six in full - Docs/Ideas.md: salvaged ideas from both projects, none scheduled - Docs/Decisions.md: D-01..D-36, open decisions OD-01..OD-08, deferrals - Docs/Spec/: notation, Architecture, Movement, Interaction, Combat, Crafting, Networking, Telemetry, UI, written as Unreal C++ skeletons - CLAUDE.md and README.md for the repository * Add the stat block: one attribute set on every body, every influence an effect Every body (player, enemy, NPC) carries the same UStatBlockAttributeSet, and every outside influence on it is a gameplay effect: base values, buffs, debuffs, ground surfaces, carried weight, gear, being downed. Counters are tags and attributes on the receiver: immunity blocks by tag, resistance scales by attribute, cleanse removes by tag. Same status from several sources: strongest wins; different statuses multiply. - Docs/Spec/Stats.md: the block, effects and their five sources (abilities, areas, surfaces, items, the world), stacking, counters, readers, tests - Movement: the movement component's tagged speed-multiplier map is removed; speed is tuning times the MoveSpeed attribute; the ground surface trace turns mud into an effect; the gym gets mud and ice patches - Combat: the attribute set moves to Stats; enemies and kits carry FStatBlockDefaults; the funnel reads MagicResist and Immune.Damage tags; taunt and mark are statuses - Interaction: carried weight is GE_Encumbered against CarryCapacity - Crafting: class bonuses are the WorkSpeed and WorkQuality attributes; enchantments may grant a holder effect - Steps: step 5 builds the block with mud, a volume and an immunity - Decisions D-37 and D-38; design summary, CLAUDE.md, indexes, worklog
12 KiB
Decisions
One line per decision, newest first, with a pointer to where it lives in full. A decision belongs here the moment it is made, even if the doc it affects has not caught up. Never delete an entry; supersede it with a newer one and say so.
Status: Decided · Supersedes (contradicts an earlier decision, names it) · Deferred (deliberately not now,
with a trigger)
2026-09-15 — The stat block
Taken on the same day, after the first read of the doc set.
| # | Decision | Where |
|---|---|---|
| D-38 | Counters live on the receiver as tags and attributes: immunity blocks by tag, resistance scales by attribute, cleanse removes by tag, and every status and every block is visible. The same status from several sources: strongest wins, longest remaining duration; different statuses multiply. | Stats |
| D-37 | One stat block on everything with a body, and every outside influence is a gameplay effect on it. Base values, buffs, debuffs, ground, carried weight, gear and being downed all go through the same effects; no system keeps its own multiplier. Supersedes the tagged speed-multiplier map the first draft of Movement gave the movement component. |
Stats |
2026-09-15 — The move to Unreal and the reframing
Taken while rewriting the two earlier projects' documentation into this one. Everything below is Decided
unless marked.
| # | Decision | Where |
|---|---|---|
| D-01 | Unreal Engine 5, C++ first. Blueprints compose, tune and decorate; they never hold a rule, a replicated property or a server RPC. | Architecture |
| D-02 | Two runtime modules, <Project>Core (rules, data, tags, telemetry contract; no actors) and <Project> (gameplay). Dependency one way. A third arrives when a feature is stable, never before. |
Architecture |
| D-03 | Server-authoritative from the first line; the dedicated server is the real target. No listen-server design, no "are we multiplayer" branch. Tested with the editor's dedicated server option from step 1. | Networking |
| D-04 | The client predicts only its own movement and its own animation. Three responsiveness tiers assigned by one test: does a rollback have a visible victim? No rollback of world state a player can already see. | Networking |
| D-05 | Ask, then show. Commit-shaped moments wait for the server inside their own feedback beat. Never show a number as final before it is committed. | Networking |
| D-06 | A player is an identity, not a body. Class, attributes, cooldowns, discoveries and identity live on the player state; the character actor is lent. | Networking, Architecture |
| D-07 | Persistence behind one provider interface with a local-file implementation. Nothing is persisted yet; the seam exists first. | Networking |
| D-08 | Gameplay Tags are the vocabulary. Config/Tags/<Feature>.ini is the source; code-referenced tags are declared natively. No string ids anywhere. |
Architecture |
| D-09 | Content is UPrimaryDataAssets addressed by primary asset id or tag, with soft references for art. |
Architecture |
| D-10 | Rules are pure functions in the core module, tested without a world, called by both the client preview and the server verdict. | Architecture |
| D-11 | Telemetry from step 2, one subsystem, one sink interface, JSON Lines to a local file, no personal data, events not aggregates. | Telemetry |
| D-12 | UCharacterMovementComponent, extended, not a custom controller and not the Mover plugin. Sprint is a saved-move flag; dodge and blink are root-motion abilities. |
Movement |
| D-13 | One rig, two camera modes. First and third person on the same mannequin; the camera never enters the authority path; both modes exist from step 3; the default is decided by playing (OD-03). | Movement |
| D-14 | The deadzone look model, salvaged: the head turns freely inside a yaw deadzone, then the body follows; the deadzone widens while carrying. | Movement |
| D-15 | Sprint takes Shift. The earlier four-slot layout (Q, E, Shift, R) becomes Q, E, R, C. Interact F, drop G tap, throw G hold. Supersedes the earlier project's Controls decision. |
Movement |
| D-16 | The controller is built first and proved against a written checklist in a gym level that never leaves the project. | Movement, Steps |
| D-17 | One interaction system. An interface, a world subsystem as the funnel, the player's component as the only RPC path; reach re-checked server-side with tolerance; prompt and permission from one function. | Interaction |
| D-18 | Interaction is a discrete act on a fixed prop; carrying is continuous possession. Pick-up is routed by the interaction key but is a carry verb. | Interaction |
| D-19 | Two hands; two-handed objects block interaction and, in first person, the view. Held objects attach and stop simulating; dropped and thrown ones are server physics. Throwing is in and scrappy; nothing is destroyed by it. | Interaction |
| D-20 | The Gameplay Ability System for attributes, abilities, effects, cooldowns and cues. The component is on the player state for players and on the pawn for enemies. | Combat |
| D-21 | One damage funnel: one execution calculation every damaging effect uses. No friendly fire: the funnel discards player-on-player damage and keeps the impulse. | Combat |
| D-22 | Down before death. Bleed-out, revive by anyone, a solo down is an instant wipe. A downed player is a prop. | Combat |
| D-23 | Kits define ability access; gear defines stats and crosses classes; mods never grant a signature. The bSignature flag exists from the first ability; gear and mods do not. |
Combat |
| D-24 | The recoverability contract applies to any verb that inconveniences a teammate: recovery takes less time than the verb, and none may down, kill or deprive. All emit grief_action. |
Combat |
| D-25 | Sublinear party scaling and role relaxation are reserved rules applied to a count. | Combat |
| D-26 | Part, piece, trait. A family declares parts; a piece fills one and carries three trait layers. No recipes anywhere. | Crafting |
| D-27 | "Material" is "substance" in code and docs, because UMaterial is the engine's. |
Crafting |
| D-28 | Substances are objects, not stacks, with identity, quality and provenance. Affordable only because storage is physical; an abstract bank is refused on that ground. | Crafting |
| D-29 | Discovery unlocks, choice applies. Characteristics are discovered through play and chosen at the station. Known set is per player. | Crafting |
| D-30 | One activity runtime, three guarantees: completion never gated on skill; skill modulates a quality band only; a second operator is additive, never required. The anvil is the growing zone; the forge is a 5×5 bed with two levels of detail bound by an equivalence rule. | Crafting |
| D-31 | The assembly bench is domain-neutral; domains gate the work, never the worker. Class changes speed and quality only. | Crafting |
| D-32 | Durability is per part, summed; the item is lost at zero; nothing wears from crafting. | Crafting |
| D-33 | A crafted weapon-family item is a weapon: both authored and crafted weapons produce one FWeaponProfile that the swing, the funnel and the bar read. [PROPOSED] until step 13 closes. |
Crafting, Combat |
| D-34 | UMG with CommonUI; one theme asset by role; prop text is world-space with no canvas; every readable string is FText from a string table. The menu never pauses the world. |
UI |
| D-35 | Steps, not a roadmap. A ladder closed by proofs; the next few steps concrete, the rest sketched and detailed only when reached. | Steps, Design |
| D-36 | The two earlier loops are not carried. Their ideas are catalogued as features with needs and constraints, none scheduled. | Ideas |
Open decisions
Questions that block steps. Each names what it blocks and the recommendation on record, so closing one is a confirmation, not a fresh discussion. When one is taken it moves up as a D-line and the row is marked closed.
| id | Question | Blocks | Recommendation | Status |
|---|---|---|---|---|
| OD-01 | Engine version. | 1 | The newest release with a hotfix out (5.6.x at the time of writing). Pin it in CLAUDE.md and the .uproject in step 1; upgrade deliberately, never mid-step. |
Open |
| OD-02 | Project and module name. | 1 | Short, one word, no spaces. It becomes the .uproject, the module prefix and the test filter root. The docs write <Project> until it exists. |
Open |
| OD-03 | Default camera mode. | none until 8 | Build both in step 3, play the gym and the first fight in each, let camera_mode_changed and movement_sample settle it by step 8. |
Recommended |
| OD-04 | Engine from source. | the first packaged server | The launcher build until then; the editor's dedicated-server option covers every step in the ladder. | Recommended |
| OD-05 | Placeholder character and animations. | 3 | The engine's Third Person template mannequin and its animation blueprint; a retargeted pack only when the swing needs a clip the template lacks. | Recommended |
| OD-06 | Physics replication mode for thrown objects. | 6 | The engine's predictive interpolation mode; resimulation is not needed for objects nobody predicts. | Recommended |
| OD-07 | Which two kits ship first. | 9 | Warrior and Cleric: a taunt and a heal are what make the goblin's threat table and the downed state legible. | Recommended |
| OD-08 | Crafting professions against combat kits. | after 15 | A design session, not a step. See Ideas. | Open |
Deferred, with triggers
Not gates. Listed so nobody reopens them as if they were undecided.
| Deferred | Until |
|---|---|
| The Mover plugin | It leaves experimental and a movement feature needs what it has (Movement Q2) |
| Stamina as a cost | A kit wants one (Combat Q2); the attribute exists so it is a cost effect, not a refactor |
| A blade sweep instead of the box hit check | Real animation makes the box read wrong (Combat Q4) |
| Storage beyond hands and station buffers | A step needs more than hands can hold (Crafting Q4, Ideas) |
| Alloys and the kiln | Post-fifteen; meanwhile nobody hard-codes one-to-one processing (Crafting Q5) |
| Generated glyph discovery | Its own session; the composition path never changes, any seed is global |
| Reconnect into a running session | Written down before the first playtest with strangers (Networking Q1) |
| Seamless travel, a second map | The second map |
| Replication Graph or Iris | A world with many actors and many players; dormancy and relevancy keep it cheap |
| Steam, lobbies, invitations, voice | A session layer in front of the server; never inside gameplay |
| Continuous integration | A reason for it; tests run by hand until then |
| Resistances per damage type beyond physical and magic | A second elemental damage type (Stats Q2) |
| Predicting surface effects on the owning client | The correction on entering mud is felt (Stats Q1) |
| A stat block on props that are not bodies | The first prop that should burn or freeze (Stats Q3) |