@almadar/std 16.252.0 → 16.254.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.
- package/behaviors/lolo/agent/atoms/std-agent-pool.lolo +355 -0
- package/behaviors/lolo/agent/atoms/std-agent-suggestions.lolo +16 -2
- package/behaviors/lolo/agent/evals/eval-agent-builder.lolo +152 -0
- package/behaviors/lolo/agent/organisms/std-agent-builder.lolo +320 -26
- package/behaviors/lolo/ui/learning/atoms/std-learn-generate.lolo +6 -4
- package/behaviors/lolo-behavior-contracts.json +1 -1
- package/behaviors/registry/agent/atoms/std-agent-context.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-fix-loop.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-planner.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-pool.orb +1 -0
- package/behaviors/registry/agent/atoms/std-agent-proposal.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-session.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-suggestions.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-tool-call.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-tool-loop.orb +1 -1
- package/behaviors/registry/agent/atoms/std-agent-trace.orb +1 -1
- package/behaviors/registry/agent/evals/eval-agent-builder.orb +1 -0
- package/behaviors/registry/agent/organisms/std-agent-assistant.orb +1 -1
- package/behaviors/registry/agent/organisms/std-agent-builder.orb +1 -1
- package/behaviors/registry/infra/atoms/std-analytics.orb +1 -1
- package/behaviors/registry/infra/atoms/std-approval-gate.orb +1 -1
- package/behaviors/registry/infra/atoms/std-cache-aside.orb +1 -1
- package/behaviors/registry/infra/atoms/std-calendar-sync.orb +1 -1
- package/behaviors/registry/infra/atoms/std-cascade-on-delete.orb +1 -1
- package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +1 -1
- package/behaviors/registry/infra/atoms/std-data-erasure.orb +1 -1
- package/behaviors/registry/infra/atoms/std-data-import.orb +1 -1
- package/behaviors/registry/infra/atoms/std-global-search.orb +1 -1
- package/behaviors/registry/infra/atoms/std-knowledge-loop.orb +1 -1
- package/behaviors/registry/infra/atoms/std-lifecycle.orb +1 -1
- package/behaviors/registry/infra/atoms/std-migration-job.orb +1 -1
- package/behaviors/registry/infra/atoms/std-mod-queue.orb +1 -1
- package/behaviors/registry/infra/atoms/std-notification-center.orb +1 -1
- package/behaviors/registry/infra/atoms/std-notification-preferences.orb +1 -1
- package/behaviors/registry/infra/atoms/std-notify-on-event.orb +1 -1
- package/behaviors/registry/infra/atoms/std-page-search.orb +1 -1
- package/behaviors/registry/infra/atoms/std-page-watch.orb +1 -1
- package/behaviors/registry/infra/atoms/std-permission-matrix.orb +1 -1
- package/behaviors/registry/infra/atoms/std-rate-limiter.orb +1 -1
- package/behaviors/registry/infra/atoms/std-reminder-scheduler.orb +1 -1
- package/behaviors/registry/infra/atoms/std-review-cycle.orb +1 -1
- package/behaviors/registry/infra/atoms/std-row-access-control.orb +1 -1
- package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +1 -1
- package/behaviors/registry/infra/organisms/std-status-lifecycle-control.orb +1 -1
- package/behaviors/registry/ml/atoms/std-data-collector.orb +1 -1
- package/behaviors/registry/ml/atoms/std-graph-builder.orb +1 -1
- package/behaviors/registry/ml/atoms/std-ml-classify.orb +1 -1
- package/behaviors/registry/ml/atoms/std-ml-infer.orb +1 -1
- package/behaviors/registry/ml/atoms/std-ml-lookup.orb +1 -1
- package/behaviors/registry/ml/atoms/std-ml-posterior.orb +1 -1
- package/behaviors/registry/ml/atoms/std-ml-similarity.orb +1 -1
- package/behaviors/registry/ml/atoms/std-tokenizer.orb +1 -1
- package/behaviors/registry/ml/atoms/std-weight-validator.orb +1 -1
- package/behaviors/registry/ml/organisms/std-escalating-decision.orb +1 -1
- package/behaviors/registry/ml/organisms/std-knowledge-tracing.orb +1 -1
- package/behaviors/registry/ui/avl/atoms/std-avl-cosmic-zoom.orb +1 -1
- package/behaviors/registry/ui/avl/atoms/ui-avl-glyph.orb +1 -1
- package/behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb +1 -1
- package/behaviors/registry/ui/avl/atoms/ui-avl-transition-detail.orb +1 -1
- package/behaviors/registry/ui/avl/atoms/ui-avl-transition-explainer.orb +1 -1
- package/behaviors/registry/ui/avl/atoms/ui-behavior-view.orb +1 -1
- package/behaviors/registry/ui/avl/atoms/ui-module-card.orb +1 -1
- package/behaviors/registry/ui/avl/organisms/ui-flow-canvas.orb +1 -1
- package/behaviors/registry/ui/avl/organisms/ui-layers-panel.orb +1 -1
- package/behaviors/registry/ui/avl/organisms/ui-orb-inspector.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-app-layout.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-app-search.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-behavior-catalog.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-behavior-tour.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-board.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-book-reader.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-browse.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-calendar.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-card-grid.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-confirmation.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-dashboard-grid-embedded.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-date-range.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-doc-page.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-esign-request.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-event-log.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-export.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-file-store.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-filter.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-form-advanced.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-gallery.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-gantt-schedule.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-graphs.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-hero.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-home.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-import.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-language-picker.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-media-section.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-modal-editor.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-modal.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-multi-party-flow.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-notification-panel.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-panel-launcher.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-pricing.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-proof.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-prose.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-rating-review.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-record-detail.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-recurrence.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-related.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-role-gate.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-saved-search.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-scatter.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-scoped-list.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-selection.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-site-footer.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-site-header.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-slide-deck.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-stat-band.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-stats.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-step-flow.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-steps.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-tabs.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-thread.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-tree.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-version-history.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-wizard.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-workspace-layout.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-animated-graphic.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-animated-reveal.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-aside.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-atlas-image.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-atlas-panel.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-avatar.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-badge.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-box.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-button.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-card.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-center.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-checkbox.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-conditional-wrapper.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-confetti-effect.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-day-cell.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-dialog.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-divider.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-filter-pill.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-flip-container.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-game-icon.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-hstack.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-icon.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-image.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-infinite-scroll-sentinel.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-input.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-label.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-law-reference-tooltip.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-overlay.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-pattern-tile.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-presence.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-progress-bar.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-radio.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-range-slider.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-section-header.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-select.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-spacer.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-sparkline.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-spinner.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-stack.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-status-dot.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-branch.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-connection.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-flow.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-grid.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-lobe.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-mesh.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-morph.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-node.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-pulse.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-ring.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-shield.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-svg-stack.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-switch.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-text-highlight.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-textarea.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-theme-toggle.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-time-slot-cell.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-trend-indicator.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-typewriter-text.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-typography.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-video-embed.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-vstack.orb +1 -1
- package/behaviors/registry/ui/core/molecules/std-stat-rows.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-accordion.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-activation-block.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-activity-rail.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-agent-activity-feed.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-agent-activity-row.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-agent-chat-feed.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-alert.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-animated-counter.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-bloom-quiz-block.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-branching-logic-builder.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-carousel.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-change-list.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-chart-legend.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-chart.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-code-block.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-command-palette.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-commit-row.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-connection-block.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-container.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-content-renderer.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-data-list.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-date-range-picker.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-date-range-selector.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-doc-breadcrumb.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-doc-pagination.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-doc-search.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-doc-sidebar.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-doc-toc.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-document-details.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-document-viewer.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-drawer.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-edge-decoration.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-emoji-picker.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-empty-state.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-error-boundary.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-error-state.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-feature-card.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-feature-grid.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-file-tree.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-filter-group.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-flex.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-flip-card.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-floating-toolbar.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-form-actions.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-form-field.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-form-layout.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-form-section-header.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-fx-overlay.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-gantt.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-geometric-pattern.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-gradient-divider.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-graph-view.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-grid.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-header.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-icon-button.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-import-progress.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-import-source-picker.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-input-group.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-jazari-state-machine.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-lightbox.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-likert-scale.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-line-chart.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-loading-state.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-map-view.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-markdown-content.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-matrix-question.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-menu.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-meter.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-modal.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-navigation.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-notification.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-number-stepper.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-option-constraint-group.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-orbital-visualization.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-page-header.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-page-transition.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-pagination.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-popover.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-positioned-canvas.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-progress-dots.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-pull-to-refresh.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-qr-scanner.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-quiz-block.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-reflection-block.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-relation-select.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-repeatable-form-section.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-rich-text-editor.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-scaled-diagram.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-search-input.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-section.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-side-panel.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-sidebar.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-signature-pad.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-simple-grid.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-skeleton.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-social-proof.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-sortable-list.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-split.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-star-rating.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-stat-display.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-table-view.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-tabs.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-tag-input.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-tooltip.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-top-nav-item.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-upload-drop-zone.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-version-diff.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-violation-alert.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-vote-stack.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-wizard-container.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-wizard-navigation.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-wizard-progress.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-chat-bar.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-code-runner-panel.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-dashboard-grid.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-dock-layout.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-drawer-slot.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-form-section.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-form.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-master-detail-layout.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-modal-slot.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-runtime-debugger.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-segment-renderer.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-split-pane.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-state-machine-view.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-subagent-trace-panel.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-tabbed-container.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-timeline.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-toast-slot.orb +1 -1
- package/behaviors/registry/ui/core/templates/ui-auth-layout.orb +1 -1
- package/behaviors/registry/ui/core/templates/ui-counter-template.orb +1 -1
- package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +1 -1
- package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-arcade-play.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-area-fill.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-audio-cue.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-camera-rig.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-chase-ai.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-choice-gate.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-coef-pad.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-curve-fog.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-dungeon-combat.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-fx-narrative.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-fx-particles.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-fx-trail.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-gate-lock.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-gather.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-gold.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-grid-tactics.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-hero-nav.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-lives.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-loop-lock.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-market-flow.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-motion-body.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-objective-reach.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-pad-lock.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-patience.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-patrol-hazard.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-pickup.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-production.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-score.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-tutorial-autodemo.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-tutorial-overlay.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-velocity-gate.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-xp.orb +1 -1
- package/behaviors/registry/ui/game/atoms/std-zone-card.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-action-palette.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-action-tile.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-canvas.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-control-button.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-dialogue-bubble.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-fx-layer.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-group.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-mesh.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-shape-layer.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-shape.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-skinned-mesh.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-sprite-layer.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-sprite.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-text-layer.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-draw-text.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-game-audio-cue.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-game-audio-toggle.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-game-hud.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-health-bar.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-score-display.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-sequence-bar.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-stat-badge.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-state-graph.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-state-json-view.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-timer-display.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-trait-slot.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-dungeon-board-2d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-market-board-3d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-objective-board-3d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-platformer-board-2d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-survival-board-3d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +1 -1
- package/behaviors/registry/ui/game/organisms/std-worldmap-board-2d.orb +1 -1
- package/behaviors/registry/ui/game/templates/ui-game-shell.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-arrangement.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-compare.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-coupled-sim.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-diagram.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-estimate.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-fx-cues.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-generate.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-grid-sim.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-live-sim.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-measure.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-param-explorer.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-perturb.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-predict.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-sample-accumulator.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-sandbox.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-scenario.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-sim-3d.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-slope-probe.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-trace-player.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-transport.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/std-learn-tree.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +1 -1
- package/dist/behaviors-embeddings.hash.json +2 -2
- package/dist/behaviors-embeddings.json +1 -1
- package/dist/knob-embeddings.hash.json +2 -2
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"std-arcade-play","version":"1.0.0","description":"Headless arcade play-economy mechanic: the SOLE writer of tokens + tickets + machines. Applies a PLAY_MACHINE intent (spends a token, rolls a pseudo-random ticket payout within a configured range, emits BURST + SCORE_CHANGED). Renders nothing.","orbitals":[{"name":"ArcadePlayOrbital","id":"orb_8DXKW20HV28XHBWP9W0NV989XS","entity":{"name":"ArcadePlayData","id":"ent_1YXRVY956PJKBAKK1NPASS6W0F","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"tokens","type":"number","default":0},{"name":"tickets","type":"number","default":0},{"name":"machines","type":"array","default":[],"items":{"type":"object","properties":{"
|
|
1
|
+
{"name":"std-arcade-play","version":"1.0.0","description":"Headless arcade play-economy mechanic: the SOLE writer of tokens + tickets + machines. Applies a PLAY_MACHINE intent (spends a token, rolls a pseudo-random ticket payout within a configured range, emits BURST + SCORE_CHANGED). Renders nothing.","orbitals":[{"name":"ArcadePlayOrbital","id":"orb_8DXKW20HV28XHBWP9W0NV989XS","entity":{"name":"ArcadePlayData","id":"ent_1YXRVY956PJKBAKK1NPASS6W0F","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"tokens","type":"number","default":0},{"name":"tickets","type":"number","default":0},{"name":"machines","type":"array","default":[],"items":{"type":"object","properties":{"type":{"name":"type","type":"string","required":true},"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true},"id":{"name":"id","type":"string","required":true}}}},{"name":"lastRoll","type":"number","default":0},{"name":"playCount","type":"number","default":0}],"shared":true},"traits":[{"name":"ArcadePlay","id":"trt_HBA3QVAGQV8BXTWSBNTZYGJRSY","entityRebindable":true,"entityContract":{"requires":[],"provides":["lastRoll","machines","playCount","tickets","tokens"]},"effectRow":[{"kind":"emit","resource":"BURST"},{"kind":"emit","resource":"SCORE_CHANGED"},{"kind":"set","resource":"@entity.lastRoll"},{"kind":"set","resource":"@entity.machines"},{"kind":"set","resource":"@entity.playCount"},{"kind":"set","resource":"@entity.tickets"},{"kind":"set","resource":"@entity.tokens"}],"category":"lifecycle","linkedEntity":"ArcadePlayData","linkedEntityId":"ent_1YXRVY956PJKBAKK1NPASS6W0F","entityRefIds":{"ArcadePlayData":"ent_1YXRVY956PJKBAKK1NPASS6W0F"},"emits":[{"event":"BURST","eventId":"evt_3TQ4F13Z3MZHTEF8WHNV8KCPRZ","description":"Payout (or dud) particle spawned at the played machine's tile; 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":"SCORE_CHANGED","eventId":"evt_EA9N37C6J9394Q45RRWQYENXYP","description":"Tickets + tokens after this play; a flow listener decides win/lose","tier":"domain","scope":"external","payloadSchema":[{"name":"tickets","type":"number","required":true},{"name":"tokens","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_7R5VSPTR5VC2XY299C1B3HT949","name":"Initialize"},{"key":"PLAY_MACHINE","id":"evt_3JFTYMZ3V5HXJMDG869PD4D4XW","name":"Play Machine","payloadSchema":[{"name":"machineId","type":"string"},{"name":"x","type":"number"},{"name":"z","type":"number"}],"listened":true},{"key":"RESTART","id":"evt_ZRF3DA62G1180YZ742ZY9VW1HW","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"BURST","id":"evt_3TQ4F13Z3MZHTEF8WHNV8KCPRZ","name":"Burst","description":"Payout (or dud) particle spawned at the played machine's tile; 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":"SCORE_CHANGED","id":"evt_EA9N37C6J9394Q45RRWQYENXYP","name":"Score Changed","description":"Tickets + tokens after this play; a flow listener decides win/lose","tier":"domain","payloadSchema":[{"name":"tickets","type":"number","required":true},{"name":"tokens","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_7R5VSPTR5VC2XY299C1B3HT949","effects":[["set","@entity.tokens","@config.startTokens"],["set","@entity.tickets",0],["set","@entity.machines","@config.machines"],["set","@entity.lastRoll",0],["set","@entity.playCount",0]]},{"from":"active","to":"active","event":"PLAY_MACHINE","eventId":"evt_3JFTYMZ3V5HXJMDG869PD4D4XW","guard":["and","@config.running",["and",[">","@entity.tokens",0],[">",["array/len",["array/filter","@entity.machines",["fn","m",["==","@m.id","@payload.machineId"]]]],0]]],"effects":[["let",[["roll",["math/random"]]],["let",[["payout",["+","@config.minPayout",["math/floor",["*","@roll",["+",1,["-","@config.maxPayout","@config.minPayout"]]]]]]],["do",["set","@entity.tokens",["-","@entity.tokens",1]],["set","@entity.playCount",["+","@entity.playCount",1]],["set","@entity.lastRoll","@roll"],["set","@entity.tickets",["+","@entity.tickets","@payout"]],["emit","BURST",{"particles":["array/map",["array/filter","@entity.machines",["fn","m",["==","@m.id","@payload.machineId"]]],["fn","m",{"id":["str/concat","fx-play-","@entity.playCount"],"type":["if",[">","@payout",0],"score","info"],"x":"@payload.x","z":"@payload.z","message":["if",[">","@payout",0],["str/concat","+","@payout"," ticket(s)"],"no luck"],"ttl":3}]]}],["emit","SCORE_CHANGED",{"tickets":"@entity.tickets","tokens":"@entity.tokens"}]]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_ZRF3DA62G1180YZ742ZY9VW1HW","effects":[["set","@entity.tokens","@config.startTokens"],["set","@entity.tickets",0],["set","@entity.machines","@config.machines"],["set","@entity.lastRoll",0],["set","@entity.playCount",0]]}]},"config":{"minPayout":{"type":"number","default":0,"label":"Min Payout","description":"Lowest ticket payout a single play can award","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, PLAY_MACHINE intents are applied; toggle to freeze the economy","tier":"domain"},"machines":{"type":"[Machine]","default":[],"label":"Machines","description":"Playable machine ids the PLAY_MACHINE intent is validated against","tier":"domain","items":{"type":"object","properties":{"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true},"type":{"name":"type","type":"string","required":true},"id":{"name":"id","type":"string","required":true}}}},"startTokens":{"type":"number","default":14,"label":"Start Tokens","description":"Tokens the player starts with","tier":"domain"},"maxPayout":{"type":"number","default":1,"label":"Max Payout","description":"Highest ticket payout a single play can award","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"ArcadePlayPage","id":"pag_BWXBMCYDG76R3S5GWJP5DBW918","path":"/arcade-play","traits":[{"ref":"ArcadePlay","refId":"trt_HBA3QVAGQV8BXTWSBNTZYGJRSY"}]}],"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}],"Machine":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"type","type":"string","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_1YXRVY956PJKBAKK1NPASS6W0F":{"id":"ent_1YXRVY956PJKBAKK1NPASS6W0F","kind":"entity","bakedName":"ArcadePlayData","curName":"ArcadePlayData","renames":[],"owner":"workspace"},"evt_3JFTYMZ3V5HXJMDG869PD4D4XW":{"id":"evt_3JFTYMZ3V5HXJMDG869PD4D4XW","kind":"event","bakedName":"PLAY_MACHINE","curName":"PLAY_MACHINE","renames":[],"owner":"workspace","parent":"trt_HBA3QVAGQV8BXTWSBNTZYGJRSY"},"evt_3TQ4F13Z3MZHTEF8WHNV8KCPRZ":{"id":"evt_3TQ4F13Z3MZHTEF8WHNV8KCPRZ","kind":"event","bakedName":"BURST","curName":"BURST","renames":[],"owner":"workspace","parent":"trt_HBA3QVAGQV8BXTWSBNTZYGJRSY"},"evt_7R5VSPTR5VC2XY299C1B3HT949":{"id":"evt_7R5VSPTR5VC2XY299C1B3HT949","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_HBA3QVAGQV8BXTWSBNTZYGJRSY"},"evt_EA9N37C6J9394Q45RRWQYENXYP":{"id":"evt_EA9N37C6J9394Q45RRWQYENXYP","kind":"event","bakedName":"SCORE_CHANGED","curName":"SCORE_CHANGED","renames":[],"owner":"workspace","parent":"trt_HBA3QVAGQV8BXTWSBNTZYGJRSY"},"evt_ZRF3DA62G1180YZ742ZY9VW1HW":{"id":"evt_ZRF3DA62G1180YZ742ZY9VW1HW","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_HBA3QVAGQV8BXTWSBNTZYGJRSY"},"orb_8DXKW20HV28XHBWP9W0NV989XS":{"id":"orb_8DXKW20HV28XHBWP9W0NV989XS","kind":"orbital","bakedName":"ArcadePlayOrbital","curName":"ArcadePlayOrbital","renames":[],"owner":"workspace"},"pag_BWXBMCYDG76R3S5GWJP5DBW918":{"id":"pag_BWXBMCYDG76R3S5GWJP5DBW918","kind":"page","bakedName":"ArcadePlayPage","curName":"ArcadePlayPage","renames":[],"owner":"workspace"},"trt_HBA3QVAGQV8BXTWSBNTZYGJRSY":{"id":"trt_HBA3QVAGQV8BXTWSBNTZYGJRSY","kind":"trait","bakedName":"ArcadePlay","curName":"ArcadePlay","renames":[],"owner":"workspace"}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"std-area-fill","version":"1.0.0","description":"Headless area-fill mechanic: the player paints area under a curve by moving through a fill region. Listens BODY_MOVED and, per fill, accumulates height(x) × |dx| while the player is inside the fill's x-range (the per-tick step is clamped to 0.5 world units — the physical per-tick maximum — so teleports and respawns paint nothing) — height is linear interpolation of the config curve samples above the fill's baseline (the platformer body's leftSamp/rightSamp idiom). rateMode picks the rate: \"area\" (height × |dx|, default — fills fastest where the curve is tallest), \"speed\" (|dx| only, flat rate), or \"ride\" (|dx| only while the move reports skating — walking the same distance paints nothing). When a fill's filled reaches its target it flips reported and emits AREA_FILLED once (the shared entity carries the rest); each fill also stamps a frontier (x0 + span × min(1, filled/target)) so boards can shade the painted region left-to-right as the gauge grows. RESTART resets every live fill (re-arming the live entity set, so SET_FILLS-injected fills survive respawns). SET_FILLS replaces the fill set at runtime for boards that import their fills. Renders nothing; boards shade the painted region and read filled/frontier from the shared entity (the render authority).","orbitals":[{"name":"AreaFillOrbital","id":"orb_HQV1Z44Y2PF1B2FBZVV07AE1V2","entity":{"name":"AreaFillData","id":"ent_CKVF2RVRJ9W94QR65SKN6AFWMC","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"fills","type":"array","default":[],"items":{"type":"object","properties":{"hint":{"name":"hint","type":"string","required":false},"rateMode":{"name":"rateMode","type":"string","required":false},"id":{"name":"id","type":"string","required":true},"filled":{"name":"filled","type":"number","required":false},"target":{"name":"target","type":"number","required":true},"x1":{"name":"x1","type":"number","required":true},"samples":{"name":"samples","type":"array","required":true,"items":{"type":"object","properties":{"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true}}}},"frontier":{"name":"frontier","type":"number","required":false},"x0":{"name":"x0","type":"number","required":true},"reported":{"name":"reported","type":"boolean","required":false},"baseline":{"name":"baseline","type":"number","required":true}}}},{"name":"lastX","type":"number","default":0}],"shared":true},"traits":[{"name":"AreaFill","id":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y","entityRebindable":true,"entityContract":{"requires":[],"provides":["fills","lastX"]},"effectRow":[{"kind":"emit","resource":"AREA_FILLED"},{"kind":"set","resource":"@entity.fills"},{"kind":"set","resource":"@entity.lastX"}],"category":"lifecycle","linkedEntity":"AreaFillData","linkedEntityId":"ent_CKVF2RVRJ9W94QR65SKN6AFWMC","entityRefIds":{"AreaFillData":"ent_CKVF2RVRJ9W94QR65SKN6AFWMC"},"emits":[{"event":"AREA_FILLED","eventId":"evt_RYNMA56B535JHGJ2TQQNFK48Z3","description":"A fill's painted area reached its target (x, y = the player's position at completion, for burst placement). When several fills complete on one move, the first reports and the shared entity carries the rest.","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_N7548AHERHQC8TEMAKRC5Y9H07","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_5APA2H5603K01GP0VFJ49MXR96","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_FILLS","id":"evt_NJGK40Z47EJ3Q1AHVKSZ5TFWX3","name":"Set Fills","payloadSchema":[{"name":"fills","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"baseline","type":"number","required":true},{"name":"target","type":"number","required":true},{"name":"rateMode","type":"string"},{"name":"hint","type":"string"},{"name":"samples","type":"[object]","required":true,"properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"filled","type":"number"},{"name":"frontier","type":"number"},{"name":"reported","type":"boolean"}]}],"listened":true},{"key":"RESTART","id":"evt_PWN6XZ8AWG5E80G7HGAV7KZ691","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"AREA_FILLED","id":"evt_RYNMA56B535JHGJ2TQQNFK48Z3","name":"Area Filled","description":"A fill's painted area reached its target (x, y = the player's position at completion, for burst placement). When several fills complete on one move, the first reports and the shared entity carries the rest.","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_N7548AHERHQC8TEMAKRC5Y9H07","effects":[["set","@entity.fills",["array/map","@config.fills",["fn","f",["object/merge","@f",{"filled":0,"frontier":["object/get","@f","x0"],"reported":false}]]]],["set","@entity.lastX",0]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_5APA2H5603K01GP0VFJ49MXR96","guard":"@config.running","effects":[["let",[["adx",["math/abs",["-","@payload.x","@entity.lastX"]]]],["set","@entity.fills",["array/map","@entity.fills",["fn","f",["let",[["inside",["and",[">=","@payload.x",["object/get","@f","x0"]],["<=","@payload.x",["object/get","@f","x1"]]]]],["let",[["leftSamp",["array/last",["array/filter",["object/get","@f","samples"],["fn","s",["<=",["object/get","@s","x"],"@payload.x"]]]]]],["let",[["rightSamp",["array/first",["array/filter",["object/get","@f","samples"],["fn","s",[">",["object/get","@s","x"],"@payload.x"]]]]]],["let",[["h",["if",["or",["==","@leftSamp",null],["==","@rightSamp",null]],0,["-",["+",["object/get","@leftSamp","y"],["*",["/",["-",["object/get","@rightSamp","y"],["object/get","@leftSamp","y"]],["-",["object/get","@rightSamp","x"],["object/get","@leftSamp","x"]]],["-","@payload.x",["object/get","@leftSamp","x"]]]],["object/get","@f","baseline"]]]]],["let",[["step",["math/min","@adx",0.5]]],["let",[["rate",["if","@inside",["if",["==",["object/get","@f","rateMode"],"ride"],["if","@payload.skating","@step",0],["if",["==",["object/get","@f","rateMode"],"speed"],"@step",["*","@step","@h"]]],0]]],["let",[["newFilled",["+",["object/get","@f","filled"],"@rate"]]],["object/merge","@f",{"filled":"@newFilled","frontier":["+",["object/get","@f","x0"],["*",["-",["object/get","@f","x1"],["object/get","@f","x0"]],["math/min",1,["/","@newFilled",["object/get","@f","target"]]]]]}]]]]]]]]]]]],["set","@entity.lastX","@payload.x"],["let",[["newly",["array/filter","@entity.fills",["fn","f",["and",[">=",["object/get","@f","filled"],["object/get","@f","target"]],["==",["object/get","@f","reported"],false]]]]]],["if",[">",["array/len","@newly"],0],["do",["set","@entity.fills",["array/map","@entity.fills",["fn","f",["if",["==",["object/get","@f","id"],["object/get",["array/first","@newly"],"id"]],["object/merge","@f",{"reported":true}],"@f"]]]],["emit","AREA_FILLED",{"id":["object/get",["array/first","@newly"],"id"],"x":"@payload.x","y":"@payload.y"}]],null]]]},{"from":"active","to":"active","event":"SET_FILLS","eventId":"evt_NJGK40Z47EJ3Q1AHVKSZ5TFWX3","effects":[["set","@entity.fills",["array/map","@payload.fills",["fn","f",["object/merge","@f",{"filled":0,"frontier":["object/get","@f","x0"],"reported":false}]]]],["set","@entity.lastX",0]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_PWN6XZ8AWG5E80G7HGAV7KZ691","effects":[["set","@entity.fills",["array/map","@entity.fills",["fn","f",["object/merge","@f",{"filled":0,"frontier":["object/get","@f","x0"],"reported":false}]]]],["set","@entity.lastX",0]]}]},"config":{"fills":{"type":"[AreaFill]","default":[],"label":"Fills","description":"One row per fill region: id, x-range (x0..x1 in world units), baseline the height is measured from, target area, rateMode (area | speed | ride — default area), optional hint, and the curve samples to interpolate. filled/frontier/reported are stamped at runtime. Seeded onto the entity on INIT; the live set is entity.fills — SET_FILLS replaces it at runtime (boards that import fills), and RESTART re-arms the live set rather than re-reading config, so injected fills survive respawns.","tier":"domain","items":{"type":"object","properties":{"id":{"name":"id","type":"string","required":true},"filled":{"name":"filled","type":"number","required":false},"target":{"name":"target","type":"number","required":true},"frontier":{"name":"frontier","type":"number","required":false},"rateMode":{"name":"rateMode","type":"string","required":false},"x0":{"name":"x0","type":"number","required":true},"samples":{"name":"samples","type":"array","required":true,"items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}}},"x1":{"name":"x1","type":"number","required":true},"reported":{"name":"reported","type":"boolean","required":false},"hint":{"name":"hint","type":"string","required":false},"baseline":{"name":"baseline","type":"number","required":true}}}},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, BODY_MOVED paints every fill the player moves through; toggle to freeze every fill as-is.","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"AreaFillPage","id":"pag_EV6JZ71N02TG1998HXTSQ397BF","path":"/area-fill","traits":[{"ref":"AreaFill","refId":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y"}]}],"types":{"AreaFill":[{"name":"id","type":"string","required":true},{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"baseline","type":"number","required":true},{"name":"target","type":"number","required":true},{"name":"rateMode","type":"string"},{"name":"hint","type":"string"},{"name":"samples","type":"[object]","required":true,"properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"filled","type":"number"},{"name":"frontier","type":"number"},{"name":"reported","type":"boolean"}],"AreaFillSample":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_CKVF2RVRJ9W94QR65SKN6AFWMC":{"id":"ent_CKVF2RVRJ9W94QR65SKN6AFWMC","kind":"entity","bakedName":"AreaFillData","curName":"AreaFillData","renames":[],"owner":"workspace"},"evt_5APA2H5603K01GP0VFJ49MXR96":{"id":"evt_5APA2H5603K01GP0VFJ49MXR96","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y"},"evt_N7548AHERHQC8TEMAKRC5Y9H07":{"id":"evt_N7548AHERHQC8TEMAKRC5Y9H07","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y"},"evt_NJGK40Z47EJ3Q1AHVKSZ5TFWX3":{"id":"evt_NJGK40Z47EJ3Q1AHVKSZ5TFWX3","kind":"event","bakedName":"SET_FILLS","curName":"SET_FILLS","renames":[],"owner":"workspace","parent":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y"},"evt_PWN6XZ8AWG5E80G7HGAV7KZ691":{"id":"evt_PWN6XZ8AWG5E80G7HGAV7KZ691","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y"},"evt_RYNMA56B535JHGJ2TQQNFK48Z3":{"id":"evt_RYNMA56B535JHGJ2TQQNFK48Z3","kind":"event","bakedName":"AREA_FILLED","curName":"AREA_FILLED","renames":[],"owner":"workspace","parent":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y"},"orb_HQV1Z44Y2PF1B2FBZVV07AE1V2":{"id":"orb_HQV1Z44Y2PF1B2FBZVV07AE1V2","kind":"orbital","bakedName":"AreaFillOrbital","curName":"AreaFillOrbital","renames":[],"owner":"workspace"},"pag_EV6JZ71N02TG1998HXTSQ397BF":{"id":"pag_EV6JZ71N02TG1998HXTSQ397BF","kind":"page","bakedName":"AreaFillPage","curName":"AreaFillPage","renames":[],"owner":"workspace"},"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y":{"id":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y","kind":"trait","bakedName":"AreaFill","curName":"AreaFill","renames":[],"owner":"workspace"}}}}
|
|
1
|
+
{"name":"std-area-fill","version":"1.0.0","description":"Headless area-fill mechanic: the player paints area under a curve by moving through a fill region. Listens BODY_MOVED and, per fill, accumulates height(x) × |dx| while the player is inside the fill's x-range (the per-tick step is clamped to 0.5 world units — the physical per-tick maximum — so teleports and respawns paint nothing) — height is linear interpolation of the config curve samples above the fill's baseline (the platformer body's leftSamp/rightSamp idiom). rateMode picks the rate: \"area\" (height × |dx|, default — fills fastest where the curve is tallest), \"speed\" (|dx| only, flat rate), or \"ride\" (|dx| only while the move reports skating — walking the same distance paints nothing). When a fill's filled reaches its target it flips reported and emits AREA_FILLED once (the shared entity carries the rest); each fill also stamps a frontier (x0 + span × min(1, filled/target)) so boards can shade the painted region left-to-right as the gauge grows. RESTART resets every live fill (re-arming the live entity set, so SET_FILLS-injected fills survive respawns). SET_FILLS replaces the fill set at runtime for boards that import their fills. Renders nothing; boards shade the painted region and read filled/frontier from the shared entity (the render authority).","orbitals":[{"name":"AreaFillOrbital","id":"orb_HQV1Z44Y2PF1B2FBZVV07AE1V2","entity":{"name":"AreaFillData","id":"ent_CKVF2RVRJ9W94QR65SKN6AFWMC","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"fills","type":"array","default":[],"items":{"type":"object","properties":{"filled":{"name":"filled","type":"number","required":false},"rateMode":{"name":"rateMode","type":"string","required":false},"reported":{"name":"reported","type":"boolean","required":false},"samples":{"name":"samples","type":"array","required":true,"items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}}},"x1":{"name":"x1","type":"number","required":true},"x0":{"name":"x0","type":"number","required":true},"id":{"name":"id","type":"string","required":true},"frontier":{"name":"frontier","type":"number","required":false},"target":{"name":"target","type":"number","required":true},"hint":{"name":"hint","type":"string","required":false},"baseline":{"name":"baseline","type":"number","required":true}}}},{"name":"lastX","type":"number","default":0}],"shared":true},"traits":[{"name":"AreaFill","id":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y","entityRebindable":true,"entityContract":{"requires":[],"provides":["fills","lastX"]},"effectRow":[{"kind":"emit","resource":"AREA_FILLED"},{"kind":"set","resource":"@entity.fills"},{"kind":"set","resource":"@entity.lastX"}],"category":"lifecycle","linkedEntity":"AreaFillData","linkedEntityId":"ent_CKVF2RVRJ9W94QR65SKN6AFWMC","entityRefIds":{"AreaFillData":"ent_CKVF2RVRJ9W94QR65SKN6AFWMC"},"emits":[{"event":"AREA_FILLED","eventId":"evt_RYNMA56B535JHGJ2TQQNFK48Z3","description":"A fill's painted area reached its target (x, y = the player's position at completion, for burst placement). When several fills complete on one move, the first reports and the shared entity carries the rest.","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_N7548AHERHQC8TEMAKRC5Y9H07","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_5APA2H5603K01GP0VFJ49MXR96","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_FILLS","id":"evt_NJGK40Z47EJ3Q1AHVKSZ5TFWX3","name":"Set Fills","payloadSchema":[{"name":"fills","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"baseline","type":"number","required":true},{"name":"target","type":"number","required":true},{"name":"rateMode","type":"string"},{"name":"hint","type":"string"},{"name":"samples","type":"[object]","required":true,"properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"filled","type":"number"},{"name":"frontier","type":"number"},{"name":"reported","type":"boolean"}]}],"listened":true},{"key":"RESTART","id":"evt_PWN6XZ8AWG5E80G7HGAV7KZ691","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"AREA_FILLED","id":"evt_RYNMA56B535JHGJ2TQQNFK48Z3","name":"Area Filled","description":"A fill's painted area reached its target (x, y = the player's position at completion, for burst placement). When several fills complete on one move, the first reports and the shared entity carries the rest.","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_N7548AHERHQC8TEMAKRC5Y9H07","effects":[["set","@entity.fills",["array/map","@config.fills",["fn","f",["object/merge","@f",{"filled":0,"frontier":["object/get","@f","x0"],"reported":false}]]]],["set","@entity.lastX",0]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_5APA2H5603K01GP0VFJ49MXR96","guard":"@config.running","effects":[["let",[["adx",["math/abs",["-","@payload.x","@entity.lastX"]]]],["set","@entity.fills",["array/map","@entity.fills",["fn","f",["let",[["inside",["and",[">=","@payload.x",["object/get","@f","x0"]],["<=","@payload.x",["object/get","@f","x1"]]]]],["let",[["leftSamp",["array/last",["array/filter",["object/get","@f","samples"],["fn","s",["<=",["object/get","@s","x"],"@payload.x"]]]]]],["let",[["rightSamp",["array/first",["array/filter",["object/get","@f","samples"],["fn","s",[">",["object/get","@s","x"],"@payload.x"]]]]]],["let",[["h",["if",["or",["==","@leftSamp",null],["==","@rightSamp",null]],0,["-",["+",["object/get","@leftSamp","y"],["*",["/",["-",["object/get","@rightSamp","y"],["object/get","@leftSamp","y"]],["-",["object/get","@rightSamp","x"],["object/get","@leftSamp","x"]]],["-","@payload.x",["object/get","@leftSamp","x"]]]],["object/get","@f","baseline"]]]]],["let",[["step",["math/min","@adx",0.5]]],["let",[["rate",["if","@inside",["if",["==",["object/get","@f","rateMode"],"ride"],["if","@payload.skating","@step",0],["if",["==",["object/get","@f","rateMode"],"speed"],"@step",["*","@step","@h"]]],0]]],["let",[["newFilled",["+",["object/get","@f","filled"],"@rate"]]],["object/merge","@f",{"filled":"@newFilled","frontier":["+",["object/get","@f","x0"],["*",["-",["object/get","@f","x1"],["object/get","@f","x0"]],["math/min",1,["/","@newFilled",["object/get","@f","target"]]]]]}]]]]]]]]]]]],["set","@entity.lastX","@payload.x"],["let",[["newly",["array/filter","@entity.fills",["fn","f",["and",[">=",["object/get","@f","filled"],["object/get","@f","target"]],["==",["object/get","@f","reported"],false]]]]]],["if",[">",["array/len","@newly"],0],["do",["set","@entity.fills",["array/map","@entity.fills",["fn","f",["if",["==",["object/get","@f","id"],["object/get",["array/first","@newly"],"id"]],["object/merge","@f",{"reported":true}],"@f"]]]],["emit","AREA_FILLED",{"id":["object/get",["array/first","@newly"],"id"],"x":"@payload.x","y":"@payload.y"}]],null]]]},{"from":"active","to":"active","event":"SET_FILLS","eventId":"evt_NJGK40Z47EJ3Q1AHVKSZ5TFWX3","effects":[["set","@entity.fills",["array/map","@payload.fills",["fn","f",["object/merge","@f",{"filled":0,"frontier":["object/get","@f","x0"],"reported":false}]]]],["set","@entity.lastX",0]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_PWN6XZ8AWG5E80G7HGAV7KZ691","effects":[["set","@entity.fills",["array/map","@entity.fills",["fn","f",["object/merge","@f",{"filled":0,"frontier":["object/get","@f","x0"],"reported":false}]]]],["set","@entity.lastX",0]]}]},"config":{"fills":{"type":"[AreaFill]","default":[],"label":"Fills","description":"One row per fill region: id, x-range (x0..x1 in world units), baseline the height is measured from, target area, rateMode (area | speed | ride — default area), optional hint, and the curve samples to interpolate. filled/frontier/reported are stamped at runtime. Seeded onto the entity on INIT; the live set is entity.fills — SET_FILLS replaces it at runtime (boards that import fills), and RESTART re-arms the live set rather than re-reading config, so injected fills survive respawns.","tier":"domain","items":{"type":"object","properties":{"x1":{"name":"x1","type":"number","required":true},"hint":{"name":"hint","type":"string","required":false},"frontier":{"name":"frontier","type":"number","required":false},"id":{"name":"id","type":"string","required":true},"rateMode":{"name":"rateMode","type":"string","required":false},"samples":{"name":"samples","type":"array","required":true,"items":{"type":"object","properties":{"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true}}}},"x0":{"name":"x0","type":"number","required":true},"reported":{"name":"reported","type":"boolean","required":false},"filled":{"name":"filled","type":"number","required":false},"target":{"name":"target","type":"number","required":true},"baseline":{"name":"baseline","type":"number","required":true}}}},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, BODY_MOVED paints every fill the player moves through; toggle to freeze every fill as-is.","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"AreaFillPage","id":"pag_EV6JZ71N02TG1998HXTSQ397BF","path":"/area-fill","traits":[{"ref":"AreaFill","refId":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y"}]}],"types":{"AreaFill":[{"name":"id","type":"string","required":true},{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"baseline","type":"number","required":true},{"name":"target","type":"number","required":true},{"name":"rateMode","type":"string"},{"name":"hint","type":"string"},{"name":"samples","type":"[object]","required":true,"properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"filled","type":"number"},{"name":"frontier","type":"number"},{"name":"reported","type":"boolean"}],"AreaFillSample":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_CKVF2RVRJ9W94QR65SKN6AFWMC":{"id":"ent_CKVF2RVRJ9W94QR65SKN6AFWMC","kind":"entity","bakedName":"AreaFillData","curName":"AreaFillData","renames":[],"owner":"workspace"},"evt_5APA2H5603K01GP0VFJ49MXR96":{"id":"evt_5APA2H5603K01GP0VFJ49MXR96","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y"},"evt_N7548AHERHQC8TEMAKRC5Y9H07":{"id":"evt_N7548AHERHQC8TEMAKRC5Y9H07","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y"},"evt_NJGK40Z47EJ3Q1AHVKSZ5TFWX3":{"id":"evt_NJGK40Z47EJ3Q1AHVKSZ5TFWX3","kind":"event","bakedName":"SET_FILLS","curName":"SET_FILLS","renames":[],"owner":"workspace","parent":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y"},"evt_PWN6XZ8AWG5E80G7HGAV7KZ691":{"id":"evt_PWN6XZ8AWG5E80G7HGAV7KZ691","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y"},"evt_RYNMA56B535JHGJ2TQQNFK48Z3":{"id":"evt_RYNMA56B535JHGJ2TQQNFK48Z3","kind":"event","bakedName":"AREA_FILLED","curName":"AREA_FILLED","renames":[],"owner":"workspace","parent":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y"},"orb_HQV1Z44Y2PF1B2FBZVV07AE1V2":{"id":"orb_HQV1Z44Y2PF1B2FBZVV07AE1V2","kind":"orbital","bakedName":"AreaFillOrbital","curName":"AreaFillOrbital","renames":[],"owner":"workspace"},"pag_EV6JZ71N02TG1998HXTSQ397BF":{"id":"pag_EV6JZ71N02TG1998HXTSQ397BF","kind":"page","bakedName":"AreaFillPage","curName":"AreaFillPage","renames":[],"owner":"workspace"},"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y":{"id":"trt_P285ZA5ZA8ZN4E3QATFZC2T74Y","kind":"trait","bakedName":"AreaFill","curName":"AreaFill","renames":[],"owner":"workspace"}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"std-audio-cue","version":"1.0.0","description":"Headless-ish sound driver: the SOLE writer of cue/cueSeq/music/muted/volume, rendered through the game-audio-cue atom which mounts @almadar/ui's useGameAudio hook. Intents: CUE plays a one-shot SFX by manifest key (cueSeq increments so the same key can re-fire), MUSIC crossfades to a looping track by key, STOP_MUSIC fades it out, MUTE/UNMUTE/TOGGLE_MUTE flip playback and emit AUDIO_MUTED, SET_VOLUME sets master volume, RESTART reseeds from config. The manifest and baseUrl are config, not runtime state — swap them per game by rebinding this atom's config, never by hand-authoring a second audio layer.","orbitals":[{"name":"AudioCueOrbital","id":"orb_028D8K5AXRNEWED9HSRH0T4NQ8","entity":{"name":"AudioState","id":"ent_1KBVJ5EH878M3HPXTJYY20AT44","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"cue","type":"string","default":""},{"name":"cueSeq","type":"number","default":0},{"name":"music","type":"string","default":""},{"name":"muted","type":"boolean","default":false},{"name":"volume","type":"number","default":1}],"shared":true},"traits":[{"name":"AudioCue","id":"trt_FFX8X9F002G01882EX317T38VC","entityRebindable":true,"entityContract":{"requires":[],"provides":["cue","cueSeq","music","muted","volume"]},"effectRow":[{"kind":"emit","resource":"AUDIO_MUTED"},{"kind":"render-ui","resource":"main"},{"kind":"set","resource":"@entity.cue"},{"kind":"set","resource":"@entity.cueSeq"},{"kind":"set","resource":"@entity.music"},{"kind":"set","resource":"@entity.muted"},{"kind":"set","resource":"@entity.volume"}],"category":"lifecycle","linkedEntity":"AudioState","linkedEntityId":"ent_1KBVJ5EH878M3HPXTJYY20AT44","entityRefIds":{"AudioState":"ent_1KBVJ5EH878M3HPXTJYY20AT44"},"emits":[{"event":"AUDIO_MUTED","eventId":"evt_NXWH6Y03J41S2F408VMDJWW35R","description":"Mute state changed via MUTE/UNMUTE/TOGGLE_MUTE.","synonyms":"mute-changed, sound-toggled","tier":"domain","scope":"external","payloadSchema":[{"name":"muted","type":"boolean","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_DF6D751E6MQ3A5MWHXVT726ZPS","name":"Initialize"},{"key":"CUE","id":"evt_SJPH26W4ZD2FPTDTA84ERK5NT3","name":"Cue","description":"Play a one-shot SFX by manifest key; re-fires even when key repeats.","tier":"domain","payloadSchema":[{"name":"key","type":"string","required":true}],"listened":true},{"key":"MUSIC","id":"evt_40EX4RPF4N7JAXDKFX3HWEK9XE","name":"Music","description":"Crossfade to a looping background track by manifest key.","tier":"domain","payloadSchema":[{"name":"key","type":"string","required":true}],"listened":true},{"key":"STOP_MUSIC","id":"evt_TFQVF5JSQXCVYSH9GFD2N16WXF","name":"Stop Music","description":"Fade out and stop the current music.","tier":"domain","listened":true},{"key":"MUTE","id":"evt_TQHSRJ0N4MAJA8K9XAED3S1SNM","name":"Mute","description":"Mute all playback.","tier":"domain","listened":true},{"key":"UNMUTE","id":"evt_ESXXT9T8J2491FFYSG1KFVH3YE","name":"Unmute","description":"Unmute playback.","tier":"domain","listened":true},{"key":"TOGGLE_MUTE","id":"evt_87J89SS9XHMYRX6Q8BHNASFJ9B","name":"Toggle Mute","description":"Flip the current mute state.","tier":"domain","listened":true},{"key":"SET_VOLUME","id":"evt_DYDH6HJ1NW0TYF0TRYY0KBS9ES","name":"Set Volume","description":"Set master volume 0-1.","tier":"domain","payloadSchema":[{"name":"volume","type":"number","required":true}],"listened":true},{"key":"RESTART","id":"evt_J9N2QGT19D0MPY00RARRWP1E02","name":"Restart","description":"Reseed cue/music/muted/volume from config.","tier":"domain","listened":true},{"key":"AUDIO_MUTED","id":"evt_NXWH6Y03J41S2F408VMDJWW35R","name":"Audio Muted","description":"Mute state changed via MUTE/UNMUTE/TOGGLE_MUTE.","synonyms":"mute-changed, sound-toggled","tier":"domain","payloadSchema":[{"name":"muted","type":"boolean","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_DF6D751E6MQ3A5MWHXVT726ZPS","effects":[["set","@entity.cue",""],["set","@entity.cueSeq",0],["set","@entity.music","@config.initialMusic"],["set","@entity.muted","@config.initialMuted"],["set","@entity.volume","@config.initialVolume"],["render-ui","main",{"cue":"@entity.cue","cueSeq":"@entity.cueSeq","music":"@entity.music","muted":"@entity.muted","volume":"@entity.volume","manifest":"@config.manifest","baseUrl":"@config.baseUrl","type":"game-audio-cue"}]]},{"from":"active","to":"active","event":"CUE","eventId":"evt_SJPH26W4ZD2FPTDTA84ERK5NT3","effects":[["set","@entity.cue","@payload.key"],["set","@entity.cueSeq",["+","@entity.cueSeq",1]]]},{"from":"active","to":"active","event":"MUSIC","eventId":"evt_40EX4RPF4N7JAXDKFX3HWEK9XE","effects":[["set","@entity.music","@payload.key"]]},{"from":"active","to":"active","event":"STOP_MUSIC","eventId":"evt_TFQVF5JSQXCVYSH9GFD2N16WXF","effects":[["set","@entity.music",""]]},{"from":"active","to":"active","event":"MUTE","eventId":"evt_TQHSRJ0N4MAJA8K9XAED3S1SNM","effects":[["set","@entity.muted",true],["emit","AUDIO_MUTED",{"muted":true}]]},{"from":"active","to":"active","event":"UNMUTE","eventId":"evt_ESXXT9T8J2491FFYSG1KFVH3YE","effects":[["set","@entity.muted",false],["emit","AUDIO_MUTED",{"muted":false}]]},{"from":"active","to":"active","event":"TOGGLE_MUTE","eventId":"evt_87J89SS9XHMYRX6Q8BHNASFJ9B","effects":[["set","@entity.muted",["not","@entity.muted"]],["emit","AUDIO_MUTED",{"muted":"@entity.muted"}]]},{"from":"active","to":"active","event":"SET_VOLUME","eventId":"evt_DYDH6HJ1NW0TYF0TRYY0KBS9ES","effects":[["set","@entity.volume","@payload.volume"]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_J9N2QGT19D0MPY00RARRWP1E02","effects":[["set","@entity.cue",""],["set","@entity.cueSeq",0],["set","@entity.music","@config.initialMusic"],["set","@entity.muted","@config.initialMuted"],["set","@entity.volume","@config.initialVolume"]]}]},"config":{"initialMusic":{"type":"string","default":"","label":"Initial Music","description":"Manifest key auto-played as looping music on INIT/RESTART; empty plays none.","tier":"presentation"},"initialMuted":{"type":"boolean","default":false,"label":"Initial Muted","description":"Muted state seeded on INIT/RESTART.","tier":"presentation"},"initialVolume":{"type":"number","default":1,"label":"Initial Volume","description":"Master volume 0-1 seeded on INIT/RESTART.","tier":"presentation"},"manifest":{"type":"Map<string,SoundEntry>","default":{},"label":"Manifest","description":"Sound definitions keyed by logical name — path(s), volume, loop, pooling, autostart, crossfade.","tier":"domain","items":{"type":"object","properties":{"autostart":{"name":"autostart","type":"boolean","required":false},"poolSize":{"name":"poolSize","type":"number","required":false},"crossfade":{"name":"crossfade","type":"boolean","required":false},"crossfadeDurationMs":{"name":"crossfadeDurationMs","type":"number","required":false},"volume":{"name":"volume","type":"number","required":false},"loop":{"name":"loop","type":"boolean","required":false},"path":{"name":"path","type":"string","required":false}}}},"baseUrl":{"type":"string","default":"","label":"Base Url","description":"Prefix prepended to every manifest path.","tier":"infra"}},"scope":"instance"}],"pages":[{"name":"AudioCuePage","id":"pag_Y79570MBXY5YZ1XW9JZJ6T02P0","path":"/audio-cue","traits":[{"ref":"AudioCue","refId":"trt_FFX8X9F002G01882EX317T38VC"}]}],"types":{"SoundEntry":[{"name":"path","type":"string"},{"name":"volume","type":"number"},{"name":"loop","type":"boolean"},{"name":"poolSize","type":"number"},{"name":"autostart","type":"boolean"},{"name":"crossfade","type":"boolean"},{"name":"crossfadeDurationMs","type":"number"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_1KBVJ5EH878M3HPXTJYY20AT44":{"id":"ent_1KBVJ5EH878M3HPXTJYY20AT44","kind":"entity","bakedName":"AudioState","curName":"AudioState","renames":[],"owner":"workspace"},"evt_40EX4RPF4N7JAXDKFX3HWEK9XE":{"id":"evt_40EX4RPF4N7JAXDKFX3HWEK9XE","kind":"event","bakedName":"MUSIC","curName":"MUSIC","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_87J89SS9XHMYRX6Q8BHNASFJ9B":{"id":"evt_87J89SS9XHMYRX6Q8BHNASFJ9B","kind":"event","bakedName":"TOGGLE_MUTE","curName":"TOGGLE_MUTE","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_DF6D751E6MQ3A5MWHXVT726ZPS":{"id":"evt_DF6D751E6MQ3A5MWHXVT726ZPS","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_DYDH6HJ1NW0TYF0TRYY0KBS9ES":{"id":"evt_DYDH6HJ1NW0TYF0TRYY0KBS9ES","kind":"event","bakedName":"SET_VOLUME","curName":"SET_VOLUME","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_ESXXT9T8J2491FFYSG1KFVH3YE":{"id":"evt_ESXXT9T8J2491FFYSG1KFVH3YE","kind":"event","bakedName":"UNMUTE","curName":"UNMUTE","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_J9N2QGT19D0MPY00RARRWP1E02":{"id":"evt_J9N2QGT19D0MPY00RARRWP1E02","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_NXWH6Y03J41S2F408VMDJWW35R":{"id":"evt_NXWH6Y03J41S2F408VMDJWW35R","kind":"event","bakedName":"AUDIO_MUTED","curName":"AUDIO_MUTED","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_SJPH26W4ZD2FPTDTA84ERK5NT3":{"id":"evt_SJPH26W4ZD2FPTDTA84ERK5NT3","kind":"event","bakedName":"CUE","curName":"CUE","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_TFQVF5JSQXCVYSH9GFD2N16WXF":{"id":"evt_TFQVF5JSQXCVYSH9GFD2N16WXF","kind":"event","bakedName":"STOP_MUSIC","curName":"STOP_MUSIC","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_TQHSRJ0N4MAJA8K9XAED3S1SNM":{"id":"evt_TQHSRJ0N4MAJA8K9XAED3S1SNM","kind":"event","bakedName":"MUTE","curName":"MUTE","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"orb_028D8K5AXRNEWED9HSRH0T4NQ8":{"id":"orb_028D8K5AXRNEWED9HSRH0T4NQ8","kind":"orbital","bakedName":"AudioCueOrbital","curName":"AudioCueOrbital","renames":[],"owner":"workspace"},"pag_Y79570MBXY5YZ1XW9JZJ6T02P0":{"id":"pag_Y79570MBXY5YZ1XW9JZJ6T02P0","kind":"page","bakedName":"AudioCuePage","curName":"AudioCuePage","renames":[],"owner":"workspace"},"trt_FFX8X9F002G01882EX317T38VC":{"id":"trt_FFX8X9F002G01882EX317T38VC","kind":"trait","bakedName":"AudioCue","curName":"AudioCue","renames":[],"owner":"workspace"}}}}
|
|
1
|
+
{"name":"std-audio-cue","version":"1.0.0","description":"Headless-ish sound driver: the SOLE writer of cue/cueSeq/music/muted/volume, rendered through the game-audio-cue atom which mounts @almadar/ui's useGameAudio hook. Intents: CUE plays a one-shot SFX by manifest key (cueSeq increments so the same key can re-fire), MUSIC crossfades to a looping track by key, STOP_MUSIC fades it out, MUTE/UNMUTE/TOGGLE_MUTE flip playback and emit AUDIO_MUTED, SET_VOLUME sets master volume, RESTART reseeds from config. The manifest and baseUrl are config, not runtime state — swap them per game by rebinding this atom's config, never by hand-authoring a second audio layer.","orbitals":[{"name":"AudioCueOrbital","id":"orb_028D8K5AXRNEWED9HSRH0T4NQ8","entity":{"name":"AudioState","id":"ent_1KBVJ5EH878M3HPXTJYY20AT44","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"cue","type":"string","default":""},{"name":"cueSeq","type":"number","default":0},{"name":"music","type":"string","default":""},{"name":"muted","type":"boolean","default":false},{"name":"volume","type":"number","default":1}],"shared":true},"traits":[{"name":"AudioCue","id":"trt_FFX8X9F002G01882EX317T38VC","entityRebindable":true,"entityContract":{"requires":[],"provides":["cue","cueSeq","music","muted","volume"]},"effectRow":[{"kind":"emit","resource":"AUDIO_MUTED"},{"kind":"render-ui","resource":"main"},{"kind":"set","resource":"@entity.cue"},{"kind":"set","resource":"@entity.cueSeq"},{"kind":"set","resource":"@entity.music"},{"kind":"set","resource":"@entity.muted"},{"kind":"set","resource":"@entity.volume"}],"category":"lifecycle","linkedEntity":"AudioState","linkedEntityId":"ent_1KBVJ5EH878M3HPXTJYY20AT44","entityRefIds":{"AudioState":"ent_1KBVJ5EH878M3HPXTJYY20AT44"},"emits":[{"event":"AUDIO_MUTED","eventId":"evt_NXWH6Y03J41S2F408VMDJWW35R","description":"Mute state changed via MUTE/UNMUTE/TOGGLE_MUTE.","synonyms":"mute-changed, sound-toggled","tier":"domain","scope":"external","payloadSchema":[{"name":"muted","type":"boolean","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_DF6D751E6MQ3A5MWHXVT726ZPS","name":"Initialize"},{"key":"CUE","id":"evt_SJPH26W4ZD2FPTDTA84ERK5NT3","name":"Cue","description":"Play a one-shot SFX by manifest key; re-fires even when key repeats.","tier":"domain","payloadSchema":[{"name":"key","type":"string","required":true}],"listened":true},{"key":"MUSIC","id":"evt_40EX4RPF4N7JAXDKFX3HWEK9XE","name":"Music","description":"Crossfade to a looping background track by manifest key.","tier":"domain","payloadSchema":[{"name":"key","type":"string","required":true}],"listened":true},{"key":"STOP_MUSIC","id":"evt_TFQVF5JSQXCVYSH9GFD2N16WXF","name":"Stop Music","description":"Fade out and stop the current music.","tier":"domain","listened":true},{"key":"MUTE","id":"evt_TQHSRJ0N4MAJA8K9XAED3S1SNM","name":"Mute","description":"Mute all playback.","tier":"domain","listened":true},{"key":"UNMUTE","id":"evt_ESXXT9T8J2491FFYSG1KFVH3YE","name":"Unmute","description":"Unmute playback.","tier":"domain","listened":true},{"key":"TOGGLE_MUTE","id":"evt_87J89SS9XHMYRX6Q8BHNASFJ9B","name":"Toggle Mute","description":"Flip the current mute state.","tier":"domain","listened":true},{"key":"SET_VOLUME","id":"evt_DYDH6HJ1NW0TYF0TRYY0KBS9ES","name":"Set Volume","description":"Set master volume 0-1.","tier":"domain","payloadSchema":[{"name":"volume","type":"number","required":true}],"listened":true},{"key":"RESTART","id":"evt_J9N2QGT19D0MPY00RARRWP1E02","name":"Restart","description":"Reseed cue/music/muted/volume from config.","tier":"domain","listened":true},{"key":"AUDIO_MUTED","id":"evt_NXWH6Y03J41S2F408VMDJWW35R","name":"Audio Muted","description":"Mute state changed via MUTE/UNMUTE/TOGGLE_MUTE.","synonyms":"mute-changed, sound-toggled","tier":"domain","payloadSchema":[{"name":"muted","type":"boolean","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_DF6D751E6MQ3A5MWHXVT726ZPS","effects":[["set","@entity.cue",""],["set","@entity.cueSeq",0],["set","@entity.music","@config.initialMusic"],["set","@entity.muted","@config.initialMuted"],["set","@entity.volume","@config.initialVolume"],["render-ui","main",{"cue":"@entity.cue","cueSeq":"@entity.cueSeq","music":"@entity.music","muted":"@entity.muted","volume":"@entity.volume","manifest":"@config.manifest","baseUrl":"@config.baseUrl","type":"game-audio-cue"}]]},{"from":"active","to":"active","event":"CUE","eventId":"evt_SJPH26W4ZD2FPTDTA84ERK5NT3","effects":[["set","@entity.cue","@payload.key"],["set","@entity.cueSeq",["+","@entity.cueSeq",1]]]},{"from":"active","to":"active","event":"MUSIC","eventId":"evt_40EX4RPF4N7JAXDKFX3HWEK9XE","effects":[["set","@entity.music","@payload.key"]]},{"from":"active","to":"active","event":"STOP_MUSIC","eventId":"evt_TFQVF5JSQXCVYSH9GFD2N16WXF","effects":[["set","@entity.music",""]]},{"from":"active","to":"active","event":"MUTE","eventId":"evt_TQHSRJ0N4MAJA8K9XAED3S1SNM","effects":[["set","@entity.muted",true],["emit","AUDIO_MUTED",{"muted":true}]]},{"from":"active","to":"active","event":"UNMUTE","eventId":"evt_ESXXT9T8J2491FFYSG1KFVH3YE","effects":[["set","@entity.muted",false],["emit","AUDIO_MUTED",{"muted":false}]]},{"from":"active","to":"active","event":"TOGGLE_MUTE","eventId":"evt_87J89SS9XHMYRX6Q8BHNASFJ9B","effects":[["set","@entity.muted",["not","@entity.muted"]],["emit","AUDIO_MUTED",{"muted":"@entity.muted"}]]},{"from":"active","to":"active","event":"SET_VOLUME","eventId":"evt_DYDH6HJ1NW0TYF0TRYY0KBS9ES","effects":[["set","@entity.volume","@payload.volume"]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_J9N2QGT19D0MPY00RARRWP1E02","effects":[["set","@entity.cue",""],["set","@entity.cueSeq",0],["set","@entity.music","@config.initialMusic"],["set","@entity.muted","@config.initialMuted"],["set","@entity.volume","@config.initialVolume"]]}]},"config":{"initialMuted":{"type":"boolean","default":false,"label":"Initial Muted","description":"Muted state seeded on INIT/RESTART.","tier":"presentation"},"baseUrl":{"type":"string","default":"","label":"Base Url","description":"Prefix prepended to every manifest path.","tier":"infra"},"manifest":{"type":"Map<string,SoundEntry>","default":{},"label":"Manifest","description":"Sound definitions keyed by logical name — path(s), volume, loop, pooling, autostart, crossfade.","tier":"domain","items":{"type":"object","properties":{"autostart":{"name":"autostart","type":"boolean","required":false},"poolSize":{"name":"poolSize","type":"number","required":false},"crossfade":{"name":"crossfade","type":"boolean","required":false},"volume":{"name":"volume","type":"number","required":false},"loop":{"name":"loop","type":"boolean","required":false},"crossfadeDurationMs":{"name":"crossfadeDurationMs","type":"number","required":false},"path":{"name":"path","type":"string","required":false}}}},"initialMusic":{"type":"string","default":"","label":"Initial Music","description":"Manifest key auto-played as looping music on INIT/RESTART; empty plays none.","tier":"presentation"},"initialVolume":{"type":"number","default":1,"label":"Initial Volume","description":"Master volume 0-1 seeded on INIT/RESTART.","tier":"presentation"}},"scope":"instance"}],"pages":[{"name":"AudioCuePage","id":"pag_Y79570MBXY5YZ1XW9JZJ6T02P0","path":"/audio-cue","traits":[{"ref":"AudioCue","refId":"trt_FFX8X9F002G01882EX317T38VC"}]}],"types":{"SoundEntry":[{"name":"path","type":"string"},{"name":"volume","type":"number"},{"name":"loop","type":"boolean"},{"name":"poolSize","type":"number"},{"name":"autostart","type":"boolean"},{"name":"crossfade","type":"boolean"},{"name":"crossfadeDurationMs","type":"number"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_1KBVJ5EH878M3HPXTJYY20AT44":{"id":"ent_1KBVJ5EH878M3HPXTJYY20AT44","kind":"entity","bakedName":"AudioState","curName":"AudioState","renames":[],"owner":"workspace"},"evt_40EX4RPF4N7JAXDKFX3HWEK9XE":{"id":"evt_40EX4RPF4N7JAXDKFX3HWEK9XE","kind":"event","bakedName":"MUSIC","curName":"MUSIC","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_87J89SS9XHMYRX6Q8BHNASFJ9B":{"id":"evt_87J89SS9XHMYRX6Q8BHNASFJ9B","kind":"event","bakedName":"TOGGLE_MUTE","curName":"TOGGLE_MUTE","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_DF6D751E6MQ3A5MWHXVT726ZPS":{"id":"evt_DF6D751E6MQ3A5MWHXVT726ZPS","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_DYDH6HJ1NW0TYF0TRYY0KBS9ES":{"id":"evt_DYDH6HJ1NW0TYF0TRYY0KBS9ES","kind":"event","bakedName":"SET_VOLUME","curName":"SET_VOLUME","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_ESXXT9T8J2491FFYSG1KFVH3YE":{"id":"evt_ESXXT9T8J2491FFYSG1KFVH3YE","kind":"event","bakedName":"UNMUTE","curName":"UNMUTE","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_J9N2QGT19D0MPY00RARRWP1E02":{"id":"evt_J9N2QGT19D0MPY00RARRWP1E02","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_NXWH6Y03J41S2F408VMDJWW35R":{"id":"evt_NXWH6Y03J41S2F408VMDJWW35R","kind":"event","bakedName":"AUDIO_MUTED","curName":"AUDIO_MUTED","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_SJPH26W4ZD2FPTDTA84ERK5NT3":{"id":"evt_SJPH26W4ZD2FPTDTA84ERK5NT3","kind":"event","bakedName":"CUE","curName":"CUE","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_TFQVF5JSQXCVYSH9GFD2N16WXF":{"id":"evt_TFQVF5JSQXCVYSH9GFD2N16WXF","kind":"event","bakedName":"STOP_MUSIC","curName":"STOP_MUSIC","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"evt_TQHSRJ0N4MAJA8K9XAED3S1SNM":{"id":"evt_TQHSRJ0N4MAJA8K9XAED3S1SNM","kind":"event","bakedName":"MUTE","curName":"MUTE","renames":[],"owner":"workspace","parent":"trt_FFX8X9F002G01882EX317T38VC"},"orb_028D8K5AXRNEWED9HSRH0T4NQ8":{"id":"orb_028D8K5AXRNEWED9HSRH0T4NQ8","kind":"orbital","bakedName":"AudioCueOrbital","curName":"AudioCueOrbital","renames":[],"owner":"workspace"},"pag_Y79570MBXY5YZ1XW9JZJ6T02P0":{"id":"pag_Y79570MBXY5YZ1XW9JZJ6T02P0","kind":"page","bakedName":"AudioCuePage","curName":"AudioCuePage","renames":[],"owner":"workspace"},"trt_FFX8X9F002G01882EX317T38VC":{"id":"trt_FFX8X9F002G01882EX317T38VC","kind":"trait","bakedName":"AudioCue","curName":"AudioCue","renames":[],"owner":"workspace"}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"std-camera-rig","version":"1.0.0","description":"Headless camera authority: the SOLE writer of camX/camY/camZoom on side-view and top-down boards. Every 33ms camera tick it eases camX/camY toward (camTargetX + camLead, camTargetY) — a dead-zone camera: inside deadzoneX/deadzoneY the axis holds, outside it lerps by stiffness — clamps the result to bounds, eases camZoom toward camTargetZoom the same way, and decays camShake toward 0 by shakeDecay. Intents: FOLLOW retargets from a moving body's x/y/vx (vx feeds camLead, the horizontal look-ahead), CUT snaps position+target instantly (no ease, for teleports/cutscenes), SET_ZOOM retargets zoom (clamped to minZoom/maxZoom), SHAKE sets camShake for a consumer to jitter with at bind time — this atom never writes shake into camX/camY itself, RESTART reseeds from config. Emits CAMERA_MOVED every tick. Renders nothing — a board binds its own canvas camera prop straight to camX/camY/camZoom.","orbitals":[{"name":"CameraRigOrbital","id":"orb_N80CNB274F3J7SC2KVZQ5F145P","entity":{"name":"CameraState","id":"ent_VNFXE1XQEVVQDPB9CTZP8VRT7P","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"camX","type":"number","default":0},{"name":"camY","type":"number","default":0},{"name":"camZoom","type":"number","default":1},{"name":"camTargetX","type":"number","default":0},{"name":"camTargetY","type":"number","default":0},{"name":"camTargetZoom","type":"number","default":1},{"name":"camLead","type":"number","default":0},{"name":"camShake","type":"number","default":0}],"shared":true},"traits":[{"name":"CameraRig","id":"trt_7Z54R6AN9SAMWP84ZEW4W341SC","entityRebindable":true,"entityContract":{"requires":[],"provides":["camLead","camShake","camTargetX","camTargetY","camTargetZoom","camX","camY","camZoom"]},"effectRow":[{"kind":"emit","resource":"CAMERA_MOVED","site":"tick"},{"kind":"set","resource":"@entity.camLead"},{"kind":"set","resource":"@entity.camShake"},{"kind":"set","resource":"@entity.camShake","site":"tick"},{"kind":"set","resource":"@entity.camTargetX"},{"kind":"set","resource":"@entity.camTargetY"},{"kind":"set","resource":"@entity.camTargetZoom"},{"kind":"set","resource":"@entity.camX"},{"kind":"set","resource":"@entity.camX","site":"tick"},{"kind":"set","resource":"@entity.camY"},{"kind":"set","resource":"@entity.camY","site":"tick"},{"kind":"set","resource":"@entity.camZoom"},{"kind":"set","resource":"@entity.camZoom","site":"tick"},{"kind":"ticks","site":"tick"}],"category":"lifecycle","linkedEntity":"CameraState","linkedEntityId":"ent_VNFXE1XQEVVQDPB9CTZP8VRT7P","entityRefIds":{"CameraState":"ent_VNFXE1XQEVVQDPB9CTZP8VRT7P"},"emits":[{"event":"CAMERA_MOVED","eventId":"evt_0XKR8CNZQCZVP58W7J4VZ0EJS0","description":"Eased camera position/zoom after this tick.","tier":"domain","scope":"external","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"zoom","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_GRA6AJBM2QT1BX31CWGZVJ14EK","name":"Initialize"},{"key":"FOLLOW","id":"evt_Q43KWG7YYMZFACECY8Q3G3J82N","name":"Follow","description":"Retarget from a moving body's position and horizontal velocity (vx drives camLead).","tier":"domain","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"vx","type":"number","required":true}],"listened":true},{"key":"CUT","id":"evt_BYSE49G8BQ45VPHAC4DSGPAADP","name":"Cut","description":"Snap position and target instantly, no ease — teleports and cutscenes.","tier":"domain","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}],"listened":true},{"key":"SET_ZOOM","id":"evt_P8EWSMX1FSGQWT9DT5CF2PKWG1","name":"Set Zoom","description":"Retarget zoom, clamped to minZoom/maxZoom.","tier":"domain","payloadSchema":[{"name":"zoom","type":"number","required":true}],"listened":true},{"key":"SHAKE","id":"evt_78TP2D6KBY9NZ53C3Y5P19SKF1","name":"Shake","description":"Set camShake; a consumer jitters camX/camY with it at bind time — this atom never writes shake into position.","tier":"domain","payloadSchema":[{"name":"magnitude","type":"number","required":true}],"listened":true},{"key":"RESTART","id":"evt_KQ00R669VQ4XVKXR55E8P2DNNF","name":"Restart","description":"Reseed position/zoom/lead/shake from config.","tier":"domain","listened":true},{"key":"CAMERA_MOVED","id":"evt_0XKR8CNZQCZVP58W7J4VZ0EJS0","name":"Camera Moved","description":"Eased camera position/zoom after this tick.","tier":"domain","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"zoom","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_GRA6AJBM2QT1BX31CWGZVJ14EK","effects":[["set","@entity.camX","@config.start.x"],["set","@entity.camY","@config.start.y"],["set","@entity.camZoom","@config.zoom"],["set","@entity.camTargetX","@config.start.x"],["set","@entity.camTargetY","@config.start.y"],["set","@entity.camTargetZoom","@config.zoom"],["set","@entity.camLead",0],["set","@entity.camShake",0]]},{"from":"active","to":"active","event":"FOLLOW","eventId":"evt_Q43KWG7YYMZFACECY8Q3G3J82N","effects":[["set","@entity.camTargetX","@payload.x"],["set","@entity.camTargetY","@payload.y"],["set","@entity.camLead",["*","@payload.vx","@config.lead"]]]},{"from":"active","to":"active","event":"CUT","eventId":"evt_BYSE49G8BQ45VPHAC4DSGPAADP","effects":[["set","@entity.camX","@payload.x"],["set","@entity.camY","@payload.y"],["set","@entity.camTargetX","@payload.x"],["set","@entity.camTargetY","@payload.y"],["set","@entity.camLead",0]]},{"from":"active","to":"active","event":"SET_ZOOM","eventId":"evt_P8EWSMX1FSGQWT9DT5CF2PKWG1","effects":[["set","@entity.camTargetZoom",["math/clamp","@payload.zoom","@config.minZoom","@config.maxZoom"]]]},{"from":"active","to":"active","event":"SHAKE","eventId":"evt_78TP2D6KBY9NZ53C3Y5P19SKF1","effects":[["set","@entity.camShake","@payload.magnitude"]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_KQ00R669VQ4XVKXR55E8P2DNNF","effects":[["set","@entity.camX","@config.start.x"],["set","@entity.camY","@config.start.y"],["set","@entity.camZoom","@config.zoom"],["set","@entity.camTargetX","@config.start.x"],["set","@entity.camTargetY","@config.start.y"],["set","@entity.camTargetZoom","@config.zoom"],["set","@entity.camLead",0],["set","@entity.camShake",0]]}]},"ticks":[{"name":"camTick","interval":33,"guard":"@config.running","effects":[["do",["set","@entity.camX",["math/clamp",["if",[">",["math/abs",["-",["+","@entity.camTargetX","@entity.camLead"],"@entity.camX"]],"@config.deadzoneX"],["math/lerp","@entity.camX",["+","@entity.camTargetX","@entity.camLead"],"@config.stiffness"],"@entity.camX"],"@config.bounds.xMin","@config.bounds.xMax"]],["set","@entity.camY",["math/clamp",["if",[">",["math/abs",["-","@entity.camTargetY","@entity.camY"]],"@config.deadzoneY"],["math/lerp","@entity.camY","@entity.camTargetY","@config.stiffness"],"@entity.camY"],"@config.bounds.yMin","@config.bounds.yMax"]],["set","@entity.camZoom",["math/clamp",["math/lerp","@entity.camZoom","@entity.camTargetZoom","@config.stiffness"],"@config.minZoom","@config.maxZoom"]],["set","@entity.camShake",["math/max",0,["-","@entity.camShake","@config.shakeDecay"]]]],["emit","CAMERA_MOVED",{"x":"@entity.camX","y":"@entity.camY","zoom":"@entity.camZoom"}]]}],"config":{"lead":{"type":"number","default":0,"label":"Lead","description":"Horizontal look-ahead multiplier applied to FOLLOW's vx","tier":"presentation"},"start":{"type":"CameraPos","default":{"x":0,"y":0},"label":"Start Position","description":"Initial and RESTART camera position/target","tier":"domain","properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}},"stiffness":{"type":"number","default":0.1,"label":"Stiffness","description":"Per-tick lerp factor easing position/zoom toward target (0-1, higher = snappier)","tier":"presentation"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true the 33ms camera tick eases toward target; toggle to freeze the camera","tier":"domain"},"deadzoneY":{"type":"number","default":0,"label":"Dead Zone Y","description":"Vertical distance from target the camera tolerates without easing","tier":"presentation"},"minZoom":{"type":"number","default":0.5,"label":"Min Zoom","description":"Lower clamp for SET_ZOOM and the eased zoom","tier":"presentation"},"bounds":{"type":"CameraBounds","default":{"xMin":-1000000,"xMax":1000000,"yMin":-1000000,"yMax":1000000},"label":"Bounds","description":"World-space clamp applied to the eased camera position every tick","tier":"presentation","properties":{"xMax":{"name":"xMax","type":"number","required":true},"yMin":{"name":"yMin","type":"number","required":true},"yMax":{"name":"yMax","type":"number","required":true},"xMin":{"name":"xMin","type":"number","required":true}}},"maxZoom":{"type":"number","default":3,"label":"Max Zoom","description":"Upper clamp for SET_ZOOM and the eased zoom","tier":"presentation"},"shakeDecay":{"type":"number","default":0.1,"label":"Shake Decay","description":"Amount camShake reduces toward 0 every tick","tier":"presentation"},"deadzoneX":{"type":"number","default":0,"label":"Dead Zone X","description":"Horizontal distance from target the camera tolerates without easing","tier":"presentation"},"zoom":{"type":"number","default":1,"label":"Zoom","description":"Initial and RESTART zoom level","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"CameraRigPage","id":"pag_YSX7CFJSTECX7BS1W66J69AWWE","path":"/camera-rig","traits":[{"ref":"CameraRig","refId":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"}]}],"types":{"CameraBounds":[{"name":"xMin","type":"number","required":true},{"name":"xMax","type":"number","required":true},{"name":"yMin","type":"number","required":true},{"name":"yMax","type":"number","required":true}],"CameraPos":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_VNFXE1XQEVVQDPB9CTZP8VRT7P":{"id":"ent_VNFXE1XQEVVQDPB9CTZP8VRT7P","kind":"entity","bakedName":"CameraState","curName":"CameraState","renames":[],"owner":"workspace"},"evt_0XKR8CNZQCZVP58W7J4VZ0EJS0":{"id":"evt_0XKR8CNZQCZVP58W7J4VZ0EJS0","kind":"event","bakedName":"CAMERA_MOVED","curName":"CAMERA_MOVED","renames":[],"owner":"workspace","parent":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"},"evt_78TP2D6KBY9NZ53C3Y5P19SKF1":{"id":"evt_78TP2D6KBY9NZ53C3Y5P19SKF1","kind":"event","bakedName":"SHAKE","curName":"SHAKE","renames":[],"owner":"workspace","parent":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"},"evt_BYSE49G8BQ45VPHAC4DSGPAADP":{"id":"evt_BYSE49G8BQ45VPHAC4DSGPAADP","kind":"event","bakedName":"CUT","curName":"CUT","renames":[],"owner":"workspace","parent":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"},"evt_GRA6AJBM2QT1BX31CWGZVJ14EK":{"id":"evt_GRA6AJBM2QT1BX31CWGZVJ14EK","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"},"evt_KQ00R669VQ4XVKXR55E8P2DNNF":{"id":"evt_KQ00R669VQ4XVKXR55E8P2DNNF","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"},"evt_P8EWSMX1FSGQWT9DT5CF2PKWG1":{"id":"evt_P8EWSMX1FSGQWT9DT5CF2PKWG1","kind":"event","bakedName":"SET_ZOOM","curName":"SET_ZOOM","renames":[],"owner":"workspace","parent":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"},"evt_Q43KWG7YYMZFACECY8Q3G3J82N":{"id":"evt_Q43KWG7YYMZFACECY8Q3G3J82N","kind":"event","bakedName":"FOLLOW","curName":"FOLLOW","renames":[],"owner":"workspace","parent":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"},"orb_N80CNB274F3J7SC2KVZQ5F145P":{"id":"orb_N80CNB274F3J7SC2KVZQ5F145P","kind":"orbital","bakedName":"CameraRigOrbital","curName":"CameraRigOrbital","renames":[],"owner":"workspace"},"pag_YSX7CFJSTECX7BS1W66J69AWWE":{"id":"pag_YSX7CFJSTECX7BS1W66J69AWWE","kind":"page","bakedName":"CameraRigPage","curName":"CameraRigPage","renames":[],"owner":"workspace"},"trt_7Z54R6AN9SAMWP84ZEW4W341SC":{"id":"trt_7Z54R6AN9SAMWP84ZEW4W341SC","kind":"trait","bakedName":"CameraRig","curName":"CameraRig","renames":[],"owner":"workspace"}}}}
|
|
1
|
+
{"name":"std-camera-rig","version":"1.0.0","description":"Headless camera authority: the SOLE writer of camX/camY/camZoom on side-view and top-down boards. Every 33ms camera tick it eases camX/camY toward (camTargetX + camLead, camTargetY) — a dead-zone camera: inside deadzoneX/deadzoneY the axis holds, outside it lerps by stiffness — clamps the result to bounds, eases camZoom toward camTargetZoom the same way, and decays camShake toward 0 by shakeDecay. Intents: FOLLOW retargets from a moving body's x/y/vx (vx feeds camLead, the horizontal look-ahead), CUT snaps position+target instantly (no ease, for teleports/cutscenes), SET_ZOOM retargets zoom (clamped to minZoom/maxZoom), SHAKE sets camShake for a consumer to jitter with at bind time — this atom never writes shake into camX/camY itself, RESTART reseeds from config. Emits CAMERA_MOVED every tick. Renders nothing — a board binds its own canvas camera prop straight to camX/camY/camZoom.","orbitals":[{"name":"CameraRigOrbital","id":"orb_N80CNB274F3J7SC2KVZQ5F145P","entity":{"name":"CameraState","id":"ent_VNFXE1XQEVVQDPB9CTZP8VRT7P","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"camX","type":"number","default":0},{"name":"camY","type":"number","default":0},{"name":"camZoom","type":"number","default":1},{"name":"camTargetX","type":"number","default":0},{"name":"camTargetY","type":"number","default":0},{"name":"camTargetZoom","type":"number","default":1},{"name":"camLead","type":"number","default":0},{"name":"camShake","type":"number","default":0}],"shared":true},"traits":[{"name":"CameraRig","id":"trt_7Z54R6AN9SAMWP84ZEW4W341SC","entityRebindable":true,"entityContract":{"requires":[],"provides":["camLead","camShake","camTargetX","camTargetY","camTargetZoom","camX","camY","camZoom"]},"effectRow":[{"kind":"emit","resource":"CAMERA_MOVED","site":"tick"},{"kind":"set","resource":"@entity.camLead"},{"kind":"set","resource":"@entity.camShake"},{"kind":"set","resource":"@entity.camShake","site":"tick"},{"kind":"set","resource":"@entity.camTargetX"},{"kind":"set","resource":"@entity.camTargetY"},{"kind":"set","resource":"@entity.camTargetZoom"},{"kind":"set","resource":"@entity.camX"},{"kind":"set","resource":"@entity.camX","site":"tick"},{"kind":"set","resource":"@entity.camY"},{"kind":"set","resource":"@entity.camY","site":"tick"},{"kind":"set","resource":"@entity.camZoom"},{"kind":"set","resource":"@entity.camZoom","site":"tick"},{"kind":"ticks","site":"tick"}],"category":"lifecycle","linkedEntity":"CameraState","linkedEntityId":"ent_VNFXE1XQEVVQDPB9CTZP8VRT7P","entityRefIds":{"CameraState":"ent_VNFXE1XQEVVQDPB9CTZP8VRT7P"},"emits":[{"event":"CAMERA_MOVED","eventId":"evt_0XKR8CNZQCZVP58W7J4VZ0EJS0","description":"Eased camera position/zoom after this tick.","tier":"domain","scope":"external","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"zoom","type":"number","required":true}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_GRA6AJBM2QT1BX31CWGZVJ14EK","name":"Initialize"},{"key":"FOLLOW","id":"evt_Q43KWG7YYMZFACECY8Q3G3J82N","name":"Follow","description":"Retarget from a moving body's position and horizontal velocity (vx drives camLead).","tier":"domain","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"vx","type":"number","required":true}],"listened":true},{"key":"CUT","id":"evt_BYSE49G8BQ45VPHAC4DSGPAADP","name":"Cut","description":"Snap position and target instantly, no ease — teleports and cutscenes.","tier":"domain","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}],"listened":true},{"key":"SET_ZOOM","id":"evt_P8EWSMX1FSGQWT9DT5CF2PKWG1","name":"Set Zoom","description":"Retarget zoom, clamped to minZoom/maxZoom.","tier":"domain","payloadSchema":[{"name":"zoom","type":"number","required":true}],"listened":true},{"key":"SHAKE","id":"evt_78TP2D6KBY9NZ53C3Y5P19SKF1","name":"Shake","description":"Set camShake; a consumer jitters camX/camY with it at bind time — this atom never writes shake into position.","tier":"domain","payloadSchema":[{"name":"magnitude","type":"number","required":true}],"listened":true},{"key":"RESTART","id":"evt_KQ00R669VQ4XVKXR55E8P2DNNF","name":"Restart","description":"Reseed position/zoom/lead/shake from config.","tier":"domain","listened":true},{"key":"CAMERA_MOVED","id":"evt_0XKR8CNZQCZVP58W7J4VZ0EJS0","name":"Camera Moved","description":"Eased camera position/zoom after this tick.","tier":"domain","payloadSchema":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"zoom","type":"number","required":true}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_GRA6AJBM2QT1BX31CWGZVJ14EK","effects":[["set","@entity.camX","@config.start.x"],["set","@entity.camY","@config.start.y"],["set","@entity.camZoom","@config.zoom"],["set","@entity.camTargetX","@config.start.x"],["set","@entity.camTargetY","@config.start.y"],["set","@entity.camTargetZoom","@config.zoom"],["set","@entity.camLead",0],["set","@entity.camShake",0]]},{"from":"active","to":"active","event":"FOLLOW","eventId":"evt_Q43KWG7YYMZFACECY8Q3G3J82N","effects":[["set","@entity.camTargetX","@payload.x"],["set","@entity.camTargetY","@payload.y"],["set","@entity.camLead",["*","@payload.vx","@config.lead"]]]},{"from":"active","to":"active","event":"CUT","eventId":"evt_BYSE49G8BQ45VPHAC4DSGPAADP","effects":[["set","@entity.camX","@payload.x"],["set","@entity.camY","@payload.y"],["set","@entity.camTargetX","@payload.x"],["set","@entity.camTargetY","@payload.y"],["set","@entity.camLead",0]]},{"from":"active","to":"active","event":"SET_ZOOM","eventId":"evt_P8EWSMX1FSGQWT9DT5CF2PKWG1","effects":[["set","@entity.camTargetZoom",["math/clamp","@payload.zoom","@config.minZoom","@config.maxZoom"]]]},{"from":"active","to":"active","event":"SHAKE","eventId":"evt_78TP2D6KBY9NZ53C3Y5P19SKF1","effects":[["set","@entity.camShake","@payload.magnitude"]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_KQ00R669VQ4XVKXR55E8P2DNNF","effects":[["set","@entity.camX","@config.start.x"],["set","@entity.camY","@config.start.y"],["set","@entity.camZoom","@config.zoom"],["set","@entity.camTargetX","@config.start.x"],["set","@entity.camTargetY","@config.start.y"],["set","@entity.camTargetZoom","@config.zoom"],["set","@entity.camLead",0],["set","@entity.camShake",0]]}]},"ticks":[{"name":"camTick","interval":33,"guard":"@config.running","effects":[["do",["set","@entity.camX",["math/clamp",["if",[">",["math/abs",["-",["+","@entity.camTargetX","@entity.camLead"],"@entity.camX"]],"@config.deadzoneX"],["math/lerp","@entity.camX",["+","@entity.camTargetX","@entity.camLead"],"@config.stiffness"],"@entity.camX"],"@config.bounds.xMin","@config.bounds.xMax"]],["set","@entity.camY",["math/clamp",["if",[">",["math/abs",["-","@entity.camTargetY","@entity.camY"]],"@config.deadzoneY"],["math/lerp","@entity.camY","@entity.camTargetY","@config.stiffness"],"@entity.camY"],"@config.bounds.yMin","@config.bounds.yMax"]],["set","@entity.camZoom",["math/clamp",["math/lerp","@entity.camZoom","@entity.camTargetZoom","@config.stiffness"],"@config.minZoom","@config.maxZoom"]],["set","@entity.camShake",["math/max",0,["-","@entity.camShake","@config.shakeDecay"]]]],["emit","CAMERA_MOVED",{"x":"@entity.camX","y":"@entity.camY","zoom":"@entity.camZoom"}]]}],"config":{"shakeDecay":{"type":"number","default":0.1,"label":"Shake Decay","description":"Amount camShake reduces toward 0 every tick","tier":"presentation"},"deadzoneX":{"type":"number","default":0,"label":"Dead Zone X","description":"Horizontal distance from target the camera tolerates without easing","tier":"presentation"},"start":{"type":"CameraPos","default":{"x":0,"y":0},"label":"Start Position","description":"Initial and RESTART camera position/target","tier":"domain","properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}},"deadzoneY":{"type":"number","default":0,"label":"Dead Zone Y","description":"Vertical distance from target the camera tolerates without easing","tier":"presentation"},"minZoom":{"type":"number","default":0.5,"label":"Min Zoom","description":"Lower clamp for SET_ZOOM and the eased zoom","tier":"presentation"},"bounds":{"type":"CameraBounds","default":{"xMin":-1000000,"xMax":1000000,"yMin":-1000000,"yMax":1000000},"label":"Bounds","description":"World-space clamp applied to the eased camera position every tick","tier":"presentation","properties":{"xMin":{"name":"xMin","type":"number","required":true},"yMin":{"name":"yMin","type":"number","required":true},"xMax":{"name":"xMax","type":"number","required":true},"yMax":{"name":"yMax","type":"number","required":true}}},"zoom":{"type":"number","default":1,"label":"Zoom","description":"Initial and RESTART zoom level","tier":"domain"},"lead":{"type":"number","default":0,"label":"Lead","description":"Horizontal look-ahead multiplier applied to FOLLOW's vx","tier":"presentation"},"stiffness":{"type":"number","default":0.1,"label":"Stiffness","description":"Per-tick lerp factor easing position/zoom toward target (0-1, higher = snappier)","tier":"presentation"},"maxZoom":{"type":"number","default":3,"label":"Max Zoom","description":"Upper clamp for SET_ZOOM and the eased zoom","tier":"presentation"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true the 33ms camera tick eases toward target; toggle to freeze the camera","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"CameraRigPage","id":"pag_YSX7CFJSTECX7BS1W66J69AWWE","path":"/camera-rig","traits":[{"ref":"CameraRig","refId":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"}]}],"types":{"CameraBounds":[{"name":"xMin","type":"number","required":true},{"name":"xMax","type":"number","required":true},{"name":"yMin","type":"number","required":true},{"name":"yMax","type":"number","required":true}],"CameraPos":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_VNFXE1XQEVVQDPB9CTZP8VRT7P":{"id":"ent_VNFXE1XQEVVQDPB9CTZP8VRT7P","kind":"entity","bakedName":"CameraState","curName":"CameraState","renames":[],"owner":"workspace"},"evt_0XKR8CNZQCZVP58W7J4VZ0EJS0":{"id":"evt_0XKR8CNZQCZVP58W7J4VZ0EJS0","kind":"event","bakedName":"CAMERA_MOVED","curName":"CAMERA_MOVED","renames":[],"owner":"workspace","parent":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"},"evt_78TP2D6KBY9NZ53C3Y5P19SKF1":{"id":"evt_78TP2D6KBY9NZ53C3Y5P19SKF1","kind":"event","bakedName":"SHAKE","curName":"SHAKE","renames":[],"owner":"workspace","parent":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"},"evt_BYSE49G8BQ45VPHAC4DSGPAADP":{"id":"evt_BYSE49G8BQ45VPHAC4DSGPAADP","kind":"event","bakedName":"CUT","curName":"CUT","renames":[],"owner":"workspace","parent":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"},"evt_GRA6AJBM2QT1BX31CWGZVJ14EK":{"id":"evt_GRA6AJBM2QT1BX31CWGZVJ14EK","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"},"evt_KQ00R669VQ4XVKXR55E8P2DNNF":{"id":"evt_KQ00R669VQ4XVKXR55E8P2DNNF","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"},"evt_P8EWSMX1FSGQWT9DT5CF2PKWG1":{"id":"evt_P8EWSMX1FSGQWT9DT5CF2PKWG1","kind":"event","bakedName":"SET_ZOOM","curName":"SET_ZOOM","renames":[],"owner":"workspace","parent":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"},"evt_Q43KWG7YYMZFACECY8Q3G3J82N":{"id":"evt_Q43KWG7YYMZFACECY8Q3G3J82N","kind":"event","bakedName":"FOLLOW","curName":"FOLLOW","renames":[],"owner":"workspace","parent":"trt_7Z54R6AN9SAMWP84ZEW4W341SC"},"orb_N80CNB274F3J7SC2KVZQ5F145P":{"id":"orb_N80CNB274F3J7SC2KVZQ5F145P","kind":"orbital","bakedName":"CameraRigOrbital","curName":"CameraRigOrbital","renames":[],"owner":"workspace"},"pag_YSX7CFJSTECX7BS1W66J69AWWE":{"id":"pag_YSX7CFJSTECX7BS1W66J69AWWE","kind":"page","bakedName":"CameraRigPage","curName":"CameraRigPage","renames":[],"owner":"workspace"},"trt_7Z54R6AN9SAMWP84ZEW4W341SC":{"id":"trt_7Z54R6AN9SAMWP84ZEW4W341SC","kind":"trait","bakedName":"CameraRig","curName":"CameraRig","renames":[],"owner":"workspace"}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"std-chase-ai","version":"1.0.0","description":"Headless chase-AI mechanic: enemies damage adjacent targets, else step toward the nearest target respecting tile passability and occupancy.","orbitals":[{"name":"ChaseAiOrbital","id":"orb_580EA49EDDQ6PQ5B7JSNV9ZCZM","entity":{"name":"ChaseState","id":"ent_PJBR9CH1SWGWY1PKYBPJ1BWW1E","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"units","type":"array","items":{"type":"object","properties":{"team":{"name":"team","type":"string","required":false},"health":{"name":"health","type":"number","required":false},"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},"position":{"name":"position","type":"object","required":false,"properties":{"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true}}},"y":{"name":"y","type":"number","required":false},"maxHealth":{"name":"maxHealth","type":"number","required":false}}}}],"shared":true},"traits":[{"name":"ChaseAi","id":"trt_V5DMHRYY50F2G1NKNWGF7PPWJA","entityRebindable":true,"entityContract":{"requires":[],"provides":["units"]},"effectRow":[{"kind":"emit","resource":"BURST","site":"tick"},{"kind":"emit","resource":"UNITS_CHANGED","site":"tick"},{"kind":"set","resource":"@entity.units"},{"kind":"set","resource":"@entity.units","site":"tick"},{"kind":"ticks","site":"tick"}],"category":"lifecycle","linkedEntity":"ChaseState","linkedEntityId":"ent_PJBR9CH1SWGWY1PKYBPJ1BWW1E","entityRefIds":{"ChaseState":"ent_PJBR9CH1SWGWY1PKYBPJ1BWW1E"},"emits":[{"event":"BURST","eventId":"evt_A4ZGEXVPYQVFBRVN54T0EBC8Y2","description":"Fired each tick a target takes adjacency damage, carrying summarized hit particles","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_JDDAK745BE2NQ6C69GG4YQNCG0","description":"Live team survivor counts after this tick's combat; 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_9BRHF4H7N5KTJPKC56W0PCTQ6P","name":"Initialize"},{"key":"BURST","id":"evt_A4ZGEXVPYQVFBRVN54T0EBC8Y2","name":"Burst","description":"Fired each tick a target takes adjacency damage, carrying summarized hit particles","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_JDDAK745BE2NQ6C69GG4YQNCG0","name":"Units Changed","description":"Live team survivor counts after this tick's combat; 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_9BRHF4H7N5KTJPKC56W0PCTQ6P","effects":[["set","@entity.units","@config.units"]]}]},"ticks":[{"name":"chaseTick","interval":1000,"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","@config.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"}}],"@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":{"running":{"type":"boolean","default":true,"label":"Running","description":"When true the chase tick runs; toggle to freeze the mechanic","tier":"domain"},"gridWidth":{"type":"number","default":12,"label":"Grid Width","description":"Grid column count clamping enemy movement bounds","tier":"presentation"},"units":{"type":"[Unit]","default":[],"label":"Initial Units","description":"Seed units (players and enemies) present before the first tick","tier":"domain","items":{"type":"object","properties":{"unitType":{"name":"unitType","type":"string","required":false},"x":{"name":"x","type":"number","required":false},"id":{"name":"id","type":"string","required":true},"maxHealth":{"name":"maxHealth","type":"number","required":false},"health":{"name":"health","type":"number","required":false},"y":{"name":"y","type":"number","required":false},"team":{"name":"team","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}}},"z":{"name":"z","type":"number","required":false}}}},"gridHeight":{"type":"number","default":12,"label":"Grid Height","description":"Grid row count clamping enemy movement bounds","tier":"presentation"},"tiles":{"type":"[Tile]","default":[],"label":"Initial Tiles","description":"Seed grid tiles used for passability checks during movement","tier":"presentation","items":{"type":"object","properties":{"passable":{"name":"passable","type":"boolean","required":false},"id":{"name":"id","type":"string","required":false},"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}}}},"scope":"instance"}],"pages":[{"name":"ChaseAiPage","id":"pag_WW3TYPVCY6PF343VPTWEPW9E7N","path":"/chase-ai","traits":[{"ref":"ChaseAi","refId":"trt_V5DMHRYY50F2G1NKNWGF7PPWJA"}]}],"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"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_PJBR9CH1SWGWY1PKYBPJ1BWW1E":{"id":"ent_PJBR9CH1SWGWY1PKYBPJ1BWW1E","kind":"entity","bakedName":"ChaseState","curName":"ChaseState","renames":[],"owner":"workspace"},"evt_9BRHF4H7N5KTJPKC56W0PCTQ6P":{"id":"evt_9BRHF4H7N5KTJPKC56W0PCTQ6P","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_V5DMHRYY50F2G1NKNWGF7PPWJA"},"evt_A4ZGEXVPYQVFBRVN54T0EBC8Y2":{"id":"evt_A4ZGEXVPYQVFBRVN54T0EBC8Y2","kind":"event","bakedName":"BURST","curName":"BURST","renames":[],"owner":"workspace","parent":"trt_V5DMHRYY50F2G1NKNWGF7PPWJA"},"evt_JDDAK745BE2NQ6C69GG4YQNCG0":{"id":"evt_JDDAK745BE2NQ6C69GG4YQNCG0","kind":"event","bakedName":"UNITS_CHANGED","curName":"UNITS_CHANGED","renames":[],"owner":"workspace","parent":"trt_V5DMHRYY50F2G1NKNWGF7PPWJA"},"orb_580EA49EDDQ6PQ5B7JSNV9ZCZM":{"id":"orb_580EA49EDDQ6PQ5B7JSNV9ZCZM","kind":"orbital","bakedName":"ChaseAiOrbital","curName":"ChaseAiOrbital","renames":[],"owner":"workspace"},"pag_WW3TYPVCY6PF343VPTWEPW9E7N":{"id":"pag_WW3TYPVCY6PF343VPTWEPW9E7N","kind":"page","bakedName":"ChaseAiPage","curName":"ChaseAiPage","renames":[],"owner":"workspace"},"trt_V5DMHRYY50F2G1NKNWGF7PPWJA":{"id":"trt_V5DMHRYY50F2G1NKNWGF7PPWJA","kind":"trait","bakedName":"ChaseAi","curName":"ChaseAi","renames":[],"owner":"workspace"}}}}
|
|
1
|
+
{"name":"std-chase-ai","version":"1.0.0","description":"Headless chase-AI mechanic: enemies damage adjacent targets, else step toward the nearest target respecting tile passability and occupancy.","orbitals":[{"name":"ChaseAiOrbital","id":"orb_580EA49EDDQ6PQ5B7JSNV9ZCZM","entity":{"name":"ChaseState","id":"ent_PJBR9CH1SWGWY1PKYBPJ1BWW1E","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"units","type":"array","items":{"type":"object","properties":{"x":{"name":"x","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},"health":{"name":"health","type":"number","required":false},"team":{"name":"team","type":"string","required":false},"id":{"name":"id","type":"string","required":true},"y":{"name":"y","type":"number","required":false},"maxHealth":{"name":"maxHealth","type":"number","required":false},"z":{"name":"z","type":"number","required":false}}}}],"shared":true},"traits":[{"name":"ChaseAi","id":"trt_V5DMHRYY50F2G1NKNWGF7PPWJA","entityRebindable":true,"entityContract":{"requires":[],"provides":["units"]},"effectRow":[{"kind":"emit","resource":"BURST","site":"tick"},{"kind":"emit","resource":"UNITS_CHANGED","site":"tick"},{"kind":"set","resource":"@entity.units"},{"kind":"set","resource":"@entity.units","site":"tick"},{"kind":"ticks","site":"tick"}],"category":"lifecycle","linkedEntity":"ChaseState","linkedEntityId":"ent_PJBR9CH1SWGWY1PKYBPJ1BWW1E","entityRefIds":{"ChaseState":"ent_PJBR9CH1SWGWY1PKYBPJ1BWW1E"},"emits":[{"event":"BURST","eventId":"evt_A4ZGEXVPYQVFBRVN54T0EBC8Y2","description":"Fired each tick a target takes adjacency damage, carrying summarized hit particles","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_JDDAK745BE2NQ6C69GG4YQNCG0","description":"Live team survivor counts after this tick's combat; 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_9BRHF4H7N5KTJPKC56W0PCTQ6P","name":"Initialize"},{"key":"BURST","id":"evt_A4ZGEXVPYQVFBRVN54T0EBC8Y2","name":"Burst","description":"Fired each tick a target takes adjacency damage, carrying summarized hit particles","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_JDDAK745BE2NQ6C69GG4YQNCG0","name":"Units Changed","description":"Live team survivor counts after this tick's combat; 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_9BRHF4H7N5KTJPKC56W0PCTQ6P","effects":[["set","@entity.units","@config.units"]]}]},"ticks":[{"name":"chaseTick","interval":1000,"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","@config.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"}}],"@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":{"tiles":{"type":"[Tile]","default":[],"label":"Initial Tiles","description":"Seed grid tiles used for passability checks during movement","tier":"presentation","items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":true},"passable":{"name":"passable","type":"boolean","required":false},"y":{"name":"y","type":"number","required":true},"id":{"name":"id","type":"string","required":false}}}},"gridWidth":{"type":"number","default":12,"label":"Grid Width","description":"Grid column count clamping enemy movement bounds","tier":"presentation"},"gridHeight":{"type":"number","default":12,"label":"Grid Height","description":"Grid row count clamping enemy movement bounds","tier":"presentation"},"units":{"type":"[Unit]","default":[],"label":"Initial Units","description":"Seed units (players and enemies) present before the first tick","tier":"domain","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},"z":{"name":"z","type":"number","required":false},"team":{"name":"team","type":"string","required":false},"id":{"name":"id","type":"string","required":true},"y":{"name":"y","type":"number","required":false},"x":{"name":"x","type":"number","required":false},"maxHealth":{"name":"maxHealth","type":"number","required":false},"unitType":{"name":"unitType","type":"string","required":false}}}},"running":{"type":"boolean","default":true,"label":"Running","description":"When true the chase tick runs; toggle to freeze the mechanic","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"ChaseAiPage","id":"pag_WW3TYPVCY6PF343VPTWEPW9E7N","path":"/chase-ai","traits":[{"ref":"ChaseAi","refId":"trt_V5DMHRYY50F2G1NKNWGF7PPWJA"}]}],"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"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_PJBR9CH1SWGWY1PKYBPJ1BWW1E":{"id":"ent_PJBR9CH1SWGWY1PKYBPJ1BWW1E","kind":"entity","bakedName":"ChaseState","curName":"ChaseState","renames":[],"owner":"workspace"},"evt_9BRHF4H7N5KTJPKC56W0PCTQ6P":{"id":"evt_9BRHF4H7N5KTJPKC56W0PCTQ6P","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_V5DMHRYY50F2G1NKNWGF7PPWJA"},"evt_A4ZGEXVPYQVFBRVN54T0EBC8Y2":{"id":"evt_A4ZGEXVPYQVFBRVN54T0EBC8Y2","kind":"event","bakedName":"BURST","curName":"BURST","renames":[],"owner":"workspace","parent":"trt_V5DMHRYY50F2G1NKNWGF7PPWJA"},"evt_JDDAK745BE2NQ6C69GG4YQNCG0":{"id":"evt_JDDAK745BE2NQ6C69GG4YQNCG0","kind":"event","bakedName":"UNITS_CHANGED","curName":"UNITS_CHANGED","renames":[],"owner":"workspace","parent":"trt_V5DMHRYY50F2G1NKNWGF7PPWJA"},"orb_580EA49EDDQ6PQ5B7JSNV9ZCZM":{"id":"orb_580EA49EDDQ6PQ5B7JSNV9ZCZM","kind":"orbital","bakedName":"ChaseAiOrbital","curName":"ChaseAiOrbital","renames":[],"owner":"workspace"},"pag_WW3TYPVCY6PF343VPTWEPW9E7N":{"id":"pag_WW3TYPVCY6PF343VPTWEPW9E7N","kind":"page","bakedName":"ChaseAiPage","curName":"ChaseAiPage","renames":[],"owner":"workspace"},"trt_V5DMHRYY50F2G1NKNWGF7PPWJA":{"id":"trt_V5DMHRYY50F2G1NKNWGF7PPWJA","kind":"trait","bakedName":"ChaseAi","curName":"ChaseAi","renames":[],"owner":"workspace"}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"std-choice-gate","version":"1.0.0","description":"Headless choice-gate mechanic for side-view boards: a gate of N labeled option platforms where progress stops until the player commits to an answer. Listens BODY_MOVED and judges a gate when the player stands grounded on one of its option platforms (|dx| <= reachX of the option center, |dy| <= reachY of the gate's option plane — the pad-lock touch pattern): the correct option stamps the gate solved + chosen on the shared entity and emits CHOICE_CORRECT once (a solved gate never judges again, so the path stays open); a wrong option emits CHOICE_WRONG carrying the gate id, the chosen optionId, and the option's world position, so the board can bounce the player back and float the gate's hint (the board owns the bounce — the atom only reports). RESTART unsolves every live gate (re-arming the live entity set, so SET_GATES-injected gates survive respawns). SET_GATES replaces the gate set at runtime for boards that import their gates. Renders nothing; boards draw the option platforms and labels from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, agency.","orbitals":[{"name":"ChoiceGateOrbital","id":"orb_GQVW5APPDVB6XRP4M51K35BKF0","entity":{"name":"ChoiceGateData","id":"ent_SZ2P52WVAQDNBGCN018ZJ13YAD","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"choices","type":"array","default":[],"items":{"type":"object","properties":{"id":{"name":"id","type":"string","required":true},"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true},"options":{"name":"options","type":"array","required":true,"items":{"type":"object","properties":{"id":{"name":"id","type":"string","required":true},"dx":{"name":"dx","type":"number","required":true},"correct":{"name":"correct","type":"boolean","required":true},"label":{"name":"label","type":"string","required":true}}}},"hint":{"name":"hint","type":"string","required":false},"solved":{"name":"solved","type":"boolean","required":false},"chosen":{"name":"chosen","type":"string","required":false}}}}],"shared":true},"traits":[{"name":"ChoiceGate","id":"trt_HYM01XHT81X40XKFGT534YRBJG","entityRebindable":true,"entityContract":{"requires":[],"provides":["choices"]},"effectRow":[{"kind":"emit","resource":"CHOICE_CORRECT"},{"kind":"emit","resource":"CHOICE_WRONG"},{"kind":"set","resource":"@entity.choices"}],"category":"lifecycle","linkedEntity":"ChoiceGateData","linkedEntityId":"ent_SZ2P52WVAQDNBGCN018ZJ13YAD","entityRefIds":{"ChoiceGateData":"ent_SZ2P52WVAQDNBGCN018ZJ13YAD"},"emits":[{"event":"CHOICE_CORRECT","eventId":"evt_K0AVHGAAZS5FWJS37FFPWB2XM8","description":"The player landed grounded on the gate's correct option; fires once per gate (solved gates stop judging). Carries the gate id, the chosen optionId, and the gate center so boards can burst the unlock there.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"optionId","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"event":"CHOICE_WRONG","eventId":"evt_4R89MKCTJVD9DNZ121NW749R78","description":"The player landed grounded on a wrong option; carries the gate id, the chosen optionId, and the option's world position so boards can bounce the player back to the approach and float the gate's hint.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"optionId","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_ND1PK8VT1CX0P8ZH8T59NQKAKH","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_Y1VEQHWDF06QG0WRVN13EWS863","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_GATES","id":"evt_8NJFRDWGX28EH78BP111TQDW5H","name":"Set Gates","payloadSchema":[{"name":"gates","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"hint","type":"string"},{"name":"options","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"dx","type":"number","required":true},{"name":"label","type":"string","required":true},{"name":"correct","type":"boolean","required":true}]},{"name":"solved","type":"boolean"},{"name":"chosen","type":"string"}]}],"listened":true},{"key":"RESTART","id":"evt_8PWD00EMR5AC2Q87PYX93YQ5RZ","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"CHOICE_CORRECT","id":"evt_K0AVHGAAZS5FWJS37FFPWB2XM8","name":"Choice Correct","description":"The player landed grounded on the gate's correct option; fires once per gate (solved gates stop judging). Carries the gate id, the chosen optionId, and the gate center so boards can burst the unlock there.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"optionId","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"key":"CHOICE_WRONG","id":"evt_4R89MKCTJVD9DNZ121NW749R78","name":"Choice Wrong","description":"The player landed grounded on a wrong option; carries the gate id, the chosen optionId, and the option's world position so boards can bounce the player back to the approach and float the gate's hint.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"optionId","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_ND1PK8VT1CX0P8ZH8T59NQKAKH","effects":[["set","@entity.choices",["array/map","@config.gates",["fn","g",["object/merge","@g",{"solved":false,"chosen":""}]]]]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_Y1VEQHWDF06QG0WRVN13EWS863","guard":"@config.running","effects":[["let",[["touch",["array/filter","@entity.choices",["fn","g",["and",["==",["object/get","@g","solved"],false],[">",["array/len",["array/filter",["object/get","@g","options"],["fn","o",["and",["==","@payload.grounded",true],["and",["<=",["math/abs",["-","@payload.x",["+",["object/get","@g","x"],["object/get","@o","dx"]]]],"@config.reachX"],["<=",["math/abs",["-","@payload.y",["object/get","@g","y"]]],"@config.reachY"]]]]]],0]]]]]],["if",[">",["array/len","@touch"],0],["let",[["g",["array/first","@touch"]]],["let",[["o",["array/first",["array/filter",["object/get","@g","options"],["fn","oo",["and",["==","@payload.grounded",true],["and",["<=",["math/abs",["-","@payload.x",["+",["object/get","@g","x"],["object/get","@oo","dx"]]]],"@config.reachX"],["<=",["math/abs",["-","@payload.y",["object/get","@g","y"]]],"@config.reachY"]]]]]]]],["if",["==",["object/get","@o","correct"],true],["do",["set","@entity.choices",["array/map","@entity.choices",["fn","c",["if",["==",["object/get","@c","id"],["object/get","@g","id"]],["object/merge","@c",{"solved":true,"chosen":["object/get","@o","id"]}],"@c"]]]],["emit","CHOICE_CORRECT",{"id":["object/get","@g","id"],"optionId":["object/get","@o","id"],"x":["object/get","@g","x"],"y":["object/get","@g","y"]}]],["emit","CHOICE_WRONG",{"id":["object/get","@g","id"],"optionId":["object/get","@o","id"],"x":["+",["object/get","@g","x"],["object/get","@o","dx"]],"y":["object/get","@g","y"]}]]]],null]]]},{"from":"active","to":"active","event":"SET_GATES","eventId":"evt_8NJFRDWGX28EH78BP111TQDW5H","effects":[["set","@entity.choices",["array/map","@payload.gates",["fn","g",["object/merge","@g",{"solved":false,"chosen":""}]]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_8PWD00EMR5AC2Q87PYX93YQ5RZ","effects":[["set","@entity.choices",["array/map","@entity.choices",["fn","g",["object/merge","@g",{"solved":false,"chosen":""}]]]]]}]},"config":{"gates":{"type":"[ChoiceGate]","default":[],"label":"Choice Gates","description":"One row per gate: id, gate center (x, y — y is the option-platform surface the judge tests against), the hint floated on a wrong answer, and the options: id, dx offset from the gate center, the label drawn above the platform, and correct. solved/chosen are stamped at runtime. Seeded onto the entity on INIT; the live set is entity.choices — SET_GATES replaces it at runtime (boards that import gates), and RESTART re-arms the live set rather than re-reading config, so injected gates survive respawns.","tier":"domain","items":{"type":"object","properties":{"solved":{"name":"solved","type":"boolean","required":false},"x":{"name":"x","type":"number","required":true},"options":{"name":"options","type":"array","required":true,"items":{"type":"object","properties":{"id":{"name":"id","type":"string","required":true},"correct":{"name":"correct","type":"boolean","required":true},"dx":{"name":"dx","type":"number","required":true},"label":{"name":"label","type":"string","required":true}}}},"id":{"name":"id","type":"string","required":true},"chosen":{"name":"chosen","type":"string","required":false},"hint":{"name":"hint","type":"string","required":false},"y":{"name":"y","type":"number","required":true}}}},"reachY":{"type":"number","default":1.2,"label":"Reach Y","description":"Vertical tolerance (world units) around the gate's option plane when testing a landing (covers small hops onto the platform surface).","tier":"domain"},"reachX":{"type":"number","default":0.7,"label":"Reach X","description":"Horizontal tolerance (world units) around an option platform's center when testing a landing (approximates the body's half-width plus a step).","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, BODY_MOVED judges option landings; toggle to freeze every gate as-is.","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"ChoiceGatePage","id":"pag_Q1X2FV3V48XJ4BV2GKSDSK1ARK","path":"/choice-gate","traits":[{"ref":"ChoiceGate","refId":"trt_HYM01XHT81X40XKFGT534YRBJG"}]}],"types":{"ChoiceGate":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"hint","type":"string"},{"name":"options","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"dx","type":"number","required":true},{"name":"label","type":"string","required":true},{"name":"correct","type":"boolean","required":true}]},{"name":"solved","type":"boolean"},{"name":"chosen","type":"string"}],"ChoiceOption":[{"name":"id","type":"string","required":true},{"name":"dx","type":"number","required":true},{"name":"label","type":"string","required":true},{"name":"correct","type":"boolean","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_SZ2P52WVAQDNBGCN018ZJ13YAD":{"id":"ent_SZ2P52WVAQDNBGCN018ZJ13YAD","kind":"entity","bakedName":"ChoiceGateData","curName":"ChoiceGateData","renames":[],"owner":"workspace"},"evt_4R89MKCTJVD9DNZ121NW749R78":{"id":"evt_4R89MKCTJVD9DNZ121NW749R78","kind":"event","bakedName":"CHOICE_WRONG","curName":"CHOICE_WRONG","renames":[],"owner":"workspace","parent":"trt_HYM01XHT81X40XKFGT534YRBJG"},"evt_8NJFRDWGX28EH78BP111TQDW5H":{"id":"evt_8NJFRDWGX28EH78BP111TQDW5H","kind":"event","bakedName":"SET_GATES","curName":"SET_GATES","renames":[],"owner":"workspace","parent":"trt_HYM01XHT81X40XKFGT534YRBJG"},"evt_8PWD00EMR5AC2Q87PYX93YQ5RZ":{"id":"evt_8PWD00EMR5AC2Q87PYX93YQ5RZ","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_HYM01XHT81X40XKFGT534YRBJG"},"evt_K0AVHGAAZS5FWJS37FFPWB2XM8":{"id":"evt_K0AVHGAAZS5FWJS37FFPWB2XM8","kind":"event","bakedName":"CHOICE_CORRECT","curName":"CHOICE_CORRECT","renames":[],"owner":"workspace","parent":"trt_HYM01XHT81X40XKFGT534YRBJG"},"evt_ND1PK8VT1CX0P8ZH8T59NQKAKH":{"id":"evt_ND1PK8VT1CX0P8ZH8T59NQKAKH","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_HYM01XHT81X40XKFGT534YRBJG"},"evt_Y1VEQHWDF06QG0WRVN13EWS863":{"id":"evt_Y1VEQHWDF06QG0WRVN13EWS863","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_HYM01XHT81X40XKFGT534YRBJG"},"orb_GQVW5APPDVB6XRP4M51K35BKF0":{"id":"orb_GQVW5APPDVB6XRP4M51K35BKF0","kind":"orbital","bakedName":"ChoiceGateOrbital","curName":"ChoiceGateOrbital","renames":[],"owner":"workspace"},"pag_Q1X2FV3V48XJ4BV2GKSDSK1ARK":{"id":"pag_Q1X2FV3V48XJ4BV2GKSDSK1ARK","kind":"page","bakedName":"ChoiceGatePage","curName":"ChoiceGatePage","renames":[],"owner":"workspace"},"trt_HYM01XHT81X40XKFGT534YRBJG":{"id":"trt_HYM01XHT81X40XKFGT534YRBJG","kind":"trait","bakedName":"ChoiceGate","curName":"ChoiceGate","renames":[],"owner":"workspace"}}}}
|
|
1
|
+
{"name":"std-choice-gate","version":"1.0.0","description":"Headless choice-gate mechanic for side-view boards: a gate of N labeled option platforms where progress stops until the player commits to an answer. Listens BODY_MOVED and judges a gate when the player stands grounded on one of its option platforms (|dx| <= reachX of the option center, |dy| <= reachY of the gate's option plane — the pad-lock touch pattern): the correct option stamps the gate solved + chosen on the shared entity and emits CHOICE_CORRECT once (a solved gate never judges again, so the path stays open); a wrong option emits CHOICE_WRONG carrying the gate id, the chosen optionId, and the option's world position, so the board can bounce the player back and float the gate's hint (the board owns the bounce — the atom only reports). RESTART unsolves every live gate (re-arming the live entity set, so SET_GATES-injected gates survive respawns). SET_GATES replaces the gate set at runtime for boards that import their gates. Renders nothing; boards draw the option platforms and labels from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, agency.","orbitals":[{"name":"ChoiceGateOrbital","id":"orb_GQVW5APPDVB6XRP4M51K35BKF0","entity":{"name":"ChoiceGateData","id":"ent_SZ2P52WVAQDNBGCN018ZJ13YAD","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"choices","type":"array","default":[],"items":{"type":"object","properties":{"options":{"name":"options","type":"array","required":true,"items":{"type":"object","properties":{"id":{"name":"id","type":"string","required":true},"correct":{"name":"correct","type":"boolean","required":true},"label":{"name":"label","type":"string","required":true},"dx":{"name":"dx","type":"number","required":true}}}},"id":{"name":"id","type":"string","required":true},"y":{"name":"y","type":"number","required":true},"solved":{"name":"solved","type":"boolean","required":false},"chosen":{"name":"chosen","type":"string","required":false},"hint":{"name":"hint","type":"string","required":false},"x":{"name":"x","type":"number","required":true}}}}],"shared":true},"traits":[{"name":"ChoiceGate","id":"trt_HYM01XHT81X40XKFGT534YRBJG","entityRebindable":true,"entityContract":{"requires":[],"provides":["choices"]},"effectRow":[{"kind":"emit","resource":"CHOICE_CORRECT"},{"kind":"emit","resource":"CHOICE_WRONG"},{"kind":"set","resource":"@entity.choices"}],"category":"lifecycle","linkedEntity":"ChoiceGateData","linkedEntityId":"ent_SZ2P52WVAQDNBGCN018ZJ13YAD","entityRefIds":{"ChoiceGateData":"ent_SZ2P52WVAQDNBGCN018ZJ13YAD"},"emits":[{"event":"CHOICE_CORRECT","eventId":"evt_K0AVHGAAZS5FWJS37FFPWB2XM8","description":"The player landed grounded on the gate's correct option; fires once per gate (solved gates stop judging). Carries the gate id, the chosen optionId, and the gate center so boards can burst the unlock there.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"optionId","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"event":"CHOICE_WRONG","eventId":"evt_4R89MKCTJVD9DNZ121NW749R78","description":"The player landed grounded on a wrong option; carries the gate id, the chosen optionId, and the option's world position so boards can bounce the player back to the approach and float the gate's hint.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"optionId","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_ND1PK8VT1CX0P8ZH8T59NQKAKH","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_Y1VEQHWDF06QG0WRVN13EWS863","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_GATES","id":"evt_8NJFRDWGX28EH78BP111TQDW5H","name":"Set Gates","payloadSchema":[{"name":"gates","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"hint","type":"string"},{"name":"options","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"dx","type":"number","required":true},{"name":"label","type":"string","required":true},{"name":"correct","type":"boolean","required":true}]},{"name":"solved","type":"boolean"},{"name":"chosen","type":"string"}]}],"listened":true},{"key":"RESTART","id":"evt_8PWD00EMR5AC2Q87PYX93YQ5RZ","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"CHOICE_CORRECT","id":"evt_K0AVHGAAZS5FWJS37FFPWB2XM8","name":"Choice Correct","description":"The player landed grounded on the gate's correct option; fires once per gate (solved gates stop judging). Carries the gate id, the chosen optionId, and the gate center so boards can burst the unlock there.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"optionId","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"key":"CHOICE_WRONG","id":"evt_4R89MKCTJVD9DNZ121NW749R78","name":"Choice Wrong","description":"The player landed grounded on a wrong option; carries the gate id, the chosen optionId, and the option's world position so boards can bounce the player back to the approach and float the gate's hint.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"optionId","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_ND1PK8VT1CX0P8ZH8T59NQKAKH","effects":[["set","@entity.choices",["array/map","@config.gates",["fn","g",["object/merge","@g",{"solved":false,"chosen":""}]]]]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_Y1VEQHWDF06QG0WRVN13EWS863","guard":"@config.running","effects":[["let",[["touch",["array/filter","@entity.choices",["fn","g",["and",["==",["object/get","@g","solved"],false],[">",["array/len",["array/filter",["object/get","@g","options"],["fn","o",["and",["==","@payload.grounded",true],["and",["<=",["math/abs",["-","@payload.x",["+",["object/get","@g","x"],["object/get","@o","dx"]]]],"@config.reachX"],["<=",["math/abs",["-","@payload.y",["object/get","@g","y"]]],"@config.reachY"]]]]]],0]]]]]],["if",[">",["array/len","@touch"],0],["let",[["g",["array/first","@touch"]]],["let",[["o",["array/first",["array/filter",["object/get","@g","options"],["fn","oo",["and",["==","@payload.grounded",true],["and",["<=",["math/abs",["-","@payload.x",["+",["object/get","@g","x"],["object/get","@oo","dx"]]]],"@config.reachX"],["<=",["math/abs",["-","@payload.y",["object/get","@g","y"]]],"@config.reachY"]]]]]]]],["if",["==",["object/get","@o","correct"],true],["do",["set","@entity.choices",["array/map","@entity.choices",["fn","c",["if",["==",["object/get","@c","id"],["object/get","@g","id"]],["object/merge","@c",{"solved":true,"chosen":["object/get","@o","id"]}],"@c"]]]],["emit","CHOICE_CORRECT",{"id":["object/get","@g","id"],"optionId":["object/get","@o","id"],"x":["object/get","@g","x"],"y":["object/get","@g","y"]}]],["emit","CHOICE_WRONG",{"id":["object/get","@g","id"],"optionId":["object/get","@o","id"],"x":["+",["object/get","@g","x"],["object/get","@o","dx"]],"y":["object/get","@g","y"]}]]]],null]]]},{"from":"active","to":"active","event":"SET_GATES","eventId":"evt_8NJFRDWGX28EH78BP111TQDW5H","effects":[["set","@entity.choices",["array/map","@payload.gates",["fn","g",["object/merge","@g",{"solved":false,"chosen":""}]]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_8PWD00EMR5AC2Q87PYX93YQ5RZ","effects":[["set","@entity.choices",["array/map","@entity.choices",["fn","g",["object/merge","@g",{"solved":false,"chosen":""}]]]]]}]},"config":{"gates":{"type":"[ChoiceGate]","default":[],"label":"Choice Gates","description":"One row per gate: id, gate center (x, y — y is the option-platform surface the judge tests against), the hint floated on a wrong answer, and the options: id, dx offset from the gate center, the label drawn above the platform, and correct. solved/chosen are stamped at runtime. Seeded onto the entity on INIT; the live set is entity.choices — SET_GATES replaces it at runtime (boards that import gates), and RESTART re-arms the live set rather than re-reading config, so injected gates survive respawns.","tier":"domain","items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":true},"id":{"name":"id","type":"string","required":true},"y":{"name":"y","type":"number","required":true},"options":{"name":"options","type":"array","required":true,"items":{"type":"object","properties":{"label":{"name":"label","type":"string","required":true},"correct":{"name":"correct","type":"boolean","required":true},"id":{"name":"id","type":"string","required":true},"dx":{"name":"dx","type":"number","required":true}}}},"solved":{"name":"solved","type":"boolean","required":false},"hint":{"name":"hint","type":"string","required":false},"chosen":{"name":"chosen","type":"string","required":false}}}},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, BODY_MOVED judges option landings; toggle to freeze every gate as-is.","tier":"domain"},"reachY":{"type":"number","default":1.2,"label":"Reach Y","description":"Vertical tolerance (world units) around the gate's option plane when testing a landing (covers small hops onto the platform surface).","tier":"domain"},"reachX":{"type":"number","default":0.7,"label":"Reach X","description":"Horizontal tolerance (world units) around an option platform's center when testing a landing (approximates the body's half-width plus a step).","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"ChoiceGatePage","id":"pag_Q1X2FV3V48XJ4BV2GKSDSK1ARK","path":"/choice-gate","traits":[{"ref":"ChoiceGate","refId":"trt_HYM01XHT81X40XKFGT534YRBJG"}]}],"types":{"ChoiceGate":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"hint","type":"string"},{"name":"options","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"dx","type":"number","required":true},{"name":"label","type":"string","required":true},{"name":"correct","type":"boolean","required":true}]},{"name":"solved","type":"boolean"},{"name":"chosen","type":"string"}],"ChoiceOption":[{"name":"id","type":"string","required":true},{"name":"dx","type":"number","required":true},{"name":"label","type":"string","required":true},{"name":"correct","type":"boolean","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_SZ2P52WVAQDNBGCN018ZJ13YAD":{"id":"ent_SZ2P52WVAQDNBGCN018ZJ13YAD","kind":"entity","bakedName":"ChoiceGateData","curName":"ChoiceGateData","renames":[],"owner":"workspace"},"evt_4R89MKCTJVD9DNZ121NW749R78":{"id":"evt_4R89MKCTJVD9DNZ121NW749R78","kind":"event","bakedName":"CHOICE_WRONG","curName":"CHOICE_WRONG","renames":[],"owner":"workspace","parent":"trt_HYM01XHT81X40XKFGT534YRBJG"},"evt_8NJFRDWGX28EH78BP111TQDW5H":{"id":"evt_8NJFRDWGX28EH78BP111TQDW5H","kind":"event","bakedName":"SET_GATES","curName":"SET_GATES","renames":[],"owner":"workspace","parent":"trt_HYM01XHT81X40XKFGT534YRBJG"},"evt_8PWD00EMR5AC2Q87PYX93YQ5RZ":{"id":"evt_8PWD00EMR5AC2Q87PYX93YQ5RZ","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_HYM01XHT81X40XKFGT534YRBJG"},"evt_K0AVHGAAZS5FWJS37FFPWB2XM8":{"id":"evt_K0AVHGAAZS5FWJS37FFPWB2XM8","kind":"event","bakedName":"CHOICE_CORRECT","curName":"CHOICE_CORRECT","renames":[],"owner":"workspace","parent":"trt_HYM01XHT81X40XKFGT534YRBJG"},"evt_ND1PK8VT1CX0P8ZH8T59NQKAKH":{"id":"evt_ND1PK8VT1CX0P8ZH8T59NQKAKH","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_HYM01XHT81X40XKFGT534YRBJG"},"evt_Y1VEQHWDF06QG0WRVN13EWS863":{"id":"evt_Y1VEQHWDF06QG0WRVN13EWS863","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_HYM01XHT81X40XKFGT534YRBJG"},"orb_GQVW5APPDVB6XRP4M51K35BKF0":{"id":"orb_GQVW5APPDVB6XRP4M51K35BKF0","kind":"orbital","bakedName":"ChoiceGateOrbital","curName":"ChoiceGateOrbital","renames":[],"owner":"workspace"},"pag_Q1X2FV3V48XJ4BV2GKSDSK1ARK":{"id":"pag_Q1X2FV3V48XJ4BV2GKSDSK1ARK","kind":"page","bakedName":"ChoiceGatePage","curName":"ChoiceGatePage","renames":[],"owner":"workspace"},"trt_HYM01XHT81X40XKFGT534YRBJG":{"id":"trt_HYM01XHT81X40XKFGT534YRBJG","kind":"trait","bakedName":"ChoiceGate","curName":"ChoiceGate","renames":[],"owner":"workspace"}}}}
|