您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Shows efficiency (attack per piece + downstack per piece)
当前为
// ==UserScript== // @name Efficiency Stat Script // @namespace http://tampermonkey.net/ // @version 0.3.3 // @description Shows efficiency (attack per piece + downstack per piece) // @author Oki // @match https://*.jstris.jezevec10.com/* // @grant none // ==/UserScript== /************************** Efficiency Stat Script **************************/ (function() { window.addEventListener('load', function(){ STAT_POS = 970; STAT_NAME = "Eff" STAT_POS2 = 1000; STAT_NAME2 = "VS" enable_playing = true enable_replay = true enable_vsscore = true var trim=a=>{a=a.slice(0,-1);a=a.substr(a.indexOf("{")+1);return a} var getParams=a=>{var params=a.slice(a.indexOf("(")+1);params=params.substr(0,params.indexOf(")")).split(",");return params} x = true function afterPlaceBlock() { if(this.clock == 0 && x){ GameCore['downstack'] += (currentGarbage - (JSON.stringify(this.matrix).split(8).length-1)/9) cat = this["v"]["kppElement"].id.slice(-1) pieces = this['placedBlocks'] APP = this["gamedata"]["attack"] / pieces DPP = GameCore['downstack'] / pieces EFF = (APP + DPP) time = this['actions'][this['ptr']]["t"] GameCore[STAT_NAME + "Timestamps"+cat] = GameCore[STAT_NAME + "Timestamps"+cat] || [] GameCore[STAT_NAME + "Timestamps"+cat].push([(EFF).toFixed(2), time]) } else { x = false; GameCore['downstack'] = 0; ["1","2","P"].map(y=>{ stat = GameCore[STAT_NAME + "Timestamps" + y] if(stat){ if(stat[stat.length-1][1] < stat[stat.length-2][1]){ stat[stat.length-1] = stat[stat.length-2] } } }) } } function afterCheckLineClears() { GameCore['downstack'] += (currentGarbage - (JSON.stringify(this.matrix).split(8).length-1)/9) pieces = this["GameStats"]["stats"]["BLOCKS"].value APP = this["gamedata"]["attack"] / pieces DPP = GameCore['downstack'] / pieces if(enable_vsscore){ PPS = this['getPPS']() if(this['GameStats'].get('VS'))this['GameStats'].get('VS').set(((APP + DPP)*PPS).toFixed(2)); } if(this['GameStats'].get('EFF'))this['GameStats'].get('EFF').set((APP + DPP).toFixed(2)); } function beforeCheckLineClears() { window.currentGarbage = (JSON.stringify(this.matrix).split(8).length-1)/9; } if(enable_playing | enable_replay){ var checkLineClearsFunc = GameCore['prototype']['checkLineClears'].toString() var params = getParams(checkLineClearsFunc) checkLineClearsFunc = trim(beforeCheckLineClears.toString()) + trim(checkLineClearsFunc) GameCore['prototype']['checkLineClears'] = new Function(...params, checkLineClearsFunc); } if(enable_playing){ if(typeof Game != "undefined"){ checkLineClearsFunc = GameCore['prototype']['checkLineClears'].toString() checkLineClearsFunc = trim(checkLineClearsFunc) + trim(afterCheckLineClears.toString()) GameCore['prototype']['checkLineClears'] = new Function(...params, checkLineClearsFunc); var readyGoFunc = Game['prototype']["startReadyGo"].toString() readyGoFunc = ` GameCore['downstack']=0; this['GameStats'].addStat(new StatLine('EFF', '`+STAT_NAME+`', `+STAT_POS+`),true); this['GameStats'].addStat(new StatLine('VS', '`+STAT_NAME2+`', `+STAT_POS2+`),true);` + trim(readyGoFunc) Game['prototype']["startReadyGo"] = new Function(readyGoFunc); } } if(enable_replay){ var website = "jstris.jezevec10.com" var url = window.location.href var parts = url.split("/") if(typeof Replayer != "undefined"){ Replayer["addStat"] = function(id,into,name) { var newStat = document.createElement("tr"); newStat.innerHTML = '<td class="ter">'+name+'</td><td class="sval"><span id="'+id+'">0</span></td>' into.appendChild(newStat); } } if(parts[3]=="replay" && parts[2].endsWith(website) && parts.length>4){ GameCore['downstack'] = 0 var placeBlockFunc = GameCore['prototype']['placeBlock'].toString() var params2 = getParams(placeBlockFunc) placeBlockFunc = trim(placeBlockFunc) + trim(afterPlaceBlock.toString()) GameCore['prototype']['placeBlock'] = new Function(...params2, placeBlockFunc); if(parts[4]=="1v1"){ Replayer["addStat"](STAT_NAME+"Element1",document.getElementsByTagName("tbody")[0],STAT_NAME) Replayer["addStat"](STAT_NAME+"Element2",document.getElementsByTagName("tbody")[2],STAT_NAME) if(enable_vsscore){ Replayer["addStat"](STAT_NAME2+"Element1",document.getElementsByTagName("tbody")[0],STAT_NAME2) Replayer["addStat"](STAT_NAME2+"Element2",document.getElementsByTagName("tbody")[2],STAT_NAME2) } } else { Replayer["addStat"](STAT_NAME+"ElementP",document.getElementsByClassName("moreStats")[0]) if(enable_vsscore){ Replayer["addStat"](STAT_NAME2+"ElementP",document.getElementsByClassName("moreStats")[0]) } } Replayer['prototype']['getStat'] = function(cat) { if(stamps=GameCore[STAT_NAME+"Timestamps"+cat]){ for (var i = 1; i < stamps.length; i++) { if(stamps[i][1]>this['clock']){ return stamps[i-1][0] } } return stamps[stamps.length-1][0] } return 0 }; var oldTextBar = View.prototype.updateTextBar.toString(); oldTextBar = trim(oldTextBar) + `; var cat = this.kppElement.id.slice(-1); eval("`+STAT_NAME+`Element"+cat+"&&(`+STAT_NAME+`Element"+cat+".innerHTML = this.g.getStat(cat))"); if(enable_vsscore){ eval("`+STAT_NAME2+`Element"+cat+"&&(`+STAT_NAME2+`Element"+cat+".innerHTML = ($('#PPS'+cat)[0].innerHTML*this.g.getStat(cat)).toFixed(2))"); }` View.prototype.updateTextBar = new Function(oldTextBar); } } }); })();