Emberveil sourcetests/GodWarsSceneCheck.java
import java.io.*;
import java.util.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
/** Uses the shipping client's terrain, object, collision and software renderer. */
public final class GodWarsSceneCheck {
static Map<Integer,int[]> regions=new HashMap<>();
static Decompressor[] stores=new Decompressor[5];
static String outputRoot="runtime/godwars-stage/";
static void scene(String name,int centerX,int centerY,int plane)throws Exception {
int baseX=centerX-52,baseY=centerY-52;
byte[][][] flags=new byte[4][104][104];int[][][] heights=new int[4][105][105];
ObjectManager.lowMem=false;ObjectManager.anInt131=plane;
ObjectManager objects=new ObjectManager(flags,heights);WorldController world=new WorldController(heights);
CollisionMap[] clips={new CollisionMap(),new CollisionMap(),new CollisionMap(),new CollisionMap()};
List<int[]> chunks=new ArrayList<>();
for(int rx=baseX/64;rx<=(baseX+103)/64;rx++)for(int ry=baseY/64;ry<=(baseY+103)/64;ry++){
int[] files=regions.get((rx<<8)|ry);if(files==null)continue;
int x=rx*64-baseX,y=ry*64-baseY;
objects.method180(GodWarsAssetCheck.inflate(stores[4].decompress(files[0])),y,x,baseX,baseY,clips);
chunks.add(new int[]{x,y,files[1]});
}
for(int[] chunk:chunks)objects.method190(chunk[0],clips,chunk[1],world,GodWarsAssetCheck.inflate(stores[4].decompress(chunk[2])));
objects.method171(clips,world);world.method275(plane);
int width=768,height=512;int[] pixels=new int[width*height];DrawingArea.initDrawingArea(height,width,pixels);Texture.method364();
int[] visibility=new int[9];for(int i=0;i<9;i++){int angle=128+i*32+15;visibility[i]=(600+angle*3)*Texture.anIntArray1470[angle]>>16;}
WorldController.method310(500,800,width,height,visibility);
int cameraX=52*128,cameraY=44*128,cameraHeight=heights[plane][52][52]-1350;
world.method313(cameraX,cameraY,0,cameraHeight,plane,256);
int nonzero=0;for(int pixel:pixels)if(pixel!=0)nonzero++;
if(nonzero<width*height/12)throw new AssertionError("Scene mostly blank: "+name+" pixels="+nonzero);
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);image.setRGB(0,0,width,height,pixels,0,width);
ImageIO.write(image,"png",new File(outputRoot+"scene-"+name+".png"));
System.out.println("SCENE PASS: "+name+" drawn pixels="+nonzero+" center collision="+Integer.toHexString(clips[plane].anIntArrayArray294[52][52]));
}
public static void main(String[] args)throws Exception {
GodWarsAssetCheck.main(args);
try(RandomAccessFile dat=new RandomAccessFile("runtime/godwars-stage/cache/main_file_cache.dat","r")){
RandomAccessFile[] indexes=new RandomAccessFile[5];
try{
for(int i=0;i<5;i++){indexes[i]=new RandomAccessFile("runtime/godwars-stage/cache/main_file_cache.idx"+i,"r");stores[i]=new Decompressor(dat,indexes[i],i+1);}
Texture.method368(new StreamLoader(stores[0].decompress(6)));Texture.method372(0.8);Texture.method367();
Stream map=new Stream(new StreamLoader(stores[0].decompress(5)).getDataForName("map_index"));
while(map.currentOffset<map.buffer.length){int region=map.readUnsignedWord(),ground=map.readUnsignedWord(),locations=map.readUnsignedWord();map.readUnsignedByte();regions.put(region,new int[]{ground,locations});}
scene("entrance",2882,5311,2);scene("bandos",2870,5360,2);scene("armadyl",2832,5301,2);scene("zamorak",2925,5324,2);scene("saradomin",2897,5267,0);scene("mountain",2915,3744,0);
}finally{for(RandomAccessFile index:indexes)if(index!=null)index.close();}
}
}
}