Implement CombatGrid 5x7 data model with cell-based body part mapping #254

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

Metadata

  • Commit Message: feat(combat): implement CombatGrid 5x7 data model with body part mapping
  • Branch: feature/m4-combat-grid

Background and Context

The deterministic combat system requires a 5x7 grid representing a humanoid body. Each cell maps to one of 16 named body parts. The grid is used to resolve attack patterns, blocking arcs, and damage application. Attacks target specific cells; the body part at that cell takes the damage.

Expected Behavior

A CombatGrid class provides a 5-column by 7-row grid where each cell is mapped to a BodyPart. The grid layout follows the humanoid body: head at top-center, arms on sides, torso in center, legs at bottom. Grid supports coordinate-based cell lookup, body part lookup by name, and pattern overlay for attack resolution.

Acceptance Criteria

  • CombatGrid initializes a 5x7 grid with 16 named body parts mapped to cells
  • Grid provides cell_at(row, col) returning the BodyPart at that position
  • Grid provides cells_for(body_part_name) returning all cells for a named part
  • Grid layout matches specification: Head(0,2), Neck(1,2), L.Shoulder(1,1), R.Shoulder(1,3), etc.
  • Grid rejects out-of-bounds coordinates with clear error

Subtasks

  • Code: Create lib/aethyr/core/combat/combat_grid.rb with CombatGrid class
  • Code: Define the BODY_MAP constant mapping (row,col) pairs to body part names for the 5x7 grid
  • Code: Implement cell_at(row, col) with bounds checking
  • Code: Implement cells_for(body_part_name) returning array of [row,col] pairs
  • Code: Implement overlay_pattern(origin_row, origin_col, offsets) for resolving attack patterns relative to a grid position
  • Code: Add to_s method for debug ASCII display of the grid
  • Docs: Update YARD comments on affected classes and methods. Update relevant Docusaurus documentation pages if applicable.
  • Tests (Cucumber): Add tests/unit/combat_grid.feature covering grid creation, cell lookup, body part mapping, boundary checks.
  • Tests (Cucumber Integration): Add integration feature in tests/integration/ for combat grid initialization during combat start.
  • 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 - **Commit Message**: `feat(combat): implement CombatGrid 5x7 data model with body part mapping` - **Branch**: `feature/m4-combat-grid` ## Background and Context The deterministic combat system requires a 5x7 grid representing a humanoid body. Each cell maps to one of 16 named body parts. The grid is used to resolve attack patterns, blocking arcs, and damage application. Attacks target specific cells; the body part at that cell takes the damage. ## Expected Behavior A CombatGrid class provides a 5-column by 7-row grid where each cell is mapped to a BodyPart. The grid layout follows the humanoid body: head at top-center, arms on sides, torso in center, legs at bottom. Grid supports coordinate-based cell lookup, body part lookup by name, and pattern overlay for attack resolution. ## Acceptance Criteria - [ ] CombatGrid initializes a 5x7 grid with 16 named body parts mapped to cells - [ ] Grid provides `cell_at(row, col)` returning the BodyPart at that position - [ ] Grid provides `cells_for(body_part_name)` returning all cells for a named part - [ ] Grid layout matches specification: Head(0,2), Neck(1,2), L.Shoulder(1,1), R.Shoulder(1,3), etc. - [ ] Grid rejects out-of-bounds coordinates with clear error ## Subtasks - [ ] Code: Create `lib/aethyr/core/combat/combat_grid.rb` with CombatGrid class - [ ] Code: Define the BODY_MAP constant mapping (row,col) pairs to body part names for the 5x7 grid - [ ] Code: Implement `cell_at(row, col)` with bounds checking - [ ] Code: Implement `cells_for(body_part_name)` returning array of [row,col] pairs - [ ] Code: Implement `overlay_pattern(origin_row, origin_col, offsets)` for resolving attack patterns relative to a grid position - [ ] Code: Add `to_s` method for debug ASCII display of the grid - [ ] Docs: Update YARD comments on affected classes and methods. Update relevant Docusaurus documentation pages if applicable. - [ ] Tests (Cucumber): Add `tests/unit/combat_grid.feature` covering grid creation, cell lookup, body part mapping, boundary checks. - [ ] Tests (Cucumber Integration): Add integration feature in `tests/integration/` for combat grid initialization during combat start. - [ ] 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:50:06 +00:00
freemo self-assigned this 2026-03-16 01:50:06 +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#254
No description provided.