Greasemonkey

Talk about the game. What game? The game with the power? What power? The power of ... aw, skip it.

Moderator: Moderators

User avatar
Hannahmaus
Posts: 119
Joined: Mon Jun 02, 2008 11:28 am
Contact:

Post by Hannahmaus »

It looks right except the TAG POS=2 at the start. My iMacros casts the 2 gadgeteer self-casts and MD, and has TAG POS=1 on each line, even though the MD control appears to be the 2nd element in the frame. Maybe change the 2 to a 1 and see what it does.

I guess you'll have tried re-recording the macro; maybe try re-recording it and casting the buffs in a different order (self-casts then buff).
User avatar
MagiNinjA
Posts: 1466
Joined: Thu Sep 06, 2007 10:56 pm
Location: Berkeley when at school, San Diego when at home
Contact:

Post by MagiNinjA »

Hmm. This is sorta weird. Right now I have it set to cast Bio and then the others, but it just casts Bio once and casts Vim 7 times and then ends. It seems impossible to make it cast multiple auras.

I'd like to reinstate my request for a skill macro script. :/

EDIT: This is with TAG POS=1 like you did. So.
User avatar
Hannahmaus
Posts: 119
Joined: Mon Jun 02, 2008 11:28 am
Contact:

Post by Hannahmaus »

The casting only 1 of 1 of the buffs makes me think it's confused about which input box is which and putting the number in the wrong 1, and the non-casting of the 2 others is... mysterious. If you record a macro with only 1 cast of each buff, does it work? Just a thought.
Muhandes
Posts: 732
Joined: Mon Nov 03, 2008 12:54 am
Contact:

Re: Greasemonkey

Post by Muhandes »

Someone suggested it add chat, so I tried to write a script that adds a link to the MD in the top pane. I totally stole the Rest link script. But still, the problem is, it includes user ID and I can't find a way to get that from the top pane, and I don't know enough to get it from another pane.
Anyway, if you don't mind kludging around here it is, just change the ID to your ID.

Edit: I created a script that solves this problem. See here

Code: Select all

// ==UserScript==
// @name	MD Link
// @namespace	http://www.twilightheroes.com/forums/
// @description	Adds a link to MD after the link to Full Inventory.
// @include	*twilightheroes.com/header.php
// ==/UserScript==

for (var i = 0; i < document.getElementsByTagName('a').length; i++) {
	if (document.getElementsByTagName('a')[i].href.indexOf("inventory.php") != -1) {
		var inventoryLink = document.getElementsByTagName('a')[i];
	}
}

var addLinks = document.createElement('a');
addLinks.href = "memento-show.php?charid=14240";
addLinks.style.color = "#CCCCCC";
addLinks.target = "main";
addLinks.innerHTML = "MD";

var spacer = document.createTextNode(' - ');

inventoryLink .parentNode.insertBefore(addLinks, inventoryLink .nextSibling);
inventoryLink .parentNode.insertBefore(spacer, inventoryLink.nextSibling);
Last edited by Muhandes on Thu Nov 19, 2009 9:03 am, edited 1 time in total.
User avatar
MagiNinjA
Posts: 1466
Joined: Thu Sep 06, 2007 10:56 pm
Location: Berkeley when at school, San Diego when at home
Contact:

Re: Greasemonkey

Post by MagiNinjA »

Not sure if ClownHammer and Co. is still around, but, if there was a way to have monster specific actions, that'd be great. So like if I met a gangster in red, maybe I'd use a spell instead. And if I can't, then just attack or something. I primarily want it so I can use items on specific monsters.
Muhandes
Posts: 732
Joined: Mon Nov 03, 2008 12:54 am
Contact:

Re: Greasemonkey

Post by Muhandes »

Is there anyone around here that can still help writing scripts? There are some simple things I would like to add to Continuous Attack which will make it a valuable spading tool.
For instance, I noticed it already differentiates between combat and non-combat adventures, so just keeping tag of how many times each was encountered would be very helpful.
Satan
Posts: 1855
Joined: Mon Nov 19, 2007 6:29 pm
Location: Florida
Contact:

Re: Greasemonkey

Post by Satan »

He wants to know how many of each encounter (combat or not) he gets. Like, each enemy/non-com shows up and says encountered x times. For percentage stuffs.
Muhandes
Posts: 732
Joined: Mon Nov 03, 2008 12:54 am
Contact:

Re: Greasemonkey

Post by Muhandes »

Of course, I want EVERYTHING. But starting from simple to more complicated, each step would be useful on its own.

1. A simple counter of combat/non-combat. I looked at the code and this is already detected and there are empty if clauses where I could increment the counters. But since I have zero experience in javascript I don't know how to display these counters. I don't mind any reasonable solution for where/how they are displayed and where/how to reset them.
2. Find the exact adventure and displaying counters how many times each occur. For non-combats this shouldn't be too hard as the adventure name can serve as key. For combats everything after "You are fighting" can serve as key.
3. For each adventure, displaying item and chip drop statistics. This will probably require much more work parsing the drops.

As mentioned above, even step 1, which I could implement if I knew how to display things, would start the usefulness of this as a spading tool.
Satan
Posts: 1855
Joined: Mon Nov 19, 2007 6:29 pm
Location: Florida
Contact:

Re: Greasemonkey

Post by Satan »

This would be much more easily done in a bot like in perl or php... JS kinda sucks... But overall the methods aren't that dissimilar in any of the languages, you've just got language limitations to deal with in JS. Technically, with a few modifications, the phpbot can already do what you want it to do. But the phpbot's got several bugs in it, so >.>
Muhandes
Posts: 732
Joined: Mon Nov 03, 2008 12:54 am
Contact:

Re: Greasemonkey

Post by Muhandes »

Satan wrote:This would be much more easily done in a bot like in perl or php... JS kinda sucks... But overall the methods aren't that dissimilar in any of the languages, you've just got language limitations to deal with in JS. Technically, with a few modifications, the phpbot can already do what you want it to do. But the phpbot's got several bugs in it, so >.>
One problem is that the phpbot is non-interactive. In many cases I see a problem in the spade run very early and I can stop it before 300 turns are wasted. At the current turn/day this is an issue. Perhaps it can be made more verbose and more interactive?
Then there is the issue of the bugs you mentioned.
I am also a bit worried about sending my password, though this might be just lack of knowledge of how it is done.

Bottom line, I don't really mind if the tool is JS or phpbot, as long as it does what is required.

Edit: After posting this I realized one other problem. The code for phpbot isn't open. Would you be willing to reveal it?
Satan
Posts: 1855
Joined: Mon Nov 19, 2007 6:29 pm
Location: Florida
Contact:

Re: Greasemonkey

Post by Satan »

Muhandes wrote:
Satan wrote:This would be much more easily done in a bot like in perl or php... JS kinda sucks... But overall the methods aren't that dissimilar in any of the languages, you've just got language limitations to deal with in JS. Technically, with a few modifications, the phpbot can already do what you want it to do. But the phpbot's got several bugs in it, so >.>
One problem is that the phpbot is non-interactive. In many cases I see a problem in the spade run very early and I can stop it before 300 turns are wasted. At the current turn/day this is an issue. Perhaps it can be made more verbose and more interactive?
Then there is the issue of the bugs you mentioned.
I am also a bit worried about sending my password, though this might be just lack of knowledge of how it is done.

Bottom line, I don't really mind if the tool is JS or phpbot, as long as it does what is required.

Edit: After posting this I realized one other problem. The code for phpbot isn't open. Would you be willing to reveal it?
You don't need to worry about sending the password. The password isn't stored, it's forwarded directly from my server to Ryme's for login, so no one sees it. As for making the phpbot code open, can't do that. It has code for IP tracking measures and the quest stuff, which is part of my agreement with Ryme to have it available for other players. If it was open, other people could just host it themselves and remove those parts rather easily.
User avatar
neocamp22
Posts: 477
Joined: Sat Apr 07, 2007 6:48 pm
Location: Also Through The Dimensional Gate
Contact:

Re: Greasemonkey

Post by neocamp22 »

Counting how many times you get each adventure and how many time you get each item is very similar codewise. However, I don't think anyone has even begun doing either of those two things for phpbot. I might be willing to take a look this week. Sate, please send me the code when you've got a sec.

Combat and non-combat is much easier to do, and I think I could easily add it in if I can get a copy of the current code from Sate (actually, he could probably do it in the time it would take him to send the code to me and then take my code and update the site).
Image
Satan
Posts: 1855
Joined: Mon Nov 19, 2007 6:29 pm
Location: Florida
Contact:

Re: Greasemonkey

Post by Satan »

When we renovated Olaf's phpbot code, I added in item tracking. Although I should probably make a separate array for tracking by encounter. Probably can do that via the array we'd have to make for tracking encounters, so no big deal, either. I'll send the code as soon as I remember your email address >.>
Harry Dresden
Posts: 1395
Joined: Tue Feb 12, 2008 1:22 pm
Contact:

Re: Greasemonkey

Post by Harry Dresden »

Anyone know how to edit the autoattack script so that it can throw a star before attacking to death?
User avatar
MagiNinjA
Posts: 1466
Joined: Thu Sep 06, 2007 10:56 pm
Location: Berkeley when at school, San Diego when at home
Contact:

Re: Greasemonkey

Post by MagiNinjA »

My request would fulfill yours, for sure.
User avatar
Cristiona
Posts: 5116
Joined: Sun Apr 08, 2007 1:01 am
Location: the Conservatory with the lead pipe
Contact:

Re: Greasemonkey

Post by Cristiona »

I have a working copy. Possibly messy as hell, but here you go:

Code: Select all

// ==UserScript==
// @name           Twilight Heros Adventure Script
// @namespace      www.twilightheroes.com
// @description    Autoadventureing for TH. 
// @include        http://www.twilightheroes.com/fight.php*
// ==/UserScript==

function Select_Value_Set(SelectName, Value) {
  var SelectObject = document.getElementById(SelectName);
  for(index = 0; 
    index < SelectObject.length; 
    index++) {
   if(SelectObject[index].value == Value)
     SelectObject.selectedIndex = index;
   }
}

function Select_Value_Set_Name(SelectName,which, Value) {
  var SelectObject = document.getElementsByName(SelectName)[which];
  var found = false;
  for(index = 0; 
    index < SelectObject.length; 
    index++) {
   if(SelectObject[index].value == Value)
     SelectObject.selectedIndex = index;
     found = true;
   }
   return found;
}

function generateStratList () {
	var stratList = new Array();
	//List of attack types, any string Specification string. Each attack is seperated by a semicolon and if there is a skill use the id follows the S. 
	//A = normal attack
	//S:ID = use a skill with the appropriate ID following the colon
	//IS:ID = perform the attack a specific number of times and then just use attack. Right now IS must be the only option if its being used so you can't 
	// 	put something like 'IS:152;A;IS:133' since you wouldn't know which IS block 
	stratList['TK To Death'] = 'S:153';
	stratList['Attack then TK To Death'] = 'A;S:153';
	stratList['MJ to Death'] = 'S:156';
	stratList['PB, Mj to Death'] = 'S:163;S:156';
	stratList['Telek for '] = 'IS:153';
	stratList['MindJab for '] = 'IS:156';
	stratList['Psionic Blast for '] = 'IS:163';
	stratList['Stun Gas for '] = 'IS:101';
	stratList['Bovine Charge for '] = 'IS:52';
	stratList['Electric Net for '] = 'IS:109';
	stratList['Firestorm for '] = 'IS:12';
	stratList['Groundquake for '] = 'IS:4';
	stratList['Ice Bolt for '] = 'IS:3';
	stratList['Lightning Bolt for '] = 'IS:6';
	stratList['Shock Grenade for '] = 'IS:113';
	stratList['Throw Sparks for '] = 'IS:1';
	stratList['Tornadoe for '] = 'IS:9';
	stratList['Rhino Trample for '] = 'IS:60';
	
	var htmlStrat = '\n<SELECT id="Strat" onchange="updateAttackControls();">';
	htmlStrat += '<OPTION VALUE="A">Attack Only</OPTION>';
	for (keys in stratList) {
		htmlStrat += '<OPTION VALUE="'+stratList[keys]+'">'+keys+'</OPTION>';
	}
	
	htmlStrat += '</SELECT>';
	htmlStrat += '\n<script>function updateAttackControls() {					'+
		'\nvar strat = document.getElementById(\'Strat\');			'+
		'\nvar actionstuff = strat[strat.selectedIndex].value.split(\';\');	'+
		'\nvar possible = actionstuff[0].split(\':\');			'+
		'\nif (possible[0] == \'IS\') {					'+
		'\n	document.getElementById(\'control\').innerHTML = \'<input type="text" maxlength="5" size="2" id="maxAttacks"> rounds then attack.\';	'+
		'\n	} else {							'+
		'\n	document.getElementById(\'control\').innerHTML = \'\';	'+
		'\n	}								'+
		'\n} '+
		'</script>								'+
			'';
	return htmlStrat;
}

function updateAttackControls() {					
	var strat = document.getElementById('Strat');			
	var actionstuff = strat[strat.selectedIndex].value.split(';');	
	var possible = actionstuff[0].split(':');			
	if (possible[0] == 'IS') {
		var currentRound = (GM_getValue('roundNumber',0) < 0? 0:GM_getValue('roundNumber',0));
		var attacksLeft = GM_getValue('maxAttacks',0) - (currentRound);
		attacksLeft = (attacksLeft < 0?0:attacksLeft);
		document.getElementById('control').innerHTML = '<input type="text" maxlength="5" size="2" id="maxAttacks" '+(GM_getValue('maxAttacks',0)!=0?'value="'+GM_getValue('maxAttacks',0)+'"':'value="0"')+'> rounds then attack.'+
								' <br> rounds for skill use left : '+attacksLeft;	
	} else {							
		document.getElementById('control').innerHTML = '';	
	}								
}
function stepToNextRound() {
	//we havent won and we are still running
	var nonComName = getNonCombatName();
	GM_log(' in the step to Next round the noncom name is '+nonComName);
	var nextButton = getNextButton(nonComName);
	GM_log('found the button '+nextButton);
	//Save the strat to use
	var strat = document.getElementById('Strat');
	GM_setValue('selectedStrat',strat[strat.selectedIndex].value);
	GM_log('Selected Strategy is '+strat[strat.selectedIndex].value);
	nextButton.click();
}

function stepToNextCombat() {
	//window.location = 'http://www.twilightheroes.com/fight.php?location=22';
	var searchy = find('.//td[contains(.,"Patrol again")]');
	if (searchy != null) {
		var linkk = find('.//a',searchy);
		window.location = linkk;
		//GM_log(" found element "+linkk);
		//GM_log(" found element "+searchy);
		
		//Save the strat to use
		var strat = document.getElementById('Strat');
		GM_setValue('selectedStrat',strat[strat.getSelectedIndex].value);
		
	}
	
}

function endOfTurn() {
	//window.location = 'http://www.twilightheroes.com/fight.php?location=22';
	var searchy = find('.//td[contains(.,"Patrol again")]');
	if (searchy != null) {
		var linkk = find('.//a',searchy);
//GM_log('end of adventure');		

		if (linkk != null) {
//GM_log('end of adventure2');		
			return true;
		}

	}

	return false;
}

function idEncounter() {
	var combatIndicator = find('.//h1[1]');
	var nonCombatIndicator = find('.//h2[1]');
	
	var type = null;
	if (combatIndicator != null) {
		GM_log(" found type combat "+combatIndicator.innerHTML);
		if ('Combat!' == combatIndicator.innerHTML) {
			type = 'combat'
		}
	}
	if (nonCombatIndicator != null) { 
		if (endOfTurn()) {
			GM_log(" found type non-combat "+nonCombatIndicator.innerHTML);
			type='non-combat';
		} else {
			GM_log(" found type choice-non-combat "+nonCombatIndicator.innerHTML);
			type='choice-non-combat';
		}
	}
	return type;
}

function getNonCombatName() {
	
	var nonCombatIndicator = find('.//h2[1]');
	
	var nonname;
	if (nonCombatIndicator != null) { 
		
		nonname = nonCombatIndicator.innerHTML;
	}
	GM_log(" found type choice-non-combat "+nonname);
	return nonname;
}	

function getNextButton(nonCombatName) {
GM_log('Non combat name '+nonCombatName);
var nonComChoice = new Array();

//Config the choice combats
//
//nonComChoice["Crime Never Sleeps ... or Does It?"+"choice"] = "1"; //Pick up Litter
//nonComChoice["Crime Never Sleeps ... or Does It?"+"choice"] = "2"; //Catch up with friend
nonComChoice["Crime Never Sleeps ... or Does It?"+"choice"] = "3"; //Keep Walking

nonComChoice["Crime Never Sleeps ... or Does It?"+"submitvalue"] = "Make your choice"; //Pick up Litter

nonComChoice["Pick Yer Poison"+"choice"] = "1"; //caffeine
//nonComChoice["Pick Yer Poison"+"choice"] = "2"; //PP
//nonComChoice["Pick Yer Poison"+"choice"] = "3"; //SFA

nonComChoice["Pick Yer Poison"+"submitvalue"] = "What do you do?";

//nonComChoice["Gotta Move Quick"+"choice"] = "3"; //???
nonComChoice["Gotta Move Quick"+"choice"] = "4"; //backpack
//nonComChoice["Gotta Move Quick"+"choice"] = "5"; //unlock rooftops/nothing?

nonComChoice["Gotta Move Quick"+"submitvalue"] = "Think Fast!"

nonComChoice["Glove Slap, Baby"+"choice"] = "1"; //fight knight
//nonComChoice["Glove Slap, Baby"+"choice"] = "2"; //work the rep
//nonComChoice["Glove Slap, Baby"+"choice"] = "3"; //KFC

nonComChoice["Glove Slap, Baby"+"submitvalue"] = "What do you do?"; //

nonComChoice["A Dilemma of the Horns"+"choice"] = "6"; // money/rep
//nonComChoice["A Dilemma of the Horns"+"choice"] = "7"; //item
//nonComChoice["A Dilemma of the Horns"+"choice"] = "8"; //squat

nonComChoice["A Dilemma of the Horns"+"submitvalue"] = "What do you do?"; //

nonComChoice["Intermission"+"choice"] = "1"; // Exit stage left
//nonComChoice["Intermission"+"choice"] = "2"; //Exit stage right
//nonComChoice["Intermission"+"choice"] = "3"; //Exit fourth wall

nonComChoice["Intermission"+"submitvalue"] = "Pick Your Exit";

///nonComChoice["Shipping Clerk"+"choice"] = "1"; // lousy caf
//nonComChoice["Shipping Clerk"+"choice"] = "2"; //money/rep
nonComChoice["Shipping Clerk"+"choice"] = "3"; //xp

nonComChoice["Shipping Clerk"+"submitvalue"] = "What do you do?";

nonComChoice["Two Paths Diverged in a Prehistoric Wood"+"choice"] = "1"; // pegasus - or fight if the option doesn't exist
//nonComChoice["Two Paths Diverged in a Prehistoric Wood"+"choice"] = "2"; //lame item
//nonComChoice["Two Paths Diverged in a Prehistoric Wood"+"choice"] = "3"; //lame item 2

nonComChoice["Two Paths Diverged in a Prehistoric Wood"+"submitvalue"] = "What do you do?";

//Castle Non combats
nonComChoice["Forgot to Mention the Crystal Skulls"+"choice"] = "5";
//nonComChoice["Forgot to Mention the Crystal Skulls"+"choice"] = "6";
//nonComChoice["Forgot to Mention the Crystal Skulls"+"choice"] = "7";
nonComChoice["Forgot to Mention the Crystal Skulls"+"submitvalue"] = "Make your choice";

//nonComChoice["Behind Door Number Three ..."+"choice"] = "1"; //Grab Nearest
//nonComChoice["Behind Door Number Three ..."+"choice"] = "2"; //Investigate
//nonComChoice["Behind Door Number Three ..."+"choice"] = "3"; //Check the experimental
nonComChoice["Behind Door Number Three ..."+"choice"] = "4"; //Forget
nonComChoice["Behind Door Number Three ..."+"submitvalue"] = "Go with the plan";

var nextButton;
if (nonCombatName != null) {
GM_log(" non combat value is "+nonComChoice[nonCombatName+"choice"]);
var radiochoice = find('.//input[@type="radio" and @name="choice" and @value="'+nonComChoice[nonCombatName+"choice"]+'"]');
var radiosetchoice = find('.//input[@type="radio" and @name="choice" and @value="4"]');
if (radiosetchoice != null) {
radiosetchoice.checked=true;}
else{
//GM_log('attempting to use this choice '+radiochoice.value);
if (radiochoice != null) {
radiochoice.checked=true;}}
nextButton=find('.//input[@type="submit" and @value="'+nonComChoice[nonCombatName+"submitvalue"]+'"]');
GM_log(" Found noncombat button "+nextButton);
} else {
//Handle combat options
var strategy = GM_getValue('selectedStrat','A').split(';');
var round = (GM_getValue('roundNumber', 0)>=strategy.length?strategy.length-1:GM_getValue('roundNumber', 0));
GM_log("round option "+strategy[round]);
var selectedAction = strategy[round].split(':');
//GM_log("round option option "+selectedAction[0]+' With option '+selectedAction[1]);
if (selectedAction[0]=='A') {
nextButton=find('.//input[@type="submit" and contains(@value,"Attack")]');}
else if (selectedAction[0]=='S') {
nextButton=find('.//input[@type="submit" and contains(@value,"Skill")]');
if (!Select_Value_Set_Name('pickwhich',0,selectedAction[1])) {
//If there is no action to select then fall back to attack
nextButton=find('.//input[@type="submit" and contains(@value,"Attack")]');} }
else if (selectedAction[0]=='IS') {
var currentRound = (GM_getValue('roundNumber',0) < 0? 0:GM_getValue('roundNumber',0));
var attacksLeft = GM_getValue('maxAttacks',0) - (currentRound);
if (attacksLeft > 0) {
nextButton=find('.//input[@type="submit" and contains(@value,"Skill")]');
if (!Select_Value_Set_Name('pickwhich',0,selectedAction[1])) {
//If there is no action to select then fall back to attack
nextButton=find('.//input[@type="submit" and contains(@value,"Attack")]');}}
else {
nextButton=find('.//input[@type="submit" and contains(@value,"Attack")]');}}
else if (selectedAction[0]=='I') {
nextButton=find('.//input[@type="submit" and contains(@value,"Item")]');
if (!Select_Value_Set_Name('pickwhich',1,selectedAction[1])) {
//If there is no action to select then fall back to attack
nextButton=find('.//input[@type="submit" and contains(@value,"Attack")]');}}}
return nextButton;}

//GM_log("encounter is "+idEncounter());
//idEncounter();
var imageTD = find('.//img[@border="3"]/..');
if (imageTD) {

	var victory = /Victory!/;
	var loss = / /;
	//GM_log(imageTD.tagName);
	var last = find('./*[last()]',imageTD);
	//GM_log(last.tagName);
	var weWon = victory.exec(document.body.innerHTML);
	
	var advTable = document.createElement("table");
	var advRow = document.createElement("tr");
	var advCell = document.createElement("td");
	var buttontype= null;
	var displayRound = null;
	
	if (endOfTurn()) {
		//clean up from a victory
		//GM_setValue('running',false);

		GM_setValue('turnsLeft',GM_getValue('turnsLeft',0)-1);

		var round = GM_getValue('roundNumber',-1)+1;
		displayRound= round;
		GM_setValue('roundNumber', -1);
		if (GM_getValue('running',false)&&(GM_getValue('turnsLeft',false) > 0)){
			//Victory and we need to patrol again, find the hyperlink and navigate to it. 
			GM_setValue('delayID',setTimeout(stepToNextCombat,30));		
		} else { 
			//at the end of the turns. 
			GM_setValue('running',false);
		}

	} else {
		//Update the round count

		var round = GM_getValue('roundNumber',-1)+1;
		//GM_log('round '+round);
		GM_setValue('roundNumber', round);		
		displayRound= GM_getValue('roundNumber', -1);		
		
	}
	
	if (GM_getValue('turnsLeft',false) <= 0) {
		GM_setValue('running',false);
	}
	
	if (GM_getValue('running',false)) {
		buttontype = '<br><input type="button" id="stop" value="Stop">';	
	} else {
		buttontype = '<br><input type="button" id="start" value="Click to Start">';
	
	}
	advCell.innerHTML= 'Battle Computer : Combat Round '+displayRound +
	'<br> <input type="text" maxlength="5" id="turns" value="'+(GM_getValue('turnsLeft',false)?GM_getValue('turnsLeft',false):'0')+
	'">'+generateStratList()+'<div id="control"></div>'+
	buttontype;
	advRow.insertBefore(advCell,null);
	advTable.insertBefore(advRow,null);
	imageTD.insertBefore(advTable,null);
	Select_Value_Set('Strat',GM_getValue('selectedStrat','A')); //Default to attack if theres no selected strat.
	updateAttackControls();
	//(weWon?weWon[0]:'');


	if (document.getElementById("start")) {
		document.getElementById("start").addEventListener("click",rockIt,true);
	}
	if (document.getElementById("stop")) {
		document.getElementById("stop").addEventListener("click",shutDown,true);
	}
	
	if ((weWon == null)&&(GM_getValue('running',false))) {
		GM_setValue('delayID',setTimeout(stepToNextRound,20));
	}
}

function find(xp,location) {
	if(!location)location = document;
	var temp = document.evaluate(xp, location, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null);
	return temp.singleNodeValue;
}

function rockIt() {
	if (document.getElementById("turns").value <=0) return false;
	GM_setValue("running", true);
	
	var strat = document.getElementById('Strat');
	GM_setValue('selectedStrat',strat[strat.selectedIndex].value);
	GM_setValue('turnsLeft',document.getElementById("turns").value);
	if (document.getElementById("maxAttacks")) {
		GM_setValue('maxAttacks',document.getElementById("maxAttacks").value);
	}
	//GM_setValue("turns_left", document.getElementById("turns").value-1); 
	//document.getElementsByName("heads")[0].click();
	var attackButton = find('.//input[@type="submit" and contains(@value,"Attack")]');
	//var attackButton = 
	if (endOfTurn()) {
		stepToNextCombat();
	}
	else if (attackButton) {
		attackButton.click();
		
	} 
}

function shutDown() {
	//if (document.getElementById("turns").value <=0) return false;
	GM_setValue("running", false);
	
	var strat = document.getElementById('Strat');
	GM_setValue('selectedStrat',strat[strat.selectedIndex].value);
	//GM_setValue("turns_left", document.getElementById("turns").value-1); 
	//document.getElementsByName("heads")[0].click();
	if (GM_getValue('delayID')) {
		clearTimeout(GM_getValue('delayID'));
	}
}		


	
The churches are empty / The priest has gone home / And we are left standing / Together alone
--October Project: "Dark Time"
Muhandes
Posts: 732
Joined: Mon Nov 03, 2008 12:54 am
Contact:

Re: Greasemonkey

Post by Muhandes »

I had to turn off all other scripts to make this work, but now it does and it's very fine.
User avatar
Cristiona
Posts: 5116
Joined: Sun Apr 08, 2007 1:01 am
Location: the Conservatory with the lead pipe
Contact:

Re: Greasemonkey

Post by Cristiona »

Well... you need to turn off other combat scripts. Outfit Manager, XP Status, and SellCube Items all play nicely with it. Actually, now that I think about it, so does Stationary Combat Buttons.
The churches are empty / The priest has gone home / And we are left standing / Together alone
--October Project: "Dark Time"
Muhandes
Posts: 732
Joined: Mon Nov 03, 2008 12:54 am
Contact:

Re: Greasemonkey

Post by Muhandes »

I had to turn off Stationary Combat Buttons, Choice Selection Saver, Continuous Attack, so far, as expected, but also the wikifier, which I wasn't expecting.
User avatar
Carygon Nijax
Posts: 1034
Joined: Mon Oct 27, 2008 11:13 pm
Location: RP Channel... we have cake!!
Contact:

Re: Greasemonkey

Post by Carygon Nijax »

how can I install those "improved" adventure scripts?
Image
Top 10 on the Total Post list
Muhandes
Posts: 732
Joined: Mon Nov 03, 2008 12:54 am
Contact:

Re: Greasemonkey

Post by Muhandes »

Thanks for posting it.

Can you add the other choice adventures please? I noticed specifically that "Just Deserts" is missing.
Muhandes
Posts: 732
Joined: Mon Nov 03, 2008 12:54 am
Contact:

Re: Greasemonkey

Post by Muhandes »

Turns is the one thing I have the most plenty of. Here's a copypasta of Just Deserts. Let me know if you need any other adventure.

Code: Select all

<HTML><head><link rel='stylesheet' href='includes/style.css'><script type='text/javascript'>if (self.location == top.location)
top.location.href = 'index2.php';</script><script language=Javascript src='http://www.twilightheroes.com/scripts/popup.js'></script></head><BODY> 
<table border=0 cellspacing=0 cellpadding=4 width='100%'><tr valign=top><td width='100%'><h2>Just Deserts</h2><font class='text'>

From the air you can reach farther into the desert than you ever have before. This perspective allows you to see all kinds of things that you've never noticed before, even in the dark. It's dim, but there's some ambient light from the city and night sky. You find yourself intrigued by a strange circular crater near the base of an old volcano. In fact, is that a glint of metal? Could something have crashed there? The crater looks old--really old--but you decide to investigate it anyway.<BR><BR>It takes a while to track down the metal that you saw, and when you do you're disappointed to find that it's just the burnt-out shell of a car amid a pile of other litter. You pick up a loose hubcap, rotating it in your hands as you look around. Something still doesn't feel right about the crater; your sense of something out of place is jangling like a spider's web reacting to the footfall of an insect. You can't figure out what's bothering you, though.

<BR><BR>What do you do?<form action=fight.php method=post><input type=radio name=choice value='1' checked> See if there's anything good in the car.<BR><input type=radio name=choice value='2'> Spend a few minutes cleaning up the area. <BR><input type=radio name=choice value='3'> See how far you can toss the hubcap.<BR><input type=submit value='Take Action'></form>

 


</td><td align=center><img src='images/foes/burned-car.jpg' height=200 width=200 border=3><BR><b></b></td></tr></table><script type='text/javascript'>top.nav.location='nav.php';</script> 

</font>

</BODY>
</HTML>
User avatar
MagiNinjA
Posts: 1466
Joined: Thu Sep 06, 2007 10:56 pm
Location: Berkeley when at school, San Diego when at home
Contact:

Re: Greasemonkey

Post by MagiNinjA »

You know, you should probably update the Choice Selection Saver script instead of combining both. It'd be easier to manage, not to mention you don't have to keep adding on choices. Just add code to look for the 4th choice and you're done.
User avatar
MagiNinjA
Posts: 1466
Joined: Thu Sep 06, 2007 10:56 pm
Location: Berkeley when at school, San Diego when at home
Contact:

Re: Greasemonkey

Post by MagiNinjA »

Why use 2? So that you don't fuck up the giant one?

Seriously, as a coder, I wouldn't put everything in one file. I'd separate it in a way that's logical. Not saying that sticking it together is BAD, but I think it'd be much easier and better managing two separate but modular scripts.

Also, IIRC, the Selection Saver works for ALL choice adventures without the need of updating it. So literally all you'd have to do is catch the 4th option. Much easier to manage a completed script and less code in the other script, right?
Post Reply

Who is online

Users browsing this forum: Ahrefs [Bot] and 12 guests