Emberveil sourcetests/OwnerCrownCheck.java
import java.io.*;
import java.awt.Canvas;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.util.Arrays;
import java.net.Socket;
/** Real chat-packet decoding, chat renderer, context menus and cache sprites. */
public class OwnerCrownCheck {
static int checks;
static void check(boolean ok,String label){checks++;if(!ok)throw new AssertionError(label);}
static StreamLoader media,fonts;
static Game game(){
Game g=new Game();g.myPlayer=new Player();g.myPlayer.name="Viewer";
g.aTextDrawingArea_1271=new TextDrawingArea(false,"p12_full",fonts);
g.chatTextDrawingArea=g.aTextDrawingArea_1271;g.chatBack=new Background(media,"chatback",0);
g.scrollBar1=new Background(media,"scrollbar",0);g.scrollBar2=new Background(media,"scrollbar",1);
g.modIcons[0]=new Background(media,"mod_icons",0);g.modIcons[1]=new Background(media,"mod_icons",1);g.modIcons[2]=ChatCrowns.owner(media);
g.graphics=new BufferedImage(765,503,BufferedImage.TYPE_INT_RGB).getGraphics();
g.aRSImageProducer_1166=new RSImageProducer(479,96,new Canvas());g.aRSImageProducer_1165=new RSImageProducer(512,334,new Canvas());
g.chatAreaOffsets=new int[96];for(int y=0;y<96;y++)g.chatAreaOffsets[y]=479*y;
g.chatBoxAreaOffsets=new int[334];for(int y=0;y<334;y++)g.chatBoxAreaOffsets[y]=512*y;
return g;
}
static void incoming(Game g,int rights,String name){
Stream text=new Stream(new byte[256]);TextInput.method526("Hello Emberveil",text);
Stream wire=new Stream(new byte[300]);wire.method431(0);wire.writeWordBigEndian(rights);wire.writeWordBigEndian(-text.currentOffset);
for(int i=text.currentOffset-1;i>=0;i--)wire.writeWordBigEndian(text.buffer[i]);wire.currentOffset=0;
Player p=new Player();p.name=name;p.visible=true;g.method107(0x80,0,wire,p);
check(g.chatNames[0].equals(ChatCrowns.prefix(rights)+name),"public packet preserves rank "+rights);
check(p.privelage==rights,"overhead owner rank preserved "+rights);
}
static class MemorySocket extends Socket {
final InputStream input;MemorySocket(byte[] bytes){input=new ByteArrayInputStream(bytes);}
public void setSoTimeout(int timeout){} public void setTcpNoDelay(boolean enabled){}
public InputStream getInputStream(){return input;} public OutputStream getOutputStream(){return new ByteArrayOutputStream();}
}
static void privatePacket(Game g,int rights)throws Exception {
Stream text=new Stream(new byte[256]);TextInput.method526("Hello from the owner",text);
Stream wire=new Stream(new byte[300]);wire.writeWordBigEndian(196);wire.writeWordBigEndian(13+text.currentOffset);
wire.writeQWord(TextClass.longForName("Bonds"));wire.writeDWord(123);wire.writeWordBigEndian(rights);wire.writeBytes(text.buffer,text.currentOffset,0);
g.socketStream=new RSSocket(g,new MemorySocket(Arrays.copyOf(wire.buffer,wire.currentOffset)));g.pktType=-1;
check(g.parsePacket()&&g.chatNames[0].equals(ChatCrowns.prefix(rights)+"Bonds"),"private packet preserves crown rank "+rights);
g.socketStream.close();g.socketStream=null;
}
static int red(int[] pixels,int width,int x,int y){int n=0;for(int yy=y;yy<y+14;yy++)for(int xx=x;xx<x+14;xx++){int rgb=pixels[yy*width+xx],r=rgb>>16&255,g=rgb>>8&255,b=rgb&255;if(r>70&&r>g*2&&r>b*2)n++;}return n;}
public static void main(String[] args)throws Exception{
String root="runtime/ammunition-stage/cache/";
try(RandomAccessFile dat=new RandomAccessFile(root+"main_file_cache.dat","r");RandomAccessFile idx=new RandomAccessFile(root+"main_file_cache.idx0","r")){
Decompressor store=new Decompressor(dat,idx,1);media=new StreamLoader(store.decompress(4));fonts=new StreamLoader(store.decompress(1));Censor.loadConfig(new StreamLoader(store.decompress(7)));
for(int r=0;r<=3;r++){String tagged=ChatCrowns.prefix(r)+"Bonds";check(ChatCrowns.rank(tagged)==r,"rank parser "+r);check("Bonds".equals(ChatCrowns.strip(tagged)),"name stripping "+r);}
check(ChatCrowns.rank(null)==0&&ChatCrowns.strip(null)==null,"null name safe");
check(ChatCrowns.rank("Bonds@cr3@attacker")==0&&ChatCrowns.prefix(4).isEmpty(),"invalid rank and embedded tags cannot grant owner badge");
Game g=game();Background gold=g.modIcons[1],owner=g.modIcons[2];
check(Arrays.equals(gold.aByteArray1450,owner.aByteArray1450),"red crown preserves old-school silhouette and transparency");
check(!Arrays.equals(gold.anIntArray1451,owner.anIntArray1451),"owner has a separate red palette");
check(Arrays.equals(gold.anIntArray1451,new Background(media,"mod_icons",1).anIntArray1451),"administrator gold crown unchanged");
for(int rights=0;rights<=3;rights++)incoming(g,rights,rights==3?"Bonds":"Tester");
for(int rights=0;rights<=3;rights++)privatePacket(g,rights);
g.chatTypes[0]=1;g.chatNames[0]="@cr3@Bonds";g.chatMessages[0]="Welcome to Emberveil!";
g.chatTypes[1]=1;g.chatNames[1]="@cr2@Admin";g.chatMessages[1]="Administrator crown remains gold.";
g.chatTypes[2]=1;g.chatNames[2]="@cr1@Moderator";g.chatMessages[2]="Moderator crown remains silver.";
g.chatMessages[3]=null;g.drawChatArea();
check(red(g.aRSImageProducer_1166.anIntArray315,479,4,58)>12,"public chat draws red owner crown");
BufferedImage image=new BufferedImage(479,96,BufferedImage.TYPE_INT_RGB);image.setRGB(0,0,479,96,g.aRSImageProducer_1166.anIntArray315,0,479);ImageIO.write(image,"png",new File("runtime/owner-crown-chat-preview.png"));
g.menuActionRow=0;g.buildChatAreaMenu(70);check(g.menuActionRow>0,"owner chat context menu exists");
for(int i=0;i<g.menuActionRow;i++)check(!g.menuActionName[i].contains("@cr3@"),"context menu never includes crown tag in username");
Arrays.fill(g.chatMessages,null);g.chatTypes[0]=7;g.chatNames[0]="@cr3@Bonds";g.chatMessages[0]="Private message from the owner.";g.drawChatArea();
int privateX=4+g.aTextDrawingArea_1271.getTextWidth("From ");check(red(g.aRSImageProducer_1166.anIntArray315,479,privateX,58)>12,"private chat draws red crown");
g.splitpublicChat=1;g.aRSImageProducer_1165.initDrawingArea();g.drawSplitpublicChat();
check(red(g.aRSImageProducer_1165.anIntArray315,512,privateX,317)>12,"split private chat draws red crown");
System.out.println("PASS: "+checks+" owner crown packet, palette, render and name-menu checks");
}
}
}