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
+11 -11
View File
@@ -70,7 +70,7 @@ class SourceBundleTests(unittest.TestCase):
def test_changed_resource_changes_archive_and_manifest(self):
first, manifest = bundle.build(self.root)
name = 'addons/core/Scripts/Game/ERR/ERR_Actors.c'
name = 'addons/core/Scripts/Game/ERR/00_Core/ERR_Actors.c'
p = self.root / name; p.write_text(p.read_text() + '\n// reviewed successor edit\n')
second, updated = bundle.build(self.root)
self.assertNotEqual(first, second)
@@ -84,17 +84,17 @@ class SourceBundleTests(unittest.TestCase):
self.edit(name, '58D0FB3206B6F859', '5F16D7E4A1CBE075')
with self.assertRaisesRegex(ValueError, 'identity/dependency'): bundle.build(self.root)
def test_missing_transitive_project_refused(self):
shutil.rmtree(self.root / 'addons/intel')
def test_missing_project_refused(self):
(self.root / 'addons/core/addon.gproj').unlink()
with self.assertRaisesRegex(ValueError, 'identity/dependency'): bundle.build(self.root)
def test_resource_dependency_outside_closure_refused(self):
p = self.root / 'addons/core/Scripts/Game/ERR/BadReference.c'
meta = next((self.root / 'addons/map').rglob('*.meta')).read_text()
def test_internal_module_resource_is_visible(self):
p = self.root / 'addons/core/Scripts/Game/ERR/00_Core/BadReference.c'
meta = next((self.root / 'addons/core').rglob('*.meta')).read_text()
import re
resource = re.search(r'Name "([^"\n]+)"', meta)[1]
p.write_text('class ERR_Test { ResourceName asset = "' + resource + '"; }')
with self.assertRaisesRegex(ValueError, 'dependency closure'): bundle.build(self.root)
bundle.build(self.root) # Internal modules share the same resource namespace.
def test_metadata_and_unknown_asset_format_refused(self):
(self.root / 'addons/core/Prefabs/ERR/Unknown.xob').write_bytes(b'vendor')
@@ -104,17 +104,17 @@ class SourceBundleTests(unittest.TestCase):
with self.assertRaisesRegex(ValueError, 'metadata|unresolved'): bundle.build(self.root)
def test_source_symlink_and_nonregular_refused(self):
p = self.root / 'addons/core/Scripts/Game/ERR/Link.c'
p = self.root / 'addons/core/Scripts/Game/ERR/00_Core/Link.c'
p.symlink_to('/etc/hostname')
with self.assertRaisesRegex(ValueError, 'symlink'): bundle.build(self.root)
p.unlink(); os.mkfifo(p)
with self.assertRaisesRegex(ValueError, 'nonregular'): bundle.build(self.root)
def test_unsafe_or_case_colliding_member_refused(self):
p = self.root / 'addons/core/Scripts/Game/ERR/escape\\outside.c'; p.write_text('')
p = self.root / 'addons/core/Scripts/Game/ERR/00_Core/escape\\outside.c'; p.write_text('')
with self.assertRaisesRegex(ValueError, 'unsafe'): bundle.build(self.root)
p.unlink()
(self.root / 'addons/core/Scripts/Game/ERR/err_actors.c').write_text('')
(self.root / 'addons/core/Scripts/Game/ERR/00_Core/err_actors.c').write_text('')
with self.assertRaisesRegex(ValueError, 'collision'): bundle.build(self.root)
def test_validation_failure_with_output_argument_leaves_no_archive(self):
@@ -132,7 +132,7 @@ class SourceBundleTests(unittest.TestCase):
nonlocal calls
calls += 1
if calls == 2:
(root / 'addons/core/Scripts/Game/ERR/Late.c').write_text('// late addition')
(root / 'addons/core/Scripts/Game/ERR/00_Core/Late.c').write_text('// late addition')
return real_inventory(root)
with patch.object(bundle, 'inventory', side_effect=changing_inventory):
with self.assertRaisesRegex(ValueError, 'tree changed'): bundle.build(self.root)