Third DLL tranche, from ClassicAPI's side of the work list. Its 70
corpus-called names are mostly **not** functions — `Clear`, `Fire`,
`Size`, `Armor`, `Nature`, `Normal`, `None` and the rest are widget
methods and enum keys its DLL carries as strings, and several more
(`GetSpellSchool`, `RunMacro`, `GetSpellLink`) the corpus defines for
itself. Reading the call sites left nine genuine gaps; three are landed
here and the rest need state this client does not feed yet.
- `GetPlayerInfoByGUID(guid)` -> `localizedClass, englishClass,
localizedRace, englishRace, sex, name, realm`. 1.12 has no verb that
takes a GUID at all. Answered through the same `Model::unit` as the
whole unit surface, so a raw GUID, a `0x`-prefixed one and every other
token spelling resolve alike; an unknown GUID is seven nils, not a
raise. `realm` is **nil** on purpose: the field means the realm the
*named* character is from, which 1.12 has no concept of, and our own
realm name there would be a guess that reads as data.
- `CastSpellNoToggle(spellId)`: the plain cast by id. The toggle lives in
the client's cast path and benilla's queue toggles nothing — a press is
a send — so this is what the caller asked for, on the same queue a bar
press uses. Same reasoning as nampower's `CastSpellNoQueue`.
- `C_SpellBook.GetSkillLineRank(skillLineID)` -> `rank, maxRank`. 1.12
reaches a skill only by its index into the skills *window*, which moves
as lines are learnt and categories collapse — a `SkillLine.dbc` id is
stable, which is why pfQuest asks by one. It reuses
`skills::displayed_ranks`, so the stable-id getter and
`GetSkillLineInfo` fold bonuses and the mono override identically and
cannot disagree. A line the character has no row for is `nil, nil`, not
`0, 0`: untrained and unknown are different answers.
All nine gates green.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SgstFWtn1RxEJ5kVrpgYwn