Emberveil sourcetests/SlayerTabAndWheelCheck.java
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
public final class SlayerTabAndWheelCheck {
static int checks;static void check(boolean ok,String label){checks++;if(!ok)throw new AssertionError(label);}
static void wheel(Game g,int x,int y,int rotation){g.dispatchEvent(new MouseWheelEvent(g,MouseEvent.MOUSE_WHEEL,System.currentTimeMillis(),0,x,y,0,false,MouseWheelEvent.WHEEL_UNIT_SCROLL,1,rotation));}
public static void main(String[] args)throws Exception {
Main.main(new String[]{"-qol","-no-crc","-no-nav"});
check(!ClientSettings.CONTROL_KEY_ZOOMING,"shipping QoL startup permits ordinary wheel zoom");
Game launched=null;
for(Frame f:Frame.getFrames())for(Component c:f.getComponents())if(c instanceof Game)launched=(Game)c;
check(launched!=null,"real client launched");
for(int i=0;i<100&&launched.getMouseWheelListeners().length==0;i++)Thread.sleep(20);
check(launched.getMouseWheelListeners().length==1,"real startup registers wheel handler");
final Game live=launched;
EventQueue.invokeAndWait(()->{for(Frame f:Frame.getFrames())f.setVisible(false);});
Game g=new Game();g.myWidth=765;g.myHeight=503;g.openInterfaceID=-1;g.addMouseWheelListener(g);
for(int[] size:new int[][]{{765,503},{1530,1006},{1920,1080},{400,300}}) {
g.setSize(size[0],size[1]);double s=g.displayScale();int x=(int)((size[0]-765*s)/2+250*s),y=(int)((size[1]-503*s)/2+150*s);
Game.zoom=3;wheel(g,x,y,-1);check(Game.zoom==2,"wheel in without Ctrl "+size[0]);
wheel(g,x,y,1);check(Game.zoom==3,"wheel out without Ctrl "+size[0]);
g.openInterfaceID=5292;wheel(g,x,y,-1);check(Game.zoom==3,"bank interface does not zoom");g.openInterfaceID=-1;
}
g.setSize(765,503);Game.zoom=3;wheel(g,600,200,-1);check(Game.zoom==3,"side tab does not change camera");
wheel(g,100,430,-1);check(Game.zoom==3,"chatbox does not change camera");
Game.zoom=-1;wheel(g,200,100,-1);check(Game.zoom==-1,"near limit");
Game.zoom=WorldController.drawDistance/3;wheel(g,200,100,1);check(Game.zoom==WorldController.drawDistance/3,"far limit");
try(RandomAccessFile dat=new RandomAccessFile("runtime/ammunition-stage/cache/main_file_cache.dat","r");RandomAccessFile idx=new RandomAccessFile("runtime/ammunition-stage/cache/main_file_cache.idx0","r")){
StreamLoader fonts=new StreamLoader(new Decompressor(dat,idx,1).decompress(1));
g.aTextDrawingArea_1271=new TextDrawingArea(false,"p12_full",fonts);
g.variousSettings[1907]=1;g.variousSettings[1900]=4;g.variousSettings[1901]=0;g.variousSettings[1902]=38;g.variousSettings[1903]=125;g.variousSettings[1904]=6;g.variousSettings[1905]=120;
int width=190,height=265;int[] pixels=new int[width*height];java.util.Arrays.fill(pixels,0x161b14);DrawingArea.initDrawingArea(height,width,pixels);
java.lang.reflect.Method draw=Game.class.getDeclaredMethod("drawPlayerInformation");draw.setAccessible(true);draw.invoke(g);
for(int y:new int[]{22,48,66,94,114,139,164,189,214,253}) {
int green=0;for(int yy=Math.max(0,y-15);yy<y;yy++)for(int xx=0;xx<width;xx++){int rgb=pixels[yy*width+xx];if((rgb>>8&255)>200&&(rgb>>8&255)>(rgb>>16&255))green++;}
check(green>10,"green text row "+y);
}
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("runtime/slayer-green-tab-preview.png"));
}
System.out.println("PASS "+checks+" actual QoL launch, mouse-wheel input, bounds, interface exclusions and green tab render checks");System.exit(0);
}
}