Skip to content

Feature set 176. - #91

Merged
jackfperryjr merged 1 commit into
mainfrom
features-176
Aug 12, 2026
Merged

Feature set 176.#91
jackfperryjr merged 1 commit into
mainfrom
features-176

Conversation

@jackfperryjr

Copy link
Copy Markdown
Owner

Fixes the affinity reader, and brings Final Fantasy II and VIII into Battle Square and Sphere Hunter.

The bug

ParseElementalAffinities took the literal first match for each element. Every other parser in the file iterates and skips what it can't use; this one didn't. Articles repeat each element per release, and the earliest block is routinely the emptiest:

| psp fire = | psp ice =     ← empty, several assignments sharing a line
| psp lightning =
| gba fire = Absorb          ← the actual affinity

Reading the blank and stopping is why Final Fantasy II had one listed weakness across 166 enemies. It now takes the first value that says something, and cleans rather than trims — a field sharing its line with the next assignment isn't blank on the page but carries nothing.

ParseStatNumber was immune all along because its pattern requires digits, which is why II's HP came through fine and only the elements were lost.

Effect, measured across every game: II +65 rows with a weakness, III +1, and 0 everywhere else. 93 cells filled.

Which removes the reason II and VIII were excluded

Neither exclusion was really about the games:

  • VIII states stats as coefficients of a level curve, so there was no number in the wikitext to read. 85 of its 118 enemies now carry what the wiki's own table renders at level 50 (feature set 175).
  • II looked like a bestiary with no elemental play in it. That was this bug — it has 66.

Both now sit at the same median as everywhere else. The guard normalisation from #89 puts them at parity with no tuning at all:

rows phys magic median turns
Final Fantasy II 166 0.50 0.50 7
Final Fantasy VIII 85 0.50 0.50 7
every other game 0.50 0.50 7

Pool 2,961 → 3,212. Battle Square and Sphere Hunter each gain a game; the tower goes from 11 floors to 13. Twenty more characters reach the roster — II's 9 and VIII's 11, all with art.

What is thinner about them

VIII lists an ability on 14 of its 85. Since a sphere needs three moves to be draftable and two are granted, that is 14 draftable spheres against a DraftablePerGame of 40. Draftable takes up to forty per game, so a short game simply contributes fewer — no failure, just a shallower shelf. Opponents aren't filtered this way, so all 85 still fight.

This is not new, and VIII is not the worst case. Final Fantasy XV has been in the pool since the start with abilities on 0 of 218 — it contributes nothing draftable to Sphere Hunter at all. I checked whether that was another alias gap: it isn't. FFXV's enemy articles carry libra and break effects but never a movelist. Genuine absence, reported rather than fixed.

One thing I deliberately did not do

The fill is null-only. While measuring it I found the stored elemental data diverges from what the parser reads on 95 rows even before this change — values from the original scraper that neither the old nor the new parse reproduces (FFIV's Skulnant is stored as Fire, Holy where both parses find nothing). That is a pre-existing question about which source to trust, it is not what this fix is about, and overwriting into it blind would bury it. Flagged for its own pass.

Testing

575 tests pass, 2 new. dotnet format --verify-no-changes and the Release build are clean.

Three tests encoded the old exclusions and were rewritten rather than deleted — SkipsTheGamesWithoutPublishedEnemyStats now covers only XI, XIV and XVI, a new IncludesTheGamesWhoseStatsAreNowReadable asserts II and VIII are in, and the tower's floor count moves 11 → 13.

🤖 Generated with Claude Code

ParseElementalAffinities took the literal first match for each element. An article
repeats every element per release and the earliest block is routinely the emptiest:
every Final Fantasy II enemy opens with an unfilled PlayStation Portable set, often
several assignments collapsed onto one line as "| psp fire = | psp ice =", and states
the real affinity further down under the Game Boy Advance tag. Reading the blank and
stopping left the whole game with one listed weakness across 166 enemies.

It now takes the first value that says something, cleaned rather than trimmed — a
field sharing its line with the next assignment is not blank on the page but carries
nothing. That finds 66 weaknesses in II and one more in III, and moves nothing in any
other game.

Which removes the reason both II and VIII were kept out of the battle pool, neither of
which was ever really about the games:

  - VIII states its stats as coefficients of a level curve, so there was no number in
    the wikitext to read. 85 of its 118 enemies now carry what the wiki's own table
    renders at level 50.

  - II looked like a bestiary with no elemental play in it, which was this bug.

Both fight at the same median as everywhere else — the guard normalisation added in
feature set 174 puts them at parity without any tuning. The pool goes from 2,961 to
3,212, Battle Square and Sphere Hunter each gain two games, and 20 more characters
reach the roster.

Neither is as rich as the rest on moves: 14 of VIII's 85 list an ability. That is not
new — Final Fantasy XV has been in the pool from the start with 0 of 218, because its
articles publish a scan entry and break effects but never a movelist.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jackfperryjr
jackfperryjr merged commit caa7853 into main Aug 12, 2026
1 check passed
@jackfperryjr
jackfperryjr deleted the features-176 branch August 12, 2026 00:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant