Behind PB Sound Script

plays a warning sound or restarts when you are behind your personal best (PB)

当前为 2019-06-17 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Behind PB Sound Script
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.3
  5. // @description plays a warning sound or restarts when you are behind your personal best (PB)
  6. // @author Oki
  7. // @match https://*.jstris.jezevec10.com/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. /**************************
  12. Behind PB Sound Script
  13. **************************/
  14.  
  15. (function() {
  16. window.addEventListener('load', function(){
  17.  
  18. localStorage.pbSound = localStorage.pbSound || "0";
  19. localStorage.mapSound = localStorage.mapSound || "0"
  20. localStorage.soundOrRestart = localStorage.soundOrRestart || "0"
  21.  
  22. var pbText = "If enabled, the finesse fault sound will played when falling behind your personal best time in sprint, cheese or a map (page refresh required)"
  23. var mapText = "If enabled, the finesse fault sound will play when falling behind the global best time in a map (page refresh required)"
  24.  
  25. var pbOption = document.createElement("table");
  26. pbOption.innerHTML = '<tbody><tr><td><input onclick="localStorage.pbSound^=1" type="checkbox" id="pbToggle"></td><td><label for="pbToggle">Behind PB sound</label></td></tr><tr><td></td><td><span class="settingsDesc">'+pbText+'</span></td></tr></tbody>'
  27. tab_other.appendChild(pbOption)
  28.  
  29. var mapOption = document.createElement("table");
  30. mapOption.innerHTML = '<tbody><tr><td><input onclick="localStorage.mapSound^=1" type="checkbox" id="mapToggle"></td><td><label for="mapToggle">Behind map record sound</label></td></tr><tr><td></td><td><span class="settingsDesc">'+mapText+'</span></td></tr></tbody>'
  31. tab_other.appendChild(mapOption)
  32.  
  33. var sorOption = document.createElement("table");
  34. sorOption.innerHTML = '<tbody><tr><td><input onclick="localStorage.soundOrRestart^=1" type="checkbox" id="sorToggle"></td><td><label for="sorToggle">Restart instead of playing sound</label></td></tr><tr><td></td></tr></tbody>'
  35. tab_other.appendChild(sorOption)
  36.  
  37. pbToggle.checked = +localStorage.pbSound
  38. mapToggle.checked = +localStorage.mapSound
  39. sorToggle.checked = +localStorage.soundOrRestart
  40.  
  41.  
  42. Game['prototype']['isBannedStartSequence'] = function() {
  43. localStorage.k9 = this["Settings"]["controls"][8]
  44. return 2<=this.queue.length&&1===this.isPmode(!1)&&(5<=this.queue[0].id||1===this.queue[0].id&&5<=this.queue[1].id);
  45. };
  46.  
  47. if(+localStorage.pbSound || +localStorage.mapSound){
  48.  
  49. Game["doRestart"] = function() {
  50. document.dispatchEvent(new KeyboardEvent("keydown",{keyCode:localStorage.k9}))
  51. }
  52.  
  53. var globalBest;
  54. var personalBest;
  55. var oldTimerValue = 0.00;
  56. var currentTimerValue = 0.00;
  57. var username = document.getElementsByClassName("navbar-right")[0].children[0].children[0].innerText.slice(0,-1)
  58. var website = "https://jstris.jezevec10.com/"
  59. var snd = new Audio(website + "res/se0/fault.wav");
  60.  
  61. var url = window.location.href
  62. var parts = /.*\=(\d)&(.*)\=(\d+)/g.exec(url)
  63. var leaderboardUrl = website;
  64.  
  65.  
  66. if(parts[2] == "map") {
  67. leaderboardUrl += "map/" + parts[3]
  68. } else if(parts[2] == "mode") {
  69. if(parts[1] == 1) {
  70. leaderboardUrl += "sprint?display=4&lines="+[,40,20,100,1000][parts[3]]+"L"
  71. } else if(parts[1] == 3) {
  72. leaderboardUrl += "cheese?display=4&lines="+[,10,18,100][parts[3]]+"L"
  73. }
  74. }
  75.  
  76. if(leaderboardUrl != website) {
  77. var xhr = new XMLHttpRequest();
  78. xhr.onload = function() {
  79.  
  80. globalBest = Infinity
  81. personalBest = Infinity
  82.  
  83. var tableEntries = this.responseXML.getElementsByClassName("table")[0].children[1].children
  84.  
  85. for (var i = 0; i < tableEntries.length-1; i++) {
  86. var row = tableEntries[i].innerText.replace(/ /g,"").split("\n")
  87. if(i==0){globalBest = timeStringToMs(row[7])}
  88. if(row[4] == username){personalBest = timeStringToMs(row[7])}
  89. }
  90.  
  91. window.setInterval(()=>{
  92.  
  93. oldTimerValue = currentTimerValue
  94. currentTimerValue = timeStringToMs(clock.innerText);
  95.  
  96. var personalSurpassed = (oldTimerValue <= personalBest) && (currentTimerValue >= personalBest)
  97. var globalSurpassed = (oldTimerValue <= globalBest) && (currentTimerValue >= globalBest)
  98.  
  99. if(+localStorage.SE) {
  100. if(parts[2] == "map"){
  101. if(+localStorage.pbSound)
  102. personalSurpassed&&(+localStorage.soundOrRestart?Game["doRestart"]:snd.play())
  103. if(+localStorage.mapSound)
  104. globalSurpassed&&(+localStorage.soundOrRestart?Game["doRestart"]:snd.play())
  105. } else {
  106. if(+localStorage.pbSound)
  107. globalSurpassed&&(+localStorage.soundOrRestart?Game["doRestart"]:snd.play())
  108. }
  109. }
  110.  
  111. }, 200);
  112.  
  113. }
  114. xhr.open("GET", leaderboardUrl);
  115. xhr.responseType = "document";
  116. xhr.send();
  117. }
  118. }
  119.  
  120.  
  121. function timeStringToMs(s) {
  122. var totalTime=0,parts;~s.indexOf(":")&&(parts=s.split(":"),totalTime+=6E4*parts[0],s=parts[1].slice(0));
  123. ~s.indexOf(".")&&(parts=s.split("."),totalTime+=+(parts[1]+"00").substr(0,3),s=parts[0].slice(0));
  124. return(totalTime+1E3*s);
  125. }
  126.  
  127. });
  128. })();