您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Shows efficiency (attack per piece + downstack per piece)
当前为
您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
- // ==UserScript==
- // @name Efficiency Stat Script
- // @namespace http://tampermonkey.net/
- // @version 0.3.2
- // @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][1] = stat[stat.length-2][1]
- }
- }
- })
- }
- }
- 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);
- }
- }
- });
- })();