Skin Storage Script

a script to easily store as many skins as you want

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

  1. // ==UserScript==
  2. // @name Skin Storage Script
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1
  5. // @description a script to easily store as many skins as you want
  6. // @author Oki
  7. // @match https://*.jstris.jezevec10.com/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. /**************************
  12. Skin Storage Script
  13. **************************/
  14.  
  15. localStorage.customSkins = localStorage.customSkins || "";
  16. localStorage.activeSkins = localStorage.activeSkins || "";
  17. localStorage.randomizeKey = localStorage.randomizeKey || 'F4'
  18.  
  19. document.getElementsByName("bSkin").forEach((radioButton, i)=>{
  20. i>2&&(radioButton.type = "checkbox")
  21. })
  22.  
  23. var randomizeOption = document.createElement("tr");
  24. randomizeOption.innerHTML = '<td>Randomize skin:</td><td><input maxlength="1" id="input421" type="text" size="7" value="'+localStorage.randomizeKey+'"></td><td id="kc421">0</td>'
  25. tab_controls.children[2].appendChild(randomizeOption);
  26.  
  27. var plusButton=document.createElement("div");
  28. plusButton.style = "width:20px;height:20px;background-color:green;text-align:center;font-weight:1000";
  29. plusButton.innerHTML = "+";
  30. plusButton.id = "plusButton";
  31.  
  32.  
  33. var modalStyles=document.createElement("style");
  34. modalStyles.innerHTML='#skinModal {display: none;position: fixed;z-index: 100;padding-top: 200px;left: 0;top: 0;width: 100%;height: 100%;background-color: rgba(0,0,0,0.4)} #modalContent {color:black;background-color: white;margin: auto;padding: 20px;border: 1px solid #888;width: 60%} .xbutton {width:20px;height:20px;background-size:cover;margin-bottom:4px;margin-left:20px;filter: invert(100%)}';
  35. document.body.appendChild(modalStyles);
  36.  
  37. var modal=document.createElement("div");
  38. modal.id = "skinModal";
  39. modal.innerHTML = '<div id="modalContent"><p>Please enter the new skin url. For animated skins, use this format: url1;size1 url2;size2 ...</p><input id="modalInput" style="border:2px solid black;z-index: 1000" type="text" value="https://i.imgur.com/XcnWlC6.png"><br><br><button id="modalClose" style="float:left down">Cancel</button><button id="modalConfirm" style="float:left down">OK</button></div></div>'
  40. app.appendChild(modal);
  41.  
  42.  
  43. var skinModalText = "";
  44.  
  45. modalConfirm.onclick = J=>{
  46. addSkin(1)
  47. }
  48.  
  49. modalClose.onclick = N=>{
  50. addSkin(0)
  51. }
  52.  
  53. function addSkin(flag) {
  54. skinModal.style.display = "none";
  55. skinModalText = modalInput.value
  56. if(skinModalText == ""){flag = 0}
  57. modalInput.value = "";
  58.  
  59. if(!flag){
  60. return;
  61. }
  62.  
  63. var skinNumber = localStorage.customSkins.split(",").length-1;
  64. localStorage.customSkins += ","+skinModalText;
  65. refreshSkins()
  66.  
  67. }
  68.  
  69. plusButton.onclick = X=>{
  70. skinModal.style.display = "block";
  71. }
  72.  
  73. document.getElementsByName("blockSkin")[0].appendChild(plusButton);
  74.  
  75.  
  76. function refreshSkins() {
  77. stopPreviewAnimation();
  78. var oldContainer = document.getElementById("allSkinContainer");
  79. oldContainer.parentNode.removeChild(oldContainer);
  80. addSkins();
  81. startPreviewAnimation();
  82. }
  83.  
  84.  
  85. function addSkins() {
  86. var skins = localStorage.customSkins.split(",")
  87. var allSkinContainer = document.createElement("div")
  88. allSkinContainer.id = "allSkinContainer"
  89.  
  90. skins.map((skin,i)=>{
  91. if(i>0) {
  92. var src = skin.split(";")[0];
  93. allSkinContainer.innerHTML += `<div><input id="bskin`+i+`" type="checkbox" name="bSkin"><label for="bskin`+i+`"><img src="`+src+`" height="20"></label><img src="https://jstris.jezevec10.com/res/svg/dark/rubbish.svg" name="xbutton" class="xbutton" ></div>`
  94. var xbutton = document.getElementById("xbutton")
  95. }
  96. })
  97.  
  98. document.getElementsByName("blockSkin")[0].insertBefore(allSkinContainer,plusButton)
  99. document.getElementsByName("xbutton").forEach((button, i)=>{
  100. button.addEventListener("click", W=>{var temp=localStorage.customSkins.split(',');temp.splice(i+1, 1);localStorage.customSkins=temp;refreshSkins()});
  101. })
  102. }
  103.  
  104.  
  105. function loadSkinNoSize(src) {
  106. var spliced = src.split(";")
  107. if(spliced.length>1){
  108. animatedSkin = src.split(" ").map(x=>x.split(";"))
  109. }
  110.  
  111. var skinImg = new Image();
  112. skinImg.onload = function(){
  113. loadSkin(this.src,this.height)
  114. };
  115. skinImg.src = spliced[0];
  116. }
  117.  
  118.  
  119. function deployRandomSkin() {
  120. if (typeof stopAnim == 'function') {
  121. stopAnim();
  122. animatedSkin = []
  123. }
  124.  
  125. var candidates = localStorage.activeSkins.split(",").slice(1);
  126. var choice = candidates[Math.floor(Math.random()*candidates.length)];
  127.  
  128. if(choice > 6) {
  129. frames = localStorage.customSkins.split(",")[choice-7].split(" ")
  130.  
  131. if(frames.length>1){
  132. animatedSkin = frames.map(x=>x.split(";"))
  133. animationRunning&&startAnim();
  134. }
  135. }
  136.  
  137. loadSkinNoSize(document.getElementsByName("bSkin")[choice].nextSibling.children[0].src)
  138. }
  139.  
  140.  
  141. settingsSave.onmouseup = Y=>{
  142. stopPreviewAnimation();
  143.  
  144. localStorage.activeSkins = ""
  145. document.getElementsByName("bSkin").forEach((e,i)=>{
  146. if(i>2 && e.checked){
  147. localStorage.activeSkins += ","+i;
  148. deployRandomSkin()
  149. }
  150. })
  151. }
  152.  
  153. window.onkeydown = function(e) {
  154. if(e.key.toLowerCase() == "f4") {
  155. deployRandomSkin();
  156. }
  157. }
  158.  
  159. settings.onmouseup = Z=>{
  160. startPreviewAnimation();
  161.  
  162. setTimeout(U=>{
  163. for(var checkbox of document.getElementsByName("bSkin")) {
  164. checkbox.checked = false;
  165. }
  166. var skins = localStorage.activeSkins.split(",");
  167. for (var i = 1; i < skins.length; i++) {
  168. document.getElementsByName("bSkin")[skins[i]].checked = true
  169. }
  170. }, 100)
  171. }
  172.  
  173. var previewIntervals = []
  174. var previewsAnimated = false;
  175.  
  176. function startPreviewAnimation() {
  177. var skins = localStorage.customSkins.split(",")
  178.  
  179. skins.map((skin,j)=>{
  180. var frames = skin.split(" ").map(x=>x.split(";"))
  181. if(frames.length > 1) {
  182.  
  183. var animLength = frames.length*localStorage.animSpeed
  184. frames.map((x,i)=>{
  185. setTimeout(()=>{previewIntervals.push(setInterval(()=>{
  186. document.getElementById("bskin"+j).nextSibling.children[0].src = frames[i][0]
  187. }, animLength))}, i*(animLength/frames.length))
  188. })
  189. }
  190. })
  191. previewsAnimated = true
  192. }
  193.  
  194. function stopPreviewAnimation() {
  195. for (var i=0; i < previewIntervals.length; i++) {
  196. clearInterval(previewIntervals[i]);
  197. }
  198. }
  199.  
  200. addSkins();
  201. deployRandomSkin();