ui: ClassicAPI's GUID player info, no-toggle cast and stable-id skill rank

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
This commit is contained in:
2026-10-23 21:45:42 -06:00
co-authored by Claude Opus 5
parent 801bc09c05
commit de3a3411e7
4 changed files with 218 additions and 1 deletions
@@ -319,6 +319,12 @@ fn allowed_beyond_1_12() -> HashSet<&'static str> {
// `GetQuestLogTitle` answers the title and never the id, so neither the id nor a chat
// link for a log row is derivable from the stock API. The id agrees with
// `C_QuestLog.GetQuestIDForLogIndex`, which ClassicAPI publishes over the same rows.
// ClassicAPI's `GetPlayerInfoByGUID(guid)` and `CastSpellNoToggle(spellId)`
// (script/compat/classic_api/unit.rs). 1.12 has no verb that takes a GUID at all, and no
// cast path that skips its own toggle — benilla's queue does not toggle, so the second is
// the plain cast by id, the same reasoning nampower's `CastSpellNoQueue` carries.
"CastSpellNoToggle",
"GetPlayerInfoByGUID",
"GetQuestIDForLogIndex",
"GetQuestLinkForLogIndex",
"CancelPlayerAuraSlot",