@almadar/std 16.254.0 → 16.255.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 (455) hide show
  1. package/behaviors/lolo/agent/atoms/std-agent-pool.lolo +10 -10
  2. package/behaviors/lolo/agent/evals/eval-agent-builder.lolo +15 -8
  3. package/behaviors/lolo/agent/organisms/std-agent-builder.lolo +6 -5
  4. package/behaviors/registry/agent/atoms/std-agent-context.orb +1 -1
  5. package/behaviors/registry/agent/atoms/std-agent-fix-loop.orb +1 -1
  6. package/behaviors/registry/agent/atoms/std-agent-planner.orb +1 -1
  7. package/behaviors/registry/agent/atoms/std-agent-pool.orb +1 -1
  8. package/behaviors/registry/agent/atoms/std-agent-proposal.orb +1 -1
  9. package/behaviors/registry/agent/atoms/std-agent-session.orb +1 -1
  10. package/behaviors/registry/agent/atoms/std-agent-suggestions.orb +1 -1
  11. package/behaviors/registry/agent/atoms/std-agent-tool-call.orb +1 -1
  12. package/behaviors/registry/agent/atoms/std-agent-tool-loop.orb +1 -1
  13. package/behaviors/registry/agent/atoms/std-agent-trace.orb +1 -1
  14. package/behaviors/registry/agent/evals/eval-agent-builder.orb +1 -1
  15. package/behaviors/registry/agent/organisms/std-agent-assistant.orb +1 -1
  16. package/behaviors/registry/agent/organisms/std-agent-builder.orb +1 -1
  17. package/behaviors/registry/infra/atoms/std-analytics.orb +1 -1
  18. package/behaviors/registry/infra/atoms/std-approval-gate.orb +1 -1
  19. package/behaviors/registry/infra/atoms/std-audit-capture.orb +1 -1
  20. package/behaviors/registry/infra/atoms/std-cache-aside.orb +1 -1
  21. package/behaviors/registry/infra/atoms/std-calendar-sync.orb +1 -1
  22. package/behaviors/registry/infra/atoms/std-cascade-on-delete.orb +1 -1
  23. package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +1 -1
  24. package/behaviors/registry/infra/atoms/std-cross-reference.orb +1 -1
  25. package/behaviors/registry/infra/atoms/std-data-erasure.orb +1 -1
  26. package/behaviors/registry/infra/atoms/std-data-import.orb +1 -1
  27. package/behaviors/registry/infra/atoms/std-global-search.orb +1 -1
  28. package/behaviors/registry/infra/atoms/std-knowledge-loop.orb +1 -1
  29. package/behaviors/registry/infra/atoms/std-lifecycle.orb +1 -1
  30. package/behaviors/registry/infra/atoms/std-migration-job.orb +1 -1
  31. package/behaviors/registry/infra/atoms/std-mod-queue.orb +1 -1
  32. package/behaviors/registry/infra/atoms/std-notification-center.orb +1 -1
  33. package/behaviors/registry/infra/atoms/std-notification-preferences.orb +1 -1
  34. package/behaviors/registry/infra/atoms/std-notify-on-event.orb +1 -1
  35. package/behaviors/registry/infra/atoms/std-page-search.orb +1 -1
  36. package/behaviors/registry/infra/atoms/std-page-watch.orb +1 -1
  37. package/behaviors/registry/infra/atoms/std-permission-matrix.orb +1 -1
  38. package/behaviors/registry/infra/atoms/std-rate-limiter.orb +1 -1
  39. package/behaviors/registry/infra/atoms/std-reminder-scheduler.orb +1 -1
  40. package/behaviors/registry/infra/atoms/std-review-cycle.orb +1 -1
  41. package/behaviors/registry/infra/atoms/std-row-access-control.orb +1 -1
  42. package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +1 -1
  43. package/behaviors/registry/infra/organisms/std-status-lifecycle-control.orb +1 -1
  44. package/behaviors/registry/ml/atoms/std-data-collector.orb +1 -1
  45. package/behaviors/registry/ml/atoms/std-graph-builder.orb +1 -1
  46. package/behaviors/registry/ml/atoms/std-ml-classify.orb +1 -1
  47. package/behaviors/registry/ml/atoms/std-ml-exact-check.orb +1 -1
  48. package/behaviors/registry/ml/atoms/std-ml-infer.orb +1 -1
  49. package/behaviors/registry/ml/atoms/std-ml-posterior.orb +1 -1
  50. package/behaviors/registry/ml/atoms/std-ml-similarity.orb +1 -1
  51. package/behaviors/registry/ml/atoms/std-tokenizer.orb +1 -1
  52. package/behaviors/registry/ml/atoms/std-weight-validator.orb +1 -1
  53. package/behaviors/registry/ml/organisms/std-escalating-decision.orb +1 -1
  54. package/behaviors/registry/ml/organisms/std-knowledge-tracing.orb +1 -1
  55. package/behaviors/registry/ui/avl/atoms/std-avl-cosmic-zoom.orb +1 -1
  56. package/behaviors/registry/ui/avl/atoms/ui-avl-glyph.orb +1 -1
  57. package/behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb +1 -1
  58. package/behaviors/registry/ui/avl/atoms/ui-avl-transition-detail.orb +1 -1
  59. package/behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb +1 -1
  60. package/behaviors/registry/ui/avl/atoms/ui-behavior-view.orb +1 -1
  61. package/behaviors/registry/ui/avl/atoms/ui-module-card.orb +1 -1
  62. package/behaviors/registry/ui/avl/organisms/ui-flow-canvas.orb +1 -1
  63. package/behaviors/registry/ui/avl/organisms/ui-layers-panel.orb +1 -1
  64. package/behaviors/registry/ui/avl/organisms/ui-orb-inspector.orb +1 -1
  65. package/behaviors/registry/ui/core/atoms/std-app-layout.orb +1 -1
  66. package/behaviors/registry/ui/core/atoms/std-app-search.orb +1 -1
  67. package/behaviors/registry/ui/core/atoms/std-behavior-catalog.orb +1 -1
  68. package/behaviors/registry/ui/core/atoms/std-behavior-tour.orb +1 -1
  69. package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +1 -1
  70. package/behaviors/registry/ui/core/atoms/std-board.orb +1 -1
  71. package/behaviors/registry/ui/core/atoms/std-book-reader.orb +1 -1
  72. package/behaviors/registry/ui/core/atoms/std-browse.orb +1 -1
  73. package/behaviors/registry/ui/core/atoms/std-calendar.orb +1 -1
  74. package/behaviors/registry/ui/core/atoms/std-card-grid.orb +1 -1
  75. package/behaviors/registry/ui/core/atoms/std-confirmation.orb +1 -1
  76. package/behaviors/registry/ui/core/atoms/std-dashboard-grid-embedded.orb +1 -1
  77. package/behaviors/registry/ui/core/atoms/std-date-range.orb +1 -1
  78. package/behaviors/registry/ui/core/atoms/std-detail-layout.orb +1 -1
  79. package/behaviors/registry/ui/core/atoms/std-doc-page.orb +1 -1
  80. package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +1 -1
  81. package/behaviors/registry/ui/core/atoms/std-esign-request.orb +1 -1
  82. package/behaviors/registry/ui/core/atoms/std-event-log.orb +1 -1
  83. package/behaviors/registry/ui/core/atoms/std-export.orb +1 -1
  84. package/behaviors/registry/ui/core/atoms/std-file-store.orb +1 -1
  85. package/behaviors/registry/ui/core/atoms/std-filter.orb +1 -1
  86. package/behaviors/registry/ui/core/atoms/std-form-advanced.orb +1 -1
  87. package/behaviors/registry/ui/core/atoms/std-gallery.orb +1 -1
  88. package/behaviors/registry/ui/core/atoms/std-gantt-schedule.orb +1 -1
  89. package/behaviors/registry/ui/core/atoms/std-geosearch.orb +1 -1
  90. package/behaviors/registry/ui/core/atoms/std-graphs.orb +1 -1
  91. package/behaviors/registry/ui/core/atoms/std-hero.orb +1 -1
  92. package/behaviors/registry/ui/core/atoms/std-home.orb +1 -1
  93. package/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +1 -1
  94. package/behaviors/registry/ui/core/atoms/std-import.orb +1 -1
  95. package/behaviors/registry/ui/core/atoms/std-language-picker.orb +1 -1
  96. package/behaviors/registry/ui/core/atoms/std-media-section.orb +1 -1
  97. package/behaviors/registry/ui/core/atoms/std-modal-editor.orb +1 -1
  98. package/behaviors/registry/ui/core/atoms/std-modal.orb +1 -1
  99. package/behaviors/registry/ui/core/atoms/std-multi-party-flow.orb +1 -1
  100. package/behaviors/registry/ui/core/atoms/std-notification-panel.orb +1 -1
  101. package/behaviors/registry/ui/core/atoms/std-panel-launcher.orb +1 -1
  102. package/behaviors/registry/ui/core/atoms/std-pricing.orb +1 -1
  103. package/behaviors/registry/ui/core/atoms/std-proof.orb +1 -1
  104. package/behaviors/registry/ui/core/atoms/std-prose.orb +1 -1
  105. package/behaviors/registry/ui/core/atoms/std-rating-review.orb +1 -1
  106. package/behaviors/registry/ui/core/atoms/std-record-detail.orb +1 -1
  107. package/behaviors/registry/ui/core/atoms/std-recurrence.orb +1 -1
  108. package/behaviors/registry/ui/core/atoms/std-related.orb +1 -1
  109. package/behaviors/registry/ui/core/atoms/std-role-gate.orb +1 -1
  110. package/behaviors/registry/ui/core/atoms/std-saved-search.orb +1 -1
  111. package/behaviors/registry/ui/core/atoms/std-scatter.orb +1 -1
  112. package/behaviors/registry/ui/core/atoms/std-scoped-list.orb +1 -1
  113. package/behaviors/registry/ui/core/atoms/std-search.orb +1 -1
  114. package/behaviors/registry/ui/core/atoms/std-selection.orb +1 -1
  115. package/behaviors/registry/ui/core/atoms/std-site-footer.orb +1 -1
  116. package/behaviors/registry/ui/core/atoms/std-site-header.orb +1 -1
  117. package/behaviors/registry/ui/core/atoms/std-slide-deck.orb +1 -1
  118. package/behaviors/registry/ui/core/atoms/std-stat-band.orb +1 -1
  119. package/behaviors/registry/ui/core/atoms/std-stats.orb +1 -1
  120. package/behaviors/registry/ui/core/atoms/std-step-flow.orb +1 -1
  121. package/behaviors/registry/ui/core/atoms/std-steps.orb +1 -1
  122. package/behaviors/registry/ui/core/atoms/std-tabs.orb +1 -1
  123. package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +1 -1
  124. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +1 -1
  125. package/behaviors/registry/ui/core/atoms/std-thread.orb +1 -1
  126. package/behaviors/registry/ui/core/atoms/std-tree.orb +1 -1
  127. package/behaviors/registry/ui/core/atoms/std-version-history.orb +1 -1
  128. package/behaviors/registry/ui/core/atoms/std-wizard.orb +1 -1
  129. package/behaviors/registry/ui/core/atoms/std-workspace-layout.orb +1 -1
  130. package/behaviors/registry/ui/core/atoms/ui-animated-graphic.orb +1 -1
  131. package/behaviors/registry/ui/core/atoms/ui-animated-reveal.orb +1 -1
  132. package/behaviors/registry/ui/core/atoms/ui-aside.orb +1 -1
  133. package/behaviors/registry/ui/core/atoms/ui-atlas-image.orb +1 -1
  134. package/behaviors/registry/ui/core/atoms/ui-atlas-panel.orb +1 -1
  135. package/behaviors/registry/ui/core/atoms/ui-avatar.orb +1 -1
  136. package/behaviors/registry/ui/core/atoms/ui-badge.orb +1 -1
  137. package/behaviors/registry/ui/core/atoms/ui-box.orb +1 -1
  138. package/behaviors/registry/ui/core/atoms/ui-button.orb +1 -1
  139. package/behaviors/registry/ui/core/atoms/ui-card.orb +1 -1
  140. package/behaviors/registry/ui/core/atoms/ui-center.orb +1 -1
  141. package/behaviors/registry/ui/core/atoms/ui-checkbox.orb +1 -1
  142. package/behaviors/registry/ui/core/atoms/ui-conditional-wrapper.orb +1 -1
  143. package/behaviors/registry/ui/core/atoms/ui-confetti-effect.orb +1 -1
  144. package/behaviors/registry/ui/core/atoms/ui-day-cell.orb +1 -1
  145. package/behaviors/registry/ui/core/atoms/ui-dialog.orb +1 -1
  146. package/behaviors/registry/ui/core/atoms/ui-divider.orb +1 -1
  147. package/behaviors/registry/ui/core/atoms/ui-filter-pill.orb +1 -1
  148. package/behaviors/registry/ui/core/atoms/ui-flip-container.orb +1 -1
  149. package/behaviors/registry/ui/core/atoms/ui-game-icon.orb +1 -1
  150. package/behaviors/registry/ui/core/atoms/ui-hstack.orb +1 -1
  151. package/behaviors/registry/ui/core/atoms/ui-icon.orb +1 -1
  152. package/behaviors/registry/ui/core/atoms/ui-image.orb +1 -1
  153. package/behaviors/registry/ui/core/atoms/ui-infinite-scroll-sentinel.orb +1 -1
  154. package/behaviors/registry/ui/core/atoms/ui-input.orb +1 -1
  155. package/behaviors/registry/ui/core/atoms/ui-label.orb +1 -1
  156. package/behaviors/registry/ui/core/atoms/ui-law-reference-tooltip.orb +1 -1
  157. package/behaviors/registry/ui/core/atoms/ui-overlay.orb +1 -1
  158. package/behaviors/registry/ui/core/atoms/ui-pattern-tile.orb +1 -1
  159. package/behaviors/registry/ui/core/atoms/ui-presence.orb +1 -1
  160. package/behaviors/registry/ui/core/atoms/ui-progress-bar.orb +1 -1
  161. package/behaviors/registry/ui/core/atoms/ui-radio.orb +1 -1
  162. package/behaviors/registry/ui/core/atoms/ui-range-slider.orb +1 -1
  163. package/behaviors/registry/ui/core/atoms/ui-section-header.orb +1 -1
  164. package/behaviors/registry/ui/core/atoms/ui-select.orb +1 -1
  165. package/behaviors/registry/ui/core/atoms/ui-spacer.orb +1 -1
  166. package/behaviors/registry/ui/core/atoms/ui-sparkline.orb +1 -1
  167. package/behaviors/registry/ui/core/atoms/ui-spinner.orb +1 -1
  168. package/behaviors/registry/ui/core/atoms/ui-stack.orb +1 -1
  169. package/behaviors/registry/ui/core/atoms/ui-status-dot.orb +1 -1
  170. package/behaviors/registry/ui/core/atoms/ui-svg-branch.orb +1 -1
  171. package/behaviors/registry/ui/core/atoms/ui-svg-connection.orb +1 -1
  172. package/behaviors/registry/ui/core/atoms/ui-svg-flow.orb +1 -1
  173. package/behaviors/registry/ui/core/atoms/ui-svg-grid.orb +1 -1
  174. package/behaviors/registry/ui/core/atoms/ui-svg-lobe.orb +1 -1
  175. package/behaviors/registry/ui/core/atoms/ui-svg-mesh.orb +1 -1
  176. package/behaviors/registry/ui/core/atoms/ui-svg-morph.orb +1 -1
  177. package/behaviors/registry/ui/core/atoms/ui-svg-node.orb +1 -1
  178. package/behaviors/registry/ui/core/atoms/ui-svg-pulse.orb +1 -1
  179. package/behaviors/registry/ui/core/atoms/ui-svg-ring.orb +1 -1
  180. package/behaviors/registry/ui/core/atoms/ui-svg-shield.orb +1 -1
  181. package/behaviors/registry/ui/core/atoms/ui-svg-stack.orb +1 -1
  182. package/behaviors/registry/ui/core/atoms/ui-switch.orb +1 -1
  183. package/behaviors/registry/ui/core/atoms/ui-text-highlight.orb +1 -1
  184. package/behaviors/registry/ui/core/atoms/ui-textarea.orb +1 -1
  185. package/behaviors/registry/ui/core/atoms/ui-theme-toggle.orb +1 -1
  186. package/behaviors/registry/ui/core/atoms/ui-time-slot-cell.orb +1 -1
  187. package/behaviors/registry/ui/core/atoms/ui-trend-indicator.orb +1 -1
  188. package/behaviors/registry/ui/core/atoms/ui-typewriter-text.orb +1 -1
  189. package/behaviors/registry/ui/core/atoms/ui-typography.orb +1 -1
  190. package/behaviors/registry/ui/core/atoms/ui-video-embed.orb +1 -1
  191. package/behaviors/registry/ui/core/atoms/ui-vstack.orb +1 -1
  192. package/behaviors/registry/ui/core/molecules/std-stat-rows.orb +1 -1
  193. package/behaviors/registry/ui/core/molecules/ui-accordion.orb +1 -1
  194. package/behaviors/registry/ui/core/molecules/ui-activation-block.orb +1 -1
  195. package/behaviors/registry/ui/core/molecules/ui-activity-rail.orb +1 -1
  196. package/behaviors/registry/ui/core/molecules/ui-agent-activity-feed.orb +1 -1
  197. package/behaviors/registry/ui/core/molecules/ui-agent-activity-row.orb +1 -1
  198. package/behaviors/registry/ui/core/molecules/ui-agent-chat-feed.orb +1 -1
  199. package/behaviors/registry/ui/core/molecules/ui-alert.orb +1 -1
  200. package/behaviors/registry/ui/core/molecules/ui-animated-counter.orb +1 -1
  201. package/behaviors/registry/ui/core/molecules/ui-bloom-quiz-block.orb +1 -1
  202. package/behaviors/registry/ui/core/molecules/ui-branching-logic-builder.orb +1 -1
  203. package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +1 -1
  204. package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +1 -1
  205. package/behaviors/registry/ui/core/molecules/ui-carousel.orb +1 -1
  206. package/behaviors/registry/ui/core/molecules/ui-change-list.orb +1 -1
  207. package/behaviors/registry/ui/core/molecules/ui-chart-legend.orb +1 -1
  208. package/behaviors/registry/ui/core/molecules/ui-chart.orb +1 -1
  209. package/behaviors/registry/ui/core/molecules/ui-code-block.orb +1 -1
  210. package/behaviors/registry/ui/core/molecules/ui-command-palette.orb +1 -1
  211. package/behaviors/registry/ui/core/molecules/ui-commit-row.orb +1 -1
  212. package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +1 -1
  213. package/behaviors/registry/ui/core/molecules/ui-connection-block.orb +1 -1
  214. package/behaviors/registry/ui/core/molecules/ui-container.orb +1 -1
  215. package/behaviors/registry/ui/core/molecules/ui-content-renderer.orb +1 -1
  216. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +1 -1
  217. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +1 -1
  218. package/behaviors/registry/ui/core/molecules/ui-date-range-picker.orb +1 -1
  219. package/behaviors/registry/ui/core/molecules/ui-date-range-selector.orb +1 -1
  220. package/behaviors/registry/ui/core/molecules/ui-doc-breadcrumb.orb +1 -1
  221. package/behaviors/registry/ui/core/molecules/ui-doc-pagination.orb +1 -1
  222. package/behaviors/registry/ui/core/molecules/ui-doc-search.orb +1 -1
  223. package/behaviors/registry/ui/core/molecules/ui-doc-sidebar.orb +1 -1
  224. package/behaviors/registry/ui/core/molecules/ui-doc-toc.orb +1 -1
  225. package/behaviors/registry/ui/core/molecules/ui-document-details.orb +1 -1
  226. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +1 -1
  227. package/behaviors/registry/ui/core/molecules/ui-document-viewer.orb +1 -1
  228. package/behaviors/registry/ui/core/molecules/ui-drawer.orb +1 -1
  229. package/behaviors/registry/ui/core/molecules/ui-edge-decoration.orb +1 -1
  230. package/behaviors/registry/ui/core/molecules/ui-emoji-picker.orb +1 -1
  231. package/behaviors/registry/ui/core/molecules/ui-empty-state.orb +1 -1
  232. package/behaviors/registry/ui/core/molecules/ui-error-boundary.orb +1 -1
  233. package/behaviors/registry/ui/core/molecules/ui-error-state.orb +1 -1
  234. package/behaviors/registry/ui/core/molecules/ui-feature-card.orb +1 -1
  235. package/behaviors/registry/ui/core/molecules/ui-feature-grid.orb +1 -1
  236. package/behaviors/registry/ui/core/molecules/ui-file-tree.orb +1 -1
  237. package/behaviors/registry/ui/core/molecules/ui-filter-group.orb +1 -1
  238. package/behaviors/registry/ui/core/molecules/ui-flex.orb +1 -1
  239. package/behaviors/registry/ui/core/molecules/ui-flip-card.orb +1 -1
  240. package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +1 -1
  241. package/behaviors/registry/ui/core/molecules/ui-floating-toolbar.orb +1 -1
  242. package/behaviors/registry/ui/core/molecules/ui-form-actions.orb +1 -1
  243. package/behaviors/registry/ui/core/molecules/ui-form-field.orb +1 -1
  244. package/behaviors/registry/ui/core/molecules/ui-form-layout.orb +1 -1
  245. package/behaviors/registry/ui/core/molecules/ui-form-section-header.orb +1 -1
  246. package/behaviors/registry/ui/core/molecules/ui-fx-overlay.orb +1 -1
  247. package/behaviors/registry/ui/core/molecules/ui-gantt.orb +1 -1
  248. package/behaviors/registry/ui/core/molecules/ui-geometric-pattern.orb +1 -1
  249. package/behaviors/registry/ui/core/molecules/ui-gradient-divider.orb +1 -1
  250. package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +1 -1
  251. package/behaviors/registry/ui/core/molecules/ui-graph-view.orb +1 -1
  252. package/behaviors/registry/ui/core/molecules/ui-grid.orb +1 -1
  253. package/behaviors/registry/ui/core/molecules/ui-header.orb +1 -1
  254. package/behaviors/registry/ui/core/molecules/ui-icon-button.orb +1 -1
  255. package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +1 -1
  256. package/behaviors/registry/ui/core/molecules/ui-import-progress.orb +1 -1
  257. package/behaviors/registry/ui/core/molecules/ui-import-source-picker.orb +1 -1
  258. package/behaviors/registry/ui/core/molecules/ui-input-group.orb +1 -1
  259. package/behaviors/registry/ui/core/molecules/ui-jazari-state-machine.orb +1 -1
  260. package/behaviors/registry/ui/core/molecules/ui-lightbox.orb +1 -1
  261. package/behaviors/registry/ui/core/molecules/ui-likert-scale.orb +1 -1
  262. package/behaviors/registry/ui/core/molecules/ui-line-chart.orb +1 -1
  263. package/behaviors/registry/ui/core/molecules/ui-loading-state.orb +1 -1
  264. package/behaviors/registry/ui/core/molecules/ui-map-view.orb +1 -1
  265. package/behaviors/registry/ui/core/molecules/ui-markdown-content.orb +1 -1
  266. package/behaviors/registry/ui/core/molecules/ui-matrix-question.orb +1 -1
  267. package/behaviors/registry/ui/core/molecules/ui-menu.orb +1 -1
  268. package/behaviors/registry/ui/core/molecules/ui-meter.orb +1 -1
  269. package/behaviors/registry/ui/core/molecules/ui-modal.orb +1 -1
  270. package/behaviors/registry/ui/core/molecules/ui-navigation.orb +1 -1
  271. package/behaviors/registry/ui/core/molecules/ui-notification.orb +1 -1
  272. package/behaviors/registry/ui/core/molecules/ui-number-stepper.orb +1 -1
  273. package/behaviors/registry/ui/core/molecules/ui-option-constraint-group.orb +1 -1
  274. package/behaviors/registry/ui/core/molecules/ui-orbital-visualization.orb +1 -1
  275. package/behaviors/registry/ui/core/molecules/ui-page-header.orb +1 -1
  276. package/behaviors/registry/ui/core/molecules/ui-page-transition.orb +1 -1
  277. package/behaviors/registry/ui/core/molecules/ui-pagination.orb +1 -1
  278. package/behaviors/registry/ui/core/molecules/ui-popover.orb +1 -1
  279. package/behaviors/registry/ui/core/molecules/ui-positioned-canvas.orb +1 -1
  280. package/behaviors/registry/ui/core/molecules/ui-progress-dots.orb +1 -1
  281. package/behaviors/registry/ui/core/molecules/ui-pull-to-refresh.orb +1 -1
  282. package/behaviors/registry/ui/core/molecules/ui-qr-scanner.orb +1 -1
  283. package/behaviors/registry/ui/core/molecules/ui-quiz-block.orb +1 -1
  284. package/behaviors/registry/ui/core/molecules/ui-reflection-block.orb +1 -1
  285. package/behaviors/registry/ui/core/molecules/ui-relation-select.orb +1 -1
  286. package/behaviors/registry/ui/core/molecules/ui-repeatable-form-section.orb +1 -1
  287. package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +1 -1
  288. package/behaviors/registry/ui/core/molecules/ui-rich-text-editor.orb +1 -1
  289. package/behaviors/registry/ui/core/molecules/ui-scaled-diagram.orb +1 -1
  290. package/behaviors/registry/ui/core/molecules/ui-search-input.orb +1 -1
  291. package/behaviors/registry/ui/core/molecules/ui-section.orb +1 -1
  292. package/behaviors/registry/ui/core/molecules/ui-side-panel.orb +1 -1
  293. package/behaviors/registry/ui/core/molecules/ui-sidebar.orb +1 -1
  294. package/behaviors/registry/ui/core/molecules/ui-signature-pad.orb +1 -1
  295. package/behaviors/registry/ui/core/molecules/ui-simple-grid.orb +1 -1
  296. package/behaviors/registry/ui/core/molecules/ui-skeleton.orb +1 -1
  297. package/behaviors/registry/ui/core/molecules/ui-social-proof.orb +1 -1
  298. package/behaviors/registry/ui/core/molecules/ui-sortable-list.orb +1 -1
  299. package/behaviors/registry/ui/core/molecules/ui-split.orb +1 -1
  300. package/behaviors/registry/ui/core/molecules/ui-star-rating.orb +1 -1
  301. package/behaviors/registry/ui/core/molecules/ui-stat-display.orb +1 -1
  302. package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +1 -1
  303. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +1 -1
  304. package/behaviors/registry/ui/core/molecules/ui-tabs.orb +1 -1
  305. package/behaviors/registry/ui/core/molecules/ui-tag-input.orb +1 -1
  306. package/behaviors/registry/ui/core/molecules/ui-tooltip.orb +1 -1
  307. package/behaviors/registry/ui/core/molecules/ui-top-nav-item.orb +1 -1
  308. package/behaviors/registry/ui/core/molecules/ui-upload-drop-zone.orb +1 -1
  309. package/behaviors/registry/ui/core/molecules/ui-version-diff.orb +1 -1
  310. package/behaviors/registry/ui/core/molecules/ui-violation-alert.orb +1 -1
  311. package/behaviors/registry/ui/core/molecules/ui-vote-stack.orb +1 -1
  312. package/behaviors/registry/ui/core/molecules/ui-wizard-container.orb +1 -1
  313. package/behaviors/registry/ui/core/molecules/ui-wizard-navigation.orb +1 -1
  314. package/behaviors/registry/ui/core/molecules/ui-wizard-progress.orb +1 -1
  315. package/behaviors/registry/ui/core/organisms/ui-chat-bar.orb +1 -1
  316. package/behaviors/registry/ui/core/organisms/ui-code-runner-panel.orb +1 -1
  317. package/behaviors/registry/ui/core/organisms/ui-dashboard-grid.orb +1 -1
  318. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +1 -1
  319. package/behaviors/registry/ui/core/organisms/ui-dock-layout.orb +1 -1
  320. package/behaviors/registry/ui/core/organisms/ui-drawer-slot.orb +1 -1
  321. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +1 -1
  322. package/behaviors/registry/ui/core/organisms/ui-form.orb +1 -1
  323. package/behaviors/registry/ui/core/organisms/ui-master-detail-layout.orb +1 -1
  324. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +1 -1
  325. package/behaviors/registry/ui/core/organisms/ui-modal-slot.orb +1 -1
  326. package/behaviors/registry/ui/core/organisms/ui-runtime-debugger.orb +1 -1
  327. package/behaviors/registry/ui/core/organisms/ui-segment-renderer.orb +1 -1
  328. package/behaviors/registry/ui/core/organisms/ui-split-pane.orb +1 -1
  329. package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +1 -1
  330. package/behaviors/registry/ui/core/organisms/ui-state-machine-view.orb +1 -1
  331. package/behaviors/registry/ui/core/organisms/ui-subagent-trace-panel.orb +1 -1
  332. package/behaviors/registry/ui/core/organisms/ui-tabbed-container.orb +1 -1
  333. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +1 -1
  334. package/behaviors/registry/ui/core/organisms/ui-toast-slot.orb +1 -1
  335. package/behaviors/registry/ui/core/templates/ui-auth-layout.orb +1 -1
  336. package/behaviors/registry/ui/core/templates/ui-counter-template.orb +1 -1
  337. package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +1 -1
  338. package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +1 -1
  339. package/behaviors/registry/ui/game/atoms/std-arcade-play.orb +1 -1
  340. package/behaviors/registry/ui/game/atoms/std-area-fill.orb +1 -1
  341. package/behaviors/registry/ui/game/atoms/std-audio-cue.orb +1 -1
  342. package/behaviors/registry/ui/game/atoms/std-camera-rig.orb +1 -1
  343. package/behaviors/registry/ui/game/atoms/std-chase-ai.orb +1 -1
  344. package/behaviors/registry/ui/game/atoms/std-choice-gate.orb +1 -1
  345. package/behaviors/registry/ui/game/atoms/std-coef-pad.orb +1 -1
  346. package/behaviors/registry/ui/game/atoms/std-curve-fog.orb +1 -1
  347. package/behaviors/registry/ui/game/atoms/std-dungeon-combat.orb +1 -1
  348. package/behaviors/registry/ui/game/atoms/std-fx-narrative.orb +1 -1
  349. package/behaviors/registry/ui/game/atoms/std-fx-particles.orb +1 -1
  350. package/behaviors/registry/ui/game/atoms/std-fx-trail.orb +1 -1
  351. package/behaviors/registry/ui/game/atoms/std-gate-lock.orb +1 -1
  352. package/behaviors/registry/ui/game/atoms/std-gather.orb +1 -1
  353. package/behaviors/registry/ui/game/atoms/std-gold.orb +1 -1
  354. package/behaviors/registry/ui/game/atoms/std-grid-tactics.orb +1 -1
  355. package/behaviors/registry/ui/game/atoms/std-hero-nav.orb +1 -1
  356. package/behaviors/registry/ui/game/atoms/std-lives.orb +1 -1
  357. package/behaviors/registry/ui/game/atoms/std-loop-lock.orb +1 -1
  358. package/behaviors/registry/ui/game/atoms/std-market-flow.orb +1 -1
  359. package/behaviors/registry/ui/game/atoms/std-motion-body.orb +1 -1
  360. package/behaviors/registry/ui/game/atoms/std-objective-reach.orb +1 -1
  361. package/behaviors/registry/ui/game/atoms/std-pad-lock.orb +1 -1
  362. package/behaviors/registry/ui/game/atoms/std-patience.orb +1 -1
  363. package/behaviors/registry/ui/game/atoms/std-patrol-hazard.orb +1 -1
  364. package/behaviors/registry/ui/game/atoms/std-pickup.orb +1 -1
  365. package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +1 -1
  366. package/behaviors/registry/ui/game/atoms/std-production.orb +1 -1
  367. package/behaviors/registry/ui/game/atoms/std-score.orb +1 -1
  368. package/behaviors/registry/ui/game/atoms/std-tutorial-autodemo.orb +1 -1
  369. package/behaviors/registry/ui/game/atoms/std-tutorial-overlay.orb +1 -1
  370. package/behaviors/registry/ui/game/atoms/std-velocity-gate.orb +1 -1
  371. package/behaviors/registry/ui/game/atoms/std-xp.orb +1 -1
  372. package/behaviors/registry/ui/game/atoms/std-zone-card.orb +1 -1
  373. package/behaviors/registry/ui/game/atoms/ui-action-palette.orb +1 -1
  374. package/behaviors/registry/ui/game/atoms/ui-action-tile.orb +1 -1
  375. package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +1 -1
  376. package/behaviors/registry/ui/game/atoms/ui-canvas.orb +1 -1
  377. package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +1 -1
  378. package/behaviors/registry/ui/game/atoms/ui-control-button.orb +1 -1
  379. package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +1 -1
  380. package/behaviors/registry/ui/game/atoms/ui-dialogue-bubble.orb +1 -1
  381. package/behaviors/registry/ui/game/atoms/ui-draw-fx-layer.orb +1 -1
  382. package/behaviors/registry/ui/game/atoms/ui-draw-group.orb +1 -1
  383. package/behaviors/registry/ui/game/atoms/ui-draw-mesh.orb +1 -1
  384. package/behaviors/registry/ui/game/atoms/ui-draw-shape-layer.orb +1 -1
  385. package/behaviors/registry/ui/game/atoms/ui-draw-shape.orb +1 -1
  386. package/behaviors/registry/ui/game/atoms/ui-draw-skinned-mesh.orb +1 -1
  387. package/behaviors/registry/ui/game/atoms/ui-draw-sprite-layer.orb +1 -1
  388. package/behaviors/registry/ui/game/atoms/ui-draw-sprite.orb +1 -1
  389. package/behaviors/registry/ui/game/atoms/ui-draw-text-layer.orb +1 -1
  390. package/behaviors/registry/ui/game/atoms/ui-draw-text.orb +1 -1
  391. package/behaviors/registry/ui/game/atoms/ui-game-audio-cue.orb +1 -1
  392. package/behaviors/registry/ui/game/atoms/ui-game-audio-toggle.orb +1 -1
  393. package/behaviors/registry/ui/game/atoms/ui-game-hud.orb +1 -1
  394. package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +1 -1
  395. package/behaviors/registry/ui/game/atoms/ui-health-bar.orb +1 -1
  396. package/behaviors/registry/ui/game/atoms/ui-score-display.orb +1 -1
  397. package/behaviors/registry/ui/game/atoms/ui-sequence-bar.orb +1 -1
  398. package/behaviors/registry/ui/game/atoms/ui-stat-badge.orb +1 -1
  399. package/behaviors/registry/ui/game/atoms/ui-state-graph.orb +1 -1
  400. package/behaviors/registry/ui/game/atoms/ui-state-json-view.orb +1 -1
  401. package/behaviors/registry/ui/game/atoms/ui-timer-display.orb +1 -1
  402. package/behaviors/registry/ui/game/atoms/ui-trait-slot.orb +1 -1
  403. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +1 -1
  404. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +1 -1
  405. package/behaviors/registry/ui/game/organisms/std-dungeon-board-2d.orb +1 -1
  406. package/behaviors/registry/ui/game/organisms/std-market-board-3d.orb +1 -1
  407. package/behaviors/registry/ui/game/organisms/std-objective-board-3d.orb +1 -1
  408. package/behaviors/registry/ui/game/organisms/std-platformer-board-2d.orb +1 -1
  409. package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +1 -1
  410. package/behaviors/registry/ui/game/organisms/std-survival-board-3d.orb +1 -1
  411. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +1 -1
  412. package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +1 -1
  413. package/behaviors/registry/ui/game/organisms/std-worldmap-board-2d.orb +1 -1
  414. package/behaviors/registry/ui/game/templates/ui-game-shell.orb +1 -1
  415. package/behaviors/registry/ui/learning/atoms/std-learn-arrangement.orb +1 -1
  416. package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +1 -1
  417. package/behaviors/registry/ui/learning/atoms/std-learn-compare.orb +1 -1
  418. package/behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb +1 -1
  419. package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +1 -1
  420. package/behaviors/registry/ui/learning/atoms/std-learn-diagram.orb +1 -1
  421. package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +1 -1
  422. package/behaviors/registry/ui/learning/atoms/std-learn-estimate.orb +1 -1
  423. package/behaviors/registry/ui/learning/atoms/std-learn-fx-cues.orb +1 -1
  424. package/behaviors/registry/ui/learning/atoms/std-learn-generate.orb +1 -1
  425. package/behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb +1 -1
  426. package/behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb +1 -1
  427. package/behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb +1 -1
  428. package/behaviors/registry/ui/learning/atoms/std-learn-live-sim.orb +1 -1
  429. package/behaviors/registry/ui/learning/atoms/std-learn-measure.orb +1 -1
  430. package/behaviors/registry/ui/learning/atoms/std-learn-param-explorer.orb +1 -1
  431. package/behaviors/registry/ui/learning/atoms/std-learn-perturb.orb +1 -1
  432. package/behaviors/registry/ui/learning/atoms/std-learn-predict.orb +1 -1
  433. package/behaviors/registry/ui/learning/atoms/std-learn-sample-accumulator.orb +1 -1
  434. package/behaviors/registry/ui/learning/atoms/std-learn-sandbox.orb +1 -1
  435. package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +1 -1
  436. package/behaviors/registry/ui/learning/atoms/std-learn-scenario.orb +1 -1
  437. package/behaviors/registry/ui/learning/atoms/std-learn-sim-3d.orb +1 -1
  438. package/behaviors/registry/ui/learning/atoms/std-learn-slope-probe.orb +1 -1
  439. package/behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb +1 -1
  440. package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +1 -1
  441. package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +1 -1
  442. package/behaviors/registry/ui/learning/atoms/std-learn-trace-player.orb +1 -1
  443. package/behaviors/registry/ui/learning/atoms/std-learn-transport.orb +1 -1
  444. package/behaviors/registry/ui/learning/atoms/std-learn-tree.orb +1 -1
  445. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +1 -1
  446. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +1 -1
  447. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +1 -1
  448. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +1 -1
  449. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +1 -1
  450. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +1 -1
  451. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +1 -1
  452. package/dist/behaviors-embeddings.hash.json +1 -1
  453. package/dist/behaviors-embeddings.json +1 -1
  454. package/dist/knob-embeddings.hash.json +1 -1
  455. package/package.json +1 -1
@@ -1 +1 @@
1
- {"name":"std-gate-lock","version":"1.0.0","description":"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.","orbitals":[{"name":"GateLockOrbital","id":"orb_Q1W54F18C0M60F6NG4YAECBT92","entity":{"name":"GateLockData","id":"ent_F9T7NBQA41N20R824S2PW9SNFH","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"doors","type":"array","default":[],"items":{"type":"object","properties":{"width":{"name":"width","type":"number","required":true},"y":{"name":"y","type":"number","required":true},"touching":{"name":"touching","type":"boolean","required":false},"height":{"name":"height","type":"number","required":true},"open":{"name":"open","type":"boolean","required":false},"id":{"name":"id","type":"string","required":true},"cost":{"name":"cost","type":"number","required":true},"blocked":{"name":"blocked","type":"boolean","required":false},"x":{"name":"x","type":"number","required":true}}}},{"name":"total","type":"number","default":0}],"shared":true},"traits":[{"name":"GateLock","id":"trt_GNN8YF7ZSRZWW457HBW65CX3CV","entityRebindable":true,"entityContract":{"requires":[],"provides":["doors","total"]},"effectRow":[{"kind":"emit","resource":"GATE_BLOCKED"},{"kind":"emit","resource":"GATE_OPENED"},{"kind":"set","resource":"@entity.doors"},{"kind":"set","resource":"@entity.total"}],"category":"lifecycle","linkedEntity":"GateLockData","linkedEntityId":"ent_F9T7NBQA41N20R824S2PW9SNFH","entityRefIds":{"GateLockData":"ent_F9T7NBQA41N20R824S2PW9SNFH"},"emits":[{"event":"GATE_OPENED","eventId":"evt_QZR4TR80Z70FKZVMBBP65NK875","description":"A door's cost was reached by the collected total and it flipped open; boards layer unlock fx. When several doors open on one total, the first reports and the shared entity carries the rest.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"cost","type":"number","required":true}]},{"event":"GATE_BLOCKED","eventId":"evt_1AJGF17E4EQ2792R09CPN8V2SY","description":"The player is inside a closed door's rect; fires once per approach and re-arms after they step out. Boards answer with a PLACE back plus a locked fx.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_E9NF8Y2AQ15BGX2W49J8BFW85P","name":"Initialize"},{"key":"COLLECT","id":"evt_A4CMKPCAV95DMG1HS432GD52Z5","name":"Collect","payloadSchema":[{"name":"total","type":"number","required":true}],"listened":true},{"key":"BODY_MOVED","id":"evt_WZXW38XKBGSNR65Z6P5TXB757A","name":"Body Moved","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"vx","type":"number","required":true},{"name":"vy","type":"number","required":true},{"name":"grounded","type":"boolean","required":true},{"name":"skating","type":"boolean","required":true},{"name":"speed","type":"number","required":true}],"listened":true},{"key":"SET_DOORS","id":"evt_ERP4Q6B36RHKC3PFRQ0VG0GR1N","name":"Set Doors","payloadSchema":[{"name":"doors","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"width","type":"number","required":true},{"name":"height","type":"number","required":true},{"name":"cost","type":"number","required":true},{"name":"open","type":"boolean"},{"name":"touching","type":"boolean"},{"name":"blocked","type":"boolean"}]}],"listened":true},{"key":"RESTART","id":"evt_H5KXAZHDY6PZ3DT3GP9PW7X657","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"GATE_OPENED","id":"evt_QZR4TR80Z70FKZVMBBP65NK875","name":"Gate Opened","description":"A door's cost was reached by the collected total and it flipped open; boards layer unlock fx. When several doors open on one total, the first reports and the shared entity carries the rest.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"cost","type":"number","required":true}]},{"key":"GATE_BLOCKED","id":"evt_1AJGF17E4EQ2792R09CPN8V2SY","name":"Gate Blocked","description":"The player is inside a closed door's rect; fires once per approach and re-arms after they step out. Boards answer with a PLACE back plus a locked fx.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_E9NF8Y2AQ15BGX2W49J8BFW85P","effects":[["set","@entity.doors",["array/map","@config.doors",["fn","d",["object/merge","@d",{"open":false,"touching":false,"blocked":false}]]]],["set","@entity.total",0]]},{"from":"active","to":"active","event":"COLLECT","eventId":"evt_A4CMKPCAV95DMG1HS432GD52Z5","guard":"@config.running","effects":[["set","@entity.total","@payload.total"],["let",[["newly",["array/filter","@entity.doors",["fn","d",["and",["==",["object/get","@d","open"],false],["<=",["object/get","@d","cost"],"@payload.total"]]]]]],["if",[">",["array/len","@newly"],0],["do",["set","@entity.doors",["array/map","@entity.doors",["fn","d",["if",["and",["==",["object/get","@d","open"],false],["<=",["object/get","@d","cost"],"@payload.total"]],["object/merge","@d",{"open":true}],"@d"]]]],["emit","GATE_OPENED",{"id":["object/get",["array/first","@newly"],"id"],"cost":["object/get",["array/first","@newly"],"cost"]}]],null]]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_WZXW38XKBGSNR65Z6P5TXB757A","guard":"@config.running","effects":[["set","@entity.doors",["array/map","@entity.doors",["fn","d",["let",[["inside",["and",["==",["object/get","@d","open"],false],["and",[">=","@payload.x",["-",["object/get","@d","x"],"@config.reachMargin"]],["and",["<=","@payload.x",["+",["object/get","@d","x"],["object/get","@d","width"],"@config.reachMargin"]],["and",[">=","@payload.y",["-",["object/get","@d","y"],"@config.reachMargin"]],["<=","@payload.y",["+",["object/get","@d","y"],["object/get","@d","height"],"@config.reachMargin"]]]]]]]],["object/merge","@d",{"touching":"@inside","blocked":["and","@inside",["==",["object/get","@d","touching"],false]]}]]]]],["let",[["blocked",["array/filter","@entity.doors",["fn","d",["==",["object/get","@d","blocked"],true]]]]],["if",[">",["array/len","@blocked"],0],["emit","GATE_BLOCKED",{"id":["object/get",["array/first","@blocked"],"id"],"x":["object/get",["array/first","@blocked"],"x"],"y":["object/get",["array/first","@blocked"],"y"]}],null]]]},{"from":"active","to":"active","event":"SET_DOORS","eventId":"evt_ERP4Q6B36RHKC3PFRQ0VG0GR1N","effects":[["set","@entity.doors",["array/map","@payload.doors",["fn","d",["object/merge","@d",{"open":false,"touching":false,"blocked":false}]]]],["set","@entity.total",0]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_H5KXAZHDY6PZ3DT3GP9PW7X657","effects":[["set","@entity.doors",["array/map","@entity.doors",["fn","d",["object/merge","@d",{"open":false,"touching":false,"blocked":false}]]]],["set","@entity.total",0]]}]},"config":{"running":{"type":"boolean","default":true,"label":"Running","description":"When true, COLLECT opens doors and closed doors report contact; toggle to freeze every door as-is.","tier":"domain"},"doors":{"type":"[Door]","default":[],"label":"Doors","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.","tier":"domain","items":{"type":"object","properties":{"id":{"name":"id","type":"string","required":true},"height":{"name":"height","type":"number","required":true},"touching":{"name":"touching","type":"boolean","required":false},"y":{"name":"y","type":"number","required":true},"blocked":{"name":"blocked","type":"boolean","required":false},"x":{"name":"x","type":"number","required":true},"cost":{"name":"cost","type":"number","required":true},"width":{"name":"width","type":"number","required":true},"open":{"name":"open","type":"boolean","required":false}}}},"reachMargin":{"type":"number","default":0.6,"label":"Reach Margin","description":"Extra world units padded around a closed door's rect when testing player contact (approximates the body's size).","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"GateLockPage","id":"pag_35E7STHB0WNGE92BA5WTYPQQZJ","path":"/gate-lock","traits":[{"ref":"GateLock","refId":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"}]}],"types":{"Door":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"width","type":"number","required":true},{"name":"height","type":"number","required":true},{"name":"cost","type":"number","required":true},{"name":"open","type":"boolean"},{"name":"touching","type":"boolean"},{"name":"blocked","type":"boolean"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_F9T7NBQA41N20R824S2PW9SNFH":{"id":"ent_F9T7NBQA41N20R824S2PW9SNFH","kind":"entity","bakedName":"GateLockData","curName":"GateLockData","renames":[],"owner":"workspace"},"evt_1AJGF17E4EQ2792R09CPN8V2SY":{"id":"evt_1AJGF17E4EQ2792R09CPN8V2SY","kind":"event","bakedName":"GATE_BLOCKED","curName":"GATE_BLOCKED","renames":[],"owner":"workspace","parent":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"},"evt_A4CMKPCAV95DMG1HS432GD52Z5":{"id":"evt_A4CMKPCAV95DMG1HS432GD52Z5","kind":"event","bakedName":"COLLECT","curName":"COLLECT","renames":[],"owner":"workspace","parent":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"},"evt_E9NF8Y2AQ15BGX2W49J8BFW85P":{"id":"evt_E9NF8Y2AQ15BGX2W49J8BFW85P","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"},"evt_ERP4Q6B36RHKC3PFRQ0VG0GR1N":{"id":"evt_ERP4Q6B36RHKC3PFRQ0VG0GR1N","kind":"event","bakedName":"SET_DOORS","curName":"SET_DOORS","renames":[],"owner":"workspace","parent":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"},"evt_H5KXAZHDY6PZ3DT3GP9PW7X657":{"id":"evt_H5KXAZHDY6PZ3DT3GP9PW7X657","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"},"evt_QZR4TR80Z70FKZVMBBP65NK875":{"id":"evt_QZR4TR80Z70FKZVMBBP65NK875","kind":"event","bakedName":"GATE_OPENED","curName":"GATE_OPENED","renames":[],"owner":"workspace","parent":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"},"evt_WZXW38XKBGSNR65Z6P5TXB757A":{"id":"evt_WZXW38XKBGSNR65Z6P5TXB757A","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"},"orb_Q1W54F18C0M60F6NG4YAECBT92":{"id":"orb_Q1W54F18C0M60F6NG4YAECBT92","kind":"orbital","bakedName":"GateLockOrbital","curName":"GateLockOrbital","renames":[],"owner":"workspace"},"pag_35E7STHB0WNGE92BA5WTYPQQZJ":{"id":"pag_35E7STHB0WNGE92BA5WTYPQQZJ","kind":"page","bakedName":"GateLockPage","curName":"GateLockPage","renames":[],"owner":"workspace"},"trt_GNN8YF7ZSRZWW457HBW65CX3CV":{"id":"trt_GNN8YF7ZSRZWW457HBW65CX3CV","kind":"trait","bakedName":"GateLock","curName":"GateLock","renames":[],"owner":"workspace"}}}}
1
+ {"name":"std-gate-lock","version":"1.0.0","description":"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.","orbitals":[{"name":"GateLockOrbital","id":"orb_Q1W54F18C0M60F6NG4YAECBT92","entity":{"name":"GateLockData","id":"ent_F9T7NBQA41N20R824S2PW9SNFH","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"doors","type":"array","default":[],"items":{"type":"object","properties":{"touching":{"name":"touching","type":"boolean","required":false},"cost":{"name":"cost","type":"number","required":true},"width":{"name":"width","type":"number","required":true},"id":{"name":"id","type":"string","required":true},"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true},"height":{"name":"height","type":"number","required":true},"open":{"name":"open","type":"boolean","required":false},"blocked":{"name":"blocked","type":"boolean","required":false}}}},{"name":"total","type":"number","default":0}],"shared":true},"traits":[{"name":"GateLock","id":"trt_GNN8YF7ZSRZWW457HBW65CX3CV","entityRebindable":true,"entityContract":{"requires":[],"provides":["doors","total"]},"effectRow":[{"kind":"emit","resource":"GATE_BLOCKED"},{"kind":"emit","resource":"GATE_OPENED"},{"kind":"set","resource":"@entity.doors"},{"kind":"set","resource":"@entity.total"}],"category":"lifecycle","linkedEntity":"GateLockData","linkedEntityId":"ent_F9T7NBQA41N20R824S2PW9SNFH","entityRefIds":{"GateLockData":"ent_F9T7NBQA41N20R824S2PW9SNFH"},"emits":[{"event":"GATE_OPENED","eventId":"evt_QZR4TR80Z70FKZVMBBP65NK875","description":"A door's cost was reached by the collected total and it flipped open; boards layer unlock fx. When several doors open on one total, the first reports and the shared entity carries the rest.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"cost","type":"number","required":true}]},{"event":"GATE_BLOCKED","eventId":"evt_1AJGF17E4EQ2792R09CPN8V2SY","description":"The player is inside a closed door's rect; fires once per approach and re-arms after they step out. Boards answer with a PLACE back plus a locked fx.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_E9NF8Y2AQ15BGX2W49J8BFW85P","name":"Initialize"},{"key":"COLLECT","id":"evt_A4CMKPCAV95DMG1HS432GD52Z5","name":"Collect","payloadSchema":[{"name":"total","type":"number","required":true}],"listened":true},{"key":"BODY_MOVED","id":"evt_WZXW38XKBGSNR65Z6P5TXB757A","name":"Body Moved","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"vx","type":"number","required":true},{"name":"vy","type":"number","required":true},{"name":"grounded","type":"boolean","required":true},{"name":"skating","type":"boolean","required":true},{"name":"speed","type":"number","required":true}],"listened":true},{"key":"SET_DOORS","id":"evt_ERP4Q6B36RHKC3PFRQ0VG0GR1N","name":"Set Doors","payloadSchema":[{"name":"doors","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"width","type":"number","required":true},{"name":"height","type":"number","required":true},{"name":"cost","type":"number","required":true},{"name":"open","type":"boolean"},{"name":"touching","type":"boolean"},{"name":"blocked","type":"boolean"}]}],"listened":true},{"key":"RESTART","id":"evt_H5KXAZHDY6PZ3DT3GP9PW7X657","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"GATE_OPENED","id":"evt_QZR4TR80Z70FKZVMBBP65NK875","name":"Gate Opened","description":"A door's cost was reached by the collected total and it flipped open; boards layer unlock fx. When several doors open on one total, the first reports and the shared entity carries the rest.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"cost","type":"number","required":true}]},{"key":"GATE_BLOCKED","id":"evt_1AJGF17E4EQ2792R09CPN8V2SY","name":"Gate Blocked","description":"The player is inside a closed door's rect; fires once per approach and re-arms after they step out. Boards answer with a PLACE back plus a locked fx.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_E9NF8Y2AQ15BGX2W49J8BFW85P","effects":[["set","@entity.doors",["array/map","@config.doors",["fn","d",["object/merge","@d",{"open":false,"touching":false,"blocked":false}]]]],["set","@entity.total",0]]},{"from":"active","to":"active","event":"COLLECT","eventId":"evt_A4CMKPCAV95DMG1HS432GD52Z5","guard":"@config.running","effects":[["set","@entity.total","@payload.total"],["let",[["newly",["array/filter","@entity.doors",["fn","d",["and",["==",["object/get","@d","open"],false],["<=",["object/get","@d","cost"],"@payload.total"]]]]]],["if",[">",["array/len","@newly"],0],["do",["set","@entity.doors",["array/map","@entity.doors",["fn","d",["if",["and",["==",["object/get","@d","open"],false],["<=",["object/get","@d","cost"],"@payload.total"]],["object/merge","@d",{"open":true}],"@d"]]]],["emit","GATE_OPENED",{"id":["object/get",["array/first","@newly"],"id"],"cost":["object/get",["array/first","@newly"],"cost"]}]],null]]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_WZXW38XKBGSNR65Z6P5TXB757A","guard":"@config.running","effects":[["set","@entity.doors",["array/map","@entity.doors",["fn","d",["let",[["inside",["and",["==",["object/get","@d","open"],false],["and",[">=","@payload.x",["-",["object/get","@d","x"],"@config.reachMargin"]],["and",["<=","@payload.x",["+",["object/get","@d","x"],["object/get","@d","width"],"@config.reachMargin"]],["and",[">=","@payload.y",["-",["object/get","@d","y"],"@config.reachMargin"]],["<=","@payload.y",["+",["object/get","@d","y"],["object/get","@d","height"],"@config.reachMargin"]]]]]]]],["object/merge","@d",{"touching":"@inside","blocked":["and","@inside",["==",["object/get","@d","touching"],false]]}]]]]],["let",[["blocked",["array/filter","@entity.doors",["fn","d",["==",["object/get","@d","blocked"],true]]]]],["if",[">",["array/len","@blocked"],0],["emit","GATE_BLOCKED",{"id":["object/get",["array/first","@blocked"],"id"],"x":["object/get",["array/first","@blocked"],"x"],"y":["object/get",["array/first","@blocked"],"y"]}],null]]]},{"from":"active","to":"active","event":"SET_DOORS","eventId":"evt_ERP4Q6B36RHKC3PFRQ0VG0GR1N","effects":[["set","@entity.doors",["array/map","@payload.doors",["fn","d",["object/merge","@d",{"open":false,"touching":false,"blocked":false}]]]],["set","@entity.total",0]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_H5KXAZHDY6PZ3DT3GP9PW7X657","effects":[["set","@entity.doors",["array/map","@entity.doors",["fn","d",["object/merge","@d",{"open":false,"touching":false,"blocked":false}]]]],["set","@entity.total",0]]}]},"config":{"running":{"type":"boolean","default":true,"label":"Running","description":"When true, COLLECT opens doors and closed doors report contact; toggle to freeze every door as-is.","tier":"domain"},"reachMargin":{"type":"number","default":0.6,"label":"Reach Margin","description":"Extra world units padded around a closed door's rect when testing player contact (approximates the body's size).","tier":"domain"},"doors":{"type":"[Door]","default":[],"label":"Doors","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.","tier":"domain","items":{"type":"object","properties":{"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true},"cost":{"name":"cost","type":"number","required":true},"touching":{"name":"touching","type":"boolean","required":false},"open":{"name":"open","type":"boolean","required":false},"width":{"name":"width","type":"number","required":true},"height":{"name":"height","type":"number","required":true},"blocked":{"name":"blocked","type":"boolean","required":false},"id":{"name":"id","type":"string","required":true}}}}},"scope":"instance"}],"pages":[{"name":"GateLockPage","id":"pag_35E7STHB0WNGE92BA5WTYPQQZJ","path":"/gate-lock","traits":[{"ref":"GateLock","refId":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"}]}],"types":{"Door":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"width","type":"number","required":true},{"name":"height","type":"number","required":true},{"name":"cost","type":"number","required":true},{"name":"open","type":"boolean"},{"name":"touching","type":"boolean"},{"name":"blocked","type":"boolean"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_F9T7NBQA41N20R824S2PW9SNFH":{"id":"ent_F9T7NBQA41N20R824S2PW9SNFH","kind":"entity","bakedName":"GateLockData","curName":"GateLockData","renames":[],"owner":"workspace"},"evt_1AJGF17E4EQ2792R09CPN8V2SY":{"id":"evt_1AJGF17E4EQ2792R09CPN8V2SY","kind":"event","bakedName":"GATE_BLOCKED","curName":"GATE_BLOCKED","renames":[],"owner":"workspace","parent":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"},"evt_A4CMKPCAV95DMG1HS432GD52Z5":{"id":"evt_A4CMKPCAV95DMG1HS432GD52Z5","kind":"event","bakedName":"COLLECT","curName":"COLLECT","renames":[],"owner":"workspace","parent":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"},"evt_E9NF8Y2AQ15BGX2W49J8BFW85P":{"id":"evt_E9NF8Y2AQ15BGX2W49J8BFW85P","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"},"evt_ERP4Q6B36RHKC3PFRQ0VG0GR1N":{"id":"evt_ERP4Q6B36RHKC3PFRQ0VG0GR1N","kind":"event","bakedName":"SET_DOORS","curName":"SET_DOORS","renames":[],"owner":"workspace","parent":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"},"evt_H5KXAZHDY6PZ3DT3GP9PW7X657":{"id":"evt_H5KXAZHDY6PZ3DT3GP9PW7X657","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"},"evt_QZR4TR80Z70FKZVMBBP65NK875":{"id":"evt_QZR4TR80Z70FKZVMBBP65NK875","kind":"event","bakedName":"GATE_OPENED","curName":"GATE_OPENED","renames":[],"owner":"workspace","parent":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"},"evt_WZXW38XKBGSNR65Z6P5TXB757A":{"id":"evt_WZXW38XKBGSNR65Z6P5TXB757A","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_GNN8YF7ZSRZWW457HBW65CX3CV"},"orb_Q1W54F18C0M60F6NG4YAECBT92":{"id":"orb_Q1W54F18C0M60F6NG4YAECBT92","kind":"orbital","bakedName":"GateLockOrbital","curName":"GateLockOrbital","renames":[],"owner":"workspace"},"pag_35E7STHB0WNGE92BA5WTYPQQZJ":{"id":"pag_35E7STHB0WNGE92BA5WTYPQQZJ","kind":"page","bakedName":"GateLockPage","curName":"GateLockPage","renames":[],"owner":"workspace"},"trt_GNN8YF7ZSRZWW457HBW65CX3CV":{"id":"trt_GNN8YF7ZSRZWW457HBW65CX3CV","kind":"trait","bakedName":"GateLock","curName":"GateLock","renames":[],"owner":"workspace"}}}}
@@ -1 +1 @@
1
- {"name":"std-gather","version":"1.0.0","description":"Headless resource-gathering mechanic: owns features + wood + stone. Listens HERO_STEPPED and, when the hero lands on a wood/stone-type feature, increments the matching resource, removes the node, emits a BURST pickup particle, and emits RESOURCES so survival-flow can decide loss. Never writes units.","orbitals":[{"name":"GatherOrbital","id":"orb_C8W9GRVQH0VRGAQQ14Z43PJVKR","entity":{"name":"GatherData","id":"ent_27BV2P44XM2ETFFZ2D0N314PX1","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"features","type":"array","items":{"type":"object","properties":{"color":{"name":"color","type":"string","required":false},"type":{"name":"type","type":"string","required":true},"z":{"name":"z","type":"number","required":false},"id":{"name":"id","type":"string","required":false},"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true},"elevation":{"name":"elevation","type":"number","required":false},"assetUrl":{"name":"assetUrl","type":"object","required":false,"properties":{"thumbnailUrl":{"name":"thumbnailUrl","type":"string","required":false},"role":{"name":"role","type":"string","required":false},"category":{"name":"category","type":"string","required":false},"dimension":{"name":"dimension","type":"string","required":false},"aspect":{"name":"aspect","type":"string","required":false},"name":{"name":"name","type":"string","required":false},"animations":{"name":"animations","type":"array","required":false,"items":{"type":"string"}},"style":{"name":"style","type":"string","required":false},"url":{"name":"url","type":"string","required":false},"variant":{"name":"variant","type":"string","required":false}}}}}},{"name":"wood","type":"number","default":0},{"name":"stone","type":"number","default":0}],"shared":true},"traits":[{"name":"Gather","id":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF","entityRebindable":true,"entityContract":{"requires":[],"provides":["features","stone","wood"]},"effectRow":[{"kind":"emit","resource":"BURST"},{"kind":"emit","resource":"RESOURCES"},{"kind":"set","resource":"@entity.features"},{"kind":"set","resource":"@entity.stone"},{"kind":"set","resource":"@entity.wood"}],"category":"lifecycle","linkedEntity":"GatherData","linkedEntityId":"ent_27BV2P44XM2ETFFZ2D0N314PX1","entityRefIds":{"GatherData":"ent_27BV2P44XM2ETFFZ2D0N314PX1"},"emits":[{"event":"BURST","eventId":"evt_F7RVTSEB3H5HRMMGK85THTM1TT","description":"Pickup particle produced when a resource node is gathered; a fx-particles listener spawns it","tier":"domain","scope":"external","payloadSchema":[{"name":"particles","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"entity":"Fx"}]},{"event":"RESOURCES","eventId":"evt_4XB5X6QAMYNAF4XDQZ13WN10SV","description":"Wood/stone totals and moves remaining after this step; a survival-flow listener decides loss","tier":"domain","scope":"external","payloadSchema":[{"name":"wood","type":"number","required":true},{"name":"stone","type":"number","required":true},{"name":"movesLeft","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_5Q81Z2WVCQDPBTYR6WX8VQ4K8H","name":"Initialize"},{"key":"HERO_STEPPED","id":"evt_6QZ8PDKZQ1ZVGMF8C23HEF78QS","name":"Hero Stepped","payloadSchema":[{"name":"unitId","type":"string"},{"name":"x","type":"number"},{"name":"z","type":"number"},{"name":"movesLeft","type":"number"}],"listened":true},{"key":"RESTART","id":"evt_7X9KKRDE6CQ360XDAEST6072WS","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"BURST","id":"evt_F7RVTSEB3H5HRMMGK85THTM1TT","name":"Burst","description":"Pickup particle produced when a resource node is gathered; a fx-particles listener spawns it","tier":"domain","payloadSchema":[{"name":"particles","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"entity":"Fx"}]},{"key":"RESOURCES","id":"evt_4XB5X6QAMYNAF4XDQZ13WN10SV","name":"Resources","description":"Wood/stone totals and moves remaining after this step; a survival-flow listener decides loss","tier":"domain","payloadSchema":[{"name":"wood","type":"number","required":true},{"name":"stone","type":"number","required":true},{"name":"movesLeft","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_5Q81Z2WVCQDPBTYR6WX8VQ4K8H","effects":[["set","@entity.features","@config.features"],["set","@entity.wood","@config.startWood"],["set","@entity.stone","@config.startStone"]]},{"from":"active","to":"active","event":"HERO_STEPPED","eventId":"evt_6QZ8PDKZQ1ZVGMF8C23HEF78QS","guard":"@config.running","effects":[["let",[["matched",["array/filter","@entity.features",["fn","f",["and",["==",["object/get","@f","x"],"@payload.x"],["and",["==",["object/get","@f","y"],"@payload.z"],["or",["==",["object/get","@f","type"],"@config.woodType"],["==",["object/get","@f","type"],"@config.stoneType"]]]]]]]],["let",[["woodHits",["array/len",["array/filter","@matched",["fn","f",["==",["object/get","@f","type"],"@config.woodType"]]]]],["stoneHits",["array/len",["array/filter","@matched",["fn","f",["==",["object/get","@f","type"],"@config.stoneType"]]]]]],["do",["set","@entity.wood",["+","@entity.wood",["*","@config.yieldPerNode","@woodHits"]]],["set","@entity.stone",["+","@entity.stone",["*","@config.yieldPerNode","@stoneHits"]]],["set","@entity.features",["array/filter","@entity.features",["fn","f",["not",["and",["==",["object/get","@f","x"],"@payload.x"],["and",["==",["object/get","@f","y"],"@payload.z"],["or",["==",["object/get","@f","type"],"@config.woodType"],["==",["object/get","@f","type"],"@config.stoneType"]]]]]]]],["emit","BURST",{"particles":["array/map","@matched",["fn","f",{"id":["str/concat","fx-gather-",["object/get","@f","id"]],"type":"pickup","x":["object/get","@f","x"],"z":["object/get","@f","y"],"message":["if",["==",["object/get","@f","type"],"@config.woodType"],"+1 wood","+1 stone"],"ttl":3}]]}],["emit","RESOURCES",{"wood":"@entity.wood","stone":"@entity.stone","movesLeft":"@payload.movesLeft"}]]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_7X9KKRDE6CQ360XDAEST6072WS","effects":[["set","@entity.features","@config.features"],["set","@entity.wood","@config.startWood"],["set","@entity.stone","@config.startStone"]]}]},"config":{"woodType":{"type":"string","default":"tree","label":"Wood Type","description":"Feature type counted as a wood resource node","tier":"domain"},"startStone":{"type":"number","default":0,"label":"Start Stone","description":"Stone set on INIT","tier":"domain"},"yieldPerNode":{"type":"number","default":1,"label":"Yield Per Node","description":"Wood or stone gained per node gathered","tier":"domain"},"startWood":{"type":"number","default":0,"label":"Start Wood","description":"Wood set on INIT","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, hero steps onto resource nodes are gathered; toggle to freeze","tier":"domain"},"features":{"type":"[Feature]","default":[],"label":"Features","description":"Board features — resource nodes (matched by woodType/stoneType) plus decorations","tier":"domain","items":{"type":"object","properties":{"type":{"name":"type","type":"string","required":true},"assetUrl":{"name":"assetUrl","type":"object","required":false,"properties":{"dimension":{"name":"dimension","type":"string","required":false},"animations":{"name":"animations","type":"array","required":false,"items":{"type":"string"}},"name":{"name":"name","type":"string","required":false},"style":{"name":"style","type":"string","required":false},"role":{"name":"role","type":"string","required":false},"thumbnailUrl":{"name":"thumbnailUrl","type":"string","required":false},"category":{"name":"category","type":"string","required":false},"url":{"name":"url","type":"string","required":false},"aspect":{"name":"aspect","type":"string","required":false},"variant":{"name":"variant","type":"string","required":false}}},"elevation":{"name":"elevation","type":"number","required":false},"id":{"name":"id","type":"string","required":false},"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true},"color":{"name":"color","type":"string","required":false},"z":{"name":"z","type":"number","required":false}}}},"stoneType":{"type":"string","default":"rock","label":"Stone Type","description":"Feature type counted as a stone resource node","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"GatherPage","id":"pag_9FVM6KGPRTBCD9WJ8VEFQ2QSJC","path":"/gather","traits":[{"ref":"Gather","refId":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF"}]}],"types":{"Asset":[{"name":"url","type":"asset"},{"name":"role","type":"string"},{"name":"category","type":"string"},{"name":"animations","type":"[string]"},{"name":"style","type":"string"},{"name":"variant","type":"string"},{"name":"dimension","type":"string"},{"name":"aspect","type":"string"},{"name":"name","type":"string"},{"name":"thumbnailUrl","type":"string"}],"Feature":[{"name":"id","type":"string"},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"z","type":"number"},{"name":"type","type":"string","required":true},{"name":"assetUrl","type":"object","properties":[{"name":"url","type":"asset"},{"name":"role","type":"string"},{"name":"category","type":"string"},{"name":"animations","type":"[string]"},{"name":"style","type":"string"},{"name":"variant","type":"string"},{"name":"dimension","type":"string"},{"name":"aspect","type":"string"},{"name":"name","type":"string"},{"name":"thumbnailUrl","type":"string"}]},{"name":"color","type":"string"},{"name":"elevation","type":"number"}],"Fx":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_27BV2P44XM2ETFFZ2D0N314PX1":{"id":"ent_27BV2P44XM2ETFFZ2D0N314PX1","kind":"entity","bakedName":"GatherData","curName":"GatherData","renames":[],"owner":"workspace"},"evt_4XB5X6QAMYNAF4XDQZ13WN10SV":{"id":"evt_4XB5X6QAMYNAF4XDQZ13WN10SV","kind":"event","bakedName":"RESOURCES","curName":"RESOURCES","renames":[],"owner":"workspace","parent":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF"},"evt_5Q81Z2WVCQDPBTYR6WX8VQ4K8H":{"id":"evt_5Q81Z2WVCQDPBTYR6WX8VQ4K8H","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF"},"evt_6QZ8PDKZQ1ZVGMF8C23HEF78QS":{"id":"evt_6QZ8PDKZQ1ZVGMF8C23HEF78QS","kind":"event","bakedName":"HERO_STEPPED","curName":"HERO_STEPPED","renames":[],"owner":"workspace","parent":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF"},"evt_7X9KKRDE6CQ360XDAEST6072WS":{"id":"evt_7X9KKRDE6CQ360XDAEST6072WS","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF"},"evt_F7RVTSEB3H5HRMMGK85THTM1TT":{"id":"evt_F7RVTSEB3H5HRMMGK85THTM1TT","kind":"event","bakedName":"BURST","curName":"BURST","renames":[],"owner":"workspace","parent":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF"},"orb_C8W9GRVQH0VRGAQQ14Z43PJVKR":{"id":"orb_C8W9GRVQH0VRGAQQ14Z43PJVKR","kind":"orbital","bakedName":"GatherOrbital","curName":"GatherOrbital","renames":[],"owner":"workspace"},"pag_9FVM6KGPRTBCD9WJ8VEFQ2QSJC":{"id":"pag_9FVM6KGPRTBCD9WJ8VEFQ2QSJC","kind":"page","bakedName":"GatherPage","curName":"GatherPage","renames":[],"owner":"workspace"},"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF":{"id":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF","kind":"trait","bakedName":"Gather","curName":"Gather","renames":[],"owner":"workspace"}}}}
1
+ {"name":"std-gather","version":"1.0.0","description":"Headless resource-gathering mechanic: owns features + wood + stone. Listens HERO_STEPPED and, when the hero lands on a wood/stone-type feature, increments the matching resource, removes the node, emits a BURST pickup particle, and emits RESOURCES so survival-flow can decide loss. Never writes units.","orbitals":[{"name":"GatherOrbital","id":"orb_C8W9GRVQH0VRGAQQ14Z43PJVKR","entity":{"name":"GatherData","id":"ent_27BV2P44XM2ETFFZ2D0N314PX1","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"features","type":"array","items":{"type":"object","properties":{"color":{"name":"color","type":"string","required":false},"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true},"elevation":{"name":"elevation","type":"number","required":false},"id":{"name":"id","type":"string","required":false},"assetUrl":{"name":"assetUrl","type":"object","required":false,"properties":{"style":{"name":"style","type":"string","required":false},"variant":{"name":"variant","type":"string","required":false},"aspect":{"name":"aspect","type":"string","required":false},"role":{"name":"role","type":"string","required":false},"category":{"name":"category","type":"string","required":false},"animations":{"name":"animations","type":"array","required":false,"items":{"type":"string"}},"dimension":{"name":"dimension","type":"string","required":false},"url":{"name":"url","type":"string","required":false},"thumbnailUrl":{"name":"thumbnailUrl","type":"string","required":false},"name":{"name":"name","type":"string","required":false}}},"type":{"name":"type","type":"string","required":true},"z":{"name":"z","type":"number","required":false}}}},{"name":"wood","type":"number","default":0},{"name":"stone","type":"number","default":0}],"shared":true},"traits":[{"name":"Gather","id":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF","entityRebindable":true,"entityContract":{"requires":[],"provides":["features","stone","wood"]},"effectRow":[{"kind":"emit","resource":"BURST"},{"kind":"emit","resource":"RESOURCES"},{"kind":"set","resource":"@entity.features"},{"kind":"set","resource":"@entity.stone"},{"kind":"set","resource":"@entity.wood"}],"category":"lifecycle","linkedEntity":"GatherData","linkedEntityId":"ent_27BV2P44XM2ETFFZ2D0N314PX1","entityRefIds":{"GatherData":"ent_27BV2P44XM2ETFFZ2D0N314PX1"},"emits":[{"event":"BURST","eventId":"evt_F7RVTSEB3H5HRMMGK85THTM1TT","description":"Pickup particle produced when a resource node is gathered; a fx-particles listener spawns it","tier":"domain","scope":"external","payloadSchema":[{"name":"particles","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"entity":"Fx"}]},{"event":"RESOURCES","eventId":"evt_4XB5X6QAMYNAF4XDQZ13WN10SV","description":"Wood/stone totals and moves remaining after this step; a survival-flow listener decides loss","tier":"domain","scope":"external","payloadSchema":[{"name":"wood","type":"number","required":true},{"name":"stone","type":"number","required":true},{"name":"movesLeft","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_5Q81Z2WVCQDPBTYR6WX8VQ4K8H","name":"Initialize"},{"key":"HERO_STEPPED","id":"evt_6QZ8PDKZQ1ZVGMF8C23HEF78QS","name":"Hero Stepped","payloadSchema":[{"name":"unitId","type":"string"},{"name":"x","type":"number"},{"name":"z","type":"number"},{"name":"movesLeft","type":"number"}],"listened":true},{"key":"RESTART","id":"evt_7X9KKRDE6CQ360XDAEST6072WS","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"BURST","id":"evt_F7RVTSEB3H5HRMMGK85THTM1TT","name":"Burst","description":"Pickup particle produced when a resource node is gathered; a fx-particles listener spawns it","tier":"domain","payloadSchema":[{"name":"particles","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"entity":"Fx"}]},{"key":"RESOURCES","id":"evt_4XB5X6QAMYNAF4XDQZ13WN10SV","name":"Resources","description":"Wood/stone totals and moves remaining after this step; a survival-flow listener decides loss","tier":"domain","payloadSchema":[{"name":"wood","type":"number","required":true},{"name":"stone","type":"number","required":true},{"name":"movesLeft","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_5Q81Z2WVCQDPBTYR6WX8VQ4K8H","effects":[["set","@entity.features","@config.features"],["set","@entity.wood","@config.startWood"],["set","@entity.stone","@config.startStone"]]},{"from":"active","to":"active","event":"HERO_STEPPED","eventId":"evt_6QZ8PDKZQ1ZVGMF8C23HEF78QS","guard":"@config.running","effects":[["let",[["matched",["array/filter","@entity.features",["fn","f",["and",["==",["object/get","@f","x"],"@payload.x"],["and",["==",["object/get","@f","y"],"@payload.z"],["or",["==",["object/get","@f","type"],"@config.woodType"],["==",["object/get","@f","type"],"@config.stoneType"]]]]]]]],["let",[["woodHits",["array/len",["array/filter","@matched",["fn","f",["==",["object/get","@f","type"],"@config.woodType"]]]]],["stoneHits",["array/len",["array/filter","@matched",["fn","f",["==",["object/get","@f","type"],"@config.stoneType"]]]]]],["do",["set","@entity.wood",["+","@entity.wood",["*","@config.yieldPerNode","@woodHits"]]],["set","@entity.stone",["+","@entity.stone",["*","@config.yieldPerNode","@stoneHits"]]],["set","@entity.features",["array/filter","@entity.features",["fn","f",["not",["and",["==",["object/get","@f","x"],"@payload.x"],["and",["==",["object/get","@f","y"],"@payload.z"],["or",["==",["object/get","@f","type"],"@config.woodType"],["==",["object/get","@f","type"],"@config.stoneType"]]]]]]]],["emit","BURST",{"particles":["array/map","@matched",["fn","f",{"id":["str/concat","fx-gather-",["object/get","@f","id"]],"type":"pickup","x":["object/get","@f","x"],"z":["object/get","@f","y"],"message":["if",["==",["object/get","@f","type"],"@config.woodType"],"+1 wood","+1 stone"],"ttl":3}]]}],["emit","RESOURCES",{"wood":"@entity.wood","stone":"@entity.stone","movesLeft":"@payload.movesLeft"}]]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_7X9KKRDE6CQ360XDAEST6072WS","effects":[["set","@entity.features","@config.features"],["set","@entity.wood","@config.startWood"],["set","@entity.stone","@config.startStone"]]}]},"config":{"woodType":{"type":"string","default":"tree","label":"Wood Type","description":"Feature type counted as a wood resource node","tier":"domain"},"stoneType":{"type":"string","default":"rock","label":"Stone Type","description":"Feature type counted as a stone resource node","tier":"domain"},"startStone":{"type":"number","default":0,"label":"Start Stone","description":"Stone set on INIT","tier":"domain"},"yieldPerNode":{"type":"number","default":1,"label":"Yield Per Node","description":"Wood or stone gained per node gathered","tier":"domain"},"startWood":{"type":"number","default":0,"label":"Start Wood","description":"Wood set on INIT","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, hero steps onto resource nodes are gathered; toggle to freeze","tier":"domain"},"features":{"type":"[Feature]","default":[],"label":"Features","description":"Board features — resource nodes (matched by woodType/stoneType) plus decorations","tier":"domain","items":{"type":"object","properties":{"color":{"name":"color","type":"string","required":false},"elevation":{"name":"elevation","type":"number","required":false},"id":{"name":"id","type":"string","required":false},"z":{"name":"z","type":"number","required":false},"assetUrl":{"name":"assetUrl","type":"object","required":false,"properties":{"name":{"name":"name","type":"string","required":false},"role":{"name":"role","type":"string","required":false},"dimension":{"name":"dimension","type":"string","required":false},"animations":{"name":"animations","type":"array","required":false,"items":{"type":"string"}},"url":{"name":"url","type":"string","required":false},"category":{"name":"category","type":"string","required":false},"variant":{"name":"variant","type":"string","required":false},"thumbnailUrl":{"name":"thumbnailUrl","type":"string","required":false},"aspect":{"name":"aspect","type":"string","required":false},"style":{"name":"style","type":"string","required":false}}},"type":{"name":"type","type":"string","required":true},"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}}}},"scope":"instance"}],"pages":[{"name":"GatherPage","id":"pag_9FVM6KGPRTBCD9WJ8VEFQ2QSJC","path":"/gather","traits":[{"ref":"Gather","refId":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF"}]}],"types":{"Asset":[{"name":"url","type":"asset"},{"name":"role","type":"string"},{"name":"category","type":"string"},{"name":"animations","type":"[string]"},{"name":"style","type":"string"},{"name":"variant","type":"string"},{"name":"dimension","type":"string"},{"name":"aspect","type":"string"},{"name":"name","type":"string"},{"name":"thumbnailUrl","type":"string"}],"Feature":[{"name":"id","type":"string"},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"z","type":"number"},{"name":"type","type":"string","required":true},{"name":"assetUrl","type":"object","properties":[{"name":"url","type":"asset"},{"name":"role","type":"string"},{"name":"category","type":"string"},{"name":"animations","type":"[string]"},{"name":"style","type":"string"},{"name":"variant","type":"string"},{"name":"dimension","type":"string"},{"name":"aspect","type":"string"},{"name":"name","type":"string"},{"name":"thumbnailUrl","type":"string"}]},{"name":"color","type":"string"},{"name":"elevation","type":"number"}],"Fx":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_27BV2P44XM2ETFFZ2D0N314PX1":{"id":"ent_27BV2P44XM2ETFFZ2D0N314PX1","kind":"entity","bakedName":"GatherData","curName":"GatherData","renames":[],"owner":"workspace"},"evt_4XB5X6QAMYNAF4XDQZ13WN10SV":{"id":"evt_4XB5X6QAMYNAF4XDQZ13WN10SV","kind":"event","bakedName":"RESOURCES","curName":"RESOURCES","renames":[],"owner":"workspace","parent":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF"},"evt_5Q81Z2WVCQDPBTYR6WX8VQ4K8H":{"id":"evt_5Q81Z2WVCQDPBTYR6WX8VQ4K8H","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF"},"evt_6QZ8PDKZQ1ZVGMF8C23HEF78QS":{"id":"evt_6QZ8PDKZQ1ZVGMF8C23HEF78QS","kind":"event","bakedName":"HERO_STEPPED","curName":"HERO_STEPPED","renames":[],"owner":"workspace","parent":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF"},"evt_7X9KKRDE6CQ360XDAEST6072WS":{"id":"evt_7X9KKRDE6CQ360XDAEST6072WS","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF"},"evt_F7RVTSEB3H5HRMMGK85THTM1TT":{"id":"evt_F7RVTSEB3H5HRMMGK85THTM1TT","kind":"event","bakedName":"BURST","curName":"BURST","renames":[],"owner":"workspace","parent":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF"},"orb_C8W9GRVQH0VRGAQQ14Z43PJVKR":{"id":"orb_C8W9GRVQH0VRGAQQ14Z43PJVKR","kind":"orbital","bakedName":"GatherOrbital","curName":"GatherOrbital","renames":[],"owner":"workspace"},"pag_9FVM6KGPRTBCD9WJ8VEFQ2QSJC":{"id":"pag_9FVM6KGPRTBCD9WJ8VEFQ2QSJC","kind":"page","bakedName":"GatherPage","curName":"GatherPage","renames":[],"owner":"workspace"},"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF":{"id":"trt_5CWB1KF0MDGA6T2ATY1S4ZT7TF","kind":"trait","bakedName":"Gather","curName":"Gather","renames":[],"owner":"workspace"}}}}
@@ -1 +1 @@
1
- {"name":"std-gold","version":"1.0.0","description":"Headless gold-economy mechanic: the SOLE writer of gold. Listens a mine-hit signal and adds a fixed yield; emits GOLD_CHANGED. Renders nothing.","orbitals":[{"name":"GoldOrbital","id":"orb_W7J2YV8H4J8J955KMBEP718EB6","entity":{"name":"GoldData","id":"ent_27DB29B2GKH89R3QZKB2NR00PP","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"gold","type":"number","default":0}],"shared":true},"traits":[{"name":"GoldMine","id":"trt_3AC2ZCG68E347EFHAH0RPCENHY","entityRebindable":true,"entityContract":{"requires":[],"provides":["gold"]},"effectRow":[{"kind":"emit","resource":"GOLD_CHANGED"},{"kind":"set","resource":"@entity.gold"}],"category":"lifecycle","linkedEntity":"GoldData","linkedEntityId":"ent_27DB29B2GKH89R3QZKB2NR00PP","entityRefIds":{"GoldData":"ent_27DB29B2GKH89R3QZKB2NR00PP"},"emits":[{"event":"GOLD_CHANGED","eventId":"evt_BT2VC1M3QH1VRVKHYCKY2AXQ20","description":"Current gold total after a mine-hit; a HUD stat listens to display it","tier":"domain","scope":"external","payloadSchema":[{"name":"gold","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_J0RS6DZ1J1GS0VC5YSS340J1ZW","name":"Initialize"},{"key":"MINE_HIT","id":"evt_PSP01NVDERPQCAXTKDJEHY5DXK","name":"Mine Hit","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"RESTART","id":"evt_HQGN7J8QR8BW442PZVM4BQ9H8F","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"GOLD_CHANGED","id":"evt_BT2VC1M3QH1VRVKHYCKY2AXQ20","name":"Gold Changed","description":"Current gold total after a mine-hit; a HUD stat listens to display it","tier":"domain","payloadSchema":[{"name":"gold","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_J0RS6DZ1J1GS0VC5YSS340J1ZW","effects":[["set","@entity.gold","@config.startGold"]]},{"from":"active","to":"active","event":"MINE_HIT","eventId":"evt_PSP01NVDERPQCAXTKDJEHY5DXK","guard":"@config.running","effects":[["set","@entity.gold",["+","@entity.gold","@config.yieldAmount"]],["emit","GOLD_CHANGED",{"gold":"@entity.gold"}]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_HQGN7J8QR8BW442PZVM4BQ9H8F","effects":[["set","@entity.gold","@config.startGold"]]}]},"config":{"startGold":{"type":"number","default":0,"label":"Start Gold","description":"Gold set on INIT/RESTART","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, mine-hit signals add gold; toggle to freeze","tier":"domain"},"yieldAmount":{"type":"number","default":25,"label":"Yield Amount","description":"Gold added per mine-hit signal","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"GoldPage","id":"pag_KZJBS48B755KJXH9KS7VWCZ48W","path":"/gold","traits":[{"ref":"GoldMine","refId":"trt_3AC2ZCG68E347EFHAH0RPCENHY"}]}]}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_27DB29B2GKH89R3QZKB2NR00PP":{"id":"ent_27DB29B2GKH89R3QZKB2NR00PP","kind":"entity","bakedName":"GoldData","curName":"GoldData","renames":[],"owner":"workspace"},"evt_BT2VC1M3QH1VRVKHYCKY2AXQ20":{"id":"evt_BT2VC1M3QH1VRVKHYCKY2AXQ20","kind":"event","bakedName":"GOLD_CHANGED","curName":"GOLD_CHANGED","renames":[],"owner":"workspace","parent":"trt_3AC2ZCG68E347EFHAH0RPCENHY"},"evt_HQGN7J8QR8BW442PZVM4BQ9H8F":{"id":"evt_HQGN7J8QR8BW442PZVM4BQ9H8F","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_3AC2ZCG68E347EFHAH0RPCENHY"},"evt_J0RS6DZ1J1GS0VC5YSS340J1ZW":{"id":"evt_J0RS6DZ1J1GS0VC5YSS340J1ZW","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_3AC2ZCG68E347EFHAH0RPCENHY"},"evt_PSP01NVDERPQCAXTKDJEHY5DXK":{"id":"evt_PSP01NVDERPQCAXTKDJEHY5DXK","kind":"event","bakedName":"MINE_HIT","curName":"MINE_HIT","renames":[],"owner":"workspace","parent":"trt_3AC2ZCG68E347EFHAH0RPCENHY"},"orb_W7J2YV8H4J8J955KMBEP718EB6":{"id":"orb_W7J2YV8H4J8J955KMBEP718EB6","kind":"orbital","bakedName":"GoldOrbital","curName":"GoldOrbital","renames":[],"owner":"workspace"},"pag_KZJBS48B755KJXH9KS7VWCZ48W":{"id":"pag_KZJBS48B755KJXH9KS7VWCZ48W","kind":"page","bakedName":"GoldPage","curName":"GoldPage","renames":[],"owner":"workspace"},"trt_3AC2ZCG68E347EFHAH0RPCENHY":{"id":"trt_3AC2ZCG68E347EFHAH0RPCENHY","kind":"trait","bakedName":"GoldMine","curName":"GoldMine","renames":[],"owner":"workspace"}}}}
1
+ {"name":"std-gold","version":"1.0.0","description":"Headless gold-economy mechanic: the SOLE writer of gold. Listens a mine-hit signal and adds a fixed yield; emits GOLD_CHANGED. Renders nothing.","orbitals":[{"name":"GoldOrbital","id":"orb_W7J2YV8H4J8J955KMBEP718EB6","entity":{"name":"GoldData","id":"ent_27DB29B2GKH89R3QZKB2NR00PP","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"gold","type":"number","default":0}],"shared":true},"traits":[{"name":"GoldMine","id":"trt_3AC2ZCG68E347EFHAH0RPCENHY","entityRebindable":true,"entityContract":{"requires":[],"provides":["gold"]},"effectRow":[{"kind":"emit","resource":"GOLD_CHANGED"},{"kind":"set","resource":"@entity.gold"}],"category":"lifecycle","linkedEntity":"GoldData","linkedEntityId":"ent_27DB29B2GKH89R3QZKB2NR00PP","entityRefIds":{"GoldData":"ent_27DB29B2GKH89R3QZKB2NR00PP"},"emits":[{"event":"GOLD_CHANGED","eventId":"evt_BT2VC1M3QH1VRVKHYCKY2AXQ20","description":"Current gold total after a mine-hit; a HUD stat listens to display it","tier":"domain","scope":"external","payloadSchema":[{"name":"gold","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_J0RS6DZ1J1GS0VC5YSS340J1ZW","name":"Initialize"},{"key":"MINE_HIT","id":"evt_PSP01NVDERPQCAXTKDJEHY5DXK","name":"Mine Hit","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"RESTART","id":"evt_HQGN7J8QR8BW442PZVM4BQ9H8F","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"GOLD_CHANGED","id":"evt_BT2VC1M3QH1VRVKHYCKY2AXQ20","name":"Gold Changed","description":"Current gold total after a mine-hit; a HUD stat listens to display it","tier":"domain","payloadSchema":[{"name":"gold","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_J0RS6DZ1J1GS0VC5YSS340J1ZW","effects":[["set","@entity.gold","@config.startGold"]]},{"from":"active","to":"active","event":"MINE_HIT","eventId":"evt_PSP01NVDERPQCAXTKDJEHY5DXK","guard":"@config.running","effects":[["set","@entity.gold",["+","@entity.gold","@config.yieldAmount"]],["emit","GOLD_CHANGED",{"gold":"@entity.gold"}]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_HQGN7J8QR8BW442PZVM4BQ9H8F","effects":[["set","@entity.gold","@config.startGold"]]}]},"config":{"yieldAmount":{"type":"number","default":25,"label":"Yield Amount","description":"Gold added per mine-hit signal","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, mine-hit signals add gold; toggle to freeze","tier":"domain"},"startGold":{"type":"number","default":0,"label":"Start Gold","description":"Gold set on INIT/RESTART","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"GoldPage","id":"pag_KZJBS48B755KJXH9KS7VWCZ48W","path":"/gold","traits":[{"ref":"GoldMine","refId":"trt_3AC2ZCG68E347EFHAH0RPCENHY"}]}]}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_27DB29B2GKH89R3QZKB2NR00PP":{"id":"ent_27DB29B2GKH89R3QZKB2NR00PP","kind":"entity","bakedName":"GoldData","curName":"GoldData","renames":[],"owner":"workspace"},"evt_BT2VC1M3QH1VRVKHYCKY2AXQ20":{"id":"evt_BT2VC1M3QH1VRVKHYCKY2AXQ20","kind":"event","bakedName":"GOLD_CHANGED","curName":"GOLD_CHANGED","renames":[],"owner":"workspace","parent":"trt_3AC2ZCG68E347EFHAH0RPCENHY"},"evt_HQGN7J8QR8BW442PZVM4BQ9H8F":{"id":"evt_HQGN7J8QR8BW442PZVM4BQ9H8F","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_3AC2ZCG68E347EFHAH0RPCENHY"},"evt_J0RS6DZ1J1GS0VC5YSS340J1ZW":{"id":"evt_J0RS6DZ1J1GS0VC5YSS340J1ZW","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_3AC2ZCG68E347EFHAH0RPCENHY"},"evt_PSP01NVDERPQCAXTKDJEHY5DXK":{"id":"evt_PSP01NVDERPQCAXTKDJEHY5DXK","kind":"event","bakedName":"MINE_HIT","curName":"MINE_HIT","renames":[],"owner":"workspace","parent":"trt_3AC2ZCG68E347EFHAH0RPCENHY"},"orb_W7J2YV8H4J8J955KMBEP718EB6":{"id":"orb_W7J2YV8H4J8J955KMBEP718EB6","kind":"orbital","bakedName":"GoldOrbital","curName":"GoldOrbital","renames":[],"owner":"workspace"},"pag_KZJBS48B755KJXH9KS7VWCZ48W":{"id":"pag_KZJBS48B755KJXH9KS7VWCZ48W","kind":"page","bakedName":"GoldPage","curName":"GoldPage","renames":[],"owner":"workspace"},"trt_3AC2ZCG68E347EFHAH0RPCENHY":{"id":"trt_3AC2ZCG68E347EFHAH0RPCENHY","kind":"trait","bakedName":"GoldMine","curName":"GoldMine","renames":[],"owner":"workspace"}}}}
@@ -1 +1 @@
1
- {"name":"std-grid-tactics","version":"1.0.0","description":"Headless grid-tactics unit-authority: the SOLE writer of units. Applies MOVE/ATTACK/SPAWN/HEAL intents from any source (player, AI, production, or progression) and runs the enemy AI_TURN pipeline, emitting BURST hit-particles and UNITS_CHANGED survivor counts. Renders nothing.","orbitals":[{"name":"GridTacticsOrbital","id":"orb_K5MJ2EPWSJECS3R45H85SXNZV9","entity":{"name":"TacticsState","id":"ent_ZDT43GJEKN79TV4ZWB9Z44BTH9","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"units","type":"array","items":{"type":"object","properties":{"id":{"name":"id","type":"string","required":true},"yaw":{"name":"yaw","type":"number","required":false},"z":{"name":"z","type":"number","required":false},"unitType":{"name":"unitType","type":"string","required":false},"y":{"name":"y","type":"number","required":false},"position":{"name":"position","type":"object","required":false,"properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}},"x":{"name":"x","type":"number","required":false},"team":{"name":"team","type":"string","required":false},"maxHealth":{"name":"maxHealth","type":"number","required":false},"health":{"name":"health","type":"number","required":false}}}},{"name":"tiles","type":"array","items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true},"passable":{"name":"passable","type":"boolean","required":false},"id":{"name":"id","type":"string","required":false}}}}],"shared":true},"traits":[{"name":"GridTactics","id":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ","entityRebindable":true,"entityContract":{"requires":[],"provides":["tiles","units"]},"effectRow":[{"kind":"emit","resource":"BURST"},{"kind":"emit","resource":"UNITS_CHANGED"},{"kind":"set","resource":"@entity.tiles"},{"kind":"set","resource":"@entity.units"}],"category":"lifecycle","linkedEntity":"TacticsState","linkedEntityId":"ent_ZDT43GJEKN79TV4ZWB9Z44BTH9","entityRefIds":{"TacticsState":"ent_ZDT43GJEKN79TV4ZWB9Z44BTH9"},"emits":[{"event":"BURST","eventId":"evt_CVXAVBQ0KRG9W0QCRVBEFZ3Y3C","description":"Hit particles produced by an attack or AI strike; a fx-particles listener spawns them","tier":"domain","scope":"external","payloadSchema":[{"name":"particles","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"entity":"Fx"}]},{"event":"UNITS_CHANGED","eventId":"evt_PXM7QGTPX7BEKMFSHG7BQQEKQV","description":"Live team survivor counts after this intent resolved; a round-flow listener decides win/lose","tier":"domain","scope":"external","payloadSchema":[{"name":"playersAlive","type":"number"},{"name":"enemiesAlive","type":"number"}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_CWBX7EWN2AAH5BJEC1C0EEW2P1","name":"Initialize"},{"key":"MOVE","id":"evt_SCQFQB4N52AJHA4GGMSXFCWDKC","name":"Move","payloadSchema":[{"name":"unitId","type":"string"},{"name":"x","type":"number"},{"name":"y","type":"number"}],"listened":true},{"key":"ATTACK","id":"evt_J9CZVFWET47D24JYMZ05VQEH1B","name":"Attack","payloadSchema":[{"name":"targetId","type":"string"}],"listened":true},{"key":"SPAWN","id":"evt_AXEFT24E9E74Q13A6V5KN2ABFA","name":"Spawn","payloadSchema":[{"name":"id","type":"string"},{"name":"x","type":"number"},{"name":"y","type":"number"},{"name":"team","type":"string"},{"name":"health","type":"number"},{"name":"maxHealth","type":"number"},{"name":"unitType","type":"string"}],"listened":true},{"key":"HEAL","id":"evt_64ZCZDM21810M2732FG7WAKXKD","name":"Heal","payloadSchema":[{"name":"team","type":"string"},{"name":"amount","type":"number"}],"listened":true},{"key":"AI_TURN","id":"evt_2B8RS9KBRGNW85SWE2JVH93DP5","name":"Ai Turn","payloadSchema":[{"name":"turn","type":"number"}],"listened":true},{"key":"BURST","id":"evt_CVXAVBQ0KRG9W0QCRVBEFZ3Y3C","name":"Burst","description":"Hit particles produced by an attack or AI strike; a fx-particles listener spawns them","tier":"domain","payloadSchema":[{"name":"particles","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"entity":"Fx"}]},{"key":"UNITS_CHANGED","id":"evt_PXM7QGTPX7BEKMFSHG7BQQEKQV","name":"Units Changed","description":"Live team survivor counts after this intent resolved; a round-flow listener decides win/lose","tier":"domain","payloadSchema":[{"name":"playersAlive","type":"number"},{"name":"enemiesAlive","type":"number"}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_CWBX7EWN2AAH5BJEC1C0EEW2P1","effects":[["set","@entity.units","@config.units"],["set","@entity.tiles",["if",[">",["array/len","@config.tiles"],0],"@config.tiles",["array/flatten",["array/map",["array/range",0,"@config.gridHeight"],["fn","gy",["array/map",["array/range",0,"@config.gridWidth"],["fn","gx",{"id":["str/concat","t-","@gx","-","@gy"],"x":"@gx","y":"@gy","passable":true}]]]]]]]]},{"from":"active","to":"active","event":"MOVE","eventId":"evt_SCQFQB4N52AJHA4GGMSXFCWDKC","guard":"@config.running","effects":[["set","@entity.units",["array/map","@entity.units",["fn","u",["if",["and",["==","@u.id","@payload.unitId"],["and",["grid/in-bounds",{"x":"@payload.x","y":"@payload.y"},"@config.gridWidth","@config.gridHeight"],["and",["==",["object/get",["array/find","@entity.tiles",["fn","t",["and",["==",["object/get","@t","x"],"@payload.x"],["==",["object/get","@t","y"],"@payload.y"]]]],"passable"],true],["==",["array/len",["array/filter","@entity.units",["fn","o",["and",["!=","@o.id","@payload.unitId"],["and",[">","@o.health",0],["and",["==",["object/get",["object/get","@o","position"],"x"],"@payload.x"],["==",["object/get",["object/get","@o","position"],"y"],"@payload.y"]]]]]]],0]]]],["object/merge","@u",{"position":{"x":"@payload.x","y":"@payload.y"},"x":"@payload.x","y":"@payload.y","yaw":["if",["and",["==","@payload.x",["object/get",["object/get","@u","position"],"x"]],["==","@payload.y",["object/get",["object/get","@u","position"],"y"]]],["object/get","@u","yaw",0],["if",[">=",["math/abs",["-","@payload.x",["object/get",["object/get","@u","position"],"x"]]],["math/abs",["-","@payload.y",["object/get",["object/get","@u","position"],"y"]]]],["if",[">","@payload.x",["object/get",["object/get","@u","position"],"x"]],1.5708,-1.5708],["if",[">","@payload.y",["object/get",["object/get","@u","position"],"y"]],0,3.1416]]]}],"@u"]]]]]},{"from":"active","to":"active","event":"ATTACK","eventId":"evt_J9CZVFWET47D24JYMZ05VQEH1B","guard":"@config.running","effects":[["emit","BURST",{"particles":["array/map",["array/filter","@entity.units",["fn","u",["and",["==","@u.id","@payload.targetId"],[">","@u.health",0]]]],["fn","u",{"id":["str/concat","fx-atk-","@u.id"],"type":"hit","x":["object/get",["object/get","@u","position"],"x"],"z":["object/get",["object/get","@u","position"],"y"],"message":["str/concat","-","@config.attackDamage"],"ttl":3}]]}],["set","@entity.units",["array/map","@entity.units",["fn","u",["if",["==","@u.id","@payload.targetId"],["object/merge","@u",{"health":["math/max",0,["-","@u.health","@config.attackDamage"]]}],"@u"]]]],["emit","UNITS_CHANGED",{"playersAlive":["array/len",["array/filter","@entity.units",["fn","u",["and",["==","@u.team","player"],[">","@u.health",0]]]]],"enemiesAlive":["array/len",["array/filter","@entity.units",["fn","u",["and",["==","@u.team","enemy"],[">","@u.health",0]]]]]}]]},{"from":"active","to":"active","event":"SPAWN","eventId":"evt_AXEFT24E9E74Q13A6V5KN2ABFA","guard":"@config.running","effects":[["set","@entity.units",["if",["and",["grid/in-bounds",{"x":"@payload.x","y":"@payload.y"},"@config.gridWidth","@config.gridHeight"],["and",["==",["object/get",["array/find","@entity.tiles",["fn","t",["and",["==",["object/get","@t","x"],"@payload.x"],["==",["object/get","@t","y"],"@payload.y"]]]],"passable"],true],["==",["array/len",["array/filter","@entity.units",["fn","o",["and",[">","@o.health",0],["and",["==",["object/get",["object/get","@o","position"],"x"],"@payload.x"],["==",["object/get",["object/get","@o","position"],"y"],"@payload.y"]]]]]],0]]],["array/append","@entity.units",{"id":"@payload.id","position":{"x":"@payload.x","y":"@payload.y"},"x":"@payload.x","y":"@payload.y","z":0,"team":"@payload.team","health":"@payload.health","maxHealth":"@payload.maxHealth","unitType":"@payload.unitType"}],"@entity.units"]],["emit","UNITS_CHANGED",{"playersAlive":["array/len",["array/filter","@entity.units",["fn","u",["and",["==","@u.team","player"],[">","@u.health",0]]]]],"enemiesAlive":["array/len",["array/filter","@entity.units",["fn","u",["and",["==","@u.team","enemy"],[">","@u.health",0]]]]]}]]},{"from":"active","to":"active","event":"HEAL","eventId":"evt_64ZCZDM21810M2732FG7WAKXKD","guard":"@config.running","effects":[["set","@entity.units",["array/map","@entity.units",["fn","u",["if",["and",["==","@u.team","@payload.team"],[">","@u.health",0]],["object/merge","@u",{"health":["math/min","@u.maxHealth",["+","@u.health","@payload.amount"]]}],"@u"]]]]]},{"from":"active","to":"active","event":"AI_TURN","eventId":"evt_2B8RS9KBRGNW85SWE2JVH93DP5","guard":"@config.running","effects":[["emit","BURST",{"particles":["array/map",["array/filter","@entity.units",["fn","u",["and",["and",["==","@u.team","player"],[">","@u.health",0]],[">",["array/len",["array/filter","@entity.units",["fn","e",["and",["and",["==","@e.team","enemy"],[">","@e.health",0]],["==",["grid/manhattan-distance",["object/get","@e","position"],["object/get","@u","position"]],1]]]]],0]]]],["fn","u",{"id":["str/concat","fx-ai-","@u.id"],"type":"hit","x":["object/get",["object/get","@u","position"],"x"],"z":["object/get",["object/get","@u","position"],"y"],"message":"-1","ttl":3}]]}],["set","@entity.units",["array/map","@entity.units",["fn","u",["if",["and",["==","@u.team","player"],[">","@u.health",0]],["if",[">",["array/len",["array/filter","@entity.units",["fn","e",["and",["and",["==","@e.team","enemy"],[">","@e.health",0]],["==",["grid/manhattan-distance",["object/get","@e","position"],["object/get","@u","position"]],1]]]]],0],["object/merge","@u",{"health":["math/max",0,["-","@u.health",1]]}],"@u"],"@u"]]]],["set","@entity.units",["array/map","@entity.units",["fn","u",["if",["and",["==","@u.team","enemy"],[">","@u.health",0]],["if",["==",["array/len",["array/filter","@entity.units",["fn","p",["and",["and",["==","@p.team","player"],[">","@p.health",0]],["==",["grid/manhattan-distance",["object/get","@u","position"],["object/get","@p","position"]],1]]]]],0],["let",[["target",["array/reduce",["array/filter","@entity.units",["fn","p",["and",["==","@p.team","player"],[">","@p.health",0]]]],null,["fn",["nearest","p"],["if",["or",["==","@nearest",null],["<",["grid/manhattan-distance",["object/get","@p","position"],["object/get","@u","position"]],["grid/manhattan-distance",["object/get","@nearest","position"],["object/get","@u","position"]]]],"@p","@nearest"]]]]],["if",["==","@target",null],"@u",["let",[["nextX",["math/clamp",["+",["object/get",["object/get","@u","position"],"x"],["math/sign",["-",["object/get",["object/get","@target","position"],"x"],["object/get",["object/get","@u","position"],"x"]]]],0,["-","@config.gridWidth",1]]],["nextY",["math/clamp",["+",["object/get",["object/get","@u","position"],"y"],["math/sign",["-",["object/get",["object/get","@target","position"],"y"],["object/get",["object/get","@u","position"],"y"]]]],0,["-","@config.gridHeight",1]]]],["if",["and",["grid/in-bounds",{"x":"@nextX","y":"@nextY"},"@config.gridWidth","@config.gridHeight"],["and",["==",["object/get",["array/find","@entity.tiles",["fn","t",["and",["==",["object/get","@t","x"],"@nextX"],["==",["object/get","@t","y"],"@nextY"]]]],"passable"],true],["==",["array/len",["array/filter","@entity.units",["fn","o",["and",["!=","@o.id","@u.id"],["and",[">","@o.health",0],["and",["==",["object/get",["object/get","@o","position"],"x"],"@nextX"],["==",["object/get",["object/get","@o","position"],"y"],"@nextY"]]]]]]],0]]],["object/merge","@u",{"position":{"x":"@nextX","y":"@nextY"},"x":"@nextX","y":"@nextY","yaw":["if",["==","@nextX",["object/get",["object/get","@u","position"],"x"]],["if",[">","@nextY",["object/get",["object/get","@u","position"],"y"]],0,["if",["<","@nextY",["object/get",["object/get","@u","position"],"y"]],3.1416,["object/get","@u","yaw",0]]],["if",[">","@nextX",["object/get",["object/get","@u","position"],"x"]],1.5708,-1.5708]]}],"@u"]]]],"@u"],"@u"]]]],["emit","UNITS_CHANGED",{"playersAlive":["array/len",["array/filter","@entity.units",["fn","u",["and",["==","@u.team","player"],[">","@u.health",0]]]]],"enemiesAlive":["array/len",["array/filter","@entity.units",["fn","u",["and",["==","@u.team","enemy"],[">","@u.health",0]]]]]}]]}]},"config":{"gridHeight":{"type":"number","default":12,"label":"Grid Height","description":"Grid row count clamping move + AI bounds","tier":"presentation"},"units":{"type":"[Unit]","default":[],"label":"Initial Units","description":"Seed unit roster (players and enemies) present before the first intent","tier":"domain","items":{"type":"object","properties":{"id":{"name":"id","type":"string","required":true},"maxHealth":{"name":"maxHealth","type":"number","required":false},"y":{"name":"y","type":"number","required":false},"health":{"name":"health","type":"number","required":false},"position":{"name":"position","type":"object","required":false,"properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}},"unitType":{"name":"unitType","type":"string","required":false},"yaw":{"name":"yaw","type":"number","required":false},"z":{"name":"z","type":"number","required":false},"team":{"name":"team","type":"string","required":false},"x":{"name":"x","type":"number","required":false}}}},"gridWidth":{"type":"number","default":12,"label":"Grid Width","description":"Grid column count clamping move + AI bounds","tier":"presentation"},"tiles":{"type":"[Tile]","default":[],"label":"Tiles","description":"Grid tiles used for passability checks during moves and AI stepping","tier":"presentation","items":{"type":"object","properties":{"passable":{"name":"passable","type":"boolean","required":false},"y":{"name":"y","type":"number","required":true},"id":{"name":"id","type":"string","required":false},"x":{"name":"x","type":"number","required":true}}}},"attackDamage":{"type":"number","default":1,"label":"Attack Damage","description":"Health removed from a target per ATTACK intent","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, incoming MOVE/ATTACK/AI_TURN intents are applied; toggle to freeze the board","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"GridTacticsPage","id":"pag_7HP68FR9294H4RSZYFCTSSKAX6","path":"/grid-tactics","traits":[{"ref":"GridTactics","refId":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"}]}],"types":{"Fx":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"Tile":[{"name":"id","type":"string"},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"passable","type":"boolean"}],"Unit":[{"name":"id","type":"string","required":true},{"name":"position","type":"object","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"x","type":"number"},{"name":"y","type":"number"},{"name":"z","type":"number"},{"name":"team","type":"string"},{"name":"health","type":"number"},{"name":"maxHealth","type":"number"},{"name":"unitType","type":"string"},{"name":"yaw","type":"number"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_ZDT43GJEKN79TV4ZWB9Z44BTH9":{"id":"ent_ZDT43GJEKN79TV4ZWB9Z44BTH9","kind":"entity","bakedName":"TacticsState","curName":"TacticsState","renames":[],"owner":"workspace"},"evt_2B8RS9KBRGNW85SWE2JVH93DP5":{"id":"evt_2B8RS9KBRGNW85SWE2JVH93DP5","kind":"event","bakedName":"AI_TURN","curName":"AI_TURN","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"evt_64ZCZDM21810M2732FG7WAKXKD":{"id":"evt_64ZCZDM21810M2732FG7WAKXKD","kind":"event","bakedName":"HEAL","curName":"HEAL","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"evt_AXEFT24E9E74Q13A6V5KN2ABFA":{"id":"evt_AXEFT24E9E74Q13A6V5KN2ABFA","kind":"event","bakedName":"SPAWN","curName":"SPAWN","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"evt_CVXAVBQ0KRG9W0QCRVBEFZ3Y3C":{"id":"evt_CVXAVBQ0KRG9W0QCRVBEFZ3Y3C","kind":"event","bakedName":"BURST","curName":"BURST","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"evt_CWBX7EWN2AAH5BJEC1C0EEW2P1":{"id":"evt_CWBX7EWN2AAH5BJEC1C0EEW2P1","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"evt_J9CZVFWET47D24JYMZ05VQEH1B":{"id":"evt_J9CZVFWET47D24JYMZ05VQEH1B","kind":"event","bakedName":"ATTACK","curName":"ATTACK","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"evt_PXM7QGTPX7BEKMFSHG7BQQEKQV":{"id":"evt_PXM7QGTPX7BEKMFSHG7BQQEKQV","kind":"event","bakedName":"UNITS_CHANGED","curName":"UNITS_CHANGED","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"evt_SCQFQB4N52AJHA4GGMSXFCWDKC":{"id":"evt_SCQFQB4N52AJHA4GGMSXFCWDKC","kind":"event","bakedName":"MOVE","curName":"MOVE","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"orb_K5MJ2EPWSJECS3R45H85SXNZV9":{"id":"orb_K5MJ2EPWSJECS3R45H85SXNZV9","kind":"orbital","bakedName":"GridTacticsOrbital","curName":"GridTacticsOrbital","renames":[],"owner":"workspace"},"pag_7HP68FR9294H4RSZYFCTSSKAX6":{"id":"pag_7HP68FR9294H4RSZYFCTSSKAX6","kind":"page","bakedName":"GridTacticsPage","curName":"GridTacticsPage","renames":[],"owner":"workspace"},"trt_3JDP159QVMVXTB1D81VHV0Y9RZ":{"id":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ","kind":"trait","bakedName":"GridTactics","curName":"GridTactics","renames":[],"owner":"workspace"}}}}
1
+ {"name":"std-grid-tactics","version":"1.0.0","description":"Headless grid-tactics unit-authority: the SOLE writer of units. Applies MOVE/ATTACK/SPAWN/HEAL intents from any source (player, AI, production, or progression) and runs the enemy AI_TURN pipeline, emitting BURST hit-particles and UNITS_CHANGED survivor counts. Renders nothing.","orbitals":[{"name":"GridTacticsOrbital","id":"orb_K5MJ2EPWSJECS3R45H85SXNZV9","entity":{"name":"TacticsState","id":"ent_ZDT43GJEKN79TV4ZWB9Z44BTH9","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"units","type":"array","items":{"type":"object","properties":{"position":{"name":"position","type":"object","required":false,"properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}},"health":{"name":"health","type":"number","required":false},"y":{"name":"y","type":"number","required":false},"team":{"name":"team","type":"string","required":false},"x":{"name":"x","type":"number","required":false},"z":{"name":"z","type":"number","required":false},"unitType":{"name":"unitType","type":"string","required":false},"maxHealth":{"name":"maxHealth","type":"number","required":false},"id":{"name":"id","type":"string","required":true},"yaw":{"name":"yaw","type":"number","required":false}}}},{"name":"tiles","type":"array","items":{"type":"object","properties":{"passable":{"name":"passable","type":"boolean","required":false},"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true},"id":{"name":"id","type":"string","required":false}}}}],"shared":true},"traits":[{"name":"GridTactics","id":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ","entityRebindable":true,"entityContract":{"requires":[],"provides":["tiles","units"]},"effectRow":[{"kind":"emit","resource":"BURST"},{"kind":"emit","resource":"UNITS_CHANGED"},{"kind":"set","resource":"@entity.tiles"},{"kind":"set","resource":"@entity.units"}],"category":"lifecycle","linkedEntity":"TacticsState","linkedEntityId":"ent_ZDT43GJEKN79TV4ZWB9Z44BTH9","entityRefIds":{"TacticsState":"ent_ZDT43GJEKN79TV4ZWB9Z44BTH9"},"emits":[{"event":"BURST","eventId":"evt_CVXAVBQ0KRG9W0QCRVBEFZ3Y3C","description":"Hit particles produced by an attack or AI strike; a fx-particles listener spawns them","tier":"domain","scope":"external","payloadSchema":[{"name":"particles","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"entity":"Fx"}]},{"event":"UNITS_CHANGED","eventId":"evt_PXM7QGTPX7BEKMFSHG7BQQEKQV","description":"Live team survivor counts after this intent resolved; a round-flow listener decides win/lose","tier":"domain","scope":"external","payloadSchema":[{"name":"playersAlive","type":"number"},{"name":"enemiesAlive","type":"number"}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_CWBX7EWN2AAH5BJEC1C0EEW2P1","name":"Initialize"},{"key":"MOVE","id":"evt_SCQFQB4N52AJHA4GGMSXFCWDKC","name":"Move","payloadSchema":[{"name":"unitId","type":"string"},{"name":"x","type":"number"},{"name":"y","type":"number"}],"listened":true},{"key":"ATTACK","id":"evt_J9CZVFWET47D24JYMZ05VQEH1B","name":"Attack","payloadSchema":[{"name":"targetId","type":"string"}],"listened":true},{"key":"SPAWN","id":"evt_AXEFT24E9E74Q13A6V5KN2ABFA","name":"Spawn","payloadSchema":[{"name":"id","type":"string"},{"name":"x","type":"number"},{"name":"y","type":"number"},{"name":"team","type":"string"},{"name":"health","type":"number"},{"name":"maxHealth","type":"number"},{"name":"unitType","type":"string"}],"listened":true},{"key":"HEAL","id":"evt_64ZCZDM21810M2732FG7WAKXKD","name":"Heal","payloadSchema":[{"name":"team","type":"string"},{"name":"amount","type":"number"}],"listened":true},{"key":"AI_TURN","id":"evt_2B8RS9KBRGNW85SWE2JVH93DP5","name":"Ai Turn","payloadSchema":[{"name":"turn","type":"number"}],"listened":true},{"key":"BURST","id":"evt_CVXAVBQ0KRG9W0QCRVBEFZ3Y3C","name":"Burst","description":"Hit particles produced by an attack or AI strike; a fx-particles listener spawns them","tier":"domain","payloadSchema":[{"name":"particles","type":"[object]","properties":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"entity":"Fx"}]},{"key":"UNITS_CHANGED","id":"evt_PXM7QGTPX7BEKMFSHG7BQQEKQV","name":"Units Changed","description":"Live team survivor counts after this intent resolved; a round-flow listener decides win/lose","tier":"domain","payloadSchema":[{"name":"playersAlive","type":"number"},{"name":"enemiesAlive","type":"number"}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_CWBX7EWN2AAH5BJEC1C0EEW2P1","effects":[["set","@entity.units","@config.units"],["set","@entity.tiles",["if",[">",["array/len","@config.tiles"],0],"@config.tiles",["array/flatten",["array/map",["array/range",0,"@config.gridHeight"],["fn","gy",["array/map",["array/range",0,"@config.gridWidth"],["fn","gx",{"id":["str/concat","t-","@gx","-","@gy"],"x":"@gx","y":"@gy","passable":true}]]]]]]]]},{"from":"active","to":"active","event":"MOVE","eventId":"evt_SCQFQB4N52AJHA4GGMSXFCWDKC","guard":"@config.running","effects":[["set","@entity.units",["array/map","@entity.units",["fn","u",["if",["and",["==","@u.id","@payload.unitId"],["and",["grid/in-bounds",{"x":"@payload.x","y":"@payload.y"},"@config.gridWidth","@config.gridHeight"],["and",["==",["object/get",["array/find","@entity.tiles",["fn","t",["and",["==",["object/get","@t","x"],"@payload.x"],["==",["object/get","@t","y"],"@payload.y"]]]],"passable"],true],["==",["array/len",["array/filter","@entity.units",["fn","o",["and",["!=","@o.id","@payload.unitId"],["and",[">","@o.health",0],["and",["==",["object/get",["object/get","@o","position"],"x"],"@payload.x"],["==",["object/get",["object/get","@o","position"],"y"],"@payload.y"]]]]]]],0]]]],["object/merge","@u",{"position":{"x":"@payload.x","y":"@payload.y"},"x":"@payload.x","y":"@payload.y","yaw":["if",["and",["==","@payload.x",["object/get",["object/get","@u","position"],"x"]],["==","@payload.y",["object/get",["object/get","@u","position"],"y"]]],["object/get","@u","yaw",0],["if",[">=",["math/abs",["-","@payload.x",["object/get",["object/get","@u","position"],"x"]]],["math/abs",["-","@payload.y",["object/get",["object/get","@u","position"],"y"]]]],["if",[">","@payload.x",["object/get",["object/get","@u","position"],"x"]],1.5708,-1.5708],["if",[">","@payload.y",["object/get",["object/get","@u","position"],"y"]],0,3.1416]]]}],"@u"]]]]]},{"from":"active","to":"active","event":"ATTACK","eventId":"evt_J9CZVFWET47D24JYMZ05VQEH1B","guard":"@config.running","effects":[["emit","BURST",{"particles":["array/map",["array/filter","@entity.units",["fn","u",["and",["==","@u.id","@payload.targetId"],[">","@u.health",0]]]],["fn","u",{"id":["str/concat","fx-atk-","@u.id"],"type":"hit","x":["object/get",["object/get","@u","position"],"x"],"z":["object/get",["object/get","@u","position"],"y"],"message":["str/concat","-","@config.attackDamage"],"ttl":3}]]}],["set","@entity.units",["array/map","@entity.units",["fn","u",["if",["==","@u.id","@payload.targetId"],["object/merge","@u",{"health":["math/max",0,["-","@u.health","@config.attackDamage"]]}],"@u"]]]],["emit","UNITS_CHANGED",{"playersAlive":["array/len",["array/filter","@entity.units",["fn","u",["and",["==","@u.team","player"],[">","@u.health",0]]]]],"enemiesAlive":["array/len",["array/filter","@entity.units",["fn","u",["and",["==","@u.team","enemy"],[">","@u.health",0]]]]]}]]},{"from":"active","to":"active","event":"SPAWN","eventId":"evt_AXEFT24E9E74Q13A6V5KN2ABFA","guard":"@config.running","effects":[["set","@entity.units",["if",["and",["grid/in-bounds",{"x":"@payload.x","y":"@payload.y"},"@config.gridWidth","@config.gridHeight"],["and",["==",["object/get",["array/find","@entity.tiles",["fn","t",["and",["==",["object/get","@t","x"],"@payload.x"],["==",["object/get","@t","y"],"@payload.y"]]]],"passable"],true],["==",["array/len",["array/filter","@entity.units",["fn","o",["and",[">","@o.health",0],["and",["==",["object/get",["object/get","@o","position"],"x"],"@payload.x"],["==",["object/get",["object/get","@o","position"],"y"],"@payload.y"]]]]]],0]]],["array/append","@entity.units",{"id":"@payload.id","position":{"x":"@payload.x","y":"@payload.y"},"x":"@payload.x","y":"@payload.y","z":0,"team":"@payload.team","health":"@payload.health","maxHealth":"@payload.maxHealth","unitType":"@payload.unitType"}],"@entity.units"]],["emit","UNITS_CHANGED",{"playersAlive":["array/len",["array/filter","@entity.units",["fn","u",["and",["==","@u.team","player"],[">","@u.health",0]]]]],"enemiesAlive":["array/len",["array/filter","@entity.units",["fn","u",["and",["==","@u.team","enemy"],[">","@u.health",0]]]]]}]]},{"from":"active","to":"active","event":"HEAL","eventId":"evt_64ZCZDM21810M2732FG7WAKXKD","guard":"@config.running","effects":[["set","@entity.units",["array/map","@entity.units",["fn","u",["if",["and",["==","@u.team","@payload.team"],[">","@u.health",0]],["object/merge","@u",{"health":["math/min","@u.maxHealth",["+","@u.health","@payload.amount"]]}],"@u"]]]]]},{"from":"active","to":"active","event":"AI_TURN","eventId":"evt_2B8RS9KBRGNW85SWE2JVH93DP5","guard":"@config.running","effects":[["emit","BURST",{"particles":["array/map",["array/filter","@entity.units",["fn","u",["and",["and",["==","@u.team","player"],[">","@u.health",0]],[">",["array/len",["array/filter","@entity.units",["fn","e",["and",["and",["==","@e.team","enemy"],[">","@e.health",0]],["==",["grid/manhattan-distance",["object/get","@e","position"],["object/get","@u","position"]],1]]]]],0]]]],["fn","u",{"id":["str/concat","fx-ai-","@u.id"],"type":"hit","x":["object/get",["object/get","@u","position"],"x"],"z":["object/get",["object/get","@u","position"],"y"],"message":"-1","ttl":3}]]}],["set","@entity.units",["array/map","@entity.units",["fn","u",["if",["and",["==","@u.team","player"],[">","@u.health",0]],["if",[">",["array/len",["array/filter","@entity.units",["fn","e",["and",["and",["==","@e.team","enemy"],[">","@e.health",0]],["==",["grid/manhattan-distance",["object/get","@e","position"],["object/get","@u","position"]],1]]]]],0],["object/merge","@u",{"health":["math/max",0,["-","@u.health",1]]}],"@u"],"@u"]]]],["set","@entity.units",["array/map","@entity.units",["fn","u",["if",["and",["==","@u.team","enemy"],[">","@u.health",0]],["if",["==",["array/len",["array/filter","@entity.units",["fn","p",["and",["and",["==","@p.team","player"],[">","@p.health",0]],["==",["grid/manhattan-distance",["object/get","@u","position"],["object/get","@p","position"]],1]]]]],0],["let",[["target",["array/reduce",["array/filter","@entity.units",["fn","p",["and",["==","@p.team","player"],[">","@p.health",0]]]],null,["fn",["nearest","p"],["if",["or",["==","@nearest",null],["<",["grid/manhattan-distance",["object/get","@p","position"],["object/get","@u","position"]],["grid/manhattan-distance",["object/get","@nearest","position"],["object/get","@u","position"]]]],"@p","@nearest"]]]]],["if",["==","@target",null],"@u",["let",[["nextX",["math/clamp",["+",["object/get",["object/get","@u","position"],"x"],["math/sign",["-",["object/get",["object/get","@target","position"],"x"],["object/get",["object/get","@u","position"],"x"]]]],0,["-","@config.gridWidth",1]]],["nextY",["math/clamp",["+",["object/get",["object/get","@u","position"],"y"],["math/sign",["-",["object/get",["object/get","@target","position"],"y"],["object/get",["object/get","@u","position"],"y"]]]],0,["-","@config.gridHeight",1]]]],["if",["and",["grid/in-bounds",{"x":"@nextX","y":"@nextY"},"@config.gridWidth","@config.gridHeight"],["and",["==",["object/get",["array/find","@entity.tiles",["fn","t",["and",["==",["object/get","@t","x"],"@nextX"],["==",["object/get","@t","y"],"@nextY"]]]],"passable"],true],["==",["array/len",["array/filter","@entity.units",["fn","o",["and",["!=","@o.id","@u.id"],["and",[">","@o.health",0],["and",["==",["object/get",["object/get","@o","position"],"x"],"@nextX"],["==",["object/get",["object/get","@o","position"],"y"],"@nextY"]]]]]]],0]]],["object/merge","@u",{"position":{"x":"@nextX","y":"@nextY"},"x":"@nextX","y":"@nextY","yaw":["if",["==","@nextX",["object/get",["object/get","@u","position"],"x"]],["if",[">","@nextY",["object/get",["object/get","@u","position"],"y"]],0,["if",["<","@nextY",["object/get",["object/get","@u","position"],"y"]],3.1416,["object/get","@u","yaw",0]]],["if",[">","@nextX",["object/get",["object/get","@u","position"],"x"]],1.5708,-1.5708]]}],"@u"]]]],"@u"],"@u"]]]],["emit","UNITS_CHANGED",{"playersAlive":["array/len",["array/filter","@entity.units",["fn","u",["and",["==","@u.team","player"],[">","@u.health",0]]]]],"enemiesAlive":["array/len",["array/filter","@entity.units",["fn","u",["and",["==","@u.team","enemy"],[">","@u.health",0]]]]]}]]}]},"config":{"attackDamage":{"type":"number","default":1,"label":"Attack Damage","description":"Health removed from a target per ATTACK intent","tier":"domain"},"units":{"type":"[Unit]","default":[],"label":"Initial Units","description":"Seed unit roster (players and enemies) present before the first intent","tier":"domain","items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":false},"health":{"name":"health","type":"number","required":false},"z":{"name":"z","type":"number","required":false},"id":{"name":"id","type":"string","required":true},"y":{"name":"y","type":"number","required":false},"position":{"name":"position","type":"object","required":false,"properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}},"team":{"name":"team","type":"string","required":false},"unitType":{"name":"unitType","type":"string","required":false},"yaw":{"name":"yaw","type":"number","required":false},"maxHealth":{"name":"maxHealth","type":"number","required":false}}}},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, incoming MOVE/ATTACK/AI_TURN intents are applied; toggle to freeze the board","tier":"domain"},"tiles":{"type":"[Tile]","default":[],"label":"Tiles","description":"Grid tiles used for passability checks during moves and AI stepping","tier":"presentation","items":{"type":"object","properties":{"y":{"name":"y","type":"number","required":true},"id":{"name":"id","type":"string","required":false},"passable":{"name":"passable","type":"boolean","required":false},"x":{"name":"x","type":"number","required":true}}}},"gridHeight":{"type":"number","default":12,"label":"Grid Height","description":"Grid row count clamping move + AI bounds","tier":"presentation"},"gridWidth":{"type":"number","default":12,"label":"Grid Width","description":"Grid column count clamping move + AI bounds","tier":"presentation"}},"scope":"instance"}],"pages":[{"name":"GridTacticsPage","id":"pag_7HP68FR9294H4RSZYFCTSSKAX6","path":"/grid-tactics","traits":[{"ref":"GridTactics","refId":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"}]}],"types":{"Fx":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"Tile":[{"name":"id","type":"string"},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"passable","type":"boolean"}],"Unit":[{"name":"id","type":"string","required":true},{"name":"position","type":"object","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"x","type":"number"},{"name":"y","type":"number"},{"name":"z","type":"number"},{"name":"team","type":"string"},{"name":"health","type":"number"},{"name":"maxHealth","type":"number"},{"name":"unitType","type":"string"},{"name":"yaw","type":"number"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_ZDT43GJEKN79TV4ZWB9Z44BTH9":{"id":"ent_ZDT43GJEKN79TV4ZWB9Z44BTH9","kind":"entity","bakedName":"TacticsState","curName":"TacticsState","renames":[],"owner":"workspace"},"evt_2B8RS9KBRGNW85SWE2JVH93DP5":{"id":"evt_2B8RS9KBRGNW85SWE2JVH93DP5","kind":"event","bakedName":"AI_TURN","curName":"AI_TURN","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"evt_64ZCZDM21810M2732FG7WAKXKD":{"id":"evt_64ZCZDM21810M2732FG7WAKXKD","kind":"event","bakedName":"HEAL","curName":"HEAL","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"evt_AXEFT24E9E74Q13A6V5KN2ABFA":{"id":"evt_AXEFT24E9E74Q13A6V5KN2ABFA","kind":"event","bakedName":"SPAWN","curName":"SPAWN","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"evt_CVXAVBQ0KRG9W0QCRVBEFZ3Y3C":{"id":"evt_CVXAVBQ0KRG9W0QCRVBEFZ3Y3C","kind":"event","bakedName":"BURST","curName":"BURST","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"evt_CWBX7EWN2AAH5BJEC1C0EEW2P1":{"id":"evt_CWBX7EWN2AAH5BJEC1C0EEW2P1","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"evt_J9CZVFWET47D24JYMZ05VQEH1B":{"id":"evt_J9CZVFWET47D24JYMZ05VQEH1B","kind":"event","bakedName":"ATTACK","curName":"ATTACK","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"evt_PXM7QGTPX7BEKMFSHG7BQQEKQV":{"id":"evt_PXM7QGTPX7BEKMFSHG7BQQEKQV","kind":"event","bakedName":"UNITS_CHANGED","curName":"UNITS_CHANGED","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"evt_SCQFQB4N52AJHA4GGMSXFCWDKC":{"id":"evt_SCQFQB4N52AJHA4GGMSXFCWDKC","kind":"event","bakedName":"MOVE","curName":"MOVE","renames":[],"owner":"workspace","parent":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ"},"orb_K5MJ2EPWSJECS3R45H85SXNZV9":{"id":"orb_K5MJ2EPWSJECS3R45H85SXNZV9","kind":"orbital","bakedName":"GridTacticsOrbital","curName":"GridTacticsOrbital","renames":[],"owner":"workspace"},"pag_7HP68FR9294H4RSZYFCTSSKAX6":{"id":"pag_7HP68FR9294H4RSZYFCTSSKAX6","kind":"page","bakedName":"GridTacticsPage","curName":"GridTacticsPage","renames":[],"owner":"workspace"},"trt_3JDP159QVMVXTB1D81VHV0Y9RZ":{"id":"trt_3JDP159QVMVXTB1D81VHV0Y9RZ","kind":"trait","bakedName":"GridTactics","curName":"GridTactics","renames":[],"owner":"workspace"}}}}
@@ -1 +1 @@
1
- {"name":"std-hero-nav","version":"1.0.0","description":"Headless single-hero navigation authority: the SOLE writer of units + movesLeft on objective boards. Applies a budget-limited MOVE intent (steps the hero one tile, spends a move, emits HERO_STEPPED) and an optional WANDER intent (random step for neutral NPCs). Renders nothing.","orbitals":[{"name":"HeroNavOrbital","id":"orb_MBDX3YY6BH35RZ7DQAPY0ZSSRK","entity":{"name":"HeroNavData","id":"ent_E1VP8C7TGSX8CYJ2D53H13Q7VN","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"units","type":"array","items":{"type":"object","properties":{"id":{"name":"id","type":"string","required":true},"health":{"name":"health","type":"number","required":false},"z":{"name":"z","type":"number","required":false},"team":{"name":"team","type":"string","required":false},"x":{"name":"x","type":"number","required":false},"y":{"name":"y","type":"number","required":false},"unitType":{"name":"unitType","type":"string","required":false},"position":{"name":"position","type":"object","required":false,"properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}},"maxHealth":{"name":"maxHealth","type":"number","required":false}}}},{"name":"tiles","type":"array","items":{"type":"object","properties":{"id":{"name":"id","type":"string","required":false},"y":{"name":"y","type":"number","required":true},"passable":{"name":"passable","type":"boolean","required":false},"x":{"name":"x","type":"number","required":true}}}},{"name":"movesLeft","type":"number","default":0}],"shared":true},"traits":[{"name":"HeroNav","id":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05","entityRebindable":true,"entityContract":{"requires":[],"provides":["movesLeft","tiles","units"]},"effectRow":[{"kind":"emit","resource":"HERO_STEPPED"},{"kind":"set","resource":"@entity.movesLeft"},{"kind":"set","resource":"@entity.tiles"},{"kind":"set","resource":"@entity.units"}],"category":"lifecycle","linkedEntity":"HeroNavData","linkedEntityId":"ent_E1VP8C7TGSX8CYJ2D53H13Q7VN","entityRefIds":{"HeroNavData":"ent_E1VP8C7TGSX8CYJ2D53H13Q7VN"},"emits":[{"event":"HERO_STEPPED","eventId":"evt_R8XS3W6K2E9H7BJ72F045DDKDF","description":"Hero moved onto tile (x,z) with movesLeft remaining; objective mechanics listen to score progress and round-flow to decide win/lose","tier":"domain","scope":"external","payloadSchema":[{"name":"unitId","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number","required":true},{"name":"movesLeft","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_XZSPW374FJJ7SD80712F59F7DE","name":"Initialize"},{"key":"MOVE","id":"evt_0HE30FB6SPKCV49DY8YTYF4PA1","name":"Move","payloadSchema":[{"name":"unitId","type":"string"},{"name":"x","type":"number"},{"name":"y","type":"number"}],"listened":true},{"key":"WANDER","id":"evt_20YVTE5WBEY5QD1H78JXXQRA6S","name":"Wander","payloadSchema":[{"name":"tick","type":"number"}],"listened":true},{"key":"RESTART","id":"evt_B8RC847STKWX9S97Y6DCXX94YS","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"HERO_STEPPED","id":"evt_R8XS3W6K2E9H7BJ72F045DDKDF","name":"Hero Stepped","description":"Hero moved onto tile (x,z) with movesLeft remaining; objective mechanics listen to score progress and round-flow to decide win/lose","tier":"domain","payloadSchema":[{"name":"unitId","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number","required":true},{"name":"movesLeft","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_XZSPW374FJJ7SD80712F59F7DE","effects":[["set","@entity.units","@config.units"],["set","@entity.tiles",["if",[">",["array/len","@config.tiles"],0],"@config.tiles",["array/flatten",["array/map",["array/range",0,"@config.gridHeight"],["fn","gy",["array/map",["array/range",0,"@config.gridWidth"],["fn","gx",{"id":["str/concat","t-","@gx","-","@gy"],"x":"@gx","y":"@gy","passable":true}]]]]]]],["set","@entity.movesLeft","@config.moveBudget"]]},{"from":"active","to":"active","event":"MOVE","eventId":"evt_0HE30FB6SPKCV49DY8YTYF4PA1","guard":["and","@config.running",[">","@entity.movesLeft",0]],"effects":[["set","@entity.units",["array/map","@entity.units",["fn","u",["if",["==","@u.id","@payload.unitId"],["object/merge","@u",{"position":{"x":"@payload.x","y":"@payload.y"}}],"@u"]]]],["set","@entity.movesLeft",["-","@entity.movesLeft",1]],["emit","HERO_STEPPED",{"unitId":"@payload.unitId","x":"@payload.x","z":"@payload.y","movesLeft":"@entity.movesLeft"}]]},{"from":"active","to":"active","event":"WANDER","eventId":"evt_20YVTE5WBEY5QD1H78JXXQRA6S","guard":"@config.running","effects":[["set","@entity.units",["array/map","@entity.units",["fn","u",["if",["==","@u.team","neutral"],["let",[["cell",["object/get","@u","position"]],["dir",["math/floor",["*",["math/random"],4]]]],["let",[["nc",["if",["==","@dir",0],{"x":["+",["object/get","@cell","x"],1],"y":["object/get","@cell","y"]},["if",["==","@dir",1],{"x":["-",["object/get","@cell","x"],1],"y":["object/get","@cell","y"]},["if",["==","@dir",2],{"x":["object/get","@cell","x"],"y":["+",["object/get","@cell","y"],1]},{"x":["object/get","@cell","x"],"y":["-",["object/get","@cell","y"],1]}]]]]],["if",["and",["grid/in-bounds","@nc","@config.gridWidth","@config.gridHeight"],["and",["==",["object/get",["array/find","@entity.tiles",["fn","t",["and",["==",["object/get","@t","x"],["object/get","@nc","x"]],["==",["object/get","@t","y"],["object/get","@nc","y"]]]]],"passable"],true],["==",["array/len",["array/filter","@entity.units",["fn","o",["and",["!=","@o.id","@u.id"],["and",["==",["object/get",["object/get","@o","position"],"x"],["object/get","@nc","x"]],["==",["object/get",["object/get","@o","position"],"y"],["object/get","@nc","y"]]]]]]],0]]],["object/merge","@u",{"position":"@nc"}],"@u"]]],"@u"]]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_B8RC847STKWX9S97Y6DCXX94YS","effects":[["set","@entity.units","@config.units"],["set","@entity.movesLeft","@config.moveBudget"]]}]},"config":{"gridWidth":{"type":"number","default":12,"label":"Grid Width","description":"Grid column count clamping move + wander bounds","tier":"presentation"},"moveBudget":{"type":"number","default":45,"label":"Move Budget","description":"Moves the hero may spend before the round is lost if objectives remain","tier":"domain"},"tiles":{"type":"[Tile]","default":[],"label":"Tiles","description":"Grid tiles used for passability checks (auto-generated all-passable when empty)","tier":"presentation","items":{"type":"object","properties":{"y":{"name":"y","type":"number","required":true},"id":{"name":"id","type":"string","required":false},"x":{"name":"x","type":"number","required":true},"passable":{"name":"passable","type":"boolean","required":false}}}},"units":{"type":"[Unit]","default":[],"label":"Initial Units","description":"Seed roster: the player hero plus any neutral NPCs","tier":"domain","items":{"type":"object","properties":{"z":{"name":"z","type":"number","required":false},"position":{"name":"position","type":"object","required":false,"properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}},"id":{"name":"id","type":"string","required":true},"y":{"name":"y","type":"number","required":false},"x":{"name":"x","type":"number","required":false},"team":{"name":"team","type":"string","required":false},"health":{"name":"health","type":"number","required":false},"unitType":{"name":"unitType","type":"string","required":false},"maxHealth":{"name":"maxHealth","type":"number","required":false}}}},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, MOVE/WANDER intents are applied; toggle to freeze the board","tier":"domain"},"gridHeight":{"type":"number","default":12,"label":"Grid Height","description":"Grid row count clamping move + wander bounds","tier":"presentation"}},"scope":"instance"}],"pages":[{"name":"HeroNavPage","id":"pag_R5P0400F7J7KSCFRQQPQD2KJKN","path":"/hero-nav","traits":[{"ref":"HeroNav","refId":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05"}]}],"types":{"Tile":[{"name":"id","type":"string"},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"passable","type":"boolean"}],"Unit":[{"name":"id","type":"string","required":true},{"name":"position","type":"object","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"x","type":"number"},{"name":"y","type":"number"},{"name":"z","type":"number"},{"name":"team","type":"string"},{"name":"health","type":"number"},{"name":"maxHealth","type":"number"},{"name":"unitType","type":"string"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_E1VP8C7TGSX8CYJ2D53H13Q7VN":{"id":"ent_E1VP8C7TGSX8CYJ2D53H13Q7VN","kind":"entity","bakedName":"HeroNavData","curName":"HeroNavData","renames":[],"owner":"workspace"},"evt_0HE30FB6SPKCV49DY8YTYF4PA1":{"id":"evt_0HE30FB6SPKCV49DY8YTYF4PA1","kind":"event","bakedName":"MOVE","curName":"MOVE","renames":[],"owner":"workspace","parent":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05"},"evt_20YVTE5WBEY5QD1H78JXXQRA6S":{"id":"evt_20YVTE5WBEY5QD1H78JXXQRA6S","kind":"event","bakedName":"WANDER","curName":"WANDER","renames":[],"owner":"workspace","parent":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05"},"evt_B8RC847STKWX9S97Y6DCXX94YS":{"id":"evt_B8RC847STKWX9S97Y6DCXX94YS","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05"},"evt_R8XS3W6K2E9H7BJ72F045DDKDF":{"id":"evt_R8XS3W6K2E9H7BJ72F045DDKDF","kind":"event","bakedName":"HERO_STEPPED","curName":"HERO_STEPPED","renames":[],"owner":"workspace","parent":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05"},"evt_XZSPW374FJJ7SD80712F59F7DE":{"id":"evt_XZSPW374FJJ7SD80712F59F7DE","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05"},"orb_MBDX3YY6BH35RZ7DQAPY0ZSSRK":{"id":"orb_MBDX3YY6BH35RZ7DQAPY0ZSSRK","kind":"orbital","bakedName":"HeroNavOrbital","curName":"HeroNavOrbital","renames":[],"owner":"workspace"},"pag_R5P0400F7J7KSCFRQQPQD2KJKN":{"id":"pag_R5P0400F7J7KSCFRQQPQD2KJKN","kind":"page","bakedName":"HeroNavPage","curName":"HeroNavPage","renames":[],"owner":"workspace"},"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05":{"id":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05","kind":"trait","bakedName":"HeroNav","curName":"HeroNav","renames":[],"owner":"workspace"}}}}
1
+ {"name":"std-hero-nav","version":"1.0.0","description":"Headless single-hero navigation authority: the SOLE writer of units + movesLeft on objective boards. Applies a budget-limited MOVE intent (steps the hero one tile, spends a move, emits HERO_STEPPED) and an optional WANDER intent (random step for neutral NPCs). Renders nothing.","orbitals":[{"name":"HeroNavOrbital","id":"orb_MBDX3YY6BH35RZ7DQAPY0ZSSRK","entity":{"name":"HeroNavData","id":"ent_E1VP8C7TGSX8CYJ2D53H13Q7VN","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"units","type":"array","items":{"type":"object","properties":{"position":{"name":"position","type":"object","required":false,"properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}},"z":{"name":"z","type":"number","required":false},"x":{"name":"x","type":"number","required":false},"unitType":{"name":"unitType","type":"string","required":false},"id":{"name":"id","type":"string","required":true},"team":{"name":"team","type":"string","required":false},"y":{"name":"y","type":"number","required":false},"maxHealth":{"name":"maxHealth","type":"number","required":false},"health":{"name":"health","type":"number","required":false}}}},{"name":"tiles","type":"array","items":{"type":"object","properties":{"id":{"name":"id","type":"string","required":false},"x":{"name":"x","type":"number","required":true},"passable":{"name":"passable","type":"boolean","required":false},"y":{"name":"y","type":"number","required":true}}}},{"name":"movesLeft","type":"number","default":0}],"shared":true},"traits":[{"name":"HeroNav","id":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05","entityRebindable":true,"entityContract":{"requires":[],"provides":["movesLeft","tiles","units"]},"effectRow":[{"kind":"emit","resource":"HERO_STEPPED"},{"kind":"set","resource":"@entity.movesLeft"},{"kind":"set","resource":"@entity.tiles"},{"kind":"set","resource":"@entity.units"}],"category":"lifecycle","linkedEntity":"HeroNavData","linkedEntityId":"ent_E1VP8C7TGSX8CYJ2D53H13Q7VN","entityRefIds":{"HeroNavData":"ent_E1VP8C7TGSX8CYJ2D53H13Q7VN"},"emits":[{"event":"HERO_STEPPED","eventId":"evt_R8XS3W6K2E9H7BJ72F045DDKDF","description":"Hero moved onto tile (x,z) with movesLeft remaining; objective mechanics listen to score progress and round-flow to decide win/lose","tier":"domain","scope":"external","payloadSchema":[{"name":"unitId","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number","required":true},{"name":"movesLeft","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_XZSPW374FJJ7SD80712F59F7DE","name":"Initialize"},{"key":"MOVE","id":"evt_0HE30FB6SPKCV49DY8YTYF4PA1","name":"Move","payloadSchema":[{"name":"unitId","type":"string"},{"name":"x","type":"number"},{"name":"y","type":"number"}],"listened":true},{"key":"WANDER","id":"evt_20YVTE5WBEY5QD1H78JXXQRA6S","name":"Wander","payloadSchema":[{"name":"tick","type":"number"}],"listened":true},{"key":"RESTART","id":"evt_B8RC847STKWX9S97Y6DCXX94YS","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"HERO_STEPPED","id":"evt_R8XS3W6K2E9H7BJ72F045DDKDF","name":"Hero Stepped","description":"Hero moved onto tile (x,z) with movesLeft remaining; objective mechanics listen to score progress and round-flow to decide win/lose","tier":"domain","payloadSchema":[{"name":"unitId","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number","required":true},{"name":"movesLeft","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_XZSPW374FJJ7SD80712F59F7DE","effects":[["set","@entity.units","@config.units"],["set","@entity.tiles",["if",[">",["array/len","@config.tiles"],0],"@config.tiles",["array/flatten",["array/map",["array/range",0,"@config.gridHeight"],["fn","gy",["array/map",["array/range",0,"@config.gridWidth"],["fn","gx",{"id":["str/concat","t-","@gx","-","@gy"],"x":"@gx","y":"@gy","passable":true}]]]]]]],["set","@entity.movesLeft","@config.moveBudget"]]},{"from":"active","to":"active","event":"MOVE","eventId":"evt_0HE30FB6SPKCV49DY8YTYF4PA1","guard":["and","@config.running",[">","@entity.movesLeft",0]],"effects":[["set","@entity.units",["array/map","@entity.units",["fn","u",["if",["==","@u.id","@payload.unitId"],["object/merge","@u",{"position":{"x":"@payload.x","y":"@payload.y"}}],"@u"]]]],["set","@entity.movesLeft",["-","@entity.movesLeft",1]],["emit","HERO_STEPPED",{"unitId":"@payload.unitId","x":"@payload.x","z":"@payload.y","movesLeft":"@entity.movesLeft"}]]},{"from":"active","to":"active","event":"WANDER","eventId":"evt_20YVTE5WBEY5QD1H78JXXQRA6S","guard":"@config.running","effects":[["set","@entity.units",["array/map","@entity.units",["fn","u",["if",["==","@u.team","neutral"],["let",[["cell",["object/get","@u","position"]],["dir",["math/floor",["*",["math/random"],4]]]],["let",[["nc",["if",["==","@dir",0],{"x":["+",["object/get","@cell","x"],1],"y":["object/get","@cell","y"]},["if",["==","@dir",1],{"x":["-",["object/get","@cell","x"],1],"y":["object/get","@cell","y"]},["if",["==","@dir",2],{"x":["object/get","@cell","x"],"y":["+",["object/get","@cell","y"],1]},{"x":["object/get","@cell","x"],"y":["-",["object/get","@cell","y"],1]}]]]]],["if",["and",["grid/in-bounds","@nc","@config.gridWidth","@config.gridHeight"],["and",["==",["object/get",["array/find","@entity.tiles",["fn","t",["and",["==",["object/get","@t","x"],["object/get","@nc","x"]],["==",["object/get","@t","y"],["object/get","@nc","y"]]]]],"passable"],true],["==",["array/len",["array/filter","@entity.units",["fn","o",["and",["!=","@o.id","@u.id"],["and",["==",["object/get",["object/get","@o","position"],"x"],["object/get","@nc","x"]],["==",["object/get",["object/get","@o","position"],"y"],["object/get","@nc","y"]]]]]]],0]]],["object/merge","@u",{"position":"@nc"}],"@u"]]],"@u"]]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_B8RC847STKWX9S97Y6DCXX94YS","effects":[["set","@entity.units","@config.units"],["set","@entity.movesLeft","@config.moveBudget"]]}]},"config":{"running":{"type":"boolean","default":true,"label":"Running","description":"When true, MOVE/WANDER intents are applied; toggle to freeze the board","tier":"domain"},"units":{"type":"[Unit]","default":[],"label":"Initial Units","description":"Seed roster: the player hero plus any neutral NPCs","tier":"domain","items":{"type":"object","properties":{"z":{"name":"z","type":"number","required":false},"position":{"name":"position","type":"object","required":false,"properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}},"id":{"name":"id","type":"string","required":true},"x":{"name":"x","type":"number","required":false},"team":{"name":"team","type":"string","required":false},"y":{"name":"y","type":"number","required":false},"health":{"name":"health","type":"number","required":false},"maxHealth":{"name":"maxHealth","type":"number","required":false},"unitType":{"name":"unitType","type":"string","required":false}}}},"gridHeight":{"type":"number","default":12,"label":"Grid Height","description":"Grid row count clamping move + wander bounds","tier":"presentation"},"tiles":{"type":"[Tile]","default":[],"label":"Tiles","description":"Grid tiles used for passability checks (auto-generated all-passable when empty)","tier":"presentation","items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":true},"id":{"name":"id","type":"string","required":false},"passable":{"name":"passable","type":"boolean","required":false},"y":{"name":"y","type":"number","required":true}}}},"moveBudget":{"type":"number","default":45,"label":"Move Budget","description":"Moves the hero may spend before the round is lost if objectives remain","tier":"domain"},"gridWidth":{"type":"number","default":12,"label":"Grid Width","description":"Grid column count clamping move + wander bounds","tier":"presentation"}},"scope":"instance"}],"pages":[{"name":"HeroNavPage","id":"pag_R5P0400F7J7KSCFRQQPQD2KJKN","path":"/hero-nav","traits":[{"ref":"HeroNav","refId":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05"}]}],"types":{"Tile":[{"name":"id","type":"string"},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"passable","type":"boolean"}],"Unit":[{"name":"id","type":"string","required":true},{"name":"position","type":"object","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"x","type":"number"},{"name":"y","type":"number"},{"name":"z","type":"number"},{"name":"team","type":"string"},{"name":"health","type":"number"},{"name":"maxHealth","type":"number"},{"name":"unitType","type":"string"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_E1VP8C7TGSX8CYJ2D53H13Q7VN":{"id":"ent_E1VP8C7TGSX8CYJ2D53H13Q7VN","kind":"entity","bakedName":"HeroNavData","curName":"HeroNavData","renames":[],"owner":"workspace"},"evt_0HE30FB6SPKCV49DY8YTYF4PA1":{"id":"evt_0HE30FB6SPKCV49DY8YTYF4PA1","kind":"event","bakedName":"MOVE","curName":"MOVE","renames":[],"owner":"workspace","parent":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05"},"evt_20YVTE5WBEY5QD1H78JXXQRA6S":{"id":"evt_20YVTE5WBEY5QD1H78JXXQRA6S","kind":"event","bakedName":"WANDER","curName":"WANDER","renames":[],"owner":"workspace","parent":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05"},"evt_B8RC847STKWX9S97Y6DCXX94YS":{"id":"evt_B8RC847STKWX9S97Y6DCXX94YS","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05"},"evt_R8XS3W6K2E9H7BJ72F045DDKDF":{"id":"evt_R8XS3W6K2E9H7BJ72F045DDKDF","kind":"event","bakedName":"HERO_STEPPED","curName":"HERO_STEPPED","renames":[],"owner":"workspace","parent":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05"},"evt_XZSPW374FJJ7SD80712F59F7DE":{"id":"evt_XZSPW374FJJ7SD80712F59F7DE","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05"},"orb_MBDX3YY6BH35RZ7DQAPY0ZSSRK":{"id":"orb_MBDX3YY6BH35RZ7DQAPY0ZSSRK","kind":"orbital","bakedName":"HeroNavOrbital","curName":"HeroNavOrbital","renames":[],"owner":"workspace"},"pag_R5P0400F7J7KSCFRQQPQD2KJKN":{"id":"pag_R5P0400F7J7KSCFRQQPQD2KJKN","kind":"page","bakedName":"HeroNavPage","curName":"HeroNavPage","renames":[],"owner":"workspace"},"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05":{"id":"trt_BJ6WC35SCQWPBG6DHW2NZQ8C05","kind":"trait","bakedName":"HeroNav","curName":"HeroNav","renames":[],"owner":"workspace"}}}}