Implement Combat sub-branches: Finesse, Power, Guard, Kick, Grapple with tier requirements #231

Open
opened 2026-03-16 01:40:16 +00:00 by freemo · 0 comments
Owner

Metadata

Key Value
Parent Epic #224 — Combat Discipline Tree
Legendary #198 — Character Progression & Skills
Branch feature/m4-combat-sub-branches
Commit Message feat(skills): implement Combat sub-branches with tier requirements
Points 5
Priority High
MoSCoW Must Have

Background and Context

The tier-2 combat sub-branches represent advanced specializations that branch off from the three primary combat skills. These require significant investment in the parent branch (level 3) before becoming available, creating meaningful progression choices for players.

  • Swordplay branches into Finesse (precision, critical strikes) and Power (heavy blows, cleaving).
  • Shield branches into Guard (defensive mastery, damage reduction).
  • Unarmed branches into Kick (leg techniques, sweeps) and Grapple (holds, throws, submissions).

Each sub-branch requires level 3 in its parent, ensuring players have demonstrated proficiency before specializing further. These tier-2 nodes are also prerequisites for the terminal Martial Arts node (defined in a separate issue).

Expected Behavior

  1. YAML Definitions added to conf/skill_trees.yaml:

    combat_sub_branches:
      finesse:
        name: Finesse
        discipline: combat
        description: "Precise, agile blade techniques emphasizing critical strikes and exploiting openings."
        tier: 2
        prerequisites:
          - name: swordplay
            level: 3
        xp_required: 10000
        max_level: 10
      power:
        name: Power
        discipline: combat
        description: "Devastating heavy strikes and cleaving attacks that overwhelm defenses."
        tier: 2
        prerequisites:
          - name: swordplay
            level: 3
        xp_required: 10000
        max_level: 10
      guard:
        name: Guard
        discipline: combat
        description: "Advanced defensive techniques for damage reduction and protecting allies."
        tier: 2
        prerequisites:
          - name: shield
            level: 3
        xp_required: 10000
        max_level: 10
      kick:
        name: Kick
        discipline: combat
        description: "Powerful leg techniques including roundhouse kicks, sweeps, and flying kicks."
        tier: 2
        prerequisites:
          - name: unarmed
            level: 3
        xp_required: 10000
        max_level: 10
      grapple:
        name: Grapple
        discipline: combat
        description: "Close-quarters techniques for holds, throws, pins, and submission locks."
        tier: 2
        prerequisites:
          - name: unarmed
            level: 3
        xp_required: 10000
        max_level: 10
    
  2. Prerequisite Chains:

    • Finesse and Power require Swordplay at level 3.
    • Guard requires Shield at level 3.
    • Kick and Grapple require Unarmed at level 3.
    • check_unlockable should not list any tier-2 node unless the player meets the level 3 prerequisite.
  3. Tree Structure:

    • children_of("swordplay") → Finesse, Power.
    • children_of("shield") → Guard.
    • children_of("unarmed") → Kick, Grapple.
    • list_by_discipline(:combat) returns 9 nodes across tiers 0-2.

Acceptance Criteria

  • Finesse, Power, Guard, Kick, Grapple nodes are defined in conf/skill_trees.yaml.
  • Finesse requires Swordplay level 3. Power requires Swordplay level 3.
  • Guard requires Shield level 3.
  • Kick requires Unarmed level 3. Grapple requires Unarmed level 3.
  • All sub-branches are tier: 2 under the combat discipline.
  • children_of returns correct children for each parent.
  • check_unlockable correctly gates each sub-branch behind level 3 prerequisites.
  • list_by_discipline(:combat) returns 9 nodes sorted by tier.
  • validate! passes with all combat nodes loaded.

Subtasks

  • Add Finesse node definition to conf/skill_trees.yaml.
  • Add Power node definition to conf/skill_trees.yaml.
  • Add Guard node definition to conf/skill_trees.yaml.
  • Add Kick node definition to conf/skill_trees.yaml.
  • Add Grapple node definition to conf/skill_trees.yaml.
  • Verify prerequisite chains for all 5 sub-branches.
  • Verify children_of returns correct results for swordplay, shield, unarmed.
  • Verify check_unlockable gates behind level 3 prerequisites.
  • Verify list_by_discipline(:combat) returns 9 nodes across 3 tiers.
  • Run validate! and confirm no errors with the full combat tree.
  • Docs: Update YARD comments on affected classes and methods. Update relevant Docusaurus documentation pages if applicable.
  • Tests (Cucumber): Add tests/unit/combat_sub_branches.feature covering sub-branch loading from YAML, level 3 prerequisite gating, children_of traversal for swordplay/shield/unarmed, full combat tree listing, tree validation with 9 nodes.
  • Tests (Cucumber Integration): Add integration feature in tests/integration/ for Combat sub-branch loading and tier-2 prerequisite validation.
  • Tests (Profiling): Run bundle exec rake unit_profile and verify no performance regressions.
  • Quality: Verify coverage >=97% via bundle exec rake unit. If coverage is <97% then review the current unit test coverage report at build/tests/unit/coverage/ and use it to write new Cucumber based unit tests to improve code coverage. Specifically, write Cucumber/Gherkin style unit tests that are descriptively named and specifically improve coverage on whichever file has the most uncovered lines by writing tests that will target the uncovered lines in the report. Once that is done rerun bundle exec rake unit to verify all tests pass and coverage is above >=97%. Only mark this as complete once coverage is >=97%, if not repeat this task as many times as is needed until coverage reaches >=97%.
  • Quality: Run bundle exec rake (default task: unit tests with coverage) and bundle exec rake integration, fix any errors if needed ensuring both pass across entire code base, do not ignore any failure even if it seems unrelated to this commit, fix it.

Definition of Done

This issue is complete when:

  • All subtasks above are completed and checked off.
  • A Git commit is created where the first line of the commit message matches the Commit Message in Metadata exactly, followed by a blank line, then additional lines providing relevant details about the implementation.
  • The commit is pushed to the remote on the branch matching the Branch in Metadata exactly.
  • The commit is submitted as a pull request to master, reviewed, and merged before this issue is marked done.
## Metadata | Key | Value | |-----|-------| | **Parent Epic** | #224 — Combat Discipline Tree | | **Legendary** | #198 — Character Progression & Skills | | **Branch** | `feature/m4-combat-sub-branches` | | **Commit Message** | `feat(skills): implement Combat sub-branches with tier requirements` | | **Points** | 5 | | **Priority** | High | | **MoSCoW** | Must Have | ## Background and Context The tier-2 combat sub-branches represent advanced specializations that branch off from the three primary combat skills. These require significant investment in the parent branch (level 3) before becoming available, creating meaningful progression choices for players. - **Swordplay** branches into **Finesse** (precision, critical strikes) and **Power** (heavy blows, cleaving). - **Shield** branches into **Guard** (defensive mastery, damage reduction). - **Unarmed** branches into **Kick** (leg techniques, sweeps) and **Grapple** (holds, throws, submissions). Each sub-branch requires level 3 in its parent, ensuring players have demonstrated proficiency before specializing further. These tier-2 nodes are also prerequisites for the terminal Martial Arts node (defined in a separate issue). ## Expected Behavior 1. **YAML Definitions** added to `conf/skill_trees.yaml`: ```yaml combat_sub_branches: finesse: name: Finesse discipline: combat description: "Precise, agile blade techniques emphasizing critical strikes and exploiting openings." tier: 2 prerequisites: - name: swordplay level: 3 xp_required: 10000 max_level: 10 power: name: Power discipline: combat description: "Devastating heavy strikes and cleaving attacks that overwhelm defenses." tier: 2 prerequisites: - name: swordplay level: 3 xp_required: 10000 max_level: 10 guard: name: Guard discipline: combat description: "Advanced defensive techniques for damage reduction and protecting allies." tier: 2 prerequisites: - name: shield level: 3 xp_required: 10000 max_level: 10 kick: name: Kick discipline: combat description: "Powerful leg techniques including roundhouse kicks, sweeps, and flying kicks." tier: 2 prerequisites: - name: unarmed level: 3 xp_required: 10000 max_level: 10 grapple: name: Grapple discipline: combat description: "Close-quarters techniques for holds, throws, pins, and submission locks." tier: 2 prerequisites: - name: unarmed level: 3 xp_required: 10000 max_level: 10 ``` 2. **Prerequisite Chains:** - Finesse and Power require Swordplay at level 3. - Guard requires Shield at level 3. - Kick and Grapple require Unarmed at level 3. - `check_unlockable` should not list any tier-2 node unless the player meets the level 3 prerequisite. 3. **Tree Structure:** - `children_of("swordplay")` → Finesse, Power. - `children_of("shield")` → Guard. - `children_of("unarmed")` → Kick, Grapple. - `list_by_discipline(:combat)` returns 9 nodes across tiers 0-2. ## Acceptance Criteria - [ ] Finesse, Power, Guard, Kick, Grapple nodes are defined in `conf/skill_trees.yaml`. - [ ] Finesse requires Swordplay level 3. Power requires Swordplay level 3. - [ ] Guard requires Shield level 3. - [ ] Kick requires Unarmed level 3. Grapple requires Unarmed level 3. - [ ] All sub-branches are `tier: 2` under the `combat` discipline. - [ ] `children_of` returns correct children for each parent. - [ ] `check_unlockable` correctly gates each sub-branch behind level 3 prerequisites. - [ ] `list_by_discipline(:combat)` returns 9 nodes sorted by tier. - [ ] `validate!` passes with all combat nodes loaded. ## Subtasks - [ ] Add Finesse node definition to `conf/skill_trees.yaml`. - [ ] Add Power node definition to `conf/skill_trees.yaml`. - [ ] Add Guard node definition to `conf/skill_trees.yaml`. - [ ] Add Kick node definition to `conf/skill_trees.yaml`. - [ ] Add Grapple node definition to `conf/skill_trees.yaml`. - [ ] Verify prerequisite chains for all 5 sub-branches. - [ ] Verify `children_of` returns correct results for swordplay, shield, unarmed. - [ ] Verify `check_unlockable` gates behind level 3 prerequisites. - [ ] Verify `list_by_discipline(:combat)` returns 9 nodes across 3 tiers. - [ ] Run `validate!` and confirm no errors with the full combat tree. - [ ] Docs: Update YARD comments on affected classes and methods. Update relevant Docusaurus documentation pages if applicable. - [ ] Tests (Cucumber): Add `tests/unit/combat_sub_branches.feature` covering sub-branch loading from YAML, level 3 prerequisite gating, children_of traversal for swordplay/shield/unarmed, full combat tree listing, tree validation with 9 nodes. - [ ] Tests (Cucumber Integration): Add integration feature in `tests/integration/` for Combat sub-branch loading and tier-2 prerequisite validation. - [ ] Tests (Profiling): Run `bundle exec rake unit_profile` and verify no performance regressions. - [ ] Quality: Verify coverage >=97% via `bundle exec rake unit`. If coverage is <97% then review the current unit test coverage report at `build/tests/unit/coverage/` and use it to write new Cucumber based unit tests to improve code coverage. Specifically, write Cucumber/Gherkin style unit tests that are descriptively named and specifically improve coverage on whichever file has the most uncovered lines by writing tests that will target the uncovered lines in the report. Once that is done rerun `bundle exec rake unit` to verify all tests pass and coverage is above >=97%. Only mark this as complete once coverage is >=97%, if not repeat this task as many times as is needed until coverage reaches >=97%. - [ ] Quality: Run `bundle exec rake` (default task: unit tests with coverage) and `bundle exec rake integration`, fix any errors if needed ensuring both pass across **entire** code base, do not ignore any failure even if it seems unrelated to this commit, fix it. ## Definition of Done This issue is complete when: - All subtasks above are completed and checked off. - A Git commit is created where the **first line** of the commit message matches the Commit Message in Metadata exactly, followed by a blank line, then additional lines providing relevant details about the implementation. - The commit is pushed to the remote on the branch matching the **Branch** in Metadata exactly. - The commit is submitted as a **pull request** to `master`, reviewed, and **merged** before this issue is marked done.
freemo added this to the v1.3.0 milestone 2026-03-16 01:40:16 +00:00
freemo self-assigned this 2026-03-16 01:40:16 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference: aethyr/Aethyr#231
No description provided.