您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Shows if any crafting tools or ingredients are missing
// ==UserScript== // @name Shintolin Crafting Checker // @namespace http://userscripts.org/users/125692 // @description Shows if any crafting tools or ingredients are missing // @include http://www.shintolin.co.uk/game.cgi // @include *shintolin.co*game.cgi // @version 0.0.1.20140406170308 // ==/UserScript== (function() { function ucfirstletter(str){ return str.replace(/\b[A-Za-z]/,function($0) { return $0.toUpperCase(); })//capitalize first word come across } function sortSelect(selElem) { var tmpAry = new Array(); var sellength=selElem.options.length; for (var i=0;i<sellength ;i++) { tmpAry[i] = new Array(); tmpAry[i][0] = ucfirstletter(selElem.options[i].text).replace(/^1 /,"");//Capitalize & strip leading 1 tmpAry[i][1] = selElem.options[i].value; tmpAry[i][2] = selElem.options[i].selected; } tmpAry.sort(function (a,b){//this needed to ignore case and leading numbers var a=a[0].match(/([A-Za-z]+)/)[1].toUpperCase(); var b=b[0].match(/([A-Za-z]+)/)[1].toUpperCase(); return a<b?-1:b<a?1:0; }); //while (craftselect.options.length > 0) { // craftselect.options[0] = null; //} //for (var i=sellength-1; i>-1;i--){ // selElem.options[i]=null; //} //the abouve null code doesn;t work in practice for some unknown reason. works in shell though :(? for (var i=0;i<tmpAry.length;i++) { //var op = new Option(tmpAry[i][0], tmpAry[i][1]); //selElem.options[i] = op; selElem.options[i].text=tmpAry[i][0]; selElem.options[i].value=tmpAry[i][1]; selElem.options[i].selected=tmpAry[i][2]; } return; } //now alter width of crafting dropdown var craftbutton=document.evaluate( "//input[@value='Craft']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0); //var craftselect=craftbutton.nextElementSibling.nextElementSibling var craftselect=craftbutton.parentNode.getElementsByTagName("Select")[0]; craftselect.style.width='20em';//set width to be longer so can read all the things //sort the select sortSelect(craftselect); var textline= document.createElement("div")//where we will place the results textline.id="magecomponentlist"; textline.innerHTML="" textline.style.marginLeft='5px'; var divwewant=craftbutton.parentNode.parentNode; divwewant.insertBefore(textline,craftbutton.parentNode.nextSibling ); if (!(craftselect.selectedIndex>=0)){ //textline.innerHTML=""; textline.innerHTML='Select Index NAN?:'+craftselect.selectedIndex; craftselect.selectedIndex=0; //return; } //make an array as repeatedly accessing the select by index makes it fail for reasons I don't get. var craftselectarray = new Array(); for(i=0;i<craftselect.length;i++){ craftselectarray[i]=craftselect[i].innerHTML.match(/\((.*)\)/)[1]; } var rchange=function(e) { var textline=document.getElementById("magecomponentlist"); var craftselect=e.target; if (!(craftselect.selectedIndex>=0)){ //textline.innerHTML=""; textline.innerHTML='Select Index NAN?:'+craftselect.selectedIndex; craftselect.selectedIndex=0; //return; } var craftselectarray = new Array(); for(i=0;i<craftselect.length;i++){ craftselectarray[i]=craftselect[i].innerHTML.match(/\((.*)\)/)[1];//grab whole ingredient line } var index=craftselect.selectedIndex; textline.innerHTML="index is:"+index; //textline.innerHTML+=" and:"+craftselect[index]; textline.innerHTML+=craftselectarray[index] //alert("yah!"); //var crafttextline=craftselect[index].innerHTML.match(/\((.*)\)/)[1]; var crafttextline=craftselectarray[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"; var inventorytext=inventorylines[i].innerHTML.replace(/ x /,",").replace(/(s$|(s(?= of)))/,"").replace(/\bknives?\b/,"knife").replace(/\bstaves?\b/,"staff") +"\n"; //alert(inventorytext); listofinventory=listofinventory+inventorytext; } //list of inventory = long list of inventory, newline delimited var components=crafttextline.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+/); 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 title='Have "+listofinventory.match(toolRE)[1] +"'> 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 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 title='Have "+ inventorynum +"' > "+components[i]+"</span>"; var enuf4=(inventorynum/ingredientnum); //make below line shorter :) lol 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'> Enough for "+canbuildnum+"</span>"; } textline.innerHTML="<span style='font-size:smaller;'>"+outputline+"</span>";//+" "+listofinventory; } craftselect.addEventListener("change",rchange,false); craftselect.addEventListener("DOMAttrModified",rchange,false); craftselect.addEventListener("keypress",rchange,false); if (craftselect.selectedIndex>0){ //manuallydoit(); var e = new Object(); var craftbutton=document.evaluate( "//input[@value='Craft']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0); //e.target=craftbutton.nextElementSibling.nextElementSibling e.target=craftbutton.parentNode.getElementsByTagName("Select")[0]; rchange(e); } //EOF })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址