Emberveil source

tests/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();}
        }
    }
}