@almadar/std 16.204.0 → 16.206.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 (497) hide show
  1. package/behaviors/lolo/ml/organisms/std-escalating-decision.lolo +3 -3
  2. package/behaviors/lolo/ui/core/atoms/std-modal-editor.lolo +265 -13
  3. package/behaviors/lolo/ui/core/molecules/ui-code-block.lolo +5 -5
  4. package/behaviors/lolo/ui/core/molecules/ui-floating-toolbar.lolo +1 -1
  5. package/behaviors/lolo/ui/core/molecules/ui-menu.lolo +2 -1
  6. package/behaviors/lolo/ui/game/atoms/std-area-fill.lolo +8 -3
  7. package/behaviors/lolo/ui/game/atoms/std-choice-gate.lolo +7 -3
  8. package/behaviors/lolo/ui/game/atoms/std-coef-pad.lolo +8 -3
  9. package/behaviors/lolo/ui/game/atoms/std-gate-lock.lolo +8 -3
  10. package/behaviors/lolo/ui/game/atoms/std-loop-lock.lolo +7 -3
  11. package/behaviors/lolo/ui/game/atoms/std-pad-lock.lolo +10 -3
  12. package/behaviors/lolo/ui/game/atoms/std-patrol-hazard.lolo +9 -3
  13. package/behaviors/lolo/ui/game/atoms/std-pickup.lolo +29 -5
  14. package/behaviors/lolo/ui/game/atoms/std-platformer-body.lolo +36 -14
  15. package/behaviors/lolo/ui/game/atoms/std-velocity-gate.lolo +7 -3
  16. package/behaviors/lolo/ui/game/organisms/std-platformer-puzzle.lolo +302 -0
  17. package/behaviors/lolo/ui/learning/atoms/std-learn-slope-probe.lolo +12 -6
  18. package/behaviors/registry/agent/atoms/std-agent-completion.orb +27 -0
  19. package/behaviors/registry/agent/atoms/std-agent-context.orb +47 -0
  20. package/behaviors/registry/agent/atoms/std-agent-fix-loop.orb +57 -1
  21. package/behaviors/registry/agent/atoms/std-agent-memory.orb +88 -1
  22. package/behaviors/registry/agent/atoms/std-agent-planner.orb +58 -1
  23. package/behaviors/registry/agent/atoms/std-agent-session.orb +95 -1
  24. package/behaviors/registry/agent/atoms/std-agent-tool-call.orb +66 -1
  25. package/behaviors/registry/agent/atoms/std-agent-tool-loop.orb +74 -1
  26. package/behaviors/registry/agent/atoms/std-agent-trace.orb +38 -0
  27. package/behaviors/registry/agent/organisms/std-agent-builder.orb +70 -1
  28. package/behaviors/registry/agent/organisms/std-agent-rabit.orb +239 -2
  29. package/behaviors/registry/infra/atoms/std-anim-tick.orb +24 -0
  30. package/behaviors/registry/infra/atoms/std-approval-gate.orb +73 -20
  31. package/behaviors/registry/infra/atoms/std-audit-capture.orb +38 -0
  32. package/behaviors/registry/infra/atoms/std-cache-aside.orb +45 -62
  33. package/behaviors/registry/infra/atoms/std-calendar-sync.orb +113 -1
  34. package/behaviors/registry/infra/atoms/std-cascade-on-delete.orb +32 -0
  35. package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +38 -32
  36. package/behaviors/registry/infra/atoms/std-cooldown.orb +28 -0
  37. package/behaviors/registry/infra/atoms/std-cross-reference.orb +55 -1
  38. package/behaviors/registry/infra/atoms/std-data-erasure.orb +52 -16
  39. package/behaviors/registry/infra/atoms/std-game-clock.orb +20 -0
  40. package/behaviors/registry/infra/atoms/std-lifecycle.orb +34 -0
  41. package/behaviors/registry/infra/atoms/std-migration-job.orb +165 -1
  42. package/behaviors/registry/infra/atoms/std-mod-queue.orb +23 -16
  43. package/behaviors/registry/infra/atoms/std-notification-center.orb +119 -1
  44. package/behaviors/registry/infra/atoms/std-notify-on-event.orb +162 -1
  45. package/behaviors/registry/infra/atoms/std-rate-limiter.orb +32 -28
  46. package/behaviors/registry/infra/atoms/std-reminder-scheduler.orb +30 -0
  47. package/behaviors/registry/infra/atoms/std-row-access-control.orb +58 -1
  48. package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +34 -1
  49. package/behaviors/registry/infra/organisms/std-status-lifecycle-control.orb +33 -2
  50. package/behaviors/registry/ml/atoms/std-data-collector.orb +18 -0
  51. package/behaviors/registry/ml/atoms/std-graph-builder.orb +41 -1
  52. package/behaviors/registry/ml/atoms/std-ml-classify.orb +67 -1
  53. package/behaviors/registry/ml/atoms/std-ml-exact-check.orb +18 -0
  54. package/behaviors/registry/ml/atoms/std-ml-infer.orb +125 -1
  55. package/behaviors/registry/ml/atoms/std-ml-label-capture.orb +34 -0
  56. package/behaviors/registry/ml/atoms/std-ml-lookup.orb +18 -0
  57. package/behaviors/registry/ml/atoms/std-ml-posterior.orb +42 -0
  58. package/behaviors/registry/ml/atoms/std-ml-similarity.orb +82 -1
  59. package/behaviors/registry/ml/atoms/std-tokenizer.orb +30 -0
  60. package/behaviors/registry/ml/atoms/std-weight-validator.orb +60 -1
  61. package/behaviors/registry/ml/organisms/std-escalating-decision.orb +122 -13
  62. package/behaviors/registry/ml/organisms/std-knowledge-tracing.orb +51 -4
  63. package/behaviors/registry/ui/avl/atoms/ui-behavior-view.orb +6 -0
  64. package/behaviors/registry/ui/avl/atoms/ui-module-card.orb +6 -0
  65. package/behaviors/registry/ui/core/atoms/std-app-layout.orb +10 -0
  66. package/behaviors/registry/ui/core/atoms/std-app-search.orb +110 -1
  67. package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +119 -2
  68. package/behaviors/registry/ui/core/atoms/std-board.orb +180 -1
  69. package/behaviors/registry/ui/core/atoms/std-browse.orb +143 -6
  70. package/behaviors/registry/ui/core/atoms/std-calendar.orb +59 -1
  71. package/behaviors/registry/ui/core/atoms/std-confirmation.orb +18 -0
  72. package/behaviors/registry/ui/core/atoms/std-dashboard-grid-embedded.orb +13 -2
  73. package/behaviors/registry/ui/core/atoms/std-date-range.orb +14 -0
  74. package/behaviors/registry/ui/core/atoms/std-detail-layout.orb +13 -0
  75. package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +39 -4
  76. package/behaviors/registry/ui/core/atoms/std-esign-request.orb +20 -6
  77. package/behaviors/registry/ui/core/atoms/std-event-log.orb +146 -1
  78. package/behaviors/registry/ui/core/atoms/std-export.orb +35 -4
  79. package/behaviors/registry/ui/core/atoms/std-file-store.orb +26 -0
  80. package/behaviors/registry/ui/core/atoms/std-filter.orb +57 -1
  81. package/behaviors/registry/ui/core/atoms/std-form-advanced.orb +66 -1
  82. package/behaviors/registry/ui/core/atoms/std-gallery.orb +44 -18
  83. package/behaviors/registry/ui/core/atoms/std-geosearch.orb +22 -0
  84. package/behaviors/registry/ui/core/atoms/std-graphs.orb +71 -1
  85. package/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +67 -1
  86. package/behaviors/registry/ui/core/atoms/std-import.orb +69 -4
  87. package/behaviors/registry/ui/core/atoms/std-list.orb +36 -6
  88. package/behaviors/registry/ui/core/atoms/std-modal-editor.orb +1865 -169
  89. package/behaviors/registry/ui/core/atoms/std-modal.orb +44 -1
  90. package/behaviors/registry/ui/core/atoms/std-multi-party-flow.orb +201 -1
  91. package/behaviors/registry/ui/core/atoms/std-notification-panel.orb +24 -1
  92. package/behaviors/registry/ui/core/atoms/std-pagination.orb +35 -1
  93. package/behaviors/registry/ui/core/atoms/std-rating-review.orb +159 -1
  94. package/behaviors/registry/ui/core/atoms/std-record-detail.orb +144 -1
  95. package/behaviors/registry/ui/core/atoms/std-recurrence.orb +103 -1
  96. package/behaviors/registry/ui/core/atoms/std-related.orb +14 -0
  97. package/behaviors/registry/ui/core/atoms/std-saved-search.orb +30 -0
  98. package/behaviors/registry/ui/core/atoms/std-scatter.orb +51 -1
  99. package/behaviors/registry/ui/core/atoms/std-search.orb +10 -0
  100. package/behaviors/registry/ui/core/atoms/std-selection.orb +28 -1
  101. package/behaviors/registry/ui/core/atoms/std-signature-capture.orb +18 -0
  102. package/behaviors/registry/ui/core/atoms/std-stats.orb +153 -1
  103. package/behaviors/registry/ui/core/atoms/std-step-flow.orb +154 -1
  104. package/behaviors/registry/ui/core/atoms/std-tabs.orb +41 -1
  105. package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +34 -0
  106. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +48 -1
  107. package/behaviors/registry/ui/core/atoms/std-thread.orb +30 -0
  108. package/behaviors/registry/ui/core/atoms/std-tree.orb +36 -1
  109. package/behaviors/registry/ui/core/atoms/std-version-history.orb +54 -0
  110. package/behaviors/registry/ui/core/atoms/std-vote.orb +22 -0
  111. package/behaviors/registry/ui/core/atoms/std-wizard.orb +130 -1
  112. package/behaviors/registry/ui/core/atoms/ui-aside.orb +6 -0
  113. package/behaviors/registry/ui/core/atoms/ui-atlas-image.orb +6 -0
  114. package/behaviors/registry/ui/core/atoms/ui-atlas-panel.orb +6 -0
  115. package/behaviors/registry/ui/core/atoms/ui-avatar.orb +6 -0
  116. package/behaviors/registry/ui/core/atoms/ui-badge.orb +6 -0
  117. package/behaviors/registry/ui/core/atoms/ui-box.orb +6 -0
  118. package/behaviors/registry/ui/core/atoms/ui-button.orb +6 -0
  119. package/behaviors/registry/ui/core/atoms/ui-card.orb +6 -0
  120. package/behaviors/registry/ui/core/atoms/ui-center.orb +6 -0
  121. package/behaviors/registry/ui/core/atoms/ui-checkbox.orb +6 -0
  122. package/behaviors/registry/ui/core/atoms/ui-conditional-wrapper.orb +6 -0
  123. package/behaviors/registry/ui/core/atoms/ui-confetti-effect.orb +6 -0
  124. package/behaviors/registry/ui/core/atoms/ui-day-cell.orb +6 -0
  125. package/behaviors/registry/ui/core/atoms/ui-dialog.orb +6 -0
  126. package/behaviors/registry/ui/core/atoms/ui-divider.orb +6 -0
  127. package/behaviors/registry/ui/core/atoms/ui-filter-pill.orb +10 -0
  128. package/behaviors/registry/ui/core/atoms/ui-flip-container.orb +6 -0
  129. package/behaviors/registry/ui/core/atoms/ui-game-icon.orb +6 -0
  130. package/behaviors/registry/ui/core/atoms/ui-hstack.orb +6 -0
  131. package/behaviors/registry/ui/core/atoms/ui-icon.orb +6 -0
  132. package/behaviors/registry/ui/core/atoms/ui-infinite-scroll-sentinel.orb +6 -0
  133. package/behaviors/registry/ui/core/atoms/ui-input.orb +10 -0
  134. package/behaviors/registry/ui/core/atoms/ui-label.orb +6 -0
  135. package/behaviors/registry/ui/core/atoms/ui-law-reference-tooltip.orb +6 -0
  136. package/behaviors/registry/ui/core/atoms/ui-overlay.orb +6 -0
  137. package/behaviors/registry/ui/core/atoms/ui-presence.orb +6 -0
  138. package/behaviors/registry/ui/core/atoms/ui-progress-bar.orb +6 -0
  139. package/behaviors/registry/ui/core/atoms/ui-radio.orb +10 -0
  140. package/behaviors/registry/ui/core/atoms/ui-range-slider.orb +10 -0
  141. package/behaviors/registry/ui/core/atoms/ui-section-header.orb +6 -0
  142. package/behaviors/registry/ui/core/atoms/ui-select.orb +6 -0
  143. package/behaviors/registry/ui/core/atoms/ui-spacer.orb +6 -0
  144. package/behaviors/registry/ui/core/atoms/ui-sparkline.orb +6 -0
  145. package/behaviors/registry/ui/core/atoms/ui-spinner.orb +6 -0
  146. package/behaviors/registry/ui/core/atoms/ui-stack.orb +6 -0
  147. package/behaviors/registry/ui/core/atoms/ui-status-dot.orb +6 -0
  148. package/behaviors/registry/ui/core/atoms/ui-svg-branch.orb +6 -0
  149. package/behaviors/registry/ui/core/atoms/ui-svg-connection.orb +6 -0
  150. package/behaviors/registry/ui/core/atoms/ui-svg-flow.orb +6 -0
  151. package/behaviors/registry/ui/core/atoms/ui-svg-grid.orb +6 -0
  152. package/behaviors/registry/ui/core/atoms/ui-svg-lobe.orb +6 -0
  153. package/behaviors/registry/ui/core/atoms/ui-svg-mesh.orb +6 -0
  154. package/behaviors/registry/ui/core/atoms/ui-svg-morph.orb +6 -0
  155. package/behaviors/registry/ui/core/atoms/ui-svg-node.orb +6 -0
  156. package/behaviors/registry/ui/core/atoms/ui-svg-pulse.orb +6 -0
  157. package/behaviors/registry/ui/core/atoms/ui-svg-ring.orb +6 -0
  158. package/behaviors/registry/ui/core/atoms/ui-svg-shield.orb +6 -0
  159. package/behaviors/registry/ui/core/atoms/ui-svg-stack.orb +6 -0
  160. package/behaviors/registry/ui/core/atoms/ui-switch.orb +10 -0
  161. package/behaviors/registry/ui/core/atoms/ui-text-highlight.orb +10 -0
  162. package/behaviors/registry/ui/core/atoms/ui-textarea.orb +6 -0
  163. package/behaviors/registry/ui/core/atoms/ui-theme-toggle.orb +6 -0
  164. package/behaviors/registry/ui/core/atoms/ui-time-slot-cell.orb +10 -0
  165. package/behaviors/registry/ui/core/atoms/ui-trait-frame.orb +6 -0
  166. package/behaviors/registry/ui/core/atoms/ui-trend-indicator.orb +6 -0
  167. package/behaviors/registry/ui/core/atoms/ui-typewriter-text.orb +6 -0
  168. package/behaviors/registry/ui/core/atoms/ui-typography.orb +6 -0
  169. package/behaviors/registry/ui/core/atoms/ui-vstack.orb +6 -0
  170. package/behaviors/registry/ui/core/molecules/std-stat-rows.orb +24 -1
  171. package/behaviors/registry/ui/core/molecules/ui-accordion.orb +6 -0
  172. package/behaviors/registry/ui/core/molecules/ui-activation-block.orb +6 -0
  173. package/behaviors/registry/ui/core/molecules/ui-alert.orb +6 -0
  174. package/behaviors/registry/ui/core/molecules/ui-bloom-quiz-block.orb +6 -0
  175. package/behaviors/registry/ui/core/molecules/ui-branching-logic-builder.orb +6 -0
  176. package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +6 -0
  177. package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +10 -0
  178. package/behaviors/registry/ui/core/molecules/ui-carousel.orb +6 -0
  179. package/behaviors/registry/ui/core/molecules/ui-chart-legend.orb +6 -0
  180. package/behaviors/registry/ui/core/molecules/ui-chart.orb +6 -0
  181. package/behaviors/registry/ui/core/molecules/ui-code-block.orb +38 -4
  182. package/behaviors/registry/ui/core/molecules/ui-command-palette.orb +10 -0
  183. package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +10 -0
  184. package/behaviors/registry/ui/core/molecules/ui-connection-block.orb +6 -0
  185. package/behaviors/registry/ui/core/molecules/ui-container.orb +6 -0
  186. package/behaviors/registry/ui/core/molecules/ui-content-renderer.orb +6 -0
  187. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +10 -0
  188. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +10 -0
  189. package/behaviors/registry/ui/core/molecules/ui-date-range-picker.orb +14 -0
  190. package/behaviors/registry/ui/core/molecules/ui-date-range-selector.orb +6 -0
  191. package/behaviors/registry/ui/core/molecules/ui-doc-breadcrumb.orb +6 -0
  192. package/behaviors/registry/ui/core/molecules/ui-doc-pagination.orb +6 -0
  193. package/behaviors/registry/ui/core/molecules/ui-doc-search.orb +6 -0
  194. package/behaviors/registry/ui/core/molecules/ui-doc-sidebar.orb +6 -0
  195. package/behaviors/registry/ui/core/molecules/ui-doc-toc.orb +6 -0
  196. package/behaviors/registry/ui/core/molecules/ui-document-details.orb +10 -0
  197. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +14 -0
  198. package/behaviors/registry/ui/core/molecules/ui-document-viewer.orb +6 -0
  199. package/behaviors/registry/ui/core/molecules/ui-drawer.orb +10 -0
  200. package/behaviors/registry/ui/core/molecules/ui-edge-decoration.orb +6 -0
  201. package/behaviors/registry/ui/core/molecules/ui-emoji-picker.orb +6 -0
  202. package/behaviors/registry/ui/core/molecules/ui-empty-state.orb +6 -0
  203. package/behaviors/registry/ui/core/molecules/ui-error-boundary.orb +6 -0
  204. package/behaviors/registry/ui/core/molecules/ui-error-state.orb +6 -0
  205. package/behaviors/registry/ui/core/molecules/ui-feature-grid.orb +6 -0
  206. package/behaviors/registry/ui/core/molecules/ui-file-tree.orb +6 -0
  207. package/behaviors/registry/ui/core/molecules/ui-filter-group.orb +14 -0
  208. package/behaviors/registry/ui/core/molecules/ui-flex.orb +6 -0
  209. package/behaviors/registry/ui/core/molecules/ui-flip-card.orb +6 -0
  210. package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +6 -0
  211. package/behaviors/registry/ui/core/molecules/ui-floating-toolbar.orb +10 -1
  212. package/behaviors/registry/ui/core/molecules/ui-form-actions.orb +10 -0
  213. package/behaviors/registry/ui/core/molecules/ui-form-field.orb +6 -0
  214. package/behaviors/registry/ui/core/molecules/ui-form-layout.orb +6 -0
  215. package/behaviors/registry/ui/core/molecules/ui-form-section-header.orb +6 -0
  216. package/behaviors/registry/ui/core/molecules/ui-fx-overlay.orb +6 -0
  217. package/behaviors/registry/ui/core/molecules/ui-gradient-divider.orb +6 -0
  218. package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +6 -0
  219. package/behaviors/registry/ui/core/molecules/ui-graph-view.orb +6 -0
  220. package/behaviors/registry/ui/core/molecules/ui-grid.orb +6 -0
  221. package/behaviors/registry/ui/core/molecules/ui-header.orb +6 -0
  222. package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +6 -0
  223. package/behaviors/registry/ui/core/molecules/ui-import-progress.orb +6 -0
  224. package/behaviors/registry/ui/core/molecules/ui-import-source-picker.orb +6 -0
  225. package/behaviors/registry/ui/core/molecules/ui-input-group.orb +10 -0
  226. package/behaviors/registry/ui/core/molecules/ui-jazari-state-machine.orb +6 -0
  227. package/behaviors/registry/ui/core/molecules/ui-lightbox.orb +10 -0
  228. package/behaviors/registry/ui/core/molecules/ui-likert-scale.orb +6 -0
  229. package/behaviors/registry/ui/core/molecules/ui-line-chart.orb +6 -0
  230. package/behaviors/registry/ui/core/molecules/ui-loading-state.orb +6 -0
  231. package/behaviors/registry/ui/core/molecules/ui-map-view.orb +6 -0
  232. package/behaviors/registry/ui/core/molecules/ui-markdown-content.orb +6 -0
  233. package/behaviors/registry/ui/core/molecules/ui-matrix-question.orb +6 -0
  234. package/behaviors/registry/ui/core/molecules/ui-menu.orb +21 -0
  235. package/behaviors/registry/ui/core/molecules/ui-meter.orb +6 -0
  236. package/behaviors/registry/ui/core/molecules/ui-modal.orb +10 -0
  237. package/behaviors/registry/ui/core/molecules/ui-navigation.orb +6 -0
  238. package/behaviors/registry/ui/core/molecules/ui-notification.orb +6 -0
  239. package/behaviors/registry/ui/core/molecules/ui-number-stepper.orb +10 -0
  240. package/behaviors/registry/ui/core/molecules/ui-option-constraint-group.orb +6 -0
  241. package/behaviors/registry/ui/core/molecules/ui-orbital-visualization.orb +6 -0
  242. package/behaviors/registry/ui/core/molecules/ui-page-header.orb +6 -0
  243. package/behaviors/registry/ui/core/molecules/ui-page-transition.orb +6 -0
  244. package/behaviors/registry/ui/core/molecules/ui-pagination.orb +10 -0
  245. package/behaviors/registry/ui/core/molecules/ui-popover.orb +10 -0
  246. package/behaviors/registry/ui/core/molecules/ui-positioned-canvas.orb +10 -0
  247. package/behaviors/registry/ui/core/molecules/ui-progress-dots.orb +6 -0
  248. package/behaviors/registry/ui/core/molecules/ui-pull-to-refresh.orb +6 -0
  249. package/behaviors/registry/ui/core/molecules/ui-qr-scanner.orb +6 -0
  250. package/behaviors/registry/ui/core/molecules/ui-quiz-block.orb +6 -0
  251. package/behaviors/registry/ui/core/molecules/ui-reflection-block.orb +6 -0
  252. package/behaviors/registry/ui/core/molecules/ui-relation-select.orb +10 -0
  253. package/behaviors/registry/ui/core/molecules/ui-repeatable-form-section.orb +6 -0
  254. package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +10 -0
  255. package/behaviors/registry/ui/core/molecules/ui-rich-text-editor.orb +10 -0
  256. package/behaviors/registry/ui/core/molecules/ui-scaled-diagram.orb +6 -0
  257. package/behaviors/registry/ui/core/molecules/ui-search-input.orb +14 -0
  258. package/behaviors/registry/ui/core/molecules/ui-section.orb +6 -0
  259. package/behaviors/registry/ui/core/molecules/ui-side-panel.orb +10 -0
  260. package/behaviors/registry/ui/core/molecules/ui-sidebar.orb +10 -0
  261. package/behaviors/registry/ui/core/molecules/ui-signature-pad.orb +6 -0
  262. package/behaviors/registry/ui/core/molecules/ui-simple-grid.orb +6 -0
  263. package/behaviors/registry/ui/core/molecules/ui-skeleton.orb +6 -0
  264. package/behaviors/registry/ui/core/molecules/ui-social-proof.orb +6 -0
  265. package/behaviors/registry/ui/core/molecules/ui-sortable-list.orb +10 -0
  266. package/behaviors/registry/ui/core/molecules/ui-split.orb +6 -0
  267. package/behaviors/registry/ui/core/molecules/ui-star-rating.orb +10 -0
  268. package/behaviors/registry/ui/core/molecules/ui-stat-display.orb +6 -0
  269. package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +6 -0
  270. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +10 -0
  271. package/behaviors/registry/ui/core/molecules/ui-tabs.orb +6 -0
  272. package/behaviors/registry/ui/core/molecules/ui-tag-input.orb +6 -0
  273. package/behaviors/registry/ui/core/molecules/ui-tooltip.orb +6 -0
  274. package/behaviors/registry/ui/core/molecules/ui-upload-drop-zone.orb +6 -0
  275. package/behaviors/registry/ui/core/molecules/ui-version-diff.orb +6 -0
  276. package/behaviors/registry/ui/core/molecules/ui-violation-alert.orb +6 -0
  277. package/behaviors/registry/ui/core/molecules/ui-vote-stack.orb +6 -0
  278. package/behaviors/registry/ui/core/molecules/ui-wizard-container.orb +6 -0
  279. package/behaviors/registry/ui/core/molecules/ui-wizard-navigation.orb +14 -0
  280. package/behaviors/registry/ui/core/molecules/ui-wizard-progress.orb +6 -0
  281. package/behaviors/registry/ui/core/organisms/ui-chat-bar.orb +6 -0
  282. package/behaviors/registry/ui/core/organisms/ui-code-runner-panel.orb +6 -0
  283. package/behaviors/registry/ui/core/organisms/ui-dashboard-grid.orb +6 -0
  284. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +10 -0
  285. package/behaviors/registry/ui/core/organisms/ui-dock-layout.orb +6 -0
  286. package/behaviors/registry/ui/core/organisms/ui-drawer-slot.orb +10 -0
  287. package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +10 -0
  288. package/behaviors/registry/ui/core/organisms/ui-entity-list.orb +10 -0
  289. package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +10 -0
  290. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +10 -0
  291. package/behaviors/registry/ui/core/organisms/ui-form.orb +10 -0
  292. package/behaviors/registry/ui/core/organisms/ui-master-detail-layout.orb +6 -0
  293. package/behaviors/registry/ui/core/organisms/ui-master-detail.orb +10 -0
  294. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +10 -0
  295. package/behaviors/registry/ui/core/organisms/ui-modal-slot.orb +10 -0
  296. package/behaviors/registry/ui/core/organisms/ui-runtime-debugger.orb +6 -0
  297. package/behaviors/registry/ui/core/organisms/ui-segment-renderer.orb +6 -0
  298. package/behaviors/registry/ui/core/organisms/ui-split-pane.orb +10 -0
  299. package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +10 -0
  300. package/behaviors/registry/ui/core/organisms/ui-state-machine-view.orb +6 -0
  301. package/behaviors/registry/ui/core/organisms/ui-subagent-trace-panel.orb +10 -0
  302. package/behaviors/registry/ui/core/organisms/ui-tabbed-container.orb +6 -0
  303. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +10 -0
  304. package/behaviors/registry/ui/core/organisms/ui-toast-slot.orb +10 -0
  305. package/behaviors/registry/ui/core/templates/ui-counter-template.orb +10 -0
  306. package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +6 -0
  307. package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +10 -0
  308. package/behaviors/registry/ui/game/atoms/std-arcade-flow.orb +10 -0
  309. package/behaviors/registry/ui/game/atoms/std-arcade-play.orb +89 -1
  310. package/behaviors/registry/ui/game/atoms/std-area-fill.orb +219 -4
  311. package/behaviors/registry/ui/game/atoms/std-audio-cue.orb +30 -0
  312. package/behaviors/registry/ui/game/atoms/std-camera-rig.orb +63 -0
  313. package/behaviors/registry/ui/game/atoms/std-chase-ai.orb +133 -1
  314. package/behaviors/registry/ui/game/atoms/std-choice-gate.orb +122 -3
  315. package/behaviors/registry/ui/game/atoms/std-coef-pad.orb +159 -3
  316. package/behaviors/registry/ui/game/atoms/std-curve-fog.orb +26 -1
  317. package/behaviors/registry/ui/game/atoms/std-dungeon-combat.orb +150 -1
  318. package/behaviors/registry/ui/game/atoms/std-fx-narrative.orb +18 -0
  319. package/behaviors/registry/ui/game/atoms/std-fx-particles.orb +15 -0
  320. package/behaviors/registry/ui/game/atoms/std-fx-trail.orb +40 -1
  321. package/behaviors/registry/ui/game/atoms/std-gate-lock.orb +120 -3
  322. package/behaviors/registry/ui/game/atoms/std-gather.orb +180 -1
  323. package/behaviors/registry/ui/game/atoms/std-gold.orb +10 -0
  324. package/behaviors/registry/ui/game/atoms/std-grid-tactics.orb +130 -1
  325. package/behaviors/registry/ui/game/atoms/std-hero-nav.orb +92 -1
  326. package/behaviors/registry/ui/game/atoms/std-lives.orb +38 -0
  327. package/behaviors/registry/ui/game/atoms/std-loop-lock.orb +117 -3
  328. package/behaviors/registry/ui/game/atoms/std-market-flow.orb +10 -0
  329. package/behaviors/registry/ui/game/atoms/std-mesh-asset-art.orb +10 -0
  330. package/behaviors/registry/ui/game/atoms/std-motion-body.orb +68 -1
  331. package/behaviors/registry/ui/game/atoms/std-objective-flow.orb +10 -0
  332. package/behaviors/registry/ui/game/atoms/std-objective-reach.orb +184 -1
  333. package/behaviors/registry/ui/game/atoms/std-pad-lock.orb +118 -3
  334. package/behaviors/registry/ui/game/atoms/std-patience.orb +215 -1
  335. package/behaviors/registry/ui/game/atoms/std-patrol-hazard.orb +161 -3
  336. package/behaviors/registry/ui/game/atoms/std-pickup.orb +387 -24
  337. package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +505 -17
  338. package/behaviors/registry/ui/game/atoms/std-production.orb +14 -0
  339. package/behaviors/registry/ui/game/atoms/std-round-flow.orb +10 -0
  340. package/behaviors/registry/ui/game/atoms/std-score.orb +10 -0
  341. package/behaviors/registry/ui/game/atoms/std-survival-flow.orb +10 -0
  342. package/behaviors/registry/ui/game/atoms/std-svg-asset-art.orb +10 -0
  343. package/behaviors/registry/ui/game/atoms/std-tutorial-autodemo.orb +117 -1
  344. package/behaviors/registry/ui/game/atoms/std-tutorial-overlay.orb +36 -0
  345. package/behaviors/registry/ui/game/atoms/std-velocity-gate.orb +140 -3
  346. package/behaviors/registry/ui/game/atoms/std-xp.orb +22 -0
  347. package/behaviors/registry/ui/game/atoms/std-zone-card.orb +70 -1
  348. package/behaviors/registry/ui/game/atoms/ui-action-palette.orb +6 -0
  349. package/behaviors/registry/ui/game/atoms/ui-action-tile.orb +6 -0
  350. package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +6 -0
  351. package/behaviors/registry/ui/game/atoms/ui-canvas.orb +6 -0
  352. package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +6 -0
  353. package/behaviors/registry/ui/game/atoms/ui-control-button.orb +6 -0
  354. package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +6 -0
  355. package/behaviors/registry/ui/game/atoms/ui-dialogue-bubble.orb +6 -0
  356. package/behaviors/registry/ui/game/atoms/ui-draw-fx-layer.orb +6 -0
  357. package/behaviors/registry/ui/game/atoms/ui-draw-group.orb +6 -0
  358. package/behaviors/registry/ui/game/atoms/ui-draw-mesh.orb +6 -0
  359. package/behaviors/registry/ui/game/atoms/ui-draw-shape-layer.orb +6 -0
  360. package/behaviors/registry/ui/game/atoms/ui-draw-shape.orb +6 -0
  361. package/behaviors/registry/ui/game/atoms/ui-draw-sprite-layer.orb +6 -0
  362. package/behaviors/registry/ui/game/atoms/ui-draw-sprite.orb +6 -0
  363. package/behaviors/registry/ui/game/atoms/ui-draw-text-layer.orb +6 -0
  364. package/behaviors/registry/ui/game/atoms/ui-draw-text.orb +6 -0
  365. package/behaviors/registry/ui/game/atoms/ui-game-audio-cue.orb +6 -0
  366. package/behaviors/registry/ui/game/atoms/ui-game-audio-toggle.orb +6 -0
  367. package/behaviors/registry/ui/game/atoms/ui-game-hud.orb +6 -0
  368. package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +6 -0
  369. package/behaviors/registry/ui/game/atoms/ui-health-bar.orb +6 -0
  370. package/behaviors/registry/ui/game/atoms/ui-score-display.orb +6 -0
  371. package/behaviors/registry/ui/game/atoms/ui-sequence-bar.orb +6 -0
  372. package/behaviors/registry/ui/game/atoms/ui-stat-badge.orb +6 -0
  373. package/behaviors/registry/ui/game/atoms/ui-state-graph.orb +6 -0
  374. package/behaviors/registry/ui/game/atoms/ui-state-json-view.orb +6 -0
  375. package/behaviors/registry/ui/game/atoms/ui-timer-display.orb +84 -1
  376. package/behaviors/registry/ui/game/atoms/ui-trait-slot.orb +10 -0
  377. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +567 -8
  378. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +545 -6
  379. package/behaviors/registry/ui/game/organisms/std-dungeon-board-2d.orb +804 -10
  380. package/behaviors/registry/ui/game/organisms/std-market-board-3d.orb +597 -8
  381. package/behaviors/registry/ui/game/organisms/std-objective-board-3d.orb +565 -8
  382. package/behaviors/registry/ui/game/organisms/std-platformer-board-2d.orb +561 -6
  383. package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +2075 -0
  384. package/behaviors/registry/ui/game/organisms/std-survival-board-3d.orb +551 -8
  385. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +667 -12
  386. package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +707 -8
  387. package/behaviors/registry/ui/game/organisms/std-worldmap-board-2d.orb +506 -6
  388. package/behaviors/registry/ui/game/templates/ui-game-shell.orb +115 -1
  389. package/behaviors/registry/ui/learning/atoms/std-learn-arrangement.orb +201 -1
  390. package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +325 -1
  391. package/behaviors/registry/ui/learning/atoms/std-learn-compare.orb +108 -1
  392. package/behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb +147 -1
  393. package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +190 -1
  394. package/behaviors/registry/ui/learning/atoms/std-learn-diagram.orb +111 -1
  395. package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +164 -1
  396. package/behaviors/registry/ui/learning/atoms/std-learn-estimate.orb +105 -1
  397. package/behaviors/registry/ui/learning/atoms/std-learn-fx-cues.orb +169 -1
  398. package/behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb +128 -1
  399. package/behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb +123 -2
  400. package/behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb +178 -1
  401. package/behaviors/registry/ui/learning/atoms/std-learn-live-sim.orb +105 -1
  402. package/behaviors/registry/ui/learning/atoms/std-learn-measure.orb +145 -1
  403. package/behaviors/registry/ui/learning/atoms/std-learn-param-explorer.orb +100 -1
  404. package/behaviors/registry/ui/learning/atoms/std-learn-perturb.orb +133 -1
  405. package/behaviors/registry/ui/learning/atoms/std-learn-predict.orb +247 -1
  406. package/behaviors/registry/ui/learning/atoms/std-learn-sample-accumulator.orb +180 -1
  407. package/behaviors/registry/ui/learning/atoms/std-learn-sandbox.orb +135 -1
  408. package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +206 -1
  409. package/behaviors/registry/ui/learning/atoms/std-learn-scenario.orb +129 -1
  410. package/behaviors/registry/ui/learning/atoms/std-learn-sim-3d.orb +53 -0
  411. package/behaviors/registry/ui/learning/atoms/std-learn-slope-probe.orb +168 -8
  412. package/behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb +135 -1
  413. package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +254 -1
  414. package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +315 -1
  415. package/behaviors/registry/ui/learning/atoms/std-learn-trace-player.orb +131 -1
  416. package/behaviors/registry/ui/learning/atoms/std-learn-transport.orb +57 -0
  417. package/behaviors/registry/ui/learning/atoms/std-learn-tree.orb +214 -1
  418. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +6 -0
  419. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +6 -0
  420. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +6 -0
  421. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +6 -0
  422. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +6 -0
  423. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +6 -0
  424. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +6 -0
  425. package/behaviors/registry/ui/marketing/atoms/std-marketing-article.orb +1 -2
  426. package/behaviors/registry/ui/marketing/atoms/std-marketing-cta.orb +14 -0
  427. package/behaviors/registry/ui/marketing/atoms/std-marketing-features.orb +37 -1
  428. package/behaviors/registry/ui/marketing/atoms/std-marketing-footer.orb +52 -2
  429. package/behaviors/registry/ui/marketing/atoms/std-marketing-hero.orb +14 -0
  430. package/behaviors/registry/ui/marketing/atoms/std-marketing-nav.orb +25 -1
  431. package/behaviors/registry/ui/marketing/atoms/std-marketing-pricing.orb +59 -1
  432. package/behaviors/registry/ui/marketing/atoms/std-marketing-showcase.orb +62 -1
  433. package/behaviors/registry/ui/marketing/atoms/std-marketing-split.orb +1 -2
  434. package/behaviors/registry/ui/marketing/atoms/std-marketing-stats.orb +15 -2
  435. package/behaviors/registry/ui/marketing/atoms/std-marketing-steps.orb +28 -2
  436. package/behaviors/registry/ui/marketing/atoms/std-marketing-team.orb +33 -2
  437. package/behaviors/registry/ui/marketing/atoms/ui-animated-counter.orb +6 -0
  438. package/behaviors/registry/ui/marketing/atoms/ui-animated-graphic.orb +6 -0
  439. package/behaviors/registry/ui/marketing/atoms/ui-animated-reveal.orb +6 -0
  440. package/behaviors/registry/ui/marketing/atoms/ui-article-section.orb +6 -0
  441. package/behaviors/registry/ui/marketing/atoms/ui-case-study-card.orb +6 -0
  442. package/behaviors/registry/ui/marketing/atoms/ui-community-links.orb +6 -0
  443. package/behaviors/registry/ui/marketing/atoms/ui-content-section.orb +6 -0
  444. package/behaviors/registry/ui/marketing/atoms/ui-cta-banner.orb +6 -0
  445. package/behaviors/registry/ui/marketing/atoms/ui-feature-card.orb +6 -0
  446. package/behaviors/registry/ui/marketing/atoms/ui-geometric-pattern.orb +6 -0
  447. package/behaviors/registry/ui/marketing/atoms/ui-hero-section.orb +6 -0
  448. package/behaviors/registry/ui/marketing/atoms/ui-install-box.orb +6 -0
  449. package/behaviors/registry/ui/marketing/atoms/ui-marketing-footer.orb +6 -0
  450. package/behaviors/registry/ui/marketing/atoms/ui-marketing-stat-card.orb +6 -0
  451. package/behaviors/registry/ui/marketing/atoms/ui-pattern-tile.orb +6 -0
  452. package/behaviors/registry/ui/marketing/atoms/ui-pricing-card.orb +6 -0
  453. package/behaviors/registry/ui/marketing/atoms/ui-pricing-grid.orb +6 -0
  454. package/behaviors/registry/ui/marketing/atoms/ui-pull-quote.orb +6 -0
  455. package/behaviors/registry/ui/marketing/atoms/ui-service-catalog.orb +6 -0
  456. package/behaviors/registry/ui/marketing/atoms/ui-showcase-card.orb +6 -0
  457. package/behaviors/registry/ui/marketing/atoms/ui-split-section.orb +6 -0
  458. package/behaviors/registry/ui/marketing/atoms/ui-stats-grid.orb +6 -0
  459. package/behaviors/registry/ui/marketing/atoms/ui-step-flow.orb +6 -0
  460. package/behaviors/registry/ui/marketing/atoms/ui-tag-cloud.orb +6 -0
  461. package/behaviors/registry/ui/marketing/atoms/ui-team-card.orb +6 -0
  462. package/behaviors/registry/ui/marketing/organisms/ui-book-chapter-view.orb +10 -0
  463. package/behaviors/registry/ui/marketing/organisms/ui-book-cover-page.orb +6 -0
  464. package/behaviors/registry/ui/marketing/organisms/ui-book-nav-bar.orb +6 -0
  465. package/behaviors/registry/ui/marketing/organisms/ui-book-table-of-contents.orb +10 -0
  466. package/behaviors/registry/ui/marketing/organisms/ui-book-viewer.orb +10 -0
  467. package/behaviors/registry/ui/marketing/organisms/ui-case-study-organism.orb +10 -0
  468. package/behaviors/registry/ui/marketing/organisms/ui-feature-grid-organism.orb +10 -0
  469. package/behaviors/registry/ui/marketing/organisms/ui-hero-organism.orb +10 -0
  470. package/behaviors/registry/ui/marketing/organisms/ui-pricing-organism.orb +10 -0
  471. package/behaviors/registry/ui/marketing/organisms/ui-showcase-organism.orb +10 -0
  472. package/behaviors/registry/ui/marketing/organisms/ui-stats-organism.orb +10 -0
  473. package/behaviors/registry/ui/marketing/organisms/ui-step-flow-organism.orb +10 -0
  474. package/behaviors/registry/ui/marketing/organisms/ui-team-organism.orb +10 -0
  475. package/behaviors/registry/ui/marketing/templates/ui-about-page-template.orb +10 -0
  476. package/behaviors/registry/ui/marketing/templates/ui-auth-layout.orb +6 -0
  477. package/behaviors/registry/ui/marketing/templates/ui-feature-detail-page-template.orb +10 -0
  478. package/behaviors/registry/ui/marketing/templates/ui-landing-page-template.orb +10 -0
  479. package/behaviors/registry/ui/marketing/templates/ui-pricing-page-template.orb +10 -0
  480. package/dist/behaviors/exports-reader.js +7542 -2555
  481. package/dist/behaviors/functions/index.d.ts +161 -106
  482. package/dist/behaviors/functions/index.js +7539 -2553
  483. package/dist/behaviors/index.d.ts +1 -1
  484. package/dist/behaviors/index.js +7543 -2556
  485. package/dist/behaviors/query.d.ts +6 -0
  486. package/dist/behaviors/query.js +7542 -2555
  487. package/dist/behaviors-embeddings.hash.json +3 -3
  488. package/dist/behaviors-embeddings.json +29 -29
  489. package/dist/behaviors-registry.json +11423 -827
  490. package/dist/index.d.ts +1 -1
  491. package/dist/index.js +7543 -2556
  492. package/dist/knob-embeddings.hash.json +3 -3
  493. package/dist/knob-embeddings.json +1 -1
  494. package/dist/registry/factory-signatures.json +1 -1
  495. package/package.json +2 -2
  496. package/behaviors/lolo/ui/game/atoms/std-game-design-sheet.lolo +0 -69
  497. package/behaviors/registry/ui/game/atoms/std-game-design-sheet.orb +0 -527
@@ -1,5 +1,5 @@
1
1
  app std-gate-lock "1.0.0"
2
- "Headless collectible-gate mechanic: doors that stay shut until the player's collected total reaches their cost. Listens COLLECT (the board's running total — stars, coins, keys) and flips every door whose cost is met, stamping open on the shared door rows and emitting GATE_OPENED for the first newly opened door (the shared entity is the render authority for the rest). While a closed door's rect contains the player it emits GATE_BLOCKED once per approach — re-arming only after the player steps out — so the board can answer with a PLACE back and a locked fx. RESTART re-locks every door and zeroes the total. Renders nothing; boards draw closed doors as bars/walls and open ones as gaps. Corresponds to the design-sheet field(s): challenge, rewards."
2
+ "Headless collectible-gate mechanic: doors that stay shut until the player's collected total reaches their cost. Listens COLLECT (the board's running total — stars, coins, keys) and flips every door whose cost is met, stamping open on the shared door rows and emitting GATE_OPENED for the first newly opened door (the shared entity is the render authority for the rest). While a closed door's rect contains the player it emits GATE_BLOCKED once per approach — re-arming only after the player steps out — so the board can answer with a PLACE back and a locked fx. RESTART re-locks every live door and zeroes the total (re-arming the live entity set, so SET_DOORS-injected doors survive respawns). SET_DOORS replaces the door set at runtime for boards that import their doors. Renders nothing; boards draw closed doors as bars/walls and open ones as gaps. Corresponds to the design-sheet field(s): challenge, rewards."
3
3
  orbital GateLockOrbital {
4
4
  type Door = {
5
5
  id : string!
@@ -49,8 +49,12 @@ orbital GateLockOrbital {
49
49
  (emit GATE_BLOCKED { id: (object/get (array/first @blocked) id), x: (object/get (array/first @blocked) x), y: (object/get (array/first @blocked) y) })
50
50
  null))
51
51
 
52
+ SET_DOORS -> active
53
+ (set @entity.doors (array/map @payload.doors (fn d (object/merge @d { open: false, touching: false, blocked: false }))))
54
+ (set @entity.total 0)
55
+
52
56
  RESTART -> active
53
- (set @entity.doors (array/map @config.doors (fn d (object/merge @d { open: false, touching: false, blocked: false }))))
57
+ (set @entity.doors (array/map @entity.doors (fn d (object/merge @d { open: false, touching: false, blocked: false }))))
54
58
  (set @entity.total 0)
55
59
  }
56
60
 
@@ -73,6 +77,7 @@ orbital GateLockOrbital {
73
77
  listens {
74
78
  COLLECT { total : number! }
75
79
  BODY_MOVED { x : number!, y : number!, vx : number!, vy : number!, grounded : boolean!, skating : boolean!, speed : number! }
80
+ SET_DOORS { doors : [Door]! }
76
81
  RESTART { id : string }
77
82
  }
78
83
 
@@ -83,7 +88,7 @@ orbital GateLockOrbital {
83
88
  @tier "domain"
84
89
  doors : [Door] = []
85
90
  @label "Doors"
86
- @description "One row per gate: id, min-corner rect (x, y, width, height in world units) and the collected total that opens it. open/touching are stamped at runtime."
91
+ @description "One row per gate: id, min-corner rect (x, y, width, height in world units) and the collected total that opens it. open/touching are stamped at runtime. Seeded onto the entity on INIT; the live set is entity.doors — SET_DOORS replaces it at runtime (boards that import doors), and RESTART re-arms the live set rather than re-reading config, so injected doors survive respawns."
87
92
  @tier "domain"
88
93
  reachMargin : number = 0.6
89
94
  @label "Reach Margin"
@@ -1,5 +1,5 @@
1
1
  app std-loop-lock "1.0.0"
2
- "Headless winding-lock mechanic: locks that open only after the player travels a full revolution around their anchor. Listens BODY_MOVED and, while the player stays within a radial band of a lock's ring, accumulates the wrapped angular delta of their position into swept (radians, signed — either direction counts); when |swept| reaches turns × 2π the lock flips unlocked and emits LOOP_UNLOCKED once. Entering the band reseeds the angle so leaving and returning never jumps the sweep; progress is kept across exits, so a revolution can be completed in stages. RESTART re-locks every lock. Renders nothing; boards draw the ring/chest and read swept from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, rewards."
2
+ "Headless winding-lock mechanic: locks that open only after the player travels a full revolution around their anchor. Listens BODY_MOVED and, while the player stays within a radial band of a lock's ring, accumulates the wrapped angular delta of their position into swept (radians, signed — either direction counts); when |swept| reaches turns × 2π the lock flips unlocked and emits LOOP_UNLOCKED once. Entering the band reseeds the angle so leaving and returning never jumps the sweep; progress is kept across exits, so a revolution can be completed in stages. RESTART re-locks every live lock (re-arming the live entity set, so SET_LOCKS-injected locks survive respawns). SET_LOCKS replaces the lock set at runtime for boards that import their locks. Renders nothing; boards draw the ring/chest and read swept from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, rewards."
3
3
  orbital LoopLockOrbital {
4
4
  type LoopLock = {
5
5
  id : string!
@@ -44,8 +44,11 @@ orbital LoopLockOrbital {
44
44
  (emit LOOP_UNLOCKED { id: (object/get (array/first @newly) id), x: (object/get (array/first @newly) x), y: (object/get (array/first @newly) y) }))
45
45
  null))
46
46
 
47
+ SET_LOCKS -> active
48
+ (set @entity.locks (array/map @payload.locks (fn l (object/merge @l { swept: 0, lastAngle: 0, inside: false, unlocked: false, reported: false }))))
49
+
47
50
  RESTART -> active
48
- (set @entity.locks (array/map @config.locks (fn l (object/merge @l { swept: 0, lastAngle: 0, inside: false, unlocked: false, reported: false }))))
51
+ (set @entity.locks (array/map @entity.locks (fn l (object/merge @l { swept: 0, lastAngle: 0, inside: false, unlocked: false, reported: false }))))
49
52
  }
50
53
 
51
54
  emits {
@@ -60,6 +63,7 @@ orbital LoopLockOrbital {
60
63
 
61
64
  listens {
62
65
  BODY_MOVED { x : number!, y : number!, vx : number!, vy : number!, grounded : boolean!, skating : boolean!, speed : number! }
66
+ SET_LOCKS { locks : [LoopLock]! }
63
67
  RESTART { id : string }
64
68
  }
65
69
 
@@ -70,7 +74,7 @@ orbital LoopLockOrbital {
70
74
  @tier "domain"
71
75
  locks : [LoopLock] = []
72
76
  @label "Locks"
73
- @description "One row per winding lock: id, anchor (x, y in world units), ring radius, radial tolerance band, and revolutions required. swept/inside/unlocked are stamped at runtime."
77
+ @description "One row per winding lock: id, anchor (x, y in world units), ring radius, radial tolerance band, and revolutions required. swept/inside/unlocked are stamped at runtime. Seeded onto the entity on INIT; the live set is entity.locks — SET_LOCKS replaces it at runtime (boards that import locks), and RESTART re-arms the live set rather than re-reading config, so injected locks survive respawns."
74
78
  @tier "domain"
75
79
  }
76
80
  }
@@ -1,5 +1,5 @@
1
1
  app std-pad-lock "1.0.0"
2
- "Headless pad-lock mechanic: floor pads that light when the player steps on them, completing a set when every pad is lit. Listens BODY_MOVED and lights any unlit live pad the player's rect touches (|dx| <= reachX, |dy| <= reachY of the pad center); a lit pad stays lit. Pads may carry a group number (grp 0 = ungrouped, always live): when groups are used, only pads of the lowest uncompleted group are live — pads of later groups refuse to light until the current group finishes, so one sum must be finished before the next. When a group completes the trait emits PAD_GROUP_COMPLETED once for it (first newly completed group reports; the shared entity carries the rest); when every pad in the set is lit it stamps completed and emits PAD_SET_COMPLETED once. The lowest uncompleted group is stamped on the shared entity as currentGrp so boards can pulse exactly the live pads (0 = no group open / ungrouped pads). RESTART unlights every pad and resets the set. Renders nothing; boards draw the pads and read lit from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, mechanics."
2
+ "Headless pad-lock mechanic: floor pads that light when the player steps on them, completing a set when every pad is lit. Listens BODY_MOVED and lights any unlit live pad the player's rect touches (|dx| <= reachX, |dy| <= reachY of the pad center); a lit pad stays lit. Pads may carry a group number (grp 0 = ungrouped, always live): when groups are used, only pads of the lowest uncompleted group are live — pads of later groups refuse to light until the current group finishes, so one sum must be finished before the next. When a group completes the trait emits PAD_GROUP_COMPLETED once for it (first newly completed group reports; the shared entity carries the rest); when every pad in the set is lit it stamps completed and emits PAD_SET_COMPLETED once. The lowest uncompleted group is stamped on the shared entity as currentGrp so boards can pulse exactly the live pads (0 = no group open / ungrouped pads). RESTART unlights every live pad and resets the set (re-arming the live entity set, so SET_PADS-injected pads survive respawns). SET_PADS replaces the pad set at runtime for boards that import their pads. Renders nothing; boards draw the pads and read lit from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, mechanics."
3
3
  orbital PadLockOrbital {
4
4
  type PadLock = {
5
5
  id : string!
@@ -49,8 +49,14 @@ orbital PadLockOrbital {
49
49
  (emit PAD_SET_COMPLETED {}))
50
50
  null))))))))
51
51
 
52
+ SET_PADS -> active
53
+ (set @entity.pads (array/map @payload.pads (fn p (object/merge @p { lit: false }))))
54
+ (set @entity.groupsDone [])
55
+ (set @entity.currentGrp 0)
56
+ (set @entity.completed false)
57
+
52
58
  RESTART -> active
53
- (set @entity.pads (array/map @config.pads (fn p (object/merge @p { lit: false }))))
59
+ (set @entity.pads (array/map @entity.pads (fn p (object/merge @p { lit: false }))))
54
60
  (set @entity.groupsDone [])
55
61
  (set @entity.currentGrp 0)
56
62
  (set @entity.completed false)
@@ -70,6 +76,7 @@ orbital PadLockOrbital {
70
76
 
71
77
  listens {
72
78
  BODY_MOVED { x : number!, y : number!, vx : number!, vy : number!, grounded : boolean!, skating : boolean!, speed : number! }
79
+ SET_PADS { pads : [PadLock]! }
73
80
  RESTART { id : string }
74
81
  }
75
82
 
@@ -80,7 +87,7 @@ orbital PadLockOrbital {
80
87
  @tier "domain"
81
88
  pads : [PadLock] = []
82
89
  @label "Pads"
83
- @description "One row per floor pad: id, center (x, y in world units), and grp (0 = ungrouped, always live; N = live only while it is the lowest uncompleted group). lit is stamped at runtime."
90
+ @description "One row per floor pad: id, center (x, y in world units), and grp (0 = ungrouped, always live; N = live only while it is the lowest uncompleted group). lit is stamped at runtime. Seeded onto the entity on INIT; the live set is entity.pads — SET_PADS replaces it at runtime (boards that import pads), and RESTART re-arms the live set rather than re-reading config, so injected pads survive respawns."
84
91
  @tier "domain"
85
92
  reachX : number = 0.7
86
93
  @label "Reach X"
@@ -1,5 +1,5 @@
1
1
  app std-patrol-hazard "1.0.0"
2
- "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; a patrol declaring waveAmp/wavePeriod also bobs vertically — cy = y + waveAmp·sin(2πt/wavePeriod from a per-row time accumulator — and the hit test and render read cy, so a waveAmp of 0 keeps the flat beat), 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. Corresponds to the design-sheet field(s): challenge, dynamics."
2
+ "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; a patrol declaring waveAmp/wavePeriod also bobs vertically — cy = y + waveAmp·sin(2πt/wavePeriod from a per-row time accumulator — and the hit test and render read cy, so a waveAmp of 0 keeps the flat beat), 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. SET_PATROLS replaces the live patrol set at runtime for boards that import their patrols; RESTART re-arms the live set, so injected patrols survive respawns. Renders nothing. Corresponds to the design-sheet field(s): challenge, dynamics."
3
3
  orbital PatrolHazardOrbital {
4
4
  type Patrol = {
5
5
  id : string!
@@ -37,8 +37,13 @@ orbital PatrolHazardOrbital {
37
37
  (set @entity.px @payload.x)
38
38
  (set @entity.py @payload.y)
39
39
 
40
+ SET_PATROLS -> active
41
+ (set @entity.patrols (array/map @payload.patrols (fn p (object/merge @p { x: (object/get @p x0), dir: 1, t: 0, cy: (object/get @p y), touching: false, hit: false }))))
42
+ (set @entity.px @config.playerSpawnX)
43
+ (set @entity.py @config.playerSpawnY)
44
+
40
45
  RESTART -> active
41
- (set @entity.patrols (array/map @config.patrols (fn p (object/merge @p { x: (object/get @p x0), dir: 1, t: 0, cy: (object/get @p y), touching: false, hit: false }))))
46
+ (set @entity.patrols (array/map @entity.patrols (fn p (object/merge @p { x: (object/get @p x0), dir: 1, t: 0, cy: (object/get @p y), touching: false, hit: false }))))
42
47
  }
43
48
 
44
49
  ticks {
@@ -72,6 +77,7 @@ orbital PatrolHazardOrbital {
72
77
 
73
78
  listens {
74
79
  BODY_MOVED { x : number!, y : number!, vx : number!, vy : number!, grounded : boolean!, skating : boolean!, speed : number! }
80
+ SET_PATROLS { patrols : [Patrol]! }
75
81
  RESTART { id : string }
76
82
  }
77
83
 
@@ -82,7 +88,7 @@ orbital PatrolHazardOrbital {
82
88
  @tier "domain"
83
89
  patrols : [Patrol] = []
84
90
  @label "Patrols"
85
- @description "One row per patroller: id, the [x0, x1] beat it walks, its base y, its speed in units/s, and optionally waveAmp/wavePeriod for a vertical sine bob (waveAmp 0 = flat ping-pong). Current x/dir/t/cy/touching/hit are stamped at runtime."
91
+ @description "One row per patroller: id, the [x0, x1] beat it walks, its base y, its speed in units/s, and optionally waveAmp/wavePeriod for a vertical sine bob (waveAmp 0 = flat ping-pong). Current x/dir/t/cy/touching/hit are stamped at runtime. Seeded onto the entity on INIT; the live set is entity.patrols — SET_PATROLS replaces it at runtime (boards that import patrols), and RESTART re-arms the live set rather than re-reading config, so injected patrols survive respawns."
86
92
  @tier "domain"
87
93
  hitRadius : number = 0.7
88
94
  @label "Hit Radius"
@@ -1,5 +1,5 @@
1
1
  app std-pickup "1.0.0"
2
- "Headless side-view collectible authority — the platformer twin of grid std-gather. Listens BODY_MOVED and, when the player touches an uncollected feature (|dx| <= reachX, |dy| <= reachY of the feature center — the coef-pad touch idiom minus the grounded requirement, so airborne pickups work), stamps it collected on the shared entity and emits PICKED once per item (id, kind, position, glyph, message) plus COLLECT{total} with the running count (the event std-gate-lock already consumes). When every feature is collected it emits PICKUP_SET_COMPLETED once. RESTART re-arms every feature and zeroes the count. kind is board-defined vocabulary (star, boost, …) — this atom reports, boards judge. Renders nothing; boards draw the features and read collected from the shared entity. Corresponds to the design-sheet field(s): rewards."
2
+ "Headless side-view collectible authority — the platformer twin of grid std-gather. Listens BODY_MOVED and, when the player touches an uncollected feature (|dx| <= reachX, |dy| <= reachY of the feature center — the coef-pad touch idiom minus the grounded requirement, so airborne pickups work), stamps it collected on the shared entity and emits PICKED once per item (id, kind, position, glyph, message) plus COLLECT{total} with the running count (the event std-gate-lock already consumes). A feature carrying active: false is visible but NOT collectible (gated pickups — e.g. a star that only counts once the curve passes through it); FEATURES_ACTIVE{updates:[{id,active}]} flips gates in place without re-arming collected. When every feature is collected it emits PICKUP_SET_COMPLETED once. RESTART re-arms every feature and zeroes the count (re-arming the live entity set, so SET_FEATURES-injected features survive). SET_FEATURES replaces the collectible set at runtime for boards that import their features; ADD_FEATURES appends without disturbing the live set (mid-game gem drops). kind is board-defined vocabulary (star, boost, …) — this atom reports, boards judge. Renders nothing; boards draw the features and read collected from the shared entity. Corresponds to the design-sheet field(s): rewards."
3
3
  orbital PickupOrbital {
4
4
  type PickupFeature = {
5
5
  id : string!
@@ -9,6 +9,12 @@ orbital PickupOrbital {
9
9
  glyph : string
10
10
  message : string
11
11
  collected : boolean
12
+ active : boolean
13
+ }
14
+
15
+ type PickupActiveUpdate = {
16
+ id : string!
17
+ active : boolean!
12
18
  }
13
19
 
14
20
  entity PickupData [runtime, shared] {
@@ -30,8 +36,9 @@ orbital PickupOrbital {
30
36
  BODY_MOVED -> active when @config.running
31
37
  (let ((touch (array/filter @entity.pickups (fn f
32
38
  (and (== (object/get @f collected) false)
33
- (and (<= (math/abs (- @payload.x (object/get @f x))) @config.reachX)
34
- (<= (math/abs (- @payload.y (object/get @f y))) @config.reachY)))))))
39
+ (and (!= (object/get @f active) false)
40
+ (and (<= (math/abs (- @payload.x (object/get @f x))) @config.reachX)
41
+ (<= (math/abs (- @payload.y (object/get @f y))) @config.reachY))))))))
35
42
  (if (> (array/len @touch) 0)
36
43
  (let ((f (array/first @touch)))
37
44
  (let ((remaining (array/len (array/filter @entity.pickups (fn c (and (== (object/get @c collected) false) (!= (object/get @c id) (object/get @f id))))))))
@@ -47,8 +54,22 @@ orbital PickupOrbital {
47
54
  null))))
48
55
  null))
49
56
 
57
+ SET_FEATURES -> active
58
+ (set @entity.pickups (array/map @payload.features (fn f (object/merge @f { collected: false }))))
59
+ (set @entity.pickupCompleted false)
60
+ (set @entity.total 0)
61
+
62
+ ADD_FEATURES -> active
63
+ (set @entity.pickups (array/concat @entity.pickups (array/map @payload.features (fn f (object/merge @f { collected: false })))))
64
+ (set @entity.pickupCompleted false)
65
+
66
+ FEATURES_ACTIVE -> active
67
+ (set @entity.pickups (array/map @entity.pickups (fn f
68
+ (let ((m (array/filter @payload.updates (fn u (== (object/get @u id) (object/get @f id))))))
69
+ (if (> (array/len @m) 0) (object/merge @f { active: (object/get (array/first @m) active) }) @f)))))
70
+
50
71
  RESTART -> active
51
- (set @entity.pickups (array/map @config.features (fn f (object/merge @f { collected: false }))))
72
+ (set @entity.pickups (array/map @entity.pickups (fn f (object/merge @f { collected: false }))))
52
73
  (set @entity.pickupCompleted false)
53
74
  (set @entity.total 0)
54
75
  }
@@ -77,6 +98,9 @@ orbital PickupOrbital {
77
98
 
78
99
  listens {
79
100
  BODY_MOVED { x : number!, y : number!, vx : number!, vy : number!, grounded : boolean!, skating : boolean!, speed : number! }
101
+ SET_FEATURES { features : [PickupFeature]! }
102
+ ADD_FEATURES { features : [PickupFeature]! }
103
+ FEATURES_ACTIVE { updates : [PickupActiveUpdate]! }
80
104
  RESTART { id : string }
81
105
  }
82
106
 
@@ -87,7 +111,7 @@ orbital PickupOrbital {
87
111
  @tier "domain"
88
112
  features : [PickupFeature] = []
89
113
  @label "Features"
90
- @description "One row per collectible: id, center (x, y in world units), board-defined kind (star, boost, …), display glyph and message floated on pickup. collected is stamped at runtime."
114
+ @description "One row per collectible: id, center (x, y in world units), board-defined kind (star, boost, …), display glyph and message floated on pickup. collected is stamped at runtime. Seeded onto the entity on INIT; the live set is entity.pickups — SET_FEATURES replaces it at runtime (boards that import collectibles), and RESTART re-arms the live set rather than re-reading config, so injected features survive respawns."
91
115
  @tier "domain"
92
116
  reachX : number = 0.7
93
117
  @label "Reach X"
@@ -1,5 +1,5 @@
1
1
  app std-platformer-body "1.0.0"
2
- "Headless run/jump platformer-physics authority: the SOLE writer of body + fell + hazardId + goalId on side-view boards. Where std-motion-body owns free 2D drift (no collision), this atom owns the platformer contract: every 33ms physics tick it integrates gravity into the body's vertical velocity, steps position in per-second units, and collides the body rect against the config platforms with one-way semantics — a body moving in the gravity direction that overlaps a ground/platform tile lands on its anti-gravity face (vy zeroed, grounded set), while a body moving against gravity passes through, so jumping up through a platform and walking up a staircase both just work. The sign of gravity IS the vertical convention: positive pulls toward +y (screen boards, y down — sprite canvases), negative toward −y (math canvases, y up); jumps always fire against it. Intents: STEER sets horizontal velocity (dir −1/0/1 × moveSpeed, hold-to-run: keydown steers, keyup steers 0), JUMP kicks vertical velocity when grounded, PLACE teleports (spawns, hazard respawns), RESTART reseeds. Emits BODY_MOVED every tick for the render layer (boards that don't subscribe pay nothing), plus the sparse rule signals a board needs to score: BODY_JUMPED, BODY_LANDED (with impact speed), BODY_HAZARD (once per hazard entry, re-arms on exit), BODY_GOAL (same arming), BODY_FELL (once per fall past killY, re-armed by PLACE/RESTART). Drift regions: config.driftRegions lists axis-aligned rects each carrying a constant acceleration (ax, ay) applied with the same 0.033s dt whenever the body's center is inside (empty list = zero behavior change). Curve skating: when config.skate is on and the grounded body comes within skateSnap of the config.skateCurve surface, the body rides the curve — y snaps to the interpolated surface and tangential gravity (g·slope/(1+slope²)) accelerates vx, and the vertical velocity is the tangential projection (s = vx·cos θ, vy = s·sin θ — no discontinuous jumps at sample boundaries), so the body slides downhill along the graph itself and launches ballistically off its ends; jumping kicks free. Sparse BODY_SKATE_START/BODY_SKATE_END signals fire on engage/disengage so boards can layer fx. Lives, score, and win/lose stay downstream — this atom simulates, it never judges. Renders nothing. Corresponds to the design-sheet field(s): mechanics, dynamics."
2
+ "Headless run/jump platformer-physics authority: the SOLE writer of body + fell + hazardId + goalId on side-view boards. Where std-motion-body owns free 2D drift (no collision), this atom owns the platformer contract: every 33ms physics tick it integrates gravity into the body's vertical velocity, steps position in per-second units, and collides the body rect against the platform set with one-way semantics — a body moving in the gravity direction that overlaps a ground/platform tile lands on its anti-gravity face (vy zeroed, grounded set), while a body moving against gravity passes through, so jumping up through a platform and walking up a staircase both just work. The sign of gravity IS the vertical convention: positive pulls toward +y (screen boards, y down — sprite canvases), negative toward −y (math canvases, y up); jumps always fire against it. Geometry lives on the shared entity: config platforms/skateCurve/driftRegions seed entity.platforms/skateCurve/driftRegions on INIT, and SET_PLATFORMS / SET_SKATE_CURVE / SET_DRIFT_REGIONS replace them at runtime (RESTART keeps the live set, so boards that import geometry never lose it on a respawn). Intents: STEER sets horizontal velocity (dir −1/0/1 × moveSpeed, hold-to-run: keydown steers, keyup steers 0), JUMP kicks vertical velocity when grounded, PLACE teleports (spawns, hazard respawns), RESTART reseeds. Emits BODY_MOVED every tick for the render layer (boards that don't subscribe pay nothing), plus the sparse rule signals a board needs to score: BODY_JUMPED, BODY_LANDED (with impact speed), BODY_HAZARD (once per hazard entry, re-arms on exit), BODY_GOAL (same arming), BODY_FELL (once per fall past killY, re-armed by PLACE/RESTART). Drift regions: the driftRegions set lists axis-aligned rects each carrying a constant acceleration (ax, ay) applied with the same 0.033s dt whenever the body's center is inside (empty list = zero behavior change). Curve skating: when config.skate is on and the grounded body comes within skateSnap of the skateCurve surface, the body rides the curve — y snaps to the interpolated surface and tangential gravity (g·slope/(1+slope²)) accelerates vx, and the vertical velocity is the tangential projection (s = vx·cos θ, vy = s·sin θ — no discontinuous jumps at sample boundaries), so the body slides downhill along the graph itself and launches ballistically off its ends; jumping kicks free. Sparse BODY_SKATE_START/BODY_SKATE_END signals fire on engage/disengage so boards can layer fx. Lives, score, and win/lose stay downstream — this atom simulates, it never judges. Renders nothing. Corresponds to the design-sheet field(s): mechanics, dynamics."
3
3
  orbital PlatformerBodyOrbital {
4
4
  type PlatformerBody = {
5
5
  x : number!
@@ -55,6 +55,9 @@ orbital PlatformerBodyOrbital {
55
55
  goalId : string = ""
56
56
  skating : boolean = false
57
57
  tuning : PlatformerTuning = {}
58
+ platforms : [PlatformerPlatform] = []
59
+ skateCurve : [PlatformerCurveSample] = []
60
+ driftRegions : [BodyDriftRegion] = []
58
61
  }
59
62
 
60
63
  trait PlatformerBody -> @rebindable PlatformerBodyData [lifecycle] {
@@ -67,6 +70,9 @@ orbital PlatformerBodyOrbital {
67
70
  (set @entity.hazardId "")
68
71
  (set @entity.goalId "")
69
72
  (set @entity.skating false)
73
+ (set @entity.platforms @config.platforms)
74
+ (set @entity.skateCurve @config.skateCurve)
75
+ (set @entity.driftRegions @config.driftRegions)
70
76
 
71
77
  STEER -> active when @config.running
72
78
  (set @entity.body (object/merge @entity.body { vx: (* @payload.dir (if (== (object/get @entity.tuning moveSpeed null) null) @config.moveSpeed (object/get @entity.tuning moveSpeed null))), facingRight: (if (!= @payload.dir 0) (> @payload.dir 0) @entity.body.facingRight) }))
@@ -87,11 +93,23 @@ orbital PlatformerBodyOrbital {
87
93
  CURVE_MOD_CLEAR -> active when @config.curveModsEnabled
88
94
  (set @entity.curveMods [])
89
95
 
96
+ CURVE_MOD_CLEAR_RANGE -> active when @config.curveModsEnabled
97
+ (set @entity.curveMods (array/filter @entity.curveMods (fn m (or (< (object/get @m x1) @payload.x0) (> (object/get @m x0) @payload.x1)))))
98
+
90
99
  SET_TUNING -> active
91
100
  (set @entity.tuning (object/merge @entity.tuning (if (== @payload.jumpStrength null) {} { jumpStrength: @payload.jumpStrength })))
92
101
  (set @entity.tuning (object/merge @entity.tuning (if (== @payload.moveSpeed null) {} { moveSpeed: @payload.moveSpeed })))
93
102
  (set @entity.tuning (object/merge @entity.tuning (if (== @payload.gravity null) {} { gravity: @payload.gravity })))
94
103
 
104
+ SET_PLATFORMS -> active
105
+ (set @entity.platforms @payload.platforms)
106
+
107
+ SET_SKATE_CURVE -> active
108
+ (set @entity.skateCurve @payload.curve)
109
+
110
+ SET_DRIFT_REGIONS -> active
111
+ (set @entity.driftRegions @payload.regions)
112
+
95
113
  RESTART -> active
96
114
  (set @entity.body @config.spawn)
97
115
  (set @entity.curveMods [])
@@ -108,29 +126,29 @@ orbital PlatformerBodyOrbital {
108
126
  (let ((eg (if (== (object/get @entity.tuning gravity null) null) @config.gravity (object/get @entity.tuning gravity null))))
109
127
  (let ((gdir (if (> @eg 0) 1 -1)))
110
128
  (let ((bcx (+ (object/get @entity.body x) (/ (object/get @entity.body width) 2))) (bcy (+ (object/get @entity.body y) (/ (object/get @entity.body height) 2))))
111
- (let ((drift (array/find @config.driftRegions (fn r (and (>= @bcx (object/get @r x0)) (and (<= @bcx (object/get @r x1)) (and (>= @bcy (object/get @r y0)) (<= @bcy (object/get @r y1)))))))))
129
+ (let ((drift (array/find @entity.driftRegions (fn r (and (>= @bcx (object/get @r x0)) (and (<= @bcx (object/get @r x1)) (and (>= @bcy (object/get @r y0)) (<= @bcy (object/get @r y1)))))))))
112
130
  (let ((dax (if (== @drift null) 0 (object/get @drift ax))) (day (if (== @drift null) 0 (object/get @drift ay))))
113
131
  (let ((vy1 (math/clamp (+ @entity.body.vy (* (+ @eg @day) 0.033)) (- 0 @config.maxFallSpeed) @config.maxFallSpeed)))
114
132
  (let ((bw (object/get @entity.body width)) (bh (object/get @entity.body height)))
115
133
  (let ((nx (math/clamp (+ @entity.body.x (* @entity.body.vx 0.033)) @config.xMin @config.xMax)))
116
134
  (let ((ny (+ @entity.body.y (* @vy1 0.033))))
117
135
  (let ((rect { x: @nx, y: @ny, w: @bw, h: @bh }))
118
- (let ((hit (array/find @config.platforms (fn p (and (or (== (object/get @p type) "ground") (== (object/get @p type) "platform")) (geo/aabb-overlap @rect { x: @p.x, y: @p.y, w: @p.width, h: @p.height }))))))
136
+ (let ((hit (array/find @entity.platforms (fn p (and (or (== (object/get @p type) "ground") (== (object/get @p type) "platform")) (geo/aabb-overlap @rect { x: @p.x, y: @p.y, w: @p.width, h: @p.height }))))))
119
137
  (let ((landed (and (!= @hit null) (> (* @vy1 @gdir) 0))))
120
138
  (let ((ny2 (if @landed (if (> @gdir 0) (- (object/get @hit y) @bh) (+ (object/get @hit y) (object/get @hit height))) @ny)) (vy2 (if @landed 0 @vy1)))
121
139
  (let ((cx (+ @nx (/ @bw 2))))
122
- (let ((inRange (and @config.skate (and (> (array/len @config.skateCurve) 1) (and (>= @cx (object/get (array/first @config.skateCurve) x)) (< @cx (object/get (array/last @config.skateCurve) x)))))))
123
- (let ((leftSamp (if @inRange (array/last (array/filter @config.skateCurve (fn s (<= (object/get @s x) @cx)))) { x: 0, y: 0 })))
124
- (let ((rightSamp (if @inRange (array/first (array/filter @config.skateCurve (fn s (> (object/get @s x) @cx)))) { x: 1, y: 0 })))
140
+ (let ((inRange (and @config.skate (and (> (array/len @entity.skateCurve) 1) (and (>= @cx (object/get (array/first @entity.skateCurve) x)) (< @cx (object/get (array/last @entity.skateCurve) x)))))))
141
+ (let ((leftSamp (if @inRange (array/last (array/filter @entity.skateCurve (fn s (<= (object/get @s x) @cx)))) { x: 0, y: 0 })))
142
+ (let ((rightSamp (if @inRange (array/first (array/filter @entity.skateCurve (fn s (> (object/get @s x) @cx)))) { x: 1, y: 0 })))
125
143
  (let ((slope (if @inRange (/ (- (object/get @rightSamp y) (object/get @leftSamp y)) (- (object/get @rightSamp x) (object/get @leftSamp x))) 0)))
126
144
  (let ((curveY (if @inRange (+ (object/get @leftSamp y) (* @slope (- @cx (object/get @leftSamp x)))) 0)))
127
145
  (let ((gapBreak (and (> @config.skateMaxGap 0) (> (- (object/get @rightSamp x) (object/get @leftSamp x)) @config.skateMaxGap))))
128
146
  (let ((mods (if (and @config.curveModsEnabled @inRange) (array/filter @entity.curveMods (fn m (and (>= @cx (object/get @m x0)) (<= @cx (object/get @m x1))))) [])))
129
147
  (let ((modded (array/reduce @mods { y: @curveY, s: @slope } (fn (acc m)
130
148
  (let ((modX (* (object/get @m b) (- @cx (object/get @m h)))))
131
- (let ((modInRange (and (>= @modX (object/get (array/first @config.skateCurve) x)) (< @modX (object/get (array/last @config.skateCurve) x)))))
132
- (let ((modLeft (if @modInRange (array/last (array/filter @config.skateCurve (fn s (<= (object/get @s x) @modX)))) null)))
133
- (let ((modRight (if @modInRange (array/first (array/filter @config.skateCurve (fn s (> (object/get @s x) @modX)))) null)))
149
+ (let ((modInRange (and (>= @modX (object/get (array/first @entity.skateCurve) x)) (< @modX (object/get (array/last @entity.skateCurve) x)))))
150
+ (let ((modLeft (if @modInRange (array/last (array/filter @entity.skateCurve (fn s (<= (object/get @s x) @modX)))) null)))
151
+ (let ((modRight (if @modInRange (array/first (array/filter @entity.skateCurve (fn s (> (object/get @s x) @modX)))) null)))
134
152
  (let ((modOK (and @modInRange (and (!= @modLeft null) (!= @modRight null)))))
135
153
  (let ((modSlope (if @modOK (/ (- (object/get @modRight y) (object/get @modLeft y)) (- (object/get @modRight x) (object/get @modLeft x))) 0)))
136
154
  (let ((modCurveY (if @modOK (+ (object/get @modLeft y) (* @modSlope (- @modX (object/get @modLeft x)))) 0)))
@@ -145,8 +163,8 @@ orbital PlatformerBodyOrbital {
145
163
  (let ((vx2 (if @skateNow (math/clamp (+ @entity.body.vx (* (/ (* @eg @slope) (+ 1 (* @slope @slope))) 0.033)) (- 0 @config.maxFallSpeed) @config.maxFallSpeed) @entity.body.vx)))
146
164
  (let ((vx3 (if (== @drift null) @vx2 (math/clamp (+ @vx2 (* @dax 0.033)) (- 0 @config.maxFallSpeed) @config.maxFallSpeed))))
147
165
  (let ((fy (if @skateNow @curveY @ny2)) (fvy (if @skateNow (* (* @vx2 (math/cos (math/atan @slope))) (math/sin (math/atan @slope))) @vy2)) (fgrounded (or @landed @skateNow)))
148
- (let ((hazardHit (array/find @config.platforms (fn p (and (== (object/get @p type) "hazard") (geo/aabb-overlap @rect { x: @p.x, y: @p.y, w: @p.width, h: @p.height }))))))
149
- (let ((goalHit (array/find @config.platforms (fn p (and (== (object/get @p type) "goal") (geo/aabb-overlap @rect { x: @p.x, y: @p.y, w: @p.width, h: @p.height }))))))
166
+ (let ((hazardHit (array/find @entity.platforms (fn p (and (== (object/get @p type) "hazard") (geo/aabb-overlap @rect { x: @p.x, y: @p.y, w: @p.width, h: @p.height }))))))
167
+ (let ((goalHit (array/find @entity.platforms (fn p (and (== (object/get @p type) "goal") (geo/aabb-overlap @rect { x: @p.x, y: @p.y, w: @p.width, h: @p.height }))))))
150
168
  (let ((fellNow (if (> @gdir 0) (> @fy @config.killY) (< @fy @config.killY))))
151
169
  (do
152
170
  (set @entity.body (object/merge @entity.body { x: @nx, y: @fy, vx: (if (or (== @nx @config.xMin) (== @nx @config.xMax)) 0 @vx3), vy: @fvy, grounded: @fgrounded }))
@@ -252,7 +270,11 @@ orbital PlatformerBodyOrbital {
252
270
  PLACE { x : number!, y : number! }
253
271
  CURVE_MOD_ADD { x0 : number!, x1 : number!, a : number!, b : number, h : number!, k : number! }
254
272
  CURVE_MOD_CLEAR { }
273
+ CURVE_MOD_CLEAR_RANGE { x0 : number!, x1 : number! }
255
274
  SET_TUNING { jumpStrength : number, moveSpeed : number, gravity : number }
275
+ SET_PLATFORMS { platforms : [PlatformerPlatform]! }
276
+ SET_SKATE_CURVE { curve : [PlatformerCurveSample]! }
277
+ SET_DRIFT_REGIONS { regions : [BodyDriftRegion]! }
256
278
  RESTART { id : string }
257
279
  }
258
280
 
@@ -267,7 +289,7 @@ orbital PlatformerBodyOrbital {
267
289
  @tier "domain"
268
290
  platforms : [PlatformerPlatform] = []
269
291
  @label "Platforms"
270
- @description "Level geometry as min-corner rects: ground/platform tiles are solid one-way landing surfaces, hazard tiles emit BODY_HAZARD on touch, goal tiles emit BODY_GOAL"
292
+ @description "Level geometry as min-corner rects: ground/platform tiles are solid one-way landing surfaces, hazard tiles emit BODY_HAZARD on touch, goal tiles emit BODY_GOAL. Seeded onto the entity on INIT; the live set is entity.platforms — SET_PLATFORMS replaces it at runtime (boards that import geometry, e.g. stitched open worlds) and RESTART deliberately does NOT reseed it, so injected geometry survives respawns."
271
293
  @tier "domain"
272
294
  gravity : number = 24
273
295
  @label "Gravity"
@@ -307,7 +329,7 @@ orbital PlatformerBodyOrbital {
307
329
  @tier "domain"
308
330
  skateCurve : [PlatformerCurveSample] = []
309
331
  @label "Skate Curve"
310
- @description "Surface samples (x strictly increasing) the body skates when skate is on; y is the surface height for the body's MIN corner, linearly interpolated between bracketing samples — mirror the render-side curve so what you see is what you ride"
332
+ @description "Surface samples (x strictly increasing) the body skates when skate is on; y is the surface height for the body's MIN corner, linearly interpolated between bracketing samples — mirror the render-side curve so what you see is what you ride. Seeded onto the entity on INIT; the live curve is entity.skateCurve — SET_SKATE_CURVE replaces it at runtime (stitched mega-curves) and RESTART does not reseed it."
311
333
  @tier "domain"
312
334
  skateMaxGap : number = 0
313
335
  @label "Skate Max Gap"
@@ -319,7 +341,7 @@ orbital PlatformerBodyOrbital {
319
341
  @tier "domain"
320
342
  driftRegions : [BodyDriftRegion] = []
321
343
  @label "Drift Regions"
322
- @description "Axis-aligned rects (x0..x1, y0..y1 in world units) each carrying a constant acceleration (ax, ay in units/s²) applied with the physics dt whenever the body's center is inside — winds, currents, gradient pushes. Empty list = zero behavior change."
344
+ @description "Axis-aligned rects (x0..x1, y0..y1 in world units) each carrying a constant acceleration (ax, ay in units/s²) applied with the physics dt whenever the body's center is inside — winds, currents, gradient pushes. Empty list = zero behavior change. Seeded onto the entity on INIT; the live set is entity.driftRegions — SET_DRIFT_REGIONS replaces it at runtime and RESTART does not reseed it."
323
345
  @tier "domain"
324
346
  }
325
347
  }
@@ -1,5 +1,5 @@
1
1
  app std-velocity-gate "1.0.0"
2
- "Headless velocity-gate mechanic: gates that open only when the player crosses them inside a speed band, optionally in a required direction, optionally sustained for a dwell. Listens BODY_MOVED and, per closed gate, tests the player's rect (padded by reachMargin), their speed against [minSpeed, maxSpeed], and their horizontal direction against dir (0 = either). Instant gates (dwellMs 0) open on the first passing cross; dwell gates (dwellMs > 0) accumulate ~33ms per passing move and open once held reaches dwellMs — a failing move resets the hold. The first newly opened gate emits VELOCITY_GATE_OPENED (the shared entity carries the rest). Entering a closed INSTANT gate while NOT passing emits VELOCITY_GATE_DENIED once per approach — re-arming only after the player steps out — so the board can answer with a PLACE back and a hint fx; dwell gates never deny (a hot entry is fine — coming to rest inside is the point), a failed hold simply resets. RESTART re-closes every gate. Renders nothing; boards draw the gate band/chest and read open/held from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, mechanics."
2
+ "Headless velocity-gate mechanic: gates that open only when the player crosses them inside a speed band, optionally in a required direction, optionally sustained for a dwell. Listens BODY_MOVED and, per closed gate, tests the player's rect (padded by reachMargin), their speed against [minSpeed, maxSpeed], and their horizontal direction against dir (0 = either). Instant gates (dwellMs 0) open on the first passing cross; dwell gates (dwellMs > 0) accumulate ~33ms per passing move and open once held reaches dwellMs — a failing move resets the hold. The first newly opened gate emits VELOCITY_GATE_OPENED (the shared entity carries the rest). Entering a closed INSTANT gate while NOT passing emits VELOCITY_GATE_DENIED once per approach — re-arming only after the player steps out — so the board can answer with a PLACE back and a hint fx; dwell gates never deny (a hot entry is fine — coming to rest inside is the point), a failed hold simply resets. RESTART re-closes every live gate (re-arming the live entity set, so SET_VGATES-injected gates survive respawns). SET_VGATES replaces the gate set at runtime for boards that import their gates. Renders nothing; boards draw the gate band/chest and read open/held from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, mechanics."
3
3
  orbital VelocityGateOrbital {
4
4
  type VelocityGate = {
5
5
  id : string!
@@ -54,8 +54,11 @@ orbital VelocityGateOrbital {
54
54
  (emit VELOCITY_GATE_DENIED { id: (object/get (array/first @denied) id), x: (object/get (array/first @denied) x), y: (object/get (array/first @denied) y), speed: @payload.speed })
55
55
  null))
56
56
 
57
+ SET_VGATES -> active
58
+ (set @entity.gates (array/map @payload.gates (fn g (object/merge @g { open: false, touching: false, denied: false, held: 0, reported: false }))))
59
+
57
60
  RESTART -> active
58
- (set @entity.gates (array/map @config.gates (fn g (object/merge @g { open: false, touching: false, denied: false, held: 0, reported: false }))))
61
+ (set @entity.gates (array/map @entity.gates (fn g (object/merge @g { open: false, touching: false, denied: false, held: 0, reported: false }))))
59
62
  }
60
63
 
61
64
  emits {
@@ -78,6 +81,7 @@ orbital VelocityGateOrbital {
78
81
 
79
82
  listens {
80
83
  BODY_MOVED { x : number!, y : number!, vx : number!, vy : number!, grounded : boolean!, skating : boolean!, speed : number! }
84
+ SET_VGATES { gates : [VelocityGate]! }
81
85
  RESTART { id : string }
82
86
  }
83
87
 
@@ -88,7 +92,7 @@ orbital VelocityGateOrbital {
88
92
  @tier "domain"
89
93
  gates : [VelocityGate] = []
90
94
  @label "Gates"
91
- @description "One row per velocity gate: id, min-corner rect (x, y, width, height in world units), the speed band [minSpeed, maxSpeed] that opens it, the hold required (dwellMs 0 = instant), the horizontal direction required (dir -1/0/+1), and an optional hint shown when denied. open/touching/denied/held/reported are stamped at runtime."
95
+ @description "One row per velocity gate: id, min-corner rect (x, y, width, height in world units), the speed band [minSpeed, maxSpeed] that opens it, the hold required (dwellMs 0 = instant), the horizontal direction required (dir -1/0/+1), and an optional hint shown when denied. open/touching/denied/held/reported are stamped at runtime. Seeded onto the entity on INIT; the live set is entity.gates — SET_VGATES replaces it at runtime (boards that import gates), and RESTART re-arms the live set rather than re-reading config, so injected gates survive respawns."
92
96
  @tier "domain"
93
97
  reachMargin : number = 0.6
94
98
  @label "Reach Margin"