One ability stone in the catalog. Ability stones are their OWN collection —
they never mix with item stones or artifact stones and cannot be socketed
into their sockets.
One derived-copy shape produced by a support: count extra hits at
payload of the ability’s payload. Derived hits are NOT Core events — they
never re-run on_cast, never charge the pet bar and are tagged derived in
their damage payload so no future law/trigger/mastery reader counts them.
One owned ability-stone stack. Upgrades are paid in RAW COPIES of the same
stone (the copies’ own level is irrelevant), so ownership is a per-template
stack, not a bag of instances.
What one UpgradeAllAbilityStones call actually changed: template id ->
(from, to) level. Modelled on UpgradedStonesMap and used the same way —
the client shows its result window from this.
Index of one ability socket, 0..ability_stone_settings.sockets.len().
The socket — not the stone — carries the crate::flip::WorldSide, so the
same stone fits any of the four sockets.