Emberveil sourcetests/NetworkSmoke.java
import java.net.InetAddress;
import java.nio.file.*;
/** Two independent real clients: visibility, movement, chat and custom interface. */
public class NetworkSmoke extends Game {
static String username, peer;
int phase, ticks, startX, startY;
boolean sawPeer, sawChat, moved, journal, watchMenu, story;
void command(String text) {
stream.createFrame(103); stream.writeWordBigEndian(text.length()+1); stream.writeString(text);
}
void chat() {
stream.createFrame(4); stream.writeWordBigEndian(0);
int offset=stream.currentOffset;
stream.method425(0); stream.method425(0);
aStream_834.currentOffset=0;
TextInput.method526("hello frontier",aStream_834);
stream.method441(0,aStream_834.buffer,aStream_834.currentOffset);
stream.writeBytes(stream.currentOffset-offset);
}
@Override public void processGameLoop() {
if(phase==0) {
phase=1; myUsername=username; myPassword="qa-local-unique";
loginScreenState=2; login(myUsername,myPassword,false);
if(!loggedIn) { System.err.println("FAIL login: "+loginMessage1+" "+loginMessage2); System.exit(1); }
}
super.processGameLoop();
if(!loggedIn || loadingStage!=2) return;
ticks++;
for(Player p:playerArray) if(p!=null && p.name!=null && p.name.equalsIgnoreCase(peer)) sawPeer=true;
for(String text:chatMessages) if(text!=null && text.toLowerCase().contains("hello frontier")) sawChat=true;
if(ticks==100) { startX=myPlayer.smallX[0]; startY=myPlayer.smallY[0];
doWalkTo(0,0,0,0,startY,0,0,startY,startX,true,startX+1); }
if(ticks>100 && (myPlayer.smallX[0]!=startX || myPlayer.smallY[0]!=startY)) moved=true;
if(ticks%100==0 && ticks<800) chat();
if(ticks==800) command("journal");
if(ticks>820 && openInterfaceID==8134) journal=true;
if(ticks==900) command("watch");
if(ticks==940) { stream.createFrame(40); stream.writeWord(4891); }
if(ticks==980) watchMenu=backDialogID==2492;
if(ticks==1000) { stream.createFrame(185); stream.writeWord(2494); }
if(ticks>1050 && openInterfaceID==8134) {
for(int id=8147;id<8196;id++) if(RSInterface.interfaceCache[id]!=null && RSInterface.interfaceCache[id].disabledText!=null && RSInterface.interfaceCache[id].disabledText.contains("Supplies for the watch")) story=true;
}
if(ticks==1200) {
boolean pass=sawPeer&&sawChat&&moved&&journal&&watchMenu&&story;
System.out.println((pass?"PASS":"FAIL")+" "+username+" visibility="+sawPeer+" chat="+sawChat+" movement="+moved+" journal="+journal+" watchMenu="+watchMenu+" story="+story);
System.exit(pass?0:1);
}
}
public static void main(String[] args) throws Exception {
username=args[0]; peer=args[1];
if(!username.matches("[a-z0-9 ]{1,12}") || !peer.matches("[a-z0-9 ]{1,12}")) throw new IllegalArgumentException();
if(Files.exists(Paths.get("game/2006Scape Server/data/characters/"+username+".txt"))) throw new IllegalStateException("QA account already exists");
ClientSettings.SERVER_IP="127.0.0.1"; ClientSettings.CHECK_CRC=false; ClientSettings.SHOW_NAVBAR=false;
Game.nodeID=10; Game.portOff=0; Game.setHighMem(); Game.isMembers=true;
Signlink.storeid=32; Signlink.startpriv(InetAddress.getLocalHost());
new NetworkSmoke().createClientFrame(503,765);
Thread timeout=new Thread(()->{try{Thread.sleep(90000);}catch(Exception ignored){} System.err.println("FAIL timeout"); System.exit(2);});
timeout.setDaemon(true); timeout.start();
}
}