您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Some minor tweaks for Light Rising browser game
当前为
// ==UserScript== // @name Light Rising Tweaks // @namespace http://userscripts.org/users/125692 // @description Some minor tweaks for Light Rising browser game // @include *lightrising.com*game.cgi // @grant GM_addStyle // @version 1.5.7 // ==/UserScript== (function() { //####################################################################################################### //some constants var SRpc=0;//picked clean var SRvlr=1;//very limited resources var SRlr=2;//limited resources var SRmr=3;//moderate resources //var SRgr=4;//good resources var SRar=4;//abundant resources GM_addStyle("b.MageHealthBar {background-repeat:no-repeat;background-position:left bottom; background-image:url(data:image/gif;base64,R0lGODlhAQAFAIABAACZAP%2F%2F%2FywAAAAAAQAFAAACAoRdADs%3D);}"); GM_addStyle("div.multicolumn { -moz-column-count:3; -webkit-column-count:3; column-count:3; display:block; -moz-column-gap:1px; -webkit-column-gap:1px; column-gap:1px; white-space:pre-wrap; -moz-column-rule:1px solid grey; -webkit-column-rule:1px solid grey; column-rule:1px solid grey;vertical-align:top}"); function ucfirstletter(str){ return str.replace(/\b[A-Za-z]/,function($0) { return $0.toUpperCase(); })//capitalize first word come across } function sortSelect(selElem) { var sellength=selElem.options.length; if (sellength<=1){ //only one option so abort sort //return selElem.selectedIndex; return 0; } var tmpAry = new Array(); var originalselindex=selElem.selectedIndex; //store original selected index for debugging var selvalue=selElem[selElem.selectedIndex].value; selElem[selElem.selectedIndex].removeAttribute('selected'); //get rid of preselect property var keeper=0; for (var i=0;i<sellength ;i++) { selElem[i].removeAttribute('selected'); tmpAry[i] = new Array(); tmpAry[i][0] = selElem.options[i].text.replace(/^\d\s/,"").replace(/\b[A-Za-z]/,function($0) {return $0.toUpperCase();}); tmpAry[i][1] = selElem.options[i].value; tmpAry[i][3] = selElem.options[i].disabled; } 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; }); for (var i=0;i<tmpAry.length;i++) { selElem.options[i].text=tmpAry[i][0]; selElem.options[i].value=tmpAry[i][1]; if(selElem.options[i].value==selvalue){keeper=i;} selElem.options[i].disabled=tmpAry[i][3]; } selElem.selectedIndex=keeper; selElem[keeper].selected = true; //this might work better let evt = document.createEvent("HTMLEvents"); evt.initEvent("change", true, true ) selElem.dispatchEvent(evt); return keeper;//so we can cludge it into updating the dropdown to show the actually selected option. } var rdropbutton=function(e){ e.preventDefault(); //alert('Dropping'); var dropform=e.target.form; var itemselect=dropform.elements[3]; //alert(itemselect.name); var selecteditem=itemselect[itemselect.selectedIndex]; var selvalue=selecteditem.value; //alert(selvalue); var warnondropvalues=['207','215','35','275','1020']; //alert(warnondropvalues.indexOf(selvalue)) if (warnondropvalues.indexOf(selvalue)!=-1){ var rval=confirm("Do you REALLY want to drop "+selecteditem.textContent+"!?"); if (rval){ //alert("dropingrestricteditemsnotallowedrightnow"); e.target.form.submit(); } return rval; } else{ //alert("drop"); e.target.form.submit(); } } //grab a few of the important bit of the page for later use. var gab=document.getElementsByClassName("gamebox actionbox")[0]; var gsb=document.getElementsByClassName("gamebox statsbox")[0]; var gib=document.getElementsByClassName("gamebox infobox")[0]; var attackbuttons=document.evaluate( ".//input[@value='Attack']",//it might need the leading '.' gab, //as it is limited to gab null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);//look for attack button var attackbutton=false; if(attackbuttons.snapshotLength>0){ attackbutton=attackbuttons.snapshotItem(0); } //####################################################################################################### //then set ap hp hunger red if less than 10% left var searchtextelement=gsb.getElementsByTagName('b'); if (searchtextelement){//foundsomething for(i=0;i<3;i++){ a=searchtextelement[i]; test=a.innerHTML.match(/(-?\d+)[^0-9]*(\d+)/) // extract the first 2 numbers if(test){ var percent=100*(Number(test[1])/Number(test[2]));//so only calc once a.className='MageHealthBar'; //put a % bar underneath the values a.style.backgroundSize=''+percent+'% 15%'; //if (100*(Number(test[1])/Number(test[2]))<1){//bugfix for 0 values if (Number(test[1])<1){//bugfix for 0 (and negative) values. So we have either 0HP or O(or less!)AP a.style.color='red'; //colour it red in the stat bar if (i==1&&gab){//WE HAVE RUN OUT OF AP. NO message as it messes up page. Just a red border gab.style.borderBottomColor='red'; gab.style.borderLeftColor='orangered';//='gold'; gab.style.borderRightColor='red'; gab.style.borderTopColor='orangered'; } } else if (percent<=5){//nearly out. paint box red. a.style.color='red'; if (i==0&&attackbutton) { attackbutton.style.color='red'; attackbutton.title='CRITICALLY LOW HEALTH!!!'; } else if (i==1&&gab){//ap low. colour border of action box red var textline= document.createElement("p"); textline.style.position='relative'; textline.style.left="35%"; textline.style.top="-5px"; textline.innerHTML="WARNING : VERY LOW AP"; textline.style.fontSize='smaller'; textline.style.zIndex="2"; textline.style.display='inline'; textline.style.lineHeight='0px'; textline.style.align='center'; gab.firstChild.parentNode.insertBefore(textline,gab.firstChild); gab.style.borderBottomColor='red'; gab.style.borderLeftColor='orangered'; gab.style.borderRightColor='red'; gab.style.borderTopColor='orangered'; } } else if (percent<=10){ a.style.color='red'; if (i==0&&attackbutton) { attackbutton.style.color='red'; attackbutton.title='VERY LOW HEALTH!!'; } else if (i==1&&gab){//ap low. colour border of action box red var textline= document.createElement("p"); textline.style.position='relative'; textline.style.left="35%"; textline.style.top="-5px"; textline.innerHTML="WARNING : LOW AP"; textline.style.fontSize='smaller'; textline.style.zIndex="2"; textline.style.display='inline'; textline.style.lineHeight='0px'; textline.style.align='center'; gab.firstChild.parentNode.insertBefore(textline,gab.firstChild); gab.style.borderBottomColor='darkorange'; gab.style.borderLeftColor='orange';//='gold'; gab.style.borderRightColor='darkorange'; gab.style.borderTopColor='orange'; } } else if (percent<=30){ a.style.color='darkorange'; if (i==0&&attackbutton) { attackbutton.style.color='darkorange'; attackbutton.title='LOW HEALTH!'; } } else if (percent<=75){ if (i==0) { a.style.color='orange'; } } else if (percent<=95){ if (i==0) { a.style.color='green'; } } else if (percent>95){ if (i==0) { a.style.color='#00ae00'; } } } } } //TWEAK Colour find rates var gibhtml=gib.innerHTML; if (gibhtml.match(/<b>Searching the area/)){ gibhtml=gib.innerHTML.replace(/(This area appears to have been picked clean.)/, "<span id='searchrate' value='"+SRpc+"' style='color:red;'>$1</span>"); if (gibhtml.match(/very limited resources/)){ gibhtml=gibhtml.replace(/(very limited resources)/, "<span id='searchrate' value='"+SRvlr+"' style='color :red;'>$1</span>") } else if(gibhtml.match(/limited resources/)){ //need to be else if to stop over writing previous replace. gibhtml=gibhtml.replace(/(limited resources)/, "<span id='searchrate' value='"+SRlr+"' style='color :crimson;'>$1</span>"); } else{ gibhtml=gibhtml.replace(/(moderate resources)/, "<span id='searchrate' value='"+SRmr+"' style='color :darkorange;'>$1</span>"); gibhtml=gibhtml.replace(/(abundant resources)/, "<span id='searchrate' value='"+SRar+"' style='color :limegreen;'>$1</span>"); } gib.innerHTML=gibhtml;//write changes } else if (gibhtml.match(/There appears to be nothing to find here./)){ gibhtml=gibhtml.replace(/(There appears to be nothing to find here.)/, "<span id='searchrate' value='"+SRpc+"' style='color :red;'>$1</span>"); gib.innerHTML=gibhtml;//write changes } //TWEAK Add ap cost to undazing items //currently only the tea //Because I keep forgetting its 25ap other 50ap self\ //this must go before the sorting tweak as it fucks it up otherwise. var alluseinput=document.evaluate( "//input[@value='use']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); if (alluseinput.snapshotLength>0){ var useinput=alluseinput.snapshotItem(0); //var useselect=useform.item; var useselect=useinput.form.getElementsByTagName("select")[0];//first one var useselectlength=useselect.length; var selindex=0; for (i=0;i<useselectlength;i++){ if (useselect[i].hasAttribute('selected')){ selindex=i; } if(useselect[i].value=="13"){//herbaltea useselect[i].textContent=useselect[i].textContent+" 25-50AP"; //break; } if (useselect[i].hasAttribute('selected')){ selindex=i; } } useselect.selectedIndex=selindex; //alert(selindex); //useselect.options[selindex].text+="";//CLUGDE FIX SELECT FOCUS BEING FUBARED } //sort inventory if(document.getElementsByClassName("gamebox infobox")){//just a check to see that its there before we continue var ginvbox=document.getElementsByClassName("gamebox invbox")[0]; var lotsadivs=ginvbox.getElementsByTagName('div'); //so we have a whole lot of divs. each div is a inventory entry. // we must preserve title text and text contents //and sort them. var tmpAry = new Array(); var invlength=lotsadivs.length; for (var i=0;i<invlength ;i++) { tmpAry[i] = new Array(); //tmpAry[i][0] = lotsadivs[i].innerHTML;//keep the innerHTML of each div tmpAry[i][0] = lotsadivs[i].textContent;//try textcontent instead of innerHTML tmpAry[i][1] = lotsadivs[i].title;//keep the title text //tmpAry[i][2] = selElem.options[i].selected; } tmpAry.sort(function (a,b){ var a=a[0].match(/\d+ x ([A-Za-z]+)/)[1];//ignore the "### x " bit of each inventory entry var b=b[0].match(/\d+ x ([A-Za-z]+)/)[1]; return a<b?-1:b<a?1:0; }); for (var i=0;i<tmpAry.length;i++) { //lotsadivs[i].innerHTML=tmpAry[i][0]; lotsadivs[i].textContent=tmpAry[i][0]//.replace(/(\d+) (x)/,"$1\t$2");//tabbify lotsadivs[i].title=tmpAry[i][1]; //selElem.options[i].selected=tmpAry[i][2]; } GM_addStyle("div.invcolumns{border:1px solid grey; \ font-size: smaller; -moz-column-count:3; -webkit-column-count:3; column-count:3; display:block; \ -moz-column-gap:1px; -webkit-column-gap:1px; column-gap:1px; white-space:pre-wrap; \ -moz-column-rule:1px solid grey; -webkit-column-rule:1px solid grey; column-rule:1px solid grey; }"); ginvbox.innerHTML=ginvbox.innerHTML.replace(/<hr>\s+<i>You are carrying:<\/i>\s+/,"<div class='invcolumns'>").replace(/<hr>/,"</div>"); } // !for reference! var gib=document.getElementsByClassName("gamebox infobox")[0]; if(gib.getElementsByClassName('small')&&gib.innerHTML.match(/There is a( \w+)? storage unit here/)){ //add style for inventory units GM_addStyle("span.smallinv{border:1px solid grey; letter-spacing:-.3px; tab-size: 10;-moz-tab-size:10;-o-tab-size:10; \ font-size: .85em; -moz-column-count:3; -webkit-column-count:3; column-count:3; display:block; \ -moz-column-gap:1px; -webkit-column-gap:1px; column-gap:1px; white-space:pre-wrap; \ -moz-column-rule:1px solid grey; -webkit-column-rule:1px solid grey; column-rule:1px solid grey;} \ smallinvitem{ tab-size: 10;-moz-tab-size:10;-o-tab-size:10;display:block; text-indent: -3em; padding-left : 3em; }"); //removed from above these styles -> font-family:Tahoma, Geneva, sans-serif; letter-spacing:-.3px;font-stretch:narrower; var allsmall=gib.getElementsByClassName('small'); var smallspan=allsmall[0]; var previoustext=smallspan.previousSibling; smallspan.className="smallinv";//new class for the span to make it better. requires stylish for new class //smallspan.innerHTML=smallspan.innerHTML.replace(/(>, <)|(> and <)/g,"><br /> <"); smallspan.innerHTML=smallspan.innerHTML.replace(/(>, <)|(> and <)/g,"><"); //smallspan.innerHTML=smallspan.innerHTML.replace(/div/g,"span"); smallspan.innerHTML=smallspan.innerHTML.replace(/style="display:inline"/g,""); //var lotsadivs=ginvbox.getElementsByTagName('div'); //so we have a whole lot of divs. each div is a inventory entry. // we must preserve title text and text contents //and sort them. //var alldivs=smallspan.getElementsByTagName('span'); var alldivs=smallspan.getElementsByTagName('div'); var tmpAry = new Array(); var invlength=alldivs.length; for (var i=0;i<invlength ;i++) { tmpAry[i] = new Array(); //tmpAry[i][0] = lotsadivs[i].innerHTML;//keep the innerHTML of each div //tmpAry[i][0] = alldivs[i].textContent.replace(/(^[0-9]( ))|((^[0-9][0-9]) )/,"$1$2$3 ");//try textcontent instead of innerHTML //tmpAry[i][0] = alldivs[i].textContent.replace(/(^[0-9]{1,2}) /,"$1\t");//try textcontent instead of innerHTML tmpAry[i][0] = alldivs[i].textContent.replace(/(^\d+) /,"$1\t");//try textcontent instead of innerHTML tmpAry[i][1] = alldivs[i].title;//keep the title text //tmpAry[i][2] = selElem.options[i].selected; } tmpAry.sort(function (a,b){ var a=a[0].match(/\d+\s+([A-Za-z]+)/)[1];//ignore the "### " bit of each inventory entry var b=b[0].match(/\d+\s+([A-Za-z]+)/)[1]; return a<b?-1:b<a?1:0; }); for (var i=0;i<tmpAry.length;i++) { //lotsadivs[i].innerHTML=tmpAry[i][0]; alldivs[i].textContent=tmpAry[i][0]; alldivs[i].title=tmpAry[i][1]; alldivs[i].className="smallinvitem";// <----set in stylish! //selElem.options[i].selected=tmpAry[i][2]; } //var a; //for(i=0;a=alldivs[i];i++){ // a.style.display='block'; //} if(gib.innerHTML.match(/Written on the storage unit are the words/)){ //previoustext.wholeText=previoustext.wholeText.replace(/, containing: /,""); smallspan.parentNode.insertBefore(smallspan.nextSibling,smallspan);//the string written... smallspan.parentNode.insertBefore(smallspan.nextSibling,smallspan);//whats written smallspan.parentNode.insertBefore(document.createTextNode(' It contains:'),smallspan) gib.innerHTML=gib.innerHTML.replace(/(There is a( debilitated)? storage unit here), containing: /,"$1"); //put this ahead of inventory box } } //stop dropping credits var dropbuttons=document.evaluate( "//input[@value='Drop']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null) if(dropbuttons.snapshotLength>0){//only if we found something var dropbutton=dropbuttons.snapshotItem(0) var dropselect=dropbutton.parentNode.getElementsByTagName("select")[1];//second? var dropselectlength=dropselect.length; for (i=0;i<dropselectlength;i++){ if(dropselect[i].value=="215"||dropselect[i].value=="1020"){//also don't drop my custom weapon dropselect[i].disabled=true; } }//setup confirm dialog dropbutton.addEventListener("click",rdropbutton,false); } //TWEAK sort the invertory & storage unit selects. //give select var itemselects=document.evaluate( "//select[@name='item']", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); if(itemselects.snapshotLength>0){ var itemselect; var indextoselect=0; for(i=0;itemselect=itemselects.snapshotItem(i);i++){ let selindex=sortSelect(itemselect); } } //EOF })();