package gameplay // // Character-owned capability buffs that unlock stock client modules. // Ownership source: UrbanBadgeConfig.json (ConfigDump_v3) — rows that set both // Buff[] and a non-zero FightspiritId. Of the 109 controllable spirits only 9 // own anything; see _role_capability_scan.txt for the full list. // Everything else in that table is either a numeric passive (damage/HP/driving modifiers), // a skill variant, or an OnlyServer progress marker — none of them add exploration // verbs, so they are deliberately not published here. // Keep this list small: BuffConfig (4123 rows) also contains executable NPC, boss and // timeline actions that must never be published as player unlocks. // type CharacterCapabilities struct { // // Hacker capability set, "safe" shape — the proven round-1 baseline (2026-09-20, // "middle-mouse entry visible but grey"). Kept selectable because the round-1 experiments // showed the middle-mouse GadgetManager entry can disappear on wider sets; switching // gameplay.hackerAbilitySet back to "safe" restores this exact shape without a rebuild. // Observed behaviour per set (all measured on the real client, Seymour 15021023): // | set | middle-mouse hack entry | // |---------------------------------------|-------------------------| // | 33/167/168 (this one, no battery) | visible but grey | // | 33/167/168 + 49/50 | gone | // | donor's 9 (33/134/135/137/161/167/168/178/179) | gone | // | donor's 9 + 52899024 | gone | // HackerBuffsSafe []uint32 `json:"hackerBuffsSafe"` // // Hacker capability set, "full" shape — everything job 401 can own (2026-09-20 explicit // request: unlock ALL of Seymour's hacker abilities, drone and spider included). // Layout (BuffConfig names, cross-checked against donor_7k + ConfigDump_v3): // · 52606133 黑客骇入能力总开关 — global gate, same as safe. // · 52606134/135/137/161 — atmosphere-NPC hack actions (distract / rebel / press). // · 52606167/168 — traffic-vehicle hacking + its rush skill. // · 52606178/179 — HackerConfig.HackNPCAbilityBuff[6..7] (EnemyDistract / EnemyRebel); // the ordinary-NPC flags alone yield an empty enemy menu, so these ship together. // · 52606149 蜘蛛机器人 / 52606150 黑客无人机 — the two EonBug-app skill entries. // ⛑️ NOT in donor_7k. They are what makes the spider/drone menu items cast // (HackScriptFunc.SpiderSkill/DroneSkill → UseSkillByPid 51938181/51938183); the same // two skills are authored on Seymour's own FightSpiritConfig row as TempSkill, so the // battle pipeline accepts them (IsKnownSkill covers SkillConfig). // Known risk from round 1: publishing 49/50 coincided with the middle-mouse entry // disappearing. The EonBug APP path (HackerAppPanelStore) does not consult these buffs // at all, so if that regression shows up again the app still works — flip // hackerAbilitySet to "safe" and the trio comes back. // HackerBuffsFull []uint32 `json:"hackerBuffsFull"` // // Talent-tree ability buffs (see gameplay.hackerTalentBuffIds). Configurable rather than // authored here because they are not yet a proven shape — T1-6 only lands the C2S round-trip, // so publishing them here is the flat replacement, not an actual talent grant. // TalentBuffIds []uint32 `json:"talentBuffIds"` // How many talent buffs actually landed, for the publish log. TalentBuffCount int32 `json:"talentBuffCount"` // // Character-independent capability buffs: the diving suit when gameplay.divingMode is // "on", plus the Cat Express support buffs (gameplay.deliverySupportBuffIds). // The courier half is here for one reason: RefreshCallFunctionListView filters a support // button out unless the player carries its UberSimOrderSupportConfig.UnlockBuff // (52800660 叫车 / 52800661 无人机). Publishing them with the regular spirit buff snapshot means // they are present in the app and re-published on every character switch — no dedicated S2C. // Set the list to [] to restore the pre-2026-09-24 buff snapshot byte-for-byte. // GlobalCapabilityBuffIds []uint32 `json:"globalCapabilityBuffIds"` } const ( CharacterCapabilities_HackerUrbanJob uint32 = 401 CharacterCapabilities_JoblessUrbanJob uint32 = 100 CharacterCapabilities_DilaSpiritId uint32 = 15_020_997 CharacterCapabilities_BaiJingSpiritId uint32 = 15_021_039 CharacterCapabilities_BaiJingTimeScaleGateBuff uint32 = 52_959_495 CharacterCapabilities_BaiJingTimeScaleActiveBuff uint32 = 52_959_496 CharacterCapabilities_BaiJingCabDriverBadgeBuff uint32 = 52_606_175 CharacterCapabilities_DilaFloatFlightBuff uint32 = 52_606_125 CharacterCapabilities_HackerBatteryCapacity uint32 = 6 CharacterCapabilities_DivingSuitBuff uint32 = 52_606_233 )