# Phase 3c: Editor Tools — Action & Rule Editing ## 1. Overview Phase 3c adds **full editing capabilities** for both the Director Tool's action queues and the Event System's rules. Currently, directors can only **append** actions and **create/delete** rules. They cannot fix mistakes, change order, or modify existing items. This phase makes the entire script **fully editable**. The plan combines action editing and rule editing into a single, cohesive implementation with a logical progression from simpler to more complex features. --- ## 2. Core Principles ### 2.1. Extensibility First The system is built to accommodate future growth: | Future Addition | How It's Supported | | ---------------------- | --------------------------------------------------------- | | New action types | Registry pattern — add action template, UI auto-generates | | New rule trigger types | Registry pattern — add trigger type, UI auto-generates | | New action properties | Action data model is a Dictionary — add new keys freely | | New rule properties | Rule data model is a Dictionary — add new keys freely | | New visual styles | Theme JSON already supports font/color overrides | ### 2.2. Consistency The UI patterns for action editing and rule editing are **identical**: | Pattern | Action Edition | Rule Edition | | ------------ | ----------------------------------- | ---------------------------------- | | Entry points | Popup menu + Right-click + Waypoint | Rule label + Stickman context menu | | Panel UI | Action Queue Panel | Rule Panel | | Editor Popup | Action Editor | Rule Editor | | Controls | [✎] Edit, [✕] Delete, [≡] Reorder | Same | | Drag handles | Reorder actions | Reorder rules | --- ## 3. Implementation Order The plan is organized into **5 phases**, each building on the previous: | Phase | Focus | Deliverables | | -------------- | ------------------------- | -------------------------------------------- | | **Phase 3c.1** | **Foundation** | Shared UI components, extensible data models | | **Phase 3c.2** | **Action Queue Panel** | View, edit, delete, reorder actions | | **Phase 3c.3** | **Action Visual Editing** | Waypoint context menu, visual walk editing | | **Phase 3c.4** | **Rule Panel** | View, edit, delete, reorder rules | | **Phase 3c.5** | **Rule Visual Editing** | Rule label click, waypoint trigger editing | --- ## 4. Phase 3c.1: Foundation ### 4.1. Extensible Action Registry The action system should be registry-driven to support future action types: ```gdscript # action_registry.gd (NEW) const ACTION_TEMPLATES = { "walk_to": { "label": "Walk To", "icon": "🚶", "params": [ { "key": "target", "type": "position", "required": true } ] }, "speak": { "label": "Speak", "icon": "💬", "params": [ { "key": "text", "type": "text", "required": true }, { "key": "duration", "type": "float", "default": 2.0 } ] }, "wait": { "label": "Wait", "icon": "⏳", "params": [ { "key": "duration", "type": "float", "required": true } ] }, "ragdoll": { "label": "Ragdoll", "icon": "💥", "params": [] }, "recover": { "label": "Recover", "icon": "🔄", "params": [] } } ``` **Extensibility:** Adding a new action type = appending to `ACTION_TEMPLATES`. No other code changes required. ### 4.2. Extensible Trigger Registry Similarly, trigger types are registry-driven: ```gdscript # trigger_registry.gd (NEW) const TRIGGER_TEMPLATES = { "arrived_at_waypoint": { "label": "Arrives at waypoint", "icon": "📍", "target_type": "waypoint" }, "action_finished": { "label": "Completes any action", "icon": "✅", "target_type": "action_type" }, "speech_finished": { "label": "Finishes speaking", "icon": "💬", "target_type": "none" }, "entered_area": { "label": "Enters trigger area", "icon": "🎯", "target_type": "area" }, "collided": { "label": "Collides with something", "icon": "💥", "target_type": "prop" } } ``` ### 4.3. Shared UI Components | Component | Purpose | Reused By | | ----------------------- | ----------------------------- | ------------------------------ | | **Panel Container** | Scrollable list of items | Action Queue Panel, Rule Panel | | **Editor Popup** | Edit single item's properties | Action Editor, Rule Editor | | **Drag Handle** | Reorder items | Both panels | | **Delete Confirmation** | Confirm before deletion | Both panels | ### 4.4. Extensible Action Properties Actions are stored as Dictionaries, so future properties can be added without breaking existing code: ```gdscript # Current action { "type": "speak", "text": "Hello", "duration": 2.0 } # Future action (with text color) { "type": "speak", "text": "Hello", "duration": 2.0, "text_color": "#ff0000" } ``` **Extensibility:** New properties are just new keys in the Dictionary. The editor should display editable fields for all known keys and gracefully ignore unknown ones. --- ## 5. Phase 3c.2: Action Queue Panel ### 5.1. Feature Breakdown | Feature | Description | | ------------------- | ------------------------------------------- | | **Queue Panel** | Popup showing all actions for a stickman | | **Edit Action** | Re-open action popup with pre-filled values | | **Delete Action** | Remove action from queue (confirmation) | | **Reorder Actions** | Drag handle to reorder | | **Add Action** | Append new action from panel | | **Clear All** | Remove all actions (confirmation) | ### 5.2. Entry Points | Entry Point | When to Use | How it Works | | --------------- | -------------------------------- | ------------------------------------------- | | **Popup** | Edit queue for selected stickman | Click stickman → "Edit Queue" → panel opens | | **Right-click** | Quick access | Right-click stickman → "Edit Queue" | ### 5.3. UI Layout ``` ┌─────────────────────────────────────────────────────────────────────┐ │ ACTION QUEUE PANEL │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Stickman: Bob [×] Close │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ ───────────────────────────────────────────────────────── │ │ │ │ 1 🚶 Walk to Crate [✎] [✕] [≡] │ │ │ │ 2 💬 Speak "Hello!" [✎] [✕] [≡] │ │ │ │ 3 ⏳ Wait 2.0s [✎] [✕] [≡] │ │ │ │ 4 💥 Ragdoll [✎] [✕] [≡] │ │ │ │ 5 🔄 Recover [✎] [✕] [≡] │ │ │ │ ───────────────────────────────────────────────────────── │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ [Add Action] [Clear All] │ │ │ └─────────────────────────────────────────────────────────────────────┘ ``` ### 5.4. Edit Action Flow 1. User clicks **[✎]** on an action. 2. The **same action popup** appears, with current values pre-filled. 3. User makes changes. 4. Click **OK** → action is updated in the queue. 5. Visuals update immediately. | Action Type | Pre-filled Values | | ----------- | -------------------------------------------------- | | **Walk To** | Current target position (waypoint dot highlighted) | | **Speak** | Current text and duration | | **Wait** | Current duration | | **Ragdoll** | (No parameters) | | **Recover** | (No parameters) | --- ## 6. Phase 3c.3: Action Visual Editing ### 6.1. Feature Breakdown | Feature | Description | | ------------------------- | ----------------------------------------- | | **Waypoint Context Menu** | Right-click waypoint → Edit/Delete/Insert | | **Edit Walk (Visual)** | Click a new position → waypoint moves | | **Insert Action** | Insert before/after a specific waypoint | ### 6.2. Waypoint Context Menu In Edit mode, right-clicking a waypoint dot opens: ``` Right-click Waypoint 3: ┌─────────────────────────────────────────────┐ │ ✎ Edit this Walk │ │ ✕ Delete this Walk │ │ ⬆ Insert action before │ │ ⬇ Insert action after │ └─────────────────────────────────────────────┘ ``` | Action | Behavior | | ------------------------ | -------------------------------------------------------------- | | **Edit this Walk** | Enters target placement mode → click new spot → waypoint moves | | **Delete this Walk** | Removes the walk action from the queue | | **Insert action before** | Opens action popup → inserts new action before this one | | **Insert action after** | Opens action popup → inserts new action after this one | ### 6.3. Visual Update Flow ``` User right-clicks waypoint ↓ Context menu appears ↓ User clicks "Edit this Walk" ↓ Stage enters target placement mode ↓ Current waypoint is highlighted (blinking) ↓ User clicks new position on stage ↓ Old waypoint removed, new waypoint appears ↓ walk_to action's target is updated ↓ Dotted lines reconnect ↓ Order numbers remain the same ``` --- ## 7. Phase 3c.4: Rule Panel ### 7.1. Feature Breakdown | Feature | Description | | -------------------------------- | --------------------------------------------- | | **Rule Panel** | Popup showing all rules for a source stickman | | **Edit Rule (Full)** | Edit trigger type, trigger target, action(s) | | **Edit Rule (Consequence-Only)** | Quick edit of actions only | | **Delete Rule** | Remove rule from registry (confirmation) | | **Reorder Rules** | Drag handle to reorder evaluation order | | **Add Action to Rule** | Add another action to an existing rule | | **Remove Action from Rule** | Delete an action from a rule | | **Clear All** | Remove all rules (confirmation) | ### 7.2. Entry Points | Entry Point | When to Use | How it Works | | -------------------- | ----------------------------- | ------------------------------------------------- | | **Rule Label** | Edit a specific rule | Click the rule label (dashed line) → editor opens | | **Stickman Context** | View all rules for a stickman | Right-click stickman → "Edit Rules" → panel opens | ### 7.3. Rule Panel UI ``` ┌─────────────────────────────────────────────────────────────────────┐ │ RULE PANEL │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Source: Stickman A [×] Close │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ ───────────────────────────────────────────────────────── │ │ │ │ 1 📍 When A arrives at Waypoint 3 │ │ │ │ → B speaks "Hello there!" [✎] [✕] [≡] │ │ │ │ │ │ │ │ 2 📍 When A arrives at Waypoint 5 │ │ │ │ → C walks to crate [✎] [✕] [≡] │ │ │ │ │ │ │ │ 3 🎯 When A enters Area │ │ │ │ → All stickmen ragdoll [✎] [✕] [≡] │ │ │ │ ───────────────────────────────────────────────────────── │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ [Add Rule] [Clear All] │ │ │ └─────────────────────────────────────────────────────────────────────┘ ``` ### 7.4. Rule Editor (Full) Opens when user clicks **[✎]** on a rule in the panel: ``` ┌─────────────────────────────────────────────────────────────────────┐ │ EDIT RULE │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Trigger: │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ [📍 Arrives at waypoint ▼] [Click target →] │ │ │ │ Target: Waypoint 3 (on stage) │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ Actions: │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 1 💬 B speaks "Hello there!" [✎] [✕] │ │ │ │ 2 🚶 C walks to crate [✎] [✕] │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ [Add Action] [Cancel] [OK] │ │ │ └─────────────────────────────────────────────────────────────────────┘ ``` ### 7.5. Rule Editor (Consequence-Only) Opens when user clicks a rule label on the stage: ``` ┌─────────────────────────────────────────────────────────────────────┐ │ EDIT RULE │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ When: 📍 A arrives at Waypoint 3 (read-only) │ │ ────────────────────────────────────────────────────────────── │ │ Then: │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 1 💬 B speaks "Hello there!" [✎] [✕] │ │ │ │ 2 🚶 C walks to crate [✎] [✕] │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ [Add Action] [Done] [Cancel] │ │ │ └─────────────────────────────────────────────────────────────────────┘ ``` **Focus:** The trigger is displayed but **read-only**. For trigger editing, use the full rule editor. --- ## 8. Phase 3c.5: Rule Visual Editing ### 8.1. Feature Breakdown | Feature | Description | | ---------------------------- | ------------------------------------------- | | **Rule Label Click** | Click rule label → consequence-only editor | | **Waypoint → Rules** | Right-click waypoint → "Edit Trigger Rules" | | **Rule Reordering (Visual)** | Evaluation order shown on stage (optional) | ### 8.2. Waypoint → Rules In Edit mode, right-clicking a waypoint dot that is used as a trigger target: ``` Right-click Waypoint 3: ┌─────────────────────────────────────────────┐ │ ✎ Edit this Walk (action) │ │ ───────────────────────────────────────── │ │ ⚡ Edit Trigger Rules (2 rules) │ └─────────────────────────────────────────────┘ ``` Clicking "Edit Trigger Rules" opens the Rule Panel filtered to rules using that waypoint. --- ## 9. File Structure | File | Purpose | | ----------------------------------- | ------------------------------------------------------ | | `scripts/action_registry.gd` | Registry of action templates (extensible) | | `scripts/trigger_registry.gd` | Registry of trigger templates (extensible) | | `scripts/queue_panel.gd` | Action Queue Panel controller | | `scripts/queue_panel.tscn` | Action Queue Panel scene | | `scripts/rule_panel.gd` | Rule Panel controller | | `scripts/rule_panel.tscn` | Rule Panel scene | | `scripts/action_editor.gd` | Action Editor popup controller | | `scripts/action_editor.tscn` | Action Editor popup scene | | `scripts/rule_editor.gd` | Rule Editor popup controller (full + consequence-only) | | `scripts/rule_editor.tscn` | Rule Editor popup scene | | `scripts/waypoint_context.gd` | Waypoint right-click menu | | `scripts/sandbox_stage.gd` | Add "Edit Queue", "Edit Rules", integrate editors | | `scripts/stage_director_visuals.gd` | Waypoint hit-testing, rule label click → editor | --- ## 10. Extensibility Guide ### 10.1. Adding a New Action Type ```gdscript # 1. Add to action_registry.gd const ACTION_TEMPLATES = { # ... existing actions ... "jump": { "label": "Jump", "icon": "🦘", "params": [ { "key": "height", "type": "float", "default": 100.0 }, { "key": "duration", "type": "float", "default": 0.5 } ] } } ``` # 2. Implement the action in StickmanRig.\_process_queue() # 3. Add the action to the popup (automatically from registry) ### 10.2. Adding a New Rule Trigger Type ```gdscript # 1. Add to trigger_registry.gd const TRIGGER_TEMPLATES = { # ... existing triggers ... "variable_changed": { "label": "Variable changes", "icon": "📊", "target_type": "variable" } } ``` # 2. Emit the trigger signal from SandboxStage # 3. Add the trigger to the rule builder (automatically from registry) ### 10.3. Adding a New Action Property ```gdscript # 1. The action is stored as a Dictionary { "type": "speak", "text": "Hello", "duration": 2.0, "text_color": "#ff0000" } # 2. The Action Editor reads all keys from params # 3. Unknown keys are displayed as read-only (or editable with generic control) # 4. The action runner reads the new key when executing ``` --- ## 11. Acceptance Criteria ### 11.1. Action Queue Panel -"Edit Queue" opens panel from popup and right-click. -Panel shows all actions in order. -Each action shows type, parameters, and order number. -[✕] deletes action (confirmation dialog). -[✎] opens edit popup with pre-filled values. -[≡] reorders actions. -"Clear All" removes all actions (confirmation). -"Add Action" appends a new action. ### 11.2. Edit Action - Walk To: Edit opens target placement mode; clicking new spot updates waypoint. - Speak: Edit opens text dialog with current text pre-filled. - Wait: Edit opens duration dialog with current value pre-filled. - Ragdoll/Recover: Edit opens confirmation dialog. ### 11.3. Waypoint Context Menu - Right-click waypoint opens context menu. - "Edit this Walk" enters target placement mode. - "Delete this Walk" removes the action. - "Insert action before/after" inserts new action. ### 11.4. Rule Panel - "Edit Rules" opens panel from stickman context menu. - Panel shows all rules where stickman is trigger source. - Each rule shows trigger type, target, and action(s). - `[✕] deletes rule (confirmation). - `[✎] opens rule editor with pre-filled values. - `[≡] reorders rules. - "Add Rule" opens rule builder. - "Clear All" removes all rules (confirmation). ### 11.5. Rule Editor - Full editor: trigger type dropdown works, trigger target can be clicked. - Full editor: action type dropdown works, target can be clicked. - Full editor: parameters (text, duration) can be edited. - Consequence-only editor: trigger is read-only. - Consequence-only editor: actions can be edited. - Multi-action rules: add/remove actions. - Saving updates rule in event registry. - Visual connectors update immediately. ### 11.6. Visual Updates - Waypoint dots move when Walk actions are edited. - Speech badge text updates when Speak actions are edited. - Wait duration updates. - Dotted lines reconnect to reflect new order. - Order numbers update after insert/delete/reorder. - Rule labels update with new summaries. - Dashed lines reconnect to new targets. ### 11.7. Backward Compatibility - Existing queues load and display correctly. - Editing preserves action types and parameters. - Existing rules load and display correctly. - Editing a rule preserves the rule ID. - Deleting an action/rule cleans up all references. ### 11.8. Extensibility - New action types can be added via registry (no code changes required). - New trigger types can be added via registry. - New action properties are supported (dictionary keys). - Editor gracefully handles unknown keys. --- ## 12. Implementation Order Summary | Phase | Focus | Key Deliverables | | -------- | --------------------- | ------------------------------------------------------- | | **3c.1** | Foundation | Action Registry, Trigger Registry, Shared UI Components | | **3c.2** | Action Queue Panel | Queue panel, edit/delete/reorder actions | | **3c.3** | Action Visual Editing | Waypoint context menu, visual walk editing | | **3c.4** | Rule Panel | Rule panel, full/consequence-only edit, reorder | | **3c.5** | Rule Visual Editing | Rule label click, waypoint trigger rules | --- ## 13. Summary | Before | After | | ------------------------------------ | --------------------------------------------- | | Actions can only be appended | Actions can be edited, deleted, and reordered | | Rules can only be created or deleted | Rules can be edited, deleted, and reordered | | No way to fix mistakes | Edit any parameter | | No way to change order | Drag to reorder | | No visual editing | Waypoint context menu + visual walk editing | | No chain reaction editing | Add/remove actions from rules | | Fixed evaluation order | Drag to reorder rules | | Tightly coupled code | Registry-driven, extensible architecture | **This completes the Director Tool's full editing capabilities.** Directors can now create, edit, delete, and reorder both actions and rules with full control and extensibility for future development.