--- id: PLN-0003 ticket: world-editor-journey-spec title: World Editor Authoring UI and WorldLayoutSO status: review created: 2026-06-19 decisions: - DEC-0001 tags: - editor - world-editor - authoring --- ## Briefing Implement the editor-only World Editor authoring surface and `WorldLayoutSO`. This plan creates the authoring model and window technology, but does not publish `JGraphSO`; publishing is covered by PLN-0004. ## Source Decisions - `DEC-0001`: World Editor / Journey V1. ## Target Create a V1 World Editor under an editor-only path, using the same window technology as the Stage Editor: - `EditorWindow` - UI Toolkit - custom canvas via `VisualElement.generateVisualContent` Create `WorldLayoutSO` as the editor/authoring ScriptableObject. ## Scope - Editor-only `WorldLayoutSO`. - Editor window shell. - Top bar with `WorldLayoutSO` selection and create/save controls. - 2D layer selector. - Grid canvas for WorldTiles. - Basic stage footprint authoring. - Authoring data for sockets, anchors, lifts, and required/optional endpoint flags. - Manual Stage Editor integration only. ## Out Of Scope - Runtime `JGraphSO` implementation; covered by PLN-0002. - Commit/publish pipeline; covered by PLN-0004. - Stage scene bake. - Automatic double-click opening of Stage Editor in V1. - Advanced wiring screen. - Loading hints and concrete requirements. ## Execution Plan 1. Create editor folder structure. - Target `Assets/Scripts/Editor/GON/WorldEditor`. - Mirror Stage Editor conventions from `Assets/Scripts/Editor/GON/StageEditor`. 2. Implement `WorldLayoutSO`. - ScriptableObject under editor-only code. - Fields: stable layout id, `worldTileSize` default 24, `worldLayerHeight` default 24, stages, authoring endpoints, authoring connections, and editor metadata. - Stages in `WorldLayoutSO` reference or identify their editor `StageDefinition` where needed, but this remains authoring-only. 3. Implement authoring records. - World stage record with stable id, display name, layer, occupied tiles, color, optional `StageDefinition` reference. - Authoring endpoint records for socket, anchor, and lift. - Authoring connection records with stable ids and endpoint ids. - Required endpoint flag. 4. Implement `WorldEditorWindow`. - Use `EditorWindow`. - Use UI Toolkit. - Add menu item under the same family as Stage Editor, e.g. `Tools/Gardens Of Nil/World Editor`. - Top bar: `WorldLayoutSO` object field, create button, save button, validate button placeholder, commit button placeholder or disabled until PLN-0004. 5. Implement `WorldMapCanvas`. - Use `VisualElement.generateVisualContent`. - Render current `WorldLayer`. - Render grid, stage footprints, occupied tiles, endpoints, and basic connection indicators. - Implement pan/zoom behavior consistent with Stage Editor canvas patterns. 6. Implement basic editing operations. - Create/select Stage. - Paint or remove occupied WorldTiles for selected Stage. - Prevent obvious same-layer tile overlap at authoring time where possible. - Add socket on free tile face. - Add anchor or lift to tile, enforcing no anchor/lift coexistence. ## Acceptance Criteria - World Editor files live under `Assets/Scripts/Editor/GON/WorldEditor`. - `WorldLayoutSO` defaults to 24m tile size and 24m layer height. - World Editor opens from Unity menu. - World Editor uses `EditorWindow` and UI Toolkit. - Canvas uses `VisualElement.generateVisualContent`. - `WorldLayoutSO` is not consumed by runtime Journey code. - Stage Editor integration remains manual in V1. ## Validation - Unity compile succeeds. - Open the World Editor window in Unity. - Create a `WorldLayoutSO` asset. - Author two stages on the same layer and verify same-tile overlap is prevented or reported. - Add socket, anchor, and lift authoring endpoints. - Verify anchor and lift cannot coexist on the same WorldTile. - Verify no generated Stage scene or Stage bake occurs from these authoring actions. - No automated tests are required for this phase. ## Risks - UI scope can grow quickly; keep V1 focused on authoring enough data for commit. - If `StageDefinition` moved or changes namespace, keep references isolated inside editor-only code. - Editor-only `WorldLayoutSO` should not leak into runtime scenes or runtime Journey APIs.