Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
05a6909
Add guarded GUI definition donor cloning and packaged acceptance
BuffJesus Oct 10, 2026
a041e20
Retain texture context after definition-only folder saves
BuffJesus Oct 10, 2026
2d8abff
Enable guarded Unicode wide-string definition drafts
BuffJesus Oct 10, 2026
91c9352
Add shared system glyph fallback and missing-font UI checks
BuffJesus Oct 10, 2026
b49dcf2
Add confirmed GroupDef picker with stale-target publication guards
BuffJesus Oct 10, 2026
d2678ed
Recover inherited Creature GroupDef type from native evidence
BuffJesus Oct 10, 2026
e5d6e8e
Verify Creature CDefs self-reference relocation and audit retail donors
BuffJesus Oct 10, 2026
0e4eeaf
Add guarded self-retargeted Creature clone API and retail append proof
BuffJesus Oct 10, 2026
20df28c
Publish verified Creature clones through paired CLI transactions
BuffJesus Oct 10, 2026
a04ba4c
Expose guarded self-retargeted Creature clone controls
BuffJesus Oct 10, 2026
c337a54
Audit private Creature visual graph ownership against native evidence
BuffJesus Oct 10, 2026
4794380
Recover Creature animation boundaries with read-only native and retai…
BuffJesus Oct 10, 2026
cdce763
Relocate verified Creature animation names without changing asset IDs
BuffJesus Oct 10, 2026
e2a3c54
Add atomic private Creature visual graph cloning with independent ret…
BuffJesus Oct 10, 2026
0ec6697
Publish private Creature graphs transactionally and expose explicit C…
BuffJesus Oct 10, 2026
96e440c
Add explicit private Creature GUI controls with both-size preservatio…
BuffJesus Oct 10, 2026
a49ec80
Verify private Creature GUI stale-source refusal on small owned fixtures
BuffJesus Oct 10, 2026
07a84cb
Verify inherited and unsupported Creature donors through private GUI …
BuffJesus Oct 10, 2026
390b5f1
Validate private Creature workflows from extracted development packages
BuffJesus Oct 10, 2026
92f52d2
Record accepted extracted private Creature checkpoint and remaining c…
BuffJesus Oct 10, 2026
21315c4
Add verified Creature visual definition navigation and UI gates
BuffJesus Oct 10, 2026
81ca7cb
Expose typed Creature body model slots from validated prefix layout
BuffJesus Oct 10, 2026
7360546
Audit retail Creature body model slots independently without asset co…
BuffJesus Oct 10, 2026
c559399
Audit Creature body mesh identities and stored types without copying …
BuffJesus Oct 10, 2026
028817a
Preview verified Creature body-part model alternatives through guarde…
BuffJesus Oct 10, 2026
a8d8bae
Add exact in-memory Creature body model binding with typed mesh guards
BuffJesus Oct 10, 2026
2b96ea3
Publish typed Creature body bindings with late source and graphics ch…
BuffJesus Oct 10, 2026
0653310
Verify retail body publication exact deltas and Restore with refusal …
BuffJesus Oct 10, 2026
2e15884
Exercise Windows body publication rollback after partial installation
BuffJesus Oct 10, 2026
22b6214
Expose guarded explicit-index Creature body binding CLI and retail gates
BuffJesus Oct 10, 2026
af9db82
Add guarded Creature body binding GUI drafts with both-size preservat…
BuffJesus Oct 10, 2026
602d098
Verify body-binding GUI stale bank name and graphics guards on tiny f…
BuffJesus Oct 10, 2026
95b7ea5
test(gui): cover creature body binding pack destinations
BuffJesus Oct 10, 2026
e8ea956
feat(gui): add named creature body model chooser
BuffJesus Oct 10, 2026
305653a
test(package): validate extracted creature body workflows
BuffJesus Oct 10, 2026
018061c
feat(mesh): retain exact donor skeleton blocks for composition
BuffJesus Oct 10, 2026
a799b74
feat(mesh): compose skinned geometry with bounded donor palettes
BuffJesus Oct 10, 2026
373a892
feat(mesh): retain authored glTF skin and bind metadata
BuffJesus Oct 10, 2026
7a6a7ec
feat(mesh): convert authored inverse binds to donor coordinates
BuffJesus Oct 10, 2026
fc486e5
feat(mesh): validate and remap authored skin to donor joints
BuffJesus Oct 10, 2026
fb74041
test(mesh): verify authored skin import against native donors
BuffJesus Oct 10, 2026
d800c39
feat(mesh): prepare guarded donor-skinned bank entries
BuffJesus Oct 10, 2026
65a490d
feat(creature): prepare coordinated private skinned-mesh plans
BuffJesus Oct 10, 2026
f0a6569
feat(creature): publish guarded private mesh transactions
BuffJesus Oct 10, 2026
9569a93
feat(creature): append diffuse textures in coordinated imports
BuffJesus Oct 10, 2026
50bc962
Expose coordinated creature import through explicit CLI selectors
BuffJesus Oct 10, 2026
2bd2b9c
Verify creature CLI publication and Restore against tiny native donor…
BuffJesus Oct 10, 2026
5a91d6f
Validate skinned import plans against native creature graphs
BuffJesus Oct 10, 2026
6fc51e7
Record user-requested pause and custom creature GUI resume checklist
BuffJesus Oct 10, 2026
687fa30
Add reviewed custom Creature import controls and guarded publication
BuffJesus Oct 23, 2026
1da1ab3
Refresh cached model directory after custom Creature pack imports
BuffJesus Oct 23, 2026
65dba50
Preview imported Creature pack textures without replacing world assets
BuffJesus Oct 23, 2026
e828010
Record extracted pack texture checkpoint and shared launch evidence
BuffJesus Oct 23, 2026
730ea70
Show pack model material identity from its rendered texture source
BuffJesus Oct 23, 2026
bbfe9f4
Link accepted Materials identity follow-up from lane status
BuffJesus Oct 23, 2026
91d284e
Route definition placement by compiled class instead of name prefixes
BuffJesus Oct 23, 2026
77eddec
Run packaged placement checks with shipped schema from unrelated cwd
BuffJesus Oct 23, 2026
91985fb
Record combined Creature checkpoint extracted acceptance
BuffJesus Oct 23, 2026
bd25f07
Recover runtime component rule for Creature village placement profiles
BuffJesus Oct 23, 2026
37c1ed1
Derive Creature village membership from verified runtime components
BuffJesus Oct 23, 2026
04ff315
Record extracted Creature runtime-profile checkpoint acceptance
BuffJesus Oct 23, 2026
24ade79
Recover native Creature appearance selection and verify RNG bytes
BuffJesus Oct 23, 2026
1f62726
Audit complete native Creature appearance table layout
BuffJesus Oct 23, 2026
aca1c11
Share checked Creature appearance layout across core authoring
BuffJesus Oct 23, 2026
36061d4
Select Creature appearance with native-checked seed and morph ordering
BuffJesus Oct 23, 2026
5e7a68c
Compose Creature texture replacements by native source keys
BuffJesus Oct 23, 2026
9a58982
Share read-only Creature visual ownership resolution
BuffJesus Oct 23, 2026
776c4f6
Record Creature graph acceptance and skeletal resource evidence
BuffJesus Oct 23, 2026
e73afb8
Record native bone scale combination and config corpus shape
BuffJesus Oct 23, 2026
7b5ac4b
Read checked Creature bone configs and prepare native target rows
BuffJesus Oct 23, 2026
ed85fbf
Verify native bone scale arithmetic and mesh key mapping
BuffJesus Oct 23, 2026
de80f2f
Combine selected bone scales and map mesh-local CRC slots
BuffJesus Oct 23, 2026
d03cc7a
Trace native displacement hierarchy and independent bone scaling
BuffJesus Oct 23, 2026
c81be32
Execute native Creature pose stages across hierarchy and scale fixtures
BuffJesus Oct 23, 2026
7b69640
Checkpoint Creature pose implementation and paused-session handoff
BuffJesus Oct 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 24 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ target_include_directories(forgecore_slice PUBLIC
)

# "-dev" until the release is tagged (docs/RELEASE.md step 5 clears it)
set(FORGE_VERSION_SUFFIX "-rc.2")
set(FORGE_VERSION_SUFFIX "-dev")
add_compile_definitions(ALBION_VERSION="${PROJECT_VERSION}${FORGE_VERSION_SUFFIX}")
add_library(fableforge STATIC src/terrainexport.cpp src/foliageexport.cpp src/thingsexport.cpp src/stbterrain.cpp src/effects.cpp src/leveledit.cpp src/vanilla_props.cpp src/worldedit.cpp src/overworld.cpp src/stbrelocate.cpp src/lodbake.cpp src/stitch.cpp src/livelink.cpp src/backups.cpp src/navlines.cpp src/worldtiles.cpp
src/stbcompact.cpp src/presets.cpp src/gtg.cpp src/texturebrowse.cpp src/meshimport.cpp src/modpack.cpp)
Expand Down Expand Up @@ -99,6 +99,12 @@ add_test(NAME fableforge_defdecode_tests COMMAND fableforge_defdecode_tests)
add_executable(fableforge_fmplinks_tests tests/test_fmplinks.cpp)
target_link_libraries(fableforge_fmplinks_tests PRIVATE forgecore_slice)
add_test(NAME fableforge_fmplinks_tests COMMAND fableforge_fmplinks_tests)
add_executable(fableforge_boneconfig_tests tests/test_boneconfig.cpp)
target_link_libraries(fableforge_boneconfig_tests PRIVATE forgecore_slice)
add_test(NAME fableforge_boneconfig_tests COMMAND fableforge_boneconfig_tests)
add_executable(fableforge_creaturepose_tests tests/test_creaturepose.cpp)
target_link_libraries(fableforge_creaturepose_tests PRIVATE forgecore_slice)
add_test(NAME fableforge_creaturepose_tests COMMAND fableforge_creaturepose_tests)
add_executable(fableforge_defrelocate_tests tests/test_defrelocate.cpp)
target_link_libraries(fableforge_defrelocate_tests PRIVATE forgecore_slice)
add_test(NAME fableforge_defrelocate_tests COMMAND fableforge_defrelocate_tests)
Expand All @@ -108,6 +114,12 @@ add_test(NAME fableforge_defnamespace_tests COMMAND fableforge_defnamespace_test
add_executable(fableforge_binclone_tests tests/test_binclone.cpp)
target_link_libraries(fableforge_binclone_tests PRIVATE forgecore_slice)
add_test(NAME fableforge_binclone_tests COMMAND fableforge_binclone_tests)
add_executable(fableforge_creatureclone_tests tests/test_creatureclone.cpp)
target_link_libraries(fableforge_creatureclone_tests PRIVATE forgecore_slice)
add_test(NAME fableforge_creatureclone_tests COMMAND fableforge_creatureclone_tests)
add_executable(fableforge_creaturevisualclone_tests tests/test_creaturevisualclone.cpp)
target_link_libraries(fableforge_creaturevisualclone_tests PRIVATE fableforge)
add_test(NAME fableforge_creaturevisualclone_tests COMMAND fableforge_creaturevisualclone_tests)
add_executable(fableforge_binwrite_tests tests/test_binwrite.cpp)
target_link_libraries(fableforge_binwrite_tests PRIVATE forgecore_slice)
add_test(NAME fableforge_binwrite_tests COMMAND fableforge_binwrite_tests)
Expand All @@ -122,6 +134,9 @@ target_link_libraries(fableforge_meshbounds_tests PRIVATE forgecore_slice)
add_test(NAME fableforge_meshbounds_tests COMMAND fableforge_meshbounds_tests)
add_executable(fableforge_meshskeleton_tests tests/test_meshskeleton.cpp)
target_link_libraries(fableforge_meshskeleton_tests PRIVATE forgecore_slice)
add_executable(fableforge_skinnedcompose_tests tests/test_skinnedcompose.cpp)
target_link_libraries(fableforge_skinnedcompose_tests PRIVATE forgecore_slice)
add_test(NAME fableforge_skinnedcompose_tests COMMAND fableforge_skinnedcompose_tests)
add_executable(fableforge_animation_tests tests/test_animation.cpp)
target_link_libraries(fableforge_animation_tests PRIVATE forgecore_slice)
add_test(NAME fableforge_animation_tests COMMAND fableforge_animation_tests)
Expand Down Expand Up @@ -152,6 +167,9 @@ add_test(NAME fableforge_tests COMMAND fableforge_tests)
add_executable(fableforge_meshinput_tests tests/test_meshinput.cpp)
target_link_libraries(fableforge_meshinput_tests PRIVATE fableforge)
add_test(NAME fableforge_meshinput_tests COMMAND fableforge_meshinput_tests)
add_executable(fableforge_skinnedinput_tests tests/test_skinnedinput.cpp)
target_link_libraries(fableforge_skinnedinput_tests PRIVATE fableforge)
add_test(NAME fableforge_skinnedinput_tests COMMAND fableforge_skinnedinput_tests)
add_executable(fableforge_stage_tests tests/test_stage.cpp)
target_link_libraries(fableforge_stage_tests PRIVATE forgecore_slice)
add_test(NAME fableforge_stage_tests COMMAND fableforge_stage_tests)
Expand Down Expand Up @@ -200,6 +218,9 @@ add_test(NAME fableforge_lut_tests COMMAND fableforge_lut_tests)
add_executable(fableforge_unicode_tests tests/test_unicode.cpp)
target_link_libraries(fableforge_unicode_tests PRIVATE forgecore_slice)
add_test(NAME fableforge_unicode_tests COMMAND fableforge_unicode_tests)
add_executable(fableforge_definitionfield_tests tests/test_definitionfield.cpp)
target_link_libraries(fableforge_definitionfield_tests PRIVATE fableforge)
add_test(NAME fableforge_definitionfield_tests COMMAND fableforge_definitionfield_tests)

add_executable(fableforge_dialoguetext_tests tests/test_dialoguetext.cpp)
target_link_libraries(fableforge_dialoguetext_tests PRIVATE forgecore_slice)
Expand Down Expand Up @@ -234,6 +255,8 @@ if(WIN32)
${IMGUI_DIR}/imgui_impl_dx11.cpp
)
target_include_directories(albion_imgui PUBLIC ${IMGUI_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/vendor/ImGuizmo)
# Keep supplementary Unicode input intact in the GUI and all ImGui consumers.
target_compile_definitions(albion_imgui PUBLIC IMGUI_USE_WCHAR32)
target_link_libraries(albion_imgui PUBLIC d3d11 dxgi d3dcompiler dwmapi ole32 shell32 uuid)

add_executable(FableForge WIN32
Expand Down
90 changes: 88 additions & 2 deletions docs/AUTOMATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -501,7 +501,8 @@ Settings persistence is disabled under `--auto` so runs are deterministic.
| `set_entrance` | the map's region entrance (FinalAlbion.gtg, this map's WLD slot) at the view centre, facing the camera (state `entrance` = `x,y,h` or `-`; widget `btn_set_entrance`) |
| `preset_place <name>` / `preset_save <name>` | place a preset (shipped `presets/` or the user folder) at the view centre as a selected group; save the selection as a user preset (state `presets` = how many are listed) |
| `select_toggle <index>` / `select_added` / `copy` / `paste` | Ctrl+click a thing into/out of the selection; select the first thing the Changes list reports as added; copy the selection as a fragment; paste it at the view centre (state `selection_count`) |
| `place <DEFINITION> [scriptname]` | place a new thing at the camera focus, on the ground (`CREATURE_*` as the retail AICreature block) |
| `place <DEFINITION> [scriptname]` | place a new thing at the camera focus, on the ground, using its compiled class and validated runtime component profile |
| `place_refused <DEFINITION> [scriptname]` | require placement to refuse; malformed Creature profiles must leave the document and recovery files unchanged |
| `set place_def <DEFINITION>` / `place_at <u> <v>` | choose the palette definition and place it at viewport-relative pointed terrain coordinates; Shift+click tests the actual input path |
| `snapshot_frame` / `assert_selected_moved_xy` / `assert_selected_frame_same` / `assert_ground_offset_same` | capture a selected frame, then check XY movement, exact frame restoration, or preserved height above terrain |
| `ground_place_carry.txt` | synthetic Shift+click placement, plain and Ctrl+Shift ground drag, Ctrl+D cursor carry, grouped undo, fixed height, lock refusal and Escape cancellation |
Expand Down Expand Up @@ -581,7 +582,9 @@ Settings persistence is disabled under `--auto` so runs are deterministic.
| `assert_file_contains <path> <text...>` | the file exists and contains the text (the rest of the line, e.g. `ScriptName UiNamedBarrel;`) |
| `assert_state <key> <value>` | see `dump_state` for keys |
| `assert_state_min <key> <n>` / `assert_state_max <key> <n>` | a numeric state key is at least / at most n (e.g. `texture_thumbs_made`, the Textures list thumbnails decoded so far) |
| `assert_widget <widget>` | the widget was drawn this frame |
| `assert_widget <widget>` | the widget has been registered (registrations persist across frames) |
| `clear_widget_registry` | clear retained widget rectangles; wait for redraw before checking current presence |
| `assert_widget_absent <widget>` | the widget is not registered; clear the registry and wait for redraw first to test current absence |
| `assert_log <text>` | some app log line contains the text (background job notes, e.g. `1 stitched`) |
| `world_tab 0\|1`, `world_select <map>`, `world_move <map> <x> <y>`, `world_move_refused ...`, `world_owner <map> <region>`, `world_sees <region> <map> <0\|1>`, `world_stitch <0\|1> [feather]`, `world_revert`, `world_undo`, `world_redo`, `world_apply`, `wait_world` | the World tab: queue moves / region edits, stitch seams after the apply (feather -1 = auto), write them; state keys `world_*` |
| `dump_state` | write every state key to the log |
Expand Down Expand Up @@ -1081,6 +1084,87 @@ Definitions inspection uses `assets_tab 6`, `wait_definitions`, `definition_bank

Definition scalar drafts use `definition_edit <field-index>`, `definition_value <value>`, `definition_save`, and `definition_cancel`. The edit/value/save `_refused` variants check refusals. `definition_editing` and `definition_edit_failed` report draft state. Saving reselects the explicit native index, even when another record has a numeric name.

CWideString drafts accept strict UTF-8 up to 127 bytes (not characters). Real
`input_text` includes supplementary input through 32-bit ImGui characters. C0/C1
controls refuse at Save; malformed UTF-8 and byte-overflow values refuse in the
automation setter. Narrow strings and clone names retain ASCII-only input.
`definition_wide` independently checks native UTF-16LE bytes and malformed-original
refusal. `definition_wide_retail` drives both window sizes against read-only retail
inputs, compares every record/table/name byte and restores only owned output.

`assert_font_glyph <body|bold|title|small> <hex-codepoint>` checks actual source
glyph availability without accepting the replacement glyph; `_missing` checks
absence. Malformed code points, surrogates and unknown roles fail the assertion.
`FABLEFORGE_AUTOMATION_FONT_DIR` overrides the font directory only when automation
is active. `font_fallback` checks all four roles across repeated scale/atlas rebuilds
and system/no-font/primary-only fixtures. Optional absent language/emoji groups are
explicitly reported in its `skipped_glyph_groups`; `--require-wide` requires the
installed CJK and emoji sources for a stronger local proof. No system fonts are
modified or bundled; only primary-font copies in owned scratch fixtures are used.

Definition clone drafts use `definition_clone` (or the real
`btn_definition_clone` control), `definition_value <new-name>`, `definition_save`
and `definition_cancel`. `definition_clone_refused` checks draft/load refusal;
`definition_cloning` distinguishes a clone from a field draft. Real name entry
uses `input_definition_edit_value`; `btn_definition_save` and
`btn_definition_save_confirm` exercise the Create confirmation. The
`definition_clone_ui` package workflow covers game/frontend/script banks,
numeric/unnamed/duplicate-name donors, folder/pack outputs, stale sources,
invalid names, cancellation, Close/Install guards and paired Restore at both sizes.

The distinct Creature mode uses `definition_clone_creature` or the real
`btn_definition_clone_creature` control, plus the same name/Save/Cancel widgets.
`definition_clone_creature_refused` checks preflight refusal;
`definition_creature_cloning` distinguishes it from an exact clone draft.
`creature_clone_ui` covers 36 synthetic cases across both window sizes.

Private Creature custom import uses the real `check_definition_creature_mesh`,
`combo_definition_creature_slot` / `definition_creature_slot_<ordinal>`,
`input_definition_creature_model`, `input_definition_creature_mesh_name`,
`input_definition_creature_texture`, `input_definition_creature_texture_name`,
`input_definition_creature_texture_id`, `combo_definition_creature_format` /
`definition_creature_format_<0|1|2>` and `check_definition_creature_stored`
widgets. The existing Save button first reviews the import asynchronously;
`wait_definitions` waits for review/publication and the confirmation button
creates only the reviewed snapshot. `definition_cancel` refuses during workers.
`creature_import_ui` exercises retained tiny donor fixtures at both sizes,
including changed model/sidecar/image/bank/manifest and junction identities,
exact definition/asset preservation, output Restore and close protection.
Set `FABLEFORGE_CREATURE_FIXTURES` to the passed packet from
`tools/test_skinned_input_donors.py`, or pass `--fixtures` directly to the test.
Without that packet the workflow reports SKIP. Synthetic schema checks run
byte-identical executable/DLL copies in an owned runtime directory; their cwd
supplies the tiny schema, leaving packaged retail schemas untouched.

`model_textured_parts` counts uploaded model parts with a bound texture SRV;
`asset_context_root` identifies the world asset context. Pack-preview cases use
separate pack/save folders, require actual diffuse binding, retain the original
world context, refresh Models, and switch back to the install. An existing-texture
case also checks that no texture bank is created. The GUI driver's result pins its
startup SHA256 and refuses a driver change during execution. Pack material metadata registers
`model_preview_texture_<material index>_<Diffuse|Bump|Reflection|Alpha>` only
when the selected preview context resolves that texture. Clear the retained
widget registry before asserting absence after a source switch.

`definition_placement_types` runs two tiny loose-install GUI cases with eight
placements each: custom and misleading names, Creature/Object/Building classes,
Auto/explicit owners, undo/redo and the Actors Place button. An independent TNG
reader checks class, owner and creature InitialPos. Definitions, texture and LEV
stay exact; Restore retains only the byte-exact first-original TNG backup.
The standalone driver's `--prepare-only` writes and verifies fixtures/scripts
without launching an executable; that receipt explicitly does not claim a pass.
These marker fixtures do not test whole-creature geometry or gameplay. They also
require village membership from runtime Components, independent of the name.
`creature_placement_profile_refusals` adds eight malformed-count/name/sentinel/
missing-field cases at both sizes, requiring an unchanged document and complete
fixture inventory. The read-only C++ test mode `--creature-component-profiles
<install>` reports Context membership for comparison with the independent audit.


`creature_clone_gui_retail_1440x900` and `_800x600` independently compare
all prior retail records, verified self-only deltas, paired recovery and explicit
Restore on owned outputs. Appearance/body/components remain shared.

`definition_group` reports the validated game-bank group entry index, or `-`. `btn_definition_group` follows it by index after the current frame, protecting numeric names and the current decoded view.

Definition vector drafts expose `input_definition_vector_0`, `_1` and (for C3DVector) `_2` for real coordinate input. `definition_value` accepts the existing comma-separated writer syntax for these drafts. The dedicated `definition_vectors` package workflow independently verifies every other payload byte, exact no-ops and malformed input/layout refusals at both sizes.
Expand All @@ -1098,3 +1182,5 @@ Definition tree widgets: `definition_type_node_<type-index>`, `definition_group_


`combo_definition_edit_name` opens the existing-name chooser for four-byte CDefString drafts. `input_definition_name_search` filters pool names or offsets; `definition_name_option_<byte-offset>` and `definition_name_option_none` select an existing name or -1. Duplicate pool names have separate offset choices. Saving refuses changed references that are not exact string starts in the captured owning pool.

`combo_definition_edit_group` opens the confirmed game-bank int32 GroupDef picker. `input_definition_group_search` filters target names or native indices; `definition_group_option_<native-index>` selects that explicit index, not a name lookup. Only confirmed owner/family combinations participate. Changed wrong-family, missing or stale target identities refuse; unchanged legacy bytes remain a no-op. Synthetic picker and read-only retail-copy workflows cover publication, exact deltas and explicit-output Restore.
6 changes: 4 additions & 2 deletions docs/CLI.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# Command line reference

`FableForge 0.18.1-rc.2 -- Fable: The Lost Chapters level editor (maps -> .glb / .obj, levels, terrain, textures)`
`FableForge 0.18.1-dev -- Fable: The Lost Chapters level editor (maps -> .glb / .obj, levels, terrain, textures)`

Generated by `tools/gen_cli_reference.py` from `FableForge --help`; edit `src/cli/common.cpp`'s usage text, not this file.
Every command takes `--install <fable-root>` (default: the Steam / GOG install found on this machine).
Every command takes `--install <fable-root>` (usually defaults to the Steam / GOG install found on this machine; `creature-import` requires an explicit install and output root).
Commands that write game files keep a one-time `<file>.forge-orig` backup and are refused while Fable runs.

```text
Expand All @@ -27,6 +27,8 @@ usage:
forge mesh-import <model.glb|.gltf|.obj> <NAME> [--texture <png> | --texture-id <n>] [--donor <OBJECT_...>] [--stored] [--no-collision] [--install <root>]
forge mesh-replace <model.glb|.gltf|.obj> <MESH_NAME|id> [--stored] [--install <root>] (static geometry; preserves materials and collision)
(a custom static object: MESH_<NAME> appended to graphics.big, its diffuse to textures.big, a collision hull from its own triangles, an OBJECT_<NAME> def copied from the donor; Y-up model space)
forge creature-import <model.glb|.gltf> <NAME> --donor-index <n> --body <n> --alternative <n> --schema <json> --install <root> --out <root> [--texture <image> | --texture-id <n>] [--texture-format dxt1|dxt3|argb8888] [--stored] [--json]
(private root/body/appearance clone + one selected body mesh; other body slots and animations remain shared; runtime compatibility unverified)
forge textures [filter] [--bank <bank>] (list textures.big entries: id, size, format, bank)
forge texture-export <name> <out.png> | texture-replace <name> <image> | texture-add <name> <image> [--bank B] [--format dxt1|dxt3|argb8888]
forge minimap-bake <map> <out.png> [--region <name> | --framing scale,offX,offY] (the minimap a new region gets, as a PNG; framed like the engine's hero marker; writes nothing)
Expand Down
Loading
Loading