Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
161 lines
8.7 KiB
Markdown
161 lines
8.7 KiB
Markdown
# Single Workshop mod
|
||
|
||
All five owned modules are now one project: `addons/core/addon.gproj`, titled
|
||
**Co10 Escape Reintroduced**, with the existing Core GUID `2528466DE220D91C`.
|
||
There are no separate AI, Intel, Map or Chat project descriptors to publish.
|
||
The project ID `ERR_Core` is retained; it now identifies the complete mod.
|
||
|
||
The supplied Workshop banner is [publishing/previewImage.png](../publishing/previewImage.png).
|
||
Select it in **Publish project → Preview Image** before publishing; see
|
||
[preview setup](../publishing/README.md) for the Proton file-picker path.
|
||
|
||
For the post-publication RKS #2 join failure, see the
|
||
[prefab identity fix and update steps](multiplayer-prefab-ids.md).
|
||
|
||
In Workbench, close the previous project, remove stale entries for the four removed
|
||
projects, and open the Core project again. Keep the installed RHS/WCS projects and
|
||
their dependencies registered. Launch `Missions/ERR_Everon.conf`. The old Base
|
||
mission header is retained for diagnostic scripts but hidden from the scenario
|
||
menu; it loads the same combined gameplay and dependencies.
|
||
|
||
Scripts live in `Scripts/Game/ERR/{00_Core,10_AI,20_Intel,30_Map,40_Chat}`.
|
||
GameLib and WorkbenchGame retain their native script-module directories. The
|
||
numeric prefixes preserve the ordering required by `modded class` extensions,
|
||
including the full-scenario probes that use Core and Intel members. Moving those
|
||
folders into alphabetical feature order breaks native compilation.
|
||
|
||
All 34 authored resource GUIDs and resource-relative paths are preserved. Non-script
|
||
assets remain in their native Prefabs, Configs, Missions, Worlds, Materials and UI
|
||
folders. RHS and WCS remain external dependencies, not copied assets. No Workshop
|
||
publication or release qualification is part of this migration.
|
||
|
||
The [playtest build guide](playtest-build.md) identifies the latest retained, source-matched development candidate. The [30 September candidate](combined-candidate-2026-09-30.md) and historical five-addon handoffs remain earlier snapshots.
|
||
|
||
## Source and package checks
|
||
|
||
```sh
|
||
python3 tools/check.py
|
||
python3 tools/source_bundle.py
|
||
```
|
||
|
||
The bundle contains one project. Native packaging builds only that project:
|
||
|
||
```sh
|
||
python3 tools/native_package.py --project core \
|
||
--session /tmp/erri-merged-package-NEW \
|
||
--compat /tmp/YOUR-IDLE-DISPOSABLE-TOOLS-PREFIX \
|
||
--external-addons /path/to/installed/workshop/addons \
|
||
--timeout 300
|
||
```
|
||
|
||
A successful packing attempt writes `packages/core`; inspect its PAK contents
|
||
before treating it as a playable artifact. Packaging does not publish anything.
|
||
|
||
## Native verification
|
||
|
||
The existing Workbench `--project core` and `--project chat` arguments select
|
||
**fixture families**, not separate addon projects. Both load the same combined
|
||
`.gproj` and require `--external-addons`. For the integrated HQ fixture:
|
||
|
||
The historical `core/victory` fixture still asserts that companion HQ/support
|
||
controllers are absent and fails against the merged project. Use the combined
|
||
fixture below for this checkpoint; Core isolation results do not apply here.
|
||
|
||
```sh
|
||
python3 tools/headless_workbench.py \
|
||
--compat /tmp/YOUR-IDLE-DISPOSABLE-TOOLS-PREFIX \
|
||
--profile /tmp/erri-merged-workbench-NEW \
|
||
--external-addons /path/to/installed/workshop/addons \
|
||
--project chat --smoke hq-memory --rounds 1 --timeout 360
|
||
```
|
||
|
||
For the focused prison/clues/radio/extraction route, use `--project chat --smoke escape-route --rounds 1 --timeout 360` with the same private-runner options. This keeps real inventory and mission gates but uses scripted movement/actions; `--smoke victory` retains the separate extended administrator and intel-reroll stress.
|
||
|
||
For ordinary packed startup, schema 4 validates one owned addon plus seven external
|
||
addons (ten engine/vanilla/mod/dependency mounts in total):
|
||
|
||
```sh
|
||
python3 tools/headless_game.py --project chat \
|
||
--packed-addons /tmp/erri-merged-package-NEW/packages \
|
||
--packed-session /tmp/erri-packed-chat-merged-NEW \
|
||
--compat /tmp/YOUR-IDLE-DISPOSABLE-TOOLS-PREFIX \
|
||
--external-addons /path/to/installed/workshop/addons \
|
||
--timeout 180 --failure-grace 120
|
||
```
|
||
|
||
Core v1 / Chat v2 packed validators remain frozen for historical artifacts and
|
||
reject the merged dependency graph. Older five-addon external v3 records are
|
||
historical; the current external runner uses schema 4. Native dedicated inputs
|
||
must also supply the external dependency closure; this migration does not establish
|
||
multiplayer acceptance.
|
||
|
||
## Verified migration checkpoint
|
||
|
||
`python3 tools/check.py` passes all 191 regression programs. A comparison with the
|
||
pre-merge tree preserves all 187 scripts and all 34 resource metadata identities
|
||
and paths; the only changed script body is the ordinary full-scenario launcher's
|
||
addon GUID. The base diagnostic mission header is now hidden from the menu.
|
||
|
||
The [merged native run](evidence/native-2026-09-20-merged-mod/report.json) compiles
|
||
GameLib, Game and WorkbenchGame, loads Everon and completes the HQ-memory fixture
|
||
with 101 passed assertions and no script/runtime failures. Its
|
||
[runner record](evidence/native-2026-09-20-merged-mod/runner.json.txt) confirms owned
|
||
cleanup and unchanged authored/external inputs. The strict native verdict remains
|
||
failed because of the four previously documented RHS/WCS localization resource
|
||
errors, all retained in the raw log. This is local Workbench evidence, not a
|
||
Workshop release or multiplayer qualification.
|
||
|
||
## Administration: helicopter timer and server items
|
||
|
||
The Mission page includes **Search helicopter delay** (1–1440 minutes), with
|
||
Apply and Random. Saving changes a waiting countdown; an active flight
|
||
continues. Random is saved as a selection and resolved to a positive duration.
|
||
A failed save leaves the current countdown intact.
|
||
|
||
The Mods page shows the existing mission-content switches followed by **all
|
||
server-loaded addons**, including terrain, audio and script mods with zero
|
||
catalogued inventory items. **Edit items** opens that mod's selection page.
|
||
Workshop addons remain loaded; the editor controls future automatic equipment
|
||
grants, not script execution or authored soldier inventories.
|
||
|
||
The **Items** page lists registered inventory items defined or modified by each
|
||
mod, twelve per page, with prefab paths and equipment eligibility. Items outside
|
||
the supported automatic-equipment categories remain visible; enabling them does
|
||
not force unsupported clothing, attachments or other assets into the equipment
|
||
lottery. Existing content-pack exclusions also continue to apply. Modified
|
||
vanilla items may appear under several source mods. Unregistered prefabs and
|
||
non-inventory assets are outside this catalog.
|
||
|
||
Use **Enable/Disable** on an item, or **Enable all/Disable all** for the displayed
|
||
mod. Disable actions are red. Each item has a green **Enabled** or red
|
||
**Disabled** badge; a mod with a mixture of allowed and blocked items shows
|
||
**Mixed** in amber. The badge includes shared-source and current content-pack
|
||
blocks, while the row text also explains whether that item is supported by the
|
||
automatic equipment pool. Preset changes refresh these states from the server. Bulk actions clear that mod's individual overrides and set its default,
|
||
including items added in later versions. An item override takes precedence over
|
||
its own mod's default; for shared items, every loaded source mod must allow the
|
||
item. Any source's disable wins. Controls affect future random equipment and
|
||
matching ammunition, without removing items already issued or changing spawn
|
||
chance. Pending grants check the selection again before issuing an item.
|
||
|
||
Edits save automatically in the `items` section of `$profile:Escapists.json`. The equipment pool
|
||
refreshes on its next selection after an edit; no restart is required. **Presets**
|
||
cover the complete item selection across all mods. Enter a name and use
|
||
**Save / replace**, or select an existing preset and **Load** or **Delete** it.
|
||
Names use 1–24 lowercase letters, digits, underscores or hyphens; `active` is
|
||
reserved. Up to 16 presets are stored. Loading replaces the working selection;
|
||
subsequent edits do not change a saved preset until it is saved again.
|
||
|
||
Missing mods disappear from the loaded-mod list. Their saved rules and preset
|
||
entries remain dormant, without loading or resolving missing resources. If the
|
||
same mod returns, its rules become effective again. New mods/items default to
|
||
allowed unless their loaded source mod has a disabled default. Failed writes
|
||
retain the previous in-memory selection; validated backup recovery and damaged
|
||
file protection follow the other mission preference files.
|
||
|
||
Discovery runs in small batches. Browsing belongs to each authenticated admin
|
||
session; edits and presets are shared server settings. Original catalog/timer
|
||
evidence: [2 October checks](evidence/server-items-2026-10-02/report.json).
|
||
|
||
Item editor and preset validation: [native and repository checks](evidence/item-editor-2026-10-02/report.json).
|