Light Rising Craft Lock

Remember a craft or build option. Handy when getting components.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        Light Rising Craft Lock 
// @namespace   http://userscripts.org/users/125692
// @description Remember a craft or build option. Handy when getting components.
// @include     *lightrising.com*game.cgi
// @version     1.1.1
// @grant          GM_getValue
// @grant          GM_setValue 
// ==/UserScript==
//This script adds checkbox next to the crafting options and building options if they are present
//checking the box stores the currently selected item and then new page loads will have that item
//selected automatically until the box is cleared.
//Intended as a companion script to my building and crafting cheacker scripts.
//1.1.1 - some styling to make it look a bit better
(function() {

//first check if script is needed. search for craft  or build option.
var craftbutton=document.evaluate( "//input[@value='Craft']", document, null, 
		XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
var buildbutton=document.evaluate( "//input[@value='Build']", document, null,
		XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
if(!(craftbutton||buildbutton)){
	//alert("oh noes!");
	return;//abort as no buttons.
}

//this copied off the web
//http://stackoverflow.com/questions/9447950/script-to-save-settings
// for chrome
if (!this.GM_getValue || (this.GM_getValue.toString && this.GM_getValue.toString().indexOf("not supported")>-1)) {
    this.GM_getValue=function (key,def) {
        return localStorage[key] || def;
    };
    this.GM_setValue=function (key,value) {
        return localStorage[key]=value;
    };
    this.GM_deleteValue=function (key) {
        return delete localStorage[key];
    };
}
//alert("here");
//set up click event funtion
var craftlockclick=function(e) {
	if(e.target.checked){//then we JUST checked it!
		GM_setValue('craftlock',e.target.form.item[e.target.form.item.selectedIndex].value);
	}
	else{//we JUST cleared it!
		GM_setValue('craftlock',-1);
	}
}
var buildlockclick=function(e) {
	if(e.target.checked){//then we JUST checked it!
		GM_setValue('buildlock',e.target.form.building[e.target.form.building.selectedIndex].value);
		GM_setValue('buildlist',e.target.form.building[e.target.form.building.selectedIndex].text);
	}
	else{//we JUST cleared it!
		GM_setValue('buildlock',-1);

	}
}
buildlockclearclick=function(e) {
	if(e.target.checked){//then we JUST checked it!
		GM_setValue('buildlock',e.target.value);
	}
	else{//we JUST cleared it!
		GM_setValue('buildlock',-1);
	}
}

if(craftbutton){
	//alert("here!");
    //if there is a craft button we do craft button
	//Grab current value of the checkbox.
	//positive values mean is set. value is value of item to set select to. negative means cleared.
	var craftinglockvalue =  GM_getValue('craftlock',-1);
	//now set up two check boxes.
	var craftlockbox=document.createElement('input');
	craftlockbox.type='checkbox';
	craftlockbox.setAttribute('name','craftlock');
	craftlockbox.setAttribute('id','craftlock');
	craftlockbox.style.setProperty('vertical-align',"middle",null);
	craftlockbox.title="Lock this item";
	//buildlockbox.setAttribute('title','lock this crafting item');
	//alert("and there!");
	craftlockbox.checked=(craftinglockvalue > 0);
	var craftform=craftbutton.form;
	craftform.appendChild(craftlockbox);//add the lockbox.
	craftlockbox.addEventListener("click",craftlockclick,false);
	
	if(craftinglockvalue>=0){//we have a value stored. set the select to it.
		let craftselect=craftbutton.form.item;
		let sellength=craftselect.options.length; 
		if(craftselect.value!=craftinglockvalue){//we are not selecting the right item.
			for (let i=0;i<sellength;i++) {
				if(craftselect[i].value==craftinglockvalue){
					craftselect.selectedIndex=i;
					let evt = document.createEvent("HTMLEvents");
					evt.initEvent("change", true, true )
					craftselect.dispatchEvent(evt);//dispatch an onchange event so other scripts can notice select has changed
					break;//stop looping. we found what we wanted.
				}
			}
		}
	}
	
}

if(buildbutton){//there is a build button so do the building option
	//Grab current value of the checkbox.
	//positive values mean is set. value is value of item to set select to. negative means cleared.
	var buildinglockvalue =  GM_getValue('buildlock',-1);
	//alert("buildinglockvalue:"+buildinglockvalue);
	//now set up two check boxes.
	var buildlockbox=document.createElement('input');
	buildlockbox.type='checkbox';
	buildlockbox.setAttribute('name','buildlock');
	buildlockbox.setAttribute('id','buildlock');
	buildlockbox.style.setProperty('vertical-align',"middle",null);
	buildlockbox.title="Lock this item";
	//buildlockbox.setAttribute('title','lock this building item');
	buildlockbox.checked=(buildinglockvalue > 0);
	buildlockbox.addEventListener("click",buildlockclick,false);
	//var buildform=buildbutton.form;
	buildbutton.form.appendChild(buildlockbox);//add the lockbox.

	if(buildinglockvalue>=0){//we have a value stored. set the select to it.
	
		let buildselect=buildbutton.form.building;
		let sellength=buildselect.options.length; 
		if(buildselect.value!=buildinglockvalue){//we are not selecting the right item.
			//try and select the right thing
			for (let i=0;i<sellength;i++) {
				if(buildselect[i].value==buildinglockvalue){
					buildselect.selectedIndex=i;
					let evt = document.createEvent("HTMLEvents");
					evt.initEvent("change", true, true )
					buildselect.dispatchEvent(evt);//dispatch an onchange event so other scripts can notice select has changed
					break;//stop looping. we found what we wanted.
				}
			}
		}
		
		if(buildselect.value!=buildinglockvalue){
				
				//we are STILL not selecting the right item
				//if still don't match then we have issue. We can't build what we want here even though we can build some things!
				//solution?
				//append the item to the list?
				//need to check with shintolin to see if this breaks things.
				//specifically whether it allows a character to build something they shouldn't be able to
				//alert("we can build here just not what we have stored");
				let buildinglockoption=document.createElement('option');
				buildinglockoption.text=GM_getValue('buildlist',"Lock Build Error. Tell Kiwimage about seeing this");
				buildinglockoption.value=buildinglockvalue;
				
				buildbutton.form.building.add(buildinglockoption,null);
				//to disuade players from clicking make button greyed
				buildbutton.style.setProperty('background-color',"whitesmoke",null);
				buildbutton.style.setProperty('color',"darkgrey ",null);
				
				sellength+=1;
				for (let i=0;i<sellength;i++) {
					if(buildselect[i].value==buildinglockvalue){
						buildselect.selectedIndex=i;
						let evt = document.createEvent("HTMLEvents");
						evt.initEvent("change", true, true )
						buildselect.dispatchEvent(evt);//dispatch an onchange event so other scripts can notice select has changed
						break;//stop looping. we found what we wanted.
					}
				}
		}	
	}
	
}
else if(GM_getValue('buildlock',-1)>=0&&(craftbutton)){//there isn't a build select but we have a build selected. yet there is a craft button so we haven't run out of ap/died etc.
	 //fake it?
	
	//bah add a dumb line about what we want as a stop gap.
	//let buildinglockdiv=document.createElement('div');
	//buildinglockdiv.innerHTML="Building : "+GM_getValue('buildlist',"Lock Build Error. Tell Kiwimage about seeing this");
	//buildinglockdiv.style.fontSize='smaller';
	
	let buildinglockvalue =  GM_getValue('buildlock',-1);
	
	var buildlockbox=document.createElement('input');
	buildlockbox.type='checkbox';
	buildlockbox.setAttribute('name','buildlock');
	buildlockbox.setAttribute('id','buildlock');
	buildlockbox.style.setProperty('vertical-align',"middle",null);

	buildlockbox.setAttribute('value',buildinglockvalue);//store the value here
	
	buildlockbox.title="Lock this item";
	buildlockbox.checked=(buildinglockvalue > 0);
	buildlockbox.addEventListener("click",buildlockclearclick,false);
	//var buildform=buildbutton.form;
	
	//then insert the div and the tickbox.
	let givebutton=document.evaluate( "//input[@value='Give']", document, null, 
		XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
	if(!givebutton){return}//silently stop on this error
	

//	buildinglockdiv.appendChild(buildlockbox);
	
	//bah that looked ugly.
	//Lets try faking a form
	let newbuildinglockform=document.createElement('form');
	let newbuildinglockselect=document.createElement('select');
	let newbuildinglockoption=document.createElement('option');
	let newbuildinglockbutton=document.createElement('input');
	newbuildinglockbutton.type='button'
	newbuildinglockbutton.value='Build'
	
	newbuildinglockbutton.style.setProperty('background-color',"whitesmoke",null);
	newbuildinglockbutton.style.setProperty('color',"darkgrey ",null);
	
	newbuildinglockoption.text=GM_getValue('buildlist',"Lock Build Error. Tell Kiwimage about seeing this");
	newbuildinglockoption.value=buildinglockvalue;
	
	newbuildinglockselect.style.setProperty('width',"27em",null);//match width of selects from other script
	newbuildinglockselect.add(newbuildinglockoption,null);
	newbuildinglockform.appendChild(newbuildinglockbutton);
	newbuildinglockform.appendChild(newbuildinglockselect);
	newbuildinglockform.appendChild(buildlockbox);
	
	givebutton.form.parentNode.insertBefore(newbuildinglockform,givebutton.form);
	
	var btextline= document.createElement("div");//where we will place the results
	btextline.id="magebuildingcomponentlist";
	
                var buildselect=newbuildinglockselect;
                if (!(buildselect.selectedIndex>=0)){
                    //btextline.innerHTML="";
                    btextline.innerHTML='Select Index NAN?:'+buildselect.selectedIndex;
                    buildselect.selectedIndex=0;
                    //return;
                }
                var buildselectarray = new Array();
                for(i=0;i<buildselect.length;i++){
                    buildselectarray[i]=buildselect[i].innerHTML.match(/\((.*)\)/)[1];//grab whole ingredient line
                }
                var index=buildselect.selectedIndex;            
                btextline.innerHTML="index is:"+index;
                //btextline.innerHTML+=" and:"+buildselect[index];
                btextline.innerHTML+=buildselectarray[index]
                //alert("yah!");
                //var craftbtextline=buildselect[index].innerHTML.match(/\((.*)\)/)[1];
                var craftbtextline=buildselectarray[index];
                var gib=document.getElementsByClassName("gamebox invbox")[0];
                var listofinventory="";
                var inventorylines=gib.getElementsByTagName('div');
                for (i=0;i<inventorylines.length ;i++ ){
                    //listofinventory=listofinventory+inventorylines[i].innerHTML+"\n";
                      listofinventory=listofinventory+
                      inventorylines[i].innerHTML.replace(/ x /,",").replace(/(s$|(s(?= of)))/,"").replace(/\bknives?\b/,"knife").replace(/\bstaves?\b/,"staff").replace(/\bglasses?\b/,"glass")
                      +"\n"; 
                }
                //list of inventory = long list of inventory, newline delimited
                var components=craftbtextline.split(',');//components = array of whats needed
                var gsb=document.getElementsByClassName("gamebox statsbox")[0];
                var searchtextelement=gsb.getElementsByTagName('b');
                var a=searchtextelement[1];//second bold thing is ap.
                var test=a.innerHTML.match(/(\d+)[^0-9]*(\d+)/) // extract the first 2 numbers
                var availableap=test[1];
                var outputline;
                var craftap=components[0].match(/(\d+)ap/)[1];
                //alert(components[0])
                var canbuildnum;
                outputline="<span style='color :blue;' title='AP can go negative'> Costs: </span>";
                if (Number(craftap)>Number(availableap)){
                    //outputline+="<span style='color :red;' title='Need "+ (Number(craftap)-Number(availableap))+
                    //    " more'> "+craftap+" AP </span>";
                    outputline+="<span style='color :red;' title='AP will go negative to "
                        +(Number(availableap)-Number(craftap))+"!'> "+craftap+" AP </span>";
                
                }
                else{
                    outputline+="<span> "+craftap+" AP </span>";
                }
                canbuildnum=Math.ceil(Number(availableap)/Number(craftap));//round up to account for ap can go negative
                //alert(canbuildnum)
                var toolline=false;
                var ingredientline=false;
                for (i=1;i<components.length;i++){
                    if (components[i].match(/^ a /)){//we have a tool requirement
                        if(!toolline){ 
                            outputline+="<span style='color :blue;' title='Tools only occasionally break'> Uses: </span>";
                            toolline=true;    
                        }
                         else{
                             outputline+=","
                        }
                        var tool=components[i].match(/^ a (.*)/);//get tool name
                        var toolname=tool[1].replace(/(s$|(s(?= of)))/,"");//strip plurals;
                        var toolRE=new RegExp( "\\d+,"+toolname+"s?(\n|$)");
                        if (listofinventory.match(toolRE)){
                            outputline+="<span> a "+tool[1]+"</span>";
                        }
                        else{
                            outputline+="<span style='color :red;' title='Need 1 more'> a "+tool[1]+"</span>";
// /*debug*/                  outputline+="we search for:"+toolname+ " ";                            
                            canbuildnum=0;//shockhorror we can't build any!
                            }
                    }
                    else{//we have an ingredient
                        if(!ingredientline){ 
                            outputline+="<span style='color :blue;' title='Ingredients are used up and removed from inventory'> Consumes: </span>";
                            ingredientline=true;
                        }
                        else{
                             outputline+=","
                        }    
                        var componentstring=components[i].match(/(.*)/)[1];
                        var ingredient=componentstring.match(/^ (\d+) x (.*)/);//set the 2 to i again
                        var ingredientnum=Number(ingredient[1]);
                        //var ingredientname=ingredient[2].replace(/(.*)(s\b|s$)(.*)/,"$1$2");//strip last s;
                        var ingredientname=ingredient[2].replace(/(s$|(s(?= of)))/,"");//strip plurals;
                        //var ingredientname=ingredientname.replace(/\S*\sof/,"of");//special check for "pieces of" etc
                        var ingredientname=ingredientname.replace(/\bknives?\b/,"knife");//special check for knives
                        var ingredientname=ingredientname.replace(/\bstaves?\b/,"staff");//special check for staves
						var ingredientname=ingredientname.replace(/\bglasses?\b/,"glass");//special check for glasses
						
                        var ingRE=new RegExp( "(\\d+),"+ingredientname+"s?(\n|$)");
                        var inventoryitem=listofinventory.match(ingRE);
                        if (inventoryitem){
                            var inventorynum=Number(inventoryitem[1]);//how many particular ingredredient we have
                        }
                        //var inventoryname=
                        if(!inventoryitem){//we have none
                            outputline+="<span style='color :red;' title='Need "+ingredientnum+
                                " more'> "+

///*debug line*/"<span style='color :blue;' title="+ingredientname+">Find:"+ ingRE +
///*debug line*/":from:"+listofinventory+"</span>"+

                                components[i]+"</span>";
                            canbuildnum=0;//shockhorror we can't build any!
                        }
                        else if ((inventoryitem)&&(ingredientnum>inventorynum)){//we don't have enough
                            //ingredient is what we need. And is bigger than what we have.
                            //we missing we need-we have. say need 10. we have 3 so we need 7 more
                            outputline+="<span style='color :red;' title='Need "+
                              (ingredientnum - inventorynum) +" more'> "+
                              //"need"+ingredientnum+":have"+inventorynum+" "+//debugline
                              //"finding"+ componentstring +" in "+ ingredient  +" "+//debugline
                              components[i]+"</span>";
                              canbuildnum=0;//shockhorror we can't build any!
                        }
                        else{//we do have enough
                            outputline+="<span> "+components[i]+"</span>";
                            var enuf4=(inventorynum/ingredientnum); //make below line shorter :) lol
                            //var enuf4=1;//we can only build 1 building here
                            canbuildnum=canbuildnum<enuf4?canbuildnum:enuf4;//select lowest
                        }
                    }
                }//end for
                if(canbuildnum>0){//if can build at least on say how many can be built
                    canbuildnum=Math.floor(canbuildnum);//get rid of fractions
                    outputline+= "<span style='color :green;' title='You possess sufficient resources to construct "+
                        canbuildnum+" of these. Though only one here :)'> Enough for "+canbuildnum+"</span>";
                }
                btextline.innerHTML="<span style='font-size:smaller;'>"+outputline+"</span>";//+" "+listofinventory;

				
	givebutton.form.parentNode.insertBefore(btextline,givebutton.form);				
}



//EOF
})();