// ==UserScript==
// @name Fruit Factory
// @namespace kol.interface.unfinished
// @description Provides a convenient button for restocking fruit as soon as it is duplicated in Professor Jacking's laboratory, in Kingdom of Loathing.
// @include http://*kingdomofloathing.com/choice.php*
// @include http://127.0.0.1:*/choice.php*
// @version 1.01
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// ==/UserScript==
// version 1.01
// - add @grant
function findPwdhash() {
var somef = window.parent.frames;
var goo = null;
for(var j=0;j<somef.length;j++) {
if (somef[j].name=="charpane") {
goo=somef[j];
var page = goo.document.documentElement.innerHTML;
var find = 'pwdhash = ';
if (page.indexOf(find) >= 0) {
var i = page.indexOf(find);
var j = find.length;
var ps = page.substr(i+j+2);
var foundit = page.substr(i+j+1,ps.indexOf('"')+1);
GM_setValue('fruitpwd',foundit);
return foundit;
}
}
}
return GM_getValue('fruitpwd');
}
function addFruit(inum) {
this.removeEventListener('click',addFruit,false);
var args = 'action=addfruit&whichitem=4560&pwd='+findPwdhash()+'&whichfruit='+this.getAttribute('fruit');
doPost(args);
}
function fixMsg(d,msg,linktxt) {
if (d.firstChild)
d.replaceChild(document.createTextNode(msg),d.firstChild);
else
d.appendChild(document.createTextNode(msg));
if (linktxt) {
var a = document.createElement('a');
a.appendChild(document.createTextNode(linktxt));
a.setAttribute('href','inv_use.php?pwd='+findPwdhash()+'&which=3&whichitem=4560');
d.appendChild(a);
}
}
function doPost(vars) {
var d = document.getElementById('fruitfactorymsg');
fixMsg(d,'Inserting fruit...');
GM_xmlhttpRequest({
method: "POST",
url: "http://" + location.host + "/inv_use.php",
headers: {"Content-type": "application/x-www-form-urlencoded"},
data: vars,
onload: function(response){
if (response.responseText.indexOf('Please pick a fruit from the list.')>=0)
fixMsg(d,'Failed---you don\'t have that fruit.');
else if (response.responseText.indexOf('disappears into the tube and begins bouncing around noisily')>=0)
fixMsg(d,'Restocked.');
else if (response.responseText.indexOf('is sucked into the tube, displacing the')>=0)
fixMsg(d,'Restocked again.');
else
fixMsg(d,'Failed maybe; best verify with the ','map');
var b = document.getElementById('fruitfactorybutton');
if (b)
b.addEventListener('click',addFruit,false);
}
});
}
function selectFruit() {
if (this.selectedIndex!=0) {
var b = document.getElementById('fruitfactorybutton');
if (b) {
b.setAttribute('fruit',this.options[this.selectedIndex].getAttribute('value'));
b.setAttribute('value','Restock with '+this.options[this.selectedIndex].innerHTML);
this.selectedIndex = 0;
}
}
}
function createSelect() {
var fruits = [
{name:"banana",num:"2373"},
{name:"blackberry",num:"2063"},
{name:"bunch of square grapes",num:"2733"},
{name:"cactus fruit",num:"2579"},
{name:"cherry",num:"1006"},
{name:"cocktail onion",num:"1560"},
{name:"cranberries",num:"672"},
{name:"gr8ps",num:"358"},
{name:"grapefruit",num:"243"},
{name:"grapes",num:"244"},
{name:"jumbo olive",num:"455"},
{name:"juniper berries",num:"2726"},
{name:"kiwi",num:"1562"},
{name:"kumquat",num:"1557"},
{name:"lemon",num:"332"},
{name:"lime",num:"333"},
{name:"olive",num:"245"},
{name:"orange",num:"242"},
{name:"peach",num:"2729"},
{name:"pear",num:"2728"},
{name:"plum",num:"2727"},
{name:"raisin",num:"4565"},
{name:"raspberry",num:"1561"},
{name:"sea blueberry",num:"3691"},
{name:"sea honeydew",num:"3560"},
{name:"sea lychee",num:"3558"},
{name:"sea persimmon",num:"3692"},
{name:"sea tangelo",num:"3559"},
{name:"strawberry",num:"786"},
{name:"tangerine",num:"1558"},
{name:"tomato",num:"246"},
];
var s = document.createElement('select');
var opt = document.createElement('option');
opt.setAttribute('value','0');
opt.appendChild(document.createTextNode("(select a fruit)"));
s.appendChild(opt);
for (var i=0;i<fruits.length;i++) {
opt = document.createElement('option');
opt.setAttribute('value',fruits[i].num);
opt.appendChild(document.createTextNode(fruits[i].name));
s.appendChild(opt);
}
s.addEventListener("change", selectFruit, true);
return s;
}
if (document.evaluate('//td[contains(.,"That machine must\'ve shrunk and duplicated the fruit you put in it, somehow.")]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue) {
var p = document.evaluate('//table[@class="item"]//td/img[@class="hand"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
var iname = p.getAttribute('alt');
while (p && p.tagName!='TABLE') {
p = p.parentNode;
}
if (p) {
var inum = p.getAttribute('rel');
if (inum) {
inum = inum.match(/id=([0-9]+)/i);
if (inum && inum.length>1) {
inum = inum[1];
p = p.parentNode;
while (p && p.tagName!='TABLE') {
p = p.parentNode;
}
if (p) {
var r = document.createElement('tr');
var d = document.createElement('td');
var c = document.createElement('center');
var b = document.createElement('input');
var div = document.createElement('div');
div.setAttribute('id','fruitfactorymsg');
b.setAttribute('type','button');
b.setAttribute('value','Restock with '+iname);
b.setAttribute('fruit',inum);
b.setAttribute('id','fruitfactorybutton');
b.addEventListener('click',addFruit,false);
c.appendChild(createSelect());
c.appendChild(document.createTextNode('\u00A0\u00A0'));
c.appendChild(b);
c.appendChild(document.createElement('br'));
c.appendChild(div);
d.appendChild(c);
r.appendChild(d);
p.appendChild(r);
}
}
}
}
}