@startuml uc-08-run-adventure autonumber title UC-08 Run Adventure (design sequence) actor Player participant "AdventureBoundary\n«/api/characters/{id}/adventure»" as boundary <> participant "AdventureService\nsb-core::adventure::run_adventure" as control <> participant "ResourceRegenerator\napply_regen" as regen <> participant "CombatEngine\nsb-core::combat" as combat <> participant "Combatant\nCombatStats" as combatant <> participant "SpellEffect / BardSong\nsb-core::{spells,songs}" as fx <> == Validate == Player -> boundary : POST adventure (zone, default skara_brae_streets) boundary -> control : run_adventure(rng, character, zone) alt zone unknown control --> boundary : 404 else HP <= 0 control --> boundary : 400 else nerve < zone cost control --> boundary : 422 else ok end control -> regen : apply_regen(character) regen --> control : character (regenerated) control -> control : nerve -= zone cost == Encounter == control -> combatant : pick_enemy(rng, weighted table) alt unknown enemy id (data error) control --> boundary : 500 DomainError::UnknownEncounterEnemy end == Combat (rounds) == loop until one side falls control -> combat : open_ended_roll(rng, attack) combat -> combat : OB vs DB, crit table\n(level-gap damage caps) combat -> fx : bard song effect, active spell dmg/heal combat --> control : round result end == Resolve == alt player victory control -> combatant : XP + gold per enemy def control -> combatant : HP = last defender HP control -> combatant : loot rolls (catalogue items only) else defeat control -> combatant : HP = 0, no rewards end control -> fx : spell-point upkeep (win or lose) control --> boundary : {zone, enemy, combat_log, loot} boundary --> Player : {zone, enemy, combat_log, loot} @enduml