Addendum — Simulation, Experimentation and AI Playtesting Architecture
This document extends the original Cooperative Strategy Game & Simulation Platform specification.
It does not replace the original design brief. Its purpose is to strengthen the simulation architecture so the current implementation can become a serious game-design laboratory rather than only a digital implementation of the board game.
The implementation should incorporate these concepts incrementally and pragmatically. Existing working code should be preserved where possible.
1. Main Architectural Principle
Treat the game simulator as two separate products:
- Headless game and simulation engine
- Interactive web-based design laboratory
The game logic must not depend on:
- React,
- browser DOM,
- rendering,
- UI components,
- timers,
- network access.
The same core engine should be usable for:
human browser play
automated bot play
LLM playtesting
Monte Carlo simulation
parameter search
CI regression testing
replaying historical games
counterfactual analysis
The web application is a client of the engine, not the engine itself.
2. Recommended Architecture
Target conceptual architecture:
PLAYERS / AGENTS
Human
Random bot
Heuristic bots
Search agents
RL agents (optional later)
LLM agents
│
▼
┌─────────────────────────────────────────────────────┐
│ GAME CORE │
│ │
│ GameState │
│ Observation │
│ Actions │
│ Chance Model │
│ State Transitions │
│ Rules │
│ Content │
│ Scenario Generator │
│ Game Parameters │
│ │
└─────────────────────────────────────────────────────┘
│ │
▼ ▼
Interactive Play Headless Runner
│
▼
┌──────────────────────────┐
│ Experiment System │
│ │
│ simulations │
│ agent tournaments │
│ parameter sweeps │
│ A/B comparisons │
│ counterfactual tests │
└──────────────────────────┘
│
▼
┌──────────────────────────┐
│ Trajectory Store │
│ │
│ states │
│ observations │
│ actions │
│ chance events │
│ metrics │
│ decisions │
└──────────────────────────┘
│
▼
┌──────────────────────────┐
│ Analytics Lab │
│ │
│ balance │
│ skill depth │
│ randomness │
│ strategy diversity │
│ content quality │
│ replayability │
└──────────────────────────┘
3. Explicitly Separate State, Observation, Action and Chance
The original implementation may currently expose the complete game state directly to players or bots.
Refactor this conceptually into four independent parts.
3.1 GameState
Represents the authoritative complete state of the game.
It may contain information hidden from individual players or agents.
Example:
interface GameState {
gameId: string;
round: number;
phase: GamePhase;
characters: CharacterState[];
locations: LocationState[];
situations: SituationState[];
objectives: ObjectiveState[];
resources: ResourceState;
hiddenContent: HiddenContentState;
rng: RandomState;
history: HistoryEntry[];
result?: GameResult;
}
Only the engine may modify authoritative state.
3.2 Observation
Represents what a specific actor is allowed to know.
Conceptually:
getObservation(
state: GameState,
actor: ActorId
): Observation
This distinction should exist even if the first game version uses almost entirely open information.
It enables future support for:
- hidden cards,
- uncertain situations,
- private character information,
- partial knowledge,
- unknown outcomes,
- asymmetric information.
A bot or LLM should receive an Observation, not unrestricted access to GameState, unless explicitly running in omniscient analysis mode.
4. Legal Actions
Keep all game participants constrained by engine-generated legal actions.
Conceptual API:
getLegalActions(
state: GameState,
actor?: ActorId
): LegalAction[]
A participant selects one of these actions.
Then:
applyAction(
state: GameState,
action: LegalAction
): GameState
Players, bots and LLMs must never directly mutate game state.
This is essential for:
- reproducibility,
- debugging,
- simulation,
- replay,
- AI safety,
- statistical correctness.
5. Make Randomness Explicit
Do not hide randomness inside arbitrary calls to:
Math.random()
or equivalent functions.
Every random event should belong to a named random source.
Possible examples:
scenario generation
situation selection
location generation
hidden outcome selection
content modifier selection
event sequencing
Represent randomness explicitly.
Example:
interface RandomStreams {
scenario: RandomSource;
situations: RandomSource;
outcomes: RandomSource;
modifiers: RandomSource;
}
Each random source should be seedable.
6. Multiple Independent Seeds
Prefer multiple named seeds over one opaque global seed.
Example experiment configuration:
{
"scenarioSeed": 817263,
"situationSeed": 193827,
"outcomeSeed": 882731,
"agentSeed": 389123
}
This allows experiments such as:
Keep the scenario identical while changing only uncertain outcomes.
or:
Give two strategies exactly the same future random events.
This is important because one of the central game-design goals is:
player decisions should matter substantially more than luck.
The simulator should eventually allow this to be measured instead of merely assumed.
7. Chance as a First-Class Event
Where practical, model random events as explicit transitions.
Conceptually:
interface ChanceEvent {
source: ChanceSource;
possibleOutcomes: ChanceOutcome[];
}
This does not mean the game must expose probability trees to players.
It means the simulation architecture should understand:
player decision
vs.
random event
as different causes of state changes.
This distinction becomes important for later analysis.
8. Complete Game Trajectories
Every simulated or human-played game should be recordable as a trajectory.
Suggested conceptual record:
interface TrajectoryStep {
step: number;
stateBefore: SerializedGameState;
actor?: ActorId;
observation?: SerializedObservation;
legalActions?: SerializedAction[];
selectedAction?: SerializedAction;
chanceEvents?: SerializedChanceEvent[];
stateAfter: SerializedGameState;
metrics?: StepMetrics;
}
A full game becomes:
interface GameTrajectory {
metadata: GameRunMetadata;
steps: TrajectoryStep[];
result: GameResult;
}
Prefer a serialization format that can also be efficiently streamed or processed, such as JSONL.
9. Replayability
Every recorded trajectory should support deterministic replay.
Required behavior:
Load trajectory
→ restore initial state
→ replay actions and chance events
→ reproduce final state
If replay produces a different state, this should be treated as an engine correctness problem.
This makes historical simulations useful for:
- regression tests,
- bug reproduction,
- analysis,
- game-version comparison.
10. Forking Historical Games
Add the concept of creating a new simulation branch from an arbitrary historical decision.
Example:
Game trajectory
step 1
step 2
step 3
step 4 ← fork here
├─ original action
├─ alternative A
├─ alternative B
└─ alternative C
This enables counterfactual analysis.
It should eventually be possible to select any meaningful decision in the UI and ask:
What would probably have happened if another action had been selected?
11. Counterfactual Simulation
Counterfactual analysis is one of the most valuable additions to the original specification.
For a selected state:
- Enumerate candidate actions.
- Apply each candidate action.
- Run many continuations from each resulting state.
- Use identical or paired future random seeds where appropriate.
- Compare distributions of outcomes.
Example:
Decision at round 4:
A — Investigate ruins
Win rate: 62%
Average objective progress: 8.1
B — Continue toward destination
Win rate: 59%
Average objective progress: 8.8
C — Resolve storm damage
Win rate: 38%
Average objective progress: 6.4
Do not treat estimated win rate as the only value function.
Compare multiple metrics.
12. Effective Choices vs Legal Choices
The number of legal actions alone is not a useful measure of strategic depth.
Example:
15 legal actions
may actually mean:
1 sensible action
14 obviously inferior actions
The simulator should eventually estimate effective choices.
One possible approach:
- Evaluate candidate actions using rollouts or a search agent.
- Estimate their expected value.
- Count how many remain within a configurable range of the best candidate.
Example:
best expected score: 0.72
actions within 5%:
3
actions within 10%:
5
This is much more useful than raw branching factor.
13. Decision Quality Metrics
Introduce metrics such as:
legal action count
effective action count
best-vs-second-best difference
action-value entropy
decision sensitivity
decision reversibility
Interpretation:
Very low effective choice count
Potentially:
- obvious decision,
- scripted play,
- weak strategic depth.
Extremely high effective choice count
Potentially:
- analysis paralysis,
- unclear priorities,
- too many equivalent actions.
A preliminary design target may be roughly:
2–5 meaningful choices
for typical important decisions.
This is a hypothesis, not a hard rule.
14. Skill Ladder
Create multiple agent strengths.
Do not compare only:
random bot vs LLM
Use a progression.
Recommended initial ladder:
Random
↓
Simple heuristic
↓
Greedy heuristic
↓
One-step lookahead
↓
Small search
↓
larger search
↓
strong planner
For example:
Random
Greedy
OSLA
MCTS-100
MCTS-1,000
MCTS-10,000
Exact algorithms may change.
The important concept is increasing decision quality.
15. Skill Depth Metric
Compare performance across the skill ladder.
A strategically meaningful game should generally produce:
stronger decision-making
→ measurably better outcomes
If:
Random agent ≈ strong planner
then outcomes may depend too strongly on luck.
If:
simple greedy ≈ strongest planner
the strategy may be too shallow or dominated by a trivial heuristic.
Track:
agent strength
vs.
success rate
vs.
objective score
vs.
resource efficiency
16. Search Agents Before Heavy LLM Usage
LLMs are valuable, but should not be the main quantitative balancing engine.
Implement search-based or algorithmic agents where useful.
Potential approaches:
one-step lookahead
beam search
Monte Carlo rollouts
MCTS
Advantages:
- cheap,
- repeatable,
- fast,
- easier to compare,
- capable of millions of decisions,
- less noisy than LLM reasoning.
Use LLMs mainly where language understanding and qualitative assessment add value.
17. Recommended Agent Responsibilities
Algorithmic agents
Best suited for:
balance
strategy testing
parameter optimization
dominant strategy detection
skill depth analysis
counterfactual simulation
LLM agents
Best suited for:
human-like strategic interpretation
rule comprehension testing
narrative evaluation
situation interpretation
qualitative playtest feedback
content review
Human playtests
Best suited for:
fun
clarity
social interaction
emotional engagement
table presence
cognitive load
actual age suitability
These are complementary, not interchangeable.
18. Experiment as a First-Class Entity
Do not implement batch simulation only as:
Run 1,000 games
Create a formal Experiment model.
Example:
interface ExperimentConfig {
id: string;
gameVersion: string;
contentVersion: string;
parameters: GameParameters;
agents: AgentConfiguration[];
scenarios: ScenarioConfiguration[];
seeds: SeedConfiguration;
repetitions: number;
metrics: MetricId[];
}
Results should be reproducible from the stored experiment configuration.
19. Game Versioning
Every simulation result must record which game version produced it.
At minimum track:
rules version
content version
parameter version
agent version
Example:
{
"rulesVersion": "0.4.2",
"contentVersion": "base-0.3",
"parameterSet": "standard-v7",
"agentVersion": "mcts-0.2"
}
Never mix analytics from incompatible versions without explicit normalization or labeling.
20. A/B Game Variant Comparison
Support formal comparison between game variants.
Example:
Variant A
shared action pool = 10
Variant B
shared action pool = 8
Variant C
hybrid personal/shared actions
Run all variants using matched scenarios and seeds where appropriate.
Compare:
win rate
decision diversity
effective choices
game length
character utilization
situation engagement
strategy distribution
The web UI should eventually offer direct:
A vs B
comparison.
21. Parameter Search Space
Move game-balance parameters out of hardcoded logic.
Example:
interface GameParameters {
rounds: number;
actionsPerRound: number;
initialSituationCount: number;
situationFrequency: number;
objectiveDifficultyMultiplier: number;
situationExpirationMultiplier: number;
rewardMultiplier: number;
uncertaintyRate: number;
}
Not every parameter needs to exist immediately.
The important requirement is that balance-relevant numbers should be configurable.
22. Parameter Sweep
Support experiments such as:
rounds:
6, 7, 8, 9
actionsPerRound:
8, 9, 10, 11
situationFrequency:
0.8, 1.0, 1.2
The simulator can then execute all combinations.
Results should identify regions where desired properties emerge.
23. Multi-Objective Optimization
Do not optimize exclusively for:
50% win rate
A game with a perfect win rate distribution may still be boring.
Possible target metrics:
Standard win rate:
55–70%
Median game duration:
15–25 minutes
Effective choices:
2–5 for important decisions
Unused actions:
low
Character contribution:
balanced
Randomness contribution:
limited
Situation engagement:
diverse
Strategy concentration:
low
Treat balance as a multi-objective problem.
24. Randomness Contribution Analysis
One central requirement of the game is low dependence on luck.
The simulator should therefore explicitly estimate:
How much of the outcome variation comes from randomness versus player decisions?
A practical approach can use paired simulations.
For example:
Same agent
Same decisions where possible
Different random seeds
versus:
Different agents
Same random seeds
Compare outcome variance.
Eventually generate metrics such as:
seed sensitivity
agent sensitivity
scenario sensitivity
outcome randomness sensitivity
The exact statistical method can evolve later.
The architecture must make this analysis possible.
25. Strategy Classification
Store enough trajectory information to identify recurring strategies.
Examples:
main-objective rush
opportunity-heavy
risk avoidance
full situation resolution
exploration-heavy
resource conservation
single-character concentration
balanced character usage
Some strategies may be manually defined initially.
Later they may be inferred using clustering.
26. Dominant Strategy Detection
A strategy may be problematic if it:
- appears very frequently,
- performs significantly better,
- requires little adaptation,
- remains optimal across many scenarios.
Flag patterns such as:
always ignore optional situations
always resolve every negative situation
always use the same character first
always concentrate actions on one character
always pursue objectives before exploration
Do not automatically treat dominance as a bug.
Surface it to the designer for review.
27. Trajectory Similarity
Content variety should not be measured only by:
different cards appeared
Two games may use different cards but produce functionally identical play.
Store complete trajectories and derive normalized features such as:
objective progress over time
action types over time
character usage
location movement
situation lifecycle
resource trajectory
risk exposure
opportunity engagement
Use these to estimate similarity between games.
28. Replayability Metrics
Introduce metrics such as:
trajectory diversity
strategy diversity
content diversity
decision diversity
ending diversity
A useful future concept:
Replayability Distance
where highly similar playthroughs have low distance and substantially different strategic trajectories have high distance.
Exact algorithm can be deferred.
Store sufficient data now so the metric can be implemented later.
29. Scenario Quality Analysis
Because this game relies heavily on varied situations and emergent stories, introduce analytics specifically for scenarios.
For each scenario or scenario family track:
success rate
game duration
objective completion order
situation engagement
ignored opportunities
strategy distribution
decision difficulty
randomness sensitivity
trajectory diversity
Identify scenarios that are:
too easy
too hard
too deterministic
too random
too repetitive
too similar to another scenario
30. Situation Quality Analytics
Each Situation should accumulate analytics.
Example:
interface SituationAnalytics {
appearanceCount: number;
engagementRate: number;
ignoreRate: number;
resolutionRate: number;
expirationRate: number;
averageActionCost: number;
averageLifetimeRounds: number;
successCorrelation: number;
objectiveProgressCorrelation: number;
effectiveChoiceImpact: number;
trajectoryImpact: number;
}
This is important because a situation can be mechanically balanced while still being strategically irrelevant.
31. Detect Functional Duplicate Content
Two cards may have different:
name
story
theme
art
while producing almost the same player decision every time.
The simulator should eventually detect potential functional duplicates.
Example:
Card A:
engaged 68%
cost 2 actions
usually chosen in round 3–4
Card B:
engaged 70%
cost 2 actions
usually chosen in round 3–4
trajectory effect almost identical
Flag such pairs for human review.
This is especially important if LLM-generated candidate content becomes large.
32. Opportunity Analysis
Because the game intentionally includes positive, negative and ambiguous situations, track opportunity behavior separately.
Metrics may include:
opportunity engagement rate
expected reward
actual reward
action investment
opportunity abandonment
opportunity regret
objective trade-off
Important question:
Are optional opportunities genuinely tempting without becoming mandatory?
Ideally the answer should vary by context.
33. Ambiguous Situation Analysis
For hidden or partially known outcomes, track:
engagement before reveal
outcome distribution
player expectation
actual result
future behavioral impact
A hidden outcome should not behave like arbitrary punishment.
The system should help identify situations where:
risk is too high
reward is too low
players always engage
players never engage
outcome variance dominates strategy
34. Human Playtest Telemetry
Human games played in the web simulator should produce the same trajectory format as bot simulations.
Additionally record non-game telemetry where useful:
decision time
undo usage
rules help usage
hover/detail inspection
pass/no-op usage
Do not interpret these automatically as definitive UX problems.
They are signals.
Example:
decision repeatedly takes 45 seconds
may indicate:
- interesting tension,
- unclear UI,
- analysis paralysis.
Human review remains necessary.
35. Compare Human and AI Play
Once enough human games exist, compare:
human strategy distribution
vs.
bot strategy distribution
Useful metrics:
action frequency
situation engagement
character usage
decision branching
objective order
game duration
success rate
The goal is not to make AI perfectly imitate humans.
The goal is to identify when automated testing explores a very different part of the strategy space than real players.
36. LLM Playtest Reports
After selected games, LLM agents may produce structured evaluations.
Recommended output schema:
{
"mostInterestingDecision": "...",
"mostObviousDecision": "...",
"leastUsefulMechanic": "...",
"dominantStrategyObserved": "...",
"unclearRule": "...",
"narrativeConsistency": "...",
"randomnessAssessment": "...",
"replayabilityAssessment": "..."
}
These reports are qualitative evidence only.
Do not mix them directly with quantitative metrics.
37. Aggregate LLM Feedback
Do not rely on a single LLM playtest report.
Instead:
run multiple games
↓
collect structured reports
↓
aggregate recurring observations
↓
surface clusters
Example:
17 / 25 agents:
"Optional exploration rarely felt worthwhile."
14 / 25:
"Character C had little reason to act."
3 / 25:
"Outcome randomness felt frustrating."
Recurring feedback is more useful than isolated commentary.
38. Experiment Dashboard
The web application should eventually provide an analytics-oriented experiment screen.
Useful views:
Experiment summary
games simulated
agent composition
game version
parameter set
seed configuration
Outcome distribution
win / loss
objective score
rounds played
Decision quality
branching factor
effective choices
decision entropy
Agent comparison
Random
Greedy
Planner
MCTS
LLM
Content analytics
situations
characters
objectives
scenarios
Strategy analytics
strategy frequency
dominant patterns
trajectory clusters
39. Distribution Over Average
Where possible, show distributions rather than only averages.
Prefer:
median
quartiles
percentiles
histogram/distribution
over only:
average = 7.3
For example:
game duration:
median 8 rounds
P10: 6
P90: 10
This makes outliers and unstable balance visible.
40. Confidence and Sample Size
The simulator should not imply statistical certainty from tiny samples.
Example:
Win rate: 62%
n = 18
should be visually distinguishable from:
Win rate: 62%
n = 25,000
Track sample size everywhere.
Confidence intervals may be added where useful.
41. CI Regression Testing
Create deterministic simulation-based regression tests.
Examples:
game always terminates
no illegal state transitions
no negative resources
all generated scenarios are solvable structurally
all legal actions are executable
serialized replay reproduces the same state
Later add statistical regression guards.
Example:
Standard mode win rate with baseline agent:
expected 45–70%
Do not make narrow statistical thresholds flaky.
Use generous ranges.
42. Content Validation Through Simulation
Candidate content should pass automated tests before inclusion.
Pipeline:
schema validation
↓
static rule validation
↓
scenario generation validation
↓
simulation
↓
metric comparison
↓
qualitative review
↓
human approval
Automatically flag content that produces extreme results.
Example:
new card increases success rate by 18 percentage points
or:
new situation is ignored in 96% of appearances
43. Performance Requirements
Keep simulation independent of rendering.
Target execution path:
createGame()
getLegalActions()
selectAction()
applyAction()
...
without:
DOM
React
animations
network
browser layout
Simulation should be suitable for:
Node.js
workers
parallel execution
CI
Do not prematurely optimize everything.
However, avoid architectural choices that make large-scale simulation impossible.
44. Parallel Simulation
Batch simulation should eventually support parallel workers.
Conceptually:
Experiment
│
├─ worker 1 → games 1–2500
├─ worker 2 → games 2501–5000
├─ worker 3 → games 5001–7500
└─ worker 4 → games 7501–10000
Each simulation must remain independently reproducible from its seeds.
45. Avoid Storing Excessive State by Default
Complete trajectories are useful but can become large.
Support recording levels.
Example:
NONE
SUMMARY
ACTIONS
KEY_STATES
FULL
Batch balancing runs may use:
SUMMARY
while debugging or selected LLM games may use:
FULL
This allows large-scale simulation without unnecessary storage.
46. Separate Simulation Metrics from Game Rules
Instrumentation must not alter gameplay.
Avoid code such as:
if (analyticsEnabled) {
// different game behavior
}
Instead:
engine emits domain events
↓
analytics observers consume events
Example events:
ActionSelected
SituationRevealed
SituationEngaged
SituationResolved
SituationExpired
ObjectiveAdvanced
ResourceChanged
RoundEnded
GameEnded
This creates a cleaner analytics layer.
47. Event-Based Instrumentation
Recommended conceptual event:
interface GameEvent {
type: string;
step: number;
round: number;
actor?: ActorId;
entityIds?: string[];
payload?: unknown;
}
Metrics should preferably be calculated from events and trajectories rather than hardcoded throughout gameplay logic.
48. Designer-Friendly Debugging
The simulator UI should provide:
current state
current observation
legal actions
selected action
chance events
game events
parameter values
seed values
A designer should be able to answer:
Why did this happen?
without reading source code.
49. Decision Inspector
Add a future UI concept called something like:
Decision Inspector
For a selected decision show:
available actions
estimated action values
effective alternatives
future rollouts
relevant rules
contributing state variables
This can become one of the most useful tools in the application.
50. Scenario Inspector
Likewise, support inspecting generated scenarios.
Show:
scenario template
selected content
tags
compatibility decisions
random seeds
difficulty estimate
generated objectives
generated situations
The designer should be able to explain why a scenario was generated.
51. Content Provenance
For every piece of content track its source.
Possible sources:
human
LLM candidate
LLM revised
generated
expansion pack
Example:
interface ContentMetadata {
source: "human" | "llm" | "generated";
version: string;
authoringBatch?: string;
}
Useful later for evaluating whether automatically generated content behaves differently from hand-designed content.
52. Strong Separation Between Content and Mechanics
Continue the original principle:
complexity should live in combinations, not rules.
The simulator should reinforce this separation.
Game mechanics should not require code modifications for every new Situation.
Prefer:
content schema
+
effects
+
tags
+
conditions
over:
if (cardId === "special_card_37") {
// custom rules
}
Custom mechanics should be exceptional.
53. Recommended Immediate Refactoring Priorities
Do not attempt to implement the entire analytics system at once.
For the current implementation, prioritize in this order.
Priority 1 — Core correctness
Ensure:
headless engine
serializable GameState
legal action generation
pure/controlled transitions
seeded randomness
Priority 2 — State / Observation separation
Introduce:
GameState
Observation
Action
Chance
even if Observation initially mirrors most of GameState.
Priority 3 — Game trajectory
Record:
initial state
actions
chance events
final state
Support deterministic replay.
Priority 4 — Experiment runner
Create:
ExperimentConfig
SimulationRunner
ExperimentResult
Support many headless games.
Priority 5 — Baseline agents
Implement:
Random
Greedy
Objective-focused
Risk-focused
Keep the agent interface generic.
Priority 6 — Metrics
Initially calculate:
win rate
game duration
action frequencies
character usage
situation engagement
objective progress
unused actions
legal branching factor
Priority 7 — Variant comparison
Support:
parameter set A
vs.
parameter set B
using matched seeds.
Priority 8 — Search agent
Add at least one simple planning agent.
For example:
one-step lookahead
and later:
Monte Carlo search / MCTS
Priority 9 — Counterfactual analysis
Fork states and compare alternative actions.
Priority 10 — Advanced analytics
Only then add:
effective choices
skill-depth measurement
randomness attribution
trajectory similarity
strategy clustering
content functional-duplicate detection
54. Non-Goals for the Current Refactoring
Do not block current development waiting for:
reinforcement learning
complex neural agents
distributed cloud infrastructure
perfect statistical models
automatic game design
automatic publication of content
The architecture should allow these later.
They are not required now.
55. Important Implementation Principle
Avoid coupling future capability to a specific AI provider.
The agent interface should be provider-neutral.
Conceptually:
interface Agent {
selectAction(
context: AgentContext
): Promise<ActionSelection>;
}
Possible implementations:
RandomAgent
GreedyAgent
SearchAgent
LlmAgent
HumanAgent
An LLM should be just another agent implementation.
56. LLM Agent Input
Do not send arbitrary internal state dumps to the model by default.
Build a normalized context.
Example:
interface AgentContext {
observation: Observation;
legalActions: LegalAction[];
objectives: ObjectiveSummary[];
recentHistory: HistorySummary[];
metadata: {
round: number;
roundsRemaining: number;
};
}
This improves:
- provider portability,
- prompt stability,
- token efficiency,
- comparability between models.
57. LLM Structured Output
LLM agents should choose actions through structured output.
Example:
{
"actionId": "character-2:investigate:situation-8",
"comment": "The opportunity may unlock the objective route."
}
The engine must validate actionId.
Invalid responses should never mutate state.
58. Designer-Defined Evaluation Functions
Do not hardcode only a binary win/loss score.
Allow evaluation functions such as:
objective progress
remaining resources
team condition
unresolved situations
round efficiency
exploration achieved
optional discoveries
Search agents may use weighted combinations.
This is also useful for incomplete simulations.
59. Beware of Optimizing Away Fun
The simulator is a design aid.
It must not silently turn the design goal into:
maximize win probability.
For example, an optional mysterious situation may intentionally be slightly suboptimal in pure efficiency terms but highly valuable for:
story
curiosity
variation
tension
Therefore:
mechanical optimality
≠
game quality
The analytics system should expose trade-offs, not automatically decide them.
60. Overall Target
The improved system should allow the designer to ask questions such as:
Does skill matter more than luck?
Are there several viable strategies?
Does one character dominate?
Are optional opportunities actually attractive?
Which situations are almost always ignored?
Do different content packs produce genuinely different games?
Are two cards narratively different but mechanically identical?
Is Standard difficulty actually harder because of decisions,
or just because bad random outcomes become more punishing?
Does reducing the action pool improve tension
or merely make the game frustrating?
Does this rule change improve the game across scenarios
or only solve one specific case?
Do humans play similarly to our automated agents?
At which turns are decisions most interesting?
Which decisions are almost automatic?
These questions are more important than raw win rate.
61. Final Design Principle
The simulation platform should optimize for understanding the game, not merely running it quickly.
Its purpose is to reveal:
why games are won
why games are lost
where meaningful decisions happen
where decisions are fake
where randomness matters
which strategies emerge
which content matters
which content is redundant
how different playthroughs really are
The simulator should therefore evolve from:
a digital implementation capable of automated play
into:
a reproducible experimental environment for designing, testing and understanding the strategic and narrative behavior of the game.