@crowdedkingdoms/crowdyjs 17.14.0-dev.1 → 18.0.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/MIGRATION.md +92 -1
  2. package/README.md +93 -162
  3. package/dist/crowdy-client.d.ts +12 -31
  4. package/dist/crowdy-client.d.ts.map +1 -1
  5. package/dist/crowdy-client.js +15 -37
  6. package/dist/crowdy-dsh/bridge.d.ts.map +1 -1
  7. package/dist/crowdy-dsh/bridge.js +3 -6
  8. package/dist/crowdy-studio/controller.d.ts +34 -59
  9. package/dist/crowdy-studio/controller.d.ts.map +1 -1
  10. package/dist/crowdy-studio/controller.js +96 -225
  11. package/dist/crowdy-studio/diagnostics.d.ts +3 -12
  12. package/dist/crowdy-studio/diagnostics.d.ts.map +1 -1
  13. package/dist/crowdy-studio/dom-shell.d.ts +2 -4
  14. package/dist/crowdy-studio/dom-shell.d.ts.map +1 -1
  15. package/dist/crowdy-studio/dom-shell.js +16 -49
  16. package/dist/crowdy-studio/embed/hud-layer.d.ts +1 -2
  17. package/dist/crowdy-studio/embed/hud-layer.d.ts.map +1 -1
  18. package/dist/crowdy-studio/embed/panel.d.ts +3 -13
  19. package/dist/crowdy-studio/embed/panel.d.ts.map +1 -1
  20. package/dist/crowdy-studio/embed/panel.js +3 -6
  21. package/dist/crowdy-studio/index.d.ts +1 -3
  22. package/dist/crowdy-studio/index.d.ts.map +1 -1
  23. package/dist/crowdy-studio/index.js +0 -2
  24. package/dist/crowdy-studio/models.d.ts +3 -4
  25. package/dist/crowdy-studio/models.d.ts.map +1 -1
  26. package/dist/crowdy-studio/starter-projects.d.ts +8 -12
  27. package/dist/crowdy-studio/starter-projects.d.ts.map +1 -1
  28. package/dist/crowdy-studio/starter-projects.js +12 -103
  29. package/dist/domains/appAccess.d.ts +14 -1
  30. package/dist/domains/appAccess.d.ts.map +1 -1
  31. package/dist/domains/appAccess.js +37 -1
  32. package/dist/domains/host.d.ts +3 -3
  33. package/dist/domains/host.js +3 -3
  34. package/dist/domains/marketplace.d.ts +9 -70
  35. package/dist/domains/marketplace.d.ts.map +1 -1
  36. package/dist/domains/marketplace.js +9 -120
  37. package/dist/domains/playerWallet.d.ts +6 -12
  38. package/dist/domains/playerWallet.d.ts.map +1 -1
  39. package/dist/domains/playerWallet.js +6 -21
  40. package/dist/errors.d.ts +7 -13
  41. package/dist/errors.d.ts.map +1 -1
  42. package/dist/errors.js +6 -10
  43. package/dist/generated/graphql.d.ts +141 -7083
  44. package/dist/generated/graphql.d.ts.map +1 -1
  45. package/dist/generated/graphql.js +5 -313
  46. package/dist/grid-mods/exec-client-halves.d.ts +19 -3
  47. package/dist/grid-mods/exec-client-halves.d.ts.map +1 -1
  48. package/dist/grid-mods/exec-client-halves.js +17 -2
  49. package/dist/grid-mods/grid-host-calls.d.ts +29 -17
  50. package/dist/grid-mods/grid-host-calls.d.ts.map +1 -1
  51. package/dist/grid-mods/grid-host-calls.js +40 -46
  52. package/dist/grid-mods/mod-runtime.d.ts +18 -11
  53. package/dist/grid-mods/mod-runtime.d.ts.map +1 -1
  54. package/dist/grid-mods/mod-runtime.js +4 -2
  55. package/dist/grid-scope.d.ts +0 -189
  56. package/dist/grid-scope.d.ts.map +1 -1
  57. package/dist/grid-scope.js +0 -70
  58. package/dist/index.d.ts +11 -17
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +10 -16
  61. package/dist/kit/actions.d.ts +5 -9
  62. package/dist/kit/actions.d.ts.map +1 -1
  63. package/dist/kit/actions.js +5 -9
  64. package/dist/kit/index.d.ts +2 -33
  65. package/dist/kit/index.d.ts.map +1 -1
  66. package/dist/kit/index.js +1 -32
  67. package/dist/kit/kit.d.ts +8 -208
  68. package/dist/kit/kit.d.ts.map +1 -1
  69. package/dist/kit/kit.js +5 -163
  70. package/dist/kit/social.d.ts +1 -3
  71. package/dist/kit/social.d.ts.map +1 -1
  72. package/dist/kit/social.js +1 -3
  73. package/dist/kit/wire.d.ts +16 -5
  74. package/dist/kit/wire.d.ts.map +1 -1
  75. package/dist/kit/wire.js +19 -5
  76. package/dist/live-coding/assets/browser-authoring-index.json +1 -1
  77. package/dist/live-coding/assets/manifest.json +1 -1
  78. package/dist/live-coding/browser-authoring-index.generated.d.ts.map +1 -1
  79. package/dist/live-coding/browser-authoring-index.generated.js +1496 -4386
  80. package/dist/live-coding/rust-analysis.d.ts.map +1 -1
  81. package/dist/live-coding/rust-analysis.js +30 -34
  82. package/dist/player-runtime/client-host-calls.d.ts +8 -0
  83. package/dist/player-runtime/client-host-calls.d.ts.map +1 -0
  84. package/dist/player-runtime/client-host-calls.js +28 -0
  85. package/dist/player-runtime/glue-runtime.d.ts +24 -20
  86. package/dist/player-runtime/glue-runtime.d.ts.map +1 -1
  87. package/dist/player-runtime/glue-runtime.js +26 -55
  88. package/dist/player-runtime/glue-sab.d.ts +2 -2
  89. package/dist/player-runtime/glue-sab.js +2 -2
  90. package/dist/player-runtime/player-code-broker.d.ts +70 -43
  91. package/dist/player-runtime/player-code-broker.d.ts.map +1 -1
  92. package/dist/player-runtime/player-code-broker.js +159 -64
  93. package/dist/player-runtime/player-glue-worker.d.ts +8 -9
  94. package/dist/player-runtime/player-glue-worker.d.ts.map +1 -1
  95. package/dist/player-runtime/player-glue-worker.js +26 -11
  96. package/dist/stores/inbox.d.ts +1 -1
  97. package/dist/stores/inbox.d.ts.map +1 -1
  98. package/dist/stores/index.d.ts +0 -11
  99. package/dist/stores/index.d.ts.map +1 -1
  100. package/dist/stores/index.js +0 -4
  101. package/dist/stores/session.d.ts +0 -2
  102. package/dist/stores/session.d.ts.map +1 -1
  103. package/package.json +1 -1
  104. package/dist/crowdy-studio/model-lint-log.d.ts +0 -76
  105. package/dist/crowdy-studio/model-lint-log.d.ts.map +0 -1
  106. package/dist/crowdy-studio/model-lint-log.js +0 -93
  107. package/dist/crowdy-studio/model-lint.d.ts +0 -61
  108. package/dist/crowdy-studio/model-lint.d.ts.map +0 -1
  109. package/dist/crowdy-studio/model-lint.js +0 -45
  110. package/dist/domains/compute.d.ts +0 -208
  111. package/dist/domains/compute.d.ts.map +0 -1
  112. package/dist/domains/compute.js +0 -274
  113. package/dist/domains/controlPlane.d.ts +0 -38
  114. package/dist/domains/controlPlane.d.ts.map +0 -1
  115. package/dist/domains/controlPlane.js +0 -43
  116. package/dist/domains/gameModel.d.ts +0 -1174
  117. package/dist/domains/gameModel.d.ts.map +0 -1
  118. package/dist/domains/gameModel.js +0 -1333
  119. package/dist/domains/playerCompute.d.ts +0 -91
  120. package/dist/domains/playerCompute.d.ts.map +0 -1
  121. package/dist/domains/playerCompute.js +0 -136
  122. package/dist/domains/playerModel.d.ts +0 -20
  123. package/dist/domains/playerModel.d.ts.map +0 -1
  124. package/dist/domains/playerModel.js +0 -54
  125. package/dist/kit/abilities.d.ts +0 -66
  126. package/dist/kit/abilities.d.ts.map +0 -1
  127. package/dist/kit/abilities.js +0 -71
  128. package/dist/kit/blueprints/combat.d.ts +0 -81
  129. package/dist/kit/blueprints/combat.d.ts.map +0 -1
  130. package/dist/kit/blueprints/combat.js +0 -357
  131. package/dist/kit/blueprints/core.d.ts +0 -222
  132. package/dist/kit/blueprints/core.d.ts.map +0 -1
  133. package/dist/kit/blueprints/core.js +0 -185
  134. package/dist/kit/blueprints/decks.d.ts +0 -50
  135. package/dist/kit/blueprints/decks.d.ts.map +0 -1
  136. package/dist/kit/blueprints/decks.js +0 -163
  137. package/dist/kit/blueprints/economy.d.ts +0 -88
  138. package/dist/kit/blueprints/economy.d.ts.map +0 -1
  139. package/dist/kit/blueprints/economy.js +0 -533
  140. package/dist/kit/blueprints/guild.d.ts +0 -51
  141. package/dist/kit/blueprints/guild.d.ts.map +0 -1
  142. package/dist/kit/blueprints/guild.js +0 -50
  143. package/dist/kit/blueprints/index.d.ts +0 -23
  144. package/dist/kit/blueprints/index.d.ts.map +0 -1
  145. package/dist/kit/blueprints/index.js +0 -22
  146. package/dist/kit/blueprints/inventory.d.ts +0 -84
  147. package/dist/kit/blueprints/inventory.d.ts.map +0 -1
  148. package/dist/kit/blueprints/inventory.js +0 -257
  149. package/dist/kit/blueprints/leaderboards.d.ts +0 -49
  150. package/dist/kit/blueprints/leaderboards.d.ts.map +0 -1
  151. package/dist/kit/blueprints/leaderboards.js +0 -126
  152. package/dist/kit/blueprints/liveops.d.ts +0 -42
  153. package/dist/kit/blueprints/liveops.d.ts.map +0 -1
  154. package/dist/kit/blueprints/liveops.js +0 -170
  155. package/dist/kit/blueprints/locks.d.ts +0 -82
  156. package/dist/kit/blueprints/locks.d.ts.map +0 -1
  157. package/dist/kit/blueprints/locks.js +0 -155
  158. package/dist/kit/blueprints/loot.d.ts +0 -90
  159. package/dist/kit/blueprints/loot.d.ts.map +0 -1
  160. package/dist/kit/blueprints/loot.js +0 -229
  161. package/dist/kit/blueprints/matches.d.ts +0 -84
  162. package/dist/kit/blueprints/matches.d.ts.map +0 -1
  163. package/dist/kit/blueprints/matches.js +0 -349
  164. package/dist/kit/blueprints/moderation.d.ts +0 -32
  165. package/dist/kit/blueprints/moderation.d.ts.map +0 -1
  166. package/dist/kit/blueprints/moderation.js +0 -140
  167. package/dist/kit/blueprints/npcs.d.ts +0 -78
  168. package/dist/kit/blueprints/npcs.d.ts.map +0 -1
  169. package/dist/kit/blueprints/npcs.js +0 -125
  170. package/dist/kit/blueprints/plots.d.ts +0 -63
  171. package/dist/kit/blueprints/plots.d.ts.map +0 -1
  172. package/dist/kit/blueprints/plots.js +0 -151
  173. package/dist/kit/blueprints/progression.d.ts +0 -68
  174. package/dist/kit/blueprints/progression.d.ts.map +0 -1
  175. package/dist/kit/blueprints/progression.js +0 -324
  176. package/dist/kit/blueprints/quests.d.ts +0 -72
  177. package/dist/kit/blueprints/quests.d.ts.map +0 -1
  178. package/dist/kit/blueprints/quests.js +0 -285
  179. package/dist/kit/blueprints/worldsim.d.ts +0 -91
  180. package/dist/kit/blueprints/worldsim.d.ts.map +0 -1
  181. package/dist/kit/blueprints/worldsim.js +0 -468
  182. package/dist/kit/combat.d.ts +0 -141
  183. package/dist/kit/combat.d.ts.map +0 -1
  184. package/dist/kit/combat.js +0 -196
  185. package/dist/kit/decks.d.ts +0 -157
  186. package/dist/kit/decks.d.ts.map +0 -1
  187. package/dist/kit/decks.js +0 -186
  188. package/dist/kit/director.d.ts +0 -88
  189. package/dist/kit/director.d.ts.map +0 -1
  190. package/dist/kit/director.js +0 -86
  191. package/dist/kit/economy.d.ts +0 -289
  192. package/dist/kit/economy.d.ts.map +0 -1
  193. package/dist/kit/economy.js +0 -427
  194. package/dist/kit/engine.d.ts +0 -48
  195. package/dist/kit/engine.d.ts.map +0 -1
  196. package/dist/kit/engine.js +0 -113
  197. package/dist/kit/features.d.ts +0 -60
  198. package/dist/kit/features.d.ts.map +0 -1
  199. package/dist/kit/features.js +0 -65
  200. package/dist/kit/instances.d.ts +0 -52
  201. package/dist/kit/instances.d.ts.map +0 -1
  202. package/dist/kit/instances.js +0 -60
  203. package/dist/kit/inventory.d.ts +0 -129
  204. package/dist/kit/inventory.d.ts.map +0 -1
  205. package/dist/kit/inventory.js +0 -200
  206. package/dist/kit/leaderboards.d.ts +0 -86
  207. package/dist/kit/leaderboards.d.ts.map +0 -1
  208. package/dist/kit/leaderboards.js +0 -133
  209. package/dist/kit/liveops.d.ts +0 -112
  210. package/dist/kit/liveops.d.ts.map +0 -1
  211. package/dist/kit/liveops.js +0 -183
  212. package/dist/kit/loot.d.ts +0 -128
  213. package/dist/kit/loot.d.ts.map +0 -1
  214. package/dist/kit/loot.js +0 -160
  215. package/dist/kit/matches.d.ts +0 -301
  216. package/dist/kit/matches.d.ts.map +0 -1
  217. package/dist/kit/matches.js +0 -458
  218. package/dist/kit/matchmaking.d.ts +0 -57
  219. package/dist/kit/matchmaking.d.ts.map +0 -1
  220. package/dist/kit/matchmaking.js +0 -59
  221. package/dist/kit/minigames.d.ts +0 -30
  222. package/dist/kit/minigames.d.ts.map +0 -1
  223. package/dist/kit/minigames.js +0 -38
  224. package/dist/kit/mobs.d.ts +0 -90
  225. package/dist/kit/mobs.d.ts.map +0 -1
  226. package/dist/kit/mobs.js +0 -98
  227. package/dist/kit/moderation.d.ts +0 -73
  228. package/dist/kit/moderation.d.ts.map +0 -1
  229. package/dist/kit/moderation.js +0 -103
  230. package/dist/kit/movement.d.ts +0 -78
  231. package/dist/kit/movement.d.ts.map +0 -1
  232. package/dist/kit/movement.js +0 -103
  233. package/dist/kit/notifications.d.ts +0 -45
  234. package/dist/kit/notifications.d.ts.map +0 -1
  235. package/dist/kit/notifications.js +0 -67
  236. package/dist/kit/npcs.d.ts +0 -226
  237. package/dist/kit/npcs.d.ts.map +0 -1
  238. package/dist/kit/npcs.js +0 -141
  239. package/dist/kit/objects.d.ts +0 -116
  240. package/dist/kit/objects.d.ts.map +0 -1
  241. package/dist/kit/objects.js +0 -119
  242. package/dist/kit/pets.d.ts +0 -85
  243. package/dist/kit/pets.d.ts.map +0 -1
  244. package/dist/kit/pets.js +0 -96
  245. package/dist/kit/plots.d.ts +0 -85
  246. package/dist/kit/plots.d.ts.map +0 -1
  247. package/dist/kit/plots.js +0 -113
  248. package/dist/kit/progression.d.ts +0 -181
  249. package/dist/kit/progression.d.ts.map +0 -1
  250. package/dist/kit/progression.js +0 -265
  251. package/dist/kit/quests.d.ts +0 -171
  252. package/dist/kit/quests.d.ts.map +0 -1
  253. package/dist/kit/quests.js +0 -237
  254. package/dist/kit/racing.d.ts +0 -85
  255. package/dist/kit/racing.d.ts.map +0 -1
  256. package/dist/kit/racing.js +0 -99
  257. package/dist/kit/shared.d.ts +0 -73
  258. package/dist/kit/shared.d.ts.map +0 -1
  259. package/dist/kit/shared.js +0 -101
  260. package/dist/kit/telemetry.d.ts +0 -66
  261. package/dist/kit/telemetry.d.ts.map +0 -1
  262. package/dist/kit/telemetry.js +0 -133
  263. package/dist/kit/territory.d.ts +0 -97
  264. package/dist/kit/territory.d.ts.map +0 -1
  265. package/dist/kit/territory.js +0 -114
  266. package/dist/kit/worldsim.d.ts +0 -263
  267. package/dist/kit/worldsim.d.ts.map +0 -1
  268. package/dist/kit/worldsim.js +0 -268
  269. package/dist/stores/model.d.ts +0 -81
  270. package/dist/stores/model.d.ts.map +0 -1
  271. package/dist/stores/model.js +0 -163
@@ -1,357 +0,0 @@
1
- import { kitPolicyJson, ownerMirrorProperty, toSnakeCase, } from './core.js';
2
- /** Compute the type/function names a combat blueprint (and its runtime helper) uses. */
3
- export function combatNames(typePrefix = '') {
4
- const fnPrefix = typePrefix ? `${toSnakeCase(typePrefix)}_` : '';
5
- return {
6
- combatantType: `${typePrefix}Combatant`,
7
- effectType: `${typePrefix}StatusEffect`,
8
- attackFn: `${fnPrefix}attack`,
9
- applyEffectFn: `${fnPrefix}apply_effect`,
10
- effectTickFn: `${fnPrefix}effect_tick`,
11
- respawnFn: `${fnPrefix}respawn`,
12
- reviveFn: `${fnPrefix}revive`,
13
- syncFn: `${fnPrefix}sync_combatant`,
14
- effectTickAutomation: `${fnPrefix.replace(/_/g, '-')}effect-tick`,
15
- };
16
- }
17
- /**
18
- * Blueprint for **server-authoritative combat** (the turn-based / MMO-durable
19
- * tier): `Combatant` containers (hp / attack / defense / alive), an `attack`
20
- * function whose damage formula and death flip run entirely server-side,
21
- * status effects as `StatusEffect` containers ticked by an interval
22
- * automation (damage-over-time between requests), and respawn/revive.
23
- *
24
- * The effect tick runs only while the app has a player in it (2026-09-01), which
25
- * for combat is usually what you want: nothing is fighting in an empty world.
26
- * Store an expiry timestamp on each effect rather than a remaining-ticks counter,
27
- * so an effect that should have lapsed while the app was empty is treated as
28
- * lapsed on the next tick instead of resuming with time left on it.
29
- *
30
- * The effect tick uses the selector **join** pattern: each combatant carries
31
- * a unique `combat_key`, effects record a `target_key`, and the automation's
32
- * selector binds the matching combatant as a `$target` ref param
33
- * (`where combat_key == self.target_key`) — automations cannot follow
34
- * property refs directly.
35
- *
36
- * For fast-twitch combat keep the per-frame simulation on the replication
37
- * plane under host authority and set `hostSynced: true` to get the
38
- * `is_host`-gated durable sync function.
39
- *
40
- * Runtime counterpart: `client.kit(appId).combat`.
41
- */
42
- export function combatBlueprint(options = {}) {
43
- const { typePrefix = '', turnBased = false, hostSynced = false, effectTickIntervalMs = 5000, combatantInstantiableBy = 'member', reviveGroup, ownerIdKind: kind = 'int', } = options;
44
- const names = combatNames(typePrefix);
45
- const actorPolicy = (condition) => {
46
- const rules = [
47
- { type: 'owner_of_self' },
48
- ...(turnBased ? [{ type: 'is_current_turn' }] : []),
49
- { type: 'condition', expression: condition },
50
- ];
51
- return kitPolicyJson({ type: 'and', rules });
52
- };
53
- const propertyDefinitions = [
54
- ownerMirrorProperty(names.combatantType, kind),
55
- {
56
- containerTypeName: names.combatantType,
57
- key: 'combat_key',
58
- valueType: 'string',
59
- defaultValueJson: '""',
60
- description: 'Unique join key the status-effect automation selector matches against effect target_key.',
61
- },
62
- {
63
- containerTypeName: names.combatantType,
64
- key: 'hp',
65
- valueType: 'int',
66
- defaultValueJson: '100',
67
- description: 'Current hit points (never below 0).',
68
- },
69
- {
70
- containerTypeName: names.combatantType,
71
- key: 'max_hp',
72
- valueType: 'int',
73
- defaultValueJson: '100',
74
- description: 'Hit point ceiling (respawn/heal target).',
75
- },
76
- {
77
- containerTypeName: names.combatantType,
78
- key: 'attack',
79
- valueType: 'int',
80
- defaultValueJson: '10',
81
- description: 'Attack stat fed into the damage formula.',
82
- },
83
- {
84
- containerTypeName: names.combatantType,
85
- key: 'defense',
86
- valueType: 'int',
87
- defaultValueJson: '0',
88
- description: 'Damage reduction stat.',
89
- },
90
- {
91
- containerTypeName: names.combatantType,
92
- key: 'alive',
93
- valueType: 'bool',
94
- defaultValueJson: 'true',
95
- description: 'Flipped server-side when hp reaches 0.',
96
- },
97
- {
98
- containerTypeName: names.combatantType,
99
- key: 'respawn_x',
100
- valueType: 'float',
101
- defaultValueJson: '0',
102
- description: 'Respawn anchor (informational; movement is the replication plane).',
103
- },
104
- {
105
- containerTypeName: names.combatantType,
106
- key: 'respawn_y',
107
- valueType: 'float',
108
- defaultValueJson: '0',
109
- description: 'Respawn anchor.',
110
- },
111
- {
112
- containerTypeName: names.combatantType,
113
- key: 'respawn_z',
114
- valueType: 'float',
115
- defaultValueJson: '0',
116
- description: 'Respawn anchor.',
117
- },
118
- ownerMirrorProperty(names.effectType, kind),
119
- {
120
- containerTypeName: names.effectType,
121
- key: 'effect_id',
122
- valueType: 'string',
123
- defaultValueJson: '""',
124
- description: "Effect identifier (e.g. 'poison', 'burn').",
125
- },
126
- {
127
- containerTypeName: names.effectType,
128
- key: 'target_key',
129
- valueType: 'string',
130
- defaultValueJson: '""',
131
- description: "The target combatant's combat_key (selector join key).",
132
- },
133
- {
134
- containerTypeName: names.effectType,
135
- key: 'magnitude',
136
- valueType: 'int',
137
- defaultValueJson: '0',
138
- description: 'Damage applied per tick.',
139
- },
140
- {
141
- containerTypeName: names.effectType,
142
- key: 'ticks_left',
143
- valueType: 'int',
144
- defaultValueJson: '0',
145
- description: 'Remaining ticks; the automation only selects effects above 0.',
146
- },
147
- ];
148
- const functions = [
149
- {
150
- name: names.attackFn,
151
- containerTypeName: names.combatantType,
152
- returnType: 'int',
153
- parameters: [
154
- {
155
- name: 'target_id',
156
- valueType: 'container_ref',
157
- required: true,
158
- description: 'The combatant being attacked.',
159
- },
160
- ],
161
- mutations: [
162
- {
163
- target: 'ref($target_id)',
164
- property: 'hp',
165
- expression: 'max(0, ref($target_id).hp - max(1, self.attack - ref($target_id).defense))',
166
- },
167
- {
168
- target: 'ref($target_id)',
169
- property: 'alive',
170
- expression: 'ref($target_id).hp > 0',
171
- },
172
- ],
173
- returnExpression: 'ref($target_id).hp',
174
- invokePolicyJson: actorPolicy('self.alive && ref($target_id).alive'),
175
- description: 'Attack a target: the damage formula (attack vs defense, min 1) and the death flip run server-side in one transaction.',
176
- },
177
- {
178
- name: names.applyEffectFn,
179
- containerTypeName: names.effectType,
180
- returnType: 'int',
181
- parameters: [
182
- {
183
- name: 'target_key',
184
- valueType: 'string',
185
- required: true,
186
- description: "The target combatant's combat_key.",
187
- },
188
- {
189
- name: 'effect_id',
190
- valueType: 'string',
191
- required: true,
192
- description: 'Effect identifier.',
193
- },
194
- {
195
- name: 'magnitude',
196
- valueType: 'int',
197
- required: true,
198
- description: 'Damage per tick.',
199
- },
200
- {
201
- name: 'ticks',
202
- valueType: 'int',
203
- required: true,
204
- description: 'Number of ticks the effect lasts.',
205
- },
206
- ],
207
- mutations: [
208
- { target: 'self', property: 'effect_id', expression: '$effect_id' },
209
- { target: 'self', property: 'target_key', expression: '$target_key' },
210
- { target: 'self', property: 'magnitude', expression: 'max(0, $magnitude)' },
211
- { target: 'self', property: 'ticks_left', expression: '$ticks' },
212
- ],
213
- returnExpression: 'self.ticks_left',
214
- invokePolicyJson: actorPolicy('$ticks > 0 && self.ticks_left == 0'),
215
- description: 'Arm a status effect against a target combat_key; the interval automation applies it tick by tick.',
216
- },
217
- {
218
- name: names.effectTickFn,
219
- containerTypeName: names.effectType,
220
- returnType: 'int',
221
- parameters: [
222
- {
223
- name: 'target',
224
- valueType: 'container_ref',
225
- required: true,
226
- description: 'The affected combatant — bound by the automation selector join (combat_key == target_key).',
227
- },
228
- ],
229
- mutations: [
230
- {
231
- target: 'ref($target)',
232
- property: 'hp',
233
- expression: 'max(0, ref($target).hp - self.magnitude)',
234
- },
235
- {
236
- target: 'ref($target)',
237
- property: 'alive',
238
- expression: 'ref($target).hp > 0',
239
- },
240
- {
241
- target: 'self',
242
- property: 'ticks_left',
243
- expression: 'self.ticks_left - 1',
244
- },
245
- ],
246
- returnExpression: 'self.ticks_left',
247
- invokePolicyJson: kitPolicyJson({ type: 'is_automation' }),
248
- autonomousInvocable: true,
249
- description: 'Server-driven damage-over-time tick (automation-only): applies magnitude to the joined target and decrements ticks_left.',
250
- },
251
- {
252
- name: names.respawnFn,
253
- containerTypeName: names.combatantType,
254
- returnType: 'int',
255
- mutations: [
256
- { target: 'self', property: 'hp', expression: 'self.max_hp' },
257
- { target: 'self', property: 'alive', expression: 'true' },
258
- ],
259
- returnExpression: 'self.hp',
260
- invokePolicyJson: kitPolicyJson({
261
- type: 'and',
262
- rules: [
263
- { type: 'owner_of_self' },
264
- { type: 'condition', expression: 'not(self.alive)' },
265
- ],
266
- }),
267
- description: 'Respawn your downed combatant at full hp (move the actor to the respawn anchor client-side).',
268
- },
269
- ];
270
- if (reviveGroup) {
271
- functions.push({
272
- name: names.reviveFn,
273
- containerTypeName: names.combatantType,
274
- returnType: 'int',
275
- mutations: [
276
- { target: 'self', property: 'hp', expression: 'self.max_hp' },
277
- { target: 'self', property: 'alive', expression: 'true' },
278
- ],
279
- returnExpression: 'self.hp',
280
- invokePolicyJson: kitPolicyJson({
281
- type: 'and',
282
- rules: [
283
- {
284
- type: 'group_permission',
285
- groupId: reviveGroup.groupId,
286
- ...(reviveGroup.permission !== undefined
287
- ? { permission: reviveGroup.permission }
288
- : {}),
289
- },
290
- { type: 'condition', expression: 'not(self.alive)' },
291
- ],
292
- }),
293
- description: 'Revive any downed combatant (team/group-permission gated).',
294
- });
295
- }
296
- if (hostSynced) {
297
- functions.push({
298
- name: names.syncFn,
299
- containerTypeName: names.combatantType,
300
- returnType: 'int',
301
- parameters: [
302
- {
303
- name: 'hp',
304
- valueType: 'int',
305
- required: true,
306
- description: 'The host-simulated hp to persist (clamped to 0..max_hp).',
307
- },
308
- ],
309
- mutations: [
310
- { target: 'self', property: 'hp', expression: 'clamp($hp, 0, self.max_hp)' },
311
- { target: 'self', property: 'alive', expression: 'self.hp > 0' },
312
- ],
313
- returnExpression: 'self.hp',
314
- invokePolicyJson: kitPolicyJson({ type: 'is_host' }),
315
- description: 'Persist host-simulated combat state (is_host enforced): the fast tier runs on the replication plane, durable hp syncs here at low frequency.',
316
- });
317
- }
318
- const automations = [
319
- {
320
- name: names.effectTickAutomation,
321
- functionName: names.effectTickFn,
322
- targetMode: 'type',
323
- targetTypeName: names.effectType,
324
- triggerType: 'schedule',
325
- scheduleKind: 'interval',
326
- intervalMs: effectTickIntervalMs,
327
- maxTargets: 32,
328
- selectorJson: JSON.stringify({
329
- selfWhere: [{ key: 'ticks_left', op: '>', value: 0 }],
330
- ofType: names.combatantType,
331
- where: [{ key: 'combat_key', op: '==', value: 'self.target_key' }],
332
- bindAs: { ref: 'target' },
333
- }),
334
- description: 'Ticks active status effects: joins each effect to its target combatant and applies damage-over-time.',
335
- },
336
- ];
337
- return {
338
- name: names.combatantType,
339
- containerTypes: [
340
- {
341
- typeName: names.combatantType,
342
- displayName: names.combatantType,
343
- instantiableBy: combatantInstantiableBy,
344
- description: 'A combat participant with server-authoritative hp/stats.',
345
- },
346
- {
347
- typeName: names.effectType,
348
- displayName: names.effectType,
349
- instantiableBy: 'member',
350
- description: 'An armed status effect ticked by the server automation.',
351
- },
352
- ],
353
- propertyDefinitions,
354
- functions,
355
- automations,
356
- };
357
- }
@@ -1,222 +0,0 @@
1
- import type { Scalars, SeedContainerInput, SeedContainerTypeInput, SeedEdgeInput, SeedFunctionInput, SeedGameModelInput, SeedPropertyDefInput, UpsertAutomationInput, UpsertAutomationTriggerInput } from '../../generated/graphql.js';
2
- /**
3
- * A composable invoke-policy rule tree, mirroring the server's authority
4
- * rules (see the Game API "Game Models → Authority" guide). Serialized with
5
- * {@link kitPolicyJson} into the `invokePolicyJson` a function carries.
6
- */
7
- export type KitInvokePolicy = {
8
- type: 'allow';
9
- } | {
10
- type: 'owner_of_self';
11
- } | {
12
- type: 'is_host';
13
- } | {
14
- type: 'is_current_turn';
15
- } | {
16
- type: 'is_participant';
17
- } | {
18
- type: 'is_automation';
19
- } | {
20
- type: 'tier_feature';
21
- feature: string;
22
- } | {
23
- type: 'group_permission';
24
- groupId: string;
25
- permission?: string;
26
- } | {
27
- type: 'grid_permission';
28
- key: string;
29
- gridId?: string;
30
- } | {
31
- type: 'condition';
32
- expression: string;
33
- } | {
34
- type: 'and';
35
- rules: KitInvokePolicy[];
36
- } | {
37
- type: 'or';
38
- rules: KitInvokePolicy[];
39
- } | {
40
- type: 'not';
41
- rule: KitInvokePolicy;
42
- };
43
- /** Serialize a {@link KitInvokePolicy} tree to the wire `invokePolicyJson`. */
44
- export declare function kitPolicyJson(policy: KitInvokePolicy): string;
45
- /**
46
- * A grid-permission filter inside a selector: gates selves/candidates by
47
- * whether the USER behind each container has/lacks an unexpired runtime grid
48
- * permission. Requires a game-api with the permission-read selector support
49
- * (v0.13.12+).
50
- */
51
- export interface SelectorPermissionPredicate {
52
- /** Where the container's user id comes from: its owner, or a property. */
53
- userFrom: 'owner' | {
54
- property: string;
55
- };
56
- op: 'has' | 'lacks';
57
- /** Runtime permission key (e.g. 'access', 'update_voxel_data'). */
58
- key: string;
59
- /** Literal grid id, a property holding one, or omitted for "on ANY grid". */
60
- grid?: number | string | {
61
- property: string;
62
- };
63
- }
64
- /**
65
- * Typed automation selector (serialized into `selectorJson` at deploy).
66
- * Property predicates (`selfWhere`/`where`) filter on model data; permission
67
- * predicates (`selfPermissionWhere`/`candidatePermissionWhere`) filter on the
68
- * live grid ACL. Extra fields pass through untouched.
69
- */
70
- export interface KitSelectorSpec {
71
- selfWhere?: Array<{
72
- key: string;
73
- op: string;
74
- value: unknown;
75
- }>;
76
- selfPermissionWhere?: SelectorPermissionPredicate[];
77
- pick?: 'nearest' | 'lowest' | 'highest' | 'random';
78
- ofType?: string;
79
- where?: Array<{
80
- key: string;
81
- op: string;
82
- value: unknown;
83
- }>;
84
- candidatePermissionWhere?: SelectorPermissionPredicate[];
85
- by?: 'manhattan' | {
86
- property: string;
87
- };
88
- bindAs?: {
89
- ref?: string;
90
- x?: string;
91
- y?: string;
92
- approachX?: string;
93
- approachY?: string;
94
- approachStop?: number;
95
- };
96
- [key: string]: unknown;
97
- }
98
- /** An automation spec inside a blueprint (the `appId` is bound at deploy). */
99
- export type KitAutomationSpec = Omit<UpsertAutomationInput, 'appId'>;
100
- /** An automation event-trigger spec inside a blueprint. */
101
- export type KitAutomationTriggerSpec = Omit<UpsertAutomationTriggerInput, 'appId'>;
102
- /**
103
- * A **blueprint**: a self-contained, declarative bundle of game-model
104
- * definitions (container types, property defs, functions), optional seed
105
- * instances, and optional automations that together implement one game
106
- * concept (an inventory system, a lockable object, an NPC archetype).
107
- *
108
- * Blueprints are plain data — build them with {@link inventoryBlueprint},
109
- * {@link lockBlueprint}, {@link npcBlueprint}, or by hand — then load them
110
- * into an app with `client.kit(appId).deploy([...])` (requires the app-admin
111
- * `manage_apps` permission). Deployment is idempotent: seeding upserts
112
- * definitions and `upsertAutomation` keys on the automation name.
113
- */
114
- export interface KitBlueprint {
115
- /** A short identifier used in error messages (e.g. `'inventory'`). */
116
- name: string;
117
- containerTypes?: SeedContainerTypeInput[];
118
- propertyDefinitions?: SeedPropertyDefInput[];
119
- functions?: SeedFunctionInput[];
120
- /** Optional shared/world containers to seed (catalog data, world objects). */
121
- containers?: SeedContainerInput[];
122
- /** Optional edges between seeded containers (by `tempId`). */
123
- edges?: SeedEdgeInput[];
124
- /** Server-driven automations to upsert after the seed. */
125
- automations?: KitAutomationSpec[];
126
- /** Event triggers to attach to the automations. */
127
- automationTriggers?: KitAutomationTriggerSpec[];
128
- }
129
- /** Convert `PascalCase`/`camelCase` to `snake_case` for derived names. */
130
- export declare function toSnakeCase(name: string): string;
131
- /** The wire payloads {@link mergeBlueprints} produces for one deployment. */
132
- export interface MergedBlueprints {
133
- seedInput: SeedGameModelInput;
134
- automations: UpsertAutomationInput[];
135
- automationTriggers: UpsertAutomationTriggerInput[];
136
- }
137
- /**
138
- * Merge blueprints into a single `gameModelSeed` payload plus the automation
139
- * upserts, rejecting duplicate type, property, function, or automation names
140
- * across blueprints (a duplicate almost always means two blueprints need
141
- * distinct prefixes/type names).
142
- */
143
- export declare function mergeBlueprints(appId: Scalars['BigInt']['input'], blueprints: KitBlueprint[], options?: {
144
- sessionId?: string;
145
- }): MergedBlueprints;
146
- /**
147
- * Concatenate several blueprints into ONE composite blueprint (a plain
148
- * client-side merge of the definition arrays — no collision checks; those
149
- * happen in {@link mergeBlueprints} at deploy). Used by composite builders
150
- * such as `guildBlueprint` that bundle other builders' output under a single
151
- * name.
152
- */
153
- export declare function composeBlueprints(name: string, blueprints: KitBlueprint[]): KitBlueprint;
154
- /**
155
- * Who may call a **trusted** mutation (XP grants, score submits, loot rolls,
156
- * currency mints, …) — the kit-standard authority shape mirroring
157
- * `LockAuthority` (Part of the anti-cheat conventions: reward-granting
158
- * functions must never be plain player calls):
159
- *
160
- * - `'server'` — `invokeScope: "server"`: only app admins may invoke (run it
161
- * from trusted studio/backend code holding `manage_apps`).
162
- * - `'host'` — `is_host` policy: the elected host client may invoke.
163
- * - `'automation'` — `autonomousInvocable` + `is_automation` policy: only
164
- * server-driven automations may invoke.
165
- * - `'owner'` — `owner_of_self`: the owning player (only safe for
166
- * self-limiting functions guarded by conditions).
167
- * - `{ custom: rule }` — any hand-written policy rule.
168
- */
169
- export type KitTrustedAuthority = 'server' | 'host' | 'automation' | 'owner' | {
170
- custom: KitInvokePolicy;
171
- };
172
- /**
173
- * The function-level fields a {@link KitTrustedAuthority} compiles to.
174
- * `extraCondition` (when given) is AND'ed into the policy.
175
- */
176
- export declare function trustedAuthorityFields(authority: KitTrustedAuthority, extraCondition?: string): Pick<{
177
- invokePolicyJson: string;
178
- invokeScope?: string;
179
- autonomousInvocable?: boolean;
180
- }, 'invokePolicyJson' | 'invokeScope' | 'autonomousInvocable'>;
181
- /**
182
- * AND extra policy rules into a base policy (skipping empties) — the
183
- * composition point for `policyExtra` options such as
184
- * `plotBlueprint({ buyPolicyExtra: featureGate('land_owner') })`.
185
- */
186
- export declare function andPolicies(base: KitInvokePolicy, ...extra: Array<KitInvokePolicy | undefined>): KitInvokePolicy;
187
- /**
188
- * A `tier_feature` policy leaf: the caller's access tier must hold `feature`
189
- * (defined via `kit.features.define` and granted with
190
- * `kit.features.grantToTier`). Pass it to any builder's `*policyExtra`
191
- * option to monetization-gate that function.
192
- */
193
- export declare function featureGate(feature: string): KitInvokePolicy;
194
- /**
195
- * How kit types mirror their owner's user id into an `owner_user_id`
196
- * property (expressions cannot read container ownership directly).
197
- * The kit standard is `'int'`; set `'string'` on a builder only when
198
- * integrating with models that mirrored the owner as a string (e.g. Blocks
199
- * with Friends) — generated conditions then compare via `to_string(...)`.
200
- */
201
- export type KitOwnerIdKind = 'int' | 'string';
202
- /**
203
- * Expression fragment asserting that `ownerExpr` (an `owner_user_id`-style
204
- * property read) equals a user-id expression (usually the injected
205
- * `$caller_user_id` / `$self_owner_id` system params), honoring
206
- * {@link KitOwnerIdKind}.
207
- */
208
- export declare function ownerEquals(ownerExpr: string, userExpr: string, kind?: KitOwnerIdKind): string;
209
- /**
210
- * Expression fragment asserting that `ownerExpr` (an `owner_user_id`-style
211
- * property read) equals the calling user, honoring {@link KitOwnerIdKind}.
212
- */
213
- export declare function ownerEqualsCaller(ownerExpr: string, kind?: KitOwnerIdKind): string;
214
- /** The `SeedPropertyDefInput` for a kit-standard owner mirror property. */
215
- export declare function ownerMirrorProperty(containerTypeName: string, kind?: KitOwnerIdKind): {
216
- containerTypeName: string;
217
- key: string;
218
- valueType: string;
219
- defaultValueJson: string;
220
- description: string;
221
- };
222
- //# sourceMappingURL=core.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/kit/blueprints/core.ts"],"names":[],"mappings":"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"}