Add recon drones and body burial; stabilize spectator camera

This commit is contained in:
2026-10-21 15:28:32 +02:00
parent f41d8ba2f9
commit ac285b5c97
80 changed files with 13545 additions and 126 deletions
+2
View File
@@ -31,6 +31,8 @@ def check():
subprocess.run([sys.executable,str(ROOT/'tests/test_attack_coordination.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_convoy_hunt.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_recon_search.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_drone_recon.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_body_burial.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_body_recovery_selection.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_terrain_editor.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_terrain_editor_registration.py')],check=True)
+2 -2
View File
@@ -60,8 +60,8 @@ def packed_input_files(folder):
require(path.is_file() and not path.is_symlink(),'External packed input must be a flat regular file: '+str(path))
name=path.name
runtime=name in {'addon.gproj','resourceDatabase.rdb'} or re.fullmatch(r'[A-Za-z0-9_.-]+\.pak',name)
media=name=='thumbnail.png' or re.fullmatch(r'gallery[0-9]+_[0-9]+x[0-9]+\.(?:jpg|png)',name)
sidecar=re.fullmatch(r'(?:addon\.gproj|resourceDatabase\.rdb|[A-Za-z0-9_.-]+\.pak|thumbnail\.png|gallery[0-9]+_[0-9]+x[0-9]+\.(?:jpg|png))_[0-9]+(?:\.[0-9]+)*_manifest\.json',name)
media=name=='thumbnail.png' or re.fullmatch(r'(?:gallery|preview)[0-9]+_[0-9]+x[0-9]+\.(?:jpg|png)',name)
sidecar=re.fullmatch(r'(?:addon\.gproj|resourceDatabase\.rdb|[A-Za-z0-9_.-]+\.pak|thumbnail\.png|(?:gallery|preview)[0-9]+_[0-9]+x[0-9]+\.(?:jpg|png))_[0-9]+(?:\.[0-9]+)*_manifest\.json',name)
require(runtime or media or sidecar or name in {'meta','ServerData.json'},'Unreviewed external packed input: '+str(path))
files.append(path)
require(any(path.suffix=='.pak' for path in files),'Missing runtime PAK: '+str(folder))
+3 -1
View File
@@ -5,6 +5,8 @@ from pathlib import Path
SCHEMA={
'aiDoctrine':(0,0,1),
'aiShadow':(0,0,1),
'droneReconCount':(0,0,3),
'droneCooldownSeconds':(300,60,1800),
'planeAltitudeMetres':(250,150,500),
'planeReplacementSeconds':(60,30,1800),
'planeSectorSeconds':(120,30,600),
@@ -35,7 +37,7 @@ SCHEMA={
'convoyCount':(3,0,20),
'heliTimerMinutes':(15,1,1440),
}
AI_KEYS=('aiDoctrine','aiShadow','planeAltitudeMetres','planeReplacementSeconds','planeSectorSeconds','planeReconEnabled','reportIntervalSeconds','supportSquadLimit','responseRadiusMetres','automaticEquipmentChancePercent','antiAirChancePercent','antiPersonnelMineChancePercent','automaticConvoyEnabled','heliTimerMinutes')
AI_KEYS=('droneReconCount','droneCooldownSeconds','aiDoctrine','aiShadow','planeAltitudeMetres','planeReplacementSeconds','planeSectorSeconds','planeReconEnabled','reportIntervalSeconds','supportSquadLimit','responseRadiusMetres','automaticEquipmentChancePercent','antiAirChancePercent','antiPersonnelMineChancePercent','automaticConvoyEnabled','heliTimerMinutes')
INTEL_KEYS=('aiIntelChancePercent','intelRevealChancePercent','showAllSites')
def merge(ai=None,intel=None):
result={key:spec[0] for key,spec in SCHEMA.items()};deferred=[]
+6 -2
View File
@@ -23,6 +23,9 @@ from release_check import audit, read_json, evidence_path
ROOT = Path(__file__).resolve().parents[1]
BASE = '58D0FB3206B6F859'
PROJECTS = {'core': ('ERR_Core', '2528466DE220D91C', ())}
# Minimal inherited character action patch, scoped at runtime to Escape. This
# exact GUID/path/owner is intentional; other vanilla identity reuse stays denied.
VANILLA_OVERRIDES = {'37578B1666981FCE': ('Prefabs/Characters/Core/Character_Base.et', 'core')}
DIRECTORIES = {'Scripts', 'Prefabs', 'Configs', 'Missions', 'Worlds', 'UI', 'Materials', 'AI'}
SUFFIXES = {'.c', '.et', '.conf', '.ent', '.layer', '.layout', '.emat', '.bt', '.meta', '.gproj', '.imageset', '.png', '.edds'}
@@ -153,8 +156,9 @@ def validate(payload, root):
raise ValueError(f'duplicate resource identity: {name}')
resources[m[1]] = (m[2], owner)
vanilla = read_json(evidence_path(root, 'docs/vanilla-resources.json'))
if set(resources) & set(vanilla.values()):
raise ValueError('successor resource reuses a vanilla identity')
for guid in set(resources) & set(vanilla.values()):
if resources[guid] != VANILLA_OVERRIDES.get(guid):
raise ValueError('successor resource reuses a vanilla identity')
for name, data in payload.items():
suffix = PurePosixPath(name).suffix
if suffix == '.meta':