Sakhmet Solitaire Autoplayer

Sakhmet Solitaire autoplayer - original by sLAUGHTER

Du musst eine Erweiterung wie Tampermonkey, Greasemonkey oder Violentmonkey installieren, um dieses Skript zu installieren.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

Sie müssten eine Skript Manager Erweiterung installieren damit sie dieses Skript installieren können

(Ich habe schon ein Skript Manager, Lass mich es installieren!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name           Sakhmet Solitaire Autoplayer
// @namespace      sLAUGHTER
// @version        2.2
// @description    Sakhmet Solitaire autoplayer - original by sLAUGHTER
// @include        http://www.neopets.com/games/sakhmet_solitaire/*
// @require        https://code.jquery.com/jquery-1.7.1.min.js
// ==/UserScript==

var wait = rand(1100, 1500); // random time between 0.5 sec and 1.1 sec
var madeMove = false;

function rand(low, high) { return low + Math.floor(Math.random() * high); }

if ($('b:contains("OOPS!")').length == 0 && $('div:contains("You have reached the")').length == 0)
	window.setTimeout(autoPlay, wait);
else
    console.log("Hit an error, stop player to prevent loop");


function autoPlay() {
	navigateToGame();
	makeMove();
	if(!madeMove) {
		if(!drawCard())
			endGame();
	}
}

function navigateToGame() {
	if (window.location.pathname == "/games/sakhmet_solitaire/index.phtml" || window.location.pathname == "/games/sakhmet_solitaire/") {
		if(($("[value='Play Sakhmet Solitaire!']")).length > 0) {
			$("[name='game_level'][value=1]").attr("checked", "checked");
			$("[value='Play Sakhmet Solitaire!']").click();
			return false;
		}
		if(($("[value='Continue Playing']")).length > 0) {
			$("[value='Continue Playing']").click();
			return false;
		}
    }

	jQuery.fn.exists = function() { return this.length > 0; };
    if (window.location.pathname == "/games/sakhmet_solitaire/sakhmet_solitaire.phtml") {
        if($("[value='Play Sakhmet Solitaire Again!']").exists()) {
            $("[value='Play Sakhmet Solitaire Again!']").click();
            return false;
        }
    }
}

function processMove(originCard, destinationCard) {
	clickCardImage($(originCard));
	clickCardImage($(destinationCard));
	madeMove = true;
}


function Card(cardImg, urlLocation) {
	card = cardImg.attr(urlLocation);

	var colors = {
		"spades": "black",
		"clubs": "black",
		"hearts": "red",
		"diamonds": "red"
	};

	if (card == undefined) {
		return false;
	}

	card = card.replace("http://images.neopets.com/games/mcards/", "");
	card = card.replace(".gif", "");
	this.img = cardImg;
	this.urlLocation = urlLocation;
	this.num = parseInt(card.substr(0, card.indexOf("_"))) | 0;
	this.suit = card.substr(card.indexOf("_") + 1);
	this.suitcolor = colors[card.substr(card.indexOf("_") + 1)];

	if(cardImg.parent().attr("onclick").indexOf("stack_0") != -1)
		this.isDrawnCard = true;
	else
		this.isDrawnCard = false;
}

function isMovePossible(origin, destination) {
	if (destination.num == 14) {
		return false;
	}
	if (origin.num == destination.num - 1 && origin.suitcolor != destination.suitcolor && !destination.isDrawnCard) {
		return true;
	}
	return false;
}

function makeMove() {
	var drawnCardImg = $("a[onclick*='stack_0']").find("img");
    var drawnCard = new Card($(drawnCardImg), "id");

	if(processCardPiles(drawnCard))
		return true;
	if(processFreeingMoves(drawnCard))
		return true;
    if(consolidatePiles())
		return true;

	return false;
}

function processCardPiles(drawnCard) {
	var cardPiles = $("td").find("img.deckcards[name]:last");

	$.each(cardPiles, function(key, value) {
		currentCard = new Card($(value), "src");

		if (moveCardToPile(drawnCard, currentCard))
			return false;
		if(processFreeingMoves(currentCard))
			return false;
    });

	return madeMove;
}

function moveCardToPile(originCard, destinationCard) {
	if (isMovePossible(originCard, destinationCard)) {
		console.log("mDCTP - " + originCard.num + originCard.suit + " to " + destinationCard.num + destinationCard.suit);
		processMove(originCard.img, destinationCard.img);
		return true;
	}
	return false;
}


function processFreeingMoves(card) {
	if(moveAceToAcePile(card))
		return true;
	if(moveKingToEmptyPile(card))
		return true;
	if(moveCardToAcePile(card))
		return true;

	return false;
}

function moveAceToAcePile(card) {
	currentCardImg = card.img;
	if (card.num == 14) {
		console.log("mATAP - " + card.num + card.suit + " to open ace pile");
		processMove(currentCardImg, $($("img[src*='new_open']")[0]));
		return true;
	}
	return false;
}

function moveKingToEmptyPile(card) {
	currentCardImg = card.img;
	if (card.num == 13 && $("img[src*='new_blank_card']").length > 0 && $("img[src*='new_blank_card']").parent().prop("tagName") == "A") {
		if(currentCardImg.closest("div").find("img:first").attr("src").indexOf("pyramid") != -1) { 
			console.log("mKTEP - " + card.num + card.suit + " to empty card pile");
			processMove(currentCardImg, $($("img[src*='new_blank_card']")[0]));
			return true;
		}
	}
	return false;
}

function moveCardToAcePile(card) {
	var cardImg = card.img;
	var find_ace = $("a[onclick*='base_']").find("img[src*='/" + getPreviousCardNum(card.num) + "_" + card.suit + "']");
	if (find_ace.length != 0) {
		console.log("mCTAP - " + card.num + card.suit + " to corresponding ace pile");
		processMove(cardImg, find_ace);
		return true;
	}
	return false;
}

function consolidatePiles() {
	var pileTopCards = $("td").find("img.deckcards[name]:first");

	$.each(pileTopCards, function(key, value) {
		var currentTopCard = new Card($(value), "src");

		if(moveKingToEmptyPile(currentTopCard))
			return false;

		if(movePileToPile(currentTopCard))
			return false;
	});

	return madeMove;
}

function movePileToPile(originCard) {

	var pileCards = $("td").find("img.deckcards[name]:last");
	$.each(pileCards, function(kee, val) {
		destinationCard = new Card($(val), "src");
		if(moveCardToPile(originCard, destinationCard))
			return false;
	});

	return madeMove;
}

function getPreviousCardNum(num) {
	num -= 1;
	if (num == 1) {
		return 14;
	}
	return num;
}

function clickCardImage(card) {
	card.click();
}

function drawCard() {
	if($($("a[href*='action=draw']").children()[0]).exists()) {
		$($("a[href*='action=draw']").children()[0]).click();
		return true;
	}
	return false;
}

function endGame() {
	if($("img[src*='new_empty']").exists() || $("body").html().indexOf("to collect your points!") != -1) {
		$("form[name='sakhmet_collect']").removeAttr("onsubmit").submit();
	}
}