Emberveil source

tests/AmmunitionAssetCheck.java

import java.io.*;
import java.util.*;
import java.util.zip.GZIPInputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.lang.reflect.Field;

/** Renders ammunition using the same definitions, models and stack selection as the bank. */
public final class AmmunitionAssetCheck {
 public static void main(String[] args)throws Exception {
  String root=args.length>0?args[0]:"runtime/client-cache/";
  try(RandomAccessFile dat=new RandomAccessFile(root+"main_file_cache.dat","r");RandomAccessFile idx=new RandomAccessFile(root+"main_file_cache.idx0","r");RandomAccessFile models=new RandomAccessFile(root+"main_file_cache.idx1","r")) {
   Decompressor configs=new Decompressor(dat,idx,1), store=new Decompressor(dat,models,2);
   ItemDef.unpackConfig(new StreamLoader(configs.decompress(2)));
   Stream versions=new Stream(new StreamLoader(configs.decompress(5)).getDataForName("model_version"));
   Model.method459(65000,new OnDemandFetcher());
   for(int id=0;id<versions.buffer.length/2;id++)if(versions.readUnsignedWord()!=0) {
    try(GZIPInputStream in=new GZIPInputStream(new ByteArrayInputStream(store.decompress(id)));ByteArrayOutputStream out=new ByteArrayOutputStream()) {
     byte[] buf=new byte[8192];int n;while((n=in.read(buf))!=-1)out.write(buf,0,n);Model.method460(out.toByteArray(),id);
    }
   }
   DrawingArea.initDrawingArea(512,800,new int[512*800]);Texture.method364();Texture.method372(.8);
   int[] ids={882,884,886,888,890,892,883,885,887,889,891,893,78,4160,4172,9140,9141,9142,9143,9144,9240,9241,9242,9243,9244,9245,4740};
   int[] amounts={1,2,5,10,100000};int checks=0;
   BufferedImage image=new BufferedImage(800,ids.length*52,BufferedImage.TYPE_INT_RGB);Graphics2D g=image.createGraphics();g.setColor(new Color(45,38,30));g.fillRect(0,0,image.getWidth(),image.getHeight());g.setFont(new Font("SansSerif",0,12));
   Field stack=ItemDef.class.getDeclaredField("stackIDs"),thresholds=ItemDef.class.getDeclaredField("stackAmounts"),model=ItemDef.class.getDeclaredField("modelID");stack.setAccessible(true);thresholds.setAccessible(true);model.setAccessible(true);
   for(int row=0;row<ids.length;row++) {
    int id=ids[row];ItemDef item=ItemDef.forID(id);String name=item.name;
    System.out.println(id+" "+name+" model="+model.getInt(item)+" stacks="+Arrays.toString((int[])stack.get(item)));
    g.setColor(Color.WHITE);g.drawString(id+" "+name,8,row*52+22);
    for(int col=0;col<amounts.length;col++) {
     ItemDef base=ItemDef.forID(id),selected=base;int[] variants=(int[])stack.get(base),minimums=(int[])thresholds.get(base);int variant=-1;
     if(variants!=null && amounts[col]>1)for(int k=0;k<10;k++)if(minimums[k]!=0 && amounts[col]>=minimums[k])variant=variants[k];
     if(variant!=-1)selected=ItemDef.forID(variant);
     if(base.name==null || "null".equals(base.name) || model.getInt(selected)==0)throw new AssertionError("Missing ammunition artwork "+id+" x"+amounts[col]+" variant="+variant);
     Sprite sprite=ItemDef.getSprite(id,amounts[col],0);if(sprite==null)throw new AssertionError("Missing sprite "+id+" x"+amounts[col]);
     checks++;
     int x=230+col*108,y=row*52+2;
     for(int yy=0;yy<32;yy++)for(int xx=0;xx<32;xx++)if(sprite.pixels[yy*32+xx]!=0)image.setRGB(x+xx,y+yy,sprite.pixels[yy*32+xx]);
     g.setColor(Color.WHITE);g.drawString("x"+amounts[col],x,row*52+48);
    }
   }
   g.dispose();ImageIO.write(image,"png",new File(args.length>1?args[1]:"runtime/ammunition-before.png"));
   System.out.println("PASS: "+checks+" ammunition sprites at bank/inventory stack sizes");
  }
 }
}