@almadar/std 16.181.0 → 16.183.0

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 (90) hide show
  1. package/behaviors/lolo/infra/atoms/std-calendar-sync.lolo +290 -0
  2. package/behaviors/lolo/infra/atoms/std-migration-job.lolo +2 -2
  3. package/behaviors/lolo/infra/atoms/std-notification-center.lolo +290 -0
  4. package/behaviors/lolo/infra/atoms/std-notify-on-event.lolo +238 -40
  5. package/behaviors/lolo/ui/core/atoms/std-esign-flow.lolo +180 -3
  6. package/behaviors/lolo/ui/core/molecules/ui-calendar-grid.lolo +6 -0
  7. package/behaviors/lolo/ui/core/organisms/ui-detail-panel.lolo +4 -4
  8. package/behaviors/lolo/ui/game/.hand-authored.json +1 -1
  9. package/behaviors/lolo/ui/game/atoms/std-fx-trail.lolo +63 -0
  10. package/behaviors/lolo/ui/game/atoms/std-gate-lock.lolo +96 -0
  11. package/behaviors/lolo/ui/game/atoms/std-lives.lolo +121 -0
  12. package/behaviors/lolo/ui/game/atoms/std-patrol-hazard.lolo +96 -0
  13. package/behaviors/lolo/ui/game/atoms/std-tutorial-overlay.lolo +164 -0
  14. package/behaviors/lolo/ui/game/atoms/ui-control-grid.lolo +5 -0
  15. package/behaviors/lolo/ui/game/atoms/ui-game-hud.lolo +5 -0
  16. package/behaviors/lolo/ui/game/templates/ui-game-shell.lolo +5 -5
  17. package/behaviors/lolo/ui/learning/atoms/std-learn-slope-probe.lolo +117 -0
  18. package/behaviors/lolo/ui/learning/atoms/ui-math-canvas.lolo +18 -0
  19. package/behaviors/registry/infra/atoms/std-calendar-sync.orb +1643 -0
  20. package/behaviors/registry/infra/atoms/std-migration-job.orb +2 -2
  21. package/behaviors/registry/infra/atoms/std-notification-center.orb +1621 -0
  22. package/behaviors/registry/infra/atoms/std-notify-on-event.orb +1734 -169
  23. package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +846 -2
  24. package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +9 -0
  25. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +4 -2
  26. package/behaviors/registry/ui/game/atoms/std-fx-trail.orb +376 -0
  27. package/behaviors/registry/ui/game/atoms/std-gate-lock.orb +852 -0
  28. package/behaviors/registry/ui/game/atoms/std-lives.orb +739 -0
  29. package/behaviors/registry/ui/game/atoms/std-patrol-hazard.orb +768 -0
  30. package/behaviors/registry/ui/game/atoms/std-tutorial-overlay.orb +1060 -0
  31. package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +13 -1
  32. package/behaviors/registry/ui/game/atoms/ui-game-hud.orb +13 -1
  33. package/behaviors/registry/ui/game/templates/ui-game-shell.orb +5 -5
  34. package/behaviors/registry/ui/learning/atoms/std-learn-slope-probe.orb +908 -0
  35. package/canonical-operators.json +21 -1
  36. package/dist/behaviors/exports-reader.js +9021 -3497
  37. package/dist/behaviors/functions/index.d.ts +1001 -10
  38. package/dist/behaviors/functions/index.js +18568 -13079
  39. package/dist/behaviors/index.d.ts +1 -1
  40. package/dist/behaviors/index.js +9022 -3498
  41. package/dist/behaviors/query.js +9021 -3497
  42. package/dist/behaviors-embeddings.hash.json +3 -3
  43. package/dist/behaviors-embeddings.json +347 -315
  44. package/dist/behaviors-registry.json +2694 -56
  45. package/dist/index.d.ts +3 -3
  46. package/dist/index.js +8502 -2941
  47. package/dist/knob-embeddings.hash.json +3 -3
  48. package/dist/knob-embeddings.json +1 -1
  49. package/dist/modules/anim.d.ts +1 -1
  50. package/dist/modules/array.d.ts +1 -1
  51. package/dist/modules/async.d.ts +1 -1
  52. package/dist/modules/behavior.d.ts +1 -1
  53. package/dist/modules/browser.d.ts +1 -1
  54. package/dist/modules/browser.js +21 -0
  55. package/dist/modules/composition.d.ts +1 -1
  56. package/dist/modules/contract.d.ts +1 -1
  57. package/dist/modules/core.d.ts +1 -1
  58. package/dist/modules/core.js +18 -2
  59. package/dist/modules/data.d.ts +1 -1
  60. package/dist/modules/ease.d.ts +1 -1
  61. package/dist/modules/format.d.ts +1 -1
  62. package/dist/modules/geo.d.ts +1 -1
  63. package/dist/modules/graph.d.ts +1 -1
  64. package/dist/modules/grid.d.ts +1 -1
  65. package/dist/modules/index.d.ts +1 -1
  66. package/dist/modules/index.js +39 -2
  67. package/dist/modules/integration.d.ts +1 -1
  68. package/dist/modules/llm.d.ts +1 -1
  69. package/dist/modules/math.d.ts +1 -1
  70. package/dist/modules/memory.d.ts +1 -1
  71. package/dist/modules/nn.d.ts +1 -1
  72. package/dist/modules/noise.d.ts +1 -1
  73. package/dist/modules/object.d.ts +1 -1
  74. package/dist/modules/os.d.ts +1 -1
  75. package/dist/modules/path.d.ts +1 -1
  76. package/dist/modules/prob.d.ts +1 -1
  77. package/dist/modules/session.d.ts +1 -1
  78. package/dist/modules/str.d.ts +1 -1
  79. package/dist/modules/tensor.d.ts +1 -1
  80. package/dist/modules/time.d.ts +1 -1
  81. package/dist/modules/trace.d.ts +1 -1
  82. package/dist/modules/train.d.ts +1 -1
  83. package/dist/modules/validate.d.ts +1 -1
  84. package/dist/modules/vector.d.ts +1 -1
  85. package/dist/modules/workspace.d.ts +1 -1
  86. package/dist/registry/factory-signatures.json +1 -1
  87. package/dist/registry.d.ts +1 -1
  88. package/dist/registry.js +39 -2
  89. package/dist/{types-DGJ6Y6nW.d.ts → types-BXWzEjFm.d.ts} +1 -1
  90. package/package.json +3 -3
@@ -0,0 +1,768 @@
1
+ {
2
+ "description": "Headless patrol-hazard mechanic for side-view boards: moves each configured patrol back and forth along its [x0, x1] beat at its own speed (33ms tick, ping-pong with clamped turnarounds), tracks the player position off the body authority's BODY_MOVED, and emits PATROL_HIT once per contact — a per-patrol hit flag re-arms only after the player separates, so damage rules stay sparse (when two patrols connect on the same tick the first reports; the other reports on the next tick). Patrols live on a [runtime, shared] entity for the render layer (boards draw them as markers/sprites); damage, lives, and respawn stay downstream (std-lives) — this atom simulates, it never judges. Renders nothing.",
3
+ "ledger": {
4
+ "entries": {
5
+ "ent_01M0PCAKKXX0TFABTMPC8BNH64": {
6
+ "bakedName": "PatrolState",
7
+ "curName": "PatrolState",
8
+ "id": "ent_01M0PCAKKXX0TFABTMPC8BNH64",
9
+ "kind": "entity",
10
+ "owner": "workspace",
11
+ "renames": []
12
+ },
13
+ "evt_01M0PCAKKX4Q8XWSYERBAF5HQ2": {
14
+ "bakedName": "RESTART",
15
+ "curName": "RESTART",
16
+ "id": "evt_01M0PCAKKX4Q8XWSYERBAF5HQ2",
17
+ "kind": "event",
18
+ "owner": "workspace",
19
+ "parent": "trt_01M0PCAKKXTHKSQ9FKTMSFDTQ6",
20
+ "renames": []
21
+ },
22
+ "evt_01M0PCAKKXFZTMW79Z96WV5A60": {
23
+ "bakedName": "INIT",
24
+ "curName": "INIT",
25
+ "id": "evt_01M0PCAKKXFZTMW79Z96WV5A60",
26
+ "kind": "event",
27
+ "owner": "workspace",
28
+ "parent": "trt_01M0PCAKKXTHKSQ9FKTMSFDTQ6",
29
+ "renames": []
30
+ },
31
+ "evt_01M0PCAKKXG9B0VPZMP3H1B5F9": {
32
+ "bakedName": "PATROL_HIT",
33
+ "curName": "PATROL_HIT",
34
+ "id": "evt_01M0PCAKKXG9B0VPZMP3H1B5F9",
35
+ "kind": "event",
36
+ "owner": "workspace",
37
+ "parent": "trt_01M0PCAKKXTHKSQ9FKTMSFDTQ6",
38
+ "renames": []
39
+ },
40
+ "evt_01M0PCAKKXZGA2QS6J3G9MZTPJ": {
41
+ "bakedName": "BODY_MOVED",
42
+ "curName": "BODY_MOVED",
43
+ "id": "evt_01M0PCAKKXZGA2QS6J3G9MZTPJ",
44
+ "kind": "event",
45
+ "owner": "workspace",
46
+ "parent": "trt_01M0PCAKKXTHKSQ9FKTMSFDTQ6",
47
+ "renames": []
48
+ },
49
+ "orb_01M0PCAKKX0Z1Y4YYMHYN88XSB": {
50
+ "bakedName": "PatrolHazardOrbital",
51
+ "curName": "PatrolHazardOrbital",
52
+ "id": "orb_01M0PCAKKX0Z1Y4YYMHYN88XSB",
53
+ "kind": "orbital",
54
+ "owner": "workspace",
55
+ "renames": []
56
+ },
57
+ "pag_01M0PCAKKYG6SZ7JK2WYNR99H2": {
58
+ "bakedName": "PatrolHazardPage",
59
+ "curName": "PatrolHazardPage",
60
+ "id": "pag_01M0PCAKKYG6SZ7JK2WYNR99H2",
61
+ "kind": "page",
62
+ "owner": "workspace",
63
+ "renames": []
64
+ },
65
+ "trt_01M0PCAKKXTHKSQ9FKTMSFDTQ6": {
66
+ "bakedName": "PatrolHazard",
67
+ "curName": "PatrolHazard",
68
+ "id": "trt_01M0PCAKKXTHKSQ9FKTMSFDTQ6",
69
+ "kind": "trait",
70
+ "owner": "workspace",
71
+ "renames": []
72
+ }
73
+ },
74
+ "schemaVersion": 1
75
+ },
76
+ "name": "std-patrol-hazard",
77
+ "orbitals": [
78
+ {
79
+ "entity": {
80
+ "fields": [
81
+ {
82
+ "name": "id",
83
+ "required": true,
84
+ "type": "string"
85
+ },
86
+ {
87
+ "default": [],
88
+ "items": {
89
+ "properties": {
90
+ "dir": {
91
+ "name": "dir",
92
+ "required": false,
93
+ "type": "number"
94
+ },
95
+ "hit": {
96
+ "name": "hit",
97
+ "required": false,
98
+ "type": "boolean"
99
+ },
100
+ "id": {
101
+ "name": "id",
102
+ "required": true,
103
+ "type": "string"
104
+ },
105
+ "speed": {
106
+ "name": "speed",
107
+ "required": true,
108
+ "type": "number"
109
+ },
110
+ "touching": {
111
+ "name": "touching",
112
+ "required": false,
113
+ "type": "boolean"
114
+ },
115
+ "x": {
116
+ "name": "x",
117
+ "required": false,
118
+ "type": "number"
119
+ },
120
+ "x0": {
121
+ "name": "x0",
122
+ "required": true,
123
+ "type": "number"
124
+ },
125
+ "x1": {
126
+ "name": "x1",
127
+ "required": true,
128
+ "type": "number"
129
+ },
130
+ "y": {
131
+ "name": "y",
132
+ "required": true,
133
+ "type": "number"
134
+ }
135
+ },
136
+ "type": "object"
137
+ },
138
+ "name": "patrols",
139
+ "type": "array"
140
+ },
141
+ {
142
+ "default": 0.0,
143
+ "name": "px",
144
+ "type": "number"
145
+ },
146
+ {
147
+ "default": 0.0,
148
+ "name": "py",
149
+ "type": "number"
150
+ }
151
+ ],
152
+ "id": "ent_01M0PCAKKXX0TFABTMPC8BNH64",
153
+ "name": "PatrolState",
154
+ "persistence": "runtime",
155
+ "shared": true
156
+ },
157
+ "id": "orb_01M0PCAKKX0Z1Y4YYMHYN88XSB",
158
+ "name": "PatrolHazardOrbital",
159
+ "pages": [
160
+ {
161
+ "id": "pag_01M0PCAKKYG6SZ7JK2WYNR99H2",
162
+ "name": "PatrolHazardPage",
163
+ "path": "/patrol-hazard",
164
+ "traits": [
165
+ {
166
+ "ref": "PatrolHazard",
167
+ "refId": "trt_01M0PCAKKXTHKSQ9FKTMSFDTQ6"
168
+ }
169
+ ]
170
+ }
171
+ ],
172
+ "traits": [
173
+ {
174
+ "category": "lifecycle",
175
+ "config": {
176
+ "hitRadius": {
177
+ "default": 0.7,
178
+ "description": "Per-axis distance (world units) within which a patrol counts as touching the player; smaller values demand precise contact, larger values forgive.",
179
+ "label": "Hit Radius",
180
+ "tier": "domain",
181
+ "type": "number"
182
+ },
183
+ "patrols": {
184
+ "default": [],
185
+ "description": "One row per patroller: id, the [x0, x1] beat it walks, its fixed y, and its speed in units/s. Current x/dir/touching/hit are stamped at runtime.",
186
+ "items": {
187
+ "properties": {
188
+ "dir": {
189
+ "name": "dir",
190
+ "required": false,
191
+ "type": "number"
192
+ },
193
+ "hit": {
194
+ "name": "hit",
195
+ "required": false,
196
+ "type": "boolean"
197
+ },
198
+ "id": {
199
+ "name": "id",
200
+ "required": true,
201
+ "type": "string"
202
+ },
203
+ "speed": {
204
+ "name": "speed",
205
+ "required": true,
206
+ "type": "number"
207
+ },
208
+ "touching": {
209
+ "name": "touching",
210
+ "required": false,
211
+ "type": "boolean"
212
+ },
213
+ "x": {
214
+ "name": "x",
215
+ "required": false,
216
+ "type": "number"
217
+ },
218
+ "x0": {
219
+ "name": "x0",
220
+ "required": true,
221
+ "type": "number"
222
+ },
223
+ "x1": {
224
+ "name": "x1",
225
+ "required": true,
226
+ "type": "number"
227
+ },
228
+ "y": {
229
+ "name": "y",
230
+ "required": true,
231
+ "type": "number"
232
+ }
233
+ },
234
+ "type": "object"
235
+ },
236
+ "label": "Patrols",
237
+ "tier": "domain",
238
+ "type": "[Patrol]"
239
+ },
240
+ "playerSpawnX": {
241
+ "default": 0.0,
242
+ "description": "Player x assumed before the first BODY_MOVED arrives (match the body authority's spawn).",
243
+ "label": "Player Spawn X",
244
+ "tier": "domain",
245
+ "type": "number"
246
+ },
247
+ "playerSpawnY": {
248
+ "default": 0.0,
249
+ "description": "Player y assumed before the first BODY_MOVED arrives.",
250
+ "label": "Player Spawn Y",
251
+ "tier": "domain",
252
+ "type": "number"
253
+ },
254
+ "running": {
255
+ "default": true,
256
+ "description": "When true the 33ms tick moves patrols and tests contact; toggle to freeze every patrol in place.",
257
+ "label": "Running",
258
+ "tier": "domain",
259
+ "type": "boolean"
260
+ }
261
+ },
262
+ "emits": [
263
+ {
264
+ "description": "A patrol made contact with the player this tick; fires once per contact and re-arms only after separation — boards route it to their damage rule (std-lives DAMAGE).",
265
+ "event": "PATROL_HIT",
266
+ "eventId": "evt_01M0PCAKKXG9B0VPZMP3H1B5F9",
267
+ "payloadSchema": [
268
+ {
269
+ "name": "id",
270
+ "required": true,
271
+ "type": "string"
272
+ },
273
+ {
274
+ "name": "x",
275
+ "required": true,
276
+ "type": "number"
277
+ },
278
+ {
279
+ "name": "y",
280
+ "required": true,
281
+ "type": "number"
282
+ }
283
+ ],
284
+ "scope": "external",
285
+ "tier": "domain"
286
+ }
287
+ ],
288
+ "entityContract": {
289
+ "provides": [
290
+ "patrols",
291
+ "px",
292
+ "py"
293
+ ],
294
+ "requires": []
295
+ },
296
+ "entityRebindable": true,
297
+ "entityRefIds": {
298
+ "PatrolState": "ent_01M0PCAKKXX0TFABTMPC8BNH64"
299
+ },
300
+ "id": "trt_01M0PCAKKXTHKSQ9FKTMSFDTQ6",
301
+ "linkedEntity": "PatrolState",
302
+ "linkedEntityId": "ent_01M0PCAKKXX0TFABTMPC8BNH64",
303
+ "name": "PatrolHazard",
304
+ "scope": "instance",
305
+ "stateMachine": {
306
+ "events": [
307
+ {
308
+ "id": "evt_01M0PCAKKXFZTMW79Z96WV5A60",
309
+ "key": "INIT",
310
+ "name": "Initialize"
311
+ },
312
+ {
313
+ "id": "evt_01M0PCAKKXZGA2QS6J3G9MZTPJ",
314
+ "key": "BODY_MOVED",
315
+ "name": "Body Moved",
316
+ "payloadSchema": [
317
+ {
318
+ "name": "x",
319
+ "required": true,
320
+ "type": "number"
321
+ },
322
+ {
323
+ "name": "y",
324
+ "required": true,
325
+ "type": "number"
326
+ },
327
+ {
328
+ "name": "vx",
329
+ "required": true,
330
+ "type": "number"
331
+ },
332
+ {
333
+ "name": "vy",
334
+ "required": true,
335
+ "type": "number"
336
+ },
337
+ {
338
+ "name": "grounded",
339
+ "required": true,
340
+ "type": "boolean"
341
+ },
342
+ {
343
+ "name": "skating",
344
+ "required": true,
345
+ "type": "boolean"
346
+ },
347
+ {
348
+ "name": "speed",
349
+ "required": true,
350
+ "type": "number"
351
+ }
352
+ ]
353
+ },
354
+ {
355
+ "id": "evt_01M0PCAKKX4Q8XWSYERBAF5HQ2",
356
+ "key": "RESTART",
357
+ "name": "Restart",
358
+ "payloadSchema": [
359
+ {
360
+ "name": "id",
361
+ "type": "string"
362
+ }
363
+ ]
364
+ },
365
+ {
366
+ "description": "A patrol made contact with the player this tick; fires once per contact and re-arms only after separation — boards route it to their damage rule (std-lives DAMAGE).",
367
+ "id": "evt_01M0PCAKKXG9B0VPZMP3H1B5F9",
368
+ "key": "PATROL_HIT",
369
+ "name": "Patrol Hit",
370
+ "payloadSchema": [
371
+ {
372
+ "name": "id",
373
+ "required": true,
374
+ "type": "string"
375
+ },
376
+ {
377
+ "name": "x",
378
+ "required": true,
379
+ "type": "number"
380
+ },
381
+ {
382
+ "name": "y",
383
+ "required": true,
384
+ "type": "number"
385
+ }
386
+ ],
387
+ "tier": "domain"
388
+ }
389
+ ],
390
+ "states": [
391
+ {
392
+ "isInitial": true,
393
+ "name": "active"
394
+ }
395
+ ],
396
+ "transitions": [
397
+ {
398
+ "effects": [
399
+ [
400
+ "set",
401
+ "@entity.patrols",
402
+ [
403
+ "array/map",
404
+ "@config.patrols",
405
+ [
406
+ "fn",
407
+ "p",
408
+ [
409
+ "object/merge",
410
+ "@p",
411
+ {
412
+ "dir": 1.0,
413
+ "hit": false,
414
+ "touching": false,
415
+ "x": [
416
+ "object/get",
417
+ "@p",
418
+ "x0"
419
+ ]
420
+ }
421
+ ]
422
+ ]
423
+ ]
424
+ ],
425
+ [
426
+ "set",
427
+ "@entity.px",
428
+ "@config.playerSpawnX"
429
+ ],
430
+ [
431
+ "set",
432
+ "@entity.py",
433
+ "@config.playerSpawnY"
434
+ ]
435
+ ],
436
+ "event": "INIT",
437
+ "eventId": "evt_01M0PCAKKXFZTMW79Z96WV5A60",
438
+ "from": "active",
439
+ "to": "active"
440
+ },
441
+ {
442
+ "effects": [
443
+ [
444
+ "set",
445
+ "@entity.px",
446
+ "@payload.x"
447
+ ],
448
+ [
449
+ "set",
450
+ "@entity.py",
451
+ "@payload.y"
452
+ ]
453
+ ],
454
+ "event": "BODY_MOVED",
455
+ "eventId": "evt_01M0PCAKKXZGA2QS6J3G9MZTPJ",
456
+ "from": "active",
457
+ "to": "active"
458
+ },
459
+ {
460
+ "effects": [
461
+ [
462
+ "set",
463
+ "@entity.patrols",
464
+ [
465
+ "array/map",
466
+ "@config.patrols",
467
+ [
468
+ "fn",
469
+ "p",
470
+ [
471
+ "object/merge",
472
+ "@p",
473
+ {
474
+ "dir": 1.0,
475
+ "hit": false,
476
+ "touching": false,
477
+ "x": [
478
+ "object/get",
479
+ "@p",
480
+ "x0"
481
+ ]
482
+ }
483
+ ]
484
+ ]
485
+ ]
486
+ ]
487
+ ],
488
+ "event": "RESTART",
489
+ "eventId": "evt_01M0PCAKKX4Q8XWSYERBAF5HQ2",
490
+ "from": "active",
491
+ "to": "active"
492
+ }
493
+ ]
494
+ },
495
+ "ticks": [
496
+ {
497
+ "effects": [
498
+ [
499
+ "set",
500
+ "@entity.patrols",
501
+ [
502
+ "array/map",
503
+ "@entity.patrols",
504
+ [
505
+ "fn",
506
+ "p",
507
+ [
508
+ "let",
509
+ [
510
+ [
511
+ "nx",
512
+ [
513
+ "+",
514
+ [
515
+ "object/get",
516
+ "@p",
517
+ "x"
518
+ ],
519
+ [
520
+ "*",
521
+ [
522
+ "*",
523
+ [
524
+ "object/get",
525
+ "@p",
526
+ "dir"
527
+ ],
528
+ [
529
+ "object/get",
530
+ "@p",
531
+ "speed"
532
+ ]
533
+ ],
534
+ 0.033
535
+ ]
536
+ ]
537
+ ]
538
+ ],
539
+ [
540
+ "let",
541
+ [
542
+ [
543
+ "overshoot",
544
+ [
545
+ ">",
546
+ "@nx",
547
+ [
548
+ "object/get",
549
+ "@p",
550
+ "x1"
551
+ ]
552
+ ]
553
+ ],
554
+ [
555
+ "undershoot",
556
+ [
557
+ "<",
558
+ "@nx",
559
+ [
560
+ "object/get",
561
+ "@p",
562
+ "x0"
563
+ ]
564
+ ]
565
+ ]
566
+ ],
567
+ [
568
+ "let",
569
+ [
570
+ [
571
+ "cx",
572
+ [
573
+ "if",
574
+ "@overshoot",
575
+ [
576
+ "object/get",
577
+ "@p",
578
+ "x1"
579
+ ],
580
+ [
581
+ "if",
582
+ "@undershoot",
583
+ [
584
+ "object/get",
585
+ "@p",
586
+ "x0"
587
+ ],
588
+ "@nx"
589
+ ]
590
+ ]
591
+ ],
592
+ [
593
+ "cdir",
594
+ [
595
+ "if",
596
+ "@overshoot",
597
+ -1.0,
598
+ [
599
+ "if",
600
+ "@undershoot",
601
+ 1.0,
602
+ [
603
+ "object/get",
604
+ "@p",
605
+ "dir"
606
+ ]
607
+ ]
608
+ ]
609
+ ]
610
+ ],
611
+ [
612
+ "let",
613
+ [
614
+ [
615
+ "near",
616
+ [
617
+ "and",
618
+ [
619
+ "<=",
620
+ [
621
+ "math/abs",
622
+ [
623
+ "-",
624
+ "@entity.px",
625
+ "@cx"
626
+ ]
627
+ ],
628
+ "@config.hitRadius"
629
+ ],
630
+ [
631
+ "<=",
632
+ [
633
+ "math/abs",
634
+ [
635
+ "-",
636
+ "@entity.py",
637
+ [
638
+ "object/get",
639
+ "@p",
640
+ "y"
641
+ ]
642
+ ]
643
+ ],
644
+ "@config.hitRadius"
645
+ ]
646
+ ]
647
+ ]
648
+ ],
649
+ [
650
+ "object/merge",
651
+ "@p",
652
+ {
653
+ "dir": "@cdir",
654
+ "hit": [
655
+ "and",
656
+ "@near",
657
+ [
658
+ "==",
659
+ [
660
+ "object/get",
661
+ "@p",
662
+ "touching"
663
+ ],
664
+ false
665
+ ]
666
+ ],
667
+ "touching": "@near",
668
+ "x": "@cx"
669
+ }
670
+ ]
671
+ ]
672
+ ]
673
+ ]
674
+ ]
675
+ ]
676
+ ]
677
+ ],
678
+ [
679
+ "let",
680
+ [
681
+ [
682
+ "hits",
683
+ [
684
+ "array/filter",
685
+ "@entity.patrols",
686
+ [
687
+ "fn",
688
+ "p",
689
+ [
690
+ "==",
691
+ [
692
+ "object/get",
693
+ "@p",
694
+ "hit"
695
+ ],
696
+ true
697
+ ]
698
+ ]
699
+ ]
700
+ ]
701
+ ],
702
+ [
703
+ "if",
704
+ [
705
+ ">",
706
+ [
707
+ "array/len",
708
+ "@hits"
709
+ ],
710
+ 0.0
711
+ ],
712
+ [
713
+ "emit",
714
+ "PATROL_HIT",
715
+ {
716
+ "id": [
717
+ "object/get",
718
+ [
719
+ "array/first",
720
+ "@hits"
721
+ ],
722
+ "id"
723
+ ],
724
+ "x": [
725
+ "object/get",
726
+ [
727
+ "array/first",
728
+ "@hits"
729
+ ],
730
+ "x"
731
+ ],
732
+ "y": [
733
+ "object/get",
734
+ [
735
+ "array/first",
736
+ "@hits"
737
+ ],
738
+ "y"
739
+ ]
740
+ }
741
+ ],
742
+ null
743
+ ]
744
+ ]
745
+ ],
746
+ "guard": [
747
+ "and",
748
+ "@config.running",
749
+ [
750
+ ">",
751
+ [
752
+ "array/len",
753
+ "@entity.patrols"
754
+ ],
755
+ 0.0
756
+ ]
757
+ ],
758
+ "interval": 33.0,
759
+ "name": "patrolTick"
760
+ }
761
+ ]
762
+ }
763
+ ]
764
+ }
765
+ ],
766
+ "schemaVersion": 1,
767
+ "version": "1.0.0"
768
+ }