Files
card_game/docs/ARCHITECTURE.md
chenmoranzhiandCursor 06eb360fbf 把规则、架构与实现路线写成仓库文档。
后续改内容或结算顺序时有冻结依据,不必再翻原始稿才能对齐。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-09 02:04:20 +08:00

118 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ARCHITECTURE
Current prototype implementation. May be rewritten.
Source: *AI-First Technical Architecture Plan · v0.1*, Layer 2.
## Stack
- Godot .NET — later Steam/desktop presentation
- `Game.Client` — current playtest browser; no rules
- C# / .NET 8 — rules and tools
- JSON + JSON Schema — content
- xUnit — tests
- First platform: Windows desktop / Steam prototype
## Repository layout
```
src/Game.Core
src/Game.AI
src/Game.Content
src/Game.Client
tests/Game.Core.Tests
tests/Game.AI.Tests
tests/Game.Content.Tests
content/cards
content/characters
content/enemies
content/encounters
schemas
tools
docs
AGENTS.md
```
## Game.Core
Pure C#; no Godot reference.
v1 types: `GameState`, `PlayerState`, `Entity`, `CardDefinition`, `CardInstance`, `Zone`, `GameAction`, `GameEvent`, `Effect`, `Condition`, `Trigger`, `ResponseWindow`, `GameRng`.
Do not build a universal framework. Implement only what current rules need.
## Core API
```
GetLegalActions(state)
Execute(state, action)
CloneState(state)
ResolveUntilStable(state)
```
AI and the player client must call this same pair of legal-action and execute paths.
## Action vs event
- `GameAction`: intent — `PlayCard`, `Attack`, `Activate`, `Respond`, `EndTurn`, `ChooseTarget`
- `GameEvent`: what happened — `Damage`, `Heal`, `Draw`, `Discard`, `Destroy`, `EnterField`, `LeaveField`, `CountdownChanged`, `SupplyGenerated`
Rules process actions. UI plays events.
## Atomic resolution and response
Complex effects split into atomic steps. An atomic step is an engine unit, not a player-response unit. Response windows open only at rule-defined timings.
Do not implement free “anywhere second-speed.” Responses bind to events (on attack, before damage, on target, on enter, about to destroy). Response is not a card type. Show a window only if a legal response exists.
## Content model
Card types v1: Creature / Spell / Field. Long-lived entities share one battlefield. Board size 10 is a test parameter.
## Standard effects
`Damage`, `Heal`, `Draw`, `Discard`, `Destroy`, `Summon`, `MoveCard`, `ModifyStat`, `ModifyCountdown`, `AddKeyword`, `RemoveKeyword`, `GenerateEnergy`, `AddStatus`, `RemoveStatus`.
Ordinary cards compose these. Custom C# handlers only when composition is unreasonable. Do not invent a card scripting language.
## Validation, RNG, replay
CLI validator (later): unique IDs, dangling refs, structure, required fields, numeric ranges, tags, effect args. PT and dead-ref reports later.
All randomness: `GameRng`. `GameState` stores RNG. Tests pin seed. A battle records initial state, seed, and action sequence for 100% replay.
## AI v1 (see `docs/AI.md`)
Current-turn only. No MCTS, minimax, multi-turn planning, opponent-future prediction, response prediction, or LLM AI.
Shallow beam search + near-optimal randomness among scores `≥ BestScore × Threshold`.
Performance depends on clone + `Execute` speed, not algorithm prestige. Deep-copy until it hurts.
## PT v1
Linear value table for damage, heal, draw, energy, attack, health. DelayedValue ≈ BaseValue × DelayDiscount. No forced PT for highly contextual effects.
## Godot client (Phase F)
`Render(GameState)` and `Input → GameAction → Core.Execute → GameEvents → Animation`. Never “fix” a rules bug in animation code.
## Prototype order
| Phase | Focus | Deliverable |
| --- | --- | --- |
| A | Core skeleton | Entities, zones, state, action, event, RNG, clone, tests; no UI |
| B | Basic combat | Draw, hand, energy, creatures, fields, attack, damage, heal, destroy, GY, turns |
| C | Special rules | Cost, effect text, trigger, response, countdown, supply, fatigue, tags |
| D | Headless battle | Full fight in CLI |
| E | AI | Random legal → utility → current-turn beam |
| F | Godot client | Hand, board, HP, energy, targeting, response prompt, basic anim |
| G | Content tools | Schema, validator, PT report, load tests |
| H | Vertical slice | First characters, cards, fields, enemies, one boss |
**Current milestone: Phase A.** Do not start Godot until Core + tests + a CLI fight can draw, play, attack, end turn, and run a simple AI.
## Success
Headless full combat; full replay; automated core tests; ordinary new cards usually need no code; AI legal turns and 2–4 card combos; sim fast enough for live decisions; Godot only presents the same simulation.