您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Compacts the divisions shown when using fight macros in KoL, displaying only the last.
// ==UserScript== // @name Macro Combat Compacter // @namespace kol.interface.unfinished // @description Compacts the divisions shown when using fight macros in KoL, displaying only the last. // @include http://*kingdomofloathing.com/fight.php* // @include http://127.0.0.1:*/fight.php* // @version 1.21 // @grant GM_getValue // @grant GM_setValue // ==/UserScript== //Version 1.21 // - add @grant //Version 1.2 // - added round counter and attack/defense notice compaction //Version 1.1 // - also now shows effect gains/losses //Version 1.0 function compact() { var hrs = document.evaluate( '//hr', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null); var stuff = []; var ids = 1; extractAdjustments(hrs.snapshotLength); // gather contents for (var i=hrs.snapshotLength-1;i>=0;i--) { var hr2 = hrs.snapshotItem(i); var itemids = ""; stuff[i] = document.createElement('div'); stuff[i].setAttribute('class','compactDiv'); while (hr2.previousSibling && hr2.previousSibling.tagName!='HR' && hr2.previousSibling.tagName!='BR') { var n = hr2.previousSibling; n.parentNode.removeChild(n); if (stuff[i].firstChild) stuff[i].insertBefore(n,stuff[i].firstChild); else stuff[i].appendChild(n); } stuff[i].setAttribute('style','display:none'); hr2.parentNode.insertBefore(stuff[i],hr2); hr2.addEventListener('click',expandDivH,true); hr2.setAttribute('title','click to display round '+(i+1)); var r = findAcquires(stuff[i]); if (r.length>0) { for (var j=0;j<r.length;j++) { itemids = itemids + " " + ids; r[j].setAttribute('id','compactAcquire_'+ids); ids++; stuff[i].parentNode.insertBefore(r[j],stuff[i]); } stuff[i].setAttribute('compactAcquire',itemids); } } } // delete any duplicated item/meat acquisitions function removeAcquires(alist) { var aa = alist.split(' '); for (var i=0;i<aa.length;i++) { if (aa[i]) { var r = document.getElementById('compactAcquire_'+aa[i]); if (r) { r.parentNode.removeChild(r); } } } } // expand a single div and delete any item/meat acquisitions function expandDiv(d) { var s = d.getAttribute("style"); if (s.match(/display\s*:\s*none\s*;?/i)) { d.setAttribute("style",s.replace(/display\s*:\s*none\s*;?/i,'')); var itemlist = d.getAttribute('compactAcquire'); if (itemlist) { removeAcquires(itemlist); } } } // handler for introduced divs function expandDivH() { var d = this.previousSibling; if (d && d.tagName=='DIV') { expandDiv(d); } this.removeEventListener('click',expandDivH,true); } // expand all divs handler function expandAllDivs(e) { var ds = document.getElementsByClassName('compactDiv'); if (ds) { for (var i=0;i<ds.length;i++) { expandDiv(ds[i]); } } } // change the jump to bottom button to an expand all rounds button function addExpandAll() { var b = document.getElementById('jumptobot'); b.addEventListener('click',expandAllDivs,false); b.setAttribute('title','click to expand all rounds'); b.innerHTML = '(expand rounds)'; } // return clones of all item/meat acquisitions from the supplied root element function findAcquires(doc) { var r = []; var msg = ['.//td[text()="You acquire an item: "]', './/td[text()="You acquire an effect: "]', './/td[text()="You lose an effect: "]']; for (var m=0;m<msg.length;m++) { var ps = document.evaluate(msg[m],doc,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null); if (ps.snapshotLength>0) { for (var i=0;i<ps.snapshotLength;i++) { var p = ps.snapshotItem(i).parentNode; while (p && p.tagName!='CENTER') p = p.parentNode; if (p) { r[r.length] = p.cloneNode(true); } } } } ps = document.evaluate('.//td[contains(text(),"Meat.")]',doc,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null); if (ps.snapshotLength>0) { for (var i=0;i<ps.snapshotLength;i++) { var p = ps.snapshotItem(i); if (p.innerHTML && p.innerHTML.match(/You gain [0-9]+ Meat./)) { p = p.parentNode; while (p && p.tagName!='CENTER') p = p.parentNode; if (p) { r[r.length] = p.cloneNode(true); } } } } return r; } function accumulateTitle(n,text) { if (n.nodeType==3) n = n.parentNode; var t = n.getAttribute('title'); if (t) { n.setAttribute('title',t+' '+text); } else n.setAttribute('title',text); } function hideAtkDef(p) { p.parentNode.removeChild(p); } function extractAdjustments(extrar) { var atk=Number(GM_getValue('atk',0)),def=Number(GM_getValue('def',0)); var delta=0,deltd=0; var r=Number(GM_getValue('round',0))+extrar; var psa = document.evaluate('.//td[contains(text(),"Monster attack power reduced by ")]',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null); for (var ia=0;ia<psa.snapshotLength;ia++) { var p = psa.snapshotItem(ia); var delt = Number(p.innerHTML.replace(/[^0-9]+/g,'')); delta += delt; p = p.parentNode; while (p && p.tagName!='CENTER') p = p.parentNode; if (p) { if (p.previousSibling) accumulateTitle(p.previousSibling,'Monster attack power reduced by '+delt+'.'); hideAtkDef(p); } } psa = document.evaluate('.//td[contains(text(),"Monster defense reduced by ")]',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null); for (var ia=0;ia<psa.snapshotLength;ia++) { var p = psa.snapshotItem(ia); var delt = Number(p.innerHTML.replace(/[^0-9]+/g,'')); deltd += delt; p = p.parentNode; while (p && p.tagName!='CENTER') p = p.parentNode; if (p) { if (p.previousSibling) { accumulateTitle(p.previousSibling,'Monster defense reduced by '+delt+'.'); } hideAtkDef(p); } } r++; GM_setValue('round',r); atk += delta; def += deltd; if (atk!=0 || def!=0 || r>1) { var d = document.getElementById('compactatkdef'); var ps; if (!d) { ps = document.evaluate('.//td/b[text()="Combat!"]',document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null); if (ps.singleNodeValue) { d = document.createElement('div'); d.setAttribute('style','display:inline;float:left;font-size:small;'); d.setAttribute('id','compactatkdef'); ps.singleNodeValue.parentNode.insertBefore(d,ps.singleNodeValue); } else return; } GM_setValue('atk',atk); GM_setValue('def',def); if (delta!=0 || deltd!=0) { d.setAttribute('title','Round '+r+': monster attack reduced by '+delta+' and defense by '+deltd+'.'); } else { d.setAttribute('title','Round '+r+'.'); } var c = (r>1) ? '\u00A0('+r+') ' : '\u00A0'; if (atk>0) c = c + 'A: -'+atk+' '; if (def>0) c = c + 'D: -'+def; if (d.firstChild) d.replaceChild(document.createTextNode(c),d.firstChild); else d.appendChild(document.createTextNode(c)); } } if (window.location.search && window.location.search.indexOf('ireallymeanit')>=0) { GM_setValue('atk',0); GM_setValue('def',0); GM_setValue('round',0); } else if (document.evaluate('.//p[text()="It gets the jump on you."]',document,null,XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue) { GM_setValue('atk',0); GM_setValue('def',0); GM_setValue('round',0); } if (document.getElementById('jumptobot')) { compact(); addExpandAll(); } else { extractAdjustments(0); }