"""Execute the admission/formation rules used by the live server.""" from pathlib import Path import subprocess import tempfile root=Path(__file__).resolve().parents[2] code=r''' #include "ClientlessBrowserRules.h" #include "AdventureGroupPolicy.h" #include int main(){ using ClientlessBrowserRules::Admit; // Independent off-switches; the test override cannot defeat either switch. for(bool queue:{false,true})for(bool enter:{false,true}){ assert(Admit(false,true,false,queue,enter)); assert(Admit(true,true,false,queue,enter)==(queue&&enter)); assert(!Admit(true,false,false,queue,enter)); assert(Admit(true,false,true,queue,enter)==(queue&&enter)); } // Human departure invalidates the same concrete party's admission. assert(Admit(true,true,false,true,true));assert(!Admit(true,false,false,true,true)); using namespace AdventureGroupPolicy; assert(Eligible("pvp"));assert(Compatible("pvp","pvp",80,85)); assert(!Compatible("pvp","instance",80,80)); auto dungeon=RequiredRoles(5);assert(dungeon.Tanks==1&&dungeon.Healers==1&&dungeon.Damage==3); auto raid=RequiredRoles(20);assert(raid.Tanks==2&&raid.Healers==4&&raid.Damage==14); auto large=RequiredRoles(25);assert(large.Tanks+large.Healers+large.Damage==25); for(unsigned i=0;i<10;++i){float social=float(i)/10;assert(MergeChance(social,300)>MergeChance(social,3600));} assert(PreferMerge(2,4,false,false,false)); assert(!PreferMerge(4,2,false,false,true)); assert(!PreferMerge(3,3,false,false,false));assert(PreferMerge(3,3,false,false,true)); assert(PreferMerge(5,4,false,true,false)); // close the last role gap assert(PreferMerge(4,2,true,false,false)); // move a surplus role into a legal group assert(WorldPvP(5095)&&WorldPvP(3483)&&WorldPvP(3519)&&!WorldPvP(1519)); // Gathering never moves past the fixed end of an hour. assert(DepartureAt(14*3600+57*60,15*3600)==15*3600); } ''' with tempfile.TemporaryDirectory() as directory: p=Path(directory);(p/'rules.cpp').write_text(code) subprocess.run(['g++','-std=c++17','-I'+str(root/'src/server/game/World'),str(p/'rules.cpp'),'-o',str(p/'rules')],check=True) subprocess.run([str(p/'rules')],check=True) print('Browser admission, last-human departure, independent switches, bot-only override, roles and formation progress passed.')