Combine Workshop addon and fix prison startup
Merge owned systems into one addon while preserving resource identities. Gate player admission on the replicated prison scene, restore the original framed door, and hold enemy AI until escape. Correct scenario branding and author metadata, include publishing assets, and retain regression and native verification evidence.
This commit is contained in:
+16
-24
@@ -21,37 +21,29 @@ from release_check import audit, read_json, evidence_path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
BASE = '58D0FB3206B6F859'
|
||||
PROJECTS = {
|
||||
'core': ('ERR_Core', '2528466DE220D91C', ()),
|
||||
'ai': ('ERR_Ai', '5192138CB9D5B911', ('core',)),
|
||||
'intel': ('ERR_Intel', 'D31039C7C53E348A', ('core',)),
|
||||
'map': ('ERR_Map', '9AAEE9041D79809E', ('core',)),
|
||||
'chat': ('ERR_Chat', 'FA804F411BDDF2C6', ('core', 'ai', 'intel', 'map')),
|
||||
}
|
||||
PROJECTS = {'core': ('ERR_Core', '2528466DE220D91C', ())}
|
||||
|
||||
DIRECTORIES = {'Scripts', 'Prefabs', 'Configs', 'Missions', 'Worlds', 'UI', 'Materials'}
|
||||
SUFFIXES = {'.c', '.et', '.conf', '.ent', '.layer', '.layout', '.emat', '.meta', '.gproj'}
|
||||
EXCLUDED = {'.git', '.build', '.local', '__pycache__', 'profiles', 'profile', 'cache',
|
||||
'runtime', 'evidence', 'vendor', 'vanilla', 'original', 'node_modules', '.agents', '.codex'}
|
||||
README = '''# DEVELOPMENT SOURCE BUNDLE — Escapists Rereintroduced
|
||||
README = '''# DEVELOPMENT SOURCE BUNDLE — Escapists Reintroduced
|
||||
|
||||
This ZIP contains authored source and editable resources for all five successor
|
||||
addon projects. It is NOT a native .pak, a qualified release, or a published mod.
|
||||
No original Escapists, installed vanilla or third-party assets are redistributed. Vanilla asset
|
||||
references require a separately installed, compatible Arma Reforger and Workbench.
|
||||
Author: Jakub Jim Žáček.
|
||||
|
||||
Extract into a NEW development folder, never over an existing mission/project.
|
||||
Configure Workbench's addon search directory to the extracted addons directory.
|
||||
Open addons/core/addon.gproj for the independent Core project, or
|
||||
addons/chat/addon.gproj for the complete companion dependency set. Every project
|
||||
also declares vanilla Arma Reforger (58D0FB3206B6F859): core; ai -> core;
|
||||
intel -> core; map -> core; chat -> core, ai, intel, map.
|
||||
This ZIP contains the single Escapists Reintroduced addon, with Core, AI,
|
||||
Intel, Map and Chat script folders. It is NOT a native .pak or a published mod.
|
||||
Third-party assets are not redistributed.
|
||||
|
||||
Core scenario: {AD62322D5213C440}Missions/ERR_Everon_Base.conf
|
||||
Companion scenario: {C1E20667DCE324ED}Missions/ERR_Everon.conf
|
||||
Extract into a NEW development folder and register addons/core/addon.gproj in
|
||||
Workbench. Install and register the RHS/WCS dependencies in EXTERNAL-ADDONS.json.
|
||||
Open addons/core/addon.gproj and use Missions/ERR_Everon.conf.
|
||||
|
||||
Scenario: {C1E20667DCE324ED}Missions/ERR_Everon.conf
|
||||
Use the installed engine's normal project/scenario workflow. This archive has not
|
||||
been compiled by its bundler; no native caches or binaries are included.
|
||||
|
||||
Target: Everon, up to 12 players; Core is vanilla-only and full AI requires the listed external addons. This remains development source.
|
||||
Target: Everon, up to 12 players. The mod requires the listed external addons. This remains development source.
|
||||
Manual prison/scavenging/radio/extraction play, remote joins/reconnects and
|
||||
ownership, twelve connected players, aircraft support, repeated companion cleanup,
|
||||
matched-workload FPS improvement and release qualification require separate
|
||||
@@ -124,7 +116,7 @@ def validate(payload, root):
|
||||
external = external_policy(root)
|
||||
own_ids = read_json(evidence_path(root, 'docs/addons.json'))
|
||||
if own_ids != {name: item[1] for name, item in PROJECTS.items()}:
|
||||
raise ValueError('successor identity catalog differs from the five owned projects')
|
||||
raise ValueError('successor identity catalog differs from the single owned project')
|
||||
for name, (identity, guid, deps) in PROJECTS.items():
|
||||
text = payload.get(f'addons/{name}/addon.gproj', b'').decode('utf-8')
|
||||
match = parse_project(text, allow_core_menu=name == 'core')
|
||||
@@ -158,7 +150,7 @@ def validate(payload, root):
|
||||
raise ValueError(f'resource lacks successor metadata: {name}')
|
||||
owner = name.split('/')[1]
|
||||
visible = {owner, *PROJECTS[owner][2]}
|
||||
if 'ai' in visible: visible.update(ALLOWED)
|
||||
if 'core' in visible: visible.update(ALLOWED)
|
||||
for guid, resource in re.findall(r'\{([A-F0-9]{16})\}([^"\n]+)', text):
|
||||
if guid in resources:
|
||||
path, target = resources[guid]
|
||||
@@ -188,7 +180,7 @@ def build(root=ROOT, mode='development'):
|
||||
raise ValueError('Not release-qualified after collection:\n - ' + '\n - '.join(blockers))
|
||||
if inventory(root) != before:
|
||||
raise ValueError('addon tree changed during collection')
|
||||
payload['BUNDLE-README.md'] = (README + '\nThe AI/full scenario requires the separately installed authorized addons listed in EXTERNAL-ADDONS.json. Their assets are not bundled. Core remains vanilla-only.\n').encode('utf-8')
|
||||
payload['BUNDLE-README.md'] = (README + '\nThe combined scenario requires the separately installed authorized addons listed in EXTERNAL-ADDONS.json. Their assets are not bundled.\n').encode('utf-8')
|
||||
payload['EXTERNAL-ADDONS.json'] = json.dumps(external_policy(root),indent=2,sort_keys=True).encode('utf-8')
|
||||
manifest = {'schema_version': 1, 'kind': 'DEVELOPMENT SOURCE BUNDLE',
|
||||
'native_build': False, 'release_package': False, 'projects': projects,
|
||||
|
||||
Reference in New Issue
Block a user