activity_sdk_lua_contract.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. #include <algorithm>
  2. #include <array>
  3. #include <cstdio>
  4. #include <vector>
  5. #include "../../../middleware/bap/activity_message/auth_schema_catalog.h"
  6. #include "activity_sdk_lua_artifacts_internal.h"
  7. namespace sunrise::client::content::activity::sdk_generation::lua_artifacts::internal {
  8. /** Emits only generated activity identity and panel-data declarations. */
  9. bool render_contract_files(const Source& source, Bundle& output) noexcept {
  10. try {
  11. const Value manifest = object({
  12. {"schema", string("sunrise-activity-sdk-v8")},
  13. {"format_version", number(format::kVersion)},
  14. {"sdk_build_id", string(digest_hex(source.sdkBuildSha256, true))},
  15. {"sdk_payload_sha256", string(digest_hex(source.sdkPayloadSha256, false))},
  16. {"content_key", string(digest_hex(source.contentKeySha256, true))},
  17. {"logical_ir_sha256", string(digest_hex(source.logicalIrSha256, false))},
  18. {"counts",
  19. object({
  20. {"activities", number(source.activities.size())},
  21. {"slots", number(source.slots.size())},
  22. {"states", number(source.states.size())},
  23. {"squads", number(source.squads.size())},
  24. {"authored_scene_resources", number(source.authoredSceneResources.size())},
  25. {"authored_scene_squad_edges", number(source.authoredSceneSquadEdges.size())},
  26. {"task_targets", number(source.taskTargets.size())},
  27. {"dialogue_cue_texts", number(source.dialogueCueTexts.size())},
  28. {"directive_elements", number(source.directiveElements.size())},
  29. {"behavior_programs", number(source.behaviorPrograms.size())},
  30. {"behavior_inputs", number(source.behaviorInputs.size())},
  31. {"behavior_channel_writes", number(source.behaviorChannelWrites.size())},
  32. {"behavior_owners", number(source.behaviorOwners.size())},
  33. {"behavior_activity_bindings", number(source.behaviorActivityBindings.size())},
  34. {"actor_message_schemas", number(source.actorMessageSchemas.size())},
  35. {"actor_command_definitions", number(source.actorCommandDefinitions.size())},
  36. {"actor_behavior_profiles", number(source.actorBehaviorProfiles.size())},
  37. {"simulation_event_definitions", number(source.simulationEventDefinitions.size())},
  38. {"runtime_schemas", number(source.runtimeSchemas.size())},
  39. {"runtime_fields", number(source.runtimeFields.size())},
  40. {"runtime_type_definitions", number(source.runtimeTypeDefinitions.size())},
  41. {"sobject_rsats", number(source.sobjectRsats.size())},
  42. {"sobject_rsat_descriptors", number(source.sobjectRsatDescriptors.size())},
  43. {"entity_type_definitions", number(source.entityTypeDefinitions.size())},
  44. {"sobject_rsat_field_bindings", number(source.sobjectRsatFieldBindings.size())},
  45. {"actor_state_names", number(source.actorStateNames.size())},
  46. })},
  47. });
  48. if (!render_json(manifest, 0, output.manifestJson)) {
  49. return false;
  50. }
  51. output.manifestJson.push_back('\n');
  52. output.activitySdkModule =
  53. R"lua(-- Generated LuaLS declarations and stable SDK enums. Do not edit.
  54. ---@enum SunriseEventKind
  55. local EventKind = {
  56. SENSOR_SENSE_UPDATED = 0,
  57. CLIENT_STATE_CHANGED = 1,
  58. CLIENT_MESSAGE_RECEIVED = 2,
  59. AUTH_STATE_COMMITTED = 3,
  60. AUTH_STATE_TRANSPORT_STAGED = 4,
  61. AUTH_STATE_CANCELED = 5,
  62. INCIDENT_RECEIVED = 6,
  63. INCIDENT_QUEUED = 7,
  64. INCIDENT_TRANSPORT_STAGED = 8,
  65. INCIDENT_CANCELED = 9,
  66. INCIDENT_REFUSED = 10,
  67. SCRIPTABLE_OVERRIDE_COMMITTED = 11,
  68. SCRIPTABLE_OVERRIDE_TRANSPORT_STAGED = 12,
  69. SCRIPTABLE_OVERRIDE_CANCELED = 13,
  70. OPERATOR_REFUSED = 14,
  71. TIMER_ELAPSED = 15,
  72. EFFECT_RESULT = 16,
  73. PHASE_ENTERED = 17,
  74. TRIGGER_ENTERED = 18,
  75. TRIGGER_EXITED = 19,
  76. SQUAD_STATE = 20,
  77. ENTITY_SPAWNED = 21,
  78. ENTITY_DIED = 22,
  79. SCENE_FINISHED = 23,
  80. OBJECTIVE_PROGRESS = 24,
  81. ENTITY_SLOTS_REQUESTED = 25,
  82. SESSION_JOINED = 26,
  83. SESSION_LEFT = 27,
  84. PLAYER_TRIGGER = 28,
  85. CINEMATIC_STARTED = 29,
  86. CINEMATIC_TERMINATED = 30,
  87. ACTOR_PATH_STATE = 31,
  88. GHOST_LINK_STATE = 32,
  89. OBJECT_INTERACTED = 33,
  90. CINEMATIC_SKIP_REQUESTED = 34,
  91. FIRETEAM_STATE = 35,
  92. OBJECT_STATE = 36,
  93. DAMAGE_STATE = 37,
  94. }
  95. ---@class SunriseEvent
  96. ---@field kind SunriseEventKind
  97. ---@field sequence string
  98. ---@field source_generation string
  99. ---@alias SunriseEventHandler fun(context: any, state: SunriseState, event: SunriseEvent)
  100. ---@class SunrisePlayerTriggerEvent: SunriseEvent
  101. ---@field registry_key integer
  102. ---@field object_tag integer
  103. ---@field slot_type integer
  104. ---@field slot_index integer
  105. ---@field volume_registry_key integer
  106. ---@field volume_slot_type integer
  107. ---@field volume_slot_index integer
  108. ---@field resolved_object_id integer
  109. ---@class SunriseCinematicEvent: SunriseEvent
  110. ---@field registry_key integer
  111. ---@field object_tag integer
  112. ---@field slot_type integer
  113. ---@field slot_index integer
  114. ---@field runtime_object_id string
  115. ---@field event_value number
  116. ---@class SunriseEntitySlotsRequestedEvent: SunriseEvent
  117. ---@field requested_count integer
  118. ---@class SunriseProgram
  119. ---@field on_start? fun(context: any, state: SunriseState)
  120. ---@field on_load? fun(context: any, state: SunriseState)
  121. ---@field on_event_sensor_sense_updated? SunriseEventHandler
  122. ---@field on_event_client_state_changed? SunriseEventHandler
  123. ---@field on_event_client_message_received? SunriseEventHandler
  124. ---@field on_event_auth_state_committed? SunriseEventHandler
  125. ---@field on_event_auth_state_transport_staged? SunriseEventHandler
  126. ---@field on_event_auth_state_canceled? SunriseEventHandler
  127. ---@field on_event_incident_received? SunriseEventHandler
  128. ---@field on_event_incident_queued? SunriseEventHandler
  129. ---@field on_event_incident_transport_staged? SunriseEventHandler
  130. ---@field on_event_incident_canceled? SunriseEventHandler
  131. ---@field on_event_incident_refused? SunriseEventHandler
  132. ---@field on_event_scriptable_override_committed? SunriseEventHandler
  133. ---@field on_event_scriptable_override_transport_staged? SunriseEventHandler
  134. ---@field on_event_scriptable_override_canceled? SunriseEventHandler
  135. ---@field on_event_operator_refused? SunriseEventHandler
  136. ---@field on_event_timer_elapsed? SunriseEventHandler
  137. ---@field on_event_effect_result? SunriseEventHandler
  138. ---@field on_event_phase_entered? SunriseEventHandler
  139. ---@field on_event_trigger_entered? SunriseEventHandler
  140. ---@field on_event_trigger_exited? SunriseEventHandler
  141. ---@field on_event_squad_state? SunriseEventHandler
  142. ---@field on_event_entity_spawned? fun(context: any, state: SunriseState, event: SunriseEvent)
  143. ---@field on_event_entity_died? fun(context: any, state: SunriseState, event: SunriseEvent)
  144. ---@field on_event_scene_finished? fun(context: any, state: SunriseState, event: SunriseEvent)
  145. ---@field on_event_objective_progress? fun(context: any, state: SunriseState, event: SunriseEvent)
  146. ---@field on_event_entity_slots_requested? fun(context: any, state: SunriseState, )lua"
  147. R"lua(event: SunriseEntitySlotsRequestedEvent)
  148. ---@field on_event_session_joined? fun(context: any, state: SunriseState, event: SunriseEvent)
  149. ---@field on_event_session_left? fun(context: any, state: SunriseState, event: SunriseEvent)
  150. ---@field on_event_player_trigger? fun(context: any, state: SunriseState, )lua"
  151. R"lua(event: SunrisePlayerTriggerEvent)
  152. ---@field on_event_cinematic_started? fun(context: any, state: SunriseState, )lua"
  153. R"lua(event: SunriseCinematicEvent)
  154. ---@field on_event_cinematic_terminated? fun(context: any, state: SunriseState, )lua"
  155. R"lua(event: SunriseCinematicEvent)
  156. ---@field on_event_actor_path_state? SunriseEventHandler
  157. ---@field on_event_ghost_link_state? SunriseEventHandler
  158. ---@field on_event_object_interacted? SunriseEventHandler
  159. ---@field on_event_fireteam_state? SunriseEventHandler
  160. ---@field on_event_object_state? SunriseEventHandler
  161. ---@field on_event_damage_state? SunriseEventHandler
  162. ---@field on_event_cinematic_skip_requested? fun(context: any, state: SunriseState, event: SunriseCinematicEvent)
  163. ---@class SunriseVector3
  164. ---@field x number
  165. ---@field y number
  166. ---@field z number
  167. ---@class SunriseSlot
  168. ---@field id string
  169. ---@field name string
  170. ---@field index integer
  171. ---@field type integer
  172. ---@field component_class integer
  173. ---@field sense_schema integer
  174. ---@field auth_schema integer
  175. ---@field auth_type string|nil
  176. ---@field auth_min_bits integer|nil
  177. ---@field auth_max_bits integer|nil
  178. ---@field auth_component_offset integer|nil
  179. ---@field auth_dynamic boolean|nil
  180. ---@field auth_writable boolean|nil
  181. ---@field set_object_active fun(SunriseSlot, SunriseObjectArguments?): SunriseRequestKey
  182. ---@field assign_combat_objective fun(self: SunriseSlot, args: {objective: SunriseSlot, revision: integer, task_group: integer, reserved: boolean?}): SunriseRequestKey
  183. ---@field play_actor_path fun(self: SunriseSlot, args: {generation: integer, revision: integer, path: SunriseSlot}): SunriseRequestKey
  184. ---@field deliver_squads fun(self: SunriseSlot, args: {generation: integer, revision: integer, squads: SunriseSlot[]}): SunriseRequestKey
  185. ---@field deliver_squad fun(self: SunriseSlot, args: {generation: integer, revision: integer, squad: SunriseSlot}): SunriseRequestKey
  186. ---@field play_actor_action fun(self: SunriseSlot, args: {generation: integer, revision: integer, group: integer, action: integer}): SunriseRequestKey
  187. ---@field retire_actor fun(self: SunriseSlot, args: {generation: integer}): SunriseRequestKey
  188. ---@field set_darkness_zone fun(self: SunriseSlot, args: {enabled: boolean, wipe_seconds: integer?}): SunriseRequestKey
  189. ---@field set_interactable_object fun(self: SunriseSlot, args: {generation: integer, track_owner: boolean?, active: boolean?}): SunriseRequestKey
  190. ---@field set_music_section fun(self: SunriseSlot, args: {section: integer, enabled: boolean?}): SunriseRequestKey
  191. ---@field watch_damage fun(self: SunriseSlot, args: {target: SunriseSlot, revision: integer}): SunriseRequestKey
  192. ---@field set_object_filter fun(self: SunriseSlot, args: {players: boolean?, target: SunriseSlot?, inside: SunriseSlot?, inside_any: SunriseSlot[]?}): SunriseRequestKey
  193. ---@field set_mission_effect fun(self: SunriseSlot, args: {filter: SunriseSlot?, enabled: boolean, revision: integer}): SunriseRequestKey
  194. ---@field set_ghost_link fun(self: SunriseSlot, args: {generation: integer, enabled: boolean}): SunriseRequestKey
  195. ---@field bind_combatant_to_squad fun(self: SunriseSlot): SunriseRequestKey
  196. ---@field transition fun(SunriseSlot, SunriseDeviceTransitionArguments): SunriseRequestKey
  197. ---@field fire_trigger fun(self: SunriseSlot): SunriseRequestKey
  198. ---@field play_sequence fun(self: SunriseSlot): SunriseRequestKey
  199. ---@field set_cinematic_active fun(SunriseSlot, SunriseCinematicArguments?): SunriseRequestKey
  200. ---@field reset_objectives fun(self: SunriseSlot): SunriseRequestKey
  201. ---@field advance_task fun(self: SunriseSlot): SunriseRequestKey
  202. ---@field play_dialogue_cue fun(SunriseSlot, SunriseDialogueCueArguments): SunriseRequestKey
  203. ---@field set_directive fun(SunriseSlot, SunriseDirectiveArguments): SunriseRequestKey
  204. ---@field clear_directives fun(self: SunriseSlot): SunriseRequestKey
  205. ---@field set_engagement_state fun(SunriseSlot, SunriseEngagementArguments): SunriseRequestKey
  206. ---@field set_public_event_state fun(SunriseSlot, SunrisePublicEventArguments): SunriseRequestKey
  207. ---@class SunriseRequestKey
  208. ---@class SunriseCinematicArguments
  209. ---@field active? boolean
  210. ---@class SunriseObjectArguments
  211. ---@field active? boolean
  212. ---@class SunriseDialogueCueArguments
  213. ---@field cue integer
  214. ---@class SunriseDeviceTransitionArguments
  215. ---@field transition any Generated device transition value.
  216. ---@class SunriseDirectiveArguments
  217. ---@field directive table Generated mission directive declaration.
  218. ---@field state? integer Defaults to 0, the native enter state.
  219. ---@field audience? SunriseSlot Authored type-70 engagement sensor for the mission banner.
  220. ---@field navpoint? SunriseSlot Authored type-47 navigation marker.
  221. ---@class SunriseEngagementArguments
  222. ---@field flags? integer Five native flag bits; the shipped constructor default is 1.
  223. ---@field revision? integer Signed Sense-list revision; the shipped constructor default is 1.
  224. ---@class SunrisePublicEventArguments
  225. ---@field state? integer Shown unchanged by the HUD directive that names this sensor. Defaults to 0.
  226. ---@field player? string Decimal player key of the watched player. Defaults to context.player_key.
  227. ---@field area SunriseSlot The object whose zone list bounds the event area.
  228. ---@field leave_seconds number Seconds outside that area before the client reports Sense 1.
  229. ---@class SunriseState
  230. ---@field id string
  231. ---@field ordinal integer
  232. ---@field slice_set_index integer Authored package slice-set base.
  233. ---@field region_index integer Effective membership region for this state ordinal.
  234. ---@field hash integer
  235. ---@field value integer
  236. ---@class SunriseSquadAnchor: SunriseVector3
  237. ---@field point integer
  238. ---@class SunriseSquadMember
  239. ---@field actor_class integer|nil
  240. ---@field behavior_config integer|nil
  241. ---@field default_faction integer|nil
  242. ---@class SunriseSquad
  243. ---@field id string
  244. ---@field slot integer
  245. ---@field spawner_config integer
  246. ---@field spawn_rule_config integer
  247. ---@field members SunriseSquadMember[]
  248. ---@field anchors SunriseSquadAnchor[]
  249. ---@class SunriseScene
  250. ---@field id string
  251. ---@field slot integer
  252. ---@field config_tag integer
  253. ---@field resource_tag integer
  254. ---@class SunriseTaskTarget
  255. ---@field id string
  256. ---@field task_slot integer
  257. ---@field objective_slot integer
  258. ---@field objective_bit integer
  259. ---@field config_tag integer
  260. ---@class SunriseTriggerVolume
  261. ---@field names string[]
  262. ---@field registry_key integer
  263. ---@field slot_type integer
  264. ---@field slot_index integer
  265. ---@field position SunriseVector3
  266. ---@field minimum SunriseVector3
  267. ---@field maximum SunriseVector3
  268. ---@field shape_tag integer
  269. ---@field shape_index integer
  270. ---@field active integer
  271. ---@class SunriseMission
  272. ---@field name string
  273. ---@field id string
  274. ---@field tag integer
  275. ---@field states table<string, SunriseState>
  276. ---@field slots table<string, SunriseSlot>
  277. ---@field squads table<string, SunriseSquad>
  278. ---@field scenes table<string, SunriseScene>
  279. ---@field tasks table<string, SunriseTaskTarget>
  280. ---@field trigger_volumes SunriseTriggerVolume[]
  281. ---@field State table<string, integer>
  282. ---@field Slot table<string, string>
  283. ---@field Auth table<string, table<string, string>> Auth slots grouped by their native Auth type.
  284. ---@field Squad table<string, string>
  285. ---@field Scene table<string, string> Exact occurrence-bound authored scene identities.
  286. ---@field Task table<string, string>
  287. ---@field TriggerVolume table<string, SunriseTriggerVolume>
  288. ---@class SunriseActivity
  289. ---@field name string
  290. ---@field display_name string
  291. ---@field id string
  292. ---@field index integer
  293. ---@field definition_hash integer
  294. ---@field activity_root_tag integer
  295. ---@field scenario_tag integer
  296. ---@field matchmaking_config_tag integer
  297. ---@field mission SunriseMission|nil
  298. local sdk = {}
  299. sdk.EventKind = EventKind
  300. sdk.SlotType = {
  301. SQUAD = 1,
  302. SEQUENCE = 5,
  303. CINEMATIC = 6,
  304. DEVICE = 23,
  305. TRIGGER = 31,
  306. TASK = 38,
  307. SCENE = 43,
  308. TRIGGER_VOLUME = 60,
  309. }
  310. return sdk
  311. )lua";
  312. const std::size_t returnOffset = output.activitySdkModule.rfind("return sdk\n");
  313. if (returnOffset == std::string::npos) {
  314. return false;
  315. }
  316. std::string authTypes = "---@class SunriseAuthType\n"
  317. "---@field name string\n"
  318. "---@field slot_type integer\n"
  319. "---@field schema integer\n"
  320. "---@field struct_bytes integer\n"
  321. "---@field min_bits integer\n"
  322. "---@field max_bits integer\n"
  323. "---@field component_offset integer|nil\n"
  324. "---@field dynamic boolean\n"
  325. "---@field writable boolean\n\n"
  326. "---@type table<string, SunriseAuthType>\n"
  327. "sdk.AuthType = {\n";
  328. std::array<char, 320> authLine{};
  329. for (const auto& auth : middleware::bap::activity_message::auth_schema_catalog::kTypes) {
  330. const int written = auth.hasContiguousMirror
  331. ? std::snprintf(authLine.data(),
  332. authLine.size(),
  333. " [\"%.*s\"] = { name = \"%.*s\", "
  334. "slot_type = %u, schema = 0x%08X, "
  335. "struct_bytes = %u, min_bits = %u, "
  336. "max_bits = %u, component_offset = %u, "
  337. "dynamic = %s, writable = %s },\n",
  338. static_cast<int>(auth.name.size()),
  339. auth.name.data(),
  340. static_cast<int>(auth.name.size()),
  341. auth.name.data(),
  342. auth.slotType,
  343. auth.schema,
  344. auth.structBytes,
  345. auth.minimumBits,
  346. auth.maximumBits,
  347. auth.componentOffset,
  348. auth.hasDynamicBody ? "true" : "false",
  349. auth.writable ? "true" : "false")
  350. : std::snprintf(authLine.data(),
  351. authLine.size(),
  352. " [\"%.*s\"] = { name = \"%.*s\", "
  353. "slot_type = %u, schema = 0x%08X, "
  354. "struct_bytes = %u, min_bits = %u, "
  355. "max_bits = %u, component_offset = nil, "
  356. "dynamic = %s, writable = %s },\n",
  357. static_cast<int>(auth.name.size()),
  358. auth.name.data(),
  359. static_cast<int>(auth.name.size()),
  360. auth.name.data(),
  361. auth.slotType,
  362. auth.schema,
  363. auth.structBytes,
  364. auth.minimumBits,
  365. auth.maximumBits,
  366. auth.hasDynamicBody ? "true" : "false",
  367. auth.writable ? "true" : "false");
  368. if (written <= 0 || static_cast<std::size_t>(written) >= authLine.size()) {
  369. return false;
  370. }
  371. authTypes.append(authLine.data(), static_cast<std::size_t>(written));
  372. }
  373. authTypes.append(R"lua(}
  374. ---@class SunriseType2LaneClientRef
  375. ---@field registry_key integer
  376. ---@field slot_type integer
  377. ---@field slot_index integer
  378. sdk.CombatantLanePrimarySchema = {
  379. REF_BYTE = 0x80807F7F,
  380. U32 = 0x80807F7E,
  381. REAL32 = 0x80807F7D,
  382. REF_BYTE_BOOL = 0x80807F7A,
  383. EMPTY = 0x80807F79,
  384. U6 = 0x80807F80,
  385. U32_BOOL = 0x80807F78,
  386. U32_REAL32 = 0x80807F81,
  387. ALTERNATE_REF_BYTE = 0x80807F77,
  388. TRIPLE_U32_REF_MODES = 0x80807F76,
  389. }
  390. sdk.CombatantLaneSecondarySchema = {
  391. EMPTY_A = 0x80807F8B,
  392. EMPTY_B = 0x80807F8A,
  393. QUANTIZED_11 = 0x80807F89,
  394. }
  395. -- Authored behavior-condition classes embedded in package behavior graphs.
  396. sdk.AuthoredBehaviorFilterClass = {
  397. ACTIVITY_FLAG = 0x80804D83,
  398. ACTOR = 0x80804D82,
  399. AIRBORNE = 0x80804D81,
  400. CHANNEL = 0x80804D7D,
  401. HAS_PARENT = 0x80804D80,
  402. DAMAGE_OWNER = 0x80804D7C,
  403. DEAD = 0x80804D7B,
  404. DISTANCE = 0x80804D7A,
  405. FACTION = 0x80804D78,
  406. FACTION_RELATIONSHIP = 0x80804D76,
  407. HOP_ON = 0x80804D75,
  408. LINE_OF_SIGHT = 0x80804D74,
  409. OBJECT_LABEL = 0x80804D73,
  410. OBJECT_TYPE = 0x80804D72,
  411. PLAYER = 0x80804D71,
  412. RESOURCE = 0x80804D5F,
  413. SAME_OBJECT = 0x80802F95,
  414. SCOREBOARD_STAT = 0x80804D5E,
  415. TEAM_SIDE = 0x80804D5D,
  416. COMPOSITE = 0x80809310,
  417. EXTERNAL = 0x8080930F,
  418. }
  419. -- Compact code-34 Auth predicate schemas. These are a separate runtime registry.
  420. sdk.ObjectFilterPredicateSchema = {
  421. MODE_U32_A = 0x80809571,
  422. MODE_U32_B = 0x80809572,
  423. MODE_ONLY_A = 0x80809573,
  424. UNREGISTERED_MODE_SLOT_REF = 0x80809574,
  425. MODE_U32_C = 0x80809575,
  426. MODE_FLAG_SLOT_REF = 0x80809576,
  427. MODE_SLOT_REF_A = 0x80809577,
  428. MODE_SLOT_REF_B = 0x80809578,
  429. MODE_SLOT_REF_C = 0x80809579,
  430. MODE_I32 = 0x8080957A,
  431. MODE_SLOT_REF_D = 0x8080957B,
  432. MODE_U32_D = 0x8080957C,
  433. MODE_ONLY_B = 0x8080957D,
  434. }
  435. ---@class SunriseObjectFilterModeOnly
  436. ---@field mode integer
  437. ---@class SunriseObjectFilterModeU32: SunriseObjectFilterModeOnly
  438. ---@field value integer
  439. ---@class SunriseObjectFilterModeSlotRef: SunriseObjectFilterModeOnly
  440. ---@field reference SunriseType2LaneClientRef
  441. ---@class SunriseObjectFilterModeFlagSlotRef: SunriseObjectFilterModeSlotRef
  442. ---@field flag boolean
  443. )lua");
  444. output.activitySdkModule.insert(returnOffset, authTypes);
  445. output.behaviorModule =
  446. "-- Generated compiled behavior declarations. Do not edit.\n"
  447. "local behavior = {}\n\n"
  448. "behavior.InputSelector = { TARGET_OBJECT = 0, CONTEXT_PRIMARY_OBJECT = 1, "
  449. "CONTEXT_SECONDARY_OBJECT = 2 }\n"
  450. "behavior.InputRole = { ACTION = 1, CONDITION_LEFT = 2, CONDITION_RIGHT = 3 }\n\n"
  451. "behavior.Program = {\n";
  452. std::array<char, 320> line{};
  453. for (const format::BehaviorProgram& row : source.behaviorPrograms) {
  454. const int written = std::snprintf(
  455. line.data(),
  456. line.size(),
  457. " ROOT_%08X = { tag = 0x%08X, first_input = %u, input_count = %u, "
  458. "first_write = %u, write_count = %u, node_count = %u, expression_count = %u },\n",
  459. row.rootTag,
  460. row.rootTag,
  461. row.inputs.first,
  462. row.inputs.count,
  463. row.channelWrites.first,
  464. row.channelWrites.count,
  465. row.nodeCount,
  466. row.expressionCount);
  467. if (written <= 0 || static_cast<std::size_t>(written) >= line.size()) {
  468. return false;
  469. }
  470. output.behaviorModule.append(line.data(), static_cast<std::size_t>(written));
  471. }
  472. output.behaviorModule.append("}\n\nbehavior.Channel = {\n");
  473. std::vector<std::uint32_t> behaviorChannels{};
  474. behaviorChannels.reserve(source.behaviorInputs.size()
  475. + source.behaviorChannelWrites.size());
  476. for (const format::BehaviorInput& row : source.behaviorInputs) {
  477. behaviorChannels.push_back(row.channelHash);
  478. }
  479. for (const format::BehaviorChannelWrite& row : source.behaviorChannelWrites) {
  480. behaviorChannels.push_back(row.channelHash);
  481. }
  482. std::sort(behaviorChannels.begin(), behaviorChannels.end());
  483. behaviorChannels.erase(std::unique(behaviorChannels.begin(), behaviorChannels.end()),
  484. behaviorChannels.end());
  485. for (const std::uint32_t channel : behaviorChannels) {
  486. const int written = std::snprintf(
  487. line.data(), line.size(), " CHANNEL_%08X = 0x%08X,\n", channel, channel);
  488. if (written <= 0 || static_cast<std::size_t>(written) >= line.size()) {
  489. return false;
  490. }
  491. output.behaviorModule.append(line.data(), static_cast<std::size_t>(written));
  492. }
  493. output.behaviorModule.append("}\n\nbehavior.Input = {\n");
  494. for (const format::BehaviorInput& row : source.behaviorInputs) {
  495. const int written =
  496. std::snprintf(line.data(),
  497. line.size(),
  498. " { program = %u, node_offset = 0x%X, expression_offset = 0x%X, "
  499. "channel = behavior.Channel.CHANNEL_%08X, input_or_mode = \"%llu\", "
  500. "native_override = %d, "
  501. "active_field = %u, selector = %u, role = %u },\n",
  502. row.programIndex,
  503. row.nodeOffset,
  504. row.expressionOffset,
  505. row.channelHash,
  506. static_cast<unsigned long long>(row.inputOrMode),
  507. row.nativeOverride,
  508. row.activeField,
  509. static_cast<unsigned int>(row.selector),
  510. static_cast<unsigned int>(row.role));
  511. if (written <= 0 || static_cast<std::size_t>(written) >= line.size()) {
  512. return false;
  513. }
  514. output.behaviorModule.append(line.data(), static_cast<std::size_t>(written));
  515. }
  516. output.behaviorModule.append("}\n\nbehavior.ChannelWrite = {\n");
  517. for (const format::BehaviorChannelWrite& row : source.behaviorChannelWrites) {
  518. const int written = std::snprintf(line.data(),
  519. line.size(),
  520. " { program = %u, node_offset = 0x%X, "
  521. "channel = behavior.Channel.CHANNEL_%08X },\n",
  522. row.programIndex,
  523. row.nodeOffset,
  524. row.channelHash);
  525. if (written <= 0 || static_cast<std::size_t>(written) >= line.size()) {
  526. return false;
  527. }
  528. output.behaviorModule.append(line.data(), static_cast<std::size_t>(written));
  529. }
  530. output.behaviorModule.append("}\n\nbehavior.SubmissionKind = { ACTIVE_NATIVE = 0, PASSIVE "
  531. "= 1, UNRESOLVED = 2 }\n\nbehavior.Owner = {\n");
  532. for (const format::BehaviorOwner& row : source.behaviorOwners) {
  533. const int written =
  534. std::snprintf(line.data(),
  535. line.size(),
  536. " { program = %u, actor_class = %u, config = 0x%08X, "
  537. "config_offset = 0x%X, build = %u, descriptor = %u, subtype = "
  538. "0x%08X, kind = %u },\n",
  539. row.programIndex,
  540. row.actorClassIndex,
  541. row.configTag,
  542. row.configFieldOffset,
  543. row.buildOrdinal,
  544. row.descriptorOrdinal,
  545. row.submitterSubtype,
  546. static_cast<unsigned int>(row.submissionKind));
  547. if (written <= 0 || static_cast<std::size_t>(written) >= line.size()) {
  548. return false;
  549. }
  550. output.behaviorModule.append(line.data(), static_cast<std::size_t>(written));
  551. }
  552. output.behaviorModule.append("}\n\nbehavior.ActivityBinding = {\n");
  553. for (const format::BehaviorActivityBinding& row : source.behaviorActivityBindings) {
  554. const int written = std::snprintf(line.data(),
  555. line.size(),
  556. " { owner = %u, squad = %u, member = %u, scenario "
  557. "= %u, occurrence = %u, state = %u, object = %u },\n",
  558. row.ownerIndex,
  559. row.squadIndex,
  560. row.squadMemberIndex,
  561. row.scenarioIndex,
  562. row.occurrenceIndex,
  563. row.stateIndex,
  564. row.objectIndex);
  565. if (written <= 0 || static_cast<std::size_t>(written) >= line.size()) {
  566. return false;
  567. }
  568. output.behaviorModule.append(line.data(), static_cast<std::size_t>(written));
  569. }
  570. output.behaviorModule.append("}\n\nreturn behavior\n");
  571. return true;
  572. } catch (...) {
  573. output.manifestJson.clear();
  574. output.activitySdkModule.clear();
  575. output.behaviorModule.clear();
  576. return false;
  577. }
  578. }
  579. } // namespace sunrise::client::content::activity::sdk_generation::lua_artifacts::internal