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:
2026-09-20 16:42:52 +02:00
parent 7d94953b53
commit cab998fb64
513 changed files with 18940 additions and 862 deletions
+10 -10
View File
@@ -59,11 +59,11 @@ def project_order(project):
def external_request(project, source, root):
needs_external = project in {'ai', 'chat'}
needs_external = project in {'core'}
if needs_external and source is None:
raise ValueError('AI and Chat builds require --external-addons with the audited installed RHS/WCS/BMP closure')
raise ValueError('Combined mod builds require --external-addons with the audited installed RHS/WCS/BMP closure')
if source is not None and not needs_external:
raise ValueError('Core, Intel and Map builds must use vanilla-only profiles; --external-addons is not permitted')
raise ValueError('Unknown project; only the combined core addon is supported')
if source is None:
return None
source = Path(source).resolve()
@@ -127,9 +127,9 @@ def verify_package_profile(profile, steam, records):
def expose_external(project, profile, steam, context):
records = {}
if project in {'ai', 'chat'}:
if project in {'core'}:
if context is None:
raise ValueError('AI and Chat native packaging require audited external inputs')
raise ValueError('Combined mod native packaging require audited external inputs')
verify_external(context)
records = prepare_profile(profile/'addons', context['source'], context['policy'], context['cache_path'])
if records != context['records']:
@@ -300,8 +300,8 @@ def quiet_streams(application_id, sink, compat):
def run_project(steam, compat, session, project, timeout, authored, silent_workbench=False, exit_after_init=False, *, external=None):
if (project in {'ai', 'chat'}) != (external is not None):
raise ValueError('Only AI/Chat package profiles require and permit audited external inputs')
if (project in {'core'}) != (external is not None):
raise ValueError('The combined addon requires audited external inputs')
command = command_for(steam, session, project, silent_workbench, exit_after_init)
proton = Path(command[command.index('--')+1])
executable = Path(command[command.index('--')+3])
@@ -506,7 +506,7 @@ def run(a, root=ROOT):
continue_on_failure = getattr(a, 'continue_on_failure', False)
stopped_reason = None
for project in order:
selected_external = external if project in {'ai', 'chat'} else None
selected_external = external if project in {'core'} else None
report = run_project(steam, compat, session, project, a.timeout, authored, silent_workbench, exit_after_init, external=selected_external)
reports.append(report)
# Diagnostic continuation never grants authority to reuse an unsafe
@@ -588,12 +588,12 @@ def run(a, root=ROOT):
def main(argv=None):
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--project', choices=PROJECTS, default='core', help='Build selected addon and its successor dependencies in order')
parser.add_argument('--project', choices=PROJECTS, default='core', help='Build the single combined addon')
parser.add_argument('--session', type=Path, required=True, help='New direct child of /tmp; never overwritten')
parser.add_argument('--compat', type=Path, required=True, help='Idle disposable cloned Tools prefix under /tmp')
parser.add_argument('--steam', type=Path, default=Path.home()/'.local/share/Steam')
parser.add_argument('--timeout', type=int, default=300, help='30..1800 seconds per addon')
parser.add_argument('--external-addons', type=Path, help='Required for AI/Chat: installed audited RHS/WCS/BMP root; only allowlisted links enter private profiles')
parser.add_argument('--external-addons', type=Path, help='Required for the combined mod: installed audited RHS/WCS/BMP root; only allowlisted links enter private profiles')
lifecycle = parser.add_mutually_exclusive_group()
lifecycle.add_argument('--silent-workbench', action='store_true', help='Opt-in documented -wbSilent experiment; packing compatibility still requires native evidence')
lifecycle.add_argument('--exit-after-init', action='store_true', help='Opt-in documented -exitAfterInit experiment; natural exit and all native error gates remain mandatory')