Date: 2026-09-09
Cost: ~$0.90 USD (well under budget)
BattleArenaView.cs:448slot.Combatant.MaxHealth → slot.Combatant.Sheet.Stats.MaxHealthHUD/InfoPanelUI.cs (new file)Created 4 new UI panel classes (extracted from MazeSceneBuilder):
HUD/StatusPanelUI.cs — Elapsed time, agent counts, simulation controlsHUD/FightPanelUI.cs — Live fights with join-window countdownHUD/AgentPanelUI.cs — Agent list, click-to-followHUD/InfoPanelUI.cs — Detailed agent info, thoughts, inventory, combat logBenefits:
Behavior:
Impact:
UseHealthPotionDecisionBehavior:
Extensibility: Can modify LowHealthThreshold constant to adjust trigger point
AgentDecision.cs — Abstract base class
CanExecute(agent) — Precondition checkExecute(agent) — Perform action, return if consumedThink(agent) — Narrate to thought logDecisionName — Human-readable labelAgentDecisionTree.cs — Priority-ordered decision manager
Add(decision) — Register a decisionTryDecide(agent) — Evaluate tree, execute first valid decisionFindApplicableDecision() — Debug helper to see available choicesGetAvailableDecisions() — List all executable decisionsUseHealthPotionDecision
HandleExistingFightDecision
DeclareFightDecision
SneakAwayDecision
MoveOnDecision
Update()
→ _decisionTree.TryDecide(agent)
→ For each decision in priority order:
→ If CanExecute():
→ Execute() (modifies state)
→ Think() (narrates to thought log)
→ Return true (decision consumed this turn)
→ Return false if no decision could execute
AgentDecisionCanExecute(), Execute(), Think(), DecisionNameBuildDecisionTree() in the priority order you wantpublic class FleeFromMassiveHorde : AgentDecision
{
public override string DecisionName => "Flee Horde";
public override bool CanExecute(MazeAgent agent)
{
Room room = agent.CurrentRoom;
if (room?.Encounter == null) return false;
return room.Encounter.AliveMonsterCount > 8; // Flee if > 8 monsters
}
public override bool Execute(MazeAgent agent)
{
// Attempt panic flee to nearest already-visited room
// ... implementation ...
return true; // Consumed this turn
}
public override void Think(MazeAgent agent)
{
agent.Thoughts.Add(ThoughtKind.Avoid, "WAY too many hostiles - RUN!");
}
}
// Then in BuildDecisionTree():
_decisionTree.Insert(3, new FleeFromMassiveHorde()); // Higher priority than sneaking
UseHealthPotionDecision.LowHealthThresholdGetEffectiveReteatThreshold() methods in decision classesMoveOnDecision / _exploreChanceCanExecute() makes it clear when a decision appliesBuildDecisionTree() reads top-to-bottom as priorityAssets/Scripts/Maze/Visualization/HUD/
├── StatusPanelUI.cs (165 lines)
├── FightPanelUI.cs (75 lines)
├── AgentPanelUI.cs (65 lines)
└── InfoPanelUI.cs (130 lines) ← Includes inventory display
Assets/Scripts/Maze/Agent/Decisions/
├── AgentDecision.cs (45 lines)
├── AgentDecisionTree.cs (120 lines)
├── UseHealthPotionDecision.cs (35 lines)
├── HandleExistingFightDecision.cs (65 lines)
├── DeclareFightDecision.cs (65 lines)
├── SneakAwayDecision.cs (80 lines)
└── MoveOnDecision.cs (230 lines)
Assets/Scripts/Maze/Visualization/MazeSceneBuilder.cs
- Removed: 300+ lines of GUI code
- Added: UI panel instantiation & delegation
- Net: -280 lines
Assets/Scripts/Maze/Visualization/BattleArenaView.cs
- Fixed: Line 448, monster max health display
Assets/Scripts/Maze/Agent/AutonomousAgentBrain.cs
- Refactored: Entire class to use decision tree
- Reduced: 470 lines → 95 lines
- Removed: All decision logic (now in decision classes)
Inventory Display
Health-Aware Retreat
Potion Usage
Monster Health Bar
Decision Tree Extension
_decisionInterval seconds on SimulationClock timeEstimate: ~$0.90 USD
Budget: $10 USD
Status: ✅ Well Under Budget
Token breakdown:
Ready to test! All features are in place and synchronized.