26 lines
2.4 KiB
Python
26 lines
2.4 KiB
Python
from pathlib import Path
|
|
import sys,os,subprocess,json,fcntl,time
|
|
sys.path.insert(0,'/home/jakub/devel/escapistsrereintroduced/tools')
|
|
from headless_game import assert_no_game,assert_prefix_idle,cleanup_owned_run
|
|
base=Path('/tmp/erri-ai-19'); target=sys.argv[1] if len(sys.argv)>1 else 'indexed'; compat=base/'compat'; steam=Path.home()/'.local/share/Steam'; proton=steam/'steamapps/common/Proton - Experimental/proton'
|
|
lock=(compat/'.erri-workbench.lock').open('a');fcntl.flock(lock,fcntl.LOCK_EX|fcntl.LOCK_NB); assert_no_game(); assert_prefix_idle(compat)
|
|
cmd=['gamescope','--backend','headless','-W','1280','-H','720','-w','1280','-h','720','-r','30','--',str(proton),'run',str(steam/'steamapps/common/Arma Reforger Tools/Workbench/ArmaReforgerWorkbenchSteamDiag.exe'),'-gproj','Z:'+str(base/target/'addon.gproj'),'-profile','Z:'+str(base/(target+'-profile')),'-logconsole','-noBackend','-noSound','-disableCrashReporter','-wbModule=ResourceManager','-exitAfterInit']
|
|
env=os.environ.copy();env.update(STEAM_COMPAT_DATA_PATH=str(compat),STEAM_COMPAT_CLIENT_INSTALL_PATH=str(steam),WINEPREFIX=str(compat/'pfx'))
|
|
profile=base/(target+'-profile'); (profile/'addons').mkdir(parents=True,exist_ok=True)
|
|
if not (profile/'addons/ArmaReforger').exists():(profile/'addons/ArmaReforger').symlink_to(steam/'steamapps/common/Arma Reforger/addons/data',target_is_directory=True)
|
|
(base/(target+'-command.json')).write_text(json.dumps(cmd,indent=2))
|
|
with (base/(target+'-launch.log')).open('w') as log:
|
|
started=time.time(); p=subprocess.Popen(cmd,stdout=log,stderr=subprocess.STDOUT,env=env,cwd=steam/'steamapps/common/Arma Reforger Tools/Workbench',start_new_session=True)
|
|
try:
|
|
deadline=time.monotonic()+90
|
|
while p.poll() is None and time.monotonic()<deadline:
|
|
logs=sorted(p for p in profile.glob("logs/logs_*/console.log") if p.stat().st_mtime >= started)
|
|
content=logs[-1].read_text(errors="replace") if logs else ""
|
|
if "Cannot initialize game project settings" in content or "Can't compile" in content: break
|
|
if (base/target/"resourceDatabase.rdb").is_file() and "Creating game instance(ArmaReforgerScripted)" in content:
|
|
time.sleep(3); break
|
|
time.sleep(1)
|
|
except subprocess.TimeoutExpired:pass
|
|
finally:(base/(target+'-cleanup.json')).write_text(json.dumps(cleanup_owned_run(p,proton,env,compat),indent=2))
|
|
print((base/(target+'-cleanup.json')).read_text());print('index exists:',(base/target/'resourceDatabase.rdb').is_file())
|