@almadar/std 16.253.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/evals/eval-agent-builder.lolo +152 -0
- package/behaviors/lolo/agent/organisms/std-agent-builder.lolo +320 -26
- 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-memory.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-audit-capture.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-cross-reference.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-label-capture.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-detail-layout.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-geosearch.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-coef-pad","version":"1.0.0","description":"Headless coefficient-pad mechanic for graph-riding boards: floor pads that reshape the road the player is riding (y = a·f(x−h) + k). Listens BODY_MOVED and, when the player stands grounded on an unapplied pad (|dx| <= reachX, |dy| <= reachY of the pad center — the pad-lock touch pattern), stamps the pad applied on the shared entity and emits COEF_PAD_APPLIED carrying the pad position AND its mod (x0, x1, a, h, k), so the board can append the mod to the body authority's curveMods (std-platformer-body with curveModsEnabled) and hop the player onto the reshaped surface. When every pad is applied it emits COEF_PAD_SET_COMPLETED once. RESTART un-applies every live pad (re-arming the live entity set, so SET_PADS-injected pads survive respawns; the board clears curveMods alongside — the pad reports, the board owns the road). SET_PADS replaces the pad set at runtime for boards that import their pads. Renders nothing; boards draw the pads and read applied from the shared entity (the render authority).","orbitals":[{"name":"CoefPadOrbital","id":"orb_TG2E0B528TH4D6FDG1RHYZW6HE","entity":{"name":"CoefPadData","id":"ent_WZCQAW8BTA5X56FKKBM7KZA42C","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"coefPads","type":"array","default":[],"items":{"type":"object","properties":{"hint":{"name":"hint","type":"string","required":false},"mod":{"name":"mod","type":"object","required":true,"properties":{"h":{"name":"h","type":"number","required":true},"a":{"name":"a","type":"number","required":true},"x0":{"name":"x0","type":"number","required":true},"x1":{"name":"x1","type":"number","required":true},"b":{"name":"b","type":"number","required":false},"k":{"name":"k","type":"number","required":true}}},"samples":{"name":"samples","type":"array","required":false,"items":{"type":"object","properties":{"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true}}}},"glyph":{"name":"glyph","type":"string","required":false},"x":{"name":"x","type":"number","required":true},"applied":{"name":"applied","type":"boolean","required":false},"y":{"name":"y","type":"number","required":true},"hop":{"name":"hop","type":"boolean","required":false},"id":{"name":"id","type":"string","required":true}}}},{"name":"coefCompleted","type":"boolean","default":false}],"shared":true},"traits":[{"name":"CoefPadLock","id":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6","entityRebindable":true,"entityContract":{"requires":[],"provides":["coefCompleted","coefPads"]},"effectRow":[{"kind":"emit","resource":"COEF_PAD_APPLIED"},{"kind":"emit","resource":"COEF_PAD_SET_COMPLETED"},{"kind":"set","resource":"@entity.coefCompleted"},{"kind":"set","resource":"@entity.coefPads"}],"category":"lifecycle","linkedEntity":"CoefPadData","linkedEntityId":"ent_WZCQAW8BTA5X56FKKBM7KZA42C","entityRefIds":{"CoefPadData":"ent_WZCQAW8BTA5X56FKKBM7KZA42C"},"emits":[{"event":"COEF_PAD_APPLIED","eventId":"evt_45JZHW9R2GW18AKWB0SNSHNFW9","description":"The player stood on an unapplied coefficient pad; carries the pad position and the full mod (x0, x1, a, b, h, k) so the board appends it to the body authority's curveMods and hops the player onto the reshaped road. Fires once per pad per run.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"a","type":"number","required":true},{"name":"b","type":"number"},{"name":"h","type":"number","required":true},{"name":"k","type":"number","required":true},{"name":"hint","type":"string"},{"name":"hop","type":"boolean"},{"name":"samples","type":"[object]","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}],"entity":"CoefModSample"}]},{"event":"COEF_PAD_SET_COMPLETED","eventId":"evt_KTNT7G1898M4MBA0860292Q5H8","description":"Every coefficient pad in the set is applied; fires once per run. Boards layer the completion fx and dismiss the zone card.","tier":"domain","scope":"external"}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_JXNQGCBR2GW18FXJJF632913DW","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_7V43MQK7P5KV2G1MVYWQRMPJPF","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_PADS","id":"evt_2MFW1F9CMQPABJT4QNX14TKFP3","name":"Set Pads","payloadSchema":[{"name":"pads","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"mod","type":"object","required":true,"properties":[{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"a","type":"number","required":true},{"name":"b","type":"number"},{"name":"h","type":"number","required":true},{"name":"k","type":"number","required":true}]},{"name":"glyph","type":"string"},{"name":"hint","type":"string"},{"name":"hop","type":"boolean"},{"name":"samples","type":"[object]","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"applied","type":"boolean"}]}],"listened":true},{"key":"RESTART","id":"evt_NAJTTT9FKTQSX0G9XHD8BSN55Q","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"COEF_PAD_APPLIED","id":"evt_45JZHW9R2GW18AKWB0SNSHNFW9","name":"Coef Pad Applied","description":"The player stood on an unapplied coefficient pad; carries the pad position and the full mod (x0, x1, a, b, h, k) so the board appends it to the body authority's curveMods and hops the player onto the reshaped road. Fires once per pad per run.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"a","type":"number","required":true},{"name":"b","type":"number"},{"name":"h","type":"number","required":true},{"name":"k","type":"number","required":true},{"name":"hint","type":"string"},{"name":"hop","type":"boolean"},{"name":"samples","type":"[object]","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}],"entity":"CoefModSample"}]},{"key":"COEF_PAD_SET_COMPLETED","id":"evt_KTNT7G1898M4MBA0860292Q5H8","name":"Coef Pad Set Completed","description":"Every coefficient pad in the set is applied; fires once per run. Boards layer the completion fx and dismiss the zone card.","tier":"domain"}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_JXNQGCBR2GW18FXJJF632913DW","effects":[["set","@entity.coefPads",["array/map","@config.coefPads",["fn","p",["object/merge","@p",{"applied":false}]]]],["set","@entity.coefCompleted",false]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_7V43MQK7P5KV2G1MVYWQRMPJPF","guard":"@config.running","effects":[["let",[["touch",["array/filter","@entity.coefPads",["fn","p",["and",["==",["object/get","@p","applied"],false],["and",["==","@payload.grounded",true],["and",["<=",["math/abs",["-","@payload.x",["object/get","@p","x"]]],"@config.reachX"],["<=",["math/abs",["-","@payload.y",["object/get","@p","y"]]],"@config.reachY"]]]]]]]],["if",[">",["array/len","@touch"],0],["let",[["p",["array/first","@touch"]]],["let",[["m",["object/get","@p","mod"]]],["let",[["remaining",["array/len",["array/filter","@entity.coefPads",["fn","c",["and",["==",["object/get","@c","applied"],false],["!=",["object/get","@c","id"],["object/get","@p","id"]]]]]]]],["do",["set","@entity.coefPads",["array/map","@entity.coefPads",["fn","c",["if",["==",["object/get","@c","id"],["object/get","@p","id"]],["object/merge","@c",{"applied":true}],"@c"]]]],["emit","COEF_PAD_APPLIED",{"id":["object/get","@p","id"],"x":["object/get","@p","x"],"y":["object/get","@p","y"],"x0":["object/get","@m","x0"],"x1":["object/get","@m","x1"],"a":["object/get","@m","a"],"b":["if",["==",["object/get","@m","b"],null],1,["object/get","@m","b"]],"h":["object/get","@m","h"],"k":["object/get","@m","k"],"hint":["object/get","@p","hint"],"hop":["object/get","@p","hop"],"samples":["object/get","@p","samples"]}],["if",["and",["==","@entity.coefCompleted",false],["==","@remaining",0]],["do",["set","@entity.coefCompleted",true],["emit","COEF_PAD_SET_COMPLETED",{}]],null]]]]],null]]]},{"from":"active","to":"active","event":"SET_PADS","eventId":"evt_2MFW1F9CMQPABJT4QNX14TKFP3","effects":[["set","@entity.coefPads",["array/map","@payload.pads",["fn","p",["object/merge","@p",{"applied":false}]]]],["set","@entity.coefCompleted",false]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_NAJTTT9FKTQSX0G9XHD8BSN55Q","effects":[["set","@entity.coefPads",["array/map","@entity.coefPads",["fn","p",["object/merge","@p",{"applied":false}]]]],["set","@entity.coefCompleted",false]]}]},"config":{"coefPads":{"type":"[CoefPad]","default":[],"label":"Coefficient Pads","description":"One row per pad: id, center (x, y in world units), the mod applied to the road while inside x0..x1 (a scales slope+height, b compresses/stretch period, h shifts horizontally, k lifts), and the hint floated on apply, and hop (true = the board teleports the player onto the reshaped surface — use when the mod steps the road far from the pad; false = the skate snap carries the player, preserving speed). applied is stamped at runtime. Seeded onto the entity on INIT; the live set is entity.coefPads — SET_PADS replaces it at runtime (boards that import pads), and RESTART re-arms the live set rather than re-reading config, so injected pads survive respawns.","tier":"domain","items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":true},"glyph":{"name":"glyph","type":"string","required":false},"applied":{"name":"applied","type":"boolean","required":false},"hint":{"name":"hint","type":"string","required":false},"id":{"name":"id","type":"string","required":true},"hop":{"name":"hop","type":"boolean","required":false},"samples":{"name":"samples","type":"array","required":false,"items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}}},"mod":{"name":"mod","type":"object","required":true,"properties":{"k":{"name":"k","type":"number","required":true},"b":{"name":"b","type":"number","required":false},"x1":{"name":"x1","type":"number","required":true},"x0":{"name":"x0","type":"number","required":true},"h":{"name":"h","type":"number","required":true},"a":{"name":"a","type":"number","required":true}}},"y":{"name":"y","type":"number","required":true}}}},"reachY":{"type":"number","default":1.2,"label":"Reach Y","description":"Vertical tolerance (world units) around a pad's center when testing player contact (covers riding the surface the pad sits on).","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, BODY_MOVED applies touched pads; toggle to freeze every pad as-is.","tier":"domain"},"reachX":{"type":"number","default":0.7,"label":"Reach X","description":"Horizontal tolerance (world units) around a pad's center when testing player contact (approximates the body's half-width plus a step).","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"CoefPadPage","id":"pag_JGHFMANZTWZXEDVEP2P8D7H7GJ","path":"/coef-pad","traits":[{"ref":"CoefPadLock","refId":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6"}]}],"types":{"CoefMod":[{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"a","type":"number","required":true},{"name":"b","type":"number"},{"name":"h","type":"number","required":true},{"name":"k","type":"number","required":true}],"CoefModSample":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}],"CoefPad":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"mod","type":"object","required":true,"properties":[{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"a","type":"number","required":true},{"name":"b","type":"number"},{"name":"h","type":"number","required":true},{"name":"k","type":"number","required":true}]},{"name":"glyph","type":"string"},{"name":"hint","type":"string"},{"name":"hop","type":"boolean"},{"name":"samples","type":"[object]","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"applied","type":"boolean"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_WZCQAW8BTA5X56FKKBM7KZA42C":{"id":"ent_WZCQAW8BTA5X56FKKBM7KZA42C","kind":"entity","bakedName":"CoefPadData","curName":"CoefPadData","renames":[],"owner":"workspace"},"evt_2MFW1F9CMQPABJT4QNX14TKFP3":{"id":"evt_2MFW1F9CMQPABJT4QNX14TKFP3","kind":"event","bakedName":"SET_PADS","curName":"SET_PADS","renames":[],"owner":"workspace","parent":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6"},"evt_45JZHW9R2GW18AKWB0SNSHNFW9":{"id":"evt_45JZHW9R2GW18AKWB0SNSHNFW9","kind":"event","bakedName":"COEF_PAD_APPLIED","curName":"COEF_PAD_APPLIED","renames":[],"owner":"workspace","parent":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6"},"evt_7V43MQK7P5KV2G1MVYWQRMPJPF":{"id":"evt_7V43MQK7P5KV2G1MVYWQRMPJPF","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6"},"evt_JXNQGCBR2GW18FXJJF632913DW":{"id":"evt_JXNQGCBR2GW18FXJJF632913DW","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6"},"evt_KTNT7G1898M4MBA0860292Q5H8":{"id":"evt_KTNT7G1898M4MBA0860292Q5H8","kind":"event","bakedName":"COEF_PAD_SET_COMPLETED","curName":"COEF_PAD_SET_COMPLETED","renames":[],"owner":"workspace","parent":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6"},"evt_NAJTTT9FKTQSX0G9XHD8BSN55Q":{"id":"evt_NAJTTT9FKTQSX0G9XHD8BSN55Q","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6"},"orb_TG2E0B528TH4D6FDG1RHYZW6HE":{"id":"orb_TG2E0B528TH4D6FDG1RHYZW6HE","kind":"orbital","bakedName":"CoefPadOrbital","curName":"CoefPadOrbital","renames":[],"owner":"workspace"},"pag_JGHFMANZTWZXEDVEP2P8D7H7GJ":{"id":"pag_JGHFMANZTWZXEDVEP2P8D7H7GJ","kind":"page","bakedName":"CoefPadPage","curName":"CoefPadPage","renames":[],"owner":"workspace"},"trt_KWR7WH1K15SGJGWVDM7B6HZEP6":{"id":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6","kind":"trait","bakedName":"CoefPadLock","curName":"CoefPadLock","renames":[],"owner":"workspace"}}}}
|
|
1
|
+
{"name":"std-coef-pad","version":"1.0.0","description":"Headless coefficient-pad mechanic for graph-riding boards: floor pads that reshape the road the player is riding (y = a·f(x−h) + k). Listens BODY_MOVED and, when the player stands grounded on an unapplied pad (|dx| <= reachX, |dy| <= reachY of the pad center — the pad-lock touch pattern), stamps the pad applied on the shared entity and emits COEF_PAD_APPLIED carrying the pad position AND its mod (x0, x1, a, h, k), so the board can append the mod to the body authority's curveMods (std-platformer-body with curveModsEnabled) and hop the player onto the reshaped surface. When every pad is applied it emits COEF_PAD_SET_COMPLETED once. RESTART un-applies every live pad (re-arming the live entity set, so SET_PADS-injected pads survive respawns; the board clears curveMods alongside — the pad reports, the board owns the road). SET_PADS replaces the pad set at runtime for boards that import their pads. Renders nothing; boards draw the pads and read applied from the shared entity (the render authority).","orbitals":[{"name":"CoefPadOrbital","id":"orb_TG2E0B528TH4D6FDG1RHYZW6HE","entity":{"name":"CoefPadData","id":"ent_WZCQAW8BTA5X56FKKBM7KZA42C","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"coefPads","type":"array","default":[],"items":{"type":"object","properties":{"glyph":{"name":"glyph","type":"string","required":false},"y":{"name":"y","type":"number","required":true},"samples":{"name":"samples","type":"array","required":false,"items":{"type":"object","properties":{"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true}}}},"mod":{"name":"mod","type":"object","required":true,"properties":{"h":{"name":"h","type":"number","required":true},"a":{"name":"a","type":"number","required":true},"x1":{"name":"x1","type":"number","required":true},"x0":{"name":"x0","type":"number","required":true},"b":{"name":"b","type":"number","required":false},"k":{"name":"k","type":"number","required":true}}},"hint":{"name":"hint","type":"string","required":false},"applied":{"name":"applied","type":"boolean","required":false},"x":{"name":"x","type":"number","required":true},"hop":{"name":"hop","type":"boolean","required":false},"id":{"name":"id","type":"string","required":true}}}},{"name":"coefCompleted","type":"boolean","default":false}],"shared":true},"traits":[{"name":"CoefPadLock","id":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6","entityRebindable":true,"entityContract":{"requires":[],"provides":["coefCompleted","coefPads"]},"effectRow":[{"kind":"emit","resource":"COEF_PAD_APPLIED"},{"kind":"emit","resource":"COEF_PAD_SET_COMPLETED"},{"kind":"set","resource":"@entity.coefCompleted"},{"kind":"set","resource":"@entity.coefPads"}],"category":"lifecycle","linkedEntity":"CoefPadData","linkedEntityId":"ent_WZCQAW8BTA5X56FKKBM7KZA42C","entityRefIds":{"CoefPadData":"ent_WZCQAW8BTA5X56FKKBM7KZA42C"},"emits":[{"event":"COEF_PAD_APPLIED","eventId":"evt_45JZHW9R2GW18AKWB0SNSHNFW9","description":"The player stood on an unapplied coefficient pad; carries the pad position and the full mod (x0, x1, a, b, h, k) so the board appends it to the body authority's curveMods and hops the player onto the reshaped road. Fires once per pad per run.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"a","type":"number","required":true},{"name":"b","type":"number"},{"name":"h","type":"number","required":true},{"name":"k","type":"number","required":true},{"name":"hint","type":"string"},{"name":"hop","type":"boolean"},{"name":"samples","type":"[object]","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}],"entity":"CoefModSample"}]},{"event":"COEF_PAD_SET_COMPLETED","eventId":"evt_KTNT7G1898M4MBA0860292Q5H8","description":"Every coefficient pad in the set is applied; fires once per run. Boards layer the completion fx and dismiss the zone card.","tier":"domain","scope":"external"}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_JXNQGCBR2GW18FXJJF632913DW","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_7V43MQK7P5KV2G1MVYWQRMPJPF","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_PADS","id":"evt_2MFW1F9CMQPABJT4QNX14TKFP3","name":"Set Pads","payloadSchema":[{"name":"pads","type":"[object]","required":true,"properties":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"mod","type":"object","required":true,"properties":[{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"a","type":"number","required":true},{"name":"b","type":"number"},{"name":"h","type":"number","required":true},{"name":"k","type":"number","required":true}]},{"name":"glyph","type":"string"},{"name":"hint","type":"string"},{"name":"hop","type":"boolean"},{"name":"samples","type":"[object]","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"applied","type":"boolean"}]}],"listened":true},{"key":"RESTART","id":"evt_NAJTTT9FKTQSX0G9XHD8BSN55Q","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"COEF_PAD_APPLIED","id":"evt_45JZHW9R2GW18AKWB0SNSHNFW9","name":"Coef Pad Applied","description":"The player stood on an unapplied coefficient pad; carries the pad position and the full mod (x0, x1, a, b, h, k) so the board appends it to the body authority's curveMods and hops the player onto the reshaped road. Fires once per pad per run.","tier":"domain","payloadSchema":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"a","type":"number","required":true},{"name":"b","type":"number"},{"name":"h","type":"number","required":true},{"name":"k","type":"number","required":true},{"name":"hint","type":"string"},{"name":"hop","type":"boolean"},{"name":"samples","type":"[object]","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}],"entity":"CoefModSample"}]},{"key":"COEF_PAD_SET_COMPLETED","id":"evt_KTNT7G1898M4MBA0860292Q5H8","name":"Coef Pad Set Completed","description":"Every coefficient pad in the set is applied; fires once per run. Boards layer the completion fx and dismiss the zone card.","tier":"domain"}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_JXNQGCBR2GW18FXJJF632913DW","effects":[["set","@entity.coefPads",["array/map","@config.coefPads",["fn","p",["object/merge","@p",{"applied":false}]]]],["set","@entity.coefCompleted",false]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_7V43MQK7P5KV2G1MVYWQRMPJPF","guard":"@config.running","effects":[["let",[["touch",["array/filter","@entity.coefPads",["fn","p",["and",["==",["object/get","@p","applied"],false],["and",["==","@payload.grounded",true],["and",["<=",["math/abs",["-","@payload.x",["object/get","@p","x"]]],"@config.reachX"],["<=",["math/abs",["-","@payload.y",["object/get","@p","y"]]],"@config.reachY"]]]]]]]],["if",[">",["array/len","@touch"],0],["let",[["p",["array/first","@touch"]]],["let",[["m",["object/get","@p","mod"]]],["let",[["remaining",["array/len",["array/filter","@entity.coefPads",["fn","c",["and",["==",["object/get","@c","applied"],false],["!=",["object/get","@c","id"],["object/get","@p","id"]]]]]]]],["do",["set","@entity.coefPads",["array/map","@entity.coefPads",["fn","c",["if",["==",["object/get","@c","id"],["object/get","@p","id"]],["object/merge","@c",{"applied":true}],"@c"]]]],["emit","COEF_PAD_APPLIED",{"id":["object/get","@p","id"],"x":["object/get","@p","x"],"y":["object/get","@p","y"],"x0":["object/get","@m","x0"],"x1":["object/get","@m","x1"],"a":["object/get","@m","a"],"b":["if",["==",["object/get","@m","b"],null],1,["object/get","@m","b"]],"h":["object/get","@m","h"],"k":["object/get","@m","k"],"hint":["object/get","@p","hint"],"hop":["object/get","@p","hop"],"samples":["object/get","@p","samples"]}],["if",["and",["==","@entity.coefCompleted",false],["==","@remaining",0]],["do",["set","@entity.coefCompleted",true],["emit","COEF_PAD_SET_COMPLETED",{}]],null]]]]],null]]]},{"from":"active","to":"active","event":"SET_PADS","eventId":"evt_2MFW1F9CMQPABJT4QNX14TKFP3","effects":[["set","@entity.coefPads",["array/map","@payload.pads",["fn","p",["object/merge","@p",{"applied":false}]]]],["set","@entity.coefCompleted",false]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_NAJTTT9FKTQSX0G9XHD8BSN55Q","effects":[["set","@entity.coefPads",["array/map","@entity.coefPads",["fn","p",["object/merge","@p",{"applied":false}]]]],["set","@entity.coefCompleted",false]]}]},"config":{"coefPads":{"type":"[CoefPad]","default":[],"label":"Coefficient Pads","description":"One row per pad: id, center (x, y in world units), the mod applied to the road while inside x0..x1 (a scales slope+height, b compresses/stretch period, h shifts horizontally, k lifts), and the hint floated on apply, and hop (true = the board teleports the player onto the reshaped surface — use when the mod steps the road far from the pad; false = the skate snap carries the player, preserving speed). applied is stamped at runtime. Seeded onto the entity on INIT; the live set is entity.coefPads — SET_PADS replaces it at runtime (boards that import pads), and RESTART re-arms the live set rather than re-reading config, so injected pads survive respawns.","tier":"domain","items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":true},"applied":{"name":"applied","type":"boolean","required":false},"id":{"name":"id","type":"string","required":true},"glyph":{"name":"glyph","type":"string","required":false},"y":{"name":"y","type":"number","required":true},"hop":{"name":"hop","type":"boolean","required":false},"samples":{"name":"samples","type":"array","required":false,"items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":true},"y":{"name":"y","type":"number","required":true}}}},"mod":{"name":"mod","type":"object","required":true,"properties":{"h":{"name":"h","type":"number","required":true},"x1":{"name":"x1","type":"number","required":true},"b":{"name":"b","type":"number","required":false},"k":{"name":"k","type":"number","required":true},"a":{"name":"a","type":"number","required":true},"x0":{"name":"x0","type":"number","required":true}}},"hint":{"name":"hint","type":"string","required":false}}}},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, BODY_MOVED applies touched pads; toggle to freeze every pad as-is.","tier":"domain"},"reachX":{"type":"number","default":0.7,"label":"Reach X","description":"Horizontal tolerance (world units) around a pad's center when testing player contact (approximates the body's half-width plus a step).","tier":"domain"},"reachY":{"type":"number","default":1.2,"label":"Reach Y","description":"Vertical tolerance (world units) around a pad's center when testing player contact (covers riding the surface the pad sits on).","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"CoefPadPage","id":"pag_JGHFMANZTWZXEDVEP2P8D7H7GJ","path":"/coef-pad","traits":[{"ref":"CoefPadLock","refId":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6"}]}],"types":{"CoefMod":[{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"a","type":"number","required":true},{"name":"b","type":"number"},{"name":"h","type":"number","required":true},{"name":"k","type":"number","required":true}],"CoefModSample":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}],"CoefPad":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"mod","type":"object","required":true,"properties":[{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"a","type":"number","required":true},{"name":"b","type":"number"},{"name":"h","type":"number","required":true},{"name":"k","type":"number","required":true}]},{"name":"glyph","type":"string"},{"name":"hint","type":"string"},{"name":"hop","type":"boolean"},{"name":"samples","type":"[object]","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"applied","type":"boolean"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_WZCQAW8BTA5X56FKKBM7KZA42C":{"id":"ent_WZCQAW8BTA5X56FKKBM7KZA42C","kind":"entity","bakedName":"CoefPadData","curName":"CoefPadData","renames":[],"owner":"workspace"},"evt_2MFW1F9CMQPABJT4QNX14TKFP3":{"id":"evt_2MFW1F9CMQPABJT4QNX14TKFP3","kind":"event","bakedName":"SET_PADS","curName":"SET_PADS","renames":[],"owner":"workspace","parent":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6"},"evt_45JZHW9R2GW18AKWB0SNSHNFW9":{"id":"evt_45JZHW9R2GW18AKWB0SNSHNFW9","kind":"event","bakedName":"COEF_PAD_APPLIED","curName":"COEF_PAD_APPLIED","renames":[],"owner":"workspace","parent":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6"},"evt_7V43MQK7P5KV2G1MVYWQRMPJPF":{"id":"evt_7V43MQK7P5KV2G1MVYWQRMPJPF","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6"},"evt_JXNQGCBR2GW18FXJJF632913DW":{"id":"evt_JXNQGCBR2GW18FXJJF632913DW","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6"},"evt_KTNT7G1898M4MBA0860292Q5H8":{"id":"evt_KTNT7G1898M4MBA0860292Q5H8","kind":"event","bakedName":"COEF_PAD_SET_COMPLETED","curName":"COEF_PAD_SET_COMPLETED","renames":[],"owner":"workspace","parent":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6"},"evt_NAJTTT9FKTQSX0G9XHD8BSN55Q":{"id":"evt_NAJTTT9FKTQSX0G9XHD8BSN55Q","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6"},"orb_TG2E0B528TH4D6FDG1RHYZW6HE":{"id":"orb_TG2E0B528TH4D6FDG1RHYZW6HE","kind":"orbital","bakedName":"CoefPadOrbital","curName":"CoefPadOrbital","renames":[],"owner":"workspace"},"pag_JGHFMANZTWZXEDVEP2P8D7H7GJ":{"id":"pag_JGHFMANZTWZXEDVEP2P8D7H7GJ","kind":"page","bakedName":"CoefPadPage","curName":"CoefPadPage","renames":[],"owner":"workspace"},"trt_KWR7WH1K15SGJGWVDM7B6HZEP6":{"id":"trt_KWR7WH1K15SGJGWVDM7B6HZEP6","kind":"trait","bakedName":"CoefPadLock","curName":"CoefPadLock","renames":[],"owner":"workspace"}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"std-curve-fog","version":"1.0.0","description":"Headless prediction-fog mechanic for graph-riding boards: in configured world regions the road ahead is only partially REVEALED — the atom listens BODY_MOVED and stamps fogX (the reveal horizon = player x + the region's lookAhead) onto the shared entity, and the board's render layer clips or ghosts every road sample past it, so the player must commit to jumps before the landing is visible and internalize where the function GOES (blowup, flattening, slow growth, divergence). Outside every region fogX sits at a large sentinel, i.e. fully revealed. Physics is untouched: the collider keeps the whole curve — the fog is purely visual. Renders nothing; boards clip their own curve/region samples against @entity.fogX (the render authority).","orbitals":[{"name":"CurveFogOrbital","id":"orb_S4NC590TTHDD8HTCBZNYHZ7J4C","entity":{"name":"CurveFogData","id":"ent_SJJGS5FRKZW9ZTSN80BXBEYHS5","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"fogX","type":"number","default":99999}],"shared":true},"traits":[{"name":"CurveFog","id":"trt_3DREW0SKY5SZ2KV0ZZS83977DH","entityRebindable":true,"entityContract":{"requires":[],"provides":["fogX"]},"effectRow":[{"kind":"set","resource":"@entity.fogX"}],"category":"lifecycle","linkedEntity":"CurveFogData","linkedEntityId":"ent_SJJGS5FRKZW9ZTSN80BXBEYHS5","entityRefIds":{"CurveFogData":"ent_SJJGS5FRKZW9ZTSN80BXBEYHS5"},"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_VFKVTPK73KKHSN7KXZRHMV3YDV","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_PFM3CF3J5SS2WMXTDAWDY1VKNG","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":"RESTART","id":"evt_V66T2QH165GK2JXZ31VVVAF341","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_VFKVTPK73KKHSN7KXZRHMV3YDV","effects":[["set","@entity.fogX",99999]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_PFM3CF3J5SS2WMXTDAWDY1VKNG","guard":"@config.running","effects":[["let",[["rmatch",["array/filter","@config.regions",["fn","r",["and",[">=","@payload.x",["object/get","@r","x0"]],["<","@payload.x",["object/get","@r","x1"]]]]]]],["if",[">",["array/len","@rmatch"],0],["set","@entity.fogX",["+","@payload.x",["object/get",["array/first","@rmatch"],"lookAhead"]]],["set","@entity.fogX",99999]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_V66T2QH165GK2JXZ31VVVAF341","effects":[["set","@entity.fogX",99999]]}]},"config":{"
|
|
1
|
+
{"name":"std-curve-fog","version":"1.0.0","description":"Headless prediction-fog mechanic for graph-riding boards: in configured world regions the road ahead is only partially REVEALED — the atom listens BODY_MOVED and stamps fogX (the reveal horizon = player x + the region's lookAhead) onto the shared entity, and the board's render layer clips or ghosts every road sample past it, so the player must commit to jumps before the landing is visible and internalize where the function GOES (blowup, flattening, slow growth, divergence). Outside every region fogX sits at a large sentinel, i.e. fully revealed. Physics is untouched: the collider keeps the whole curve — the fog is purely visual. Renders nothing; boards clip their own curve/region samples against @entity.fogX (the render authority).","orbitals":[{"name":"CurveFogOrbital","id":"orb_S4NC590TTHDD8HTCBZNYHZ7J4C","entity":{"name":"CurveFogData","id":"ent_SJJGS5FRKZW9ZTSN80BXBEYHS5","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"fogX","type":"number","default":99999}],"shared":true},"traits":[{"name":"CurveFog","id":"trt_3DREW0SKY5SZ2KV0ZZS83977DH","entityRebindable":true,"entityContract":{"requires":[],"provides":["fogX"]},"effectRow":[{"kind":"set","resource":"@entity.fogX"}],"category":"lifecycle","linkedEntity":"CurveFogData","linkedEntityId":"ent_SJJGS5FRKZW9ZTSN80BXBEYHS5","entityRefIds":{"CurveFogData":"ent_SJJGS5FRKZW9ZTSN80BXBEYHS5"},"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_VFKVTPK73KKHSN7KXZRHMV3YDV","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_PFM3CF3J5SS2WMXTDAWDY1VKNG","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":"RESTART","id":"evt_V66T2QH165GK2JXZ31VVVAF341","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_VFKVTPK73KKHSN7KXZRHMV3YDV","effects":[["set","@entity.fogX",99999]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_PFM3CF3J5SS2WMXTDAWDY1VKNG","guard":"@config.running","effects":[["let",[["rmatch",["array/filter","@config.regions",["fn","r",["and",[">=","@payload.x",["object/get","@r","x0"]],["<","@payload.x",["object/get","@r","x1"]]]]]]],["if",[">",["array/len","@rmatch"],0],["set","@entity.fogX",["+","@payload.x",["object/get",["array/first","@rmatch"],"lookAhead"]]],["set","@entity.fogX",99999]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_V66T2QH165GK2JXZ31VVVAF341","effects":[["set","@entity.fogX",99999]]}]},"config":{"regions":{"type":"[CurveFogRegion]","default":[],"label":"Fog Regions","description":"One row per fogged world span: x-range (x0..x1) and lookAhead — how far past the player the road stays revealed while inside. Small values force prediction (blowups), large values suit slow tail lessons. Empty list = no fog anywhere.","tier":"domain","items":{"type":"object","properties":{"x1":{"name":"x1","type":"number","required":true},"x0":{"name":"x0","type":"number","required":true},"lookAhead":{"name":"lookAhead","type":"number","required":true}}}},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, BODY_MOVED tracks the reveal horizon; toggle to freeze the fog where it is.","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"CurveFogPage","id":"pag_628H7P7WJ1Y90KA53F3PQZT8AN","path":"/curve-fog","traits":[{"ref":"CurveFog","refId":"trt_3DREW0SKY5SZ2KV0ZZS83977DH"}]}],"types":{"CurveFogRegion":[{"name":"x0","type":"number","required":true},{"name":"x1","type":"number","required":true},{"name":"lookAhead","type":"number","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_SJJGS5FRKZW9ZTSN80BXBEYHS5":{"id":"ent_SJJGS5FRKZW9ZTSN80BXBEYHS5","kind":"entity","bakedName":"CurveFogData","curName":"CurveFogData","renames":[],"owner":"workspace"},"evt_PFM3CF3J5SS2WMXTDAWDY1VKNG":{"id":"evt_PFM3CF3J5SS2WMXTDAWDY1VKNG","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_3DREW0SKY5SZ2KV0ZZS83977DH"},"evt_V66T2QH165GK2JXZ31VVVAF341":{"id":"evt_V66T2QH165GK2JXZ31VVVAF341","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_3DREW0SKY5SZ2KV0ZZS83977DH"},"evt_VFKVTPK73KKHSN7KXZRHMV3YDV":{"id":"evt_VFKVTPK73KKHSN7KXZRHMV3YDV","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_3DREW0SKY5SZ2KV0ZZS83977DH"},"orb_S4NC590TTHDD8HTCBZNYHZ7J4C":{"id":"orb_S4NC590TTHDD8HTCBZNYHZ7J4C","kind":"orbital","bakedName":"CurveFogOrbital","curName":"CurveFogOrbital","renames":[],"owner":"workspace"},"pag_628H7P7WJ1Y90KA53F3PQZT8AN":{"id":"pag_628H7P7WJ1Y90KA53F3PQZT8AN","kind":"page","bakedName":"CurveFogPage","curName":"CurveFogPage","renames":[],"owner":"workspace"},"trt_3DREW0SKY5SZ2KV0ZZS83977DH":{"id":"trt_3DREW0SKY5SZ2KV0ZZS83977DH","kind":"trait","bakedName":"CurveFog","curName":"CurveFog","renames":[],"owner":"workspace"}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"std-dungeon-combat","version":"1.0.0","description":"Headless dungeon combat authority: owns the enemy roster, hero HP, and kill score. Bump-attacks damage enemies; monster ticks chase the hero and deal contact damage.","orbitals":[{"name":"DungeonCombatOrbital","id":"orb_MYCGEP6JYF9F7TPETJ4BQ3G1ZG","entity":{"name":"DungeonCombatData","id":"ent_AXAMCF2BSG5WR2E6ZKWXH7BNRQ","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"enemies","type":"array","default":[],"items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":false},"id":{"name":"id","type":"string","required":true},"frame":{"name":"frame","type":"number","required":false},"health":{"name":"health","type":"number","required":false},"animation":{"name":"animation","type":"string","required":false},"y":{"name":"y","type":"number","required":false},"unitType":{"name":"unitType","type":"string","required":false},"team":{"name":"team","type":"string","required":false},"name":{"name":"name","type":"string","required":false},"position":{"name":"position","type":"object","required":false,"properties":{"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true}}},"maxHealth":{"name":"maxHealth","type":"number","required":false},"z":{"name":"z","type":"number","required":false}}}},{"name":"hp","type":"number","default":5},{"name":"maxHp","type":"number","default":5},{"name":"combatScore","type":"number","default":0},{"name":"combatResult","type":"string","default":"none"}],"shared":true},"traits":[{"name":"DungeonCombat","id":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C","entityRebindable":true,"entityContract":{"requires":[],"provides":["combatResult","combatScore","enemies","hp","maxHp"]},"effectRow":[{"kind":"emit","resource":"BURST"},{"kind":"emit","resource":"DEFEATED"},{"kind":"set","resource":"@entity.combatResult"},{"kind":"set","resource":"@entity.combatScore"},{"kind":"set","resource":"@entity.enemies"},{"kind":"set","resource":"@entity.hp"},{"kind":"set","resource":"@entity.maxHp"}],"category":"lifecycle","linkedEntity":"DungeonCombatData","linkedEntityId":"ent_AXAMCF2BSG5WR2E6ZKWXH7BNRQ","entityRefIds":{"DungeonCombatData":"ent_AXAMCF2BSG5WR2E6ZKWXH7BNRQ"},"emits":[{"event":"BURST","eventId":"evt_SDEVVMK10SGGCT5750V6GGPJ11","description":"An enemy died from a bump-attack; a fx-particles listener spawns an explosion","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":"DEFEATED","eventId":"evt_DRP4ABP2JW19E572VZ7Y18BX78","description":"Hero HP reached zero from monster contact damage","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string"}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_J3T7R2GTS2DCH7Q423NE31ZT9K","name":"Initialize"},{"key":"ATTACK","id":"evt_N1FKXTG74G3J81035QPH6SSMCK","name":"Attack","payloadSchema":[{"name":"targetId","type":"string"}],"listened":true},{"key":"MONSTER_TICK","id":"evt_MF38MDBNDATPN29ZTH7WAGHC29","name":"Monster Tick","payloadSchema":[{"name":"heroX","type":"number"},{"name":"heroY","type":"number"}],"listened":true},{"key":"RESTART","id":"evt_HR9SS7D6NKKASM73DMR1T1Z4M0","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"BURST","id":"evt_SDEVVMK10SGGCT5750V6GGPJ11","name":"Burst","description":"An enemy died from a bump-attack; a fx-particles listener spawns an explosion","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":"DEFEATED","id":"evt_DRP4ABP2JW19E572VZ7Y18BX78","name":"Defeated","description":"Hero HP reached zero from monster contact damage","tier":"domain","payloadSchema":[{"name":"id","type":"string"}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_J3T7R2GTS2DCH7Q423NE31ZT9K","effects":[["set","@entity.enemies","@config.enemies"],["set","@entity.hp","@config.startHp"],["set","@entity.maxHp","@config.startHp"],["set","@entity.combatScore",0],["set","@entity.combatResult","none"]]},{"from":"active","to":"active","event":"ATTACK","eventId":"evt_N1FKXTG74G3J81035QPH6SSMCK","guard":["and","@config.running",[">",["array/len",["array/filter","@entity.enemies",["fn","e",["and",["==","@e.id","@payload.targetId"],[">","@e.health",0]]]]],0]],"effects":[["let",[["target",["array/find","@entity.enemies",["fn","e",["==","@e.id","@payload.targetId"]]]]],["let",[["newHealth",["math/max",0,["-",["object/get","@target","health"],"@config.attackDamage"]]]],["do",["set","@entity.enemies",["array/map","@entity.enemies",["fn","e",["if",["==","@e.id","@payload.targetId"],["object/merge","@e",{"health":"@newHealth","animation":["if",["<=","@newHealth",0],"death","hit"]}],"@e"]]]],["if",["<=","@newHealth",0],["do",["set","@entity.combatScore",["+","@entity.combatScore","@config.pointsPerKill"]],["emit","BURST",{"particles":["array/map",["array/filter","@entity.enemies",["fn","e",["==","@e.id","@payload.targetId"]]],["fn","t",{"id":["str/concat","fx-kill-",["object/get","@t","id"]],"type":"explosion","x":["object/get",["object/get","@t","position"],"x"],"z":["object/get",["object/get","@t","position"],"y"],"ttl":5}]]}]],null]]]]]},{"from":"active","to":"active","event":"MONSTER_TICK","eventId":"evt_MF38MDBNDATPN29ZTH7WAGHC29","guard":"@config.running","effects":[["set","@entity.enemies",["array/map","@entity.enemies",["fn","u",["if",[">","@u.health",0],["let",[["ux",["object/get",["object/get","@u","position"],"x"]],["uy",["object/get",["object/get","@u","position"],"y"]]],["let",[["dx",["math/sign",["-","@payload.heroX","@ux"]]],["dy",["math/sign",["-","@payload.heroY","@uy"]]],["absDx",["math/abs",["-","@payload.heroX","@ux"]]],["absDy",["math/abs",["-","@payload.heroY","@uy"]]]],["let",[["moveX",["and",["!=","@dx",0],[">=","@absDx","@absDy"]]]],["let",[["nx",["if","@moveX",["+","@ux","@dx"],"@ux"]],["ny",["if","@moveX","@uy",["+","@uy","@dy"]]]],["let",[["tile",["array/find","@config.tiles",["fn","t",["and",["==",["object/get","@t","x"],"@nx"],["==",["object/get","@t","y"],"@ny"]]]]],["occupied",["array/find","@entity.enemies",["fn","o",["and",["!=","@o.id","@u.id"],["and",[">","@o.health",0],["and",["==",["object/get",["object/get","@o","position"],"x"],"@nx"],["==",["object/get",["object/get","@o","position"],"y"],"@ny"]]]]]]]],["if",["and",["grid/in-bounds",{"x":"@nx","y":"@ny"},"@config.gridWidth","@config.gridHeight"],["and",["==",["if",["==","@tile",null],false,["object/get","@tile","passable"]],true],["==","@occupied",null]]],["object/merge","@u",{"position":{"x":"@nx","y":"@ny"},"animation":"walk"}],"@u"]]]]]],"@u"]]]],["set","@entity.hp",["if",[">",["array/len",["array/filter","@entity.enemies",["fn","u",["and",[">","@u.health",0],["<=",["grid/manhattan-distance",["object/get","@u","position"],{"x":"@payload.heroX","y":"@payload.heroY"}],1]]]]],0],["math/max",0,["-","@entity.hp",1]],"@entity.hp"]],["if",["<=","@entity.hp",0],["do",["set","@entity.combatResult","lost"],["emit","DEFEATED",{"id":"board"}]],null]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_HR9SS7D6NKKASM73DMR1T1Z4M0","effects":[["set","@entity.enemies","@config.enemies"],["set","@entity.hp","@config.startHp"],["set","@entity.maxHp","@config.startHp"],["set","@entity.combatScore",0],["set","@entity.combatResult","none"]]}]},"config":{"startHp":{"type":"number","default":5,"label":"Start HP","description":"Hero HP set on INIT/RESTART (also used as maxHp)","tier":"domain"},"gridHeight":{"type":"number","default":9,"label":"Grid Height","description":"Grid row count clamping enemy chase bounds","tier":"presentation"},"pointsPerKill":{"type":"number","default":50,"label":"Points Per Kill","description":"Score awarded when an enemy's health reaches zero","tier":"domain"},"attackDamage":{"type":"number","default":1,"label":"Attack Damage","description":"Damage dealt to an enemy per bump-attack","tier":"domain"},"enemies":{"type":"[Unit]","default":[],"label":"Initial Enemies","description":"Seed enemy roster","tier":"domain","items":{"type":"object","properties":{"y":{"name":"y","type":"number","required":false},"name":{"name":"name","type":"string","required":false},"z":{"name":"z","type":"number","required":false},"maxHealth":{"name":"maxHealth","type":"number","required":false},"team":{"name":"team","type":"string","required":false},"x":{"name":"x","type":"number","required":false},"animation":{"name":"animation","type":"string","required":false},"frame":{"name":"frame","type":"number","required":false},"position":{"name":"position","type":"object","required":false,"properties":{"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true}}},"health":{"name":"health","type":"number","required":false},"unitType":{"name":"unitType","type":"string","required":false},"id":{"name":"id","type":"string","required":true}}}},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, ATTACK/MONSTER_TICK intents are applied; toggle to freeze combat","tier":"domain"},"tiles":{"type":"[Tile]","default":[],"label":"Tiles","description":"Grid tiles used for enemy chase passability checks","tier":"presentation","items":{"type":"object","properties":{"y":{"name":"y","type":"number","required":true},"passable":{"name":"passable","type":"boolean","required":false},"x":{"name":"x","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 chase bounds","tier":"presentation"}},"scope":"instance"}],"pages":[{"name":"DungeonCombatPage","id":"pag_BBEM6GFYQ0ZBG34Y3TWSQPF02E","path":"/dungeon-combat","traits":[{"ref":"DungeonCombat","refId":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C"}]}],"types":{"Fx":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"Tile":[{"name":"id","type":"string"},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"passable","type":"boolean"}],"Unit":[{"name":"id","type":"string","required":true},{"name":"position","type":"object","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"x","type":"number"},{"name":"y","type":"number"},{"name":"z","type":"number"},{"name":"team","type":"string"},{"name":"health","type":"number"},{"name":"maxHealth","type":"number"},{"name":"unitType","type":"string"},{"name":"name","type":"string"},{"name":"animation","type":"string"},{"name":"frame","type":"number"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_AXAMCF2BSG5WR2E6ZKWXH7BNRQ":{"id":"ent_AXAMCF2BSG5WR2E6ZKWXH7BNRQ","kind":"entity","bakedName":"DungeonCombatData","curName":"DungeonCombatData","renames":[],"owner":"workspace"},"evt_DRP4ABP2JW19E572VZ7Y18BX78":{"id":"evt_DRP4ABP2JW19E572VZ7Y18BX78","kind":"event","bakedName":"DEFEATED","curName":"DEFEATED","renames":[],"owner":"workspace","parent":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C"},"evt_HR9SS7D6NKKASM73DMR1T1Z4M0":{"id":"evt_HR9SS7D6NKKASM73DMR1T1Z4M0","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C"},"evt_J3T7R2GTS2DCH7Q423NE31ZT9K":{"id":"evt_J3T7R2GTS2DCH7Q423NE31ZT9K","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C"},"evt_MF38MDBNDATPN29ZTH7WAGHC29":{"id":"evt_MF38MDBNDATPN29ZTH7WAGHC29","kind":"event","bakedName":"MONSTER_TICK","curName":"MONSTER_TICK","renames":[],"owner":"workspace","parent":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C"},"evt_N1FKXTG74G3J81035QPH6SSMCK":{"id":"evt_N1FKXTG74G3J81035QPH6SSMCK","kind":"event","bakedName":"ATTACK","curName":"ATTACK","renames":[],"owner":"workspace","parent":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C"},"evt_SDEVVMK10SGGCT5750V6GGPJ11":{"id":"evt_SDEVVMK10SGGCT5750V6GGPJ11","kind":"event","bakedName":"BURST","curName":"BURST","renames":[],"owner":"workspace","parent":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C"},"orb_MYCGEP6JYF9F7TPETJ4BQ3G1ZG":{"id":"orb_MYCGEP6JYF9F7TPETJ4BQ3G1ZG","kind":"orbital","bakedName":"DungeonCombatOrbital","curName":"DungeonCombatOrbital","renames":[],"owner":"workspace"},"pag_BBEM6GFYQ0ZBG34Y3TWSQPF02E":{"id":"pag_BBEM6GFYQ0ZBG34Y3TWSQPF02E","kind":"page","bakedName":"DungeonCombatPage","curName":"DungeonCombatPage","renames":[],"owner":"workspace"},"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C":{"id":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C","kind":"trait","bakedName":"DungeonCombat","curName":"DungeonCombat","renames":[],"owner":"workspace"}}}}
|
|
1
|
+
{"name":"std-dungeon-combat","version":"1.0.0","description":"Headless dungeon combat authority: owns the enemy roster, hero HP, and kill score. Bump-attacks damage enemies; monster ticks chase the hero and deal contact damage.","orbitals":[{"name":"DungeonCombatOrbital","id":"orb_MYCGEP6JYF9F7TPETJ4BQ3G1ZG","entity":{"name":"DungeonCombatData","id":"ent_AXAMCF2BSG5WR2E6ZKWXH7BNRQ","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"enemies","type":"array","default":[],"items":{"type":"object","properties":{"name":{"name":"name","type":"string","required":false},"animation":{"name":"animation","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}}},"team":{"name":"team","type":"string","required":false},"id":{"name":"id","type":"string","required":true},"health":{"name":"health","type":"number","required":false},"frame":{"name":"frame","type":"number","required":false},"z":{"name":"z","type":"number","required":false},"x":{"name":"x","type":"number","required":false},"y":{"name":"y","type":"number","required":false},"unitType":{"name":"unitType","type":"string","required":false},"maxHealth":{"name":"maxHealth","type":"number","required":false}}}},{"name":"hp","type":"number","default":5},{"name":"maxHp","type":"number","default":5},{"name":"combatScore","type":"number","default":0},{"name":"combatResult","type":"string","default":"none"}],"shared":true},"traits":[{"name":"DungeonCombat","id":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C","entityRebindable":true,"entityContract":{"requires":[],"provides":["combatResult","combatScore","enemies","hp","maxHp"]},"effectRow":[{"kind":"emit","resource":"BURST"},{"kind":"emit","resource":"DEFEATED"},{"kind":"set","resource":"@entity.combatResult"},{"kind":"set","resource":"@entity.combatScore"},{"kind":"set","resource":"@entity.enemies"},{"kind":"set","resource":"@entity.hp"},{"kind":"set","resource":"@entity.maxHp"}],"category":"lifecycle","linkedEntity":"DungeonCombatData","linkedEntityId":"ent_AXAMCF2BSG5WR2E6ZKWXH7BNRQ","entityRefIds":{"DungeonCombatData":"ent_AXAMCF2BSG5WR2E6ZKWXH7BNRQ"},"emits":[{"event":"BURST","eventId":"evt_SDEVVMK10SGGCT5750V6GGPJ11","description":"An enemy died from a bump-attack; a fx-particles listener spawns an explosion","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":"DEFEATED","eventId":"evt_DRP4ABP2JW19E572VZ7Y18BX78","description":"Hero HP reached zero from monster contact damage","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string"}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_J3T7R2GTS2DCH7Q423NE31ZT9K","name":"Initialize"},{"key":"ATTACK","id":"evt_N1FKXTG74G3J81035QPH6SSMCK","name":"Attack","payloadSchema":[{"name":"targetId","type":"string"}],"listened":true},{"key":"MONSTER_TICK","id":"evt_MF38MDBNDATPN29ZTH7WAGHC29","name":"Monster Tick","payloadSchema":[{"name":"heroX","type":"number"},{"name":"heroY","type":"number"}],"listened":true},{"key":"RESTART","id":"evt_HR9SS7D6NKKASM73DMR1T1Z4M0","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true},{"key":"BURST","id":"evt_SDEVVMK10SGGCT5750V6GGPJ11","name":"Burst","description":"An enemy died from a bump-attack; a fx-particles listener spawns an explosion","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":"DEFEATED","id":"evt_DRP4ABP2JW19E572VZ7Y18BX78","name":"Defeated","description":"Hero HP reached zero from monster contact damage","tier":"domain","payloadSchema":[{"name":"id","type":"string"}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_J3T7R2GTS2DCH7Q423NE31ZT9K","effects":[["set","@entity.enemies","@config.enemies"],["set","@entity.hp","@config.startHp"],["set","@entity.maxHp","@config.startHp"],["set","@entity.combatScore",0],["set","@entity.combatResult","none"]]},{"from":"active","to":"active","event":"ATTACK","eventId":"evt_N1FKXTG74G3J81035QPH6SSMCK","guard":["and","@config.running",[">",["array/len",["array/filter","@entity.enemies",["fn","e",["and",["==","@e.id","@payload.targetId"],[">","@e.health",0]]]]],0]],"effects":[["let",[["target",["array/find","@entity.enemies",["fn","e",["==","@e.id","@payload.targetId"]]]]],["let",[["newHealth",["math/max",0,["-",["object/get","@target","health"],"@config.attackDamage"]]]],["do",["set","@entity.enemies",["array/map","@entity.enemies",["fn","e",["if",["==","@e.id","@payload.targetId"],["object/merge","@e",{"health":"@newHealth","animation":["if",["<=","@newHealth",0],"death","hit"]}],"@e"]]]],["if",["<=","@newHealth",0],["do",["set","@entity.combatScore",["+","@entity.combatScore","@config.pointsPerKill"]],["emit","BURST",{"particles":["array/map",["array/filter","@entity.enemies",["fn","e",["==","@e.id","@payload.targetId"]]],["fn","t",{"id":["str/concat","fx-kill-",["object/get","@t","id"]],"type":"explosion","x":["object/get",["object/get","@t","position"],"x"],"z":["object/get",["object/get","@t","position"],"y"],"ttl":5}]]}]],null]]]]]},{"from":"active","to":"active","event":"MONSTER_TICK","eventId":"evt_MF38MDBNDATPN29ZTH7WAGHC29","guard":"@config.running","effects":[["set","@entity.enemies",["array/map","@entity.enemies",["fn","u",["if",[">","@u.health",0],["let",[["ux",["object/get",["object/get","@u","position"],"x"]],["uy",["object/get",["object/get","@u","position"],"y"]]],["let",[["dx",["math/sign",["-","@payload.heroX","@ux"]]],["dy",["math/sign",["-","@payload.heroY","@uy"]]],["absDx",["math/abs",["-","@payload.heroX","@ux"]]],["absDy",["math/abs",["-","@payload.heroY","@uy"]]]],["let",[["moveX",["and",["!=","@dx",0],[">=","@absDx","@absDy"]]]],["let",[["nx",["if","@moveX",["+","@ux","@dx"],"@ux"]],["ny",["if","@moveX","@uy",["+","@uy","@dy"]]]],["let",[["tile",["array/find","@config.tiles",["fn","t",["and",["==",["object/get","@t","x"],"@nx"],["==",["object/get","@t","y"],"@ny"]]]]],["occupied",["array/find","@entity.enemies",["fn","o",["and",["!=","@o.id","@u.id"],["and",[">","@o.health",0],["and",["==",["object/get",["object/get","@o","position"],"x"],"@nx"],["==",["object/get",["object/get","@o","position"],"y"],"@ny"]]]]]]]],["if",["and",["grid/in-bounds",{"x":"@nx","y":"@ny"},"@config.gridWidth","@config.gridHeight"],["and",["==",["if",["==","@tile",null],false,["object/get","@tile","passable"]],true],["==","@occupied",null]]],["object/merge","@u",{"position":{"x":"@nx","y":"@ny"},"animation":"walk"}],"@u"]]]]]],"@u"]]]],["set","@entity.hp",["if",[">",["array/len",["array/filter","@entity.enemies",["fn","u",["and",[">","@u.health",0],["<=",["grid/manhattan-distance",["object/get","@u","position"],{"x":"@payload.heroX","y":"@payload.heroY"}],1]]]]],0],["math/max",0,["-","@entity.hp",1]],"@entity.hp"]],["if",["<=","@entity.hp",0],["do",["set","@entity.combatResult","lost"],["emit","DEFEATED",{"id":"board"}]],null]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_HR9SS7D6NKKASM73DMR1T1Z4M0","effects":[["set","@entity.enemies","@config.enemies"],["set","@entity.hp","@config.startHp"],["set","@entity.maxHp","@config.startHp"],["set","@entity.combatScore",0],["set","@entity.combatResult","none"]]}]},"config":{"attackDamage":{"type":"number","default":1,"label":"Attack Damage","description":"Damage dealt to an enemy per bump-attack","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, ATTACK/MONSTER_TICK intents are applied; toggle to freeze combat","tier":"domain"},"pointsPerKill":{"type":"number","default":50,"label":"Points Per Kill","description":"Score awarded when an enemy's health reaches zero","tier":"domain"},"gridWidth":{"type":"number","default":12,"label":"Grid Width","description":"Grid column count clamping enemy chase bounds","tier":"presentation"},"enemies":{"type":"[Unit]","default":[],"label":"Initial Enemies","description":"Seed enemy roster","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}}},"maxHealth":{"name":"maxHealth","type":"number","required":false},"frame":{"name":"frame","type":"number","required":false},"animation":{"name":"animation","type":"string","required":false},"z":{"name":"z","type":"number","required":false},"name":{"name":"name","type":"string","required":false},"health":{"name":"health","type":"number","required":false},"x":{"name":"x","type":"number","required":false},"unitType":{"name":"unitType","type":"string","required":false},"team":{"name":"team","type":"string","required":false},"y":{"name":"y","type":"number","required":false},"id":{"name":"id","type":"string","required":true}}}},"tiles":{"type":"[Tile]","default":[],"label":"Tiles","description":"Grid tiles used for enemy chase passability checks","tier":"presentation","items":{"type":"object","properties":{"id":{"name":"id","type":"string","required":false},"passable":{"name":"passable","type":"boolean","required":false},"y":{"name":"y","type":"number","required":true},"x":{"name":"x","type":"number","required":true}}}},"startHp":{"type":"number","default":5,"label":"Start HP","description":"Hero HP set on INIT/RESTART (also used as maxHp)","tier":"domain"},"gridHeight":{"type":"number","default":9,"label":"Grid Height","description":"Grid row count clamping enemy chase bounds","tier":"presentation"}},"scope":"instance"}],"pages":[{"name":"DungeonCombatPage","id":"pag_BBEM6GFYQ0ZBG34Y3TWSQPF02E","path":"/dungeon-combat","traits":[{"ref":"DungeonCombat","refId":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C"}]}],"types":{"Fx":[{"name":"id","type":"string","required":true},{"name":"type","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"z","type":"number"},{"name":"y","type":"number"},{"name":"message","type":"string"},{"name":"ttl","type":"number","required":true}],"Tile":[{"name":"id","type":"string"},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"passable","type":"boolean"}],"Unit":[{"name":"id","type":"string","required":true},{"name":"position","type":"object","properties":[{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true}]},{"name":"x","type":"number"},{"name":"y","type":"number"},{"name":"z","type":"number"},{"name":"team","type":"string"},{"name":"health","type":"number"},{"name":"maxHealth","type":"number"},{"name":"unitType","type":"string"},{"name":"name","type":"string"},{"name":"animation","type":"string"},{"name":"frame","type":"number"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_AXAMCF2BSG5WR2E6ZKWXH7BNRQ":{"id":"ent_AXAMCF2BSG5WR2E6ZKWXH7BNRQ","kind":"entity","bakedName":"DungeonCombatData","curName":"DungeonCombatData","renames":[],"owner":"workspace"},"evt_DRP4ABP2JW19E572VZ7Y18BX78":{"id":"evt_DRP4ABP2JW19E572VZ7Y18BX78","kind":"event","bakedName":"DEFEATED","curName":"DEFEATED","renames":[],"owner":"workspace","parent":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C"},"evt_HR9SS7D6NKKASM73DMR1T1Z4M0":{"id":"evt_HR9SS7D6NKKASM73DMR1T1Z4M0","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C"},"evt_J3T7R2GTS2DCH7Q423NE31ZT9K":{"id":"evt_J3T7R2GTS2DCH7Q423NE31ZT9K","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C"},"evt_MF38MDBNDATPN29ZTH7WAGHC29":{"id":"evt_MF38MDBNDATPN29ZTH7WAGHC29","kind":"event","bakedName":"MONSTER_TICK","curName":"MONSTER_TICK","renames":[],"owner":"workspace","parent":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C"},"evt_N1FKXTG74G3J81035QPH6SSMCK":{"id":"evt_N1FKXTG74G3J81035QPH6SSMCK","kind":"event","bakedName":"ATTACK","curName":"ATTACK","renames":[],"owner":"workspace","parent":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C"},"evt_SDEVVMK10SGGCT5750V6GGPJ11":{"id":"evt_SDEVVMK10SGGCT5750V6GGPJ11","kind":"event","bakedName":"BURST","curName":"BURST","renames":[],"owner":"workspace","parent":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C"},"orb_MYCGEP6JYF9F7TPETJ4BQ3G1ZG":{"id":"orb_MYCGEP6JYF9F7TPETJ4BQ3G1ZG","kind":"orbital","bakedName":"DungeonCombatOrbital","curName":"DungeonCombatOrbital","renames":[],"owner":"workspace"},"pag_BBEM6GFYQ0ZBG34Y3TWSQPF02E":{"id":"pag_BBEM6GFYQ0ZBG34Y3TWSQPF02E","kind":"page","bakedName":"DungeonCombatPage","curName":"DungeonCombatPage","renames":[],"owner":"workspace"},"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C":{"id":"trt_Q1QQCSCXSDEWPGD6A8SRBFAX7C","kind":"trait","bakedName":"DungeonCombat","curName":"DungeonCombat","renames":[],"owner":"workspace"}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"std-fx-narrative","version":"1.0.0","description":"Headless pedagogy→fx translator for game boards and learning shells: turns high-level narrative events into big transient screen-space or world-space text effects consumed by std-fx-particles / fx-overlay. Levels emit NARRATE { text, style } and get a correctly styled, centered (or positioned) floating text burst without hand-rolling particle structs. Tutorials emit TUTORIAL_SHOW and the atom forwards SHOW to a composed std-tutorial-overlay trait. Renders nothing; centralizes the FX vocabulary so every level's teaching text looks and behaves the same. Corresponds to the design-sheet field(s): feedback.","orbitals":[{"name":"FxNarrativeOrbital","id":"orb_VQPKN53YKFZ9QN5DVPRRXKT07D","entity":{"name":"FxNarrativeData","id":"ent_WQ1HPF57M7KT3SAC3XCCSMMS6M","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"seq","type":"number","default":0},{"name":"lastText","type":"string","default":""}],"shared":true},"traits":[{"name":"FxNarrative","id":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER","entityRebindable":true,"entityContract":{"requires":[],"provides":["lastText","seq"]},"effectRow":[{"kind":"emit","resource":"BURST"},{"kind":"emit","resource":"SHOW"},{"kind":"set","resource":"@entity.lastText"},{"kind":"set","resource":"@entity.seq"}],"category":"lifecycle","linkedEntity":"FxNarrativeData","linkedEntityId":"ent_WQ1HPF57M7KT3SAC3XCCSMMS6M","entityRefIds":{"FxNarrativeData":"ent_WQ1HPF57M7KT3SAC3XCCSMMS6M"},"emits":[{"event":"BURST","eventId":"evt_VVN3PNSV21XH0YX6P0VJ76RCCS","description":"Styled floating-text particle batch for std-fx-particles / fx-overlay.","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},{"name":"maxTtl","type":"number"},{"name":"bornAt","type":"number"},{"name":"space","type":"string"},{"name":"effect","type":"string"},{"name":"color","type":"string"},{"name":"size","type":"number"},{"name":"vx","type":"number"},{"name":"vy","type":"number"},{"name":"vz","type":"number"},{"name":"particleCount","type":"number"}],"entity":"FxParticle"}]},{"event":"SHOW","eventId":"evt_VE9XHZWKR79W3N72XBFSP0BEF3","description":"Forwarded to a composed std-tutorial-overlay to open the tutorial modal.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string"}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_E651KG88Q44BJ00E7GS1SQM0K6","name":"Initialize"},{"key":"NARRATE","id":"evt_BW9SGWZ6T4KD2ESXE3D56SFD1J","name":"Narrate","payloadSchema":[{"name":"text","type":"string","required":true},{"name":"style","type":"string","values":["hint","fact","warn","celebrate"]},{"name":"x","type":"number"},{"name":"y","type":"number"},{"name":"ttl","type":"number"},{"name":"space","type":"string","values":["screen","world"]}],"listened":true},{"key":"TUTORIAL_SHOW","id":"evt_422YZJG2CE1675QVYP218QRP3P","name":"Tutorial Show","payloadSchema":[{"name":"text","type":"string"},{"name":"title","type":"string"}],"listened":true},{"key":"BURST","id":"evt_VVN3PNSV21XH0YX6P0VJ76RCCS","name":"Burst","description":"Styled floating-text particle batch for std-fx-particles / fx-overlay.","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},{"name":"maxTtl","type":"number"},{"name":"bornAt","type":"number"},{"name":"space","type":"string"},{"name":"effect","type":"string"},{"name":"color","type":"string"},{"name":"size","type":"number"},{"name":"vx","type":"number"},{"name":"vy","type":"number"},{"name":"vz","type":"number"},{"name":"particleCount","type":"number"}],"entity":"FxParticle"}]},{"key":"SHOW","id":"evt_VE9XHZWKR79W3N72XBFSP0BEF3","name":"Show","description":"Forwarded to a composed std-tutorial-overlay to open the tutorial modal.","tier":"domain","payloadSchema":[{"name":"id","type":"string"}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_E651KG88Q44BJ00E7GS1SQM0K6","effects":[["set","@entity.seq",0],["set","@entity.lastText",""]]},{"from":"active","to":"active","event":"NARRATE","eventId":"evt_BW9SGWZ6T4KD2ESXE3D56SFD1J","guard":"@config.running","effects":[["let",[["styleKey",["if",["==",["object/get","@payload","style"],null],"fact",["object/get","@payload","style"]]],["styleDef",["object/get","@config.styles","@styleKey"]],["ttl",["if",["==",["object/get","@payload","ttl"],null],["object/get","@styleDef","ttl"],["object/get","@payload","ttl"]]],["x",["if",["==",["object/get","@payload","x"],null],0.5,["object/get","@payload","x"]]],["y",["if",["==",["object/get","@payload","y"],null],0.25,["object/get","@payload","y"]]],["space",["if",["==",["object/get","@payload","space"],null],"world",["object/get","@payload","space"]]],["text",["object/get","@payload","text"]]],["do",["set","@entity.seq",["+","@entity.seq",1]],["set","@entity.lastText","@text"],["emit","BURST",{"particles":[{"id":["str/concat","narrative-","@entity.seq"],"type":"narrative","x":"@x","z":"@y","y":0,"message":"@text","ttl":"@ttl","maxTtl":"@ttl","bornAt":["time/now"],"space":"@space","effect":["object/get","@styleDef","effect"],"color":["object/get","@styleDef","color"],"size":["object/get","@styleDef","size"],"vx":0,"vy":0,"vz":0,"particleCount":1}]}]]]]},{"from":"active","to":"active","event":"TUTORIAL_SHOW","eventId":"evt_422YZJG2CE1675QVYP218QRP3P","guard":"@config.running","effects":[["emit","SHOW",{"id":"tutorial"}]]}]},"config":{"running":{"type":"boolean","default":true,"label":"Running","description":"When false all narrative events are ignored.","tier":"domain"},"styles":{"type":"Map<string,StyleDef>","default":{"fact":{"color":"#38bdf8","size":0.7,"ttl":3,"effect":"float-text"},"hint":{"color":"#a78bfa","size":0.6,"ttl":2,"effect":"float-text"},"warn":{"color":"#f87171","size":0.6,"ttl":1.5,"effect":"shake"},"celebrate":{"color":"#facc15","size":0.9,"ttl":3,"effect":"sparkle"}},"label":"Styles","description":"Map of narrative style to color, size, ttl, and effect. Override per game theme.","tier":"presentation","items":{"type":"object","properties":{"ttl":{"name":"ttl","type":"number","required":true},"color":{"name":"color","type":"string","required":true},"size":{"name":"size","type":"number","required":true},"effect":{"name":"effect","type":"string","required":true}}}}},"scope":"instance"}],"pages":[{"name":"FxNarrativePage","id":"pag_EY1XBWE9144GJ8MY7W6CEX7FBS","path":"/fx-narrative","traits":[{"ref":"FxNarrative","refId":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER"}]}],"types":{"FxParticle":[{"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},{"name":"maxTtl","type":"number"},{"name":"bornAt","type":"number"},{"name":"space","type":"string"},{"name":"effect","type":"string"},{"name":"color","type":"string"},{"name":"size","type":"number"},{"name":"vx","type":"number"},{"name":"vy","type":"number"},{"name":"vz","type":"number"},{"name":"particleCount","type":"number"}],"NarrativeCue":[{"name":"text","type":"string","required":true},{"name":"style","type":"string","values":["hint","fact","warn","celebrate"]},{"name":"x","type":"number"},{"name":"y","type":"number"},{"name":"ttl","type":"number"},{"name":"space","type":"string","values":["screen","world"]}],"StyleDef":[{"name":"color","type":"string","required":true},{"name":"size","type":"number","required":true},{"name":"ttl","type":"number","required":true},{"name":"effect","type":"string","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_WQ1HPF57M7KT3SAC3XCCSMMS6M":{"id":"ent_WQ1HPF57M7KT3SAC3XCCSMMS6M","kind":"entity","bakedName":"FxNarrativeData","curName":"FxNarrativeData","renames":[],"owner":"workspace"},"evt_422YZJG2CE1675QVYP218QRP3P":{"id":"evt_422YZJG2CE1675QVYP218QRP3P","kind":"event","bakedName":"TUTORIAL_SHOW","curName":"TUTORIAL_SHOW","renames":[],"owner":"workspace","parent":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER"},"evt_BW9SGWZ6T4KD2ESXE3D56SFD1J":{"id":"evt_BW9SGWZ6T4KD2ESXE3D56SFD1J","kind":"event","bakedName":"NARRATE","curName":"NARRATE","renames":[],"owner":"workspace","parent":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER"},"evt_E651KG88Q44BJ00E7GS1SQM0K6":{"id":"evt_E651KG88Q44BJ00E7GS1SQM0K6","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER"},"evt_VE9XHZWKR79W3N72XBFSP0BEF3":{"id":"evt_VE9XHZWKR79W3N72XBFSP0BEF3","kind":"event","bakedName":"SHOW","curName":"SHOW","renames":[],"owner":"workspace","parent":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER"},"evt_VVN3PNSV21XH0YX6P0VJ76RCCS":{"id":"evt_VVN3PNSV21XH0YX6P0VJ76RCCS","kind":"event","bakedName":"BURST","curName":"BURST","renames":[],"owner":"workspace","parent":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER"},"orb_VQPKN53YKFZ9QN5DVPRRXKT07D":{"id":"orb_VQPKN53YKFZ9QN5DVPRRXKT07D","kind":"orbital","bakedName":"FxNarrativeOrbital","curName":"FxNarrativeOrbital","renames":[],"owner":"workspace"},"pag_EY1XBWE9144GJ8MY7W6CEX7FBS":{"id":"pag_EY1XBWE9144GJ8MY7W6CEX7FBS","kind":"page","bakedName":"FxNarrativePage","curName":"FxNarrativePage","renames":[],"owner":"workspace"},"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER":{"id":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER","kind":"trait","bakedName":"FxNarrative","curName":"FxNarrative","renames":[],"owner":"workspace"}}}}
|
|
1
|
+
{"name":"std-fx-narrative","version":"1.0.0","description":"Headless pedagogy→fx translator for game boards and learning shells: turns high-level narrative events into big transient screen-space or world-space text effects consumed by std-fx-particles / fx-overlay. Levels emit NARRATE { text, style } and get a correctly styled, centered (or positioned) floating text burst without hand-rolling particle structs. Tutorials emit TUTORIAL_SHOW and the atom forwards SHOW to a composed std-tutorial-overlay trait. Renders nothing; centralizes the FX vocabulary so every level's teaching text looks and behaves the same. Corresponds to the design-sheet field(s): feedback.","orbitals":[{"name":"FxNarrativeOrbital","id":"orb_VQPKN53YKFZ9QN5DVPRRXKT07D","entity":{"name":"FxNarrativeData","id":"ent_WQ1HPF57M7KT3SAC3XCCSMMS6M","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"seq","type":"number","default":0},{"name":"lastText","type":"string","default":""}],"shared":true},"traits":[{"name":"FxNarrative","id":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER","entityRebindable":true,"entityContract":{"requires":[],"provides":["lastText","seq"]},"effectRow":[{"kind":"emit","resource":"BURST"},{"kind":"emit","resource":"SHOW"},{"kind":"set","resource":"@entity.lastText"},{"kind":"set","resource":"@entity.seq"}],"category":"lifecycle","linkedEntity":"FxNarrativeData","linkedEntityId":"ent_WQ1HPF57M7KT3SAC3XCCSMMS6M","entityRefIds":{"FxNarrativeData":"ent_WQ1HPF57M7KT3SAC3XCCSMMS6M"},"emits":[{"event":"BURST","eventId":"evt_VVN3PNSV21XH0YX6P0VJ76RCCS","description":"Styled floating-text particle batch for std-fx-particles / fx-overlay.","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},{"name":"maxTtl","type":"number"},{"name":"bornAt","type":"number"},{"name":"space","type":"string"},{"name":"effect","type":"string"},{"name":"color","type":"string"},{"name":"size","type":"number"},{"name":"vx","type":"number"},{"name":"vy","type":"number"},{"name":"vz","type":"number"},{"name":"particleCount","type":"number"}],"entity":"FxParticle"}]},{"event":"SHOW","eventId":"evt_VE9XHZWKR79W3N72XBFSP0BEF3","description":"Forwarded to a composed std-tutorial-overlay to open the tutorial modal.","tier":"domain","scope":"external","payloadSchema":[{"name":"id","type":"string"}]}],"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_E651KG88Q44BJ00E7GS1SQM0K6","name":"Initialize"},{"key":"NARRATE","id":"evt_BW9SGWZ6T4KD2ESXE3D56SFD1J","name":"Narrate","payloadSchema":[{"name":"text","type":"string","required":true},{"name":"style","type":"string","values":["hint","fact","warn","celebrate"]},{"name":"x","type":"number"},{"name":"y","type":"number"},{"name":"ttl","type":"number"},{"name":"space","type":"string","values":["screen","world"]}],"listened":true},{"key":"TUTORIAL_SHOW","id":"evt_422YZJG2CE1675QVYP218QRP3P","name":"Tutorial Show","payloadSchema":[{"name":"text","type":"string"},{"name":"title","type":"string"}],"listened":true},{"key":"BURST","id":"evt_VVN3PNSV21XH0YX6P0VJ76RCCS","name":"Burst","description":"Styled floating-text particle batch for std-fx-particles / fx-overlay.","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},{"name":"maxTtl","type":"number"},{"name":"bornAt","type":"number"},{"name":"space","type":"string"},{"name":"effect","type":"string"},{"name":"color","type":"string"},{"name":"size","type":"number"},{"name":"vx","type":"number"},{"name":"vy","type":"number"},{"name":"vz","type":"number"},{"name":"particleCount","type":"number"}],"entity":"FxParticle"}]},{"key":"SHOW","id":"evt_VE9XHZWKR79W3N72XBFSP0BEF3","name":"Show","description":"Forwarded to a composed std-tutorial-overlay to open the tutorial modal.","tier":"domain","payloadSchema":[{"name":"id","type":"string"}]}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_E651KG88Q44BJ00E7GS1SQM0K6","effects":[["set","@entity.seq",0],["set","@entity.lastText",""]]},{"from":"active","to":"active","event":"NARRATE","eventId":"evt_BW9SGWZ6T4KD2ESXE3D56SFD1J","guard":"@config.running","effects":[["let",[["styleKey",["if",["==",["object/get","@payload","style"],null],"fact",["object/get","@payload","style"]]],["styleDef",["object/get","@config.styles","@styleKey"]],["ttl",["if",["==",["object/get","@payload","ttl"],null],["object/get","@styleDef","ttl"],["object/get","@payload","ttl"]]],["x",["if",["==",["object/get","@payload","x"],null],0.5,["object/get","@payload","x"]]],["y",["if",["==",["object/get","@payload","y"],null],0.25,["object/get","@payload","y"]]],["space",["if",["==",["object/get","@payload","space"],null],"world",["object/get","@payload","space"]]],["text",["object/get","@payload","text"]]],["do",["set","@entity.seq",["+","@entity.seq",1]],["set","@entity.lastText","@text"],["emit","BURST",{"particles":[{"id":["str/concat","narrative-","@entity.seq"],"type":"narrative","x":"@x","z":"@y","y":0,"message":"@text","ttl":"@ttl","maxTtl":"@ttl","bornAt":["time/now"],"space":"@space","effect":["object/get","@styleDef","effect"],"color":["object/get","@styleDef","color"],"size":["object/get","@styleDef","size"],"vx":0,"vy":0,"vz":0,"particleCount":1}]}]]]]},{"from":"active","to":"active","event":"TUTORIAL_SHOW","eventId":"evt_422YZJG2CE1675QVYP218QRP3P","guard":"@config.running","effects":[["emit","SHOW",{"id":"tutorial"}]]}]},"config":{"running":{"type":"boolean","default":true,"label":"Running","description":"When false all narrative events are ignored.","tier":"domain"},"styles":{"type":"Map<string,StyleDef>","default":{"fact":{"color":"#38bdf8","size":0.7,"ttl":3,"effect":"float-text"},"hint":{"color":"#a78bfa","size":0.6,"ttl":2,"effect":"float-text"},"warn":{"color":"#f87171","size":0.6,"ttl":1.5,"effect":"shake"},"celebrate":{"color":"#facc15","size":0.9,"ttl":3,"effect":"sparkle"}},"label":"Styles","description":"Map of narrative style to color, size, ttl, and effect. Override per game theme.","tier":"presentation","items":{"type":"object","properties":{"effect":{"name":"effect","type":"string","required":true},"size":{"name":"size","type":"number","required":true},"ttl":{"name":"ttl","type":"number","required":true},"color":{"name":"color","type":"string","required":true}}}}},"scope":"instance"}],"pages":[{"name":"FxNarrativePage","id":"pag_EY1XBWE9144GJ8MY7W6CEX7FBS","path":"/fx-narrative","traits":[{"ref":"FxNarrative","refId":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER"}]}],"types":{"FxParticle":[{"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},{"name":"maxTtl","type":"number"},{"name":"bornAt","type":"number"},{"name":"space","type":"string"},{"name":"effect","type":"string"},{"name":"color","type":"string"},{"name":"size","type":"number"},{"name":"vx","type":"number"},{"name":"vy","type":"number"},{"name":"vz","type":"number"},{"name":"particleCount","type":"number"}],"NarrativeCue":[{"name":"text","type":"string","required":true},{"name":"style","type":"string","values":["hint","fact","warn","celebrate"]},{"name":"x","type":"number"},{"name":"y","type":"number"},{"name":"ttl","type":"number"},{"name":"space","type":"string","values":["screen","world"]}],"StyleDef":[{"name":"color","type":"string","required":true},{"name":"size","type":"number","required":true},{"name":"ttl","type":"number","required":true},{"name":"effect","type":"string","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_WQ1HPF57M7KT3SAC3XCCSMMS6M":{"id":"ent_WQ1HPF57M7KT3SAC3XCCSMMS6M","kind":"entity","bakedName":"FxNarrativeData","curName":"FxNarrativeData","renames":[],"owner":"workspace"},"evt_422YZJG2CE1675QVYP218QRP3P":{"id":"evt_422YZJG2CE1675QVYP218QRP3P","kind":"event","bakedName":"TUTORIAL_SHOW","curName":"TUTORIAL_SHOW","renames":[],"owner":"workspace","parent":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER"},"evt_BW9SGWZ6T4KD2ESXE3D56SFD1J":{"id":"evt_BW9SGWZ6T4KD2ESXE3D56SFD1J","kind":"event","bakedName":"NARRATE","curName":"NARRATE","renames":[],"owner":"workspace","parent":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER"},"evt_E651KG88Q44BJ00E7GS1SQM0K6":{"id":"evt_E651KG88Q44BJ00E7GS1SQM0K6","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER"},"evt_VE9XHZWKR79W3N72XBFSP0BEF3":{"id":"evt_VE9XHZWKR79W3N72XBFSP0BEF3","kind":"event","bakedName":"SHOW","curName":"SHOW","renames":[],"owner":"workspace","parent":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER"},"evt_VVN3PNSV21XH0YX6P0VJ76RCCS":{"id":"evt_VVN3PNSV21XH0YX6P0VJ76RCCS","kind":"event","bakedName":"BURST","curName":"BURST","renames":[],"owner":"workspace","parent":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER"},"orb_VQPKN53YKFZ9QN5DVPRRXKT07D":{"id":"orb_VQPKN53YKFZ9QN5DVPRRXKT07D","kind":"orbital","bakedName":"FxNarrativeOrbital","curName":"FxNarrativeOrbital","renames":[],"owner":"workspace"},"pag_EY1XBWE9144GJ8MY7W6CEX7FBS":{"id":"pag_EY1XBWE9144GJ8MY7W6CEX7FBS","kind":"page","bakedName":"FxNarrativePage","curName":"FxNarrativePage","renames":[],"owner":"workspace"},"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER":{"id":"trt_AZ0EXJ3G2QR1BJDQKW2FR9APER","kind":"trait","bakedName":"FxNarrative","curName":"FxNarrative","renames":[],"owner":"workspace"}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"std-fx-particles","version":"1.1.0","description":"Headless transient-fx mechanic serving BOTH game boards and learning shells: appends spawned particles on BURST — stamping maxTtl (fade envelope) and bornAt (epoch ms, smooth render interpolation) when absent — decays each entry's ttl every tick, drops the dead ones, and clears on RESTART. Name-blind mechanism: the effect-kind vocabulary is consumer-declared (FxPreset tables at the render call sites). Composed onto a [runtime, shared] entity; renders nothing — the board/shell owns the single render authority (draw-fx-layer for space \"world\", fx-overlay for space \"screen\"). Corresponds to the design-sheet field(s): feedback, rewards.","orbitals":[{"name":"FxParticlesOrbital","id":"orb_GS9M3AQKQ0SVGCCRCTQJRKMXJ7","entity":{"name":"FxState","id":"ent_Z660DBCABG55RF4Q1MPFGXQ2NE","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"fx","type":"array","default":[],"items":{"type":"object","properties":{"
|
|
1
|
+
{"name":"std-fx-particles","version":"1.1.0","description":"Headless transient-fx mechanic serving BOTH game boards and learning shells: appends spawned particles on BURST — stamping maxTtl (fade envelope) and bornAt (epoch ms, smooth render interpolation) when absent — decays each entry's ttl every tick, drops the dead ones, and clears on RESTART. Name-blind mechanism: the effect-kind vocabulary is consumer-declared (FxPreset tables at the render call sites). Composed onto a [runtime, shared] entity; renders nothing — the board/shell owns the single render authority (draw-fx-layer for space \"world\", fx-overlay for space \"screen\"). Corresponds to the design-sheet field(s): feedback, rewards.","orbitals":[{"name":"FxParticlesOrbital","id":"orb_GS9M3AQKQ0SVGCCRCTQJRKMXJ7","entity":{"name":"FxState","id":"ent_Z660DBCABG55RF4Q1MPFGXQ2NE","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"fx","type":"array","default":[],"items":{"type":"object","properties":{"ttl":{"name":"ttl","type":"number","required":true},"effect":{"name":"effect","type":"string","required":false},"space":{"name":"space","type":"string","required":false},"size":{"name":"size","type":"number","required":false},"animation":{"name":"animation","type":"string","required":false},"type":{"name":"type","type":"string","required":true},"z":{"name":"z","type":"number","required":false},"color":{"name":"color","type":"string","required":false},"message":{"name":"message","type":"string","required":false},"vx":{"name":"vx","type":"number","required":false},"vz":{"name":"vz","type":"number","required":false},"vy":{"name":"vy","type":"number","required":false},"particleCount":{"name":"particleCount","type":"number","required":false},"id":{"name":"id","type":"string","required":true},"bornAt":{"name":"bornAt","type":"number","required":false},"x":{"name":"x","type":"number","required":true},"maxTtl":{"name":"maxTtl","type":"number","required":false},"y":{"name":"y","type":"number","required":false}}}}],"shared":true},"traits":[{"name":"FxParticles","id":"trt_9G27Q4FTGFX87RW6APFBJMAGHE","entityRebindable":true,"entityContract":{"requires":[],"provides":["fx"]},"effectRow":[{"kind":"set","resource":"@entity.fx"},{"kind":"set","resource":"@entity.fx","site":"tick"},{"kind":"ticks","site":"tick"}],"category":"lifecycle","linkedEntity":"FxState","linkedEntityId":"ent_Z660DBCABG55RF4Q1MPFGXQ2NE","entityRefIds":{"FxState":"ent_Z660DBCABG55RF4Q1MPFGXQ2NE"},"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_QW633KV9Q5MVJHX25TBES3HZ2W","name":"Initialize"},{"key":"BURST","id":"evt_X014MP1T61X30SRNE6X04SF1EC","name":"Burst","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},{"name":"maxTtl","type":"number"},{"name":"bornAt","type":"number"},{"name":"space","type":"string"},{"name":"effect","type":"string"},{"name":"color","type":"string"},{"name":"size","type":"number"},{"name":"vx","type":"number"},{"name":"vy","type":"number"},{"name":"vz","type":"number"},{"name":"particleCount","type":"number"},{"name":"animation","type":"string"}]}],"listened":true},{"key":"RESTART","id":"evt_YPHM3AXWEWY7E4Y7D5HV5X5HXE","name":"Restart","listened":true}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_QW633KV9Q5MVJHX25TBES3HZ2W","effects":[["set","@entity.fx",["array/map","@config.fx",["fn","p",["object/merge","@p",{"maxTtl":["object/get","@p","maxTtl",["object/get","@p","ttl"]],"bornAt":["object/get","@p","bornAt",["time/now"]]}]]]]]},{"from":"active","to":"active","event":"BURST","eventId":"evt_X014MP1T61X30SRNE6X04SF1EC","effects":[["set","@entity.fx",["array/concat","@entity.fx",["array/map","@payload.particles",["fn","p",["object/merge","@p",{"maxTtl":["object/get","@p","maxTtl",["object/get","@p","ttl"]],"bornAt":["object/get","@p","bornAt",["time/now"]]}]]]]]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_YPHM3AXWEWY7E4Y7D5HV5X5HXE","effects":[["set","@entity.fx",[]]]}]},"ticks":[{"name":"fxTick","interval":500,"guard":["and","@config.running",[">",["array/len","@entity.fx"],0]],"effects":[["set","@entity.fx",["array/filter",["array/map","@entity.fx",["fn","e",["object/merge","@e",{"ttl":["-",["object/get","@e","ttl"],"@config.decayRate"]}]]],["fn","e",[">",["object/get","@e","ttl"],0]]]]],"whileVisible":true}],"config":{"decayRate":{"type":"number","default":1,"label":"Decay Rate","description":"Ttl units removed from every fx entry each tick; higher fades particles faster.","tier":"domain"},"fx":{"type":"[Fx]","default":[],"label":"Initial Fx","description":"Seed particles rendered before the first BURST; usually empty.","tier":"domain","items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":true},"z":{"name":"z","type":"number","required":false},"animation":{"name":"animation","type":"string","required":false},"bornAt":{"name":"bornAt","type":"number","required":false},"y":{"name":"y","type":"number","required":false},"color":{"name":"color","type":"string","required":false},"effect":{"name":"effect","type":"string","required":false},"particleCount":{"name":"particleCount","type":"number","required":false},"vx":{"name":"vx","type":"number","required":false},"ttl":{"name":"ttl","type":"number","required":true},"vz":{"name":"vz","type":"number","required":false},"id":{"name":"id","type":"string","required":true},"space":{"name":"space","type":"string","required":false},"size":{"name":"size","type":"number","required":false},"type":{"name":"type","type":"string","required":true},"message":{"name":"message","type":"string","required":false},"vy":{"name":"vy","type":"number","required":false},"maxTtl":{"name":"maxTtl","type":"number","required":false}}}},"running":{"type":"boolean","default":true,"label":"Running","description":"When true the decay tick runs; toggle to freeze effects.","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"FxParticlesPage","id":"pag_4XZ3J1ASA3CN1RV4GRN0PVRD6P","path":"/fx-particles","traits":[{"ref":"FxParticles","refId":"trt_9G27Q4FTGFX87RW6APFBJMAGHE"}]}],"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},{"name":"maxTtl","type":"number"},{"name":"bornAt","type":"number"},{"name":"space","type":"string"},{"name":"effect","type":"string"},{"name":"color","type":"string"},{"name":"size","type":"number"},{"name":"vx","type":"number"},{"name":"vy","type":"number"},{"name":"vz","type":"number"},{"name":"particleCount","type":"number"},{"name":"animation","type":"string"}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_Z660DBCABG55RF4Q1MPFGXQ2NE":{"id":"ent_Z660DBCABG55RF4Q1MPFGXQ2NE","kind":"entity","bakedName":"FxState","curName":"FxState","renames":[],"owner":"workspace"},"evt_QW633KV9Q5MVJHX25TBES3HZ2W":{"id":"evt_QW633KV9Q5MVJHX25TBES3HZ2W","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_9G27Q4FTGFX87RW6APFBJMAGHE"},"evt_X014MP1T61X30SRNE6X04SF1EC":{"id":"evt_X014MP1T61X30SRNE6X04SF1EC","kind":"event","bakedName":"BURST","curName":"BURST","renames":[],"owner":"workspace","parent":"trt_9G27Q4FTGFX87RW6APFBJMAGHE"},"evt_YPHM3AXWEWY7E4Y7D5HV5X5HXE":{"id":"evt_YPHM3AXWEWY7E4Y7D5HV5X5HXE","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_9G27Q4FTGFX87RW6APFBJMAGHE"},"orb_GS9M3AQKQ0SVGCCRCTQJRKMXJ7":{"id":"orb_GS9M3AQKQ0SVGCCRCTQJRKMXJ7","kind":"orbital","bakedName":"FxParticlesOrbital","curName":"FxParticlesOrbital","renames":[],"owner":"workspace"},"pag_4XZ3J1ASA3CN1RV4GRN0PVRD6P":{"id":"pag_4XZ3J1ASA3CN1RV4GRN0PVRD6P","kind":"page","bakedName":"FxParticlesPage","curName":"FxParticlesPage","renames":[],"owner":"workspace"},"trt_9G27Q4FTGFX87RW6APFBJMAGHE":{"id":"trt_9G27Q4FTGFX87RW6APFBJMAGHE","kind":"trait","bakedName":"FxParticles","curName":"FxParticles","renames":[],"owner":"workspace"}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"std-fx-trail","version":"1.0.0","description":"Headless motion-trail mechanic: records the moving body's recent positions as timestamped dots on a [runtime, shared] entity so the render layer can draw a fading comet trail. Rides the body authority's BODY_MOVED — appends a dot only when the body's speed exceeds minSpeed (standing still leaves no trail) and prunes dots older than ttl on the same pass, so no decay tick is needed and a stopped body's trail simply stops growing (the render side fades each dot by bornAt/ttl). RESTART clears. Renders nothing.","orbitals":[{"name":"FxTrailOrbital","id":"orb_1YY7K2ZJ5KS2SYTF8TRZXP37XZ","entity":{"name":"FxTrailData","id":"ent_SEYCR4P60V30DTY8NNZ6QM7ET4","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"trail","type":"array","default":[],"items":{"type":"object","properties":{"
|
|
1
|
+
{"name":"std-fx-trail","version":"1.0.0","description":"Headless motion-trail mechanic: records the moving body's recent positions as timestamped dots on a [runtime, shared] entity so the render layer can draw a fading comet trail. Rides the body authority's BODY_MOVED — appends a dot only when the body's speed exceeds minSpeed (standing still leaves no trail) and prunes dots older than ttl on the same pass, so no decay tick is needed and a stopped body's trail simply stops growing (the render side fades each dot by bornAt/ttl). RESTART clears. Renders nothing.","orbitals":[{"name":"FxTrailOrbital","id":"orb_1YY7K2ZJ5KS2SYTF8TRZXP37XZ","entity":{"name":"FxTrailData","id":"ent_SEYCR4P60V30DTY8NNZ6QM7ET4","persistence":"runtime","fields":[{"name":"id","type":"string","required":true},{"name":"trail","type":"array","default":[],"items":{"type":"object","properties":{"x":{"name":"x","type":"number","required":true},"ttl":{"name":"ttl","type":"number","required":true},"bornAt":{"name":"bornAt","type":"number","required":true},"y":{"name":"y","type":"number","required":true},"id":{"name":"id","type":"string","required":true}}}},{"name":"seq","type":"number","default":0}],"shared":true},"traits":[{"name":"FxTrail","id":"trt_CPAYHECX80EM05ANNRS18Q31VD","entityRebindable":true,"entityContract":{"requires":[],"provides":["seq","trail"]},"effectRow":[{"kind":"set","resource":"@entity.seq"},{"kind":"set","resource":"@entity.trail"}],"category":"lifecycle","linkedEntity":"FxTrailData","linkedEntityId":"ent_SEYCR4P60V30DTY8NNZ6QM7ET4","entityRefIds":{"FxTrailData":"ent_SEYCR4P60V30DTY8NNZ6QM7ET4"},"stateMachine":{"states":[{"name":"active","isInitial":true}],"events":[{"key":"INIT","id":"evt_SEGS8147ZH3ZRN13BFJA7ZS15X","name":"Initialize"},{"key":"BODY_MOVED","id":"evt_PDTNA9S0QQGBVGN0B1SZYD31F3","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":"RESTART","id":"evt_X61N2E4HQB8VNJSGPRPDQ44GRT","name":"Restart","payloadSchema":[{"name":"id","type":"string"}],"listened":true}],"transitions":[{"from":"active","to":"active","event":"INIT","eventId":"evt_SEGS8147ZH3ZRN13BFJA7ZS15X","effects":[["set","@entity.trail",[]],["set","@entity.seq",0]]},{"from":"active","to":"active","event":"BODY_MOVED","eventId":"evt_PDTNA9S0QQGBVGN0B1SZYD31F3","guard":"@config.running","effects":[["set","@entity.trail",["array/filter",["if",[">","@payload.speed","@config.minSpeed"],["array/concat","@entity.trail",[{"id":["str/concat","trail-",["+","@entity.seq",1]],"x":"@payload.x","y":"@payload.y","bornAt":["time/now"],"ttl":"@config.ttl"}]],"@entity.trail"],["fn","d",["<",["-",["time/now"],["object/get","@d","bornAt"]],["object/get","@d","ttl"]]]]],["if",[">","@payload.speed","@config.minSpeed"],["set","@entity.seq",["+","@entity.seq",1]],null]]},{"from":"active","to":"active","event":"RESTART","eventId":"evt_X61N2E4HQB8VNJSGPRPDQ44GRT","effects":[["set","@entity.trail",[]]]}]},"config":{"ttl":{"type":"number","default":600,"label":"Trail Ttl (ms)","description":"Milliseconds a trail dot lives; at a 33ms move cadence ~600ms keeps the last eighteen positions. The ttl is also the natural length cap — no separate limit needed.","tier":"presentation"},"minSpeed":{"type":"number","default":0.5,"label":"Min Speed","description":"Body speed (units/s, from BODY_MOVED) below which no dot is appended, so a resting body doesn't pile dots on one spot.","tier":"domain"},"running":{"type":"boolean","default":true,"label":"Running","description":"When true, BODY_MOVED appends trail dots; toggle to freeze the trail (existing dots still age out).","tier":"domain"}},"scope":"instance"}],"pages":[{"name":"FxTrailPage","id":"pag_EXQ4Q6WYG3F81REG7WQAF3CRV4","path":"/fx-trail","traits":[{"ref":"FxTrail","refId":"trt_CPAYHECX80EM05ANNRS18Q31VD"}]}],"types":{"TrailDot":[{"name":"id","type":"string","required":true},{"name":"x","type":"number","required":true},{"name":"y","type":"number","required":true},{"name":"bornAt","type":"number","required":true},{"name":"ttl","type":"number","required":true}]}}],"schemaVersion":1,"ledger":{"schemaVersion":1,"entries":{"ent_SEYCR4P60V30DTY8NNZ6QM7ET4":{"id":"ent_SEYCR4P60V30DTY8NNZ6QM7ET4","kind":"entity","bakedName":"FxTrailData","curName":"FxTrailData","renames":[],"owner":"workspace"},"evt_PDTNA9S0QQGBVGN0B1SZYD31F3":{"id":"evt_PDTNA9S0QQGBVGN0B1SZYD31F3","kind":"event","bakedName":"BODY_MOVED","curName":"BODY_MOVED","renames":[],"owner":"workspace","parent":"trt_CPAYHECX80EM05ANNRS18Q31VD"},"evt_SEGS8147ZH3ZRN13BFJA7ZS15X":{"id":"evt_SEGS8147ZH3ZRN13BFJA7ZS15X","kind":"event","bakedName":"INIT","curName":"INIT","renames":[],"owner":"workspace","parent":"trt_CPAYHECX80EM05ANNRS18Q31VD"},"evt_X61N2E4HQB8VNJSGPRPDQ44GRT":{"id":"evt_X61N2E4HQB8VNJSGPRPDQ44GRT","kind":"event","bakedName":"RESTART","curName":"RESTART","renames":[],"owner":"workspace","parent":"trt_CPAYHECX80EM05ANNRS18Q31VD"},"orb_1YY7K2ZJ5KS2SYTF8TRZXP37XZ":{"id":"orb_1YY7K2ZJ5KS2SYTF8TRZXP37XZ","kind":"orbital","bakedName":"FxTrailOrbital","curName":"FxTrailOrbital","renames":[],"owner":"workspace"},"pag_EXQ4Q6WYG3F81REG7WQAF3CRV4":{"id":"pag_EXQ4Q6WYG3F81REG7WQAF3CRV4","kind":"page","bakedName":"FxTrailPage","curName":"FxTrailPage","renames":[],"owner":"workspace"},"trt_CPAYHECX80EM05ANNRS18Q31VD":{"id":"trt_CPAYHECX80EM05ANNRS18Q31VD","kind":"trait","bakedName":"FxTrail","curName":"FxTrail","renames":[],"owner":"workspace"}}}}
|