Emberveil source

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