From b339f54fb33e957f0bc3d1fb452f8e618ac819d9 Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 23 Oct 2016 02:11:13 -0500 Subject: [PATCH 0001/1620] --- undercards.js | 40 ++++++++++++++++++++++++++++++++++++++++ undercards.meta.js | 6 ++++++ 2 files changed, 46 insertions(+) create mode 100644 undercards.js create mode 100644 undercards.meta.js diff --git a/undercards.js b/undercards.js new file mode 100644 index 00000000..73b57eb3 --- /dev/null +++ b/undercards.js @@ -0,0 +1,40 @@ +// ==UserScript== +// @name UnderCards script +// @namespace http://tampermonkey.net/ +// @updateURL https://gist.githubusercontent.com/feildmaster//raw/undercards.meta.js +// @downloadURL https://gist.githubusercontent.com/feildmaster//raw/undercards.js +// @version 0.1 +// @description Minor changes to undercards game +// @author feildmaster +// @match https://undercards.net:8181/Play +// @match https://undercards.net:8181/Game +// @grant none +// @history 0.1 - Made deck selection smart +// ==/UserScript== + +// Play changes +if (location.pathname === "/Play") { + // Classic class storage + if (localStorage.lastClassic && $('#rankedDecks option').filter((i,o) => o.value === localStorage.lastRanked).length !== 0) { + $('#classicDecks').val(localStorage.lastClassic).change(); + } + $('#classicDecks').change(function updateClassic() { + localStorage.lastClassic = $('#classicDecks option:selected').val(); + }); + + // Ranked class storage + if (localStorage.lastRanked && $('#rankedDecks option').filter((i,o) => o.value === localStorage.lastRanked).length !== 0) { + $('#rankedDecks').val(localStorage.lastRanked).change(); + } + $('#rankedDecks').change(function updateRank() { + localStorage.lastRanked = $('#rankedDecks option:selected').val(); + }); + + // TODO: Better "game found" support +} + +// Game changes +if (location.pathname === "/Game") { + // TODO: Event log + // TODO: Visual taunt +} diff --git a/undercards.meta.js b/undercards.meta.js new file mode 100644 index 00000000..9910458c --- /dev/null +++ b/undercards.meta.js @@ -0,0 +1,6 @@ +// ==UserScript== +// @name UnderCards script +// @updateURL https://gist.githubusercontent.com/feildmaster//raw/undercards.meta.js +// @downloadURL https://gist.githubusercontent.com/feildmaster//raw/undercards.js +// @version 0.1 +// ==/UserScript== \ No newline at end of file From b35c6b957c6b3baafa7bb19fd75f70424cb6f6a5 Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 23 Oct 2016 02:11:38 -0500 Subject: [PATCH 0002/1620] --- undercards.js | 4 ++-- undercards.meta.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/undercards.js b/undercards.js index 73b57eb3..58baf379 100644 --- a/undercards.js +++ b/undercards.js @@ -1,8 +1,8 @@ // ==UserScript== // @name UnderCards script // @namespace http://tampermonkey.net/ -// @updateURL https://gist.githubusercontent.com/feildmaster//raw/undercards.meta.js -// @downloadURL https://gist.githubusercontent.com/feildmaster//raw/undercards.js +// @updateURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.meta.js +// @downloadURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.js // @version 0.1 // @description Minor changes to undercards game // @author feildmaster diff --git a/undercards.meta.js b/undercards.meta.js index 9910458c..ff83851a 100644 --- a/undercards.meta.js +++ b/undercards.meta.js @@ -1,6 +1,6 @@ // ==UserScript== // @name UnderCards script -// @updateURL https://gist.githubusercontent.com/feildmaster//raw/undercards.meta.js -// @downloadURL https://gist.githubusercontent.com/feildmaster//raw/undercards.js +// @updateURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.meta.js +// @downloadURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.js // @version 0.1 // ==/UserScript== \ No newline at end of file From 880014ad594115ca2260104c7aae6fc6cf459c3a Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 23 Oct 2016 02:12:01 -0500 Subject: [PATCH 0003/1620] From 74252b8da3acfcee622b711a3d5eca0801464bf1 Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 23 Oct 2016 02:12:18 -0500 Subject: [PATCH 0004/1620] From 1172b0e010d9c84b51e474ba8b73f0d19aa21e6b Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 23 Oct 2016 04:30:42 -0500 Subject: [PATCH 0005/1620] --- undercards.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/undercards.js b/undercards.js index 58baf379..5e6a3c99 100644 --- a/undercards.js +++ b/undercards.js @@ -29,12 +29,8 @@ if (location.pathname === "/Play") { $('#rankedDecks').change(function updateRank() { localStorage.lastRanked = $('#rankedDecks option:selected').val(); }); - - // TODO: Better "game found" support } // Game changes if (location.pathname === "/Game") { - // TODO: Event log - // TODO: Visual taunt } From 2535e0cc38674495c4f9009284407f567be576ba Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 23 Oct 2016 04:31:02 -0500 Subject: [PATCH 0006/1620] --- undercards.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/undercards.js b/undercards.js index 5e6a3c99..8fb55af1 100644 --- a/undercards.js +++ b/undercards.js @@ -7,7 +7,6 @@ // @description Minor changes to undercards game // @author feildmaster // @match https://undercards.net:8181/Play -// @match https://undercards.net:8181/Game // @grant none // @history 0.1 - Made deck selection smart // ==/UserScript== @@ -30,7 +29,3 @@ if (location.pathname === "/Play") { localStorage.lastRanked = $('#rankedDecks option:selected').val(); }); } - -// Game changes -if (location.pathname === "/Game") { -} From 926ef61ba31b678e00d3a6e366df365653e1089e Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 23 Oct 2016 15:47:33 -0500 Subject: [PATCH 0007/1620] --- utilities.js | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 utilities.js diff --git a/utilities.js b/utilities.js new file mode 100644 index 00000000..bb213361 --- /dev/null +++ b/utilities.js @@ -0,0 +1,86 @@ +// Utilities for undercards.js +function debug() { + if (localStorage.getItem("debugging") !== "true") return; + console.log.apply(console, arguments); +} +var fn = { // Not used + each: function(o, f, t) { + if (!o) return; + Object.keys(o).forEach(function(x) { + if (!o[x]) return; + f.call(t, o[x], x, o); // "this", value, key, object + }); + }, +}; +class Hotkey { + constructor(name) { + this.name = name; + this.keys = []; + this.clicks = []; + this.fn = null; + } + + _has(x, a) { + var h = false; + a.some(function (v, i) { + //if (v === x) h = i; + return h = v === x; + }); + return h; + } + + _del(x, a) { + a.some(function (v, i) { + if (x === v) { + a.splice(i, 1); + return true; + } + return false; + }); + } + + bindKey(x) { + if (!this.keybound(x)) { + this.keys.push(x); + } + return this; + } + + unbindKey(x) { + this._del(x, this.keys); + return this; + } + + keybound(x) { + return this._has(x, this.keys); + } + + bindClick(x) { + if (!this.clickbound(x)) { + this.clicks.push(x); + } + return this; + } + + unbindClick(x) { + this._del(x, this.clicks); + return this; + } + + clickbound(x) { + return this._has(x, this.clicks); + } + + run(x) { + if (typeof x === "function") { // Set the function + this.fn = x; + return this; // Allow inline constructing + } else if (this.fn) { // All clear (x is the event) + this.fn(x); + } + } + + toString() { + return `${this.name || "Hotkey"}: Bind{Keys:${JSON.stringify(this.keys)}, Clicks:${JSON.stringify(this.clicks)}}, FN:${this.fn!==null}`; + } +} \ No newline at end of file From 84c6c00a33cbf2df1c7c733aafbdb887b4a58799 Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 23 Oct 2016 15:59:22 -0500 Subject: [PATCH 0008/1620] --- undercards.js | 63 +++++++++++++++++++++++++++++++++++++++++++--- undercards.meta.js | 4 +-- 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/undercards.js b/undercards.js index 8fb55af1..b2cf66b3 100644 --- a/undercards.js +++ b/undercards.js @@ -3,15 +3,28 @@ // @namespace http://tampermonkey.net/ // @updateURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.meta.js // @downloadURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.js -// @version 0.1 -// @description Minor changes to undercards game +// @require https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/utilities.js?v=1 +// @version 0.2 +// @description try to take over the world! // @author feildmaster -// @match https://undercards.net:8181/Play +// @match https://undercards.net:8181/* // @grant none +// @history 0.2 - Added EndTurn hotkey (space, middle click), focus chat (enter) // @history 0.1 - Made deck selection smart // ==/UserScript== -// Play changes +// === Variables start +var hotkeys = [ + new Hotkey("Focus Chat").bindKey(13).run(function(e) { // Join/Show chat and position cursor to input box + if (hide) { + // This currently already works + } + $('#message').focus(); // Always do this + }), +]; +// === Variables end + +// === Play changes start if (location.pathname === "/Play") { // Classic class storage if (localStorage.lastClassic && $('#rankedDecks option').filter((i,o) => o.value === localStorage.lastRanked).length !== 0) { @@ -28,4 +41,46 @@ if (location.pathname === "/Play") { $('#rankedDecks').change(function updateRank() { localStorage.lastRanked = $('#rankedDecks option:selected').val(); }); + + // TODO: Better "game found" support +} +// === Play changes end + +// === Game changes start +if (location.pathname === "/Game") { + var started = false; + // TODO: more Hotkeys + hotkeys.push(new Hotkey("End turn").bindKey(32).bindClick(2).run((e) => {if (started && !$(e.target).is("#endTurnBtn") && userTurn && userTurn === userId) endTurn();})); // Binds to Space, Middle Click + + // TODO: Event log + // TODO: Visual attack targets + var oHandler = socket.onmessage; + socket.onmessage = function onMessageScript(event) { + var data = JSON.parse(bin2str(event.data)); + if (data.action === "getGameStarted") { + // We're running our game. + started = true; + } + oHandler(event); + }; } +// === Game changes end + +// === Always do the following +// Bind hotkey listeners +$(".mainContent").on("click.script", function (event) { + if (false) return; // TODO: Check for clicking in chat + hotkeys.forEach(function(v) { + if (v.clickbound(event.which)) { + v.run(event); + } + }); +}); +$(document).on("keyup.script", function (event) { + if ($(event.target).is("input")) return; // We don't want to listen while typing in chat (maybe listen for F-keys?) + hotkeys.forEach(function(v) { + if (v.keybound(event.which)) { + v.run(event); + } + }); +}); \ No newline at end of file diff --git a/undercards.meta.js b/undercards.meta.js index ff83851a..b5b670e3 100644 --- a/undercards.meta.js +++ b/undercards.meta.js @@ -1,6 +1,4 @@ // ==UserScript== // @name UnderCards script -// @updateURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.meta.js -// @downloadURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.js -// @version 0.1 +// @version 0.2 // ==/UserScript== \ No newline at end of file From f834d0af72b1ac7ffca5c4fcfad59138f59d5ea5 Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 23 Oct 2016 16:01:53 -0500 Subject: [PATCH 0009/1620] --- undercards.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/undercards.js b/undercards.js index b2cf66b3..bf821cd6 100644 --- a/undercards.js +++ b/undercards.js @@ -5,7 +5,7 @@ // @downloadURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.js // @require https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/utilities.js?v=1 // @version 0.2 -// @description try to take over the world! +// @description Minor changes to undercards game // @author feildmaster // @match https://undercards.net:8181/* // @grant none From dbdc0ce23b84cebe801d36bd1deec68dc6dc226c Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 23 Oct 2016 16:31:49 -0500 Subject: [PATCH 0010/1620] --- undercards.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/undercards.js b/undercards.js index bf821cd6..d104beb2 100644 --- a/undercards.js +++ b/undercards.js @@ -68,7 +68,7 @@ if (location.pathname === "/Game") { // === Always do the following // Bind hotkey listeners -$(".mainContent").on("click.script", function (event) { +$(document).on("click.script", function (event) { if (false) return; // TODO: Check for clicking in chat hotkeys.forEach(function(v) { if (v.clickbound(event.which)) { From 43668c5cae42e679fa493d94412af099ff2e584b Mon Sep 17 00:00:00 2001 From: Alan H Date: Thu, 27 Oct 2016 04:46:14 -0500 Subject: [PATCH 0011/1620] --- undercards.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/undercards.js b/undercards.js index d104beb2..5c47c71d 100644 --- a/undercards.js +++ b/undercards.js @@ -4,14 +4,16 @@ // @updateURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.meta.js // @downloadURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.js // @require https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/utilities.js?v=1 -// @version 0.2 +// @version 0.3 // @description Minor changes to undercards game // @author feildmaster // @match https://undercards.net:8181/* // @grant none +// @history 0.3 - Lowered "game found" volume // @history 0.2 - Added EndTurn hotkey (space, middle click), focus chat (enter) // @history 0.1 - Made deck selection smart // ==/UserScript== +// TODO: Event system rather than current code // === Variables start var hotkeys = [ @@ -43,6 +45,15 @@ if (location.pathname === "/Play") { }); // TODO: Better "game found" support + var oHandler = socket.onmessage; + socketQueue.onmessage = function onMessageScript(event) { + var data = JSON.parse(bin2str(event.data)); + oHandler(event); + if (data.action === "getWaitingQueue") { + // Lower the volume, the music changing is enough as is + audioQueue.volume = 0.3; + } + }; } // === Play changes end From d5fb110cad564f1ce3a92c1baba2ccf42a208de7 Mon Sep 17 00:00:00 2001 From: Alan H Date: Thu, 27 Oct 2016 05:57:46 -0500 Subject: [PATCH 0012/1620] --- undercard.readme.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 undercard.readme.md diff --git a/undercard.readme.md b/undercard.readme.md new file mode 100644 index 00000000..54d5e406 --- /dev/null +++ b/undercard.readme.md @@ -0,0 +1,17 @@ +## Setup ## +### Chrome ### +1. Install Tampermonkey (if not already installed) +2. Press "Add a new script" in tampermonkey +3. Paste **undercards.js** into the script box +4. Save. Done. + +### Firefox ### +1. Install Greasemonkey (If not already installed) +2. Add a new script (use random values for the input boxes) +3. Edit the script and paste **undercards.js** into the script box +4. Save. Done. + +## Features ## +1. Remembers Class selection +2. Lowers "game found" volume +3. Press "middle click" or "space" to end turn (not currently very useful... if you're using the mouse anyway) \ No newline at end of file From 7808500f7ea47e6c056d8d5338952122fd3507ea Mon Sep 17 00:00:00 2001 From: Alan H Date: Thu, 27 Oct 2016 06:13:34 -0500 Subject: [PATCH 0013/1620] --- undercard.readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/undercard.readme.md b/undercard.readme.md index 54d5e406..a83a4154 100644 --- a/undercard.readme.md +++ b/undercard.readme.md @@ -14,4 +14,5 @@ ## Features ## 1. Remembers Class selection 2. Lowers "game found" volume -3. Press "middle click" or "space" to end turn (not currently very useful... if you're using the mouse anyway) \ No newline at end of file +3. Press "middle click" or "space" to end turn (not currently very useful... if you're using the mouse anyway) +4. Focus chat with "enter." (In case you have it open already) \ No newline at end of file From 0cb48959c7ed2186dbd9240b497468bf1192465e Mon Sep 17 00:00:00 2001 From: Alan H Date: Thu, 27 Oct 2016 16:22:24 -0500 Subject: [PATCH 0014/1620] --- undercards.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/undercards.js b/undercards.js index 5c47c71d..d3223ca5 100644 --- a/undercards.js +++ b/undercards.js @@ -4,11 +4,12 @@ // @updateURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.meta.js // @downloadURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.js // @require https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/utilities.js?v=1 -// @version 0.3 +// @version 0.4 // @description Minor changes to undercards game // @author feildmaster // @match https://undercards.net:8181/* // @grant none +// @history 0.4 - Remember "event deck" too!, also fixed bugs. // @history 0.3 - Lowered "game found" volume // @history 0.2 - Added EndTurn hotkey (space, middle click), focus chat (enter) // @history 0.1 - Made deck selection smart @@ -28,24 +29,23 @@ var hotkeys = [ // === Play changes start if (location.pathname === "/Play") { - // Classic class storage - if (localStorage.lastClassic && $('#rankedDecks option').filter((i,o) => o.value === localStorage.lastRanked).length !== 0) { - $('#classicDecks').val(localStorage.lastClassic).change(); - } - $('#classicDecks').change(function updateClassic() { - localStorage.lastClassic = $('#classicDecks option:selected').val(); - }); + var applyDeck = function(type, last) { + var deck = $(`#${type}`); + if (!deck.length) return; + if (localStorage[last] && $(`#${type} option`).filter((i,o) => o.value === localStorage[last]).length !== 0) { + deck.val(localStorage[last]).change(); + } + deck.change(function update() { + localStorage[last] = $(`#${type} option:selected`).val(); + }); + }; - // Ranked class storage - if (localStorage.lastRanked && $('#rankedDecks option').filter((i,o) => o.value === localStorage.lastRanked).length !== 0) { - $('#rankedDecks').val(localStorage.lastRanked).change(); - } - $('#rankedDecks').change(function updateRank() { - localStorage.lastRanked = $('#rankedDecks option:selected').val(); - }); + applyDeck("classicDecks", "lastClassic"); // Classic class storage + applyDeck("rankedDecks", "lastRanked"); // Ranked class storage + applyDeck("eventDecks", "lastEvent"); // Event class storage // TODO: Better "game found" support - var oHandler = socket.onmessage; + var oHandler = socketQueue.onmessage; socketQueue.onmessage = function onMessageScript(event) { var data = JSON.parse(bin2str(event.data)); oHandler(event); From 4a18c388d06c28b7dcb33fab765677b80dcf2670 Mon Sep 17 00:00:00 2001 From: Alan H Date: Thu, 27 Oct 2016 16:23:15 -0500 Subject: [PATCH 0015/1620] --- undercards.meta.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/undercards.meta.js b/undercards.meta.js index b5b670e3..2047dcef 100644 --- a/undercards.meta.js +++ b/undercards.meta.js @@ -1,4 +1,4 @@ // ==UserScript== // @name UnderCards script -// @version 0.2 +// @version 0.4 // ==/UserScript== \ No newline at end of file From 31d1d2cf4a1e5c30aaba6f56d455a4fa987c648a Mon Sep 17 00:00:00 2001 From: Alan H Date: Thu, 27 Oct 2016 16:26:56 -0500 Subject: [PATCH 0016/1620] --- undercards.meta.js | 1 + 1 file changed, 1 insertion(+) diff --git a/undercards.meta.js b/undercards.meta.js index 2047dcef..cb22e4e6 100644 --- a/undercards.meta.js +++ b/undercards.meta.js @@ -1,4 +1,5 @@ // ==UserScript== // @name UnderCards script // @version 0.4 +// @downloadURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.js // ==/UserScript== \ No newline at end of file From 524aac9cf156d496c92c1188c591df63e181901a Mon Sep 17 00:00:00 2001 From: Alan H Date: Fri, 28 Oct 2016 19:32:41 -0500 Subject: [PATCH 0017/1620] --- utilities.js | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/utilities.js b/utilities.js index bb213361..8cbdd88d 100644 --- a/utilities.js +++ b/utilities.js @@ -3,6 +3,42 @@ function debug() { if (localStorage.getItem("debugging") !== "true") return; console.log.apply(console, arguments); } +function onPage(name) { + return name.length && location.pathname.substring(1, name.length + 1) === name; +} +var eventManager = { + _events: { + // eventName: [events] + }, + on: function(event, fn) { + if (typeof fn !== "function") return; + if (!this._events.hasOwnProperty(event)) { + this._events[event] = []; + } + this._events[event].push(fn); + }, + emit: function(event, data, cancelable = false) { + var meta = { + cancelable: cancelable, + canceled: false, + }; + var events = this._events[event]; + if (events && events.length) { + events.forEach(function call(ev) { + // Should we stop processing on cancel? Probably. + try { + ev.call(meta, data); + } catch (e) { + console.error(`Error ocurred while parsing event: ${event.displayName || event.name || `unnamed(${event})`}`, e); + } + }); + } + return cancelable && meta.canceled; + }, + _emitRaw: function(event, data, cancelable) { + return this.emit(event, JSON.parse(bin2str(data)), cancelable); + }, +}; var fn = { // Not used each: function(o, f, t) { if (!o) return; From 8bdbe90d6222ad66bf753e0e1676af91551ff6ae Mon Sep 17 00:00:00 2001 From: Alan H Date: Sat, 29 Oct 2016 02:13:17 -0500 Subject: [PATCH 0018/1620] --- undercards.js | 1 - 1 file changed, 1 deletion(-) diff --git a/undercards.js b/undercards.js index d3223ca5..5c7c074f 100644 --- a/undercards.js +++ b/undercards.js @@ -1,7 +1,6 @@ // ==UserScript== // @name UnderCards script // @namespace http://tampermonkey.net/ -// @updateURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.meta.js // @downloadURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.js // @require https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/utilities.js?v=1 // @version 0.4 From 3cf7dcc1ab76aca7760dc167dd62a0ce0bd95cbe Mon Sep 17 00:00:00 2001 From: Alan H Date: Sat, 29 Oct 2016 02:13:45 -0500 Subject: [PATCH 0019/1620] --- undercards.meta.js | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 undercards.meta.js diff --git a/undercards.meta.js b/undercards.meta.js deleted file mode 100644 index cb22e4e6..00000000 --- a/undercards.meta.js +++ /dev/null @@ -1,5 +0,0 @@ -// ==UserScript== -// @name UnderCards script -// @version 0.4 -// @downloadURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.js -// ==/UserScript== \ No newline at end of file From fdb9dd8a609a9a55381b3758da4244eb343b9bc5 Mon Sep 17 00:00:00 2001 From: Alan H Date: Sat, 29 Oct 2016 02:39:20 -0500 Subject: [PATCH 0020/1620] Rename undercard.readme.md to readme.md --- undercard.readme.md => readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename undercard.readme.md => readme.md (90%) diff --git a/undercard.readme.md b/readme.md similarity index 90% rename from undercard.readme.md rename to readme.md index a83a4154..24b218d9 100644 --- a/undercard.readme.md +++ b/readme.md @@ -15,4 +15,4 @@ 1. Remembers Class selection 2. Lowers "game found" volume 3. Press "middle click" or "space" to end turn (not currently very useful... if you're using the mouse anyway) -4. Focus chat with "enter." (In case you have it open already) \ No newline at end of file +4. Focus chat with "enter." (In case you have it open already) From 353a1749a0c4fc58d0188e8e5325758daee88a60 Mon Sep 17 00:00:00 2001 From: Alan H Date: Sat, 29 Oct 2016 02:41:08 -0500 Subject: [PATCH 0021/1620] Transition to new URL's --- undercards.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/undercards.js b/undercards.js index 5c7c074f..672b0ab7 100644 --- a/undercards.js +++ b/undercards.js @@ -1,8 +1,8 @@ // ==UserScript== // @name UnderCards script // @namespace http://tampermonkey.net/ -// @downloadURL https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/undercards.js -// @require https://gist.githubusercontent.com/feildmaster/d151a1cc3c7055bfd8b3323ae1529046/raw/utilities.js?v=1 +// @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js +// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=1 // @version 0.4 // @description Minor changes to undercards game // @author feildmaster @@ -93,4 +93,4 @@ $(document).on("keyup.script", function (event) { v.run(event); } }); -}); \ No newline at end of file +}); From 8c8aba4b752c0874df4bf22c15ea4a1107f556c2 Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 30 Oct 2016 03:37:20 -0500 Subject: [PATCH 0022/1620] [beta] Add a battle log I figure I know a lot of the bugs with the log already, but I don't know if I have enough of them. Time to release it to the wild. --- undercards.js | 278 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 261 insertions(+), 17 deletions(-) diff --git a/undercards.js b/undercards.js index 672b0ab7..f9ed6c0d 100644 --- a/undercards.js +++ b/undercards.js @@ -2,18 +2,59 @@ // @name UnderCards script // @namespace http://tampermonkey.net/ // @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js -// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=1 -// @version 0.4 +// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=2 +// @version 0.5 // @description Minor changes to undercards game // @author feildmaster // @match https://undercards.net:8181/* // @grant none +// @history 0.5 - remember chat messages on page-change, added a battle log, lots of code changes // @history 0.4 - Remember "event deck" too!, also fixed bugs. // @history 0.3 - Lowered "game found" volume // @history 0.2 - Added EndTurn hotkey (space, middle click), focus chat (enter) // @history 0.1 - Made deck selection smart +// @website https://github.com/feildmaster/UnderScript +// @supportURL https://github.com/feildmaster/UnderScript/issues // ==/UserScript== -// TODO: Event system rather than current code +// TODO: more Hotkeys +// TODO: Better battle log display (and make it movable/resizable?) +// TODO: Visual attack targets +// TODO: Random deck option +// TODO: Detailed history log +if (typeof jQuery === "undefined") return; // Might as well check if jQuery is loaded, to remove an error + +var log = { + init: function () { + var hi = $("
"), + ha = $("
History
"), + lo = $("
"); + hi.css({ + width: "400px", + border: "2px solid white", + "background-color": "black", + "position": "fixed", + right: 10, + top: 10, + }); + ha.css({ + "border-bottom": "1px solid white", + "text-align": "center", + }); + lo.css({ + "overflow-y": "auto", + //height: "200px", + "max-height": "600px", + }); + hi.append(ha); + hi.append(lo); + // hi.draggable({handle: "div.handle",}); This breaks it :( + $("body").append(hi); + }, + add: function(text) { + var add = text instanceof jQuery ? text : `
${text}
`; + $("div#history div#log").prepend(add); // Be lazy and prepend, or append and scroll down? + }, +}; // === Variables start var hotkeys = [ @@ -26,8 +67,193 @@ var hotkeys = [ ]; // === Variables end +eventManager.on("getWaitingQueue", function lowerVolume() { + // Lower the volume, the music changing is enough as is + audioQueue.volume = 0.3; +}); + +eventManager.on("PlayingGame", function bindHotkeys() { + // Binds to Space, Middle Click + hotkeys.push(new Hotkey("End turn").bindKey(32).bindClick(2).run((e) => {if (!$(e.target).is("#endTurnBtn") && userTurn && userTurn === userId) endTurn();})); +}); + +(function battleLogger() { + var turn = 0, currentTurn = 0, players = {}, monsters = {}, lastEffect, other = {}, finished = false; + eventManager.on("GameStart", function() { + log.init(); // Init the battle log... or we could wait until adding the first event? + }); + + // TODO: Clean this up + // This is an ugly thing! + eventManager.on("GameEvent", function(data) { + if (finished) return; // Sometimes we get events after the battle is over + // TODO: Delayed events... (green soul, discard (for example, sans)) + var card, you, enemy; + // Battle logging happens after the game runs + switch(data.action) { + case "getGameStarted": // Initialize "game" history here + you = {id: data.yourId, username: data.yourUsername, hp: 30, class: data.yourClass, level: data.yourLevel, rank: data.yourRank}; + enemy = {id: data.ennemyId, username: data.ennemyUsername, hp: 30, class: data.enemyClass, level: data.enemyLevel, rank: data.enemyRank}; + case "getAllGameInfos": // Initialize "spectate" history here + // board = [0, 1, 2, 3, 4, 5, 6, 7, 8] + // ---- typeCard: 0 = enemy; 1: spell + // -- card: {attack, hp, maxHp, originalAttack, originalHp, paralyzed, silence, poisoned, taunt, id, typeCard, name, image, cost, description, rarity, shiny, quantity} + // TODO: turnTime monitoring + turn = data.turn || 0; + if (!you) { + you = JSON.parse(data.you); + enemy = JSON.parse(data.ennemy); + you.class = data.yourClass; + enemy.class = data.enemyClass; + } + if (data.lives) { + var lives = JSON.parse(data.lives); + you.lives = lives[you.id]; + enemy.lives = lives[enemy.id]; + } + players[you.id] = you; + players[enemy.id] = enemy; + // Test changing ID's at endTurn instead of startTurn + other[you.id] = enemy.id; + other[enemy.id] = you.id; + $("div#history div.handle").html(`[${data.gameType}] ${you.username} vs ${enemy.username}`); + log.add(`Turn ${turn}`); + if (data.userTurn) { + currentTurn = data.userTurn; + log.add(`${players[data.userTurn].username}'s turn`); + } + // populate monsters + JSON.parse(data.board).forEach(function (card) { + if (card === null) return; + monsters[card.id] = card; + }); + return; + case "getFight": // monster attack monster + log.add(`${monsters[data.attackMonster].name} attacked ${monsters[data.defendMonster].name}`); + return; + case "getFightPlayer": // monster attacking player + log.add(`${monsters[data.attackMonster].name} attacked ${players[data.defendPlayer].username}`); + return; + case "getUpdatePlayerHp": + var oHp = players[data.playerId].hp; + var hp = data.isDamage ? oHp - data.hp : data.hp - oHp; + players[data.playerId].hp = data.hp; + if (oHp !== data.hp) { // If the player isn't at 0 hp already + log.add(`${players[data.playerId].username} ${data.isDamage ? "lost" : "gained"} ${hp} hp`); + } + if (data.hp === 0 && players[data.playerId].lives > 0 && !players[data.playerId].hasOwnProperty("lostLife")) { // If they have extra lives, and they didn't lose a life already + log.add(`${players[data.playerId].username} lost a life`); + players[data.playerId].lostLife = true; + } + return; + case "getDoingEffect": // Card doing effect + // affecteds: [ids]; monsters affected + // playerAffected1: id; player affected + // playerAffected2: id; player affected + // TODO: Figure out how to do this better + if (lastEffect === data.monsterId) return; + lastEffect = data.monsterId; + log.add(`${monsters[data.monsterId].name}'s effect activated.`); + return; + case "getSoulDoingEffect": // Soul doing effect + log.add(`${players[data.playerId].username}'s soul activated.`); + // affecteds + // playerAffected1 + // playerAffected2 + return; + case "updateMonster": + // monster {card} + return; + case "getTurnStart": // Turn started + lastEffect = 0; + if (data.numTurn !== turn) { + log.add(`Turn ${data.numTurn}`); + } + currentTurn = data.idPlayer; // It would (kindof) help to actually update who's turn it is + turn = data.numTurn; + log.add(`${players[currentTurn].username}'s turn`); + return; + case "getTurnEnd": // Turn ended + // Lets switch the turn NOW, rather than later, the purpose of this is currently unknown... It just sounded like a good idea, also delete the "lostLife" flag... + delete players[currentTurn].lostLife; + currentTurn = other[data.idPlayer]; + delete players[currentTurn].lostLife; + lastEffect = 0; + return; + case "getUpdateBoard": + var oldMonsters = monsters; + monsters = {}; + // TOOD: stuff.... + JSON.parse(data.board).forEach(function (card) { + if (card === null) return; + monsters[card.id] = card; + }); + return; + case "getMonsterDestroyed": // Monster killed + // monsterId: # + log.add(`${monsters[data.monsterId].name} was killed`); + delete monsters[data.monsterId]; + return; + //case "refreshTimer": // Probably don't need this + case "getPlayableCards": // Probably don't need this + // playableCards [#...] + return; + case "getCardBoard": // Adds card to X, Y (0(enemy), 1(you)) + // card + // idPlayer + card = JSON.parse(data.card); + monsters[card.id] = card; + log.add(`${players[data.idPlayer].username} played ${card.name}`); + return; + case "getSpellPlayed": // Spell used + // idPlayer + // card + // immediately calls "getDoingEffect" and "getUpdateBoard" + card = JSON.parse(data.card); + monsters[card.id] = card; + log.add(`${players[data.idPlayer].username} used ${card.name}`); + return; + case "updateSpell": // Use spell + return; + case "getFakeDeath": // Card fake exploded... will be re-added 1 second later? + return; + case "getCardDestroyedHandFull": // Card destroyed from full hand + card = JSON.parse(data.card); + // This event gets called for *all* discards. Have to do smarter logic here (not just currentTurn!) + log.add(`${players[currentTurn].username} discarded ${card.name}`); + return; + case "getPlayerStats": // TODO: When does this get called? + var key, temp = JSON.parse(data.handsSize); + for (key in temp) { + // TODO: hand size monitoring + //players[key].hand + } + // TODO: deck monitoring (decksSize) + // TODO: gold monitoring (golds) + temp = JSON.parse(data.lives); + for (key in temp) { + players[key].lives = temp[key]; + } + return; + case "getResult": // Fight Finish + finished = true; + if (data.cause === "Surrender") { + log.add(`${data.looser} surrendered.`); + } + if (data.cause === "Chara") { + //log.add(`${data.winner} played Chara`); + } + if (data.cause === "Disconnection") { + log.add(`${data.looser} disconnected.`); + } + log.add(`${data.winner} beat ${data.looser}`); + return; + } + }); +})(); + // === Play changes start -if (location.pathname === "/Play") { +if (onPage("Play")) { var applyDeck = function(type, last) { var deck = $(`#${type}`); if (!deck.length) return; @@ -48,34 +274,41 @@ if (location.pathname === "/Play") { socketQueue.onmessage = function onMessageScript(event) { var data = JSON.parse(bin2str(event.data)); oHandler(event); - if (data.action === "getWaitingQueue") { - // Lower the volume, the music changing is enough as is - audioQueue.volume = 0.3; - } + eventManager.emit(data.action, data); }; } // === Play changes end // === Game changes start -if (location.pathname === "/Game") { - var started = false; - // TODO: more Hotkeys - hotkeys.push(new Hotkey("End turn").bindKey(32).bindClick(2).run((e) => {if (started && !$(e.target).is("#endTurnBtn") && userTurn && userTurn === userId) endTurn();})); // Binds to Space, Middle Click - - // TODO: Event log - // TODO: Visual attack targets +if (onPage("Game")) { var oHandler = socket.onmessage; socket.onmessage = function onMessageScript(event) { var data = JSON.parse(bin2str(event.data)); + //console.log(bin2str(event.data)); + oHandler(event); if (data.action === "getGameStarted") { // We're running our game. - started = true; + eventManager.emit("GameStart"); + eventManager.emit("PlayingGame"); } - oHandler(event); + eventManager.emit("GameEvent", data); }; } // === Game changes end +// Spectate mode +if (onPage("gameSpectate")) { + eventManager.emit("GameStart"); + + var oHandler = socket.onmessage; + socket.onmessage = function onMessageScript(event) { + //console.log(bin2str(event.data)); + oHandler(event); + eventManager._emitRaw("GameEvent", event.data); + }; +} +// Spectate mode + // === Always do the following // Bind hotkey listeners $(document).on("click.script", function (event) { @@ -94,3 +327,14 @@ $(document).on("keyup.script", function (event) { } }); }); + +$(window).unload(function() { + // Store chat text (if any) + var val = $("#message").val(); + if (!val) return; + localStorage.oldChat = val; +}); +if (localStorage.oldChat) { + $("#message").val(localStorage.oldChat); + delete localStorage.oldChat; +} From 06e9723e32b34d86efc256f0d18f9ed1ca50adb4 Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 30 Oct 2016 03:43:02 -0500 Subject: [PATCH 0023/1620] Update features --- readme.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 24b218d9..255b8d6e 100644 --- a/readme.md +++ b/readme.md @@ -14,5 +14,9 @@ ## Features ## 1. Remembers Class selection 2. Lowers "game found" volume -3. Press "middle click" or "space" to end turn (not currently very useful... if you're using the mouse anyway) -4. Focus chat with "enter." (In case you have it open already) +3. Hot keys +4. Battle Log + +### Hotkeys ### +1. Press "middle click" or "space" to end turn (not currently very useful... if you're using the mouse anyway) +2. Focus chat with "enter" (In case you have it open already) From c9e9b07c2e7b81ae565175b0e8d5b52e1c74d6b0 Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 30 Oct 2016 03:45:00 -0500 Subject: [PATCH 0024/1620] Link to the actual script --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 255b8d6e..6ff70639 100644 --- a/readme.md +++ b/readme.md @@ -2,13 +2,13 @@ ### Chrome ### 1. Install Tampermonkey (if not already installed) 2. Press "Add a new script" in tampermonkey -3. Paste **undercards.js** into the script box +3. Paste **[undercards.js](https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js)** into the script box 4. Save. Done. ### Firefox ### 1. Install Greasemonkey (If not already installed) 2. Add a new script (use random values for the input boxes) -3. Edit the script and paste **undercards.js** into the script box +3. Edit the script and paste **[undercards.js](https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js)** into the script box 4. Save. Done. ## Features ## From ea6a150fcddd54be272ae128e08de215e875a615 Mon Sep 17 00:00:00 2001 From: Alan H Date: Mon, 31 Oct 2016 16:18:18 -0500 Subject: [PATCH 0025/1620] Update for low resolutions The battle log should no longer cover the game board --- undercards.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/undercards.js b/undercards.js index f9ed6c0d..36353d3d 100644 --- a/undercards.js +++ b/undercards.js @@ -2,12 +2,13 @@ // @name UnderCards script // @namespace http://tampermonkey.net/ // @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js -// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=2 -// @version 0.5 +// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=3 +// @version 0.5.1 // @description Minor changes to undercards game // @author feildmaster // @match https://undercards.net:8181/* // @grant none +// @history 0.5.1 - repositioned battle log // @history 0.5 - remember chat messages on page-change, added a battle log, lots of code changes // @history 0.4 - Remember "event deck" too!, also fixed bugs. // @history 0.3 - Lowered "game found" volume @@ -28,6 +29,8 @@ var log = { var hi = $("
"), ha = $("
History
"), lo = $("
"); + // Positional math + var pos = parseInt($("div.mainContent").css("width")) + parseInt($("div.mainContent").css("margin-left")); hi.css({ width: "400px", border: "2px solid white", @@ -35,6 +38,7 @@ var log = { "position": "fixed", right: 10, top: 10, + left: pos, }); ha.css({ "border-bottom": "1px solid white", From 866b0c8f3b6e02d158770509d71cddf4de51079a Mon Sep 17 00:00:00 2001 From: Alan H Date: Mon, 31 Oct 2016 17:40:32 -0500 Subject: [PATCH 0026/1620] Update for low resolutions (part 2) Apply a constraint to the chat box, and bind the battle log's width --- undercards.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/undercards.js b/undercards.js index 36353d3d..225cb214 100644 --- a/undercards.js +++ b/undercards.js @@ -2,13 +2,14 @@ // @name UnderCards script // @namespace http://tampermonkey.net/ // @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js -// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=3 +// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=2 // @version 0.5.1 // @description Minor changes to undercards game // @author feildmaster // @match https://undercards.net:8181/* // @grant none -// @history 0.5.1 - repositioned battle log +// @history 0.5.2 - do the same for the chat window +// @history 0.5.1 - don't cover the battle screen // @history 0.5 - remember chat messages on page-change, added a battle log, lots of code changes // @history 0.4 - Remember "event deck" too!, also fixed bugs. // @history 0.3 - Lowered "game found" volume @@ -32,13 +33,13 @@ var log = { // Positional math var pos = parseInt($("div.mainContent").css("width")) + parseInt($("div.mainContent").css("margin-left")); hi.css({ - width: "400px", + width: `${window.innerWidth - pos - 20}px`, border: "2px solid white", "background-color": "black", "position": "fixed", right: 10, top: 10, - left: pos, + //"max-height": `${window.innerHeight - 20}px`, }); ha.css({ "border-bottom": "1px solid white", @@ -331,7 +332,6 @@ $(document).on("keyup.script", function (event) { } }); }); - $(window).unload(function() { // Store chat text (if any) var val = $("#message").val(); @@ -342,3 +342,5 @@ if (localStorage.oldChat) { $("#message").val(localStorage.oldChat); delete localStorage.oldChat; } +// Make the chatBox smaller if necessary +$("div.chatBox").css("max-width", $("div.mainContent").css("margin-left")); From 383612abe815ff564b3d9e800b7d50258433bc1b Mon Sep 17 00:00:00 2001 From: Alan H Date: Mon, 31 Oct 2016 17:40:52 -0500 Subject: [PATCH 0027/1620] Updating the version would be nice. --- undercards.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/undercards.js b/undercards.js index 225cb214..727f095b 100644 --- a/undercards.js +++ b/undercards.js @@ -3,7 +3,7 @@ // @namespace http://tampermonkey.net/ // @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=2 -// @version 0.5.1 +// @version 0.5.2 // @description Minor changes to undercards game // @author feildmaster // @match https://undercards.net:8181/* From 073a54699a619e9ed495c126b05faeca599a73bf Mon Sep 17 00:00:00 2001 From: Alan H Date: Mon, 31 Oct 2016 17:42:46 -0500 Subject: [PATCH 0028/1620] Update readme.md --- readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.md b/readme.md index 6ff70639..8630ecad 100644 --- a/readme.md +++ b/readme.md @@ -16,6 +16,7 @@ 2. Lowers "game found" volume 3. Hot keys 4. Battle Log +5. Constrain the chat log width for low resolutions ### Hotkeys ### 1. Press "middle click" or "space" to end turn (not currently very useful... if you're using the mouse anyway) From 873a497d76f562451821e78e382d2720676cb0a3 Mon Sep 17 00:00:00 2001 From: Alan H Date: Mon, 31 Oct 2016 19:06:38 -0500 Subject: [PATCH 0029/1620] Update readme.md --- readme.md | 1 - 1 file changed, 1 deletion(-) diff --git a/readme.md b/readme.md index 8630ecad..6ff70639 100644 --- a/readme.md +++ b/readme.md @@ -16,7 +16,6 @@ 2. Lowers "game found" volume 3. Hot keys 4. Battle Log -5. Constrain the chat log width for low resolutions ### Hotkeys ### 1. Press "middle click" or "space" to end turn (not currently very useful... if you're using the mouse anyway) From bd87aea6834b3b97df9557a496bd4840021a15b5 Mon Sep 17 00:00:00 2001 From: Alan H Date: Mon, 31 Oct 2016 19:06:51 -0500 Subject: [PATCH 0030/1620] Revert the chat fix --- undercards.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/undercards.js b/undercards.js index 727f095b..a6f5f736 100644 --- a/undercards.js +++ b/undercards.js @@ -3,11 +3,12 @@ // @namespace http://tampermonkey.net/ // @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=2 -// @version 0.5.2 +// @version 0.5.3 // @description Minor changes to undercards game // @author feildmaster // @match https://undercards.net:8181/* // @grant none +// @history 0.5.3 - Remove the chat stuff, the new chat is better. // @history 0.5.2 - do the same for the chat window // @history 0.5.1 - don't cover the battle screen // @history 0.5 - remember chat messages on page-change, added a battle log, lots of code changes @@ -342,5 +343,3 @@ if (localStorage.oldChat) { $("#message").val(localStorage.oldChat); delete localStorage.oldChat; } -// Make the chatBox smaller if necessary -$("div.chatBox").css("max-width", $("div.mainContent").css("margin-left")); From 600d53e78875019fd2651e5f559372201b18d21b Mon Sep 17 00:00:00 2001 From: Alan H Date: Wed, 2 Nov 2016 03:44:19 -0500 Subject: [PATCH 0031/1620] Don't scroll the battle log with the page This fixes an issue where the log will cover cards on smaller resolutions --- undercards.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/undercards.js b/undercards.js index a6f5f736..883cb91d 100644 --- a/undercards.js +++ b/undercards.js @@ -3,11 +3,12 @@ // @namespace http://tampermonkey.net/ // @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=2 -// @version 0.5.3 +// @version 0.5.4 // @description Minor changes to undercards game // @author feildmaster // @match https://undercards.net:8181/* // @grant none +// @history 0.5.4 - Don't scroll the battle log with the page (possibly make this configurable later) // @history 0.5.3 - Remove the chat stuff, the new chat is better. // @history 0.5.2 - do the same for the chat window // @history 0.5.1 - don't cover the battle screen @@ -37,7 +38,7 @@ var log = { width: `${window.innerWidth - pos - 20}px`, border: "2px solid white", "background-color": "black", - "position": "fixed", + "position": "absolute", right: 10, top: 10, //"max-height": `${window.innerHeight - 20}px`, From 697fcace8990d4646628f4ed1f0a197033d8e17e Mon Sep 17 00:00:00 2001 From: Alan H Date: Wed, 2 Nov 2016 20:29:42 -0500 Subject: [PATCH 0032/1620] new onPage function cuz I'm bored, it's backwards compatible. Woo --- utilities.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/utilities.js b/utilities.js index 8cbdd88d..69ab15fc 100644 --- a/utilities.js +++ b/utilities.js @@ -3,8 +3,14 @@ function debug() { if (localStorage.getItem("debugging") !== "true") return; console.log.apply(console, arguments); } -function onPage(name) { - return name.length && location.pathname.substring(1, name.length + 1) === name; +function onPage(name, fn) { + console.log(name, location.pathname); + var r = name.length && location.pathname.substring(1, name.length + 1) === name; + if (typeof fn === "function" && r) { + console.log("running"); + fn(); + } + return r; } var eventManager = { _events: { @@ -119,4 +125,4 @@ class Hotkey { toString() { return `${this.name || "Hotkey"}: Bind{Keys:${JSON.stringify(this.keys)}, Clicks:${JSON.stringify(this.clicks)}}, FN:${this.fn!==null}`; } -} \ No newline at end of file +} From 08bf37ef14ab8c240b67a9fcd67355d040c24623 Mon Sep 17 00:00:00 2001 From: Alan H Date: Wed, 2 Nov 2016 20:31:31 -0500 Subject: [PATCH 0033/1620] remove debug (haha) --- utilities.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/utilities.js b/utilities.js index 69ab15fc..3bf66e7e 100644 --- a/utilities.js +++ b/utilities.js @@ -4,10 +4,8 @@ function debug() { console.log.apply(console, arguments); } function onPage(name, fn) { - console.log(name, location.pathname); var r = name.length && location.pathname.substring(1, name.length + 1) === name; if (typeof fn === "function" && r) { - console.log("running"); fn(); } return r; From 3c04248e421da1f7d3f26acee47ba4c0b8afb0f9 Mon Sep 17 00:00:00 2001 From: Alan H Date: Fri, 4 Nov 2016 10:35:54 -0500 Subject: [PATCH 0034/1620] Fixed a bug --- utilities.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utilities.js b/utilities.js index 3bf66e7e..41de45d4 100644 --- a/utilities.js +++ b/utilities.js @@ -33,7 +33,7 @@ var eventManager = { try { ev.call(meta, data); } catch (e) { - console.error(`Error ocurred while parsing event: ${event.displayName || event.name || `unnamed(${event})`}`, e); + console.error(`Error ocurred while parsing event: ${ev.displayName || ev.name || `unnamed(${event})`}`, e); } }); } From e15de3a80379e12bf1d94b379f99819c1c4874a8 Mon Sep 17 00:00:00 2001 From: Alan H Date: Fri, 4 Nov 2016 19:52:24 -0500 Subject: [PATCH 0035/1620] Add color to battle log, update game URL --- undercards.js | 89 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 32 deletions(-) diff --git a/undercards.js b/undercards.js index 883cb91d..32942856 100644 --- a/undercards.js +++ b/undercards.js @@ -2,12 +2,13 @@ // @name UnderCards script // @namespace http://tampermonkey.net/ // @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js -// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=2 -// @version 0.5.4 +// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=3 +// @version 0.6 // @description Minor changes to undercards game // @author feildmaster -// @match https://undercards.net:8181/* +// @match https://undercards.net/* // @grant none +// @history 0.6 - some upgrades to the battle log, fixed url // @history 0.5.4 - Don't scroll the battle log with the page (possibly make this configurable later) // @history 0.5.3 - Remove the chat stuff, the new chat is better. // @history 0.5.2 - do the same for the chat window @@ -86,6 +87,23 @@ eventManager.on("PlayingGame", function bindHotkeys() { (function battleLogger() { var turn = 0, currentTurn = 0, players = {}, monsters = {}, lastEffect, other = {}, finished = false; + var make = { + player: function makePlayer(player) { + var c = $(""); + c.append(player.username); + //c.attr("title", `${player.gold} gold`); // gold is broken + //c.hover(); // TODO: hover information + c.addClass(player.class); + return c[0].outerHTML; + }, + card: function makeCard(card) { + var c = $(""); + c.append(card.name); + //c.hover(); // TODO: hover information + return c[0].outerHTML; + }, + }; + eventManager.on("GameStart", function() { log.init(); // Init the battle log... or we could wait until adding the first event? }); @@ -94,13 +112,13 @@ eventManager.on("PlayingGame", function bindHotkeys() { // This is an ugly thing! eventManager.on("GameEvent", function(data) { if (finished) return; // Sometimes we get events after the battle is over - // TODO: Delayed events... (green soul, discard (for example, sans)) + // TODO: Delayed events... (green soul, discard (for example, sans)) var card, you, enemy; // Battle logging happens after the game runs switch(data.action) { case "getGameStarted": // Initialize "game" history here - you = {id: data.yourId, username: data.yourUsername, hp: 30, class: data.yourClass, level: data.yourLevel, rank: data.yourRank}; - enemy = {id: data.ennemyId, username: data.ennemyUsername, hp: 30, class: data.enemyClass, level: data.enemyLevel, rank: data.enemyRank}; + you = {id: data.yourId, username: data.yourUsername, hp: 30, class: data.yourClass, level: data.yourLevel, rank: data.yourRank, gold: 2}; + enemy = {id: data.ennemyId, username: data.ennemyUsername, hp: 30, class: data.enemyClass, level: data.enemyLevel, rank: data.enemyRank, gold: 2}; case "getAllGameInfos": // Initialize "spectate" history here // board = [0, 1, 2, 3, 4, 5, 6, 7, 8] // ---- typeCard: 0 = enemy; 1: spell @@ -112,6 +130,9 @@ eventManager.on("PlayingGame", function bindHotkeys() { enemy = JSON.parse(data.ennemy); you.class = data.yourClass; enemy.class = data.enemyClass; + var gold = JSON.parse(data.golds); + you.gold = gold[you.id]; + enemy.gold = gold[enemy.id]; } if (data.lives) { var lives = JSON.parse(data.lives); @@ -123,11 +144,11 @@ eventManager.on("PlayingGame", function bindHotkeys() { // Test changing ID's at endTurn instead of startTurn other[you.id] = enemy.id; other[enemy.id] = you.id; - $("div#history div.handle").html(`[${data.gameType}] ${you.username} vs ${enemy.username}`); + $("div#history div.handle").html(`[${data.gameType}] ${make.player(you)} vs ${make.player(enemy)}`); log.add(`Turn ${turn}`); if (data.userTurn) { currentTurn = data.userTurn; - log.add(`${players[data.userTurn].username}'s turn`); + log.add(`${make.player(players[data.userTurn])}'s turn`); } // populate monsters JSON.parse(data.board).forEach(function (card) { @@ -136,20 +157,20 @@ eventManager.on("PlayingGame", function bindHotkeys() { }); return; case "getFight": // monster attack monster - log.add(`${monsters[data.attackMonster].name} attacked ${monsters[data.defendMonster].name}`); + log.add(`${make.card(monsters[data.attackMonster])} attacked ${make.card(monsters[data.defendMonster])}`); return; case "getFightPlayer": // monster attacking player - log.add(`${monsters[data.attackMonster].name} attacked ${players[data.defendPlayer].username}`); + log.add(`${make.card(monsters[data.attackMonster])} attacked ${make.player(players[data.defendPlayer])}`); return; case "getUpdatePlayerHp": var oHp = players[data.playerId].hp; var hp = data.isDamage ? oHp - data.hp : data.hp - oHp; players[data.playerId].hp = data.hp; if (oHp !== data.hp) { // If the player isn't at 0 hp already - log.add(`${players[data.playerId].username} ${data.isDamage ? "lost" : "gained"} ${hp} hp`); + log.add(`${make.player(players[data.playerId])} ${data.isDamage ? "lost" : "gained"} ${hp} hp`); } if (data.hp === 0 && players[data.playerId].lives > 0 && !players[data.playerId].hasOwnProperty("lostLife")) { // If they have extra lives, and they didn't lose a life already - log.add(`${players[data.playerId].username} lost a life`); + log.add(`${make.player(players[data.playerId])} lost a life`); players[data.playerId].lostLife = true; } return; @@ -160,10 +181,10 @@ eventManager.on("PlayingGame", function bindHotkeys() { // TODO: Figure out how to do this better if (lastEffect === data.monsterId) return; lastEffect = data.monsterId; - log.add(`${monsters[data.monsterId].name}'s effect activated.`); + log.add(`${make.card(monsters[data.monsterId])}'s effect activated.`); return; case "getSoulDoingEffect": // Soul doing effect - log.add(`${players[data.playerId].username}'s soul activated.`); + log.add(`${make.player(players[data.playerId])}'s soul activated.`); // affecteds // playerAffected1 // playerAffected2 @@ -178,7 +199,7 @@ eventManager.on("PlayingGame", function bindHotkeys() { } currentTurn = data.idPlayer; // It would (kindof) help to actually update who's turn it is turn = data.numTurn; - log.add(`${players[currentTurn].username}'s turn`); + log.add(`${make.player(players[currentTurn])}'s turn`); return; case "getTurnEnd": // Turn ended // Lets switch the turn NOW, rather than later, the purpose of this is currently unknown... It just sounded like a good idea, also delete the "lostLife" flag... @@ -198,7 +219,7 @@ eventManager.on("PlayingGame", function bindHotkeys() { return; case "getMonsterDestroyed": // Monster killed // monsterId: # - log.add(`${monsters[data.monsterId].name} was killed`); + log.add(`${make.card(monsters[data.monsterId])} was killed`); delete monsters[data.monsterId]; return; //case "refreshTimer": // Probably don't need this @@ -210,7 +231,7 @@ eventManager.on("PlayingGame", function bindHotkeys() { // idPlayer card = JSON.parse(data.card); monsters[card.id] = card; - log.add(`${players[data.idPlayer].username} played ${card.name}`); + log.add(`${make.player(players[data.idPlayer])} played ${make.card(card)}`); return; case "getSpellPlayed": // Spell used // idPlayer @@ -218,7 +239,7 @@ eventManager.on("PlayingGame", function bindHotkeys() { // immediately calls "getDoingEffect" and "getUpdateBoard" card = JSON.parse(data.card); monsters[card.id] = card; - log.add(`${players[data.idPlayer].username} used ${card.name}`); + log.add(`${make.player(players[data.idPlayer])} used ${make.card(card)}`); return; case "updateSpell": // Use spell return; @@ -227,7 +248,7 @@ eventManager.on("PlayingGame", function bindHotkeys() { case "getCardDestroyedHandFull": // Card destroyed from full hand card = JSON.parse(data.card); // This event gets called for *all* discards. Have to do smarter logic here (not just currentTurn!) - log.add(`${players[currentTurn].username} discarded ${card.name}`); + log.add(`${make.player(players[currentTurn])} discarded ${make.card(card)}`); return; case "getPlayerStats": // TODO: When does this get called? var key, temp = JSON.parse(data.handsSize); @@ -236,12 +257,19 @@ eventManager.on("PlayingGame", function bindHotkeys() { //players[key].hand } // TODO: deck monitoring (decksSize) - // TODO: gold monitoring (golds) + temp = JSON.parse(data.golds); + for (key in temp) { + players[key].gold = temp[key]; + } temp = JSON.parse(data.lives); for (key in temp) { players[key].lives = temp[key]; } return; + case "getVictory": // TODO + case "getVictoryDeco": // TODO + case "getDefeat": // TODO + break; case "getResult": // Fight Finish finished = true; if (data.cause === "Surrender") { @@ -259,8 +287,8 @@ eventManager.on("PlayingGame", function bindHotkeys() { }); })(); -// === Play changes start -if (onPage("Play")) { +// === Play hooks +onPage("Play", function() { var applyDeck = function(type, last) { var deck = $(`#${type}`); if (!deck.length) return; @@ -283,11 +311,10 @@ if (onPage("Play")) { oHandler(event); eventManager.emit(data.action, data); }; -} -// === Play changes end +}); -// === Game changes start -if (onPage("Game")) { +// === Game hooks +onPage("Game", function() { var oHandler = socket.onmessage; socket.onmessage = function onMessageScript(event) { var data = JSON.parse(bin2str(event.data)); @@ -300,11 +327,10 @@ if (onPage("Game")) { } eventManager.emit("GameEvent", data); }; -} -// === Game changes end +}); -// Spectate mode -if (onPage("gameSpectate")) { +// Spectate hooks +onPage("gameSpectate", function() { eventManager.emit("GameStart"); var oHandler = socket.onmessage; @@ -313,8 +339,7 @@ if (onPage("gameSpectate")) { oHandler(event); eventManager._emitRaw("GameEvent", event.data); }; -} -// Spectate mode +}); // === Always do the following // Bind hotkey listeners From 6e83b422ee1ba47dc56af66b3cf76d6ff57f2a50 Mon Sep 17 00:00:00 2001 From: Alan H Date: Tue, 8 Nov 2016 01:09:36 -0600 Subject: [PATCH 0036/1620] updated to new restrictions --- undercards.js | 156 ++++++++++++++++++++++++++------------------------ 1 file changed, 82 insertions(+), 74 deletions(-) diff --git a/undercards.js b/undercards.js index 32942856..8a9b54ef 100644 --- a/undercards.js +++ b/undercards.js @@ -3,11 +3,12 @@ // @namespace http://tampermonkey.net/ // @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=3 -// @version 0.6 +// @version 0.7 // @description Minor changes to undercards game // @author feildmaster // @match https://undercards.net/* // @grant none +// @history 0.7 - updated to new restrictions, thanks cloudflare -_- // @history 0.6 - some upgrades to the battle log, fixed url // @history 0.5.4 - Don't scroll the battle log with the page (possibly make this configurable later) // @history 0.5.3 - Remove the chat stuff, the new chat is better. @@ -38,7 +39,7 @@ var log = { hi.css({ width: `${window.innerWidth - pos - 20}px`, border: "2px solid white", - "background-color": "black", + "background-color": "rgba(0,0,0,0.9)", "position": "absolute", right: 10, top: 10, @@ -91,6 +92,7 @@ eventManager.on("PlayingGame", function bindHotkeys() { player: function makePlayer(player) { var c = $(""); c.append(player.username); + // show lives, show health, show gold, show hand, possibly deck size as well //c.attr("title", `${player.gold} gold`); // gold is broken //c.hover(); // TODO: hover information c.addClass(player.class); @@ -104,10 +106,6 @@ eventManager.on("PlayingGame", function bindHotkeys() { }, }; - eventManager.on("GameStart", function() { - log.init(); // Init the battle log... or we could wait until adding the first event? - }); - // TODO: Clean this up // This is an ugly thing! eventManager.on("GameEvent", function(data) { @@ -116,45 +114,47 @@ eventManager.on("PlayingGame", function bindHotkeys() { var card, you, enemy; // Battle logging happens after the game runs switch(data.action) { - case "getGameStarted": // Initialize "game" history here - you = {id: data.yourId, username: data.yourUsername, hp: 30, class: data.yourClass, level: data.yourLevel, rank: data.yourRank, gold: 2}; - enemy = {id: data.ennemyId, username: data.ennemyUsername, hp: 30, class: data.enemyClass, level: data.enemyLevel, rank: data.enemyRank, gold: 2}; case "getAllGameInfos": // Initialize "spectate" history here // board = [0, 1, 2, 3, 4, 5, 6, 7, 8] // ---- typeCard: 0 = enemy; 1: spell // -- card: {attack, hp, maxHp, originalAttack, originalHp, paralyzed, silence, poisoned, taunt, id, typeCard, name, image, cost, description, rarity, shiny, quantity} // TODO: turnTime monitoring + you = JSON.parse(data.you); + enemy = JSON.parse(data.ennemy); + you.class = data.yourClass; + enemy.class = data.enemyClass; + // Set gold + var gold = JSON.parse(data.golds); + you.gold = gold[you.id]; + enemy.gold = gold[enemy.id]; + // Set lives + var lives = JSON.parse(data.lives); + you.lives = lives[you.id]; + enemy.lives = lives[enemy.id]; + // populate monsters + JSON.parse(data.board).forEach(function (card) { + if (card === null) return; + monsters[card.id] = card; + }); + case "getGameStarted": // Initialize "game" history here turn = data.turn || 0; if (!you) { - you = JSON.parse(data.you); - enemy = JSON.parse(data.ennemy); - you.class = data.yourClass; - enemy.class = data.enemyClass; - var gold = JSON.parse(data.golds); - you.gold = gold[you.id]; - enemy.gold = gold[enemy.id]; - } - if (data.lives) { - var lives = JSON.parse(data.lives); - you.lives = lives[you.id]; - enemy.lives = lives[enemy.id]; + you = {id: data.yourId, username: data.yourUsername, hp: 30, class: data.yourClass, level: data.yourLevel, rank: data.yourRank, gold: 2}; + enemy = {id: data.ennemyId, username: data.ennemyUsername, hp: 30, class: data.enemyClass, level: data.enemyLevel, rank: data.enemyRank, gold: 2}; } players[you.id] = you; players[enemy.id] = enemy; // Test changing ID's at endTurn instead of startTurn other[you.id] = enemy.id; other[enemy.id] = you.id; + // Initialize the log + log.init(); $("div#history div.handle").html(`[${data.gameType}] ${make.player(you)} vs ${make.player(enemy)}`); log.add(`Turn ${turn}`); if (data.userTurn) { currentTurn = data.userTurn; log.add(`${make.player(players[data.userTurn])}'s turn`); } - // populate monsters - JSON.parse(data.board).forEach(function (card) { - if (card === null) return; - monsters[card.id] = card; - }); return; case "getFight": // monster attack monster log.add(`${make.card(monsters[data.attackMonster])} attacked ${make.card(monsters[data.defendMonster])}`); @@ -287,59 +287,67 @@ eventManager.on("PlayingGame", function bindHotkeys() { }); })(); -// === Play hooks -onPage("Play", function() { - var applyDeck = function(type, last) { - var deck = $(`#${type}`); - if (!deck.length) return; - if (localStorage[last] && $(`#${type} option`).filter((i,o) => o.value === localStorage[last]).length !== 0) { - deck.val(localStorage[last]).change(); - } - deck.change(function update() { - localStorage[last] = $(`#${type} option:selected`).val(); - }); - }; +// === It's a race against time, to make it work most of the time? +setTimeout(setup, 1); - applyDeck("classicDecks", "lastClassic"); // Classic class storage - applyDeck("rankedDecks", "lastRanked"); // Ranked class storage - applyDeck("eventDecks", "lastEvent"); // Event class storage +function setup() { + // === Play hooks + onPage("Play", function() { + debug("On play page"); + var applyDeck = function(type, last) { + var deck = $(`#${type}`); + if (!deck.length) return; + if (localStorage[last] && $(`#${type} option`).filter((i,o) => o.value === localStorage[last]).length !== 0) { + deck.val(localStorage[last]).change(); + } + deck.change(function update() { + localStorage[last] = $(`#${type} option:selected`).val(); + }); + }; - // TODO: Better "game found" support - var oHandler = socketQueue.onmessage; - socketQueue.onmessage = function onMessageScript(event) { - var data = JSON.parse(bin2str(event.data)); - oHandler(event); - eventManager.emit(data.action, data); - }; -}); + applyDeck("classicDecks", "lastClassic"); // Classic class storage + applyDeck("rankedDecks", "lastRanked"); // Ranked class storage + applyDeck("eventDecks", "lastEvent"); // Event class storage -// === Game hooks -onPage("Game", function() { - var oHandler = socket.onmessage; - socket.onmessage = function onMessageScript(event) { - var data = JSON.parse(bin2str(event.data)); - //console.log(bin2str(event.data)); - oHandler(event); - if (data.action === "getGameStarted") { - // We're running our game. - eventManager.emit("GameStart"); - eventManager.emit("PlayingGame"); - } - eventManager.emit("GameEvent", data); - }; -}); + // TODO: Better "game found" support + var oHandler = socketQueue.onmessage; + socketQueue.onmessage = function onMessageScript(event) { + var data = JSON.parse(bin2str(event.data)); + oHandler(event); + eventManager.emit(data.action, data); + }; + }); -// Spectate hooks -onPage("gameSpectate", function() { - eventManager.emit("GameStart"); + // === Game hooks + onPage("Game", function() { + debug("Playing Game"); + var oHandler = socket.onmessage; + socket.onmessage = function onMessageScript(event) { + var data = JSON.parse(bin2str(event.data)); + //console.log(bin2str(event.data)); + oHandler(event); + if (data.action === "getGameStarted") { + // We're running our game. + eventManager.emit("GameStart"); + eventManager.emit("PlayingGame"); + } + eventManager.emit("GameEvent", data); + }; + }); - var oHandler = socket.onmessage; - socket.onmessage = function onMessageScript(event) { - //console.log(bin2str(event.data)); - oHandler(event); - eventManager._emitRaw("GameEvent", event.data); - }; -}); + // Spectate hooks + onPage("gameSpectate", function() { + debug("Spectating Game"); + eventManager.emit("GameStart"); + + var oHandler = socket.onmessage; + socket.onmessage = function onMessageScript(event) { + //console.log(bin2str(event.data)); + oHandler(event); + eventManager._emitRaw("GameEvent", event.data); + }; + }); +} // === Always do the following // Bind hotkey listeners From 8d2736e400c9633c852c9913d9216c844e9f8acf Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 13 Nov 2016 00:31:29 -0600 Subject: [PATCH 0037/1620] Don't be so loose on matching "Game" != "GamesList" >.> --- utilities.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/utilities.js b/utilities.js index 41de45d4..397cb97f 100644 --- a/utilities.js +++ b/utilities.js @@ -4,7 +4,11 @@ function debug() { console.log.apply(console, arguments); } function onPage(name, fn) { - var r = name.length && location.pathname.substring(1, name.length + 1) === name; + var length = location.pathname.length, temp; + if ((temp = location.pathname.indexOf(".")) === -1 && (temp = location.pathname.indexOf("/")) === -1) { + temp = null; + } + var r = name.length && location.pathname.substring(1, temp || length) === name; if (typeof fn === "function" && r) { fn(); } From e3ce509a9b5c173aaf251aa482ad5e5620c14112 Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 13 Nov 2016 00:58:24 -0600 Subject: [PATCH 0038/1620] Finalize the log by moving it to utilities... (this is where code goes to "sleep") --- utilities.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/utilities.js b/utilities.js index 397cb97f..acd67aab 100644 --- a/utilities.js +++ b/utilities.js @@ -47,6 +47,38 @@ var eventManager = { return this.emit(event, JSON.parse(bin2str(data)), cancelable); }, }; +var log = { + init: function () { + var hi = $("
"), + ha = $("
History
"), + lo = $("
"); + // Positional math + var pos = parseInt($("div.mainContent").css("width")) + parseInt($("div.mainContent").css("margin-left")); + hi.css({ + width: `${window.innerWidth - pos - 20}px`, + border: "2px solid white", + "background-color": "rgba(0,0,0,0.9)", + "position": "absolute", + right: 10, + top: 10, + }); + ha.css({ + "border-bottom": "1px solid white", + "text-align": "center", + }); + lo.css({ + "overflow-y": "auto", + "max-height": "600px", + }); + hi.append(ha); + hi.append(lo); + $("body").append(hi); + }, + add: function(text) { + var add = text instanceof jQuery ? text : `
${text}
`; + $("div#history div#log").prepend(add); // Be lazy and prepend, or append and scroll down? + }, +}; var fn = { // Not used each: function(o, f, t) { if (!o) return; From 71db1efd6925e3b5e425e37a0a0647b6b8a40fc1 Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 13 Nov 2016 02:17:36 -0600 Subject: [PATCH 0039/1620] Stabilize the loading of the script. Thanks again, cloudflare. Also, disabled queue buttons if they don't work. --- undercards.js | 199 ++++++++++++++++++++++++-------------------------- 1 file changed, 95 insertions(+), 104 deletions(-) diff --git a/undercards.js b/undercards.js index 8a9b54ef..4ba339c6 100644 --- a/undercards.js +++ b/undercards.js @@ -1,13 +1,10 @@ // ==UserScript== // @name UnderCards script -// @namespace http://tampermonkey.net/ -// @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js -// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=3 -// @version 0.7 // @description Minor changes to undercards game +// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=4 +// @version 0.8 // @author feildmaster -// @match https://undercards.net/* -// @grant none +// @history 0.8 - Better performance and reliability. Disable the join queue buttons until they are ready // @history 0.7 - updated to new restrictions, thanks cloudflare -_- // @history 0.6 - some upgrades to the battle log, fixed url // @history 0.5.4 - Don't scroll the battle log with the page (possibly make this configurable later) @@ -19,51 +16,17 @@ // @history 0.3 - Lowered "game found" volume // @history 0.2 - Added EndTurn hotkey (space, middle click), focus chat (enter) // @history 0.1 - Made deck selection smart +// @match https://undercards.net/* // @website https://github.com/feildmaster/UnderScript // @supportURL https://github.com/feildmaster/UnderScript/issues +// @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js +// @namespace http://tampermonkey.net/ +// @grant none // ==/UserScript== // TODO: more Hotkeys -// TODO: Better battle log display (and make it movable/resizable?) // TODO: Visual attack targets // TODO: Random deck option // TODO: Detailed history log -if (typeof jQuery === "undefined") return; // Might as well check if jQuery is loaded, to remove an error - -var log = { - init: function () { - var hi = $("
"), - ha = $("
History
"), - lo = $("
"); - // Positional math - var pos = parseInt($("div.mainContent").css("width")) + parseInt($("div.mainContent").css("margin-left")); - hi.css({ - width: `${window.innerWidth - pos - 20}px`, - border: "2px solid white", - "background-color": "rgba(0,0,0,0.9)", - "position": "absolute", - right: 10, - top: 10, - //"max-height": `${window.innerHeight - 20}px`, - }); - ha.css({ - "border-bottom": "1px solid white", - "text-align": "center", - }); - lo.css({ - "overflow-y": "auto", - //height: "200px", - "max-height": "600px", - }); - hi.append(ha); - hi.append(lo); - // hi.draggable({handle: "div.handle",}); This breaks it :( - $("body").append(hi); - }, - add: function(text) { - var add = text instanceof jQuery ? text : `
${text}
`; - $("div#history div#log").prepend(add); // Be lazy and prepend, or append and scroll down? - }, -}; // === Variables start var hotkeys = [ @@ -86,7 +49,7 @@ eventManager.on("PlayingGame", function bindHotkeys() { hotkeys.push(new Hotkey("End turn").bindKey(32).bindClick(2).run((e) => {if (!$(e.target).is("#endTurnBtn") && userTurn && userTurn === userId) endTurn();})); }); -(function battleLogger() { +eventManager.on("GameStart", function battleLogger() { var turn = 0, currentTurn = 0, players = {}, monsters = {}, lastEffect, other = {}, finished = false; var make = { player: function makePlayer(player) { @@ -108,7 +71,7 @@ eventManager.on("PlayingGame", function bindHotkeys() { // TODO: Clean this up // This is an ugly thing! - eventManager.on("GameEvent", function(data) { + eventManager.on("GameEvent", function logEvent(data) { if (finished) return; // Sometimes we get events after the battle is over // TODO: Delayed events... (green soul, discard (for example, sans)) var card, you, enemy; @@ -285,42 +248,56 @@ eventManager.on("PlayingGame", function bindHotkeys() { return; } }); -})(); - -// === It's a race against time, to make it work most of the time? -setTimeout(setup, 1); +}); -function setup() { - // === Play hooks - onPage("Play", function() { - debug("On play page"); - var applyDeck = function(type, last) { - var deck = $(`#${type}`); - if (!deck.length) return; - if (localStorage[last] && $(`#${type} option`).filter((i,o) => o.value === localStorage[last]).length !== 0) { - deck.val(localStorage[last]).change(); - } - deck.change(function update() { - localStorage[last] = $(`#${type} option:selected`).val(); - }); - }; +// === Play hooks +onPage("Play", function() { + debug("On play page"); + function applyDeck(type, last) { + var deck = $(`#${type}`); + if (!deck.length) return; + if (localStorage[last] && $(`#${type} option`).filter((i,o) => o.value === localStorage[last]).length !== 0) { + deck.val(localStorage[last]).change(); + } + deck.change(function update() { + localStorage[last] = $(`#${type} option:selected`).val(); + }); + } - applyDeck("classicDecks", "lastClassic"); // Classic class storage - applyDeck("rankedDecks", "lastRanked"); // Ranked class storage - applyDeck("eventDecks", "lastEvent"); // Event class storage + applyDeck("classicDecks", "lastClassic"); // Classic class storage + applyDeck("rankedDecks", "lastRanked"); // Ranked class storage + applyDeck("eventDecks", "lastEvent"); // Event class storage + var queues = $("button.btn.btn-primary"); + queues.prop("disabled", true); + (function hook() { + if (typeof socketQueue === "undefined") { + debug("Timeout hook"); + return setTimeout(hook); + } // TODO: Better "game found" support + var oOpen = socketQueue.onopen; + socketQueue.onopen = function onOpenScript(event) { + if (oOpen) oOpen(event); + queues.prop("disabled", false); + }; var oHandler = socketQueue.onmessage; socketQueue.onmessage = function onMessageScript(event) { var data = JSON.parse(bin2str(event.data)); oHandler(event); eventManager.emit(data.action, data); }; - }); + })(); +}); - // === Game hooks - onPage("Game", function() { - debug("Playing Game"); +// === Game hooks +onPage("Game", function() { + debug("Playing Game"); + (function hook() { + if (typeof socket === "undefined") { + debug("Timeout hook"); + return setTimeout(hook); + } var oHandler = socket.onmessage; socket.onmessage = function onMessageScript(event) { var data = JSON.parse(bin2str(event.data)); @@ -333,47 +310,61 @@ function setup() { } eventManager.emit("GameEvent", data); }; - }); - - // Spectate hooks - onPage("gameSpectate", function() { - debug("Spectating Game"); - eventManager.emit("GameStart"); + })(); +}); +// Spectate hooks +onPage("gameSpectate", function() { + debug("Spectating Game"); + eventManager.emit("GameStart"); + (function hook() { + if (typeof socket === "undefined") { + debug("Timeout hook"); + return setTimeout(hook); + } var oHandler = socket.onmessage; socket.onmessage = function onMessageScript(event) { //console.log(bin2str(event.data)); oHandler(event); eventManager._emitRaw("GameEvent", event.data); }; - }); -} + })(); +}); -// === Always do the following -// Bind hotkey listeners -$(document).on("click.script", function (event) { - if (false) return; // TODO: Check for clicking in chat - hotkeys.forEach(function(v) { - if (v.clickbound(event.which)) { - v.run(event); +// === Always do the following - if jquery is loaded +var tries = 3; +(function jSetup() { + if (typeof jQuery === "undefined") { + if (tries-- > 0) { // jQuery is probably not going to load at this point... + setTimeout(jSetup); } + return; + } + // Bind hotkey listeners + $(document).on("click.script", function (event) { + if (false) return; // TODO: Check for clicking in chat + hotkeys.forEach(function(v) { + if (v.clickbound(event.which)) { + v.run(event); + } + }); }); -}); -$(document).on("keyup.script", function (event) { - if ($(event.target).is("input")) return; // We don't want to listen while typing in chat (maybe listen for F-keys?) - hotkeys.forEach(function(v) { - if (v.keybound(event.which)) { - v.run(event); - } + $(document).on("keyup.script", function (event) { + if ($(event.target).is("input")) return; // We don't want to listen while typing in chat (maybe listen for F-keys?) + hotkeys.forEach(function(v) { + if (v.keybound(event.which)) { + v.run(event); + } + }); }); -}); -$(window).unload(function() { - // Store chat text (if any) - var val = $("#message").val(); - if (!val) return; - localStorage.oldChat = val; -}); -if (localStorage.oldChat) { - $("#message").val(localStorage.oldChat); - delete localStorage.oldChat; -} + $(window).unload(function() { + // Store chat text (if any) + var val = $("div.chat-public input.chat-text").val(); + if (!val) return; + localStorage.oldChat = val; + }); + if (localStorage.oldChat) { + $("div.chat-public input.chat-text").val(localStorage.oldChat); + delete localStorage.oldChat; + } +})(); From dea4235d2800d8161f7e00027b89736e5a6e6488 Mon Sep 17 00:00:00 2001 From: Alan H Date: Sun, 13 Nov 2016 02:24:18 -0600 Subject: [PATCH 0040/1620] Better logging on errors. This is really only for my benefit. --- utilities.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utilities.js b/utilities.js index acd67aab..0a762ec8 100644 --- a/utilities.js +++ b/utilities.js @@ -37,7 +37,8 @@ var eventManager = { try { ev.call(meta, data); } catch (e) { - console.error(`Error ocurred while parsing event: ${ev.displayName || ev.name || `unnamed(${event})`}`, e); + console.error(`Error ocurred while parsing event: ${ev.displayName || ev.name || 'unnamed'}(${event})`); + console.error(e.stack); } }); } From f123390a353cd1d11bfa77cb359938cdb699abd2 Mon Sep 17 00:00:00 2001 From: Alan H Date: Tue, 15 Nov 2016 11:41:50 -0600 Subject: [PATCH 0041/1620] Reliably detect jQuery loading Give it up for cloudflare, people... :D --- undercards.js | 104 +++++++++++++++++++++++++++++++------------------- 1 file changed, 64 insertions(+), 40 deletions(-) diff --git a/undercards.js b/undercards.js index 4ba339c6..06c9697c 100644 --- a/undercards.js +++ b/undercards.js @@ -2,8 +2,9 @@ // @name UnderCards script // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=4 -// @version 0.8 +// @version 0.8.1 // @author feildmaster +// @history 0.8.1 - Rework loading jQuery performance // @history 0.8 - Better performance and reliability. Disable the join queue buttons until they are ready // @history 0.7 - updated to new restrictions, thanks cloudflare -_- // @history 0.6 - some upgrades to the battle log, fixed url @@ -31,10 +32,12 @@ // === Variables start var hotkeys = [ new Hotkey("Focus Chat").bindKey(13).run(function(e) { // Join/Show chat and position cursor to input box + /* This doesn't work anymore. Enter brings up a chat list if (hide) { // This currently already works } $('#message').focus(); // Always do this + // */ }), ]; // === Variables end @@ -229,9 +232,15 @@ eventManager.on("GameStart", function battleLogger() { players[key].lives = temp[key]; } return; - case "getVictory": // TODO - case "getVictoryDeco": // TODO - case "getDefeat": // TODO + case "getVictoryDeco": + finished = true; + log.add(`${make.player(players[opponentId])} left the game`); + case "getVictory": + log.add(`${make.player(players[userId])} beat ${make.player(players[opponentId])}`); + break; + case "getDefeat": + finished = true; + log.add(`${make.player(players[opponentId])} beat ${make.player(players[userId])}`); break; case "getResult": // Fight Finish finished = true; @@ -252,34 +261,41 @@ eventManager.on("GameStart", function battleLogger() { // === Play hooks onPage("Play", function() { + // TODO: Better "game found" support debug("On play page"); - function applyDeck(type, last) { - var deck = $(`#${type}`); - if (!deck.length) return; - if (localStorage[last] && $(`#${type} option`).filter((i,o) => o.value === localStorage[last]).length !== 0) { - deck.val(localStorage[last]).change(); + var queues, disable = true; + + eventManager.on("jQuery", function onPlay() { + function applyDeck(type, last) { + var deck = $(`#${type}`); + if (!deck.length) return; + if (localStorage[last] && $(`#${type} option`).filter((i,o) => o.value === localStorage[last]).length !== 0) { + deck.val(localStorage[last]).change(); + } + deck.change(function update() { + localStorage[last] = $(`#${type} option:selected`).val(); + }); } - deck.change(function update() { - localStorage[last] = $(`#${type} option:selected`).val(); - }); - } - applyDeck("classicDecks", "lastClassic"); // Classic class storage - applyDeck("rankedDecks", "lastRanked"); // Ranked class storage - applyDeck("eventDecks", "lastEvent"); // Event class storage - var queues = $("button.btn.btn-primary"); - queues.prop("disabled", true); + applyDeck("classicDecks", "lastClassic"); // Classic class storage + applyDeck("rankedDecks", "lastRanked"); // Ranked class storage + applyDeck("eventDecks", "lastEvent"); // Event class storage + if (disable) { + queues = $("button.btn.btn-primary"); + queues.prop("disabled", true); + } + }); (function hook() { if (typeof socketQueue === "undefined") { debug("Timeout hook"); return setTimeout(hook); } - // TODO: Better "game found" support var oOpen = socketQueue.onopen; socketQueue.onopen = function onOpenScript(event) { - if (oOpen) oOpen(event); - queues.prop("disabled", false); + disable = false; + oOpen(event); + if (queues) queues.prop("disabled", false); }; var oHandler = socketQueue.onmessage; socketQueue.onmessage = function onMessageScript(event) { @@ -301,7 +317,7 @@ onPage("Game", function() { var oHandler = socket.onmessage; socket.onmessage = function onMessageScript(event) { var data = JSON.parse(bin2str(event.data)); - //console.log(bin2str(event.data)); + //debug(bin2str(event.data)); oHandler(event); if (data.action === "getGameStarted") { // We're running our game. @@ -324,7 +340,7 @@ onPage("gameSpectate", function() { } var oHandler = socket.onmessage; socket.onmessage = function onMessageScript(event) { - //console.log(bin2str(event.data)); + //debug(bin2str(event.data)); oHandler(event); eventManager._emitRaw("GameEvent", event.data); }; @@ -332,14 +348,7 @@ onPage("gameSpectate", function() { }); // === Always do the following - if jquery is loaded -var tries = 3; -(function jSetup() { - if (typeof jQuery === "undefined") { - if (tries-- > 0) { // jQuery is probably not going to load at this point... - setTimeout(jSetup); - } - return; - } +eventManager.on("jQuery", function always() { // Bind hotkey listeners $(document).on("click.script", function (event) { if (false) return; // TODO: Check for clicking in chat @@ -357,14 +366,29 @@ var tries = 3; } }); }); - $(window).unload(function() { - // Store chat text (if any) - var val = $("div.chat-public input.chat-text").val(); - if (!val) return; - localStorage.oldChat = val; - }); - if (localStorage.oldChat) { - $("div.chat-public input.chat-text").val(localStorage.oldChat); - delete localStorage.oldChat; + /* This legacy code doesn't work + $(window).unload(function() { + // Store chat text (if any) + var val = $("div.chat-public input.chat-text").val(); + if (!val) return; + localStorage.oldChat = val; + }); + if (localStorage.oldChat) { + $("div.chat-public input.chat-text").val(localStorage.oldChat); + delete localStorage.oldChat; + } + // */ +}); + +// Attempt to detect jQuery +var tries = 20; +(function jSetup() { + if (typeof jQuery === "undefined") { + if (tries-- <= 0) { // jQuery is probably not going to load at this point... + return; + } + setTimeout(jSetup,1); + return; } + eventManager.emit("jQuery"); })(); From 056eb017ac2f85003aa4e476c1422c10030897d8 Mon Sep 17 00:00:00 2001 From: Alan H Date: Thu, 17 Nov 2016 20:47:48 -0600 Subject: [PATCH 0042/1620] [TEMP] Fix the queue's disconnecting. Hopefully this will be fixed upstream... :D --- undercards.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/undercards.js b/undercards.js index 06c9697c..ab6e8e1f 100644 --- a/undercards.js +++ b/undercards.js @@ -2,8 +2,9 @@ // @name UnderCards script // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=4 -// @version 0.8.1 +// @version 0.8.2 // @author feildmaster +// @history 0.8.2 - Fix the queue disconnecting. // @history 0.8.1 - Rework loading jQuery performance // @history 0.8 - Better performance and reliability. Disable the join queue buttons until they are ready // @history 0.7 - updated to new restrictions, thanks cloudflare -_- @@ -291,6 +292,7 @@ onPage("Play", function() { debug("Timeout hook"); return setTimeout(hook); } + socket = socketQueue; var oOpen = socketQueue.onopen; socketQueue.onopen = function onOpenScript(event) { disable = false; From cff9e231603bb68472cfdf159c14525c4e42f41b Mon Sep 17 00:00:00 2001 From: Alan H Date: Wed, 19 Apr 2017 15:00:17 -0500 Subject: [PATCH 0043/1620] bin2str was removed, yay! --- utilities.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utilities.js b/utilities.js index 0a762ec8..ff21675b 100644 --- a/utilities.js +++ b/utilities.js @@ -45,7 +45,7 @@ var eventManager = { return cancelable && meta.canceled; }, _emitRaw: function(event, data, cancelable) { - return this.emit(event, JSON.parse(bin2str(data)), cancelable); + return this.emit(event, JSON.parse(data), cancelable); }, }; var log = { From 419d6e788411d86860fa8277f39b70d6a6956f30 Mon Sep 17 00:00:00 2001 From: Alan H Date: Wed, 19 Apr 2017 15:02:32 -0500 Subject: [PATCH 0044/1620] Script is now working --- undercards.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/undercards.js b/undercards.js index ab6e8e1f..5ce074f6 100644 --- a/undercards.js +++ b/undercards.js @@ -1,9 +1,10 @@ // ==UserScript== // @name UnderCards script // @description Minor changes to undercards game -// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=4 -// @version 0.8.2 +// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=5 +// @version 0.8.3 // @author feildmaster +// @history 0.8.3 - Script works now // @history 0.8.2 - Fix the queue disconnecting. // @history 0.8.1 - Rework loading jQuery performance // @history 0.8 - Better performance and reliability. Disable the join queue buttons until they are ready @@ -301,7 +302,7 @@ onPage("Play", function() { }; var oHandler = socketQueue.onmessage; socketQueue.onmessage = function onMessageScript(event) { - var data = JSON.parse(bin2str(event.data)); + var data = JSON.parse(event.data); oHandler(event); eventManager.emit(data.action, data); }; @@ -318,8 +319,8 @@ onPage("Game", function() { } var oHandler = socket.onmessage; socket.onmessage = function onMessageScript(event) { - var data = JSON.parse(bin2str(event.data)); - //debug(bin2str(event.data)); + var data = JSON.parse(event.data); + //debug(event.data); oHandler(event); if (data.action === "getGameStarted") { // We're running our game. @@ -342,7 +343,7 @@ onPage("gameSpectate", function() { } var oHandler = socket.onmessage; socket.onmessage = function onMessageScript(event) { - //debug(bin2str(event.data)); + //debug(event.data); oHandler(event); eventManager._emitRaw("GameEvent", event.data); }; From 21d1955e5682af35b6d7ecb59c3eca94be37e9b8 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 10 Mar 2018 00:55:16 -0600 Subject: [PATCH 0045/1620] Fixed battle log --- undercards.js | 83 ++++++++++++++++++--------------------------------- 1 file changed, 29 insertions(+), 54 deletions(-) diff --git a/undercards.js b/undercards.js index 5ce074f6..a8ad4156 100644 --- a/undercards.js +++ b/undercards.js @@ -2,8 +2,9 @@ // @name UnderCards script // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=5 -// @version 0.8.3 +// @version 0.8.4 // @author feildmaster +// @history 0.8.4 - Removed "remember deck" feature (upstream), fixed event log // @history 0.8.3 - Script works now // @history 0.8.2 - Fix the queue disconnecting. // @history 0.8.1 - Rework loading jQuery performance @@ -23,7 +24,7 @@ // @website https://github.com/feildmaster/UnderScript // @supportURL https://github.com/feildmaster/UnderScript/issues // @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js -// @namespace http://tampermonkey.net/ +// @namespace https://feildmaster.com/ // @grant none // ==/UserScript== // TODO: more Hotkeys @@ -32,16 +33,7 @@ // TODO: Detailed history log // === Variables start -var hotkeys = [ - new Hotkey("Focus Chat").bindKey(13).run(function(e) { // Join/Show chat and position cursor to input box - /* This doesn't work anymore. Enter brings up a chat list - if (hide) { - // This currently already works - } - $('#message').focus(); // Always do this - // */ - }), -]; +var hotkeys = []; // === Variables end eventManager.on("getWaitingQueue", function lowerVolume() { @@ -51,7 +43,9 @@ eventManager.on("getWaitingQueue", function lowerVolume() { eventManager.on("PlayingGame", function bindHotkeys() { // Binds to Space, Middle Click - hotkeys.push(new Hotkey("End turn").bindKey(32).bindClick(2).run((e) => {if (!$(e.target).is("#endTurnBtn") && userTurn && userTurn === userId) endTurn();})); + hotkeys.push(new Hotkey("End turn").bindKey(32).bindClick(2).run((e) => { + if (!$(e.target).is("#endTurnBtn") && userTurn && userTurn === userId) endTurn(); + })); }); eventManager.on("GameStart", function battleLogger() { @@ -81,14 +75,14 @@ eventManager.on("GameStart", function battleLogger() { // TODO: Delayed events... (green soul, discard (for example, sans)) var card, you, enemy; // Battle logging happens after the game runs - switch(data.action) { + switch (data.action) { case "getAllGameInfos": // Initialize "spectate" history here // board = [0, 1, 2, 3, 4, 5, 6, 7, 8] // ---- typeCard: 0 = enemy; 1: spell // -- card: {attack, hp, maxHp, originalAttack, originalHp, paralyzed, silence, poisoned, taunt, id, typeCard, name, image, cost, description, rarity, shiny, quantity} // TODO: turnTime monitoring you = JSON.parse(data.you); - enemy = JSON.parse(data.ennemy); + enemy = JSON.parse(data.enemy); you.class = data.yourClass; enemy.class = data.enemyClass; // Set gold @@ -248,11 +242,7 @@ eventManager.on("GameStart", function battleLogger() { finished = true; if (data.cause === "Surrender") { log.add(`${data.looser} surrendered.`); - } - if (data.cause === "Chara") { - //log.add(`${data.winner} played Chara`); - } - if (data.cause === "Disconnection") { + } else if (data.cause === "Disconnection") { log.add(`${data.looser} disconnected.`); } log.add(`${data.winner} beat ${data.looser}`); @@ -262,26 +252,12 @@ eventManager.on("GameStart", function battleLogger() { }); // === Play hooks -onPage("Play", function() { +onPage("Play", function () { // TODO: Better "game found" support debug("On play page"); var queues, disable = true; eventManager.on("jQuery", function onPlay() { - function applyDeck(type, last) { - var deck = $(`#${type}`); - if (!deck.length) return; - if (localStorage[last] && $(`#${type} option`).filter((i,o) => o.value === localStorage[last]).length !== 0) { - deck.val(localStorage[last]).change(); - } - deck.change(function update() { - localStorage[last] = $(`#${type} option:selected`).val(); - }); - } - - applyDeck("classicDecks", "lastClassic"); // Classic class storage - applyDeck("rankedDecks", "lastRanked"); // Ranked class storage - applyDeck("eventDecks", "lastEvent"); // Event class storage if (disable) { queues = $("button.btn.btn-primary"); queues.prop("disabled", true); @@ -293,7 +269,7 @@ onPage("Play", function() { debug("Timeout hook"); return setTimeout(hook); } - socket = socketQueue; + socket = socketQueue; var oOpen = socketQueue.onopen; socketQueue.onopen = function onOpenScript(event) { disable = false; @@ -310,7 +286,7 @@ onPage("Play", function() { }); // === Game hooks -onPage("Game", function() { +onPage("Game", function () { debug("Playing Game"); (function hook() { if (typeof socket === "undefined") { @@ -333,7 +309,7 @@ onPage("Game", function() { }); // Spectate hooks -onPage("gameSpectate", function() { +onPage("gameSpectate", function () { debug("Spectating Game"); eventManager.emit("GameStart"); (function hook() { @@ -343,7 +319,6 @@ onPage("gameSpectate", function() { } var oHandler = socket.onmessage; socket.onmessage = function onMessageScript(event) { - //debug(event.data); oHandler(event); eventManager._emitRaw("GameEvent", event.data); }; @@ -355,7 +330,7 @@ eventManager.on("jQuery", function always() { // Bind hotkey listeners $(document).on("click.script", function (event) { if (false) return; // TODO: Check for clicking in chat - hotkeys.forEach(function(v) { + hotkeys.forEach(function (v) { if (v.clickbound(event.which)) { v.run(event); } @@ -363,24 +338,24 @@ eventManager.on("jQuery", function always() { }); $(document).on("keyup.script", function (event) { if ($(event.target).is("input")) return; // We don't want to listen while typing in chat (maybe listen for F-keys?) - hotkeys.forEach(function(v) { + hotkeys.forEach(function (v) { if (v.keybound(event.which)) { v.run(event); } }); }); - /* This legacy code doesn't work - $(window).unload(function() { - // Store chat text (if any) - var val = $("div.chat-public input.chat-text").val(); - if (!val) return; - localStorage.oldChat = val; - }); - if (localStorage.oldChat) { - $("div.chat-public input.chat-text").val(localStorage.oldChat); - delete localStorage.oldChat; - } - // */ + /* This legacy code doesn't work + $(window).unload(function() { + // Store chat text (if any) + var val = $("div.chat-public input.chat-text").val(); + if (!val) return; + localStorage.oldChat = val; + }); + if (localStorage.oldChat) { + $("div.chat-public input.chat-text").val(localStorage.oldChat); + delete localStorage.oldChat; + } + // */ }); // Attempt to detect jQuery @@ -390,7 +365,7 @@ var tries = 20; if (tries-- <= 0) { // jQuery is probably not going to load at this point... return; } - setTimeout(jSetup,1); + setTimeout(jSetup, 1); return; } eventManager.emit("jQuery"); From 9707b1f8fbc3d866edb02cb623aed5dbc697fc83 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 10 Mar 2018 18:43:37 -0600 Subject: [PATCH 0046/1620] some debug --- undercards.js | 90 ++++++++++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 41 deletions(-) diff --git a/undercards.js b/undercards.js index a8ad4156..efbc05e3 100644 --- a/undercards.js +++ b/undercards.js @@ -2,8 +2,9 @@ // @name UnderCards script // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=5 -// @version 0.8.4 +// @version 0.8.5 // @author feildmaster +// @history 0.8.5 - Added some game debug // @history 0.8.4 - Removed "remember deck" feature (upstream), fixed event log // @history 0.8.3 - Script works now // @history 0.8.2 - Fix the queue disconnecting. @@ -71,7 +72,12 @@ eventManager.on("GameStart", function battleLogger() { // TODO: Clean this up // This is an ugly thing! eventManager.on("GameEvent", function logEvent(data) { - if (finished) return; // Sometimes we get events after the battle is over + if (finished) { // Sometimes we get events after the battle is over + if (localStorage.getItem("debuggingExtra") === "true") { + log.add(`Extra action: ${data.action}`); + } + return; + } // TODO: Delayed events... (green soul, discard (for example, sans)) var card, you, enemy; // Battle logging happens after the game runs @@ -98,6 +104,7 @@ eventManager.on("GameStart", function battleLogger() { if (card === null) return; monsters[card.id] = card; }); + // Gracefully fallthrough case "getGameStarted": // Initialize "game" history here turn = data.turn || 0; if (!you) { @@ -117,13 +124,13 @@ eventManager.on("GameStart", function battleLogger() { currentTurn = data.userTurn; log.add(`${make.player(players[data.userTurn])}'s turn`); } - return; + break; case "getFight": // monster attack monster log.add(`${make.card(monsters[data.attackMonster])} attacked ${make.card(monsters[data.defendMonster])}`); - return; + break; case "getFightPlayer": // monster attacking player log.add(`${make.card(monsters[data.attackMonster])} attacked ${make.player(players[data.defendPlayer])}`); - return; + break; case "getUpdatePlayerHp": var oHp = players[data.playerId].hp; var hp = data.isDamage ? oHp - data.hp : data.hp - oHp; @@ -135,8 +142,8 @@ eventManager.on("GameStart", function battleLogger() { log.add(`${make.player(players[data.playerId])} lost a life`); players[data.playerId].lostLife = true; } - return; - case "getDoingEffect": // Card doing effect + break; + case "getDoingEffect": // affecteds: [ids]; monsters affected // playerAffected1: id; player affected // playerAffected2: id; player affected @@ -144,17 +151,14 @@ eventManager.on("GameStart", function battleLogger() { if (lastEffect === data.monsterId) return; lastEffect = data.monsterId; log.add(`${make.card(monsters[data.monsterId])}'s effect activated.`); - return; - case "getSoulDoingEffect": // Soul doing effect + break; + case "getSoulDoingEffect": log.add(`${make.player(players[data.playerId])}'s soul activated.`); // affecteds // playerAffected1 // playerAffected2 - return; - case "updateMonster": - // monster {card} - return; - case "getTurnStart": // Turn started + break; + case "getTurnStart": lastEffect = 0; if (data.numTurn !== turn) { log.add(`Turn ${data.numTurn}`); @@ -162,14 +166,14 @@ eventManager.on("GameStart", function battleLogger() { currentTurn = data.idPlayer; // It would (kindof) help to actually update who's turn it is turn = data.numTurn; log.add(`${make.player(players[currentTurn])}'s turn`); - return; - case "getTurnEnd": // Turn ended + break; + case "getTurnEnd": // Lets switch the turn NOW, rather than later, the purpose of this is currently unknown... It just sounded like a good idea, also delete the "lostLife" flag... delete players[currentTurn].lostLife; currentTurn = other[data.idPlayer]; delete players[currentTurn].lostLife; lastEffect = 0; - return; + break; case "getUpdateBoard": var oldMonsters = monsters; monsters = {}; @@ -178,41 +182,29 @@ eventManager.on("GameStart", function battleLogger() { if (card === null) return; monsters[card.id] = card; }); - return; - case "getMonsterDestroyed": // Monster killed + break; + case "getMonsterDestroyed": // monsterId: # log.add(`${make.card(monsters[data.monsterId])} was killed`); delete monsters[data.monsterId]; - return; - //case "refreshTimer": // Probably don't need this - case "getPlayableCards": // Probably don't need this - // playableCards [#...] - return; + break; case "getCardBoard": // Adds card to X, Y (0(enemy), 1(you)) - // card - // idPlayer card = JSON.parse(data.card); monsters[card.id] = card; log.add(`${make.player(players[data.idPlayer])} played ${make.card(card)}`); - return; - case "getSpellPlayed": // Spell used - // idPlayer - // card + break; + case "getSpellPlayed": // immediately calls "getDoingEffect" and "getUpdateBoard" card = JSON.parse(data.card); monsters[card.id] = card; log.add(`${make.player(players[data.idPlayer])} used ${make.card(card)}`); - return; - case "updateSpell": // Use spell - return; - case "getFakeDeath": // Card fake exploded... will be re-added 1 second later? - return; - case "getCardDestroyedHandFull": // Card destroyed from full hand + break; + case "getCardDestroyedHandFull": card = JSON.parse(data.card); // This event gets called for *all* discards. Have to do smarter logic here (not just currentTurn!) log.add(`${make.player(players[currentTurn])} discarded ${make.card(card)}`); - return; - case "getPlayerStats": // TODO: When does this get called? + break; + case "getPlayersStats": // TODO: When does this get called? var key, temp = JSON.parse(data.handsSize); for (key in temp) { // TODO: hand size monitoring @@ -227,10 +219,13 @@ eventManager.on("GameStart", function battleLogger() { for (key in temp) { players[key].lives = temp[key]; } - return; + // data.artifcats + // data.turn + break; case "getVictoryDeco": finished = true; log.add(`${make.player(players[opponentId])} left the game`); + // Gracefully fallthrough case "getVictory": log.add(`${make.player(players[userId])} beat ${make.player(players[opponentId])}`); break; @@ -238,7 +233,7 @@ eventManager.on("GameStart", function battleLogger() { finished = true; log.add(`${make.player(players[opponentId])} beat ${make.player(players[userId])}`); break; - case "getResult": // Fight Finish + case "getResult": finished = true; if (data.cause === "Surrender") { log.add(`${data.looser} surrendered.`); @@ -246,7 +241,20 @@ eventManager.on("GameStart", function battleLogger() { log.add(`${data.looser} disconnected.`); } log.add(`${data.winner} beat ${data.looser}`); - return; + break; + case "refreshTimer": break; // Probably don't need this + case "getPlayableCards": // Probably don't need this + // playableCards [#...] + break; + case "updateMonster": + // monster {card} + break; + case "updateSpell": break; // Use spell + case "getFakeDeath": break; // Card fake exploded... will be re-added 1 second later? + default: + if (localStorage.getItem("debugging") === "true") { + log.add(`Unknown action: ${data.action}`); + } } }); }); From 51f550dc364b533232441c3b4e43c6104b6c4301 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 10 Mar 2018 20:37:09 -0600 Subject: [PATCH 0047/1620] utility updates --- utilities.js | 281 ++++++++++++++++++++++++++------------------------- 1 file changed, 144 insertions(+), 137 deletions(-) diff --git a/utilities.js b/utilities.js index ff21675b..3c4601a7 100644 --- a/utilities.js +++ b/utilities.js @@ -1,163 +1,170 @@ // Utilities for undercards.js -function debug() { - if (localStorage.getItem("debugging") !== "true") return; - console.log.apply(console, arguments); +function debug(...args) { + if (localStorage.getItem("debugging") !== "true") return; + console.log(...args); } + function onPage(name, fn) { - var length = location.pathname.length, temp; - if ((temp = location.pathname.indexOf(".")) === -1 && (temp = location.pathname.indexOf("/")) === -1) { - temp = null; - } - var r = name.length && location.pathname.substring(1, temp || length) === name; - if (typeof fn === "function" && r) { - fn(); - } - return r; + var length = location.pathname.length, temp; + if ((temp = location.pathname.indexOf(".")) === -1 && (temp = location.pathname.indexOf("/")) === -1) { + temp = null; + } + var r = name.length && location.pathname.substring(1, temp || length) === name; + if (typeof fn === "function" && r) { + fn(); + } + return r; } -var eventManager = { - _events: { - // eventName: [events] - }, - on: function(event, fn) { - if (typeof fn !== "function") return; - if (!this._events.hasOwnProperty(event)) { - this._events[event] = []; - } - this._events[event].push(fn); - }, - emit: function(event, data, cancelable = false) { - var meta = { - cancelable: cancelable, - canceled: false, - }; - var events = this._events[event]; - if (events && events.length) { - events.forEach(function call(ev) { - // Should we stop processing on cancel? Probably. - try { - ev.call(meta, data); - } catch (e) { - console.error(`Error ocurred while parsing event: ${ev.displayName || ev.name || 'unnamed'}(${event})`); - console.error(e.stack); - } - }); - } - return cancelable && meta.canceled; - }, - _emitRaw: function(event, data, cancelable) { - return this.emit(event, JSON.parse(data), cancelable); +const eventManager = (() => { + const events = { + // eventName: [events] + }; + return { + on: function (event, fn) { + if (typeof fn !== "function") return; + if (!events.hasOwnProperty(event)) { + events[event] = []; + } + events[event].push(fn); }, -}; -var log = { - init: function () { - var hi = $("
"), - ha = $("
History
"), - lo = $("
"); - // Positional math - var pos = parseInt($("div.mainContent").css("width")) + parseInt($("div.mainContent").css("margin-left")); - hi.css({ - width: `${window.innerWidth - pos - 20}px`, - border: "2px solid white", - "background-color": "rgba(0,0,0,0.9)", - "position": "absolute", - right: 10, - top: 10, - }); - ha.css({ - "border-bottom": "1px solid white", - "text-align": "center", - }); - lo.css({ - "overflow-y": "auto", - "max-height": "600px", + emit: function (event, data, cancelable = false) { + const lEvents = events[event]; + let canceled = false; + if (lEvents && lEvents.length) { + lEvents.forEach(function call(ev) { + // Should we stop processing on cancel? Probably. + try { + const meta = { event, cancelable, canceled }; + ev.call(meta, data); + canceled = !!meta.canceled; + } catch (e) { + console.error(`Error ocurred while parsing event: ${ev.displayName || ev.name || 'unnamed'}(${event})`); + console.error(e.stack); + } }); - hi.append(ha); - hi.append(lo); - $("body").append(hi); + } + return cancelable && canceled; }, - add: function(text) { - var add = text instanceof jQuery ? text : `
${text}
`; - $("div#history div#log").prepend(add); // Be lazy and prepend, or append and scroll down? + emitJSON: function (event, data, cancelable) { + return this.emit(event, JSON.parse(data), cancelable); }, + }; +})(); +const log = { + init: function () { + var hi = $("
"), + ha = $("
History
"), + lo = $("
"); + // Positional math + var pos = parseInt($("div.mainContent").css("width")) + parseInt($("div.mainContent").css("margin-left")); + hi.css({ + width: `${window.innerWidth - pos - 20}px`, + border: "2px solid white", + "background-color": "rgba(0,0,0,0.9)", + "position": "absolute", + right: 10, + top: 10, + }); + ha.css({ + "border-bottom": "1px solid white", + "text-align": "center", + }); + lo.css({ + "overflow-y": "auto", + "max-height": "600px", + }); + hi.append(ha); + hi.append(lo); + $("body").append(hi); + }, + add: function (...args) { + const div = $('
'); + args.forEach((a) => { + if (div.html()) div.append(' '); + div.append(a); + }); + if (!div.html()) return; + $("div#history div#log").prepend(div); // Be lazy and prepend, or append and scroll down? + }, }; var fn = { // Not used - each: function(o, f, t) { - if (!o) return; - Object.keys(o).forEach(function(x) { - if (!o[x]) return; - f.call(t, o[x], x, o); // "this", value, key, object - }); - }, + each: function (o, f, t) { + if (!o) return; + Object.keys(o).forEach(function (x) { + if (!o[x]) return; + f.call(t, o[x], x, o); // "this", value, key, object + }); + }, }; class Hotkey { - constructor(name) { - this.name = name; - this.keys = []; - this.clicks = []; - this.fn = null; - } + constructor(name) { + this.name = name; + this.keys = []; + this.clicks = []; + this.fn = null; + } - _has(x, a) { - var h = false; - a.some(function (v, i) { - //if (v === x) h = i; - return h = v === x; - }); - return h; - } + _has(x, a) { + var h = false; + a.some(function (v, i) { + //if (v === x) h = i; + return h = v === x; + }); + return h; + } - _del(x, a) { - a.some(function (v, i) { - if (x === v) { - a.splice(i, 1); - return true; - } - return false; - }); - } + _del(x, a) { + a.some(function (v, i) { + if (x === v) { + a.splice(i, 1); + return true; + } + return false; + }); + } - bindKey(x) { - if (!this.keybound(x)) { - this.keys.push(x); - } - return this; + bindKey(x) { + if (!this.keybound(x)) { + this.keys.push(x); } + return this; + } - unbindKey(x) { - this._del(x, this.keys); - return this; - } + unbindKey(x) { + this._del(x, this.keys); + return this; + } - keybound(x) { - return this._has(x, this.keys); - } + keybound(x) { + return this._has(x, this.keys); + } - bindClick(x) { - if (!this.clickbound(x)) { - this.clicks.push(x); - } - return this; + bindClick(x) { + if (!this.clickbound(x)) { + this.clicks.push(x); } + return this; + } - unbindClick(x) { - this._del(x, this.clicks); - return this; - } + unbindClick(x) { + this._del(x, this.clicks); + return this; + } - clickbound(x) { - return this._has(x, this.clicks); - } + clickbound(x) { + return this._has(x, this.clicks); + } - run(x) { - if (typeof x === "function") { // Set the function - this.fn = x; - return this; // Allow inline constructing - } else if (this.fn) { // All clear (x is the event) - this.fn(x); - } + run(x) { + if (typeof x === "function") { // Set the function + this.fn = x; + return this; // Allow inline constructing + } else if (this.fn) { // All clear (x is the event) + this.fn(x); } + } - toString() { - return `${this.name || "Hotkey"}: Bind{Keys:${JSON.stringify(this.keys)}, Clicks:${JSON.stringify(this.clicks)}}, FN:${this.fn!==null}`; - } + toString() { + return `${this.name || "Hotkey"}: Bind{Keys:${JSON.stringify(this.keys)}, Clicks:${JSON.stringify(this.clicks)}}, FN:${this.fn!==null}`; + } } From 78d455a3bd3ed820c6b4342cc37bedde7d402534 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 10 Mar 2018 20:37:38 -0600 Subject: [PATCH 0048/1620] multiple event handlers --- utilities.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/utilities.js b/utilities.js index 3c4601a7..6b5dcbbd 100644 --- a/utilities.js +++ b/utilities.js @@ -22,10 +22,12 @@ const eventManager = (() => { return { on: function (event, fn) { if (typeof fn !== "function") return; - if (!events.hasOwnProperty(event)) { - events[event] = []; - } - events[event].push(fn); + event.split(' ').forEach((e) => { + if (!events.hasOwnProperty(e)) { + events[e] = []; + } + events[e].push(fn); + }); }, emit: function (event, data, cancelable = false) { const lEvents = events[event]; From 3b906fae3778c73575833b77d7394193bff9b09a Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sun, 11 Mar 2018 00:04:09 -0600 Subject: [PATCH 0049/1620] fix log --- utilities.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/utilities.js b/utilities.js index 6b5dcbbd..efc45e11 100644 --- a/utilities.js +++ b/utilities.js @@ -63,7 +63,7 @@ const log = { width: `${window.innerWidth - pos - 20}px`, border: "2px solid white", "background-color": "rgba(0,0,0,0.9)", - "position": "absolute", + position: "absolute", right: 10, top: 10, }); @@ -72,6 +72,9 @@ const log = { "text-align": "center", }); lo.css({ + display: 'flex', + 'flex-direction': 'column-reverse', + 'align-items': 'flex-start', "overflow-y": "auto", "max-height": "600px", }); @@ -86,7 +89,7 @@ const log = { div.append(a); }); if (!div.html()) return; - $("div#history div#log").prepend(div); // Be lazy and prepend, or append and scroll down? + $("div#history div#log").append(div); // Be lazy and prepend, or append and scroll down? }, }; var fn = { // Not used From 18577adc2475845a8104a42e5a6c46bdd5e2096c Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sun, 11 Mar 2018 05:21:07 -0500 Subject: [PATCH 0050/1620] detailed battle log --- undercards.js | 186 +++++++++++++++++++++++++++++++++++++++++--------- utilities.js | 8 +-- 2 files changed, 158 insertions(+), 36 deletions(-) diff --git a/undercards.js b/undercards.js index efbc05e3..fc81b56b 100644 --- a/undercards.js +++ b/undercards.js @@ -2,8 +2,9 @@ // @name UnderCards script // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=5 -// @version 0.8.5 +// @version 0.9.0-beta // @author feildmaster +// @history 0.9.0 - Added detailed history log, log is top-bottom now // @history 0.8.5 - Added some game debug // @history 0.8.4 - Removed "remember deck" feature (upstream), fixed event log // @history 0.8.3 - Script works now @@ -31,7 +32,6 @@ // TODO: more Hotkeys // TODO: Visual attack targets // TODO: Random deck option -// TODO: Detailed history log // === Variables start var hotkeys = []; @@ -50,22 +50,133 @@ eventManager.on("PlayingGame", function bindHotkeys() { }); eventManager.on("GameStart", function battleLogger() { - var turn = 0, currentTurn = 0, players = {}, monsters = {}, lastEffect, other = {}, finished = false; - var make = { - player: function makePlayer(player) { - var c = $(""); + let turn = 0, currentTurn = 0, players = {}, monsters = {}, lastEffect, other = {}, finished = false; + const hover = (function wrapper() { + let e, x, y; + function update() { + if (!e) return; + e.css({ + // move to left if at the edge of screen + left: x + e.width() + 15 < $(window).width() ? x + 15 : x - e.width() - 10, + // Try to lock to the bottom + top: y + e.height() + 18 > $(window).height() ? $(window).height() - e.height() : y + + 18, + }); + } + $(document).on("mousemove.script", function mouseMove(event) { + x = event.pageX; + y = event.pageY; + update(); + }); + return function hover(data, border = "2px solid white") { + if (e) { + // Hide element + e.remove(); + e = null; + return; + } + if (!data) return; + // Make the element + e = $("
"); + e.append(data); + e.css({ + border, + position: "fixed", + "background-color": "rgba(0,0,0,0.9)", + padding: '2px', + 'z-index': 20, + }); + $("body").append(e); + update(); + }; + })(); + const make = { + player: function makePlayer(player, title = false) { + const c = $(''); c.append(player.username); - // show lives, show health, show gold, show hand, possibly deck size as well - //c.attr("title", `${player.gold} gold`); // gold is broken - //c.hover(); // TODO: hover information c.addClass(player.class); - return c[0].outerHTML; + if (!title) { + c.css('text-decoration', 'underline'); + // show lives, show health, show gold, show hand, possibly deck size as well + var data = `${player.hp} hp, ${player.gold} gold`; + c.hover(() => hover(data)); + } + return c; }, card: function makeCard(card) { - var c = $(""); + const c = $(''); c.append(card.name); - //c.hover(); // TODO: hover information - return c[0].outerHTML; + c.css('text-decoration', 'underline'); + + const status = []; + if (card.taunt) { + status.push('taunt'); + } + if (card.charge) { + status.push('charge'); + } + if (card.attack !== card.originalAttack) { + status.push(card.attack > card.originalAttack ? 'bonusAtk' : 'malusAtk'); + } + if (card.maxHp > card.originalHp) { + status.push('bonusHp'); + } + if (card.paralyzed) { + status.push('paralyzed'); + } + if (card.candy) { + status.push('candy'); + } + if (card.kr) { + status.push('poison'); + } + if (card.cantAttack) { + status.push('cantAttack'); + } + if (card.notTargetable) { + status.push('notTargetable'); + } + if (card.resurrect) { + status.push('resurrect'); + } + if (card.invincible) { + status.push('invulnerable'); + } + if (card.transparency) { + status.push('transparency'); + } + if (card.rarity === "DETERMINATION") { + status.push('determination'); + } + if (card.silence) { + status.push('silenced'); + } + if (card.catchedMonster) { + status.push('box'); + } + let data = ``; + data += ``; + data += ``; + data += ``; + if (!card.typeCard) { + data += ``; + } else { + data += ``; + } + data += `
${card.name}`; + if (card.shiny) { + // TODO: rainbow + } + // TODO: skins + data += `${card.cost}
`; + if (status.length) { + // add status images + status.forEach((s, i) => { + data += ``; + }); + } + data += `
${card.desc || ''}
${card.attack}${card.hp}
`; + c.hover(() => hover(data, null)); + return c; }, }; @@ -102,6 +213,7 @@ eventManager.on("GameStart", function battleLogger() { // populate monsters JSON.parse(data.board).forEach(function (card) { if (card === null) return; + card.desc = getDescription(card); monsters[card.id] = card; }); // Gracefully fallthrough @@ -118,28 +230,28 @@ eventManager.on("GameStart", function battleLogger() { other[enemy.id] = you.id; // Initialize the log log.init(); - $("div#history div.handle").html(`[${data.gameType}] ${make.player(you)} vs ${make.player(enemy)}`); + $("div#history div.handle").html('').append(`[${data.gameType}] `, make.player(you), ' vs ', make.player(enemy)); log.add(`Turn ${turn}`); if (data.userTurn) { currentTurn = data.userTurn; - log.add(`${make.player(players[data.userTurn])}'s turn`); + log.add(make.player(players[data.userTurn]), "'s turn"); } break; case "getFight": // monster attack monster - log.add(`${make.card(monsters[data.attackMonster])} attacked ${make.card(monsters[data.defendMonster])}`); + log.add(make.card(monsters[data.attackMonster]), ' attacked ', make.card(monsters[data.defendMonster])); break; case "getFightPlayer": // monster attacking player - log.add(`${make.card(monsters[data.attackMonster])} attacked ${make.player(players[data.defendPlayer])}`); + log.add(make.card(monsters[data.attackMonster]), ' attacked ', make.player(players[data.defendPlayer])); break; case "getUpdatePlayerHp": var oHp = players[data.playerId].hp; var hp = data.isDamage ? oHp - data.hp : data.hp - oHp; players[data.playerId].hp = data.hp; if (oHp !== data.hp) { // If the player isn't at 0 hp already - log.add(`${make.player(players[data.playerId])} ${data.isDamage ? "lost" : "gained"} ${hp} hp`); + log.add(make.player(players[data.playerId]), ` ${data.isDamage ? "lost" : "gained"} ${hp} hp`); } - if (data.hp === 0 && players[data.playerId].lives > 0 && !players[data.playerId].hasOwnProperty("lostLife")) { // If they have extra lives, and they didn't lose a life already - log.add(`${make.player(players[data.playerId])} lost a life`); + if (data.hp === 0 && players[data.playerId].lives > 1 && !players[data.playerId].hasOwnProperty("lostLife")) { // If they have extra lives, and they didn't lose a life already + log.add(make.player(players[data.playerId]), ' lost a life'); players[data.playerId].lostLife = true; } break; @@ -150,10 +262,12 @@ eventManager.on("GameStart", function battleLogger() { // TODO: Figure out how to do this better if (lastEffect === data.monsterId) return; lastEffect = data.monsterId; - log.add(`${make.card(monsters[data.monsterId])}'s effect activated.`); + log.add(make.card(monsters[data.monsterId]), "'s effect activated."); break; case "getSoulDoingEffect": - log.add(`${make.player(players[data.playerId])}'s soul activated.`); + if (lastEffect === data.playerId - 2) return; + lastEffect = data.playerId - 2; + log.add(make.player(players[data.playerId]), "'s soul activated."); // affecteds // playerAffected1 // playerAffected2 @@ -165,10 +279,13 @@ eventManager.on("GameStart", function battleLogger() { } currentTurn = data.idPlayer; // It would (kindof) help to actually update who's turn it is turn = data.numTurn; - log.add(`${make.player(players[currentTurn])}'s turn`); + log.add(make.player(players[currentTurn]), "'s turn"); break; case "getTurnEnd": // Lets switch the turn NOW, rather than later, the purpose of this is currently unknown... It just sounded like a good idea, also delete the "lostLife" flag... + if (time <= 0) { + log.add(make.player(players[currentTurn]), ' timedout'); + } delete players[currentTurn].lostLife; currentTurn = other[data.idPlayer]; delete players[currentTurn].lostLife; @@ -180,29 +297,34 @@ eventManager.on("GameStart", function battleLogger() { // TOOD: stuff.... JSON.parse(data.board).forEach(function (card) { if (card === null) return; + card.desc = getDescription(card); monsters[card.id] = card; }); break; case "getMonsterDestroyed": // monsterId: # - log.add(`${make.card(monsters[data.monsterId])} was killed`); + log.add(make.card(monsters[data.monsterId]), ' was killed'); delete monsters[data.monsterId]; break; case "getCardBoard": // Adds card to X, Y (0(enemy), 1(you)) card = JSON.parse(data.card); + card.desc = getDescription(card); monsters[card.id] = card; - log.add(`${make.player(players[data.idPlayer])} played ${make.card(card)}`); + log.add(make.player(players[data.idPlayer]), ' played ', make.card(card)); break; case "getSpellPlayed": // immediately calls "getDoingEffect" and "getUpdateBoard" card = JSON.parse(data.card); + card.desc = getDescription(card); monsters[card.id] = card; - log.add(`${make.player(players[data.idPlayer])} used ${make.card(card)}`); + log.add(make.player(players[data.idPlayer]), ' used ', make.card(card)); break; case "getCardDestroyedHandFull": card = JSON.parse(data.card); + card.desc = getDescription(card); + debug(data.card); // This event gets called for *all* discards. Have to do smarter logic here (not just currentTurn!) - log.add(`${make.player(players[currentTurn])} discarded ${make.card(card)}`); + log.add(make.player(players[currentTurn]), ' discarded ', make.card(card)); break; case "getPlayersStats": // TODO: When does this get called? var key, temp = JSON.parse(data.handsSize); @@ -223,15 +345,15 @@ eventManager.on("GameStart", function battleLogger() { // data.turn break; case "getVictoryDeco": - finished = true; - log.add(`${make.player(players[opponentId])} left the game`); + log.add(make.player(players[opponentId]), " left the game"); // Gracefully fallthrough case "getVictory": - log.add(`${make.player(players[userId])} beat ${make.player(players[opponentId])}`); + finished = true; + log.add(make.player(players[userId]), ' beat ', make.player(players[opponentId])); break; case "getDefeat": finished = true; - log.add(`${make.player(players[opponentId])} beat ${make.player(players[userId])}`); + log.add(make.player(players[opponentId]), ' beat ', make.player(players[userId])); break; case "getResult": finished = true; @@ -328,7 +450,7 @@ onPage("gameSpectate", function () { var oHandler = socket.onmessage; socket.onmessage = function onMessageScript(event) { oHandler(event); - eventManager._emitRaw("GameEvent", event.data); + eventManager.emitJSON("GameEvent", event.data); }; })(); }); diff --git a/utilities.js b/utilities.js index efc45e11..211482b6 100644 --- a/utilities.js +++ b/utilities.js @@ -54,11 +54,11 @@ const eventManager = (() => { })(); const log = { init: function () { - var hi = $("
"), + const hi = $("
"), ha = $("
History
"), lo = $("
"); // Positional math - var pos = parseInt($("div.mainContent").css("width")) + parseInt($("div.mainContent").css("margin-left")); + const pos = parseInt($("div.mainContent").css("width")) + parseInt($("div.mainContent").css("margin-left")); hi.css({ width: `${window.innerWidth - pos - 20}px`, border: "2px solid white", @@ -66,6 +66,7 @@ const log = { position: "absolute", right: 10, top: 10, + 'z-index': 20, }); ha.css({ "border-bottom": "1px solid white", @@ -85,11 +86,10 @@ const log = { add: function (...args) { const div = $('
'); args.forEach((a) => { - if (div.html()) div.append(' '); div.append(a); }); if (!div.html()) return; - $("div#history div#log").append(div); // Be lazy and prepend, or append and scroll down? + $("div#history div#log").prepend(div); }, }; var fn = { // Not used From 0ad1ce891d70452afca12096d238c6e073596800 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sun, 11 Mar 2018 06:33:13 -0500 Subject: [PATCH 0051/1620] cleanup --- undercards.js | 452 ++++++++++++++++++++++---------------------------- utilities.js | 63 ++++++- 2 files changed, 258 insertions(+), 257 deletions(-) diff --git a/undercards.js b/undercards.js index fc81b56b..70ccc564 100644 --- a/undercards.js +++ b/undercards.js @@ -32,9 +32,10 @@ // TODO: more Hotkeys // TODO: Visual attack targets // TODO: Random deck option +// TODO: Delayed events... (green soul, discard (for example, sans)) // === Variables start -var hotkeys = []; +const hotkeys = []; // === Variables end eventManager.on("getWaitingQueue", function lowerVolume() { @@ -67,7 +68,7 @@ eventManager.on("GameStart", function battleLogger() { y = event.pageY; update(); }); - return function hover(data, border = "2px solid white") { + return function hover(data, border = null) { if (e) { // Hide element e.remove(); @@ -97,8 +98,8 @@ eventManager.on("GameStart", function battleLogger() { if (!title) { c.css('text-decoration', 'underline'); // show lives, show health, show gold, show hand, possibly deck size as well - var data = `${player.hp} hp, ${player.gold} gold`; - c.hover(() => hover(data)); + const data = `${player.hp} hp, ${player.gold} gold`; + c.hover(() => hover(data, '2px solid white')); } return c; }, @@ -106,53 +107,7 @@ eventManager.on("GameStart", function battleLogger() { const c = $(''); c.append(card.name); c.css('text-decoration', 'underline'); - - const status = []; - if (card.taunt) { - status.push('taunt'); - } - if (card.charge) { - status.push('charge'); - } - if (card.attack !== card.originalAttack) { - status.push(card.attack > card.originalAttack ? 'bonusAtk' : 'malusAtk'); - } - if (card.maxHp > card.originalHp) { - status.push('bonusHp'); - } - if (card.paralyzed) { - status.push('paralyzed'); - } - if (card.candy) { - status.push('candy'); - } - if (card.kr) { - status.push('poison'); - } - if (card.cantAttack) { - status.push('cantAttack'); - } - if (card.notTargetable) { - status.push('notTargetable'); - } - if (card.resurrect) { - status.push('resurrect'); - } - if (card.invincible) { - status.push('invulnerable'); - } - if (card.transparency) { - status.push('transparency'); - } - if (card.rarity === "DETERMINATION") { - status.push('determination'); - } - if (card.silence) { - status.push('silenced'); - } - if (card.catchedMonster) { - status.push('box'); - } + let data = ``; data += ``; data += ``; } data += `
${card.name}`; if (card.shiny) { @@ -161,6 +116,7 @@ eventManager.on("GameStart", function battleLogger() { // TODO: skins data += `${card.cost}
`; + const status = fn.cardStatus(card); if (status.length) { // add status images status.forEach((s, i) => { @@ -175,217 +131,205 @@ eventManager.on("GameStart", function battleLogger() { data += `
`; - c.hover(() => hover(data, null)); + c.hover(() => hover(data)); return c; }, }; - // TODO: Clean this up - // This is an ugly thing! - eventManager.on("GameEvent", function logEvent(data) { + eventManager.on('GameEvent', function logEvent(data) { if (finished) { // Sometimes we get events after the battle is over - if (localStorage.getItem("debuggingExtra") === "true") { + if (localStorage.getItem('debugging.extra') === "true") { log.add(`Extra action: ${data.action}`); } return; } - // TODO: Delayed events... (green soul, discard (for example, sans)) - var card, you, enemy; + const emitted = eventManager.emit(data.action, data).ran; + if (!emitted && localStorage.getItem('debugging') === "true") { + log.add(`Unknown action: ${data.action}`); + } + }); + + eventManager.on('getAllGameInfos getGameStarted', function initBattle(data) { + let you, enemy; // Battle logging happens after the game runs - switch (data.action) { - case "getAllGameInfos": // Initialize "spectate" history here - // board = [0, 1, 2, 3, 4, 5, 6, 7, 8] - // ---- typeCard: 0 = enemy; 1: spell - // -- card: {attack, hp, maxHp, originalAttack, originalHp, paralyzed, silence, poisoned, taunt, id, typeCard, name, image, cost, description, rarity, shiny, quantity} - // TODO: turnTime monitoring - you = JSON.parse(data.you); - enemy = JSON.parse(data.enemy); - you.class = data.yourClass; - enemy.class = data.enemyClass; - // Set gold - var gold = JSON.parse(data.golds); - you.gold = gold[you.id]; - enemy.gold = gold[enemy.id]; - // Set lives - var lives = JSON.parse(data.lives); - you.lives = lives[you.id]; - enemy.lives = lives[enemy.id]; - // populate monsters - JSON.parse(data.board).forEach(function (card) { - if (card === null) return; - card.desc = getDescription(card); - monsters[card.id] = card; - }); - // Gracefully fallthrough - case "getGameStarted": // Initialize "game" history here - turn = data.turn || 0; - if (!you) { - you = {id: data.yourId, username: data.yourUsername, hp: 30, class: data.yourClass, level: data.yourLevel, rank: data.yourRank, gold: 2}; - enemy = {id: data.ennemyId, username: data.ennemyUsername, hp: 30, class: data.enemyClass, level: data.enemyLevel, rank: data.enemyRank, gold: 2}; - } - players[you.id] = you; - players[enemy.id] = enemy; - // Test changing ID's at endTurn instead of startTurn - other[you.id] = enemy.id; - other[enemy.id] = you.id; - // Initialize the log - log.init(); - $("div#history div.handle").html('').append(`[${data.gameType}] `, make.player(you), ' vs ', make.player(enemy)); - log.add(`Turn ${turn}`); - if (data.userTurn) { - currentTurn = data.userTurn; - log.add(make.player(players[data.userTurn]), "'s turn"); - } - break; - case "getFight": // monster attack monster - log.add(make.card(monsters[data.attackMonster]), ' attacked ', make.card(monsters[data.defendMonster])); - break; - case "getFightPlayer": // monster attacking player - log.add(make.card(monsters[data.attackMonster]), ' attacked ', make.player(players[data.defendPlayer])); - break; - case "getUpdatePlayerHp": - var oHp = players[data.playerId].hp; - var hp = data.isDamage ? oHp - data.hp : data.hp - oHp; - players[data.playerId].hp = data.hp; - if (oHp !== data.hp) { // If the player isn't at 0 hp already - log.add(make.player(players[data.playerId]), ` ${data.isDamage ? "lost" : "gained"} ${hp} hp`); - } - if (data.hp === 0 && players[data.playerId].lives > 1 && !players[data.playerId].hasOwnProperty("lostLife")) { // If they have extra lives, and they didn't lose a life already - log.add(make.player(players[data.playerId]), ' lost a life'); - players[data.playerId].lostLife = true; - } - break; - case "getDoingEffect": - // affecteds: [ids]; monsters affected - // playerAffected1: id; player affected - // playerAffected2: id; player affected - // TODO: Figure out how to do this better - if (lastEffect === data.monsterId) return; - lastEffect = data.monsterId; - log.add(make.card(monsters[data.monsterId]), "'s effect activated."); - break; - case "getSoulDoingEffect": - if (lastEffect === data.playerId - 2) return; - lastEffect = data.playerId - 2; - log.add(make.player(players[data.playerId]), "'s soul activated."); - // affecteds - // playerAffected1 - // playerAffected2 - break; - case "getTurnStart": - lastEffect = 0; - if (data.numTurn !== turn) { - log.add(`Turn ${data.numTurn}`); - } - currentTurn = data.idPlayer; // It would (kindof) help to actually update who's turn it is - turn = data.numTurn; - log.add(make.player(players[currentTurn]), "'s turn"); - break; - case "getTurnEnd": - // Lets switch the turn NOW, rather than later, the purpose of this is currently unknown... It just sounded like a good idea, also delete the "lostLife" flag... - if (time <= 0) { - log.add(make.player(players[currentTurn]), ' timedout'); - } - delete players[currentTurn].lostLife; - currentTurn = other[data.idPlayer]; - delete players[currentTurn].lostLife; - lastEffect = 0; - break; - case "getUpdateBoard": - var oldMonsters = monsters; - monsters = {}; - // TOOD: stuff.... - JSON.parse(data.board).forEach(function (card) { - if (card === null) return; - card.desc = getDescription(card); - monsters[card.id] = card; - }); - break; - case "getMonsterDestroyed": - // monsterId: # - log.add(make.card(monsters[data.monsterId]), ' was killed'); - delete monsters[data.monsterId]; - break; - case "getCardBoard": // Adds card to X, Y (0(enemy), 1(you)) - card = JSON.parse(data.card); + if (this.event === 'getAllGameInfos') { + you = JSON.parse(data.you); + enemy = JSON.parse(data.enemy); + you.class = data.yourClass; + enemy.class = data.enemyClass; + // Set gold + const gold = JSON.parse(data.golds); + you.gold = gold[you.id]; + enemy.gold = gold[enemy.id]; + // Set lives + const lives = JSON.parse(data.lives); + you.lives = lives[you.id]; + enemy.lives = lives[enemy.id]; + // populate monsters + JSON.parse(data.board).forEach(function (card) { + if (card === null) return; card.desc = getDescription(card); monsters[card.id] = card; - log.add(make.player(players[data.idPlayer]), ' played ', make.card(card)); - break; - case "getSpellPlayed": - // immediately calls "getDoingEffect" and "getUpdateBoard" - card = JSON.parse(data.card); - card.desc = getDescription(card); - monsters[card.id] = card; - log.add(make.player(players[data.idPlayer]), ' used ', make.card(card)); - break; - case "getCardDestroyedHandFull": - card = JSON.parse(data.card); - card.desc = getDescription(card); - debug(data.card); - // This event gets called for *all* discards. Have to do smarter logic here (not just currentTurn!) - log.add(make.player(players[currentTurn]), ' discarded ', make.card(card)); - break; - case "getPlayersStats": // TODO: When does this get called? - var key, temp = JSON.parse(data.handsSize); - for (key in temp) { - // TODO: hand size monitoring - //players[key].hand - } - // TODO: deck monitoring (decksSize) - temp = JSON.parse(data.golds); - for (key in temp) { - players[key].gold = temp[key]; - } - temp = JSON.parse(data.lives); - for (key in temp) { - players[key].lives = temp[key]; - } - // data.artifcats - // data.turn - break; - case "getVictoryDeco": - log.add(make.player(players[opponentId]), " left the game"); - // Gracefully fallthrough - case "getVictory": - finished = true; - log.add(make.player(players[userId]), ' beat ', make.player(players[opponentId])); - break; - case "getDefeat": - finished = true; - log.add(make.player(players[opponentId]), ' beat ', make.player(players[userId])); - break; - case "getResult": - finished = true; - if (data.cause === "Surrender") { - log.add(`${data.looser} surrendered.`); - } else if (data.cause === "Disconnection") { - log.add(`${data.looser} disconnected.`); - } - log.add(`${data.winner} beat ${data.looser}`); - break; - case "refreshTimer": break; // Probably don't need this - case "getPlayableCards": // Probably don't need this - // playableCards [#...] - break; - case "updateMonster": - // monster {card} - break; - case "updateSpell": break; // Use spell - case "getFakeDeath": break; // Card fake exploded... will be re-added 1 second later? - default: - if (localStorage.getItem("debugging") === "true") { - log.add(`Unknown action: ${data.action}`); - } + }); + } else { + you = {id: data.yourId, username: data.yourUsername, hp: 30, class: data.yourClass, level: data.yourLevel, rank: data.yourRank, gold: 2}; + enemy = {id: data.ennemyId, username: data.ennemyUsername, hp: 30, class: data.enemyClass, level: data.enemyLevel, rank: data.enemyRank, gold: 2}; + } + turn = data.turn || 0; + players[you.id] = you; + players[enemy.id] = enemy; + // Test changing ID's at endTurn instead of startTurn + other[you.id] = enemy.id; + other[enemy.id] = you.id; + // Initialize the log + log.init(); + $("div#history div.handle").html('').append(`[${data.gameType}] `, make.player(you), ' vs ', make.player(enemy)); + log.add(`Turn ${turn}`); + if (data.userTurn) { + currentTurn = data.userTurn; + log.add(make.player(players[data.userTurn]), "'s turn"); } }); + eventManager.on('getFight getFightPlayer', function fight(data) { + const target = this.event === 'getFightPlayer' ? make.player(players[data.defendPlayer]) : make.card(monsters[data.defendMonster]); + log.add(make.card(monsters[data.attackMonster]), ' attacked ', target); + }); + eventManager.on('getUpdatePlayerHp', function updateHP(data) { + const oHp = players[data.playerId].hp; + const hp = data.isDamage ? oHp - data.hp : data.hp - oHp; + players[data.playerId].hp = data.hp; + if (oHp !== data.hp) { // If the player isn't at 0 hp already + log.add(make.player(players[data.playerId]), ` ${data.isDamage ? "lost" : "gained"} ${hp} hp`); + } + if (data.hp === 0 && players[data.playerId].lives > 1 && !players[data.playerId].hasOwnProperty("lostLife")) { // If they have extra lives, and they didn't lose a life already + log.add(make.player(players[data.playerId]), ' lost a life'); + players[data.playerId].lostLife = true; + } + }); + eventManager.on('getDoingEffect', function doEffect(data) { + // affecteds: [ids]; monsters affected + // playerAffected1: id; player affected + // playerAffected2: id; player affected + // TODO: Figure out how to do this better + if (lastEffect === data.monsterId) return; + lastEffect = data.monsterId; + log.add(make.card(monsters[data.monsterId]), "'s effect activated"); + }); + eventManager.on('getSoulDoingEffect', function soulEffect(data) { + if (lastEffect === data.playerId - 2) return; + lastEffect = data.playerId - 2; + log.add(make.player(players[data.playerId]), "'s soul activated"); + // affecteds + // playerAffected1 + // playerAffected2 + }); + eventManager.on('getTurnStart', function turnStart(data) { + lastEffect = 0; + if (data.numTurn !== turn) { + log.add(`Turn ${data.numTurn}`); + } + currentTurn = data.idPlayer; // It would (kindof) help to actually update who's turn it is + turn = data.numTurn; + log.add(make.player(players[currentTurn]), "'s turn"); + }); + eventManager.on('getTurnEnd', function turnEnd(data) { + // Lets switch the turn NOW, rather than later, the purpose of this is currently unknown... It just sounded like a good idea, also delete the "lostLife" flag... + if (time <= 0) { + log.add(make.player(players[currentTurn]), ' timed out'); + } + delete players[currentTurn].lostLife; + currentTurn = other[data.idPlayer]; + delete players[currentTurn].lostLife; + lastEffect = 0; + }); + eventManager.on('getUpdateBoard', function updateGame(data) { + const oldMonsters = monsters; + monsters = {}; + // TOOD: stuff.... + JSON.parse(data.board).forEach(function (card) { + if (card === null) return; + card.desc = getDescription(card); + monsters[card.id] = card; + }); + }); + eventManager.on('getMonsterDestroyed', function monsterKilled(data) { + // monsterId: # + log.add(make.card(monsters[data.monsterId]), ' was killed'); + delete monsters[data.monsterId]; + }); + eventManager.on('getCardBoard', function playCard(data) { // Adds card to X, Y (0(enemy), 1(you)) + const card = JSON.parse(data.card); + card.desc = getDescription(card); + monsters[card.id] = card; + log.add(make.player(players[data.idPlayer]), ' played ', make.card(card)); + }); + eventManager.on('getSpellPlayed', function useSpell(data) { + // immediately calls "getDoingEffect" and "getUpdateBoard" + const card = JSON.parse(data.card); + card.desc = getDescription(card); + monsters[card.id] = card; + log.add(make.player(players[data.idPlayer]), ' used ', make.card(card)); + }); + eventManager.on('getCardDestroyedHandFull', function (data) { + const card = JSON.parse(data.card); + card.desc = getDescription(card); + debug(data.card); + // This event gets called for *all* discards. Have to do smarter logic here (not just currentTurn!) + log.add(make.player(players[currentTurn]), ' discarded ', make.card(card)); + }); + eventManager.on('getPlayersStats', function updatePlayer(data) { // TODO: When does this get called? + let key, temp = JSON.parse(data.handsSize); + for (key in temp) { + // TODO: hand size monitoring + //players[key].hand + } + // TODO: deck monitoring (decksSize) + temp = JSON.parse(data.golds); + for (key in temp) { + players[key].gold = temp[key]; + } + temp = JSON.parse(data.lives); + for (key in temp) { + players[key].lives = temp[key]; + } + // data.artifcats + // data.turn + }); + eventManager.on('getVictory getVictoryDeco getDefeat', function gameEnd(data) { + finished = true; + if (this.event === 'getVictoryDeco') { + log.add(make.player(players[opponentId]), " left the game"); + } + const you = make.player(players[userId]); + const enemy = make.player(players[opponentId]); + if (this.event === 'getDefeat') { + log.add(enemy, ' beat ', you); + } else { + log.add(you, ' beat ', enemy); + } + }); + eventManager.on('getResult', function endSpectating(data) { + finished = true; + if (data.cause === "Surrender") { + log.add(`${data.looser} surrendered.`); + } else if (data.cause === "Disconnection") { + log.add(`${data.looser} disconnected.`); + } + // TODO: colorize + log.add(`${data.winner} beat ${data.looser}`); + }); + eventManager.on('updateMonster', function updateCard(data) { + // monster {card} + }); + eventManager.on('refreshTimer getPlayableCards updateSpell getFakeDeath', + function ignore() {}); }); // === Play hooks onPage("Play", function () { // TODO: Better "game found" support debug("On play page"); - var queues, disable = true; + let queues, disable = true; eventManager.on("jQuery", function onPlay() { if (disable) { @@ -400,15 +344,15 @@ onPage("Play", function () { return setTimeout(hook); } socket = socketQueue; - var oOpen = socketQueue.onopen; + const oOpen = socketQueue.onopen; socketQueue.onopen = function onOpenScript(event) { disable = false; oOpen(event); if (queues) queues.prop("disabled", false); }; - var oHandler = socketQueue.onmessage; + const oHandler = socketQueue.onmessage; socketQueue.onmessage = function onMessageScript(event) { - var data = JSON.parse(event.data); + const data = JSON.parse(event.data); oHandler(event); eventManager.emit(data.action, data); }; @@ -419,21 +363,21 @@ onPage("Play", function () { onPage("Game", function () { debug("Playing Game"); (function hook() { - if (typeof socket === "undefined") { + if (typeof socket === 'undefined') { debug("Timeout hook"); return setTimeout(hook); } - var oHandler = socket.onmessage; + const oHandler = socket.onmessage; socket.onmessage = function onMessageScript(event) { - var data = JSON.parse(event.data); - //debug(event.data); + const data = JSON.parse(event.data); + //eventManager.emit('PreGameEvent', data, true); oHandler(event); if (data.action === "getGameStarted") { // We're running our game. eventManager.emit("GameStart"); eventManager.emit("PlayingGame"); } - eventManager.emit("GameEvent", data); + eventManager.emit('GameEvent', data); }; })(); }); @@ -447,10 +391,12 @@ onPage("gameSpectate", function () { debug("Timeout hook"); return setTimeout(hook); } - var oHandler = socket.onmessage; + const oHandler = socket.onmessage; socket.onmessage = function onMessageScript(event) { + const data = JSON.parse(event.data); + //eventManager.emit('PreGameEvent', data, true); oHandler(event); - eventManager.emitJSON("GameEvent", event.data); + eventManager.emit('GameEvent', data); }; })(); }); @@ -489,7 +435,7 @@ eventManager.on("jQuery", function always() { }); // Attempt to detect jQuery -var tries = 20; +let tries = 20; (function jSetup() { if (typeof jQuery === "undefined") { if (tries-- <= 0) { // jQuery is probably not going to load at this point... diff --git a/utilities.js b/utilities.js index 211482b6..1e950684 100644 --- a/utilities.js +++ b/utilities.js @@ -21,18 +21,21 @@ const eventManager = (() => { }; return { on: function (event, fn) { - if (typeof fn !== "function") return; + if (typeof fn !== "function") return eventManager; event.split(' ').forEach((e) => { if (!events.hasOwnProperty(e)) { events[e] = []; } events[e].push(fn); }); + return eventManager; }, emit: function (event, data, cancelable = false) { const lEvents = events[event]; + let ran = false; let canceled = false; - if (lEvents && lEvents.length) { + if (Array.isArray(lEvents) && lEvents.length) { + ran = true; lEvents.forEach(function call(ev) { // Should we stop processing on cancel? Probably. try { @@ -45,7 +48,10 @@ const eventManager = (() => { } }); } - return cancelable && canceled; + return { + ran, + canceled: cancelable && canceled + }; }, emitJSON: function (event, data, cancelable) { return this.emit(event, JSON.parse(data), cancelable); @@ -92,7 +98,7 @@ const log = { $("div#history div#log").prepend(div); }, }; -var fn = { // Not used +const fn = { each: function (o, f, t) { if (!o) return; Object.keys(o).forEach(function (x) { @@ -100,6 +106,55 @@ var fn = { // Not used f.call(t, o[x], x, o); // "this", value, key, object }); }, + cardStatus: (card) => { + const status = []; + if (card.taunt) { + status.push('taunt'); + } + if (card.charge) { + status.push('charge'); + } + if (card.attack !== card.originalAttack) { + status.push(card.attack > card.originalAttack ? 'bonusAtk' : 'malusAtk'); + } + if (card.maxHp > card.originalHp) { + status.push('bonusHp'); + } + if (card.paralyzed) { + status.push('paralyzed'); + } + if (card.candy) { + status.push('candy'); + } + if (card.kr) { + status.push('poison'); + } + if (card.cantAttack) { + status.push('cantAttack'); + } + if (card.notTargetable) { + status.push('notTargetable'); + } + if (card.resurrect) { + status.push('resurrect'); + } + if (card.invincible) { + status.push('invulnerable'); + } + if (card.transparency) { + status.push('transparency'); + } + if (card.rarity === "DETERMINATION") { + status.push('determination'); + } + if (card.silence) { + status.push('silenced'); + } + if (card.catchedMonster) { + status.push('box'); + } + return status; + }, }; class Hotkey { constructor(name) { From ea5e9f713610a7fb7e2d75bc81dbf75e02ca292b Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sun, 11 Mar 2018 06:35:58 -0500 Subject: [PATCH 0052/1620] spacing --- undercards.js | 751 ++++++++++++++++++++++++++------------------------ 1 file changed, 384 insertions(+), 367 deletions(-) diff --git a/undercards.js b/undercards.js index 70ccc564..fe3b32ca 100644 --- a/undercards.js +++ b/undercards.js @@ -39,410 +39,427 @@ const hotkeys = []; // === Variables end eventManager.on("getWaitingQueue", function lowerVolume() { - // Lower the volume, the music changing is enough as is - audioQueue.volume = 0.3; + // Lower the volume, the music changing is enough as is + audioQueue.volume = 0.3; }); eventManager.on("PlayingGame", function bindHotkeys() { - // Binds to Space, Middle Click - hotkeys.push(new Hotkey("End turn").bindKey(32).bindClick(2).run((e) => { - if (!$(e.target).is("#endTurnBtn") && userTurn && userTurn === userId) endTurn(); - })); + // Binds to Space, Middle Click + hotkeys.push(new Hotkey("End turn").bindKey(32).bindClick(2).run((e) => { + if (!$(e.target).is("#endTurnBtn") && userTurn && userTurn === userId) endTurn(); + })); }); eventManager.on("GameStart", function battleLogger() { - let turn = 0, currentTurn = 0, players = {}, monsters = {}, lastEffect, other = {}, finished = false; - const hover = (function wrapper() { - let e, x, y; - function update() { - if (!e) return; - e.css({ - // move to left if at the edge of screen - left: x + e.width() + 15 < $(window).width() ? x + 15 : x - e.width() - 10, - // Try to lock to the bottom - top: y + e.height() + 18 > $(window).height() ? $(window).height() - e.height() : y + + 18, - }); - } - $(document).on("mousemove.script", function mouseMove(event) { - x = event.pageX; - y = event.pageY; - update(); - }); - return function hover(data, border = null) { - if (e) { - // Hide element - e.remove(); - e = null; - return; - } - if (!data) return; - // Make the element - e = $("
"); - e.append(data); - e.css({ - border, - position: "fixed", - "background-color": "rgba(0,0,0,0.9)", - padding: '2px', - 'z-index': 20, - }); - $("body").append(e); - update(); - }; - })(); - const make = { - player: function makePlayer(player, title = false) { - const c = $(''); - c.append(player.username); - c.addClass(player.class); - if (!title) { - c.css('text-decoration', 'underline'); - // show lives, show health, show gold, show hand, possibly deck size as well - const data = `${player.hp} hp, ${player.gold} gold`; - c.hover(() => hover(data, '2px solid white')); - } - return c; - }, - card: function makeCard(card) { - const c = $(''); - c.append(card.name); - c.css('text-decoration', 'underline'); - - let data = ``; - data += ``; - data += ``; - data += ``; - if (!card.typeCard) { - data += ``; - } else { - data += ``; - } - data += `
${card.name}`; - if (card.shiny) { - // TODO: rainbow - } - // TODO: skins - data += `${card.cost}
`; - const status = fn.cardStatus(card); - if (status.length) { - // add status images - status.forEach((s, i) => { - data += ``; - }); - } - data += `
${card.desc || ''}
${card.attack}${card.hp}
`; - c.hover(() => hover(data)); - return c; - }, - }; + let turn = 0, currentTurn = 0, players = {}, monsters = {}, lastEffect, other = {}, finished = false; + const hover = (function wrapper() { + let e, x, y; - eventManager.on('GameEvent', function logEvent(data) { - if (finished) { // Sometimes we get events after the battle is over - if (localStorage.getItem('debugging.extra') === "true") { - log.add(`Extra action: ${data.action}`); - } - return; - } - const emitted = eventManager.emit(data.action, data).ran; - if (!emitted && localStorage.getItem('debugging') === "true") { - log.add(`Unknown action: ${data.action}`); - } + function update() { + if (!e) return; + e.css({ + // move to left if at the edge of screen + left: x + e.width() + 15 < $(window).width() ? x + 15 : x - e.width() - 10, + // Try to lock to the bottom + top: y + e.height() + 18 > $(window).height() ? $(window).height() - e.height() : y + 18, + }); + } + $(document).on("mousemove.script", function mouseMove(event) { + x = event.pageX; + y = event.pageY; + update(); }); + return function hover(data, border = null) { + if (e) { + // Hide element + e.remove(); + e = null; + return; + } + if (!data) return; + // Make the element + e = $("
"); + e.append(data); + e.css({ + border, + position: "fixed", + "background-color": "rgba(0,0,0,0.9)", + padding: '2px', + 'z-index': 20, + }); + $("body").append(e); + update(); + }; + })(); + const make = { + player: function makePlayer(player, title = false) { + const c = $(''); + c.append(player.username); + c.addClass(player.class); + if (!title) { + c.css('text-decoration', 'underline'); + // show lives, show health, show gold, show hand, possibly deck size as well + const data = `${player.hp} hp, ${player.gold} gold`; + c.hover(() => hover(data, '2px solid white')); + } + return c; + }, + card: function makeCard(card) { + const c = $(''); + c.append(card.name); + c.css('text-decoration', 'underline'); - eventManager.on('getAllGameInfos getGameStarted', function initBattle(data) { - let you, enemy; - // Battle logging happens after the game runs - if (this.event === 'getAllGameInfos') { - you = JSON.parse(data.you); - enemy = JSON.parse(data.enemy); - you.class = data.yourClass; - enemy.class = data.enemyClass; - // Set gold - const gold = JSON.parse(data.golds); - you.gold = gold[you.id]; - enemy.gold = gold[enemy.id]; - // Set lives - const lives = JSON.parse(data.lives); - you.lives = lives[you.id]; - enemy.lives = lives[enemy.id]; - // populate monsters - JSON.parse(data.board).forEach(function (card) { - if (card === null) return; - card.desc = getDescription(card); - monsters[card.id] = card; - }); - } else { - you = {id: data.yourId, username: data.yourUsername, hp: 30, class: data.yourClass, level: data.yourLevel, rank: data.yourRank, gold: 2}; - enemy = {id: data.ennemyId, username: data.ennemyUsername, hp: 30, class: data.enemyClass, level: data.enemyLevel, rank: data.enemyRank, gold: 2}; - } - turn = data.turn || 0; - players[you.id] = you; - players[enemy.id] = enemy; - // Test changing ID's at endTurn instead of startTurn - other[you.id] = enemy.id; - other[enemy.id] = you.id; - // Initialize the log - log.init(); - $("div#history div.handle").html('').append(`[${data.gameType}] `, make.player(you), ' vs ', make.player(enemy)); - log.add(`Turn ${turn}`); - if (data.userTurn) { - currentTurn = data.userTurn; - log.add(make.player(players[data.userTurn]), "'s turn"); - } - }); - eventManager.on('getFight getFightPlayer', function fight(data) { - const target = this.event === 'getFightPlayer' ? make.player(players[data.defendPlayer]) : make.card(monsters[data.defendMonster]); - log.add(make.card(monsters[data.attackMonster]), ' attacked ', target); - }); - eventManager.on('getUpdatePlayerHp', function updateHP(data) { - const oHp = players[data.playerId].hp; - const hp = data.isDamage ? oHp - data.hp : data.hp - oHp; - players[data.playerId].hp = data.hp; - if (oHp !== data.hp) { // If the player isn't at 0 hp already - log.add(make.player(players[data.playerId]), ` ${data.isDamage ? "lost" : "gained"} ${hp} hp`); - } - if (data.hp === 0 && players[data.playerId].lives > 1 && !players[data.playerId].hasOwnProperty("lostLife")) { // If they have extra lives, and they didn't lose a life already - log.add(make.player(players[data.playerId]), ' lost a life'); - players[data.playerId].lostLife = true; - } - }); - eventManager.on('getDoingEffect', function doEffect(data) { - // affecteds: [ids]; monsters affected - // playerAffected1: id; player affected - // playerAffected2: id; player affected - // TODO: Figure out how to do this better - if (lastEffect === data.monsterId) return; - lastEffect = data.monsterId; - log.add(make.card(monsters[data.monsterId]), "'s effect activated"); - }); - eventManager.on('getSoulDoingEffect', function soulEffect(data) { - if (lastEffect === data.playerId - 2) return; - lastEffect = data.playerId - 2; - log.add(make.player(players[data.playerId]), "'s soul activated"); - // affecteds - // playerAffected1 - // playerAffected2 - }); - eventManager.on('getTurnStart', function turnStart(data) { - lastEffect = 0; - if (data.numTurn !== turn) { - log.add(`Turn ${data.numTurn}`); - } - currentTurn = data.idPlayer; // It would (kindof) help to actually update who's turn it is - turn = data.numTurn; - log.add(make.player(players[currentTurn]), "'s turn"); - }); - eventManager.on('getTurnEnd', function turnEnd(data) { - // Lets switch the turn NOW, rather than later, the purpose of this is currently unknown... It just sounded like a good idea, also delete the "lostLife" flag... - if (time <= 0) { - log.add(make.player(players[currentTurn]), ' timed out'); - } - delete players[currentTurn].lostLife; - currentTurn = other[data.idPlayer]; - delete players[currentTurn].lostLife; - lastEffect = 0; - }); - eventManager.on('getUpdateBoard', function updateGame(data) { - const oldMonsters = monsters; - monsters = {}; - // TOOD: stuff.... - JSON.parse(data.board).forEach(function (card) { - if (card === null) return; - card.desc = getDescription(card); - monsters[card.id] = card; + let data = ``; + data += ``; + data += ``; + data += ``; + if (!card.typeCard) { + data += ``; + } else { + data += ``; + } + data += `
${card.name}`; + if (card.shiny) { + // TODO: rainbow + } + // TODO: skins + data += `${card.cost}
`; + const status = fn.cardStatus(card); + if (status.length) { + // add status images + status.forEach((s, i) => { + data += ``; }); - }); - eventManager.on('getMonsterDestroyed', function monsterKilled(data) { - // monsterId: # - log.add(make.card(monsters[data.monsterId]), ' was killed'); - delete monsters[data.monsterId]; - }); - eventManager.on('getCardBoard', function playCard(data) { // Adds card to X, Y (0(enemy), 1(you)) - const card = JSON.parse(data.card); - card.desc = getDescription(card); - monsters[card.id] = card; - log.add(make.player(players[data.idPlayer]), ' played ', make.card(card)); - }); - eventManager.on('getSpellPlayed', function useSpell(data) { - // immediately calls "getDoingEffect" and "getUpdateBoard" - const card = JSON.parse(data.card); + } + data += `
${card.desc || ''}
${card.attack}${card.hp}
`; + c.hover(() => hover(data)); + return c; + }, + }; + + eventManager.on('GameEvent', function logEvent(data) { + if (finished) { // Sometimes we get events after the battle is over + if (localStorage.getItem('debugging.extra') === "true") { + log.add(`Extra action: ${data.action}`); + } + return; + } + const emitted = eventManager.emit(data.action, data).ran; + if (!emitted && localStorage.getItem('debugging') === "true") { + log.add(`Unknown action: ${data.action}`); + } + }); + + eventManager.on('getAllGameInfos getGameStarted', function initBattle(data) { + let you, enemy; + // Battle logging happens after the game runs + if (this.event === 'getAllGameInfos') { + you = JSON.parse(data.you); + enemy = JSON.parse(data.enemy); + you.class = data.yourClass; + enemy.class = data.enemyClass; + // Set gold + const gold = JSON.parse(data.golds); + you.gold = gold[you.id]; + enemy.gold = gold[enemy.id]; + // Set lives + const lives = JSON.parse(data.lives); + you.lives = lives[you.id]; + enemy.lives = lives[enemy.id]; + // populate monsters + JSON.parse(data.board).forEach(function (card) { + if (card === null) return; card.desc = getDescription(card); monsters[card.id] = card; - log.add(make.player(players[data.idPlayer]), ' used ', make.card(card)); - }); - eventManager.on('getCardDestroyedHandFull', function (data) { - const card = JSON.parse(data.card); - card.desc = getDescription(card); - debug(data.card); - // This event gets called for *all* discards. Have to do smarter logic here (not just currentTurn!) - log.add(make.player(players[currentTurn]), ' discarded ', make.card(card)); - }); - eventManager.on('getPlayersStats', function updatePlayer(data) { // TODO: When does this get called? - let key, temp = JSON.parse(data.handsSize); - for (key in temp) { - // TODO: hand size monitoring - //players[key].hand - } - // TODO: deck monitoring (decksSize) - temp = JSON.parse(data.golds); - for (key in temp) { - players[key].gold = temp[key]; - } - temp = JSON.parse(data.lives); - for (key in temp) { - players[key].lives = temp[key]; - } - // data.artifcats - // data.turn - }); - eventManager.on('getVictory getVictoryDeco getDefeat', function gameEnd(data) { - finished = true; - if (this.event === 'getVictoryDeco') { - log.add(make.player(players[opponentId]), " left the game"); - } - const you = make.player(players[userId]); - const enemy = make.player(players[opponentId]); - if (this.event === 'getDefeat') { - log.add(enemy, ' beat ', you); - } else { - log.add(you, ' beat ', enemy); - } - }); - eventManager.on('getResult', function endSpectating(data) { - finished = true; - if (data.cause === "Surrender") { - log.add(`${data.looser} surrendered.`); - } else if (data.cause === "Disconnection") { - log.add(`${data.looser} disconnected.`); - } - // TODO: colorize - log.add(`${data.winner} beat ${data.looser}`); - }); - eventManager.on('updateMonster', function updateCard(data) { - // monster {card} + }); + } else { + you = { + id: data.yourId, + username: data.yourUsername, + hp: 30, + class: data.yourClass, + level: data.yourLevel, + rank: data.yourRank, + gold: 2 + }; + enemy = { + id: data.ennemyId, + username: data.ennemyUsername, + hp: 30, + class: data.enemyClass, + level: data.enemyLevel, + rank: data.enemyRank, + gold: 2 + }; + } + turn = data.turn || 0; + players[you.id] = you; + players[enemy.id] = enemy; + // Test changing ID's at endTurn instead of startTurn + other[you.id] = enemy.id; + other[enemy.id] = you.id; + // Initialize the log + log.init(); + $("div#history div.handle").html('').append(`[${data.gameType}] `, make.player(you), ' vs ', make.player(enemy)); + log.add(`Turn ${turn}`); + if (data.userTurn) { + currentTurn = data.userTurn; + log.add(make.player(players[data.userTurn]), "'s turn"); + } + }); + eventManager.on('getFight getFightPlayer', function fight(data) { + const target = this.event === 'getFightPlayer' ? make.player(players[data.defendPlayer]) : make.card(monsters[data.defendMonster]); + log.add(make.card(monsters[data.attackMonster]), ' attacked ', target); + }); + eventManager.on('getUpdatePlayerHp', function updateHP(data) { + const oHp = players[data.playerId].hp; + const hp = data.isDamage ? oHp - data.hp : data.hp - oHp; + players[data.playerId].hp = data.hp; + if (oHp !== data.hp) { // If the player isn't at 0 hp already + log.add(make.player(players[data.playerId]), ` ${data.isDamage ? "lost" : "gained"} ${hp} hp`); + } + if (data.hp === 0 && players[data.playerId].lives > 1 && !players[data.playerId].hasOwnProperty("lostLife")) { // If they have extra lives, and they didn't lose a life already + log.add(make.player(players[data.playerId]), ' lost a life'); + players[data.playerId].lostLife = true; + } + }); + eventManager.on('getDoingEffect', function doEffect(data) { + // affecteds: [ids]; monsters affected + // playerAffected1: id; player affected + // playerAffected2: id; player affected + // TODO: Figure out how to do this better + if (lastEffect === data.monsterId) return; + lastEffect = data.monsterId; + log.add(make.card(monsters[data.monsterId]), "'s effect activated"); + }); + eventManager.on('getSoulDoingEffect', function soulEffect(data) { + if (lastEffect === data.playerId - 2) return; + lastEffect = data.playerId - 2; + log.add(make.player(players[data.playerId]), "'s soul activated"); + // affecteds + // playerAffected1 + // playerAffected2 + }); + eventManager.on('getTurnStart', function turnStart(data) { + lastEffect = 0; + if (data.numTurn !== turn) { + log.add(`Turn ${data.numTurn}`); + } + currentTurn = data.idPlayer; // It would (kindof) help to actually update who's turn it is + turn = data.numTurn; + log.add(make.player(players[currentTurn]), "'s turn"); + }); + eventManager.on('getTurnEnd', function turnEnd(data) { + // Lets switch the turn NOW, rather than later, the purpose of this is currently unknown... It just sounded like a good idea, also delete the "lostLife" flag... + if (time <= 0) { + log.add(make.player(players[currentTurn]), ' timed out'); + } + delete players[currentTurn].lostLife; + currentTurn = other[data.idPlayer]; + delete players[currentTurn].lostLife; + lastEffect = 0; + }); + eventManager.on('getUpdateBoard', function updateGame(data) { + const oldMonsters = monsters; + monsters = {}; + // TOOD: stuff.... + JSON.parse(data.board).forEach(function (card) { + if (card === null) return; + card.desc = getDescription(card); + monsters[card.id] = card; }); - eventManager.on('refreshTimer getPlayableCards updateSpell getFakeDeath', - function ignore() {}); + }); + eventManager.on('getMonsterDestroyed', function monsterKilled(data) { + // monsterId: # + log.add(make.card(monsters[data.monsterId]), ' was killed'); + delete monsters[data.monsterId]; + }); + eventManager.on('getCardBoard', function playCard(data) { // Adds card to X, Y (0(enemy), 1(you)) + const card = JSON.parse(data.card); + card.desc = getDescription(card); + monsters[card.id] = card; + log.add(make.player(players[data.idPlayer]), ' played ', make.card(card)); + }); + eventManager.on('getSpellPlayed', function useSpell(data) { + // immediately calls "getDoingEffect" and "getUpdateBoard" + const card = JSON.parse(data.card); + card.desc = getDescription(card); + monsters[card.id] = card; + log.add(make.player(players[data.idPlayer]), ' used ', make.card(card)); + }); + eventManager.on('getCardDestroyedHandFull', function (data) { + const card = JSON.parse(data.card); + card.desc = getDescription(card); + debug(data.card); + // This event gets called for *all* discards. Have to do smarter logic here (not just currentTurn!) + log.add(make.player(players[currentTurn]), ' discarded ', make.card(card)); + }); + eventManager.on('getPlayersStats', function updatePlayer(data) { // TODO: When does this get called? + let key, temp = JSON.parse(data.handsSize); + for (key in temp) { + // TODO: hand size monitoring + //players[key].hand + } + // TODO: deck monitoring (decksSize) + temp = JSON.parse(data.golds); + for (key in temp) { + players[key].gold = temp[key]; + } + temp = JSON.parse(data.lives); + for (key in temp) { + players[key].lives = temp[key]; + } + // data.artifcats + // data.turn + }); + eventManager.on('getVictory getVictoryDeco getDefeat', function gameEnd(data) { + finished = true; + if (this.event === 'getVictoryDeco') { + log.add(make.player(players[opponentId]), " left the game"); + } + const you = make.player(players[userId]); + const enemy = make.player(players[opponentId]); + if (this.event === 'getDefeat') { + log.add(enemy, ' beat ', you); + } else { + log.add(you, ' beat ', enemy); + } + }); + eventManager.on('getResult', function endSpectating(data) { + finished = true; + if (data.cause === "Surrender") { + log.add(`${data.looser} surrendered.`); + } else if (data.cause === "Disconnection") { + log.add(`${data.looser} disconnected.`); + } + // TODO: colorize + log.add(`${data.winner} beat ${data.looser}`); + }); + eventManager.on('updateMonster', function updateCard(data) { + // monster {card} + }); + eventManager.on('refreshTimer getPlayableCards updateSpell getFakeDeath', + function ignore() {}); }); // === Play hooks onPage("Play", function () { - // TODO: Better "game found" support - debug("On play page"); - let queues, disable = true; + // TODO: Better "game found" support + debug("On play page"); + let queues, disable = true; - eventManager.on("jQuery", function onPlay() { - if (disable) { - queues = $("button.btn.btn-primary"); - queues.prop("disabled", true); - } - }); + eventManager.on("jQuery", function onPlay() { + if (disable) { + queues = $("button.btn.btn-primary"); + queues.prop("disabled", true); + } + }); - (function hook() { - if (typeof socketQueue === "undefined") { - debug("Timeout hook"); - return setTimeout(hook); - } - socket = socketQueue; - const oOpen = socketQueue.onopen; - socketQueue.onopen = function onOpenScript(event) { - disable = false; - oOpen(event); - if (queues) queues.prop("disabled", false); - }; - const oHandler = socketQueue.onmessage; - socketQueue.onmessage = function onMessageScript(event) { - const data = JSON.parse(event.data); - oHandler(event); - eventManager.emit(data.action, data); - }; - })(); + (function hook() { + if (typeof socketQueue === "undefined") { + debug("Timeout hook"); + return setTimeout(hook); + } + socket = socketQueue; + const oOpen = socketQueue.onopen; + socketQueue.onopen = function onOpenScript(event) { + disable = false; + oOpen(event); + if (queues) queues.prop("disabled", false); + }; + const oHandler = socketQueue.onmessage; + socketQueue.onmessage = function onMessageScript(event) { + const data = JSON.parse(event.data); + oHandler(event); + eventManager.emit(data.action, data); + }; + })(); }); // === Game hooks onPage("Game", function () { - debug("Playing Game"); - (function hook() { - if (typeof socket === 'undefined') { - debug("Timeout hook"); - return setTimeout(hook); - } - const oHandler = socket.onmessage; - socket.onmessage = function onMessageScript(event) { - const data = JSON.parse(event.data); - //eventManager.emit('PreGameEvent', data, true); - oHandler(event); - if (data.action === "getGameStarted") { - // We're running our game. - eventManager.emit("GameStart"); - eventManager.emit("PlayingGame"); - } - eventManager.emit('GameEvent', data); - }; - })(); + debug("Playing Game"); + (function hook() { + if (typeof socket === 'undefined') { + debug("Timeout hook"); + return setTimeout(hook); + } + const oHandler = socket.onmessage; + socket.onmessage = function onMessageScript(event) { + const data = JSON.parse(event.data); + //eventManager.emit('PreGameEvent', data, true); + oHandler(event); + if (data.action === "getGameStarted") { + // We're running our game. + eventManager.emit("GameStart"); + eventManager.emit("PlayingGame"); + } + eventManager.emit('GameEvent', data); + }; + })(); }); // Spectate hooks onPage("gameSpectate", function () { - debug("Spectating Game"); - eventManager.emit("GameStart"); - (function hook() { - if (typeof socket === "undefined") { - debug("Timeout hook"); - return setTimeout(hook); - } - const oHandler = socket.onmessage; - socket.onmessage = function onMessageScript(event) { - const data = JSON.parse(event.data); - //eventManager.emit('PreGameEvent', data, true); - oHandler(event); - eventManager.emit('GameEvent', data); - }; - })(); + debug("Spectating Game"); + eventManager.emit("GameStart"); + (function hook() { + if (typeof socket === "undefined") { + debug("Timeout hook"); + return setTimeout(hook); + } + const oHandler = socket.onmessage; + socket.onmessage = function onMessageScript(event) { + const data = JSON.parse(event.data); + //eventManager.emit('PreGameEvent', data, true); + oHandler(event); + eventManager.emit('GameEvent', data); + }; + })(); }); // === Always do the following - if jquery is loaded eventManager.on("jQuery", function always() { - // Bind hotkey listeners - $(document).on("click.script", function (event) { - if (false) return; // TODO: Check for clicking in chat - hotkeys.forEach(function (v) { - if (v.clickbound(event.which)) { - v.run(event); - } - }); - }); - $(document).on("keyup.script", function (event) { - if ($(event.target).is("input")) return; // We don't want to listen while typing in chat (maybe listen for F-keys?) - hotkeys.forEach(function (v) { - if (v.keybound(event.which)) { - v.run(event); - } - }); + // Bind hotkey listeners + $(document).on("click.script", function (event) { + if (false) return; // TODO: Check for clicking in chat + hotkeys.forEach(function (v) { + if (v.clickbound(event.which)) { + v.run(event); + } }); - /* This legacy code doesn't work - $(window).unload(function() { - // Store chat text (if any) - var val = $("div.chat-public input.chat-text").val(); - if (!val) return; - localStorage.oldChat = val; + }); + $(document).on("keyup.script", function (event) { + if ($(event.target).is("input")) return; // We don't want to listen while typing in chat (maybe listen for F-keys?) + hotkeys.forEach(function (v) { + if (v.keybound(event.which)) { + v.run(event); + } }); - if (localStorage.oldChat) { - $("div.chat-public input.chat-text").val(localStorage.oldChat); - delete localStorage.oldChat; - } - // */ + }); + /* This legacy code doesn't work + $(window).unload(function() { + // Store chat text (if any) + var val = $("div.chat-public input.chat-text").val(); + if (!val) return; + localStorage.oldChat = val; + }); + if (localStorage.oldChat) { + $("div.chat-public input.chat-text").val(localStorage.oldChat); + delete localStorage.oldChat; + } + // */ }); // Attempt to detect jQuery let tries = 20; (function jSetup() { - if (typeof jQuery === "undefined") { - if (tries-- <= 0) { // jQuery is probably not going to load at this point... - return; - } - setTimeout(jSetup, 1); - return; + if (typeof jQuery === "undefined") { + if (tries-- <= 0) { // jQuery is probably not going to load at this point... + return; } - eventManager.emit("jQuery"); + setTimeout(jSetup, 1); + return; + } + eventManager.emit("jQuery"); })(); From 25cecdf807717c50820ce53e888627270272e89e Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sun, 11 Mar 2018 16:45:32 -0500 Subject: [PATCH 0053/1620] Battle Finish Toast! I've been wanting this one for a while, but I didn't have any way to make it a reality. Now I have a toast script of awesomeness. --- undercards.js | 25 +++++++++++++++++++------ utilities.js | 22 ++++++++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/undercards.js b/undercards.js index fe3b32ca..c6010e42 100644 --- a/undercards.js +++ b/undercards.js @@ -1,10 +1,11 @@ // ==UserScript== // @name UnderCards script // @description Minor changes to undercards game +// @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=5 // @version 0.9.0-beta // @author feildmaster -// @history 0.9.0 - Added detailed history log, log is top-bottom now +// @history 0.9.0 - Added detailed history log, log is top-bottom now, battle end is now a toast // @history 0.8.5 - Added some game debug // @history 0.8.4 - Removed "remember deck" feature (upstream), fixed event log // @history 0.8.3 - Script works now @@ -139,14 +140,12 @@ eventManager.on("GameStart", function battleLogger() { eventManager.on('GameEvent', function logEvent(data) { if (finished) { // Sometimes we get events after the battle is over - if (localStorage.getItem('debugging.extra') === "true") { - log.add(`Extra action: ${data.action}`); - } + fn.debug(`Extra action: ${data.action}`, 'debugging.extra'); return; } const emitted = eventManager.emit(data.action, data).ran; - if (!emitted && localStorage.getItem('debugging') === "true") { - log.add(`Unknown action: ${data.action}`); + if (!emitted) { + fn.debug(`Unknown action: ${data.action}`); } }); @@ -334,6 +333,20 @@ eventManager.on("GameStart", function battleLogger() { } // TODO: colorize log.add(`${data.winner} beat ${data.looser}`); + const toast = { + title: 'Game Finished', + text: 'Return Home', + buttons: { + className: 'skiptranslate', + text: '🏠', + onclick: () => { + document.location.href = "/"; + }, + }, + }; + if (!localStorage.getItem('setting.disableResultToast') && fn.toast(toast)) { + BootstrapDialog.closeAll(); + } }); eventManager.on('updateMonster', function updateCard(data) { // monster {card} diff --git a/utilities.js b/utilities.js index 1e950684..8f2aa9de 100644 --- a/utilities.js +++ b/utilities.js @@ -155,6 +155,28 @@ const fn = { } return status; }, + toast: (arg) => { + if (!window.SimpleToast) return false; + SimpleToast(arg); + return true; + }, + debug: (arg, permission = 'debugging') => { + if (typeof arg === 'string') { + arg = { + text: arg, + }; + } + arg.css = { + background: '#c8354e', + textShadow: '#e74c3c 1px 2px 1px', + button: { + // Don't use buttons, mouseOver sucks + background: '#e25353', + textShadow: '#46231f 0px 0px 3px', + }, + }; + return localStorage.getItem(permission) === 'true' && fn.toast(arg); + }, }; class Hotkey { constructor(name) { From 528044cc27519bd8b093759079b8b994db156454 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sun, 11 Mar 2018 16:51:44 -0500 Subject: [PATCH 0054/1620] version 0.9 --- undercards.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/undercards.js b/undercards.js index c6010e42..97e45790 100644 --- a/undercards.js +++ b/undercards.js @@ -3,7 +3,7 @@ // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=5 -// @version 0.9.0-beta +// @version 0.9 // @author feildmaster // @history 0.9.0 - Added detailed history log, log is top-bottom now, battle end is now a toast // @history 0.8.5 - Added some game debug From e6a41d3bbc419b78cd27e2790625e44e9f6be477 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sun, 11 Mar 2018 17:45:47 -0500 Subject: [PATCH 0055/1620] mute spectate result music --- undercards.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/undercards.js b/undercards.js index 97e45790..c05f58a6 100644 --- a/undercards.js +++ b/undercards.js @@ -3,8 +3,9 @@ // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=5 -// @version 0.9 +// @version 0.9.1 // @author feildmaster +// @history 0.9.1 - Spectate result music is now disabled if you disable music playing. // @history 0.9.0 - Added detailed history log, log is top-bottom now, battle end is now a toast // @history 0.8.5 - Added some game debug // @history 0.8.4 - Removed "remember deck" feature (upstream), fixed event log @@ -331,6 +332,9 @@ eventManager.on("GameStart", function battleLogger() { } else if (data.cause === "Disconnection") { log.add(`${data.looser} disconnected.`); } + if (localStorage.getItem('gameMusicDisabled')) { + music.pause(); + } // TODO: colorize log.add(`${data.winner} beat ${data.looser}`); const toast = { From bc1c4d6ed8a432bf51c5d3041ad3abae98af4a41 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Mon, 12 Mar 2018 17:24:58 -0500 Subject: [PATCH 0056/1620] Fix enemy names again. Copy/pasting is bad. Test everything! Gosh. --- undercards.js | 47 ++++++++++++++++++++++++++++++++++------------- utilities.js | 6 +++--- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/undercards.js b/undercards.js index c05f58a6..fed21041 100644 --- a/undercards.js +++ b/undercards.js @@ -2,9 +2,10 @@ // @name UnderCards script // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js -// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=5 -// @version 0.9.1 +// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=6 +// @version 0.9.2 // @author feildmaster +// @history 0.9.2 - Fixed enemy names *again* (copy/pasting is bad) // @history 0.9.1 - Spectate result music is now disabled if you disable music playing. // @history 0.9.0 - Added detailed history log, log is top-bottom now, battle end is now a toast // @history 0.8.5 - Added some game debug @@ -31,10 +32,6 @@ // @namespace https://feildmaster.com/ // @grant none // ==/UserScript== -// TODO: more Hotkeys -// TODO: Visual attack targets -// TODO: Random deck option -// TODO: Delayed events... (green soul, discard (for example, sans)) // === Variables start const hotkeys = []; @@ -53,6 +50,26 @@ eventManager.on("PlayingGame", function bindHotkeys() { }); eventManager.on("GameStart", function battleLogger() { + const ignoreEvents = Object.keys({ + getConnectedFirst: '', + refreshTimer: 'Never need to know about this one', + getPlayableCards: 'On turn start, selects cards player can play', + getTurn: 'Turn update', + getCardDrawed: 'Add card to your hand', + updateSpell: '', + updateMonster: 'monster on board updated', + getFakeDeath: 'Card "died" and respawns 1 second later', + getArtifactDoingEffect: 'Artifact activates, should probably log an event', + getMonsterTemp: "You're about to play a monster", + getSpellTemp: "You're about to play a spell", + getTempCancel: 'Temp card cancelled', + getShowMulligan: 'Switching out hands, ignore it', + getHideMulligan: 'Hide the mulligan, gets called twice', + getUpdateHand: 'Updates full hand', + getReconnection: '', + getError: 'Takes you to "home" on errors, can be turned into a toast', + getGameError: 'Takes you to "play" on game errors, can be turned into a toast', + }); let turn = 0, currentTurn = 0, players = {}, monsters = {}, lastEffect, other = {}, finished = false; const hover = (function wrapper() { let e, x, y; @@ -127,7 +144,11 @@ eventManager.on("GameStart", function battleLogger() { }); } data += ``; - data += `${card.desc || ''}`; + data += `${card.desc || ''}` + if (card.silence) { + data += ''; + } + data += ''; if (!card.typeCard) { data += `${card.attack}${card.hp}`; } else { @@ -151,6 +172,7 @@ eventManager.on("GameStart", function battleLogger() { }); eventManager.on('getAllGameInfos getGameStarted', function initBattle(data) { + debug(data, 'debugging.game.raw'); let you, enemy; // Battle logging happens after the game runs if (this.event === 'getAllGameInfos') { @@ -183,8 +205,8 @@ eventManager.on("GameStart", function battleLogger() { gold: 2 }; enemy = { - id: data.ennemyId, - username: data.ennemyUsername, + id: data.enemyId, + username: data.enemyUsername, hp: 30, class: data.enemyClass, level: data.enemyLevel, @@ -192,6 +214,8 @@ eventManager.on("GameStart", function battleLogger() { gold: 2 }; } + // artifacts, avatar {id, image, name, rarity, ucpCost}, division, oldDivision, profileSkin {id, name, image, ucpCost} + debug({you, enemy}, 'debugging.game'); turn = data.turn || 0; players[you.id] = you; players[enemy.id] = enemy; @@ -352,10 +376,7 @@ eventManager.on("GameStart", function battleLogger() { BootstrapDialog.closeAll(); } }); - eventManager.on('updateMonster', function updateCard(data) { - // monster {card} - }); - eventManager.on('refreshTimer getPlayableCards updateSpell getFakeDeath', + eventManager.on(ignoreEvents.join(' '), function ignore() {}); }); diff --git a/utilities.js b/utilities.js index 8f2aa9de..acebe80f 100644 --- a/utilities.js +++ b/utilities.js @@ -1,7 +1,7 @@ // Utilities for undercards.js -function debug(...args) { - if (localStorage.getItem("debugging") !== "true") return; - console.log(...args); +function debug(message, permission = 'debugging') { + if (localStorage.getItem(permission) !== "true") return; + console.log(message); } function onPage(name, fn) { From ea6bd9c9976244ffd56be01c10ec1852e5541239 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Mon, 12 Mar 2018 20:28:12 -0500 Subject: [PATCH 0057/1620] Deck card preview --- undercards.js | 77 +++++++++++++++++++++++---------------------------- utilities.js | 53 +++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 43 deletions(-) diff --git a/undercards.js b/undercards.js index fed21041..f5ca9ddc 100644 --- a/undercards.js +++ b/undercards.js @@ -2,9 +2,10 @@ // @name UnderCards script // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js -// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=6 -// @version 0.9.2 +// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=7 +// @version 0.10 // @author feildmaster +// @history 0.10 - Added deck card preview // @history 0.9.2 - Fixed enemy names *again* (copy/pasting is bad) // @history 0.9.1 - Spectate result music is now disabled if you disable music playing. // @history 0.9.0 - Added detailed history log, log is top-bottom now, battle end is now a toast @@ -71,45 +72,6 @@ eventManager.on("GameStart", function battleLogger() { getGameError: 'Takes you to "play" on game errors, can be turned into a toast', }); let turn = 0, currentTurn = 0, players = {}, monsters = {}, lastEffect, other = {}, finished = false; - const hover = (function wrapper() { - let e, x, y; - - function update() { - if (!e) return; - e.css({ - // move to left if at the edge of screen - left: x + e.width() + 15 < $(window).width() ? x + 15 : x - e.width() - 10, - // Try to lock to the bottom - top: y + e.height() + 18 > $(window).height() ? $(window).height() - e.height() : y + 18, - }); - } - $(document).on("mousemove.script", function mouseMove(event) { - x = event.pageX; - y = event.pageY; - update(); - }); - return function hover(data, border = null) { - if (e) { - // Hide element - e.remove(); - e = null; - return; - } - if (!data) return; - // Make the element - e = $("
"); - e.append(data); - e.css({ - border, - position: "fixed", - "background-color": "rgba(0,0,0,0.9)", - padding: '2px', - 'z-index': 20, - }); - $("body").append(e); - update(); - }; - })(); const make = { player: function makePlayer(player, title = false) { const c = $(''); @@ -119,7 +81,7 @@ eventManager.on("GameStart", function battleLogger() { c.css('text-decoration', 'underline'); // show lives, show health, show gold, show hand, possibly deck size as well const data = `${player.hp} hp, ${player.gold} gold`; - c.hover(() => hover(data, '2px solid white')); + c.hover(hover.show(data, '2px solid white')); } return c; }, @@ -155,7 +117,7 @@ eventManager.on("GameStart", function battleLogger() { data += ``; } data += ``; - c.hover(() => hover(data)); + c.hover(hover.show(data)); return c; }, }; @@ -437,6 +399,35 @@ onPage("Game", function () { })(); }); +// Deck hook +onPage('Decks', function () { + debug('Deck editor'); + function hoverCard(element) { + const id = element.attr('id'); + const shiny = element.hasClass('shiny') ? '.shiny' : ''; + const card = $(`table#${id}${shiny}:lt(1)`).clone(); + if (card.length !== 1) return; + card.find('#quantity').remove(); + loadCard(card); + return hover.show(card); + } + // Initial load + $('li.list-group-item').each(function (index) { + const element = $(this); + element.hover(hoverCard(element)); + }); + $(document).ajaxSuccess((event, xhr, settings) => { + const data = JSON.parse(settings.data); + if (data.action === 'removeCard') { // Card was removed, hide element + hover.hide(); + } else if (data.action === 'addCard') { // Card was added + const element = $(`#deckCards${data.classe || data.class} li:last`); + element.hover(hoverCard(element)); + // TODO: Re-order the card + } + }); +}); + // Spectate hooks onPage("gameSpectate", function () { debug("Spectating Game"); diff --git a/utilities.js b/utilities.js index acebe80f..0504289d 100644 --- a/utilities.js +++ b/utilities.js @@ -1,3 +1,10 @@ +const footer = $('
').css({ + width: '100%', + 'text-align': 'center', + 'font-size': '12px', + 'font-family': 'monospace', +}).html('UnderScript ©feildmaster'); + // Utilities for undercards.js function debug(message, permission = 'debugging') { if (localStorage.getItem(permission) !== "true") return; @@ -98,6 +105,52 @@ const log = { $("div#history div#log").prepend(div); }, }; +const hover = (() => { + let e, x, y; + function update() { + if (!e) return; + e.css({ + // move to left if at the edge of screen + left: x + e.width() + 15 < $(window).width() ? x + 15 : x - e.width() - 10, + // Try to lock to the bottom + top: y + e.height() + 18 > $(window).height() ? $(window).height() - e.height() : y + 18, + }); + } + $(document).on("mousemove.script", function mouseMove(event) { + x = event.pageX; + y = event.pageY; + update(); + }); + function hide() { + if (e) { + // Hide element + e.remove(); + e = null; + } + } + function show(data, border = null) { + return function hoverAction(event) { + hide(); + if (event.type === 'mouseleave') return; + e = $("
"); + e.append(data); + e.append(footer.clone()); + e.css({ + border, + position: "fixed", + "background-color": "rgba(0,0,0,0.9)", + padding: '2px', + 'z-index': 220, + }); + $("body").append(e); + update(); + }; + } + return { + hide, + show, + }; +})(); const fn = { each: function (o, f, t) { if (!o) return; From 23d2cb5f78d8b6e5d92bf38350d7504e853f3732 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Mon, 12 Mar 2018 21:12:47 -0500 Subject: [PATCH 0058/1620] Rename file --- undercards.js => undercards.user.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) rename undercards.js => undercards.user.js (99%) diff --git a/undercards.js b/undercards.user.js similarity index 99% rename from undercards.js rename to undercards.user.js index f5ca9ddc..700a56cd 100644 --- a/undercards.js +++ b/undercards.user.js @@ -3,8 +3,9 @@ // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=7 -// @version 0.10 +// @version 0.10.1 // @author feildmaster +// @history 0.10.1 - Moved file to proper extension (makes fresh installs easier) // @history 0.10 - Added deck card preview // @history 0.9.2 - Fixed enemy names *again* (copy/pasting is bad) // @history 0.9.1 - Spectate result music is now disabled if you disable music playing. @@ -29,7 +30,7 @@ // @match https://undercards.net/* // @website https://github.com/feildmaster/UnderScript // @supportURL https://github.com/feildmaster/UnderScript/issues -// @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js +// @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/test/undercards.user.js // @namespace https://feildmaster.com/ // @grant none // ==/UserScript== From 5ead7e026fe362e466a9398dd6d216874edc66bb Mon Sep 17 00:00:00 2001 From: feildmaster Date: Mon, 12 Mar 2018 21:14:55 -0500 Subject: [PATCH 0059/1620] Redirect updates to undercards.user.js --- undercards.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 undercards.js diff --git a/undercards.js b/undercards.js new file mode 100644 index 00000000..8840e094 --- /dev/null +++ b/undercards.js @@ -0,0 +1,38 @@ +// ==UserScript== +// @name UnderCards script +// @description Minor changes to undercards game +// @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js +// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=7 +// @version 0.10.1 +// @author feildmaster +// @history 0.10.1 - Renamed +// @history 0.10 - Added deck card preview +// @history 0.9.2 - Fixed enemy names *again* (copy/pasting is bad) +// @history 0.9.1 - Spectate result music is now disabled if you disable music playing. +// @history 0.9.0 - Added detailed history log, log is top-bottom now, battle end is now a toast +// @history 0.8.5 - Added some game debug +// @history 0.8.4 - Removed "remember deck" feature (upstream), fixed event log +// @history 0.8.3 - Script works now +// @history 0.8.2 - Fix the queue disconnecting. +// @history 0.8.1 - Rework loading jQuery performance +// @history 0.8 - Better performance and reliability. Disable the join queue buttons until they are ready +// @history 0.7 - updated to new restrictions, thanks cloudflare -_- +// @history 0.6 - some upgrades to the battle log, fixed url +// @history 0.5.4 - Don't scroll the battle log with the page (possibly make this configurable later) +// @history 0.5.3 - Remove the chat stuff, the new chat is better. +// @history 0.5.2 - do the same for the chat window +// @history 0.5.1 - don't cover the battle screen +// @history 0.5 - remember chat messages on page-change, added a battle log, lots of code changes +// @history 0.4 - Remember "event deck" too!, also fixed bugs. +// @history 0.3 - Lowered "game found" volume +// @history 0.2 - Added EndTurn hotkey (space, middle click), focus chat (enter) +// @history 0.1 - Made deck selection smart +// @match https://undercards.net/* +// @website https://github.com/feildmaster/UnderScript +// @supportURL https://github.com/feildmaster/UnderScript/issues +// @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.user.js +// @namespace https://feildmaster.com/ +// @grant none +// ==/UserScript== + +// Use the user.js file From 92e4a44de3637da8908f8b9ffee0a189475b9dc6 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Mon, 12 Mar 2018 21:15:48 -0500 Subject: [PATCH 0060/1620] Update readme --- readme.md | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/readme.md b/readme.md index 6ff70639..528583e6 100644 --- a/readme.md +++ b/readme.md @@ -1,22 +1,20 @@ +# Undercards Script # + ## Setup ## -### Chrome ### -1. Install Tampermonkey (if not already installed) -2. Press "Add a new script" in tampermonkey -3. Paste **[undercards.js](https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js)** into the script box -4. Save. Done. -### Firefox ### -1. Install Greasemonkey (If not already installed) -2. Add a new script (use random values for the input boxes) -3. Edit the script and paste **[undercards.js](https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.js)** into the script box -4. Save. Done. +1. Using [Tampermonkey](https://tampermonkey.net/), [Violentmonkey](https://violentmonkey.github.io/), [Greasemonkey](https://www.greasespot.net/), or some other obscure script program +2. Open **[undercards.user.js](https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.user.js)** ## Features ## -1. Remembers Class selection -2. Lowers "game found" volume -3. Hot keys -4. Battle Log + +1. ~~Remembers Class selection~~ (live on game) +1. Lowers "game found" volume +1. [Hot keys](#hotkeys) +1. Battle Log
![Battle log](https://i.imgur.com/UR8jVLp.png) +1. Game end is now a toast
![Toast](https://i.imgur.com/smND8qm.png) +1. Deck card preview
![Card Preview](https://i.imgur.com/kVo0Fbc.png) ### Hotkeys ### -1. Press "middle click" or "space" to end turn (not currently very useful... if you're using the mouse anyway) -2. Focus chat with "enter" (In case you have it open already) + +1. Press "middle click" or "space" to end turn +1. ~~Focus chat with "enter" (In case you have it open already)~~ (new chat broke this) From 92d087266be56970dcb473f7c224a4be56e47e95 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Tue, 13 Mar 2018 06:29:52 -0500 Subject: [PATCH 0061/1620] Bump version (and fix downloadURL, ugh) --- undercards.user.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/undercards.user.js b/undercards.user.js index 700a56cd..f8ad4efe 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -3,8 +3,9 @@ // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=7 -// @version 0.10.1 +// @version 0.10.2 // @author feildmaster +// @history 0.10.2 - Bump version so broken updates work (hopefully) // @history 0.10.1 - Moved file to proper extension (makes fresh installs easier) // @history 0.10 - Added deck card preview // @history 0.9.2 - Fixed enemy names *again* (copy/pasting is bad) @@ -30,7 +31,7 @@ // @match https://undercards.net/* // @website https://github.com/feildmaster/UnderScript // @supportURL https://github.com/feildmaster/UnderScript/issues -// @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/test/undercards.user.js +// @downloadURL https://raw.githubusercontent.com/feildmaster/UnderScript/master/undercards.user.js // @namespace https://feildmaster.com/ // @grant none // ==/UserScript== From d6ae4e63b8701e98a267b405574d1bfac97e23ad Mon Sep 17 00:00:00 2001 From: feildmaster Date: Tue, 13 Mar 2018 19:33:02 -0500 Subject: [PATCH 0062/1620] Fix refreshing and log Artifacts --- undercards.user.js | 97 +++++++++++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 40 deletions(-) diff --git a/undercards.user.js b/undercards.user.js index f8ad4efe..d4c19fc0 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -3,8 +3,9 @@ // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=7 -// @version 0.10.2 +// @version 0.10.3 // @author feildmaster +// @history 0.10.3 - Fix refreshing page, Log artifact activations // @history 0.10.2 - Bump version so broken updates work (hopefully) // @history 0.10.1 - Moved file to proper extension (makes fresh installs easier) // @history 0.10 - Added deck card preview @@ -62,14 +63,12 @@ eventManager.on("GameStart", function battleLogger() { updateSpell: '', updateMonster: 'monster on board updated', getFakeDeath: 'Card "died" and respawns 1 second later', - getArtifactDoingEffect: 'Artifact activates, should probably log an event', getMonsterTemp: "You're about to play a monster", getSpellTemp: "You're about to play a spell", getTempCancel: 'Temp card cancelled', getShowMulligan: 'Switching out hands, ignore it', getHideMulligan: 'Hide the mulligan, gets called twice', getUpdateHand: 'Updates full hand', - getReconnection: '', getError: 'Takes you to "home" on errors, can be turned into a toast', getGameError: 'Takes you to "play" on game errors, can be turned into a toast', }); @@ -126,24 +125,36 @@ eventManager.on("GameStart", function battleLogger() { eventManager.on('GameEvent', function logEvent(data) { if (finished) { // Sometimes we get events after the battle is over - fn.debug(`Extra action: ${data.action}`, 'debugging.extra'); + fn.debug(`Extra action: ${data.action}`, 'debugging.events.extra'); return; } + debug(data.action, 'debugging.events.name'); const emitted = eventManager.emit(data.action, data).ran; if (!emitted) { fn.debug(`Unknown action: ${data.action}`); } }); - eventManager.on('getAllGameInfos getGameStarted', function initBattle(data) { - debug(data, 'debugging.game.raw'); + eventManager.on('getAllGameInfos getGameStarted getReconnection', function initBattle(data) { + debug(data, 'debugging.raw.game'); let you, enemy; // Battle logging happens after the game runs - if (this.event === 'getAllGameInfos') { + if (this.event === 'getGameStarted') { + you = { + id: data.yourId, + username: data.yourUsername, + hp: 30, // This is wrong with artifacts? Maybe? + gold: 2, // This is wrong with artifacts? Maybe? + }; + enemy = { + id: data.enemyId, + username: data.enemyUsername, + hp: 30, // This is wrong with artifacts? Maybe? + gold: 2, // This is wrong with artifacts? Maybe? + }; + } else { you = JSON.parse(data.you); enemy = JSON.parse(data.enemy); - you.class = data.yourClass; - enemy.class = data.enemyClass; // Set gold const gold = JSON.parse(data.golds); you.gold = gold[you.id]; @@ -155,30 +166,18 @@ eventManager.on("GameStart", function battleLogger() { // populate monsters JSON.parse(data.board).forEach(function (card) { if (card === null) return; + // id, attack, hp, maxHp, originalattack, originalHp, typeCard, name, image, cost, originalCost, rarity, shiny, quantity card.desc = getDescription(card); monsters[card.id] = card; }); - } else { - you = { - id: data.yourId, - username: data.yourUsername, - hp: 30, - class: data.yourClass, - level: data.yourLevel, - rank: data.yourRank, - gold: 2 - }; - enemy = { - id: data.enemyId, - username: data.enemyUsername, - hp: 30, - class: data.enemyClass, - level: data.enemyLevel, - rank: data.enemyRank, - gold: 2 - }; } - // artifacts, avatar {id, image, name, rarity, ucpCost}, division, oldDivision, profileSkin {id, name, image, ucpCost} + you.level = data.yourLevel; + you.class = data.yourClass; + you.rank = data.yourRank; + enemy.level = data.enemyLevel; + enemy.class = data.enemyClass; + enemy.rank = data.enemyRank; + // yourArtifacts, yourAvatar {id, image, name, rarity, ucpCost}, division, oldDivision, profileSkin {id, name, image, ucpCost} debug({you, enemy}, 'debugging.game'); turn = data.turn || 0; players[you.id] = you; @@ -200,6 +199,7 @@ eventManager.on("GameStart", function battleLogger() { log.add(make.card(monsters[data.attackMonster]), ' attacked ', target); }); eventManager.on('getUpdatePlayerHp', function updateHP(data) { + debug(data, 'debugging.raw.updateHP'); const oHp = players[data.playerId].hp; const hp = data.isDamage ? oHp - data.hp : data.hp - oHp; players[data.playerId].hp = data.hp; @@ -212,23 +212,32 @@ eventManager.on("GameStart", function battleLogger() { } }); eventManager.on('getDoingEffect', function doEffect(data) { + debug(data, 'debugging.raw.effect'); // affecteds: [ids]; monsters affected // playerAffected1: id; player affected // playerAffected2: id; player affected // TODO: Figure out how to do this better - if (lastEffect === data.monsterId) return; - lastEffect = data.monsterId; + if (lastEffect === 'm' + data.monsterId) return; + lastEffect = 'm' + data.monsterId; log.add(make.card(monsters[data.monsterId]), "'s effect activated"); }); + eventManager.on('getArtifactDoingEffect', function doEffect(data) { + debug(data, 'debugging.raw.effectArtifact'); + if (lastEffect === 'a' + data.playerId) return; + lastEffect = 'a' + data.playerId; + log.add(make.player(players[data.playerId]), "'s artifact activated"); + }); eventManager.on('getSoulDoingEffect', function soulEffect(data) { - if (lastEffect === data.playerId - 2) return; - lastEffect = data.playerId - 2; + debug(data, 'debugging.raw.effectSoul'); + if (lastEffect === 's' + data.playerId) return; + lastEffect = 's' + data.playerId; log.add(make.player(players[data.playerId]), "'s soul activated"); // affecteds // playerAffected1 // playerAffected2 }); eventManager.on('getTurnStart', function turnStart(data) { + debug(data, 'debugging.raw.turnStart'); lastEffect = 0; if (data.numTurn !== turn) { log.add(`Turn ${data.numTurn}`); @@ -238,6 +247,7 @@ eventManager.on("GameStart", function battleLogger() { log.add(make.player(players[currentTurn]), "'s turn"); }); eventManager.on('getTurnEnd', function turnEnd(data) { + debug(data, 'debugging.raw.turnEnd'); // Lets switch the turn NOW, rather than later, the purpose of this is currently unknown... It just sounded like a good idea, also delete the "lostLife" flag... if (time <= 0) { log.add(make.player(players[currentTurn]), ' timed out'); @@ -248,6 +258,7 @@ eventManager.on("GameStart", function battleLogger() { lastEffect = 0; }); eventManager.on('getUpdateBoard', function updateGame(data) { + debug(data, 'debugging.raw.boardUpdate'); const oldMonsters = monsters; monsters = {}; // TOOD: stuff.... @@ -258,17 +269,20 @@ eventManager.on("GameStart", function battleLogger() { }); }); eventManager.on('getMonsterDestroyed', function monsterKilled(data) { + debug(data, 'debugging.raw.kill'); // monsterId: # log.add(make.card(monsters[data.monsterId]), ' was killed'); delete monsters[data.monsterId]; }); eventManager.on('getCardBoard', function playCard(data) { // Adds card to X, Y (0(enemy), 1(you)) + debug(data, 'debugging.raw.boardAdd'); const card = JSON.parse(data.card); card.desc = getDescription(card); monsters[card.id] = card; log.add(make.player(players[data.idPlayer]), ' played ', make.card(card)); }); eventManager.on('getSpellPlayed', function useSpell(data) { + debug(data, 'debugging.raw.spell'); // immediately calls "getDoingEffect" and "getUpdateBoard" const card = JSON.parse(data.card); card.desc = getDescription(card); @@ -276,6 +290,7 @@ eventManager.on("GameStart", function battleLogger() { log.add(make.player(players[data.idPlayer]), ' used ', make.card(card)); }); eventManager.on('getCardDestroyedHandFull', function (data) { + debug(data, 'debugging.raw.fullHand'); const card = JSON.parse(data.card); card.desc = getDescription(card); debug(data.card); @@ -283,6 +298,7 @@ eventManager.on("GameStart", function battleLogger() { log.add(make.player(players[currentTurn]), ' discarded ', make.card(card)); }); eventManager.on('getPlayersStats', function updatePlayer(data) { // TODO: When does this get called? + debug(data, 'debugging.raw.stats'); let key, temp = JSON.parse(data.handsSize); for (key in temp) { // TODO: hand size monitoring @@ -301,6 +317,7 @@ eventManager.on("GameStart", function battleLogger() { // data.turn }); eventManager.on('getVictory getVictoryDeco getDefeat', function gameEnd(data) { + debug(data, 'debugging.raw.end'); finished = true; if (this.event === 'getVictoryDeco') { log.add(make.player(players[opponentId]), " left the game"); @@ -314,6 +331,7 @@ eventManager.on("GameStart", function battleLogger() { } }); eventManager.on('getResult', function endSpectating(data) { + debug(data, 'debugging.raw.end'); finished = true; if (data.cause === "Surrender") { log.add(`${data.looser} surrendered.`); @@ -340,8 +358,10 @@ eventManager.on("GameStart", function battleLogger() { BootstrapDialog.closeAll(); } }); - eventManager.on(ignoreEvents.join(' '), - function ignore() {}); + eventManager.on(ignoreEvents.join(' '), function ignore(data) { + debug(data, 'debugging.raw.ignore'); + debug(data, `debugging.raw.ignore.${this.event}`); + }); }); // === Play hooks @@ -381,6 +401,8 @@ onPage("Play", function () { // === Game hooks onPage("Game", function () { debug("Playing Game"); + eventManager.emit("GameStart"); + eventManager.emit("PlayingGame"); (function hook() { if (typeof socket === 'undefined') { debug("Timeout hook"); @@ -391,11 +413,6 @@ onPage("Game", function () { const data = JSON.parse(event.data); //eventManager.emit('PreGameEvent', data, true); oHandler(event); - if (data.action === "getGameStarted") { - // We're running our game. - eventManager.emit("GameStart"); - eventManager.emit("PlayingGame"); - } eventManager.emit('GameEvent', data); }; })(); From 577dbceb5a3d3696ac519acb7faf34ab65fa2f6e Mon Sep 17 00:00:00 2001 From: feildmaster Date: Tue, 13 Mar 2018 19:57:34 -0500 Subject: [PATCH 0063/1620] Pause music without giving a console error This is mainly for my own sake --- undercards.user.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/undercards.user.js b/undercards.user.js index d4c19fc0..59f666e3 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -338,8 +338,12 @@ eventManager.on("GameStart", function battleLogger() { } else if (data.cause === "Disconnection") { log.add(`${data.looser} disconnected.`); } - if (localStorage.getItem('gameMusicDisabled')) { - music.pause(); + if (typeof music !== 'undefined') { + music.addEventListener('playing', function () { + if (localStorage.getItem('gameMusicDisabled')) { + music.pause(); + } + }); } // TODO: colorize log.add(`${data.winner} beat ${data.looser}`); From 17655ba9799c21039c1245c525c9592c5c7b690a Mon Sep 17 00:00:00 2001 From: feildmaster Date: Fri, 16 Mar 2018 07:07:20 -0500 Subject: [PATCH 0064/1620] Fix transparent deck preview cards --- undercards.user.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/undercards.user.js b/undercards.user.js index 59f666e3..a76cf894 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -431,6 +431,7 @@ onPage('Decks', function () { const card = $(`table#${id}${shiny}:lt(1)`).clone(); if (card.length !== 1) return; card.find('#quantity').remove(); + if (card.css('opacity') !== '1') card.css('opacity', 1); loadCard(card); return hover.show(card); } @@ -445,7 +446,7 @@ onPage('Decks', function () { hover.hide(); } else if (data.action === 'addCard') { // Card was added const element = $(`#deckCards${data.classe || data.class} li:last`); - element.hover(hoverCard(element)); + element.hover(hoverCard(element, true)); // TODO: Re-order the card } }); From aa2ec882cc909f5ae8180e96e2651ebc333585cf Mon Sep 17 00:00:00 2001 From: feildmaster Date: Fri, 16 Mar 2018 07:37:10 -0500 Subject: [PATCH 0065/1620] Automatically sort cards added to the deck --- undercards.user.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/undercards.user.js b/undercards.user.js index a76cf894..859420fb 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -3,8 +3,9 @@ // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=7 -// @version 0.10.3 +// @version 0.11 // @author feildmaster +// @history 0.11 - Fix transparent deck preview, automatically sort deck // @history 0.10.3 - Fix refreshing page, Log artifact activations // @history 0.10.2 - Bump version so broken updates work (hopefully) // @history 0.10.1 - Moved file to proper extension (makes fresh installs easier) @@ -445,9 +446,20 @@ onPage('Decks', function () { if (data.action === 'removeCard') { // Card was removed, hide element hover.hide(); } else if (data.action === 'addCard') { // Card was added - const element = $(`#deckCards${data.classe || data.class} li:last`); + const element = $(`#deckCards${data.classe} li:last`); element.hover(hoverCard(element, true)); - // TODO: Re-order the card + + const list = $(`#deckCards${data.classe}`); + list.append(list.children('li').detach().sort(function (a, b) { + const card1 = $(`table#${$(a).attr('id')}`); + const card2 = $(`table#${$(b).attr('id')}`); + const card1cost = parseInt(card1.find('.cardCost').html(), 10); + const card2cost = parseInt(card2.find('.cardCost').html(), 10); + if (card1cost === card2cost) { + return card1.find('.cardName').html() > card2.find('.cardName').html() ? 1 : -1; + } + return card1cost > card2cost ? 1 : -1; + })); } }); }); From 80e52548cd3a78f248cfbbb150725377d6537249 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 17 Mar 2018 02:20:28 -0500 Subject: [PATCH 0066/1620] Log exposed cards from "show hand" This feels very hacky --- undercards.user.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/undercards.user.js b/undercards.user.js index 859420fb..8a16c7a0 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -290,7 +290,12 @@ eventManager.on("GameStart", function battleLogger() { monsters[card.id] = card; log.add(make.player(players[data.idPlayer]), ' used ', make.card(card)); }); - eventManager.on('getCardDestroyedHandFull', function (data) { + eventManager.on('getShowCard', function showCard(data) { + const card = JSON.parse(data.card); + card.desc = getDescription(card); + log.add(make.player(players[data.idPlayer]), ' exposed ', make.card(card)); + }); + eventManager.on('getCardDestroyedHandFull', function destroyCard(data) { debug(data, 'debugging.raw.fullHand'); const card = JSON.parse(data.card); card.desc = getDescription(card); From 2198efd570ac10bdcbd73dd8b356a7eeb2680693 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Tue, 20 Mar 2018 17:37:49 -0500 Subject: [PATCH 0067/1620] Keep join queue disabled when restarting --- readme.md | 2 +- undercards.user.js | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/readme.md b/readme.md index 528583e6..e6b4979d 100644 --- a/readme.md +++ b/readme.md @@ -11,7 +11,7 @@ 1. Lowers "game found" volume 1. [Hot keys](#hotkeys) 1. Battle Log
![Battle log](https://i.imgur.com/UR8jVLp.png) -1. Game end is now a toast
![Toast](https://i.imgur.com/smND8qm.png) +1. Game end (spectator) is now a toast
![Toast](https://i.imgur.com/smND8qm.png) 1. Deck card preview
![Card Preview](https://i.imgur.com/kVo0Fbc.png) ### Hotkeys ### diff --git a/undercards.user.js b/undercards.user.js index 8a16c7a0..d12943b8 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -3,8 +3,9 @@ // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=7 -// @version 0.11 +// @version 0.11.1 // @author feildmaster +// @history 0.11.1 - Peaking at cards now adds them to the battle log, join queue button stays disabled when the server is restarting // @history 0.11 - Fix transparent deck preview, automatically sort deck // @history 0.10.3 - Fix refreshing page, Log artifact activations // @history 0.10.2 - Bump version so broken updates work (hopefully) @@ -379,11 +380,16 @@ onPage("Play", function () { // TODO: Better "game found" support debug("On play page"); let queues, disable = true; + let restarting = false; eventManager.on("jQuery", function onPlay() { if (disable) { queues = $("button.btn.btn-primary"); queues.prop("disabled", true); + restarting = $('p.infoMessage:contains("The server will restart in")').length === 1; + if (restarting) { + queues.hover(hover.show('Joining is disabled due to server restart.')); + } } }); @@ -397,7 +403,7 @@ onPage("Play", function () { socketQueue.onopen = function onOpenScript(event) { disable = false; oOpen(event); - if (queues) queues.prop("disabled", false); + if (queues && !restarting) queues.prop("disabled", false); }; const oHandler = socketQueue.onmessage; socketQueue.onmessage = function onMessageScript(event) { From 23c9ce277ca690ce9e60af5146af376de78dda25 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Tue, 20 Mar 2018 18:39:33 -0500 Subject: [PATCH 0068/1620] fix logging "opponent left the game" --- undercards.user.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/undercards.user.js b/undercards.user.js index d12943b8..3a70e26b 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -323,10 +323,10 @@ eventManager.on("GameStart", function battleLogger() { // data.artifcats // data.turn }); - eventManager.on('getVictory getVictoryDeco getDefeat', function gameEnd(data) { + eventManager.on('getVictory getDefeat', function gameEnd(data) { debug(data, 'debugging.raw.end'); finished = true; - if (this.event === 'getVictoryDeco') { + if (data.disconnected) { log.add(make.player(players[opponentId]), " left the game"); } const you = make.player(players[userId]); From 836e7616bdcafb887eac82a198ece528a09f171d Mon Sep 17 00:00:00 2001 From: feildmaster Date: Tue, 20 Mar 2018 19:16:48 -0500 Subject: [PATCH 0069/1620] fix middle click binding --- undercards.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/undercards.user.js b/undercards.user.js index 3a70e26b..9acd4557 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -497,7 +497,7 @@ onPage("gameSpectate", function () { // === Always do the following - if jquery is loaded eventManager.on("jQuery", function always() { // Bind hotkey listeners - $(document).on("click.script", function (event) { + $(document).on("mouseup.script", function (event) { if (false) return; // TODO: Check for clicking in chat hotkeys.forEach(function (v) { if (v.clickbound(event.which)) { From fe40d4e139944e8f8c208942ba47a10e7b3c2de6 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Tue, 20 Mar 2018 19:55:17 -0500 Subject: [PATCH 0070/1620] End turn can only happen once per turn --- undercards.user.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/undercards.user.js b/undercards.user.js index 9acd4557..4b151579 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -51,10 +51,26 @@ eventManager.on("getWaitingQueue", function lowerVolume() { eventManager.on("PlayingGame", function bindHotkeys() { // Binds to Space, Middle Click hotkeys.push(new Hotkey("End turn").bindKey(32).bindClick(2).run((e) => { - if (!$(e.target).is("#endTurnBtn") && userTurn && userTurn === userId) endTurn(); + if (!$(e.target).is("#endTurnBtn") && userTurn === userId) endTurn(); })); }); +eventManager.on('PlayingGame', function fixEndTurn() { + const button = $('#endTurnBtn'); + const oEndTurn = endTurn; + let endedTurn = false; + endTurn = function restrictedEndTurn() { + if (endedTurn || button.prop('disabled')) return; + endedTurn = true; + oEndTurn(); + }; + + eventManager.on('getTurnStart', function turnStarted() { + if (userTurn !== userId) return; + endedTurn = false; + }); +}); + eventManager.on("GameStart", function battleLogger() { const ignoreEvents = Object.keys({ getConnectedFirst: '', From cb6a886bf209e3d33b2e1d0bd8ea6c3aa0ecad15 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Tue, 20 Mar 2018 19:57:07 -0500 Subject: [PATCH 0071/1620] Wait 3 seconds before you can end turn Allow people to instantly end turn for the first 3 turns --- undercards.user.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/undercards.user.js b/undercards.user.js index 4b151579..28939e67 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -68,6 +68,12 @@ eventManager.on('PlayingGame', function fixEndTurn() { eventManager.on('getTurnStart', function turnStarted() { if (userTurn !== userId) return; endedTurn = false; + if (turn > 3) { + button.prop('disabled', true); + setTimeout(() => { + button.prop('disabled', false); + }, 3000); + } }); }); From 082db4289ea5e62fbb695d5d12d1d6d84e25dc3b Mon Sep 17 00:00:00 2001 From: feildmaster Date: Tue, 20 Mar 2018 19:59:43 -0500 Subject: [PATCH 0072/1620] version 0.11.2 --- undercards.user.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/undercards.user.js b/undercards.user.js index 28939e67..4199bece 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -3,8 +3,9 @@ // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=7 -// @version 0.11.1 +// @version 0.11.2 // @author feildmaster +// @history 0.11.2 - End turn once per turn, and add a 3 second delay. Fix middle click // @history 0.11.1 - Peaking at cards now adds them to the battle log, join queue button stays disabled when the server is restarting // @history 0.11 - Fix transparent deck preview, automatically sort deck // @history 0.10.3 - Fix refreshing page, Log artifact activations From 07c144f67b3e41e07a98620281e92e6f35fa3f41 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Thu, 22 Mar 2018 17:12:17 -0500 Subject: [PATCH 0073/1620] sort consistently Why did I think allowing sporadic sorts was a good idea? Bad internet. --- undercards.user.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/undercards.user.js b/undercards.user.js index 4199bece..aa697a90 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -490,7 +490,10 @@ onPage('Decks', function () { const card1cost = parseInt(card1.find('.cardCost').html(), 10); const card2cost = parseInt(card2.find('.cardCost').html(), 10); if (card1cost === card2cost) { - return card1.find('.cardName').html() > card2.find('.cardName').html() ? 1 : -1; + const card1name = card1.find('.cardName').html(); + const card2name = card2.find('.cardName').html(); + if (card1name == card2name) return 0; + return card1name > card2name ? 1 : -1; } return card1cost > card2cost ? 1 : -1; })); From 9e2d5f1a2ad3a487fd2681eba8ceb86214ce2cbd Mon Sep 17 00:00:00 2001 From: feildmaster Date: Thu, 22 Mar 2018 17:19:24 -0500 Subject: [PATCH 0074/1620] Remove spells remaining on the board --- undercards.user.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/undercards.user.js b/undercards.user.js index aa697a90..a4d55f2f 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -396,6 +396,10 @@ eventManager.on("GameStart", function battleLogger() { debug(data, 'debugging.raw.ignore'); debug(data, `debugging.raw.ignore.${this.event}`); }); + eventManager.on('getTurnEnd', function hideSpells() { + // Fixes a bug with "mines" and any other potential cards that don't get cleared correctly. + $('#board .spellPlayed').remove(); + }) }); // === Play hooks From ea4939962a3a5423663d1efa52f770e1cd3fd159 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Thu, 22 Mar 2018 17:38:49 -0500 Subject: [PATCH 0075/1620] version bump --- undercards.user.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/undercards.user.js b/undercards.user.js index a4d55f2f..c80f746e 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -3,8 +3,9 @@ // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=7 -// @version 0.11.2 +// @version 0.11.3 // @author feildmaster +// @history 0.11.3 - Fix mines (and other potential cards) staying around on the baord for too long // @history 0.11.2 - End turn once per turn, and add a 3 second delay. Fix middle click // @history 0.11.1 - Peaking at cards now adds them to the battle log, join queue button stays disabled when the server is restarting // @history 0.11 - Fix transparent deck preview, automatically sort deck From 51f9bfee71c00eaff5999c1996fe06f380566e33 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 28 Apr 2018 11:23:49 -0500 Subject: [PATCH 0076/1620] fix script not loading this was caused by undercards changing the way they loaded scripts. --- undercards.user.js | 5 +++-- utilities.js | 19 ++++++++----------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/undercards.user.js b/undercards.user.js index c80f746e..7894c8bb 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -2,9 +2,10 @@ // @name UnderCards script // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js -// @require https://raw.githubusercontent.com/feildmaster/UnderScript/master/utilities.js?v=7 -// @version 0.11.3 +// @require https://raw.githubusercontent.com/feildmaster/UnderScript/0.11.4/utilities.js +// @version 0.11.4 // @author feildmaster +// @history 0.11.4 - Fix issue where script was not loading // @history 0.11.3 - Fix mines (and other potential cards) staying around on the baord for too long // @history 0.11.2 - End turn once per turn, and add a 3 second delay. Fix middle click // @history 0.11.1 - Peaking at cards now adds them to the battle log, join queue button stays disabled when the server is restarting diff --git a/utilities.js b/utilities.js index 0504289d..0ce1664d 100644 --- a/utilities.js +++ b/utilities.js @@ -1,9 +1,4 @@ -const footer = $('
').css({ - width: '100%', - 'text-align': 'center', - 'font-size': '12px', - 'font-family': 'monospace', -}).html('UnderScript ©feildmaster'); +const footer = '
UnderScript ©feildmaster
'; // Utilities for undercards.js function debug(message, permission = 'debugging') { @@ -116,10 +111,12 @@ const hover = (() => { top: y + e.height() + 18 > $(window).height() ? $(window).height() - e.height() : y + 18, }); } - $(document).on("mousemove.script", function mouseMove(event) { - x = event.pageX; - y = event.pageY; - update(); + eventManager.on("jQuery", () => { + $(document).on("mousemove.script", function mouseMove(event) { + x = event.pageX; + y = event.pageY; + update(); + }); }); function hide() { if (e) { @@ -134,7 +131,7 @@ const hover = (() => { if (event.type === 'mouseleave') return; e = $("
"); e.append(data); - e.append(footer.clone()); + e.append($(footer).clone()); e.css({ border, position: "fixed", From dd82ead888c88ea41bbca5dab0bb05126af5f0f9 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 28 Apr 2018 11:59:14 -0500 Subject: [PATCH 0077/1620] Various fixes that I missed before - End turn button "fixes" now work - Deck preview now works - Deck auto-sort now works --- undercards.user.js | 64 ++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/undercards.user.js b/undercards.user.js index 7894c8bb..8c95045d 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -3,8 +3,9 @@ // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/0.11.4/utilities.js -// @version 0.11.4 +// @version 0.11.5 // @author feildmaster +// @history 0.11.5 - The following now work again: end turn "fixes", deck auto-sort, deck preview. // @history 0.11.4 - Fix issue where script was not loading // @history 0.11.3 - Fix mines (and other potential cards) staying around on the baord for too long // @history 0.11.2 - End turn once per turn, and add a 3 second delay. Fix middle click @@ -59,11 +60,10 @@ eventManager.on("PlayingGame", function bindHotkeys() { }); eventManager.on('PlayingGame', function fixEndTurn() { - const button = $('#endTurnBtn'); const oEndTurn = endTurn; let endedTurn = false; endTurn = function restrictedEndTurn() { - if (endedTurn || button.prop('disabled')) return; + if (endedTurn || $('#endTurnBtn').prop('disabled')) return; endedTurn = true; oEndTurn(); }; @@ -72,9 +72,9 @@ eventManager.on('PlayingGame', function fixEndTurn() { if (userTurn !== userId) return; endedTurn = false; if (turn > 3) { - button.prop('disabled', true); + $('#endTurnBtn').prop('disabled', true); setTimeout(() => { - button.prop('disabled', false); + $('#endTurnBtn').prop('disabled', false); }, 3000); } }); @@ -477,33 +477,35 @@ onPage('Decks', function () { return hover.show(card); } // Initial load - $('li.list-group-item').each(function (index) { - const element = $(this); - element.hover(hoverCard(element)); - }); - $(document).ajaxSuccess((event, xhr, settings) => { - const data = JSON.parse(settings.data); - if (data.action === 'removeCard') { // Card was removed, hide element - hover.hide(); - } else if (data.action === 'addCard') { // Card was added - const element = $(`#deckCards${data.classe} li:last`); - element.hover(hoverCard(element, true)); + eventManager.on('jQuery', () => { + $('li.list-group-item').each(function (index) { + const element = $(this); + element.hover(hoverCard(element)); + }); + $(document).ajaxSuccess((event, xhr, settings) => { + const data = JSON.parse(settings.data); + if (data.action === 'removeCard') { // Card was removed, hide element + hover.hide(); + } else if (data.action === 'addCard') { // Card was added + const element = $(`#deckCards${data.classe} li:last`); + element.hover(hoverCard(element, true)); - const list = $(`#deckCards${data.classe}`); - list.append(list.children('li').detach().sort(function (a, b) { - const card1 = $(`table#${$(a).attr('id')}`); - const card2 = $(`table#${$(b).attr('id')}`); - const card1cost = parseInt(card1.find('.cardCost').html(), 10); - const card2cost = parseInt(card2.find('.cardCost').html(), 10); - if (card1cost === card2cost) { - const card1name = card1.find('.cardName').html(); - const card2name = card2.find('.cardName').html(); - if (card1name == card2name) return 0; - return card1name > card2name ? 1 : -1; - } - return card1cost > card2cost ? 1 : -1; - })); - } + const list = $(`#deckCards${data.classe}`); + list.append(list.children('li').detach().sort(function (a, b) { + const card1 = $(`table#${$(a).attr('id')}`); + const card2 = $(`table#${$(b).attr('id')}`); + const card1cost = parseInt(card1.find('.cardCost').html(), 10); + const card2cost = parseInt(card2.find('.cardCost').html(), 10); + if (card1cost === card2cost) { + const card1name = card1.find('.cardName').html(); + const card2name = card2.find('.cardName').html(); + if (card1name == card2name) return 0; + return card1name > card2name ? 1 : -1; + } + return card1cost > card2cost ? 1 : -1; + })); + } + }); }); }); From d4b52ef80582e77b1a5160f184df0e985706bcb2 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Tue, 16 Oct 2018 19:52:13 -0500 Subject: [PATCH 0078/1620] Skin Shop layout Thanks to Jake Horror for the concept. --- undercards.user.js | 71 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/undercards.user.js b/undercards.user.js index 8c95045d..8efac822 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -5,6 +5,7 @@ // @require https://raw.githubusercontent.com/feildmaster/UnderScript/0.11.4/utilities.js // @version 0.11.5 // @author feildmaster +// @history 0.12 - Draft for "Skin Shop" (Thanks Jake Horror) // @history 0.11.5 - The following now work again: end turn "fixes", deck auto-sort, deck preview. // @history 0.11.4 - Fix issue where script was not loading // @history 0.11.3 - Fix mines (and other potential cards) staying around on the baord for too long @@ -528,6 +529,76 @@ onPage("gameSpectate", function () { })(); }); +onPage('CardSkinsShop', function () { + debug('Skin shop'); + const cards = []; + $('table#cardSkinsList > tbody > tr').each(function(row) { + // Is this still supported? + if (row === 0) { + if($(this).children('td').length !== 6) return false; + return; + } + const skin = {}; + $(this).children('td').each(function(column) { + let target; + if (column === 0) { + target = 'card'; + } else if (column === 1) { + target = 'name'; + } else if (column === 2) { + target = 'author'; + } else if (column === 3) { + skin['img'] = $(this).children('img')[0].src; + return; + } else if (column === 4) { + skin['cost'] = $($(this).children('span')[0]).html(); + return; + } else { + target = 'action'; + if ($(this).children('p').length) { + skin[target] = 'Unlock'; + return; + } + } + skin[target] = $(this).html(); + }); + cards.push(skin); + }); + if (cards.length) { + function cardMySkin(skin) { + return ` + + + + + + + + + + + + + + + +
${skin.card}${skin.cost}
${skin.name}
by ${skin.author}
${skin.action}
`; + } + // Load css/cards.min.css + $.get('css/decks.min.css', (css) => $('').html(css).appendTo("head")); + $.get('css/cards.min.css', (css) => $('').html(css).appendTo("head")); + // hide #cardSkinsList + $('table#cardSkinsList').hide(); + // add cardSkinDiv + const div = $('
'); + // build skinned cards + cards.forEach((card) => { + div.append(cardMySkin(card)); + }); + $('div.mainContent p:first').after(div); + } +}); + // === Always do the following - if jquery is loaded eventManager.on("jQuery", function always() { // Bind hotkey listeners From b21488f56118cf675986f4234a0e6b65a48d9499 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Wed, 17 Oct 2018 03:44:07 -0500 Subject: [PATCH 0079/1620] smaller is always better --- undercards.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/undercards.user.js b/undercards.user.js index 8efac822..b9d48b30 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -570,7 +570,7 @@ onPage('CardSkinsShop', function () { ${skin.card} - ${skin.cost} + ${skin.cost} From 8687a09d964a08aa7baa8bd72104e73d21f201ee Mon Sep 17 00:00:00 2001 From: feildmaster Date: Wed, 17 Oct 2018 06:12:01 -0500 Subject: [PATCH 0080/1620] Added Dust Counter Thanks to Jake Horror for the suggestion, again! --- undercards.user.js | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/undercards.user.js b/undercards.user.js index b9d48b30..7ae5af49 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -5,7 +5,7 @@ // @require https://raw.githubusercontent.com/feildmaster/UnderScript/0.11.4/utilities.js // @version 0.11.5 // @author feildmaster -// @history 0.12 - Draft for "Skin Shop" (Thanks Jake Horror) +// @history 0.12 - New look for "Skin Shop" & Added "Dust Counter" (Thanks Jake Horror) // @history 0.11.5 - The following now work again: end turn "fixes", deck auto-sort, deck preview. // @history 0.11.4 - Fix issue where script was not loading // @history 0.11.3 - Fix mines (and other potential cards) staying around on the baord for too long @@ -101,6 +101,13 @@ eventManager.on("GameStart", function battleLogger() { getGameError: 'Takes you to "play" on game errors, can be turned into a toast', }); let turn = 0, currentTurn = 0, players = {}, monsters = {}, lastEffect, other = {}, finished = false; + const yourDust = $('') + const enemyDust = $(''); + function addDust(player) { + const display = player === userId ? yourDust : enemyDust; + const dust = typeof players[player].dust === 'undefined' ? players[player].dust = 0 : players[player].dust += 1; + display.html(dust); + } const make = { player: function makePlayer(player, title = false) { const c = $(''); @@ -109,7 +116,7 @@ eventManager.on("GameStart", function battleLogger() { if (!title) { c.css('text-decoration', 'underline'); // show lives, show health, show gold, show hand, possibly deck size as well - const data = `${player.hp} hp, ${player.gold} gold`; + const data = `${player.hp} hp, ${player.gold} gold
${player.dust} dust`; c.hover(hover.show(data, '2px solid white')); } return c; @@ -192,10 +199,13 @@ eventManager.on("GameStart", function battleLogger() { you.lives = lives[you.id]; enemy.lives = lives[enemy.id]; // populate monsters + let count = 0; JSON.parse(data.board).forEach(function (card) { + count += 1; if (card === null) return; // id, attack, hp, maxHp, originalattack, originalHp, typeCard, name, image, cost, originalCost, rarity, shiny, quantity card.desc = getDescription(card); + card.owner = count <= 4 ? enemy.id : you.id; monsters[card.id] = card; }); } @@ -210,6 +220,12 @@ eventManager.on("GameStart", function battleLogger() { turn = data.turn || 0; players[you.id] = you; players[enemy.id] = enemy; + const dustImg = $(''); + $('.rightPart').append(dustImg, ' '); + $(`#user${opponentId} .rightPart`).append(enemyDust, ' '); + $(`#user${userId} .rightPart`).append(yourDust, ' ', $(`#user${userId} .rightPart > button`)); + addDust(you.id); + addDust(enemy.id); // Test changing ID's at endTurn instead of startTurn other[you.id] = enemy.id; other[enemy.id] = you.id; @@ -290,9 +306,12 @@ eventManager.on("GameStart", function battleLogger() { const oldMonsters = monsters; monsters = {}; // TOOD: stuff.... + let count = 0; JSON.parse(data.board).forEach(function (card) { + count += 1; if (card === null) return; card.desc = getDescription(card); + card.owner = count <= 4 ? opponentId : userId; monsters[card.id] = card; }); }); @@ -300,12 +319,14 @@ eventManager.on("GameStart", function battleLogger() { debug(data, 'debugging.raw.kill'); // monsterId: # log.add(make.card(monsters[data.monsterId]), ' was killed'); + addDust(monsters[data.monsterId].owner); delete monsters[data.monsterId]; }); eventManager.on('getCardBoard', function playCard(data) { // Adds card to X, Y (0(enemy), 1(you)) debug(data, 'debugging.raw.boardAdd'); const card = JSON.parse(data.card); card.desc = getDescription(card); + card.owner = data.idPlayer; monsters[card.id] = card; log.add(make.player(players[data.idPlayer]), ' played ', make.card(card)); }); From 43f36c08c480e1b1a0690121483873afa4ccfcdc Mon Sep 17 00:00:00 2001 From: feildmaster Date: Fri, 19 Oct 2018 19:49:57 -0500 Subject: [PATCH 0081/1620] update readme for new features --- readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readme.md b/readme.md index e6b4979d..80602aa7 100644 --- a/readme.md +++ b/readme.md @@ -13,6 +13,8 @@ 1. Battle Log
![Battle log](https://i.imgur.com/UR8jVLp.png) 1. Game end (spectator) is now a toast
![Toast](https://i.imgur.com/smND8qm.png) 1. Deck card preview
![Card Preview](https://i.imgur.com/kVo0Fbc.png) +1. Card Skin shop layout improvements
![Card Shop](https://i.imgur.com/0l4Xb6V.png) +1. Dust Counter
![Counter](https://i.imgur.com/ikvpXXn.png) ### Hotkeys ### From c8ff53abdfdb7b95e3e535c65ab92cd8d5c24af5 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 20 Oct 2018 01:42:31 -0500 Subject: [PATCH 0082/1620] It's good to actually change the version number --- undercards.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/undercards.user.js b/undercards.user.js index 7ae5af49..6ce2ab7a 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -3,7 +3,7 @@ // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/0.11.4/utilities.js -// @version 0.11.5 +// @version 0.12 // @author feildmaster // @history 0.12 - New look for "Skin Shop" & Added "Dust Counter" (Thanks Jake Horror) // @history 0.11.5 - The following now work again: end turn "fixes", deck auto-sort, deck preview. From 18616296d0db70768fbdcf3fccde2120b6c2b83e Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 20 Oct 2018 01:41:06 -0500 Subject: [PATCH 0083/1620] Right click users to ignore them --- undercards.user.js | 157 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 155 insertions(+), 2 deletions(-) diff --git a/undercards.user.js b/undercards.user.js index 6ce2ab7a..559de3f2 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -1,10 +1,11 @@ // ==UserScript== // @name UnderCards script // @description Minor changes to undercards game -// @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.4.1/simpletoast.js +// @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.10.1/simpletoast.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/0.11.4/utilities.js -// @version 0.12 +// @version 0.13 // @author feildmaster +// @history 0.13 - Ignore chat messags? Yes please. (Thanks CoolEdge) // @history 0.12 - New look for "Skin Shop" & Added "Dust Counter" (Thanks Jake Horror) // @history 0.11.5 - The following now work again: end turn "fixes", deck auto-sort, deck preview. // @history 0.11.4 - Fix issue where script was not loading @@ -426,6 +427,158 @@ eventManager.on("GameStart", function battleLogger() { }) }); +// === Chat hooks +if (typeof onMessage === 'function') { + let toast = new SimpleToast({}); + + const ignorePrefix = 'underscript.ignore.'; + const ignoreList = {}; + const context = (() => { + $('head').append($(``)); + const container = $('
'); + const profile = $('
  • Profile
  • '); + const ignore = $('
  • Ignore
  • '); + const header = $('
    '); + container.append(header, profile, ignore).hide(); + $('body').append(container); + + function open(event) { + if (event.ctrlKey) return; + toast.close(); + close(); + const { id, name, staff } = event.data; + event.preventDefault(); + // get top/left coordinates + header.html(name); + let left = event.pageX; + const containerWidth = container.outerWidth(true); + console.log(left, containerWidth); + if (left + containerWidth > window.innerWidth) { + left = left - containerWidth; + } + container.css({ + top: `${event.pageY}px`, + left: `${left}px`, + }); + container.show(); + container.on('click.script.chatContext', 'li', (e) => { + if (e.target === profile[0]) { + getInfo(event.target); + } else if (e.target === ignore[0]) { + if (!ignoreList.hasOwnProperty(id)) { + ignoreList[id] = name; + localStorage.setItem(`${ignorePrefix}${id}`, name); + } else { + localStorage.removeItem(`${ignorePrefix}${id}`); + } + updateIgnoreText(id); + } + close(); + }); + if (staff || id === selfId) { + ignore.addClass('disabled'); + } else { + ignore.removeClass('disabled'); + } + updateIgnoreText(id); + $('html').on('mousedown.chatContext', (event) => { + if ($(event.target).closest('.chatContext').length === 0) { + close(); + } + }); + } + function updateIgnoreText(id) { + if (ignoreList.hasOwnProperty(id)) { + ignore.html('Unignore'); + } else { + ignore.html('Ignore'); + } + } + function close() { + container.hide(); + container.off('.chatContext'); + $('html').off('chatContext'); + } + return { + open, + close, + }; + })(); + + // Load Ingore List + for (let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i); + if (key.startsWith(ignorePrefix)) { + ignoreList[key.substr(ignorePrefix.length)] = localStorage.getItem(key); + } + } + + function processMessage(message, room) { + const id = message.id; + const user = message.user; + const name = user.username; + + let staff = false; + user.groups.some((group) => { + return staff = group.priority <= 6; // This is so hacky... + }); + + let info = $(`#${room} #message-${id} #info-${user.id}`); + if (!info.length) { + info = $(`#${room} #message-${id} #info-${id}`); + } + info.on('contextmenu.script.chatContext', { + staff, + name, + id: user.id, + }, context.open); + + if (!staff && ignoreList.hasOwnProperty(user.id)) { + $(`#${room} #message-${id} .chat-message`).html('Message Ignored').removeClass().addClass('chat-message'); + } + } + + eventManager.on('Chat:getHistory', (data) => { + JSON.parse(data.history).forEach((message) => { + processMessage(message, data.room); + }); + }); + + eventManager.on('Chat:getMessage', (data) => { + processMessage(JSON.parse(data.chatMessage), data.room); + }); + + socketChat.onmessage = (event) => { + onMessage(event); + const data = JSON.parse(event.data); + eventManager.emit('ChatMessage', data); + eventManager.emit(`Chat:${data.action}`, data); + } + + if (localStorage.getItem('underscript.ignoreNotice') !== '1') { + toast = new SimpleToast({ + title: 'Did you know?', + footer: 'via UnderScript', + text: 'You can right click users in chat to ignore them!', + css: { + 'font-family': 'sans-serif', + footer: { 'text-align': 'end', }, + }, + onClose: () => { + localStorage.setItem('underscript.ignoreNotice', '1'); + toast = new SimpleToast(); // Remove from memory + } + }); + } +} + // === Play hooks onPage("Play", function () { // TODO: Better "game found" support From a1239a83be7ba2852b17871cb9c12c331a9de216 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 20 Oct 2018 03:20:28 -0500 Subject: [PATCH 0084/1620] Update readme --- readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.md b/readme.md index 80602aa7..9525b2b2 100644 --- a/readme.md +++ b/readme.md @@ -15,6 +15,7 @@ 1. Deck card preview
    ![Card Preview](https://i.imgur.com/kVo0Fbc.png) 1. Card Skin shop layout improvements
    ![Card Shop](https://i.imgur.com/0l4Xb6V.png) 1. Dust Counter
    ![Counter](https://i.imgur.com/ikvpXXn.png) +1. Ignore users with right click
    ![Ignore](https://i.imgur.com/awTs20u.png) ### Hotkeys ### From 27621ce776ab72e4441c9b3e7fcefaefca70234c Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 20 Oct 2018 10:41:50 -0500 Subject: [PATCH 0085/1620] Fix being able to ignore yourself --- undercards.user.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/undercards.user.js b/undercards.user.js index 559de3f2..c133290c 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -5,6 +5,7 @@ // @require https://raw.githubusercontent.com/feildmaster/UnderScript/0.11.4/utilities.js // @version 0.13 // @author feildmaster +// @history 0.13.1 - Fixed chat bugs caused by this script // @history 0.13 - Ignore chat messags? Yes please. (Thanks CoolEdge) // @history 0.12 - New look for "Skin Shop" & Added "Dust Counter" (Thanks Jake Horror) // @history 0.11.5 - The following now work again: end turn "fixes", deck auto-sort, deck preview. @@ -429,6 +430,7 @@ eventManager.on("GameStart", function battleLogger() { // === Chat hooks if (typeof onMessage === 'function') { + debug('Chat detected'); let toast = new SimpleToast({}); const ignorePrefix = 'underscript.ignore.'; @@ -468,10 +470,12 @@ if (typeof onMessage === 'function') { left: `${left}px`, }); container.show(); + const disabled = staff || id === selfId; container.on('click.script.chatContext', 'li', (e) => { if (e.target === profile[0]) { getInfo(event.target); } else if (e.target === ignore[0]) { + if (disabled) return; // If it's disabled it's disabled... if (!ignoreList.hasOwnProperty(id)) { ignoreList[id] = name; localStorage.setItem(`${ignorePrefix}${id}`, name); @@ -482,7 +486,7 @@ if (typeof onMessage === 'function') { } close(); }); - if (staff || id === selfId) { + if (disabled) { ignore.addClass('disabled'); } else { ignore.removeClass('disabled'); @@ -540,7 +544,7 @@ if (typeof onMessage === 'function') { id: user.id, }, context.open); - if (!staff && ignoreList.hasOwnProperty(user.id)) { + if (!staff && user.id !== selfId && ignoreList.hasOwnProperty(user.id)) { $(`#${room} #message-${id} .chat-message`).html('Message Ignored').removeClass().addClass('chat-message'); } } From f6330822f3ab35cfec1e60a160e29e3b4c364304 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 20 Oct 2018 10:51:44 -0500 Subject: [PATCH 0086/1620] Fixed end turn button getting moved --- undercards.user.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/undercards.user.js b/undercards.user.js index c133290c..90da8775 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -5,7 +5,7 @@ // @require https://raw.githubusercontent.com/feildmaster/UnderScript/0.11.4/utilities.js // @version 0.13 // @author feildmaster -// @history 0.13.1 - Fixed chat bugs caused by this script +// @history 0.13.1 - Fixed chat bugs caused by this script, fixed end turn button moving // @history 0.13 - Ignore chat messags? Yes please. (Thanks CoolEdge) // @history 0.12 - New look for "Skin Shop" & Added "Dust Counter" (Thanks Jake Horror) // @history 0.11.5 - The following now work again: end turn "fixes", deck auto-sort, deck preview. @@ -225,7 +225,7 @@ eventManager.on("GameStart", function battleLogger() { const dustImg = $(''); $('.rightPart').append(dustImg, ' '); $(`#user${opponentId} .rightPart`).append(enemyDust, ' '); - $(`#user${userId} .rightPart`).append(yourDust, ' ', $(`#user${userId} .rightPart > button`)); + $(`#user${userId} .rightPart`).append(yourDust, ' ', $(`#user${userId} .rightPart > button:last`)); addDust(you.id); addDust(enemy.id); // Test changing ID's at endTurn instead of startTurn From f2afa95609056c3afc41ae7483e86b5251b4beb0 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 20 Oct 2018 11:45:06 -0500 Subject: [PATCH 0087/1620] Fix chat not working on some screens --- undercards.user.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/undercards.user.js b/undercards.user.js index 90da8775..062a759a 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -559,8 +559,9 @@ if (typeof onMessage === 'function') { processMessage(JSON.parse(data.chatMessage), data.room); }); + const oHandler = socketChat.onmessage; socketChat.onmessage = (event) => { - onMessage(event); + oHandler(event); const data = JSON.parse(event.data); eventManager.emit('ChatMessage', data); eventManager.emit(`Chat:${data.action}`, data); From 036bb0c26e31173ce909743f52b646f9ede17928 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 20 Oct 2018 12:07:07 -0500 Subject: [PATCH 0088/1620] Version 0.13.1 --- undercards.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/undercards.user.js b/undercards.user.js index 062a759a..c49698af 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -3,7 +3,7 @@ // @description Minor changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.10.1/simpletoast.js // @require https://raw.githubusercontent.com/feildmaster/UnderScript/0.11.4/utilities.js -// @version 0.13 +// @version 0.13.1 // @author feildmaster // @history 0.13.1 - Fixed chat bugs caused by this script, fixed end turn button moving // @history 0.13 - Ignore chat messags? Yes please. (Thanks CoolEdge) From c6de977418d6c2e21a2c26944f3108beb1f8e49b Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 20 Oct 2018 13:11:48 -0500 Subject: [PATCH 0089/1620] Resize spectator games to fit your screen --- undercards.user.js | 20 +++++++++++++++++--- utilities.js | 2 +- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/undercards.user.js b/undercards.user.js index c49698af..e044ea52 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -1,10 +1,11 @@ // ==UserScript== // @name UnderCards script -// @description Minor changes to undercards game +// @description Various changes to undercards game // @require https://raw.githubusercontent.com/feildmaster/SimpleToast/1.10.1/simpletoast.js -// @require https://raw.githubusercontent.com/feildmaster/UnderScript/0.11.4/utilities.js -// @version 0.13.1 +// @require https://raw.githubusercontent.com/feildmaster/UnderScript/0.14/utilities.js +// @version 0.14 // @author feildmaster +// @history 0.14 - Utilize the full home page space (for viewing spectator games) // @history 0.13.1 - Fixed chat bugs caused by this script, fixed end turn button moving // @history 0.13 - Ignore chat messags? Yes please. (Thanks CoolEdge) // @history 0.12 - New look for "Skin Shop" & Added "Dust Counter" (Thanks Jake Horror) @@ -428,6 +429,19 @@ eventManager.on("GameStart", function battleLogger() { }) }); +// === Index hook +onPage('', function adjustSpectateView() { + const spectate = $('.spectateTable'); + const tbody = $('.spectateTable tbody'); + const footer = $('.mainContent footer'); + function doAdjustment() { + tbody.css({height: `${footer.offset().top - spectate.offset().top}px`}); + } + $('.mainContent > br').remove(); + doAdjustment(); + $(window).on('resize.script', doAdjustment); +}); + // === Chat hooks if (typeof onMessage === 'function') { debug('Chat detected'); diff --git a/utilities.js b/utilities.js index 0ce1664d..bb7815f9 100644 --- a/utilities.js +++ b/utilities.js @@ -11,7 +11,7 @@ function onPage(name, fn) { if ((temp = location.pathname.indexOf(".")) === -1 && (temp = location.pathname.indexOf("/")) === -1) { temp = null; } - var r = name.length && location.pathname.substring(1, temp || length) === name; + var r = location.pathname.substring(1, temp || length) === name; if (typeof fn === "function" && r) { fn(); } From d979e792eade3b261b2a3bfa9f361f97a31186d0 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Sat, 20 Oct 2018 17:07:52 -0500 Subject: [PATCH 0090/1620] Added a mention button --- undercards.user.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/undercards.user.js b/undercards.user.js index e044ea52..5dba102e 100644 --- a/undercards.user.js +++ b/undercards.user.js @@ -5,6 +5,7 @@ // @require https://raw.githubusercontent.com/feildmaster/UnderScript/0.14/utilities.js // @version 0.14 // @author feildmaster +// @history 0.15 - Added a "mention" button (Thanks LampLighter) // @history 0.14 - Utilize the full home page space (for viewing spectator games) // @history 0.13.1 - Fixed chat bugs caused by this script, fixed end turn button moving // @history 0.13 - Ignore chat messags? Yes please. (Thanks CoolEdge) @@ -450,6 +451,9 @@ if (typeof onMessage === 'function') { const ignorePrefix = 'underscript.ignore.'; const ignoreList = {}; const context = (() => { + function decode(string) { + return $('