#!/usr/bin/env python3 """Compare registered server player damage and synchronized absorption with vanilla.""" import argparse import json import os from pathlib import Path import platform import subprocess import random import struct import math try: from . import lab, test_rust_parity as base except ImportError: import lab import test_rust_parity as base def corpus(catalog): def bits(v):return struct.pack('>f',v).hex() def double(v):return struct.pack('>d',v).hex() def op(damage=8,**kw): o=dict(damage=bits(damage),fail=-1,invulnerable=False,ability_invulnerable=False,client=False,weapon=False,resistance=False,amplifier=0,break_armor=False,armor_after=double(0),food_exhaustion=bits(.1),pack=False,pack_callback=False,**{'bypass_'+k:False for k in ['armor','effects','resistance','enchantments']});o.update(kw);return o def row(ops,health=20,absorption=4,armor=15,toughness=8,maximum=20,max_absorption=20,exhaustion=0,amounts=None,operations=None): return dict(health=bits(health),absorption=bits(absorption),exhaustion=bits(exhaustion),attributes=[dict(base=double(v),amount=double((amounts or [0]*4)[i]),operation=(operations or [0]*4)[i]) for i,v in enumerate([armor,toughness,maximum,max_absorption])],ops=ops) values=[-float('inf'),-1e30,-1,-0.,0.,1e-40,.1,1,5,10,20,1e30,float('inf'),float('nan')] for damage in values: for absorption in values: for armor in [-1,0,1,15,30,100,float('nan')]: yield row([op(damage),op(damage,weapon=True,pack=True),op(damage,resistance=True)],absorption=absorption,armor=armor) for mask in range(16): for amp in [-2147483648,-2,-1,0,1,4,5,2147483647]: for fail in range(-1,28): yield row([op(19,amplifier=amp,resistance=True,fail=fail,break_armor=True,pack_callback=True,**{'bypass_'+k:bool(mask&(1<