Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
76 lines
4.9 KiB
Python
76 lines
4.9 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 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')
|