77 lines
5.0 KiB
Python
77 lines
5.0 KiB
Python
"""Validate maintenance stock joins the finite scenario without weakening clue/resource bounds."""
|
|
from pathlib import Path
|
|
import json,os,re
|
|
from policy_harness import ROOT
|
|
R=Path(os.environ.get('ERR_MAINTENANCE_ROOT',ROOT))
|
|
def contents(text,start):
|
|
left=text.index('{',start);depth=1;cursor=left+1
|
|
while depth:
|
|
depth+=(text[cursor]=='{')-(text[cursor]=='}');cursor+=1
|
|
return text[left+1:cursor-1]
|
|
s=(R/'addons/core/Configs/ERR/EveronSites.conf').read_text()
|
|
sites={}
|
|
for match in re.finditer(r'ERR_SiteDefinition\s*\{',s):
|
|
block=contents(s,match.start());sites[re.search(r'\bId "([^"]+)"',block)[1]]=block
|
|
stock={}
|
|
for name,site in sites.items():
|
|
stock[name]=[]
|
|
for match in re.finditer(r'ERR_SiteStock\s*\{',site):
|
|
item=contents(site,match.start());ref=re.search(r'Prefab "\{([A-F0-9]{16})\}([^"]+)"',item)
|
|
count=int(re.search(r'Count (\d+)',item)[1]);assert 1<=count<=64
|
|
stock[name].append((ref[1],ref[2],count,item))
|
|
assert sum(item[2] for items in stock.values() for item in items)<=256
|
|
# Both established routes to radio intel and the prison field map remain usable.
|
|
for name in ('everon-supply-1','everon-medical-1'):
|
|
assert 'RevealOnEscape 1' in sites[name]
|
|
clues=[i for i in stock[name] if i[1]=='Prefabs/ERR/ObjectiveDocument.et']
|
|
assert sum(i[2] for i in clues)>=2 and all('TargetId "everon-radio-1"' in i[3] for i in clues)
|
|
assert any(i[1].endswith('PaperMap_01_folded.et') for i in stock['everon-prison-1'])
|
|
kitpath='Prefabs/ERR/Items/EmergencyRepairKit.et'
|
|
canpath='Prefabs/Items/Fuel/Jerrycan_01/Jerrycan_01_item.et'
|
|
maintenance=[(name,i) for name,items in stock.items() for i in items if i[1] in (kitpath,canpath)]
|
|
assert 'everon-supply-2' not in sites
|
|
assert [(name,i[1],i[2]) for name,i in maintenance]==[
|
|
('everon-supply-1',kitpath,1),('everon-supply-1',canpath,2)]
|
|
# Southern maintenance is additional finite scavenging stock, even when its
|
|
# optional transport is omitted. Preserve all pre-existing weapons and clues.
|
|
assert [(i[1],i[2]) for i in stock['everon-supply-1'] if i[1] not in (kitpath,canpath)]==[
|
|
('Prefabs/Weapons/Rifles/AK74/Rifle_AK74.et',8),
|
|
('Prefabs/Weapons/Magazines/Magazine_545x39_AK_30rnd_Ball.et',16),
|
|
('Prefabs/Items/Medicine/FieldDressing_01/FieldDressing_USSR_01.et',12),
|
|
('Prefabs/Items/Equipment/Maps/Map_Paper_01/PaperMap_01_folded.et',1),
|
|
('Prefabs/ERR/ObjectiveDocument.et',2)]
|
|
assert sum(i[2] for i in stock['everon-supply-1'])==42
|
|
# Historical Western fixture stays separate and retains its original finite
|
|
# stock; this change does not restore that site in the live catalog.
|
|
legacy=(R/'addons/core/Configs/ERR/Tests/LegacySites.conf').read_text()
|
|
legacy_maintenance=[]
|
|
for match in re.finditer(r'ERR_SiteDefinition\s*\{',legacy):
|
|
block=contents(legacy,match.start());name=re.search(r'\bId "([^"]+)"',block)[1]
|
|
for itemmatch in re.finditer(r'ERR_SiteStock\s*\{',block):
|
|
item=contents(block,itemmatch.start());ref=re.search(r'Prefab "\{[A-F0-9]{16}\}([^"]+)"',item)
|
|
if ref[1] in (kitpath,canpath):
|
|
legacy_maintenance.append((name,ref[1],int(re.search(r'Count (\d+)',item)[1])))
|
|
assert legacy_maintenance==[('everon-supply-2',kitpath,1),('everon-supply-2',canpath,2)]
|
|
transports={name:contents(site,site.index('Transport ERR_SiteTransport')) for name,site in sites.items() if 'Transport ERR_SiteTransport' in site}
|
|
assert set(transports)=={'everon-supply-1'}
|
|
assert 'Optional 1' in transports['everon-supply-1']
|
|
assert '{FA65287C19DE304B}Prefabs/ERR/Vehicles/SupplyUAZ.et' in transports['everon-supply-1']
|
|
assert 'Offset 0 0 -12' in transports['everon-supply-1'] and 'ClearanceRadius 4' in transports['everon-supply-1']
|
|
assert 'RequireAirfield 0' in sites['everon-extraction-1']
|
|
assert 'RandomClear 1' in sites['everon-extraction-1']
|
|
assert 'Position 4800.953 0 11487.412' in sites['everon-extraction-1']
|
|
# Own container must be finite and must not turn off native resource eligibility.
|
|
kit=(R/'addons/core'/kitpath).read_text()
|
|
assert kit.startswith('GenericEntity : "{33B2DFDCD0EBA3DB}Prefabs/Items/Equipment/Kits/RepairKit_01/RepairKit_01_wrench.et"')
|
|
assert kit.count('SCR_ResourceContainer ')==1 and 'm_fResourceValueCurrent 20' in kit and 'm_fResourceValueMax 20' in kit
|
|
for forbidden in ('m_aGenerators','m_aDisabledResourceTypes','m_eFactionUsageCheck','m_fMaxHealScaled','SCR_RepairSupportStationComponent','SCR_ResourceConsumer '):
|
|
assert forbidden not in kit,forbidden
|
|
meta=(R/'addons/core'/Path(kitpath+'.meta')).read_text();guid=re.search(r'Name "\{([A-F0-9]{16})\}',meta)[1]
|
|
assert guid=='C09C7C97EFA34909'
|
|
vanilla=json.loads((R/'docs/vanilla-resources.json').read_text())
|
|
assert vanilla[canpath]=='12D5AD21E383B768'
|
|
assert vanilla['Prefabs/Items/Equipment/Kits/RepairKit_01/RepairKit_01_wrench.et']=='33B2DFDCD0EBA3DB'
|
|
evidence=json.loads((R/'docs/vehicle-maintenance-source-evidence.json').read_text())
|
|
assert evidence['finite_initial_stock']['litres_per_can']==5 and evidence['native_validation']=='pending'
|
|
print('PASS: Southern finite maintenance stock preserves weapons/clues and optional transport, historical Western fixture stays separate; native capacity/consumption untested')
|