fix(ui): top-left HUD portraits for party members, mercenaries, and summoned minions (1.13c Hireables.cpp parity) #556
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Bug Report: Top-Left HUD Portraits (Party, Mercenary & Summoned Minions)
Symptoms (
play.html)Player #1Portrait in Solo / Unpartied Games: Upon entering a game solo, a top-left portrait box labeledPlayer #1appears at(8, 72)even when unpartied (partyId === 0xffff) or when0x7F(isPlayer === 0) /0x8B/0x5Barrives forselfId.HudManager.rendercalls bothctx.fillText(...)(browser sans-serif) andthis.font.drawText(...)(Diablo II bitmapfont6) at the same coordinates, causing overlapping double text.data/global/ui/Hireables/*.dc6): Top-left portraits draw plain black rectangles instead of the 29 authentic DC6 icons (7 player classes, 4 hirelings, 18 summoned minions fromPetType.txt).0x7A SummonAction/RosterPets) Tracking & Top-Left HUD Display:decode0x7ASummonAction(0x6fb5c720) currently emitstype: "Merc", kind: "assign", overwritingworld.mercinstead of maintaining aRosterPetsmap (0x6fad1840/0x6fad18c0) and rendering grouped/sub-typed summon portraits (icontype 1..3) with count badges.1.13c Binary Ground Truth
D2Client.dllHireables.cpp(0x6fb0ac70..0x6fb0cb50): Top-left portraits (46x41DC6 frames +46x5HP bars),PetType.txticon resolution (baseicon+mclass1..3),icontype=2count badge (0x6fb0add0), and allied party filtering (0x6fb0ba90).D2Client.dllRosterPets.cpp(0x6fad1800..0x6fad1e50) & packet handlers0x7A SummonAction(0x6fb5c720),0x7F AllyPartyInfo(0x6fb5d820),0x81 AssignMerc(0x6fb5eba0).Screenshot Evidence
Resolution & 1.13c Parity Verification Report
Root Cause Resolutions
Phantom
Player #1Portrait Eliminated:decode0x7FPartyMemberState(0x6fb5d820) to preserveisPlayer: isPlayer !== 0. Packets withisPlayer === 0update pet / hireling life inRosterPets(0x6fad1950) rather than inserting nameless phantom players intoClientWorld._party.HudModel.syncPartyRosterto excludeworld.selfIdfromhud.partyMembersandworldPanels.partyMembers.HudManager.renderto only render top-left HUD portraits for allied party members (partyState === "in_party"/partyState === 1/partyId !== 0xffff), keeping unpartied players scoped to thePParty Screen.Garbled Overlapping Text Fixed:
ctx.fillText(...)call beforethis.font.drawText(...)inHudManager.render. Labels now render cleanly once using authentic Diablo IIfont6bitmap typography.Packed 29 Authentic DC6 Portrait Frames (
data/global/ui/Hireables/*.dc6):public/ui/portraits-atlas.png(288x210) with metadata inmanifest.jsonandsrc/common/items/baked-ui-meta.ts:AmazonIcon,SorceressIcon,NecromancerIcon,PaladinIcon,BarbarianIcon,DruidIcon,AssassinIcon).rogueicon,act2hireableicon,act3hireableicon,barbhirable_icon).PetType.txtrows 2..6, 10..16).1.13c Summoned Minions (
RosterPets) Tracking & Top-Left HUD Grouping:decode0x7ASummonAction(0x6fb5c720) withisSummonAction: true, summonAction: action, petType.world.pets(Map<number, RosterPetState>) to track summoned pets without overwritingworld.merc.HudManager.rendergroupsicontype=2multi-summons (Skeletons, Wolves, Ravens) with top-left count badges (0x6fb0add0), selects sub-type icons foricontype=3summons (Golems, Spirits, Vines), and renders life bars perPetType.txtrules (0x6fb0b5e6).Verification
npm run typecheck: 0 errors across all 7 tsconfig projects.tests/client/hud-portrait-roster-pets.test.ts: 7/7 passed.tests/client/hud-server-authority.test.ts: 14/14 passed.tests/e2e-d2gs-online/(Tiers 1..5): all 204 tests passed.tests/skills/(Necromancer, Paladin, Druid): all tests passed.Merged to
mainvia commit9e749a2.