function evaluateXPath(aNode, aExpr) {
var xpe = new XPathEvaluator();
var nsResolver = xpe.createNSResolver(aNode.ownerDocument == null ? aNode.documentElement : aNode.ownerDocument.documentElement);
var result = xpe.evaluate(aExpr, aNode, nsResolver, 0, null);
var found = [];
var res;
while (res = result.iterateNext())
found.push(res);
return found;
}
function init() {
var xpath = "/html/body/div[3]/div[3]/table/tbody/tr/td[2]/table/tbody/tr/td[2]/a";
var xp = evaluateXPath(document.body, xpath);
//* automate pyramids
//* Add DOM elements to control tool and view debug output
//* Use AJAX for more fluid execution of tasks
//* Use setTimeout throttling to prevent server punishment
//* Allow resident execution
function init() {
//window.setTimeout(null, 2000);
//* Ask if the user wants to run this tool
//if(confirm("Want to run?")) {
launchDebugWindow();
//} else {
// return false;
//}
var stackCard;
var activeCards;
var ajaxObject = getAjaxObject();
var index = isIndexPage();
var inProgress = false; //gameInProgress();
var neopoints = currentNeoPoints();
//* Are we on the index page?
if(index) {
//* If so, is there another game already in progress?
if(inProgress) {
//* Ask if the user wants to resume this game
if(confirm("Do you want to resume your current game?")) {
window.location = "http://www.neopets.com/games/pyramids/pyramids.phtml";
return false;
}
//* or ask if they want to start a new game
else {
if(confirm("Do you want to start a new game?")) {
//* Check if there is enough NP to play a game
if(neopoints < 50) {
debug("Not enough NP to play");
return false;
}
else {
debug("Enough NP to play, cancelling existing game and starting new game...");
if(cancelGame(ajaxObject)) {
debug("Cancel successful, reloading index...");
window.location.reload();
}
else {
debug("Problem cancelling game, exiting...");
return false;
}
}
}
else {
//* User does not want to resume game or start new game
debug("Doing nothing...");
return false;
}
}
}
else {
//* We're on the index page but no game has been started
//* Check if there is enough NP to play a game
if(neopoints < 50) {
debug("Not enough NP to play");
return false;
}
else {
debug("Enough NP to play, starting game...");
startGame();
}
}
}
//* Use some logic to determine if there is a +1 advantage to using the available active cards
}
function inGame(skipStack, ajaxObject, neopoints) {
//* We're in the game
//* Get stack card
if(!skipStack) {
stackCard = getStackCard();
if(!stackCard) {
debug("<b>stackCard is false, getting last card...</b>");
stackCard = getLastCard();
if(!stackCard) {
debug("getLastCard failed...");
//return false;
}
}
else {
debug("<b>stackCard returned non-false, value is: " + stackCard + "</b>");
if(stackCard !== parseInt(stackCard,10)) {
debug("<b>stackCard is a usable number</b>");
}
else {
debug("<b>stackCard was not a usable number, exiting...</b>");
return false;
}
}
} else {
//stackCard = getLastCard();
}
//* Get active cards
activeCards = getActiveCards();
//* Create array of active cards that are 1 higher or lower than the current stack card
usableCards = getUsableActiveCards(activeCards, stackCard, 1);
if(usableCards != false) {
//* Are there any usable cards?
if(usableCards.length > 0) {
//debug(usableCards.length + " usable cards.");
//* We have usable cards. take first usable card and submit action...
//debug("Performing action on card " + usableCards[0]);
window.location = usableCards[0];
//* Card has been played, detect card score, total score, restart
//* We have usable cards, detect which of the available have + 1 chain advantages
return false;
}
}
else {
debug("<b>No usable cards detected!</b>");
debug("<b>Checking if game is over...</b>");
//* Check if game is over
var g = gameIsOver();
if(g) {
debug("Game is over, collect winnings...");
var winnings = collectWinnings(ajaxObject);
if(winnings == false) {
debug("<br /><br /><br /><font size='16'>DANGER WILL ROBINSON DANGER! YOU DID NOT GET YOUR MEASLEY WINNINGS!<br /><br /><br />");
}
else {
debug("<b>Winnings collected...</b>");
var bank = depositNP(neopoints);
if(!bank) {
debug("<b>Problem depositing neopoints...</b>");
}
else {
debug("<b>"+neopoints+"</b> deposited");
}
//window.location = "http://www.neopets.com/games/pyramids/index.phtml";
}
return false;
}
//* Check if on last card
debug("<b>Checking if on last card...</b>");
var lastCard = isLastCard();
if(!lastCard) {
debug("<b>Not on the last card, setting current stackCard '"+stackCard+"' as last card...</b>");
var set = setLastCard(stackCard);
if(!set) {
debug("<b>Failed to set stackCard. exiting...</b>");
}
//* No usable cards. attempt to draw...
debug("No usable cards, attempting draw...");
window.location = "http://www.neopets.com/games/pyramids/pyramids.phtml?action=draw";
}
debug("<b>On last card, ...</b>");
if(skipStack == true) {
stackCard = getLastCard();
debug("<b>skipStack true, exiting...</b>");
return false;
}
else {
inGame(true, ajaxObject);
return false;
}
}
}
function isLastCard() {
//debug("<b>Checking for empty.gif...</b>");
var t = "empty.gif";
var d = document.body.innerHTML;
if(d.indexOf(t) != -1) {
debug("<b>empty.gif was found in document.body.innerHTML");
return true;
}
else {
debug("<b>emtpy.gif was NOT found in document.body.innerHTML");
return false;
}
}
function startGame() {
//debug("Starting game...");
var d = document;
var f = d.forms;
var z = f[1];
z.submit();
}
function evaluateXPath(aNode, aExpr) {
var xpe = new XPathEvaluator();
var nsResolver = xpe.createNSResolver(aNode.ownerDocument == null ? aNode.documentElement : aNode.ownerDocument.documentElement);
var result = xpe.evaluate(aExpr, aNode, nsResolver, 0, null);
var found = [];
var res;
while (res = result.iterateNext())
found.push(res);
return found;
}
function getStackCard() {
debug("getStackCard called");
var xpath4 = "/html/body/div[4]/div[3]/table/tbody/tr/td[2]/div[2]/div/div[2]/center/table/tbody/tr[2]/td/table/tbody/tr/td/img";
var xpath = "/html/body/div[3]/div[3]/table/tbody/tr/td[2]/div[2]/div/div[2]/center/table/tbody/tr[2]/td/table/tbody/tr/td/img";
var xpath5 = "/html/body/div[3]/div[3]/table/tbody/tr/td[2]/div[2]/div/div[2]/center/table/tbody/tr[2]/td/table/tbody/tr/td/img[2]";
var xpath2 = "/html/body/div[3]/div[3]/table/tbody/tr/td[2]/div[2]/div/div[2]/center/table/tbody/tr[2]/td/table/tbody/tr/td/img[2]";
var xpath3 = "/html/body/div[3]/div[3]/table/tbody/tr/td[2]/div[2]/div/div[2]/center/table/tbody/tr[2]/td/table/tbody/tr/td/img";
function getActiveCards() {
debug("getActiveCards called");
var currentCard;
var activeCardArray = new Array();
var currentCardArray;
var currentActiveCardValue;
var xpath = "/html/body/div[3]/div[3]/table/tbody/tr/td[2]/div[2]/div/div[2]/center/table/tbody/tr[2]/td/table/tbody/tr[2]/td/center/table/tbody/tr";
for(var z = 7; z >= 1; z--) {
var xp = xpath + "["+z+"]/td/a/img";
var activeCards = evaluateXPath(document.body, xp);
// debug(xp);
//debug("Nodes found in xpath: " + activeCards.length);
for (var i = 0; i < activeCards.length; i++) {
currentCard = activeCards[i];
//debug("Added values to current active card array");
activeCardArray.push(currentCardArray);
//debug("Added array pair to main active card array");
}
}
//debug("<br /><br />Array of value/link pairs created, printing...");
for(var n = 0; n < activeCardArray.length; n++) {
//debug("Current pair: " + activeCardArray[n][0] + " : " + activeCardArray[n][1]);
}
return activeCardArray;
}
function setLastCard(stackCard) {
var c_name = "lastCard";
var value = stackCard;
var expiredays = 3;
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
function getLastCard()
{
var xpath = "/html/body/div[3]/div[3]/table/tbody/tr/td[2]/div[2]/div/div[2]/center/table/tbody/tr[2]/td/table/tbody/tr/td/img[2]";
var nodes = evaluateXPath(document.body, xpath);
var c_name = "lastCard";
if (document.cookie.length>0)
{
c_start=document.cookie.indexOf(c_name + "=");
if (c_start!=-1)
{
c_start=c_start + c_name.length+1;
c_end=document.cookie.indexOf(";",c_start);
if (c_end==-1) c_end=document.cookie.length;
return unescape(document.cookie.substring(c_start,c_end)) ;
}
}
return false;
}
function parseCardValue(cardURL) {
//debug("URL: " + cardURL);
var i = cardURL.lastIndexOf('/');
var n = cardURL.lastIndexOf('_');
var s = cardURL.substring(i+1,n);
return s;
}
function parseLinkPosition(linkURL) {
var i = linkURL.lastIndexOf('&position=');
var n = linkURL.substring(i);
return n;
}
function getActiveCardLink(cardNode) {
var linkURL = cardNode.parentNode.toString();
return linkURL;
}
function getUsableActiveCards(activeCards, stackCard, amount) {
try {
debug("getUsableActiveCards called");
var u = new Array();
var t = 0;
for(var i = 0; i < activeCards.length; i++) {
t = stackCard * 1;
var activeCardValue = activeCards[i][0];
debug("Current comparison: " + stackCard + " vs " + activeCardValue + "(+1 = "+(t+1)+" ; -1 = "+(t-1));
var activeCardURL = activeCards[i][1];
if(activeCardValue == (t + amount) || activeCardValue == (t - amount)) {
debug("Active card '"+ activeCardValue +"' is usable with stack card " + stackCard);
u.push(activeCardURL);
}
else {
if(activeCardValue == 14) {
if(stackCard == 2) {
debug("Active card '"+ activeCardValue +"' is an ace and can be used with a two");
u.push(activeCardURL);
}
}
else {
if(activeCardValue == 2) {
if(stackCard == 14) {
debug("Active card '"+ activeCardValue +"' is a two and can be used with an ace");
u.push(activeCardURL);
}
}
}
}
}