Neopets : Cliffhanger

By w35l3y Last update Oct 8, 2008 — Installed 1,818 times. Daily Installs: 3, 3, 1, 6, 2, 5, 2, 2, 2, 1, 2, 4, 0, 6, 0, 3, 2, 1, 1, 2, 2, 5, 3, 3, 0, 2, 1, 1, 2, 1, 1, 3

There are 3 previous versions of this script.

// ==UserScript==
// @name           Neopets : Cliffhanger
// @namespace      http://gm.wesley.eti.br/neopets
// @description    Plays Chiffhanger as much as possible
// @include        http://www.neopets.com/games/cliffhanger/cliffhanger.phtml
// @include        http://www.neopets.com/games/cliffhanger/cliffhanger.phtml?*
// @include        http://www.neopets.com/games/cliffhanger/process_cliffhanger.phtml
// @include        http://www.neopets.com/games/cliffhanger/process_cliffhanger.phtml?*
// @require        http://www.wesley.eti.br/includes/js/php.js
// @require        http://www.wesley.eti.br/includes/js/php2js.js
// @require        http://gm.wesley.eti.br/gm_default.js
// @require        http://gm.wesley.eti.br/neopets/neopets_default.js
// @require        http://gm.wesley.eti.br/neopets/Cliffhanger/cliffhanger_default.js
// @author         w35l3y
// @email          w35l3y@brasnet.org
// @version        1.0.5
// @copyright      w35l3y 2008
// @license        GNU GPL
// @homepage       http://www.wesley.eti.br
// ==/UserScript==

/**************************************************************************

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

**************************************************************************/

checkForUpdate({
	'file':'http://userscripts.org/scripts/source/28760.user.js',
	'name':'Neopets : Cliffhanger',
	'namespace':'http://gm.wesley.eti.br/neopets',
	'version':'1.0.5'
});

(function(){	// script scope
	var user = {
		interval:GM_getValue('interval',	'5000-9000').split('-').array_map(parseInt,array_fill(0,2,10)),
		language:GM_getValue('language',	''),
		skill:eval(GM_getValue('skill',		'Skill.Hard')),
		play:eval(GM_getValue('play',		'Play.AtOnce')),	// != Play.LetterByLetter
		repeat:GM_getValue('repeat',		10)
	};

	var script = {
		language:Neopets.Language || user.language || "en",
	};

	var nextAction;

	var answers = user.language in Answers && Answers[user.language] || script.language in Answers && Answers[script.language] || Answers["en"];
	if (answers.length)
	{
		var skillLevel = xpath('//form[contains(@action,"process_cliffhanger.phtml")]/input[@name = "game_skill" and @value = "'+user.skill+'"]')[0];
		var current = GM_getValue("current",0);

		if (!!skillLevel)
		{
			if (user.repeat == -1 || current < user.repeat)
			{
				if (user.repeat > 0)
				{
					GM_setValue("current",++current);
				}

				skillLevel.click();
				nextAction = function(){skillLevel.form.submit();};
			}
			else if (current == user.repeat)
			{
				GM_setValue("current",0);
			}
		}
		else
		{
			var pattern = strip_tags(xpath('//tbody/tr/td[@bgcolor="skyblue" and @colspan = "2" and contains(b/text(),"_")]')[0].innerHTML.replace(/<br>/g,'&nbsp;')).replace(/\s+/g,'').replace(/_/g,'\\w').replace(/(?:&nbsp;|<br(?: *\/?)>)/g,' ');
			pattern = new RegExp("^"+pattern.substr(1,pattern.length-4)+"$","gim");

			var x = pattern.exec(answers.join("\n"));
			var t = !!x && x.length || 0;
			if (t > 1)
			{	// there are more than one possible answers

				var availableLetters = xpath('//a[contains(@href,"process_cliffhanger.phtml?choice=")]/b');
				var letters = {};
				var xbreak = false;
				for ( var ia = 0 , ta = availableLetters.length ; ia < ta ; ++ia )
				{
					var item = availableLetters[ia];
					var letter = item.innerHTML;

					letters[letter] = [0,item.parentNode.href];

					for ( var i = 0 ; i < t ; ++i )
					{
						if (x[i].toUpperCase().indexOf(letter.toUpperCase()) > -1)
						{
							++letters[letter][0];
						}
					}
					if (letters[letter][0] == t)
					{
						nextAction = function(){location.replace(letters[letter][1]);};
						xbreak = true;
						break;
					}
				}

				for ( ; !xbreak && --t ; )
				{
					for ( l in letters )
					{
						if (letters[l][0] == t)
						{
							nextAction = function(){location.replace(letters[l][1]);};
							xbreak = true;
							break;
						}
					}
				}

				if (!xbreak)
				{
					alert("No answer was found.");
				}
			}
			else if (t == 1)
			{	// there is only one possible answer

				var txtSolve = xpath('//form[contains(@action,"process_cliffhanger.phtml")]/input[@name = "solve_puzzle"]')[0];
				txtSolve.value = x[0];

				if (user.play & Play.LetterByLetter&~Play.AtOnce)
				{
					var availableLetters = xpath('//a[contains(@href,"process_cliffhanger.phtml?choice=")]/b');
					for ( var ia = 0 , ta = availableLetters.length ; ia < ta ; ++ia )
					{
						var item = availableLetters[ia];
						var letter = item.innerHTML;

						if (x[0].toUpperCase().indexOf(letter.toUpperCase()) > -1)
						{
							nextAction = function(){location.replace(item.parentNode.href);};
							break;
						}
					}
				}

				if (!nextAction && user.play & Play.AtOnce)
				{
					nextAction = function(){txtSolve.form.submit();};
				}
			}
			else
			{	// there is no answer

				alert("No answer was found.");
			}
		}
	}
	else
	{
		alert("No answer is available");
	}

	if (!!nextAction)
	{
		setTimeout(nextAction,randomValue(user.interval));
	}
})();