43 lines
2.2 KiB
Python
43 lines
2.2 KiB
Python
"""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 <cassert>
|
|
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.')
|