Union Client Scripts

Forum for alternative clients, mods & discussions on the same.

Moderator: Phades

Re: Union Client Scripts

Postby Arcanist » Sun Aug 17, 2014 3:23 am

My API, save as jBotAPIArcanist.japi

Code: Select all
function toInt(value) { return ~~value; }

function findFullBarrel() {
   jMoveStep(jCoord(1, 0));
   jWaitStartMove();
   jWaitEndMove();
   var barrels = jGetObjects(50, jCoord(0, 0), ["barrel"]);
   var g = 0;
   var i = 0;
   for (var i = 0; i < barrels.length; i++) {
      var barrel = barrels[g]
      jPFMoveOffset_LX(barrel.position(), 1)
      waitPFEndMove();
      jSleep(1000);
      jDoClick(barrel.getID(), 3, 0);
       while(!jHaveWindow("Barrel")) jSleep(100);
      if(jGetWindow("Barrel").getLabelText(1).indexOf("water") != -1) return barrel;
      else g++;
}
}

function getNearest(object) {
   var obj = jGetObjects(40, jCoord(0, 0), object);
   var min_len = 100500;
   var objid = 0;
   for (var i = 0; i < obj.length; i++) {
      if (obj[i].position().dist(jMyCoords()) < min_len) {
         objid = obj[i];
         min_len = obj[i].position().dist(jMyCoords());
      }
   }
   return objid;
}

function getWaterFromBarrel () {
   while (checkInventory().getItems("invobjs/buckete").length > 0) {
      inventory = checkInventory();
      var barrel = findFullBarrel();
      var bucket = inventory.getItems("buckete")[0];
      var bucket_coord = bucket.coord();
      var bucket_name = bucket.resName();
      bucket.take();
      jWaitDrag();
      barrel.interactClick(0);
      while (jGetDraggingItem().resName() == bucket_name) jSleep(100);
      inventory.drop(bucket_coord);
      jMoveStep(jCoord(0, 1));
      jWaitStartMove();
      jWaitEndMove();
   }
}

function takeItemsToContainer (itemlist, container, containerwindow, radius) {
if (radius == null) radius = 1;
if (checkInventory().getItems(itemlist).length > 0) {
      var inventory = checkInventory();
      while (!jGetWindow(containerwindow)){
         jPFMoveOffset_LX(container.position(), radius);
         waitPFEndMove();
         jDoClick(container.getID(),3,0);
         jSleep(1500);
      }
      if (jGetWindow(containerwindow) != -1 && jGetWindow(containerwindow).getInventories()[0].freeSlotsCoords().length > 0) {
         jToConsole("Putting Items into the Container");
         if (inventory.getItems(itemlist).length > 0);
         inventory.getItems(itemlist)[0].transferSuchAll();
         jSleep(500);
      }
}
jMoveStep(jCoord(0, 0));
return ;
}


function takeItemsToContainers (itemlist, containerlist, containerwindow, radius) {
if (radius == null) radius = 1;
var out = 0;
while (checkInventory().getItems(itemlist).length > 0) {
      var inventory = checkInventory();
      while (!jGetWindow(containerwindow)){
         jPFMoveOffset_LX(containerlist[out].position(), radius);
         waitPFEndMove();
         jDoClick(containerlist[out].getID(),3,0);
         jSleep(1500);
      }
      if (jGetWindow(containerwindow) != -1 && jGetWindow(containerwindow).getInventories()[0].freeSlotsCoords().length > 0) {
         jToConsole("Putting Items into the Container");
         if (inventory.getItems(itemlist).length > 0);
         inventory.getItems(itemlist)[0].transferSuchAll();
         jSleep(500);
      }
      else {
         containerlist.splice(out, 1);
         jToConsole("Deleted Full Container");
         jMoveStep(jCoord(0, 0));
         //out++;
         jSleep(500);
         }
      }
      jSleep(1000);
return containerlist;
      }

function openCupboard(cupboard, number){
   while(jHaveWindow("Cupboard")) {
      jAbsClick(jMyCoords(), 1, 0);
      if (jHaveWindow("Cupboard")) jSleep(500);
   }
   while(!jHaveWindow("Cupboard")) {
            jPFMoveOffset_LX(cupboard[number].position(), 1);
            waitPFEndMove();
            jSleep(500);
            jDoClick(cupboard[number].getID(), 3, 0);
            jSleep(1000);
            }
             jSleep(100);
            jToConsole("Walked to Cupboard Number " + number);
            return number;
}

function openChest(chest){
         jPFMoveOffset_LX(chest.position(), 1);
         waitPFEndMove();
         jSleep(500);
         jDoClick(chest.getID(), 3, 0);
         while(!jHaveWindow("Chest")) jSleep(100);
         jToConsole("Walked to Chest");
         return;
}

function alertW(title,message){
         jPlayBeep(3000);
         var blist = ['Exit'];
         var selectWindow = jGUIWindow(jCoord(250, 250), jCoord(150, blist.length * 25 + 15), title);
         var label = jGUILabel(selectWindow, jCoord(5, 5), message);
         for(var i = 0; i < blist.length; i++)
            jGUIButton(selectWindow, jCoord(5, 25 + i*25),  100, blist[i]);
         selectWindow.toggleCloseButton();
         var btext = selectWindow.waitButtonClick();
         if(btext == blist[0]){
            jExit();selectWindow.destroy();
         }
         sayVillage(title+ " -> "+message);
}

      
function getItemsFromContainers (itemlist, containerlist, containerwindow, noofitems, radius) {
//jToConsole(containerlist);
if (radius == null) radius = 1
var out = 0 //containerlist.length - 1;
//jToConsole("Getting");
if (containerlist.length > 0)
while (checkInventory().freeSlotsCoords().length > 0) {
//jToConsole("Getting2");
   var g = 0;
   while (g < noofitems) {
   //jToConsole(containerlist[out]);
   //jToConsole(containerlist[containerlist.length - 1]);
      var inventory = checkInventory();
      if (containerlist.length == 0) {return containerlist; jToConsole("Getting4"); }
      var containerlist = containerlist;
      while (!jGetWindow(containerwindow)){
         jPFMoveOffset_LX(containerlist[out].position(), radius);
         waitPFEndMove();
         var player_position = jMyCoords();
         jDoClick(containerlist[out].getID(),3,0);
         jSleep(1500);
      }
      if (checkInventory().freeSlotsCoords().length > 0) {
         //jToConsole("Getting Items from the Container");
         if (jGetWindow(containerwindow) != -1 && jGetWindow(containerwindow).getInventories()[0].getItems(itemlist).length > 0) {
         var itemsnumbers = jGetWindow(containerwindow).getInventories()[0].getItems(itemlist).length;
            jGetWindow(containerwindow).getInventories()[0].getItems(itemlist)[0].transfer();
            while (jGetWindow(containerwindow).getInventories()[0].getItems(itemlist).length == itemsnumbers) {jSleep(500); }
            g++;
            }
         jSleep(500);
         if (jGetWindow(containerwindow) != null){
            if (jGetWindow(containerwindow) != -1 && jGetWindow(containerwindow).getInventories()[0].getItems(itemlist).length < 1) {
            jToConsole(containerlist.length + " " + containerwindow + "s left");
               //if (containerlist[out] == containerlist[containerlist.length -1]) {
                  //var containerlist = -1;
                  //return containerlist;
               //}
               //jToConsole("Getting11");
               containerlist.splice(out, 1);
               //containerlist.length -= 1;
               //var out = containerlist.length - 1;
               jToConsole("Deleted Empty Container");
               jAbsClick(player_position, 1, 0);
               while (jGetWindow(containerwindow) != null) jSleep(500);
               jSleep(500);
            }
            }
         
      }
      else {
      //jToConsole("Getting12");
         jAbsClick(player_position, 1, 0);
         jToConsole("Inventory full");
         return containerlist;
         }
      }
      //jToConsole("Getting13");
      jAbsClick(player_position, 1, 0);
      return containerlist;
   }
if (containerlist.length == 0) {
containerlist = [];
return containerlist;
}
jToConsole("Getting14");
jToConsole("Inventory full");
return containerlist;
}

function getItemsFromContainer (itemlist, containerlist, containerwindow, noofitems, radius) { // use noofitems = 100500 for all
if (radius == null) radius = 1
while (checkInventory().freeSlotsCoords().length > 0) {
   for (var g = 0; g < noofitems; g++) {
      var inventory = checkInventory();
      if (containerlist.length == 0) return;
      while (!jGetWindow(containerwindow)){
         jPFMoveOffset_LX(containerlist.position(), radius);
         waitPFEndMove();
         var player_pos = jMyCoords();
         jDoClick(containerlist.getID(),3,0);
         jSleep(1500);
      }
      if (checkInventory().freeSlotsCoords().length > 0) {
         //jToConsole("Getting Items from the Container");
         if (jGetWindow(containerwindow) != -1 && jGetWindow(containerwindow).getInventories()[0].getItems(itemlist).length > 0) {
            var itemsnumbers = jGetWindow(containerwindow).getInventories()[0].getItems(itemlist).length;
            if (noofitems == 100500) jGetWindow(containerwindow).getInventories()[0].getItems(itemlist)[0].transferSuchAll();
            else jGetWindow(containerwindow).getInventories()[0].getItems(itemlist)[0].transfer();
            while (jGetWindow(containerwindow).getInventories()[0].getItems(itemlist).length == itemsnumbers) {jSleep(500); }   
            jSleep(500);
         }
         if (jGetWindow(containerwindow) != -1 && jGetWindow(containerwindow).getInventories()[0].getItems(itemlist).length == 0) {
            jAbsClick(player_pos, 1, 0);
            return;
            //out++;
            jSleep(500);
            }
         
      }
      else {
         jAbsClick(player_pos, 1, 0);
         jSleep(500);
         jToConsole("Inventory full");
         return ;
         }
      if (noofitems == 100500) { jAbsClick(player_pos, 1, 0); return;   }
         
      }
      jAbsClick(player_pos, 1, 0);
      return;
   }

jToConsole("Inventory full");
return containerlist;
}

function dropFromCursor(where) { //  1 = inventory
if (jIsDragging()) {
   if (where = null) where = 1
   if (where = 1) {
      if (checkInventory().freeSlots() > 0) checkInventory().drop(checkInventory().freeSlotsCoords()[0]);
         jSleep(500);
         if (!jIsDragging())   return;
   }
   while (jIsDragging()) {
      jDropObject(0);
      jSleep(300);     
      }
}
}

function findObjectbyBLOB(object, type, type2, type3, type4, type5) { // no water = 64, water = 66, fuel = 65, water and fuel = 67, lit = 85 cooking = 93
   var objid = 0;
   var g = 0;
   var posb = jGetObjects(50, jCoord(0, 0), [object]);
   for (var i = 0; i < 50; i++) {
      objid = posb[g]
     if (objid != null)
      if (objid.blob(0) == type) return objid;
     if (objid != null)
      if (objid.blob(0) == type2) return objid;
     if (objid != null)
      if (objid.blob(0) == type3) return objid;
     if (objid != null)
      if (objid.blob(0) == type4) return objid;
     if (objid != null)
      if (objid.blob(0) == type5) return objid;
      g++;
   }
}


function selectMultiple(object, type) {
   var ta = [];
   var ids = [];
   while (1) {
      var sign = jSelectObject("Select "+ type+ " , click on the ground to stop selecting");
      if (sign == null) break;
      var name = sign.name();
      if (name.indexOf(object) != -1) {
         if (ids.indexOf(sign.getID()) != -1) {
            jToConsole("ERROR: This "+type+" has been already selected.");
            continue;
         }
         ta.push(sign);
         ids.push(sign.getID());
         jToConsole(type +" count: " + ta.length);
      }
      else break;
   }
   return ta;
}

            
function getItemsFromSigns (itemlist, signlist, signwindow, noofitems, radius, signval) {
if (radius == null) radius = 1;
if (signval == null) signval = 1;
var out = 0;
var takenitems = 0;
while (checkInventory().freeSlotsCoords().length > 0) {
   while (takenitems < noofitems) {
      var inventory = checkInventory();
      jToConsole(takenitems + " " + noofitems);
      while (!jGetWindow(signwindow)){
         jPFMoveOffset_LX(signlist[out].position(), radius);
         waitPFEndMove();
         jDoClick(signlist[out].getID(),3,0);
         jSleep(1500);
      }
      var buildVals = GetBuildValues(signwindow, signval);
      jToConsole(buildVals[1]);
      if (buildVals[1] == 0) {
            signlist.splice(out, 1);
            jToConsole("Deleted Empty Sign");
            jMoveStep(jCoord(0, 0));
            while (jGetWindow(signwindow)) jSleep(500);
      }
      else {
         itemstotake = 0;
         if (buildVals[1] > noofitems - takenitems) itemstotake = noofitems - takenitems;
         else {
            itemstotake = buildVals[1];
            jToConsole(itemstotake);
            signlist.splice(out, 1);
         }
         
         for (var t = 0; t < itemstotake; t++) {   
            if (checkInventory().freeSlotsCoords().length > 0) {
               jPrint("Getting Items from the Container");
                  itemlength = checkInventory().getItems(itemlist).length
                  jPrint ("itemlength = "+itemlength);
                  jTransferBuildItem(signwindow, 1);
                  jSleep(500);
               
               
            }
            else {
               jToConsole("Inventory full");
               return signlist;
            }   
         }
         jMoveStep(jCoord(0, 0));
         jSleep(500);
         var takenitems = takenitems + itemstotake;
      }
   }
      return signlist;
   }
jToConsole("Inventory full");
return containerlist;
}

//funcs
function putItemsToSigns (itemlist, signlist, signwindow, radius, signval) {
if (radius == null) radius = 1;
if (signval == null) signval = 1;
var out = 0;
while (checkInventory().getItems(itemlist).length > 0) {
      var inventory = checkInventory();
      while (!jGetWindow(signwindow)){
         jPFMoveOffset_LX(signlist[out].position(), radius);
         waitPFEndMove();
         var player_pos = jMyCoords();
         jDoClick(signlist[out].getID(),3,0);
         jSleep(1500);
      }
      var buildvals = GetBuildValues(signwindow, signval);
      jToConsole(buildvals[0]);
      if (checkInventory().getItems(itemlist).length > 0){
         if (jGetWindow(signwindow) != -1 && buildvals[0] > 0) {
            jToConsole("Putting Items into the Container");
            if (inventory.getItems(itemlist).length > 0) inventory.getItems(itemlist)[0].transferSuchAll();
            jSleep(500);
            jAbsClick(player_pos, 1, 0);
            if (checkInventory().getItems(itemlist).length == 0) return signlist;
         }
         else {
            signlist.splice(out, 1);
            jToConsole("Deleted Full Container");
            jMoveStep(jCoord(0, 0));
            //out++;
            jSleep(500);
            }
         }
      }
      jSleep(1000);
return signlist;
}


function GetBuildValues(signName, itemNum)
{
   var str = jGetBuildValues(signName, itemNum);
   var strRes = str.split("/");
   var res = [];
   for (var i = 0; i < strRes.length; i++){
   res[i] = parseInt(strRes[i]);
   }
   return res;
}

function putItemsToSign (itemlist, signlist, signwindow, radius, signval) {
//if(signval == null) signval = 0;
if (radius == null) radius = 1;
var out = 0;
while (checkInventory().getItems(itemlist).length > 0) {
      var inventory = checkInventory();
      while (!jGetWindow(signwindow)){
         jPFMoveOffset_LX(signlist.position(), radius);
         waitPFEndMove();
         var player_pos = jMyCoords();
         jDoClick(signlist.getID(),3,0);
         jSleep(1500);
      }
      var buildvals = GetBuildValues(signwindow, signval);
      jToConsole(buildvals[0]);
      if (checkInventory().getItems(itemlist).length > 0){
         if (jGetWindow(signwindow) != -1 && buildvals[0] > 0) {
            jToConsole("Putting Items into the Container");
            if (inventory.getItems(itemlist).length > 0) inventory.getItems(itemlist)[0].transferSuchAll();
            jSleep(500);
            jAbsClick(player_pos, 1, 0);
            if (checkInventory().getItems(itemlist).length == 0) return signlist;
         }
         if (buildvals[0] < 0) {
            jToConsole("Sign Full")
            return false;
         }
         if (jGetWindow(signwindow) != -1) {jSleep(100);}
         else {
            jToConsole("Sign not seen");
            return false;
         }
      }
      jSleep(1000);
return signlist;
}
}


Leksar's pathfinder
pathfinder.japi:

Code: Select all
function getRandomArbitary(min, max){
  return Math.random() * (max - min) + min;
}

function jPFMove_LX(point) {
   point = jTilify(point);
   var MyX = jMyCoords().x;
   var MyY = jMyCoords().y;
   if (!jIsPathFree(point)) jPFMove(point);
   else jAbsClick(point, 1, 0);
   cycles = 0;
   wcontinue = true;
   while (wcontinue) {
      wcontinue = MyX != point.x || MyY != point.y;
      jPrint("jPFMove_LX My =" + MyX + " " + MyY + " - " + point.x + " " + point.y);
      jSleep(1000);
      MyX = jMyCoords().x;
      MyY = jMyCoords().y;
      if(cycles == 6) {     
         jPrint("jPFMove_LX trying to move again");
         jOffsetClick(jCoord(getRandomArbitary(-2,2),getRandomArbitary(-2,2)),1,0);
         jSleep(500);
         if (!jIsPathFree(point)) jPFMove(point);
       else jAbsClick(point, 1, 0);
         cycles = 0
         wcontinue = false;
      }
      cycles++;
   }
   jPrint("jPFMove ended");
}

function jPFMoveOffset_LX(point, offset) {
   offsMoveS=jCoord(0,offset);
   offsMoveE=jCoord(offset,0);
   offsMoveW=jCoord(-offset,0);
   offsMoveN=jCoord(0,-offset);
   
   while (1) {
      if(jPFMove(point.add(offsMoveS.mul(11))) > 0) {
         jPFMove_LX(point.add(offsMoveS.mul(11)));
      return offsMoveS;
      }
     
      if(jPFMove(point.add(offsMoveE.mul(11))) > 0) {
         jPFMove_LX(point.add(offsMoveE.mul(11)));
      return offsMoveE;
      }
     
      if(jPFMove(point.add(offsMoveW.mul(11))) > 0) {
         jPFMove_LX(point.add(offsMoveW.mul(11)));
      return offsMoveW;
      }   
     
      if(jPFMove(point.add(offsMoveN.mul(11))) > 0) {
         jPFMove_LX(point.add(offsMoveN.mul(11)));
      return offsMoveN;
      }
      jPrint("jPFMoveOffset_LX can't find path");
//      break;

         jOffsetClick(jCoord(getRandomArbitary(-2,2),getRandomArbitary(-2,2)),1,0);
         jSleep(500);
     
   }
}


function waitPFEndMove(){
   jWaitStartMove(300);
   jSleep(100);
   while (true) {
      jWaitEndMove(10000);
      jSleep(200);
      if (!jIsMoving()) {
         return;
      }
   }
}


Crafter:

Run in an area with the right tools, and ingredients in cupboards. At the start it will prompt for input cupboards, select the cupboards containing ingredients, or select none to select all.
If there are large chests in sight, product will go in there, if not it will go in cupboards.
Water will be taken from all barrels in the area, don't have barrels with wine/vinegar.

Code: Select all
//#! name = Crafter
//#! uniq = arcanist_crafter
//#! icon = gfx/invobjs/flour
// Globals
//include("jBotAPITalon");
include("jBotAPIArcanist");
include("jBotAPI");
include("pathfinder");
var inventory = checkInventory();
var cooker;
var out = 0;
// Settings
var actionTimeout = 1000 * 60 * 2;   // Lag timeout
var free = inventory.freeSlots();
// Flags
var stopFlag = false;
var cupb = jGetObjects(35, jCoord(0, 0), ["cupboard"]);
var ingredlength = 0;
//var drop = dropFromCursor(0);
var barrel = jGetObjects(35, jCoord(0, 0), ["barrel"]);


/* =========================================================================== */
/* ==============================   ÌÎÐÊÎÂÊÀ   ============================== */
/* =========================================================================== */
function PumpkinPieMaker() {
    this.ingred = ["invobjs/flour", "invobjs/pumpkinflesh", "invobjs/pumpkinflesh"];
   this.craft = jSendDoubleAction("craft", "dough_pumpkinpie");
   this.dough = ["invobjs/dough-pie-pumpkin"];
   this.water = true
   this.cauldron = false
   this.sausage = false
}

function ApplePieMaker() {
    this.ingred = ["invobjs/flour", "invobjs/apple", "invobjs/butter"];
   this.craft = jSendDoubleAction("craft", "apdough");
   this.dough = ["invobjs/dough-pie-apple"];
   this.water = true
   this.cauldron = false
   this.sausage = false
}

function ChickenSaladMaker() {
    this.ingred = ["invobjs/flour", "invobjs/pumpkinflesh", "invobjs/pumpkinflesh"];
   this.craft = jSendDoubleAction("craft", "dough_pumpkinpie");
   this.dough = ["invobjs/dough-pie-pumpkin"];
   this.water = false
   this.cauldron = false
   this.sausage = false
}

function RennetMaker() {
    this.ingred = ["invobjs/flour", "invobjs/pumpkinflesh", "invobjs/pumpkinflesh"];
   this.craft = jSendDoubleAction("craft", "dough_pumpkinpie");
   this.dough = ["invobjs/wurst"];
   this.water = false
   this.cauldron = true
   this.sausage = false
}

function CowChorizoMaker() {
    this.ingred = ["invobjs/intestines", "invobjs/meat-cow", "meat-cow"];
   this.craft = jSendDoubleAction("craft", "wurst_cowchorizo");
   this.dough = ["invobjs/wurst"];
   this.water = false;
   this.cauldron = false;
   this.sausage = true;
}

function BoarBoudinMaker() {
    this.ingred = ["invobjs/intestines", "invobjs/meat-pig", "invobjs/meat-cow"];
   this.craft = jSendDoubleAction("craft", "wurst_boarboudin");
   this.dough = ["invobjs/wurst"];
   this.water = false;
   this.cauldron = false;
   this.sausage = true;
}

function LambSausageMaker() {
    this.ingred = ["invobjs/intestines", "invobjs/meat-pig", "invobjs/meat-sheep"];
   this.craft = jSendDoubleAction("craft", "wurst_lambsausages");
   this.dough = ["invobjs/wurst"];
   this.water = false;
   this.cauldron = false;
   this.sausage = true;
}

function ChickenChorizoMaker() {
    this.ingred = ["invobjs/intestines", "invobjs/meat-chicken", "meat-sheep"];
   this.craft = jSendDoubleAction("craft", "wurst_chickenchorizo");
   this.dough = ["invobjs/wurst"];
   this.water = false;
   this.cauldron = false;
   this.sausage = true;
}

function BoarBaloneyMaker() {
    this.ingred = ["invobjs/intestines", "invobjs/meat-pig", "invobjs/meat-pig","invobjs/meat-pig"];
   this.craft = jSendDoubleAction("craft", "wurst_boarbaloney");
   this.dough = ["invobjs/wurst"];
   this.water = false;
   this.cauldron = false;
   this.sausage = true;
}

function PigletMaker() {
    this.ingred = ["invobjs/intestines", "invobjs/meat-pig"];
   this.craft = jSendDoubleAction("craft", "wurst_piglet");
   this.dough = ["invobjs/wurst"];
   this.water = false;
   this.cauldron = false;
   this.sausage = true;
}

function TinyAbacusMaker() {
    this.ingred = ["invobjs/board",
   "invobjs/branch","invobjs/branch","invobjs/branch","invobjs/branch",
   "invobjs/nugget-tin","invobjs/nugget-tin","invobjs/nugget-tin",
   "invobjs/nugget-castiron","invobjs/nugget-castiron"];
   this.craft = jSendDoubleAction("craft", "tinyabacus");
   this.dough = ["invobjs/tinyabacus"];
   this.water = false;
   this.cauldron = false;
   this.sausage = false;
}

function BearBangerMaker() {
    this.ingred = ["invobjs/intestines", "invobjs/meat-pig", "invobjs/meat-pig", "invobjs/meat-bear", "invobjs/meat-bear"];
   this.craft = jSendDoubleAction("craft", "wurst_bigbearbanger");
   this.dough = ["invobjs/wurst"];
   this.water = false;
   this.cauldron = false;
   this.sausage = true;
}

function FlourMaker() {
    this.ingred = ["invobjs/seed-wheat", "invobjs/seed-wheat"];
   this.craft = jSendDoubleAction("craft", "flour");
   this.dough = ["invobjs/flour"];
   this.water = true;
   this.cauldron = false;
   this.sausage = false;
   this.flour = true;
}

function SoldierMaker() {
    this.ingred = ["invobjs/nugget-tin", "invobjs/nugget-tin", "invobjs/nugget-tin", "invobjs/nugget-tin", "invobjs/nugget-tin",
   "invobjs/nugget-tin", "invobjs/nugget-tin", "invobjs/nugget-tin", ];
   this.craft = jSendDoubleAction("craft", "tinsoldier");
   this.dough = ["invobjs/tinsoldier"];
   this.crucible = true;
   this.fuel = "coal";
   this.fuelcup = selectMultiple("cupboard", "Fuel Cupboards");
   this.tool = "alloyer";
   this.toolwindow = "Crucible";
}

function OnionMaker() {
    this.ingred = ["invobjs/herbs/chantrelle", "invobjs/onion", "invobjs/dough"];
   this.craft = jSendDoubleAction("craft", "dough_pirozhki");
   this.dough = ["invobjs/dough-pirozhki"];

}

function BreadMaker() {
    this.ingred = ["invobjs/flour"];
   this.craft = jSendDoubleAction("craft", "dough");
   this.dough = ["invobjs/dough"];
   this.water = true;
}

/*==============================Êðîï÷èêè============================================*/
function ScanCup4Ingredients2(ObjCook,ObjCupboard){
    jWaitWindow("Cupboard",3000);
    ObjCook.ingred.forEach(function(entry) {
      quantity=jGetWindow("Cupboard").getInventories()[0].getItems(entry).length;
      jPrint(quantity)
      if(quantity > 0){
         CookVars.cups.push(ObjCupboard.getID());
      }
      return;
    });
}


// ArrayCupboard[ingred] [cupboard jGob]
function ScanCup4Ingredients(containerlist){
   ArrayCupboard = [];
   IngredCupboard = [];
   var ObjCupboard = [];
   var cupboards = containerlist;
//   for(var z = 0; z < cooker.ingred.length; z++) { var ObjCupboard[z] = []; }
   for(var i = 0; i < cupboards.length; i++) {
      openCupboard(cupboards, i);
      jWaitWindow("Cupboard",3000);
      //jToConsole("Cupboards Searched = "+ i);
      //jToConsole(ObjCupboard);
      for (var k = 0; k < cooker.ingred.length; k++){
         //jToConsole("ObjCupboard length" + ObjCupboard.length);
         //jToConsole(ObjCupboard);
         if(ObjCupboard.length < k + 1) ObjCupboard.push([]);
         //jToConsole("Ingredient" + ObjCupboard.length);
         
         //jToConsole(ObjCupboard);         
         if(jGetWindow("Cupboard").getInventories()[0].getItems(cooker.ingred[k]).length > 0){
         ObjCupboard[k].push(cupboards[i]);
         jToConsole("Cupboards of "+ cooker.ingred[k] + " found = "+ObjCupboard[k].length);
         //jToConsole(ObjCupboard);
         }
      }
      
    }
   jAbsClick(jMyCoords(), 1, 0);
   return ObjCupboard;
}


function filltool(tooltype, toolwindow, fueltype){
if (jGetWindow(toolwindow).getMeterValue(1) < 6){
       var coal = checkInventory().getItems(fueltype);
         coal[0].take();
         jWaitDrag();
       var tool = findObjectbyBLOB(tooltype, 0,0,0,0);
         tool.interactClick(0);
         jSleep(1000);
   }
   while (!jGetWindow(toolwindow)){
      var tool = findObjectbyBLOB(tooltype, 0,0,0,0);
      //jPFMoveOffset_LX(alloyer.position(), 1);
      //waitPFEndMove();
      jDoClick(tool.getID(),3,0);
      jSleep(1500);
   }
   jGetWindow(toolwindow).pushButton("Light");


}

function search(items, cookno) {
   var i = 0;
   for (var i = 0; i < (cookno - 1); i++) {
      cupno = getRandomArbitary(0, cupb.length);
      cupno = toInt(cupno);
      jPFMoveOffset_LX(cupb[cupno].position(), 1);
      waitPFEndMove();
      jSleep(500);
      jDoClick(cupb[cupno].getID(), 3, 0);
      while(!jHaveWindow("Cupboard"))
        jSleep(100);
      var g = 0;
      var emptycheck = 0;
      for (var g = 0; g < items.length; g++) {
         
         var inventory = checkInventory();
         var ingred_inventory = inventory.getItems(items);
         var open_cupboard = jGetWindow("Cupboard");
         var current_cupboard = jGetWindow("Cupboard").getInventories()[0];
         var currentingred = current_cupboard.getItems(items[g]);
         if (currentingred.length > 0) {
         currentingred[0].transfer();
         jSleep(500);
      }
      else {
      emptycheck++;
      //jMoveStep(jCoord(0, 0));
      }
      jToConsole(emptycheck); //debugging
      if (emptycheck == items.length)
      delete cupb[cupno];
      }
      jSleep(1000);
      //if jGetWindow("Cupboard")
   }
}



function mainBaker() {
   
   
   
   jDropLastWindow();
   var blist = ["Pumpkin Pie", "Apple Pie","Cow Chorizo", "Boar Boudin", "Chicken Salad","Lamb Sausages",
   "Chicken Chorizo","Boar Baloney", "Piglet Wurst","Big Bear Banger", "Tiny Abacus", "Flour", "Tin Soilder", "Onion and Chantrelle Bread", "Bread", "Exit"];
   var selectWindow = jGUIWindow(jCoord(250, 250), jCoord(110, blist.length * 25 + 15), "Farming");
   var label = jGUILabel(selectWindow, jCoord(5, 5), "Select food type:");
   for(var i = 0; i < blist.length; i++)
      jGUIButton(selectWindow, jCoord(5, 25 + i*25),  100, blist[i]);
   selectWindow.toggleCloseButton();
   var btext = selectWindow.waitButtonClick();
   if(btext == blist[0]) cooker = new PumpkinPieMaker();
   if(btext == blist[1]) cooker = new ApplePieMaker();
   if(btext == blist[2]) cooker = new CowChorizoMaker()
   if(btext == blist[3]) cooker = new BoarBoudinMaker();
   if(btext == blist[4]) cooker = new ApplePieMaker();
   if(btext == blist[5]) cooker = new LambSausageMaker();
   if(btext == blist[6]) cooker = new ChickenChorizoMaker();
   if(btext == blist[7]) cooker = new BoarBaloneyMaker();
   if(btext == blist[8]) cooker = new PigletMaker();
   if(btext == blist[9]) cooker = new BearBangerMaker();
   if(btext == blist[10]) {cooker = new TinyAbacusMaker(); ingredlength = 13 }
   if(btext == blist[11])cooker = new FlourMaker();
   if(btext == blist[12])cooker = new SoldierMaker();
   if(btext == blist[13])cooker = new OnionMaker();
   if(btext == blist[14])cooker = new BreadMaker();
   if(btext == blist[blist.length - 1]) {selectWindow.destroy(); return;}
   selectWindow.destroy();
   if (ingredlength == 0) ingredlength = cooker.ingred.length;
   var outtype = jGetObjects(35, jCoord(0, 0), ["lchest"]); outtypewindow = "Chest";
   if (outtype.length < 1) {var outtype = jGetObjects(35, jCoord(0, 0), ["cupboard"]); outtypewindow = "Cupboard";}
   /*
      jDropLastWindow();
   var blist = ["Large Chests", "Cupboards", "Exit"];
   var selectWindow = jGUIWindow(jCoord(250, 250), jCoord(110, blist.length * 25 + 15), "Farming");
   var label = jGUILabel(selectWindow, jCoord(5, 5), "Select Out type:");
   for(var i = 0; i < blist.length; i++)
      jGUIButton(selectWindow, jCoord(5, 25 + i*25),  100, blist[i]);
   selectWindow.toggleCloseButton();
   var btext = selectWindow.waitButtonClick();
   if(btext == blist[0]) {outtype = jGetObjects(35, jCoord(0, 0), ["lchest"]); outtypewindow = "Chest";}
   if(btext == blist[1]) {outtype = jGetObjects(35, jCoord(0, 0), ["cupboard"]); outtypewindow = jGetWindow("Cupboard");}
   if(btext == blist[blist.length - 1]) {selectWindow.destroy(); return;}
   selectWindow.destroy();
   */
  //jToConsole(ingredlength);
  var cubbz = [];
  var cubbz = selectMultiple("cupboard", "In containers");
  if (cubbz.length < 1) var cubbz = jGetObjects(35, jCoord(0, 0), ["cupboard"]);
var cupboardlist = ScanCup4Ingredients(cubbz);
if (cupboardlist.length < cooker.ingred.length) {
   jToConsole("Cannot find all ingredients");
   jExit();
   }
jSleep(500);
while (1) {

   if (cooker.fuel != null) var freeSlots = checkInventory().freeSlots() - 1;
   else var freeSlots = checkInventory().freeSlots();
   var cookno = freeSlots / (ingredlength);
   var cookno = toInt(cookno);
   jToConsole ("Items Cook per inventory " + cookno);
   jToConsole ("Number of Ingredients per item " + ingredlength);
   var takeningred = cooker.ingred;
   var emptycupboard = 0;
   var currentingred = 0;
   var cubbs = cupboardlist;
   jToConsole (cooker.ingred);
   for (var currentingred = 0; currentingred < cooker.ingred.length; currentingred++) {
   
   getItemsFromContainers (cooker.ingred[currentingred], cubbs[currentingred], "Cupboard", cookno, 1);
   jAbsClick(jMyCoords(), 1, 0);
   jSleep(1000);
   jSleep(1000);
   /*   var stufftaken = 0;
      while (stufftaken < cookno) {

         drinkWater();
         if (!jHaveWindow("Cupboard")) cupno = openCupboard(cubbs[currentingred], toInt(getRandomArbitary(0, cubbs.length)));
         if (jHaveWindow("Cupboard")!= -1) {
         jSleep(500);
         stuffincupb = jGetWindow("Cupboard").getInventories()[0].getItems(cooker.ingred[currentingred]);
         //jToConsole(cooker.ingred[currentingred] +" in Cupboard " +stuffincupb.length);
         jSleep(500);
         if (stuffincupb.length == 0) {
            //jToConsole("Empte Cupboard Deleted");
            //cubbs.splice(cupno, 1);
            jMoveStep(jCoord(0, 0));
            jSleep(300);
         }
         if (stuffincupb.length > 0) {
            if (stuffincupb[0].isActual()) {
                  stuffincupb[0].transfer();
                  stufftaken++;
                  jSleep(500);
                  jToConsole("Stuff Taken "+ stufftaken);
            }   
         }
         }
         //jMoveStep(jCoord(0, 1));
         jToConsole ("Current Ingredient: " + currentingred);
         jSleep(500);   
      } */
   }
   
   cooker.craft;
   jWaitCraft();
   jToConsole("Crafing Stuff");
   if (cooker.sausage == true) {
      var grinder = findObjectbyBLOB("mgrind", 2, 2, 2, 2)
      jPFMoveOffset_LX(grinder.position(), 1);
      waitPFEndMove();
      jDoClick(grinder.getID(),3,0);
      jSleep(1000);
   }
   if (cooker.flour == true) {
      var quern = findObjectbyBLOB("quern", 0, 0, 0, 0);
      jPFMoveOffset_LX(quern.position(), 1);
      waitPFEndMove();
      jDoClick(quern.getID(),3,0);
      jSleep(1000);
   }
   if (cooker.crucible == true) {
   var stopflag = false;
      while (stopflag == false){
         var fuel = checkInventory().getItems(cooker.fuel);
         if (fuel.length < 1) getItemsFromContainers (cooker.fuel, cooker.fuelcup, "Cupboard", 1, 1);
         while (!jGetWindow(cooker.toolwindow)){
            var tewl = findObjectbyBLOB(cooker.tool, 0,0,0,0);
            jPFMoveOffset_LX(tewl.position(), 1);
            waitPFEndMove();
            var player_pos = jMyCoords();
            jDoClick(tewl.getID(),3,0);
            jSleep(1500);
         }
         filltool(cooker.tool, cooker.toolwindow, cooker.fuel);
         if (jGetWindow(cooker.toolwindow).getMeterValue(1) > 5) var stopflag = true;
      }
   }
   if (jGetHungry() < 55) { jLogout(); jExit(); }
   while (checkInventory().getItems(cooker.dough).length < cookno) {
      if (cooker.water == true) getWaterFromBarrel();
      jCraftItem(true);
      jWaitProgress(actionTimeout);
      jSleep(500);
      dropFromCursor(1);
      drinkWater(30);
   }
   jToConsole("End Of Crafting");
   
   var inventory = checkInventory();
   
   var outtype = takeItemsToContainers (cooker.dough, outtype, outtypewindow);
}   
}

mainBaker();


Auto Butcher:

Code: Select all
//#! name = Butcherer
//#! uniq = arcanist_butcher
//#! icon = gfx/invobjs/meat-cow
// Globals
include("jBotAPIArcanist");
include("jBotAPI");
include("pathfinder");
var inventory = checkInventory();
//var cupb = jGetObjects(35, jCoord(0, 0), ["cupboard"]);
var corpse = jGetObjects(35, jCoord(0, 0), ["cdv"]);

function mainbutcher(list, listwindow) {
var i = 0;
   
   
   while ( i < corpse.length) {
      
         jPFMoveOffset_LX(corpse[i].position(), 1);
         waitPFEndMove();
         jSleep(1000);
         while (jIsMoving() || jMyCoords().dist(corpse[i].position()) > 11) jSleep(500);
         jDoClick(corpse[i].getID(),3,0);
         jWaitPopup(3000);
         jSelectContextMenu("Butcher");
         while (checkInventory().freeSlots() > 2 && corpse[i].blob(0) == 2) jSleep(500);
         jMoveStep(jCoord(0, 0));
         if (corpse[i].blob(0) == 4) {
            jDoClick(corpse[i].getID(),3,0);
            jWaitPopup(3000);
            jSelectContextMenu("Collect Bones");
            jWaitProgress(actionTimeout);
         }
         jSleep(500);
         dropFromCursor(1);
         drinkWater(30);
      
   list = takeItemsToContainers (["intestines", "meat", "bone"] , list, listwindow);
   if (!corpse[i].isActual()) i++;
   }
   
}

function intro() {
   jDropLastWindow();
   var blist = ["Cupboards", "Large Chests", "Exit"];
   var selectWindow = jGUIWindow(jCoord(250, 250), jCoord(110, blist.length * 25 + 15), "Select Out Type");
   var label = jGUILabel(selectWindow, jCoord(5, 5), "Select food type:");
   for(var i = 0; i < blist.length; i++)
      jGUIButton(selectWindow, jCoord(5, 25 + i*25),  100, blist[i]);
   selectWindow.toggleCloseButton();
   var btext = selectWindow.waitButtonClick();
   if(btext == blist[0]) {var list = jGetObjects(15, jCoord(0, 0), ["cupboard"]); var listwindow = "Cupboard"; }
   if(btext == blist[1]) {var list = selectMultiple("lchest", "chests"); var listwindow = "Chest";}
   if(btext == blist[blist.length - 1]) {selectWindow.destroy(); return;}
   selectWindow.destroy();
   mainbutcher(list, listwindow);
}

intro();


Nuggify!

Code: Select all
//#! name = Nuggeter
//#! uniq = arcanist_nuggs
//#! icon = gfx/invobjs/nugget-metal
// Globals
include("jBotAPI");
include("pathfinder");
var inventory = checkInventory();
//var cupb = jGetObjects(35, jCoord(0, 0), ["cupboard"]);
//var corpse = jGetObjects(35, jCoord(0, 0), ["cdv"]);

function fillcrucible(){
if (jGetWindow("Crucible").getMeterValue(1) < 6){
       var coal = checkInventory().getItems("coal");
         coal[0].take();
         jWaitDrag();
       alloyer = findObjectbyBLOB("alloyer", 0,0,0,0);
         alloyer.interactClick(0);
         jSleep(1000);
   }
   while (!jGetWindow("Crucible")){
      alloyer = findObjectbyBLOB("alloyer", 0,0,0,0);
      //jPFMoveOffset_LX(alloyer.position(), 1);
      //waitPFEndMove();
      jDoClick(alloyer.getID(),3,0);
      jSleep(1500);
   }
   jGetWindow("Crucible").pushButton("Light");


}

function mainnuggeter(list, listwindow) {
while(1) {
var i = 0;
   while (!jGetWindow("Crucible")){
      alloyer = findObjectbyBLOB("alloyer", 0,0,0,0);
      jPFMoveOffset_LX(alloyer.position(), 1);
      waitPFEndMove();
      var player_pos = jMyCoords();
      jDoClick(alloyer.getID(),3,0);
      jSleep(1500);
   }
fillcrucible();
   if(jGetWindow("Crucible")) {
   if (checkInventory().freeSlots() >=10) {
   jGetWindow("Crucible").pushButton("Light");
   jSendDoubleAction("craft", "nuggify");
   jWaitCraft();
   while (checkInventory().freeSlots() > 10) {
   jSleep(500);
      jCraftItem(true);
      while (jHaveHourglass () && checkInventory().freeSlots() > 10) jSleep(500)
     fillcrucible();
      dropFromCursor(1);
      drinkWater(30);
      }
   jAbsClick(player_pos, 1, 0);
   jSleep(1000);
   }
   list = takeItemsToContainers (["nugget"] , list, listwindow);
   
   }
}
}

function intro() {
   jDropLastWindow();
   var blist = ["Cupboards", "Large Chests", "Exit"];
   var selectWindow = jGUIWindow(jCoord(250, 250), jCoord(110, blist.length * 25 + 15), "Select Out Type");
   var label = jGUILabel(selectWindow, jCoord(5, 5), "Select food type:");
   for(var i = 0; i < blist.length; i++)
      jGUIButton(selectWindow, jCoord(5, 25 + i*25),  100, blist[i]);
   selectWindow.toggleCloseButton();
   var btext = selectWindow.waitButtonClick();
   if(btext == blist[0]) {var list = selectMultiple("cupboard", "Nugg Cubbs");
   if (list == null) var list = jGetObjects(15, jCoord(0, 0), ["cupboard"]); var listwindow = "Cupboard"; }
   if(btext == blist[1]) {var list = jGetObjects(15, jCoord(0, 0), ["lchest"]); var listwindow = "Chest";}
   if(btext == blist[blist.length - 1]) {selectWindow.destroy(); return;}
   selectWindow.destroy();
   mainnuggeter(list, listwindow);
}


intro();
Last edited by Arcanist on Mon Aug 25, 2014 9:12 am, edited 2 times in total.
User avatar
Arcanist
 
Posts: 2664
Joined: Mon Mar 19, 2012 2:01 pm

Re: Union Client Scripts

Postby Mernil » Tue Aug 19, 2014 9:16 am

Please Union developer build some retro-compatibility in.
That's so bad to have to rewrite every script at each new version.

For instance, in previous versions, there was a function called jObjectBLOB which would return the blob.
Now, this function doesn't exist anymore so any call to it will crash the scripts.
Instead you've added a method : "blob()" in jGob class.

What'd be nice would be to keep that kind of function, and edit it to something like that :

Code: Select all
function jObjectBLOB(object, index){
   log_warning("jObjectBLOB is deprecated, use object.blob(index) instead.");
     return object.blob(index);
}
function log_warning(txt){
   sayArea("[!] Warning, "+txt); //log that the function is deprecated when it's called.
}


This way, all scripts will continue working whatever the current version of union is, and conscientious devs will be able to update their script easily.
User avatar
Mernil
 
Posts: 133
Joined: Tue Jul 29, 2014 9:54 pm

Re: Union Client Scripts

Postby Arcanist » Tue Aug 19, 2014 9:22 am

I agree.
My scripts work for 7.2c
7.2d has some funky bot engine, I recommend not to use it.
User avatar
Arcanist
 
Posts: 2664
Joined: Mon Mar 19, 2012 2:01 pm

Re: Union Client Scripts

Postby Mernil » Tue Aug 19, 2014 10:36 am

So, I'm trying to craft a bot that would basically play HnH as a wanderer (basically : no big building) without human interaction :D

First thing first I need to get out of the creation room.

So I change beliefs 1 time to 'peaceful'.
I change the character gender randomly.

Now I'm speaking with Germania to get a name, though I have trouble clicking the "gen" button. And I don't know how I'll press "enter" to validate the name neither...

Any help on how to interact with these particular windows would be welcome, and a sample of code would be awesome.

My code yet :

Code: Select all
//#! tooltip = Survivor
//#! name = Survivor
//#! uniq = 0000000-000000-000000-000000-SURVIV

include("jBotAPI");

function Survivor(){
   
   //Initialisation
   //Character just created, have to get its stuff, his name, and get out of creation room.
   this.init = function(){
   
      jBuyBelief("martial", 1); //Slide one time to peaceful
   
      gender_npc = jFindObjectByName('npcs/surg',5000);
      name_npc = jFindObjectByName('npcs/germania',5000);
      port_npc = jFindObjectByName('npcs/sherlock',5000);
      
      //************** Get a gender ***************//
      if(!gender_npc){
         return; //Character not in the creation room anymore
      }
      merl_tools.PFto(gender_npc);
      random_gender = Math.floor((Math.random() * 2)+1); //number of clicks on NPC.
      for(var i = 0; i < random_gender; i++){
         gender_npc.doClick(3,0);
         jSleep(500);
      }      
      //************** Get a name ***************//
      merl_tools.PFto(name_npc);
      name_npc.doClick(3,0);
      while(!jHaveWindow("Change Name")) jSleep(100);
      
      
   
   }
}


var merl_tools = new function(){
   this.dump = function(object){ //dump text to screen
      name = '';
      try{
         name = object.name();
      }catch(e){}
      id = '';
      try{
         id = object.getID();
      }catch(e){}
      
      sayArea(object + ' - ' + name + ' - ' + id);
      jSleep(2000);
   },
   
   this.PFto = function(item){ //move to item position using path-finding
      jAbsClick(item.position(), 1, 0);
      jSleep(500);
      jWaitEndMove(50000);

      jPFClick(item.getID());
      
      old_distance = 9999999999;
      distance = 0;
      while(distance + 1 < old_distance){      
         old_distance = jMyCoords().dist(item.position());
         item.doClick(1,0);
         jPFClick(item.getID());
         jSleep(2500);
         distance = jMyCoords().dist(item.position());
      }
      
      jClosePopup();
      
      if(distance > 20){
         sayArea("I can't reach this place :(");
         return false;
      }else{
         return true;
      }
   },
   
   this.getClosestObjectByName = function(object_name){
      var objects = jGetObjects(5000, jCoord(0,0), object_name);
      min_distance = 9999999999;
      current_object = false;
      for(var i = 0; i < objects.length; i++){
         distance = objects[i].position().dist(jMyCoords());
         if(distance < min_distance){
            min_distance = distance;
            current_object = objects[i];
         }
      }
      return current_object;
   }
}



survivor = new Survivor();
survivor.init();
User avatar
Mernil
 
Posts: 133
Joined: Tue Jul 29, 2014 9:54 pm

Re: Union Client Scripts

Postby Arcanist » Wed Aug 20, 2014 3:48 am

Try

jGetWindow("Change Name").pushButton("Gen");

This script was also written by usernm

Will press enter (the script can not do it)


Looks like he didn't get it to press enter either.

http://www.havenandhearth.ru/viewtopic.php?f=17&t=1524
User avatar
Arcanist
 
Posts: 2664
Joined: Mon Mar 19, 2012 2:01 pm

Re: Union Client Scripts

Postby Zarxes » Sun Aug 24, 2014 9:47 pm

Hi, first thanks for releasing your bots, but i got a problem with the Crafter bot (using union 7.2c ) . After selecting the Cupboards (crafting boar baloney) and then clicking onto the ground the script stops and i get the following error.

Image

Do you maybe have any idea how i might be able to fix this?

skype: zarxes007
Zarxes
 
Posts: 143
Joined: Mon Feb 21, 2011 6:06 pm

Re: Union Client Scripts

Postby Arcanist » Sun Aug 24, 2014 10:56 pm

It looks like you didn't save the API that I posted correctly.
User avatar
Arcanist
 
Posts: 2664
Joined: Mon Mar 19, 2012 2:01 pm

Re: Union Client Scripts

Postby Zarxes » Sun Aug 24, 2014 11:51 pm

Well i did but ill double check again. Shouldnt opencupboard be defined or mentioned in some kind of way in that api? Because in the one you posted, it isnt.
Zarxes
 
Posts: 143
Joined: Mon Feb 21, 2011 6:06 pm

Re: Union Client Scripts

Postby Arcanist » Sun Aug 24, 2014 11:54 pm

Oh, I must have not selected it when I uploaded the script. sorry about that, I'll fix it when I get home tonight
User avatar
Arcanist
 
Posts: 2664
Joined: Mon Mar 19, 2012 2:01 pm

Re: Union Client Scripts

Postby Zarxes » Sun Aug 24, 2014 11:59 pm

Also the jbotapitalon does not exist in my script folder - im really no expert on this,but from what i deduced this is like a library of commands right? So if the bot includes that api i need it right?

Edit: Also, thanks for answering/helping
Zarxes
 
Posts: 143
Joined: Mon Feb 21, 2011 6:06 pm

PreviousNext

Return to The Wizards' Tower

Who is online

Users browsing this forum: Amazon [Bot], Claude [Bot] and 1 guest