TagPro Honk

Press space to honk.

当前为 2017-10-07 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name TagPro Honk
  3. // @description Press space to honk.
  4. // @version 0.4
  5. // @supportURL https://www.reddit.com/message/compose/?to=Wilcooo
  6. // @website https://www.reddit.com/r/TagPro/comments/6cn82i/modded_mod_honk_doot_doot/
  7. // @include http://tagpro-*.koalabeast.com:*
  8. // @include http://tangent.jukejuice.com:*
  9. // @include http://*.newcompte.fr:*
  10. // @author CFlakes / Ballzilla / Ko
  11. // @dootdoot Vermite
  12. // @namespace https://greasyfork.org/users/152992
  13. // ==/UserScript==
  14.  
  15.  
  16.  
  17. ////////////////////////////////////////////////////////////////////////////////////////////
  18. // ### --- OPTIONS --- ### //
  19. //////////////////////////////////////////////////////////////////////////////////////// //
  20. // //
  21. // 0: no honksprite, 1: honksprite on ball, 2: honksprite around ball // //
  22. var sprite = 2; // //
  23. // //
  24. // 0: Don't do this, 1: honk, 2: doot doot (by Vermite) // //
  25. var sound = 1; // //
  26. // //
  27. // recomended for honk: 80, recomended for doot doot: 300 // //
  28. // this is the time in milliseconds after which the sound will be repeated. // //
  29. var timeout = 80; // //
  30. // //
  31. // What key to press to honk (up&down simultaneously always works) // //
  32. // Go to keycode.info to get the code for your preferred key. // //
  33. var honkKey = 32; // 32 is the code for the spacebar // //
  34. // //
  35. //////////////////////////////////////////////////////////////////////////////////////// //
  36. // ### --- END OF OPTIONS --- ### //
  37. ////////////////////////////////////////////////////////////////////////////////////////////
  38.  
  39.  
  40.  
  41.  
  42. //////////////////////////////////////
  43. // SCROLL FURTHER AT YOUR OWN RISK! //
  44. //////////////////////////////////////
  45.  
  46.  
  47.  
  48. console.log('START: ' + GM_info.script.name + ' (v' + GM_info.script.version + ' by ' + GM_info.script.author + ')');
  49.  
  50.  
  51.  
  52.  
  53. // Howler:
  54. ! function() {
  55. var e = {},
  56. t = null,
  57. n = !0,
  58. r = !1;
  59. try {
  60. "undefined" != typeof AudioContext ? t = new AudioContext : "undefined" != typeof webkitAudioContext ? t = new webkitAudioContext : n = !1
  61. } catch (i) {
  62. n = !1
  63. }
  64. if (!n)
  65. if ("undefined" != typeof Audio) try {
  66. new Audio
  67. } catch (i) {
  68. r = !0
  69. } else r = !0;
  70. if (n) {
  71. var s = void 0 === t.createGain ? t.createGainNode() : t.createGain();
  72. s.gain.value = 1, s.connect(t.destination)
  73. }
  74. var o = function(e) {
  75. this._volume = 1, this._muted = !1, this.usingWebAudio = n, this.ctx = t, this.noAudio = r, this._howls = [], this._codecs = e, this.iOSAutoEnable = !0
  76. };
  77. o.prototype = {
  78. volume: function(e) {
  79. var t = this;
  80. if (e = parseFloat(e), e >= 0 && 1 >= e) {
  81. t._volume = e, n && (s.gain.value = e);
  82. for (var r in t._howls)
  83. if (t._howls.hasOwnProperty(r) && t._howls[r]._webAudio === !1)
  84. for (var i = 0; i < t._howls[r]._audioNode.length; i++) t._howls[r]._audioNode[i].volume = t._howls[r]._volume * t._volume;
  85. return t
  86. }
  87. return n ? s.gain.value : t._volume
  88. },
  89. mute: function() {
  90. return this._setMuted(!0), this
  91. },
  92. unmute: function() {
  93. return this._setMuted(!1), this
  94. },
  95. _setMuted: function(e) {
  96. var t = this;
  97. t._muted = e, n && (s.gain.value = e ? 0 : t._volume);
  98. for (var r in t._howls)
  99. if (t._howls.hasOwnProperty(r) && t._howls[r]._webAudio === !1)
  100. for (var i = 0; i < t._howls[r]._audioNode.length; i++) t._howls[r]._audioNode[i].muted = e
  101. },
  102. codecs: function(e) {
  103. return this._codecs[e]
  104. },
  105. _enableiOSAudio: function() {
  106. var e = this;
  107. if (!t || !e._iOSEnabled && /iPhone|iPad|iPod/i.test(navigator.userAgent)) {
  108. e._iOSEnabled = !1;
  109. var n = function() {
  110. var r = t.createBuffer(1, 1, 22050),
  111. i = t.createBufferSource();
  112. i.buffer = r, i.connect(t.destination), void 0 === i.start ? i.noteOn(0) : i.start(0), setTimeout(function() {
  113. (i.playbackState === i.PLAYING_STATE || i.playbackState === i.FINISHED_STATE) && (e._iOSEnabled = !0, e.iOSAutoEnable = !1, window.removeEventListener("touchstart", n, !1))
  114. }, 0)
  115. };
  116. return window.addEventListener("touchstart", n, !1), e
  117. }
  118. }
  119. };
  120. var u = null,
  121. a = {};
  122. r || (u = new Audio, a = {
  123. mp3: !!u.canPlayType("audio/mpeg;")
  124. .replace(/^no$/, ""),
  125. opus: !!u.canPlayType('audio/ogg; codecs="opus"')
  126. .replace(/^no$/, ""),
  127. ogg: !!u.canPlayType('audio/ogg; codecs="vorbis"')
  128. .replace(/^no$/, ""),
  129. wav: !!u.canPlayType('audio/wav; codecs="1"')
  130. .replace(/^no$/, ""),
  131. aac: !!u.canPlayType("audio/aac;")
  132. .replace(/^no$/, ""),
  133. m4a: !!(u.canPlayType("audio/x-m4a;") || u.canPlayType("audio/m4a;") || u.canPlayType("audio/aac;"))
  134. .replace(/^no$/, ""),
  135. mp4: !!(u.canPlayType("audio/x-mp4;") || u.canPlayType("audio/mp4;") || u.canPlayType("audio/aac;"))
  136. .replace(/^no$/, ""),
  137. weba: !!u.canPlayType('audio/webm; codecs="vorbis"')
  138. .replace(/^no$/, "")
  139. });
  140. var f = new o(a),
  141. l = function(e) {
  142. var r = this;
  143. r._autoplay = e.autoplay || !1, r._buffer = e.buffer || !1, r._duration = e.duration || 0, r._format = e.format || null, r._loop = e.loop || !1, r._loaded = !1, r._sprite = e.sprite || {}, r._src = e.src || "", r._pos3d = e.pos3d || [0, 0, -.5], r._volume = void 0 !== e.volume ? e.volume : 1, r._urls = e.urls || [], r._rate = e.rate || 1, r._model = e.model || null, r._onload = [e.onload || function() {}], r._onloaderror = [e.onloaderror || function() {}], r._onend = [e.onend || function() {}], r._onpause = [e.onpause || function() {}], r._onplay = [e.onplay || function() {}], r._onendTimer = [], r._webAudio = n && !r._buffer, r._audioNode = [], r._webAudio && r._setupAudioNode(), void 0 !== t && t && f.iOSAutoEnable && f._enableiOSAudio(), f._howls.push(r), r.load()
  144. };
  145. if (l.prototype = {
  146. load: function() {
  147. var e = this,
  148. t = null;
  149. if (r) return void e.on("loaderror");
  150. for (var n = 0; n < e._urls.length; n++) {
  151. var i, s;
  152. if (e._format) i = e._format;
  153. else {
  154. if (s = e._urls[n], i = /^data:audio\/([^;,]+);/i.exec(s), i || (i = /\.([^.]+)$/.exec(s.split("?", 1)[0])), !i) return void e.on("loaderror");
  155. i = i[1].toLowerCase()
  156. }
  157. if (a[i]) {
  158. t = e._urls[n];
  159. break
  160. }
  161. }
  162. if (!t) return void e.on("loaderror");
  163. if (e._src = t, e._webAudio) c(e, t);
  164. else {
  165. var u = new Audio;
  166. u.addEventListener("error", function() {
  167. u.error && 4 === u.error.code && (o.noAudio = !0), e.on("loaderror", {
  168. type: u.error ? u.error.code : 0
  169. })
  170. }, !1), e._audioNode.push(u), u.src = t, u._pos = 0, u.preload = "auto", u.volume = f._muted ? 0 : e._volume * f.volume();
  171. var l = function() {
  172. e._duration = Math.ceil(10 * u.duration) / 10, 0 === Object.getOwnPropertyNames(e._sprite)
  173. .length && (e._sprite = {
  174. _default: [0, 1e3 * e._duration]
  175. }), e._loaded || (e._loaded = !0, e.on("load")), e._autoplay && e.play(), u.removeEventListener("canplaythrough", l, !1)
  176. };
  177. u.addEventListener("canplaythrough", l, !1), u.load()
  178. }
  179. return e
  180. },
  181. urls: function(e) {
  182. var t = this;
  183. return e ? (t.stop(), t._urls = "string" == typeof e ? [e] : e, t._loaded = !1, t.load(), t) : t._urls
  184. },
  185. play: function(e, n) {
  186. var r = this;
  187. return "function" == typeof e && (n = e), e && "function" != typeof e || (e = "_default"), r._loaded ? r._sprite[e] ? (r._inactiveNode(function(i) {
  188. i._sprite = e;
  189. var s = i._pos > 0 ? i._pos : r._sprite[e][0] / 1e3,
  190. o = 0;
  191. r._webAudio ? (o = r._sprite[e][1] / 1e3 - i._pos, i._pos > 0 && (s = r._sprite[e][0] / 1e3 + s)) : o = r._sprite[e][1] / 1e3 - (s - r._sprite[e][0] / 1e3);
  192. var u, a = !(!r._loop && !r._sprite[e][2]),
  193. l = "string" == typeof n ? n : Math.round(Date.now() * Math.random()) + "";
  194. if (function() {
  195. var t = {
  196. id: l,
  197. sprite: e,
  198. loop: a
  199. };
  200. u = setTimeout(function() {
  201. !r._webAudio && a && r.stop(t.id)
  202. .play(e, t.id), r._webAudio && !a && (r._nodeById(t.id)
  203. .paused = !0, r._nodeById(t.id)
  204. ._pos = 0, r._clearEndTimer(t.id)), r._webAudio || a || r.stop(t.id), r.on("end", l)
  205. }, 1e3 * o), r._onendTimer.push({
  206. timer: u,
  207. id: t.id
  208. })
  209. }(), r._webAudio) {
  210. var c = r._sprite[e][0] / 1e3,
  211. h = r._sprite[e][1] / 1e3;
  212. i.id = l, i.paused = !1, d(r, [a, c, h], l), r._playStart = t.currentTime, i.gain.value = r._volume, void 0 === i.bufferSource.start ? i.bufferSource.noteGrainOn(0, s, o) : i.bufferSource.start(0, s, o)
  213. } else {
  214. if (4 !== i.readyState && (i.readyState || !navigator.isCocoonJS)) return r._clearEndTimer(l),
  215. function() {
  216. var t = r,
  217. s = e,
  218. o = n,
  219. u = i,
  220. a = function() {
  221. t.play(s, o), u.removeEventListener("canplaythrough", a, !1)
  222. };
  223. u.addEventListener("canplaythrough", a, !1)
  224. }(), r;
  225. i.readyState = 4, i.id = l, i.currentTime = s, i.muted = f._muted || i.muted, i.volume = r._volume * f.volume(), setTimeout(function() {
  226. i.play()
  227. }, 0)
  228. }
  229. return r.on("play"), "function" == typeof n && n(l), r
  230. }), r) : ("function" == typeof n && n(), r) : (r.on("load", function() {
  231. r.play(e, n)
  232. }), r)
  233. },
  234. pause: function(e) {
  235. var t = this;
  236. if (!t._loaded) return t.on("play", function() {
  237. t.pause(e)
  238. }), t;
  239. t._clearEndTimer(e);
  240. var n = e ? t._nodeById(e) : t._activeNode();
  241. if (n)
  242. if (n._pos = t.pos(null, e), t._webAudio) {
  243. if (!n.bufferSource || n.paused) return t;
  244. n.paused = !0, void 0 === n.bufferSource.stop ? n.bufferSource.noteOff(0) : n.bufferSource.stop(0)
  245. } else n.pause();
  246. return t.on("pause"), t
  247. },
  248. stop: function(e) {
  249. var t = this;
  250. if (!t._loaded) return t.on("play", function() {
  251. t.stop(e)
  252. }), t;
  253. t._clearEndTimer(e);
  254. var n = e ? t._nodeById(e) : t._activeNode();
  255. if (n)
  256. if (n._pos = 0, t._webAudio) {
  257. if (!n.bufferSource || n.paused) return t;
  258. n.paused = !0, void 0 === n.bufferSource.stop ? n.bufferSource.noteOff(0) : n.bufferSource.stop(0)
  259. } else isNaN(n.duration) || (n.pause(), n.currentTime = 0);
  260. return t
  261. },
  262. mute: function(e) {
  263. var t = this;
  264. if (!t._loaded) return t.on("play", function() {
  265. t.mute(e)
  266. }), t;
  267. var n = e ? t._nodeById(e) : t._activeNode();
  268. return n && (t._webAudio ? n.gain.value = 0 : n.muted = !0), t
  269. },
  270. unmute: function(e) {
  271. var t = this;
  272. if (!t._loaded) return t.on("play", function() {
  273. t.unmute(e)
  274. }), t;
  275. var n = e ? t._nodeById(e) : t._activeNode();
  276. return n && (t._webAudio ? n.gain.value = t._volume : n.muted = !1), t
  277. },
  278. volume: function(e, t) {
  279. var n = this;
  280. if (e = parseFloat(e), e >= 0 && 1 >= e) {
  281. if (n._volume = e, !n._loaded) return n.on("play", function() {
  282. n.volume(e, t)
  283. }), n;
  284. var r = t ? n._nodeById(t) : n._activeNode();
  285. return r && (n._webAudio ? r.gain.value = e : r.volume = e * f.volume()), n
  286. }
  287. return n._volume
  288. },
  289. loop: function(e) {
  290. var t = this;
  291. return "boolean" == typeof e ? (t._loop = e, t) : t._loop
  292. },
  293. sprite: function(e) {
  294. var t = this;
  295. return "object" == typeof e ? (t._sprite = e, t) : t._sprite
  296. },
  297. pos: function(e, n) {
  298. var r = this;
  299. if (!r._loaded) return r.on("load", function() {
  300. r.pos(e)
  301. }), "number" == typeof e ? r : r._pos || 0;
  302. e = parseFloat(e);
  303. var i = n ? r._nodeById(n) : r._activeNode();
  304. if (i) return e >= 0 ? (r.pause(n), i._pos = e, r.play(i._sprite, n), r) : r._webAudio ? i._pos + (t.currentTime - r._playStart) : i.currentTime;
  305. if (e >= 0) return r;
  306. for (var s = 0; s < r._audioNode.length; s++)
  307. if (r._audioNode[s].paused && 4 === r._audioNode[s].readyState) return r._webAudio ? r._audioNode[s]._pos : r._audioNode[s].currentTime
  308. },
  309. pos3d: function(e, t, n, r) {
  310. var i = this;
  311. if (t = void 0 !== t && t ? t : 0, n = void 0 !== n && n ? n : -.5, !i._loaded) return i.on("play", function() {
  312. i.pos3d(e, t, n, r)
  313. }), i;
  314. if (!(e >= 0 || 0 > e)) return i._pos3d;
  315. if (i._webAudio) {
  316. var s = r ? i._nodeById(r) : i._activeNode();
  317. s && (i._pos3d = [e, t, n], s.panner.setPosition(e, t, n), s.panner.panningModel = i._model || "HRTF")
  318. }
  319. return i
  320. },
  321. fade: function(e, t, n, r, i) {
  322. var s = this,
  323. o = Math.abs(e - t),
  324. u = e > t ? "down" : "up",
  325. a = o / .01,
  326. f = n / a;
  327. if (!s._loaded) return s.on("load", function() {
  328. s.fade(e, t, n, r, i)
  329. }), s;
  330. s.volume(e, i);
  331. for (var l = 1; a >= l; l++) ! function() {
  332. var e = s._volume + ("up" === u ? .01 : -.01) * l,
  333. n = Math.round(1e3 * e) / 1e3,
  334. o = t;
  335. setTimeout(function() {
  336. s.volume(n, i), n === o && r && r()
  337. }, f * l)
  338. }()
  339. },
  340. fadeIn: function(e, t, n) {
  341. return this.volume(0)
  342. .play()
  343. .fade(0, e, t, n)
  344. },
  345. fadeOut: function(e, t, n, r) {
  346. var i = this;
  347. return i.fade(i._volume, e, t, function() {
  348. n && n(), i.pause(r), i.on("end")
  349. }, r)
  350. },
  351. _nodeById: function(e) {
  352. for (var t = this, n = t._audioNode[0], r = 0; r < t._audioNode.length; r++)
  353. if (t._audioNode[r].id === e) {
  354. n = t._audioNode[r];
  355. break
  356. }
  357. return n
  358. },
  359. _activeNode: function() {
  360. for (var e = this, t = null, n = 0; n < e._audioNode.length; n++)
  361. if (!e._audioNode[n].paused) {
  362. t = e._audioNode[n];
  363. break
  364. }
  365. return e._drainPool(), t
  366. },
  367. _inactiveNode: function(e) {
  368. for (var t = this, n = null, r = 0; r < t._audioNode.length; r++)
  369. if (t._audioNode[r].paused && 4 === t._audioNode[r].readyState) {
  370. e(t._audioNode[r]), n = !0;
  371. break
  372. }
  373. if (t._drainPool(), !n) {
  374. var i;
  375. if (t._webAudio) i = t._setupAudioNode(), e(i);
  376. else {
  377. t.load(), i = t._audioNode[t._audioNode.length - 1];
  378. var s = navigator.isCocoonJS ? "canplaythrough" : "loadedmetadata",
  379. o = function() {
  380. i.removeEventListener(s, o, !1), e(i)
  381. };
  382. i.addEventListener(s, o, !1)
  383. }
  384. }
  385. },
  386. _drainPool: function() {
  387. var e, t = this,
  388. n = 0;
  389. for (e = 0; e < t._audioNode.length; e++) t._audioNode[e].paused && n++;
  390. for (e = t._audioNode.length - 1; e >= 0 && !(5 >= n); e--) t._audioNode[e].paused && (t._webAudio && t._audioNode[e].disconnect(0), n--, t._audioNode.splice(e, 1))
  391. },
  392. _clearEndTimer: function(e) {
  393. for (var t = this, n = 0, r = 0; r < t._onendTimer.length; r++)
  394. if (t._onendTimer[r].id === e) {
  395. n = r;
  396. break
  397. }
  398. var i = t._onendTimer[n];
  399. i && (clearTimeout(i.timer), t._onendTimer.splice(n, 1))
  400. },
  401. _setupAudioNode: function() {
  402. var e = this,
  403. n = e._audioNode,
  404. r = e._audioNode.length;
  405. return n[r] = void 0 === t.createGain ? t.createGainNode() : t.createGain(), n[r].gain.value = e._volume, n[r].paused = !0, n[r]._pos = 0, n[r].readyState = 4, n[r].connect(s), n[r].panner = t.createPanner(), n[r].panner.panningModel = e._model || "equalpower", n[r].panner.setPosition(e._pos3d[0], e._pos3d[1], e._pos3d[2]), n[r].panner.connect(n[r]), n[r]
  406. },
  407. on: function(e, t) {
  408. var n = this,
  409. r = n["_on" + e];
  410. if ("function" == typeof t) r.push(t);
  411. else
  412. for (var i = 0; i < r.length; i++) t ? r[i].call(n, t) : r[i].call(n);
  413. return n
  414. },
  415. off: function(e, t) {
  416. var n = this,
  417. r = n["_on" + e],
  418. i = t ? "" + t : null;
  419. if (i) {
  420. for (var s = 0; s < r.length; s++)
  421. if (i === "" + r[s]) {
  422. r.splice(s, 1);
  423. break
  424. }
  425. } else n["_on" + e] = [];
  426. return n
  427. },
  428. unload: function() {
  429. for (var t = this, n = t._audioNode, r = 0; r < t._audioNode.length; r++) n[r].paused || (t.stop(n[r].id), t.on("end", n[r].id)), t._webAudio ? n[r].disconnect(0) : n[r].src = "";
  430. for (r = 0; r < t._onendTimer.length; r++) clearTimeout(t._onendTimer[r].timer);
  431. var i = f._howls.indexOf(t);
  432. null !== i && i >= 0 && f._howls.splice(i, 1), delete e[t._src], t = null
  433. }
  434. }, n) var c = function(t, n) {
  435. if (n in e) return t._duration = e[n].duration, void p(t);
  436. if (/^data:[^;]+;base64,/.test(n)) {
  437. for (var r = atob(n.split(",")[1]), i = new Uint8Array(r.length), s = 0; s < r.length; ++s) i[s] = r.charCodeAt(s);
  438. h(i.buffer, t, n)
  439. } else {
  440. var o = new XMLHttpRequest;
  441. o.open("GET", n, !0), o.responseType = "arraybuffer", o.onload = function() {
  442. h(o.response, t, n)
  443. }, o.onerror = function() {
  444. t._webAudio && (t._buffer = !0, t._webAudio = !1, t._audioNode = [], delete t._gainNode, delete e[n], t.load())
  445. };
  446. try {
  447. o.send()
  448. } catch (u) {
  449. o.onerror()
  450. }
  451. }
  452. },
  453. h = function(n, r, i) {
  454. t.decodeAudioData(n, function(t) {
  455. t && (e[i] = t, p(r, t))
  456. }, function() {
  457. r.on("loaderror")
  458. })
  459. },
  460. p = function(e, t) {
  461. e._duration = t ? t.duration : e._duration, 0 === Object.getOwnPropertyNames(e._sprite)
  462. .length && (e._sprite = {
  463. _default: [0, 1e3 * e._duration]
  464. }), e._loaded || (e._loaded = !0, e.on("load")), e._autoplay && e.play()
  465. },
  466. d = function(n, r, i) {
  467. var s = n._nodeById(i);
  468. s.bufferSource = t.createBufferSource(), s.bufferSource.buffer = e[n._src], s.bufferSource.connect(s.panner), s.bufferSource.loop = r[0], r[0] && (s.bufferSource.loopStart = r[1], s.bufferSource.loopEnd = r[1] + r[2]), s.bufferSource.playbackRate.value = n._rate
  469. };
  470. "function" == typeof define && define.amd && define(function() {
  471. return {
  472. Howler: f,
  473. Howl: l
  474. }
  475. }), "undefined" != typeof exports && (exports.Howler = f, exports.Howl = l), "undefined" != typeof window && (window.Howler = f, window.Howl = l)
  476. }();
  477.  
  478.  
  479. // End of howler
  480.  
  481.  
  482. tagpro.ready(function waitForId() {
  483. if (!tagpro.playerId) return setTimeout(waitForId, 100);
  484.  
  485.  
  486.  
  487. var self = tagpro.players[tagpro.playerId];
  488. switch (sound) {
  489. case 1:
  490. var honkSound = new Howl({
  491. urls: ["data:audio/mp3;base64,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"],
  492. sprite: {
  493. mid: [21, 96]
  494. }
  495. });
  496. break;
  497. case 2:
  498. var honkSound = new Howl({
  499. urls: ["data:audio/mp3;base64,SUQzAwAAAAABTVRYWFgAAAARAAAAbWFqb3JfYnJhbmQAZGFzaFRYWFgAAAAXAAAAU29mdHdhcmUATGF2ZjU1LjMzLjEwMFRYWFgAAAAbAAAAY29tcGF0aWJsZV9icmFuZHMAaXNvNm1wNDFUWFhYAAAAEAAAAG1pbm9yX3ZlcnNpb24AMFRJVDIAAAAOAAAAU0tVTEwgVFJVTVBFVENPTU0AAAAwAAAAAAAAAGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9ZVZyWWJLQnJJN2//+5AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJbmZvAAAADwAAAAwAABU4ABUVFRUVFRUVKioqKioqKipAQEBAQEBAQFVVVVVVVVVVVWpqampqampqgICAgICAgICVlZWVlZWVlZWqqqqqqqqqqsDAwMDAwMDA1dXV1dXV1dXV6urq6urq6ur//////////wAAADlMQU1FMy45OXIBqgAAAAAAAAAAFIAkBnhGAACAAAAVOJoFAPEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+5AEAAACojLJhRjAAlRI6SChmABLcJtWuZeAAYCX6tcy8ACzyZMmnsEAGAwtMwEAAQ4AAAAIEEIgwmmxCHJpsTJp3v73ERDnk09u/4iIzueTJk7/z2fd+DCZNO7u7/7RH/gmTD3+Bh//gHh4eHhgAAfgHtAABgIdwMDfRC/iAAAIpDDyZNPWIBabRh4OA04gwghGPZAghDnkye3e+IIIZDnkyZO/+55MnesYTJ3fe9974j/wTJ3f/8E073/+Lu7u7u4iIz/xd+IIIGQJIAJNOI+44t4y4fAitp/3WVllaHWNRRC6/LKirUhoF+QRIlQ2OATjE3l3ioVR5q8VwbYOXbE8iV9PNlwzmP9W3fO/rEDWMb+q68dyYWwTjbGPIexPOup7RXoEiZAAJvOI+44t4y4fAit9/3WVllaHWmnELrcsqKNSGgbyCJEqGxwCcYm8u8VCtPK3iuDbBy7YnkSvpmbuGcx/q27539YYNWxvGq68fX+/74//pf/Up1jHkPYnnXU9or0CRKp33tRpLTLgbFgrJZlL9hTYoQu1W33RbWz/+5IEDAAC2E/b52FADGHJ+v3sNACL8T1TDBhUwX6nqm2BipB8E4WgBghnH0wDQ8MVNzcwhd2Q1GrV5ymtOYzQ59bUMTMYx+cs7MvVjTtZtEVaKroiOqm1tSeyGTXMW3MR/5X7EDMXDjhCQABKSUA0V+WSzLW3qbFCH9dH3RbWk+CcLQDYC5OMNQEGLiC1bo6Bi7spFTV1vSWi1JkNST67JKQVRQZB9kl0lUL1silro1KWupa3UpTro12qpspCjQXboKf+d+xgzHzGQAhYfLfjbpSBpcANdWe09rFIpfEasmn4Zga3LJZTx0QhoIjH5uPQAVWmxk3Ofan7nK2crgiD3jsar9BmIocmVaG2YcQrur2dSvIyOdlnqv716C7UIhGKl6Kifzfg4IUpEAAQMPltO2w6QLTgBiLV2XuBDCl8G4wdF39ebKQWKeSl55iIx+vQQACYwqErqWbWsIcMwUmwAAh2OgUbEMxIci2Lm7OS7q9ns8jI52Weq/vXoLtQiEZkvRUT+b8HBSqUAlBGJ6xhNPGzRVYK7DlN0dt23+eSJlq2//uSBA0AAvAu2MsMG9BfpdtNYeNeC+CzlewkT3F+Fa309I3plPyDBAOzoJFooOSZL8eBAW4jN4nwGDY8HscuUWDmfIbSeBZcDiMDd6rJyV/ppuHluUEWLPCBig/WjxAH2aofrrb0dhBWyEkAxollQSKcqRxuadCUgN+DnNejcNsSUQ8BvNJfUDpdsycirhhVm48+CaIXET6uTacQxvOxUz3eZkT7ZLaWBTQdklc6pp8r/Wyd5bCQIsWeEDCHt0eIGs8nXt5TsINDM7uqomsjjcEIrPTGKsw/SqDjN2dGOxVu4oNFapIj6yFZYxf+3FMFwSZa2CIQh9it3EzCqlvdh1ICW2NZ9FYuU3R0DKgYE8OEWIRDx8WKLGhmbmnDZlb0KTLIvZOPerHmyAI0Cm8FRIuXjarDmB2FyMBWs8VHhaQFpiWtWQ0sOJ39tUqIwsy14CoFQ+grdXIxwUw0+hoPpNcvLI/lJZq0+GgbIMGeGVe52aPtiGMR+2tqavp8/ust5zl8jcNqqmiSN0AhLEBJOgV1sL24E2FqhGUgWpJGVDT7GP/7kgQNgAMEStv56C2AYalbvz0CtwwBOXXnoFZhgicuvPYJOBhz4kJz75OzVvJSVIlMdDrMBIMBkzUJwmPvZxEDrpjHX1MFZWQwkjVoUMHo7Uc7b1KRO6oX932exDLfMv1VPyCoFewZ3virVZgEVaQkSoCYshN3AkxB24cRtQkoW5MnShJLfRxhP9p4nKNq/kiSmalmSbOGxgkm6hPEo+b6yReVSOCmfnh8SPVUx0Qmuwzo/c7b1KRO6p/d9nsQy3zL9VT8gkCvYM73xMjFqDi1YIAcAcJzr6AE6VcMwz+PEuJeIVkwPVva5VrxW9B0ynIDeyoaV1mOM8bGB4GDoyxRmqqbtDga8wYHVlqHDr9X9EU30P+h7dI/rZ9qIEq70cjp3Zu9kauzAhTHvDk1KCE8ZRl3AtrnKlDOU7WLu2HCOhNTLyUAb7qqrlOBu5UEDgvlkDpGo39MsdID8/ekxLOrxSh2oYMr2WqnX2v6BAYpn0MH+qAdukflWM92ogSrvRyOndm72Rq7MCFMfRaABxARFCRsda09cAteXZdT1b+vDsD/+5IECwAC3StacwxbsF5pS789gn8MNStp57BPAX0lbbz0CmgUl10wYWL5xUjxgDB7lanL5wjtlVrxMEMaK47kUzra96h2zR8qsp2vVssxGp0dRGu6v4UfaU1CRNAmZpIUBzvdn3OLI1dUW5JSgiG06wlAA1GMMsgsZMSl1L23wD4iKVnLbPtb111h0W5WWY1iN6lVr6wT0CZyf8Vuud/XaZgpvQ057798V0o/Wye6cft3Q39PoDCIeSVTJ+6N2M372+fthgLq6legByAgAgEBOgvJlFWTEeh5OQQi5R2mFERMYA6tGMzhw7L5yvdddhYOnI6NysZB1+KZZwKCAZp2ICI6MjlFCio6lEA23VDJp5l5reqlUZPlSpTWToqlZtcvTdO+g7hqBVlTPZC5AYAgEk5gXk5irLqYqKcgMgl4JQnc8SauDVKN/dsmY4ba7qqzBRg8wvMkBsp8xVk1fpbEPC7koyxbmpNVtcNE13cy0mch+qlUZPlSpTWToqlZtcvTdO+g7hqBVlQdhUAEFAEp0J56dB7G6Q5JBW0BO01aHaOB//uSBAyAAwY+WGsPG8BgR8tPYYN5C/UpWawsUsF3pSt1hIngoFMx5DeixMtaGqCBAtDcLNU+bM2IrFAIuD75yY8dY8MSMsjdEmvowaiVJ4artfzPyKqUMs9jyn2H/8s/YJS1e7c94Llq3C+s7UCYgEQDKJKgJh5vK1B4Htjg6Jr0qeSWyd9XSRRoX+OYtiukpZ69Lwezj2VMkwfv47XwQED/scBG2roFEh6dkNQFSfOrCL+OWRVShlnseU+y//LP2CUtXu3PeC5atwvrPYCAAAABCUBOu01lYV1XkkiwyvJA1qI0UMwlaUMxWhiNFKoCdVyY0+ZTHwfv3ZqLglDDyzXTDZhz0DmVborn8OOrLRwx13tL29WtGdbs+dpdHZ9WVWbu72ty05gbeOyp8BRAAAAJTgJv1mQtJZaqGSLuVonHaksmoXFVWuv6bEJgmEQMiENXd2KCbf5UqHglbMMwjsxXQ6EyymMrrlhx1ZaWVFM8iOXb1a26/u1tHZ3qx1Zu7vLbQs3MDb35WhSAUAAAACVAUypXHeB8YCctVFJiaEsSCP/7kgQMAALWJNTrDGpgXMR6nWHlTkxMtYPsJHTxjxIqlZemESdCQDpwPosu7g4C86R9vOiUq61ElzgqD3O1HZ5alXd2SNnd+Yv0EZRNVrYpDiL4gQ5pIvCbiCFJLEbBdCBGtKKiWGxSAUAAQACVAUylrbvQ+LpO+qiixEjrMg/WQ5CYrChSmZoR+INijzZ1k5mmLaBAdwiyZ5YtIeFHiqy8WFnd3uIvyFhhPtn8Nlf8DTrzX8m6TXN5S/avWofd6/k3+LRmVIZVVW7XGwGpWmuP5POL72p+jxDPoEhagr95ZEzBIUHgChkaVhmG0cXeB+VqS+V6buoKLr1DZdRQfTiPjiQsBa3L2jg8wRtcjJ0aFFk/8+xAbWUw6lvVScM95RLELKPl1ggAAiWizuRi0/OmKkj4TIlU1tsy/2IsmUoBAIDEMJoMVLrA2VsyxyFhA+KM/8HG1tzInE+A5ZAjRWCAUE7BHrkjJPLr2jhrCOXI221GUlVqWnnliJWnPnX8/Ziv/78N213B/51Vs2AAAAEugJNu/DDpPLKZ1mCaaKrMUeb/+5IEDAACrx/Y6w80IFCDm3th5lmKCKV7jDBpcUsU73GHmD5+FwZHXCbcHLXPCGsMSqfriOUKvhVv7RIq+UhiTPNFkBqu3ltsS/xz7WfICUyRra+aj9kSlkGUMoucVBUl0ONqJEJBB5bX4YdJ5ZTOswTTRVZijzDZ19MnMIeArl/WEMtGvI5iQoexVv0pEDEEMJM806CKNN5bbNasH58gLmSNbXzUfsiUsgyhlFziolJdF26tRZZrsBJULgpxlDm7KVM+gNT4F04CmgnppOG25trIk+Ib9NpYRAY1QSTBHDGf/hiBGL+IomvKtIIPb+zUCAoalglRc4YeO7g7QkceuEV126sZZarsBJULSRlCLGEI8USLI8n7enmVtapyFIHOM1QYWwGnDvnMgtTwjlQTFWlGN+KUVqb40TL2z/4Ut5/9U5LQVdBkUuQhAiK6Cz7jYioUeQq2QrMAAAm7gA/zvPM94B5uBpNh2IhtLCfSlTyHIwE8bqohbnrYRxDejae+iHDet1bJnmN/kNOUjahhxVTIb//44qSWNwhf3XzpRnz8//uSBCYAEpoc2WnsNBJRKBusYYJLyjkTcYyYUvFEIm5xkwpmst7xiveW1q2Rusogz2AstubbtHqPPOOVEGYDwlAyYBCSjosAGKrmbnrdOUGbne5I195ygrVQxSGEpykaY9oJH/zsKUqOxUkIbrbV3KZtXol2q8wlng+Ga1ropmEEV7AXmR/Xa8a70RIg07NXLPZUXTX83O9TNcZjnlZd21hN+BzW8SBxCPzfL7YvO3mlwHEFTQXUhGzBh7p+zPNyqavNam6f2N60ZH1eZ+NtYpUEEaF0k60ArC3/bSUONmwVsNMy+TwVUyljdc8rL85YV/AdreJLiJ+b5fbBzu1Tq4FjEWzXH94gYoQMg90Z/Znm5VevNb3T+xvWlH1eZ+NVVYYkUgESUnHAAeaeLk1nGhJrVen2rz4YkUX/UJELqPjxsfG2xy1gpSNj40ZZRnnOwgiOGorGCL2szDgkPR9+cVRUNM74473avSVeZqNL4qMOWUOfIKssauQCJJLjgAPNPFyaxSx+mtVOjXNMaQrxgD+ksCg03Xar1pQ1lMis5noZDP/7kgRBAAKnPt154y0sUye7rz0lZ8pw912MMKtxQp8r8PQKn1RRV29GVlS0R8VGOgDOZ9+cVRUNM7447q7V6SrzNRpfFYeXGn3kWjLgBCKTATGqr4UzghnU2oZDSLMYaECIXkTXSUYOdLK12C4dCNdbTPu6uQyGfhEwcUOZ1EDmKZUUUodiyqXb+xpCtkPFldX8tGl6lo9He4uIl36lqy4CQkswA6oJMBvlAHMxiyK4PLIYxynyrJYrEcjyL4L2aS5/KK71It1Khoa/xBPCD25cQHtWmHrh6CoVStb/ey8jxSur+WjV6rR6O9xaHX2qOLQUUwAASpdgB7TkoXo5kNMB+I8TMPavP9AmWzK1VKs+Vhyqz2PcJjoZ4dmDoRoW/3mamKba4vhabatGGZioP3mxJf+6Y2urBW/fxEktCfvFjH/+YlkQVCAQBScuAIpP637T18LA1nCbuq8QwFkUd0ZoPx+FpEVbHHHHcrH1HuVdJAw5p3f9q4hsOyqbdacO2s8UUXDRXaVCWkVLYeHUvgICMERsyVGCXkhCAEAAALQAKIX/+5IEWYACpCLT+w9A4lVEWm9hhkoKoG8zh5hwyU8N5qTzDhHItxzF+IU5GaADS5iGlxVCiP4lRLtkhExOlDQmfgMRBQCiai4KEktglszMt9XWhWGgoKCwgpbFh8X/4/pvTccm+P9xMV00K4FDf/wU1DAABvAFiIyQZXH8XKcwQEk0xcTpRiFNRPiXbJ6OE6VaRw4kDIzIKAQk0AhNUmPqq2UbUgpygoKCwgqbFh8X/N/oKTNi5N8O8FJgvSQVkFHGjPBattaSSTgAXuqxUVShYqxI8VFWOrFWe/4sLUqFhb6f9v/b4sLf/+Kiv//qFvAADZZZSNlayxyVlBA46OysDBA0DERKqIPJVVTO//XqqqWBiVURMDVRBwMSqDB4NVUGK//////aabKdpp///////6qv2xVVTEFNRTMuOTkuM1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSBG8P8VgAKeghGABG4iSlDGOAQAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ=="],
  500. sprite: {
  501. mid: [1, 270]
  502. }
  503. });
  504. break;
  505. default:
  506. break;
  507. }
  508.  
  509. switch (sprite) {
  510. case 1:
  511. var honkSprite = PIXI.Texture.fromImage("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpi/P//PwMKaGBkwAoa/mOVY2LAD0Dy/WhiHEDcTYwBnEC8CogL0Fz2B4j9gdgInwEiQLwXiIPRxHmhBqyCGsLAgsPPx4BYFU0sBIgdgDgHiE8BcSrEAAhADklGLJpB4CEQW0HZN4FYnZhARAb3gVgOyn4OxBKkGvABiAWg7E/Q8CDJAHTwi1QDBKCuAAE+IP5MqgGKQPwIypYE4nfIBjAiYRC4g8UAeWj0MkBj4CZYI468AEpIm4HYAskCEOAB4i9A3AyN+jpcXngDxE5AvA5N/As07YQD8QZCYfAdiMOAeCI8N0IAyICNQHyOmED8C89MCPADiEthHIAAAwBEhjK+0yzwDgAAAABJRU5ErkJggg==");
  512. break;
  513. case 2:
  514. var honkSprite = PIXI.Texture.fromImage("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAACiUlEQVR4Xu3bMa7bQAwG4RwkZe5/s5zBiYoAgjFFJJPL1fgvPjxgDAjksn4/Xq/XV/n989ffP/ybEUar47j/vP9mhdEqB5bLgeVyYLkcWC4HlsuB5XJguRxYLgeWy4HlcmC5HFguB5bLgW940qM9ZdbKOTFecR6mYqBOT5jzPGPFnBiveB+oYqguu894nq9qToxXdQzWYef5zrNVzojxjq4Bq+041/u7Vc6I8a7OQa263wzjJ7oHNlnxVhg/tWLwp1v1RhgrrFrgiVa+DcYqKxd5itVvgrHS6oV2NvEWGKtNLLabqTfA2GFqwR1M7o6xy+SiU6Z3xthpctkJ0/ti7Da58GrTu2IMD4zhgTE8MIYHxvDAGB4YwwNjeGAMD4zhgTE8MIYHxvDAGB4YwwNjeGAMD4zhgTE8MIYHxvDAGB4YwwNjeGAMD4zhgTHmnP/V5VPH91o+GvfQe36q5aPvg8f/o/e86/hey0djHxjDA2N4YAwPjOGBMTwwhgfG8MAYHhjDA2N4YAwPjOGBMTwwhgfG8MAYHhjDA2N4YAwPjOGBMTwwhgfG8MAYHhjDA2N4YOz2Tf/qMr0rxk7nhaeWXml6X4xd3pedWHi16Z0xdphedNLk7hirTS64i6k3wFhparEdTbwFxioTC+1u9ZtgrLB6kSdZ+TYYP7Vygada9UYYP7FqcIMVb4XxrhUD23S/GcY7ugetsONMh/d3q5wT41WdA1bZebbDeb7KOTFe0TVYtd3nO5xnrJoV4xXVA3V5woyH85wVs2K8onKYTk+Z81A5K0ajykd7EoxGObBcDiyXA8vlwHI5sFwOLJcDy+XAcjmwXA4slwPL5cByObBcDvwFvu24r9frxx9ThG6n1YCdggAAAABJRU5ErkJggg==");
  515. break;
  516. default:
  517. var honkSprite = false;
  518. }
  519.  
  520. function getPlayers() {
  521. requestAnimationFrame(getPlayers);
  522. for (var id in tagpro.players) {
  523. if (!tagpro.players.hasOwnProperty(id)) continue;
  524. var player = tagpro.players[id];
  525. if (player.up && player.down && player.draw && !player.dead) {
  526. if (!player.isHonking) {
  527. var startTime = Date.now();
  528. player.isHonking = true;
  529. drawHonk(player);
  530. if (honkSprite) honk(player, startTime);
  531. }
  532. } else {
  533. if (player.isHonking) {
  534. player.isHonking = false;
  535. if (honkSprite) drawHonk(player, true);
  536. }
  537. }
  538. }
  539. }
  540. requestAnimationFrame(getPlayers);
  541.  
  542. function findCosAngle(self, player) {
  543. var selfVector = {
  544. x: player.x - self.x,
  545. y: player.y - self.y
  546. };
  547. var playerVector = {
  548. x: player.lx,
  549. y: player.ly
  550. };
  551. var scalarProduct = (selfVector.x * playerVector.x) + (selfVector.y * playerVector.y);
  552. var selfMagnitude = Math.sqrt(Math.pow(selfVector.x, 2) + Math.pow(selfVector.y, 2));
  553. var playerMagnitude = Math.sqrt(Math.pow(playerVector.x, 2) + Math.pow(playerVector.y, 2));
  554. return (-(scalarProduct / (selfMagnitude * playerMagnitude)));
  555. }
  556.  
  557. function honk(player, startTime) {
  558. if (!tagpro.sound) return;
  559. if (player.isHonking && Date.now() - startTime < 4000) {
  560. var last;
  561. var distance = Math.sqrt(Math.pow(player.x - self.x, 2) + Math.pow(player.y - self.y, 2)),
  562. volume = distance === 0 ? 1 : Math.max(1 - distance / 800, 0.1);
  563. honkSound.volume(volume);
  564. if (distance > 0) {
  565. var playerSpeed = Math.sqrt(Math.pow(player.lx, 2) + Math.pow(player.ly, 2));
  566. var cosAngle = findCosAngle(self, player);
  567. var rate = playerSpeed * cosAngle;
  568. rate = Math.pow(Math.exp(rate), 1 / 5);
  569.  
  570. honkSound._rate = rate / 4 + 0.75;
  571. } else honkSound._rate = 1;
  572.  
  573. honkSound.play('mid');
  574. setTimeout(function() {
  575. honk(player, startTime);
  576. }, timeout);
  577. } else {
  578. if (player.sprites.honk) drawHonk(player, true);
  579. }
  580. }
  581.  
  582. function drawHonk(player, remove) {
  583. if (!player.sprites.honk && !remove) {
  584. player.sprites.honk = new PIXI.Sprite(honkSprite);
  585. player.sprites.honk.x = -honkSprite.width/2 +20;
  586. player.sprites.honk.y = -honkSprite.height/2 +20;
  587. player.sprites.ball.addChild(player.sprites.honk);
  588. } else {
  589. if (player.sprites.honk && remove) {
  590. player.sprites.ball.removeChild(player.sprites.honk);
  591. player.sprites.honk = null;
  592. }
  593. }
  594. }
  595.  
  596. var initKeyComm = function () { // DO NOT CHANGE THIS FUNCTION, AS IT CAN BREAK OTHER TP SCRIPTS
  597. if (tagpro.KeyComm) return;
  598. else tagpro.KeyComm = true;
  599.  
  600. tagpro.KeyComm = {
  601. sentDir: {},
  602. pressedDir: {},
  603. keyCount: 1,
  604. };
  605.  
  606. var tse = tagpro.socket.emit;
  607.  
  608. tagpro.socket.emit = function(event, args) {
  609. if (event === 'keydown') {
  610. tagpro.KeyComm.sentDir[args.k] = true;
  611. args.t = tagpro.KeyComm.keyCount++;
  612. }
  613. if (event === 'keyup') {
  614. tagpro.KeyComm.sentDir[args.k] = false;
  615. args.t = tagpro.KeyComm.keyCount++;
  616. }
  617. tse(event, args);
  618. };
  619.  
  620.  
  621.  
  622.  
  623. tagpro.KeyComm.stop = function() {
  624.  
  625. var keys = ['up','down','left','right'];
  626.  
  627. for (var k in keys) {
  628. if (!tagpro.KeyComm.pressedDir[keys[k]] && tagpro.KeyComm.sentDir[keys[k]])
  629. tagpro.socket.emit('keyup', {k: keys[k]} );
  630. }
  631. };
  632.  
  633.  
  634. tagpro.KeyComm.send = function(keys,short) {
  635.  
  636. for (var k in keys) {
  637. if (!tagpro.KeyComm.sentDir[keys[k]])
  638. tagpro.socket.emit('keydown', {k: keys[k]} );
  639. }
  640.  
  641. if (short) setTimeout(tagpro.KeyComm.stop,20);
  642. };
  643.  
  644.  
  645. $(document).keydown(function(key) {
  646. switch (key.which) {
  647. case tagpro.keys.down[0]:
  648. case tagpro.keys.down[1]:
  649. case tagpro.keys.down[2]:
  650. tagpro.KeyComm.pressedDir.down = true;
  651. break;
  652. case tagpro.keys.up[0]:
  653. case tagpro.keys.up[1]:
  654. case tagpro.keys.up[2]:
  655. tagpro.KeyComm.pressedDir.up = true;
  656. break;
  657. case tagpro.keys.left[0]:
  658. case tagpro.keys.left[1]:
  659. case tagpro.keys.left[2]:
  660. tagpro.KeyComm.pressedDir.left = true;
  661. break;
  662. case tagpro.keys.right[0]:
  663. case tagpro.keys.right[1]:
  664. case tagpro.keys.right[2]:
  665. tagpro.KeyComm.pressedDir.right = true;
  666. break;
  667. }
  668. });
  669.  
  670. $(document).keyup(function(key) {
  671. switch (key.which) {
  672. case tagpro.keys.down[0]:
  673. case tagpro.keys.down[1]:
  674. case tagpro.keys.down[2]:
  675. tagpro.KeyComm.pressedDir.down = false;
  676. break;
  677. case tagpro.keys.up[0]:
  678. case tagpro.keys.up[1]:
  679. case tagpro.keys.up[2]:
  680. tagpro.KeyComm.pressedDir.up = false;
  681. break;
  682. case tagpro.keys.left[0]:
  683. case tagpro.keys.left[1]:
  684. case tagpro.keys.left[2]:
  685. tagpro.KeyComm.pressedDir.left = false;
  686. break;
  687. case tagpro.keys.right[0]:
  688. case tagpro.keys.right[1]:
  689. case tagpro.keys.right[2]:
  690. tagpro.KeyComm.pressedDir.right = false;
  691. break;
  692. }
  693. });
  694. };
  695. initKeyComm();
  696.  
  697. $(document).keydown(function(key) {
  698. switch (key.which) {
  699. case honkKey:
  700. tagpro.KeyComm.send(['up','down']);
  701. break;
  702. }
  703. });
  704.  
  705. $(document).keyup(function(key) {
  706. switch (key.which) {
  707. case honkKey:
  708. tagpro.KeyComm.stop();
  709. break;
  710.  
  711. }
  712. });
  713. });