@almadar/std 1.0.0 → 1.0.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 (40) hide show
  1. package/dist/behaviors/async.d.ts +8 -8
  2. package/dist/behaviors/async.js +548 -500
  3. package/dist/behaviors/async.js.map +1 -1
  4. package/dist/behaviors/data-management.d.ts +11 -19
  5. package/dist/behaviors/data-management.js +468 -449
  6. package/dist/behaviors/data-management.js.map +1 -1
  7. package/dist/behaviors/feedback.d.ts +6 -6
  8. package/dist/behaviors/feedback.js +312 -278
  9. package/dist/behaviors/feedback.js.map +1 -1
  10. package/dist/behaviors/game-core.d.ts +11 -12
  11. package/dist/behaviors/game-core.js +357 -406
  12. package/dist/behaviors/game-core.js.map +1 -1
  13. package/dist/behaviors/game-entity.d.ts +13 -14
  14. package/dist/behaviors/game-entity.js +622 -592
  15. package/dist/behaviors/game-entity.js.map +1 -1
  16. package/dist/behaviors/game-ui.d.ts +9 -10
  17. package/dist/behaviors/game-ui.js +522 -459
  18. package/dist/behaviors/game-ui.js.map +1 -1
  19. package/dist/behaviors/index.d.ts +3 -3
  20. package/dist/behaviors/index.js +3876 -3843
  21. package/dist/behaviors/index.js.map +1 -1
  22. package/dist/behaviors/registry.d.ts +14 -24
  23. package/dist/behaviors/registry.js +3868 -3803
  24. package/dist/behaviors/registry.js.map +1 -1
  25. package/dist/behaviors/types.d.ts +14 -138
  26. package/dist/behaviors/types.js +10 -47
  27. package/dist/behaviors/types.js.map +1 -1
  28. package/dist/behaviors/ui-interaction.d.ts +13 -20
  29. package/dist/behaviors/ui-interaction.js +961 -1043
  30. package/dist/behaviors/ui-interaction.js.map +1 -1
  31. package/dist/index.d.ts +44 -11
  32. package/dist/index.js +3913 -3870
  33. package/dist/index.js.map +1 -1
  34. package/dist/modules/index.js +11 -0
  35. package/dist/modules/index.js.map +1 -1
  36. package/dist/modules/str.js +11 -0
  37. package/dist/modules/str.js.map +1 -1
  38. package/dist/registry.js +11 -0
  39. package/dist/registry.js.map +1 -1
  40. package/package.json +3 -2
@@ -1,435 +1,386 @@
1
1
  // behaviors/game-core.ts
2
2
  var GAME_LOOP_BEHAVIOR = {
3
- name: "std/GameLoop",
4
- category: "game-core",
3
+ name: "std-gameloop",
4
+ version: "1.0.0",
5
5
  description: "Master game loop coordinator running at 60fps",
6
- suggestedFor: [
7
- "All real-time games",
8
- "Platformers",
9
- "Action games",
10
- "Endless runners"
11
- ],
12
- dataEntities: [
6
+ orbitals: [
13
7
  {
14
- name: "GameLoopState",
15
- runtime: true,
16
- singleton: true,
17
- fields: [
18
- { name: "frameCount", type: "number", default: 0 },
19
- { name: "deltaTime", type: "number", default: 16 },
20
- { name: "elapsedTime", type: "number", default: 0 }
21
- ]
22
- }
23
- ],
24
- stateMachine: {
25
- initial: "Stopped",
26
- states: [
27
- { name: "Stopped", isInitial: true },
28
- { name: "Running" },
29
- { name: "Paused" }
30
- ],
31
- events: [
32
- { key: "START" },
33
- { key: "STOP" },
34
- { key: "PAUSE" },
35
- { key: "RESUME" },
36
- { key: "TICK" }
37
- ],
38
- transitions: [
39
- {
40
- from: "Stopped",
41
- to: "Running",
42
- event: "START",
43
- effects: [
44
- ["set", "@entity.frameCount", 0],
45
- ["set", "@entity.elapsedTime", 0]
8
+ name: "GameLoopOrbital",
9
+ entity: {
10
+ name: "GameLoopState",
11
+ persistence: "runtime",
12
+ fields: [
13
+ { name: "id", type: "string", required: true },
14
+ { name: "frameCount", type: "number", default: 0 },
15
+ { name: "deltaTime", type: "number", default: 16 },
16
+ { name: "elapsedTime", type: "number", default: 0 }
46
17
  ]
47
18
  },
48
- {
49
- from: "Running",
50
- to: "Paused",
51
- event: "PAUSE",
52
- effects: []
53
- },
54
- {
55
- from: "Paused",
56
- to: "Running",
57
- event: "RESUME",
58
- effects: []
59
- },
60
- {
61
- from: ["Running", "Paused"],
62
- to: "Stopped",
63
- event: "STOP",
64
- effects: []
65
- }
66
- ]
67
- },
68
- ticks: [
69
- {
70
- name: "GameTick",
71
- interval: "frame",
72
- guard: ["=", "@state", "Running"],
73
- effects: [
74
- ["set", "@entity.frameCount", ["+", "@entity.frameCount", 1]],
75
- ["set", "@entity.elapsedTime", ["+", "@entity.elapsedTime", "@entity.deltaTime"]],
76
- ["emit", "GAME_TICK", { frame: "@entity.frameCount", delta: "@entity.deltaTime" }]
77
- ]
19
+ traits: [
20
+ {
21
+ name: "GameLoop",
22
+ linkedEntity: "GameLoopState",
23
+ category: "interaction",
24
+ stateMachine: {
25
+ states: [
26
+ { name: "Stopped", isInitial: true },
27
+ { name: "Running" },
28
+ { name: "Paused" }
29
+ ],
30
+ events: [
31
+ { key: "START", name: "Start" },
32
+ { key: "STOP", name: "Stop" },
33
+ { key: "PAUSE", name: "Pause" },
34
+ { key: "RESUME", name: "Resume" },
35
+ { key: "TICK", name: "Tick" }
36
+ ],
37
+ transitions: [
38
+ {
39
+ from: "Stopped",
40
+ to: "Running",
41
+ event: "START",
42
+ effects: [
43
+ ["set", "@entity.frameCount", 0],
44
+ ["set", "@entity.elapsedTime", 0]
45
+ ]
46
+ },
47
+ {
48
+ from: "Running",
49
+ to: "Paused",
50
+ event: "PAUSE",
51
+ effects: []
52
+ },
53
+ {
54
+ from: "Paused",
55
+ to: "Running",
56
+ event: "RESUME",
57
+ effects: []
58
+ },
59
+ {
60
+ from: "Running",
61
+ to: "Stopped",
62
+ event: "STOP",
63
+ effects: []
64
+ },
65
+ {
66
+ from: "Paused",
67
+ to: "Stopped",
68
+ event: "STOP",
69
+ effects: []
70
+ }
71
+ ]
72
+ },
73
+ ticks: [
74
+ {
75
+ name: "GameTick",
76
+ interval: "frame",
77
+ guard: ["=", "@state", "Running"],
78
+ effects: [
79
+ ["set", "@entity.frameCount", ["+", "@entity.frameCount", 1]],
80
+ ["set", "@entity.elapsedTime", ["+", "@entity.elapsedTime", "@entity.deltaTime"]],
81
+ ["emit", "GAME_TICK", { frame: "@entity.frameCount", delta: "@entity.deltaTime" }]
82
+ ]
83
+ }
84
+ ]
85
+ }
86
+ ],
87
+ pages: []
78
88
  }
79
- ],
80
- configSchema: {
81
- required: [],
82
- optional: [
83
- { name: "targetFps", type: "number", description: "Target frames per second", default: 60 },
84
- { name: "fixedTimestep", type: "boolean", description: "Use fixed timestep", default: true }
85
- ]
86
- }
89
+ ]
87
90
  };
88
91
  var PHYSICS_2D_BEHAVIOR = {
89
- name: "std/Physics2D",
90
- category: "game-core",
92
+ name: "std-physics2d",
93
+ version: "1.0.0",
91
94
  description: "2D physics with gravity, velocity, and friction",
92
- suggestedFor: [
93
- "Platformer characters",
94
- "Falling objects",
95
- "Projectiles",
96
- "Any entity affected by gravity"
97
- ],
98
- requiredFields: [
99
- { name: "x", type: "number", description: "Entity X position" },
100
- { name: "y", type: "number", description: "Entity Y position" }
101
- ],
102
- dataEntities: [
95
+ orbitals: [
103
96
  {
104
- name: "Physics2DState",
105
- runtime: true,
106
- fields: [
107
- { name: "vx", type: "number", default: 0 },
108
- { name: "vy", type: "number", default: 0 },
109
- { name: "isGrounded", type: "boolean", default: false }
110
- ]
111
- }
112
- ],
113
- stateMachine: {
114
- initial: "Active",
115
- states: [
116
- { name: "Active", isInitial: true },
117
- { name: "Frozen" }
118
- ],
119
- events: [
120
- { key: "INIT" },
121
- { key: "APPLY_FORCE" },
122
- { key: "GROUND_HIT" },
123
- { key: "FREEZE" },
124
- { key: "UNFREEZE" }
125
- ],
126
- transitions: [
127
- {
128
- from: "*",
129
- event: "INIT",
130
- effects: [
131
- ["set", "@entity.vx", 0],
132
- ["set", "@entity.vy", 0],
133
- ["set", "@entity.isGrounded", false]
134
- ]
135
- },
136
- {
137
- from: "Active",
138
- event: "APPLY_FORCE",
139
- effects: [
140
- ["set", "@entity.vx", ["+", "@entity.vx", "@payload.fx"]],
141
- ["set", "@entity.vy", ["+", "@entity.vy", "@payload.fy"]]
97
+ name: "Physics2DOrbital",
98
+ entity: {
99
+ name: "Physics2DState",
100
+ persistence: "runtime",
101
+ fields: [
102
+ { name: "id", type: "string", required: true },
103
+ { name: "x", type: "number", default: 0 },
104
+ { name: "y", type: "number", default: 0 },
105
+ { name: "vx", type: "number", default: 0 },
106
+ { name: "vy", type: "number", default: 0 },
107
+ { name: "isGrounded", type: "boolean", default: false },
108
+ // Config fields (previously @config bindings)
109
+ { name: "gravity", type: "number", default: 0.5 },
110
+ { name: "friction", type: "number", default: 0.8 },
111
+ { name: "airResistance", type: "number", default: 0.99 },
112
+ { name: "maxVelocityY", type: "number", default: 20 }
142
113
  ]
143
114
  },
144
- {
145
- from: "Active",
146
- event: "GROUND_HIT",
147
- effects: [
148
- ["set", "@entity.isGrounded", true],
149
- ["set", "@entity.vy", 0],
150
- ["set", "@entity.vx", ["*", "@entity.vx", "@config.friction"]]
151
- ]
152
- },
153
- {
154
- from: "Active",
155
- to: "Frozen",
156
- event: "FREEZE",
157
- effects: []
158
- },
159
- {
160
- from: "Frozen",
161
- to: "Active",
162
- event: "UNFREEZE",
163
- effects: []
164
- }
165
- ]
166
- },
167
- ticks: [
168
- {
169
- name: "ApplyGravity",
170
- interval: "frame",
171
- guard: ["and", ["=", "@state", "Active"], ["not", "@entity.isGrounded"]],
172
- effects: [
173
- ["set", "@entity.vy", ["math/min", "@config.maxVelocityY", ["+", "@entity.vy", "@config.gravity"]]]
174
- ]
175
- },
176
- {
177
- name: "ApplyVelocity",
178
- interval: "frame",
179
- guard: ["=", "@state", "Active"],
180
- effects: [
181
- ["set", "@entity.vx", ["*", "@entity.vx", "@config.airResistance"]],
182
- ["set", "@entity.x", ["+", "@entity.x", "@entity.vx"]],
183
- ["set", "@entity.y", ["+", "@entity.y", "@entity.vy"]]
184
- ]
115
+ traits: [
116
+ {
117
+ name: "Physics2D",
118
+ linkedEntity: "Physics2DState",
119
+ category: "interaction",
120
+ stateMachine: {
121
+ states: [
122
+ { name: "Active", isInitial: true },
123
+ { name: "Frozen" }
124
+ ],
125
+ events: [
126
+ { key: "INIT", name: "Initialize" },
127
+ { key: "APPLY_FORCE", name: "Apply Force" },
128
+ { key: "GROUND_HIT", name: "Ground Hit" },
129
+ { key: "FREEZE", name: "Freeze" },
130
+ { key: "UNFREEZE", name: "Unfreeze" }
131
+ ],
132
+ transitions: [
133
+ {
134
+ from: "Active",
135
+ to: "Active",
136
+ event: "INIT",
137
+ effects: [
138
+ ["set", "@entity.vx", 0],
139
+ ["set", "@entity.vy", 0],
140
+ ["set", "@entity.isGrounded", false]
141
+ ]
142
+ },
143
+ {
144
+ from: "Frozen",
145
+ to: "Active",
146
+ event: "INIT",
147
+ effects: [
148
+ ["set", "@entity.vx", 0],
149
+ ["set", "@entity.vy", 0],
150
+ ["set", "@entity.isGrounded", false]
151
+ ]
152
+ },
153
+ {
154
+ from: "Active",
155
+ to: "Active",
156
+ event: "APPLY_FORCE",
157
+ effects: [
158
+ ["set", "@entity.vx", ["+", "@entity.vx", "@payload.fx"]],
159
+ ["set", "@entity.vy", ["+", "@entity.vy", "@payload.fy"]]
160
+ ]
161
+ },
162
+ {
163
+ from: "Active",
164
+ to: "Active",
165
+ event: "GROUND_HIT",
166
+ effects: [
167
+ ["set", "@entity.isGrounded", true],
168
+ ["set", "@entity.vy", 0],
169
+ ["set", "@entity.vx", ["*", "@entity.vx", "@entity.friction"]]
170
+ ]
171
+ },
172
+ {
173
+ from: "Active",
174
+ to: "Frozen",
175
+ event: "FREEZE",
176
+ effects: []
177
+ },
178
+ {
179
+ from: "Frozen",
180
+ to: "Active",
181
+ event: "UNFREEZE",
182
+ effects: []
183
+ }
184
+ ]
185
+ },
186
+ ticks: [
187
+ {
188
+ name: "ApplyGravity",
189
+ interval: "frame",
190
+ guard: ["and", ["=", "@state", "Active"], ["not", "@entity.isGrounded"]],
191
+ effects: [
192
+ ["set", "@entity.vy", ["math/min", "@entity.maxVelocityY", ["+", "@entity.vy", "@entity.gravity"]]]
193
+ ]
194
+ },
195
+ {
196
+ name: "ApplyVelocity",
197
+ interval: "frame",
198
+ guard: ["=", "@state", "Active"],
199
+ effects: [
200
+ ["set", "@entity.vx", ["*", "@entity.vx", "@entity.airResistance"]],
201
+ ["set", "@entity.x", ["+", "@entity.x", "@entity.vx"]],
202
+ ["set", "@entity.y", ["+", "@entity.y", "@entity.vy"]]
203
+ ]
204
+ }
205
+ ]
206
+ }
207
+ ],
208
+ pages: []
185
209
  }
186
- ],
187
- configSchema: {
188
- required: [],
189
- optional: [
190
- { name: "gravity", type: "number", description: "Gravity acceleration (pixels/frame\xB2)", default: 0.5 },
191
- { name: "maxVelocityY", type: "number", description: "Terminal velocity", default: 15 },
192
- { name: "friction", type: "number", description: "Ground friction (0-1)", default: 0.8 },
193
- { name: "airResistance", type: "number", description: "Air resistance (0-1)", default: 0.99 }
194
- ]
195
- }
210
+ ]
196
211
  };
197
212
  var INPUT_BEHAVIOR = {
198
- name: "std/Input",
199
- category: "game-core",
213
+ name: "std-input",
214
+ version: "1.0.0",
200
215
  description: "Unified keyboard and touch input state management",
201
- suggestedFor: [
202
- "All interactive games",
203
- "Player controls",
204
- "Menu navigation"
205
- ],
206
- dataEntities: [
216
+ orbitals: [
207
217
  {
208
- name: "InputState",
209
- runtime: true,
210
- singleton: true,
211
- fields: [
212
- { name: "left", type: "boolean", default: false },
213
- { name: "right", type: "boolean", default: false },
214
- { name: "up", type: "boolean", default: false },
215
- { name: "down", type: "boolean", default: false },
216
- { name: "jump", type: "boolean", default: false },
217
- { name: "action", type: "boolean", default: false },
218
- { name: "pause", type: "boolean", default: false }
219
- ]
220
- }
221
- ],
222
- stateMachine: {
223
- initial: "Ready",
224
- states: [
225
- { name: "Ready", isInitial: true }
226
- ],
227
- events: [
228
- { key: "KEY_DOWN" },
229
- { key: "KEY_UP" },
230
- { key: "TOUCH_START" },
231
- { key: "TOUCH_END" },
232
- { key: "RESET" }
233
- ],
234
- transitions: [
235
- {
236
- event: "KEY_DOWN",
237
- effects: [
238
- [
239
- "if",
240
- ["or", ["=", "@payload.key", "ArrowLeft"], ["=", "@payload.key", "a"]],
241
- ["set", "@entity.left", true]
242
- ],
243
- [
244
- "if",
245
- ["or", ["=", "@payload.key", "ArrowRight"], ["=", "@payload.key", "d"]],
246
- ["set", "@entity.right", true]
247
- ],
248
- [
249
- "if",
250
- ["or", ["=", "@payload.key", "ArrowUp"], ["=", "@payload.key", "w"]],
251
- ["set", "@entity.up", true]
252
- ],
253
- [
254
- "if",
255
- ["or", ["=", "@payload.key", "ArrowDown"], ["=", "@payload.key", "s"]],
256
- ["set", "@entity.down", true]
257
- ],
258
- [
259
- "if",
260
- ["=", "@payload.key", " "],
261
- ["set", "@entity.jump", true]
262
- ],
263
- [
264
- "if",
265
- ["or", ["=", "@payload.key", "Enter"], ["=", "@payload.key", "e"]],
266
- ["set", "@entity.action", true]
267
- ],
268
- [
269
- "if",
270
- ["or", ["=", "@payload.key", "Escape"], ["=", "@payload.key", "p"]],
271
- ["set", "@entity.pause", true]
272
- ]
218
+ name: "InputOrbital",
219
+ entity: {
220
+ name: "InputState",
221
+ persistence: "runtime",
222
+ fields: [
223
+ { name: "id", type: "string", required: true },
224
+ { name: "left", type: "boolean", default: false },
225
+ { name: "right", type: "boolean", default: false },
226
+ { name: "up", type: "boolean", default: false },
227
+ { name: "down", type: "boolean", default: false },
228
+ { name: "jump", type: "boolean", default: false },
229
+ { name: "action", type: "boolean", default: false },
230
+ { name: "pause", type: "boolean", default: false }
273
231
  ]
274
232
  },
275
- {
276
- event: "KEY_UP",
277
- effects: [
278
- [
279
- "if",
280
- ["or", ["=", "@payload.key", "ArrowLeft"], ["=", "@payload.key", "a"]],
281
- ["set", "@entity.left", false]
282
- ],
283
- [
284
- "if",
285
- ["or", ["=", "@payload.key", "ArrowRight"], ["=", "@payload.key", "d"]],
286
- ["set", "@entity.right", false]
287
- ],
288
- [
289
- "if",
290
- ["or", ["=", "@payload.key", "ArrowUp"], ["=", "@payload.key", "w"]],
291
- ["set", "@entity.up", false]
292
- ],
293
- [
294
- "if",
295
- ["or", ["=", "@payload.key", "ArrowDown"], ["=", "@payload.key", "s"]],
296
- ["set", "@entity.down", false]
297
- ],
298
- [
299
- "if",
300
- ["=", "@payload.key", " "],
301
- ["set", "@entity.jump", false]
302
- ],
303
- [
304
- "if",
305
- ["or", ["=", "@payload.key", "Enter"], ["=", "@payload.key", "e"]],
306
- ["set", "@entity.action", false]
307
- ],
308
- [
309
- "if",
310
- ["or", ["=", "@payload.key", "Escape"], ["=", "@payload.key", "p"]],
311
- ["set", "@entity.pause", false]
312
- ]
313
- ]
314
- },
315
- {
316
- event: "RESET",
317
- effects: [
318
- ["set", "@entity.left", false],
319
- ["set", "@entity.right", false],
320
- ["set", "@entity.up", false],
321
- ["set", "@entity.down", false],
322
- ["set", "@entity.jump", false],
323
- ["set", "@entity.action", false],
324
- ["set", "@entity.pause", false]
325
- ]
326
- }
327
- ]
328
- },
329
- configSchema: {
330
- required: [],
331
- optional: [
332
- { name: "keyMap", type: "object", description: "Key to action mapping", default: {} }
333
- ]
334
- }
233
+ traits: [
234
+ {
235
+ name: "Input",
236
+ linkedEntity: "InputState",
237
+ category: "interaction",
238
+ stateMachine: {
239
+ states: [{ name: "Ready", isInitial: true }],
240
+ events: [
241
+ { key: "KEY_DOWN", name: "Key Down" },
242
+ { key: "KEY_UP", name: "Key Up" },
243
+ { key: "TOUCH_START", name: "Touch Start" },
244
+ { key: "TOUCH_END", name: "Touch End" },
245
+ { key: "RESET", name: "Reset" }
246
+ ],
247
+ transitions: [
248
+ {
249
+ from: "Ready",
250
+ to: "Ready",
251
+ event: "KEY_DOWN",
252
+ effects: [
253
+ ["if", ["or", ["=", "@payload.key", "ArrowLeft"], ["=", "@payload.key", "a"]], ["set", "@entity.left", true]],
254
+ ["if", ["or", ["=", "@payload.key", "ArrowRight"], ["=", "@payload.key", "d"]], ["set", "@entity.right", true]],
255
+ ["if", ["or", ["=", "@payload.key", "ArrowUp"], ["=", "@payload.key", "w"]], ["set", "@entity.up", true]],
256
+ ["if", ["or", ["=", "@payload.key", "ArrowDown"], ["=", "@payload.key", "s"]], ["set", "@entity.down", true]],
257
+ ["if", ["=", "@payload.key", " "], ["set", "@entity.jump", true]],
258
+ ["if", ["or", ["=", "@payload.key", "Enter"], ["=", "@payload.key", "e"]], ["set", "@entity.action", true]],
259
+ ["if", ["or", ["=", "@payload.key", "Escape"], ["=", "@payload.key", "p"]], ["set", "@entity.pause", true]]
260
+ ]
261
+ },
262
+ {
263
+ from: "Ready",
264
+ to: "Ready",
265
+ event: "KEY_UP",
266
+ effects: [
267
+ ["if", ["or", ["=", "@payload.key", "ArrowLeft"], ["=", "@payload.key", "a"]], ["set", "@entity.left", false]],
268
+ ["if", ["or", ["=", "@payload.key", "ArrowRight"], ["=", "@payload.key", "d"]], ["set", "@entity.right", false]],
269
+ ["if", ["or", ["=", "@payload.key", "ArrowUp"], ["=", "@payload.key", "w"]], ["set", "@entity.up", false]],
270
+ ["if", ["or", ["=", "@payload.key", "ArrowDown"], ["=", "@payload.key", "s"]], ["set", "@entity.down", false]],
271
+ ["if", ["=", "@payload.key", " "], ["set", "@entity.jump", false]],
272
+ ["if", ["or", ["=", "@payload.key", "Enter"], ["=", "@payload.key", "e"]], ["set", "@entity.action", false]],
273
+ ["if", ["or", ["=", "@payload.key", "Escape"], ["=", "@payload.key", "p"]], ["set", "@entity.pause", false]]
274
+ ]
275
+ },
276
+ {
277
+ from: "Ready",
278
+ to: "Ready",
279
+ event: "RESET",
280
+ effects: [
281
+ ["set", "@entity.left", false],
282
+ ["set", "@entity.right", false],
283
+ ["set", "@entity.up", false],
284
+ ["set", "@entity.down", false],
285
+ ["set", "@entity.jump", false],
286
+ ["set", "@entity.action", false],
287
+ ["set", "@entity.pause", false]
288
+ ]
289
+ }
290
+ ]
291
+ }
292
+ }
293
+ ],
294
+ pages: []
295
+ }
296
+ ]
335
297
  };
336
298
  var COLLISION_BEHAVIOR = {
337
- name: "std/Collision",
338
- category: "game-core",
299
+ name: "std-collision",
300
+ version: "1.0.0",
339
301
  description: "Collision detection and response configuration",
340
- suggestedFor: [
341
- "Solid platforms",
342
- "Trigger zones",
343
- "Collectibles",
344
- "Hazards"
345
- ],
346
- dataEntities: [
302
+ orbitals: [
347
303
  {
348
- name: "CollisionState",
349
- runtime: true,
350
- fields: [
351
- { name: "isColliding", type: "boolean", default: false },
352
- { name: "collidingWith", type: "array", default: [] }
353
- ]
354
- }
355
- ],
356
- stateMachine: {
357
- initial: "Active",
358
- states: [
359
- { name: "Active", isInitial: true },
360
- { name: "Disabled" }
361
- ],
362
- events: [
363
- { key: "COLLISION" },
364
- { key: "TRIGGER_ENTER" },
365
- { key: "TRIGGER_EXIT" },
366
- { key: "ENABLE" },
367
- { key: "DISABLE" }
368
- ],
369
- transitions: [
370
- {
371
- from: "Active",
372
- event: "COLLISION",
373
- effects: [
374
- ["set", "@entity.isColliding", true],
375
- ["set", "@entity.collidingWith", ["array/append", "@entity.collidingWith", "@payload.entityId"]],
376
- [
377
- "if",
378
- "@config.onCollision",
379
- ["emit", "@config.onCollision", { entityId: "@payload.entityId", side: "@payload.side" }]
380
- ]
381
- ]
382
- },
383
- {
384
- from: "Active",
385
- event: "TRIGGER_ENTER",
386
- effects: [
387
- [
388
- "if",
389
- "@config.onTrigger",
390
- ["emit", "@config.onTrigger", { entityId: "@payload.entityId", action: "enter" }]
391
- ]
392
- ]
393
- },
394
- {
395
- from: "Active",
396
- event: "TRIGGER_EXIT",
397
- effects: [
398
- ["set", "@entity.collidingWith", ["array/filter", "@entity.collidingWith", ["fn", "id", ["!=", "@id", "@payload.entityId"]]]],
399
- [
400
- "if",
401
- ["=", ["array/len", "@entity.collidingWith"], 0],
402
- ["set", "@entity.isColliding", false]
403
- ]
404
- ]
405
- },
406
- {
407
- from: "Active",
408
- to: "Disabled",
409
- event: "DISABLE",
410
- effects: [
411
- ["set", "@entity.isColliding", false],
412
- ["set", "@entity.collidingWith", []]
304
+ name: "CollisionOrbital",
305
+ entity: {
306
+ name: "CollisionState",
307
+ persistence: "runtime",
308
+ fields: [
309
+ { name: "id", type: "string", required: true },
310
+ { name: "isColliding", type: "boolean", default: false },
311
+ { name: "collidingWith", type: "array", default: [] },
312
+ // Config fields (previously @config bindings)
313
+ { name: "onCollision", type: "string", default: null },
314
+ { name: "onTrigger", type: "string", default: null }
413
315
  ]
414
316
  },
415
- {
416
- from: "Disabled",
417
- to: "Active",
418
- event: "ENABLE",
419
- effects: []
420
- }
421
- ]
422
- },
423
- configSchema: {
424
- required: [],
425
- optional: [
426
- { name: "type", type: "string", description: "Collision type", default: "solid", enum: ["solid", "trigger"] },
427
- { name: "layer", type: "string", description: "Collision layer", default: "default" },
428
- { name: "collidesWith", type: "array", description: "Layers to collide with", default: ["default"] },
429
- { name: "onCollision", type: "event", description: "Event to emit on collision" },
430
- { name: "onTrigger", type: "event", description: "Event to emit on trigger" }
431
- ]
432
- }
317
+ traits: [
318
+ {
319
+ name: "Collision",
320
+ linkedEntity: "CollisionState",
321
+ category: "interaction",
322
+ stateMachine: {
323
+ states: [
324
+ { name: "Active", isInitial: true },
325
+ { name: "Disabled" }
326
+ ],
327
+ events: [
328
+ { key: "COLLISION", name: "Collision" },
329
+ { key: "TRIGGER_ENTER", name: "Trigger Enter" },
330
+ { key: "TRIGGER_EXIT", name: "Trigger Exit" },
331
+ { key: "ENABLE", name: "Enable" },
332
+ { key: "DISABLE", name: "Disable" }
333
+ ],
334
+ transitions: [
335
+ {
336
+ from: "Active",
337
+ to: "Active",
338
+ event: "COLLISION",
339
+ effects: [
340
+ ["set", "@entity.isColliding", true],
341
+ ["set", "@entity.collidingWith", ["array/append", "@entity.collidingWith", "@payload.entityId"]],
342
+ ["if", "@entity.onCollision", ["emit", "@entity.onCollision", { entityId: "@payload.entityId", side: "@payload.side" }]]
343
+ ]
344
+ },
345
+ {
346
+ from: "Active",
347
+ to: "Active",
348
+ event: "TRIGGER_ENTER",
349
+ effects: [
350
+ ["if", "@entity.onTrigger", ["emit", "@entity.onTrigger", { entityId: "@payload.entityId", action: "enter" }]]
351
+ ]
352
+ },
353
+ {
354
+ from: "Active",
355
+ to: "Active",
356
+ event: "TRIGGER_EXIT",
357
+ effects: [
358
+ ["set", "@entity.collidingWith", ["array/filter", "@entity.collidingWith", ["fn", "id", ["!=", "@id", "@payload.entityId"]]]],
359
+ ["if", ["=", ["array/len", "@entity.collidingWith"], 0], ["set", "@entity.isColliding", false]]
360
+ ]
361
+ },
362
+ {
363
+ from: "Active",
364
+ to: "Disabled",
365
+ event: "DISABLE",
366
+ effects: [
367
+ ["set", "@entity.isColliding", false],
368
+ ["set", "@entity.collidingWith", []]
369
+ ]
370
+ },
371
+ {
372
+ from: "Disabled",
373
+ to: "Active",
374
+ event: "ENABLE",
375
+ effects: []
376
+ }
377
+ ]
378
+ }
379
+ }
380
+ ],
381
+ pages: []
382
+ }
383
+ ]
433
384
  };
434
385
  var GAME_CORE_BEHAVIORS = [
435
386
  GAME_LOOP_BEHAVIOR,