readable names also in io, checks and texture messages (naming moved to editor.model), tile palette filter by name or number, import preview frames the main mass and zooms with the wheel, object palette right-click no longer switches to place, floorfinder built on ground, levelbuild starts get one camera node behind the llama (golden hashes updated, boot-to-level moves it along)
This commit is contained in:
1 parent
386a06006d
commit
38c679b319
49 files changed
+819
-470
No files matched your search
@@ -41,7 +41,9 @@ seconds after the game window opens, and **Escape** quits back to the editor.
|
||||
the hit + 0.6 among scene tiles and brush-generated tiles, searching up to 0.75 cells around
|
||||
(rings of 8); material 30 (death floor) is rejected. Needed because render geometry often has
|
||||
no collision (village: the hill edge east of the start renders, but only a death floor at
|
||||
y 2.25 lies below – the llama fell to a game over).
|
||||
y 2.25 lies below – the llama fell to a game over). Since 2026-11-07 `FloorFinder` is a thin layer
|
||||
over the objects tools' `Ground` (`Ground.ofCells(scene, …)` built from the query cell(s) only + `cellBelow`: the cell's own tiles only, death
|
||||
floors included so a death floor is still reported/used as last resort, no swap models or neighbours).
|
||||
* `-Dllamamod.editor.noLaunch=true` skips the start (tests start the game with apptest).
|
||||
|
||||
## Exe mod `boot-to-level` (GAMEPLAY, `modifiesExecutable`)
|
||||
|
||||
@@ -55,7 +55,8 @@ a swatch picker, thickness, steps, segments, collision, solid sides, material).
|
||||
|
||||
### Tiles tool (T) – original-style levels
|
||||
Modes **Paint / Pick / Erase / Raise-lower / Swap model**, palette of the level's tile models with
|
||||
thumbnails in the Inspector (filter, "only used models"). Paint puts the palette model into the cell
|
||||
thumbnails in the Inspector (filter on the readable model name or number with the outliner's
|
||||
whole-number rule, `ReadableNames.matches`; "only used models"). Paint puts the palette model into the cell
|
||||
under the cursor (on the surface height, or at a fixed height), rotation 0/90/180/270 (`[` `]`),
|
||||
height Page Up/Down. Painting onto a tile at the same height swaps its model instead of stacking
|
||||
(keeps tile indices that strat scripts use). Shift+click = pick (model, height, rotation). New tiles
|
||||
@@ -88,7 +89,9 @@ Invisible collision volumes (Invisible wall/block, colliders) are drawn transluc
|
||||
"Invisible collision volumes").
|
||||
|
||||
### Mesh import (File → Import mesh)
|
||||
File chooser, then a dialog: rotatable preview (shown as in game; flat shading with a small z-buffer at
|
||||
File chooser, then a dialog: rotatable preview (mouse wheel zooms; framed on the main mass –
|
||||
`Preview.focusBounds`: per axis the vertices within 2.5 IQR of the middle half (Tukey fences), the full
|
||||
bounds unless they are over 1.5× larger; `geo_import_focus.jpg`: house with a triangle 400 cells away, `geo_import_zoomed_out.jpg`) (shown as in game; flat shading with a small z-buffer at
|
||||
twice the panel size, `PreviewRaster` – before 2026-11-07 the triangles were sorted by centroid and hidden
|
||||
faces showed as slivers) with a 1-cell grid and a llama-sized marker, source
|
||||
info, up axis, unit scale and "fit largest side to n cells", turn, mirror, stand on the ground,
|
||||
|
||||
@@ -10,7 +10,7 @@ screenshot tour `ObjectsTour` (test classes).
|
||||
|
||||
| Part | Content |
|
||||
|---|---|
|
||||
| **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 |
|
||||
| **Objects panel** (left dock) | every placeable type of the base with rendered thumbnail, category filter, search (name + schema summary), favourites (right-click – it never selects or switches to the Place tool, nor does the click that closes the menu; ★ 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 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 |
|
||||
@@ -91,8 +91,9 @@ JumpingBeetleBlue with a 4-node patrol path, CityGuard with two boxes):
|
||||
`GeometryChecks`. Tests: `GuardsTest`, `OriginalExitsTest`, `OriginalStartsTest`.
|
||||
* 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.
|
||||
where the cell has no floor at all (`Hit.source`). `cellBelow` is the strict engine test (own cell,
|
||||
death floors included) that the play-test `FloorFinder` and boot-to-level's crash check use (one
|
||||
implementation since 2026-11-07). `GroundTest` compares the fallbacks with it 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°.
|
||||
|
||||
@@ -46,6 +46,12 @@ actions (AWT canvases do not get Swing key bindings).
|
||||
(one row while each cell gets ≥ 66 px, else stacked one per row; also the brush rotation spinners);
|
||||
reference buttons (`InspectorPanel.RefButton`) show the longest name that fits ("Waypoint 5 (chain 3)" →
|
||||
"Waypoint 5" → "#5", other names drop a "(…)" suffix, then "…"), full name + id in the tooltip.
|
||||
* The naming logic lives in `editor.model.ReadableNames` (so editor.io can use it: brush compile warnings
|
||||
"Floor 2: … – skipped", `Validator` messages, "is still used by" errors); `ui.NodeNames` extends it.
|
||||
Also: waypoint added / pilot mode status, object check texts ("Coin 3: …", "Waypoint chain at
|
||||
Waypoint 4 (chain 2)"), missing texture page ("Texture #5 uses page 7, but the level has only 4 texture
|
||||
pages (0–3)"), Problems tooltip. Numbers in filter queries match whole numbers at both ends ("2" no
|
||||
longer finds "Floor 12"); the tile palette filter uses the same rule on model names/numbers.
|
||||
* Tool status and check texts use `NodeNames` too (geometry, tile paint, collision, texture paint,
|
||||
lights, brush-outside-grid check, "Placed Model 12 in cell …"); the outliner filter applies the
|
||||
whole-number rule to the old label and the id as well ("tile 3" no longer finds x = 39).
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 101 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 83 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
+10
-4
@@ -87,8 +87,8 @@ stairs, platforms register as shadow casters (`solids`). 1.0 = texture colour
|
||||
* `variant`: types with several code entry points (e.g. SmashPot: 2 spawn stubs).
|
||||
* **Waypoints** (`wp`): `'relative'` = move the original's waypoint chain along (offset to the
|
||||
object is kept, y is set to the floor if there is one), `'here'` = all points on
|
||||
the object, `'none'` = none (−1), or your own list `[(x,z[,y[,deg]]), …]` (extra fields
|
||||
of the original waypoints are taken over). Chains are renumbered (no references into the
|
||||
the object, `'none'` = none (−1), or your own list `[(x,z[,y[,deg[,unk2]]]), …]` (other extra
|
||||
fields of the original waypoints are taken over). Chains are renumbered (no references into the
|
||||
old level).
|
||||
* `player(x,z,rot)` (strat `Llama`), `checkpoint(x,z)` (`CheckPointPost`), `exit(x,z)`
|
||||
(`LevelDoor`), `coins([(x,z),…])`.
|
||||
@@ -131,8 +131,14 @@ stairs, platforms register as shadow casters (`solids`). 1.0 = texture colour
|
||||
* Rot 0° = facing +z, 90° = facing +x.
|
||||
* **Death plane works**: falling into the sea → health gone, respawn at the last
|
||||
checkpoint (or start).
|
||||
* Player waypoint chain (14 points for the village llama, meaning unclear): `player()` puts the
|
||||
first one 8 units behind the llama, the rest on the llama, extra fields from the original.
|
||||
* Player waypoint chain = start camera positions (the game takes the first node within 2.5 cells
|
||||
of the llama, see `editor.model.cmd.PlayerStart`): `player()` gives the llama ONE node 2 cells
|
||||
behind it, 0.5 above, unk2 = 0 (default camera distance/height) – like the editor's player start.
|
||||
Until 2026-11-07 it copied the prototype's 14-node chain (first node 8 behind = out of range, the
|
||||
rest on the llama): on village 2 bases (node 2 has unk2 ≠ 0) that put the camera into the llama's
|
||||
head. Waypoint lists take an optional 5th value unk2: `[(x,z,y,deg,unk2)]`.
|
||||
In game (test world, apptest 2026-11-07): the start camera is behind the llama at the default
|
||||
distance (`notes/img/editor/testworld_start_camera.jpg`).
|
||||
* **LevelDoor** (exit) – solved, see section "Exit (LevelDoor)" below.
|
||||
* Sizes that work: TRAK 0.6–1.0 MB, up to 1100 models, 5200 tiles, WAD up to 6.9 MB
|
||||
(originals: TRAK ≤ 1 MB, ≤ 5800 tiles, WAD ≤ 6.85 MB). Test world: 628 models,
|
||||
|
||||
@@ -21,6 +21,11 @@ without "@" applies to whatever level is chosen (old configs, hand-typed values)
|
||||
checked strictly. Tests: `BootToLevelModTest.startOfAnotherLevelIsIgnored`, `parsesStartLevel`.
|
||||
The editor's play-test (`PlaytestRunner.install`) should write the bound form – see the report.
|
||||
|
||||
**Start camera along** (`StartOverride.apply`): the llama's chain moves and turns with the start when it
|
||||
is a levelbuild/editor start camera – one node within 2.5 cells (`PlayerStart`, levelbuild since
|
||||
2026-11-07) or the older "node 8 behind + nodes on the llama" chain; original chains stay. Test:
|
||||
`BootToLevelModTest.singleCameraNodeMovesWithTheStart`.
|
||||
|
||||
Patches: `jmp` at 0x549C50 (main-menu frame handler) → once: read slots (FUN_0041c0e0), load
|
||||
slot (FUN_0041cc70), set tribe/world/chapter/map 0x584EB4…, music shutdown, state 0x5846E4 = 3,
|
||||
return 1. `quitOnEscape`: `jmp` at 0x549F40 (in-game frame handler): pause bit 0x8 of 0x5FCF08 →
|
||||
|
||||
Reference in new issue
Block a user