From 292df8b28d017120a1a50ab7db006756b2fb9005 Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Mon, 11 Jan 2021 22:15:07 -0500 Subject: [PATCH 01/20] draft on keyboard shortcut not listening yet not sure --- src/KeyboardNavigation.ts | 12 ++++++++++++ src/components/PlayerHome.ts | 8 +++++++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/KeyboardNavigation.ts diff --git a/src/KeyboardNavigation.ts b/src/KeyboardNavigation.ts new file mode 100644 index 0000000000..2e74900bd0 --- /dev/null +++ b/src/KeyboardNavigation.ts @@ -0,0 +1,12 @@ + +export enum KeyboardNavigation { + GAMEBOARD = 'q', + TURMOILBOARD = 'w', + MILESTONESAWARDS = 'e', + TAGOVERVIEW = 'r', + GAMELOG = 't', + ACTION = 'a', + HAND = 's', + PLAYEDCARDS = 'd', + COLONIES = 'f', +} diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index 840feaeab1..f4ffad14a2 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -17,6 +17,7 @@ import {DynamicTitle} from './common/DynamicTitle'; import {Button} from './common/Button'; import {SortableCards} from './SortableCards'; import {TopBar} from './TopBar'; +import {KeyboardNavigation} from '../../src/KeyboardNavigation'; const dialogPolyfill = require('dialog-polyfill'); @@ -49,6 +50,11 @@ export const PlayerHome = Vue.component('player-home', { }, mixins: [PlayerMixin], methods: { + navigatePage: function(event: any) { + if (event.keyCode === KeyboardNavigation.COLONIES) { + window.location.href = 'colonies'; + } + }, getPlayerCssForTurnOrder: ( player: PlayerModel, highlightActive: boolean, @@ -97,7 +103,7 @@ export const PlayerHome = Vue.component('player-home', { ); }, template: ` -
+
From b97dc582f94613d80f2555eeece74c7ab7cec682 Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Mon, 11 Jan 2021 23:07:11 -0500 Subject: [PATCH 02/20] add log and scrollintoview This still does not work. --- src/components/PlayerHome.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index f4ffad14a2..dfe1f6f719 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -51,8 +51,13 @@ export const PlayerHome = Vue.component('player-home', { mixins: [PlayerMixin], methods: { navigatePage: function(event: any) { + console.log('key pressed'); if (event.keyCode === KeyboardNavigation.COLONIES) { - window.location.href = 'colonies'; + console.log('f pressed'); + const el = this.$el.getElementsByClassName('colonies-fleets-cont')[0]; + if (el) { + el.scrollIntoView({behavior: 'smooth'}); + } } }, getPlayerCssForTurnOrder: ( @@ -273,7 +278,7 @@ export const PlayerHome = Vue.component('player-home', {
-
+
From 2a4c4174f81812387b2f506cfbedc8f8d3f66cb1 Mon Sep 17 00:00:00 2001 From: Robert Konigsberg Date: Tue, 12 Jan 2021 00:56:18 -0500 Subject: [PATCH 03/20] Updated prototype for keyboard shortcuts. Not everything right, but it does something. --- src/components/PlayerHome.ts | 49 ++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index dfe1f6f719..9bfa7a2dea 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -50,14 +50,49 @@ export const PlayerHome = Vue.component('player-home', { }, mixins: [PlayerMixin], methods: { + mounted: function() { + window.addEventListener('keyup', this.navigatePage); + }, + destroyed: function() { + window.removeEventListener('keyup', this.navigatePage); + }, navigatePage: function(event: any) { - console.log('key pressed'); - if (event.keyCode === KeyboardNavigation.COLONIES) { - console.log('f pressed'); - const el = this.$el.getElementsByClassName('colonies-fleets-cont')[0]; - if (el) { - el.scrollIntoView({behavior: 'smooth'}); - } + let className: string | undefined = undefined; + switch (event.key) { + case KeyboardNavigation.GAMEBOARD: + className = 'player_home_anchor'; + break; + case KeyboardNavigation.TURMOILBOARD: + className = 'colonies-fleets-cont'; + break; + case KeyboardNavigation.MILESTONESAWARDS: + className = 'colonies-fleets-cont'; + break; + case KeyboardNavigation.TAGOVERVIEW: + className = 'player_home_block--players'; + break; + case KeyboardNavigation.GAMELOG: + className = 'player_home_block--log'; + break; + case KeyboardNavigation.ACTION: + className = 'player_home_block--actions'; + break; + case KeyboardNavigation.HAND: + className = 'player_home_block--hand'; + break; + case KeyboardNavigation.PLAYEDCARDS: + className = 'player_home_block--cards'; + break; + case KeyboardNavigation.COLONIES: + className = 'colonies-fleets-cont'; + break; + } + if (className === undefined) { + return; + } + const el = this.$el.getElementsByClassName(className)[0]; + if (el) { + el.scrollIntoView({behavior: 'smooth'}); } }, getPlayerCssForTurnOrder: ( From 51ace356fd8e4f9dfb9a0e5ba17bc22fc25faa36 Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Tue, 12 Jan 2021 05:53:50 -0500 Subject: [PATCH 04/20] elementbyid --- src/KeyboardNavigation.ts | 2 +- src/components/PlayerHome.ts | 47 ++++++++++++++++++------------------ 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/KeyboardNavigation.ts b/src/KeyboardNavigation.ts index 2e74900bd0..39e85c10dd 100644 --- a/src/KeyboardNavigation.ts +++ b/src/KeyboardNavigation.ts @@ -3,7 +3,7 @@ export enum KeyboardNavigation { GAMEBOARD = 'q', TURMOILBOARD = 'w', MILESTONESAWARDS = 'e', - TAGOVERVIEW = 'r', + PLAYERSOVERVIEW = 'r', GAMELOG = 't', ACTION = 'a', HAND = 's', diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index 9bfa7a2dea..ce8abfebc8 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -57,42 +57,42 @@ export const PlayerHome = Vue.component('player-home', { window.removeEventListener('keyup', this.navigatePage); }, navigatePage: function(event: any) { - let className: string | undefined = undefined; + let id: string | undefined = undefined; switch (event.key) { case KeyboardNavigation.GAMEBOARD: - className = 'player_home_anchor'; + id = 'shortkey-board'; break; case KeyboardNavigation.TURMOILBOARD: - className = 'colonies-fleets-cont'; + id = 'shortkey-turmoil'; break; case KeyboardNavigation.MILESTONESAWARDS: - className = 'colonies-fleets-cont'; + id = 'shortkey-milestonesawards'; break; - case KeyboardNavigation.TAGOVERVIEW: - className = 'player_home_block--players'; + case KeyboardNavigation.PLAYERSOVERVIEW: + id = 'shortkey-playersoverview'; break; case KeyboardNavigation.GAMELOG: - className = 'player_home_block--log'; + id = 'shortkey-gamelog'; break; case KeyboardNavigation.ACTION: - className = 'player_home_block--actions'; + id = 'shortkey-actions'; break; case KeyboardNavigation.HAND: - className = 'player_home_block--hand'; + id = 'shortkey-hand'; break; case KeyboardNavigation.PLAYEDCARDS: - className = 'player_home_block--cards'; + id = 'shortkey-cards'; break; case KeyboardNavigation.COLONIES: - className = 'colonies-fleets-cont'; + id = 'shortkey-colonies'; break; } - if (className === undefined) { + if (id === undefined) { return; } - const el = this.$el.getElementsByClassName(className)[0]; + const el = document.getElementById(id); if (el) { - el.scrollIntoView({behavior: 'smooth'}); + el.scrollIntoView({block: 'center', inline: 'center', behavior: 'smooth'}); } }, getPlayerCssForTurnOrder: ( @@ -193,20 +193,21 @@ export const PlayerHome = Vue.component('player-home', { :temperature="player.temperature" :shouldNotify="true" :aresExtension="player.aresExtension" - :aresData="player.aresData"> + :aresData="player.aresData" + id="shortkey-board"> - + -
+
- +
- +

Game log @@ -216,7 +217,7 @@ export const PlayerHome = Vue.component('player-home', {
- +
@@ -228,12 +229,12 @@ export const PlayerHome = Vue.component('player-home', {

-
+
-
+
@@ -313,7 +314,7 @@ export const PlayerHome = Vue.component('player-home', {
-
+
From 31e654df0b69b244f766a261af4b3eb1ed3c51ad Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Tue, 12 Jan 2021 06:12:37 -0500 Subject: [PATCH 05/20] remove blue outline --- src/components/PlayerHome.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index ce8abfebc8..5c6f8a5c4c 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -143,7 +143,7 @@ export const PlayerHome = Vue.component('player-home', { ); }, template: ` -
+
From 417c60b6d21e98f34ee70ecad5bc95d2d3fa8954 Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Tue, 12 Jan 2021 07:28:54 -0500 Subject: [PATCH 06/20] move style to css --- src/components/PlayerHome.ts | 2 +- src/styles/player_home.less | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index 5c6f8a5c4c..d3856ab140 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -143,7 +143,7 @@ export const PlayerHome = Vue.component('player-home', { ); }, template: ` -
+
diff --git a/src/styles/player_home.less b/src/styles/player_home.less index 538da05d8b..07280ed4cf 100644 --- a/src/styles/player_home.less +++ b/src/styles/player_home.less @@ -830,3 +830,7 @@ } } } + +.shortkey-no-outline { + outline: none; +} From 3084e69fc6dc84b32620e60e3019174bf156e00d Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Tue, 12 Jan 2021 13:14:07 -0500 Subject: [PATCH 07/20] remove mouted and destroyed --- src/components/PlayerHome.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index fd1bbc670e..8cfdc907c2 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -75,12 +75,6 @@ export const PlayerHome = Vue.component('player-home', { }, mixins: [PlayerMixin], methods: { - mounted: function() { - window.addEventListener('keyup', this.navigatePage); - }, - destroyed: function() { - window.removeEventListener('keyup', this.navigatePage); - }, navigatePage: function(event: any) { let id: string | undefined = undefined; switch (event.key) { From 75743ed5b15021a591e34c3e1b33184d4600f772 Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Wed, 13 Jan 2021 07:53:20 -0500 Subject: [PATCH 08/20] use key-code, listen only outside input field --- src/KeyboardNavigation.ts | 18 ++++----- src/components/PlayerHome.ts | 74 ++++++++++++++++++------------------ 2 files changed, 47 insertions(+), 45 deletions(-) diff --git a/src/KeyboardNavigation.ts b/src/KeyboardNavigation.ts index 39e85c10dd..0c01f1f365 100644 --- a/src/KeyboardNavigation.ts +++ b/src/KeyboardNavigation.ts @@ -1,12 +1,12 @@ export enum KeyboardNavigation { - GAMEBOARD = 'q', - TURMOILBOARD = 'w', - MILESTONESAWARDS = 'e', - PLAYERSOVERVIEW = 'r', - GAMELOG = 't', - ACTION = 'a', - HAND = 's', - PLAYEDCARDS = 'd', - COLONIES = 'f', + GAMEBOARD = 'Digit1', + TURMOILBOARD = '', + MILESTONESAWARDS = '', + PLAYERSOVERVIEW = 'Digit2', + GAMELOG = 'Digit3', + ACTION = '', + HAND = 'Digit4', + PLAYEDCARDS = '', + COLONIES = 'Digit5', } diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index 8cfdc907c2..95337f4bba 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -76,42 +76,44 @@ export const PlayerHome = Vue.component('player-home', { mixins: [PlayerMixin], methods: { navigatePage: function(event: any) { - let id: string | undefined = undefined; - switch (event.key) { - case KeyboardNavigation.GAMEBOARD: - id = 'shortkey-board'; - break; - case KeyboardNavigation.TURMOILBOARD: - id = 'shortkey-turmoil'; - break; - case KeyboardNavigation.MILESTONESAWARDS: - id = 'shortkey-milestonesawards'; - break; - case KeyboardNavigation.PLAYERSOVERVIEW: - id = 'shortkey-playersoverview'; - break; - case KeyboardNavigation.GAMELOG: - id = 'shortkey-gamelog'; - break; - case KeyboardNavigation.ACTION: - id = 'shortkey-actions'; - break; - case KeyboardNavigation.HAND: - id = 'shortkey-hand'; - break; - case KeyboardNavigation.PLAYEDCARDS: - id = 'shortkey-cards'; - break; - case KeyboardNavigation.COLONIES: - id = 'shortkey-colonies'; - break; - } - if (id === undefined) { - return; - } - const el = document.getElementById(id); - if (el) { - el.scrollIntoView({block: 'center', inline: 'center', behavior: 'smooth'}); + if (event.target.nodeName.toLowerCase() !== 'input') { + let id: string | undefined = undefined; + switch (event.code) { + case KeyboardNavigation.GAMEBOARD: + id = 'shortkey-board'; + break; + case KeyboardNavigation.TURMOILBOARD: + id = 'shortkey-turmoil'; + break; + case KeyboardNavigation.MILESTONESAWARDS: + id = 'shortkey-milestonesawards'; + break; + case KeyboardNavigation.PLAYERSOVERVIEW: + id = 'shortkey-playersoverview'; + break; + case KeyboardNavigation.GAMELOG: + id = 'shortkey-gamelog'; + break; + case KeyboardNavigation.ACTION: + id = 'shortkey-actions'; + break; + case KeyboardNavigation.HAND: + id = 'shortkey-hand'; + break; + case KeyboardNavigation.PLAYEDCARDS: + id = 'shortkey-cards'; + break; + case KeyboardNavigation.COLONIES: + id = 'shortkey-colonies'; + break; + } + if (id === undefined) { + return; + } + const el = document.getElementById(id); + if (el) { + el.scrollIntoView({block: 'center', inline: 'center', behavior: 'smooth'}); + } } }, getPlayerCssForTurnOrder: ( From a4494a1fd6b68a3854ba02cc7638d6a8d80a275a Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Wed, 13 Jan 2021 07:59:36 -0500 Subject: [PATCH 09/20] gamelog ref update --- src/components/PlayerHome.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index 95337f4bba..d2f3cc1502 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -268,8 +268,8 @@ export const PlayerHome = Vue.component('player-home', { -
- +
+

Game log From 560ba752dc18b37cb8c3484bee82efe3fc9253a2 Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Wed, 13 Jan 2021 08:12:38 -0500 Subject: [PATCH 10/20] prevent default key --- src/components/PlayerHome.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index d2f3cc1502..501b83d43c 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -77,6 +77,7 @@ export const PlayerHome = Vue.component('player-home', { methods: { navigatePage: function(event: any) { if (event.target.nodeName.toLowerCase() !== 'input') { + event.preventDefault(); let id: string | undefined = undefined; switch (event.code) { case KeyboardNavigation.GAMEBOARD: From b6b0ae285ebabe0f2a7b45d5652ed9c1a6256a46 Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Wed, 13 Jan 2021 08:26:31 -0500 Subject: [PATCH 11/20] second try with preventdefault --- src/components/PlayerHome.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index 501b83d43c..ae16693071 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -76,8 +76,8 @@ export const PlayerHome = Vue.component('player-home', { mixins: [PlayerMixin], methods: { navigatePage: function(event: any) { + event.preventDefault(); if (event.target.nodeName.toLowerCase() !== 'input') { - event.preventDefault(); let id: string | undefined = undefined; switch (event.code) { case KeyboardNavigation.GAMEBOARD: From 6024389b92751defa2f5db6f68ab76ea1d19ee53 Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Wed, 13 Jan 2021 08:34:36 -0500 Subject: [PATCH 12/20] change keyup to keydown --- src/components/PlayerHome.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index ae16693071..f930e91ba1 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -206,7 +206,7 @@ export const PlayerHome = Vue.component('player-home', { ); }, template: ` -
+
From e2ebd90b55128760f1b1dfc5f1003c643815d2c5 Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Wed, 13 Jan 2021 08:43:51 -0500 Subject: [PATCH 13/20] preventdefault only when matched --- src/components/PlayerHome.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index f930e91ba1..7c64c3e66e 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -76,7 +76,6 @@ export const PlayerHome = Vue.component('player-home', { mixins: [PlayerMixin], methods: { navigatePage: function(event: any) { - event.preventDefault(); if (event.target.nodeName.toLowerCase() !== 'input') { let id: string | undefined = undefined; switch (event.code) { @@ -113,6 +112,7 @@ export const PlayerHome = Vue.component('player-home', { } const el = document.getElementById(id); if (el) { + event.preventDefault(); el.scrollIntoView({block: 'center', inline: 'center', behavior: 'smooth'}); } } From 45904562e929f5aa2a147b66e397888092b34de6 Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Wed, 13 Jan 2021 10:18:32 -0500 Subject: [PATCH 14/20] adjustable scrolling speed, update default keys --- compile-vue-templates.js | 2 +- src/KeyboardNavigation.ts | 6 +++--- src/components/PlayerHome.ts | 3 ++- src/components/Preferences.ts | 7 +++++++ src/components/PreferencesManager.ts | 1 + 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/compile-vue-templates.js b/compile-vue-templates.js index 4857ed3d30..0780eba1d1 100644 --- a/compile-vue-templates.js +++ b/compile-vue-templates.js @@ -121,7 +121,7 @@ checkComponent( 'ui', 'hide_corporation', 'hide_hand', 'hide_cards', 'hide_awards_and_milestones', 'hide_tag_overview', 'hide_turnorder', 'hide_corporation_names', , 'hide_top_bar', 'small_cards', 'remove_background', 'magnify_cards', 'magnify_card_descriptions', 'show_alerts', 'hide_ma_scores', 'hide_non_blue_cards', 'hide_log', - 'lang', 'langs', 'enable_sounds', + 'lang', 'langs', 'enable_sounds', 'smooth_scrolling', ], ); checkComponent( diff --git a/src/KeyboardNavigation.ts b/src/KeyboardNavigation.ts index 0c01f1f365..314a9359ce 100644 --- a/src/KeyboardNavigation.ts +++ b/src/KeyboardNavigation.ts @@ -4,9 +4,9 @@ export enum KeyboardNavigation { TURMOILBOARD = '', MILESTONESAWARDS = '', PLAYERSOVERVIEW = 'Digit2', - GAMELOG = 'Digit3', + GAMELOG = '', ACTION = '', - HAND = 'Digit4', + HAND = 'Digit3', PLAYEDCARDS = '', - COLONIES = 'Digit5', + COLONIES = 'Digit4', } diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index 7c64c3e66e..370c4d045b 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -113,7 +113,8 @@ export const PlayerHome = Vue.component('player-home', { const el = document.getElementById(id); if (el) { event.preventDefault(); - el.scrollIntoView({block: 'center', inline: 'center', behavior: 'smooth'}); + const scrollingSpeed = PreferencesManager.loadValue('smooth_scrolling') === '1' ? 'smooth' : 'auto'; + el.scrollIntoView({block: 'center', inline: 'center', behavior: scrollingSpeed}); } } }, diff --git a/src/components/Preferences.ts b/src/components/Preferences.ts index 8666548235..5672f6eee5 100644 --- a/src/components/Preferences.ts +++ b/src/components/Preferences.ts @@ -66,6 +66,7 @@ export const Preferences = Vue.component('preferences', { 'lang': 'en', 'langs': LANGUAGES, 'enable_sounds': false as boolean | unknown[], + 'smooth_scrolling': false as boolean | unknown[], }; }, methods: { @@ -327,6 +328,12 @@ export const Preferences = Vue.component('preferences', { Enable sounds
+
+ +
diff --git a/src/components/PreferencesManager.ts b/src/components/PreferencesManager.ts index 5ca65e44df..9230be9e6f 100644 --- a/src/components/PreferencesManager.ts +++ b/src/components/PreferencesManager.ts @@ -21,6 +21,7 @@ export class PreferencesManager { 'hide_log', 'lang', 'enable_sounds', + 'smooth_scrolling', ]; static preferencesValues: Map = new Map(); From cbbf291027082e75af85c22d814cea9bdcdfb603 Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Wed, 13 Jan 2021 12:28:38 -0500 Subject: [PATCH 15/20] add key mapping graphics --- assets/help/hotkeys.png | Bin 0 -> 52400 bytes src/components/HelpIconology.ts | 15 +++++++++++++++ src/styles/help-iconology.less | 19 +++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 assets/help/hotkeys.png diff --git a/assets/help/hotkeys.png b/assets/help/hotkeys.png new file mode 100644 index 0000000000000000000000000000000000000000..1de686928ba84554c2a9280236ef2acd1816c37e GIT binary patch literal 52400 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 z0YInfluence
+
+
+
Hotkeys Mapping
+
+
+
+
+
Main Board
+
Players Overview Table
+
Cards in Hand Table
+
Colonies
+
+
+
+
`, }); diff --git a/src/styles/help-iconology.less b/src/styles/help-iconology.less index 867c03ed83..fdb1b9e4a9 100644 --- a/src/styles/help-iconology.less +++ b/src/styles/help-iconology.less @@ -151,4 +151,23 @@ background: linear-gradient(#cc8b00, rgb(128, 87, 0),rgb(128, 87, 0)); box-shadow: 0 0 0 1px rgba(0,0,0,0.6), 0 0 0 2px rgba(0,0,0,0.3); transform: scale(0.8); + } + + .help-page-hotkeys { + display: flex; + background: url(assets/help/hotkeys.png); + width: 713px; + height: 408px; + background-size: 713px 408px; + color: white; + font-family: Prototype; + font-weight: normal; + text-align: left; + margin-left: 200px; + line-height: 38px; + .keys{ + position: relative; + left: -245px; + margin-top: 190px; + } } \ No newline at end of file From 5c27e9555306baed0bc38767b85287357a2f7c6c Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Wed, 13 Jan 2021 12:30:04 -0500 Subject: [PATCH 16/20] remove typo --- src/components/HelpIconology.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/HelpIconology.ts b/src/components/HelpIconology.ts index bb78155792..681666e7f9 100644 --- a/src/components/HelpIconology.ts +++ b/src/components/HelpIconology.ts @@ -216,7 +216,7 @@ export const HelpIconology = Vue.component('help-iconology', {
Main Board
Players Overview Table
-
Cards in Hand Table
+
Cards in Hand
Colonies
From cd0181a94964abd9296a2731f765702795f54b3b Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Wed, 13 Jan 2021 12:54:33 -0500 Subject: [PATCH 17/20] fix event type --- src/components/PlayerHome.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index 370c4d045b..eab66ad64c 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -75,8 +75,9 @@ export const PlayerHome = Vue.component('player-home', { }, mixins: [PlayerMixin], methods: { - navigatePage: function(event: any) { - if (event.target.nodeName.toLowerCase() !== 'input') { + navigatePage: function(event: KeyboardEvent) { + const inputSource = event.target as Element; + if (inputSource.nodeName.toLowerCase() !== 'input') { let id: string | undefined = undefined; switch (event.code) { case KeyboardNavigation.GAMEBOARD: From 36ecca7dccd81bba9666f4a5cf3b581d15d93184 Mon Sep 17 00:00:00 2001 From: Jeep <14239220+vsrisuknimit@users.noreply.github.com> Date: Wed, 13 Jan 2021 21:13:19 -0500 Subject: [PATCH 18/20] remove unused keys --- src/KeyboardNavigation.ts | 5 ----- src/components/PlayerHome.ts | 25 +++++-------------------- 2 files changed, 5 insertions(+), 25 deletions(-) diff --git a/src/KeyboardNavigation.ts b/src/KeyboardNavigation.ts index 314a9359ce..6abde43d99 100644 --- a/src/KeyboardNavigation.ts +++ b/src/KeyboardNavigation.ts @@ -1,12 +1,7 @@ export enum KeyboardNavigation { GAMEBOARD = 'Digit1', - TURMOILBOARD = '', - MILESTONESAWARDS = '', PLAYERSOVERVIEW = 'Digit2', - GAMELOG = '', - ACTION = '', HAND = 'Digit3', - PLAYEDCARDS = '', COLONIES = 'Digit4', } diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index eab66ad64c..88f5d60fd7 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -83,27 +83,12 @@ export const PlayerHome = Vue.component('player-home', { case KeyboardNavigation.GAMEBOARD: id = 'shortkey-board'; break; - case KeyboardNavigation.TURMOILBOARD: - id = 'shortkey-turmoil'; - break; - case KeyboardNavigation.MILESTONESAWARDS: - id = 'shortkey-milestonesawards'; - break; case KeyboardNavigation.PLAYERSOVERVIEW: id = 'shortkey-playersoverview'; break; - case KeyboardNavigation.GAMELOG: - id = 'shortkey-gamelog'; - break; - case KeyboardNavigation.ACTION: - id = 'shortkey-actions'; - break; case KeyboardNavigation.HAND: id = 'shortkey-hand'; break; - case KeyboardNavigation.PLAYEDCARDS: - id = 'shortkey-cards'; - break; case KeyboardNavigation.COLONIES: id = 'shortkey-colonies'; break; @@ -261,9 +246,9 @@ export const PlayerHome = Vue.component('player-home', { :aresData="player.aresData" id="shortkey-board"> - + -
+
@@ -271,7 +256,7 @@ export const PlayerHome = Vue.component('player-home', { -
+

Game log @@ -282,7 +267,7 @@ export const PlayerHome = Vue.component('player-home', {
- +
@@ -299,7 +284,7 @@ export const PlayerHome = Vue.component('player-home', {

-
+
From fe15f255f0ca6221094b9b7a93cb3e2c008b29c1 Mon Sep 17 00:00:00 2001 From: Robert Konigsberg Date: Wed, 13 Jan 2021 22:00:33 -0500 Subject: [PATCH 19/20] Post review comments. --- src/boards/Board.ts | 2 +- src/boards/ElysiumBoard.ts | 5 ----- src/boards/HellasBoard.ts | 4 ---- src/boards/OriginalBoard.ts | 4 ---- src/moon/MoonBoard.ts | 4 ---- tests/ares/EmptyBoard.ts | 5 ----- 6 files changed, 1 insertion(+), 23 deletions(-) diff --git a/src/boards/Board.ts b/src/boards/Board.ts index 4fa67860cc..cb9a56b2a1 100644 --- a/src/boards/Board.ts +++ b/src/boards/Board.ts @@ -13,7 +13,7 @@ import {SerializedBoard, SerializedSpace} from './SerializedBoard'; export abstract class Board { private maxX: number = 0; private maxY: number = 0; - constructor(public spaces: Array) { + protected constructor(public spaces: Array) { spaces.forEach((space) => { this.maxX = Math.max(this.maxX, space.x); this.maxY = Math.max(this.maxY, space.y); diff --git a/src/boards/ElysiumBoard.ts b/src/boards/ElysiumBoard.ts index 0aac1bdb78..5f34d6393b 100644 --- a/src/boards/ElysiumBoard.ts +++ b/src/boards/ElysiumBoard.ts @@ -1,4 +1,3 @@ -import {ISpace} from './ISpace'; import {SpaceBonus} from '../SpaceBonus'; import {SpaceName} from '../SpaceName'; import {Board} from './Board'; @@ -8,10 +7,6 @@ import {Player} from '../Player'; import {Random} from '../Random'; export class ElysiumBoard extends Board { - private constructor(spaces: Array) { - super(spaces); - } - public static newInstance(shuffle: boolean, rng: Random, includeVenus: boolean): ElysiumBoard { const builder = new BoardBuilder(includeVenus); diff --git a/src/boards/HellasBoard.ts b/src/boards/HellasBoard.ts index 638a17ff6b..3c5aee04f0 100644 --- a/src/boards/HellasBoard.ts +++ b/src/boards/HellasBoard.ts @@ -10,10 +10,6 @@ import {SerializedBoard} from './SerializedBoard'; import {Random} from '../Random'; export class HellasBoard extends Board { - private constructor(spaces: Array) { - super(spaces); - } - public static newInstance(shuffle: boolean, rng: Random, includeVenus: boolean): HellasBoard { const builder = new BoardBuilder(includeVenus); diff --git a/src/boards/OriginalBoard.ts b/src/boards/OriginalBoard.ts index 6e4c60d192..4c5ca13ca9 100644 --- a/src/boards/OriginalBoard.ts +++ b/src/boards/OriginalBoard.ts @@ -8,10 +8,6 @@ import {SerializedBoard} from './SerializedBoard'; import {Random} from '../Random'; export class OriginalBoard extends Board { - private constructor(spaces: Array) { - super(spaces); - } - public static newInstance(shuffle: boolean, rng: Random, includeVenus: boolean): OriginalBoard { const builder = new BoardBuilder(includeVenus); diff --git a/src/moon/MoonBoard.ts b/src/moon/MoonBoard.ts index 30d3c6d980..ee66517706 100644 --- a/src/moon/MoonBoard.ts +++ b/src/moon/MoonBoard.ts @@ -23,10 +23,6 @@ class Space implements ISpace { } export class MoonBoard extends Board { - private constructor(spaces: Array) { - super(spaces); - } - public getNoctisCitySpaceIds() { return []; } diff --git a/tests/ares/EmptyBoard.ts b/tests/ares/EmptyBoard.ts index ab25767ad5..7e641ba1bc 100644 --- a/tests/ares/EmptyBoard.ts +++ b/tests/ares/EmptyBoard.ts @@ -1,12 +1,7 @@ import {Board} from '../../src/boards/Board'; import {BoardBuilder} from '../../src/boards/BoardBuilder'; -import {ISpace} from '../../src/boards/ISpace'; export class EmptyBoard extends Board { - private constructor(spaces: Array) { - super(spaces); - } - public static newInstance() { const builder = new BoardBuilder(false); From b1e04f9f1b2be408cf812b17d1d58ff5f39a1d6d Mon Sep 17 00:00:00 2001 From: Robert Konigsberg Date: Wed, 13 Jan 2021 22:59:31 -0500 Subject: [PATCH 20/20] Remove the Moon tag when the Moon expansion isn't in play. --- src/components/overview/PlayerTags.ts | 6 ++++++ src/models/PlayerModel.ts | 1 + src/server/ServerModel.ts | 2 ++ 3 files changed, 9 insertions(+) diff --git a/src/components/overview/PlayerTags.ts b/src/components/overview/PlayerTags.ts index 557117be60..85bdee3005 100644 --- a/src/components/overview/PlayerTags.ts +++ b/src/components/overview/PlayerTags.ts @@ -32,6 +32,9 @@ export const PlayerTags = Vue.component('player-tags', { showVenus: function(): boolean { return this.player.venusNextExtension; }, + showMoon: function(): boolean { + return this.player.moonExpansion; + }, getTagsPlaceholders: function() { const tags: {[x: string]: Tags | SpecialTags} = {...Tags, ...SpecialTags}; if (this.showColonyCount() === false) { @@ -43,6 +46,9 @@ export const PlayerTags = Vue.component('player-tags', { if (this.showVenus() === false) { delete tags.VENUS; } + if (this.showMoon() === false) { + delete tags.MOON; + } return tags; }, getCardCount: function(): number { diff --git a/src/models/PlayerModel.ts b/src/models/PlayerModel.ts index 1f92bd6a4d..a3a3ee71dd 100644 --- a/src/models/PlayerModel.ts +++ b/src/models/PlayerModel.ts @@ -46,6 +46,7 @@ export interface PlayerModel { megaCredits: number; megaCreditProduction: number; milestones: Array; + moonExpansion: boolean; name: string; oceans: number; oxygenLevel: number; diff --git a/src/server/ServerModel.ts b/src/server/ServerModel.ts index 40e6b7aca1..9598aac8a9 100644 --- a/src/server/ServerModel.ts +++ b/src/server/ServerModel.ts @@ -71,6 +71,7 @@ export class Server { id: player.id, megaCredits: player.megaCredits, megaCreditProduction: player.getProduction(Resources.MEGACREDITS), + moonExpansion: game.gameOptions.moonExpansion, name: player.name, oceans: game.board.getOceansOnBoard(), oxygenLevel: game.getOxygenLevel(), @@ -394,6 +395,7 @@ function getPlayers(players: Array, game: Game): Array { victoryPointsBreakdown: player.getVictoryPoints(game), isActive: player.id === game.activePlayer, venusNextExtension: game.gameOptions.venusNextExtension, + moonExpansion: game.gameOptions.moonExpansion, turmoilExtension: game.gameOptions.turmoilExtension, venusScaleLevel: game.getVenusScaleLevel(), boardName: game.gameOptions.boardName,