feat(fifa17): project badges and stadiums, the other two cardtype-7 club items

Kit, badge and stadium are ONE record with ONE client-side resolver
(`FUN_180119bd0`, dispatched on `item+0x4c == 7`); they differ only in the field
their caption reads. Kits already ship and render, so the record is live-proven
— badges and stadiums were being withheld as if unreversed when the authority
(`plan-2026-08-06-card-subsystem.md`) marks both CONFIRMED, and its own rollout
order is "kits first, then badges, then stadia".

So the shaper generalises to the family, and carries exactly what each caption
resolves: `teamid` for kit and badge (`TeamName_Abbr15_<teamid>`), withheld for
stadium, whose resolver reads `StadiumName_<assetId>` and never looks at teamid.
Sending a field the resolver does not read is how this project earned a client
freeze.

Ball (30) and league logo (31) stay withheld. They are cardtype 9 with NO
database name resolver, so their name can only come from `localizedName`: the
offset is confirmed, but "the parser reads it" is not "sending it is safe".

Verified against the real club on staging: badge 6000005 emits cardsubtypeid 11
/ cardassetid 39 / teamid 21, stadium 6200000 emits cardsubtypeid 10 /
cardassetid 36 and no teamid, ball and logo emit nothing.
This commit is contained in:
funman300
2026-08-21 20:45:29 +00:00
parent 7a4dab04d2
commit 9823bdac78
5 changed files with 217 additions and 37 deletions
+3 -1
View File
@@ -1802,7 +1802,9 @@ impl ItemIdentityResolver for Fifa17IdentityResolver {
fn resolve_kit(&self, item: &CoreOwnedItem) -> Option<Fifa17KitIdentity> {
let ident = self.catalog.lookup(&item.card_id)?;
if ident.kind != ContentKind::Kit {
// The whole cardtype-7 club family shares this record: kit, stadium and
// badge differ only in which field their caption resolves.
if !ident.kind.is_cardtype7_club_item() {
return None;
}
Some(Fifa17KitIdentity {