Emberveil source

tests/RomeoJulietCheck.java

import com.rs2.game.players.*;
import com.rs2.game.content.quests.*;
import com.rs2.game.content.quests.impl.RomeoJuliet;
import com.rs2.game.dialogues.DialogueOptions;
import com.rs2.game.items.ItemDefinitions;
import com.rs2.world.clip.*;
import org.apollo.cache.*;
import org.apollo.cache.decoder.*;
import org.apollo.cache.def.*;
import java.nio.file.*;
import java.util.*;
public final class RomeoJulietCheck {
 static int checks;static Path root;static String original;
 static void check(boolean b,String label){checks++;if(!b)throw new AssertionError(label);}
 static class F extends MemberQuestsCheck.Fixture{F(){playerName=playerName2="romeoquestqa";questPoints=0;}}
 static void npc(F p,int id){int x=id==639?3209:id==637?3152:id==640?3255:3203,y=id==639?3423:id==637?3434:id==640?3486:3404;p.pos(x,y,id==637?1:0);p.getNpcs().firstClickNpc(id);}
 static F save(F p)throws Exception{
  p.saveFile=p.saveCharacter=true;p.newPlayer=false;PlayerHandler.players[1]=p;System.setProperty("user.dir",root.toString());
  try{check(PlayerSave.saveGame(p),"save stage "+p.romeojuliet);F q=new F();check(PlayerSave.loadPlayerInfo(q,q.playerName,"",false)==1,"load stage");check(q.romeojuliet==p.romeojuliet&&q.questPoints==p.questPoints,"stage and QP preserved");check(Arrays.equals(q.playerItems,p.playerItems)&&Arrays.equals(q.playerItemsN,p.playerItemsN),"inventory preserved");return q;}
  finally{System.setProperty("user.dir",original);PlayerHandler.players[1]=null;}
 }
 static void start(F p){npc(p,639);p.getDialogueHandler().sendDialogues(p.nextChat,639);}
 public static void main(String[] args)throws Exception{
  original=System.getProperty("user.dir");root=Paths.get(original,"../../runtime/romeo-quest-save-check").normalize().toAbsolutePath();check(!Files.exists(root.resolve("data/characters/romeoquestqa.txt")),"preserve pre-existing save");
  IndexedFileSystem cache=new IndexedFileSystem(Paths.get("data/cache"),true);new ItemDefinitionDecoder(cache).run();ItemDefinitions.load();new NpcDefinitionDecoder(cache).run();new ObjectDefinitionDecoder(cache).run();RegionFactory.load(cache);
  try{
   check(ItemDefinition.lookup(755).getName().toLowerCase().contains("message"),"message asset");check(ItemDefinition.lookup(753).getName().toLowerCase().contains("cadava"),"berry asset");check(ItemDefinition.lookup(756).getName().toLowerCase().contains("potion"),"potion asset");
   for(int[] n:new int[][]{{639,3209,3423,0},{637,3152,3434,1},{640,3255,3486,0},{638,3203,3404,0}}){check(NpcDefinition.lookup(n[0])!=null,"NPC asset "+n[0]);check((Region.getClipping(n[1],n[2],n[3])&0x1280100)==0,"NPC tile unblocked "+n[0]);}
   check(QuestRouteCheck.route(3209,3423,3255,3486,0,2),"square reaches church");check(QuestRouteCheck.route(3209,3423,3203,3404,0,2),"square reaches Apothecary");
   F stairs=new F();stairs.pos(3159,3435,0);stairs.objectId=1722;stairs.objectX=3156;stairs.objectY=3435;com.rs2.game.objects.impl.Climbing.processClimbing(stairs);check(stairs.teleportToX==3155&&stairs.teleportToY==3435&&stairs.teleHeight==1,"original stairs reach Juliet floor");
   check(QuestRouteCheck.route(3155,3435,3152,3434,1,1),"upstairs landing reaches Juliet");stairs.pos(3155,3435,1);stairs.objectId=1723;com.rs2.game.objects.impl.Climbing.processClimbing(stairs);check(stairs.teleportToX==3159&&stairs.teleportToY==3435&&stairs.teleHeight==0,"original stairs return downstairs");
   check(QuestRouteCheck.route(3209,3423,3275,3374,0,1),"Varrock reaches cadava berry supply");
   F berries=new F();berries.clear();berries.pos(3275,3375,0);com.rs2.world.GlobalDropsHandler.load(berries);com.rs2.world.GlobalDropsHandler.pickup(berries,753,3275,3374);check(berries.getItemAssistant().playerHasItem(753,1),"real cadava ground supply available");
   F p=new F();p.pos(0,0,0);p.getNpcs().firstClickNpc(639);check(p.romeojuliet==0&&p.nextChat==0,"remote NPC rejected");
   start(p);DialogueOptions.handleDialogueOptions(p,9158);check(p.romeojuliet==0,"declining keeps not started");
   start(p);p.pos(0,0,0);DialogueOptions.handleDialogueOptions(p,9157);check(p.romeojuliet==0,"walking away cancels accept");
   start(p);DialogueOptions.handleDialogueOptions(p,9157);check(p.romeojuliet==1,"real start option");p=save(p);
   p.clear();for(int i=0;i<28;i++)p.item(i,995);npc(p,637);check(p.romeojuliet==1,"full backpack safely defers letter");p.playerItems[0]=p.playerItemsN[0]=0;npc(p,637);check(p.romeojuliet==2&&p.getItemAssistant().playerHasItem(755,1),"letter handed over");p=save(p);
   int count=p.getItemAssistant().getItemAmount(755);npc(p,637);check(p.getItemAssistant().getItemAmount(755)==count,"letter not duplicated");p.clear();npc(p,639);check(p.romeojuliet==2,"missing letter cannot advance");npc(p,637);check(p.getItemAssistant().playerHasItem(755,1),"lost letter replacement");npc(p,639);check(p.romeojuliet==3&&!p.getItemAssistant().playerHasItem(755,1),"Romeo consumes letter");p=save(p);
   npc(p,638);check(p.romeojuliet==3,"cannot skip priest");npc(p,640);check(p.romeojuliet==4,"priest advice");p=save(p);npc(p,638);check(p.romeojuliet==5,"Apothecary requests berry");p=save(p);
   npc(p,638);check(p.romeojuliet==5,"missing berry cannot advance");p.clear();for(int i=0;i<28;i++)p.item(i,995);p.item(0,753);npc(p,638);check(p.romeojuliet==6&&p.playerItems[0]==757,"same-slot potion with full backpack");p=save(p);npc(p,638);check(p.getItemAssistant().getItemAmount(756)==1,"potion not duplicated");
   p.clear();npc(p,637);check(p.romeojuliet==6,"missing potion cannot advance");p.item(0,753);npc(p,638);check(p.getItemAssistant().playerHasItem(756,1),"lost potion replaced for another berry");p.inTrade=true;npc(p,637);check(p.romeojuliet==6&&p.getItemAssistant().playerHasItem(756,1),"trade blocks hand-in");p.inTrade=false;
   npc(p,637);check(p.romeojuliet==7&&!p.getItemAssistant().playerHasItem(756,1),"Juliet consumes potion");p=save(p);
   npc(p,639);p.getDialogueHandler().sendDialogues(p.nextChat,639);DialogueOptions.handleDialogueOptions(p,9158);check(p.romeojuliet==7,"crypt trip can be deferred");
   npc(p,639);p.getDialogueHandler().sendDialogues(p.nextChat,639);DialogueOptions.handleDialogueOptions(p,9157);check(p.romeojuliet==8&&p.questPoints==0,"crypt story before reward");p=save(p);
   p.pos(0,0,0);QuestRewards.julietFinish(p);check(p.romeojuliet==8&&p.questPoints==0,"remote completion refused");npc(p,639);p.getDialogueHandler().sendDialogues(p.nextChat,639);check(p.romeojuliet==9&&p.questPoints==5,"one five-QP completion");p=save(p);
   for(int i=0;i<10;i++){npc(p,639);QuestRewards.julietFinish(p);p.getDialogueHandler().sendDialogues(473,639);}check(p.questPoints==5&&p.romeojuliet==9,"repeat and legacy dialogue cannot duplicate rewards");
   check(QuestAssistant.Quests.ROMEO_JULIET.questStatus(),"journal enabled");QuestAssistant.questButtons(p,28175);check(QuestAssistant.MAXIMUM_QUESTPOINTS>=42,"maximum QP includes both new quests");
   System.out.println("PASS "+checks+" Romeo and Juliet progression, recovery, persistence, reward and route checks");
  }finally{System.setProperty("user.dir",original);PlayerHandler.players[1]=null;Files.deleteIfExists(root.resolve("data/characters/romeoquestqa.txt"));Files.deleteIfExists(root.resolve("data/characters/romeoquestqa.txt.bak"));}
 }
}