Feature set 176. - #91
Merged
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes the affinity reader, and brings Final Fantasy II and VIII into Battle Square and Sphere Hunter.
The bug
ParseElementalAffinitiestook 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: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.
ParseStatNumberwas 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:
Both now sit at the same median as everywhere else. The guard normalisation from #89 puts them at parity with no tuning at all:
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
DraftablePerGameof 40.Draftabletakes 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
libraandbreak effectsbut 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, Holywhere 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-changesand the Release build are clean.Three tests encoded the old exclusions and were rewritten rather than deleted —
SkipsTheGamesWithoutPublishedEnemyStatsnow covers only XI, XIV and XVI, a newIncludesTheGamesWhoseStatsAreNowReadableasserts II and VIII are in, and the tower's floor count moves 11 → 13.🤖 Generated with Claude Code