Align the OpenUP markdown set to the blank templates (process-data repo, templates/openup/) per BUILD-CHECKLIST 7. Scenario step text unchanged; the EA model needs no change (brief descriptions already live in the model's UC/actor notes). - vision.md: positioning tables, stakeholder summary, user environment, needs-and-features table (R1/R2), other product requirements - use-case-model.md: per-UC specification sections (brief description, actor descriptions, named alternative/exception subsections with numbered steps, post-conditions, special requirements) - supplementary-specifications.md: category tables with priority and use-case columns + reverse coverage matrix; IDs unchanged - test/quality-check-procedure.md: migrated from Joplin (single content home); stale open items marked resolved (WI-1/WI-2) - analysis-design/sequences/: 12 PlantUML design sequences (lifelines = analysis classes, messages = design elements; per the PlantUML layout style guide) + PNG renders; embedded in Architecture Notebook 9.3 - Joplin consolidated: project content notes deleted (all live in docs/game + docs/openup); Joplin keeps the status note only
52 lines
1.8 KiB
Text
52 lines
1.8 KiB
Text
@startuml uc-08-run-adventure
|
|
autonumber
|
|
title UC-08 Run Adventure (design sequence)
|
|
actor Player
|
|
participant "AdventureBoundary\n«/api/characters/{id}/adventure»" as boundary <<boundary>>
|
|
participant "AdventureService\nsb-core::adventure::run_adventure" as control <<control>>
|
|
participant "ResourceRegenerator\napply_regen" as regen <<entity>>
|
|
participant "CombatEngine\nsb-core::combat" as combat <<entity>>
|
|
participant "Combatant\nCombatStats" as combatant <<entity>>
|
|
participant "SpellEffect / BardSong\nsb-core::{spells,songs}" as fx <<entity>>
|
|
|
|
== 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
|