diff --git a/assets/help/hotkeys.png b/assets/help/hotkeys.png new file mode 100644 index 0000000000..1de686928b Binary files /dev/null and b/assets/help/hotkeys.png differ diff --git a/compile-vue-templates.js b/compile-vue-templates.js index a5ccfdd992..c9fbc7568f 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 new file mode 100644 index 0000000000..6abde43d99 --- /dev/null +++ b/src/KeyboardNavigation.ts @@ -0,0 +1,7 @@ + +export enum KeyboardNavigation { + GAMEBOARD = 'Digit1', + PLAYERSOVERVIEW = 'Digit2', + HAND = 'Digit3', + COLONIES = 'Digit4', +} 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/components/HelpIconology.ts b/src/components/HelpIconology.ts index cdce627850..681666e7f9 100644 --- a/src/components/HelpIconology.ts +++ b/src/components/HelpIconology.ts @@ -207,6 +207,21 @@ export const HelpIconology = Vue.component('help-iconology', {
Influence
+
+
+
Hotkeys Mapping
+
+
+
+
+
Main Board
+
Players Overview Table
+
Cards in Hand
+
Colonies
+
+
+
+
`, }); diff --git a/src/components/PlayerHome.ts b/src/components/PlayerHome.ts index 9205fab2b3..88f5d60fd7 100644 --- a/src/components/PlayerHome.ts +++ b/src/components/PlayerHome.ts @@ -18,6 +18,7 @@ import {Button} from './common/Button'; import {SortableCards} from './SortableCards'; import {TopBar} from './TopBar'; import {PreferencesManager} from './PreferencesManager'; +import {KeyboardNavigation} from '../../src/KeyboardNavigation'; const dialogPolyfill = require('dialog-polyfill'); @@ -74,6 +75,35 @@ export const PlayerHome = Vue.component('player-home', { }, mixins: [PlayerMixin], methods: { + 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: + id = 'shortkey-board'; + break; + case KeyboardNavigation.PLAYERSOVERVIEW: + id = 'shortkey-playersoverview'; + break; + case KeyboardNavigation.HAND: + id = 'shortkey-hand'; + break; + case KeyboardNavigation.COLONIES: + id = 'shortkey-colonies'; + break; + } + if (id === undefined) { + return; + } + const el = document.getElementById(id); + if (el) { + event.preventDefault(); + const scrollingSpeed = PreferencesManager.loadValue('smooth_scrolling') === '1' ? 'smooth' : 'auto'; + el.scrollIntoView({block: 'center', inline: 'center', behavior: scrollingSpeed}); + } + } + }, getPlayerCssForTurnOrder: ( player: PlayerModel, highlightActive: boolean, @@ -163,7 +193,7 @@ export const PlayerHome = Vue.component('player-home', { ); }, template: ` -
+
@@ -213,7 +243,8 @@ export const PlayerHome = Vue.component('player-home', { :temperature="player.temperature" :shouldNotify="true" :aresExtension="player.aresExtension" - :aresData="player.aresData"> + :aresData="player.aresData" + id="shortkey-board"> @@ -223,10 +254,10 @@ export const PlayerHome = Vue.component('player-home', {
- +
- +

Game log @@ -236,7 +267,7 @@ export const PlayerHome = Vue.component('player-home', {
- +
@@ -248,12 +279,12 @@ export const PlayerHome = Vue.component('player-home', {

-
+
-
+
@@ -349,7 +380,7 @@ export const PlayerHome = Vue.component('player-home', {
-
+
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(); 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/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/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, 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 diff --git a/src/styles/player_home.less b/src/styles/player_home.less index e46043be58..0f0b607967 100644 --- a/src/styles/player_home.less +++ b/src/styles/player_home.less @@ -868,5 +868,6 @@ } } - - +.shortkey-no-outline { + outline: none; +} 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);