objects: snap to floor follows the engine's cell rule (cell tiles, swap models, then neighbours), alligator, alligator spawner and cow guard spawner schemas with box checks, every way of adding a box walker gives it a box, guard info names the objects that set its event bit, new and moved player starts carry their start camera node (no camera in the llama's head), edit and delete type in the object palettes' context menu

This commit is contained in:
MineTec committed 2026-11-07 13:51:12 +01:00
1 parent 01208aa36f
commit 6a76cac69f
34 files changed
+1302 -203

No files matched your search

+21 -7
View File
@@ -12,7 +12,7 @@ screenshot tour `ObjectsTour` (test classes).
|---|---|
| **Objects panel** (left dock) | every placeable type of the base with rendered thumbnail, category filter, search (name + schema summary), favourites (right-click, ★ filter), "parameters decoded" marker; drag into the viewport or click → Place tool. Quick setups: Player start, Checkpoint, Exit, Secret, Coin line, Coin arc |
| **Place tool** (P) | click = place on the collision floor under the cursor (snap to floor, grid snap), yaw = camera direction / facing the camera / 0° / type default; click + drag an object = move along the ground (its waypoints move along); drag the yellow knob = rotate (angle snap; a checkpoint's respawn node turns with it). Modes for the setups |
| Setups | **Player start** moves the existing player (exactly one) or places a Llama with its chain (camera node 8 cells behind). **Checkpoint** = CheckPointPost + respawn node 0.4 ahead (floor height). **Exit** = LevelDoor in the cell centre + 1×1 FLOOR brush with collision material 16; target picked in the options bar (world/chapter names, "world finished 7,7,7"). **Secret** = Secret with a 3×3 box (2 nodes). Guards (any placement) get one 4×4 box and event bit 0 |
| Setups | **Player start** moves the existing player (exactly one) or places a Llama with one start camera node 2 cells behind (moving keeps door nodes, carries the near nodes and the village fly-by trigger). **Checkpoint** = CheckPointPost + respawn node 0.4 ahead (floor height). **Exit** = LevelDoor in the cell centre + 1×1 FLOOR brush with collision material 16; target picked in the options bar (world/chapter names, "world finished 7,7,7"). **Secret** = Secret with a 3×3 box (2 nodes). Guards, alligators and spawners get one 4×4 box (and guards event bit 0) on every way of adding an object (`Edits.placeStrat`: Place tool, drag from Objects panel / Assets, double-click) |
| **Coin tool** (O) | Line: two clicks, coins every *spacing*; Arc: centre + point on the circle, *count* coins over *arc°*; Coin/Coin5, height above floor, follow floor; live preview |
| **Waypoint tool** (N) | select an object (or node): click = add node after the selected node / at the chain end (creates the chain if missing), Ctrl+click = insert before, drag = move (keeps height above floor), Backspace/Del = remove and relink; Reverse; orient new nodes along the path |
| **Zones & triggers** (J) | handles: 4 corners of box zones (node pairs: Secret, CameraSide/Lift, ObjectDontDropInBox, FallOffNoHurt …), radius knob for RADIUS parameters (CutSceneTrigger, guards, CameraFocusPoint) |
@@ -20,7 +20,7 @@ screenshot tour `ObjectsTour` (test classes).
| Inspector "Waypoint chain" | node i of n, owner and role, ◀ ▶, select object, delete node, look through |
| Viewport layers | *Path directions* (arrows, dashed wrap segment for patrol paths, node yaw ticks), *Zone areas & trigger radii* (boxes for all zone objects, fills for the selection), *Camera frusta* (CameraSide/Lift: computed game camera from height/distance/node yaw; cut-scene cameras: a frustum per node from node yaw/pitch) |
| Look through camera (Ctrl+Shift+L, View → Camera) | viewport takes the camera of the selected node / cut-scene camera / camera zone; while active, flying writes back node position + yaw/pitch, or for CameraSide the height/distance params and node yaw (one undo step per pilot session) |
| Problems (Level → Check, Build) | guards the game would remove (no start box / odd node count) and guards waiting for an event bit, chains not stored contiguously (error, Tools → Repair waypoint chains), param count, out-of-range values, missing required waypoints / odd box pairs, types whose originals always have a chain, LevelDoor without material-16 floor in its cell, impossible exit targets and (7,7,7) in TestLevel, far respawn nodes, several player starts |
| Problems (Level → Check, Build) | guards/alligators/spawners the game would remove (no start box / odd node count), alligators outside their boxes, spawners facing away from their first box, guards waiting for an event bit (and whether any object in the level sets it), a start camera inside the llama, chains not stored contiguously (error, Tools → Repair waypoint chains), param count, out-of-range values, missing required waypoints / odd box pairs, types whose originals always have a chain, LevelDoor without material-16 floor in its cell, impossible exit targets and (7,7,7) in TestLevel, far respawn nodes, several player starts |
| Copy / paste between levels | Edit → Copy objects (Ctrl+Shift+C) puts JSON (objects + chains + brushes, relative to their centre) on the system clipboard; Paste objects (Ctrl+Shift+V) at the view centre in any level – types are matched by name/variant in the target base (unknown types skipped with a message) |
| Prefabs | Tools → Save selection as prefab… / asset browser tab "Prefabs": `<data>/editor/prefabs/<name>.json` + thumbnail; double-click = place at view centre, drag = place under the cursor |
| Delete | `edit.delete` is re-registered: a selection of waypoints is removed with the chain relinked |
@@ -32,14 +32,17 @@ repair action guard it).
## Files
`ObjectsEditorPlugin` (registration, actions, waypoint inspector), `Schemas`/`ParamSchema`/
`TypeStats` (+ `type-stats.tsv`), `ParamsSection`, `ObjectChecks`, `PlaceTool`, `Setups`,
`TypeStats` (+ `type-stats.tsv`), `ParamsSection`, `ObjectChecks`, `Guards`, `EventBits`, `PlaceTool`, `Setups`,
`ExitTarget`, `CoinTool`, `PathTool`, `ChainOps`, `ZoneTool`, `ObjectOverlays`, `CameraView`
(zone camera + pilot), `ObjectPalette`, `ObjectClipboard`, `Prefabs`, `LinkDialog`, `Ground`
(floor finder on the collision polygons of tiles + brush preview tiles), `Session`, `Roles`, `Draw`
(all game↔render conversions in one place).
Shared change: `editor.ui.view.SceneRenderer.brushOutput()` getter (brush preview tiles for the
floor finder). Nothing else outside the package.
Shared changes: `editor.ui.view.SceneRenderer.brushOutput()` getter (brush preview tiles for the
floor finder); `editor.model.WaypointBoxes` + box setup in `Edits.placeStrat`;
`editor.model.cmd.PlayerStart` (also used by the shell's new-level templates); `editor.ui.TypeMenus`
(object type context menu, used by Assets → Objects and the Objects panel; the objects plugin adds
Edit type… / Delete type… for custom types through `editor.tools.strats.CustomTypes`).
## Verified
@@ -65,6 +68,15 @@ JumpingBeetleBlue with a 4-node patrol path, CityGuard with two boxes):
→ tally "Dorf Kapitel 1" at once (`obj_game_village_door.jpg`); at the door's own position
42.5/3.5/49.8 or in the original (door closed) → nothing.
* (2026-11-07, objs2, display :25, TestLevel on village 2 / village 1 / t1l4m002): old player
setup on village 2 = camera in the llama's head until it moves, new setup = camera behind it
from the start (`obj_game_startcam_v2.jpg`); a CityGuard added through the Add-object path
walks in its box; an Alligator added the same way appears and snaps (`obj_game_alligator.jpg`);
original village 1 with the start moved and turned (240°): the fly-by plays at the new start and
ends behind the llama (`obj_game_village1_moved_start.jpg`). Editor: type menu in Assets →
Objects / Objects panel (`obj_type_menu.jpg`, `obj_palette_type_menu.jpg`), event-bit info
(`obj_event_bit_info.jpg`, `obj_guard_event_inspector.jpg`).
## Known limits
* Parameters are decoded for ~35 common types (confidence per type in the schema doc); the rest
@@ -77,8 +89,10 @@ JumpingBeetleBlue with a 4-node patrol path, CityGuard with two boxes):
loader exactly (`Tile.cellX/cellZ` = ftol(x − 0.5), −ftol(z + 0.5)); `ObjectChecks` tests the
door cell like the engine (tiles listed in the cell, any height, swap models), same as
`GeometryChecks`. Tests: `GuardsTest`, `OriginalExitsTest`, `OriginalStartsTest`.
* Snap-to-floor (`Ground`) is geometric: it finds polygons that reach into a cell from a
neighbouring tile, which the engine ignores (`FloorFinder` follows the engine for the player).
* Snap-to-floor (`Ground`) follows the engine's floor test (FUN_004036d0, used for strats too):
only tiles listed in the point's cell; then their swap models; a neighbour tile's polygon only
where the cell has no floor at all (`Hit.source`). `GroundTest` compares it with `FloorFinder`
on three originals. The Place tool drag moves only a player start's nodes within 2.5 cells.
* Zone heights are estimated (+1.2 above the lower node); the engine tests x/z only.
* Camera preview of CameraSide assumes the player in the box centre and default distance 2 /
height 1 when the parameters are 0; the game's FOV is approximated by 60°.