#!/usr/bin/env python3 """Compare simple-block feature effects and separate random streams with vanilla.""" import argparse import itertools import json import os from pathlib import Path import platform import random import subprocess try: from . import lab, test_rust_parity as base, test_worldgen_parity as worldgen, test_block_survival_parity as survival except ImportError: import lab import test_rust_parity as base import test_worldgen_parity as worldgen import test_block_survival_parity as survival def corpus(facts, placement): states=facts['states'];get=lambda name:facts['defaults']['minecraft:'+name] encode=lambda obj:json.dumps(obj,separators=(',',':')) def case(candidate=None,**extra): origin=extra.pop('origin',[0,64,0]) def at(dy):return [origin[0],((origin[1]+dy+2**31)%2**32)-2**31,origin[2]] f={'definition':encode({'to_place':states[candidate if candidate is not None else get('stone')],'schedule_tick':True}),'origin':origin,'legacy':False,'seed':0,'world_seed':1,'fail':-1,'reject':0,'brightness':15,'fallback':get('stone'),'states':[[*at(0),get('air')],[*at(1),get('air')],[*at(-1),get('dirt')]],'repeats':2} f.update(extra);return f origins=[[0,64,0],[2147483647,-2147483648,2147483647],[-17,2147483647,-33]] for candidate in range(len(states)):yield case(candidate,origin=origins[candidate%3]) double_names=set(placement['double_plants']);representatives={} for candidate,state in enumerate(states): if state['id'] not in double_names:continue key=(state['id'],state.get('properties',{}).get('waterlogged')) if state.get('properties',{}).get('half')=='lower':representatives.setdefault(key,candidate) below=next(i for i,s in enumerate(states) if s['id']==state['id'] and s.get('properties',{}).get('half')=='lower') if state.get('properties',{}).get('half')=='upper' else get('clay') if state['id']=='minecraft:small_dripleaf' else get('dirt') for above in [get(name) for name in ['air','cave_air','void_air','stone','water','lava','short_grass','snow','small_dripleaf','tall_seagrass','pale_moss_carpet']]: for fluid in [get('air'),get('water'),get('lava')]: for fail in [-1,*range(9)]:yield case(candidate,states=[[0,63,0,below],[0,64,0,get('air')],[0,65,0,above]],fluid=fluid,fail=fail,reject=3) for candidate in representatives.values(): name=states[candidate]['id'];below=get('clay') if name=='minecraft:small_dripleaf' else get('farmland') if name=='minecraft:pitcher_crop' else get('dirt') for above in range(len(states)):yield case(candidate,states=[[0,63,0,below],[0,64,0,get('air')],[0,65,0,above]],fluid=get('water'),repeats=1) moss_ids=[i for i,s in enumerate(states) if s['id']=='minecraft:pale_moss_carpet'];sides=[(0,-1),(1,0),(0,1),(-1,0)] for lower_mask,upper_mask in itertools.product(range(16),repeat=2): for legacy in [False,True]: for seed in [0,-1,0x123456789abcdef]: for fail in [-1,0,3,7,12,19,25]: entries=[[0,63,0,get('stone')],[0,64,0,get('air')],[0,65,0,get('air')]] for y,mask in [(64,lower_mask),(65,upper_mask)]:entries.extend([x,y,z,get('stone') if mask&(1<