diff --git a/.templates/tsconfig.json b/.templates/tsconfig.json index a03714b8..829c9b27 100644 --- a/.templates/tsconfig.json +++ b/.templates/tsconfig.json @@ -13,11 +13,13 @@ "target": "es6", "lib": [ "es6", "dom", "ES2019.Array" ], "module": "ES2020", + "experimentalDecorators": true, // Emit Flags: "sourceMap": true, //"removeComments": true, "alwaysStrict": true, + "preserveConstEnums": true, // Grammar Checking: "strictNullChecks": true, diff --git a/.vscode/cSpell.json b/.vscode/cSpell.json index 2ee68bf2..b4529c2e 100644 --- a/.vscode/cSpell.json +++ b/.vscode/cSpell.json @@ -82,6 +82,7 @@ "gameplay", "hinderance", "hitbox", + "jank", "lifestages", "lifecycle", "millis", diff --git a/.vscode/settings.json b/.vscode/settings.json index 37c24144..38385080 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,7 +6,6 @@ // project specific excludes: "package-lock.json": true, - "scripts/webpack/webpack.config.js": true, // don't always need this: "node_modules/": true, @@ -18,6 +17,7 @@ "**/bower_components": true, "**/*.code-search": true, "{**/.templates/,**/tsconfig.json}": false, + "scripts/webpack/webpack.config.js": true, }, "json.schemas": [ { diff --git a/TODO.md b/TODO.md index 4d9406d1..df42a772 100644 --- a/TODO.md +++ b/TODO.md @@ -14,10 +14,19 @@ ### High Priority +1. Server authentication is not working. +1. Make circular references in `Player` non-enumerable and see if that improves the debug logging experience. +1. Move StorageHooks to `client/` and make it smarter. + - Make sure that index.ejs is updated for changes to colourSchemeStyleLiteral key name. +1. Make window title indicate current screen. +1. Implement game creation event communications for online game. +1. Implement Pause and Unpause events over network. +1. ~Review all throw clauses and remove those declared in class constructors.~ + - The new approach is to put these checks in the UI input validators and on the receiving end of the server side. +1. Debug and handle goToScreen when user navigates forward in history. 1. Make the cost of boosting proportional to the length of the lang-sequence of the boost-destination tile. 1. Disable colour schemes when media is print. - See [javascript media queries API](https://www.w3schools.com/jsref/met_win_matchmedia.asp). -1. Implement game creation event communications for online game. 1. Implement the scores/player-listing sidebar in __PlayScreen. - Also show scores (very small size) on top of player faces. 1. Display the operator's current sequence buffer. @@ -35,6 +44,7 @@ ### Routine Checkups - Check if there are any overridden setters without a getter also overridden or vice versa. This is a subtle and unexpected cause of bugs. +- Make sure all button elements have `type=button`, or else they will default to `type=submit`, which usually does not matter, but is also usually not my intention when it does matter (ie. when there are forms in the button' vicinity). ### Low Priority diff --git a/assets/style/initial/screen/_barrel.css b/assets/style/initial/screen/_barrel.css index fb7fe05a..59f3d068 100644 --- a/assets/style/initial/screen/_barrel.css +++ b/assets/style/initial/screen/_barrel.css @@ -1,5 +1,6 @@ @import "./home.css"; +@import "./colourctrl.css"; @import "./setup.css"; @import "./play.css"; @import "./groupjoiner.css"; -@import "./colourctrl.css"; \ No newline at end of file +@import "./grouplobby.css"; \ No newline at end of file diff --git a/assets/style/initial/screen/groupjoiner.css b/assets/style/initial/screen/groupjoiner.css index 256b3a65..d6ae0eec 100644 --- a/assets/style/initial/screen/groupjoiner.css +++ b/assets/style/initial/screen/groupjoiner.css @@ -7,25 +7,34 @@ height: 27em; max-height: 80vh; width: 27em; max-width: 90vw; display: grid; - grid-template-rows: repeat(3, 2fr) 1fr; + /* grid-template-rows: repeat(3, 2fr) 1fr; */ gap: 7.0%; + grid-template: + "host-url host-url" 2fr + "group-name group-name" 2fr + "passphrase passphrase" 2fr + "prev next" 1fr + / 1fr 1fr; } .screen-joiner--content-wrapper > label { display: grid; grid-template-rows: 1fr 2.0fr; -} -.screen-joiner--content-wrapper input { - padding: 0px; -} -.screen-joiner--content-wrapper input:invalid { - border-style: dotted; + grid-column: 1/3; } .screen-joiner--host-url { + /* grid-area: host-url; */ } .screen-joiner--group-name { + /* grid-area: group-name; */ } .screen-joiner--passphrase { + /* grid-area: passphrase; */ +} + +.screen-joiner .screen--back-button { + grid-area: prev; } -.screen-joiner--next-button { +.screen-joiner .screen--next-button { + grid-area: next; } diff --git a/assets/style/initial/screen/grouplobby.css b/assets/style/initial/screen/grouplobby.css new file mode 100644 index 00000000..a5a6d683 --- /dev/null +++ b/assets/style/initial/screen/grouplobby.css @@ -0,0 +1,39 @@ +.screen-lobby { + display: grid; + justify-items: center; + align-content: center; +} + +.screen-lobby--client-info-section { + --spacing: 0.2em; + --border-radius: 0.8em; + gap: 0.2em; margin: 0.2em; + height: 6em; max-height: 80vh; + width: 15em; /* max-width: 30vw; */ + display: grid; + grid-template-rows: 1fr 1fr; +} + +.screen-lobby--teams-section { + display: grid; +} + +.screen-lobby--team { +} + +.screen-lobby--player { + max-width: 20em; + display: grid; + grid-template-columns: 3em 2em 1fr; +} +.screen-lobby--player * { + pointer-events: none; +} +.screen-lobby--player__name { + justify-self: start; + padding-inline-start: 0.5em; +} + +.screen-lobby .screen--next-button:disabled { + display: none; +} \ No newline at end of file diff --git a/assets/style/initial/screen/setup.css b/assets/style/initial/screen/setup.css index d102d2d7..b0551be4 100644 --- a/assets/style/initial/screen/setup.css +++ b/assets/style/initial/screen/setup.css @@ -8,7 +8,15 @@ gap: 1.0em; } -.screen-setup--next-button { +.screen-setup .screen--prev-button, +.screen-setup .screen--next-button { padding: 0.3em 0.7em; font-size: 2.0em; } + +.screen-setup--lang-sel { +} + +.screen-setup--lang-weight-exagg { + width: 100%; +} diff --git a/assets/style/initial/utils.css b/assets/style/initial/utils.css index aabfc4c5..4bdc336e 100644 --- a/assets/style/initial/utils.css +++ b/assets/style/initial/utils.css @@ -41,6 +41,12 @@ margins and padding, and its own padding. */ contain: strict; position: relative; } +.sk-input-group input.sk-input-group-item { + padding: 0px; +} +.sk-input-group input.sk-input-group-item:invalid { + border-style: dotted; +} .sk-input-group .sk-input-group-item { border-radius: var(--border-radius); margin: var(--spacing); diff --git a/dev-guide.md b/dev-guide.md index f860ea7a..c9e39a32 100644 --- a/dev-guide.md +++ b/dev-guide.md @@ -53,6 +53,10 @@ Methodology: Use #private fields for fields that back accessors- Ie. Fields that ### Field / Method Naming +### Typescript Array Syntax + +When describing array types, use the `Array<>` form if the arrays are nested (since `readonly T[][]` is not clear which dimension is readonly), or if the entry type is mainly intended to be used as an interface-style type-map. An example of when `T[]` syntax is acceptable is when `T` is a builtin literal type such as `string` and the array is one dimensional. + #### Prefixing with Underscore TLDR: use such naming if a member / variable must be public, but is only meant to be called in a very specific place. diff --git a/dist/client/_barrel.css b/dist/client/_barrel.css index 95f578d1..5706d5c2 100644 --- a/dist/client/_barrel.css +++ b/dist/client/_barrel.css @@ -1 +1 @@ -.fill-parent{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden hidden}.text-select-disabled{user-select:none;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.center-contents{display:inline-flex;justify-content:center;align-content:center;justify-items:center;align-items:center}.stack-contents{position:relative}.stack-contents>*{position:absolute}.sk-input-group{background-color:var(--colour-mainBg);padding:var(--spacing);border-radius:calc(var(--border-radius) + 2*var(--spacing))}.sk-input-group>*{contain:strict;position:relative}.sk-input-group .sk-input-group-item{border-radius:var(--border-radius);margin:var(--spacing);border:0 solid var(--colour-tileBg);color:var(--colour-tileFg);background-color:var(--colour-tileBg);transition:all .15s ease-in}.sk-input-group .sk-input-group-item:focus{outline:none;border-color:var(--colour-tileBd);box-shadow:inset 0 0 20px rgba(0,0,0,.25);text-shadow:0 0 8px #000;animation:sk-input-group-item-focus .4s ease-in-out -.5s infinite alternate}.sk-input-group:focus-within .sk-input-group-item:not(:focus){filter:brightness(.9);opacity:.6}@keyframes sk-input-group-item-focus{0%{margin:calc(var(--spacing)/3);border-width:calc(1.2*var(--spacing))}to{margin:calc(var(--spacing)*2/3);border-width:calc(1.4*var(--spacing))}}[data-sk-colour-scheme=snakey]{--colour-mainFg:#e9eef3;--colour-mainBg:#3f5e77;--colour-tileFg:#e9eef3;--colour-tileBg:#2e3b48;--colour-tileBd:#fff;--colour-healthFg:#21352e;--colour-healthBg:#4edf8f;--colour-pFaceMe:#35e7ff;--colour-pFaceMeOppo:#937ad8;--colour-pFaceTeammate:#f8d150;--colour-pFaceImtlTeammate:#f8d150;--colour-pFaceOpponent:#ec4daf;--colour-pFaceImtlOpponent:#e23fa3}::backdrop{background-color:var(--colour-mainBg)}@media (light-level:dim){body{filter:brightness(.7)}}html{scroll-behavior:smooth}body{margin:0;font-family:Trebuchet MS,Lucida Sans Unicode,MS PGothic;font-weight:700;color:var(--colour-mainFg);text-align:center;transition:filter .5s ease-in-out}:disabled{cursor:not-allowed}*{scrollbar-width:thin;scrollbar-color:transparent;scrollbar-track-color:var(--colour-tileBd)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background-color:transparent}::-webkit-scrollbar-thumb{background:var(--colour-tileBd);border-radius:30px;border:2px solid transparent}::-webkit-scrollbar-corner{visibility:hidden}table{border-spacing:0}button{font:inherit;color:inherit;padding:0;background-color:var(--colour-tileBg)}button:disabled{opacity:.7}input{font:inherit;text-align:inherit;box-sizing:border-box}#all-screens-container{display:contents}.sk-screen{contain:strict;position:absolute;top:0;right:0;bottom:0;left:0;overflow:auto}.sk-screen:not([data-current]){display:none}#background{z-index:-10000;display:initial;background-color:var(--colour-mainBg)}#screen-texture,#screen-tint{pointer-events:none;z-index:10000;display:initial}#screen-tint{opacity:0;transition-property:opacity,background-color;transition-timing-function:ease-in-out}#screen-texture{background-size:13.5rem;mix-blend-mode:overlay;background-color:#919191;background-image:url(images/textures/cheap_diagonal_fabric.png);background-blend-mode:color-burn;filter:contrast(2.3)}.screen-home{display:flex}.screen-home--nav{--spacing:6px;--border-radius:1rem;height:30em;max-height:80vmin;width:30em;max-width:80vmin;display:grid;grid-template:"pofl pofl pofl ponl" 3fr "htpl htpl htpl hths" 1fr "colr colr colr . " 1fr "repo bugs . . " 1fr/1fr 1fr 1fr 3fr}.screen-home--nav>*{border-style:double!important}.screen-home--nav--play-offline{grid-area:pofl}.screen-home--nav--play-online{grid-area:ponl}.screen-home--nav--how-to-play{grid-area:htpl}.screen-home--nav--how-to-host{grid-area:hths}.screen-home--nav--colour-scheme{grid-area:colr}.screen-home--nav--goto-repo{grid-area:repo}.screen-home--nav--report-issue{grid-area:bugs}.screen-setup{display:grid;justify-content:center;justify-items:center;align-content:center;align-items:center;gap:1em}.screen-setup--next-button{padding:.3em .7em;font-size:2em}.screen-play{display:grid;grid-template:"controls main scoreboard" 100%/minmax(auto,1fr) auto minmax(auto,1fr)}.screen-play--grid-wrapper{grid-area:main;contain:content;box-sizing:border-box;height:100%;padding:1rem 0}.screen-play--controls-bar{--spacing:0.3rem;--border-radius:0.7rem;--track-size:5rem;position:sticky;top:0;grid-area:controls;display:grid;grid-auto-rows:var(--track-size);grid-template-columns:minmax(var(--track-size),1fr);justify-items:stretch;align-items:stretch;font-size:80%}.screen-play--controls-bar>*{padding:.35em}.screen-play--players-bar{grid-area:players}@media screen and (max-aspect-ratio:1/1){.screen-play{align-content:flex-start;grid-template:"main" calc(100vh - 7.5rem) "controls" max-content "players" auto/1fr}.screen-play--grid-wrapper{padding:1rem 1rem 0}.screen-play--controls-bar{grid-template-columns:repeat(3,var(--track-size));grid-template-rows:var(--track-size)}}.screen-joiner--content-wrapper{--spacing:0.2em;--border-radius:1.2em;height:27em;max-height:80vh;width:27em;max-width:90vw;display:grid;grid-template-rows:repeat(3,2fr) 1fr;gap:7%}.screen-joiner--content-wrapper>label{display:grid;grid-template-rows:1fr 2fr}.screen-joiner--content-wrapper input{padding:0}.screen-joiner--content-wrapper input:invalid{border-style:dotted}.screen-colour--opt{display:grid}.sk-pick-one{display:flex;flex-direction:column;align-items:stretch;overflow-x:hidden;overflow-y:auto;border-color:var(--colour-tileBd);text-align:start}.sk-pick-one:focus{outline:none}.sk-pick-one--opt{overflow:hidden hidden;cursor:default;transition-property:opacity;transition-duration:.35s;transition-timing-function:ease-out}.sk-pick-one:focus .sk-pick-one--opt:not([aria-active-descendant=true]):not([aria-selected=true]){opacity:.4}.sk-pick-one--opt[aria-selected=true]{text-decoration:underline}.sk-pick-one[aria-invalid=true]{border-style:dotted;border-width:.3rem}[data-sk-colour-scheme=smooth-stone]{--colour-mainFg:#c3c5ce;--colour-mainBg:#72888d;--colour-tileFg:#a2b6bb;--colour-tileBg:#546164;--colour-tileBd:#fff;--colour-healthFg:#21352e;--colour-healthBg:#398f5a;--colour-pFaceMe:#43aec9;--colour-pFaceMeOppo:#5a5f9c;--colour-pFaceTeammate:#bdae58;--colour-pFaceImtlTeammate:#f8df50;--colour-pFaceOpponent:#a34e59;--colour-pFaceImtlOpponent:#e23fa3}[data-sk-colour-scheme=murky-dive]{--colour-mainFg:#c3c5ce;--colour-mainBg:#336465;--colour-tileFg:#e7efef;--colour-tileBg:#283e3f;--colour-tileBd:#fff;--colour-healthFg:#1d3633;--colour-healthBg:#37dfc6;--colour-pFaceMe:#03f9ed;--colour-pFaceMeOppo:#898697;--colour-pFaceTeammate:#fba;--colour-pFaceImtlTeammate:#ffcabd;--colour-pFaceOpponent:#ff4f6c;--colour-pFaceImtlOpponent:#ff6d85} \ No newline at end of file +.fill-parent{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden hidden}.text-select-disabled{user-select:none;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.center-contents{display:inline-flex;justify-content:center;align-content:center;justify-items:center;align-items:center}.stack-contents{position:relative}.stack-contents>*{position:absolute}.sk-input-group{background-color:var(--colour-mainBg);padding:var(--spacing);border-radius:calc(var(--border-radius) + 2*var(--spacing))}.sk-input-group>*{contain:strict;position:relative}.sk-input-group input.sk-input-group-item{padding:0}.sk-input-group input.sk-input-group-item:invalid{border-style:dotted}.sk-input-group .sk-input-group-item{border-radius:var(--border-radius);margin:var(--spacing);border:0 solid var(--colour-tileBg);color:var(--colour-tileFg);background-color:var(--colour-tileBg);transition:all .15s ease-in}.sk-input-group .sk-input-group-item:focus{outline:none;border-color:var(--colour-tileBd);box-shadow:inset 0 0 20px rgba(0,0,0,.25);text-shadow:0 0 8px #000;animation:sk-input-group-item-focus .4s ease-in-out -.5s infinite alternate}.sk-input-group:focus-within .sk-input-group-item:not(:focus){filter:brightness(.9);opacity:.6}@keyframes sk-input-group-item-focus{0%{margin:calc(var(--spacing)/3);border-width:calc(1.2*var(--spacing))}to{margin:calc(var(--spacing)*2/3);border-width:calc(1.4*var(--spacing))}}[data-sk-colour-scheme=snakey]{--colour-mainFg:#e9eef3;--colour-mainBg:#3f5e77;--colour-tileFg:#e9eef3;--colour-tileBg:#2e3b48;--colour-tileBd:#fff;--colour-healthFg:#21352e;--colour-healthBg:#4edf8f;--colour-pFaceMe:#35e7ff;--colour-pFaceMeOppo:#937ad8;--colour-pFaceTeammate:#f8d150;--colour-pFaceImtlTeammate:#f8d150;--colour-pFaceOpponent:#ec4daf;--colour-pFaceImtlOpponent:#e23fa3}::backdrop{background-color:var(--colour-mainBg)}@media (light-level:dim){body{filter:brightness(.7)}}html{scroll-behavior:smooth}body{margin:0;font-family:Trebuchet MS,Lucida Sans Unicode,MS PGothic;font-weight:700;color:var(--colour-mainFg);text-align:center;transition:filter .5s ease-in-out}:disabled{cursor:not-allowed}*{scrollbar-width:thin;scrollbar-color:transparent;scrollbar-track-color:var(--colour-tileBd)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background-color:transparent}::-webkit-scrollbar-thumb{background:var(--colour-tileBd);border-radius:30px;border:2px solid transparent}::-webkit-scrollbar-corner{visibility:hidden}table{border-spacing:0}button{font:inherit;color:inherit;padding:0;background-color:var(--colour-tileBg)}button:disabled{opacity:.7}input{font:inherit;text-align:inherit;box-sizing:border-box}#all-screens-container{display:contents}.sk-screen{contain:strict;position:absolute;top:0;right:0;bottom:0;left:0;overflow:auto}.sk-screen:not([data-current]){display:none}#background{z-index:-10000;display:initial;background-color:var(--colour-mainBg)}#screen-texture,#screen-tint{pointer-events:none;z-index:10000;display:initial}#screen-tint{opacity:0;transition-property:opacity,background-color;transition-timing-function:ease-in-out}#screen-texture{background-size:13.5rem;mix-blend-mode:overlay;background-color:#919191;background-image:url(images/textures/cheap_diagonal_fabric.png);background-blend-mode:color-burn;filter:contrast(2.3)}.screen-home{display:flex}.screen-home--nav{--spacing:6px;--border-radius:1rem;height:30em;max-height:80vmin;width:30em;max-width:80vmin;display:grid;grid-template:"pofl pofl pofl ponl" 3fr "htpl htpl htpl hths" 1fr "colr colr colr . " 1fr "repo bugs . . " 1fr/1fr 1fr 1fr 3fr}.screen-home--nav>*{border-style:double!important}.screen-home--nav--play-offline{grid-area:pofl}.screen-home--nav--play-online{grid-area:ponl}.screen-home--nav--how-to-play{grid-area:htpl}.screen-home--nav--how-to-host{grid-area:hths}.screen-home--nav--colour-scheme{grid-area:colr}.screen-home--nav--goto-repo{grid-area:repo}.screen-home--nav--report-issue{grid-area:bugs}.screen-colour--opt{display:grid}.screen-setup{display:grid;justify-content:center;justify-items:center;align-content:center;align-items:center;gap:1em}.screen-setup .screen--next-button,.screen-setup .screen--prev-button{padding:.3em .7em;font-size:2em}.screen-setup--lang-weight-exagg{width:100%}.screen-play{display:grid;grid-template:"controls main scoreboard" 100%/minmax(auto,1fr) auto minmax(auto,1fr)}.screen-play--grid-wrapper{grid-area:main;contain:content;box-sizing:border-box;height:100%;padding:1rem 0}.screen-play--controls-bar{--spacing:0.3rem;--border-radius:0.7rem;--track-size:5rem;position:sticky;top:0;grid-area:controls;display:grid;grid-auto-rows:var(--track-size);grid-template-columns:minmax(var(--track-size),1fr);justify-items:stretch;align-items:stretch;font-size:80%}.screen-play--controls-bar>*{padding:.35em}.screen-play--players-bar{grid-area:players}@media screen and (max-aspect-ratio:1/1){.screen-play{align-content:flex-start;grid-template:"main" calc(100vh - 7.5rem) "controls" max-content "players" auto/1fr}.screen-play--grid-wrapper{padding:1rem 1rem 0}.screen-play--controls-bar{grid-template-columns:repeat(3,var(--track-size));grid-template-rows:var(--track-size)}}.screen-joiner--content-wrapper{--spacing:0.2em;--border-radius:1.2em;height:27em;max-height:80vh;width:27em;max-width:90vw;display:grid;gap:7%;grid-template:"host-url host-url" 2fr "group-name group-name" 2fr "passphrase passphrase" 2fr "prev next" 1fr/1fr 1fr}.screen-joiner--content-wrapper>label{display:grid;grid-template-rows:1fr 2fr;grid-column:1/3}.screen-joiner .screen--back-button{grid-area:prev}.screen-joiner .screen--next-button{grid-area:next}.screen-lobby{display:grid;justify-items:center;align-content:center}.screen-lobby--client-info-section{--spacing:0.2em;--border-radius:0.8em;gap:.2em;margin:.2em;height:6em;max-height:80vh;width:15em;display:grid;grid-template-rows:1fr 1fr}.screen-lobby--teams-section{display:grid}.screen-lobby--player{max-width:20em;display:grid;grid-template-columns:3em 2em 1fr}.screen-lobby--player *{pointer-events:none}.screen-lobby--player__name{justify-self:start;padding-inline-start:.5em}.screen-lobby .screen--next-button:disabled{display:none}.sk-pick-one{display:flex;flex-direction:column;align-items:stretch;overflow-x:hidden;overflow-y:auto;border-color:var(--colour-tileBd);text-align:start}.sk-pick-one:focus{outline:none}.sk-pick-one--opt{overflow:hidden hidden;cursor:default;transition-property:opacity;transition-duration:.35s;transition-timing-function:ease-out}.sk-pick-one:focus .sk-pick-one--opt:not([aria-active-descendant=true]):not([aria-selected=true]){opacity:.4}.sk-pick-one--opt[aria-selected=true]{text-decoration:underline}.sk-pick-one[aria-invalid=true]{border-style:dotted;border-width:.3rem}[data-sk-colour-scheme=smooth-stone]{--colour-mainFg:#c3c5ce;--colour-mainBg:#72888d;--colour-tileFg:#a2b6bb;--colour-tileBg:#546164;--colour-tileBd:#fff;--colour-healthFg:#21352e;--colour-healthBg:#398f5a;--colour-pFaceMe:#43aec9;--colour-pFaceMeOppo:#5a5f9c;--colour-pFaceTeammate:#bdae58;--colour-pFaceImtlTeammate:#f8df50;--colour-pFaceOpponent:#a34e59;--colour-pFaceImtlOpponent:#e23fa3}[data-sk-colour-scheme=murky-dive]{--colour-mainFg:#c3c5ce;--colour-mainBg:#336465;--colour-tileFg:#e7efef;--colour-tileBg:#283e3f;--colour-tileBd:#fff;--colour-healthFg:#1d3633;--colour-healthBg:#37dfc6;--colour-pFaceMe:#03f9ed;--colour-pFaceMeOppo:#898697;--colour-pFaceTeammate:#fba;--colour-pFaceImtlTeammate:#ffcabd;--colour-pFaceOpponent:#ff4f6c;--colour-pFaceImtlOpponent:#ff6d85} \ No newline at end of file diff --git a/dist/client/chunk/game/offline.js b/dist/client/chunk/game/offline.js index 223780b9..02db321d 100644 --- a/dist/client/chunk/game/offline.js +++ b/dist/client/chunk/game/offline.js @@ -1,2 +1,2 @@ -(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[1],{18:function(e,t,r){var s={"./Cellphone.ts":[19,4],"./Emote.ts":[20,5],"./English.ts":[21,6],"./Japanese.ts":[22,7],"./Korean.ts":[23,8],"./Morse.ts":[24,9]};function n(e){if(!r.o(s,e))return Promise.resolve().then((function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}));var t=s[e],n=t[0];return r.e(t[1]).then((function(){return r(n)}))}n.keys=function(){return Object.keys(s)},n.id=18,e.exports=n},26:function(e,t,r){"use strict";r.r(t),r.d(t,"OfflineGame",(function(){return m}));var s=r(16),n=r(8),a=r(2),o=r(7),i=r(12),h=r(1);class c{constructor(e){const t=[];for(const r of e)t[r]=new c.Entry;this.entries=t}reset(){for(const e of this.entries)e.reset()}}!function(e){class t{constructor(){this.moveCounts={}}reset(){this.totalHealthPickedUp=0,Object.getOwnPropertyNames(h.b.MoveType).forEach(e=>{this.moveCounts[e]=0})}}e.Entry=t,Object.freeze(t),Object.freeze(t.prototype)}(c||(c={})),Object.freeze(c),Object.freeze(c.prototype);var l,d,u,p=r(17),f=function(e,t,r,s){return new(r||(r=Promise))((function(n,a){function o(e){try{h(s.next(e))}catch(e){a(e)}}function i(e){try{h(s.throw(e))}catch(e){a(e)}}function h(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,i)}h((s=s.apply(e,t||[])).next())}))},g=function(e,t,r){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,r),r},v=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};class w extends p.a{constructor(e,t,s){super(e,t,s),l.set(this,void 0),d.set(this,void 0),u.set(this,void 0),this.averageFreeHealth=s.averageFreeHealthPerTile*this.grid.area,this.averageFreeHealthPerTile=s.averageFreeHealthPerTile,g(this,d,new Set),g(this,u,r(18)(`./${this.langFrontend.module}.ts`).then(e=>{const t=this.langFrontend.export.split(".").reduce((e,t)=>e[t],e[this.langFrontend.module]);this.lang=new t(s.langWeightScaling);const r=this.grid.static.getAmbiguityThreshold();if(this.lang.numLeavese.playerId))}reset(){const e=Object.create(null,{reset:{get:()=>super.reset}});return f(this,void 0,void 0,(function*(){yield e.reset.call(this),g(this,l,0),v(this,d).clear(),yield v(this,u),this.lang.reset(),this.grid.shuffledForEachTile(e=>{e.setLangCharSeqPair(this.dryRunShuffleLangCharSeqAt(e))}),this.teams.forEach(e=>e.reset());const t=this.grid.static.getSpawnCoords(this.teams.map(e=>e.members.length),this.grid.dimensions);return this.teams.forEach((e,r)=>{e.members.forEach((e,s)=>{e.reset(this.grid.tile.at(t[r][s]))})}),this.scoreInfo.reset(),Promise.resolve()}))}_createArtifPlayer(e){return i.a.of(this,e)}dryRunShuffleLangCharSeqAt(e){e.setLangCharSeqPair(n.a.CharSeqPair.NULL);const t=Array.from(new Set(this.grid.tile.sourcesTo(e.coord).get.flatMap(e=>this.grid.tile.destsFrom(e.coord).get)));return this.lang.getNonConflictingChar(t.map(e=>e.langSeq).filter(e=>e))}get currentFreeHealth(){return v(this,l)}get freeHealthTiles(){return v(this,d)}dryRunSpawnFreeHealth(e){let t=this.averageFreeHealth-this.currentFreeHealth;if(t<=0)return;const r=[];for(;t>0;){let s;do{s=this.grid.tile.at(this.grid.getRandomCoord())}while(s.isOccupied||r.find(e=>s.coord.equals(e.coord)));const n=1;if(Math.random()s.coord.equals(e.coord)))?t.newFreeHealth=(t.newFreeHealth||0)+n:r.push({coord:s.coord,lastKnownUpdateId:1+s.lastKnownUpdateId,newCharSeqPair:void 0,newFreeHealth:s.freeHealth+n})}t-=n}return r}getHealthCostOfBoost(){return this.averageFreeHealthPerTile/a.a.K.PCT_MOVES_THAT_ARE_BOOST}executeTileModEvent(e,t=!0){Object.freeze(e);const r=this.grid.tile.at(e.coord);if(e.lastKnownUpdateId!==1+r.lastKnownUpdateId)throw new Error("this never happens. see comment in source.");return g(this,l,v(this,l)+(e.newFreeHealth-r.freeHealth)),0===e.newFreeHealth?v(this,d).delete(r):v(this,d).add(r),super.executeTileModEvent(e,t),r}managerCheckGamePlayingRequest(e){if(this.status!==a.a.Status.PLAYING)return;const t=this.players[e.playerId];if(!t)throw new Error("No such player exists.");if(e.playerLastAcceptedRequestId!==t.lastAcceptedRequestId)throw new RangeError(e.playerLastAcceptedRequestId{this.moveCounts[e]=0})}}e.Entry=t,Object.freeze(t),Object.freeze(t.prototype)}(d||(d={})),Object.freeze(d),Object.freeze(d.prototype);var u,g,p,f=r(18);class v extends f.a{constructor(e,t,s){super(e,t,s),u.set(this,void 0),g.set(this,void 0),p.set(this,void 0),this.averageFreeHealth=s.averageFreeHealthPerTile*this.grid.area,this.averageFreeHealthPerTile=s.averageFreeHealthPerTile,Object(a.c)(this,g,new Set),Object(a.c)(this,p,r(19)(`./${this.langFrontend.module}.ts`).then(e=>{const t=this.langFrontend.export.split(".").reduce((e,t)=>e[t],e[this.langFrontend.module]);this.lang=new t(s.langWeightExaggeration);const r=this.grid.static.getAmbiguityThreshold();if(this.lang.numLeavese.playerId))}reset(){const e=Object.create(null,{reset:{get:()=>super.reset}});return Object(a.a)(this,void 0,void 0,(function*(){yield e.reset.call(this),Object(a.c)(this,u,0),Object(a.b)(this,g).clear(),yield Object(a.b)(this,p),this.lang.reset(),this.grid.shuffledForEachTile(e=>{e.setLangCharSeqPair(this.dryRunShuffleLangCharSeqAt(e))}),this.teams.forEach(e=>e.reset());const t=this.grid.static.getSpawnCoords(this.teams.map(e=>e.members.length),this.grid.dimensions);return this.teams.forEach((e,r)=>{e.members.forEach((e,s)=>{e.reset(this.grid.tile.at(t[r][s]))})}),this.scoreInfo.reset(),Promise.resolve()}))}_createArtifPlayer(e){return l.a.of(this,e)}dryRunShuffleLangCharSeqAt(e){e.setLangCharSeqPair(n.a.CharSeqPair.NULL);const t=Array.from(new Set(this.grid.tile.sourcesTo(e.coord).get.flatMap(e=>this.grid.tile.destsFrom(e.coord).get)));return this.lang.getNonConflictingChar(t.map(e=>e.langSeq).filter(e=>e))}get currentFreeHealth(){return Object(a.b)(this,u)}get freeHealthTiles(){return Object(a.b)(this,g)}dryRunSpawnFreeHealth(e){let t=this.averageFreeHealth-this.currentFreeHealth;if(t<=0)return;const r=[];for(;t>0;){let s;do{s=this.grid.tile.at(this.grid.getRandomCoord())}while(s.isOccupied||r.find(e=>i.a.equals(s.coord,e.coord)));const a=1;if(Math.random()i.a.equals(s.coord,e.coord)))?t.newFreeHealth=(t.newFreeHealth||0)+a:r.push({coord:s.coord,lastKnownUpdateId:1+s.lastKnownUpdateId,newCharSeqPair:void 0,newFreeHealth:s.freeHealth+a})}t-=a}return r}getHealthCostOfBoost(){return this.averageFreeHealthPerTile/o.a.K.PCT_MOVES_THAT_ARE_BOOST}executeTileModEvent(e,t=!0){Object.freeze(e);const r=this.grid.tile.at(e.coord);if(e.lastKnownUpdateId!==1+r.lastKnownUpdateId)throw"never";return Object(a.c)(this,u,Object(a.b)(this,u)+(e.newFreeHealth-r.freeHealth)),0===e.newFreeHealth?Object(a.b)(this,g).delete(r):Object(a.b)(this,g).add(r),super.executeTileModEvent(e,t),r}managerCheckGamePlayingRequest(e){if("PLAYING"!==this.status)return;const t=this.players[e.playerId];if(!t)throw Error("No such player exists.");if(e.playerLastAcceptedRequestId!==t.lastAcceptedRequestId)throw RangeError(e.playerLastAcceptedRequestId{const t=Array.from(new Set(e.map(e=>e.teamId))).sort((e,t)=>e-t).reduce((e,t,r)=>(e[t]=r,e),[]);return e.slice().sort((e,r)=>t[e.teamId]-t[r.teamId]).map((e,r)=>Object.assign(e,{playerId:r,teamId:t[e.teamId]}))}}(r=e.CtorArgs||(e.CtorArgs={})),Object.freeze(r)}(u||(u={})),Object.freeze(u),Object.freeze(u.prototype)},function(e,t,r){"use strict";r.d(t,"a",(function(){return h}));var s,i=r(1),n=function(e,t,r){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,r),r},a=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};!function(e){var t,r;class s{constructor(){this.children=[]}reset(){this.inheritingWeightedHitCount=0,this.children.forEach(e=>e.reset())}_finalize(){Object.freeze(this.children),this.children.forEach(e=>e._finalize())}_addCharMapping(e,t){if(!i.a.Seq.REGEXP.test(e))throw new RangeError(`Mapping-sequence "${e}" did not match the required regular expression "${i.a.Seq.REGEXP.source}".`);if(0===t.length)throw new Error("never");let r=this;{let t=this;for(;t;)r=t,t=t.children.find(t=>e.startsWith(t.sequence))}if(r.sequence===e)throw new Error(`Mappings for all written-characters with a commoncorresponding typeable-sequence should be registered together,but an existing mapping for the sequence "${e}" was found.`);r.children.push(new h(r,e,t))}getLeafNodes(){const e=[];return this._recursiveGetLeafNodes(e),e}_recursiveGetLeafNodes(e){this.children.length?this.children.forEach(t=>{t._recursiveGetLeafNodes(e)}):e.push(this)}simpleView(){return this.children}static CREATE_TREE_MAP(e,t){const r=Object.values(e).reduce((e,t)=>e+t.weight,0),i=0===t?e=>1:1===t?e=>e:e=>Math.pow(e/r,t),n=new Map;for(const t in e){const r=e[t].seq,s=new o(t,i(e[t].weight)),a=n.get(r);a?a.push(s):n.set(r,[s])}const a=new s;return Array.from(n).sort((e,t)=>e[0].length-t[0].length).forEach(e=>{a._addCharMapping(...e)}),a._finalize(),a}}s.LEAF_CMP=(e,t)=>e.inheritingWeightedHitCount-t.inheritingWeightedHitCount,e.ParentNode=s,Object.freeze(s),Object.freeze(s.prototype);class h extends s{constructor(e,s,i){super(),t.set(this,void 0),r.set(this,void 0),this.sequence=s,n(this,r,i),n(this,t,e)}_finalize(){Object.freeze(a(this,r)),super._finalize()}reset(){super.reset(),a(this,r).forEach(e=>{e.reset(),this.incrementNumHits(e,Math.random()*i.a.CHAR_HIT_COUNT_SEED_CEILING)})}chooseOnePair(){const e=a(this,r).slice(0).sort(o.CMP).shift(),t={char:e.char,seq:this.sequence};return this.incrementNumHits(e),t}incrementNumHits(e,t=1){e._incrementNumHits(),this._recursiveIncrementNumHits(e.weightInv*t)}_recursiveIncrementNumHits(e){this.inheritingWeightedHitCount+=e,this.children.forEach(t=>t._recursiveIncrementNumHits(e))}get personalWeightedHitCount(){return this.inheritingWeightedHitCount-a(this,t).inheritingWeightedHitCount}andNonRootParents(){const e=[];for(let r=this;r instanceof h;r=a(r,t))e.push(r);return e}simpleView(){let e=a(this,r).map(e=>e.simpleView());return Object.assign(Object.create(null),{seq:this.sequence,chars:1===e.length?e[0]:e,kids:this.children.map(e=>e.simpleView())})}}t=new WeakMap,r=new WeakMap,h.PATH_CMP=(e,t)=>e.personalWeightedHitCount-t.personalWeightedHitCount,e.ChildNode=h,Object.freeze(h),Object.freeze(h.prototype)}(s||(s={})),Object.freeze(s);class o{constructor(e,t){if(t<=0)throw new RangeError(`All weights must be positive, but we were passed the value "${t}" for the character "${e}".`);this.char=e,this.weightInv=1/t}reset(){this.hitCount=0,this.weightedHitCount=0}_incrementNumHits(){this.hitCount+=1,this.weightedHitCount+=this.weightInv}simpleView(){return Object.assign(Object.create(null),{char:this.char,hits:this.hitCount})}}o.CMP=(e,t)=>e.weightedHitCount-t.weightedHitCount,Object.freeze(o),Object.freeze(o.prototype);class h extends i.a{constructor(e,t,r){if(super(),this.frontendDesc=h.GET_FRONTEND_DESC_BY_ID(e),this.treeMap=s.ParentNode.CREATE_TREE_MAP(t,r),this.leafNodes=this.treeMap.getLeafNodes(),this.leafNodes.length!==this.frontendDesc.numLeaves)throw new Error(`maintenance required: the frontend constant for the language "${this.frontendDesc.id}" needs to be updated to the correct, computed value, which is \`${this.leafNodes.length}\`.`)}get numLeaves(){return this.leafNodes.length}reset(){this.treeMap.reset()}getNonConflictingChar(e){this.leafNodes.sort(s.ParentNode.LEAF_CMP);let t=void 0;for(const r of this.leafNodes){const s=r.andNonRootParents();for(let t=0;te.startsWith(s[t].sequence));if(r){r===s[t].sequence?s.length=0:s.splice(t);break}}if(s.length){t=s[0];for(const e of s)e.personalWeightedHitCounte.status.noCheckGameOver||e.status.isDowned)){const e=1+n.filter(e=>e.elimOrder!==i.a.ElimOrder.STANDING).length;r.elimOrder=1+n.filter(e=>e.elimOrder!==i.a.ElimOrder.STANDING&&e.elimOrder!==i.a.ElimOrder.IMMORTAL).length,e===n.length&&this.player.game.statusBecomeOver()}}get isDowned(){return this.health<0}}s=new WeakMap,Object.freeze(o),Object.freeze(o.prototype)},function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));var s,i=function(e,t,r){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,r),r},n=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};class a{constructor(e,t){if(s.set(this,void 0),0===t.length)throw new Error("teams must have at least one member.");this.id=e,this.members=t,i(this,s,this.members.every(e=>e.status.noCheckGameOver)?a.ElimOrder.IMMORTAL:a.ElimOrder.STANDING)}reset(){this.elimOrder!==a.ElimOrder.IMMORTAL&&(this.elimOrder=a.ElimOrder.STANDING)}get elimOrder(){return n(this,s)}set elimOrder(e){if(this.elimOrder===a.ElimOrder.IMMORTAL)throw new Error("Cannot change the elimination status of an immortal team.");i(this,s,e)}}s=new WeakMap,function(e){let t;!function(e){e.IMMORTAL=-1,e.STANDING=0}(t=e.ElimOrder||(e.ElimOrder={}))}(a||(a={})),Object.freeze(a),Object.freeze(a.prototype)},function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));var s=r(2),i=r(7);r.d(t,"b",(function(){return i.a}));class n extends i.a{constructor(e,t){if(super(e,t),e.gameType===s.a.Type.ONLINE)throw new TypeError("OnlineGames should be using regular Players instead.")}_notifyGameNowPlaying(){this.delayedMovementContinue()}_notifyGameNowPaused(){this.game.cancelTimeout(this._scheduledMovementCallbackId),this._scheduledMovementCallbackId=void 0}_notifyGameNowOver(){this.game.cancelTimeout(this._scheduledMovementCallbackId),this._scheduledMovementCallbackId=void 0}movementContinue(){const e=this.computeDesiredDest();this._nextMovementTimerMultiplier=this.game.grid.tile.at(e).langSeq.length,this.makeMovementRequest(this.game.grid.getUntToward(e,this.coord),this.getNextMoveType()),this.delayedMovementContinue()}delayedMovementContinue(){this._scheduledMovementCallbackId=this.game.setTimeout(this.movementContinue.bind(this),this.computeNextMovementTimer()*this._nextMovementTimerMultiplier)}}!function(e){e.of=(t,r)=>{const s=r.familyId;return new e._Constructors[s](t,r)}}(n||(n={}))},function(e,t,r){},function(e,t,r){"use strict";var s;r.d(t,"a",(function(){return s})),function(e){e.EVENT_ID_REJECT=-1}(s||(s={})),Object.freeze(s)},function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));var s,i=function(e,t,r){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,r),r},n=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};class a{constructor(e){s.set(this,void 0),i(this,s,e),Object.freeze(this)}get _source(){return n(this,s)}at(...e){return n(this,s)._getTileAt(...e)}destsFrom(...e){return new o(n(this,s)._getTileDestsFrom(...e))}sourcesTo(...e){return new o(n(this,s)._getTileSourcesTo(...e))}}s=new WeakMap,Object.freeze(a),Object.freeze(a.prototype);class o{constructor(e){this.contents=e}get occupied(){return this.contents=this.contents.filter(e=>e.isOccupied),this}get unoccupied(){return this.contents=this.contents.filter(e=>!e.isOccupied),this}get get(){return this.contents}}Object.freeze(o),Object.freeze(o.prototype)},function(e,t,r){"use strict";r.d(t,"b",(function(){return n.a})),r.d(t,"e",(function(){return d})),r.d(t,"c",(function(){return f.a})),r.d(t,"f",(function(){return v.d})),r.d(t,"d",(function(){return _})),r.d(t,"a",(function(){return L}));var s,i,n=r(2),a=r(0),o=r(3),h=function(e,t,r){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,r),r},c=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};class d extends o.b{constructor(e){super(e),s.set(this,void 0);{const e=h(this,s,document.createElement("div"));e.setAttribute("aria-label","Tile"),e.classList.add(a.a.General.Class.CENTER_CONTENTS,a.a.General.Class.STACK_CONTENTS,a.a.Tile.Class.BASE)}{const e=document.createElement("div");e.setAttribute("aria-hidden","true"),e.classList.add(a.a.Tile.Class.POINTER_HB),c(this,s).appendChild(e)}{const e=document.createElement("div");e.setAttribute("role","presentation"),e.classList.add(a.a.Tile.Class.LANG_CHAR_WRAP);const t=this.langCharElem=document.createElement("div");e.appendChild(t),c(this,s).appendChild(e)}{const e=this.langSeqElem=document.createElement("div");e.setAttribute("role","tooltip"),e.classList.add(a.a.Tile.Class.LANG_SEQ),c(this,s).appendChild(e)}}_addToDom(e){e.appendChild(c(this,s))}_setOccupant(e,t){super._setOccupant(e,t),this.langCharElem.parentElement.insertAdjacentElement("beforebegin",t.playerElem),this.langSeqElem.textContent=t.username}evictOccupant(){super.evictOccupant(),this.langSeqElem.textContent=this.langSeq}set freeHealth(e){super.freeHealth=e,this.freeHealth>0?c(this,s).dataset[a.a.Tile.Dataset.HEALTH]=this.freeHealth.toString():delete c(this,s).dataset[a.a.Tile.Dataset.HEALTH]}get freeHealth(){return super.freeHealth}setLangCharSeqPair(e){super.setLangCharSeqPair(e),this.langCharElem.textContent=this.langChar,this.langSeqElem.textContent=this.langSeq}}s=new WeakMap,Object.freeze(d),Object.freeze(d.prototype),function(e){e.getImplementation=t=>e._Constructors[t]}(i||(i={}));class l{_superVisibleGrid(e,t){const r=a.a.Grid;t.setAttribute("role","presentation"),t.classList.add(r.Class.IMPL_BODY),t.dataset[r.Dataset.IMPL_COORD_SYS]=e.coordSys,this.baseElem=t;const s=document.createElement("div");s.classList.add(a.a.Player.Class.SHORT_SPOTLIGHT);const i=document.createElement("div");i.classList.add(a.a.Player.Class.LONG_SPOTLIGHT),this.spotlightElems=Object.freeze([s,i])}}Object.freeze(l),Object.freeze(l.prototype);var u,m,f=r(7),p=r(8),g=function(e,t,r){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,r),r},E=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};class y extends f.a{constructor(e,t){super(e,t),u.set(this,void 0),m.set(this,void 0),g(this,m,this.game.langFrontend.remapFunc)}reset(e){super.reset(e),this.prevCoord=e.coord,g(this,u,"")}processKeyboardInput(e){this.game.status===n.a.Status.PLAYING&&(this.requestInFlight||(" "===e.key?this.coord.equals(this.prevCoord)||this.makeMovementRequest(this.game.grid.getUntAwayFrom(this.prevCoord,this.coord),f.a.MoveType.BOOST):1!==e.key.length||e.repeat||this.seqBufferAcceptKey(e.key)))}seqBufferAcceptKey(e){const t=this.tile.destsFrom().unoccupied.get;if(0!==t.length)if(e){if(e=E(this,m).call(this,e),p.a.Seq.REGEXP.test(e)){for(let r=this.seqBuffer+e;r.length;r=r.substring(1)){const e=t.find(e=>e.langSeq.startsWith(r));if(e)return g(this,u,r),void(e.langSeq===r&&this.makeMovementRequest(e,f.a.MoveType.NORMAL))}g(this,u,""),this.status.visualBell()}}else{t.find(e=>e.langSeq.startsWith(this.seqBuffer))||g(this,u,"")}}moveTo(e){g(this,u,""),this.prevCoord=this.coord,super.moveTo(e)}_notifyWillBecomeCurrent(){this.status._notifyWillBecomeCurrent(this.game.grid.spotlightElems)}get seqBuffer(){return E(this,u)}}u=new WeakMap,m=new WeakMap,Object.freeze(y),Object.freeze(y.prototype);var w,b,v=r(1),O=r(10),T=function(e,t,r){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,r),r},C=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};class _ extends O.a{constructor(e,t){super(e,t),w.set(this,void 0),b.set(this,void 0);T(this,w,document.createElement("div")).classList.add(a.a.General.Class.CENTER_CONTENTS,a.a.General.Class.STACK_CONTENTS,a.a.Player.Class.BASE);{const e=document.createElement("div");e.classList.add(a.a.Player.Class.FACE),T(this,b,this.player.isALocalOperator?[e.animate({filter:["brightness(0.7)","brightness(1.0)"]},{duration:300,easing:"ease-in",delay:1}),e.animate({transform:_.makeWiggleAnimation(10,2)},{duration:270,easing:"ease-out",delay:1})]:[]).forEach(e=>e.pause());{const t=document.createElement("div");t.classList.add(a.a.Player.Class.DOWNED_OVERLAY),e.appendChild(t)}C(this,w).appendChild(e)}}_afterAllPlayersConstruction(){this._immigrantInfoCache=Object.freeze({playerElem:C(this,w),username:this.player.username})}reset(){super.reset();const e=a.a.Player.Dataset.DOWNED;C(this,w).dataset[e.KEY]=e.VALUES.NO}get immigrantInfo(){return this._immigrantInfoCache}_notifyWillBecomeCurrent(e){const t=this.player.game.currentOperator,r=this.player;requestAnimationFrame(r=>{e.forEach(e=>{C(this,w).appendChild(e)}),null==t||t.status.immigrantInfo.playerElem.scrollIntoView(v.c)}),r.teamId!==(null==t?void 0:t.teamId)&&r.game.players.forEach(e=>{const t=e.teamId===r.teamId;C(e.status,w).dataset[a.a.Player.Dataset.FACE_SWATCH]=e.isALocalOperator?t?"me":"meOppo":t?"teammate":"opponent"})}visualBell(){C(this,b),window.requestAnimationFrame(e=>{C(this,b).forEach(e=>e.play())})}get health(){return super.health}set health(e){const t=this.isDowned;if(super.health=e,t!==this.isDowned){const e=a.a.Player.Dataset.DOWNED;C(this,w).dataset[e.KEY]=this.isDowned?this.player.team.elimOrder?e.VALUES.TEAM:e.VALUES.SELF:e.VALUES.NO}}}w=new WeakMap,b=new WeakMap,function(e){var t,r,s;e.makeWiggleAnimation=function(e,t){const r=Array(2*t).fill(e);return r.unshift(0),r.push(0),r.map((e,t)=>`translate(${t%2?e:-e}%)`)};t=new WeakMap,r=new WeakMap,s=new WeakMap,e.Card=class{constructor(e){t.set(this,void 0),r.set(this,void 0),s.set(this,void 0),this.baseElem=document.createElement("div"),this.baseElem.setAttribute("label","Player"),T(this,t,document.createElement("div"));const i=C(this,t);i.textContent=e,this.baseElem.appendChild(i)}}}(_||(_={})),Object.freeze(_),Object.freeze(_.prototype);var I,M,A,N=r(15);class S{constructor(e){this.static=e.gridClass,this.dimensions=e.dimensions,this.tile=new N.a(this)}get area(){return this.static.getArea(this.dimensions)}reset(){this.forEachTile(e=>e.reset())}getRandomCoord(){return this.static.getRandomCoord(this.dimensions)}}(I=S||(S={})).getImplementation=e=>I._Constructors[e],function(e){class t extends o.a.Abstract.Mathy{constructor(e){super(e),this.x=e.x,this.y=e.y,Object.freeze(this)}equals(e){return this.x===e.x&&this.y===e.y}round(){return new t({x:Math.round(this.x),y:Math.round(this.y)})}oneNorm(e){return this.sub(e).originOneNorm()}originOneNorm(){return Math.abs(this.x)+Math.abs(this.y)}infNorm(e){return this.sub(e).originInfNorm()}originInfNorm(){return Math.max(Math.abs(this.x),Math.abs(this.y))}axialAlignment(e){return this.sub(e).originAxialAlignment()}originAxialAlignment(){return Math.abs(Math.abs(this.x)-Math.abs(this.y))/(Math.abs(this.x)+Math.abs(this.y))}add(e){return new t({x:this.x+e.x,y:this.y+e.y})}sub(e){return new t({x:this.x-e.x,y:this.y-e.y})}mul(e){return new t({x:e*this.x,y:e*this.y})}}e.Coord=t,Object.freeze(t),Object.freeze(t.prototype);class r extends S{constructor(e){super(e);const r=[];for(let s=0;sMath.random()-.5).forEach(t=>e(t))}getUntToward(e,t){const r=this.tile.destsFrom(t).unoccupied.get;if(0===r.length)return this.tile.at(t);if(1===r.length)return r[0];r.sort((t,r)=>t.coord.oneNorm(e)-r.coord.oneNorm(e)).sort((t,r)=>t.coord.infNorm(e)-r.coord.infNorm(e));for(let t=1;tr[0].coord.infNorm(e)){r.splice(t);break}if(1===r.length)return r[0];if(r[0].coord.x-t.x==0||r[0].coord.y-t.y==0){if(t.axialAlignment(t.sub(e))-.5>0)return r[0];r.shift()}return r[Math.floor(r.length*Math.random())]}getUntAwayFrom(e,t){return this.getUntToward(t.add(t.sub(e)),t)}getRandomCoordAround(e,r){return new t({x:e.x+Math.trunc(2*r*(Math.random()-.5)),y:e.y+Math.trunc(2*r*(Math.random()-.5))})}_getTileAt(e){if(e.x<0||e.x>=this.dimensions.width||e.y<0||e.y>=this.dimensions.height)throw new RangeError("Out of bounds. No such tile exists.");return this.grid[e.y][e.x]}_getTileDestsFrom(e,t=1){let r=e.y-t,s=e.y+t+1,i=e.x-t,n=e.x+t+1;return r>=this.dimensions.height||s<0||i>=this.dimensions.width||n<0?[]:this.grid.slice(Math.max(0,r),Math.min(this.dimensions.height,s)).flatMap(e=>e.slice(Math.max(0,i),Math.min(this.dimensions.width,n)))}_getTileSourcesTo(e,t=1){return this._getTileDestsFrom(e,t)}minMovesFromTo(e,t){return Math.min(Math.abs(t.x-e.x),Math.abs(t.y-e.y))}static getSpawnCoords(e,t){const s=[];return e.map(e=>{const i=[];for(;e>0;){let n;do{n=r.getRandomCoord(t)}while(s.find(e=>n.equals(e)));i.push(n),s.push(n),e--}return i})}static getArea(e){return e.height*e.width}static getRandomCoord(e){const r=Math.floor(e.width*Math.random()),s=Math.floor(e.height*Math.random());return new t({x:r,y:s})}}r.SIZE_LIMITS=Object.freeze({height:Object.freeze({min:11,max:51}),width:Object.freeze({min:11,max:51})}),e.Grid=r,function(e){class t extends e{constructor(e){super(e);const t=document.createElement("div");t.style.setProperty("--euclid2-grid-width",this.dimensions.width.toString());for(const e of this.grid)for(const r of e)r._addToDom(t);this._superVisibleGrid(e,t)}}e.Visible=t,Object(v.d)(t,[l]),Object.freeze(t),Object.freeze(t.prototype)}(r=e.Grid||(e.Grid={})),Object.freeze(r),Object.freeze(r.prototype)}(M||(M={})),Object.freeze(M),function(e){class t extends o.a.Abstract.Mathy{constructor(e){super(e),this.dash=e.dash,this.bash=e.bash,Object.freeze(this)}equals(e){return this.dash===e.dash&&this.bash===e.bash}round(){const e=Math.floor(this.dash),r=Math.floor(this.bash),s=e-this.dash,i=r-this.bash;return s>2*i?new t({dash:e+1,bash:r}):s<.5*i?new t({dash:e,bash:r+1}):Math.min(s,i)>.5?new t({dash:e+1,bash:r+1}):new t({dash:e,bash:r})}add(e){return new t({dash:this.dash+e.dash,bash:this.bash+e.bash})}sub(e){return new t({dash:this.dash-e.dash,bash:this.bash-e.bash})}mul(e){return new t({dash:e*this.dash,bash:e*this.bash})}}e.Coord=t,Object.freeze(t),Object.freeze(t.prototype);class r extends S{constructor(e){super(e);this.grid=Object.freeze(void 0)}static getAmbiguityThreshold(){return 18}static getSizeLimits(){return this.SIZE_LIMITS}forEachTile(e){for(const t of this.grid)for(const r of t)e(r)}shuffledForEachTile(e){this.grid.flat().sort((e,t)=>Math.random()-.5).forEach(t=>e(t))}getUntToward(e,t){}getUntAwayFrom(e,t){return this.getUntToward(t.add(t.sub(e)),t)}getRandomCoordAround(e,t){}_getTileAt(e){}_getTileDestsFrom(e){}_getTileSourcesTo(e){}minMovesFromTo(e,t){}static getSpawnCoords(e,t){}static getArea(e){const t=Math.min(e.fslash,e.bslash),r=Math.max(e.fslash,e.bslash),s=-1+e.dash+t;let i=2*t*(e.dash+s);return i+=(r-t-1)*s,i}static getRandomCoord(e){return new t(void 0)}}r.SIZE_LIMITS=Object.freeze({dash:Object.freeze({min:10,max:50}),bslash:Object.freeze({min:10,max:50}),fslash:Object.freeze({min:10,max:50})}),e.Grid=r,function(e){class t extends e{constructor(e){super(e);this._superVisibleGrid(e,void 0)}}e.Visible=t,Object(v.d)(t,[l]),Object.freeze(t),Object.freeze(t.prototype)}(r=e.Grid||(e.Grid={})),Object.freeze(r),Object.freeze(r.prototype)}(A||(A={})),Object.freeze(A);var P,j,z=r(12),R=function(e,t,r){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,r),r},D=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};class x extends z.a{constructor(e,t){super(e,t),P.set(this,void 0),this.behaviour=Object.freeze(Object.assign(Object.create(null),x.Behaviour.DEFAULT,t.familyArgs)),this.grid=this.game.grid}_afterAllPlayersConstruction(){super._afterAllPlayersConstruction(),this.threatProximity=this.game.teams.filter(e=>e.id!==this.teamId).flatMap(e=>e.members),this.targetProximity=this.threatProximity.slice()}reset(e){super.reset(e),R(this,P,this.coord)}moveTo(e){R(this,P,this.coord),super.moveTo(e)}computeDesiredDest(){this.threatProximity.sort((e,t)=>this.grid.minMovesFromTo(e.coord,this.coord)-this.grid.minMovesFromTo(t.coord,this.coord));for(const e of this.threatProximity){if(this.grid.minMovesFromTo(e.coord,this.coord)>this.behaviour.fearDistance)break;if(!e.status.isDowned&&e.status.health>this.status.health)return this.grid.getUntAwayFrom(e.coord,this.coord).coord}if(this.targetProximity.sort((e,t)=>this.grid.minMovesFromTo(this.coord,e.coord)-this.grid.minMovesFromTo(this.coord,t.coord)),this.status.isDowned)for(const e of this.targetProximity){if(this.grid.minMovesFromTo(this.coord,e.coord)>this.behaviour.bloodThirstDistance)break;if(e.status.healthe.isALocalOperator)),this.setCurrentOperator(0);{const e=[];if(this.players.forEach(t=>{e[t.teamId]||(e[t.teamId]=[]),e[t.teamId].push(t)}),this.teams=e.map((e,t)=>new c.b(t,e)),this.teams.every(e=>e.id===c.b.ElimOrder.IMMORTAL))throw new Error("All teams are immortal. The game will never end.")}this.players.forEach(e=>e._afterAllPlayersConstruction())}reset(){return this.grid.reset(),d(this,n,a.a.Status.PAUSED),Promise.resolve()}createPlayers(e){const t=e.playerDescs=this.gameType===a.a.Type.ONLINE?e.playerDescs:c.a.CtorArgs.finalize(e.playerDescs);return Object.freeze(t.map(e=>e.familyId===c.a.Family.HUMAN?e.isALocalOperator?this._createOperatorPlayer(e):new c.a(this,e):this._createArtifPlayer(e)))}serializeResetState(){const e=[],t=this.players.map(e=>e.coord),r=[];return this.grid.forEachTile(t=>{e.push({char:t.langChar,seq:t.langSeq}),t.freeHealth&&r.push({coord:t.coord,health:t.freeHealth})}),{csps:e,playerCoords:t,healthCoords:r}}deserializeResetState(e){{let t=0;this.grid.forEachTile(r=>{r.setLangCharSeqPair(e.csps[t++]),r.lastKnownUpdateId=1})}e.playerCoords.forEach((e,t)=>{this.players[t].moveTo(this.grid.tile.at(e))}),e.healthCoords.forEach(e=>{this.grid.tile.at(e.coord).freeHealth=e.health})}get currentOperator(){return l(this,i)}setCurrentOperator(e){const t=this.operators[e];t&&this.currentOperator!==t&&(t._notifyWillBecomeCurrent(),d(this,i,t))}get status(){return l(this,n)}statusBecomePlaying(){if(this.status!==a.a.Status.PLAYING){if(this.status!==a.a.Status.PAUSED)throw new Error("Can only resume a game that is currently paused.");this.players.forEach(e=>{e._notifyGameNowPlaying()}),this._abstractStatusBecomePlaying(),d(this,n,a.a.Status.PLAYING)}else console.log("[statusBecomePlaying]: Game is already playing")}statusBecomePaused(){if(this.status!==a.a.Status.PAUSED){if(this.status!==a.a.Status.PLAYING)throw new Error("Can only pause a game that is currently playing.");this.players.forEach(e=>{e._notifyGameNowPaused()}),this._abstractStatusBecomePaused(),d(this,n,a.a.Status.PAUSED)}else console.log("[statusBecomePaused]: Game is already paused")}statusBecomeOver(){if(this.status!==a.a.Status.PLAYING)throw new Error("Can only end a game that is currently playing.");this.players.forEach(e=>{e._notifyGameNowOver()}),this._abstractStatusBecomeOver(),d(this,n,a.a.Status.OVER),l(this,s).call(this),console.log("game is over!")}_abstractStatusBecomePlaying(){}_abstractStatusBecomePaused(){}_abstractStatusBecomeOver(){}}s=new WeakMap,i=new WeakMap,n=new WeakMap,Object.freeze(u),Object.freeze(u.prototype);var m,f=function(e,t,r){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,r),r},p=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};class g extends u{constructor(e,t,r){super(e,t,r),m.set(this,void 0),this.eventRecordBitmap=[]}reset(){const e=super.reset();return this.eventRecordBitmap.fill(!1,0,a.a.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH),f(this,m,0),e}get nextUnusedEventId(){return p(this,m)}_recordEvent(e){const t=e.eventId,r=t%a.a.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH;if(t===o.a.EVENT_ID_REJECT)throw new TypeError("Do not try to record events for rejected requests.");if(t<0||t!==Math.trunc(t))throw new RangeError("Event ID's must only be assigned positive, integer values.");if(this.eventRecordBitmap[r])throw new Error("Event ID's must be assigned unique values.");this.eventRecordBitmap[r]=!0,this.eventRecordBitmap[(t+a.a.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH-a.a.K.EVENT_RECORD_FORWARD_WINDOW_LENGTH)%a.a.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH]=!1,f(this,m,+p(this,m)+1)}executeTileModEvent(e,t=!0){Object.freeze(e);const r=this.grid.tile.at(e.coord);if(r.lastKnownUpdateId>e.lastKnownUpdateId)return r;if(r.lastKnownUpdateId===e.lastKnownUpdateId)throw new Error("never.");return e.newCharSeqPair&&(r.setLangCharSeqPair(e.newCharSeqPair),t&&this.operators.filter(e=>e.tile.destsFrom().get.includes(r)).forEach(e=>e.seqBufferAcceptKey(""))),r.lastKnownUpdateId=e.lastKnownUpdateId,r.freeHealth=e.newFreeHealth,r}executePlayerMoveEvent(e){var t;const r=this.players[e.playerId],s=e.playerLastAcceptedRequestId-r.lastAcceptedRequestId;if(e.eventId===o.a.EVENT_ID_REJECT)return void(0===s&&(r.requestInFlight=!1));this._recordEvent(e);const i=this.executeTileModEvent(e.destModDesc,r!==this.currentOperator);if(null===(t=e.tileHealthModDescs)||void 0===t||t.forEach(e=>{this.executeTileModEvent(e)}),s>1){if(r===this.currentOperator)throw new Error("This never happens. See comment in source.")}else{if(r.requestInFlight=!1,!(r===this.currentOperator?1===s:s<=1))throw new Error("This never happens. See comment in source");r.status.health=e.newPlayerHealth.health,r.moveTo(i),r.lastAcceptedRequestId=e.playerLastAcceptedRequestId}}executePlayerBubbleEvent(e){this.players[e.playerId].requestInFlight=!1,e.eventId!==o.a.EVENT_ID_REJECT&&this._recordEvent(e)}}m=new WeakMap,Object.freeze(g),Object.freeze(g.prototype)}]]); +(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[0],[,,,,,,,,function(e,t,s){"use strict";s.d(t,"b",(function(){return c.a})),s.d(t,"a",(function(){return l}));var r,i=s(10),a=s(0),o=s(1),n=s(16);class h extends o.b{constructor(e,t){if(super(),r.set(this,void 0),Math.trunc(t.playerId)!==t.playerId)throw RangeError("Player ID's must be integer values.");this.playerId=t.playerId,this.isALocalOperator=t.isALocalOperator,this.game=e,this.status=new this.game._playerStatusCtor(this,t.noCheckGameOver),this.tile=new n.a(new h.TileGetterSource(this))}_afterAllPlayersConstruction(){this.status._afterAllPlayersConstruction()}reset(e){Object(a.c)(this,r,e),this.hostTile._setOccupant(this.playerId,this.status.immigrantInfo)}get coord(){return this.hostTile.coord}get hostTile(){return Object(a.b)(this,r)}moveTo(e){if(this.hostTile.occupantId!==this.playerId){if("ONLINE"!==this.game.gameType)throw Error("Linkage between player and occupied tile disagrees.")}else this.hostTile.evictOccupant();if(e.isOccupied){if("ONLINE"!==this.game.gameType)throw Error("Only one player can occupy a tile at a time.")}else Object(a.c)(this,r,e),e._setOccupant(this.playerId,this.status.immigrantInfo)}}r=new WeakMap,function(e){var t,s;class r{constructor(e){t.set(this,void 0),s.set(this,void 0),Object(a.c)(this,t,e),Object(a.c)(this,s,e.game.grid.tile._source)}_getTileAt(){return Object(a.b)(this,s)._getTileAt(Object(a.b)(this,t).coord)}_getTileDestsFrom(){return Object(a.b)(this,s)._getTileDestsFrom(Object(a.b)(this,t).coord)}_getTileSourcesTo(){return Object(a.b)(this,s)._getTileSourcesTo(Object(a.b)(this,t).coord)}}t=new WeakMap,s=new WeakMap,e.TileGetterSource=r,Object.freeze(r),Object.freeze(r.prototype)}(h||(h={})),Object.freeze(h),Object.freeze(h.prototype);s(11);var c=s(12);class l extends h{constructor(e,t){var s;super(e,t),this.familyId=t.familyId,this.teamId=t.teamId,this.username=t.username,this.avatar=null!==(s=t.avatar)&&void 0!==s?s:l.Avatar.GET_RANDOM()}reset(e){super.reset(e),this.status.reset(),this.lastAcceptedRequestId=i.a.INITIAL_REQUEST_ID,this.requestInFlight=!1}_notifyGameNowPlaying(){}_notifyGameNowPaused(){}_notifyGameNowOver(){}makeMovementRequest(e,t){if("PLAYING"!==this.game.status)throw Error("This is not a necessary precondition, but we're doing it anyway.");if(this.requestInFlight)throw Error("Only one request should ever be in flight at a time.");this.requestInFlight=!0,this.game.processMoveRequest(new i.a.Movement(this.playerId,this.lastAcceptedRequestId,e,t))}get team(){return this.game.teams[this.teamId]}isTeamedWith(e){return this.team.members.includes(e)}}!function(e){let t;!function(e){e.finalize=function(e){const t=Array.from(new Set(e.map(e=>e.teamId))).sort((e,t)=>e-t).reduce((e,t,s)=>(e[t]=s,e),[]);return e.slice().sort((e,s)=>t[e.teamId]-t[s.teamId]).map((e,s)=>Object.assign({},e,{playerId:s,teamId:t[e.teamId]}))}}(t=e.CtorArgs||(e.CtorArgs={})),Object.freeze(t)}(l||(l={})),Object.freeze(l),Object.freeze(l.prototype)},function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var r,i=s(1),a=s(0);!function(e){var t,s;class r{constructor(){this.children=[]}reset(){this.inheritingWeightedHitCount=0,this.children.forEach(e=>e.reset())}_finalize(){Object.freeze(this.children),this.children.forEach(e=>e._finalize())}_addCharMapping(e,t){if(!i.a.Seq.REGEXP.test(e))throw RangeError(`Mapping-sequence "${e}" did not match the required regular expression "${i.a.Seq.REGEXP.source}".`);if(0===t.length)throw"never";let s=this;{let t=this;for(;t;)s=t,t=t.children.find(t=>e.startsWith(t.sequence))}if(s.sequence===e)throw Error(`Mappings for all written-characters with a commoncorresponding typeable-sequence should be registered together,but an existing mapping for the sequence "${e}" was found.`);s.children.push(new n(s,e,t))}getLeafNodes(){const e=[];return this._recursiveGetLeafNodes(e),e}_recursiveGetLeafNodes(e){this.children.length?this.children.forEach(t=>{t._recursiveGetLeafNodes(e)}):e.push(this)}simpleView(){return this.children}static CREATE_TREE_MAP(e,t){const s=Object.values(e).reduce((e,t)=>e+t.weight,0),i=0===t?e=>1:1===t?e=>e:e=>Math.pow(e/s,t),a=new Map;for(const t in e){const s=e[t].seq,r=new o(t,i(e[t].weight)),n=a.get(s);n?n.push(r):a.set(s,[r])}const n=new r;return Array.from(a).sort((e,t)=>e[0].length-t[0].length).forEach(e=>{n._addCharMapping(...e)}),n._finalize(),n}}r.LEAF_CMP=(e,t)=>e.inheritingWeightedHitCount-t.inheritingWeightedHitCount,e.ParentNode=r,Object.freeze(r),Object.freeze(r.prototype);class n extends r{constructor(e,r,i){super(),t.set(this,void 0),s.set(this,void 0),this.sequence=r,Object(a.c)(this,s,i),Object(a.c)(this,t,e)}_finalize(){Object.freeze(Object(a.b)(this,s)),super._finalize()}reset(){super.reset(),Object(a.b)(this,s).forEach(e=>{e.reset(),this.incrementNumHits(e,Math.random()*i.a.CHAR_HIT_COUNT_SEED_CEILING)})}chooseOnePair(){const e=Object(a.b)(this,s).slice(0).sort(o.CMP).shift(),t={char:e.char,seq:this.sequence};return this.incrementNumHits(e),t}incrementNumHits(e,t=1){e._incrementNumHits(),this._recursiveIncrementNumHits(e.weightInv*t)}_recursiveIncrementNumHits(e){this.inheritingWeightedHitCount+=e,this.children.forEach(t=>t._recursiveIncrementNumHits(e))}get personalWeightedHitCount(){return this.inheritingWeightedHitCount-Object(a.b)(this,t).inheritingWeightedHitCount}andNonRootParents(){const e=[];for(let s=this;s instanceof n;s=Object(a.b)(s,t))e.push(s);return e}simpleView(){let e=Object(a.b)(this,s).map(e=>e.simpleView());return Object.assign(Object.create(null),{seq:this.sequence,chars:1===e.length?e[0]:e,kids:this.children.map(e=>e.simpleView())})}}t=new WeakMap,s=new WeakMap,n.PATH_CMP=(e,t)=>e.personalWeightedHitCount-t.personalWeightedHitCount,e.ChildNode=n,Object.freeze(n),Object.freeze(n.prototype)}(r||(r={})),Object.freeze(r);class o{constructor(e,t){if(t<=0)throw RangeError(`All weights must be positive, but we were passed the value "${t}" for the character "${e}".`);this.char=e,this.weightInv=1/t}reset(){this.hitCount=0,this.weightedHitCount=0}_incrementNumHits(){this.hitCount+=1,this.weightedHitCount+=this.weightInv}simpleView(){return Object.assign(Object.create(null),{char:this.char,hits:this.hitCount})}}o.CMP=(e,t)=>e.weightedHitCount-t.weightedHitCount,Object.freeze(o),Object.freeze(o.prototype);class n extends i.a{constructor(e,t,s){if(super(),this.frontendDesc=n.GET_FRONTEND_DESC_BY_ID(e),this.treeMap=r.ParentNode.CREATE_TREE_MAP(t,s),this.leafNodes=this.treeMap.getLeafNodes(),this.leafNodes.length!==this.frontendDesc.numLeaves)throw Error(`maintenance required: the frontend constant for the language "${this.frontendDesc.id}" needs to be updated to the correct, computed value, which is \`${this.leafNodes.length}\`.`)}get numLeaves(){return this.leafNodes.length}reset(){this.treeMap.reset()}getNonConflictingChar(e){this.leafNodes.sort(r.ParentNode.LEAF_CMP);let t=void 0;for(const s of this.leafNodes){const r=s.andNonRootParents();for(let t=0;te.startsWith(r[t].sequence));if(s){s===r[t].sequence?r.length=0:r.splice(t);break}}if(r.length){t=r[0];for(const e of r)e.personalWeightedHitCounte.status.noCheckGameOver||e.status.isDowned)){const e=1+o.filter(e=>e.elimOrder!==a.a.ElimOrder.STANDING).length;s.elimOrder=1+o.filter(e=>e.elimOrder!==a.a.ElimOrder.STANDING&&e.elimOrder!==a.a.ElimOrder.IMMORTAL).length,e===o.length&&this.player.game.statusBecomeOver()}}get isDowned(){return this.health<0}}r=new WeakMap,Object.freeze(o),Object.freeze(o.prototype)},function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var r,i=s(0);class a{constructor(e,t){if(r.set(this,void 0),0===t.length)throw Error("Teams must have at least one member.");this.id=e,this.members=t,Object(i.c)(this,r,this.members.every(e=>e.status.noCheckGameOver)?a.ElimOrder.IMMORTAL:a.ElimOrder.STANDING)}reset(){this.elimOrder!==a.ElimOrder.IMMORTAL&&(this.elimOrder=a.ElimOrder.STANDING)}get elimOrder(){return Object(i.b)(this,r)}set elimOrder(e){if(this.elimOrder===a.ElimOrder.IMMORTAL)throw Error("Cannot change the elimination status of an immortal team.");Object(i.c)(this,r,e)}}r=new WeakMap,function(e){let t;!function(e){e.IMMORTAL=-1,e.STANDING=0}(t=e.ElimOrder||(e.ElimOrder={}))}(a||(a={})),Object.freeze(a),Object.freeze(a.prototype)},function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));var r=s(8);s.d(t,"b",(function(){return r.a}));class i extends r.a{constructor(e,t){if(super(e,t),"ONLINE"===e.gameType)throw TypeError("OnlineGames should be using regular Players instead.")}_notifyGameNowPlaying(){this.delayedMovementContinue()}_notifyGameNowPaused(){this.game.cancelTimeout(this._scheduledMovementCallbackId),this._scheduledMovementCallbackId=void 0}_notifyGameNowOver(){this.game.cancelTimeout(this._scheduledMovementCallbackId),this._scheduledMovementCallbackId=void 0}movementContinue(){const e=this.computeDesiredDest();this._nextMovementTimerMultiplier=this.game.grid.tile.at(e).langSeq.length,this.makeMovementRequest(this.game.grid.getUntToward(e,this.coord),this.getNextMoveType()),this.delayedMovementContinue()}delayedMovementContinue(){this._scheduledMovementCallbackId=this.game.setTimeout(this.movementContinue.bind(this),this.computeNextMovementTimer()*this._nextMovementTimerMultiplier)}}!function(e){e.of=(t,s)=>{const r=s.familyId;return new e._Constructors[r](t,s)}}(i||(i={}))},function(e,t,s){},function(e,t,s){"use strict";var r;s.d(t,"a",(function(){return r})),function(e){e.EVENT_ID_REJECT=-1}(r||(r={})),Object.freeze(r)},function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var r,i=s(0);class a{constructor(e){r.set(this,void 0),Object(i.c)(this,r,e),Object.freeze(this)}get _source(){return Object(i.b)(this,r)}at(...e){return Object(i.b)(this,r)._getTileAt(...e)}destsFrom(...e){return new o(Object(i.b)(this,r)._getTileDestsFrom(...e))}sourcesTo(...e){return new o(Object(i.b)(this,r)._getTileSourcesTo(...e))}}r=new WeakMap,Object.freeze(a),Object.freeze(a.prototype);class o{constructor(e){this.contents=e}get occupied(){return this.contents=this.contents.filter(e=>e.isOccupied),this}get unoccupied(){return this.contents=this.contents.filter(e=>!e.isOccupied),this}get get(){return this.contents}}Object.freeze(o),Object.freeze(o.prototype)},function(e,t,s){"use strict";s.d(t,"b",(function(){return a.a})),s.d(t,"e",(function(){return c})),s.d(t,"c",(function(){return m.a})),s.d(t,"f",(function(){return O.d})),s.d(t,"d",(function(){return E})),s.d(t,"a",(function(){return N}));var r,i,a=s(3),o=s(0),n=s(2),h=s(4);class c extends h.b{constructor(e){super(e),r.set(this,void 0);{const e=Object(o.c)(this,r,document.createElement("div"));e.setAttribute("aria-label","Tile"),e.classList.add(n.a.General.Class.CENTER_CONTENTS,n.a.General.Class.STACK_CONTENTS,n.a.Tile.Class.BASE)}{const e=document.createElement("div");e.setAttribute("aria-hidden","true"),e.classList.add(n.a.Tile.Class.POINTER_HB),Object(o.b)(this,r).appendChild(e)}{const e=document.createElement("div");e.setAttribute("role","presentation"),e.classList.add(n.a.Tile.Class.LANG_CHAR_WRAP);const t=this.langCharElem=document.createElement("div");e.appendChild(t),Object(o.b)(this,r).appendChild(e)}{const e=this.langSeqElem=document.createElement("div");e.setAttribute("role","tooltip"),e.classList.add(n.a.Tile.Class.LANG_SEQ),Object(o.b)(this,r).appendChild(e)}}_addToDom(e){e.appendChild(Object(o.b)(this,r))}_setOccupant(e,t){super._setOccupant(e,t),this.langCharElem.parentElement.insertAdjacentElement("beforebegin",t.playerElem),this.langSeqElem.textContent=t.username}evictOccupant(){super.evictOccupant(),this.langSeqElem.textContent=this.langSeq}set freeHealth(e){super.freeHealth=e,this.freeHealth>0?Object(o.b)(this,r).dataset[n.a.Tile.Dataset.HEALTH]=this.freeHealth.toString():delete Object(o.b)(this,r).dataset[n.a.Tile.Dataset.HEALTH]}get freeHealth(){return super.freeHealth}setLangCharSeqPair(e){super.setLangCharSeqPair(e),this.langCharElem.textContent=this.langChar,this.langSeqElem.textContent=this.langSeq}}r=new WeakMap,Object.freeze(c),Object.freeze(c.prototype),function(e){e.getImplementation=t=>e._Constructors[t]}(i||(i={}));class l{_superVisibleGrid(e,t){const s=n.a.Grid;t.setAttribute("role","presentation"),t.classList.add(s.Class.IMPL_BODY),t.dataset[s.Dataset.IMPL_COORD_SYS]=e.coordSys,this.baseElem=t;const r=document.createElement("div");r.classList.add(n.a.Player.Class.SHORT_SPOTLIGHT);const i=document.createElement("div");i.classList.add(n.a.Player.Class.LONG_SPOTLIGHT),this.spotlightElems=Object.freeze([r,i])}}Object.freeze(l),Object.freeze(l.prototype);var d,u,m=s(8),f=s(9);class p extends m.a{constructor(e,t){super(e,t),d.set(this,void 0),u.set(this,void 0),Object(o.c)(this,u,this.game.langFrontend.remapFunc)}reset(e){super.reset(e),this.prevCoord=e.coord,Object(o.c)(this,d,"")}processKeyboardInput(e){"PLAYING"===this.game.status&&(this.requestInFlight||(" "===e.key?h.a.equals(this.coord,this.prevCoord)||this.makeMovementRequest(this.game.grid.getUntAwayFrom(this.prevCoord,this.coord),m.a.MoveType.BOOST):1!==e.key.length||e.repeat||this.seqBufferAcceptKey(e.key)))}seqBufferAcceptKey(e){const t=this.tile.destsFrom().unoccupied.get;if(0!==t.length)if(e){if(e=Object(o.b)(this,u).call(this,e),f.a.Seq.REGEXP.test(e)){for(let s=this.seqBuffer+e;s.length;s=s.substring(1)){const e=t.find(e=>e.langSeq.startsWith(s));if(e)return Object(o.c)(this,d,s),void(e.langSeq===s&&this.makeMovementRequest(e,m.a.MoveType.NORMAL))}Object(o.c)(this,d,""),this.status.visualBell()}}else{t.find(e=>e.langSeq.startsWith(this.seqBuffer))||Object(o.c)(this,d,"")}}moveTo(e){Object(o.c)(this,d,""),this.prevCoord=this.coord,super.moveTo(e)}_notifyWillBecomeCurrent(){this.status._notifyWillBecomeCurrent(this.game.grid.spotlightElems)}get seqBuffer(){return Object(o.b)(this,d)}}d=new WeakMap,u=new WeakMap,Object.freeze(p),Object.freeze(p.prototype);var b,g,O=s(1),y=s(11);class E extends y.a{constructor(e,t){super(e,t),b.set(this,void 0),g.set(this,void 0);Object(o.c)(this,b,document.createElement("div")).classList.add(n.a.General.Class.CENTER_CONTENTS,n.a.General.Class.STACK_CONTENTS,n.a.Player.Class.BASE);{const e=document.createElement("div");e.classList.add(n.a.Player.Class.FACE);Object(o.c)(this,g,this.player.isALocalOperator?[e.animate({filter:["brightness(0.7)","brightness(1.0)"]},{duration:300,easing:"ease-in",delay:1}),e.animate({transform:E.makeWiggleAnimation(10,2)},{duration:270,easing:"ease-out",delay:1})]:[]).forEach(e=>e.pause());{const t=document.createElement("div");t.classList.add(n.a.Player.Class.DOWNED_OVERLAY),e.appendChild(t)}Object(o.b)(this,b).appendChild(e)}}_afterAllPlayersConstruction(){this._immigrantInfoCache=Object.freeze({playerElem:Object(o.b)(this,b),username:this.player.username})}reset(){super.reset();const e=n.a.Player.Dataset.DOWNED;Object(o.b)(this,b).dataset[e.KEY]=e.VALUES.NO}get immigrantInfo(){return this._immigrantInfoCache}_notifyWillBecomeCurrent(e){const t=this.player.game.currentOperator,s=this.player;requestAnimationFrame(t=>{e.forEach(e=>{Object(o.b)(this,b).appendChild(e)}),s.status.immigrantInfo.playerElem.scrollIntoView(O.c)}),s.teamId!==(null==t?void 0:t.teamId)&&s.game.players.forEach(e=>{const t=e.teamId===s.teamId;Object(o.b)(e.status,b).dataset[n.a.Player.Dataset.FACE_SWATCH]=e.isALocalOperator?t?"me":"meOppo":t?"teammate":"opponent"})}visualBell(){Object(o.b)(this,g),window.requestAnimationFrame(e=>{Object(o.b)(this,g).forEach(e=>e.play())})}get health(){return super.health}set health(e){const t=this.isDowned;if(super.health=e,t!==this.isDowned){const e=n.a.Player.Dataset.DOWNED;Object(o.b)(this,b).dataset[e.KEY]=this.isDowned?this.player.team.elimOrder?e.VALUES.TEAM:e.VALUES.SELF:e.VALUES.NO}}}b=new WeakMap,g=new WeakMap,function(e){var t,s,r;e.makeWiggleAnimation=function(e,t){const s=Array(2*t).fill(e);return s.unshift(0),s.push(0),s.map((e,t)=>`translate(${t%2?e:-e}%)`)};t=new WeakMap,s=new WeakMap,r=new WeakMap,e.Card=class{constructor(e){t.set(this,void 0),s.set(this,void 0),r.set(this,void 0),this.baseElem=document.createElement("div"),this.baseElem.setAttribute("label","Player"),Object(o.c)(this,t,document.createElement("div"));const i=Object(o.b)(this,t);i.textContent=e,this.baseElem.appendChild(i)}}}(E||(E={})),Object.freeze(E),Object.freeze(E.prototype);var v,T,j,w=s(16);class C{constructor(e){this.static=e.gridClass,this.dimensions=e.dimensions,this.tile=new w.a(this)}get area(){return this.static.getArea(this.dimensions)}reset(){this.forEachTile(e=>e.reset())}getRandomCoord(){return this.static.getRandomCoord(this.dimensions)}}(v=C||(C={})).getImplementation=e=>v._Constructors[e],function(e){class t{constructor(e){this.x=e.x,this.y=e.y,Object.freeze(this)}_equals(e){return this.x===e.x&&this.y===e.y}round(){return new t({x:Math.round(this.x),y:Math.round(this.y)})}oneNorm(e){return this.sub(e).originOneNorm()}originOneNorm(){return Math.abs(this.x)+Math.abs(this.y)}infNorm(e){return this.sub(e).originInfNorm()}originInfNorm(){return Math.max(Math.abs(this.x),Math.abs(this.y))}axialAlignment(e){return this.sub(e).originAxialAlignment()}originAxialAlignment(){return Math.abs(Math.abs(this.x)-Math.abs(this.y))/(Math.abs(this.x)+Math.abs(this.y))}add(e){return new t({x:this.x+e.x,y:this.y+e.y})}sub(e){return new t({x:this.x-e.x,y:this.y-e.y})}mul(e){return new t({x:e*this.x,y:e*this.y})}}e.Coord=t,Object.freeze(t),Object.freeze(t.prototype);class s extends C{constructor(e){super(e);const s=[];for(let r=0;rMath.random()-.5).forEach(t=>e(t))}getUntToward(e,t){const s=this.tile.destsFrom(t).unoccupied.get;if(0===s.length)return this.tile.at(t);if(1===s.length)return s[0];s.sort((t,s)=>t.coord.oneNorm(e)-s.coord.oneNorm(e)).sort((t,s)=>t.coord.infNorm(e)-s.coord.infNorm(e));for(let t=1;ts[0].coord.infNorm(e)){s.splice(t);break}if(1===s.length)return s[0];if(s[0].coord.x-t.x==0||s[0].coord.y-t.y==0){if(t.axialAlignment(t.sub(e))-.5>0)return s[0];s.shift()}return s[Math.floor(s.length*Math.random())]}getUntAwayFrom(e,t){return this.getUntToward(t.add(t.sub(e)),t)}getRandomCoordAround(e,s){return new t({x:e.x+Math.trunc(2*s*(Math.random()-.5)),y:e.y+Math.trunc(2*s*(Math.random()-.5))})}_getTileAt(e){return this.grid[e.y][e.x]}_getTileDestsFrom(e,t=1){let s=e.y-t,r=e.y+t+1,i=e.x-t,a=e.x+t+1;return s>=this.dimensions.height||r<0||i>=this.dimensions.width||a<0?[]:this.grid.slice(Math.max(0,s),Math.min(this.dimensions.height,r)).flatMap(e=>e.slice(Math.max(0,i),Math.min(this.dimensions.width,a)))}_getTileSourcesTo(e,t=1){return this._getTileDestsFrom(e,t)}minMovesFromTo(e,t){return Math.min(Math.abs(t.x-e.x),Math.abs(t.y-e.y))}static getSpawnCoords(e,t){const r=[];return e.map(e=>{const i=[];for(;e>0;){let a;do{a=s.getRandomCoord(t)}while(r.find(e=>a._equals(e)));i.push(a),r.push(a),e--}return i})}static getArea(e){return e.height*e.width}static getRandomCoord(e){const s=Math.floor(e.width*Math.random()),r=Math.floor(e.height*Math.random());return new t({x:s,y:r})}}s.SIZE_LIMITS=Object.freeze({height:Object.freeze({min:11,max:51}),width:Object.freeze({min:11,max:51})}),e.Grid=s,function(e){class t extends e{constructor(e){super(e);const t=document.createElement("div");t.style.setProperty("--euclid2-grid-width",this.dimensions.width.toString());for(const e of this.grid)for(const s of e)s._addToDom(t);this._superVisibleGrid(e,t)}}e.Visible=t,Object(O.d)(t,[l]),Object.freeze(t),Object.freeze(t.prototype)}(s=e.Grid||(e.Grid={})),Object.freeze(s),Object.freeze(s.prototype)}(T||(T={})),Object.freeze(T),function(e){class t{constructor(e){this.dash=e.dash,this.bash=e.bash,Object.freeze(this)}_equals(e){return this.dash===e.dash&&this.bash===e.bash}round(){const e=Math.floor(this.dash),s=Math.floor(this.bash),r=e-this.dash,i=s-this.bash;return r>2*i?new t({dash:e+1,bash:s}):r<.5*i?new t({dash:e,bash:s+1}):Math.min(r,i)>.5?new t({dash:e+1,bash:s+1}):new t({dash:e,bash:s})}add(e){return new t({dash:this.dash+e.dash,bash:this.bash+e.bash})}sub(e){return new t({dash:this.dash-e.dash,bash:this.bash-e.bash})}mul(e){return new t({dash:e*this.dash,bash:e*this.bash})}}e.Coord=t,Object.freeze(t),Object.freeze(t.prototype);class s extends C{constructor(e){super(e);this.grid=Object.freeze(void 0)}static getAmbiguityThreshold(){return 18}static getSizeLimits(){return this.SIZE_LIMITS}forEachTile(e){let t=0;for(const s of this.grid)for(const r of s)e(r,t++)}shuffledForEachTile(e){this.grid.flat().sort((e,t)=>Math.random()-.5).forEach(t=>e(t))}getUntToward(e,t){}getUntAwayFrom(e,t){return this.getUntToward(t.add(t.sub(e)),t)}getRandomCoordAround(e,t){}_getTileAt(e){}_getTileDestsFrom(e){}_getTileSourcesTo(e){}minMovesFromTo(e,t){}static getSpawnCoords(e,t){}static getArea(e){const t=Math.min(e.fslash,e.bslash),s=Math.max(e.fslash,e.bslash),r=-1+e.dash+t;let i=2*t*(e.dash+r);return i+=(s-t-1)*r,i}static getRandomCoord(e){return new t(void 0)}}s.SIZE_LIMITS=Object.freeze({dash:Object.freeze({min:10,max:50}),bslash:Object.freeze({min:10,max:50}),fslash:Object.freeze({min:10,max:50})}),e.Grid=s,function(e){class t extends e{constructor(e){super(e);this._superVisibleGrid(e,void 0)}}e.Visible=t,Object(O.d)(t,[l]),Object.freeze(t),Object.freeze(t.prototype)}(s=e.Grid||(e.Grid={})),Object.freeze(s),Object.freeze(s.prototype)}(j||(j={})),Object.freeze(j);var _,I,M=s(13);class A extends M.a{constructor(e,t){super(e,t),_.set(this,void 0),this.behaviour=Object.freeze(Object.assign(Object.create(null),A.Behaviour.DEFAULT,t.familyArgs)),this.grid=this.game.grid}_afterAllPlayersConstruction(){super._afterAllPlayersConstruction(),this.threatProximity=this.game.teams.filter(e=>e.id!==this.teamId).flatMap(e=>e.members),this.targetProximity=this.threatProximity.slice()}reset(e){super.reset(e),Object(o.c)(this,_,this.coord)}moveTo(e){Object(o.c)(this,_,this.coord),super.moveTo(e)}computeDesiredDest(){this.threatProximity.sort((e,t)=>this.grid.minMovesFromTo(e.coord,this.coord)-this.grid.minMovesFromTo(t.coord,this.coord));for(const e of this.threatProximity){if(this.grid.minMovesFromTo(e.coord,this.coord)>this.behaviour.fearDistance)break;if(!e.status.isDowned&&e.status.health>this.status.health)return this.grid.getUntAwayFrom(e.coord,this.coord).coord}if(this.targetProximity.sort((e,t)=>this.grid.minMovesFromTo(this.coord,e.coord)-this.grid.minMovesFromTo(this.coord,t.coord)),this.status.isDowned)for(const e of this.targetProximity){if(this.grid.minMovesFromTo(this.coord,e.coord)>this.behaviour.bloodThirstDistance)break;if(e.status.healthe.isALocalOperator)),this.setCurrentOperator(0);{const e=[];if(this.players.forEach(t=>{e[t.teamId]||(e[t.teamId]=[]),e[t.teamId].push(t)}),this.teams=e.map((e,t)=>new d.b(t,e)),this.teams.every(e=>e.id===d.b.ElimOrder.IMMORTAL))throw Error("All teams are immortal. The game will never end.")}this.players.forEach(e=>e._afterAllPlayersConstruction())}reset(){return this.grid.reset(),Object(n.c)(this,a,"PAUSED"),Promise.resolve()}createPlayers(e){const t=e.playerDescs="ONLINE"===this.gameType?e.playerDescs:d.a.CtorArgs.finalize(e.playerDescs);return Object.freeze(t.map(e=>e.familyId===d.a.Family.HUMAN?e.isALocalOperator?this._createOperatorPlayer(e):new d.a(this,e):this._createArtifPlayer(e)))}serializeResetState(){const e=[],t=this.players.map(e=>e.coord),s=[];return this.grid.forEachTile(t=>{t.lastKnownUpdateId++,e.push({char:t.langChar,seq:t.langSeq}),t.freeHealth&&s.push({coord:t.coord,health:t.freeHealth})}),{csps:e,playerCoords:t,healthCoords:s}}deserializeResetState(e){this.grid.forEachTile((t,s)=>{t.setLangCharSeqPair(e.csps[s]),t.lastKnownUpdateId++}),e.playerCoords.forEach((e,t)=>{this.players[t].reset(this.grid.tile.at(e))}),e.healthCoords.forEach(e=>{this.grid.tile.at(e.coord).freeHealth=e.health})}get currentOperator(){return Object(n.b)(this,i)}setCurrentOperator(e){const t=this.operators[e];t&&this.currentOperator!==t&&(t._notifyWillBecomeCurrent(),Object(n.c)(this,i,t))}get status(){return Object(n.b)(this,a)}statusBecomePlaying(){if("PLAYING"!==this.status){if("PAUSED"!==this.status)throw Error("Can only resume a game that is currently paused.");this.players.forEach(e=>{e._notifyGameNowPlaying()}),this._abstractStatusBecomePlaying(),Object(n.c)(this,a,"PLAYING")}else console.log("[statusBecomePlaying]: Game is already playing")}statusBecomePaused(){if("PAUSED"!==this.status){if("PLAYING"!==this.status)throw Error("Can only pause a game that is currently playing.");this.players.forEach(e=>{e._notifyGameNowPaused()}),this._abstractStatusBecomePaused(),Object(n.c)(this,a,"PAUSED")}else console.log("[statusBecomePaused]: Game is already paused")}statusBecomeOver(){if("PLAYING"!==this.status)throw Error("Can only end a game that is currently playing.");this.players.forEach(e=>{e._notifyGameNowOver()}),this._abstractStatusBecomeOver(),Object(n.c)(this,a,"OVER"),Object(n.b)(this,r).call(this),console.log("game is over!")}_abstractStatusBecomePlaying(){}_abstractStatusBecomePaused(){}_abstractStatusBecomeOver(){}}r=new WeakMap,i=new WeakMap,a=new WeakMap,Object.freeze(u),Object.freeze(u.prototype);class m extends u{constructor(e,t,s){super(e,t,s),o.set(this,void 0),this.eventRecordBitmap=[]}reset(){const e=super.reset();return this.eventRecordBitmap.fill(!1,0,h.a.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH),Object(n.c)(this,o,0),e}get nextUnusedEventId(){return Object(n.b)(this,o)}_recordEvent(e){const t=e.eventId,s=t%h.a.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH;if(t===c.a.EVENT_ID_REJECT)throw TypeError("Do not try to record events for rejected requests.");if(t<0||t!==Math.trunc(t))throw RangeError("Event ID's must only be assigned positive, integer values.");if(this.eventRecordBitmap[s])throw Error("Event ID's must be assigned unique values.");this.eventRecordBitmap[s]=!0,this.eventRecordBitmap[(t+h.a.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH-h.a.K.EVENT_RECORD_FORWARD_WINDOW_LENGTH)%h.a.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH]=!1,Object(n.c)(this,o,+Object(n.b)(this,o)+1)}executeTileModEvent(e,t=!0){Object.freeze(e);const s=this.grid.tile.at(e.coord);if(s.lastKnownUpdateId>e.lastKnownUpdateId)return s;if(s.lastKnownUpdateId===e.lastKnownUpdateId)throw"never";return e.newCharSeqPair&&(s.setLangCharSeqPair(e.newCharSeqPair),t&&this.operators.filter(e=>e.tile.destsFrom().get.includes(s)).forEach(e=>e.seqBufferAcceptKey(""))),s.lastKnownUpdateId=e.lastKnownUpdateId,s.freeHealth=e.newFreeHealth,s}executePlayerMoveEvent(e){var t;const s=this.players[e.playerId],r=e.playerLastAcceptedRequestId-s.lastAcceptedRequestId;if(e.eventId===c.a.EVENT_ID_REJECT)return void(0===r&&(s.requestInFlight=!1));this._recordEvent(e);const i=this.executeTileModEvent(e.destModDesc,s!==this.currentOperator);if(null===(t=e.tileHealthModDescs)||void 0===t||t.forEach(e=>{this.executeTileModEvent(e)}),r>1){if(s===this.currentOperator)throw"never"}else{if(s.requestInFlight=!1,!(s===this.currentOperator?1===r:r<=1))throw"never";s.status.health=e.newPlayerHealth.health,s.moveTo(i),s.lastAcceptedRequestId=e.playerLastAcceptedRequestId}}executePlayerBubbleEvent(e){this.players[e.playerId].requestInFlight=!1,e.eventId!==c.a.EVENT_ID_REJECT&&this._recordEvent(e)}}o=new WeakMap,Object.freeze(m),Object.freeze(m.prototype)}]]); //# sourceMappingURL=online.js.map \ No newline at end of file diff --git a/dist/client/chunk/game/offline~game/online.js.map b/dist/client/chunk/game/offline~game/online.js.map index 21e7910a..8c7ff318 100644 --- a/dist/client/chunk/game/offline~game/online.js.map +++ b/dist/client/chunk/game/offline~game/online.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://snakey3/./src/base/game/player/PlayerSkeleton.ts","webpack://snakey3/./src/base/game/player/Player.ts","webpack://snakey3/./src/base/lang/LangSeqTreeNode.ts","webpack://snakey3/./src/base/lang/Lang.ts","webpack://snakey3/./src/base/game/events/PlayerActionEvent.ts","webpack://snakey3/./src/base/game/player/PlayerStatus.ts","webpack://snakey3/./src/base/game/player/Team.ts","webpack://snakey3/./src/base/game/player/ArtificialPlayer.ts","webpack://snakey3/./src/base/game/events/EventRecordEntry.ts","webpack://snakey3/./src/base/floor/TileGetter.ts","webpack://snakey3/./src/base/floor/VisibleGrid.ts","webpack://snakey3/./src/base/floor/VisibleTile.ts","webpack://snakey3/./src/base/game/player/OperatorPlayer.ts","webpack://snakey3/./src/base/game/player/VisiblePlayerStatus.ts","webpack://snakey3/./src/base/floor/Grid.ts","webpack://snakey3/./src/base/floor/impl/Euclid2.ts","webpack://snakey3/./src/base/floor/impl/Beehive.ts","webpack://snakey3/./src/base/game/GameBootstrap.ts","webpack://snakey3/./src/base/game/player/artificials/Chaser.ts","webpack://snakey3/./src/client/game/BrowserGame.ts","webpack://snakey3/./src/base/game/gameparts/GamepartBase.ts","webpack://snakey3/./src/base/game/gameparts/GamepartEvents.ts"],"names":["game","desc","super","Math","trunc","playerId","RangeError","this","isALocalOperator","status","noCheckGameOver","tile","TileGetter","TileGetterSource","_afterAllPlayersConstruction","spawnTile","hostTile","_setOccupant","immigrantInfo","coord","dest","occupantId","gameType","Game","Type","ONLINE","Error","evictOccupant","isOccupied","PlayerSkeleton","player","grid","_source","_getTileAt","_getTileDestsFrom","_getTileSourcesTo","Object","freeze","prototype","Username","REGEXP","test","username","source","familyId","teamId","reset","lastAcceptedRequestId","PlayerActionEvent","INITIAL_REQUEST_ID","requestInFlight","type","Status","PLAYING","processMoveRequest","Movement","teams","other","team","members","includes","Player","CtorArgs","finalize","playerDescs","teamIdCleaner","Array","from","Set","map","sort","a","b","reduce","prev","originalId","squashedId","slice","pda","pdb","playerDesc","index","assign","LangSeqTree","ParentNode","children","inheritingWeightedHitCount","forEach","child","_finalize","seq","chars","Seq","length","node","childNode","find","startsWith","sequence","push","ChildNode","leafNodes","_recursiveGetLeafNodes","forwardDict","weightScaling","averageWeight","values","sum","next","weight","adjustedWeight","originalWeight","pow","reverseDict","Map","char","weightedChar","WeightedLangChar","charArray","get","set","rootNode","mappingA","mappingB","mapping","_addCharMapping","LEAF_CMP","parent","characters","incrementNumHits","random","CHAR_HIT_COUNT_SEED_CEILING","CMP","shift","pair","wCharToHit","numTimes","_incrementNumHits","_recursiveIncrementNumHits","weightInv","upstreamNodes","simpleView","create","kids","PATH_CMP","personalWeightedHitCount","hitCount","weightedHitCount","hits","frontendDescId","frontendDesc","GET_FRONTEND_DESC_BY_ID","treeMap","CREATE_TREE_MAP","getLeafNodes","numLeaves","id","avoid","nodeToHit","undefined","leaf","andNonRootParents","i","conflictSeq","avoidSeq","splice","chooseOnePair","displayName","root","EVENT_NAME","Bubble","eventId","EVENT_ID_REJECT","affectedNeighbours","playerLastAcceptedRequestId","destTile","moveType","newPlayerHealth","tileHealthModDescs","destModDesc","lastKnownUpdateId","newCharSeqPair","newFreeHealth","PlayerStatus","health","newHealth","oldIsDowned","isDowned","elimOrder","ElimOrder","STANDING","every","numNonStandingTeams","filter","IMMORTAL","statusBecomeOver","Team","member","teamElimOrder","ArtificialPlayer","TypeError","delayedMovementContinue","cancelTimeout","_scheduledMovementCallbackId","desiredDest","computeDesiredDest","_nextMovementTimerMultiplier","at","langSeq","makeMovementRequest","getUntToward","getNextMoveType","setTimeout","movementContinue","bind","computeNextMovementTimer","of","_Constructors","EventRecordEntry","args","Query","contents","VisibleGrid","Tile","coordDesc","baseElem","document","createElement","setAttribute","classList","add","OmHooks","General","Class","CENTER_CONTENTS","STACK_CONTENTS","BASE","pthb","POINTER_HB","appendChild","charWrap","LANG_CHAR_WRAP","charElem","langCharElem","seqElem","langSeqElem","LANG_SEQ","parentElement","insertAdjacentElement","playerElem","textContent","freeHealth","dataset","Dataset","HEALTH","toString","charSeqPair","setLangCharSeqPair","langChar","getImplementation","coordSys","gridImpl","OHG","Grid","IMPL_BODY","IMPL_COORD_SYS","shortSpotlight","SHORT_SPOTLIGHT","longSpotlight","LONG_SPOTLIGHT","spotlightElems","langFrontend","remapFunc","prevCoord","event","key","equals","getUntAwayFrom","MoveType","BOOST","repeat","seqBufferAcceptKey","unts","destsFrom","unoccupied","Lang","newSeqBuffer","seqBuffer","substring","possibleTarget","NORMAL","visualBell","moveTo","_notifyWillBecomeCurrent","faceElem","FACE","animate","duration","easing","delay","transform","makeWiggleAnimation","anim","pause","dOverlayElem","DOWNED_OVERLAY","_immigrantInfoCache","DDH","DOWNED","KEY","VALUES","NO","currOperator","currentOperator","nextOperator","requestAnimationFrame","time","elem","scrollIntoView","players","otherPlayer","isTeammate","FACE_SWATCH","window","play","TEAM","SELF","VisiblePlayerStatus","pctX","numWiggles","arr","fill","unshift","n","Card","playerName","name","static","gridClass","dimensions","getArea","forEachTile","getRandomCoord","Euclid2","Coord","Abstract","Mathy","x","y","round","sub","originOneNorm","abs","originInfNorm","max","originAxialAlignment","scalar","row","height","newRow","col","width","newTile","tileClass","SIZE_LIMITS","consumer","flat","intendedDest","sourceCoord","options","tileA","TileB","oneNorm","infNorm","axialAlignment","floor","avoidCoord","origin","radius","t","l","r","min","flatMap","gridRow","playerCounts","avoidSet","numMembers","teamSpawnCoords","dim","Visible","gridElem","style","setProperty","_addToDom","_superVisibleGrid","Beehive","dash","bash","floorDash","floorBash","d","shorterSide","fslash","bslash","longerSide","area","behaviour","Behaviour","DEFAULT","familyArgs","threatProximity","targetProximity","pa","pb","minMovesFromTo","threatP","fearDistance","targetP","bloodThirstDistance","healthReserve","freeHealthTiles","size","wanderingAimlessness","getRandomCoordAround","awayFunc","closestFht","closestFhtDistance","Infinity","fht","distance","keyPressesPerSecond","Chaser","GameBootstrap","INIT_CLASS_REGISTRIES","VGr","AP","CHASER","htmlElements","playersBar","impl","_getGridImplementation","gridDimensions","onGameBecomeOver","langId","_playerStatusCtor","playerStatusCtor","createPlayers","operators","setCurrentOperator","teammateArray","PAUSED","Promise","resolve","gameDesc","Family","HUMAN","_createOperatorPlayer","_createArtifPlayer","csps","playerCoords","healthCoords","ser","nextOperatorIndex","_notifyGameNowPlaying","_abstractStatusBecomePlaying","console","log","_notifyGameNowPaused","_abstractStatusBecomePaused","_notifyGameNowOver","_abstractStatusBecomeOver","OVER","eventRecordBitmap","superPromise","K","EVENT_RECORD_WRAPPING_BUFFER_LENGTH","wrappedId","EVENT_RECORD_FORWARD_WINDOW_LENGTH","doCheckOperatorSeqBuffer","op","clientEventLag","_recordEvent","executeTileModEvent"],"mappings":"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","file":"chunk/game/offline~game/online.js","sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://snakey3/./src/base/game/player/PlayerSkeleton.ts","webpack://snakey3/./src/base/game/player/Player.ts","webpack://snakey3/./src/base/lang/LangSeqTreeNode.ts","webpack://snakey3/./src/base/lang/Lang.ts","webpack://snakey3/./src/base/game/events/PlayerActionEvent.ts","webpack://snakey3/./src/base/game/player/PlayerStatus.ts","webpack://snakey3/./src/base/game/player/Team.ts","webpack://snakey3/./src/base/game/player/ArtificialPlayer.ts","webpack://snakey3/./src/base/game/events/EventRecordEntry.ts","webpack://snakey3/./src/base/floor/TileGetter.ts","webpack://snakey3/./src/base/floor/VisibleGrid.ts","webpack://snakey3/./src/base/floor/VisibleTile.ts","webpack://snakey3/./src/base/game/player/OperatorPlayer.ts","webpack://snakey3/./src/base/game/player/VisiblePlayerStatus.ts","webpack://snakey3/./src/base/floor/Grid.ts","webpack://snakey3/./src/base/floor/impl/Euclid2.ts","webpack://snakey3/./src/base/floor/impl/Beehive.ts","webpack://snakey3/./src/base/game/GameBootstrap.ts","webpack://snakey3/./src/base/game/player/artificials/Chaser.ts","webpack://snakey3/./src/client/game/BrowserGame.ts","webpack://snakey3/./src/base/game/gameparts/GamepartBase.ts","webpack://snakey3/./src/base/game/gameparts/GamepartEvents.ts"],"names":["game","desc","super","Math","trunc","playerId","RangeError","this","isALocalOperator","status","noCheckGameOver","tile","TileGetter","TileGetterSource","_afterAllPlayersConstruction","spawnTile","hostTile","_setOccupant","immigrantInfo","coord","dest","occupantId","gameType","Error","evictOccupant","isOccupied","PlayerSkeleton","player","grid","_source","_getTileAt","_getTileDestsFrom","_getTileSourcesTo","Object","freeze","prototype","familyId","teamId","username","avatar","Avatar","GET_RANDOM","reset","lastAcceptedRequestId","PlayerActionEvent","INITIAL_REQUEST_ID","requestInFlight","type","processMoveRequest","Movement","teams","other","team","members","includes","Player","CtorArgs","finalize","playerDescs","teamIdCleaner","Array","from","Set","map","sort","a","b","reduce","prev","originalId","squashedId","slice","pda","pdb","playerDesc","index","assign","LangSeqTree","ParentNode","children","inheritingWeightedHitCount","forEach","child","_finalize","seq","chars","Seq","REGEXP","test","source","length","node","childNode","find","startsWith","sequence","push","ChildNode","leafNodes","_recursiveGetLeafNodes","forwardDict","weightScaling","averageWeight","values","sum","next","weight","adjustedWeight","originalWeight","pow","reverseDict","Map","char","weightedChar","WeightedLangChar","charArray","get","set","rootNode","mappingA","mappingB","mapping","_addCharMapping","LEAF_CMP","parent","characters","incrementNumHits","random","CHAR_HIT_COUNT_SEED_CEILING","CMP","shift","pair","wCharToHit","numTimes","_incrementNumHits","_recursiveIncrementNumHits","weightInv","upstreamNodes","simpleView","create","kids","PATH_CMP","personalWeightedHitCount","hitCount","weightedHitCount","hits","frontendDescId","weightExaggeration","frontendDesc","GET_FRONTEND_DESC_BY_ID","treeMap","CREATE_TREE_MAP","getLeafNodes","numLeaves","id","avoid","nodeToHit","undefined","leaf","andNonRootParents","i","conflictSeq","avoidSeq","splice","chooseOnePair","displayName","root","EVENT_NAME","Bubble","eventId","EVENT_ID_REJECT","affectedNeighbours","playerLastAcceptedRequestId","destTile","moveType","newPlayerHealth","tileHealthModDescs","destModDesc","lastKnownUpdateId","newCharSeqPair","newFreeHealth","PlayerStatus","health","newHealth","oldIsDowned","isDowned","elimOrder","ElimOrder","STANDING","every","numNonStandingTeams","filter","IMMORTAL","statusBecomeOver","Team","member","teamElimOrder","ArtificialPlayer","TypeError","delayedMovementContinue","cancelTimeout","_scheduledMovementCallbackId","desiredDest","computeDesiredDest","_nextMovementTimerMultiplier","at","langSeq","makeMovementRequest","getUntToward","getNextMoveType","setTimeout","movementContinue","bind","computeNextMovementTimer","of","_Constructors","EventRecordEntry","args","Query","contents","VisibleGrid","Tile","coordDesc","baseElem","document","createElement","setAttribute","classList","add","OmHooks","General","Class","CENTER_CONTENTS","STACK_CONTENTS","BASE","pthb","POINTER_HB","appendChild","charWrap","LANG_CHAR_WRAP","charElem","langCharElem","seqElem","langSeqElem","LANG_SEQ","parentElement","insertAdjacentElement","playerElem","textContent","freeHealth","dataset","Dataset","HEALTH","toString","charSeqPair","setLangCharSeqPair","langChar","getImplementation","coordSys","gridImpl","OHG","Grid","IMPL_BODY","IMPL_COORD_SYS","shortSpotlight","SHORT_SPOTLIGHT","longSpotlight","LONG_SPOTLIGHT","spotlightElems","langFrontend","remapFunc","prevCoord","event","key","equals","getUntAwayFrom","MoveType","BOOST","repeat","seqBufferAcceptKey","unts","destsFrom","unoccupied","Lang","newSeqBuffer","seqBuffer","substring","possibleTarget","NORMAL","visualBell","moveTo","_notifyWillBecomeCurrent","faceElem","FACE","animate","duration","easing","delay","transform","makeWiggleAnimation","anim","pause","dOverlayElem","DOWNED_OVERLAY","_immigrantInfoCache","DDH","DOWNED","KEY","VALUES","NO","currOperator","currentOperator","nextOperator","requestAnimationFrame","time","elem","scrollIntoView","players","otherPlayer","isTeammate","FACE_SWATCH","window","play","TEAM","SELF","VisiblePlayerStatus","pctX","numWiggles","arr","fill","unshift","n","Card","playerName","name","static","gridClass","dimensions","getArea","forEachTile","getRandomCoord","Euclid2","Coord","x","y","round","sub","originOneNorm","abs","originInfNorm","max","originAxialAlignment","scalar","row","height","newRow","col","width","newTile","tileClass","SIZE_LIMITS","consumer","flat","intendedDest","sourceCoord","options","tileA","TileB","oneNorm","infNorm","axialAlignment","floor","avoidCoord","origin","radius","t","l","r","min","flatMap","gridRow","playerCounts","avoidSet","numMembers","teamSpawnCoords","_equals","dim","Visible","gridElem","style","setProperty","_addToDom","_superVisibleGrid","Beehive","dash","bash","floorDash","floorBash","d","shorterSide","fslash","bslash","longerSide","area","behaviour","Behaviour","DEFAULT","familyArgs","threatProximity","targetProximity","pa","pb","minMovesFromTo","threatP","fearDistance","targetP","bloodThirstDistance","healthReserve","freeHealthTiles","size","wanderingAimlessness","getRandomCoordAround","awayFunc","closestFht","closestFhtDistance","Infinity","fht","distance","keyPressesPerSecond","Chaser","GameBootstrap","INIT_CLASS_REGISTRIES","VGr","AP","CHASER","htmlElements","playersBar","impl","_getGridImplementation","gridDimensions","onGameBecomeOver","langId","_playerStatusCtor","playerStatusCtor","createPlayers","operators","setCurrentOperator","teammateArray","Promise","resolve","gameDesc","Family","HUMAN","_createOperatorPlayer","_createArtifPlayer","csps","playerCoords","healthCoords","ser","nextOperatorIndex","_notifyGameNowPlaying","_abstractStatusBecomePlaying","console","log","_notifyGameNowPaused","_abstractStatusBecomePaused","_notifyGameNowOver","_abstractStatusBecomeOver","eventRecordBitmap","superPromise","Game","K","EVENT_RECORD_WRAPPING_BUFFER_LENGTH","wrappedId","EVENT_RECORD_FORWARD_WINDOW_LENGTH","doCheckOperatorSeqBuffer","op","clientEventLag","_recordEvent","executeTileModEvent"],"mappings":"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","file":"chunk/game/offline~game/online.js","sourceRoot":""} \ No newline at end of file diff --git a/dist/client/chunk/game/online.js b/dist/client/chunk/game/online.js index e4c41fab..cf546759 100644 --- a/dist/client/chunk/game/online.js +++ b/dist/client/chunk/game/online.js @@ -1,2 +1,2 @@ -(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[2],{25:function(e,t,n){"use strict";n.r(t),n.d(t,"OnlineGame",(function(){return r}));var s=n(16),o=n(9),i=n(17),c=function(e,t,n,s){return new(n||(n=Promise))((function(o,i){function c(e){try{a(s.next(e))}catch(e){i(e)}}function r(e){try{a(s.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(c,r)}a((s=s.apply(e,t||[])).next())}))};n(13);class r extends i.a{constructor(e,t,n){super(s.b.Type.ONLINE,{onGameBecomeOver:e,tileClass:s.e,playerStatusCtor:s.d},n),this.socket=t,this._ctorBrowserGame(),this.socket.off(o.a.EVENT_NAME.Movement),this.socket.on(o.a.EVENT_NAME.Movement,this.executePlayerMoveEvent.bind(this)),this.socket.off(o.a.EVENT_NAME.Bubble),this.socket.on(o.a.EVENT_NAME.Bubble,this.executePlayerBubbleEvent.bind(this)),this.socket.on(s.b.Serialization.EVENT_NAME,e=>c(this,void 0,void 0,(function*(){yield this.reset(),this.deserializeResetState(e)})))}_createArtifPlayer(e){return new s.c(this,e)}processMoveRequest(e){this.socket.emit(o.a.EVENT_NAME.Movement,e)}processBubbleRequest(e){this.socket.emit(o.a.EVENT_NAME.Bubble,e)}}Object(s.f)(r,[s.a]),Object.freeze(r),Object.freeze(r.prototype)}}]); +(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[2],{26:function(e,t,s){"use strict";s.r(t),s.d(t,"OnlineGame",(function(){return c}));var i=s(0),o=s(17),E=s(10),r=s(18);s(14);class c extends r.a{constructor(e,t,s){super(o.b.Type.ONLINE,{onGameBecomeOver:e,tileClass:o.e,playerStatusCtor:o.d},s),this.socket=t,this._ctorBrowserGame(),this.socket.off(E.a.EVENT_NAME.Movement),this.socket.on(E.a.EVENT_NAME.Movement,this.executePlayerMoveEvent.bind(this)),this.socket.off(E.a.EVENT_NAME.Bubble),this.socket.on(E.a.EVENT_NAME.Bubble,this.executePlayerBubbleEvent.bind(this)),this.socket.off(o.b.Serialization.EVENT_NAME),this.socket.on(o.b.Serialization.EVENT_NAME,e=>Object(i.a)(this,void 0,void 0,(function*(){yield this.reset(),this.deserializeResetState(e),this.socket.emit(o.b.CtorArgs.EVENT_NAME_CLIENT_READY_UNPAUSE)}))),this.socket.emit(o.b.CtorArgs.EVENT_NAME_CLIENT_READY_RESET)}_createArtifPlayer(e){return new o.c(this,e)}processMoveRequest(e){this.socket.emit(E.a.EVENT_NAME.Movement,e)}processBubbleRequest(e){this.socket.emit(E.a.EVENT_NAME.Bubble,e)}}Object(o.f)(c,[o.a]),Object.freeze(c),Object.freeze(c.prototype)}}]); //# sourceMappingURL=online.js.map \ No newline at end of file diff --git a/dist/client/chunk/game/online.js.map b/dist/client/chunk/game/online.js.map index abd12463..f7207c95 100644 --- a/dist/client/chunk/game/online.js.map +++ b/dist/client/chunk/game/online.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://snakey3/./src/client/game/OnlineGame.ts"],"names":["OnlineGame","onGameBecomeOver","socket","gameDesc","super","Type","ONLINE","tileClass","playerStatusCtor","this","_ctorBrowserGame","off","EVENT_NAME","Movement","on","executePlayerMoveEvent","bind","Bubble","executePlayerBubbleEvent","Serialization","ser","reset","deserializeResetState","desc","emit","Object","freeze","prototype"],"mappings":"0dACA,EAAQ,IAmBD,MAAMA,UACL,IAgBJ,YACIC,EACAC,EACAC,GAEAC,MACI,IAAKC,KAAKC,OAAQ,CAClBL,mBACAM,UAAW,IACXC,iBAAkB,KACfL,GAEPM,KAAKP,OAASA,EACdO,KAAKC,mBAELD,KAAKP,OAAOS,IAAI,IAAkBC,WAAWC,UAC7CJ,KAAKP,OAAOY,GACR,IAAkBF,WAAWC,SAC7BJ,KAAKM,uBAAuBC,KAAKP,OAErCA,KAAKP,OAAOS,IAAI,IAAkBC,WAAWK,QAC7CR,KAAKP,OAAOY,GACR,IAAkBF,WAAWK,OAC7BR,KAAKS,yBAAyBF,KAAKP,OAIvCA,KAAKP,OAAOY,GACR,IAAKK,cAAcP,WACZQ,GAA0B,EAAD,sCACtBX,KAAKY,QACXZ,KAAKa,sBAAsBF,OAO7B,mBAAmBG,GACzB,OAAO,IAAI,IAAOd,KAAMc,GAWrB,mBAAmBA,GACtBd,KAAKP,OAAOsB,KAAK,IAAkBZ,WAAWC,SAAUU,GAUrD,qBAAqBA,GACxBd,KAAKP,OAAOsB,KAAK,IAAkBZ,WAAWK,OAAQM,IAI9D,YAAYvB,EAAY,CAAC,MACzByB,OAAOC,OAAO1B,GACdyB,OAAOC,OAAO1B,EAAW2B","file":"chunk/game/online.js","sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://snakey3/./src/client/game/OnlineGame.ts"],"names":["OnlineGame","onGameBecomeOver","socket","gameDesc","super","Type","ONLINE","tileClass","playerStatusCtor","this","_ctorBrowserGame","off","EVENT_NAME","Movement","on","executePlayerMoveEvent","bind","Bubble","executePlayerBubbleEvent","Serialization","ser","reset","deserializeResetState","emit","CtorArgs","EVENT_NAME_CLIENT_READY_UNPAUSE","EVENT_NAME_CLIENT_READY_RESET","desc","Object","freeze","prototype"],"mappings":"4LACA,EAAQ,IAmBD,MAAMA,UACL,IAwBJ,YACIC,EACAC,EACAC,GAEAC,MACI,IAAKC,KAAKC,OAAQ,CAClBL,mBACAM,UAAW,IACXC,iBAAkB,KACfL,GAEPM,KAAKP,OAASA,EACdO,KAAKC,mBAELD,KAAKP,OAAOS,IAAI,IAAkBC,WAAWC,UAC7CJ,KAAKP,OAAOY,GACR,IAAkBF,WAAWC,SAC7BJ,KAAKM,uBAAuBC,KAAKP,OAErCA,KAAKP,OAAOS,IAAI,IAAkBC,WAAWK,QAC7CR,KAAKP,OAAOY,GACR,IAAkBF,WAAWK,OAC7BR,KAAKS,yBAAyBF,KAAKP,OAGvCA,KAAKP,OAAOS,IAAI,IAAKQ,cAAcP,YACnCH,KAAKP,OAAOY,GACR,IAAKK,cAAcP,WACZQ,GAA0B,kDACvBX,KAAKY,QACXZ,KAAKa,sBAAsBF,GAG3BX,KAAKP,OAAOqB,KAAK,IAAKC,SAASC,qCAGvChB,KAAKP,OAAOqB,KAAK,IAAKC,SAASE,+BAKzB,mBAAmBC,GACzB,OAAO,IAAI,IAAOlB,KAAMkB,GAWrB,mBAAmBA,GACtBlB,KAAKP,OAAOqB,KAAK,IAAkBX,WAAWC,SAAUc,GAUrD,qBAAqBA,GACxBlB,KAAKP,OAAOqB,KAAK,IAAkBX,WAAWK,OAAQU,IAI9D,YAAY3B,EAAY,CAAC,MACzB4B,OAAOC,OAAO7B,GACd4B,OAAOC,OAAO7B,EAAW8B","file":"chunk/game/online.js","sourceRoot":""} \ No newline at end of file diff --git a/dist/client/chunk/lang/Cellphone-ts.js b/dist/client/chunk/lang/Cellphone-ts.js index 83228309..654f4e1b 100644 --- a/dist/client/chunk/lang/Cellphone-ts.js +++ b/dist/client/chunk/lang/Cellphone-ts.js @@ -1,2 +1,2 @@ -(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[4],{19:function(e,n,o){"use strict";o.r(n),o.d(n,"Cellphone",(function(){return s}));class s{}s||(s={}),Object.freeze(s),Object.freeze(s.prototype)}}]); +(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[4],{20:function(e,n,o){"use strict";o.r(n),o.d(n,"Cellphone",(function(){return s}));class s{}s||(s={}),Object.freeze(s),Object.freeze(s.prototype)}}]); //# sourceMappingURL=Cellphone-ts.js.map \ No newline at end of file diff --git a/dist/client/chunk/lang/Emote-ts.js b/dist/client/chunk/lang/Emote-ts.js index c8110267..16a96b9f 100644 --- a/dist/client/chunk/lang/Emote-ts.js +++ b/dist/client/chunk/lang/Emote-ts.js @@ -1,2 +1,2 @@ -(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[5],{20:function(e,n,t){"use strict";t.r(n),t.d(n,"Emote",(function(){return c}));var c,o=t(8);!function(e){class n extends o.a{}e.GitHub=n,Object.freeze(n),Object.freeze(n.prototype)}(c||(c={})),Object.freeze(c)}}]); +(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[5],{21:function(e,n,t){"use strict";t.r(n),t.d(n,"Emote",(function(){return c}));var c,o=t(9);!function(e){class n extends o.a{}e.GitHub=n,Object.freeze(n),Object.freeze(n.prototype)}(c||(c={})),Object.freeze(c)}}]); //# sourceMappingURL=Emote-ts.js.map \ No newline at end of file diff --git a/dist/client/chunk/lang/English-ts.js b/dist/client/chunk/lang/English-ts.js index db8d2827..79b4acbd 100644 --- a/dist/client/chunk/lang/English-ts.js +++ b/dist/client/chunk/lang/English-ts.js @@ -1,2 +1,2 @@ -(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[6],{21:function(e,t,n){"use strict";n.r(t),n.d(t,"English",(function(){return r}));var r,c=n(8);!function(e){class t extends c.a{constructor(e){super("engl-low",Object.entries(s).reduce((e,[t,n])=>(e[t]={seq:t,weight:n},e),{}),e)}}e.Lowercase=t,Object.freeze(t),Object.freeze(t.prototype);class n extends c.a{constructor(e){let t={};const n=e=>{t=Object.entries(s).reduce((t,[n,r])=>{const c=e(n);return t[c]={seq:c,weight:r},t},t)};n(e=>e.toLowerCase()),n(e=>e.toUpperCase()),super("engl-mix",t,e)}}let r;e.MixedCase=n,Object.freeze(n),Object.freeze(n.prototype),function(e){class t extends c.a{constructor(e){super("engl-cell-enc",Object.entries(s).reduce((e,[t,r],c)=>(e[t]={seq:n[c],weight:r},e),{}),e)}}e.Encode=t,Object.freeze(t),Object.freeze(t.prototype);const n=Object.freeze([3,3,3,3,3,4,3,4].flatMap((e,t)=>{const n=[],r=(1+t).toString();for(let t=r;t.length<=e;t+=r)n.push(t);return n}))}(r=e.OldCellphone||(e.OldCellphone={}));const s=Object.freeze({a:8.167,b:1.492,c:2.202,d:4.253,e:12.702,f:2.228,g:2.015,h:6.094,i:6.966,j:.153,k:1.292,l:4.025,m:2.406,n:6.749,o:7.507,p:1.929,q:.095,r:5.987,s:6.327,t:9.356,u:2.758,v:.978,w:2.56,x:.15,y:1.994,z:.077})}(r||(r={})),Object.freeze(r)}}]); +(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[6],{22:function(e,t,n){"use strict";n.r(t),n.d(t,"English",(function(){return r}));var r,c=n(9);!function(e){class t extends c.a{constructor(e){super("engl-low",Object.entries(s).reduce((e,[t,n])=>(e[t]={seq:t,weight:n},e),{}),e)}}e.Lowercase=t,Object.freeze(t),Object.freeze(t.prototype);class n extends c.a{constructor(e){let t={};const n=e=>{t=Object.entries(s).reduce((t,[n,r])=>{const c=e(n);return t[c]={seq:c,weight:r},t},t)};n(e=>e.toLowerCase()),n(e=>e.toUpperCase()),super("engl-mix",t,e)}}let r;e.MixedCase=n,Object.freeze(n),Object.freeze(n.prototype),function(e){class t extends c.a{constructor(e){super("engl-cell-enc",Object.entries(s).reduce((e,[t,r],c)=>(e[t]={seq:n[c],weight:r},e),{}),e)}}e.Encode=t,Object.freeze(t),Object.freeze(t.prototype);const n=Object.freeze([3,3,3,3,3,4,3,4].flatMap((e,t)=>{const n=[],r=(1+t).toString();for(let t=r;t.length<=e;t+=r)n.push(t);return n}))}(r=e.OldCellphone||(e.OldCellphone={}));const s=Object.freeze({a:8.167,b:1.492,c:2.202,d:4.253,e:12.702,f:2.228,g:2.015,h:6.094,i:6.966,j:.153,k:1.292,l:4.025,m:2.406,n:6.749,o:7.507,p:1.929,q:.095,r:5.987,s:6.327,t:9.356,u:2.758,v:.978,w:2.56,x:.15,y:1.994,z:.077})}(r||(r={})),Object.freeze(r)}}]); //# sourceMappingURL=English-ts.js.map \ No newline at end of file diff --git a/dist/client/chunk/lang/Japanese-ts.js b/dist/client/chunk/lang/Japanese-ts.js index 3289a76c..eeed307e 100644 --- a/dist/client/chunk/lang/Japanese-ts.js +++ b/dist/client/chunk/lang/Japanese-ts.js @@ -1,2 +1,2 @@ -(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[7],{22:function(e,i,t){"use strict";t.r(i),t.d(i,"Japanese",(function(){return s}));var s,h=t(8);!function(e){class i extends h.a{constructor(e){super("japn-hir",i.INITIALIZER,e)}}i.INITIALIZER=Object.freeze({"の":{seq:"no",weight:1918313},"に":{seq:"ni",weight:1108840},"た":{seq:"ta",weight:1067566},"い":{seq:"i",weight:1060284},"は":{seq:"ha",weight:937811},"を":{seq:"wo",weight:936356},"と":{seq:"to",weight:927938},"る":{seq:"ru",weight:916652},"が":{seq:"ga",weight:860742},"し":{seq:"shi",weight:848132},"で":{seq:"de",weight:764834},"て":{seq:"te",weight:758316},"な":{seq:"na",weight:720156},"か":{seq:"ka",weight:537294},"れ":{seq:"re",weight:450805},"ら":{seq:"ra",weight:42329},"も":{seq:"mo",weight:396142},"う":{seq:"u",weight:352965},"す":{seq:"su",weight:340654},"り":{seq:"ri",weight:333999},"こ":{seq:"ko",weight:312227},"だ":{seq:"da",weight:280911},"ま":{seq:"ma",weight:278599},"さ":{seq:"sa",weight:258960},"き":{seq:"ki",weight:233505},"め":{seq:"me",weight:223806},"く":{seq:"ku",weight:221960},"あ":{seq:"a",weight:204256},"け":{seq:"ke",weight:199362},"ど":{seq:"do",weight:196555},"ん":{seq:"nn",weight:190068},"え":{seq:"e",weight:163664},"よ":{seq:"yo",weight:154206},"つ":{seq:"tsu",weight:153999},"や":{seq:"ya",weight:146156},"そ":{seq:"so",weight:131611},"わ":{seq:"wa",weight:123077},"ち":{seq:"chi",weight:99183},"み":{seq:"mi",weight:89264},"せ":{seq:"se",weight:83444},"ろ":{seq:"ro",weight:73467},"ば":{seq:"ba",weight:72228},"お":{seq:"o",weight:65870},"じ":{seq:"ji",weight:56857},"べ":{seq:"be",weight:56005},"ず":{seq:"zu",weight:53256},"げ":{seq:"ge",weight:49126},"ほ":{seq:"ho",weight:48752},"へ":{seq:"he",weight:47013},"び":{seq:"bi",weight:32312},"む":{seq:"mu",weight:31212},"ご":{seq:"go",weight:26965},"ね":{seq:"ne",weight:23490},"ぶ":{seq:"bu",weight:23280},"ぐ":{seq:"gu",weight:21549},"ぎ":{seq:"gi",weight:19865},"ひ":{seq:"hi",weight:19148},"ょ":{seq:"yo",weight:14425},"づ":{seq:"du",weight:13125},"ぼ":{seq:"bo",weight:12402},"ざ":{seq:"za",weight:12108},"ふ":{seq:"fu",weight:11606},"ゃ":{seq:"ya",weight:11522},"ぞ":{seq:"zo",weight:10047},"ゆ":{seq:"yu",weight:8486},"ぜ":{seq:"ze",weight:6893},"ぬ":{seq:"nu",weight:5124},"ぱ":{seq:"pa",weight:4349},"ゅ":{seq:"yu",weight:2755},"ぴ":{seq:"pi",weight:1608},"ぽ":{seq:"po",weight:1315},"ぷ":{seq:"pu",weight:986},"ぺ":{seq:"pe",weight:477},"ぢ":{seq:"di",weight:82}}),e.Hiragana=i,Object.freeze(i),Object.freeze(i.prototype);class t extends h.a{constructor(e){super("japn-kat",t.INITIALIZER,e)}}t.INITIALIZER=Object.freeze({"ン":{seq:"nn",weight:290948},"ル":{seq:"ru",weight:189442},"ス":{seq:"su",weight:178214},"ト":{seq:"to",weight:162802},"ア":{seq:"a",weight:127845},"イ":{seq:"i",weight:120807},"ラ":{seq:"ra",weight:117203},"リ":{seq:"ri",weight:106744},"ク":{seq:"ku",weight:98209},"カ":{seq:"ka",weight:82982},"シ":{seq:"shi",weight:80626},"タ":{seq:"ta",weight:75319},"ロ":{seq:"ro",weight:75301},"ド":{seq:"do",weight:74257},"ジ":{seq:"ji",weight:61171},"フ":{seq:"fu",weight:61115},"レ":{seq:"re",weight:60608},"メ":{seq:"me",weight:60230},"コ":{seq:"ko",weight:58724},"マ":{seq:"ma",weight:56123},"プ":{seq:"pu",weight:54159},"テ":{seq:"te",weight:53404},"ム":{seq:"mu",weight:50758},"チ":{seq:"chi",weight:48437},"バ":{seq:"ba",weight:44970},"ビ":{seq:"bi",weight:44462},"グ":{seq:"gu",weight:40433},"キ":{seq:"ki",weight:39608},"ウ":{seq:"u",weight:39323},"サ":{seq:"sa",weight:39202},"ニ":{seq:"ni",weight:38711},"ナ":{seq:"na",weight:38047},"エ":{seq:"e",weight:36458},"ブ":{seq:"bu",weight:35920},"パ":{seq:"pa",weight:35416},"セ":{seq:"se",weight:34883},"オ":{seq:"o",weight:34718},"ィ":{seq:"i",weight:33747},"デ":{seq:"de",weight:32665},"ュ":{seq:"yu",weight:32616},"ミ":{seq:"mi",weight:29262},"ャ":{seq:"ya",weight:28144},"ボ":{seq:"bo",weight:26651},"ダ":{seq:"da",weight:26396},"ツ":{seq:"tsu",weight:24541},"ポ":{seq:"ho",weight:23742},"ベ":{seq:"be",weight:22755},"ネ":{seq:"ne",weight:22462},"ガ":{seq:"ga",weight:22061},"ハ":{seq:"ha",weight:21839},"ワ":{seq:"wa",weight:21784},"ソ":{seq:"so",weight:20784},"ケ":{seq:"ke",weight:20633},"モ":{seq:"ho",weight:20070},"ノ":{seq:"no",weight:19572},"ズ":{seq:"zu",weight:19240},"ピ":{seq:"pi",weight:18692},"ホ":{seq:"ho",weight:18204},"ェ":{seq:"e",weight:17817},"ョ":{seq:"yo",weight:17731},"ペ":{seq:"pe",weight:14881},"ゴ":{seq:"go",weight:13931},"ヤ":{seq:"ya",weight:12526},"ギ":{seq:"gi",weight:10732},"ヨ":{seq:"yo",weight:10318},"ザ":{seq:"za",weight:10144},"ァ":{seq:"a",weight:10121},"ゼ":{seq:"ze",weight:7689},"ヒ":{seq:"hi",weight:7289},"ヘ":{seq:"he",weight:7129},"ユ":{seq:"yo",weight:6653},"ゲ":{seq:"ge",weight:6481},"ォ":{seq:"o",weight:6245},"ヌ":{seq:"nu",weight:2897},"ゾ":{seq:"zo",weight:2640},"ヴ":{seq:"vu",weight:1145},"ヂ":{seq:"di",weight:149},"ヅ":{seq:"du",weight:127},"ヲ":{seq:"wo",weight:122}}),e.Katakana=t,Object.freeze(t),Object.freeze(t.prototype)}(s||(s={})),Object.freeze(s)}}]); +(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[7],{23:function(e,i,t){"use strict";t.r(i),t.d(i,"Japanese",(function(){return s}));var s,h=t(9);!function(e){class i extends h.a{constructor(e){super("japn-hir",i.INITIALIZER,e)}}i.INITIALIZER=Object.freeze({"の":{seq:"no",weight:1918313},"に":{seq:"ni",weight:1108840},"た":{seq:"ta",weight:1067566},"い":{seq:"i",weight:1060284},"は":{seq:"ha",weight:937811},"を":{seq:"wo",weight:936356},"と":{seq:"to",weight:927938},"る":{seq:"ru",weight:916652},"が":{seq:"ga",weight:860742},"し":{seq:"shi",weight:848132},"で":{seq:"de",weight:764834},"て":{seq:"te",weight:758316},"な":{seq:"na",weight:720156},"か":{seq:"ka",weight:537294},"れ":{seq:"re",weight:450805},"ら":{seq:"ra",weight:42329},"も":{seq:"mo",weight:396142},"う":{seq:"u",weight:352965},"す":{seq:"su",weight:340654},"り":{seq:"ri",weight:333999},"こ":{seq:"ko",weight:312227},"だ":{seq:"da",weight:280911},"ま":{seq:"ma",weight:278599},"さ":{seq:"sa",weight:258960},"き":{seq:"ki",weight:233505},"め":{seq:"me",weight:223806},"く":{seq:"ku",weight:221960},"あ":{seq:"a",weight:204256},"け":{seq:"ke",weight:199362},"ど":{seq:"do",weight:196555},"ん":{seq:"nn",weight:190068},"え":{seq:"e",weight:163664},"よ":{seq:"yo",weight:154206},"つ":{seq:"tsu",weight:153999},"や":{seq:"ya",weight:146156},"そ":{seq:"so",weight:131611},"わ":{seq:"wa",weight:123077},"ち":{seq:"chi",weight:99183},"み":{seq:"mi",weight:89264},"せ":{seq:"se",weight:83444},"ろ":{seq:"ro",weight:73467},"ば":{seq:"ba",weight:72228},"お":{seq:"o",weight:65870},"じ":{seq:"ji",weight:56857},"べ":{seq:"be",weight:56005},"ず":{seq:"zu",weight:53256},"げ":{seq:"ge",weight:49126},"ほ":{seq:"ho",weight:48752},"へ":{seq:"he",weight:47013},"び":{seq:"bi",weight:32312},"む":{seq:"mu",weight:31212},"ご":{seq:"go",weight:26965},"ね":{seq:"ne",weight:23490},"ぶ":{seq:"bu",weight:23280},"ぐ":{seq:"gu",weight:21549},"ぎ":{seq:"gi",weight:19865},"ひ":{seq:"hi",weight:19148},"ょ":{seq:"yo",weight:14425},"づ":{seq:"du",weight:13125},"ぼ":{seq:"bo",weight:12402},"ざ":{seq:"za",weight:12108},"ふ":{seq:"fu",weight:11606},"ゃ":{seq:"ya",weight:11522},"ぞ":{seq:"zo",weight:10047},"ゆ":{seq:"yu",weight:8486},"ぜ":{seq:"ze",weight:6893},"ぬ":{seq:"nu",weight:5124},"ぱ":{seq:"pa",weight:4349},"ゅ":{seq:"yu",weight:2755},"ぴ":{seq:"pi",weight:1608},"ぽ":{seq:"po",weight:1315},"ぷ":{seq:"pu",weight:986},"ぺ":{seq:"pe",weight:477},"ぢ":{seq:"di",weight:82}}),e.Hiragana=i,Object.freeze(i),Object.freeze(i.prototype);class t extends h.a{constructor(e){super("japn-kat",t.INITIALIZER,e)}}t.INITIALIZER=Object.freeze({"ン":{seq:"nn",weight:290948},"ル":{seq:"ru",weight:189442},"ス":{seq:"su",weight:178214},"ト":{seq:"to",weight:162802},"ア":{seq:"a",weight:127845},"イ":{seq:"i",weight:120807},"ラ":{seq:"ra",weight:117203},"リ":{seq:"ri",weight:106744},"ク":{seq:"ku",weight:98209},"カ":{seq:"ka",weight:82982},"シ":{seq:"shi",weight:80626},"タ":{seq:"ta",weight:75319},"ロ":{seq:"ro",weight:75301},"ド":{seq:"do",weight:74257},"ジ":{seq:"ji",weight:61171},"フ":{seq:"fu",weight:61115},"レ":{seq:"re",weight:60608},"メ":{seq:"me",weight:60230},"コ":{seq:"ko",weight:58724},"マ":{seq:"ma",weight:56123},"プ":{seq:"pu",weight:54159},"テ":{seq:"te",weight:53404},"ム":{seq:"mu",weight:50758},"チ":{seq:"chi",weight:48437},"バ":{seq:"ba",weight:44970},"ビ":{seq:"bi",weight:44462},"グ":{seq:"gu",weight:40433},"キ":{seq:"ki",weight:39608},"ウ":{seq:"u",weight:39323},"サ":{seq:"sa",weight:39202},"ニ":{seq:"ni",weight:38711},"ナ":{seq:"na",weight:38047},"エ":{seq:"e",weight:36458},"ブ":{seq:"bu",weight:35920},"パ":{seq:"pa",weight:35416},"セ":{seq:"se",weight:34883},"オ":{seq:"o",weight:34718},"ィ":{seq:"i",weight:33747},"デ":{seq:"de",weight:32665},"ュ":{seq:"yu",weight:32616},"ミ":{seq:"mi",weight:29262},"ャ":{seq:"ya",weight:28144},"ボ":{seq:"bo",weight:26651},"ダ":{seq:"da",weight:26396},"ツ":{seq:"tsu",weight:24541},"ポ":{seq:"ho",weight:23742},"ベ":{seq:"be",weight:22755},"ネ":{seq:"ne",weight:22462},"ガ":{seq:"ga",weight:22061},"ハ":{seq:"ha",weight:21839},"ワ":{seq:"wa",weight:21784},"ソ":{seq:"so",weight:20784},"ケ":{seq:"ke",weight:20633},"モ":{seq:"ho",weight:20070},"ノ":{seq:"no",weight:19572},"ズ":{seq:"zu",weight:19240},"ピ":{seq:"pi",weight:18692},"ホ":{seq:"ho",weight:18204},"ェ":{seq:"e",weight:17817},"ョ":{seq:"yo",weight:17731},"ペ":{seq:"pe",weight:14881},"ゴ":{seq:"go",weight:13931},"ヤ":{seq:"ya",weight:12526},"ギ":{seq:"gi",weight:10732},"ヨ":{seq:"yo",weight:10318},"ザ":{seq:"za",weight:10144},"ァ":{seq:"a",weight:10121},"ゼ":{seq:"ze",weight:7689},"ヒ":{seq:"hi",weight:7289},"ヘ":{seq:"he",weight:7129},"ユ":{seq:"yo",weight:6653},"ゲ":{seq:"ge",weight:6481},"ォ":{seq:"o",weight:6245},"ヌ":{seq:"nu",weight:2897},"ゾ":{seq:"zo",weight:2640},"ヴ":{seq:"vu",weight:1145},"ヂ":{seq:"di",weight:149},"ヅ":{seq:"du",weight:127},"ヲ":{seq:"wo",weight:122}}),e.Katakana=t,Object.freeze(t),Object.freeze(t.prototype)}(s||(s={})),Object.freeze(s)}}]); //# sourceMappingURL=Japanese-ts.js.map \ No newline at end of file diff --git a/dist/client/chunk/lang/Korean-ts.js b/dist/client/chunk/lang/Korean-ts.js index e93c1762..620e11c0 100644 --- a/dist/client/chunk/lang/Korean-ts.js +++ b/dist/client/chunk/lang/Korean-ts.js @@ -1,2 +1,2 @@ -(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[8],{23:function(a,o,e){"use strict";e.r(o),e.d(o,"Korean",(function(){return m}));var m,t=e(8);!function(a){class o extends t.a{constructor(a){super("kore-dub",r((a,e,m)=>[a,e,m].flatMap(a=>a.value in o.DUB_KEYBOARD?[a.value]:a.atoms.split("")).map(a=>o.DUB_KEYBOARD[a]).join("")),a)}}o.DUB_KEYBOARD=Object.freeze({"":"","ㅂ":"q","ㅈ":"w","ㄷ":"e","ㄱ":"r","ㅅ":"t","ㅛ":"y","ㅕ":"u","ㅑ":"i","ㅐ":"o","ㅔ":"p","ㅁ":"a","ㄴ":"s","ㅇ":"d","ㄹ":"f","ㅎ":"g","ㅗ":"h","ㅓ":"j","ㅏ":"k","ㅣ":"l","ㅋ":"z","ㅌ":"x","ㅊ":"c","ㅍ":"v","ㅠ":"b","ㅜ":"n","ㅡ":"m","ㅃ":"Q","ㅉ":"W","ㄸ":"E","ㄲ":"R","ㅆ":"T","ㅒ":"O","ㅖ":"P"}),a.Dubeolsik=o,Object.freeze(o),Object.freeze(o.prototype);class e extends t.a{constructor(a){super("kore-sub",r((a,o,m)=>e.SEB_KEYBOARD.INITIALS[a.value]+e.SEB_KEYBOARD.MEDIALS[o.value]+e.SEB_KEYBOARD.FINALS[m.value]),a)}}e.SEB_KEYBOARD=Object.freeze({FINALS:{"":"","ㅎ":"1","ㅆ":"2","ㅂ":"3","ㅅ":"q","ㄹ":"w","ㅇ":"a","ㄴ":"s","ㅁ":"z","ㄱ":"x","ㄲ":"!","ㄺ":"@","ㅈ":"#","ㄿ":"$","ㄾ":"%","ㅍ":"Q","ㅌ":"W","ㄵ":"E","ㅀ":"R","ㄽ":"T","ㄷ":"A","ㄶ":"S","ㄼ":"D","ㄻ":"F","ㅊ":"Z","ㅄ":"X","ㅋ":"C","ㄳ":"V"},MEDIALS:{"ㅛ":"4","ㅠ":"5","ㅑ":"6","ㅖ":"7","ㅢ":"8","ㅕ":"e","ㅐ":"r","ㅓ":"t","ㅣ":"d","ㅏ":"f","ㅡ":"g","ㅔ":"c","ㅗ":"v","ㅜ":"b","ㅒ":"G","ㅘ":"vf","ㅙ":"vr","ㅚ":"vd","ㅝ":"bt","ㅞ":"bc","ㅟ":"bd"},INITIALS:{"ㅋ":"0","ㄹ":"y","ㄷ":"u","ㅁ":"i","ㅊ":"o","ㅍ":"p","ㄴ":"h","ㅇ":"j","ㄱ":"k","ㅈ":"l","ㅂ":";","ㅌ":"'","ㅅ":"n","ㅎ":"m","ㄲ":"!","ㄸ":"uu","ㅃ":";;","ㅆ":"nn","ㅉ":"l"}}),a.Sebeolsik=e,Object.freeze(e),Object.freeze(e.prototype);class m extends t.a{constructor(a){super("kore-rom",r((a,o,e)=>a.roman+o.roman+e.roman),a)}}a.Romanization=m,Object.freeze(m),Object.freeze(m.prototype);const r=a=>{const o={};return n.forEach((e,m)=>{s.forEach((t,r)=>{u.forEach((n,v)=>{let c=m;c=s.length*c+r,c=u.length*c+v;const p=String.fromCharCode(44032+c);o[p]={seq:a(e,t,n),weight:l[p]||1}})})}),o},n=Object.freeze([{value:"ㄱ",atoms:"ㄱ",roman:"g"},{value:"ㄲ",atoms:"ㄱㄱ",roman:"kk"},{value:"ㄴ",atoms:"ㄴ",roman:"n"},{value:"ㄷ",atoms:"ㄷ",roman:"d"},{value:"ㄸ",atoms:"ㄷㄷ",roman:"tt"},{value:"ㄹ",atoms:"ㄹ",roman:"r"},{value:"ㅁ",atoms:"ㅁ",roman:"m"},{value:"ㅂ",atoms:"ㅂ",roman:"b"},{value:"ㅃ",atoms:"ㅂㅂ",roman:"pp"},{value:"ㅅ",atoms:"ㅅ",roman:"s"},{value:"ㅆ",atoms:"ㅅㅅ",roman:"ss"},{value:"ㅇ",atoms:"ㅇ",roman:"-"},{value:"ㅈ",atoms:"ㅈ",roman:"j"},{value:"ㅉ",atoms:"ㅈㅈ",roman:"jj"},{value:"ㅊ",atoms:"ㅊ",roman:"ch"},{value:"ㅋ",atoms:"ㅋ",roman:"k"},{value:"ㅌ",atoms:"ㅌ",roman:"t"},{value:"ㅍ",atoms:"ㅍ",roman:"p"},{value:"ㅎ",atoms:"ㅎ",roman:"h"}]),s=Object.freeze([{value:"ㅏ",atoms:"ㅏ",roman:"a"},{value:"ㅐ",atoms:"ㅐ",roman:"ae"},{value:"ㅑ",atoms:"ㅑ",roman:"ya"},{value:"ㅒ",atoms:"ㅒ",roman:"yae"},{value:"ㅓ",atoms:"ㅓ",roman:"eo"},{value:"ㅔ",atoms:"ㅔ",roman:"e"},{value:"ㅕ",atoms:"ㅕ",roman:"yeo"},{value:"ㅖ",atoms:"ㅖ",roman:"ye"},{value:"ㅗ",atoms:"ㅗ",roman:"o"},{value:"ㅘ",atoms:"ㅗㅏ",roman:"wa"},{value:"ㅙ",atoms:"ㅗㅐ",roman:"wae"},{value:"ㅚ",atoms:"ㅗㅣ",roman:"oe"},{value:"ㅛ",atoms:"ㅛ",roman:"yo"},{value:"ㅜ",atoms:"ㅜ",roman:"u"},{value:"ㅝ",atoms:"ㅜㅓ",roman:"wo"},{value:"ㅞ",atoms:"ㅜㅔ",roman:"we"},{value:"ㅟ",atoms:"ㅜㅣ",roman:"wi"},{value:"ㅠ",atoms:"ㅠ",roman:"yu"},{value:"ㅡ",atoms:"ㅡ",roman:"eu"},{value:"ㅢ",atoms:"ㅡㅣ",roman:"ui"},{value:"ㅣ",atoms:"ㅣ",roman:"i"}]),u=Object.freeze([{value:"",atoms:"",roman:""},{value:"ㄱ",atoms:"ㄱ",roman:"k"},{value:"ㄲ",atoms:"ㄱㄱ",roman:"k"},{value:"ㄳ",atoms:"ㄱㅅ",roman:"kt"},{value:"ㄴ",atoms:"ㄴ",roman:"n"},{value:"ㄵ",atoms:"ㄴㅈ",roman:"nt"},{value:"ㄶ",atoms:"ㄴㅎ",roman:"nt"},{value:"ㄷ",atoms:"ㄷ",roman:"t"},{value:"ㄹ",atoms:"ㄹ",roman:"l"},{value:"ㄺ",atoms:"ㄹㄱ",roman:"lk"},{value:"ㄻ",atoms:"ㄹㅁ",roman:"lm"},{value:"ㄼ",atoms:"ㄹㅂ",roman:"lp"},{value:"ㄽ",atoms:"ㄹㅅ",roman:"lt"},{value:"ㄾ",atoms:"ㄹㅌ",roman:"lt"},{value:"ㄿ",atoms:"ㄹㅍ",roman:"lp"},{value:"ㅀ",atoms:"ㄹㅎ",roman:"lt"},{value:"ㅁ",atoms:"ㅁ",roman:"m"},{value:"ㅂ",atoms:"ㅂ",roman:"p"},{value:"ㅄ",atoms:"ㅂㅅ",roman:"pt"},{value:"ㅅ",atoms:"ㅅ",roman:"t"},{value:"ㅆ",atoms:"ㅅㅅ",roman:"t"},{value:"ㅇ",atoms:"ㅇ",roman:"ng"},{value:"ㅈ",atoms:"ㅈ",roman:"t"},{value:"ㅊ",atoms:"ㅊ",roman:"t"},{value:"ㅋ",atoms:"ㅋ",roman:"k"},{value:"ㅌ",atoms:"ㅌ",roman:"t"},{value:"ㅍ",atoms:"ㅍ",roman:"p"},{value:"ㅎ",atoms:"ㅎ",roman:"t"}]),l=Object.freeze({"":1})}(m||(m={})),Object.freeze(m)}}]); +(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[8],{24:function(a,o,e){"use strict";e.r(o),e.d(o,"Korean",(function(){return m}));var m,t=e(9);!function(a){class o extends t.a{constructor(a){super("kore-dub",r((a,e,m)=>[a,e,m].flatMap(a=>a.value in o.DUB_KEYBOARD?[a.value]:a.atoms.split("")).map(a=>o.DUB_KEYBOARD[a]).join("")),a)}}o.DUB_KEYBOARD=Object.freeze({"":"","ㅂ":"q","ㅈ":"w","ㄷ":"e","ㄱ":"r","ㅅ":"t","ㅛ":"y","ㅕ":"u","ㅑ":"i","ㅐ":"o","ㅔ":"p","ㅁ":"a","ㄴ":"s","ㅇ":"d","ㄹ":"f","ㅎ":"g","ㅗ":"h","ㅓ":"j","ㅏ":"k","ㅣ":"l","ㅋ":"z","ㅌ":"x","ㅊ":"c","ㅍ":"v","ㅠ":"b","ㅜ":"n","ㅡ":"m","ㅃ":"Q","ㅉ":"W","ㄸ":"E","ㄲ":"R","ㅆ":"T","ㅒ":"O","ㅖ":"P"}),a.Dubeolsik=o,Object.freeze(o),Object.freeze(o.prototype);class e extends t.a{constructor(a){super("kore-sub",r((a,o,m)=>e.SEB_KEYBOARD.INITIALS[a.value]+e.SEB_KEYBOARD.MEDIALS[o.value]+e.SEB_KEYBOARD.FINALS[m.value]),a)}}e.SEB_KEYBOARD=Object.freeze({FINALS:{"":"","ㅎ":"1","ㅆ":"2","ㅂ":"3","ㅅ":"q","ㄹ":"w","ㅇ":"a","ㄴ":"s","ㅁ":"z","ㄱ":"x","ㄲ":"!","ㄺ":"@","ㅈ":"#","ㄿ":"$","ㄾ":"%","ㅍ":"Q","ㅌ":"W","ㄵ":"E","ㅀ":"R","ㄽ":"T","ㄷ":"A","ㄶ":"S","ㄼ":"D","ㄻ":"F","ㅊ":"Z","ㅄ":"X","ㅋ":"C","ㄳ":"V"},MEDIALS:{"ㅛ":"4","ㅠ":"5","ㅑ":"6","ㅖ":"7","ㅢ":"8","ㅕ":"e","ㅐ":"r","ㅓ":"t","ㅣ":"d","ㅏ":"f","ㅡ":"g","ㅔ":"c","ㅗ":"v","ㅜ":"b","ㅒ":"G","ㅘ":"vf","ㅙ":"vr","ㅚ":"vd","ㅝ":"bt","ㅞ":"bc","ㅟ":"bd"},INITIALS:{"ㅋ":"0","ㄹ":"y","ㄷ":"u","ㅁ":"i","ㅊ":"o","ㅍ":"p","ㄴ":"h","ㅇ":"j","ㄱ":"k","ㅈ":"l","ㅂ":";","ㅌ":"'","ㅅ":"n","ㅎ":"m","ㄲ":"!","ㄸ":"uu","ㅃ":";;","ㅆ":"nn","ㅉ":"l"}}),a.Sebeolsik=e,Object.freeze(e),Object.freeze(e.prototype);class m extends t.a{constructor(a){super("kore-rom",r((a,o,e)=>a.roman+o.roman+e.roman),a)}}a.Romanization=m,Object.freeze(m),Object.freeze(m.prototype);const r=a=>{const o={};return n.forEach((e,m)=>{s.forEach((t,r)=>{u.forEach((n,v)=>{let c=m;c=s.length*c+r,c=u.length*c+v;const p=String.fromCharCode(44032+c);o[p]={seq:a(e,t,n),weight:l[p]||1}})})}),o},n=Object.freeze([{value:"ㄱ",atoms:"ㄱ",roman:"g"},{value:"ㄲ",atoms:"ㄱㄱ",roman:"kk"},{value:"ㄴ",atoms:"ㄴ",roman:"n"},{value:"ㄷ",atoms:"ㄷ",roman:"d"},{value:"ㄸ",atoms:"ㄷㄷ",roman:"tt"},{value:"ㄹ",atoms:"ㄹ",roman:"r"},{value:"ㅁ",atoms:"ㅁ",roman:"m"},{value:"ㅂ",atoms:"ㅂ",roman:"b"},{value:"ㅃ",atoms:"ㅂㅂ",roman:"pp"},{value:"ㅅ",atoms:"ㅅ",roman:"s"},{value:"ㅆ",atoms:"ㅅㅅ",roman:"ss"},{value:"ㅇ",atoms:"ㅇ",roman:"-"},{value:"ㅈ",atoms:"ㅈ",roman:"j"},{value:"ㅉ",atoms:"ㅈㅈ",roman:"jj"},{value:"ㅊ",atoms:"ㅊ",roman:"ch"},{value:"ㅋ",atoms:"ㅋ",roman:"k"},{value:"ㅌ",atoms:"ㅌ",roman:"t"},{value:"ㅍ",atoms:"ㅍ",roman:"p"},{value:"ㅎ",atoms:"ㅎ",roman:"h"}]),s=Object.freeze([{value:"ㅏ",atoms:"ㅏ",roman:"a"},{value:"ㅐ",atoms:"ㅐ",roman:"ae"},{value:"ㅑ",atoms:"ㅑ",roman:"ya"},{value:"ㅒ",atoms:"ㅒ",roman:"yae"},{value:"ㅓ",atoms:"ㅓ",roman:"eo"},{value:"ㅔ",atoms:"ㅔ",roman:"e"},{value:"ㅕ",atoms:"ㅕ",roman:"yeo"},{value:"ㅖ",atoms:"ㅖ",roman:"ye"},{value:"ㅗ",atoms:"ㅗ",roman:"o"},{value:"ㅘ",atoms:"ㅗㅏ",roman:"wa"},{value:"ㅙ",atoms:"ㅗㅐ",roman:"wae"},{value:"ㅚ",atoms:"ㅗㅣ",roman:"oe"},{value:"ㅛ",atoms:"ㅛ",roman:"yo"},{value:"ㅜ",atoms:"ㅜ",roman:"u"},{value:"ㅝ",atoms:"ㅜㅓ",roman:"wo"},{value:"ㅞ",atoms:"ㅜㅔ",roman:"we"},{value:"ㅟ",atoms:"ㅜㅣ",roman:"wi"},{value:"ㅠ",atoms:"ㅠ",roman:"yu"},{value:"ㅡ",atoms:"ㅡ",roman:"eu"},{value:"ㅢ",atoms:"ㅡㅣ",roman:"ui"},{value:"ㅣ",atoms:"ㅣ",roman:"i"}]),u=Object.freeze([{value:"",atoms:"",roman:""},{value:"ㄱ",atoms:"ㄱ",roman:"k"},{value:"ㄲ",atoms:"ㄱㄱ",roman:"k"},{value:"ㄳ",atoms:"ㄱㅅ",roman:"kt"},{value:"ㄴ",atoms:"ㄴ",roman:"n"},{value:"ㄵ",atoms:"ㄴㅈ",roman:"nt"},{value:"ㄶ",atoms:"ㄴㅎ",roman:"nt"},{value:"ㄷ",atoms:"ㄷ",roman:"t"},{value:"ㄹ",atoms:"ㄹ",roman:"l"},{value:"ㄺ",atoms:"ㄹㄱ",roman:"lk"},{value:"ㄻ",atoms:"ㄹㅁ",roman:"lm"},{value:"ㄼ",atoms:"ㄹㅂ",roman:"lp"},{value:"ㄽ",atoms:"ㄹㅅ",roman:"lt"},{value:"ㄾ",atoms:"ㄹㅌ",roman:"lt"},{value:"ㄿ",atoms:"ㄹㅍ",roman:"lp"},{value:"ㅀ",atoms:"ㄹㅎ",roman:"lt"},{value:"ㅁ",atoms:"ㅁ",roman:"m"},{value:"ㅂ",atoms:"ㅂ",roman:"p"},{value:"ㅄ",atoms:"ㅂㅅ",roman:"pt"},{value:"ㅅ",atoms:"ㅅ",roman:"t"},{value:"ㅆ",atoms:"ㅅㅅ",roman:"t"},{value:"ㅇ",atoms:"ㅇ",roman:"ng"},{value:"ㅈ",atoms:"ㅈ",roman:"t"},{value:"ㅊ",atoms:"ㅊ",roman:"t"},{value:"ㅋ",atoms:"ㅋ",roman:"k"},{value:"ㅌ",atoms:"ㅌ",roman:"t"},{value:"ㅍ",atoms:"ㅍ",roman:"p"},{value:"ㅎ",atoms:"ㅎ",roman:"t"}]),l=Object.freeze({"":1})}(m||(m={})),Object.freeze(m)}}]); //# sourceMappingURL=Korean-ts.js.map \ No newline at end of file diff --git a/dist/client/chunk/lang/Morse-ts.js b/dist/client/chunk/lang/Morse-ts.js index d61a943f..f30dc33e 100644 --- a/dist/client/chunk/lang/Morse-ts.js +++ b/dist/client/chunk/lang/Morse-ts.js @@ -1,2 +1,2 @@ -(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[9],{24:function(e,t,n){"use strict";n.r(t),n.d(t,"Morse",(function(){return c}));var c,o=n(8);!function(e){class t extends o.a{}e.Encode=t,Object.freeze(t),Object.freeze(t.prototype);class n extends o.a{}e.Decode=n,Object.freeze(n),Object.freeze(n.prototype)}(c||(c={})),Object.freeze(c)}}]); +(window.webpackJsonpsnakey3=window.webpackJsonpsnakey3||[]).push([[9],{25:function(e,t,n){"use strict";n.r(t),n.d(t,"Morse",(function(){return c}));var c,o=n(9);!function(e){class t extends o.a{}e.Encode=t,Object.freeze(t),Object.freeze(t.prototype);class n extends o.a{}e.Decode=n,Object.freeze(n),Object.freeze(n.prototype)}(c||(c={})),Object.freeze(c)}}]); //# sourceMappingURL=Morse-ts.js.map \ No newline at end of file diff --git a/dist/client/index.js b/dist/client/index.js index 4de7034d..94bb82df 100644 --- a/dist/client/index.js +++ b/dist/client/index.js @@ -1,2 +1,2 @@ -var snakey3=function(e){function t(t){for(var n,s,r=t[0],a=t[1],i=0,c=[];i{Object.getOwnPropertyNames(t.prototype).forEach(n=>{Object.defineProperty(e.prototype,n,Object.getOwnPropertyDescriptor(t.prototype,n))})})}function a(e){for(const t of Object.getOwnPropertyNames(e)){const n=e[t];"object"==typeof n&&a(n)}return Object.freeze(e)}class i{}!function(e){let t;e.Family=Object.freeze({HUMAN:"HUMAN",CHASER:"CHASER"}),e.Family,function(e){e.NULL=void 0}(t=e.Id||(e.Id={})),e.MoveType=Object.freeze({NORMAL:"NORMAL",BOOST:"BOOST"}),e.MoveType}(i||(i={})),Object.freeze(i),Object.freeze(i.prototype);class c{}!function(e){let t,n;!function(e){e.REGEXP=new RegExp("^[a-zA-Z0-9!@#$%^&*()-_=+;:'\"\\|,.<>/?]+$")}(t=e.Seq||(e.Seq={})),function(e){e.NULL=Object.freeze({char:"",seq:""})}(n=e.CharSeqPair||(e.CharSeqPair={})),e.CHAR_HIT_COUNT_SEED_CEILING=5,e._RemapTemplates=Object.freeze({IDENTITY:e=>e,TO_LOWER:e=>e.toLowerCase()}),e._RemapTemplates,e.FrontendDescs=Object.freeze([{id:"engl-low",module:"English",export:"Lowercase",numLeaves:26,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"English Lowercase (qwerty)",blurb:""},{id:"engl-mix",module:"English",export:"MixedCase",numLeaves:52,remapFunc:e._RemapTemplates.IDENTITY,displayName:"English Mixed-Case (Querty)",blurb:""},{id:"japn-hir",module:"Japanese",export:"Hiragana",numLeaves:71,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Hiragana",blurb:""},{id:"japn-kat",module:"Japanese",export:"Katakana",numLeaves:70,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Katakana",blurb:""},{id:"kore-dub",module:"Korean",export:"Dubeolsik",numLeaves:9177,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Dubeolsik (두벌식 키보드)",blurb:"The most common keyboard layout, and South Korea's only Hangul standard since 1969. Consonants are on the left, and vowels on the right."},{id:"kore-sub",module:"Korean",export:"Sebeolsik",numLeaves:10206,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Sebeolsik (세벌식 최종 키보드)",blurb:"Another Hangul keyboard layout used in South Korea, and the final Sebeolsik layout designed by Dr. Kong Byung Woo, hence the name. Syllable-initial consonants are on the right, final consonants on the left, and vowels in the middle. It is more ergonomic than the dubeolsik, but not widely used."},{id:"kore-rom",module:"Korean",export:"Romanization",numLeaves:3990,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Korean Revised Romanization",blurb:"The Revised Romanization of Korean (국어의 로마자 표기법; 國語의 로마字 表記法) is the official South Korean language romanization system. It was developed by the National Academy of the Korean Language from 1995, and was released on 7 July 2000 by South Korea's Ministry of Culture and Tourism"},{id:"engl-cell-enc",module:"English",export:"OldCellphone.Encode",numLeaves:8,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Old Cellphone Keyboard",blurb:""}].map(e=>Object.freeze(e))),e.FrontendDescs,e.GET_FRONTEND_DESC_BY_ID=function(t){const n=e.FrontendDescs.find(e=>e.id===t);if(!n)throw new Error(`Frontend descriptor of language with id "${t}" not found.`);return n}}(c||(c={})),Object.freeze(c),Object.freeze(c.prototype)},function(e,t,n){"use strict";var s;n.d(t,"a",(function(){return s})),function(e){let t,n,s,o;!function(e){e.SERVER="SERVER",e.ONLINE="ONLINE",e.OFFLINE="OFFLINE"}(t=e.Type||(e.Type={})),function(e){e.EVENT_NAME="game-create",e.RETURN_TO_LOBBY_INDICATOR="return-to-lobby"}(n=e.CtorArgs||(e.CtorArgs={})),function(e){e.EVENT_NAME="game-reset"}(s=e.Serialization||(e.Serialization={})),function(e){e.PLAYING="PLAYING",e.PAUSED="PAUSED",e.OVER="OVER"}(o=e.Status||(e.Status={})),e.K=Object.freeze({HEALTH_UPDATE_CHANCE:.1,PCT_MOVES_THAT_ARE_BOOST:.05,HEALTH_EFFECT_FOR_DOWNED_PLAYER:.6,EVENT_RECORD_WRAPPING_BUFFER_LENGTH:128,EVENT_RECORD_FORWARD_WINDOW_LENGTH:64})}(s||(s={})),Object.freeze(s)},function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return d}));var s,o=n(1);!function(e){let t;!function(e){e.EUCLID2="EUCLID2",e.BEEHIVE="BEEHIVE"}(t=e.System||(e.System={}));class n{constructor(e){}}e.Abstract=n,function(t){class n extends e.Abstract{}t.Mathy=n}(n=e.Abstract||(e.Abstract={})),Object.freeze(n),Object.freeze(n.prototype)}(s||(s={})),Object.freeze(s);var r,a,i,c,l=function(e,t,n){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,n),n},u=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};class d{constructor(e){r.set(this,void 0),a.set(this,void 0),i.set(this,void 0),c.set(this,void 0),this.coord=e,l(this,r,o.b.Id.NULL)}reset(){this.evictOccupant(),this.lastKnownUpdateId=0,this.freeHealth=0,this.setLangCharSeqPair(o.a.CharSeqPair.NULL)}_setOccupant(e,t){l(this,r,e)}get isOccupied(){return this.occupantId!==o.b.Id.NULL}evictOccupant(){l(this,r,o.b.Id.NULL)}get occupantId(){return u(this,r)}get freeHealth(){return u(this,a)}set freeHealth(e){l(this,a,e)}setLangCharSeqPair(e){l(this,i,e.char),l(this,c,e.seq)}get langChar(){return u(this,i)}get langSeq(){return u(this,c)}}r=new WeakMap,a=new WeakMap,i=new WeakMap,c=new WeakMap,Object.freeze(d),Object.freeze(d.prototype)},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n.r(t),n.d(t,"OmHooks",(function(){return a.a})),n.d(t,"top",(function(){return ae}));var s,o,r,a=n(0),i=function(e,t,n,s){return new(n||(n=Promise))((function(o,r){function a(e){try{c(s.next(e))}catch(e){r(e)}}function i(e){try{c(s.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,i)}c((s=s.apply(e,t||[])).next())}))},c=function(e,t,n){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,n),n},l=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};class u{constructor(e,t,n,r){s.set(this,void 0),o.set(this,void 0),this.screenId=e,this.top=t,c(this,s,n),this.requestGoToScreen=r,c(this,o,!1)}get initialScreen(){return this.screenId}enter(e){return i(this,void 0,void 0,(function*(){if(!l(this,o)){const e=this.baseElem=document.createElement("div");e.classList.add(a.a.Screen.Class.BASE),this._lazyLoad(),l(this,s).appendChild(e);const t=this.screenId.replace(/[A-Z]/g,e=>" "+e);{const n=t.toUpperCase();this.top.prependComment(e,n+" SCREEN")}{const n=t.split(" ").map(e=>e.charAt(0).toUpperCase()+e.substring(1)).join(" ");e.setAttribute("aria-label",n+" Screen")}c(this,o,!0)}const t=new window.URL(window.location.href);t.hash=this.screenId,history.replaceState(null,"",t.href),yield this._abstractOnBeforeEnter(e),window.requestAnimationFrame(e=>{this.baseElem.dataset[a.a.Screen.Dataset.CURRENT]="",this.baseElem.setAttribute("aria-hidden","false")})}))}leave(){return!!this._abstractOnBeforeLeave()&&(delete this.baseElem.dataset[a.a.Screen.Dataset.CURRENT],this.baseElem.setAttribute("aria-hidden","true"),!0)}_abstractOnBeforeEnter(e){return i(this,void 0,void 0,(function*(){}))}_abstractOnBeforeLeave(){return!0}}s=new WeakMap,o=new WeakMap,function(e){let t;!function(e){e.HOME="home",e.HOW_TO_PLAY="howToPlay",e.HOW_TO_HOST="howToHost",e.COLOUR_CTRL="colourControl",e.SETUP_OFFLINE="setupOffline",e.PLAY_OFFLINE="playOffline",e.GROUP_JOINER="groupJoiner",e.SETUP_ONLINE="setupOnline",e.GROUP_LOBBY="groupLobby",e.PLAY_ONLINE="playOnline"}(t=e.Id||(e.Id={}))}(u||(u={})),Object.freeze(u),Object.freeze(u.prototype);class d extends u{_lazyLoad(){const e=a.a.Screen.Impl.Home.Class;this.baseElem.classList.add(a.a.General.Class.CENTER_CONTENTS,e.BASE);const t=this.navElem=document.createElement("div");t.classList.add(a.a.General.Class.TEXT_SELECT_DISABLED,a.a.General.Class.INPUT_GROUP,e.NAV),t.setAttribute("role","navigation"),t.addEventListener("pointerleave",()=>{var e;(null===(e=document.activeElement)||void 0===e?void 0:e.parentElement)===t&&document.activeElement.blur()});const n=(e,n)=>{e.classList.add(a.a.General.Class.CENTER_CONTENTS,a.a.General.Class.INPUT_GROUP_ITEM,n.cssClass),e.textContent=n.text,e.addEventListener("pointerenter",()=>{window.requestAnimationFrame(t=>{e.focus()}),this.top.sfx}),t.appendChild(e)};[{text:"Offline Single-player",cssClass:e.NAV_PLAY_OFFLINE,screenId:u.Id.SETUP_OFFLINE},{text:"Online Multi-player",cssClass:e.NAV_PLAY_ONLINE,screenId:u.Id.GROUP_JOINER},{text:"How To Play",cssClass:e.NAV_HOW_TO_PLAY,screenId:u.Id.HOW_TO_PLAY},{text:"How To Host",cssClass:e.NAV_HOW_TO_HOST,screenId:u.Id.HOW_TO_HOST},{text:"Colour Schemes",cssClass:e.NAV_COLOURS,screenId:u.Id.COLOUR_CTRL}].map(e=>Object.freeze(e)).forEach(e=>{const t=document.createElement("button");t.onclick=e.screenId instanceof Function?e.screenId:()=>{this.requestGoToScreen(e.screenId,{})},n(t,e)}),[{text:"Visit\nRepo",cssClass:e.NAV_VIEW_REPO,href:new window.URL("https://github.com/david-fong/SnaKey-NTS")},{text:"Report\nIssue",cssClass:e.NAV_RPT_ISSUE,href:new window.URL("https://github.com/david-fong/SnaKey-NTS/issues")}].map(e=>Object.freeze(e)).forEach(e=>{const t=document.createElement("a");t.href=e.href.toString(),t.referrerPolicy="strict-origin-when-cross-origin",t.rel="noopener",t.target="_blank",n(t,e)}),this.baseElem.appendChild(t)}}Object.freeze(d),Object.freeze(d.prototype);class p extends u{_lazyLoad(){}}Object.freeze(p),Object.freeze(p.prototype);class h extends u{_lazyLoad(){}}(h||(h={})).INSTRUCTIONS_STEPS=Object.freeze(["$ npm install 'https://github.com/david-fong/SnaKey-NTS#gh-pages'","$ npm run start","send the url to your friends"]),Object.freeze(h),Object.freeze(h.prototype),function(e){let t;e.LocalKeys=Object.freeze({MUSIC_VOLUME:"musicVolume",SFX_VOLUME:"sfxVolume",COLOUR_ID:"colourSchemeId",COLOUR_LITERAL:"colourSchemeStyleLiteral",GAME_PRESET:"gamePresetId",USERNAME:"username",AVATAR:"avatarId"}),e.SessionKeys=Object.freeze({}),function(e){let t;e.DB_NAME="snakeyDB",function(e){e.STORE_NAME="userGamePresets"}(t=e.UserGamePresetStore||(e.UserGamePresetStore={})),Object.freeze(t)}(t=e.IDB||(e.IDB={})),Object.freeze(t)}(r||(r={})),Object.freeze(r);var m,E,O,f,_,g,S=function(e,t,n){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,n),n},b=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};class v{constructor(){m.set(this,void 0),E.set(this,void 0),O.set(this,void 0);const e=document.createElement("div");e.tabIndex=0,e.classList.add(a.a.SkPickOne.Class.BASE),e.addEventListener("keydown",this.onKeyDown.bind(this)),e.setAttribute("role","listbox"),e.addEventListener("pointerenter",t=>{window.requestAnimationFrame(t=>{e.focus()})}),this.baseElem=e,this.options=[]}addOption(e){this.options.push(e),this.baseElem.appendChild(e.baseElem),e.baseElem.addEventListener("pointerenter",this.hoverOpt.bind(this,e)),e.baseElem.addEventListener("click",this.selectOpt.bind(this,e,!0)),e._registerParent(this.onOptDisabledChange.bind(this))}hoverOpt(e){var t;this.hoveredOpt!==e&&(null===(t=this.hoveredOpt)||void 0===t||t.baseElem.setAttribute("aria-active-descendant","false"),S(this,E,e),this.hoveredOpt.baseElem.setAttribute("aria-active-descendant","true"))}selectOpt(e,t=!0){var n;if(!e)throw new Error("opt must be defined");this.hoverOpt(e),this.confirmedOpt!==e&&(null===(n=this.confirmedOpt)||void 0===n||n.baseElem.setAttribute("aria-selected","false"),S(this,m,e),this.confirmedOpt.baseElem.setAttribute("aria-selected","true"),t&&this._onSelectOpt(e))}get confirmedOpt(){return b(this,m)}get hoveredOpt(){return b(this,E)}onOptDisabledChange(e){this.confirmedOpt===e&&(this.isValid=!e.disabled)}set isValid(e){this.isValid!==e&&(this.baseElem.setAttribute("aria-invalid",e?"false":"true"),S(this,O,e))}get isValid(){return b(this,O)}onKeyDown(e){if(" "===e.key||"Enter"===e.key)return this.selectOpt(this.hoveredOpt),e.preventDefault(),!1;{const t=this.options.indexOf(this.hoveredOpt);if("ArrowDown"===e.key||"Down"===e.key)for(let n=t+1;n=0;n--){const t=this.options[n];if(!t.disabled)return this.hoverOpt(t),e.preventDefault(),!1}}return!0}}m=new WeakMap,E=new WeakMap,O=new WeakMap,f=v||(v={}),_=new WeakMap,g=new WeakMap,f._Option=class{constructor(){_.set(this,void 0),g.set(this,void 0);const e=this.baseElem=document.createElement("div");e.classList.add(a.a.SkPickOne.Class.OPT_BASE),e.setAttribute("role","option"),S(this,_,!1)}_registerParent(e){S(this,g,e)}get disabled(){return b(this,_)}set disabled(e){this.disabled!==e&&(this.baseElem.setAttribute("aria-disabled",e?"true":"false"),S(this,_,e),b(this,g).call(this,this))}},Object.freeze(f),Object.freeze(f.prototype),Object.freeze(v),Object.freeze(v.prototype),n(5);const T=a.a.Screen.Impl.ColourCtrl.Class;a.a.General.Class;class y extends u{constructor(){super(...arguments),this.canBeInitialScreen=!0}_lazyLoad(){const e=new y.PickOne;this.baseElem.appendChild(e.baseElem),this.sel=e;const t=localStorage.getItem(r.LocalKeys.COLOUR_ID);t&&this.sel.selectOpt(this.sel.getOptById(t),!1)}}var L;!function(e){class t extends v{constructor(){var e;if(super(),this.baseElem.classList.add(T.BASE),this.garageDoorElem=document.getElementById(a.a.Screen.Id.SCREEN_TINT),!this.garageDoorElem)throw new Error;this.garageDoorElem.style.transitionDuration=L.SMOOTH_CHANGE_DURATION/3+"ms",L.Schemes.forEach(e=>{this.addOption(new t.Option(e))}),this.selectOpt(this.getOptById(null!==(e=localStorage.getItem(r.LocalKeys.COLOUR_ID))&&void 0!==e?e:"snakey"),!1)}_onHoverOpt(e){}_onSelectOpt(e){{const e=document.documentElement.style;for(const t of L.Swatch){const n="--colour-"+t;e.setProperty(n,"")}}localStorage.setItem(r.LocalKeys.COLOUR_ID,e.desc.id),localStorage.setItem(r.LocalKeys.COLOUR_LITERAL,e.cssLiteral);const t=L.SMOOTH_CHANGE_DURATION/3,n=this.garageDoorElem.style;n.opacity="1.0",n.pointerEvents="all",this.baseElem.style.pointerEvents="none",setTimeout(()=>{document.documentElement.dataset[a.a.General.Dataset.COLOUR_SCHEME]=e.desc.id,setTimeout(()=>{n.opacity="0.0",n.pointerEvents="",this.baseElem.style.pointerEvents=""},t)},t)}getOptById(e){return this.options.find(t=>t.desc.id===e)}}e.PickOne=t,function(e){class t extends v._Option{constructor(e){super(),this.desc=e,this.baseElem.classList.add(T.OPTION);const n=document.createElement("span");n.classList.add(T.OPTION_LABEL),n.textContent=e.displayName,this.baseElem.appendChild(n);const s=document.createElement("span");s.classList.add(T.OPTION_PREVIEW),s.dataset[a.a.General.Dataset.COLOUR_SCHEME]=e.id;for(let e=0;eObject.freeze(e))),e.SMOOTH_CHANGE_DURATION=2e3}(L||(L={})),Object.freeze(L);var N=n(1),I=n(3);class C extends u{_lazyLoad(){this.baseElem.classList.add(a.a.Screen.Impl.Setup.Class.BASE),this.langSel=new C.LangPickOne,this.baseElem.appendChild(this.langSel.baseElem);const e=this.nextBtn=document.createElement("button");e.classList.add(a.a.Screen.Impl.Setup.Class.NEXT_BUTTON),e.textContent="Next",this.baseElem.appendChild(e)}_abstractOnBeforeEnter(){return this.nextBtn.focus(),Promise.resolve()}}!function(e){e.DEFAULT_PRESET={coordSys:I.a.System.EUCLID2,gridDimensions:{height:21,width:21},averageFreeHealthPerTile:1/45,langWeightScaling:1,langId:"engl-low",playerDescs:[{isALocalOperator:!0,familyId:"HUMAN",teamId:0,socketId:void 0,username:"hello1",noCheckGameOver:!1,familyArgs:{}},{isALocalOperator:!0,familyId:"HUMAN",teamId:1,socketId:void 0,username:"hello2",noCheckGameOver:!1,familyArgs:{}},{isALocalOperator:!1,familyId:"CHASER",teamId:1,socketId:void 0,username:"chaser1",noCheckGameOver:!0,familyArgs:{}},{isALocalOperator:!1,familyId:"CHASER",teamId:1,socketId:void 0,username:"chaser2",noCheckGameOver:!0,familyArgs:{fearDistance:6,bloodThirstDistance:5,healthReserve:5,keyPressesPerSecond:1.8}}]};class t extends v{constructor(){super(),N.a.FrontendDescs.forEach(e=>{this.addOption(new t.Option(e))}),this.selectOpt(this.options[0])}_onHoverOpt(e){}_onSelectOpt(e){}}e.LangPickOne=t,function(e){class t extends v._Option{constructor(e){super(),this.desc=e,this.baseElem.textContent=e.displayName}}e.Option=t,Object.freeze(t),Object.freeze(t.prototype)}(t=e.LangPickOne||(e.LangPickOne={}))}(C||(C={})),Object.freeze(C),Object.freeze(C.prototype);class R extends C{_lazyLoad(){super._lazyLoad(),this.nextBtn.onclick=e=>{const t=Object.assign({},C.DEFAULT_PRESET);t.langId=this.langSel.confirmedOpt.desc.id,this.requestGoToScreen(u.Id.PLAY_OFFLINE,t)}}_abstractOnBeforeEnter(e){return Promise.resolve()}}Object.freeze(R),Object.freeze(R.prototype);var P,A,w,G,U=n(2),k=function(e,t,n,s){return new(n||(n=Promise))((function(o,r){function a(e){try{c(s.next(e))}catch(e){r(e)}}function i(e){try{c(s.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,i)}c((s=s.apply(e,t||[])).next())}))},B=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)},H=function(e,t,n){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,n),n};class D extends u{constructor(){super(...arguments),P.set(this,void 0),A.set(this,void 0),w.set(this,void 0),G.set(this,void 0)}_lazyLoad(){this.baseElem.classList.add(a.a.General.Class.CENTER_CONTENTS,a.a.Screen.Impl.Play.Class.BASE);const e=D.createCenterColElem();this._gridBaseElem=e.grid,this._gridImplHost=e.implHost,this._gridImplHost.appendChild(document.createComment("grid impl host")),this.baseElem.appendChild(e.top),e.pauseOl.addEventListener("click",e=>{const t=this.currentGame;t&&t.status===U.a.Status.PAUSED&&this._statusBecomePlaying()}),this._initializeControlsBar(),this._initializePlayersBar(),H(this,A,()=>{if(this.wantsAutoPause)if(document.hidden){if(void 0===B(this,G)){const e=this.currentGame;(!e||e&&e.status!==U.a.Status.OVER)&&this._statusBecomePaused()}}else"page-hide"===B(this,G)&&this._statusBecomePlaying()}),H(this,w,this._gridKeyDownCallback.bind(this))}_abstractOnBeforeEnter(e){return k(this,void 0,void 0,(function*(){document.addEventListener("visibilitychange",B(this,A)),this.pauseButton.disabled=!0,this._statusBecomePaused(),H(this,P,yield this._createNewGame(e)),this._gridBaseElem.addEventListener("keydown",B(this,w)),yield this.currentGame.reset();const t=this.currentGame.htmlElements;this._gridImplHost.appendChild(t.gridImpl),this.playersBar.appendChild(t.playersBar),this.pauseButton.onclick=this._statusBecomePlaying.bind(this),this.pauseButton.disabled=!1,this.wantsAutoPause&&setTimeout(()=>{document.hidden||this._statusBecomePlaying()},500)}))}_abstractOnBeforeLeave(){if(!window.confirm("Are you sure you would like to leave?"))return!1;document.removeEventListener("visibilitychange",B(this,A));const e=this.currentGame;e.statusBecomePaused();for(const t of Object.values(e.htmlElements))t.textContent="",t.remove();return this._gridBaseElem.removeEventListener("keydown",B(this,w)),H(this,P,void 0),!0}get currentGame(){return B(this,P)}_gridKeyDownCallback(e){const t=this.currentGame;if(e.ctrlKey&&" "===e.key&&!e.repeat){const e=t.operators;t.setCurrentOperator((1+e.indexOf(t.currentOperator))%e.length)}else t.currentOperator.processKeyboardInput(e);return" "!==e.key||(e.preventDefault(),!1)}_statusBecomePlaying(){var e;const t=a.a.Grid.Dataset.GAME_STATE;null===(e=this.currentGame)||void 0===e||e.statusBecomePlaying(),this.pauseButton.textContent="Pause",H(this,G,void 0),this._gridBaseElem.dataset[t.KEY]=t.VALUES.PLAYING,window.requestAnimationFrame(e=>{this.pauseButton.onclick=this._statusBecomePaused.bind(this),this.resetButton.disabled=!0,this._gridBaseElem.focus()})}_statusBecomePaused(){var e;const t=a.a.Grid.Dataset.GAME_STATE;null===(e=this.currentGame)||void 0===e||e.statusBecomePaused(),this.pauseButton.textContent="Unpause",H(this,G,document.hidden?"page-hide":"other"),this._gridBaseElem.dataset[t.KEY]=t.VALUES.PAUSED,this.pauseButton.onclick=this._statusBecomePlaying.bind(this),this.resetButton.disabled=!1}_onGameBecomeOver(){const e=a.a.Grid.Dataset.GAME_STATE;this.pauseButton.disabled=!0,this.resetButton.disabled=!1,this._gridBaseElem.dataset[e.KEY]=e.VALUES.OVER}_resetGame(){this.currentGame.reset(),this.pauseButton.disabled=!1,this.wantsAutoPause&&this._statusBecomePlaying()}_initializeControlsBar(){const e=document.createElement("div");function t(t){const n=document.createElement("button");return n.textContent=t,n.classList.add(a.a.General.Class.INPUT_GROUP_ITEM),n.addEventListener("pointerenter",e=>{window.requestAnimationFrame(e=>{n.focus()})}),e.appendChild(n),n}e.classList.add(a.a.General.Class.CENTER_CONTENTS,a.a.General.Class.INPUT_GROUP,a.a.Screen.Impl.Play.Class.CONTROLS_BAR),e.setAttribute("role","menu"),e.addEventListener("pointerleave",e=>{window.requestAnimationFrame(e=>{this._gridBaseElem.focus()})});(this.backToHomeButton=t("Return To Homepage")).onclick=this.requestGoToScreen.bind(this,u.Id.HOME);this.pauseButton=t("");(this.resetButton=t("Reset")).onclick=this._resetGame.bind(this);this.baseElem.appendChild(e)}_initializePlayersBar(){const e=this.playersBar=document.createElement("div");e.classList.add(a.a.Screen.Impl.Play.Class.PLAYERS_BAR),this.baseElem.appendChild(e)}}P=new WeakMap,A=new WeakMap,w=new WeakMap,G=new WeakMap,(D||(D={})).createCenterColElem=function(){const e=a.a.Grid.Class,t=a.a.General.Class,n=document.createElement("div");n.classList.add(a.a.Screen.Impl.Play.Class.GRID_WRAPPER);const s=document.createElement("div");s.tabIndex=0,s.setAttribute("role","textbox"),s.setAttribute("aria-label","Game Grid"),s.classList.add(t.STACK_CONTENTS,t.TEXT_SELECT_DISABLED,e.GRID);const o=document.createElement("div");o.setAttribute("role","presentation"),o.classList.add(e.SCROLL_OUTER);{const n=document.createElement("div");n.classList.add(t.FILL_PARENT,t.CENTER_CONTENTS,e.KBD_DC);{const t=document.createElement("div");t.classList.add(e.KBD_DC_ICON),t.textContent="(click here to continue typing)",n.appendChild(t)}o.appendChild(n)}const r=document.createElement("div");r.classList.add(t.FILL_PARENT,t.CENTER_CONTENTS,e.PAUSE_OL);{const t=document.createElement("div");t.classList.add(e.PAUSE_OL_ICON),t.textContent="(Click to Unpause)",r.appendChild(t)}return o.appendChild(r),s.appendChild(o),n.appendChild(s),Object.freeze({top:n,grid:s,intersectionRoot:o,implHost:o,pauseOl:r})},Object.freeze(D),Object.freeze(D.prototype);var x=function(e,t,n,s){return new(n||(n=Promise))((function(o,r){function a(e){try{c(s.next(e))}catch(e){r(e)}}function i(e){try{c(s.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,i)}c((s=s.apply(e,t||[])).next())}))};class z extends D{constructor(){super(...arguments),this.wantsAutoPause=!0}get initialScreen(){return u.Id.SETUP_OFFLINE}_lazyLoad(){super._lazyLoad()}_createNewGame(e){return x(this,void 0,void 0,(function*(){return new((yield Promise.all([n.e(0),n.e(1)]).then(n.bind(null,26))).OfflineGame)(this._onGameBecomeOver.bind(this),e)}))}}Object.freeze(z),Object.freeze(z.prototype);class j{}!function(e){let t;e.PROTOCOL="http://",e.DEFAULT_PORT=8080,function(e){e.GROUP_LOBBY_PREFIX="/group-",e.GROUP_JOINER="/joiner"}(t=e.Nsps||(e.Nsps={}))}(j||(j={})),Object.freeze(j),Object.freeze(j.prototype);class F{}!function(e){let t,n,s;!function(e){e.REGEXP=/(?:[a-zA-Z0-9:-]+)/,e.MaxLength=30}(t=e.Name||(e.Name={})),function(e){e.REGEXP=/(?:[a-zA-Z0-9:-]+)/,e.MaxLength=30}(n=e.Passphrase||(e.Passphrase={})),e.JoinerReconnectionAttempts=2,e.DEFAULT_TTL=60,function(e){e.EVENT_NAME="group-exist";class t{constructor(e,t){this.groupName=e,this.passphrase=t}}let n;e.RequestCreate=t,function(e){let t;!function(e){e.OKAY="okay",e.NOPE="nope"}(t=e.Response||(e.Response={}))}(t=e.RequestCreate||(e.RequestCreate={})),function(e){e.IN_LOBBY="in-lobby",e.IN_GAME="in-game",e.DELETE="delete"}(n=e.Status||(e.Status={}))}(s=e.Exist||(e.Exist={}))}(F||(F={})),Object.freeze(F),Object.freeze(F.prototype);var M,W=function(e,t,n,s){return new(n||(n=Promise))((function(o,r){function a(e){try{c(s.next(e))}catch(e){r(e)}}function i(e){try{c(s.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,i)}c((s=s.apply(e,t||[])).next())}))},V=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)},Y=function(e,t,n){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,n),n};class K extends u{constructor(){super(...arguments),M.set(this,void 0)}_lazyLoad(){this.baseElem.classList.add(a.a.General.Class.CENTER_CONTENTS,a.a.Screen.Impl.GroupJoiner.Class.BASE);const e=this._initializeFormContents(),t=this._initializeHostUrlHandlers();this._initializeGroupNameHandlers(t),this._initializePassphraseHandlers(),e.onsubmit=e=>{this.isGroupOwner?this.requestGoToScreen(u.Id.SETUP_ONLINE,{}):this.requestGoToScreen(u.Id.GROUP_LOBBY,{})},this._setFormState(q.CHOOSING_HOST),this.baseElem.appendChild(e)}_abstractOnBeforeEnter(e){return W(this,void 0,void 0,(function*(){window.setTimeout(()=>{this.socket&&this.socket.nsp.startsWith(j.Nsps.GROUP_LOBBY_PREFIX)?this.groupNameInput.focus():this.hostUrlInput.focus()},100)}))}get state(){return V(this,M)}_setFormState(e){if(this.state!==e){if(e===q.IN_GROUP){if(this.state!==q.CHOOSING_GROUP)throw new Error("never");this.passphraseInput.disabled=!0,this.nextButton.disabled=!1,this.nextButton.focus()}else this.nextButton.disabled=!0,e===q.CHOOSING_HOST?(this.groupNameInput.disabled=!0,this.groupNameInput.value="",this.groupNameDataList.innerText="",this.passphraseInput.disabled=!0,this.passphraseInput.value="",this.hostUrlInput.focus()):e===q.CHOOSING_GROUP&&(this.groupNameInput.disabled=!1,this.passphraseInput.disabled=!1,this.groupNameInput.focus());Y(this,M,e)}}_initializeHostUrlHandlers(){const e=this.top,t=this.hostUrlInput,n=()=>W(this,void 0,void 0,(function*(){var n;if(t.value.startsWith(j.PROTOCOL)||(t.value=new URL(j.PROTOCOL+t.value).origin),!t.value||!t.validity.valid)return;const s=new URL(t.value+j.Nsps.GROUP_JOINER);if(this.socket&&this.socket.nsp===j.Nsps.GROUP_JOINER&&this.socket.io.opts.hostname===s.hostname)return this.socket.connected?(this._setFormState(q.CHOOSING_GROUP),void this.groupNameInput.focus()):void 0;null===(n=this.socket)||void 0===n||n.close(),this.socket=(yield e.socketIo)(s.toString(),{reconnectionAttempts:F.JoinerReconnectionAttempts}),this.socket.on("connect",()=>{this._setFormState(q.CHOOSING_GROUP),this.socket.on(F.Exist.EVENT_NAME,this.onNotifyGroupExist.bind(this))}),this.socket.on("connect_error",e=>{this.socket=void 0,this.top.toast("Unable to connected to the specified server.")}),this.socket.on("disconnect",n=>{"io server disconnect"===n&&(this.socket=void 0,this._setFormState(q.CHOOSING_HOST),t.value="",e.toast("The server disconnected you from the group joiner."))})}));return t.oninput=e=>this._setFormState(q.CHOOSING_HOST),t.onkeydown=e=>{"Enter"===e.key&&n()},t.onpaste=e=>{window.setTimeout(()=>n(),0)},t.onchange=()=>{n()},n}onNotifyGroupExist(e){if(e===F.Exist.RequestCreate.Response.NOPE)return void this.top.toast(`The server rejected your request to create a new group "${this.groupNameInput.value}".`);const t=this.groupNameDataList,n=Array.from(t.children);for(const[s,o]of Object.entries(e)){const e=n.find(e=>e.value===s)||(()=>{const e=document.createElement("option");e.value=s;for(const s of n)if(e.value.localeCompare(s.value)<0){t.insertBefore(e,s);break}return e.parentElement||t.appendChild(e),e})();switch(o){case F.Exist.Status.IN_LOBBY:e.remove();break;case F.Exist.Status.IN_GAME:e.textContent="In Game";break;case F.Exist.Status.DELETE:e.textContent="In Lobby"}}e===F.Exist.RequestCreate.Response.OKAY&&(console.info(`server accepted request to create new group \`${this.groupNameInput.value}\`.`),console.log("connecting to new group..."),this.attemptToJoinExistingGroup())}_initializeGroupNameHandlers(e){const t=this.groupNameInput,n=()=>{t.value&&t.validity.valid&&(this.state===q.IN_GROUP?this.nextButton.focus():this.passphraseInput.focus())};this.groupNameInput.oninput=t=>W(this,void 0,void 0,(function*(){this.state===q.IN_GROUP&&(yield e()),this.passphraseInput.value="",this.isGroupOwner=!1})),t.onkeydown=e=>{"Enter"===e.key&&n()},t.onchange=e=>{n()}}_initializePassphraseHandlers(){const e=()=>W(this,void 0,void 0,(function*(){if(!this.passphraseInput.validity.valid)return;if(this.socket.nsp===j.Nsps.GROUP_LOBBY_PREFIX+this.groupNameInput.value)return this.socket.connected?(this._setFormState(q.IN_GROUP),void this.nextButton.focus()):void 0;Array.from(this.groupNameDataList.children).some(e=>e.value===this.groupNameInput.value)?(this.isGroupOwner=!1,yield this.attemptToJoinExistingGroup()):(this.isGroupOwner=!0,this.socket.emit(F.Exist.EVENT_NAME,new F.Exist.RequestCreate(this.groupNameInput.value,this.passphraseInput.value)))}));this.passphraseInput.onkeydown=t=>{"Enter"===t.key&&e()}}attemptToJoinExistingGroup(){var e;return W(this,void 0,void 0,(function*(){const t=(()=>{const e=new URL(this.hostUrlInput.value);return e.pathname=j.Nsps.GROUP_LOBBY_PREFIX+this.groupNameInput.value,e.toString()})();null===(e=this.socket)||void 0===e||e.close();const n=this.top;this.socket=(yield n.socketIo)(t,{query:{passphrase:this.passphraseInput.value}}),this.socket.on("connect",()=>{this._setFormState(q.IN_GROUP)}),this.socket.on("connect_error",e=>{this.socket=void 0,n.toast("Unable to connect to the specified group.")}),this.socket.on("disconnect",e=>{"io server disconnect"===e&&(this.socket=void 0,n.toast("The server disconnected you from your group."),this.requestGoToScreen(u.Id.GROUP_JOINER,{}))})}))}get socket(){return this.top.socket}set socket(e){this.top.socket=e}_initializeFormContents(){const e=a.a.Screen.Impl.GroupJoiner.Class,t=document.createElement("form");function n(e){const n=document.createElement("input");n.classList.add(a.a.General.Class.INPUT_GROUP_ITEM),n.type="text",n.autocomplete="off",n.spellcheck=!1;const s=document.createElement("label");return s.textContent=e,s.appendChild(n),t.appendChild(s),n}t.classList.add(a.a.General.Class.INPUT_GROUP,e.CONTENT_WRAPPER);{const t=this.hostUrlInput=n("Host URL");t.type="url",t.classList.add(e.HOST_URL),t.autocomplete="on";const s=K.SUGGEST_HOST(this.top.webpageHostType);if(s){const e=document.createElement("option");e.value=s.value,e.textContent=s.description,document.getElementById(a.a.GLOBAL_IDS.PUBLIC_GAME_HOST_URLS).insertAdjacentElement("afterbegin",e)}t.setAttribute("list",a.a.GLOBAL_IDS.PUBLIC_GAME_HOST_URLS),t.maxLength=128}{const t=this.groupNameInput=n("Group Name");t.classList.add(e.GROUP_NAME),t.pattern=F.Name.REGEXP.source,t.maxLength=F.Name.MaxLength;const s=this.groupNameDataList=document.createElement("datalist");s.id=a.a.GLOBAL_IDS.CURRENT_HOST_GROUPS,this.baseElem.appendChild(s),t.setAttribute("list",s.id)}{const t=this.passphraseInput=n("Group Passphrase");t.classList.add(e.PASSPHRASE),t.pattern=F.Passphrase.REGEXP.source,t.maxLength=F.Passphrase.MaxLength}{const n=this.nextButton=document.createElement("input");n.type="submit",n.classList.add(a.a.General.Class.INPUT_GROUP_ITEM,e.NEXT_BUTTON),n.textContent=n.value="Next",t.appendChild(n)}return t}}M=new WeakMap,function(e){let t;!function(e){e.CHOOSING_HOST="choosing-host",e.CHOOSING_GROUP="choosing-group",e.IN_GROUP="in-group"}(t=e.State||(e.State={})),e.SUGGEST_HOST=function(e){switch(e){case"github":return;case"filesystem":return{value:"localhost:"+j.DEFAULT_PORT,description:"dev shortcut :)"};case"sk-server":return{value:window.location.origin,description:"this page's server"};default:return}}}(K||(K={}));const q=K.State;Object.freeze(K),Object.freeze(K.prototype);class J extends C{get initialScreen(){return u.Id.GROUP_JOINER}_lazyLoad(){super._lazyLoad(),this.nextBtn.onclick=e=>{const t=Object.assign({},C.DEFAULT_PRESET);t.langId=this.langSel.confirmedOpt.desc.id,this.requestGoToScreen(u.Id.GROUP_LOBBY,t)}}_abstractOnBeforeEnter(e){return Promise.resolve()}}Object.freeze(J),Object.freeze(J.prototype);var X=function(e,t,n,s){return new(n||(n=Promise))((function(o,r){function a(e){try{c(s.next(e))}catch(e){r(e)}}function i(e){try{c(s.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,i)}c((s=s.apply(e,t||[])).next())}))};class $ extends u{get initialScreen(){return u.Id.GROUP_JOINER}_lazyLoad(){}_abstractOnBeforeEnter(e){return this.top.socket.once(U.a.CtorArgs.EVENT_NAME,e=>X(this,void 0,void 0,(function*(){this.requestGoToScreen(u.Id.PLAY_ONLINE,e)}))),Promise.resolve()}_abstractOnBeforeLeave(){return this.top.socket.removeListener(U.a.CtorArgs.EVENT_NAME),!0}}Object.freeze($),Object.freeze($.prototype);var Z=function(e,t,n,s){return new(n||(n=Promise))((function(o,r){function a(e){try{c(s.next(e))}catch(e){r(e)}}function i(e){try{c(s.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,i)}c((s=s.apply(e,t||[])).next())}))};class Q extends D{constructor(){super(...arguments),this.wantsAutoPause=!1}get initialScreen(){return u.Id.GROUP_JOINER}_lazyLoad(){super._lazyLoad()}_createNewGame(e){return Z(this,void 0,void 0,(function*(){const t=new((yield Promise.all([n.e(0),n.e(2)]).then(n.bind(null,25))).OnlineGame)(this._onGameBecomeOver.bind(this),this.top.socket,e);return Promise.resolve(t)}))}}Object.freeze(Q),Object.freeze(Q.prototype);var ee,te,ne=function(e,t,n){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,n),n},se=function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};class oe{constructor(e,t){ee.set(this,void 0),t.setAttribute("role","presentation");const n=u.Id,s=e,o=t,r=this.goToScreen.bind(this);this.dict=Object.freeze({[n.HOME]:new d(n.HOME,s,o,r),[n.HOW_TO_PLAY]:new p(n.HOW_TO_PLAY,s,o,r),[n.HOW_TO_HOST]:new h(n.HOW_TO_HOST,s,o,r),[n.COLOUR_CTRL]:new y(n.COLOUR_CTRL,s,o,r),[n.SETUP_OFFLINE]:new R(n.SETUP_OFFLINE,s,o,r),[n.PLAY_OFFLINE]:new z(n.PLAY_OFFLINE,s,o,r),[n.GROUP_JOINER]:new K(n.GROUP_JOINER,s,o,r),[n.SETUP_ONLINE]:new J(n.SETUP_ONLINE,s,o,r),[n.GROUP_LOBBY]:new $(n.GROUP_LOBBY,s,o,r),[n.PLAY_ONLINE]:new Q(n.PLAY_ONLINE,s,o,r)});const a=window.location.hash.slice(1),i=this.dict[a];i&&i.initialScreen?this.goToScreen(i.initialScreen,{}):this.goToScreen(u.Id.HOME,{})}goToScreen(e,t){const n=this.dict[e];if(this.currentScreen===n)throw new Error("never happens. see comment in source.");return!(!this.currentScreen||this.currentScreen.leave())||(n.enter(t),ne(this,ee,n),!0)}get currentScreen(){return se(this,ee)}}ee=new WeakMap,Object.freeze(oe),Object.freeze(oe.prototype);class re{constructor(){te.set(this,void 0),this.webpageHostType=window.location.origin.match(/github\.io/)?re.WebpageHostType.GITHUB:window.location.protocol.startsWith("file")?re.WebpageHostType.FILESYSTEM:re.WebpageHostType.SNAKEY_SERVER;const e=document.getElementById(a.a.Screen.Id.ALL_SCREENS);if(!e)throw new Error;this.prependComment(e,"ALL SCREENS CONTAINER"),this.allScreens=new oe(this,e),console.log("%c🩺 welcome! 🐍","font:700 2.3em /1.5 monospace; margin:0.4em; border:0.3em solid black;padding:0.4em; color:white; background-color:#3f5e77; border-radius:0.7em; ")}toast(e){console.info(e)}prependComment(e,t){e.parentNode.insertBefore(document.createComment(" "+t+" "),e)}get socketIo(){return(()=>{let e;return e||new Promise((e,t)=>{const n=document.createElement("script");n.onload=()=>{e(io)},n.src=document.getElementById("socket.io-preload").href,document.body.appendChild(n)})})()}get game(){var e;return null!==(e=this.allScreens.dict.playOffline.currentGame)&&void 0!==e?e:this.allScreens.dict.playOnline.currentGame}}te=new WeakMap,function(e){let t;!function(e){e.GITHUB="github",e.FILESYSTEM="filesystem",e.SNAKEY_SERVER="sk-server"}(t=e.WebpageHostType||(e.WebpageHostType={}))}(re||(re={})),Object.freeze(re),Object.freeze(re.prototype),n(4);const ae=new re;ae.webpageHostType===re.WebpageHostType.GITHUB&&"serviceWorker"in navigator&&window.addEventListener("load",(function(){navigator.serviceWorker.register("/ServiceWorker.js").then(e=>{console.log("ServiceWorker registration successful with scope: ",e.scope)},e=>{console.log("ServiceWorker registration failed: ",e)})}))}]); +var snakey3=function(e){function t(t){for(var s,n,r=t[0],i=t[1],o=0,c=[];o{Object.getOwnPropertyNames(t.prototype).forEach(s=>{Object.defineProperty(e.prototype,s,Object.getOwnPropertyDescriptor(t.prototype,s))})})}function r(e){for(const t of Object.getOwnPropertyNames(e)){const s=e[t];"object"==typeof s&&r(s)}return Object.freeze(e)}class i{}!function(e){let t,s,n;e.Family=Object.freeze({HUMAN:"HUMAN",CHASER:"CHASER"}),e.Family,function(e){e.NULL=void 0}(t=e.Id||(e.Id={})),function(e){e.REGEXP=/[ a-zA-Z0-9:-]+/,e.MAX_LENGTH=15}(s=e.Username||(e.Username={})),function(e){e.LOREM_IPSUM="lorem-ipsum"}(n=e.Avatar||(e.Avatar={})),function(e){const t=Object.values(e).filter(e=>"string"==typeof e);e.GET_RANDOM=function(){return t[Math.random()*t.length]}}(n=e.Avatar||(e.Avatar={})),e.MoveType=Object.freeze({NORMAL:"NORMAL",BOOST:"BOOST"}),e.MoveType}(i||(i={})),Object.freeze(i),Object.freeze(i.prototype);class o{}!function(e){let t,s,n;!function(e){e.REGEXP=new RegExp("^[a-zA-Z0-9!@#$%^&*()-_=+;:'\"\\|,.<>/?]+$")}(t=e.Seq||(e.Seq={})),function(e){e.NULL=Object.freeze({char:"",seq:""})}(s=e.CharSeqPair||(e.CharSeqPair={})),function(e){e.MAX=4}(n=e.WeightExaggeration||(e.WeightExaggeration={})),e.CHAR_HIT_COUNT_SEED_CEILING=5,e._RemapTemplates=Object.freeze({IDENTITY:e=>e,TO_LOWER:e=>e.toLowerCase()}),e._RemapTemplates,e.FrontendDescs=Object.freeze([{id:"engl-low",module:"English",export:"Lowercase",numLeaves:26,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"English Lowercase (qwerty)",blurb:""},{id:"engl-mix",module:"English",export:"MixedCase",numLeaves:52,remapFunc:e._RemapTemplates.IDENTITY,displayName:"English Mixed-Case (Querty)",blurb:""},{id:"japn-hir",module:"Japanese",export:"Hiragana",numLeaves:71,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Hiragana",blurb:""},{id:"japn-kat",module:"Japanese",export:"Katakana",numLeaves:70,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Katakana",blurb:""},{id:"kore-dub",module:"Korean",export:"Dubeolsik",numLeaves:9177,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Dubeolsik (두벌식 키보드)",blurb:"The most common keyboard layout, and South Korea's only Hangul standard since 1969. Consonants are on the left, and vowels on the right."},{id:"kore-sub",module:"Korean",export:"Sebeolsik",numLeaves:10206,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Sebeolsik (세벌식 최종 키보드)",blurb:"Another Hangul keyboard layout used in South Korea, and the final Sebeolsik layout designed by Dr. Kong Byung Woo, hence the name. Syllable-initial consonants are on the right, final consonants on the left, and vowels in the middle. It is more ergonomic than the dubeolsik, but not widely used."},{id:"kore-rom",module:"Korean",export:"Romanization",numLeaves:3990,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Korean Revised Romanization",blurb:"The Revised Romanization of Korean (국어의 로마자 표기법; 國語의 로마字 表記法) is the official South Korean language romanization system. It was developed by the National Academy of the Korean Language from 1995, and was released on 7 July 2000 by South Korea's Ministry of Culture and Tourism"},{id:"engl-cell-enc",module:"English",export:"OldCellphone.Encode",numLeaves:8,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Old Cellphone Keyboard",blurb:""}].map(e=>Object.freeze(e))),e.FrontendDescs,e.GET_FRONTEND_DESC_BY_ID=function(t){return e.FrontendDescs.find(e=>e.id===t)}}(o||(o={})),Object.freeze(o),Object.freeze(o.prototype)},function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var n,a=s(1);!function(e){let t,s,n,a,r,i;e.GLOBAL_IDS={PUBLIC_GAME_HOST_URLS:"public-game-hosts-list",CURRENT_HOST_GROUPS:"current-host-groups-list"},function(e){e.Class={TEXT_SELECT_DISABLED:"text-select-disabled",FILL_PARENT:"fill-parent",CENTER_CONTENTS:"center-contents",STACK_CONTENTS:"stack-contents",INPUT_GROUP:"sk-input-group",INPUT_GROUP_ITEM:"sk-input-group-item"},e.Dataset={COLOUR_SCHEME:"skColourScheme"}}(t=e.General||(e.General={})),function(e){e.Class={BASE:"tile",POINTER_HB:"tile__pointer-hitbox",LANG_CHAR_WRAP:"tile__char",LANG_SEQ:"tile__seq"},e.Dataset={HEALTH:"health"}}(s=e.Tile||(e.Tile={})),function(e){e.Class={GRID:"game-grid",SCROLL_OUTER:"game-grid-scroll-outer",SCROLL_INNER:"game-grid-scroll-inner",IMPL_BODY:"game-grid-impl-body",KBD_DC:"game-grid-kbd-dc",KBD_DC_ICON:"game-grid-kbd-dc__icon",PAUSE_OL:"game-grid-pause-overlay",PAUSE_OL_ICON:"game-grid-pause-overlay__icon",PLAYER_IOB_ROOT:"grid-player-intersection-root"},e.Dataset={IMPL_COORD_SYS:"coordSys",GAME_STATE:{KEY:"gameState",VALUES:{PLAYING:"playing",PAUSED:"paused",OVER:"over"}}}}(n=e.Grid||(e.Grid={})),function(e){e.Class={BASE:"player",FACE:"player__face",DOWNED_OVERLAY:"player__downed-overlay",SHORT_SPOTLIGHT:"player__spotlight-short",LONG_SPOTLIGHT:"player__spotlight-long"},e.Dataset={DOWNED:{KEY:"downed",VALUES:{TEAM:"team",SELF:"self",NO:"no"}},FACE_SWATCH:"face"}}(a=e.Player||(e.Player={})),function(e){let t;e.Id={ALL_SCREENS:"all-screens-container",SCREEN_TINT:"screen-tint"},e.Class={BASE:"sk-screen",NAV_NEXT:"screen--next-button",NAV_PREV:"screen--back-button"},e.Dataset={CURRENT:"current"},function(e){let t,s,n,a,r,i;!function(e){e.Class={BASE:"screen-home",NAV:"screen-home--nav",NAV_PLAY_OFFLINE:"screen-home--nav--play-offline",NAV_PLAY_ONLINE:"screen-home--nav--play-online",NAV_HOW_TO_PLAY:"screen-home--nav--how-to-play",NAV_HOW_TO_HOST:"screen-home--nav--how-to-host",NAV_COLOURS:"screen-home--nav--colour-scheme",NAV_VIEW_REPO:"screen-home--nav--goto-repo",NAV_RPT_ISSUE:"screen-home--nav--report-issue"}}(t=e.Home||(e.Home={})),function(e){e.Class={BASE:"screen-colour",OPTION:"screen-colour--opt",OPTION_LABEL:"screen-colour--opt-label",OPTION_PREVIEW:"screen-colour--opt-preview"}}(s=e.ColourCtrl||(e.ColourCtrl={})),function(e){e.Class={BASE:"screen-play",GRID_WRAPPER:"screen-play--grid-wrapper",CONTROLS_BAR:"screen-play--controls-bar",PLAYERS_BAR:"screen-play--players-bar"}}(n=e.Play||(e.Play={})),function(e){e.Class={BASE:"screen-setup",LANG_SEL:"screen-setup--lang-sel",LANG_WEIGHT_EXAGG:"screen-setup--lang-weight-exagg"},e.Id={LANG_WEIGHT_EXAGGERATION_LIST:"screen-setup--lang-weight-exaggeration-list"}}(a=e.Setup||(e.Setup={})),function(e){e.Class={BASE:"screen-joiner",CONTENT_WRAPPER:"screen-joiner--content-wrapper",HOST_URL:"screen-joiner--host-url",GROUP_NAME:"screen-joiner--group-name",PASSPHRASE:"screen-joiner--passphrase"}}(r=e.GroupJoiner||(e.GroupJoiner={})),function(e){e.Class={BASE:"screen-lobby",SEC_CLIENT_INFO:"screen-lobby--client-info-section",SEC_TEAMS:"screen-lobby--teams-section",TEAM:"screen-lobby--team",PLAYER:"screen-lobby--player",PLAYER_NAME:"screen-lobby--player__name"}}(i=e.GroupLobby||(e.GroupLobby={}))}(t=e.Impl||(e.Impl={}))}(r=e.Screen||(e.Screen={})),function(e){e.Class={BASE:"sk-pick-one",OPT_BASE:"sk-pick-one--opt"}}(i=e.SkPickOne||(e.SkPickOne={}))}(n||(n={})),Object.freeze(n.Player.Dataset.DOWNED),Object(a.e)(n)},function(e,t,s){"use strict";var n;s.d(t,"a",(function(){return n})),function(e){let t,s,n,a;!function(e){e.SERVER="SERVER",e.ONLINE="ONLINE",e.OFFLINE="OFFLINE"}(t=e.Type||(e.Type={})),function(e){let t;!function(e){e.NAME="game-create",e.RETURN_TO_LOBBY_INDICATOR="return-to-lobby"}(t=e.Event||(e.Event={})),e.EVENT_NAME_CLIENT_READY_RESET="client-ready-for-reset",e.EVENT_NAME_CLIENT_READY_UNPAUSE="client-ready-for-unpause",e.EVENT_NAME_SERVER_APPROVE_UNPAUSE="server-approve-unpause",e.EVENT_NAME_SERVER_APPROVE_PAUSE="server-approve-pause"}(s=e.CtorArgs||(e.CtorArgs={})),function(e){e.EVENT_NAME="game-reset"}(n=e.Serialization||(e.Serialization={})),function(e){e.PLAYING="PLAYING",e.PAUSED="PAUSED",e.OVER="OVER"}(a=e.Status||(e.Status={})),e.K=Object.freeze({HEALTH_UPDATE_CHANCE:.1,PCT_MOVES_THAT_ARE_BOOST:.05,HEALTH_EFFECT_FOR_DOWNED_PLAYER:.6,EVENT_RECORD_WRAPPING_BUFFER_LENGTH:128,EVENT_RECORD_FORWARD_WINDOW_LENGTH:64})}(n||(n={})),Object.freeze(n)},function(e,t,s){"use strict";s.d(t,"a",(function(){return n})),s.d(t,"b",(function(){return d}));var n,a,r,i,o,c=s(0),l=s(1);!function(e){let t;!function(e){e.EUCLID2="EUCLID2",e.BEEHIVE="BEEHIVE"}(t=e.System||(e.System={})),e.equals=function(e,t){return e._equals(t)}}(n||(n={})),Object.freeze(n);class d{constructor(e){a.set(this,void 0),r.set(this,void 0),i.set(this,void 0),o.set(this,void 0),this.coord=e,Object(c.c)(this,a,l.b.Id.NULL)}reset(){this.evictOccupant(),this.lastKnownUpdateId=0,this.freeHealth=0,this.setLangCharSeqPair(l.a.CharSeqPair.NULL)}_setOccupant(e,t){Object(c.c)(this,a,e)}get isOccupied(){return this.occupantId!==l.b.Id.NULL}evictOccupant(){Object(c.c)(this,a,l.b.Id.NULL)}get occupantId(){return Object(c.b)(this,a)}get freeHealth(){return Object(c.b)(this,r)}set freeHealth(e){Object(c.c)(this,r,e)}setLangCharSeqPair(e){Object(c.c)(this,i,e.char),Object(c.c)(this,o,e.seq)}get langChar(){return Object(c.b)(this,i)}get langSeq(){return Object(c.b)(this,o)}}a=new WeakMap,r=new WeakMap,i=new WeakMap,o=new WeakMap,Object.freeze(d),Object.freeze(d.prototype)},function(e,t,s){},function(e,t,s){},function(e,t,s){"use strict";s.r(t),s.d(t,"OmHooks",(function(){return o.a})),s.d(t,"_top",(function(){return ee})),s.d(t,"screen",(function(){return te})),s.d(t,"game",(function(){return se}));var n,a,r,i=s(0),o=s(2),c=s(1);!function(e){let t;e.LocalKeys=Object.freeze({MUSIC_VOLUME:"musicVolume",SFX_VOLUME:"sfxVolume",COLOUR_ID:"colourSchemeId",COLOUR_LITERAL:"colourSchemeStyleLiteral",GAME_PRESET:"gamePresetId",USERNAME:"username",AVATAR:"avatarId"}),e.getLastUserInfo=function(){var t,s;return Object.freeze({username:null!==(t=localStorage.getItem(e.LocalKeys.USERNAME))&&void 0!==t?t:"unnamed player",teamId:0,avatar:null!==(s=localStorage.getItem(e.LocalKeys.AVATAR))&&void 0!==s?s:c.b.Avatar.GET_RANDOM()})},e.SessionKeys=Object.freeze({}),function(e){let t;e.DB_NAME="snakeyDB",function(e){e.STORE_NAME="userGamePresets"}(t=e.UserGamePresetStore||(e.UserGamePresetStore={})),Object.freeze(t)}(t=e.IDB||(e.IDB={})),Object.freeze(t)}(n||(n={})),Object.freeze(n);const l=o.a.Screen.Class;class d{constructor(e,t,s,n){a.set(this,void 0),r.set(this,void 0),this.screenId=e,this.top=t,Object(i.c)(this,a,s),this.requestGoToScreen=n,Object(i.c)(this,r,!1),this.nav=Object.freeze({prev:document.createElement("button"),next:document.createElement("button")}),this.nav.prev.classList.add(l.NAV_PREV),this.nav.next.classList.add(l.NAV_NEXT),this.nav.prev.textContent="Back",this.nav.next.textContent="Next",this.nav.prev.onclick=e=>{this.requestGoToScreen(...this.getNavPrevArgs())}}get initialScreen(){return this.screenId}getNavPrevArgs(){const e=d.NavPrevDest[this.screenId];if(e)return[e,{},d.NavDir.BACKWARD];throw"never"}_enter(e,t){return Object(i.a)(this,void 0,void 0,(function*(){if(!Object(i.b)(this,r)){const e=this.baseElem=document.createElement("div");e.classList.add(o.a.Screen.Class.BASE),this._lazyLoad(),Object(i.b)(this,a).appendChild(e);const t=this.screenId.replace(/[A-Z]/g,e=>" "+e);{const s=t.toUpperCase();this.top.prependComment(e,s+" SCREEN")}{const s=t.split(" ").map(e=>e.charAt(0).toUpperCase()+e.substring(1)).join(" ");e.setAttribute("aria-label",s+" Screen")}Object(i.c)(this,r,!0)}{const t=new window.URL(window.location.href);t.hash=this.screenId;const s=[{screenId:this.screenId},"",t.href];switch(e){case d.NavDir.BACKWARD:history.replaceState(...s);break;case d.NavDir.FORWARD:history.pushState(...s);break;default:throw"never"}}yield this._abstractOnBeforeEnter(e,t),window.requestAnimationFrame(e=>{this.baseElem.dataset[o.a.Screen.Dataset.CURRENT]="",this.baseElem.setAttribute("aria-hidden","false")})}))}_leave(e){return!!this._abstractOnBeforeLeave(e)&&(delete this.baseElem.dataset[o.a.Screen.Dataset.CURRENT],this.baseElem.setAttribute("aria-hidden","true"),!0)}_abstractOnBeforeEnter(e,t){return Object(i.a)(this,void 0,void 0,(function*(){}))}_abstractOnBeforeLeave(e){return!0}}a=new WeakMap,r=new WeakMap,function(e){let t,s;!function(e){e.HOME="home",e.HOW_TO_PLAY="howToPlay",e.HOW_TO_HOST="howToHost",e.COLOUR_CTRL="colourControl",e.SETUP_OFFLINE="setupOffline",e.PLAY_OFFLINE="playOffline",e.GROUP_JOINER="groupJoiner",e.SETUP_ONLINE="setupOnline",e.GROUP_LOBBY="groupLobby",e.PLAY_ONLINE="playOnline"}(t=e.Id||(e.Id={})),e.NavPrevDest=Object.freeze({[t.HOME]:t.HOME,[t.HOW_TO_PLAY]:t.HOME,[t.HOW_TO_HOST]:t.HOME,[t.COLOUR_CTRL]:t.HOME,[t.SETUP_OFFLINE]:t.HOME,[t.PLAY_OFFLINE]:t.SETUP_OFFLINE,[t.GROUP_JOINER]:t.HOME,[t.GROUP_LOBBY]:t.GROUP_JOINER,[t.SETUP_ONLINE]:t.GROUP_LOBBY,[t.PLAY_ONLINE]:t.SETUP_ONLINE}),function(e){e.FORWARD="forward",e.BACKWARD="backward"}(s=e.NavDir||(e.NavDir={}))}(d||(d={})),Object.freeze(d),Object.freeze(d.prototype);class u extends d{_lazyLoad(){const e=o.a.Screen.Impl.Home.Class;this.baseElem.classList.add(o.a.General.Class.CENTER_CONTENTS,e.BASE);const t=this.navElem=document.createElement("div");t.classList.add(o.a.General.Class.TEXT_SELECT_DISABLED,o.a.General.Class.INPUT_GROUP,e.NAV),t.setAttribute("role","navigation"),t.addEventListener("pointerleave",()=>{var e;(null===(e=document.activeElement)||void 0===e?void 0:e.parentElement)===t&&document.activeElement.blur()});const s=(e,s)=>{e.classList.add(o.a.General.Class.CENTER_CONTENTS,o.a.General.Class.INPUT_GROUP_ITEM,s.cssClass),e.textContent=s.text,e.addEventListener("pointerenter",()=>{window.requestAnimationFrame(t=>{e.focus()})}),t.appendChild(e)};[{text:"Offline Single-player",cssClass:e.NAV_PLAY_OFFLINE,screenId:d.Id.SETUP_OFFLINE},{text:"Online Multi-player",cssClass:e.NAV_PLAY_ONLINE,screenId:d.Id.GROUP_JOINER},{text:"How To Play",cssClass:e.NAV_HOW_TO_PLAY,screenId:d.Id.HOW_TO_PLAY},{text:"How To Host",cssClass:e.NAV_HOW_TO_HOST,screenId:d.Id.HOW_TO_HOST},{text:"Colour Schemes",cssClass:e.NAV_COLOURS,screenId:d.Id.COLOUR_CTRL}].map(e=>Object.freeze(e)).forEach(e=>{const t=document.createElement("button");t.onclick=e.screenId instanceof Function?e.screenId:()=>{this.requestGoToScreen(e.screenId,{})},s(t,e)}),[{text:"Visit\nRepo",cssClass:e.NAV_VIEW_REPO,href:new window.URL("https://github.com/david-fong/SnaKey-NTS")},{text:"Report\nIssue",cssClass:e.NAV_RPT_ISSUE,href:new window.URL("https://github.com/david-fong/SnaKey-NTS/issues")}].map(e=>Object.freeze(e)).forEach(e=>{const t=document.createElement("a");t.href=e.href.toString(),t.referrerPolicy="strict-origin-when-cross-origin",t.rel="noopener",t.target="_blank",s(t,e)}),this.baseElem.appendChild(t)}}Object.freeze(u),Object.freeze(u.prototype);class h extends d{_lazyLoad(){}}Object.freeze(h),Object.freeze(h.prototype);class p extends d{_lazyLoad(){}}var E,m,O,_,b,f;(p||(p={})).INSTRUCTIONS_STEPS=Object.freeze(["$ npm install 'https://github.com/david-fong/SnaKey-NTS#gh-pages'","$ npm run start","send the url to your friends"]),Object.freeze(p),Object.freeze(p.prototype);class v{constructor(){E.set(this,void 0),m.set(this,void 0),O.set(this,void 0);const e=document.createElement("div");e.tabIndex=0,e.classList.add(o.a.SkPickOne.Class.BASE),e.addEventListener("keydown",this._onKeyDown.bind(this)),e.setAttribute("role","listbox"),e.addEventListener("pointerenter",t=>{window.requestAnimationFrame(t=>{e.focus()})}),this.baseElem=e,this.options=[]}addOption(e){this.options.push(e),this.baseElem.appendChild(e.baseElem),e.baseElem.addEventListener("pointerenter",this.hoverOpt.bind(this,e)),e.baseElem.addEventListener("click",this.selectOpt.bind(this,e,!0)),e._registerParent(this._onOptDisabledChange.bind(this))}hoverOpt(e){var t;this.hoveredOpt!==e&&(null===(t=this.hoveredOpt)||void 0===t||t.baseElem.setAttribute("aria-active-descendant","false"),Object(i.c)(this,m,e),this.hoveredOpt.baseElem.setAttribute("aria-active-descendant","true"))}selectOpt(e,t=!0){var s;if(!e)throw Error("opt must be defined");this.hoverOpt(e),this.confirmedOpt!==e&&(null===(s=this.confirmedOpt)||void 0===s||s.baseElem.setAttribute("aria-selected","false"),Object(i.c)(this,E,e),this.confirmedOpt.baseElem.setAttribute("aria-selected","true"),t&&this._onSelectOpt(e))}get confirmedOpt(){return Object(i.b)(this,E)}get hoveredOpt(){return Object(i.b)(this,m)}_onOptDisabledChange(e){this.confirmedOpt===e&&(this._isValid=!e.disabled)}set _isValid(e){this._isValid!==e&&(this.baseElem.setAttribute("aria-invalid",e?"false":"true"),Object(i.c)(this,O,e))}get _isValid(){return Object(i.b)(this,O)}_onKeyDown(e){if(" "===e.key||"Enter"===e.key)return this.selectOpt(this.hoveredOpt),e.preventDefault(),!1;{const t=this.options.indexOf(this.hoveredOpt);if("ArrowDown"===e.key||"Down"===e.key)for(let s=t+1;s=0;s--){const t=this.options[s];if(!t.disabled)return this.hoverOpt(t),e.preventDefault(),!1}}return!0}}E=new WeakMap,m=new WeakMap,O=new WeakMap,_=v||(v={}),b=new WeakMap,f=new WeakMap,_._Option=class{constructor(){b.set(this,void 0),f.set(this,void 0);const e=this.baseElem=document.createElement("div");e.classList.add(o.a.SkPickOne.Class.OPT_BASE),e.setAttribute("role","option"),Object(i.c)(this,b,!1)}_registerParent(e){Object(i.c)(this,f,e)}get disabled(){return Object(i.b)(this,b)}set disabled(e){this.disabled!==e&&(this.baseElem.setAttribute("aria-disabled",e?"true":"false"),Object(i.c)(this,b,e),Object(i.b)(this,f).call(this,this))}},Object.freeze(_),Object.freeze(_.prototype),Object.freeze(v),Object.freeze(v.prototype),s(6);const g=o.a.Screen.Impl.ColourCtrl.Class;o.a.General.Class;class S extends d{constructor(){super(...arguments),this.canBeInitialScreen=!0}_lazyLoad(){const e=new S.PickOne;this.baseElem.appendChild(e.baseElem),this.sel=e;const t=localStorage.getItem(n.LocalKeys.COLOUR_ID);t&&this.sel.selectOpt(this.sel.getOptById(t),!1)}}var L;!function(e){class t extends v{constructor(){var e;super(),this.baseElem.classList.add(g.BASE),this.garageDoorElem=document.getElementById(o.a.Screen.Id.SCREEN_TINT),this.garageDoorElem.style.transitionDuration=L.SMOOTH_CHANGE_DURATION/3+"ms",L.Schemes.forEach(e=>{this.addOption(new t.Option(e))}),this.selectOpt(this.getOptById(null!==(e=localStorage.getItem(n.LocalKeys.COLOUR_ID))&&void 0!==e?e:"snakey"),!1)}_onHoverOpt(e){}_onSelectOpt(e){{const e=document.documentElement.style;for(const t of L.Swatch){const s="--colour-"+t;e.setProperty(s,"")}}localStorage.setItem(n.LocalKeys.COLOUR_ID,e.desc.id),localStorage.setItem(n.LocalKeys.COLOUR_LITERAL,e.cssLiteral);const t=L.SMOOTH_CHANGE_DURATION/3,s=this.garageDoorElem.style;s.opacity="1.0",s.pointerEvents="all",this.baseElem.style.pointerEvents="none",setTimeout(()=>{document.documentElement.dataset[o.a.General.Dataset.COLOUR_SCHEME]=e.desc.id,setTimeout(()=>{s.opacity="0.0",s.pointerEvents="",this.baseElem.style.pointerEvents=""},t)},t)}getOptById(e){return this.options.find(t=>t.desc.id===e)}}e.PickOne=t,function(e){class t extends v._Option{constructor(e){super(),this.desc=e,this.baseElem.classList.add(g.OPTION);const s=document.createElement("span");s.classList.add(g.OPTION_LABEL),s.textContent=e.displayName,this.baseElem.appendChild(s);const n=document.createElement("span");n.classList.add(g.OPTION_PREVIEW),n.dataset[o.a.General.Dataset.COLOUR_SCHEME]=e.id;for(let e=0;eObject.freeze(e))),e.SMOOTH_CHANGE_DURATION=2e3}(L||(L={})),Object.freeze(L);var N=s(4);const I=o.a.Screen.Impl.Setup.Class;class T extends d{_lazyLoad(){this.baseElem.classList.add(I.BASE),this.baseElem.appendChild(this.nav.prev),this.langSel=new T.LangPickOne,this.baseElem.appendChild(this.langSel.baseElem),this._createLangWeightExaggerationInput(),this.baseElem.appendChild(this.nav.next),this._loadLastUsedPreset()}_createLangWeightExaggerationInput(){const e=this.langWeightExaggeration=document.createElement("input");e.classList.add(I.LANG_WEIGHT_EXAGG),e.type="range",e.min="0",e.max=c.a.WeightExaggeration.MAX.toString(),e.step="any",e.value="1";{const e=document.createElement("datalist");e.id=o.a.Screen.Impl.Setup.Id.LANG_WEIGHT_EXAGGERATION_LIST,[{val:0,label:"0"},{val:1,label:"1"}].forEach(t=>{const s=document.createElement("option");s.value=t.val.toString(),s.label=t.label,e.appendChild(s)}),this.baseElem.appendChild(e)}e.setAttribute("list",o.a.Screen.Impl.Setup.Id.LANG_WEIGHT_EXAGGERATION_LIST),this.baseElem.appendChild(e)}_abstractOnBeforeEnter(e,t){return Object(i.a)(this,void 0,void 0,(function*(){window.setTimeout(()=>{this.nav.next.focus()},100)}))}_loadLastUsedPreset(){localStorage.getItem(n.LocalKeys.GAME_PRESET)}_parseArgsFromGui(){const e=Object.assign({},T.DEFAULT_PRESET);return e.langId=this.langSel.confirmedOpt.desc.id,e.langWeightExaggeration=parseFloat(this.langWeightExaggeration.value),e}}!function(e){e.DEFAULT_PRESET={coordSys:N.a.System.EUCLID2,gridDimensions:{height:21,width:21},averageFreeHealthPerTile:1/45,langWeightExaggeration:1,langId:"engl-low",playerDescs:[{isALocalOperator:!1,familyId:"CHASER",teamId:1,socketId:void 0,username:"chaser1",avatar:void 0,noCheckGameOver:!0,familyArgs:{}},{isALocalOperator:!1,familyId:"CHASER",teamId:1,socketId:void 0,username:"chaser2",avatar:void 0,noCheckGameOver:!0,familyArgs:{fearDistance:6,bloodThirstDistance:5,healthReserve:5,keyPressesPerSecond:1.8}}]};class t extends v{constructor(){super(),this.baseElem.classList.add(I.LANG_SEL),c.a.FrontendDescs.forEach(e=>{this.addOption(new t.Option(e))}),this.selectOpt(this.options[0])}_onHoverOpt(e){}_onSelectOpt(e){}}e.LangPickOne=t,function(e){class t extends v._Option{constructor(e){super(),this.desc=e,this.baseElem.textContent=e.displayName}}e.Option=t,Object.freeze(t),Object.freeze(t.prototype)}(t=e.LangPickOne||(e.LangPickOne={}))}(T||(T={})),Object.freeze(T),Object.freeze(T.prototype);class A extends T{_lazyLoad(){super._lazyLoad(),this.nav.next.onclick=e=>{const t=this._parseArgsFromGui();this.requestGoToScreen(d.Id.PLAY_OFFLINE,t)}}_abstractOnBeforeEnter(e,t){return super._abstractOnBeforeEnter(e,t)}_parseArgsFromGui(){const e=super._parseArgsFromGui();return e.playerDescs.splice(e.playerDescs.length,0,{isALocalOperator:!0,familyId:"HUMAN",teamId:0,socketId:void 0,username:"hello1",avatar:void 0,noCheckGameOver:!1,familyArgs:{}},{isALocalOperator:!0,familyId:"HUMAN",teamId:1,socketId:void 0,username:"hello2",avatar:void 0,noCheckGameOver:!1,familyArgs:{}}),e}}Object.freeze(A),Object.freeze(A.prototype);var C,y,R,P,G,U,k=s(3);class j extends d{constructor(){super(...arguments),C.set(this,void 0),y.set(this,void 0),R.set(this,void 0),P.set(this,void 0)}_lazyLoad(){this.baseElem.classList.add(o.a.General.Class.CENTER_CONTENTS,o.a.Screen.Impl.Play.Class.BASE);const e=j.createCenterColElem();this._gridBaseElem=e.grid,this._gridImplHost=e.implHost,this._gridImplHost.appendChild(document.createComment("grid impl host")),this.baseElem.appendChild(e.top),e.pauseOl.addEventListener("click",e=>{const t=this.currentGame;t&&t.status===k.a.Status.PAUSED&&this._statusBecomePlaying()}),this._initializeControlsBar(),this._initializePlayersBar(),Object(i.c)(this,y,()=>{if(this.wantsAutoPause)if(document.hidden){if(void 0===Object(i.b)(this,P)){const e=this.currentGame;(!e||e&&e.status!==k.a.Status.OVER)&&this._statusBecomePaused()}}else"page-hide"===Object(i.b)(this,P)&&this._statusBecomePlaying()}),Object(i.c)(this,R,this._gridKeyDownCallback.bind(this))}_abstractOnBeforeEnter(e,t){return Object(i.a)(this,void 0,void 0,(function*(){document.addEventListener("visibilitychange",Object(i.b)(this,y)),this.pauseButton.disabled=!0,this._statusBecomePaused(),Object(i.c)(this,C,yield this._createNewGame(t)),this._gridBaseElem.addEventListener("keydown",Object(i.b)(this,R),{capture:!0}),yield this.currentGame.reset();const e=this.currentGame.htmlElements;this._gridImplHost.appendChild(e.gridImpl),this.playersBar.appendChild(e.playersBar),this.pauseButton.onclick=this._statusBecomePlaying.bind(this),this.pauseButton.disabled=!1,this.wantsAutoPause&&setTimeout(()=>{document.hidden||this._statusBecomePlaying()},500)}))}_abstractOnBeforeLeave(e){if(this.askConfirmBeforeLeave&&!window.confirm("Are you sure you would like to leave?"))return!1;document.removeEventListener("visibilitychange",Object(i.b)(this,y));const t=this.currentGame;t.statusBecomePaused();for(const e of Object.values(t.htmlElements))e.textContent="",e.remove();return this._gridBaseElem.removeEventListener("keydown",Object(i.b)(this,R)),Object(i.c)(this,C,void 0),!0}get currentGame(){return Object(i.b)(this,C)}_gridKeyDownCallback(e){e.stopPropagation();const t=this.currentGame;if(e.ctrlKey&&" "===e.key&&!e.repeat){const e=t.operators;t.setCurrentOperator((1+e.indexOf(t.currentOperator))%e.length)}else t.currentOperator.processKeyboardInput(e);return" "!==e.key||(e.preventDefault(),!1)}_statusBecomePlaying(){var e;const t=o.a.Grid.Dataset.GAME_STATE;null===(e=this.currentGame)||void 0===e||e.statusBecomePlaying(),this.pauseButton.textContent="Pause",Object(i.c)(this,P,void 0),this._gridBaseElem.dataset[t.KEY]=t.VALUES.PLAYING,this.pauseButton.onclick=this._statusBecomePaused.bind(this),this.resetButton.disabled=!0,window.requestAnimationFrame(e=>{this._gridBaseElem.focus()})}_statusBecomePaused(){var e;const t=o.a.Grid.Dataset.GAME_STATE;null===(e=this.currentGame)||void 0===e||e.statusBecomePaused(),this.pauseButton.textContent="Unpause",Object(i.c)(this,P,document.hidden?"page-hide":"other"),this._gridBaseElem.dataset[t.KEY]=t.VALUES.PAUSED,this.pauseButton.onclick=this._statusBecomePlaying.bind(this),this.resetButton.disabled=!1}_onGameBecomeOver(){const e=o.a.Grid.Dataset.GAME_STATE;this.pauseButton.disabled=!0,this.resetButton.disabled=!1,this._gridBaseElem.dataset[e.KEY]=e.VALUES.OVER}_resetGame(){this.currentGame.reset(),this.pauseButton.disabled=!1,this.wantsAutoPause&&this._statusBecomePlaying()}_initializeControlsBar(){const e=document.createElement("div");function t(t,s){return(s=null!=s?s:document.createElement("button")).textContent=t,s.classList.add(o.a.General.Class.INPUT_GROUP_ITEM),s.addEventListener("pointerenter",e=>{window.requestAnimationFrame(e=>{s.focus()})}),e.appendChild(s),s}e.classList.add(o.a.General.Class.CENTER_CONTENTS,o.a.General.Class.INPUT_GROUP,o.a.Screen.Impl.Play.Class.CONTROLS_BAR),e.setAttribute("role","menu"),e.addEventListener("pointerleave",e=>{window.requestAnimationFrame(e=>{this._gridBaseElem.focus()})});t("",this.nav.prev);this.pauseButton=t("");(this.resetButton=t("Reset")).onclick=this._resetGame.bind(this);this.baseElem.appendChild(e)}_initializePlayersBar(){const e=this.playersBar=document.createElement("div");e.classList.add(o.a.Screen.Impl.Play.Class.PLAYERS_BAR),this.baseElem.appendChild(e)}}C=new WeakMap,y=new WeakMap,R=new WeakMap,P=new WeakMap,(j||(j={})).createCenterColElem=function(){const e=o.a.Grid.Class,t=o.a.General.Class,s=document.createElement("div");s.classList.add(o.a.Screen.Impl.Play.Class.GRID_WRAPPER);const n=document.createElement("div");n.tabIndex=0,n.setAttribute("role","textbox"),n.setAttribute("aria-label","Game Grid"),n.classList.add(t.STACK_CONTENTS,t.TEXT_SELECT_DISABLED,e.GRID);const a=document.createElement("div");a.setAttribute("role","presentation"),a.classList.add(e.SCROLL_OUTER);{const s=document.createElement("div");s.classList.add(t.FILL_PARENT,t.CENTER_CONTENTS,e.KBD_DC);{const t=document.createElement("div");t.classList.add(e.KBD_DC_ICON),t.textContent="(click here to continue typing)",s.appendChild(t)}a.appendChild(s)}const r=document.createElement("div");r.classList.add(t.FILL_PARENT,t.CENTER_CONTENTS,e.PAUSE_OL);{const t=document.createElement("div");t.classList.add(e.PAUSE_OL_ICON),t.textContent="(Click to Unpause)",r.appendChild(t)}return a.appendChild(r),n.appendChild(a),s.appendChild(n),Object.freeze({top:s,grid:n,intersectionRoot:a,implHost:a,pauseOl:r})},Object.freeze(j),Object.freeze(j.prototype);class w extends j{constructor(){super(...arguments),this.wantsAutoPause=!0,this.askConfirmBeforeLeave=!0}get initialScreen(){return d.Id.SETUP_OFFLINE}_lazyLoad(){super._lazyLoad(),this.nav.prev.innerHTML="Return To Setup"}_createNewGame(e){return Object(i.a)(this,void 0,void 0,(function*(){return new((yield Promise.all([s.e(0),s.e(1)]).then(s.bind(null,27))).OfflineGame)(this._onGameBecomeOver.bind(this),e)}))}}Object.freeze(w),Object.freeze(w.prototype);class B{}!function(e){let t;e.PROTOCOL="http://",e.DEFAULT_PORT=8080,function(e){e.GROUP_LOBBY_PREFIX="/group-",e.GROUP_JOINER="/joiner"}(t=e.Nsps||(e.Nsps={}))}(B||(B={})),Object.freeze(B),Object.freeze(B.prototype);class H{}!function(e){let t,s,n,a;!function(e){let t;!function(e){e.EVENT_NAME="group-lobby-user-info-change"}(t=e.UserInfoChange||(e.UserInfoChange={}))}(t=e.Socket||(e.Socket={})),function(e){e.REGEXP=/(?:[a-zA-Z0-9:-]+)/,e.MaxLength=30}(s=e.Name||(e.Name={})),function(e){e.REGEXP=/(?:[a-zA-Z0-9:-]+)/,e.MaxLength=30}(n=e.Passphrase||(e.Passphrase={})),e.JoinerReconnectionAttempts=2,e.DEFAULT_TTL=20,function(e){e.EVENT_NAME="group-exist";class t{constructor(e,t){this.groupName=e,this.passphrase=t}}let s;e.RequestCreate=t,function(e){let t;!function(e){e.OKAY="okay",e.NOPE="nope"}(t=e.Response||(e.Response={}))}(t=e.RequestCreate||(e.RequestCreate={})),function(e){e.IN_LOBBY="in-lobby",e.IN_GAME="in-game",e.DELETE="delete"}(s=e.Status||(e.Status={}))}(a=e.Exist||(e.Exist={}))}(H||(H={})),Object.freeze(H),Object.freeze(H.prototype);class D extends d{constructor(){super(...arguments),G.set(this,void 0),U.set(this,!1)}get clientIsGroupHost(){return Object(i.b)(this,U)}_lazyLoad(){this.baseElem.classList.add(o.a.General.Class.CENTER_CONTENTS,o.a.Screen.Impl.GroupJoiner.Class.BASE);const e=this._initializeFormContents(),t=this._initializeHostUrlHandlers();this._initializeGroupNameHandlers(t),this._initializePassphraseHandlers(),this.nav.next.onclick=e=>{s()};const s=()=>{this.requestGoToScreen(d.Id.GROUP_LOBBY,{})};this._setFormState(M.CHOOSING_HOST),this.baseElem.appendChild(e)}_abstractOnBeforeEnter(e,t){return Object(i.a)(this,void 0,void 0,(function*(){window.setTimeout(()=>{this.socket&&this.socket.nsp.startsWith(B.Nsps.GROUP_LOBBY_PREFIX)?this.in.groupName.focus():this.in.hostUrl.focus()},100)}))}get state(){return Object(i.b)(this,G)}_setFormState(e){if(this.state!==e){if(e===M.IN_GROUP){if(this.state!==M.CHOOSING_GROUP)throw"never";this.in.passphrase.disabled=!0,this.nav.next.disabled=!1,this.nav.next.focus()}else this.nav.next.disabled=!0,e===M.CHOOSING_HOST?(this.in.groupName.disabled=!0,this.in.groupName.value="",this.groupNameDataList.innerText="",this.in.passphrase.disabled=!0,this.in.passphrase.value="",this.in.hostUrl.focus()):e===M.CHOOSING_GROUP&&(this.in.groupName.disabled=!1,this.in.passphrase.disabled=!1,this.in.groupName.focus());Object(i.c)(this,G,e)}}_initializeHostUrlHandlers(){const e=this.top,t=this.in.hostUrl,s=()=>Object(i.a)(this,void 0,void 0,(function*(){var s;if(!t.value||!t.validity.valid)return;t.value.startsWith(B.PROTOCOL)||(t.value=new window.URL(B.PROTOCOL+t.value).origin);const n=new window.URL(t.value+B.Nsps.GROUP_JOINER);if(this.socket&&this.socket.nsp===B.Nsps.GROUP_JOINER&&this.socket.io.opts.hostname===n.hostname)return this.socket.connected?(this._setFormState(M.CHOOSING_GROUP),void this.in.groupName.focus()):void 0;null===(s=this.socket)||void 0===s||s.close(),this.socket=(yield e.socketIo)(n.toString(),{reconnectionAttempts:H.JoinerReconnectionAttempts}),this.socket.on("connect",()=>{this._setFormState(M.CHOOSING_GROUP),this.socket.on(H.Exist.EVENT_NAME,this._onNotifyGroupExist.bind(this))}),this.socket.on("connect_error",e=>{this.socket=void 0,this.top.toast("Unable to connected to the specified server.")}),this.socket.on("disconnect",s=>{"io server disconnect"===s&&(this.socket=void 0,this._setFormState(M.CHOOSING_HOST),t.value="",e.toast("The server disconnected you from the group joiner."))})}));return t.oninput=e=>this._setFormState(M.CHOOSING_HOST),t.onkeydown=e=>{"Enter"===e.key&&s()},t.onpaste=e=>{window.setTimeout(()=>s(),0)},t.onchange=()=>{s()},s}_onNotifyGroupExist(e){if(e===H.Exist.RequestCreate.Response.NOPE)return void this.top.toast(`The server rejected your request to create a new group "${this.in.groupName.value}".`);if(e===H.Exist.RequestCreate.Response.OKAY)return this.top.toast(`server accepted request to create new group "${this.in.groupName.value}".`),this.top.toast("connecting to new group..."),void this._attemptToJoinExistingGroup();const t=this.groupNameDataList,s=Array.from(t.children);Object.entries(e).forEach(([e,n])=>{const a=s.find(t=>t.value===e)||(e=>{const n=document.createElement("option");n.value=e;for(const e of s)if(n.value.localeCompare(e.value)<0){t.insertBefore(n,e);break}return n.parentElement||t.appendChild(n),n})(e);switch(n){case H.Exist.Status.IN_LOBBY:a.textContent="In Lobby";break;case H.Exist.Status.IN_GAME:a.textContent="In Game";break;case H.Exist.Status.DELETE:a.remove()}})}_initializeGroupNameHandlers(e){const t=this.in.groupName,s=()=>{t.value&&t.validity.valid&&(this.state===M.IN_GROUP?this.nav.next.focus():this.in.passphrase.focus())};this.in.groupName.oninput=t=>Object(i.a)(this,void 0,void 0,(function*(){this.state===M.IN_GROUP&&(yield e()),this.in.passphrase.value="",Object(i.c)(this,U,!1)})),t.onkeydown=e=>{"Enter"===e.key&&s()},t.onchange=e=>{s()}}_initializePassphraseHandlers(){const e=()=>Object(i.a)(this,void 0,void 0,(function*(){if(!this.in.passphrase.validity.valid)return;if(this.socket.nsp===B.Nsps.GROUP_LOBBY_PREFIX+this.in.groupName.value)return this.socket.connected?(this._setFormState(M.IN_GROUP),void this.nav.next.focus()):void 0;Array.from(this.groupNameDataList.children).some(e=>e.value===this.in.groupName.value)?(Object(i.c)(this,U,!1),yield this._attemptToJoinExistingGroup()):(Object(i.c)(this,U,!0),this.socket.emit(H.Exist.EVENT_NAME,new H.Exist.RequestCreate(this.in.groupName.value,this.in.passphrase.value)))}));this.in.passphrase.onkeydown=t=>{"Enter"===t.key&&e()}}_attemptToJoinExistingGroup(){var e;return Object(i.a)(this,void 0,void 0,(function*(){const t=(()=>{const e=new window.URL(this.in.hostUrl.value);return e.pathname=B.Nsps.GROUP_LOBBY_PREFIX+this.in.groupName.value,e.toString()})();null===(e=this.socket)||void 0===e||e.close();const s=this.top,a=n.getLastUserInfo();this.socket=(yield s.socketIo)(t,{query:{passphrase:this.in.passphrase.value,userInfo:a}}),this.socket.on("connect",()=>{this._setFormState(M.IN_GROUP)}),this.socket.on("connect_error",e=>{this.socket=void 0,s.toast("Unable to connect to the specified group.")}),this.socket.on("disconnect",e=>{"io server disconnect"===e&&(this.socket=void 0,s.toast("The server disconnected you from your group."),this.requestGoToScreen(d.Id.GROUP_JOINER,{},d.NavDir.BACKWARD))})}))}get socket(){return this.top.socket}set socket(e){this.top.socket=e}_initializeFormContents(){this.in={};const e=o.a.Screen.Impl.GroupJoiner.Class,t=document.createElement("div");function s(e,s){const n=document.createElement("input");n.classList.add(o.a.General.Class.INPUT_GROUP_ITEM,s),n.type="text",n.autocomplete="off",n.spellcheck=!1;const a=document.createElement("label");return a.textContent=e,a.appendChild(n),t.appendChild(a),n}t.classList.add(o.a.General.Class.INPUT_GROUP,e.CONTENT_WRAPPER),this.nav.prev.classList.add(o.a.General.Class.INPUT_GROUP_ITEM),t.appendChild(this.nav.prev);{const t=this.in.hostUrl=Object.assign(s("Host URL",e.HOST_URL),{type:"url",maxLength:128,autocomplete:"on",required:!0}),n=D.SUGGEST_HOST(this.top.webpageHostType);if(n){const e=document.createElement("option");e.value=n.value,e.textContent=n.description,document.getElementById(o.a.GLOBAL_IDS.PUBLIC_GAME_HOST_URLS).insertAdjacentElement("afterbegin",e)}t.setAttribute("list",o.a.GLOBAL_IDS.PUBLIC_GAME_HOST_URLS)}{const t=this.in.groupName=Object.assign(s("Group Name",e.GROUP_NAME),{pattern:H.Name.REGEXP.source,minLength:1,maxLength:H.Name.MaxLength,autocomplete:"on",required:!0}),n=this.groupNameDataList=document.createElement("datalist");n.id=o.a.GLOBAL_IDS.CURRENT_HOST_GROUPS,this.baseElem.appendChild(n),t.setAttribute("list",n.id)}{const t=this.in.passphrase=s("Group Passphrase",e.PASSPHRASE);t.pattern=H.Passphrase.REGEXP.source,t.maxLength=H.Passphrase.MaxLength}return this.nav.next.classList.add(o.a.General.Class.INPUT_GROUP_ITEM),t.appendChild(this.nav.next),Object.freeze(this.in),t}}G=new WeakMap,U=new WeakMap,function(e){let t;!function(e){e.CHOOSING_HOST="choosing-host",e.CHOOSING_GROUP="choosing-group",e.IN_GROUP="in-group"}(t=e.State||(e.State={})),e.SUGGEST_HOST=function(e){switch(e){case"github":return;case"filesystem":return{value:"localhost:"+B.DEFAULT_PORT,description:"dev shortcut :)"};case"sk-server":return{value:window.location.origin,description:"this page's server"};default:return}}}(D||(D={}));const M=D.State;Object.freeze(D),Object.freeze(D.prototype);class x extends T{get initialScreen(){return d.Id.GROUP_JOINER}_lazyLoad(){super._lazyLoad(),this.nav.next.textContent="Start Game",this.nav.next.onclick=e=>{const t=this._parseArgsFromGui();this.top.clientIsGroupHost&&this.top.socket.emit(k.a.CtorArgs.Event.NAME,t)}}_abstractOnBeforeEnter(e,t){return super._abstractOnBeforeEnter(e,t)}}Object.freeze(x),Object.freeze(x.prototype);const z=o.a.Screen.Impl.GroupLobby.Class;class F extends d{get initialScreen(){return d.Id.GROUP_JOINER}_lazyLoad(){this._players={},this._createInputs(),this.nav.prev.textContent="Return To Joiner",this.teamsElem=document.createElement("div"),this.teamsElem.classList.add(z.SEC_TEAMS),this.baseElem.appendChild(this.teamsElem),this.teamElems={};{const e=this.nav.next;e.textContent="Setup Game",e.onclick=()=>{this.requestGoToScreen(d.Id.SETUP_ONLINE,{})},this.baseElem.appendChild(e)}}_createInputs(){var e;const t=document.createElement("div");t.classList.add(o.a.General.Class.INPUT_GROUP,z.SEC_CLIENT_INFO);const s=Object.assign(document.createElement("input"),{type:"text",minLength:1,maxLength:c.b.Username.MAX_LENGTH,pattern:c.b.Username.REGEXP.source,value:null!==(e=localStorage.getItem(n.LocalKeys.USERNAME))&&void 0!==e?e:"",onchange:this._submitInputs.bind(this)});s.classList.add(o.a.General.Class.INPUT_GROUP_ITEM),t.appendChild(s);const a=Object.assign(document.createElement("input"),{type:"number",min:"0",max:"0",step:"1",value:"0",onchange:this._submitInputs.bind(this)});a.classList.add(o.a.General.Class.INPUT_GROUP_ITEM),t.appendChild(a);const r=document.createElement("select");this.in=Object.freeze({username:s,teamId:a,avatar:r}),this.baseElem.appendChild(t)}_submitInputs(){this.in.username.validity.valid&&this.in.teamId.validity.valid&&(localStorage.setItem(n.LocalKeys.USERNAME,this.in.username.value),localStorage.setItem(n.LocalKeys.AVATAR,this.in.avatar.value),this.top.socket.emit(H.Socket.UserInfoChange.EVENT_NAME,{username:this.in.username.value,teamId:parseInt(this.in.teamId.value),avatar:c.b.Avatar.LOREM_IPSUM}))}_abstractOnBeforeEnter(e,t){return Object(i.a)(this,void 0,void 0,(function*(){"forward"===e&&(this.nav.next.disabled=!this.top.clientIsGroupHost,this.teamsElem.textContent="",this._submitInputs(),this.top.socket.on(H.Socket.UserInfoChange.EVENT_NAME,this._onUserInfoChange.bind(this)),this.top.socket.once(k.a.CtorArgs.Event.NAME,e=>Object(i.a)(this,void 0,void 0,(function*(){this.requestGoToScreen(d.Id.PLAY_ONLINE,e)}))))}))}_abstractOnBeforeLeave(e){return e===d.NavDir.BACKWARD&&this.top.socket.removeListener(k.a.CtorArgs.Event.NAME),!0}_onUserInfoChange(e){Object.entries(e).forEach(([e,t])=>{const s=this._players[e];if(!s||1!==this.teamElems[s.teamId].childElementCount||void 0!==t&&t.teamId===s.teamId||(this.teamElems[s.teamId].remove(),delete this.teamElems[s.teamId]),t&&void 0===this.teamElems[t.teamId]){const e=this.teamElems[t.teamId]=document.createElement("div");e.classList.add(z.TEAM),e.onclick=e=>{this.in.teamId.value=t.teamId.toString()},this.teamsElem.appendChild(e)}if(void 0===t)s.base.remove(),delete this._players[e];else if(void 0===s){const s=this._players[e]=new F.UserInfo(t);this.teamElems[t.teamId].appendChild(s.base)}else s.update(t)}),this.in.teamId.max=Object.keys(this._players).length.toString()}}var W,V,Y,K,q,J,X;W=F||(F={}),V=new WeakMap,Y=new WeakMap,K=new WeakMap,W.UserInfo=class{constructor(e){V.set(this,void 0),Y.set(this,void 0),K.set(this,void 0),this.base=document.createElement("div"),this.base.classList.add(z.PLAYER);const t=()=>{const e=document.createElement("div");return this.base.appendChild(e),e};this.el=Object.freeze({username:t(),teamId:t(),avatar:t()}),this.el.username.classList.add(z.PLAYER_NAME),this.username=e.username,this.teamId=e.teamId}update(e){this.username=e.username,this.teamId=e.teamId,this.avatar=e.avatar}get username(){return Object(i.b)(this,V)}set username(e){this.el.username.textContent=e,Object(i.c)(this,V,e)}get teamId(){return Object(i.b)(this,Y)}set teamId(e){this.el.teamId.textContent=e.toString(),Object(i.c)(this,Y,e)}get avatar(){return Object(i.b)(this,K)}set avatar(e){Object(i.c)(this,K,e),this.el.avatar}},Object.freeze(F),Object.freeze(F.prototype);class $ extends j{constructor(){super(...arguments),this.askConfirmBeforeLeave=!1,this.wantsAutoPause=!1}get initialScreen(){return d.Id.GROUP_JOINER}getNavPrevArgs(){return[d.Id.GROUP_LOBBY,{},d.NavDir.BACKWARD]}_lazyLoad(){super._lazyLoad(),this.nav.prev.innerHTML="Return To Lobby"}_abstractOnBeforeEnter(e,t){const s=Object.create(null,{_abstractOnBeforeEnter:{get:()=>super._abstractOnBeforeEnter}});return Object(i.a)(this,void 0,void 0,(function*(){return this.nav.prev.onclick=e=>{this.top.clientIsGroupHost&&this.top.socket.emit(k.a.CtorArgs.Event.NAME,k.a.CtorArgs.Event.RETURN_TO_LOBBY_INDICATOR)},s._abstractOnBeforeEnter.call(this,e,t)}))}_createNewGame(e){return Object(i.a)(this,void 0,void 0,(function*(){const t=new((yield Promise.all([s.e(0),s.e(2)]).then(s.bind(null,26))).OnlineGame)(this._onGameBecomeOver.bind(this),this.top.socket,e);return this.top.socket.on(k.a.CtorArgs.EVENT_NAME_SERVER_APPROVE_UNPAUSE,()=>{this._statusBecomePlaying()}),this.top.socket.on(k.a.CtorArgs.EVENT_NAME_SERVER_APPROVE_PAUSE,()=>{this._statusBecomePaused}),Promise.resolve(t)}))}}Object.freeze($),Object.freeze($.prototype);class Z{constructor(e,t){q.set(this,void 0),t.setAttribute("role","presentation");const s=d.Id,n=e,a=t,r=this.goToScreen.bind(this);this.dict=Object.freeze({[s.HOME]:new u(s.HOME,n,a,r),[s.HOW_TO_PLAY]:new h(s.HOW_TO_PLAY,n,a,r),[s.HOW_TO_HOST]:new p(s.HOW_TO_HOST,n,a,r),[s.COLOUR_CTRL]:new S(s.COLOUR_CTRL,n,a,r),[s.SETUP_OFFLINE]:new A(s.SETUP_OFFLINE,n,a,r),[s.PLAY_OFFLINE]:new w(s.PLAY_OFFLINE,n,a,r),[s.GROUP_JOINER]:new D(s.GROUP_JOINER,n,a,r),[s.SETUP_ONLINE]:new x(s.SETUP_ONLINE,n,a,r),[s.GROUP_LOBBY]:new F(s.GROUP_LOBBY,n,a,r),[s.PLAY_ONLINE]:new $(s.PLAY_ONLINE,n,a,r)});const i=window.location.hash.slice(1),o=this.dict[i];o&&o.initialScreen?this.goToScreen(o.initialScreen,{}):this.goToScreen(d.Id.HOME,{}),window.addEventListener("popstate",e=>{this.goToScreen(...this.currentScreen.getNavPrevArgs())})}goToScreen(e,t,s=d.NavDir.FORWARD){const n=this.dict[e];if(this.currentScreen===n)throw"never";return void 0!==this.currentScreen&&!this.currentScreen._leave(s)||(n._enter(s,t),Object(i.c)(this,q,n),!0)}get currentScreen(){return Object(i.b)(this,q)}}q=new WeakMap,Object.freeze(Z),Object.freeze(Z.prototype);class Q{constructor(){J.set(this,void 0),X.set(this,void 0),this.webpageHostType=window.location.origin.match(/github\.io/)?Q.WebpageHostType.GITHUB:window.location.protocol.startsWith("file")?Q.WebpageHostType.FILESYSTEM:Q.WebpageHostType.SNAKEY_SERVER,this.storage=n;const e=document.getElementById(o.a.Screen.Id.ALL_SCREENS);if(!e)throw Error();this.prependComment(e,"ALL SCREENS CONTAINER"),Object(i.c)(this,J,new Z(this,e)),console.log("%c🩺 welcome! 🐍","font:700 2.3em /1.5 monospace; margin:0.4em; border:0.3em solid black;padding:0.4em; color:white; background-color:#3f5e77; border-radius:0.7em; ")}get clientIsGroupHost(){return Object(i.b)(this,J).dict.groupJoiner.clientIsGroupHost}toast(e){console.info(e)}prependComment(e,t){e.parentNode.insertBefore(document.createComment(" "+t+" "),e)}get socketIo(){return(()=>{let e;return e||new Promise((e,t)=>{const s=document.createElement("script");s.onload=()=>{e(io)},s.src=document.getElementById("socket.io-preload").href,document.body.appendChild(s)})})()}get game(){var e;return null!==(e=Object(i.b)(this,J).dict.playOffline.currentGame)&&void 0!==e?e:Object(i.b)(this,J).dict.playOnline.currentGame}get currentScreen(){return Object(i.b)(this,J).currentScreen}}J=new WeakMap,X=new WeakMap,function(e){let t;!function(e){e.GITHUB="github",e.FILESYSTEM="filesystem",e.SNAKEY_SERVER="sk-server"}(t=e.WebpageHostType||(e.WebpageHostType={}))}(Q||(Q={})),Object.freeze(Q),Object.freeze(Q.prototype),s(5),Object.freeze(Object.prototype);const ee=new Q;function te(){return ee.currentScreen}function se(){return ee.game}ee.webpageHostType===Q.WebpageHostType.GITHUB&&"serviceWorker"in navigator&&window.addEventListener("load",(function(){navigator.serviceWorker.register("/ServiceWorker.js").then(e=>{console.log("ServiceWorker registration successful with scope: ",e.scope)},e=>{console.log("ServiceWorker registration failed: ",e)})}))}]); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/client/index.js.map b/dist/client/index.js.map index c15c7767..a7c9f279 100644 --- a/dist/client/index.js.map +++ b/dist/client/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://snakey3/webpack/bootstrap","webpack://snakey3/./src/base/defs/OmHooks.ts","webpack://snakey3/./src/base/defs/TypeDefs.ts","webpack://snakey3/./src/base/game/Game.ts","webpack://snakey3/./src/base/floor/Coord.ts","webpack://snakey3/./src/base/floor/Tile.ts","webpack://snakey3/./src/base/defs/StorageHooks.ts","webpack://snakey3/./src/client/screen/SkScreen.ts","webpack://snakey3/./src/client/screen/impl/Home.ts","webpack://snakey3/./src/client/screen/impl/HowToPlay.ts","webpack://snakey3/./src/client/screen/impl/HowToHost.ts","webpack://snakey3/./src/client/utils/SkPickOne.ts","webpack://snakey3/./src/client/screen/impl/ColourCtrl.ts","webpack://snakey3/./src/client/screen/impl/Setup.ts","webpack://snakey3/./src/client/screen/impl/SetupOffline.ts","webpack://snakey3/./src/client/screen/impl/Play.ts","webpack://snakey3/./src/client/screen/impl/PlayOffline.ts","webpack://snakey3/./src/base/defs/OnlineDefs.ts","webpack://snakey3/./src/client/screen/impl/GroupJoiner.ts","webpack://snakey3/./src/client/screen/impl/SetupOnline.ts","webpack://snakey3/./src/client/screen/impl/GroupLobby.ts","webpack://snakey3/./src/client/screen/impl/PlayOnline.ts","webpack://snakey3/./src/client/screen/AllSkScreens.ts","webpack://snakey3/./src/client/TopLevel.ts","webpack://snakey3/./src/client/index.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","installedCssChunks","3","__webpack_require__","exports","module","l","e","promises","Promise","resolve","reject","href","fullhref","p","existingLinkTags","document","getElementsByTagName","dataHref","tag","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","jsonpScriptSrc","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","head","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","s","OmHooks","General","Tile","Grid","Player","Screen","SkPickOne","GLOBAL_IDS","PUBLIC_GAME_HOST_URLS","CURRENT_HOST_GROUPS","Class","TEXT_SELECT_DISABLED","FILL_PARENT","CENTER_CONTENTS","STACK_CONTENTS","INPUT_GROUP","INPUT_GROUP_ITEM","Dataset","COLOUR_SCHEME","BASE","POINTER_HB","LANG_CHAR_WRAP","LANG_SEQ","HEALTH","GRID","SCROLL_OUTER","SCROLL_INNER","IMPL_BODY","KBD_DC","KBD_DC_ICON","PAUSE_OL","PAUSE_OL_ICON","PLAYER_IOB_ROOT","IMPL_COORD_SYS","GAME_STATE","KEY","VALUES","PLAYING","PAUSED","OVER","FACE","DOWNED_OVERLAY","SHORT_SPOTLIGHT","LONG_SPOTLIGHT","DOWNED","TEAM","SELF","NO","FACE_SWATCH","Impl","Id","ALL_SCREENS","SCREEN_TINT","CURRENT","Home","Play","Setup","GroupJoiner","ColourCtrl","NAV","NAV_PLAY_OFFLINE","NAV_PLAY_ONLINE","NAV_HOW_TO_PLAY","NAV_HOW_TO_HOST","NAV_COLOURS","NAV_VIEW_REPO","NAV_RPT_ISSUE","GRID_WRAPPER","CONTROLS_BAR","PLAYERS_BAR","NEXT_BUTTON","CONTENT_WRAPPER","HOST_URL","GROUP_NAME","PASSPHRASE","OPTION","OPTION_LABEL","OPTION_PREVIEW","OPT_BASE","freeze","SkErrors","NEVER","SCROLL_INTO_CENTER","behavior","block","inline","applyMixins","derivedCtor","baseCtors","forEach","baseCtor","getOwnPropertyNames","getOwnPropertyDescriptor","deepFreeze","obj","val","Family","HUMAN","CHASER","NULL","MoveType","NORMAL","BOOST","Lang","Seq","CharSeqPair","REGEXP","RegExp","char","seq","CHAR_HIT_COUNT_SEED_CEILING","_RemapTemplates","IDENTITY","input","TO_LOWER","toLowerCase","FrontendDescs","id","export","numLeaves","remapFunc","displayName","blurb","map","desc","GET_FRONTEND_DESC_BY_ID","langId","find","Game","Type","CtorArgs","Serialization","Status","EVENT_NAME","RETURN_TO_LOBBY_INDICATOR","K","HEALTH_UPDATE_CHANCE","PCT_MOVES_THAT_ARE_BOOST","HEALTH_EFFECT_FOR_DOWNED_PLAYER","EVENT_RECORD_WRAPPING_BUFFER_LENGTH","EVENT_RECORD_FORWARD_WINDOW_LENGTH","Coord","System","Abstract","Mathy","coord","this","evictOccupant","lastKnownUpdateId","freeHealth","setLangCharSeqPair","playerId","immigrantInfo","occupantId","newFreeHealth","charSeqPair","StorageHooks","screenId","toplevel","parentElem","requestGoToDisplay","top","requestGoToScreen","args","baseElem","classList","add","_lazyLoad","spaceyCamelName","replace","letter","str","toUpperCase","prependComment","split","word","charAt","substring","join","location","URL","hash","history","replaceState","_abstractOnBeforeEnter","requestAnimationFrame","time","dataset","_abstractOnBeforeLeave","SkScreen","OMHC","nav","navElem","addEventListener","activeElement","parentElement","blur","addToNav","elem","cssClass","textContent","text","focus","sfx","SETUP_OFFLINE","GROUP_JOINER","HOW_TO_PLAY","HOW_TO_HOST","COLOUR_CTRL","button","onclick","Function","a","toString","referrerPolicy","INSTRUCTIONS_STEPS","IDB","LocalKeys","MUSIC_VOLUME","SFX_VOLUME","COLOUR_ID","COLOUR_LITERAL","GAME_PRESET","USERNAME","AVATAR","SessionKeys","UserGamePresetStore","DB_NAME","STORE_NAME","base","tabIndex","onKeyDown","ev","options","opt","hoverOpt","selectOpt","_registerParent","onOptDisabledChange","hoveredOpt","doCallback","confirmedOpt","_onSelectOpt","isValid","disabled","newIsValid","preventDefault","hoverOptIndex","indexOf","_Option","onDisabledChange","newDisabled","canBeInitialScreen","sel","PickOne","lastUsedSchemeId","localStorage","getItem","getOptById","Colour","ColourCtrlScreen","super","garageDoorElem","getElementById","style","transitionDuration","SMOOTH_CHANGE_DURATION","Schemes","schemeDesc","addOption","Option","docStyle","documentElement","swatchName","Swatch","varString","setProperty","setItem","cssLiteral","duration","gdStyle","opacity","pointerEvents","searchId","label","preview","NUM_PREVIEW_SLOTS","body","computedStyle","getComputedStyle","getPropertyValue","author","scheme","langSel","LangPickOne","nextBtn","_SetupScreen","DEFAULT_PRESET","coordSys","EUCLID2","gridDimensions","height","width","averageFreeHealthPerTile","langWeightScaling","playerDescs","isALocalOperator","familyId","teamId","socketId","username","noCheckGameOver","familyArgs","fearDistance","bloodThirstDistance","healthReserve","keyPressesPerSecond","ctorArgs","assign","PLAY_OFFLINE","gridHtml","createCenterColElem","_gridBaseElem","grid","_gridImplHost","implHost","createComment","pauseOl","game","currentGame","status","_statusBecomePlaying","_initializeControlsBar","_initializePlayersBar","wantsAutoPause","hidden","_statusBecomePaused","_gridKeyDownCallback","pauseButton","_createNewGame","reset","html","htmlElements","gridImpl","playersBar","confirm","removeEventListener","statusBecomePaused","values","remove","ctrlKey","repeat","operators","setCurrentOperator","currentOperator","processKeyboardInput","OHGD","statusBecomePlaying","resetButton","controlsBar","createControlButton","buttonText","backToHomeButton","HOME","_resetGame","CSS_FX","scrollOuter","kbdDcBase","kbdDcIcon","pauseIcon","intersectionRoot","OfflineGame","_onGameBecomeOver","SkServer","Nsps","PROTOCOL","DEFAULT_PORT","Group","Name","Passphrase","Exist","MaxLength","JoinerReconnectionAttempts","DEFAULT_TTL","RequestCreate","groupName","passphrase","Response","contentWrapper","_initializeFormContents","huiSubmit","_initializeHostUrlHandlers","_initializeGroupNameHandlers","_initializePassphraseHandlers","onsubmit","isGroupOwner","SETUP_ONLINE","GROUP_LOBBY","_setFormState","CHOOSING_HOST","socket","nsp","startsWith","GROUP_LOBBY_PREFIX","groupNameInput","hostUrlInput","newState","state","IN_GROUP","CHOOSING_GROUP","passphraseInput","nextButton","groupNameDataList","innerText","submitInput","origin","validity","valid","targetSocketUri","io","opts","hostname","connected","close","socketIo","reconnectionAttempts","on","onNotifyGroupExist","toast","reason","oninput","onkeydown","onpaste","onchange","response","NOPE","dataList","dataListArr","Array","from","children","entries","optElem","newOpt","otherOpt","localeCompare","insertBefore","IN_LOBBY","IN_GAME","DELETE","OKAY","info","log","attemptToJoinExistingGroup","some","emit","url","pathname","query","newSocket","createGenericTextInput","labelText","autocomplete","spellcheck","hostUrl","suggestedHostDesc","SUGGEST_HOST","webpageHostType","suggestOpt","description","insertAdjacentElement","maxLength","nspsName","pattern","source","nspsList","pass","GroupJoinerScreen","State","once","gameCtorArgs","PLAY_ONLINE","removeListener","OnlineGame","f","goToScreen","dict","isrId","isr","initialScreen","destId","destScreen","currentScreen","leave","enter","match","WebpageHostType","GITHUB","protocol","FILESYSTEM","SNAKEY_SERVER","allScreensElem","allScreens","node","commentStr","cached","playOffline","playOnline","TopLevel","navigator","serviceWorker","register","registration","scope"],"mappings":"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","file":"index.js","sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://snakey3/webpack/bootstrap","webpack://snakey3/./node_modules/tslib/tslib.es6.js","webpack://snakey3/./src/base/defs/TypeDefs.ts","webpack://snakey3/./src/base/defs/OmHooks.ts","webpack://snakey3/./src/base/game/Game.ts","webpack://snakey3/./src/base/floor/Coord.ts","webpack://snakey3/./src/base/floor/Tile.ts","webpack://snakey3/./src/base/defs/StorageHooks.ts","webpack://snakey3/./src/client/screen/SkScreen.ts","webpack://snakey3/./src/client/screen/impl/Home.ts","webpack://snakey3/./src/client/screen/impl/HowToPlay.ts","webpack://snakey3/./src/client/screen/impl/HowToHost.ts","webpack://snakey3/./src/client/utils/SkPickOne.ts","webpack://snakey3/./src/client/screen/impl/ColourCtrl.ts","webpack://snakey3/./src/client/screen/impl/Setup.ts","webpack://snakey3/./src/client/screen/impl/SetupOffline.ts","webpack://snakey3/./src/client/screen/impl/Play.ts","webpack://snakey3/./src/client/screen/impl/PlayOffline.ts","webpack://snakey3/./src/base/defs/OnlineDefs.ts","webpack://snakey3/./src/client/screen/impl/GroupJoiner.ts","webpack://snakey3/./src/client/screen/impl/SetupOnline.ts","webpack://snakey3/./src/client/screen/impl/GroupLobby.ts","webpack://snakey3/./src/client/screen/impl/PlayOnline.ts","webpack://snakey3/./src/client/screen/AllSkScreens.ts","webpack://snakey3/./src/client/TopLevel.ts","webpack://snakey3/./src/client/index.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","installedCssChunks","3","__webpack_require__","exports","module","l","e","promises","Promise","resolve","reject","href","fullhref","p","existingLinkTags","document","getElementsByTagName","dataHref","tag","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","jsonpScriptSrc","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","head","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","s","__awaiter","thisArg","_arguments","P","generator","fulfilled","step","next","rejected","result","done","apply","__classPrivateFieldGet","receiver","privateMap","has","TypeError","__classPrivateFieldSet","set","SCROLL_INTO_CENTER","freeze","behavior","block","inline","applyMixins","derivedCtor","baseCtors","forEach","baseCtor","getOwnPropertyNames","getOwnPropertyDescriptor","deepFreeze","obj","val","Player","Id","Username","Avatar","Family","HUMAN","CHASER","NULL","REGEXP","MAX_LENGTH","_values","values","filter","GET_RANDOM","Math","random","MoveType","NORMAL","BOOST","Lang","Seq","CharSeqPair","WeightExaggeration","RegExp","char","seq","MAX","CHAR_HIT_COUNT_SEED_CEILING","_RemapTemplates","IDENTITY","input","TO_LOWER","toLowerCase","FrontendDescs","id","export","numLeaves","remapFunc","displayName","blurb","map","desc","GET_FRONTEND_DESC_BY_ID","langId","find","OmHooks","General","Tile","Grid","Screen","SkPickOne","GLOBAL_IDS","PUBLIC_GAME_HOST_URLS","CURRENT_HOST_GROUPS","Class","TEXT_SELECT_DISABLED","FILL_PARENT","CENTER_CONTENTS","STACK_CONTENTS","INPUT_GROUP","INPUT_GROUP_ITEM","Dataset","COLOUR_SCHEME","BASE","POINTER_HB","LANG_CHAR_WRAP","LANG_SEQ","HEALTH","GRID","SCROLL_OUTER","SCROLL_INNER","IMPL_BODY","KBD_DC","KBD_DC_ICON","PAUSE_OL","PAUSE_OL_ICON","PLAYER_IOB_ROOT","IMPL_COORD_SYS","GAME_STATE","KEY","VALUES","PLAYING","PAUSED","OVER","FACE","DOWNED_OVERLAY","SHORT_SPOTLIGHT","LONG_SPOTLIGHT","DOWNED","TEAM","SELF","NO","FACE_SWATCH","Impl","ALL_SCREENS","SCREEN_TINT","NAV_NEXT","NAV_PREV","CURRENT","Home","ColourCtrl","Play","Setup","GroupJoiner","GroupLobby","NAV","NAV_PLAY_OFFLINE","NAV_PLAY_ONLINE","NAV_HOW_TO_PLAY","NAV_HOW_TO_HOST","NAV_COLOURS","NAV_VIEW_REPO","NAV_RPT_ISSUE","OPTION","OPTION_LABEL","OPTION_PREVIEW","GRID_WRAPPER","CONTROLS_BAR","PLAYERS_BAR","LANG_SEL","LANG_WEIGHT_EXAGG","LANG_WEIGHT_EXAGGERATION_LIST","CONTENT_WRAPPER","HOST_URL","GROUP_NAME","PASSPHRASE","SEC_CLIENT_INFO","SEC_TEAMS","PLAYER","PLAYER_NAME","OPT_BASE","Game","Type","CtorArgs","Serialization","Status","Event","NAME","RETURN_TO_LOBBY_INDICATOR","EVENT_NAME_CLIENT_READY_RESET","EVENT_NAME_CLIENT_READY_UNPAUSE","EVENT_NAME_SERVER_APPROVE_UNPAUSE","EVENT_NAME_SERVER_APPROVE_PAUSE","EVENT_NAME","K","HEALTH_UPDATE_CHANCE","PCT_MOVES_THAT_ARE_BOOST","HEALTH_EFFECT_FOR_DOWNED_PLAYER","EVENT_RECORD_WRAPPING_BUFFER_LENGTH","EVENT_RECORD_FORWARD_WINDOW_LENGTH","Coord","System","equals","a","b","_equals","coord","this","evictOccupant","lastKnownUpdateId","freeHealth","setLangCharSeqPair","playerId","immigrantInfo","occupantId","newFreeHealth","charSeqPair","StorageHooks","IDB","LocalKeys","MUSIC_VOLUME","SFX_VOLUME","COLOUR_ID","COLOUR_LITERAL","GAME_PRESET","USERNAME","AVATAR","getLastUserInfo","username","localStorage","getItem","teamId","avatar","SessionKeys","UserGamePresetStore","DB_NAME","STORE_NAME","screenId","toplevel","parentElem","requestGoToDisplay","top","requestGoToScreen","nav","prev","classList","add","textContent","onclick","ev","getNavPrevArgs","defaultDest","NavPrevDest","NavDir","BACKWARD","navDir","args","baseElem","_lazyLoad","spaceyCamelName","replace","letter","str","toUpperCase","prependComment","split","word","charAt","substring","join","location","URL","hash","history","replaceState","FORWARD","pushState","_abstractOnBeforeEnter","requestAnimationFrame","time","dataset","_abstractOnBeforeLeave","SkScreen","HOME","HOW_TO_PLAY","HOW_TO_HOST","COLOUR_CTRL","SETUP_OFFLINE","PLAY_OFFLINE","GROUP_JOINER","GROUP_LOBBY","SETUP_ONLINE","PLAY_ONLINE","OMHC","navElem","addEventListener","activeElement","parentElement","blur","addToNav","elem","cssClass","text","focus","button","Function","toString","referrerPolicy","INSTRUCTIONS_STEPS","base","tabIndex","_onKeyDown","options","opt","hoverOpt","selectOpt","_registerParent","_onOptDisabledChange","hoveredOpt","doCallback","confirmedOpt","_onSelectOpt","_isValid","disabled","newIsValid","preventDefault","hoverOptIndex","indexOf","_Option","onDisabledChange","newDisabled","canBeInitialScreen","sel","PickOne","lastUsedSchemeId","getOptById","Colour","ColourCtrlScreen","super","garageDoorElem","getElementById","style","transitionDuration","SMOOTH_CHANGE_DURATION","Schemes","schemeDesc","addOption","Option","docStyle","documentElement","swatchName","Swatch","varString","setProperty","setItem","cssLiteral","duration","gdStyle","opacity","pointerEvents","searchId","label","preview","NUM_PREVIEW_SLOTS","body","computedStyle","getComputedStyle","getPropertyValue","author","scheme","langSel","LangPickOne","_createLangWeightExaggerationInput","_loadLastUsedPreset","lwe","langWeightExaggeration","min","max","list","tickDesc","assign","DEFAULT_PRESET","parseFloat","_SetupScreen","coordSys","EUCLID2","gridDimensions","height","width","averageFreeHealthPerTile","playerDescs","isALocalOperator","familyId","socketId","noCheckGameOver","familyArgs","fearDistance","bloodThirstDistance","healthReserve","keyPressesPerSecond","_parseArgsFromGui","splice","gridHtml","createCenterColElem","_gridBaseElem","grid","_gridImplHost","implHost","createComment","pauseOl","game","currentGame","status","_statusBecomePlaying","_initializeControlsBar","_initializePlayersBar","wantsAutoPause","hidden","_statusBecomePaused","_gridKeyDownCallback","pauseButton","_createNewGame","capture","reset","html","htmlElements","gridImpl","playersBar","askConfirmBeforeLeave","confirm","removeEventListener","statusBecomePaused","remove","stopPropagation","ctrlKey","repeat","operators","setCurrentOperator","currentOperator","processKeyboardInput","OHGD","statusBecomePlaying","resetButton","controlsBar","createControlButton","buttonText","_resetGame","CSS_FX","scrollOuter","kbdDcBase","kbdDcIcon","pauseIcon","intersectionRoot","innerHTML","ctorArgs","OfflineGame","_onGameBecomeOver","SkServer","Nsps","PROTOCOL","DEFAULT_PORT","Group","Socket","Name","Passphrase","Exist","UserInfoChange","MaxLength","JoinerReconnectionAttempts","DEFAULT_TTL","RequestCreate","groupName","passphrase","Response","contentWrapper","_initializeFormContents","huiSubmit","_initializeHostUrlHandlers","_initializeGroupNameHandlers","_initializePassphraseHandlers","contentWrapperSubmit","_setFormState","CHOOSING_HOST","socket","nsp","startsWith","GROUP_LOBBY_PREFIX","in","hostUrl","newState","state","IN_GROUP","CHOOSING_GROUP","groupNameDataList","innerText","submitInput","validity","valid","origin","targetSocketUri","io","opts","hostname","connected","close","socketIo","reconnectionAttempts","on","_onNotifyGroupExist","toast","reason","oninput","onkeydown","onpaste","onchange","response","NOPE","OKAY","_attemptToJoinExistingGroup","dataList","dataListArr","Array","from","children","entries","optElem","newOpt","otherOpt","localeCompare","insertBefore","makeOption","IN_LOBBY","IN_GAME","DELETE","some","emit","url","pathname","userInfo","query","newSocket","createGenericTextInput","labelText","classStr","autocomplete","spellcheck","maxLength","required","suggestedHostDesc","SUGGEST_HOST","webpageHostType","suggestOpt","description","insertAdjacentElement","nspsName","pattern","source","minLength","nspsList","pass","GroupJoinerScreen","State","clientIsGroupHost","_players","_createInputs","teamsElem","teamElems","goSetup","uname","_submitInputs","parseInt","LOREM_IPSUM","_onUserInfoChange","once","gameCtorArgs","removeListener","res","childElementCount","teamElem","UserInfo","update","keys","GroupLobbyScreen","mkDiv","div","el","newUsername","newTeamId","newAvatar","OnlineGame","f","goToScreen","dict","isrId","isr","initialScreen","currentScreen","destId","destScreen","_leave","_enter","match","WebpageHostType","GITHUB","protocol","FILESYSTEM","SNAKEY_SERVER","storage","allScreensElem","log","groupJoiner","info","node","commentStr","cached","TopLevel","_top","screen","navigator","serviceWorker","register","registration","scope"],"mappings":"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","file":"index.js","sourceRoot":""} \ No newline at end of file diff --git a/dist/server/chunk/lang/Cellphone-ts.js b/dist/server/chunk/lang/Cellphone-ts.js new file mode 100644 index 00000000..e0086ee0 --- /dev/null +++ b/dist/server/chunk/lang/Cellphone-ts.js @@ -0,0 +1,2 @@ +exports.ids=[1],exports.modules={25:function(e,t,r){"use strict";r.r(t),r.d(t,"Cellphone",(function(){return o}));class o{}o||(o={}),Object.freeze(o),Object.freeze(o.prototype)}}; +//# sourceMappingURL=Cellphone-ts.js.map \ No newline at end of file diff --git a/dist/server/chunk/lang/Cellphone-ts.js.map b/dist/server/chunk/lang/Cellphone-ts.js.map new file mode 100644 index 00000000..4f2f62cf --- /dev/null +++ b/dist/server/chunk/lang/Cellphone-ts.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chunk/lang/Cellphone-ts.js","sources":["../chunk/lang/Cellphone-ts.js?"],"mappings":"AAAA","sourceRoot":""} \ No newline at end of file diff --git a/dist/server/chunk/lang/Emote-ts.js b/dist/server/chunk/lang/Emote-ts.js new file mode 100644 index 00000000..41b459e2 --- /dev/null +++ b/dist/server/chunk/lang/Emote-ts.js @@ -0,0 +1,2 @@ +exports.ids=[2],exports.modules={26:function(e,t,r){"use strict";r.r(t),r.d(t,"Emote",(function(){return o}));var o,s=r(10);!function(e){class t extends s.a{}e.GitHub=t,Object.freeze(t),Object.freeze(t.prototype)}(o||(o={})),Object.freeze(o)}}; +//# sourceMappingURL=Emote-ts.js.map \ No newline at end of file diff --git a/dist/server/chunk/lang/Emote-ts.js.map b/dist/server/chunk/lang/Emote-ts.js.map new file mode 100644 index 00000000..ee7c3a72 --- /dev/null +++ b/dist/server/chunk/lang/Emote-ts.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chunk/lang/Emote-ts.js","sources":["../chunk/lang/Emote-ts.js?"],"mappings":"AAAA","sourceRoot":""} \ No newline at end of file diff --git a/dist/server/chunk/lang/English-ts.js b/dist/server/chunk/lang/English-ts.js new file mode 100644 index 00000000..387982a8 --- /dev/null +++ b/dist/server/chunk/lang/English-ts.js @@ -0,0 +1,2 @@ +exports.ids=[3],exports.modules={27:function(e,t,r){"use strict";r.r(t),r.d(t,"English",(function(){return c}));var c,s=r(10);!function(e){class t extends s.a{constructor(e){super("engl-low",Object.entries(n).reduce((e,[t,r])=>(e[t]={seq:t,weight:r},e),{}),e)}}e.Lowercase=t,Object.freeze(t),Object.freeze(t.prototype);class r extends s.a{constructor(e){let t={};const r=e=>{t=Object.entries(n).reduce((t,[r,c])=>{const s=e(r);return t[s]={seq:s,weight:c},t},t)};r(e=>e.toLowerCase()),r(e=>e.toUpperCase()),super("engl-mix",t,e)}}let c;e.MixedCase=r,Object.freeze(r),Object.freeze(r.prototype),function(e){class t extends s.a{constructor(e){super("engl-cell-enc",Object.entries(n).reduce((e,[t,c],s)=>(e[t]={seq:r[s],weight:c},e),{}),e)}}e.Encode=t,Object.freeze(t),Object.freeze(t.prototype);const r=Object.freeze([3,3,3,3,3,4,3,4].flatMap((e,t)=>{const r=[],c=(1+t).toString();for(let t=c;t.length<=e;t+=c)r.push(t);return r}))}(c=e.OldCellphone||(e.OldCellphone={}));const n=Object.freeze({a:8.167,b:1.492,c:2.202,d:4.253,e:12.702,f:2.228,g:2.015,h:6.094,i:6.966,j:.153,k:1.292,l:4.025,m:2.406,n:6.749,o:7.507,p:1.929,q:.095,r:5.987,s:6.327,t:9.356,u:2.758,v:.978,w:2.56,x:.15,y:1.994,z:.077})}(c||(c={})),Object.freeze(c)}}; +//# sourceMappingURL=English-ts.js.map \ No newline at end of file diff --git a/dist/server/chunk/lang/English-ts.js.map b/dist/server/chunk/lang/English-ts.js.map new file mode 100644 index 00000000..a07edcb7 --- /dev/null +++ b/dist/server/chunk/lang/English-ts.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chunk/lang/English-ts.js","sources":["../chunk/lang/English-ts.js?"],"mappings":"AAAA","sourceRoot":""} \ No newline at end of file diff --git a/dist/server/chunk/lang/Japanese-ts.js b/dist/server/chunk/lang/Japanese-ts.js new file mode 100644 index 00000000..1b9c3334 --- /dev/null +++ b/dist/server/chunk/lang/Japanese-ts.js @@ -0,0 +1,2 @@ +exports.ids=[4],exports.modules={28:function(e,t,i){"use strict";i.r(t),i.d(t,"Japanese",(function(){return s}));var s,h=i(10);!function(e){class t extends h.a{constructor(e){super("japn-hir",t.INITIALIZER,e)}}t.INITIALIZER=Object.freeze({"の":{seq:"no",weight:1918313},"に":{seq:"ni",weight:1108840},"た":{seq:"ta",weight:1067566},"い":{seq:"i",weight:1060284},"は":{seq:"ha",weight:937811},"を":{seq:"wo",weight:936356},"と":{seq:"to",weight:927938},"る":{seq:"ru",weight:916652},"が":{seq:"ga",weight:860742},"し":{seq:"shi",weight:848132},"で":{seq:"de",weight:764834},"て":{seq:"te",weight:758316},"な":{seq:"na",weight:720156},"か":{seq:"ka",weight:537294},"れ":{seq:"re",weight:450805},"ら":{seq:"ra",weight:42329},"も":{seq:"mo",weight:396142},"う":{seq:"u",weight:352965},"す":{seq:"su",weight:340654},"り":{seq:"ri",weight:333999},"こ":{seq:"ko",weight:312227},"だ":{seq:"da",weight:280911},"ま":{seq:"ma",weight:278599},"さ":{seq:"sa",weight:258960},"き":{seq:"ki",weight:233505},"め":{seq:"me",weight:223806},"く":{seq:"ku",weight:221960},"あ":{seq:"a",weight:204256},"け":{seq:"ke",weight:199362},"ど":{seq:"do",weight:196555},"ん":{seq:"nn",weight:190068},"え":{seq:"e",weight:163664},"よ":{seq:"yo",weight:154206},"つ":{seq:"tsu",weight:153999},"や":{seq:"ya",weight:146156},"そ":{seq:"so",weight:131611},"わ":{seq:"wa",weight:123077},"ち":{seq:"chi",weight:99183},"み":{seq:"mi",weight:89264},"せ":{seq:"se",weight:83444},"ろ":{seq:"ro",weight:73467},"ば":{seq:"ba",weight:72228},"お":{seq:"o",weight:65870},"じ":{seq:"ji",weight:56857},"べ":{seq:"be",weight:56005},"ず":{seq:"zu",weight:53256},"げ":{seq:"ge",weight:49126},"ほ":{seq:"ho",weight:48752},"へ":{seq:"he",weight:47013},"び":{seq:"bi",weight:32312},"む":{seq:"mu",weight:31212},"ご":{seq:"go",weight:26965},"ね":{seq:"ne",weight:23490},"ぶ":{seq:"bu",weight:23280},"ぐ":{seq:"gu",weight:21549},"ぎ":{seq:"gi",weight:19865},"ひ":{seq:"hi",weight:19148},"ょ":{seq:"yo",weight:14425},"づ":{seq:"du",weight:13125},"ぼ":{seq:"bo",weight:12402},"ざ":{seq:"za",weight:12108},"ふ":{seq:"fu",weight:11606},"ゃ":{seq:"ya",weight:11522},"ぞ":{seq:"zo",weight:10047},"ゆ":{seq:"yu",weight:8486},"ぜ":{seq:"ze",weight:6893},"ぬ":{seq:"nu",weight:5124},"ぱ":{seq:"pa",weight:4349},"ゅ":{seq:"yu",weight:2755},"ぴ":{seq:"pi",weight:1608},"ぽ":{seq:"po",weight:1315},"ぷ":{seq:"pu",weight:986},"ぺ":{seq:"pe",weight:477},"ぢ":{seq:"di",weight:82}}),e.Hiragana=t,Object.freeze(t),Object.freeze(t.prototype);class i extends h.a{constructor(e){super("japn-kat",i.INITIALIZER,e)}}i.INITIALIZER=Object.freeze({"ン":{seq:"nn",weight:290948},"ル":{seq:"ru",weight:189442},"ス":{seq:"su",weight:178214},"ト":{seq:"to",weight:162802},"ア":{seq:"a",weight:127845},"イ":{seq:"i",weight:120807},"ラ":{seq:"ra",weight:117203},"リ":{seq:"ri",weight:106744},"ク":{seq:"ku",weight:98209},"カ":{seq:"ka",weight:82982},"シ":{seq:"shi",weight:80626},"タ":{seq:"ta",weight:75319},"ロ":{seq:"ro",weight:75301},"ド":{seq:"do",weight:74257},"ジ":{seq:"ji",weight:61171},"フ":{seq:"fu",weight:61115},"レ":{seq:"re",weight:60608},"メ":{seq:"me",weight:60230},"コ":{seq:"ko",weight:58724},"マ":{seq:"ma",weight:56123},"プ":{seq:"pu",weight:54159},"テ":{seq:"te",weight:53404},"ム":{seq:"mu",weight:50758},"チ":{seq:"chi",weight:48437},"バ":{seq:"ba",weight:44970},"ビ":{seq:"bi",weight:44462},"グ":{seq:"gu",weight:40433},"キ":{seq:"ki",weight:39608},"ウ":{seq:"u",weight:39323},"サ":{seq:"sa",weight:39202},"ニ":{seq:"ni",weight:38711},"ナ":{seq:"na",weight:38047},"エ":{seq:"e",weight:36458},"ブ":{seq:"bu",weight:35920},"パ":{seq:"pa",weight:35416},"セ":{seq:"se",weight:34883},"オ":{seq:"o",weight:34718},"ィ":{seq:"i",weight:33747},"デ":{seq:"de",weight:32665},"ュ":{seq:"yu",weight:32616},"ミ":{seq:"mi",weight:29262},"ャ":{seq:"ya",weight:28144},"ボ":{seq:"bo",weight:26651},"ダ":{seq:"da",weight:26396},"ツ":{seq:"tsu",weight:24541},"ポ":{seq:"ho",weight:23742},"ベ":{seq:"be",weight:22755},"ネ":{seq:"ne",weight:22462},"ガ":{seq:"ga",weight:22061},"ハ":{seq:"ha",weight:21839},"ワ":{seq:"wa",weight:21784},"ソ":{seq:"so",weight:20784},"ケ":{seq:"ke",weight:20633},"モ":{seq:"ho",weight:20070},"ノ":{seq:"no",weight:19572},"ズ":{seq:"zu",weight:19240},"ピ":{seq:"pi",weight:18692},"ホ":{seq:"ho",weight:18204},"ェ":{seq:"e",weight:17817},"ョ":{seq:"yo",weight:17731},"ペ":{seq:"pe",weight:14881},"ゴ":{seq:"go",weight:13931},"ヤ":{seq:"ya",weight:12526},"ギ":{seq:"gi",weight:10732},"ヨ":{seq:"yo",weight:10318},"ザ":{seq:"za",weight:10144},"ァ":{seq:"a",weight:10121},"ゼ":{seq:"ze",weight:7689},"ヒ":{seq:"hi",weight:7289},"ヘ":{seq:"he",weight:7129},"ユ":{seq:"yo",weight:6653},"ゲ":{seq:"ge",weight:6481},"ォ":{seq:"o",weight:6245},"ヌ":{seq:"nu",weight:2897},"ゾ":{seq:"zo",weight:2640},"ヴ":{seq:"vu",weight:1145},"ヂ":{seq:"di",weight:149},"ヅ":{seq:"du",weight:127},"ヲ":{seq:"wo",weight:122}}),e.Katakana=i,Object.freeze(i),Object.freeze(i.prototype)}(s||(s={})),Object.freeze(s)}}; +//# sourceMappingURL=Japanese-ts.js.map \ No newline at end of file diff --git a/dist/server/chunk/lang/Japanese-ts.js.map b/dist/server/chunk/lang/Japanese-ts.js.map new file mode 100644 index 00000000..32dd1a49 --- /dev/null +++ b/dist/server/chunk/lang/Japanese-ts.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chunk/lang/Japanese-ts.js","sources":["../chunk/lang/Japanese-ts.js?"],"mappings":"AAAA","sourceRoot":""} \ No newline at end of file diff --git a/dist/server/chunk/lang/Korean-ts.js b/dist/server/chunk/lang/Korean-ts.js new file mode 100644 index 00000000..1a3c7339 --- /dev/null +++ b/dist/server/chunk/lang/Korean-ts.js @@ -0,0 +1,2 @@ +exports.ids=[5],exports.modules={29:function(a,o,e){"use strict";e.r(o),e.d(o,"Korean",(function(){return m}));var m,t=e(10);!function(a){class o extends t.a{constructor(a){super("kore-dub",r((a,e,m)=>[a,e,m].flatMap(a=>a.value in o.DUB_KEYBOARD?[a.value]:a.atoms.split("")).map(a=>o.DUB_KEYBOARD[a]).join("")),a)}}o.DUB_KEYBOARD=Object.freeze({"":"","ㅂ":"q","ㅈ":"w","ㄷ":"e","ㄱ":"r","ㅅ":"t","ㅛ":"y","ㅕ":"u","ㅑ":"i","ㅐ":"o","ㅔ":"p","ㅁ":"a","ㄴ":"s","ㅇ":"d","ㄹ":"f","ㅎ":"g","ㅗ":"h","ㅓ":"j","ㅏ":"k","ㅣ":"l","ㅋ":"z","ㅌ":"x","ㅊ":"c","ㅍ":"v","ㅠ":"b","ㅜ":"n","ㅡ":"m","ㅃ":"Q","ㅉ":"W","ㄸ":"E","ㄲ":"R","ㅆ":"T","ㅒ":"O","ㅖ":"P"}),a.Dubeolsik=o,Object.freeze(o),Object.freeze(o.prototype);class e extends t.a{constructor(a){super("kore-sub",r((a,o,m)=>e.SEB_KEYBOARD.INITIALS[a.value]+e.SEB_KEYBOARD.MEDIALS[o.value]+e.SEB_KEYBOARD.FINALS[m.value]),a)}}e.SEB_KEYBOARD=Object.freeze({FINALS:{"":"","ㅎ":"1","ㅆ":"2","ㅂ":"3","ㅅ":"q","ㄹ":"w","ㅇ":"a","ㄴ":"s","ㅁ":"z","ㄱ":"x","ㄲ":"!","ㄺ":"@","ㅈ":"#","ㄿ":"$","ㄾ":"%","ㅍ":"Q","ㅌ":"W","ㄵ":"E","ㅀ":"R","ㄽ":"T","ㄷ":"A","ㄶ":"S","ㄼ":"D","ㄻ":"F","ㅊ":"Z","ㅄ":"X","ㅋ":"C","ㄳ":"V"},MEDIALS:{"ㅛ":"4","ㅠ":"5","ㅑ":"6","ㅖ":"7","ㅢ":"8","ㅕ":"e","ㅐ":"r","ㅓ":"t","ㅣ":"d","ㅏ":"f","ㅡ":"g","ㅔ":"c","ㅗ":"v","ㅜ":"b","ㅒ":"G","ㅘ":"vf","ㅙ":"vr","ㅚ":"vd","ㅝ":"bt","ㅞ":"bc","ㅟ":"bd"},INITIALS:{"ㅋ":"0","ㄹ":"y","ㄷ":"u","ㅁ":"i","ㅊ":"o","ㅍ":"p","ㄴ":"h","ㅇ":"j","ㄱ":"k","ㅈ":"l","ㅂ":";","ㅌ":"'","ㅅ":"n","ㅎ":"m","ㄲ":"!","ㄸ":"uu","ㅃ":";;","ㅆ":"nn","ㅉ":"l"}}),a.Sebeolsik=e,Object.freeze(e),Object.freeze(e.prototype);class m extends t.a{constructor(a){super("kore-rom",r((a,o,e)=>a.roman+o.roman+e.roman),a)}}a.Romanization=m,Object.freeze(m),Object.freeze(m.prototype);const r=a=>{const o={};return n.forEach((e,m)=>{s.forEach((t,r)=>{u.forEach((n,v)=>{let c=m;c=s.length*c+r,c=u.length*c+v;const f=String.fromCharCode(44032+c);o[f]={seq:a(e,t,n),weight:l[f]||1}})})}),o},n=Object.freeze([{value:"ㄱ",atoms:"ㄱ",roman:"g"},{value:"ㄲ",atoms:"ㄱㄱ",roman:"kk"},{value:"ㄴ",atoms:"ㄴ",roman:"n"},{value:"ㄷ",atoms:"ㄷ",roman:"d"},{value:"ㄸ",atoms:"ㄷㄷ",roman:"tt"},{value:"ㄹ",atoms:"ㄹ",roman:"r"},{value:"ㅁ",atoms:"ㅁ",roman:"m"},{value:"ㅂ",atoms:"ㅂ",roman:"b"},{value:"ㅃ",atoms:"ㅂㅂ",roman:"pp"},{value:"ㅅ",atoms:"ㅅ",roman:"s"},{value:"ㅆ",atoms:"ㅅㅅ",roman:"ss"},{value:"ㅇ",atoms:"ㅇ",roman:"-"},{value:"ㅈ",atoms:"ㅈ",roman:"j"},{value:"ㅉ",atoms:"ㅈㅈ",roman:"jj"},{value:"ㅊ",atoms:"ㅊ",roman:"ch"},{value:"ㅋ",atoms:"ㅋ",roman:"k"},{value:"ㅌ",atoms:"ㅌ",roman:"t"},{value:"ㅍ",atoms:"ㅍ",roman:"p"},{value:"ㅎ",atoms:"ㅎ",roman:"h"}]),s=Object.freeze([{value:"ㅏ",atoms:"ㅏ",roman:"a"},{value:"ㅐ",atoms:"ㅐ",roman:"ae"},{value:"ㅑ",atoms:"ㅑ",roman:"ya"},{value:"ㅒ",atoms:"ㅒ",roman:"yae"},{value:"ㅓ",atoms:"ㅓ",roman:"eo"},{value:"ㅔ",atoms:"ㅔ",roman:"e"},{value:"ㅕ",atoms:"ㅕ",roman:"yeo"},{value:"ㅖ",atoms:"ㅖ",roman:"ye"},{value:"ㅗ",atoms:"ㅗ",roman:"o"},{value:"ㅘ",atoms:"ㅗㅏ",roman:"wa"},{value:"ㅙ",atoms:"ㅗㅐ",roman:"wae"},{value:"ㅚ",atoms:"ㅗㅣ",roman:"oe"},{value:"ㅛ",atoms:"ㅛ",roman:"yo"},{value:"ㅜ",atoms:"ㅜ",roman:"u"},{value:"ㅝ",atoms:"ㅜㅓ",roman:"wo"},{value:"ㅞ",atoms:"ㅜㅔ",roman:"we"},{value:"ㅟ",atoms:"ㅜㅣ",roman:"wi"},{value:"ㅠ",atoms:"ㅠ",roman:"yu"},{value:"ㅡ",atoms:"ㅡ",roman:"eu"},{value:"ㅢ",atoms:"ㅡㅣ",roman:"ui"},{value:"ㅣ",atoms:"ㅣ",roman:"i"}]),u=Object.freeze([{value:"",atoms:"",roman:""},{value:"ㄱ",atoms:"ㄱ",roman:"k"},{value:"ㄲ",atoms:"ㄱㄱ",roman:"k"},{value:"ㄳ",atoms:"ㄱㅅ",roman:"kt"},{value:"ㄴ",atoms:"ㄴ",roman:"n"},{value:"ㄵ",atoms:"ㄴㅈ",roman:"nt"},{value:"ㄶ",atoms:"ㄴㅎ",roman:"nt"},{value:"ㄷ",atoms:"ㄷ",roman:"t"},{value:"ㄹ",atoms:"ㄹ",roman:"l"},{value:"ㄺ",atoms:"ㄹㄱ",roman:"lk"},{value:"ㄻ",atoms:"ㄹㅁ",roman:"lm"},{value:"ㄼ",atoms:"ㄹㅂ",roman:"lp"},{value:"ㄽ",atoms:"ㄹㅅ",roman:"lt"},{value:"ㄾ",atoms:"ㄹㅌ",roman:"lt"},{value:"ㄿ",atoms:"ㄹㅍ",roman:"lp"},{value:"ㅀ",atoms:"ㄹㅎ",roman:"lt"},{value:"ㅁ",atoms:"ㅁ",roman:"m"},{value:"ㅂ",atoms:"ㅂ",roman:"p"},{value:"ㅄ",atoms:"ㅂㅅ",roman:"pt"},{value:"ㅅ",atoms:"ㅅ",roman:"t"},{value:"ㅆ",atoms:"ㅅㅅ",roman:"t"},{value:"ㅇ",atoms:"ㅇ",roman:"ng"},{value:"ㅈ",atoms:"ㅈ",roman:"t"},{value:"ㅊ",atoms:"ㅊ",roman:"t"},{value:"ㅋ",atoms:"ㅋ",roman:"k"},{value:"ㅌ",atoms:"ㅌ",roman:"t"},{value:"ㅍ",atoms:"ㅍ",roman:"p"},{value:"ㅎ",atoms:"ㅎ",roman:"t"}]),l=Object.freeze({"":1})}(m||(m={})),Object.freeze(m)}}; +//# sourceMappingURL=Korean-ts.js.map \ No newline at end of file diff --git a/dist/server/chunk/lang/Korean-ts.js.map b/dist/server/chunk/lang/Korean-ts.js.map new file mode 100644 index 00000000..2b3ddb2e --- /dev/null +++ b/dist/server/chunk/lang/Korean-ts.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chunk/lang/Korean-ts.js","sources":["../chunk/lang/Korean-ts.js?"],"mappings":"AAAA","sourceRoot":""} \ No newline at end of file diff --git a/dist/server/chunk/lang/Morse-ts.js b/dist/server/chunk/lang/Morse-ts.js new file mode 100644 index 00000000..fc4d50ba --- /dev/null +++ b/dist/server/chunk/lang/Morse-ts.js @@ -0,0 +1,2 @@ +exports.ids=[6],exports.modules={30:function(e,t,r){"use strict";r.r(t),r.d(t,"Morse",(function(){return c}));var c,o=r(10);!function(e){class t extends o.a{}e.Encode=t,Object.freeze(t),Object.freeze(t.prototype);class r extends o.a{}e.Decode=r,Object.freeze(r),Object.freeze(r.prototype)}(c||(c={})),Object.freeze(c)}}; +//# sourceMappingURL=Morse-ts.js.map \ No newline at end of file diff --git a/dist/server/chunk/lang/Morse-ts.js.map b/dist/server/chunk/lang/Morse-ts.js.map new file mode 100644 index 00000000..fc0bdd2d --- /dev/null +++ b/dist/server/chunk/lang/Morse-ts.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chunk/lang/Morse-ts.js","sources":["../chunk/lang/Morse-ts.js?"],"mappings":"AAAA","sourceRoot":""} \ No newline at end of file diff --git a/dist/server/index.js b/dist/server/index.js index 299842ce..7ffbc6c1 100644 --- a/dist/server/index.js +++ b/dist/server/index.js @@ -1,2 +1,2 @@ -var snakey3=function(e){var t={};function s(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,s),i.l=!0,i.exports}return s.m=e,s.c=t,s.d=function(e,t,r){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(s.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)s.d(r,i,function(t){return e[t]}.bind(null,i));return r},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="dist/server/",s(s.s=13)}([function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Lang=t.Player=t.deepFreeze=t.applyMixins=t.SCROLL_INTO_CENTER=t.SkErrors=void 0,function(e){e.NEVER="Never happens. See comment in source."}(t.SkErrors||(t.SkErrors={})),t.SCROLL_INTO_CENTER=Object.freeze({behavior:"smooth",block:"center",inline:"center"}),t.SCROLL_INTO_CENTER,t.applyMixins=function(e,t){t.forEach(t=>{Object.getOwnPropertyNames(t.prototype).forEach(s=>{Object.defineProperty(e.prototype,s,Object.getOwnPropertyDescriptor(t.prototype,s))})})},t.deepFreeze=function e(t){for(const s of Object.getOwnPropertyNames(t)){const r=t[s];"object"==typeof r&&e(r)}return Object.freeze(t)};class r{}t.Player=r,function(e){let t;e.Family=Object.freeze({HUMAN:"HUMAN",CHASER:"CHASER"}),e.Family,function(e){e.NULL=void 0}(t=e.Id||(e.Id={})),e.MoveType=Object.freeze({NORMAL:"NORMAL",BOOST:"BOOST"}),e.MoveType}(r=t.Player||(t.Player={})),Object.freeze(r),Object.freeze(r.prototype);class i{}t.Lang=i,function(e){let t,s;!function(e){e.REGEXP=new RegExp("^[a-zA-Z0-9!@#$%^&*()-_=+;:'\"\\|,.<>/?]+$")}(t=e.Seq||(e.Seq={})),function(e){e.NULL=Object.freeze({char:"",seq:""})}(s=e.CharSeqPair||(e.CharSeqPair={})),e.CHAR_HIT_COUNT_SEED_CEILING=5,e._RemapTemplates=Object.freeze({IDENTITY:e=>e,TO_LOWER:e=>e.toLowerCase()}),e._RemapTemplates,e.FrontendDescs=Object.freeze([{id:"engl-low",module:"English",export:"Lowercase",numLeaves:26,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"English Lowercase (qwerty)",blurb:""},{id:"engl-mix",module:"English",export:"MixedCase",numLeaves:52,remapFunc:e._RemapTemplates.IDENTITY,displayName:"English Mixed-Case (Querty)",blurb:""},{id:"japn-hir",module:"Japanese",export:"Hiragana",numLeaves:71,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Hiragana",blurb:""},{id:"japn-kat",module:"Japanese",export:"Katakana",numLeaves:70,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Katakana",blurb:""},{id:"kore-dub",module:"Korean",export:"Dubeolsik",numLeaves:9177,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Dubeolsik (두벌식 키보드)",blurb:"The most common keyboard layout, and South Korea's only Hangul standard since 1969. Consonants are on the left, and vowels on the right."},{id:"kore-sub",module:"Korean",export:"Sebeolsik",numLeaves:10206,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Sebeolsik (세벌식 최종 키보드)",blurb:"Another Hangul keyboard layout used in South Korea, and the final Sebeolsik layout designed by Dr. Kong Byung Woo, hence the name. Syllable-initial consonants are on the right, final consonants on the left, and vowels in the middle. It is more ergonomic than the dubeolsik, but not widely used."},{id:"kore-rom",module:"Korean",export:"Romanization",numLeaves:3990,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Korean Revised Romanization",blurb:"The Revised Romanization of Korean (국어의 로마자 표기법; 國語의 로마字 表記法) is the official South Korean language romanization system. It was developed by the National Academy of the Korean Language from 1995, and was released on 7 July 2000 by South Korea's Ministry of Culture and Tourism"},{id:"engl-cell-enc",module:"English",export:"OldCellphone.Encode",numLeaves:8,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Old Cellphone Keyboard",blurb:""}].map(e=>Object.freeze(e))),e.FrontendDescs,e.GET_FRONTEND_DESC_BY_ID=function(t){const s=e.FrontendDescs.find(e=>e.id===t);if(!s)throw new Error(`Frontend descriptor of language with id "${t}" not found.`);return s}}(i=t.Lang||(t.Lang={})),Object.freeze(i),Object.freeze(i.prototype)},function(e,t,s){"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.Game=void 0,function(e){let t,s,r,i;!function(e){e.SERVER="SERVER",e.ONLINE="ONLINE",e.OFFLINE="OFFLINE"}(t=e.Type||(e.Type={})),function(e){e.EVENT_NAME="game-create",e.RETURN_TO_LOBBY_INDICATOR="return-to-lobby"}(s=e.CtorArgs||(e.CtorArgs={})),function(e){e.EVENT_NAME="game-reset"}(r=e.Serialization||(e.Serialization={})),function(e){e.PLAYING="PLAYING",e.PAUSED="PAUSED",e.OVER="OVER"}(i=e.Status||(e.Status={})),e.K=Object.freeze({HEALTH_UPDATE_CHANCE:.1,PCT_MOVES_THAT_ARE_BOOST:.05,HEALTH_EFFECT_FOR_DOWNED_PLAYER:.6,EVENT_RECORD_WRAPPING_BUFFER_LENGTH:128,EVENT_RECORD_FORWARD_WINDOW_LENGTH:64})}(r=t.Game||(t.Game={})),Object.freeze(r)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Lang=void 0;const r=s(0),i=s(27);class o extends r.Lang{constructor(e,t,s){if(super(),this.frontendDesc=o.GET_FRONTEND_DESC_BY_ID(e),this.treeMap=i.LangSeqTree.ParentNode.CREATE_TREE_MAP(t,s),this.leafNodes=this.treeMap.getLeafNodes(),this.leafNodes.length!==this.frontendDesc.numLeaves)throw new Error(`maintenance required: the frontend constant for the language "${this.frontendDesc.id}" needs to be updated to the correct, computed value, which is \`${this.leafNodes.length}\`.`)}get numLeaves(){return this.leafNodes.length}reset(){this.treeMap.reset()}getNonConflictingChar(e){this.leafNodes.sort(i.LangSeqTree.ParentNode.LEAF_CMP);let t=void 0;for(const s of this.leafNodes){const r=s.andNonRootParents();for(let t=0;te.startsWith(r[t].sequence));if(s){s===r[t].sequence?r.length=0:r.splice(t);break}}if(r.length){t=r[0];for(const e of r)e.personalWeightedHitCounte.reset())}getRandomCoord(){return this.static.getRandomCoord(this.dimensions)}}t.Grid=i,function(e){e.getImplementation=t=>e._Constructors[t]}(i=t.Grid||(t.Grid={}))},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Player=t.Team=t.PlayerStatus=t.PlayerSkeleton=void 0;const r=s(1),i=s(6),o=s(24);Object.defineProperty(t,"PlayerSkeleton",{enumerable:!0,get:function(){return o.PlayerSkeleton}});const n=s(25);Object.defineProperty(t,"PlayerStatus",{enumerable:!0,get:function(){return n.PlayerStatus}});const a=s(11);Object.defineProperty(t,"Team",{enumerable:!0,get:function(){return a.Team}});class c extends o.PlayerSkeleton{constructor(e,t){if(super(e,t),!c.Username.REGEXP.test(t.username))throw new RangeError(`Username "${t.username}" does not match the required regular expression, "${c.Username.REGEXP.source}".`);this.familyId=t.familyId,this.teamId=t.teamId,this.username=t.username}reset(e){super.reset(e),this.status.reset(),this.lastAcceptedRequestId=i.PlayerActionEvent.INITIAL_REQUEST_ID,this.requestInFlight=!1}_notifyGameNowPlaying(){}_notifyGameNowPaused(){}_notifyGameNowOver(){}makeMovementRequest(e,t){if(this.game.status!==r.Game.Status.PLAYING)throw new Error("This is not a necessary precondition, but we're doing it anyway.");if(this.requestInFlight)throw new Error("Only one request should ever be in flight at a time.");this.requestInFlight=!0,this.game.processMoveRequest(new i.PlayerActionEvent.Movement(this.playerId,this.lastAcceptedRequestId,e,t))}get team(){return this.game.teams[this.teamId]}isTeamedWith(e){return this.team.members.includes(e)}}t.Player=c,function(e){let t,s;!function(e){e.REGEXP=/[a-zA-Z](?:[ ]?[a-zA-Z0-9:-]+?){4,}/}(t=e.Username||(e.Username={})),function(e){e.finalize=e=>{const t=Array.from(new Set(e.map(e=>e.teamId))).sort((e,t)=>e-t).reduce((e,t,s)=>(e[t]=s,e),[]);return e.slice().sort((e,s)=>t[e.teamId]-t[s.teamId]).map((e,s)=>Object.assign(e,{playerId:s,teamId:t[e.teamId]}))}}(s=e.CtorArgs||(e.CtorArgs={})),Object.freeze(s)}(c=t.Player||(t.Player={})),Object.freeze(c),Object.freeze(c.prototype)},function(e,t,s){"use strict";var r,i,o,n,a=this&&this.__classPrivateFieldSet||function(e,t,s){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,s),s},c=this&&this.__classPrivateFieldGet||function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};Object.defineProperty(t,"__esModule",{value:!0}),t.Tile=t.Coord=void 0;const h=s(0),l=s(23);Object.defineProperty(t,"Coord",{enumerable:!0,get:function(){return l.Coord}});class u{constructor(e){r.set(this,void 0),i.set(this,void 0),o.set(this,void 0),n.set(this,void 0),this.coord=e,a(this,r,h.Player.Id.NULL)}reset(){this.evictOccupant(),this.lastKnownUpdateId=0,this.freeHealth=0,this.setLangCharSeqPair(h.Lang.CharSeqPair.NULL)}_setOccupant(e,t){a(this,r,e)}get isOccupied(){return this.occupantId!==h.Player.Id.NULL}evictOccupant(){a(this,r,h.Player.Id.NULL)}get occupantId(){return c(this,r)}get freeHealth(){return c(this,i)}set freeHealth(e){a(this,i,e)}setLangCharSeqPair(e){a(this,o,e.char),a(this,n,e.seq)}get langChar(){return c(this,o)}get langSeq(){return c(this,n)}}t.Tile=u,r=new WeakMap,i=new WeakMap,o=new WeakMap,n=new WeakMap,Object.freeze(u),Object.freeze(u.prototype)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PlayerActionEvent=void 0;const r=s(7);var i;!function(e){e.INITIAL_REQUEST_ID=-1,e.EVENT_NAME=Object.freeze({Bubble:"player-bubble",Movement:"player-movement"});class t{constructor(e,t){this.eventId=r.EventRecordEntry.EVENT_ID_REJECT,this.affectedNeighbours=void 0,this.playerId=e,this.playerLastAcceptedRequestId=t}}e.Bubble=t;e.Movement=class extends t{constructor(e,t,s,r){super(e,t),this.newPlayerHealth=void 0,this.tileHealthModDescs=void 0,this.destModDesc={coord:s.coord,lastKnownUpdateId:s.lastKnownUpdateId,newCharSeqPair:void 0,newFreeHealth:void 0},this.moveType=r}}}(i=t.PlayerActionEvent||(t.PlayerActionEvent={})),Object.freeze(i)},function(e,t,s){"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.EventRecordEntry=void 0,function(e){e.EVENT_ID_REJECT=-1}(r=t.EventRecordEntry||(t.EventRecordEntry={})),Object.freeze(r)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ArtificialPlayer=t.Player=void 0;const r=s(1),i=s(4);Object.defineProperty(t,"Player",{enumerable:!0,get:function(){return i.Player}});class o extends i.Player{constructor(e,t){if(super(e,t),e.gameType===r.Game.Type.ONLINE)throw new TypeError("OnlineGames should be using regular Players instead.")}_notifyGameNowPlaying(){this.delayedMovementContinue()}_notifyGameNowPaused(){this.game.cancelTimeout(this._scheduledMovementCallbackId),this._scheduledMovementCallbackId=void 0}_notifyGameNowOver(){this.game.cancelTimeout(this._scheduledMovementCallbackId),this._scheduledMovementCallbackId=void 0}movementContinue(){const e=this.computeDesiredDest();this._nextMovementTimerMultiplier=this.game.grid.tile.at(e).langSeq.length,this.makeMovementRequest(this.game.grid.getUntToward(e,this.coord),this.getNextMoveType()),this.delayedMovementContinue()}delayedMovementContinue(){this._scheduledMovementCallbackId=this.game.setTimeout(this.movementContinue.bind(this),this.computeNextMovementTimer()*this._nextMovementTimerMultiplier)}}t.ArtificialPlayer=o,function(e){e.of=(t,s)=>{const r=s.familyId;return new e._Constructors[r](t,s)}}(o=t.ArtificialPlayer||(t.ArtificialPlayer={}))},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.VisibleGridMixin=t.VisibleGrid=void 0;const r=s(39);!function(e){e.getImplementation=t=>e._Constructors[t]}(t.VisibleGrid||(t.VisibleGrid={}));class i{_superVisibleGrid(e,t){const s=r.OmHooks.Grid;t.setAttribute("role","presentation"),t.classList.add(s.Class.IMPL_BODY),t.dataset[s.Dataset.IMPL_COORD_SYS]=e.coordSys,this.baseElem=t;const i=document.createElement("div");i.classList.add(r.OmHooks.Player.Class.SHORT_SPOTLIGHT);const o=document.createElement("div");o.classList.add(r.OmHooks.Player.Class.LONG_SPOTLIGHT),this.spotlightElems=Object.freeze([i,o])}}t.VisibleGridMixin=i,Object.freeze(i),Object.freeze(i.prototype)},function(e,t,s){"use strict";var r,i=this&&this.__classPrivateFieldSet||function(e,t,s){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,s),s},o=this&&this.__classPrivateFieldGet||function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};Object.defineProperty(t,"__esModule",{value:!0}),t.TileGetter=void 0;class n{constructor(e){r.set(this,void 0),i(this,r,e),Object.freeze(this)}get _source(){return o(this,r)}at(...e){return o(this,r)._getTileAt(...e)}destsFrom(...e){return new a(o(this,r)._getTileDestsFrom(...e))}sourcesTo(...e){return new a(o(this,r)._getTileSourcesTo(...e))}}t.TileGetter=n,r=new WeakMap,Object.freeze(n),Object.freeze(n.prototype);class a{constructor(e){this.contents=e}get occupied(){return this.contents=this.contents.filter(e=>e.isOccupied),this}get unoccupied(){return this.contents=this.contents.filter(e=>!e.isOccupied),this}get get(){return this.contents}}Object.freeze(a),Object.freeze(a.prototype)},function(e,t,s){"use strict";var r,i=this&&this.__classPrivateFieldSet||function(e,t,s){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,s),s},o=this&&this.__classPrivateFieldGet||function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};Object.defineProperty(t,"__esModule",{value:!0}),t.Team=void 0;class n{constructor(e,t){if(r.set(this,void 0),0===t.length)throw new Error("teams must have at least one member.");this.id=e,this.members=t,i(this,r,this.members.every(e=>e.status.noCheckGameOver)?n.ElimOrder.IMMORTAL:n.ElimOrder.STANDING)}reset(){this.elimOrder!==n.ElimOrder.IMMORTAL&&(this.elimOrder=n.ElimOrder.STANDING)}get elimOrder(){return o(this,r)}set elimOrder(e){if(this.elimOrder===n.ElimOrder.IMMORTAL)throw new Error("Cannot change the elimination status of an immortal team.");i(this,r,e)}}t.Team=n,r=new WeakMap,function(e){let t;!function(e){e.IMMORTAL=-1,e.STANDING=0}(t=e.ElimOrder||(e.ElimOrder={}))}(n=t.Team||(t.Team={})),Object.freeze(n),Object.freeze(n.prototype)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Group=t.SkServer=void 0;class r{}t.SkServer=r,function(e){let t;e.PROTOCOL="http://",e.DEFAULT_PORT=8080,function(e){e.GROUP_LOBBY_PREFIX="/group-",e.GROUP_JOINER="/joiner"}(t=e.Nsps||(e.Nsps={}))}(r=t.SkServer||(t.SkServer={})),Object.freeze(r),Object.freeze(r.prototype);class i{}t.Group=i,function(e){let t,s,r;!function(e){e.REGEXP=/(?:[a-zA-Z0-9:-]+)/,e.MaxLength=30}(t=e.Name||(e.Name={})),function(e){e.REGEXP=/(?:[a-zA-Z0-9:-]+)/,e.MaxLength=30}(s=e.Passphrase||(e.Passphrase={})),e.JoinerReconnectionAttempts=2,e.DEFAULT_TTL=60,function(e){e.EVENT_NAME="group-exist";class t{constructor(e,t){this.groupName=e,this.passphrase=t}}let s;e.RequestCreate=t,function(e){let t;!function(e){e.OKAY="okay",e.NOPE="nope"}(t=e.Response||(e.Response={}))}(t=e.RequestCreate||(e.RequestCreate={})),function(e){e.IN_LOBBY="in-lobby",e.IN_GAME="in-game",e.DELETE="delete"}(s=e.Status||(e.Status={}))}(r=e.Exist||(e.Exist={}))}(i=t.Group||(t.Group={})),Object.freeze(i),Object.freeze(i.prototype)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.server=void 0;const r=s(14);t.server=new r.SnakeyServer},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SnakeyServer=void 0;const r=s(15),i=s(16),o=s(17),n=s(18),a=s(19),c=s(20),h=s(12);class l extends h.SkServer{constructor(e=l.DEFAULT_PORT,t){super(),this.app=n(),this.http=o.createServer({},this.app),this.io=a(this.http,{serveClient:!1}),this.allGroups=new Map;const s=i.resolve(__dirname,"../..");this.app.disable("x-powered-by"),this.app.get("/",(e,t)=>{t.sendFile(i.resolve(s,"index.html"))}),this.app.use("/dist",n.static(i.resolve(s,"dist"))),this.app.use("/assets",n.static(i.resolve(s,"assets"))),this.http.listen({port:e,host:t},()=>{const t=this.http.address();console.log(`\n\nServer mounted to: \`${t.address}${t.port}\` using ${t.family}.\n`),console.log("This host can be reached at any of the following addresses:\n"),l.chooseIPAddress().sort().forEach(t=>{console.log(`${t}:${e}`)}),console.log("")}),this.io.of(l.Nsps.GROUP_JOINER).on("connection",this.onJoinerNspsConnection.bind(this))}onJoinerNspsConnection(e){console.log("socket connect: "+e.id),e.emit(c.Group.Exist.EVENT_NAME,(()=>{const e={};return Array.from(this.allGroups).forEach(([t,s])=>{e[t]=s.isCurrentlyPlayingAGame?c.Group.Exist.Status.IN_GAME:c.Group.Exist.Status.IN_LOBBY}),e})()),e.on(c.Group.Exist.EVENT_NAME,t=>{(!t.groupName||this.allGroups.has(t.groupName)||t.groupName.length>c.Group.Name.MaxLength||!t.groupName.match(c.Group.Name.REGEXP)||t.passphrase.length>c.Group.Passphrase.MaxLength||!t.passphrase.match(c.Group.Passphrase.REGEXP))&&e.emit(c.Group.Exist.EVENT_NAME,c.Group.Exist.RequestCreate.Response.NOPE),this.allGroups.set(t.groupName,new c.Group(Object.freeze({namespace:this.io.of(l.Nsps.GROUP_LOBBY_PREFIX+t.groupName),name:t.groupName,passphrase:t.passphrase,deleteExternalRefs:()=>this.allGroups.delete(t.groupName),initialTtl:c.Group.DEFAULT_TTL}))),e.emit(c.Group.Exist.EVENT_NAME,c.Group.Exist.RequestCreate.Response.OKAY)})}}t.SnakeyServer=l,function(e){e.chooseIPAddress=()=>Object.values(r.networkInterfaces()).flat().filter(e=>!e.internal).map(e=>"IPv6"===e.family?`[${e.address}]`:e.address)}(l=t.SnakeyServer||(t.SnakeyServer={})),Object.freeze(l),Object.freeze(l.prototype)},function(e,t){e.exports=require("os")},function(e,t){e.exports=require("path")},function(e,t){e.exports=require("http")},function(e,t){e.exports=require("express")},function(e,t){e.exports=require("socket.io")},function(e,t,s){"use strict";var r,i=this&&this.__classPrivateFieldSet||function(e,t,s){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,s),s},o=this&&this.__classPrivateFieldGet||function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};Object.defineProperty(t,"__esModule",{value:!0}),t.Group=t.ServerGame=void 0;const n=s(1),a=s(21);Object.defineProperty(t,"ServerGame",{enumerable:!0,get:function(){return a.ServerGame}});const c=s(12);class h extends c.Group{constructor(e){super(),r.set(this,void 0),this.namespace=e.namespace,this.passphrase=e.passphrase,i(this,r,void 0),this.initialTtlTimeout=setTimeout(()=>{0===Object.keys(this.namespace.connected).length&&this.terminate()},1e3*e.initialTtl).unref(),this.deleteExternalRefs=e.deleteExternalRefs,this.namespace.use((e,t)=>(e.handshake.query.passphrase!==this.passphrase&&t(new Error("Incorrect passphrase")),t())).on("connection",this.onConnection.bind(this))}onConnection(e){console.log("socket connect: "+e.id),o(this,r)&&e.disconnect(),e.username=void 0,e.teamId=void 0,e.updateId=0,0===Object.keys(this.namespace.connected).length&&(clearTimeout(this.initialTtlTimeout),this.initialTtlTimeout=void 0,this.sessionHost=e,e.broadcast.emit(h.Exist.EVENT_NAME,{[this.name]:h.Exist.Status.IN_LOBBY}),e.on(n.Game.CtorArgs.EVENT_NAME,e=>{this.namespace.server.of(c.SkServer.Nsps.GROUP_JOINER).emit(h.Exist.EVENT_NAME,{[this.name]:e!==n.Game.CtorArgs.RETURN_TO_LOBBY_INDICATOR?h.Exist.Status.IN_GAME:h.Exist.Status.IN_LOBBY}),e!==n.Game.CtorArgs.RETURN_TO_LOBBY_INDICATOR?this._createGameInstance(e):o(this,r).onReturnToLobby()})),e.on("disconnect",(...t)=>{e===this.sessionHost&&this.terminate(),1===Object.keys(this.namespace.sockets).length&&this.terminate()})}get isCurrentlyPlayingAGame(){return void 0!==o(this,r)}terminate(){i(this,r,void 0);const e=this.namespace;e.removeAllListeners("connect"),e.removeAllListeners("connection"),Object.values(e.connected).forEach(e=>{e.disconnect()}),e.removeAllListeners(),delete e.server.nsps[e.name],this.namespace=void 0,this.deleteExternalRefs(),e.server.of(c.SkServer.Nsps.GROUP_JOINER).emit(h.Exist.EVENT_NAME,{[this.name]:h.Exist.Status.DELETE}),console.log(`terminated group: \`${this.name}\``)}_createGameInstance(e){const t={undefinedUsername:Object.values(this.sockets).filter(e=>!e.username).map(e=>e.id),undefinedTeamId:Object.values(this.sockets).filter(e=>!e.teamId).map(e=>e.id)};if(t.undefinedUsername.length||t.undefinedTeamId.length)return t;e.playerDescs=[...e.playerDescs,...Object.values(this.sockets).map(e=>Object.freeze({isALocalOperator:!1,familyId:"HUMAN",teamId:e.teamId,socketId:e.id,username:e.username,noCheckGameOver:!1,familyArgs:{}}))],i(this,r,new a.ServerGame(this.namespace,e))}get sockets(){return this.namespace.sockets}}t.Group=h,r=new WeakMap,Object.freeze(h),Object.freeze(h.prototype)},function(e,t,s){"use strict";var r=this&&this.__awaiter||function(e,t,s,r){return new(s||(s=Promise))((function(i,o){function n(e){try{c(r.next(e))}catch(e){o(e)}}function a(e){try{c(r.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(n,a)}c((r=r.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.ServerGame=void 0;const i=s(22),o=s(1),n=s(5),a=s(3),c=s(4),h=s(7),l=s(6),u=s(26);s(38).GameBootstrap.INIT_CLASS_REGISTRIES();class d extends u.GamepartManager{constructor(e,t){super(o.Game.Type.SERVER,{onGameBecomeOver:()=>{},tileClass:n.Tile,playerStatusCtor:c.PlayerStatus},t),this.namespace=e,this.playerSockets=t.playerDescs.filter(e=>e.familyId===c.Player.Family.HUMAN).map(e=>{if(!e.socketId)throw new Error;return this.namespace.sockets[e.socketId]}),this.players.filter(e=>e.familyId===c.Player.Family.HUMAN).map(e=>this.playerSockets[e.playerId]).forEach(e=>{e.on(l.PlayerActionEvent.EVENT_NAME.Movement,this.processMoveRequest.bind(this)),e.on(l.PlayerActionEvent.EVENT_NAME.Bubble,this.processBubbleRequest.bind(this))}),Object.values(this.namespace.sockets).forEach(e=>{t.playerDescs.forEach(t=>{t.isALocalOperator=t.socketId===e.id}),e.emit(o.Game.CtorArgs.EVENT_NAME,t)})}_getGridImplementation(e){return a.Grid.getImplementation(e)}reset(){const e=Object.create(null,{reset:{get:()=>super.reset}});return r(this,void 0,void 0,(function*(){const t=e.reset.call(this);return this.namespace.emit(o.Game.Serialization.EVENT_NAME,this.serializeResetState()),t}))}onReturnToLobby(){Object.values(this.namespace.sockets).forEach(e=>{e.removeAllListeners(l.PlayerActionEvent.EVENT_NAME.Movement),e.removeAllListeners(l.PlayerActionEvent.EVENT_NAME.Bubble)})}_createOperatorPlayer(e){throw new TypeError("This should never be called for a ServerGame.")}setTimeout(e,t,...s){return i.setTimeout(e,t,s).unref()}cancelTimeout(e){clearTimeout(e)}executePlayerMoveEvent(e){super.executePlayerMoveEvent(e),e.eventId===h.EventRecordEntry.EVENT_ID_REJECT?this.playerSockets[e.playerId].emit(l.PlayerActionEvent.EVENT_NAME.Movement,e):this.namespace.emit(l.PlayerActionEvent.EVENT_NAME.Movement,e)}executePlayerBubbleEvent(e){super.executePlayerBubbleEvent(e),e.eventId===h.EventRecordEntry.EVENT_ID_REJECT?this.playerSockets[e.playerId].emit(l.PlayerActionEvent.EVENT_NAME.Bubble,e):this.namespace.emit(l.PlayerActionEvent.EVENT_NAME.Bubble,e)}}t.ServerGame=d,Object.freeze(d),Object.freeze(d.prototype)},function(e,t){e.exports=require("timers")},function(e,t,s){"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.Coord=void 0,function(e){let t;!function(e){e.EUCLID2="EUCLID2",e.BEEHIVE="BEEHIVE"}(t=e.System||(e.System={}));class s{constructor(e){}}e.Abstract=s,function(t){class s extends e.Abstract{}t.Mathy=s}(s=e.Abstract||(e.Abstract={})),Object.freeze(s),Object.freeze(s.prototype)}(r=t.Coord||(t.Coord={})),Object.freeze(r)},function(e,t,s){"use strict";var r,i=this&&this.__classPrivateFieldSet||function(e,t,s){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,s),s},o=this&&this.__classPrivateFieldGet||function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};Object.defineProperty(t,"__esModule",{value:!0}),t.PlayerSkeleton=void 0;const n=s(0),a=s(1),c=s(10);class h extends n.Player{constructor(e,t){if(super(),r.set(this,void 0),Math.trunc(t.playerId)!==t.playerId)throw new RangeError("Player ID's must be integer values.");this.playerId=t.playerId,this.isALocalOperator=t.isALocalOperator,this.game=e,this.status=new this.game._playerStatusCtor(this,t.noCheckGameOver),this.tile=new c.TileGetter(new h.TileGetterSource(this))}_afterAllPlayersConstruction(){this.status._afterAllPlayersConstruction()}reset(e){i(this,r,e),this.hostTile._setOccupant(this.playerId,this.status.immigrantInfo)}get coord(){return this.hostTile.coord}get hostTile(){return o(this,r)}moveTo(e){if(this.hostTile.occupantId!==this.playerId){if(this.game.gameType!==a.Game.Type.ONLINE)throw new Error("Linkage between player and occupied tile disagrees.")}else this.hostTile.evictOccupant();if(e.isOccupied){if(this.game.gameType!==a.Game.Type.ONLINE)throw new Error("Only one player can occupy a tile at a time.")}else i(this,r,e),e._setOccupant(this.playerId,this.status.immigrantInfo)}}t.PlayerSkeleton=h,r=new WeakMap,function(e){var t,s;class r{constructor(e){t.set(this,void 0),s.set(this,void 0),i(this,t,e),i(this,s,e.game.grid.tile._source)}_getTileAt(){return o(this,s)._getTileAt(o(this,t).coord)}_getTileDestsFrom(){return o(this,s)._getTileDestsFrom(o(this,t).coord)}_getTileSourcesTo(){return o(this,s)._getTileSourcesTo(o(this,t).coord)}}t=new WeakMap,s=new WeakMap,e.TileGetterSource=r,Object.freeze(r),Object.freeze(r.prototype)}(h=t.PlayerSkeleton||(t.PlayerSkeleton={})),Object.freeze(h),Object.freeze(h.prototype)},function(e,t,s){"use strict";var r,i=this&&this.__classPrivateFieldGet||function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)},o=this&&this.__classPrivateFieldSet||function(e,t,s){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,s),s};Object.defineProperty(t,"__esModule",{value:!0}),t.PlayerStatus=void 0;const n=s(11);class a{constructor(e,t){r.set(this,void 0),this.player=e,this.noCheckGameOver=t}reset(){this.health=0}_afterAllPlayersConstruction(){}get immigrantInfo(){}get health(){return i(this,r)}set health(e){const t=this.isDowned;if(o(this,r,e),t||!this.isDowned||this.noCheckGameOver)return;const s=this.player.team,i=this.player.game.teams;if(s.elimOrder===n.Team.ElimOrder.STANDING&&s.members.every(e=>e.status.noCheckGameOver||e.status.isDowned)){const e=1+i.filter(e=>e.elimOrder!==n.Team.ElimOrder.STANDING).length;s.elimOrder=1+i.filter(e=>e.elimOrder!==n.Team.ElimOrder.STANDING&&e.elimOrder!==n.Team.ElimOrder.IMMORTAL).length,e===i.length&&this.player.game.statusBecomeOver()}}get isDowned(){return this.health<0}}t.PlayerStatus=a,r=new WeakMap,Object.freeze(a),Object.freeze(a.prototype)},function(e,t,s){"use strict";var r,i,o,n=this&&this.__awaiter||function(e,t,s,r){return new(s||(s=Promise))((function(i,o){function n(e){try{c(r.next(e))}catch(e){o(e)}}function a(e){try{c(r.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(n,a)}c((r=r.apply(e,t||[])).next())}))},a=this&&this.__classPrivateFieldSet||function(e,t,s){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,s),s},c=this&&this.__classPrivateFieldGet||function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};Object.defineProperty(t,"__esModule",{value:!0}),t.GamepartManager=void 0;const h=s(2),l=s(1),u=s(4),d=s(8),m=s(28),p=s(29);class f extends p.GamepartEvents{constructor(e,t,n){super(e,t,n),r.set(this,void 0),i.set(this,void 0),o.set(this,void 0),this.averageFreeHealth=n.averageFreeHealthPerTile*this.grid.area,this.averageFreeHealthPerTile=n.averageFreeHealthPerTile,a(this,i,new Set),a(this,o,Promise.resolve().then(()=>s(31)(`./${this.langFrontend.module}.ts`)).then(e=>{const t=this.langFrontend.export.split(".").reduce((e,t)=>e[t],e[this.langFrontend.module]);this.lang=new t(n.langWeightScaling);const s=this.grid.static.getAmbiguityThreshold();if(this.lang.numLeavese.playerId))}reset(){const e=Object.create(null,{reset:{get:()=>super.reset}});return n(this,void 0,void 0,(function*(){yield e.reset.call(this),a(this,r,0),c(this,i).clear(),yield c(this,o),this.lang.reset(),this.grid.shuffledForEachTile(e=>{e.setLangCharSeqPair(this.dryRunShuffleLangCharSeqAt(e))}),this.teams.forEach(e=>e.reset());const t=this.grid.static.getSpawnCoords(this.teams.map(e=>e.members.length),this.grid.dimensions);return this.teams.forEach((e,s)=>{e.members.forEach((e,r)=>{e.reset(this.grid.tile.at(t[s][r]))})}),this.scoreInfo.reset(),Promise.resolve()}))}_createArtifPlayer(e){return d.ArtificialPlayer.of(this,e)}dryRunShuffleLangCharSeqAt(e){e.setLangCharSeqPair(h.Lang.CharSeqPair.NULL);const t=Array.from(new Set(this.grid.tile.sourcesTo(e.coord).get.flatMap(e=>this.grid.tile.destsFrom(e.coord).get)));return this.lang.getNonConflictingChar(t.map(e=>e.langSeq).filter(e=>e))}get currentFreeHealth(){return c(this,r)}get freeHealthTiles(){return c(this,i)}dryRunSpawnFreeHealth(e){let t=this.averageFreeHealth-this.currentFreeHealth;if(t<=0)return;const s=[];for(;t>0;){let r;do{r=this.grid.tile.at(this.grid.getRandomCoord())}while(r.isOccupied||s.find(e=>r.coord.equals(e.coord)));const i=1;if(Math.random()r.coord.equals(e.coord)))?t.newFreeHealth=(t.newFreeHealth||0)+i:s.push({coord:r.coord,lastKnownUpdateId:1+r.lastKnownUpdateId,newCharSeqPair:void 0,newFreeHealth:r.freeHealth+i})}t-=i}return s}getHealthCostOfBoost(){return this.averageFreeHealthPerTile/l.Game.K.PCT_MOVES_THAT_ARE_BOOST}executeTileModEvent(e,t=!0){Object.freeze(e);const s=this.grid.tile.at(e.coord);if(e.lastKnownUpdateId!==1+s.lastKnownUpdateId)throw new Error("this never happens. see comment in source.");return a(this,r,c(this,r)+(e.newFreeHealth-s.freeHealth)),0===e.newFreeHealth?c(this,i).delete(s):c(this,i).add(s),super.executeTileModEvent(e,t),s}managerCheckGamePlayingRequest(e){if(this.status!==l.Game.Status.PLAYING)return;const t=this.players[e.playerId];if(!t)throw new Error("No such player exists.");if(e.playerLastAcceptedRequestId!==t.lastAcceptedRequestId)throw new RangeError(e.playerLastAcceptedRequestIde.reset())}_finalize(){Object.freeze(this.children),this.children.forEach(e=>e._finalize())}_addCharMapping(e,t){if(!o.Lang.Seq.REGEXP.test(e))throw new RangeError(`Mapping-sequence "${e}" did not match the required regular expression "${o.Lang.Seq.REGEXP.source}".`);if(0===t.length)throw new Error("never");let s=this;{let t=this;for(;t;)s=t,t=t.children.find(t=>e.startsWith(t.sequence))}if(s.sequence===e)throw new Error(`Mappings for all written-characters with a commoncorresponding typeable-sequence should be registered together,but an existing mapping for the sequence "${e}" was found.`);s.children.push(new c(s,e,t))}getLeafNodes(){const e=[];return this._recursiveGetLeafNodes(e),e}_recursiveGetLeafNodes(e){this.children.length?this.children.forEach(t=>{t._recursiveGetLeafNodes(e)}):e.push(this)}simpleView(){return this.children}static CREATE_TREE_MAP(e,t){const s=Object.values(e).reduce((e,t)=>e+t.weight,0),r=0===t?e=>1:1===t?e=>e:e=>Math.pow(e/s,t),i=new Map;for(const t in e){const s=e[t].seq,o=new a(t,r(e[t].weight)),n=i.get(s);n?n.push(o):i.set(s,[o])}const o=new n;return Array.from(i).sort((e,t)=>e[0].length-t[0].length).forEach(e=>{o._addCharMapping(...e)}),o._finalize(),o}}n.LEAF_CMP=(e,t)=>e.inheritingWeightedHitCount-t.inheritingWeightedHitCount,e.ParentNode=n,Object.freeze(n),Object.freeze(n.prototype);class c extends n{constructor(e,i,o){super(),t.set(this,void 0),s.set(this,void 0),this.sequence=i,r(this,s,o),r(this,t,e)}_finalize(){Object.freeze(i(this,s)),super._finalize()}reset(){super.reset(),i(this,s).forEach(e=>{e.reset(),this.incrementNumHits(e,Math.random()*o.Lang.CHAR_HIT_COUNT_SEED_CEILING)})}chooseOnePair(){const e=i(this,s).slice(0).sort(a.CMP).shift(),t={char:e.char,seq:this.sequence};return this.incrementNumHits(e),t}incrementNumHits(e,t=1){e._incrementNumHits(),this._recursiveIncrementNumHits(e.weightInv*t)}_recursiveIncrementNumHits(e){this.inheritingWeightedHitCount+=e,this.children.forEach(t=>t._recursiveIncrementNumHits(e))}get personalWeightedHitCount(){return this.inheritingWeightedHitCount-i(this,t).inheritingWeightedHitCount}andNonRootParents(){const e=[];for(let s=this;s instanceof c;s=i(s,t))e.push(s);return e}simpleView(){let e=i(this,s).map(e=>e.simpleView());return Object.assign(Object.create(null),{seq:this.sequence,chars:1===e.length?e[0]:e,kids:this.children.map(e=>e.simpleView())})}}t=new WeakMap,s=new WeakMap,c.PATH_CMP=(e,t)=>e.personalWeightedHitCount-t.personalWeightedHitCount,e.ChildNode=c,Object.freeze(c),Object.freeze(c.prototype)}(n=t.LangSeqTree||(t.LangSeqTree={})),Object.freeze(n);class a{constructor(e,t){if(t<=0)throw new RangeError(`All weights must be positive, but we were passed the value "${t}" for the character "${e}".`);this.char=e,this.weightInv=1/t}reset(){this.hitCount=0,this.weightedHitCount=0}_incrementNumHits(){this.hitCount+=1,this.weightedHitCount+=this.weightInv}simpleView(){return Object.assign(Object.create(null),{char:this.char,hits:this.hitCount})}}a.CMP=(e,t)=>e.weightedHitCount-t.weightedHitCount,Object.freeze(a),Object.freeze(a.prototype)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ScoreInfo=void 0;const r=s(0);class i{constructor(e){const t=[];for(const s of e)t[s]=new i.Entry;this.entries=t}reset(){for(const e of this.entries)e.reset()}}t.ScoreInfo=i,function(e){class t{constructor(){this.moveCounts={}}reset(){this.totalHealthPickedUp=0,Object.getOwnPropertyNames(r.Player.MoveType).forEach(e=>{this.moveCounts[e]=0})}}e.Entry=t,Object.freeze(t),Object.freeze(t.prototype)}(i=t.ScoreInfo||(t.ScoreInfo={})),Object.freeze(i),Object.freeze(i.prototype)},function(e,t,s){"use strict";var r,i=this&&this.__classPrivateFieldSet||function(e,t,s){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,s),s},o=this&&this.__classPrivateFieldGet||function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};Object.defineProperty(t,"__esModule",{value:!0}),t.GamepartEvents=t.PlayerActionEvent=void 0;const n=s(1),a=s(7),c=s(6);Object.defineProperty(t,"PlayerActionEvent",{enumerable:!0,get:function(){return c.PlayerActionEvent}});const h=s(30);class l extends h.GamepartBase{constructor(e,t,s){super(e,t,s),r.set(this,void 0),this.eventRecordBitmap=[]}reset(){const e=super.reset();return this.eventRecordBitmap.fill(!1,0,n.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH),i(this,r,0),e}get nextUnusedEventId(){return o(this,r)}_recordEvent(e){const t=e.eventId,s=t%n.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH;if(t===a.EventRecordEntry.EVENT_ID_REJECT)throw new TypeError("Do not try to record events for rejected requests.");if(t<0||t!==Math.trunc(t))throw new RangeError("Event ID's must only be assigned positive, integer values.");if(this.eventRecordBitmap[s])throw new Error("Event ID's must be assigned unique values.");this.eventRecordBitmap[s]=!0,this.eventRecordBitmap[(t+n.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH-n.Game.K.EVENT_RECORD_FORWARD_WINDOW_LENGTH)%n.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH]=!1,i(this,r,+o(this,r)+1)}executeTileModEvent(e,t=!0){Object.freeze(e);const s=this.grid.tile.at(e.coord);if(s.lastKnownUpdateId>e.lastKnownUpdateId)return s;if(s.lastKnownUpdateId===e.lastKnownUpdateId)throw new Error("never.");return e.newCharSeqPair&&(s.setLangCharSeqPair(e.newCharSeqPair),t&&this.operators.filter(e=>e.tile.destsFrom().get.includes(s)).forEach(e=>e.seqBufferAcceptKey(""))),s.lastKnownUpdateId=e.lastKnownUpdateId,s.freeHealth=e.newFreeHealth,s}executePlayerMoveEvent(e){var t;const s=this.players[e.playerId],r=e.playerLastAcceptedRequestId-s.lastAcceptedRequestId;if(e.eventId===a.EventRecordEntry.EVENT_ID_REJECT)return void(0===r&&(s.requestInFlight=!1));this._recordEvent(e);const i=this.executeTileModEvent(e.destModDesc,s!==this.currentOperator);if(null===(t=e.tileHealthModDescs)||void 0===t||t.forEach(e=>{this.executeTileModEvent(e)}),r>1){if(s===this.currentOperator)throw new Error("This never happens. See comment in source.")}else{if(s.requestInFlight=!1,!(s===this.currentOperator?1===r:r<=1))throw new Error("This never happens. See comment in source");s.status.health=e.newPlayerHealth.health,s.moveTo(i),s.lastAcceptedRequestId=e.playerLastAcceptedRequestId}}executePlayerBubbleEvent(e){this.players[e.playerId].requestInFlight=!1,e.eventId!==a.EventRecordEntry.EVENT_ID_REJECT&&this._recordEvent(e)}}t.GamepartEvents=l,r=new WeakMap,Object.freeze(l),Object.freeze(l.prototype)},function(e,t,s){"use strict";var r,i,o,n=this&&this.__classPrivateFieldSet||function(e,t,s){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,s),s},a=this&&this.__classPrivateFieldGet||function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};Object.defineProperty(t,"__esModule",{value:!0}),t.GamepartBase=void 0;const c=s(1),h=s(0),l=s(4);class u{constructor(e,t,s){r.set(this,void 0),i.set(this,void 0),o.set(this,void 0),this.gameType=e;const a=this._getGridImplementation(s.coordSys);this.grid=new a({gridClass:a,tileClass:t.tileClass,coordSys:s.coordSys,dimensions:s.gridDimensions}),n(this,r,t.onGameBecomeOver),this.langFrontend=h.Lang.GET_FRONTEND_DESC_BY_ID(s.langId),this._playerStatusCtor=t.playerStatusCtor,this.players=this.createPlayers(s),this.operators=Object.freeze(this.players.filter(e=>e.isALocalOperator)),this.setCurrentOperator(0);{const e=[];if(this.players.forEach(t=>{e[t.teamId]||(e[t.teamId]=[]),e[t.teamId].push(t)}),this.teams=e.map((e,t)=>new l.Team(t,e)),this.teams.every(e=>e.id===l.Team.ElimOrder.IMMORTAL))throw new Error("All teams are immortal. The game will never end.")}this.players.forEach(e=>e._afterAllPlayersConstruction())}reset(){return this.grid.reset(),n(this,o,c.Game.Status.PAUSED),Promise.resolve()}createPlayers(e){const t=e.playerDescs=this.gameType===c.Game.Type.ONLINE?e.playerDescs:l.Player.CtorArgs.finalize(e.playerDescs);return Object.freeze(t.map(e=>e.familyId===l.Player.Family.HUMAN?e.isALocalOperator?this._createOperatorPlayer(e):new l.Player(this,e):this._createArtifPlayer(e)))}serializeResetState(){const e=[],t=this.players.map(e=>e.coord),s=[];return this.grid.forEachTile(t=>{e.push({char:t.langChar,seq:t.langSeq}),t.freeHealth&&s.push({coord:t.coord,health:t.freeHealth})}),{csps:e,playerCoords:t,healthCoords:s}}deserializeResetState(e){{let t=0;this.grid.forEachTile(s=>{s.setLangCharSeqPair(e.csps[t++]),s.lastKnownUpdateId=1})}e.playerCoords.forEach((e,t)=>{this.players[t].moveTo(this.grid.tile.at(e))}),e.healthCoords.forEach(e=>{this.grid.tile.at(e.coord).freeHealth=e.health})}get currentOperator(){return a(this,i)}setCurrentOperator(e){const t=this.operators[e];t&&this.currentOperator!==t&&(t._notifyWillBecomeCurrent(),n(this,i,t))}get status(){return a(this,o)}statusBecomePlaying(){if(this.status!==c.Game.Status.PLAYING){if(this.status!==c.Game.Status.PAUSED)throw new Error("Can only resume a game that is currently paused.");this.players.forEach(e=>{e._notifyGameNowPlaying()}),this._abstractStatusBecomePlaying(),n(this,o,c.Game.Status.PLAYING)}else console.log("[statusBecomePlaying]: Game is already playing")}statusBecomePaused(){if(this.status!==c.Game.Status.PAUSED){if(this.status!==c.Game.Status.PLAYING)throw new Error("Can only pause a game that is currently playing.");this.players.forEach(e=>{e._notifyGameNowPaused()}),this._abstractStatusBecomePaused(),n(this,o,c.Game.Status.PAUSED)}else console.log("[statusBecomePaused]: Game is already paused")}statusBecomeOver(){if(this.status!==c.Game.Status.PLAYING)throw new Error("Can only end a game that is currently playing.");this.players.forEach(e=>{e._notifyGameNowOver()}),this._abstractStatusBecomeOver(),n(this,o,c.Game.Status.OVER),a(this,r).call(this),console.log("game is over!")}_abstractStatusBecomePlaying(){}_abstractStatusBecomePaused(){}_abstractStatusBecomeOver(){}}t.GamepartBase=u,r=new WeakMap,i=new WeakMap,o=new WeakMap,Object.freeze(u),Object.freeze(u.prototype)},function(e,t,s){var r={"./Cellphone.ts":32,"./Emote.ts":33,"./English.ts":34,"./Japanese.ts":35,"./Korean.ts":36,"./Morse.ts":37};function i(e){var t=o(e);return s(t)}function o(e){if(!s.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}i.keys=function(){return Object.keys(r)},i.resolve=o,e.exports=i,i.id=31},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Cellphone=void 0;class r{}t.Cellphone=r,r=t.Cellphone||(t.Cellphone={}),Object.freeze(r),Object.freeze(r.prototype)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Emote=void 0;const r=s(2);var i;!function(e){class t extends r.Lang{}e.GitHub=t,Object.freeze(t),Object.freeze(t.prototype)}(i=t.Emote||(t.Emote={})),Object.freeze(i)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.English=void 0;const r=s(2);var i;!function(e){class t extends r.Lang{constructor(e){super("engl-low",Object.entries(o).reduce((e,[t,s])=>(e[t]={seq:t,weight:s},e),{}),e)}}e.Lowercase=t,Object.freeze(t),Object.freeze(t.prototype);class s extends r.Lang{constructor(e){let t={};const s=e=>{t=Object.entries(o).reduce((t,[s,r])=>{const i=e(s);return t[i]={seq:i,weight:r},t},t)};s(e=>e.toLowerCase()),s(e=>e.toUpperCase()),super("engl-mix",t,e)}}let i;e.MixedCase=s,Object.freeze(s),Object.freeze(s.prototype),function(e){class t extends r.Lang{constructor(e){super("engl-cell-enc",Object.entries(o).reduce((e,[t,r],i)=>(e[t]={seq:s[i],weight:r},e),{}),e)}}e.Encode=t,Object.freeze(t),Object.freeze(t.prototype);const s=Object.freeze([3,3,3,3,3,4,3,4].flatMap((e,t)=>{const s=[],r=(1+t).toString();for(let t=r;t.length<=e;t+=r)s.push(t);return s}))}(i=e.OldCellphone||(e.OldCellphone={}));const o=Object.freeze({a:8.167,b:1.492,c:2.202,d:4.253,e:12.702,f:2.228,g:2.015,h:6.094,i:6.966,j:.153,k:1.292,l:4.025,m:2.406,n:6.749,o:7.507,p:1.929,q:.095,r:5.987,s:6.327,t:9.356,u:2.758,v:.978,w:2.56,x:.15,y:1.994,z:.077})}(i=t.English||(t.English={})),Object.freeze(i)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Japanese=void 0;const r=s(2);var i;!function(e){class t extends r.Lang{constructor(e){super("japn-hir",t.INITIALIZER,e)}}t.INITIALIZER=Object.freeze({"の":{seq:"no",weight:1918313},"に":{seq:"ni",weight:1108840},"た":{seq:"ta",weight:1067566},"い":{seq:"i",weight:1060284},"は":{seq:"ha",weight:937811},"を":{seq:"wo",weight:936356},"と":{seq:"to",weight:927938},"る":{seq:"ru",weight:916652},"が":{seq:"ga",weight:860742},"し":{seq:"shi",weight:848132},"で":{seq:"de",weight:764834},"て":{seq:"te",weight:758316},"な":{seq:"na",weight:720156},"か":{seq:"ka",weight:537294},"れ":{seq:"re",weight:450805},"ら":{seq:"ra",weight:42329},"も":{seq:"mo",weight:396142},"う":{seq:"u",weight:352965},"す":{seq:"su",weight:340654},"り":{seq:"ri",weight:333999},"こ":{seq:"ko",weight:312227},"だ":{seq:"da",weight:280911},"ま":{seq:"ma",weight:278599},"さ":{seq:"sa",weight:258960},"き":{seq:"ki",weight:233505},"め":{seq:"me",weight:223806},"く":{seq:"ku",weight:221960},"あ":{seq:"a",weight:204256},"け":{seq:"ke",weight:199362},"ど":{seq:"do",weight:196555},"ん":{seq:"nn",weight:190068},"え":{seq:"e",weight:163664},"よ":{seq:"yo",weight:154206},"つ":{seq:"tsu",weight:153999},"や":{seq:"ya",weight:146156},"そ":{seq:"so",weight:131611},"わ":{seq:"wa",weight:123077},"ち":{seq:"chi",weight:99183},"み":{seq:"mi",weight:89264},"せ":{seq:"se",weight:83444},"ろ":{seq:"ro",weight:73467},"ば":{seq:"ba",weight:72228},"お":{seq:"o",weight:65870},"じ":{seq:"ji",weight:56857},"べ":{seq:"be",weight:56005},"ず":{seq:"zu",weight:53256},"げ":{seq:"ge",weight:49126},"ほ":{seq:"ho",weight:48752},"へ":{seq:"he",weight:47013},"び":{seq:"bi",weight:32312},"む":{seq:"mu",weight:31212},"ご":{seq:"go",weight:26965},"ね":{seq:"ne",weight:23490},"ぶ":{seq:"bu",weight:23280},"ぐ":{seq:"gu",weight:21549},"ぎ":{seq:"gi",weight:19865},"ひ":{seq:"hi",weight:19148},"ょ":{seq:"yo",weight:14425},"づ":{seq:"du",weight:13125},"ぼ":{seq:"bo",weight:12402},"ざ":{seq:"za",weight:12108},"ふ":{seq:"fu",weight:11606},"ゃ":{seq:"ya",weight:11522},"ぞ":{seq:"zo",weight:10047},"ゆ":{seq:"yu",weight:8486},"ぜ":{seq:"ze",weight:6893},"ぬ":{seq:"nu",weight:5124},"ぱ":{seq:"pa",weight:4349},"ゅ":{seq:"yu",weight:2755},"ぴ":{seq:"pi",weight:1608},"ぽ":{seq:"po",weight:1315},"ぷ":{seq:"pu",weight:986},"ぺ":{seq:"pe",weight:477},"ぢ":{seq:"di",weight:82}}),e.Hiragana=t,Object.freeze(t),Object.freeze(t.prototype);class s extends r.Lang{constructor(e){super("japn-kat",s.INITIALIZER,e)}}s.INITIALIZER=Object.freeze({"ン":{seq:"nn",weight:290948},"ル":{seq:"ru",weight:189442},"ス":{seq:"su",weight:178214},"ト":{seq:"to",weight:162802},"ア":{seq:"a",weight:127845},"イ":{seq:"i",weight:120807},"ラ":{seq:"ra",weight:117203},"リ":{seq:"ri",weight:106744},"ク":{seq:"ku",weight:98209},"カ":{seq:"ka",weight:82982},"シ":{seq:"shi",weight:80626},"タ":{seq:"ta",weight:75319},"ロ":{seq:"ro",weight:75301},"ド":{seq:"do",weight:74257},"ジ":{seq:"ji",weight:61171},"フ":{seq:"fu",weight:61115},"レ":{seq:"re",weight:60608},"メ":{seq:"me",weight:60230},"コ":{seq:"ko",weight:58724},"マ":{seq:"ma",weight:56123},"プ":{seq:"pu",weight:54159},"テ":{seq:"te",weight:53404},"ム":{seq:"mu",weight:50758},"チ":{seq:"chi",weight:48437},"バ":{seq:"ba",weight:44970},"ビ":{seq:"bi",weight:44462},"グ":{seq:"gu",weight:40433},"キ":{seq:"ki",weight:39608},"ウ":{seq:"u",weight:39323},"サ":{seq:"sa",weight:39202},"ニ":{seq:"ni",weight:38711},"ナ":{seq:"na",weight:38047},"エ":{seq:"e",weight:36458},"ブ":{seq:"bu",weight:35920},"パ":{seq:"pa",weight:35416},"セ":{seq:"se",weight:34883},"オ":{seq:"o",weight:34718},"ィ":{seq:"i",weight:33747},"デ":{seq:"de",weight:32665},"ュ":{seq:"yu",weight:32616},"ミ":{seq:"mi",weight:29262},"ャ":{seq:"ya",weight:28144},"ボ":{seq:"bo",weight:26651},"ダ":{seq:"da",weight:26396},"ツ":{seq:"tsu",weight:24541},"ポ":{seq:"ho",weight:23742},"ベ":{seq:"be",weight:22755},"ネ":{seq:"ne",weight:22462},"ガ":{seq:"ga",weight:22061},"ハ":{seq:"ha",weight:21839},"ワ":{seq:"wa",weight:21784},"ソ":{seq:"so",weight:20784},"ケ":{seq:"ke",weight:20633},"モ":{seq:"ho",weight:20070},"ノ":{seq:"no",weight:19572},"ズ":{seq:"zu",weight:19240},"ピ":{seq:"pi",weight:18692},"ホ":{seq:"ho",weight:18204},"ェ":{seq:"e",weight:17817},"ョ":{seq:"yo",weight:17731},"ペ":{seq:"pe",weight:14881},"ゴ":{seq:"go",weight:13931},"ヤ":{seq:"ya",weight:12526},"ギ":{seq:"gi",weight:10732},"ヨ":{seq:"yo",weight:10318},"ザ":{seq:"za",weight:10144},"ァ":{seq:"a",weight:10121},"ゼ":{seq:"ze",weight:7689},"ヒ":{seq:"hi",weight:7289},"ヘ":{seq:"he",weight:7129},"ユ":{seq:"yo",weight:6653},"ゲ":{seq:"ge",weight:6481},"ォ":{seq:"o",weight:6245},"ヌ":{seq:"nu",weight:2897},"ゾ":{seq:"zo",weight:2640},"ヴ":{seq:"vu",weight:1145},"ヂ":{seq:"di",weight:149},"ヅ":{seq:"du",weight:127},"ヲ":{seq:"wo",weight:122}}),e.Katakana=s,Object.freeze(s),Object.freeze(s.prototype)}(i=t.Japanese||(t.Japanese={})),Object.freeze(i)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Korean=void 0;const r=s(2);var i;!function(e){class t extends r.Lang{constructor(e){super("kore-dub",o((e,s,r)=>[e,s,r].flatMap(e=>e.value in t.DUB_KEYBOARD?[e.value]:e.atoms.split("")).map(e=>t.DUB_KEYBOARD[e]).join("")),e)}}t.DUB_KEYBOARD=Object.freeze({"":"","ㅂ":"q","ㅈ":"w","ㄷ":"e","ㄱ":"r","ㅅ":"t","ㅛ":"y","ㅕ":"u","ㅑ":"i","ㅐ":"o","ㅔ":"p","ㅁ":"a","ㄴ":"s","ㅇ":"d","ㄹ":"f","ㅎ":"g","ㅗ":"h","ㅓ":"j","ㅏ":"k","ㅣ":"l","ㅋ":"z","ㅌ":"x","ㅊ":"c","ㅍ":"v","ㅠ":"b","ㅜ":"n","ㅡ":"m","ㅃ":"Q","ㅉ":"W","ㄸ":"E","ㄲ":"R","ㅆ":"T","ㅒ":"O","ㅖ":"P"}),e.Dubeolsik=t,Object.freeze(t),Object.freeze(t.prototype);class s extends r.Lang{constructor(e){super("kore-sub",o((e,t,r)=>s.SEB_KEYBOARD.INITIALS[e.value]+s.SEB_KEYBOARD.MEDIALS[t.value]+s.SEB_KEYBOARD.FINALS[r.value]),e)}}s.SEB_KEYBOARD=Object.freeze({FINALS:{"":"","ㅎ":"1","ㅆ":"2","ㅂ":"3","ㅅ":"q","ㄹ":"w","ㅇ":"a","ㄴ":"s","ㅁ":"z","ㄱ":"x","ㄲ":"!","ㄺ":"@","ㅈ":"#","ㄿ":"$","ㄾ":"%","ㅍ":"Q","ㅌ":"W","ㄵ":"E","ㅀ":"R","ㄽ":"T","ㄷ":"A","ㄶ":"S","ㄼ":"D","ㄻ":"F","ㅊ":"Z","ㅄ":"X","ㅋ":"C","ㄳ":"V"},MEDIALS:{"ㅛ":"4","ㅠ":"5","ㅑ":"6","ㅖ":"7","ㅢ":"8","ㅕ":"e","ㅐ":"r","ㅓ":"t","ㅣ":"d","ㅏ":"f","ㅡ":"g","ㅔ":"c","ㅗ":"v","ㅜ":"b","ㅒ":"G","ㅘ":"vf","ㅙ":"vr","ㅚ":"vd","ㅝ":"bt","ㅞ":"bc","ㅟ":"bd"},INITIALS:{"ㅋ":"0","ㄹ":"y","ㄷ":"u","ㅁ":"i","ㅊ":"o","ㅍ":"p","ㄴ":"h","ㅇ":"j","ㄱ":"k","ㅈ":"l","ㅂ":";","ㅌ":"'","ㅅ":"n","ㅎ":"m","ㄲ":"!","ㄸ":"uu","ㅃ":";;","ㅆ":"nn","ㅉ":"l"}}),e.Sebeolsik=s,Object.freeze(s),Object.freeze(s.prototype);class i extends r.Lang{constructor(e){super("kore-rom",o((e,t,s)=>e.roman+t.roman+s.roman),e)}}e.Romanization=i,Object.freeze(i),Object.freeze(i.prototype);const o=e=>{const t={};return n.forEach((s,r)=>{a.forEach((i,o)=>{c.forEach((n,l)=>{let u=r;u=a.length*u+o,u=c.length*u+l;const d=String.fromCharCode(44032+u);t[d]={seq:e(s,i,n),weight:h[d]||1}})})}),t},n=Object.freeze([{value:"ㄱ",atoms:"ㄱ",roman:"g"},{value:"ㄲ",atoms:"ㄱㄱ",roman:"kk"},{value:"ㄴ",atoms:"ㄴ",roman:"n"},{value:"ㄷ",atoms:"ㄷ",roman:"d"},{value:"ㄸ",atoms:"ㄷㄷ",roman:"tt"},{value:"ㄹ",atoms:"ㄹ",roman:"r"},{value:"ㅁ",atoms:"ㅁ",roman:"m"},{value:"ㅂ",atoms:"ㅂ",roman:"b"},{value:"ㅃ",atoms:"ㅂㅂ",roman:"pp"},{value:"ㅅ",atoms:"ㅅ",roman:"s"},{value:"ㅆ",atoms:"ㅅㅅ",roman:"ss"},{value:"ㅇ",atoms:"ㅇ",roman:"-"},{value:"ㅈ",atoms:"ㅈ",roman:"j"},{value:"ㅉ",atoms:"ㅈㅈ",roman:"jj"},{value:"ㅊ",atoms:"ㅊ",roman:"ch"},{value:"ㅋ",atoms:"ㅋ",roman:"k"},{value:"ㅌ",atoms:"ㅌ",roman:"t"},{value:"ㅍ",atoms:"ㅍ",roman:"p"},{value:"ㅎ",atoms:"ㅎ",roman:"h"}]),a=Object.freeze([{value:"ㅏ",atoms:"ㅏ",roman:"a"},{value:"ㅐ",atoms:"ㅐ",roman:"ae"},{value:"ㅑ",atoms:"ㅑ",roman:"ya"},{value:"ㅒ",atoms:"ㅒ",roman:"yae"},{value:"ㅓ",atoms:"ㅓ",roman:"eo"},{value:"ㅔ",atoms:"ㅔ",roman:"e"},{value:"ㅕ",atoms:"ㅕ",roman:"yeo"},{value:"ㅖ",atoms:"ㅖ",roman:"ye"},{value:"ㅗ",atoms:"ㅗ",roman:"o"},{value:"ㅘ",atoms:"ㅗㅏ",roman:"wa"},{value:"ㅙ",atoms:"ㅗㅐ",roman:"wae"},{value:"ㅚ",atoms:"ㅗㅣ",roman:"oe"},{value:"ㅛ",atoms:"ㅛ",roman:"yo"},{value:"ㅜ",atoms:"ㅜ",roman:"u"},{value:"ㅝ",atoms:"ㅜㅓ",roman:"wo"},{value:"ㅞ",atoms:"ㅜㅔ",roman:"we"},{value:"ㅟ",atoms:"ㅜㅣ",roman:"wi"},{value:"ㅠ",atoms:"ㅠ",roman:"yu"},{value:"ㅡ",atoms:"ㅡ",roman:"eu"},{value:"ㅢ",atoms:"ㅡㅣ",roman:"ui"},{value:"ㅣ",atoms:"ㅣ",roman:"i"}]),c=Object.freeze([{value:"",atoms:"",roman:""},{value:"ㄱ",atoms:"ㄱ",roman:"k"},{value:"ㄲ",atoms:"ㄱㄱ",roman:"k"},{value:"ㄳ",atoms:"ㄱㅅ",roman:"kt"},{value:"ㄴ",atoms:"ㄴ",roman:"n"},{value:"ㄵ",atoms:"ㄴㅈ",roman:"nt"},{value:"ㄶ",atoms:"ㄴㅎ",roman:"nt"},{value:"ㄷ",atoms:"ㄷ",roman:"t"},{value:"ㄹ",atoms:"ㄹ",roman:"l"},{value:"ㄺ",atoms:"ㄹㄱ",roman:"lk"},{value:"ㄻ",atoms:"ㄹㅁ",roman:"lm"},{value:"ㄼ",atoms:"ㄹㅂ",roman:"lp"},{value:"ㄽ",atoms:"ㄹㅅ",roman:"lt"},{value:"ㄾ",atoms:"ㄹㅌ",roman:"lt"},{value:"ㄿ",atoms:"ㄹㅍ",roman:"lp"},{value:"ㅀ",atoms:"ㄹㅎ",roman:"lt"},{value:"ㅁ",atoms:"ㅁ",roman:"m"},{value:"ㅂ",atoms:"ㅂ",roman:"p"},{value:"ㅄ",atoms:"ㅂㅅ",roman:"pt"},{value:"ㅅ",atoms:"ㅅ",roman:"t"},{value:"ㅆ",atoms:"ㅅㅅ",roman:"t"},{value:"ㅇ",atoms:"ㅇ",roman:"ng"},{value:"ㅈ",atoms:"ㅈ",roman:"t"},{value:"ㅊ",atoms:"ㅊ",roman:"t"},{value:"ㅋ",atoms:"ㅋ",roman:"k"},{value:"ㅌ",atoms:"ㅌ",roman:"t"},{value:"ㅍ",atoms:"ㅍ",roman:"p"},{value:"ㅎ",atoms:"ㅎ",roman:"t"}]),h=Object.freeze({"":1})}(i=t.Korean||(t.Korean={})),Object.freeze(i)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Morse=void 0;const r=s(2);var i;!function(e){class t extends r.Lang{}e.Encode=t,Object.freeze(t),Object.freeze(t.prototype);class s extends r.Lang{}e.Decode=s,Object.freeze(s),Object.freeze(s.prototype)}(i=t.Morse||(t.Morse={})),Object.freeze(i)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.GameBootstrap=void 0;const r=s(3),i=s(9),o=s(40),n=s(41),a=s(8),c=s(42);var h;!function(e){function t(){r.Grid._Constructors=Object.freeze({EUCLID2:o.Euclid2.Grid,BEEHIVE:n.Beehive.Grid}),Object.freeze(r.Grid),Object.freeze(r.Grid.prototype);{const e=i.VisibleGrid;e._Constructors=Object.freeze({EUCLID2:o.Euclid2.Grid.Visible,BEEHIVE:n.Beehive.Grid.Visible}),Object.freeze(e)}{const e=a.ArtificialPlayer;e._Constructors=Object.freeze({CHASER:c.Chaser}),Object.freeze(e),Object.freeze(e.prototype)}}e.INIT_CLASS_REGISTRIES=t,Object.freeze(t)}(h=t.GameBootstrap||(t.GameBootstrap={})),Object.freeze(h)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.OmHooks=void 0;const r=s(0);var i;!function(e){let t,s,r,i,o,n;e.GLOBAL_IDS={PUBLIC_GAME_HOST_URLS:"public-game-hosts-list",CURRENT_HOST_GROUPS:"current-host-groups-list"},function(e){e.Class={TEXT_SELECT_DISABLED:"text-select-disabled",FILL_PARENT:"fill-parent",CENTER_CONTENTS:"center-contents",STACK_CONTENTS:"stack-contents",INPUT_GROUP:"sk-input-group",INPUT_GROUP_ITEM:"sk-input-group-item"},e.Dataset={COLOUR_SCHEME:"skColourScheme"}}(t=e.General||(e.General={})),function(e){e.Class={BASE:"tile",POINTER_HB:"tile__pointer-hitbox",LANG_CHAR_WRAP:"tile__char",LANG_SEQ:"tile__seq"},e.Dataset={HEALTH:"health"}}(s=e.Tile||(e.Tile={})),function(e){e.Class={GRID:"game-grid",SCROLL_OUTER:"game-grid-scroll-outer",SCROLL_INNER:"game-grid-scroll-inner",IMPL_BODY:"game-grid-impl-body",KBD_DC:"game-grid-kbd-dc",KBD_DC_ICON:"game-grid-kbd-dc__icon",PAUSE_OL:"game-grid-pause-overlay",PAUSE_OL_ICON:"game-grid-pause-overlay__icon",PLAYER_IOB_ROOT:"grid-player-intersection-root"},e.Dataset={IMPL_COORD_SYS:"coordSys",GAME_STATE:{KEY:"gameState",VALUES:{PLAYING:"playing",PAUSED:"paused",OVER:"over"}}}}(r=e.Grid||(e.Grid={})),function(e){e.Class={BASE:"player",FACE:"player__face",DOWNED_OVERLAY:"player__downed-overlay",SHORT_SPOTLIGHT:"player__spotlight-short",LONG_SPOTLIGHT:"player__spotlight-long"},e.Dataset={DOWNED:{KEY:"downed",VALUES:{TEAM:"team",SELF:"self",NO:"no"}},FACE_SWATCH:"face"}}(i=e.Player||(e.Player={})),function(e){let t;e.Id={ALL_SCREENS:"all-screens-container",SCREEN_TINT:"screen-tint"},e.Class={BASE:"sk-screen"},e.Dataset={CURRENT:"current"},function(e){let t,s,r,i,o;!function(e){e.Class={BASE:"screen-home",NAV:"screen-home--nav",NAV_PLAY_OFFLINE:"screen-home--nav--play-offline",NAV_PLAY_ONLINE:"screen-home--nav--play-online",NAV_HOW_TO_PLAY:"screen-home--nav--how-to-play",NAV_HOW_TO_HOST:"screen-home--nav--how-to-host",NAV_COLOURS:"screen-home--nav--colour-scheme",NAV_VIEW_REPO:"screen-home--nav--goto-repo",NAV_RPT_ISSUE:"screen-home--nav--report-issue"}}(t=e.Home||(e.Home={})),function(e){e.Class={BASE:"screen-play",GRID_WRAPPER:"screen-play--grid-wrapper",CONTROLS_BAR:"screen-play--controls-bar",PLAYERS_BAR:"screen-play--players-bar"}}(s=e.Play||(e.Play={})),function(e){e.Class={BASE:"screen-setup",NEXT_BUTTON:"screen-setup--next-button"}}(r=e.Setup||(e.Setup={})),function(e){e.Class={BASE:"screen-joiner",CONTENT_WRAPPER:"screen-joiner--content-wrapper",HOST_URL:"screen-joiner--host-url",GROUP_NAME:"screen-joiner--group-name",PASSPHRASE:"screen-joiner--passphrase",NEXT_BUTTON:"screen-joiner--next-button"}}(i=e.GroupJoiner||(e.GroupJoiner={})),function(e){e.Class={BASE:"screen-colour",OPTION:"screen-colour--opt",OPTION_LABEL:"screen-colour--opt-label",OPTION_PREVIEW:"screen-colour--opt-preview"}}(o=e.ColourCtrl||(e.ColourCtrl={}))}(t=e.Impl||(e.Impl={}))}(o=e.Screen||(e.Screen={})),function(e){e.Class={BASE:"sk-pick-one",OPT_BASE:"sk-pick-one--opt"}}(n=e.SkPickOne||(e.SkPickOne={}))}(i=t.OmHooks||(t.OmHooks={})),Object.freeze(i.Player.Dataset.DOWNED),r.deepFreeze(i)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Euclid2=void 0;const r=s(0),i=s(5),o=s(3),n=s(9);var a;!function(e){class t extends i.Coord.Abstract.Mathy{constructor(e){super(e),this.x=e.x,this.y=e.y,Object.freeze(this)}equals(e){return this.x===e.x&&this.y===e.y}round(){return new t({x:Math.round(this.x),y:Math.round(this.y)})}oneNorm(e){return this.sub(e).originOneNorm()}originOneNorm(){return Math.abs(this.x)+Math.abs(this.y)}infNorm(e){return this.sub(e).originInfNorm()}originInfNorm(){return Math.max(Math.abs(this.x),Math.abs(this.y))}axialAlignment(e){return this.sub(e).originAxialAlignment()}originAxialAlignment(){return Math.abs(Math.abs(this.x)-Math.abs(this.y))/(Math.abs(this.x)+Math.abs(this.y))}add(e){return new t({x:this.x+e.x,y:this.y+e.y})}sub(e){return new t({x:this.x-e.x,y:this.y-e.y})}mul(e){return new t({x:e*this.x,y:e*this.y})}}e.Coord=t,Object.freeze(t),Object.freeze(t.prototype);class s extends o.Grid{constructor(e){super(e);const s=[];for(let r=0;rMath.random()-.5).forEach(t=>e(t))}getUntToward(e,t){const s=this.tile.destsFrom(t).unoccupied.get;if(0===s.length)return this.tile.at(t);if(1===s.length)return s[0];s.sort((t,s)=>t.coord.oneNorm(e)-s.coord.oneNorm(e)).sort((t,s)=>t.coord.infNorm(e)-s.coord.infNorm(e));for(let t=1;ts[0].coord.infNorm(e)){s.splice(t);break}if(1===s.length)return s[0];if(s[0].coord.x-t.x==0||s[0].coord.y-t.y==0){if(t.axialAlignment(t.sub(e))-.5>0)return s[0];s.shift()}return s[Math.floor(s.length*Math.random())]}getUntAwayFrom(e,t){return this.getUntToward(t.add(t.sub(e)),t)}getRandomCoordAround(e,s){return new t({x:e.x+Math.trunc(2*s*(Math.random()-.5)),y:e.y+Math.trunc(2*s*(Math.random()-.5))})}_getTileAt(e){if(e.x<0||e.x>=this.dimensions.width||e.y<0||e.y>=this.dimensions.height)throw new RangeError("Out of bounds. No such tile exists.");return this.grid[e.y][e.x]}_getTileDestsFrom(e,t=1){let s=e.y-t,r=e.y+t+1,i=e.x-t,o=e.x+t+1;return s>=this.dimensions.height||r<0||i>=this.dimensions.width||o<0?[]:this.grid.slice(Math.max(0,s),Math.min(this.dimensions.height,r)).flatMap(e=>e.slice(Math.max(0,i),Math.min(this.dimensions.width,o)))}_getTileSourcesTo(e,t=1){return this._getTileDestsFrom(e,t)}minMovesFromTo(e,t){return Math.min(Math.abs(t.x-e.x),Math.abs(t.y-e.y))}static getSpawnCoords(e,t){const r=[];return e.map(e=>{const i=[];for(;e>0;){let o;do{o=s.getRandomCoord(t)}while(r.find(e=>o.equals(e)));i.push(o),r.push(o),e--}return i})}static getArea(e){return e.height*e.width}static getRandomCoord(e){const s=Math.floor(e.width*Math.random()),r=Math.floor(e.height*Math.random());return new t({x:s,y:r})}}s.SIZE_LIMITS=Object.freeze({height:Object.freeze({min:11,max:51}),width:Object.freeze({min:11,max:51})}),e.Grid=s,function(e){class t extends e{constructor(e){super(e);const t=document.createElement("div");t.style.setProperty("--euclid2-grid-width",this.dimensions.width.toString());for(const e of this.grid)for(const s of e)s._addToDom(t);this._superVisibleGrid(e,t)}}e.Visible=t,r.applyMixins(t,[n.VisibleGridMixin]),Object.freeze(t),Object.freeze(t.prototype)}(s=e.Grid||(e.Grid={})),Object.freeze(s),Object.freeze(s.prototype)}(a=t.Euclid2||(t.Euclid2={})),Object.freeze(a)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Beehive=void 0;const r=s(0),i=s(5),o=s(3),n=s(9);var a;!function(e){class t extends i.Coord.Abstract.Mathy{constructor(e){super(e),this.dash=e.dash,this.bash=e.bash,Object.freeze(this)}equals(e){return this.dash===e.dash&&this.bash===e.bash}round(){const e=Math.floor(this.dash),s=Math.floor(this.bash),r=e-this.dash,i=s-this.bash;return r>2*i?new t({dash:e+1,bash:s}):r<.5*i?new t({dash:e,bash:s+1}):Math.min(r,i)>.5?new t({dash:e+1,bash:s+1}):new t({dash:e,bash:s})}add(e){return new t({dash:this.dash+e.dash,bash:this.bash+e.bash})}sub(e){return new t({dash:this.dash-e.dash,bash:this.bash-e.bash})}mul(e){return new t({dash:e*this.dash,bash:e*this.bash})}}e.Coord=t,Object.freeze(t),Object.freeze(t.prototype);class s extends o.Grid{constructor(e){super(e);this.grid=Object.freeze(void 0)}static getAmbiguityThreshold(){return 18}static getSizeLimits(){return this.SIZE_LIMITS}forEachTile(e){for(const t of this.grid)for(const s of t)e(s)}shuffledForEachTile(e){this.grid.flat().sort((e,t)=>Math.random()-.5).forEach(t=>e(t))}getUntToward(e,t){}getUntAwayFrom(e,t){return this.getUntToward(t.add(t.sub(e)),t)}getRandomCoordAround(e,t){}_getTileAt(e){}_getTileDestsFrom(e){}_getTileSourcesTo(e){}minMovesFromTo(e,t){}static getSpawnCoords(e,t){}static getArea(e){const t=Math.min(e.fslash,e.bslash),s=Math.max(e.fslash,e.bslash),r=-1+e.dash+t;let i=2*t*(e.dash+r);return i+=(s-t-1)*r,i}static getRandomCoord(e){return new t(void 0)}}s.SIZE_LIMITS=Object.freeze({dash:Object.freeze({min:10,max:50}),bslash:Object.freeze({min:10,max:50}),fslash:Object.freeze({min:10,max:50})}),e.Grid=s,function(e){class t extends e{constructor(e){super(e);this._superVisibleGrid(e,void 0)}}e.Visible=t,r.applyMixins(t,[n.VisibleGridMixin]),Object.freeze(t),Object.freeze(t.prototype)}(s=e.Grid||(e.Grid={})),Object.freeze(s),Object.freeze(s.prototype)}(a=t.Beehive||(t.Beehive={})),Object.freeze(a)},function(e,t,s){"use strict";var r,i=this&&this.__classPrivateFieldSet||function(e,t,s){if(!t.has(e))throw new TypeError("attempted to set private field on non-instance");return t.set(e,s),s},o=this&&this.__classPrivateFieldGet||function(e,t){if(!t.has(e))throw new TypeError("attempted to get private field on non-instance");return t.get(e)};Object.defineProperty(t,"__esModule",{value:!0}),t.Chaser=void 0;const n=s(8);class a extends n.ArtificialPlayer{constructor(e,t){super(e,t),r.set(this,void 0),this.behaviour=Object.freeze(Object.assign(Object.create(null),a.Behaviour.DEFAULT,t.familyArgs)),this.grid=this.game.grid}_afterAllPlayersConstruction(){super._afterAllPlayersConstruction(),this.threatProximity=this.game.teams.filter(e=>e.id!==this.teamId).flatMap(e=>e.members),this.targetProximity=this.threatProximity.slice()}reset(e){super.reset(e),i(this,r,this.coord)}moveTo(e){i(this,r,this.coord),super.moveTo(e)}computeDesiredDest(){this.threatProximity.sort((e,t)=>this.grid.minMovesFromTo(e.coord,this.coord)-this.grid.minMovesFromTo(t.coord,this.coord));for(const e of this.threatProximity){if(this.grid.minMovesFromTo(e.coord,this.coord)>this.behaviour.fearDistance)break;if(!e.status.isDowned&&e.status.health>this.status.health)return this.grid.getUntAwayFrom(e.coord,this.coord).coord}if(this.targetProximity.sort((e,t)=>this.grid.minMovesFromTo(this.coord,e.coord)-this.grid.minMovesFromTo(this.coord,t.coord)),this.status.isDowned)for(const e of this.targetProximity){if(this.grid.minMovesFromTo(this.coord,e.coord)>this.behaviour.bloodThirstDistance)break;if(e.status.health{Object.getOwnPropertyNames(t.prototype).forEach(s=>{Object.defineProperty(e.prototype,s,Object.getOwnPropertyDescriptor(t.prototype,s))})})}function i(e){for(const t of Object.getOwnPropertyNames(e)){const s=e[t];"object"==typeof s&&i(s)}return Object.freeze(e)}class a{}!function(e){let t,s,r;e.Family=Object.freeze({HUMAN:"HUMAN",CHASER:"CHASER"}),e.Family,function(e){e.NULL=void 0}(t=e.Id||(e.Id={})),function(e){e.REGEXP=/[ a-zA-Z0-9:-]+/,e.MAX_LENGTH=15}(s=e.Username||(e.Username={})),function(e){e.LOREM_IPSUM="lorem-ipsum"}(r=e.Avatar||(e.Avatar={})),function(e){const t=Object.values(e).filter(e=>"string"==typeof e);e.GET_RANDOM=function(){return t[Math.random()*t.length]}}(r=e.Avatar||(e.Avatar={})),e.MoveType=Object.freeze({NORMAL:"NORMAL",BOOST:"BOOST"}),e.MoveType}(a||(a={})),Object.freeze(a),Object.freeze(a.prototype);class n{}!function(e){let t,s,r;!function(e){e.REGEXP=new RegExp("^[a-zA-Z0-9!@#$%^&*()-_=+;:'\"\\|,.<>/?]+$")}(t=e.Seq||(e.Seq={})),function(e){e.NULL=Object.freeze({char:"",seq:""})}(s=e.CharSeqPair||(e.CharSeqPair={})),function(e){e.MAX=4}(r=e.WeightExaggeration||(e.WeightExaggeration={})),e.CHAR_HIT_COUNT_SEED_CEILING=5,e._RemapTemplates=Object.freeze({IDENTITY:e=>e,TO_LOWER:e=>e.toLowerCase()}),e._RemapTemplates,e.FrontendDescs=Object.freeze([{id:"engl-low",module:"English",export:"Lowercase",numLeaves:26,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"English Lowercase (qwerty)",blurb:""},{id:"engl-mix",module:"English",export:"MixedCase",numLeaves:52,remapFunc:e._RemapTemplates.IDENTITY,displayName:"English Mixed-Case (Querty)",blurb:""},{id:"japn-hir",module:"Japanese",export:"Hiragana",numLeaves:71,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Hiragana",blurb:""},{id:"japn-kat",module:"Japanese",export:"Katakana",numLeaves:70,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Japanese Katakana",blurb:""},{id:"kore-dub",module:"Korean",export:"Dubeolsik",numLeaves:9177,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Dubeolsik (두벌식 키보드)",blurb:"The most common keyboard layout, and South Korea's only Hangul standard since 1969. Consonants are on the left, and vowels on the right."},{id:"kore-sub",module:"Korean",export:"Sebeolsik",numLeaves:10206,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Korean Sebeolsik (세벌식 최종 키보드)",blurb:"Another Hangul keyboard layout used in South Korea, and the final Sebeolsik layout designed by Dr. Kong Byung Woo, hence the name. Syllable-initial consonants are on the right, final consonants on the left, and vowels in the middle. It is more ergonomic than the dubeolsik, but not widely used."},{id:"kore-rom",module:"Korean",export:"Romanization",numLeaves:3990,remapFunc:e._RemapTemplates.TO_LOWER,displayName:"Korean Revised Romanization",blurb:"The Revised Romanization of Korean (국어의 로마자 표기법; 國語의 로마字 表記法) is the official South Korean language romanization system. It was developed by the National Academy of the Korean Language from 1995, and was released on 7 July 2000 by South Korea's Ministry of Culture and Tourism"},{id:"engl-cell-enc",module:"English",export:"OldCellphone.Encode",numLeaves:8,remapFunc:e._RemapTemplates.IDENTITY,displayName:"Old Cellphone Keyboard",blurb:""}].map(e=>Object.freeze(e))),e.FrontendDescs,e.GET_FRONTEND_DESC_BY_ID=function(t){return e.FrontendDescs.find(e=>e.id===t)}}(n||(n={})),Object.freeze(n),Object.freeze(n.prototype)},function(e,t,s){"use strict";s.r(t),s.d(t,"PlayerSkeleton",(function(){return h})),s.d(t,"PlayerStatus",(function(){return d})),s.d(t,"Team",(function(){return u})),s.d(t,"Player",(function(){return p}));var r,i,a,n=s(7),o=s(0),c=s(1),l=s(8);class h extends c.b{constructor(e,t){if(super(),r.set(this,void 0),Math.trunc(t.playerId)!==t.playerId)throw RangeError("Player ID's must be integer values.");this.playerId=t.playerId,this.isALocalOperator=t.isALocalOperator,this.game=e,this.status=new this.game._playerStatusCtor(this,t.noCheckGameOver),this.tile=new l.a(new h.TileGetterSource(this))}_afterAllPlayersConstruction(){this.status._afterAllPlayersConstruction()}reset(e){Object(o.__classPrivateFieldSet)(this,r,e),this.hostTile._setOccupant(this.playerId,this.status.immigrantInfo)}get coord(){return this.hostTile.coord}get hostTile(){return Object(o.__classPrivateFieldGet)(this,r)}moveTo(e){if(this.hostTile.occupantId!==this.playerId){if("ONLINE"!==this.game.gameType)throw Error("Linkage between player and occupied tile disagrees.")}else this.hostTile.evictOccupant();if(e.isOccupied){if("ONLINE"!==this.game.gameType)throw Error("Only one player can occupy a tile at a time.")}else Object(o.__classPrivateFieldSet)(this,r,e),e._setOccupant(this.playerId,this.status.immigrantInfo)}}r=new WeakMap,function(e){var t,s;class r{constructor(e){t.set(this,void 0),s.set(this,void 0),Object(o.__classPrivateFieldSet)(this,t,e),Object(o.__classPrivateFieldSet)(this,s,e.game.grid.tile._source)}_getTileAt(){return Object(o.__classPrivateFieldGet)(this,s)._getTileAt(Object(o.__classPrivateFieldGet)(this,t).coord)}_getTileDestsFrom(){return Object(o.__classPrivateFieldGet)(this,s)._getTileDestsFrom(Object(o.__classPrivateFieldGet)(this,t).coord)}_getTileSourcesTo(){return Object(o.__classPrivateFieldGet)(this,s)._getTileSourcesTo(Object(o.__classPrivateFieldGet)(this,t).coord)}}t=new WeakMap,s=new WeakMap,e.TileGetterSource=r,Object.freeze(r),Object.freeze(r.prototype)}(h||(h={})),Object.freeze(h),Object.freeze(h.prototype);class u{constructor(e,t){if(i.set(this,void 0),0===t.length)throw Error("Teams must have at least one member.");this.id=e,this.members=t,Object(o.__classPrivateFieldSet)(this,i,this.members.every(e=>e.status.noCheckGameOver)?u.ElimOrder.IMMORTAL:u.ElimOrder.STANDING)}reset(){this.elimOrder!==u.ElimOrder.IMMORTAL&&(this.elimOrder=u.ElimOrder.STANDING)}get elimOrder(){return Object(o.__classPrivateFieldGet)(this,i)}set elimOrder(e){if(this.elimOrder===u.ElimOrder.IMMORTAL)throw Error("Cannot change the elimination status of an immortal team.");Object(o.__classPrivateFieldSet)(this,i,e)}}i=new WeakMap,function(e){let t;!function(e){e.IMMORTAL=-1,e.STANDING=0}(t=e.ElimOrder||(e.ElimOrder={}))}(u||(u={})),Object.freeze(u),Object.freeze(u.prototype);class d{constructor(e,t){a.set(this,void 0),this.player=e,this.noCheckGameOver=t}reset(){this.health=0}_afterAllPlayersConstruction(){}get immigrantInfo(){}get health(){return Object(o.__classPrivateFieldGet)(this,a)}set health(e){const t=this.isDowned;if(Object(o.__classPrivateFieldSet)(this,a,e),t||!this.isDowned||this.noCheckGameOver)return;const s=this.player.team,r=this.player.game.teams;if(s.elimOrder===u.ElimOrder.STANDING&&s.members.every(e=>e.status.noCheckGameOver||e.status.isDowned)){const e=1+r.filter(e=>e.elimOrder!==u.ElimOrder.STANDING).length;s.elimOrder=1+r.filter(e=>e.elimOrder!==u.ElimOrder.STANDING&&e.elimOrder!==u.ElimOrder.IMMORTAL).length,e===r.length&&this.player.game.statusBecomeOver()}}get isDowned(){return this.health<0}}a=new WeakMap,Object.freeze(d),Object.freeze(d.prototype);class p extends h{constructor(e,t){var s;super(e,t),this.familyId=t.familyId,this.teamId=t.teamId,this.username=t.username,this.avatar=null!==(s=t.avatar)&&void 0!==s?s:p.Avatar.GET_RANDOM()}reset(e){super.reset(e),this.status.reset(),this.lastAcceptedRequestId=n.PlayerActionEvent.INITIAL_REQUEST_ID,this.requestInFlight=!1}_notifyGameNowPlaying(){}_notifyGameNowPaused(){}_notifyGameNowOver(){}makeMovementRequest(e,t){if("PLAYING"!==this.game.status)throw Error("This is not a necessary precondition, but we're doing it anyway.");if(this.requestInFlight)throw Error("Only one request should ever be in flight at a time.");this.requestInFlight=!0,this.game.processMoveRequest(new n.PlayerActionEvent.Movement(this.playerId,this.lastAcceptedRequestId,e,t))}get team(){return this.game.teams[this.teamId]}isTeamedWith(e){return this.team.members.includes(e)}}!function(e){let t;!function(e){e.finalize=function(e){const t=Array.from(new Set(e.map(e=>e.teamId))).sort((e,t)=>e-t).reduce((e,t,s)=>(e[t]=s,e),[]);return e.slice().sort((e,s)=>t[e.teamId]-t[s.teamId]).map((e,s)=>Object.assign({},e,{playerId:s,teamId:t[e.teamId]}))}}(t=e.CtorArgs||(e.CtorArgs={})),Object.freeze(t)}(p||(p={})),Object.freeze(p),Object.freeze(p.prototype)},function(e,t,s){"use strict";var r;s.r(t),s.d(t,"Game",(function(){return r})),function(e){let t,s,r,i;!function(e){e.SERVER="SERVER",e.ONLINE="ONLINE",e.OFFLINE="OFFLINE"}(t=e.Type||(e.Type={})),function(e){let t;!function(e){e.NAME="game-create",e.RETURN_TO_LOBBY_INDICATOR="return-to-lobby"}(t=e.Event||(e.Event={})),e.EVENT_NAME_CLIENT_READY_RESET="client-ready-for-reset",e.EVENT_NAME_CLIENT_READY_UNPAUSE="client-ready-for-unpause",e.EVENT_NAME_SERVER_APPROVE_UNPAUSE="server-approve-unpause",e.EVENT_NAME_SERVER_APPROVE_PAUSE="server-approve-pause"}(s=e.CtorArgs||(e.CtorArgs={})),function(e){e.EVENT_NAME="game-reset"}(r=e.Serialization||(e.Serialization={})),function(e){e.PLAYING="PLAYING",e.PAUSED="PAUSED",e.OVER="OVER"}(i=e.Status||(e.Status={})),e.K=Object.freeze({HEALTH_UPDATE_CHANCE:.1,PCT_MOVES_THAT_ARE_BOOST:.05,HEALTH_EFFECT_FOR_DOWNED_PLAYER:.6,EVENT_RECORD_WRAPPING_BUFFER_LENGTH:128,EVENT_RECORD_FORWARD_WINDOW_LENGTH:64})}(r||(r={})),Object.freeze(r)},function(e,t,s){"use strict";s.r(t),s.d(t,"Grid",(function(){return i}));var r=s(8);class i{constructor(e){this.static=e.gridClass,this.dimensions=e.dimensions,this.tile=new r.a(this)}get area(){return this.static.getArea(this.dimensions)}reset(){this.forEachTile(e=>e.reset())}getRandomCoord(){return this.static.getRandomCoord(this.dimensions)}}!function(e){e.getImplementation=t=>e._Constructors[t]}(i||(i={}))},function(e,t,s){"use strict";var r;s.r(t),s.d(t,"EventRecordEntry",(function(){return r})),function(e){e.EVENT_ID_REJECT=-1}(r||(r={})),Object.freeze(r)},function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));var r=s(2);s.d(t,"b",(function(){return r.Player}));class i extends r.Player{constructor(e,t){if(super(e,t),"ONLINE"===e.gameType)throw TypeError("OnlineGames should be using regular Players instead.")}_notifyGameNowPlaying(){this.delayedMovementContinue()}_notifyGameNowPaused(){this.game.cancelTimeout(this._scheduledMovementCallbackId),this._scheduledMovementCallbackId=void 0}_notifyGameNowOver(){this.game.cancelTimeout(this._scheduledMovementCallbackId),this._scheduledMovementCallbackId=void 0}movementContinue(){const e=this.computeDesiredDest();this._nextMovementTimerMultiplier=this.game.grid.tile.at(e).langSeq.length,this.makeMovementRequest(this.game.grid.getUntToward(e,this.coord),this.getNextMoveType()),this.delayedMovementContinue()}delayedMovementContinue(){this._scheduledMovementCallbackId=this.game.setTimeout(this.movementContinue.bind(this),this.computeNextMovementTimer()*this._nextMovementTimerMultiplier)}}!function(e){e.of=(t,s)=>{const r=s.familyId;return new e._Constructors[r](t,s)}}(i||(i={}))},function(e,t,s){"use strict";s.r(t),s.d(t,"PlayerActionEvent",(function(){return r}));var r,i=s(5);!function(e){e.INITIAL_REQUEST_ID=-1,e.EVENT_NAME=Object.freeze({Bubble:"player-bubble",Movement:"player-movement"});class t{constructor(e,t){this.eventId=i.EventRecordEntry.EVENT_ID_REJECT,this.affectedNeighbours=void 0,this.playerId=e,this.playerLastAcceptedRequestId=t}}e.Bubble=t;e.Movement=class extends t{constructor(e,t,s,r){super(e,t),this.newPlayerHealth=void 0,this.tileHealthModDescs=void 0,this.destModDesc={coord:s.coord,lastKnownUpdateId:s.lastKnownUpdateId,newCharSeqPair:void 0,newFreeHealth:void 0},this.moveType=r}}}(r||(r={})),Object.freeze(r)},function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var r,i=s(0);class a{constructor(e){r.set(this,void 0),Object(i.__classPrivateFieldSet)(this,r,e),Object.freeze(this)}get _source(){return Object(i.__classPrivateFieldGet)(this,r)}at(...e){return Object(i.__classPrivateFieldGet)(this,r)._getTileAt(...e)}destsFrom(...e){return new n(Object(i.__classPrivateFieldGet)(this,r)._getTileDestsFrom(...e))}sourcesTo(...e){return new n(Object(i.__classPrivateFieldGet)(this,r)._getTileSourcesTo(...e))}}r=new WeakMap,Object.freeze(a),Object.freeze(a.prototype);class n{constructor(e){this.contents=e}get occupied(){return this.contents=this.contents.filter(e=>e.isOccupied),this}get unoccupied(){return this.contents=this.contents.filter(e=>!e.isOccupied),this}get get(){return this.contents}}Object.freeze(n),Object.freeze(n.prototype)},function(e,t,s){"use strict";s.r(t),s.d(t,"Coord",(function(){return r})),s.d(t,"Tile",(function(){return h}));var r,i,a,n,o,c=s(0),l=s(1);!function(e){let t;!function(e){e.EUCLID2="EUCLID2",e.BEEHIVE="BEEHIVE"}(t=e.System||(e.System={})),e.equals=function(e,t){return e._equals(t)}}(r||(r={})),Object.freeze(r);class h{constructor(e){i.set(this,void 0),a.set(this,void 0),n.set(this,void 0),o.set(this,void 0),this.coord=e,Object(c.__classPrivateFieldSet)(this,i,l.b.Id.NULL)}reset(){this.evictOccupant(),this.lastKnownUpdateId=0,this.freeHealth=0,this.setLangCharSeqPair(l.a.CharSeqPair.NULL)}_setOccupant(e,t){Object(c.__classPrivateFieldSet)(this,i,e)}get isOccupied(){return this.occupantId!==l.b.Id.NULL}evictOccupant(){Object(c.__classPrivateFieldSet)(this,i,l.b.Id.NULL)}get occupantId(){return Object(c.__classPrivateFieldGet)(this,i)}get freeHealth(){return Object(c.__classPrivateFieldGet)(this,a)}set freeHealth(e){Object(c.__classPrivateFieldSet)(this,a,e)}setLangCharSeqPair(e){Object(c.__classPrivateFieldSet)(this,n,e.char),Object(c.__classPrivateFieldSet)(this,o,e.seq)}get langChar(){return Object(c.__classPrivateFieldGet)(this,n)}get langSeq(){return Object(c.__classPrivateFieldGet)(this,o)}}i=new WeakMap,a=new WeakMap,n=new WeakMap,o=new WeakMap,Object.freeze(h),Object.freeze(h.prototype)},function(e,t,s){"use strict";s.d(t,"a",(function(){return o}));var r,i=s(1),a=s(0);!function(e){var t,s;class r{constructor(){this.children=[]}reset(){this.inheritingWeightedHitCount=0,this.children.forEach(e=>e.reset())}_finalize(){Object.freeze(this.children),this.children.forEach(e=>e._finalize())}_addCharMapping(e,t){if(!i.a.Seq.REGEXP.test(e))throw RangeError(`Mapping-sequence "${e}" did not match the required regular expression "${i.a.Seq.REGEXP.source}".`);if(0===t.length)throw"never";let s=this;{let t=this;for(;t;)s=t,t=t.children.find(t=>e.startsWith(t.sequence))}if(s.sequence===e)throw Error(`Mappings for all written-characters with a commoncorresponding typeable-sequence should be registered together,but an existing mapping for the sequence "${e}" was found.`);s.children.push(new o(s,e,t))}getLeafNodes(){const e=[];return this._recursiveGetLeafNodes(e),e}_recursiveGetLeafNodes(e){this.children.length?this.children.forEach(t=>{t._recursiveGetLeafNodes(e)}):e.push(this)}simpleView(){return this.children}static CREATE_TREE_MAP(e,t){const s=Object.values(e).reduce((e,t)=>e+t.weight,0),i=0===t?e=>1:1===t?e=>e:e=>Math.pow(e/s,t),a=new Map;for(const t in e){const s=e[t].seq,r=new n(t,i(e[t].weight)),o=a.get(s);o?o.push(r):a.set(s,[r])}const o=new r;return Array.from(a).sort((e,t)=>e[0].length-t[0].length).forEach(e=>{o._addCharMapping(...e)}),o._finalize(),o}}r.LEAF_CMP=(e,t)=>e.inheritingWeightedHitCount-t.inheritingWeightedHitCount,e.ParentNode=r,Object.freeze(r),Object.freeze(r.prototype);class o extends r{constructor(e,r,i){super(),t.set(this,void 0),s.set(this,void 0),this.sequence=r,Object(a.__classPrivateFieldSet)(this,s,i),Object(a.__classPrivateFieldSet)(this,t,e)}_finalize(){Object.freeze(Object(a.__classPrivateFieldGet)(this,s)),super._finalize()}reset(){super.reset(),Object(a.__classPrivateFieldGet)(this,s).forEach(e=>{e.reset(),this.incrementNumHits(e,Math.random()*i.a.CHAR_HIT_COUNT_SEED_CEILING)})}chooseOnePair(){const e=Object(a.__classPrivateFieldGet)(this,s).slice(0).sort(n.CMP).shift(),t={char:e.char,seq:this.sequence};return this.incrementNumHits(e),t}incrementNumHits(e,t=1){e._incrementNumHits(),this._recursiveIncrementNumHits(e.weightInv*t)}_recursiveIncrementNumHits(e){this.inheritingWeightedHitCount+=e,this.children.forEach(t=>t._recursiveIncrementNumHits(e))}get personalWeightedHitCount(){return this.inheritingWeightedHitCount-Object(a.__classPrivateFieldGet)(this,t).inheritingWeightedHitCount}andNonRootParents(){const e=[];for(let s=this;s instanceof o;s=Object(a.__classPrivateFieldGet)(s,t))e.push(s);return e}simpleView(){let e=Object(a.__classPrivateFieldGet)(this,s).map(e=>e.simpleView());return Object.assign(Object.create(null),{seq:this.sequence,chars:1===e.length?e[0]:e,kids:this.children.map(e=>e.simpleView())})}}t=new WeakMap,s=new WeakMap,o.PATH_CMP=(e,t)=>e.personalWeightedHitCount-t.personalWeightedHitCount,e.ChildNode=o,Object.freeze(o),Object.freeze(o.prototype)}(r||(r={})),Object.freeze(r);class n{constructor(e,t){if(t<=0)throw RangeError(`All weights must be positive, but we were passed the value "${t}" for the character "${e}".`);this.char=e,this.weightInv=1/t}reset(){this.hitCount=0,this.weightedHitCount=0}_incrementNumHits(){this.hitCount+=1,this.weightedHitCount+=this.weightInv}simpleView(){return Object.assign(Object.create(null),{char:this.char,hits:this.hitCount})}}n.CMP=(e,t)=>e.weightedHitCount-t.weightedHitCount,Object.freeze(n),Object.freeze(n.prototype);class o extends i.a{constructor(e,t,s){if(super(),this.frontendDesc=o.GET_FRONTEND_DESC_BY_ID(e),this.treeMap=r.ParentNode.CREATE_TREE_MAP(t,s),this.leafNodes=this.treeMap.getLeafNodes(),this.leafNodes.length!==this.frontendDesc.numLeaves)throw Error(`maintenance required: the frontend constant for the language "${this.frontendDesc.id}" needs to be updated to the correct, computed value, which is \`${this.leafNodes.length}\`.`)}get numLeaves(){return this.leafNodes.length}reset(){this.treeMap.reset()}getNonConflictingChar(e){this.leafNodes.sort(r.ParentNode.LEAF_CMP);let t=void 0;for(const s of this.leafNodes){const r=s.andNonRootParents();for(let t=0;te.startsWith(r[t].sequence));if(s){s===r[t].sequence?r.length=0:r.splice(t);break}}if(r.length){t=r[0];for(const e of r)e.personalWeightedHitCount{this.moveCounts[e]=0})}}e.Entry=t,Object.freeze(t),Object.freeze(t.prototype)}(h||(h={})),Object.freeze(h),Object.freeze(h.prototype);var u,d,p,m,f,E,_,g=s(5);s(7);class O{constructor(e,t,s){u.set(this,void 0),d.set(this,void 0),p.set(this,void 0),this.gameType=e;const i=this._getGridImplementation(s.coordSys);this.grid=new i({gridClass:i,tileClass:t.tileClass,coordSys:s.coordSys,dimensions:s.gridDimensions}),Object(r.__classPrivateFieldSet)(this,u,t.onGameBecomeOver),this.langFrontend=l.a.GET_FRONTEND_DESC_BY_ID(s.langId),this._playerStatusCtor=t.playerStatusCtor,this.players=this.createPlayers(s),this.operators=Object.freeze(this.players.filter(e=>e.isALocalOperator)),this.setCurrentOperator(0);{const e=[];if(this.players.forEach(t=>{e[t.teamId]||(e[t.teamId]=[]),e[t.teamId].push(t)}),this.teams=e.map((e,t)=>new o.Team(t,e)),this.teams.every(e=>e.id===o.Team.ElimOrder.IMMORTAL))throw Error("All teams are immortal. The game will never end.")}this.players.forEach(e=>e._afterAllPlayersConstruction())}reset(){return this.grid.reset(),Object(r.__classPrivateFieldSet)(this,p,"PAUSED"),Promise.resolve()}createPlayers(e){const t=e.playerDescs="ONLINE"===this.gameType?e.playerDescs:o.Player.CtorArgs.finalize(e.playerDescs);return Object.freeze(t.map(e=>e.familyId===o.Player.Family.HUMAN?e.isALocalOperator?this._createOperatorPlayer(e):new o.Player(this,e):this._createArtifPlayer(e)))}serializeResetState(){const e=[],t=this.players.map(e=>e.coord),s=[];return this.grid.forEachTile(t=>{t.lastKnownUpdateId++,e.push({char:t.langChar,seq:t.langSeq}),t.freeHealth&&s.push({coord:t.coord,health:t.freeHealth})}),{csps:e,playerCoords:t,healthCoords:s}}deserializeResetState(e){this.grid.forEachTile((t,s)=>{t.setLangCharSeqPair(e.csps[s]),t.lastKnownUpdateId++}),e.playerCoords.forEach((e,t)=>{this.players[t].reset(this.grid.tile.at(e))}),e.healthCoords.forEach(e=>{this.grid.tile.at(e.coord).freeHealth=e.health})}get currentOperator(){return Object(r.__classPrivateFieldGet)(this,d)}setCurrentOperator(e){const t=this.operators[e];t&&this.currentOperator!==t&&(t._notifyWillBecomeCurrent(),Object(r.__classPrivateFieldSet)(this,d,t))}get status(){return Object(r.__classPrivateFieldGet)(this,p)}statusBecomePlaying(){if("PLAYING"!==this.status){if("PAUSED"!==this.status)throw Error("Can only resume a game that is currently paused.");this.players.forEach(e=>{e._notifyGameNowPlaying()}),this._abstractStatusBecomePlaying(),Object(r.__classPrivateFieldSet)(this,p,"PLAYING")}else console.log("[statusBecomePlaying]: Game is already playing")}statusBecomePaused(){if("PAUSED"!==this.status){if("PLAYING"!==this.status)throw Error("Can only pause a game that is currently playing.");this.players.forEach(e=>{e._notifyGameNowPaused()}),this._abstractStatusBecomePaused(),Object(r.__classPrivateFieldSet)(this,p,"PAUSED")}else console.log("[statusBecomePaused]: Game is already paused")}statusBecomeOver(){if("PLAYING"!==this.status)throw Error("Can only end a game that is currently playing.");this.players.forEach(e=>{e._notifyGameNowOver()}),this._abstractStatusBecomeOver(),Object(r.__classPrivateFieldSet)(this,p,"OVER"),Object(r.__classPrivateFieldGet)(this,u).call(this),console.log("game is over!")}_abstractStatusBecomePlaying(){}_abstractStatusBecomePaused(){}_abstractStatusBecomeOver(){}}u=new WeakMap,d=new WeakMap,p=new WeakMap,Object.freeze(O),Object.freeze(O.prototype);class b extends O{constructor(e,t,s){super(e,t,s),m.set(this,void 0),this.eventRecordBitmap=[]}reset(){const e=super.reset();return this.eventRecordBitmap.fill(!1,0,a.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH),Object(r.__classPrivateFieldSet)(this,m,0),e}get nextUnusedEventId(){return Object(r.__classPrivateFieldGet)(this,m)}_recordEvent(e){const t=e.eventId,s=t%a.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH;if(t===g.EventRecordEntry.EVENT_ID_REJECT)throw TypeError("Do not try to record events for rejected requests.");if(t<0||t!==Math.trunc(t))throw RangeError("Event ID's must only be assigned positive, integer values.");if(this.eventRecordBitmap[s])throw Error("Event ID's must be assigned unique values.");this.eventRecordBitmap[s]=!0,this.eventRecordBitmap[(t+a.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH-a.Game.K.EVENT_RECORD_FORWARD_WINDOW_LENGTH)%a.Game.K.EVENT_RECORD_WRAPPING_BUFFER_LENGTH]=!1,Object(r.__classPrivateFieldSet)(this,m,+Object(r.__classPrivateFieldGet)(this,m)+1)}executeTileModEvent(e,t=!0){Object.freeze(e);const s=this.grid.tile.at(e.coord);if(s.lastKnownUpdateId>e.lastKnownUpdateId)return s;if(s.lastKnownUpdateId===e.lastKnownUpdateId)throw"never";return e.newCharSeqPair&&(s.setLangCharSeqPair(e.newCharSeqPair),t&&this.operators.filter(e=>e.tile.destsFrom().get.includes(s)).forEach(e=>e.seqBufferAcceptKey(""))),s.lastKnownUpdateId=e.lastKnownUpdateId,s.freeHealth=e.newFreeHealth,s}executePlayerMoveEvent(e){var t;const s=this.players[e.playerId],r=e.playerLastAcceptedRequestId-s.lastAcceptedRequestId;if(e.eventId===g.EventRecordEntry.EVENT_ID_REJECT)return void(0===r&&(s.requestInFlight=!1));this._recordEvent(e);const i=this.executeTileModEvent(e.destModDesc,s!==this.currentOperator);if(null===(t=e.tileHealthModDescs)||void 0===t||t.forEach(e=>{this.executeTileModEvent(e)}),r>1){if(s===this.currentOperator)throw"never"}else{if(s.requestInFlight=!1,!(s===this.currentOperator?1===r:r<=1))throw"never";s.status.health=e.newPlayerHealth.health,s.moveTo(i),s.lastAcceptedRequestId=e.playerLastAcceptedRequestId}}executePlayerBubbleEvent(e){this.players[e.playerId].requestInFlight=!1,e.eventId!==g.EventRecordEntry.EVENT_ID_REJECT&&this._recordEvent(e)}}m=new WeakMap,Object.freeze(b),Object.freeze(b.prototype);class v extends b{constructor(e,t,i){super(e,t,i),f.set(this,void 0),E.set(this,void 0),_.set(this,void 0),this.averageFreeHealth=i.averageFreeHealthPerTile*this.grid.area,this.averageFreeHealthPerTile=i.averageFreeHealthPerTile,Object(r.__classPrivateFieldSet)(this,E,new Set),Object(r.__classPrivateFieldSet)(this,_,s(23)(`./${this.langFrontend.module}.ts`).then(e=>{const t=this.langFrontend.export.split(".").reduce((e,t)=>e[t],e[this.langFrontend.module]);this.lang=new t(i.langWeightExaggeration);const s=this.grid.static.getAmbiguityThreshold();if(this.lang.numLeavese.playerId))}reset(){const e=Object.create(null,{reset:{get:()=>super.reset}});return Object(r.__awaiter)(this,void 0,void 0,(function*(){yield e.reset.call(this),Object(r.__classPrivateFieldSet)(this,f,0),Object(r.__classPrivateFieldGet)(this,E).clear(),yield Object(r.__classPrivateFieldGet)(this,_),this.lang.reset(),this.grid.shuffledForEachTile(e=>{e.setLangCharSeqPair(this.dryRunShuffleLangCharSeqAt(e))}),this.teams.forEach(e=>e.reset());const t=this.grid.static.getSpawnCoords(this.teams.map(e=>e.members.length),this.grid.dimensions);return this.teams.forEach((e,s)=>{e.members.forEach((e,r)=>{e.reset(this.grid.tile.at(t[s][r]))})}),this.scoreInfo.reset(),Promise.resolve()}))}_createArtifPlayer(e){return c.a.of(this,e)}dryRunShuffleLangCharSeqAt(e){e.setLangCharSeqPair(i.a.CharSeqPair.NULL);const t=Array.from(new Set(this.grid.tile.sourcesTo(e.coord).get.flatMap(e=>this.grid.tile.destsFrom(e.coord).get)));return this.lang.getNonConflictingChar(t.map(e=>e.langSeq).filter(e=>e))}get currentFreeHealth(){return Object(r.__classPrivateFieldGet)(this,f)}get freeHealthTiles(){return Object(r.__classPrivateFieldGet)(this,E)}dryRunSpawnFreeHealth(e){let t=this.averageFreeHealth-this.currentFreeHealth;if(t<=0)return;const s=[];for(;t>0;){let r;do{r=this.grid.tile.at(this.grid.getRandomCoord())}while(r.isOccupied||s.find(e=>n.Coord.equals(r.coord,e.coord)));const i=1;if(Math.random()n.Coord.equals(r.coord,e.coord)))?t.newFreeHealth=(t.newFreeHealth||0)+i:s.push({coord:r.coord,lastKnownUpdateId:1+r.lastKnownUpdateId,newCharSeqPair:void 0,newFreeHealth:r.freeHealth+i})}t-=i}return s}getHealthCostOfBoost(){return this.averageFreeHealthPerTile/a.Game.K.PCT_MOVES_THAT_ARE_BOOST}executeTileModEvent(e,t=!0){Object.freeze(e);const s=this.grid.tile.at(e.coord);if(e.lastKnownUpdateId!==1+s.lastKnownUpdateId)throw"never";return Object(r.__classPrivateFieldSet)(this,f,Object(r.__classPrivateFieldGet)(this,f)+(e.newFreeHealth-s.freeHealth)),0===e.newFreeHealth?Object(r.__classPrivateFieldGet)(this,E).delete(s):Object(r.__classPrivateFieldGet)(this,E).add(s),super.executeTileModEvent(e,t),s}managerCheckGamePlayingRequest(e){if("PLAYING"!==this.status)return;const t=this.players[e.playerId];if(!t)throw Error("No such player exists.");if(e.playerLastAcceptedRequestId!==t.lastAcceptedRequestId)throw RangeError(e.playerLastAcceptedRequestId{t.sendFile(i.resolve(s,"index.html"))}),this.app.use("/dist",n.static(i.resolve(s,"dist"))),this.app.use("/assets",n.static(i.resolve(s,"assets"))),this.http.listen({port:e,host:t},()=>{const t=this.http.address();console.log(`\n\nServer mounted to: \`${t.address}${t.port}\` using ${t.family}.\n`),console.log("This host can be reached at any of the following addresses:\n"),h.chooseIPAddress().sort().forEach(t=>{console.log(`${t}:${e}`)}),console.log("")}),this.io.of(h.Nsps.GROUP_JOINER).on("connection",this.onJoinerNspsConnection.bind(this))}onJoinerNspsConnection(e){console.log("socket connect: "+e.id),e.emit(c.Group.Exist.EVENT_NAME,(()=>{const e={};return Array.from(this.allGroups).forEach(([t,s])=>{e[t]=s.isCurrentlyPlayingAGame?c.Group.Exist.Status.IN_GAME:c.Group.Exist.Status.IN_LOBBY}),e})()),e.on(c.Group.Exist.EVENT_NAME,t=>{(!t.groupName||this.allGroups.has(t.groupName)||t.groupName.length>c.Group.Name.MaxLength||!t.groupName.match(c.Group.Name.REGEXP)||t.passphrase.length>c.Group.Passphrase.MaxLength||!t.passphrase.match(c.Group.Passphrase.REGEXP))&&e.emit(c.Group.Exist.EVENT_NAME,c.Group.Exist.RequestCreate.Response.NOPE),this.allGroups.set(t.groupName,new c.Group(Object.freeze({namespace:this.io.of(h.Nsps.GROUP_LOBBY_PREFIX+t.groupName),name:t.groupName,passphrase:t.passphrase,deleteExternalRefs:()=>this.allGroups.delete(t.groupName),initialTtl:c.Group.DEFAULT_TTL}))),e.emit(c.Group.Exist.EVENT_NAME,c.Group.Exist.RequestCreate.Response.OKAY),e.nsp.emit(c.Group.Exist.EVENT_NAME,{[t.groupName]:c.Group.Exist.Status.IN_LOBBY})})}}t.SnakeyServer=h,function(e){e.chooseIPAddress=()=>Object.values(r.networkInterfaces()).flat().filter(e=>!e.internal).map(e=>"IPv6"===e.family?`[${e.address}]`:e.address)}(h=t.SnakeyServer||(t.SnakeyServer={})),Object.freeze(h),Object.freeze(h.prototype)},function(e,t){e.exports=require("os")},function(e,t){e.exports=require("path")},function(e,t){e.exports=require("http")},function(e,t){e.exports=require("express")},function(e,t){e.exports=require("socket.io")},function(e,t,s){"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.Group=t.ServerGame=void 0;const i=s(0),a=s(3),n=s(21);Object.defineProperty(t,"ServerGame",{enumerable:!0,get:function(){return n.ServerGame}});const o=s(11),c=s(12);class l extends o.Group{constructor(e){super(),r.set(this,void 0),this.namespace=e.namespace,this.passphrase=e.passphrase,i.__classPrivateFieldSet(this,r,void 0),this._deleteExternalRefs=e.deleteExternalRefs,this._initialTtlTimeout=setTimeout(()=>{0===Object.keys(this.namespace.sockets).length&&this.terminate()},1e3*e.initialTtl).unref(),this.namespace.use((e,t)=>{e.handshake.query.passphrase!==this.passphrase&&t(new Error("Incorrect passphrase"));const s=e.handshake.query;return void 0!==s&&0===s.teamId||t(new Error(`a socket attempted to connect to group \`${this.name}\` without providing userInfo.`)),t()}).on("connection",this.onConnection.bind(this))}onConnection(e){console.log("socket connect: "+e.id),i.__classPrivateFieldGet(this,r)&&e.disconnect(),e.userInfo=e.handshake.query.userInfo;{const t=l.Socket.UserInfoChange.EVENT_NAME;e.emit(t,{[e.id]:e.userInfo}),e.emit(t,Object.entries(this.sockets).reduce((e,[t,s])=>(e[t]=s.userInfo,e),{}))}1===Object.keys(e.nsp.connected).length&&(clearTimeout(this._initialTtlTimeout),this._initialTtlTimeout=void 0,this._sessionHost=e,this.namespace.server.of(o.SkServer.Nsps.GROUP_JOINER).emit(l.Exist.EVENT_NAME,{[this.name]:l.Exist.Status.IN_LOBBY}),e.on(a.Game.CtorArgs.Event.NAME,this._socketOnHostCreateGame.bind(this))),e.on(l.Socket.UserInfoChange.EVENT_NAME,t=>{if("string"!=typeof t.username||"number"!=typeof t.teamId||"string"!=typeof t.avatar)return void console.log(`bad format: username: \`${t.username}\`, teamId: \`${t.teamId}\`, avatar: \`${t.avatar}\`.`);e.userInfo=t;const s={[e.id]:t};e.nsp.emit(l.Socket.UserInfoChange.EVENT_NAME,s)}),e.on("disconnect",(...t)=>{if(e===this._sessionHost)return void this.terminate();if(1===Object.keys(e.nsp.sockets).length)return void this.terminate();const s={[e.id]:void 0};e.nsp.emit(l.Socket.UserInfoChange.EVENT_NAME,s)})}_socketOnHostCreateGame(e){if(this.namespace.server.of(o.SkServer.Nsps.GROUP_JOINER).emit(l.Exist.EVENT_NAME,{[this.name]:e!==a.Game.CtorArgs.Event.RETURN_TO_LOBBY_INDICATOR?l.Exist.Status.IN_GAME:l.Exist.Status.IN_LOBBY}),e!==a.Game.CtorArgs.Event.RETURN_TO_LOBBY_INDICATOR){this._createGameInstance(e).length}else i.__classPrivateFieldGet(this,r).onReturnToLobby()}get isCurrentlyPlayingAGame(){return void 0!==i.__classPrivateFieldGet(this,r)}terminate(){i.__classPrivateFieldSet(this,r,void 0);const e=this.namespace;e.removeAllListeners("connect"),e.removeAllListeners("connection"),Object.values(e.connected).forEach(e=>{e.disconnect()}),e.removeAllListeners(),delete e.server.nsps[e.name],this.namespace=void 0,this._deleteExternalRefs(),e.server.of(o.SkServer.Nsps.GROUP_JOINER).emit(l.Exist.EVENT_NAME,{[this.name]:l.Exist.Status.DELETE}),console.log(`terminated group: \`${this.name}\``)}_createGameInstance(e){const t=c.GamepartManager.CHECK_VALID_CTOR_ARGS(e);return t.length?(console.log(t),t):(console.log(`group ${this.name} new game`),e.playerDescs=[...e.playerDescs,...Object.values(this.sockets).map(e=>Object.freeze({isALocalOperator:!1,familyId:"HUMAN",teamId:e.userInfo.teamId,socketId:e.id,username:e.userInfo.username,avatar:e.userInfo.avatar,noCheckGameOver:!1,familyArgs:{}}))],i.__classPrivateFieldSet(this,r,new n.ServerGame(this.namespace,e)),[])}get sockets(){return this.namespace.sockets}}t.Group=l,r=new WeakMap,Object.freeze(l),Object.freeze(l.prototype)},function(e,t,s){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ServerGame=void 0;const r=s(0),i=s(22),a=s(3),n=s(9),o=s(4),c=s(2),l=s(5),h=s(7),u=s(12);s(24).GameBootstrap.INIT_CLASS_REGISTRIES();class d extends u.GamepartManager{constructor(e,t){super(a.Game.Type.SERVER,{onGameBecomeOver:()=>{},tileClass:n.Tile,playerStatusCtor:c.PlayerStatus},t),this.namespace=e,this.playerSockets=t.playerDescs.filter(e=>e.familyId===c.Player.Family.HUMAN).map(e=>{if(!e.socketId)throw Error("missing socket ID for player "+e.playerId);return this.namespace.sockets[e.socketId]}),Promise.all(Object.values(this.namespace.sockets).map(e=>new Promise((t,s)=>{e.once(a.Game.CtorArgs.EVENT_NAME_CLIENT_READY_RESET,()=>{t()})}))).then(()=>{this.reset()}),Object.values(this.namespace.sockets).forEach(e=>{e.on(h.PlayerActionEvent.EVENT_NAME.Movement,this.processMoveRequest.bind(this)),e.on(h.PlayerActionEvent.EVENT_NAME.Bubble,this.processBubbleRequest.bind(this)),t.playerDescs.forEach(t=>{t.isALocalOperator=t.socketId===e.id}),e.emit(a.Game.CtorArgs.Event.NAME,t)})}_getGridImplementation(e){return o.Grid.getImplementation(e)}reset(){const e=Object.create(null,{reset:{get:()=>super.reset}});return r.__awaiter(this,void 0,void 0,(function*(){console.log("starting reset"),Promise.all(Object.values(this.namespace.sockets).map(e=>new Promise((t,s)=>{e.once(a.Game.CtorArgs.EVENT_NAME_CLIENT_READY_UNPAUSE,()=>{t()})}))).then(()=>{this.statusBecomePlaying(),this.namespace.emit(a.Game.CtorArgs.EVENT_NAME_SERVER_APPROVE_UNPAUSE)});const t=e.reset.call(this);return yield t,this.namespace.emit(a.Game.Serialization.EVENT_NAME,this.serializeResetState()),t}))}onReturnToLobby(){Object.values(this.namespace.sockets).forEach(e=>{e.removeAllListeners(h.PlayerActionEvent.EVENT_NAME.Movement),e.removeAllListeners(h.PlayerActionEvent.EVENT_NAME.Bubble)})}_createOperatorPlayer(e){throw TypeError("This should never be called for a ServerGame.")}setTimeout(e,t,...s){return i.setTimeout(e,t,s).unref()}cancelTimeout(e){clearTimeout(e)}executePlayerMoveEvent(e){super.executePlayerMoveEvent(e),e.eventId===l.EventRecordEntry.EVENT_ID_REJECT?this.playerSockets[e.playerId].emit(h.PlayerActionEvent.EVENT_NAME.Movement,e):this.namespace.emit(h.PlayerActionEvent.EVENT_NAME.Movement,e)}executePlayerBubbleEvent(e){super.executePlayerBubbleEvent(e),e.eventId===l.EventRecordEntry.EVENT_ID_REJECT?this.playerSockets[e.playerId].emit(h.PlayerActionEvent.EVENT_NAME.Bubble,e):this.namespace.emit(h.PlayerActionEvent.EVENT_NAME.Bubble,e)}}t.ServerGame=d,Object.freeze(d),Object.freeze(d.prototype)},function(e,t){e.exports=require("timers")},function(e,t,s){var r={"./Cellphone.ts":[25,1],"./Emote.ts":[26,2],"./English.ts":[27,3],"./Japanese.ts":[28,4],"./Korean.ts":[29,5],"./Morse.ts":[30,6]};function i(e){if(!s.o(r,e))return Promise.resolve().then((function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}));var t=r[e],i=t[0];return s.e(t[1]).then((function(){return s(i)}))}i.keys=function(){return Object.keys(r)},i.id=23,e.exports=i},function(e,t,s){"use strict";s.r(t),s.d(t,"GameBootstrap",(function(){return u}));var r,i,a,n,o=s(4),c=s(1);!function(e){let t,s,r,i,a,n;e.GLOBAL_IDS={PUBLIC_GAME_HOST_URLS:"public-game-hosts-list",CURRENT_HOST_GROUPS:"current-host-groups-list"},function(e){e.Class={TEXT_SELECT_DISABLED:"text-select-disabled",FILL_PARENT:"fill-parent",CENTER_CONTENTS:"center-contents",STACK_CONTENTS:"stack-contents",INPUT_GROUP:"sk-input-group",INPUT_GROUP_ITEM:"sk-input-group-item"},e.Dataset={COLOUR_SCHEME:"skColourScheme"}}(t=e.General||(e.General={})),function(e){e.Class={BASE:"tile",POINTER_HB:"tile__pointer-hitbox",LANG_CHAR_WRAP:"tile__char",LANG_SEQ:"tile__seq"},e.Dataset={HEALTH:"health"}}(s=e.Tile||(e.Tile={})),function(e){e.Class={GRID:"game-grid",SCROLL_OUTER:"game-grid-scroll-outer",SCROLL_INNER:"game-grid-scroll-inner",IMPL_BODY:"game-grid-impl-body",KBD_DC:"game-grid-kbd-dc",KBD_DC_ICON:"game-grid-kbd-dc__icon",PAUSE_OL:"game-grid-pause-overlay",PAUSE_OL_ICON:"game-grid-pause-overlay__icon",PLAYER_IOB_ROOT:"grid-player-intersection-root"},e.Dataset={IMPL_COORD_SYS:"coordSys",GAME_STATE:{KEY:"gameState",VALUES:{PLAYING:"playing",PAUSED:"paused",OVER:"over"}}}}(r=e.Grid||(e.Grid={})),function(e){e.Class={BASE:"player",FACE:"player__face",DOWNED_OVERLAY:"player__downed-overlay",SHORT_SPOTLIGHT:"player__spotlight-short",LONG_SPOTLIGHT:"player__spotlight-long"},e.Dataset={DOWNED:{KEY:"downed",VALUES:{TEAM:"team",SELF:"self",NO:"no"}},FACE_SWATCH:"face"}}(i=e.Player||(e.Player={})),function(e){let t;e.Id={ALL_SCREENS:"all-screens-container",SCREEN_TINT:"screen-tint"},e.Class={BASE:"sk-screen",NAV_NEXT:"screen--next-button",NAV_PREV:"screen--back-button"},e.Dataset={CURRENT:"current"},function(e){let t,s,r,i,a,n;!function(e){e.Class={BASE:"screen-home",NAV:"screen-home--nav",NAV_PLAY_OFFLINE:"screen-home--nav--play-offline",NAV_PLAY_ONLINE:"screen-home--nav--play-online",NAV_HOW_TO_PLAY:"screen-home--nav--how-to-play",NAV_HOW_TO_HOST:"screen-home--nav--how-to-host",NAV_COLOURS:"screen-home--nav--colour-scheme",NAV_VIEW_REPO:"screen-home--nav--goto-repo",NAV_RPT_ISSUE:"screen-home--nav--report-issue"}}(t=e.Home||(e.Home={})),function(e){e.Class={BASE:"screen-colour",OPTION:"screen-colour--opt",OPTION_LABEL:"screen-colour--opt-label",OPTION_PREVIEW:"screen-colour--opt-preview"}}(s=e.ColourCtrl||(e.ColourCtrl={})),function(e){e.Class={BASE:"screen-play",GRID_WRAPPER:"screen-play--grid-wrapper",CONTROLS_BAR:"screen-play--controls-bar",PLAYERS_BAR:"screen-play--players-bar"}}(r=e.Play||(e.Play={})),function(e){e.Class={BASE:"screen-setup",LANG_SEL:"screen-setup--lang-sel",LANG_WEIGHT_EXAGG:"screen-setup--lang-weight-exagg"},e.Id={LANG_WEIGHT_EXAGGERATION_LIST:"screen-setup--lang-weight-exaggeration-list"}}(i=e.Setup||(e.Setup={})),function(e){e.Class={BASE:"screen-joiner",CONTENT_WRAPPER:"screen-joiner--content-wrapper",HOST_URL:"screen-joiner--host-url",GROUP_NAME:"screen-joiner--group-name",PASSPHRASE:"screen-joiner--passphrase"}}(a=e.GroupJoiner||(e.GroupJoiner={})),function(e){e.Class={BASE:"screen-lobby",SEC_CLIENT_INFO:"screen-lobby--client-info-section",SEC_TEAMS:"screen-lobby--teams-section",TEAM:"screen-lobby--team",PLAYER:"screen-lobby--player",PLAYER_NAME:"screen-lobby--player__name"}}(n=e.GroupLobby||(e.GroupLobby={}))}(t=e.Impl||(e.Impl={}))}(a=e.Screen||(e.Screen={})),function(e){e.Class={BASE:"sk-pick-one",OPT_BASE:"sk-pick-one--opt"}}(n=e.SkPickOne||(e.SkPickOne={}))}(r||(r={})),Object.freeze(r.Player.Dataset.DOWNED),Object(c.d)(r),function(e){e.getImplementation=t=>e._Constructors[t]}(i||(i={}));class l{_superVisibleGrid(e,t){const s=r.Grid;t.setAttribute("role","presentation"),t.classList.add(s.Class.IMPL_BODY),t.dataset[s.Dataset.IMPL_COORD_SYS]=e.coordSys,this.baseElem=t;const i=document.createElement("div");i.classList.add(r.Player.Class.SHORT_SPOTLIGHT);const a=document.createElement("div");a.classList.add(r.Player.Class.LONG_SPOTLIGHT),this.spotlightElems=Object.freeze([i,a])}}Object.freeze(l),Object.freeze(l.prototype),function(e){class t{constructor(e){this.x=e.x,this.y=e.y,Object.freeze(this)}_equals(e){return this.x===e.x&&this.y===e.y}round(){return new t({x:Math.round(this.x),y:Math.round(this.y)})}oneNorm(e){return this.sub(e).originOneNorm()}originOneNorm(){return Math.abs(this.x)+Math.abs(this.y)}infNorm(e){return this.sub(e).originInfNorm()}originInfNorm(){return Math.max(Math.abs(this.x),Math.abs(this.y))}axialAlignment(e){return this.sub(e).originAxialAlignment()}originAxialAlignment(){return Math.abs(Math.abs(this.x)-Math.abs(this.y))/(Math.abs(this.x)+Math.abs(this.y))}add(e){return new t({x:this.x+e.x,y:this.y+e.y})}sub(e){return new t({x:this.x-e.x,y:this.y-e.y})}mul(e){return new t({x:e*this.x,y:e*this.y})}}e.Coord=t,Object.freeze(t),Object.freeze(t.prototype);class s extends o.Grid{constructor(e){super(e);const s=[];for(let r=0;rMath.random()-.5).forEach(t=>e(t))}getUntToward(e,t){const s=this.tile.destsFrom(t).unoccupied.get;if(0===s.length)return this.tile.at(t);if(1===s.length)return s[0];s.sort((t,s)=>t.coord.oneNorm(e)-s.coord.oneNorm(e)).sort((t,s)=>t.coord.infNorm(e)-s.coord.infNorm(e));for(let t=1;ts[0].coord.infNorm(e)){s.splice(t);break}if(1===s.length)return s[0];if(s[0].coord.x-t.x==0||s[0].coord.y-t.y==0){if(t.axialAlignment(t.sub(e))-.5>0)return s[0];s.shift()}return s[Math.floor(s.length*Math.random())]}getUntAwayFrom(e,t){return this.getUntToward(t.add(t.sub(e)),t)}getRandomCoordAround(e,s){return new t({x:e.x+Math.trunc(2*s*(Math.random()-.5)),y:e.y+Math.trunc(2*s*(Math.random()-.5))})}_getTileAt(e){return this.grid[e.y][e.x]}_getTileDestsFrom(e,t=1){let s=e.y-t,r=e.y+t+1,i=e.x-t,a=e.x+t+1;return s>=this.dimensions.height||r<0||i>=this.dimensions.width||a<0?[]:this.grid.slice(Math.max(0,s),Math.min(this.dimensions.height,r)).flatMap(e=>e.slice(Math.max(0,i),Math.min(this.dimensions.width,a)))}_getTileSourcesTo(e,t=1){return this._getTileDestsFrom(e,t)}minMovesFromTo(e,t){return Math.min(Math.abs(t.x-e.x),Math.abs(t.y-e.y))}static getSpawnCoords(e,t){const r=[];return e.map(e=>{const i=[];for(;e>0;){let a;do{a=s.getRandomCoord(t)}while(r.find(e=>a._equals(e)));i.push(a),r.push(a),e--}return i})}static getArea(e){return e.height*e.width}static getRandomCoord(e){const s=Math.floor(e.width*Math.random()),r=Math.floor(e.height*Math.random());return new t({x:s,y:r})}}s.SIZE_LIMITS=Object.freeze({height:Object.freeze({min:11,max:51}),width:Object.freeze({min:11,max:51})}),e.Grid=s,function(e){class t extends e{constructor(e){super(e);const t=document.createElement("div");t.style.setProperty("--euclid2-grid-width",this.dimensions.width.toString());for(const e of this.grid)for(const s of e)s._addToDom(t);this._superVisibleGrid(e,t)}}e.Visible=t,Object(c.c)(t,[l]),Object.freeze(t),Object.freeze(t.prototype)}(s=e.Grid||(e.Grid={})),Object.freeze(s),Object.freeze(s.prototype)}(a||(a={})),Object.freeze(a),function(e){class t{constructor(e){this.dash=e.dash,this.bash=e.bash,Object.freeze(this)}_equals(e){return this.dash===e.dash&&this.bash===e.bash}round(){const e=Math.floor(this.dash),s=Math.floor(this.bash),r=e-this.dash,i=s-this.bash;return r>2*i?new t({dash:e+1,bash:s}):r<.5*i?new t({dash:e,bash:s+1}):Math.min(r,i)>.5?new t({dash:e+1,bash:s+1}):new t({dash:e,bash:s})}add(e){return new t({dash:this.dash+e.dash,bash:this.bash+e.bash})}sub(e){return new t({dash:this.dash-e.dash,bash:this.bash-e.bash})}mul(e){return new t({dash:e*this.dash,bash:e*this.bash})}}e.Coord=t,Object.freeze(t),Object.freeze(t.prototype);class s extends o.Grid{constructor(e){super(e);this.grid=Object.freeze(void 0)}static getAmbiguityThreshold(){return 18}static getSizeLimits(){return this.SIZE_LIMITS}forEachTile(e){let t=0;for(const s of this.grid)for(const r of s)e(r,t++)}shuffledForEachTile(e){this.grid.flat().sort((e,t)=>Math.random()-.5).forEach(t=>e(t))}getUntToward(e,t){}getUntAwayFrom(e,t){return this.getUntToward(t.add(t.sub(e)),t)}getRandomCoordAround(e,t){}_getTileAt(e){}_getTileDestsFrom(e){}_getTileSourcesTo(e){}minMovesFromTo(e,t){}static getSpawnCoords(e,t){}static getArea(e){const t=Math.min(e.fslash,e.bslash),s=Math.max(e.fslash,e.bslash),r=-1+e.dash+t;let i=2*t*(e.dash+r);return i+=(s-t-1)*r,i}static getRandomCoord(e){return new t(void 0)}}s.SIZE_LIMITS=Object.freeze({dash:Object.freeze({min:10,max:50}),bslash:Object.freeze({min:10,max:50}),fslash:Object.freeze({min:10,max:50})}),e.Grid=s,function(e){class t extends e{constructor(e){super(e);this._superVisibleGrid(e,void 0)}}e.Visible=t,Object(c.c)(t,[l]),Object.freeze(t),Object.freeze(t.prototype)}(s=e.Grid||(e.Grid={})),Object.freeze(s),Object.freeze(s.prototype)}(n||(n={})),Object.freeze(n);var h,u,d=s(6),p=s(0);class m extends d.a{constructor(e,t){super(e,t),h.set(this,void 0),this.behaviour=Object.freeze(Object.assign(Object.create(null),m.Behaviour.DEFAULT,t.familyArgs)),this.grid=this.game.grid}_afterAllPlayersConstruction(){super._afterAllPlayersConstruction(),this.threatProximity=this.game.teams.filter(e=>e.id!==this.teamId).flatMap(e=>e.members),this.targetProximity=this.threatProximity.slice()}reset(e){super.reset(e),Object(p.__classPrivateFieldSet)(this,h,this.coord)}moveTo(e){Object(p.__classPrivateFieldSet)(this,h,this.coord),super.moveTo(e)}computeDesiredDest(){this.threatProximity.sort((e,t)=>this.grid.minMovesFromTo(e.coord,this.coord)-this.grid.minMovesFromTo(t.coord,this.coord));for(const e of this.threatProximity){if(this.grid.minMovesFromTo(e.coord,this.coord)>this.behaviour.fearDistance)break;if(!e.status.isDowned&&e.status.health>this.status.health)return this.grid.getUntAwayFrom(e.coord,this.coord).coord}if(this.targetProximity.sort((e,t)=>this.grid.minMovesFromTo(this.coord,e.coord)-this.grid.minMovesFromTo(this.coord,t.coord)),this.status.isDowned)for(const e of this.targetProximity){if(this.grid.minMovesFromTo(this.coord,e.coord)>this.behaviour.bloodThirstDistance)break;if(e.status.health => { return [{ // so that magic comments in dynamic imports can be // seen by webpack. removeComments: false, - importHelpers: false, // :'( - // TODO.build get rid of the above line when - // https://github.com/microsoft/TypeScript/issues/36841 - // is fixed. What an absolute tragedy T^T //noEmit: true, }, // https://github.com/TypeStrong/ts-loader#faster-builds @@ -253,6 +249,12 @@ const __applyCommonNodeConfigSettings = (config: ReturnType __dirname: false, global: false, }; + // https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_javascript-source-map-tips + // https://webpack.js.org/configuration/output/#outputdevtoolmodulefilenametemplate + config.output.devtoolModuleFilenameTemplate = "../[resource-path]?[loaders]"; + config.devtool = (PACK_MODE === "production") + ? "cheap-module-source-map" + : "cheap-module-eval-source-map"; }; /** diff --git a/src/base/defs/OmHooks.ts b/src/base/defs/OmHooks.ts index 6c3fedb7..206bf3a9 100644 --- a/src/base/defs/OmHooks.ts +++ b/src/base/defs/OmHooks.ts @@ -100,6 +100,8 @@ export namespace Screen { }; export const Class = { BASE: "sk-screen", + NAV_NEXT: "screen--next-button", + NAV_PREV: "screen--back-button", }; export const Dataset = { CURRENT: "current", @@ -118,6 +120,14 @@ export namespace Screen { NAV_RPT_ISSUE: "screen-home--nav--report-issue", }; } + export namespace ColourCtrl { + export const Class = { + BASE: "screen-colour", + OPTION: "screen-colour--opt", + OPTION_LABEL: "screen-colour--opt-label", + OPTION_PREVIEW: "screen-colour--opt-preview", + }; + } export namespace Play { export const Class = { BASE: "screen-play", @@ -129,7 +139,11 @@ export namespace Screen { export namespace Setup { export const Class = { BASE: "screen-setup", - NEXT_BUTTON: "screen-setup--next-button", + LANG_SEL: "screen-setup--lang-sel", + LANG_WEIGHT_EXAGG: "screen-setup--lang-weight-exagg", + }; + export const Id = { + LANG_WEIGHT_EXAGGERATION_LIST: "screen-setup--lang-weight-exaggeration-list", }; } export namespace GroupJoiner { @@ -139,15 +153,16 @@ export namespace Screen { HOST_URL: "screen-joiner--host-url", GROUP_NAME: "screen-joiner--group-name", PASSPHRASE: "screen-joiner--passphrase", - NEXT_BUTTON: "screen-joiner--next-button", }; } - export namespace ColourCtrl { + export namespace GroupLobby { export const Class = { - BASE: "screen-colour", - OPTION: "screen-colour--opt", - OPTION_LABEL: "screen-colour--opt-label", - OPTION_PREVIEW: "screen-colour--opt-preview", + BASE: "screen-lobby", + SEC_CLIENT_INFO: "screen-lobby--client-info-section", + SEC_TEAMS: "screen-lobby--teams-section", + TEAM: "screen-lobby--team", + PLAYER: "screen-lobby--player", + PLAYER_NAME: "screen-lobby--player__name", }; } } diff --git a/src/base/defs/OnlineDefs.ts b/src/base/defs/OnlineDefs.ts index 8bbb38df..478750ad 100644 --- a/src/base/defs/OnlineDefs.ts +++ b/src/base/defs/OnlineDefs.ts @@ -1,8 +1,9 @@ +import { Player } from 'defs/TypeDefs'; /** * */ -export class SkServer { } +export abstract class SkServer { } export namespace SkServer { export const PROTOCOL = "http://"; export const DEFAULT_PORT = 8080; @@ -22,20 +23,32 @@ Object.freeze(SkServer.prototype); /** * */ -export class Group { } +export abstract class Group { } export namespace Group { /** * An extension of {@link io.Socket}. It is very convenient to tack * these fields directly onto the socket objects. */ + export type Socket = import("socket.io").Socket & { + userInfo: Player.UserInfo; + }; export namespace Socket { - type Base = { - username?: string; - teamId?: number; // These input values can be messy and non-continuous. They will be cleaned later. - updateId: number; // initial value = 0 - }; - export type ServerSide = Base & import("socket.io").Socket; + + export namespace UserInfoChange { + /** + * Client emits this with a descriptor of requested username and teamId. + * Server broadcasts a response + */ + export const EVENT_NAME = "group-lobby-user-info-change"; + + /** + */ + export type Req = Player.UserInfo; + /** + */ + export type Res = Record; + } } export type Name = string; @@ -50,7 +63,7 @@ export namespace Group { } export const JoinerReconnectionAttempts = 2; - export const DEFAULT_TTL = 60; + export const DEFAULT_TTL = 20; // seconds export namespace Exist { export const EVENT_NAME = "group-exist"; @@ -88,4 +101,4 @@ export namespace Group { } } Object.freeze(Group); -Object.freeze(Group.prototype); +Object.freeze(Group.prototype); \ No newline at end of file diff --git a/src/base/defs/StorageHooks.ts b/src/base/defs/StorageHooks.ts index 3160d5fe..f35df08c 100644 --- a/src/base/defs/StorageHooks.ts +++ b/src/base/defs/StorageHooks.ts @@ -1,6 +1,4 @@ -/** - * - */ +import { Player } from "defs/TypeDefs"; /** * https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API @@ -33,6 +31,14 @@ export namespace StorageHooks { AVATAR: "avatarId", }); + export function getLastUserInfo(): Player.UserInfo { + return Object.freeze({ + username: localStorage.getItem(LocalKeys.USERNAME) ?? "unnamed player", + teamId: 0, + avatar: localStorage.getItem(LocalKeys.AVATAR) ?? Player.Avatar.GET_RANDOM() + }) + } + /** * Keys for this origin's session storage records. */ diff --git a/src/base/defs/TypeDefs.ts b/src/base/defs/TypeDefs.ts index 88cae18d..4f7ac38d 100644 --- a/src/base/defs/TypeDefs.ts +++ b/src/base/defs/TypeDefs.ts @@ -1,10 +1,4 @@ -export namespace SkErrors { - // TODO.impl use these? - export const NEVER = "Never happens. See comment in source."; -} - - export const SCROLL_INTO_CENTER = Object.freeze({ behavior: "smooth", block: "center", @@ -47,7 +41,7 @@ export function deepFreeze(obj: any): void { /** * */ -export class Player { } +export abstract class Player { } export namespace Player { /** @@ -75,6 +69,41 @@ export namespace Player { export type Nullable = Player.Id | typeof Player.Id.NULL; } + export type Username = string; + export namespace Username { + // /** + // * The choice of this is somewhat arbitrary. This should be enforced + // * externally since player descriptors are passed to the constructor. + // * + // * Requirements: + // * - Starts with a letter. + // * - No whitespace except for non-consecutive space characters. + // * - Must contain at least five non-space characters that are + // * either letters, numbers, or the dash character. + // */ + //export const REGEXP = /[a-zA-Z](?:[ ]?[a-zA-Z0-9:-]+?){4,}/; + export const REGEXP = /[ a-zA-Z0-9:-]+/; + export const MAX_LENGTH = 15; // rather arbitrary choice. + } + + export enum Avatar { + LOREM_IPSUM = "lorem-ipsum", + } + export namespace Avatar { + const _values = Object.values(Avatar).filter((e) => typeof e === "string") as Avatar[]; + /** + */ + export function GET_RANDOM(): Avatar { + return _values[Math.random() * _values.length]; + } + } + + export interface UserInfo { + readonly username: Username; + readonly teamId: number; + readonly avatar: Avatar; + } + /** * See the main documentation in game/player/Player. */ @@ -94,7 +123,7 @@ Object.freeze(Player.prototype); /** * */ -export class Lang {} +export abstract class Lang {} export namespace Lang { /** * See the main documentation in game/lang/Lang @@ -134,6 +163,17 @@ export namespace Lang { seq: "", }); } + /** + * See the main documentation in game/lang/Lang + */ + export type WeightExaggeration = number; + export namespace WeightExaggeration { + /** + * The choice of this value is somewhat of an art. + * It must be greater than one. + */ + export const MAX = 4; + } /** * The choice of the upper bound on the number of times * is rather arbitrary, but it should not be too small. @@ -236,7 +276,7 @@ export namespace Lang { FrontendDescs as TU.RoArr; export type FrontendDesc = Readonly<{ - id: string; + id: typeof FrontendDescs[number]["id"]; /** * Pretty much a file name. */ @@ -252,15 +292,11 @@ export namespace Lang { }>; /** - * - * @param langId - + * @returns `undefined` if no such language descriptor is found. */ - export function GET_FRONTEND_DESC_BY_ID(langId: FrontendDesc["id"]): FrontendDesc { - const desc = FrontendDescs.find((desc) => desc.id === langId); - if (!desc) throw new Error(`Frontend descriptor of language with id` - + ` \"${langId}\" not found.`); - return desc!; + export function GET_FRONTEND_DESC_BY_ID(langId: FrontendDesc["id"]): FrontendDesc | undefined { + return FrontendDescs.find((desc) => desc.id === langId); } } Object.freeze(Lang); -Object.freeze(Lang.prototype); +Object.freeze(Lang.prototype); \ No newline at end of file diff --git a/src/base/floor/Coord.ts b/src/base/floor/Coord.ts index 3e420d13..b38587ea 100644 --- a/src/base/floor/Coord.ts +++ b/src/base/floor/Coord.ts @@ -7,11 +7,10 @@ import type { Beehive } from "./impl/Beehive"; * implementation's non-standard methods safely on coordinates retrieved * from Grid tiles. */ -export type Coord = (Coord.Bare) & - ( S extends Coord.System.EUCLID2 ? Euclid2.Coord - : S extends Coord.System.BEEHIVE ? Beehive.Coord - : never - ); +export interface Coord { + [Coord.System.EUCLID2]: Euclid2.Coord; + [Coord.System.BEEHIVE]: Beehive.Coord; +} /** * @@ -23,11 +22,10 @@ export namespace Coord { BEEHIVE = "BEEHIVE", } - export type Bare = - ( S extends System.EUCLID2 ? Euclid2.Coord.Bare - : S extends System.BEEHIVE ? Beehive.Coord.Bare - : never - ); + export interface Bare { + [System.EUCLID2]: Euclid2.Coord.Bare /* & Coord[System.EUCLID2] */; + [System.BEEHIVE]: Beehive.Coord.Bare /* & Coord[System.BEEHIVE] */; + } // ============================================================== // Note: The below exports do not require any modifications with @@ -39,19 +37,30 @@ export namespace Coord { * * @template S - An enum identifying the unique implementation class. */ - export abstract class Abstract { - + export interface Abstract { /** * This does nothing. Subclass constructors should copy in the * fields specified by `desc` and end with a self-freezing call. * * @param desc - Untouched. Here as a reminder of what is needed. */ - protected constructor(desc: Coord.Bare) { - desc; // Prevents warning about unused parameter. - } + // new(desc: Coord.Bare[S]): Abstract; - public abstract equals(other: Coord.Bare): boolean; + /** + * Must be reflexive and transitive. Must be symmetric if `other` + * is already (ir if not, if made into) and instance of Coord[S]. + * + * For outside usage, it is recommended to use the static helper, + * which hides away some type-casting necessary for outside usage. + */ + _equals(other: Bare[Coord.System]): boolean; + } + /** + * Helper function to abstract away some TypeScript casting due to + * the complexity of inheritance and mapped types. + */ + export function equals(a: Coord[S], b: Coord.Bare[S]): boolean { + return a._equals(b as any); } export namespace Abstract { @@ -60,21 +69,21 @@ export namespace Coord { * basis of graph connections that cannot be represented by * lattices. */ - export abstract class Mathy extends Coord.Abstract { + export interface Mathy extends Coord.Abstract { /** * For discrete-coordinate-based systems, this is used to round * non-discrete coordinates to discrete ones. */ - public abstract round(): Coord; + round(): Coord[S]; - public abstract add(other: Coord.Bare): Coord; - public abstract sub(other: Coord.Bare): Coord; - public abstract mul(scalar: number): Coord; + add(other: Bare[S]): Coord[S]; + sub(other: Bare[S]): Coord[S]; + mul(scalar: number): Coord[S]; } } - Object.freeze(Abstract); - Object.freeze(Abstract.prototype); + // Object.freeze(Abstract); + // Object.freeze(Abstract.prototype); } Object.freeze(Coord); -// No prototype to freeze. +// No prototype to freeze. \ No newline at end of file diff --git a/src/base/floor/Grid.ts b/src/base/floor/Grid.ts index e9394e71..c2e3a382 100644 --- a/src/base/floor/Grid.ts +++ b/src/base/floor/Grid.ts @@ -21,7 +21,7 @@ export abstract class Grid implements TileGetter.Source< return this.static.getArea(this.dimensions); } - public readonly tile: TileGetter]>; + public readonly tile: TileGetter; /** @@ -55,7 +55,7 @@ export abstract class Grid implements TileGetter.Source< * * @param consumer - */ - public abstract forEachTile(consumer: (tile: Tile) => void): void; + public abstract forEachTile(consumer: (tile: Tile, index: number) => void): void; public abstract shuffledForEachTile(consumer: (tile: Tile) => void): void; @@ -77,7 +77,7 @@ export abstract class Grid implements TileGetter.Source< * @param sourceCoord * The coordinate from which to find the next hop. */ - public abstract getUntToward(intendedDest: Coord, sourceCoord: Coord): Tile; + public abstract getUntToward(intendedDest: Coord[S], sourceCoord: Coord[S]): Tile; /** * @@ -85,9 +85,9 @@ export abstract class Grid implements TileGetter.Source< * @param sourceCoord - */ // TODO.doc - public abstract getUntAwayFrom(avoidCoord: Coord, sourceCoord: Coord): Tile; + public abstract getUntAwayFrom(avoidCoord: Coord[S], sourceCoord: Coord[S]): Tile; - public getRandomCoord(): Coord { + public getRandomCoord(): Coord[S] { return this.static.getRandomCoord(this.dimensions); } @@ -100,23 +100,23 @@ export abstract class Grid implements TileGetter.Source< * * The returned value should follow a uniform distribution. */ - public abstract getRandomCoordAround(origin: Coord.Bare, radius: number): Coord; + public abstract getRandomCoordAround(origin: Coord.Bare[S], radius: number): Coord[S]; /** * @override */ - public abstract _getTileAt(coord: Coord.Bare): Tile; + public abstract _getTileAt(coord: Coord.Bare[S]): Tile; /** * @override */ - public abstract _getTileDestsFrom(coord: Coord.Bare): Array>; + public abstract _getTileDestsFrom(coord: Coord.Bare[S]): Array>; /** * @override */ - public abstract _getTileSourcesTo(coord: Coord.Bare): Array>; + public abstract _getTileSourcesTo(coord: Coord.Bare[S]): Array>; /** * The returned value must be consistent with results from the @@ -125,7 +125,7 @@ export abstract class Grid implements TileGetter.Source< * @param source - * @param dest - */ - public abstract minMovesFromTo(source: Coord.Bare, dest: Coord.Bare): number; + public abstract minMovesFromTo(source: Coord.Bare[S], dest: Coord.Bare[S]): number; } export namespace Grid { @@ -193,7 +193,7 @@ export namespace Grid { * @param boundX An exclusive bound on x-coordinate. * @param boundY An exclusive bound on y-coordinate. Optional. Defaults to `boundX`. */ - getRandomCoord(bounds: Dimensions): Coord; + getRandomCoord(bounds: Dimensions): Coord[S]; /** * Return values do not need to be the same for repeated calls @@ -205,7 +205,7 @@ export namespace Grid { getSpawnCoords( playerCounts: TU.RoArr, dimensions: Dimensions, - ): TU.RoArr>>; + ): TU.RoArr>; }; diff --git a/src/base/floor/Tile.ts b/src/base/floor/Tile.ts index bc58030c..1fb82072 100644 --- a/src/base/floor/Tile.ts +++ b/src/base/floor/Tile.ts @@ -12,14 +12,14 @@ import { Coord } from "./Coord"; export { Coord }; * From a caller's point of view, extending classes should have am * identical constructor signature as that of this base class. This * can be done by a type assertion statement: ` as - * Tile.ConstructorType`. + * Tile.ConstructorType`. * * @template S * The coordinate system enum for this tile's coordinate. */ export class Tile { - public readonly coord: Coord; + public readonly coord: Coord[S]; #occupantId: Player.Id.Nullable; #freeHealth: Player.Health; #langChar: Lang.Char; @@ -38,7 +38,7 @@ export class Tile { /** * @param coord - */ - public constructor(coord: Coord) { + public constructor(coord: Coord[S]) { this.coord = coord; this.#occupantId = Player.Id.NULL; } @@ -110,7 +110,7 @@ export class Tile { } // If this errs when changing the constructor signature, then // the type definition being asserted should be updated to match. -Tile as Tile.ClassIf; +Tile as Tile.ClassIf; diff --git a/src/base/floor/TileGetter.ts b/src/base/floor/TileGetter.ts index ab3b844c..4b16ec49 100644 --- a/src/base/floor/TileGetter.ts +++ b/src/base/floor/TileGetter.ts @@ -3,7 +3,7 @@ import type { Coord, Tile } from "./Tile"; type CoordSys = Coord.System; -type Arguments = [ Coord.Bare, ] | []; +type Arguments = [ Coord.Bare[S], ] | []; /** * A utility class to get destinations-to or sources-from a tile at @@ -49,7 +49,7 @@ export namespace TileGetter { /** * A Tile should always be a source-to and destination-from itself. */ - export interface Source = [Coord.Bare]> { + export interface Source = [Coord.Bare[S]]> { _getTileAt(...args: A): Tile; // NOTE: do we need to add an optional argument for range? // If so, document that it must default to `1` if unspecified. diff --git a/src/base/floor/VisibleTile.ts b/src/base/floor/VisibleTile.ts index 528a2772..cef8ccc0 100644 --- a/src/base/floor/VisibleTile.ts +++ b/src/base/floor/VisibleTile.ts @@ -115,6 +115,6 @@ export class VisibleTile extends Tile { } // Assert that this extension's constructor has a compatible signature: -VisibleTile as Tile.ClassIf; +VisibleTile as Tile.ClassIf; Object.freeze(VisibleTile); Object.freeze(VisibleTile.prototype); diff --git a/src/base/floor/impl/Beehive.ts b/src/base/floor/impl/Beehive.ts index 1aafe1e2..561c05f4 100644 --- a/src/base/floor/impl/Beehive.ts +++ b/src/base/floor/impl/Beehive.ts @@ -28,7 +28,7 @@ export namespace Beehive { /** * # Beehive Coord */ - export class Coord extends BaseCoord.Abstract.Mathy implements Coord.Bare { + export class Coord implements BaseCoord.Abstract.Mathy, Coord.Bare { /** * # 🕒 3'o'clock direction @@ -41,13 +41,12 @@ export namespace Beehive { public readonly bash: number; public constructor(desc: Coord.Bare) { - super(desc); this.dash = desc.dash; this.bash = desc.bash; Object.freeze(this); } - public equals(other: Coord.Bare): boolean { + public _equals(other: Coord.Bare): boolean { return (this.dash === other.dash) && (this.bash === other.bash); } @@ -134,10 +133,11 @@ export namespace Beehive { this.grid = Object.freeze(grid); } - public forEachTile(consumer: (tile: Tile) => void): void { + public forEachTile(consumer: (tile: Tile, index: number) => void): void { + let i = 0; for (const row of this.grid) { for (const tile of row) { - consumer(tile); + consumer(tile, i++); } } } diff --git a/src/base/floor/impl/Euclid2.ts b/src/base/floor/impl/Euclid2.ts index e5b0da95..9c934088 100644 --- a/src/base/floor/impl/Euclid2.ts +++ b/src/base/floor/impl/Euclid2.ts @@ -15,19 +15,18 @@ export namespace Euclid2 { /** * # Euclid2 Coord */ - export class Coord extends BaseCoord.Abstract.Mathy implements Coord.Bare { + export class Coord implements BaseCoord.Abstract.Mathy, Coord.Bare { public readonly x: number; public readonly y: number; public constructor(desc: Coord.Bare) { - super(desc); this.x = desc.x; this.y = desc.y; Object.freeze(this); } - public equals(other: Coord.Bare): boolean { + public _equals(other: Coord.Bare): boolean { return (this.x === other.x) && (this.y === other.y); } @@ -168,10 +167,11 @@ export namespace Euclid2 { this.grid = Object.freeze(grid); } - public forEachTile(consumer: (tile: Tile) => void): void { + public forEachTile(consumer: (tile: Tile, index: number) => void): void { + let i = 0; for (const row of this.grid) { for (const tile of row) { - consumer(tile); + consumer(tile, i++); } } } @@ -246,11 +246,11 @@ export namespace Euclid2 { public _getTileAt(coord: Coord.Bare): Tile { - if (coord.x < 0 || coord.x >= this.dimensions.width || - coord.y < 0 || coord.y >= this.dimensions.height - ) { - throw new RangeError("Out of bounds. No such tile exists."); - } + // if (coord.x < 0 || coord.x >= this.dimensions.width || + // coord.y < 0 || coord.y >= this.dimensions.height + // ) { + // throw RangeError("Out of bounds. No such tile exists."); + // } return this.grid[coord.y][coord.x]; } @@ -299,7 +299,7 @@ export namespace Euclid2 { let coord: Coord; do { coord = Grid.getRandomCoord(dimensions); - } while (avoidSet.find((other) => coord.equals(other))); + } while (avoidSet.find((other) => coord._equals(other))); teamSpawnCoords.push(coord); avoidSet.push(coord); numMembers--; @@ -360,4 +360,4 @@ export namespace Euclid2 { Object.freeze(Grid); Object.freeze(Grid.prototype); } -Object.freeze(Euclid2); +Object.freeze(Euclid2); \ No newline at end of file diff --git a/src/base/floor/impl/readme.md b/src/base/floor/impl/readme.md index 6c7b8e1f..63065780 100644 --- a/src/base/floor/impl/readme.md +++ b/src/base/floor/impl/readme.md @@ -20,7 +20,7 @@ export namespace SysName { type S = BaseCoord.System.SYSNAME; // optional documentation - export class Coord extends BaseCoord.Abstract implements B { + export class Coord implements BaseCoord.Abstract, B { // field declarations public constructor(desc: B) { super(desc); diff --git a/src/base/game/Game.ts b/src/base/game/Game.ts index 0da40a98..b32e481b 100644 --- a/src/base/game/Game.ts +++ b/src/base/game/Game.ts @@ -53,7 +53,11 @@ export namespace Game { }; /** - * # Game Constructor Arguments + * ## Game Constructor Arguments + * + * **IMPORTANT**: Upon modification, make appropriate changes to + * GamepartManager's function for verifying validity of client + * input on the server side. * * @template S * The coordinate system to use. The literal value must also be @@ -68,7 +72,7 @@ export namespace Game { averageFreeHealthPerTile: Player.Health; langId: Lang.FrontendDesc["id"]; - langWeightScaling: number; + langWeightExaggeration: Lang.WeightExaggeration; playerDescs: TU.RoArr<( G extends Game.Type.Manager @@ -76,23 +80,26 @@ export namespace Game { : Player.CtorArgs )>; }>; - export namespace CtorArgs { - export const EVENT_NAME = "game-create"; - /** - * This is used as the payload with the above event name when - * notifying the server's joiner namespace that the group is - * returning to their lobby from playing a game. - */ - export const RETURN_TO_LOBBY_INDICATOR = "return-to-lobby"; + export namespace Event { + export const NAME = "game-create"; + /** + * This is used as the payload with the above event name when + * notifying the server's joiner namespace that the group is + * returning to their lobby from playing a game. + */ + export const RETURN_TO_LOBBY_INDICATOR = "return-to-lobby"; + } + export const EVENT_NAME_CLIENT_READY_RESET = "client-ready-for-reset"; + export const EVENT_NAME_CLIENT_READY_UNPAUSE = "client-ready-for-unpause"; + export const EVENT_NAME_SERVER_APPROVE_UNPAUSE = "server-approve-unpause"; + export const EVENT_NAME_SERVER_APPROVE_PAUSE = "server-approve-pause"; /** - * Not used here, but used in {@link GroupSession#createGameInstance}. */ export type FailureReasons = { - undefinedUsername: TU.RoArr; // socket ID's - undefinedTeamId: TU.RoArr; + missingFields: Array>; }; // export type _GameTypeDependantPart @@ -113,9 +120,9 @@ export namespace Game { */ export type ResetSer = Readonly<{ csps: TU.RoArr; - playerCoords: TU.RoArr>; + playerCoords: TU.RoArr; healthCoords: TU.RoArr<{ - coord: Coord.Bare; + coord: Coord.Bare[S]; health: Player.Health; }>; }>; diff --git a/src/base/game/events/PlayerActionEvent.ts b/src/base/game/events/PlayerActionEvent.ts index 9a08138b..e9ab5d61 100644 --- a/src/base/game/events/PlayerActionEvent.ts +++ b/src/base/game/events/PlayerActionEvent.ts @@ -5,7 +5,7 @@ import { EventRecordEntry, PlayerGeneratedRequest } from "./EventRecordEntry"; export type TileModEvent = { - readonly coord: Coord.Bare; + readonly coord: Coord.Bare[S]; /** * The requester should set this field to the highest value they diff --git a/src/base/game/gameparts/GamepartBase.ts b/src/base/game/gameparts/GamepartBase.ts index 3c52b77c..8a1206a4 100644 --- a/src/base/game/gameparts/GamepartBase.ts +++ b/src/base/game/gameparts/GamepartBase.ts @@ -60,7 +60,7 @@ export abstract class GamepartBase }) as GamepartBase["grid"]; this.#onGameBecomeOver = impl.onGameBecomeOver; - this.langFrontend = Lang.GET_FRONTEND_DESC_BY_ID(desc.langId); + this.langFrontend = Lang.GET_FRONTEND_DESC_BY_ID(desc.langId)!; // Construct players: this._playerStatusCtor = impl.playerStatusCtor; @@ -86,7 +86,7 @@ export abstract class GamepartBase // The purpose of this restriction is to prevent DoS attacks on // a hosting server by creating games that can never end and // leaving them open forever, thus leaking the server's resources. - throw new Error("All teams are immortal. The game will never end."); + throw Error("All teams are immortal. The game will never end."); } } this.players.forEach((player) => player._afterAllPlayersConstruction()); @@ -123,7 +123,8 @@ export abstract class GamepartBase private createPlayers(gameDesc: Readonly>): GamepartBase["players"] { type pCtorArgs = TU.RoArr; const playerDescs: pCtorArgs - = (gameDesc.playerDescs as pCtorArgs) + // @ts-expect-error : RO= + = gameDesc.playerDescs = (this.gameType === Game.Type.ONLINE) // The client receives these descriptors already finalized / cleaned by the server. ? (gameDesc.playerDescs as pCtorArgs) @@ -147,6 +148,7 @@ export abstract class GamepartBase const playerCoords = this.players.map((player) => player.coord); const healthCoords: TU.NoRo["healthCoords"]> = []; this.grid.forEachTile((tile) => { + tile.lastKnownUpdateId++; csps.push({ char: tile.langChar, seq: tile.langSeq, @@ -162,15 +164,14 @@ export abstract class GamepartBase } public deserializeResetState(ser: Game.ResetSer): void { - { let i = 0; // Could also use `csps.unshift`, but that may be slower // because it modifies csps, which we don't need to do. - this.grid.forEachTile((tile) => { - tile.setLangCharSeqPair(ser.csps[i++]); - tile.lastKnownUpdateId = 1; - }); } + this.grid.forEachTile((tile, index) => { + tile.setLangCharSeqPair(ser.csps[index]); + tile.lastKnownUpdateId++; + }); ser.playerCoords.forEach((coord, index) => { - this.players[index].moveTo(this.grid.tile.at(coord)); + this.players[index].reset(this.grid.tile.at(coord)); }); ser.healthCoords.forEach((desc) => { this.grid.tile.at(desc.coord).freeHealth = desc.health; @@ -207,7 +208,7 @@ export abstract class GamepartBase return; } if (this.status !== Game.Status.PAUSED) { - throw new Error("Can only resume a game that is currently paused."); + throw Error("Can only resume a game that is currently paused."); } this.players.forEach((player) => { player._notifyGameNowPlaying(); @@ -227,7 +228,7 @@ export abstract class GamepartBase return; } if (this.status !== Game.Status.PLAYING) { - throw new Error("Can only pause a game that is currently playing."); + throw Error("Can only pause a game that is currently playing."); } this.players.forEach((player) => { player._notifyGameNowPaused(); @@ -246,7 +247,7 @@ export abstract class GamepartBase */ public statusBecomeOver(): void { if (this.status !== Game.Status.PLAYING) { - throw new Error("Can only end a game that is currently playing."); + throw Error("Can only end a game that is currently playing."); } this.players.forEach((player) => { player._notifyGameNowOver(); diff --git a/src/base/game/gameparts/GamepartEvents.ts b/src/base/game/gameparts/GamepartEvents.ts index 74386bae..0fc2b2ee 100644 --- a/src/base/game/gameparts/GamepartEvents.ts +++ b/src/base/game/gameparts/GamepartEvents.ts @@ -92,11 +92,11 @@ export abstract class GamepartEvents desc.lastKnownUpdateId) return dest; - if (dest.lastKnownUpdateId === desc.lastKnownUpdateId) throw new Error("never."); + if (dest.lastKnownUpdateId === desc.lastKnownUpdateId) throw "never"; if (desc.newCharSeqPair) { dest.setLangCharSeqPair(desc.newCharSeqPair); @@ -148,6 +148,7 @@ export abstract class GamepartEvents>): void { + // console.log(desc); const player = this.players[desc.playerId]; const clientEventLag = desc.playerLastAcceptedRequestId - player.lastAcceptedRequestId; @@ -172,7 +173,7 @@ export abstract class GamepartEvents nsps[propName], langModule[this.langFrontend.module], ) as Lang.ClassIf; - (this.lang as Lang) = new LangConstructor(desc.langWeightScaling); + // @ts-expect-error : RO= + this.lang = new LangConstructor(desc.langWeightExaggeration); // TODO.impl Enforce this in the UI code by greying out unusable combos of lang and coord-sys. const minLangLeaves = this.grid.static.getAmbiguityThreshold(); if (this.lang.numLeaves < minLangLeaves) { - throw new Error(`Found ${this.lang.numLeaves} leaves, but at` + throw Error(`Found ${this.lang.numLeaves} leaves, but at` + ` least ${minLangLeaves} were required. The provided mappings` + ` composing the current Lang-under-construction are not` + ` sufficient to ensure that a shuffling operation will always` @@ -106,13 +107,6 @@ export abstract class GamepartManager { - // this.executeTileModEvent(tileModDesc); - // }) return Promise.resolve(); } @@ -191,8 +185,7 @@ export abstract class GamepartManager { return tile.isOccupied // The below equality check is necessary to prevent counting bugs. - // TODO.learn see other TODO about the type cast seen here on the below line. - || retval.find((desc) => tile.coord.equals(desc.coord as any)); + || retval.find((desc) => Coord.equals(tile.coord, desc.coord)); // TODO.impl add other checks to improve distribution and reduce // crowding of freeHealth. Make sure it is sensitive to // `this.averageFreeHealthPerTile`. @@ -200,7 +193,7 @@ export abstract class GamepartManager | undefined; - if (otherDesc = sameReqOtherModDescs.find((desc) => tile.coord.equals(desc.coord as any))) { + if (otherDesc = sameReqOtherModDescs.find((desc) => Coord.equals(tile.coord, desc.coord))) { otherDesc.newFreeHealth = (otherDesc.newFreeHealth || 0) + tileHealthToAdd; } else { retval.push({ @@ -240,7 +233,7 @@ export abstract class GamepartManager>, + ): string[] { + const fr: string[] = []; + type Keys = keyof Game.CtorArgs; + const requiredFields: {[K in Keys]: any} = Object.freeze({ + coordSys: 0, gridDimensions: 0, averageFreeHealthPerTile: 0, + langId: 0, langWeightExaggeration: 0, playerDescs: 0, + }); + const missingFields: string[] = []; + for (const fieldName in requiredFields) { + const field = args[fieldName as Keys]; + if (field === undefined || field === null) { + missingFields.push(fieldName as Keys); + } + } + if (missingFields.length) { + fr.push("Missing the following arguments: " + missingFields); + } + if (Lang.GET_FRONTEND_DESC_BY_ID(args.langId) === undefined) { + fr.push(`No language with the ID \`${args.langId}\` exists.`); + } + + if (parseInt(args.langWeightExaggeration as any) === NaN) { + fr.push(`Language Weight Exaggeration expected a number, but` + + `\`${args.langWeightExaggeration}\` is not a number.`); + } else { + args.langWeightExaggeration = Math.max(0, parseFloat( + args.langWeightExaggeration as any + )); + } + // TODO.impl check all the rest of the things. + // if (!(Player.Username.REGEXP.test(desc.username))) { + // throw RangeError(`Username \"${desc.username}\"` + // + ` does not match the required regular expression,` + // + ` \"${Player.Username.REGEXP.source}\".` + // ); + // } + return fr; + } +} Object.freeze(GamepartManager); -Object.freeze(GamepartManager.prototype); +Object.freeze(GamepartManager.prototype); \ No newline at end of file diff --git a/src/base/game/player/ArtificialPlayer.ts b/src/base/game/player/ArtificialPlayer.ts index 416e5c9b..7702f053 100644 --- a/src/base/game/player/ArtificialPlayer.ts +++ b/src/base/game/player/ArtificialPlayer.ts @@ -39,7 +39,7 @@ export abstract class ArtificialPlayer extends Player protected constructor(game: GamepartManager, desc: Player.CtorArgs) { super(game, desc); if (game.gameType === Game.Type.ONLINE) { - throw new TypeError("OnlineGames should be using regular Players instead."); + throw TypeError("OnlineGames should be using regular Players instead."); } } @@ -50,7 +50,7 @@ export abstract class ArtificialPlayer extends Player * movement request. Pos may contain non-integer coordinate values, * and it does not have to be inside the bounds of the {@link Grid}. */ - protected abstract computeDesiredDest(): Coord; + protected abstract computeDesiredDest(): Coord[S]; protected abstract getNextMoveType(): Player.MoveType; @@ -119,10 +119,9 @@ export namespace ArtificialPlayer { }; }>; - export type FamilySpecificPart = - ( F extends typeof Player.Family.CHASER ? Chaser.Behaviour - : never - ); + export interface FamilySpecificPart { + [Player.Family.CHASER]: Chaser.Behaviour; + } export const of = ( game: GamepartManager, @@ -132,4 +131,4 @@ export namespace ArtificialPlayer { return new (_Constructors[familyId])(game, playerDesc); }; } -// ArtificialPlayer is frozen in PostInit after _Constructors get initialized. +// ArtificialPlayer is frozen in PostInit after _Constructors get initialized. \ No newline at end of file diff --git a/src/base/game/player/OperatorPlayer.ts b/src/base/game/player/OperatorPlayer.ts index 944c94c4..378a745f 100644 --- a/src/base/game/player/OperatorPlayer.ts +++ b/src/base/game/player/OperatorPlayer.ts @@ -1,10 +1,10 @@ import { Lang } from "lang/Lang"; import { Game } from "game/Game"; -import type { Coord, Tile } from "floor/Tile"; import type { VisibleTile } from "floor/VisibleTile"; import type { VisiblePlayerStatus } from "./VisiblePlayerStatus"; import type { GamepartBase } from "game/gameparts/GamepartBase"; +import { Coord, Tile } from "floor/Tile"; import { Player } from "./Player"; @@ -23,7 +23,8 @@ export class OperatorPlayer extends Player { /** * @override */ - declare public readonly hostTile: VisibleTile; + // @ts-expect-error : Redeclaring accessor as property. + declare public hostTile: VisibleTile; /** * @override @@ -38,7 +39,7 @@ export class OperatorPlayer extends Player { readonly #langRemappingFunc: {(input: string): string}; - private prevCoord: Coord; + private prevCoord: Coord[S]; public constructor(game: GamepartBase, desc: Player._CtorArgs<"HUMAN">) { @@ -64,18 +65,12 @@ export class OperatorPlayer extends Player { * @param event - The object describing the `KeyboardEvent`. */ public processKeyboardInput(event: KeyboardEvent): void { - if (false) { - return; - // @ Above: Conditional handlers for actions that are valid - // even when the game is over or paused. - // ========================================================== - } else if (this.game.status !== Game.Status.PLAYING) return; + if (this.game.status !== Game.Status.PLAYING) return; if (!this.requestInFlight) { // Only process movement-type input if the last request got // acknowledged by the Game Manager and the game is playing. if (event.key === " ") { - // TODO.learn why isn't TypeScript able to figure the below line out? - if (!this.coord.equals(this.prevCoord as any)) { + if (!Coord.equals(this.coord, this.prevCoord)) { this.makeMovementRequest( this.game.grid.getUntAwayFrom(this.prevCoord, this.coord), Player.MoveType.BOOST, @@ -109,7 +104,7 @@ export class OperatorPlayer extends Player { if (key) { key = this.#langRemappingFunc(key); if (!(Lang.Seq.REGEXP.test(key))) { - // throw new RangeError(`The implementation of input transformation` + // throw RangeError(`The implementation of input transformation` // + ` in the currently selected language did not follow the rule` // + ` of producing output matching the regular expression` // + ` \"${Lang.Seq.REGEXP.source}\".` diff --git a/src/base/game/player/Player.ts b/src/base/game/player/Player.ts index f240bc42..47d59617 100644 --- a/src/base/game/player/Player.ts +++ b/src/base/game/player/Player.ts @@ -14,7 +14,7 @@ import { Team } from "./Team"; export { Team }; /** * */ -export class Player extends PlayerSkeleton { +export class Player extends PlayerSkeleton implements _Player.UserInfo { public readonly familyId: Player.Family; @@ -22,6 +22,8 @@ export class Player extends PlayerSkeleton { public readonly username: Player.Username; + public readonly avatar: Player.Avatar; + public lastAcceptedRequestId: number; public requestInFlight: boolean; @@ -30,15 +32,10 @@ export class Player extends PlayerSkeleton { public constructor(game: GamepartBase, desc: Player.CtorArgs) { super(game, desc); - if (!(Player.Username.REGEXP.test(desc.username))) { - throw new RangeError(`Username \"${desc.username}\"` - + ` does not match the required regular expression,` - + ` \"${Player.Username.REGEXP.source}\".` - ); - } this.familyId = desc.familyId; this.teamId = desc.teamId; this.username = desc.username; + this.avatar = desc.avatar ?? Player.Avatar.GET_RANDOM(); } public reset(spawnTile: Tile): void { @@ -75,9 +72,9 @@ export class Player extends PlayerSkeleton { protected makeMovementRequest(dest: Tile, type: Player.MoveType): void { if (this.game.status !== Game.Status.PLAYING) { // TODO.build disable this check for production. - throw new Error("This is not a necessary precondition, but we're doing it anyway."); + throw Error("This is not a necessary precondition, but we're doing it anyway."); } else if (this.requestInFlight) { - throw new Error("Only one request should ever be in flight at a time."); + throw Error("Only one request should ever be in flight at a time."); } this.requestInFlight = true; this.game.processMoveRequest( @@ -118,21 +115,9 @@ export namespace Player { */ export type Health = _Player.Health; - export type Username = string; - - export namespace Username { - /** - * The choice of this is somewhat arbitrary. This should be enforced - * externally since player descriptors are passed to the constructor. - * - * Requirements: - * - Starts with a letter. - * - No whitespace except for non-consecutive space characters. - * - Must contain at least five non-space characters that are - * either letters, numbers, or the dash character. - */ - export const REGEXP = /[a-zA-Z](?:[ ]?[a-zA-Z0-9:-]+?){4,}/; - } + export type Username = _Player.Username; + export type Avatar = _Player.Avatar; + export type UserInfo = _Player.UserInfo; export type MoveType = _Player.MoveType; @@ -142,33 +127,34 @@ export namespace Player { export type CtorArgs = _CtorArgs; export type _CtorArgs = any extends F_group ? never : { [F in F_group]: F extends Player.Family - ? (CtorArgs._PreIdAssignment & Readonly<{ + ? (_PreIdAssignment & Readonly<{ playerId: Player.Id; }>) : never }[F_group]; + type _PreIdAssignment = any extends F_group ? never + : { [F in F_group]: F extends Player.Family + ? (Readonly<{ + isALocalOperator: F extends typeof Player.Family.HUMAN ? boolean : false; + familyId: F; + teamId: Team.Id; + socketId: F extends typeof Player.Family.HUMAN ? (SocketId | undefined) : undefined; + username: Username; + avatar: Avatar | undefined; + noCheckGameOver: boolean; + familyArgs: CtorArgs.FamilySpecificPart[F]; + }>) + : never; + }[F_group]; + export namespace CtorArgs { export type PreIdAssignment = _PreIdAssignment; - export type _PreIdAssignment = any extends F_group ? never - : { [F in F_group]: F extends Player.Family - ? (Readonly<{ - isALocalOperator: F extends typeof Player.Family.HUMAN ? boolean : false; - familyId: F; - teamId: Team.Id; - socketId: F extends typeof Player.Family.HUMAN ? (SocketId | undefined) : undefined; - username: Username; - noCheckGameOver: boolean; - familyArgs: FamilySpecificPart; - }>) - : never; - }[F_group]; - - export type FamilySpecificPart = - ( F extends typeof Player.Family.HUMAN ? {} - : ArtificialPlayer.FamilySpecificPart - ); + + export interface FamilySpecificPart extends ArtificialPlayer.FamilySpecificPart { + [Player.Family.HUMAN]: {}; + } /** * @returns @@ -177,9 +163,7 @@ export namespace Player { * @param playerDescs - * @param langName - */ - export const finalize = ( - playerDescs: TU.RoArr, - ): TU.RoArr => { + export function finalize(playerDescs: TU.RoArr): TU.RoArr { // Map team ID's to consecutive numbers // (to play nice with array representations): const teamIdCleaner: TU.RoArr @@ -189,9 +173,10 @@ export namespace Player { prev[originalId] = squashedId; return prev; }, [] as Array); + return playerDescs.slice() .sort((pda, pdb) => teamIdCleaner[pda.teamId] - teamIdCleaner[pdb.teamId]) - .map((playerDesc, index) => Object.assign(playerDesc, { + .map((playerDesc, index) => Object.assign({}, playerDesc, { playerId: index, teamId: teamIdCleaner[playerDesc.teamId], })); @@ -200,4 +185,4 @@ export namespace Player { Object.freeze(CtorArgs); } Object.freeze(Player); -Object.freeze(Player.prototype); +Object.freeze(Player.prototype); \ No newline at end of file diff --git a/src/base/game/player/PlayerSkeleton.ts b/src/base/game/player/PlayerSkeleton.ts index f3debcf1..fd7b5728 100644 --- a/src/base/game/player/PlayerSkeleton.ts +++ b/src/base/game/player/PlayerSkeleton.ts @@ -37,7 +37,7 @@ export abstract class PlayerSkeleton extends _Player protected constructor(game: GamepartBase, desc: Player.CtorArgs) { super(); if (Math.trunc(desc.playerId) !== desc.playerId) { - throw new RangeError("Player ID's must be integer values."); + throw RangeError("Player ID's must be integer values."); } this.playerId = desc.playerId; this.isALocalOperator = desc.isALocalOperator; @@ -69,7 +69,7 @@ export abstract class PlayerSkeleton extends _Player } - public get coord(): Coord { + public get coord(): Coord[S] { return this.hostTile.coord; } @@ -91,7 +91,7 @@ export abstract class PlayerSkeleton extends _Player if (this.hostTile.occupantId !== this.playerId) { if (this.game.gameType !== Game.Type.ONLINE) { // Should never happen. - throw new Error("Linkage between player and occupied tile disagrees."); + throw Error("Linkage between player and occupied tile disagrees."); } /* Otherwise, this corner case is guaranteed to follow the events described in the below comment: at this `OnlineGame`, `p2` will @@ -106,7 +106,7 @@ export abstract class PlayerSkeleton extends _Player if (this.game.gameType !== Game.Type.ONLINE) { // Should never happen because the Game Manager // rejects requests to move onto an occupied `Tile`. - throw new Error("Only one player can occupy a tile at a time."); + throw Error("Only one player can occupy a tile at a time."); } /* Otherwise, this is actually possible in a variant of the _DAS_ where another `Player` `p2` moves to `B`, I receive that update, @@ -133,7 +133,7 @@ export namespace PlayerSkeleton { export class TileGetterSource implements TileGetter.Source { readonly #player: PlayerSkeleton - readonly #superTileSrc: TileGetter.Source,]>; + readonly #superTileSrc: TileGetter.Source; public constructor(player: PlayerSkeleton) { this.#player = player; diff --git a/src/base/game/player/Team.ts b/src/base/game/player/Team.ts index f6ef7a32..534d060a 100644 --- a/src/base/game/player/Team.ts +++ b/src/base/game/player/Team.ts @@ -15,7 +15,7 @@ export class Team { public constructor(teamId: Team.Id, members: TU.RoArr>) { if (members.length === 0) { - throw new Error("teams must have at least one member."); + throw Error("Teams must have at least one member."); } this.id = teamId; this.members = members; @@ -50,7 +50,7 @@ export class Team { } public set elimOrder(teamElimOrder: number) { if (this.elimOrder === Team.ElimOrder.IMMORTAL) { - throw new Error("Cannot change the elimination status of an immortal team."); + throw Error("Cannot change the elimination status of an immortal team."); } this.#elimOrder = teamElimOrder; } diff --git a/src/base/game/player/VisiblePlayerStatus.ts b/src/base/game/player/VisiblePlayerStatus.ts index 20461690..f3b0b32c 100644 --- a/src/base/game/player/VisiblePlayerStatus.ts +++ b/src/base/game/player/VisiblePlayerStatus.ts @@ -2,6 +2,7 @@ import { OmHooks } from "defs/OmHooks"; import { SCROLL_INTO_CENTER } from "defs/TypeDefs"; import type { Coord, Tile } from "floor/Tile"; import type { Player } from "./Player"; +import type { OperatorPlayer } from "game/player/OperatorPlayer"; import { PlayerStatus } from "./PlayerStatus"; @@ -59,7 +60,8 @@ export class VisiblePlayerStatus extends PlayerStatus * @override */ public _afterAllPlayersConstruction(): void { - (this._immigrantInfoCache as Tile.VisibleImmigrantInfo) = Object.freeze({ + // @ts-expect-error : RO= + this._immigrantInfoCache = Object.freeze({ playerElem: this.#baseElem, username: this.player.username, }); @@ -80,12 +82,12 @@ export class VisiblePlayerStatus extends PlayerStatus public _notifyWillBecomeCurrent(spotlightElems: TU.RoArr): void { const currOperator = this.player.game.currentOperator; - const nextOperator = this.player; + const nextOperator = this.player as OperatorPlayer; requestAnimationFrame((time) => { spotlightElems.forEach((elem) => { this.#baseElem.appendChild(elem); }); - currOperator?.status.immigrantInfo.playerElem.scrollIntoView(SCROLL_INTO_CENTER); + nextOperator.status.immigrantInfo.playerElem.scrollIntoView(SCROLL_INTO_CENTER); }); if (nextOperator.teamId !== currOperator?.teamId) { // Must use the above nullish coalesce operator for first call to setCurrentOperator. diff --git a/src/base/game/player/artificials/Chaser.ts b/src/base/game/player/artificials/Chaser.ts index 37bdb2eb..9a8a24ee 100644 --- a/src/base/game/player/artificials/Chaser.ts +++ b/src/base/game/player/artificials/Chaser.ts @@ -19,7 +19,7 @@ export class Chaser extends ArtificialPlayer { private readonly behaviour: Required>; private readonly grid: Chaser["game"]["grid"]; - #prevCoord: Coord; + #prevCoord: Coord[S]; public constructor(game: GamepartManager, desc: Player._CtorArgs<"CHASER">) { super(game, desc); @@ -34,11 +34,13 @@ export class Chaser extends ArtificialPlayer { public _afterAllPlayersConstruction(): void { super._afterAllPlayersConstruction(); // We need to cast off read-only-ness below. - (this.threatProximity as Array>) = this.game.teams + // @ts-expect-error : RO= + this.threatProximity = this.game.teams .filter((team) => team.id !== this.teamId) .flatMap((team) => team.members); - (this.targetProximity as Array>) = this.threatProximity.slice(); + // @ts-expect-error : RO= + this.targetProximity = this.threatProximity.slice(); } public reset(spawnTile: Tile): void { @@ -51,7 +53,7 @@ export class Chaser extends ArtificialPlayer { super.moveTo(dest); } - protected computeDesiredDest(): Coord { + protected computeDesiredDest(): Coord[S] { // Check if there is anyone to run away from: this.threatProximity.sort((pa,pb) => { return this.grid.minMovesFromTo(pa.coord, this.coord) diff --git a/src/base/lang/Lang.ts b/src/base/lang/Lang.ts index 4a0425a8..0da35a7b 100644 --- a/src/base/lang/Lang.ts +++ b/src/base/lang/Lang.ts @@ -50,25 +50,20 @@ export abstract class Lang extends _Lang { * require the provided values to all be strictly positive values. * Ie. They do not need to sum up to any specific value. * - * @param weightScaling - * A value used to scale the variance in weights. Passing zero will - * cause all weights to be adjusted to equal the average weight. - * Passing `1` will cause no adjustment to be made to the weights. - * Passing a value greater than one will cause an exaggeration of - * the weight distribution. + * @param weightExaggeration - */ protected constructor( - frontendDescId: typeof Lang.FrontendDescs[number]["id"], + frontendDescId: Lang.FrontendDesc["id"], forwardDict: Lang.CharSeqPair.WeightedForwardMap, - weightScaling: number, + weightExaggeration: Lang.WeightExaggeration, ) { super(); - this.frontendDesc = Lang.GET_FRONTEND_DESC_BY_ID(frontendDescId); - this.treeMap = LangSeqTree.ParentNode.CREATE_TREE_MAP(forwardDict, weightScaling); + this.frontendDesc = Lang.GET_FRONTEND_DESC_BY_ID(frontendDescId)!; + this.treeMap = LangSeqTree.ParentNode.CREATE_TREE_MAP(forwardDict, weightExaggeration); this.leafNodes = this.treeMap.getLeafNodes(); if (this.leafNodes.length !== this.frontendDesc.numLeaves) { - throw new Error(`maintenance required: the frontend constant` + throw Error(`maintenance required: the frontend constant` + ` for the language \"${this.frontendDesc.id}\" needs to` + ` be updated to the correct, computed value, which is` + ` \`${this.leafNodes.length}\`.`); @@ -160,7 +155,7 @@ export abstract class Lang extends _Lang { if (!nodeToHit) { // Should never reach here because there is a check in the // constructor for this invariant. - throw new Error(`Invariants guaranteeing that a LangSeq can` + throw Error(`Invariants guaranteeing that a LangSeq can` + `always be shuffled-in were not met.` ); } @@ -182,7 +177,7 @@ export namespace Lang { * `Lang` class must implement this interface. */ export interface ClassIf { - new (weightScaling: number): Lang; + new (weightScaling: Lang.WeightExaggeration): Lang; }; /** @@ -220,6 +215,15 @@ export namespace Lang { >; } + /** + * A value used to scale the variance in weights. Passing zero will + * cause all weights to be adjusted to equal the average weight. + * Passing `1` will cause no adjustment to be made to the weights. + * Passing a value greater than one will cause an exaggeration of + * the weight distribution. + */ + export type WeightExaggeration = _Lang.WeightExaggeration; + export type FrontendDesc = _Lang.FrontendDesc; } Object.freeze(Lang); diff --git a/src/base/lang/LangSeqTreeNode.ts b/src/base/lang/LangSeqTreeNode.ts index 0972cee2..2db37739 100644 --- a/src/base/lang/LangSeqTreeNode.ts +++ b/src/base/lang/LangSeqTreeNode.ts @@ -50,12 +50,13 @@ export namespace LangSeqTree { // If this errs, and the offending character is one that can // be easily entered on a generic keyboard, don't be afraid // to just add it to the regexp. - throw new RangeError(`Mapping-sequence \"${seq}\" did not match the` + throw RangeError(`Mapping-sequence \"${seq}\" did not match the` + ` required regular expression \"${_Lang.Seq.REGEXP.source}\".` ); - } else if (chars.length === 0) { + } + if (chars.length === 0) { // Must not make mapping without written characters. - throw new Error("never"); + throw "never"; } let node: ParentNode = this; { let childNode: ParentNode | undefined = this; @@ -66,7 +67,7 @@ export namespace LangSeqTree { } if ((node as ChildNode).sequence === seq) { // TODO.build disable during development // This should never happen. - throw new Error(`Mappings for all written-characters with a common` + throw Error(`Mappings for all written-characters with a common` + `corresponding typeable-sequence should be registered together,` + `but an existing mapping for the sequence \"${seq}\" was found.` ); @@ -98,7 +99,7 @@ export namespace LangSeqTree { */ public static CREATE_TREE_MAP( forwardDict: Lang.CharSeqPair.WeightedForwardMap, - weightScaling: number, + weightScaling: Lang.WeightExaggeration, ): LangSeqTree.ParentNode { const averageWeight = Object.values(forwardDict).reduce((sum, next) => sum += next.weight, 0); const adjustedWeight = (function () { @@ -301,7 +302,7 @@ class WeightedLangChar { weight: number, ) { if (weight <= 0) { // TODO.build disable during development - throw new RangeError(`All weights must be positive, but we` + throw RangeError(`All weights must be positive, but we` + ` were passed the value \"${weight}\" for the character` + ` \"${char}\".`); } diff --git a/src/base/lang/impl/Emote.ts b/src/base/lang/impl/Emote.ts index 88412828..f1f378db 100644 --- a/src/base/lang/impl/Emote.ts +++ b/src/base/lang/impl/Emote.ts @@ -14,4 +14,4 @@ export namespace Emote { Object.freeze(GitHub); Object.freeze(GitHub.prototype); } -Object.freeze(Emote); +Object.freeze(Emote); \ No newline at end of file diff --git a/src/base/lang/impl/English.ts b/src/base/lang/impl/English.ts index 399d000b..d188905e 100644 --- a/src/base/lang/impl/English.ts +++ b/src/base/lang/impl/English.ts @@ -109,4 +109,4 @@ export namespace English { y: 1.994, z: 0.077, }); } -Object.freeze(English); +Object.freeze(English); \ No newline at end of file diff --git a/src/base/lang/impl/Japanese.ts b/src/base/lang/impl/Japanese.ts index 3f5bce24..5c20dbe8 100644 --- a/src/base/lang/impl/Japanese.ts +++ b/src/base/lang/impl/Japanese.ts @@ -222,4 +222,4 @@ export namespace Japanese { Object.freeze(Katakana); Object.freeze(Katakana.prototype); } -Object.freeze(Japanese); +Object.freeze(Japanese); \ No newline at end of file diff --git a/src/base/lang/impl/Korean.ts b/src/base/lang/impl/Korean.ts index c2176d3a..2b0a4975 100644 --- a/src/base/lang/impl/Korean.ts +++ b/src/base/lang/impl/Korean.ts @@ -271,4 +271,4 @@ export namespace Korean { "": 1, }) as Record; } -Object.freeze(Korean); +Object.freeze(Korean); \ No newline at end of file diff --git a/src/base/lang/impl/Morse.ts b/src/base/lang/impl/Morse.ts index 0a7344f6..447b6d15 100644 --- a/src/base/lang/impl/Morse.ts +++ b/src/base/lang/impl/Morse.ts @@ -27,4 +27,4 @@ export namespace Morse { Object.freeze(Decode); Object.freeze(Decode.prototype); } -Object.freeze(Morse); +Object.freeze(Morse); \ No newline at end of file diff --git a/src/client/TopLevel.ts b/src/client/TopLevel.ts index 8fca05f3..bc8a504c 100644 --- a/src/client/TopLevel.ts +++ b/src/client/TopLevel.ts @@ -1,6 +1,8 @@ import { OmHooks } from "defs/OmHooks"; -import type { BrowserGameMixin } from "./game/BrowserGame"; +import { StorageHooks } from "defs/StorageHooks"; +import type { BrowserGameMixin, Game } from "./game/BrowserGame"; import type { _PlayScreen } from "./screen/impl/Play"; +import type { Coord, SkScreen } from "../client/screen/SkScreen"; import { AllSkScreens } from "./screen/AllSkScreens"; import { BgMusic } from "./audio/BgMusic"; @@ -14,11 +16,13 @@ export class TopLevel { public readonly webpageHostType: TopLevel.WebpageHostType; + public readonly storage: typeof StorageHooks; + /** * Purposely made private. Screens are intended to navigate * between each other without reference to this field. */ - private readonly allScreens: AllSkScreens; + readonly #allScreens: AllSkScreens; public readonly bgMusic: BgMusic; public readonly sfx: SoundEffects; @@ -26,10 +30,18 @@ export class TopLevel { /** * This is managed by the `GroupJoiner` screen. */ + // TODO.impl change this to just a getter, and implement a setter method + // that makes it clear that it is not generally safe to modify this field. public socket: typeof io.Socket | undefined; #socketIoChunk: Promise; + /** + */ + public get clientIsGroupHost(): boolean { + return this.#allScreens.dict.groupJoiner.clientIsGroupHost; + } + public constructor() { this.webpageHostType = (() => { @@ -41,11 +53,12 @@ export class TopLevel { return TopLevel.WebpageHostType.SNAKEY_SERVER; } })(); + this.storage = StorageHooks; // const allScreensElem = document.getElementById(OmHooks.Screen.Id.ALL_SCREENS); - if (!allScreensElem) { throw new Error; } + if (!allScreensElem) { throw Error(); } this.prependComment(allScreensElem, "ALL SCREENS CONTAINER"); - this.allScreens = new AllSkScreens(this, allScreensElem); + this.#allScreens = new AllSkScreens(this, allScreensElem); // // this.bgMusic = new BgMusic(BgMusic.TrackDescs[0].id); @@ -90,9 +103,16 @@ export class TopLevel { /** * For debugging purposes- especially in the browser console. */ - public get game(): BrowserGameMixin | undefined { - return (this.allScreens.dict.playOffline as _PlayScreen).currentGame - ?? (this.allScreens.dict.playOnline as _PlayScreen).currentGame; + public get game(): BrowserGameMixin | undefined { + return (this.#allScreens.dict.playOffline).currentGame + ?? (this.#allScreens.dict.playOnline ).currentGame; + } + + /** + * For debugging purposes- especially in the browser console. + */ + public get currentScreen(): SkScreen { + return this.#allScreens.currentScreen; } } export namespace TopLevel { @@ -103,4 +123,4 @@ export namespace TopLevel { } } Object.freeze(TopLevel); -Object.freeze(TopLevel.prototype); +Object.freeze(TopLevel.prototype); \ No newline at end of file diff --git a/src/client/audio/BgMusic.ts b/src/client/audio/BgMusic.ts index 78994c3c..b681eae0 100644 --- a/src/client/audio/BgMusic.ts +++ b/src/client/audio/BgMusic.ts @@ -17,7 +17,7 @@ export class BgMusic { public constructor(trackId: BgMusic.TrackDesc["id"]) { this.desc = BgMusic.TrackDescs.find((desc) => desc.id === trackId)!; if (!this.desc) { - throw new Error(`track with id \`${trackId}\` does not exist.`); + throw Error(`track with id \`${trackId}\` does not exist.`); } const tracksDesc = this.desc; const context = this.context = new AudioContext({ @@ -44,16 +44,19 @@ export class BgMusic { tracksDesc.bufferLength, tracksDesc.sampleRate, ); - (this.sourceBuffer as AudioBuffer) = bigBuffer; + // @ts-expect-error : RO= + this.sourceBuffer = bigBuffer; const split = context.createChannelSplitter(bigBufferNumChannels); const merge = context.createChannelMerger(this.layerFaders.length); - (this.sourceDestination as AudioNode) = split; + // @ts-expect-error : RO= + this.sourceDestination = split; let bigBufferChannelIndex = 0; - (this.layerFaders as BgMusic["layerFaders"]) = abs.map((ab, trackIndex) => { + // @ts-expect-error : RO= + this.layerFaders = abs.map((ab, trackIndex) => { if (ab.sampleRate !== tracksDesc.sampleRate) { - throw new Error("never"); + throw "never"; } const track = context.createChannelMerger(ab.numberOfChannels); const fader = context.createGain(); // https://devdocs.io/dom/gainnode @@ -69,24 +72,26 @@ export class BgMusic { } return fader; }); - (this.masterFader as GainNode) = context.createGain(); + // @ts-expect-error : RO= + this.masterFader = context.createGain(); merge.connect(this.masterFader); this.masterFader.connect(context.destination); }); } - private reloadSource(): void { + private _reloadSource(): void { const source = this.context.createBufferSource(); source.channelInterpretation = "discrete"; source.loop = true; source.buffer = this.sourceBuffer; source.connect(this.sourceDestination); - (this.source as AudioBufferSourceNode) = source; + // @ts-expect-error : RO= + this.source = source; } public play(): void { - this.reloadSource(); + this._reloadSource(); this.source.start(); } @@ -116,4 +121,4 @@ export namespace BgMusic { },]); } Object.freeze(BgMusic); -Object.freeze(BgMusic.prototype); +Object.freeze(BgMusic.prototype); \ No newline at end of file diff --git a/src/client/audio/SoundEffects.ts b/src/client/audio/SoundEffects.ts index 027859ef..63b83490 100644 --- a/src/client/audio/SoundEffects.ts +++ b/src/client/audio/SoundEffects.ts @@ -12,7 +12,7 @@ export class SoundEffects { public constructor(sfxId: string) { const sfxDesc = SoundEffects.Descs.find((desc) => desc.id === sfxId)!; if (!sfxDesc) { - throw new Error(`sfxDesc with id \`${sfxId}\` does not exist`); + throw Error(`sfxDesc with id \`${sfxId}\` does not exist`); } const context = (this.context) = new AudioContext({ latencyHint: "interactive", @@ -31,4 +31,4 @@ export namespace SoundEffects { },]); } Object.freeze(SoundEffects); -Object.freeze(SoundEffects.prototype); +Object.freeze(SoundEffects.prototype); \ No newline at end of file diff --git a/src/client/game/BrowserGame.ts b/src/client/game/BrowserGame.ts index 9b7782a2..4c945c96 100644 --- a/src/client/game/BrowserGame.ts +++ b/src/client/game/BrowserGame.ts @@ -22,7 +22,8 @@ export class BrowserGameMixin; } Object.freeze(BrowserGameMixin); -Object.freeze(BrowserGameMixin.prototype); +Object.freeze(BrowserGameMixin.prototype); \ No newline at end of file diff --git a/src/client/game/GamePreset.ts b/src/client/game/GamePreset.ts index 3a33421d..0838e7b1 100644 --- a/src/client/game/GamePreset.ts +++ b/src/client/game/GamePreset.ts @@ -6,4 +6,4 @@ export class GamePreset { ; } Object.freeze(GamePreset); -Object.freeze(GamePreset.prototype); +Object.freeze(GamePreset.prototype); \ No newline at end of file diff --git a/src/client/game/OfflineGame.ts b/src/client/game/OfflineGame.ts index e73481fc..78283cf9 100644 --- a/src/client/game/OfflineGame.ts +++ b/src/client/game/OfflineGame.ts @@ -20,9 +20,16 @@ type G = Game.Type.OFFLINE; export class OfflineGame extends GamepartManager implements BrowserGameMixin { + /** + * @override + */ + // @ts-expect-error : Redeclaring accessor as property. declare public currentOperator: NonNullable["currentOperator"]>; - public htmlElements: BrowserGameMixin.HtmlElements; + /** + * @override + */ + declare public htmlElements: BrowserGameMixin.HtmlElements; /** * @param gameDesc - diff --git a/src/client/game/OnlineGame.ts b/src/client/game/OnlineGame.ts index 0a1756c3..91528904 100644 --- a/src/client/game/OnlineGame.ts +++ b/src/client/game/OnlineGame.ts @@ -21,8 +21,15 @@ type G = Game.Type.ONLINE; export class OnlineGame extends GamepartEvents implements BrowserGameMixin { + /** + * @override + */ + // @ts-expect-error : Redeclaring accessor as property. declare public readonly currentOperator: OperatorPlayer; + /** + * @override + */ declare public htmlElements: BrowserGameMixin.HtmlElements; public readonly socket: SocketIOClient.Socket; @@ -35,6 +42,7 @@ extends GamepartEvents implements BrowserGameMixin { * @param gameDesc - This should come from a Server event by the name * {@link Game.CtorArgs.EVENT_NAME}. */ + // TODO.design @all these socket events: expose a way to remove them all when going back to the lobby. public constructor( onGameBecomeOver: () => void, socket: SocketIOClient.Socket, @@ -61,14 +69,18 @@ extends GamepartEvents implements BrowserGameMixin { this.executePlayerBubbleEvent.bind(this), ); - // TODO.impl Send ack? + this.socket.off(Game.Serialization.EVENT_NAME); this.socket.on( Game.Serialization.EVENT_NAME, async (ser: Game.ResetSer) => { await this.reset(); this.deserializeResetState(ser); + // See the PlayOnline screen for the registration of + // listeners for the event SERVER_APPROVE_UNPAUSE. + this.socket.emit(Game.CtorArgs.EVENT_NAME_CLIENT_READY_UNPAUSE); }, ); + this.socket.emit(Game.CtorArgs.EVENT_NAME_CLIENT_READY_RESET); } declare protected readonly _getGridImplementation: BrowserGameMixin["_getGridImplementation"]; @@ -103,4 +115,4 @@ extends GamepartEvents implements BrowserGameMixin { export interface OnlineGame extends BrowserGameMixin {}; applyMixins(OnlineGame, [BrowserGameMixin,]); Object.freeze(OnlineGame); -Object.freeze(OnlineGame.prototype); +Object.freeze(OnlineGame.prototype); \ No newline at end of file diff --git a/src/client/index.ts b/src/client/index.ts index 033c5473..818aac62 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -5,20 +5,28 @@ import { TopLevel } from "./TopLevel"; export { OmHooks } from "defs/OmHooks"; - +Object.freeze(Object.prototype); // window.onerror = (msg, url, lineNum) => { // alert(`Error message: ${msg}\nURL: ${url}\nLine Number: ${lineNum}`); // return true; // } -export const top = new TopLevel(); +// TODO.design instead of exposing top, expose handy function for probing it. +export const _top = new TopLevel(); + +export function screen() { + return _top.currentScreen; +} +export function game() { + return _top.game; +} /** * https://developers.google.com/web/fundamentals/primers/service-workers */ ((): void => { -if (top.webpageHostType === TopLevel.WebpageHostType.GITHUB && "serviceWorker" in navigator) { +if (_top.webpageHostType === TopLevel.WebpageHostType.GITHUB && "serviceWorker" in navigator) { window.addEventListener('load', function() { // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register navigator.serviceWorker.register("/ServiceWorker.js").then( @@ -32,4 +40,4 @@ if (top.webpageHostType === TopLevel.WebpageHostType.GITHUB && "serviceWorker" i // https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Offline_Service_workers }); } -})(); +})(); \ No newline at end of file diff --git a/src/client/screen/AllSkScreens.ts b/src/client/screen/AllSkScreens.ts index 4feada23..0a2707ac 100644 --- a/src/client/screen/AllSkScreens.ts +++ b/src/client/screen/AllSkScreens.ts @@ -20,9 +20,7 @@ import { PlayOnlineScreen } from "./impl/PlayOnline"; */ export class AllSkScreens { - public readonly dict: { - readonly [SID in SkScreen.Id]: SkScreen; - }; + public readonly dict: SkScreen.Dict; #currentScreen: SkScreen; @@ -35,6 +33,8 @@ export class AllSkScreens { const p = baseElem; const f = this.goToScreen.bind(this); this.dict = Object.freeze({ + // TODO.impl turn this into a class that dynamically imports js and css + // for all online-play-related modules together only once needed. [ Id.HOME ]: new HomeScreen(Id.HOME ,t,p,f), [ Id.HOW_TO_PLAY ]: new HowToPlayScreen(Id.HOW_TO_PLAY ,t,p,f), [ Id.HOW_TO_HOST ]: new HowToHostScreen(Id.HOW_TO_HOST ,t,p,f), @@ -54,6 +54,11 @@ export class AllSkScreens { } else { this.goToScreen(SkScreen.Id.HOME, {}); } + window.addEventListener("popstate", (ev: PopStateEvent) => { + // For corresponding calls to pushState and replaceState, + // see SkScreen.enter. + this.goToScreen(...this.currentScreen.getNavPrevArgs()) + }); } /** @@ -61,23 +66,25 @@ export class AllSkScreens { * @param destId - * @param ctorArgs - */ - public goToScreen( + public goToScreen( // NOTE: using a tuple wrapper to expand bundled type. - destId: SID[0], - ctorArgs: SkScreen.CtorArgs, + destId: SID, + ctorArgs: SkScreen.EntranceArgs[SID], + navDir: SkScreen.NavDir = SkScreen.NavDir.FORWARD, ): boolean { - const destScreen = this.dict[destId] as SkScreen; + const destScreen = this.dict[destId]; if (this.currentScreen === destScreen) { // I don't see why this would ever need to happen. // If we find need to write code that allows for this, // rewrite the return-value spec. - throw new Error ("never happens. see comment in source."); + throw "never"; } - if ((!this.currentScreen) || this.currentScreen.leave()) { - // Note on above nullish coalesce: Special case entered + if ((this.currentScreen === undefined) || this.currentScreen._leave(navDir)) { + // Note on above "nullish coalesce": Special case entered // during construction when there is no currentScreen yet. // Any confirm-leave prompts made to the user were OK-ed. - destScreen.enter(ctorArgs); + type enterFunc = (navDir: SkScreen.NavDir, args: typeof ctorArgs) => void; + (destScreen._enter as enterFunc)(navDir, ctorArgs); this.#currentScreen = destScreen; return true; } @@ -89,4 +96,4 @@ export class AllSkScreens { } } Object.freeze(AllSkScreens); -Object.freeze(AllSkScreens.prototype); +Object.freeze(AllSkScreens.prototype); \ No newline at end of file diff --git a/src/client/screen/SkScreen.ts b/src/client/screen/SkScreen.ts index 08e27c5e..705ff51c 100644 --- a/src/client/screen/SkScreen.ts +++ b/src/client/screen/SkScreen.ts @@ -1,9 +1,26 @@ import { OmHooks } from "defs/OmHooks"; +import { StorageHooks } from "defs/StorageHooks"; +import type { Coord } from "floor/Tile"; import type { Game } from "game/Game"; import type { AllSkScreens } from "./AllSkScreens"; import type { TopLevel } from "../TopLevel"; -export { OmHooks }; +import type { HomeScreen } from "./impl/Home"; +import type { HowToPlayScreen } from "./impl/HowToPlay"; +import type { HowToHostScreen } from "./impl/HowToHost"; +import type { ColourCtrlScreen } from "./impl/ColourCtrl"; +// ======== : ~~~ OFFLINE ~~~ :============================ +import type { SetupOfflineScreen } from "./impl/SetupOffline"; +import type { PlayOfflineScreen } from "./impl/PlayOffline"; +// ======== : ~~~ ONLINE ~~~~ :============================ +import type { GroupJoinerScreen } from "./impl/GroupJoiner"; +import type { SetupOnlineScreen } from "./impl/SetupOnline"; +import type { GroupLobbyScreen } from "./impl/GroupLobby"; +import type { PlayOnlineScreen } from "./impl/PlayOnline"; + +export { OmHooks, Coord, StorageHooks }; + +const OMHC = OmHooks.Screen.Class; /** @@ -25,19 +42,46 @@ export abstract class SkScreen { #hasLazyLoaded: boolean; + protected readonly nav: Readonly<{ + /** + * `onclick` callback is registered automatically. Do not overwrite it. + */ + prev: TU.Omit; + next: HTMLButtonElement; + }>; + /** + * Used as the initial screen when arriving at this website via url. * Returns this screen's own id by default. + * + * **IMPORTANT**: Must identify a screen whose `EntranceArgs` is + * of type `{}`. Therefore, screens who don't take `{}` as entry + * arguments must override this method. */ public get initialScreen(): SkScreen.Id { return this.screenId; } + /** + * Used to define the behaviour of the navigation buttons. + * + * **IMPORTANT**: Must pass SkScreen.NavDir.BACKWARD as the `historyDirection` argument. + */ + public getNavPrevArgs(): Parameters { + const defaultDest = SkScreen.NavPrevDest[this.screenId] as SkScreen.Id | undefined; + if (defaultDest) { + return [defaultDest, {}, SkScreen.NavDir.BACKWARD]; + } else { + throw "never"; + } + } /** * Implementations can use this as part of navigation button - * handlers. + * handlers. Refers directly to AllSkScreens.goToScreen. */ protected readonly requestGoToScreen: AllSkScreens["goToScreen"]; + /** * * @param parentElem - @@ -54,12 +98,26 @@ export abstract class SkScreen { this.#parentElem = parentElem; this.requestGoToScreen = requestGoToDisplay; this.#hasLazyLoaded = false; + (this.nav as SkScreen["nav"]) = Object.freeze({ + prev: document.createElement("button"), + next: document.createElement("button"), + }); + this.nav.prev.classList.add(OMHC.NAV_PREV); + this.nav.next.classList.add(OMHC.NAV_NEXT); + this.nav.prev.textContent = "Back"; + this.nav.next.textContent = "Next"; + (this.nav.prev as HTMLButtonElement).onclick = (ev) => { + this.requestGoToScreen(...this.getNavPrevArgs()); + }; } /** * **Do not override.** */ - public async enter(args: SkScreen.CtorArgs): Promise { + public async _enter( + navDir: SkScreen.NavDir, + args: SkScreen.EntranceArgs[SID], + ): Promise { if (!this.#hasLazyLoaded) { const baseElem = (this.baseElem as HTMLElement) @@ -79,10 +137,18 @@ export abstract class SkScreen { } this.#hasLazyLoaded = true; } - const location = new window.URL(window.location.href); - location.hash = this.screenId; - history.replaceState(null, "", location.href); - await this._abstractOnBeforeEnter(args); + { + const location = new window.URL(window.location.href); + location.hash = this.screenId; + const args = [{ screenId: this.screenId, }, "", location.href]; + switch (navDir) { + case SkScreen.NavDir.BACKWARD: history.replaceState(...args); break; + case SkScreen.NavDir.FORWARD: history.pushState( ...args); break; + default: throw "never"; + } + } + + await this._abstractOnBeforeEnter(navDir, args); // ^Wait until the screen has finished setting itself up // before entering it. window.requestAnimationFrame((time) => { @@ -96,8 +162,8 @@ export abstract class SkScreen { * * @returns false if the leave was cancelled. */ - public leave(): boolean { - if (this._abstractOnBeforeLeave()) { + public _leave(navDir: SkScreen.NavDir): boolean { + if (this._abstractOnBeforeLeave(navDir)) { delete this.baseElem.dataset[OmHooks.Screen.Dataset.CURRENT]; // non-existant. this.baseElem.setAttribute("aria-hidden", "true"); return true; @@ -120,7 +186,7 @@ export abstract class SkScreen { * Important: Calls to `HTMLElement.focus` may require a small delay * via setTimeout. The reason for this is currently unknown. */ - protected async _abstractOnBeforeEnter(args: SkScreen.CtorArgs): Promise { } + protected async _abstractOnBeforeEnter(navDir: SkScreen.NavDir, args: SkScreen.EntranceArgs[SID]): Promise { } /** * Return false if the leave should be cancelled. This functionality @@ -130,7 +196,7 @@ export abstract class SkScreen { * This is a good place, for example, to stop any non-essential * `setInterval` schedules. */ - protected _abstractOnBeforeLeave(): boolean { + protected _abstractOnBeforeLeave(navDir: SkScreen.NavDir): boolean { return true; } @@ -153,17 +219,63 @@ export namespace SkScreen { PLAY_ONLINE = "playOnline", // ======= =================== } + export interface Dict { + [ Id.HOME ]: HomeScreen; + [ Id.HOW_TO_PLAY ]: HowToPlayScreen; + [ Id.HOW_TO_HOST ]: HowToHostScreen; + [ Id.COLOUR_CTRL ]: ColourCtrlScreen; + //================== + [ Id.SETUP_OFFLINE ]: SetupOfflineScreen; + [ Id.PLAY_OFFLINE ]: PlayOfflineScreen; + //================== + [ Id.GROUP_JOINER ]: GroupJoinerScreen; + [ Id.GROUP_LOBBY ]: GroupLobbyScreen; + [ Id.SETUP_ONLINE ]: SetupOnlineScreen; + [ Id.PLAY_ONLINE ]: PlayOnlineScreen; + } + export interface EntranceArgs { + [ Id.HOME ]: {}; + [ Id.HOW_TO_PLAY ]: {}; + [ Id.HOW_TO_HOST ]: {}; + [ Id.COLOUR_CTRL ]: {}; + //================== + [ Id.SETUP_OFFLINE ]: {}; + [ Id.PLAY_OFFLINE ]: Game.CtorArgs; + //================== + [ Id.GROUP_JOINER ]: {}; + [ Id.GROUP_LOBBY ]: {}; + [ Id.SETUP_ONLINE ]: {}; + [ Id.PLAY_ONLINE ]: Game.CtorArgs; + } + /** + * Note: The fact that the lobby precedes the online setup screen + * for the group host is important, since the socket listener for + * UserInfoChange events is only registered in the lobby screen. + */ + export const NavPrevDest = Object.freeze({ + [ Id.HOME ]: Id.HOME, + [ Id.HOW_TO_PLAY ]: Id.HOME, + [ Id.HOW_TO_HOST ]: Id.HOME, + [ Id.COLOUR_CTRL ]: Id.HOME, + //================== + [ Id.SETUP_OFFLINE ]: Id.HOME, + [ Id.PLAY_OFFLINE ]: Id.SETUP_OFFLINE, + //================== + [ Id.GROUP_JOINER ]: Id.HOME, + [ Id.GROUP_LOBBY ]: Id.GROUP_JOINER, + [ Id.SETUP_ONLINE ]: Id.GROUP_LOBBY, + [ Id.PLAY_ONLINE ]: Id.SETUP_ONLINE, + }); + + export const enum NavDir { + FORWARD = "forward", + BACKWARD = "backward", + }; - export type CtorArgs - = any extends SID_group ? never - : { [SID in SID_group]: - SID extends SkScreen.Id.PLAY_OFFLINE ? Game.CtorArgs - : SID extends SkScreen.Id.PLAY_ONLINE ? Game.CtorArgs - : SID extends SkScreen.Id ? {} - // ^Placeholder for screens that don't - // require any entrance arguments. - : never - }[SID_group]; + /** + * Helper type for overriding SkScreen.getNavPrevArgs. + */ + export type NavPrevRet = [SID, SkScreen.EntranceArgs[SID], NavDir.BACKWARD]; } Object.freeze(SkScreen); Object.freeze(SkScreen.prototype); diff --git a/src/client/screen/impl/ColourCtrl.ts b/src/client/screen/impl/ColourCtrl.ts index 6fc998ba..a2a4e329 100644 --- a/src/client/screen/impl/ColourCtrl.ts +++ b/src/client/screen/impl/ColourCtrl.ts @@ -47,7 +47,6 @@ export namespace ColourCtrlScreen { super(); this.baseElem.classList.add(OMHC.BASE); this.garageDoorElem = document.getElementById(OmHooks.Screen.Id.SCREEN_TINT)!; - if (!this.garageDoorElem) throw new Error; this.garageDoorElem.style.transitionDuration = (Colour.SMOOTH_CHANGE_DURATION/3.0) + "ms"; Colour.Schemes.forEach((schemeDesc) => { @@ -193,4 +192,4 @@ export namespace Colour { */ export const SMOOTH_CHANGE_DURATION = 2_000.0; } -Object.freeze(Colour); +Object.freeze(Colour); \ No newline at end of file diff --git a/src/client/screen/impl/GroupJoiner.ts b/src/client/screen/impl/GroupJoiner.ts index a8e29953..f8db45f6 100644 --- a/src/client/screen/impl/GroupJoiner.ts +++ b/src/client/screen/impl/GroupJoiner.ts @@ -2,24 +2,27 @@ import type { TopLevel } from "../../TopLevel"; import { Group } from "defs/OnlineDefs"; import { SkServer } from "defs/OnlineDefs"; -import { OmHooks, SkScreen } from "../SkScreen"; - +import { OmHooks, SkScreen, StorageHooks } from "../SkScreen"; +type SID = SkScreen.Id.GROUP_JOINER; /** * This screen is like a form for joining a session on a remote host. */ -export class GroupJoinerScreen extends SkScreen { +export class GroupJoinerScreen extends SkScreen { #state: GroupJoinerScreen.State; - private readonly hostUrlInput: HTMLInputElement; + private readonly in: Readonly<{ + hostUrl: HTMLInputElement; + groupName: HTMLInputElement; + passphrase: HTMLInputElement; + }>; private readonly groupNameDataList: HTMLDataListElement; - private readonly groupNameInput: HTMLInputElement; - private readonly passphraseInput: HTMLInputElement; - private readonly backButton: HTMLButtonElement; - private readonly nextButton: HTMLInputElement; - private isGroupOwner: boolean; + #clientIsGroupHost: boolean = false; + public get clientIsGroupHost(): boolean { + return this.#clientIsGroupHost; + } /** * @override @@ -34,13 +37,16 @@ export class GroupJoinerScreen extends SkScreen { this._initializeGroupNameHandlers(huiSubmit); this._initializePassphraseHandlers(); - contentWrapper.onsubmit = (ev) => { - // TODO change the screen nav flow to use the correct (commented out) values. - if (this.isGroupOwner) { - this.requestGoToScreen(SkScreen.Id.SETUP_ONLINE, {}); - } else { - this.requestGoToScreen(SkScreen.Id.GROUP_LOBBY, {}); - } + // Note: externalized from `_initializeFormContents` for visibility. + this.nav.next.onclick = (ev) => { + // Using a plain button instead of is + // better here since we don't want any magical form behaviour. + contentWrapperSubmit(); + } + const contentWrapperSubmit = () => { + // ev.preventDefault(); // Don't try sending anything to the server. + // No validation needed. The next button is only enabled if inputs are valid. + this.requestGoToScreen(SkScreen.Id.GROUP_LOBBY, {}); }; this._setFormState(State.CHOOSING_HOST); this.baseElem.appendChild(contentWrapper); @@ -49,16 +55,17 @@ export class GroupJoinerScreen extends SkScreen { /** * @override */ - protected async _abstractOnBeforeEnter(args: {}): Promise { + protected async _abstractOnBeforeEnter(navDir: SkScreen.NavDir, args: SkScreen.EntranceArgs[SID]): Promise { window.setTimeout(() => { if (this.socket && this.socket.nsp.startsWith(SkServer.Nsps.GROUP_LOBBY_PREFIX)) { // Default to switching groups under the same host: - this.groupNameInput.focus(); + this.in.groupName.focus(); } else { // We aren't connected to a host, or aren't yet in a group: - this.hostUrlInput.focus(); + this.in.hostUrl.focus(); } }, 100); // <-- An arbitrary short period of time. See super doc. + return; } public get state(): State { @@ -75,28 +82,28 @@ export class GroupJoinerScreen extends SkScreen { if (newState === State.IN_GROUP) { if (this.state !== State.CHOOSING_GROUP) { - throw new Error("never"); // Illegal state transition. + throw "never"; // Illegal state transition. } - this.passphraseInput.disabled = true; - this.nextButton.disabled = false; - this.nextButton.focus(); + this.in.passphrase.disabled = true; + this.nav.next.disabled = false; + this.nav.next.focus(); } else { - this.nextButton.disabled = true; + this.nav.next.disabled = true; if (newState === State.CHOOSING_HOST) { - this.groupNameInput.disabled = true; - this.groupNameInput.value = ""; + this.in.groupName.disabled = true; + this.in.groupName.value = ""; // Fun fact on an alternative for clearing children: https://stackoverflow.com/a/22966637/11107541 this.groupNameDataList.innerText = ""; - this.passphraseInput.disabled = true; - this.passphraseInput.value = ""; - this.hostUrlInput.focus(); + this.in.passphrase.disabled = true; + this.in.passphrase.value = ""; + this.in.hostUrl.focus(); ; } else if (newState === State.CHOOSING_GROUP) { - this.groupNameInput.disabled = false; - this.passphraseInput.disabled = false; - this.groupNameInput.focus(); + this.in.groupName.disabled = false; + this.in.passphrase.disabled = false; + this.in.groupName.focus(); } } this.#state = newState; @@ -107,24 +114,25 @@ export class GroupJoinerScreen extends SkScreen { */ private _initializeHostUrlHandlers(): () => Promise { const top = this.top; - const input = this.hostUrlInput; + const input = this.in.hostUrl; const submitInput = async (): Promise => { + // Short-circuit on invalid input: + if (!input.value || !input.validity.valid) return; + // Minor cleaning: default the protocol and only use the origin: if (!input.value.startsWith(SkServer.PROTOCOL)) { - input.value = new URL(SkServer.PROTOCOL + input.value).origin; + input.value = new window.URL(SkServer.PROTOCOL + input.value).origin; } - // Short-circuit on invalid input: - if (!input.value || !input.validity.valid) return; // Short-circuit when no change has occurred: - const targetSocketUri = new URL(input.value + SkServer.Nsps.GROUP_JOINER); + const targetSocketUri = new window.URL(input.value + SkServer.Nsps.GROUP_JOINER); if (this.socket && this.socket.nsp === SkServer.Nsps.GROUP_JOINER && this.socket.io.opts.hostname === targetSocketUri.hostname ) { if (this.socket!.connected) { this._setFormState(State.CHOOSING_GROUP); - this.groupNameInput.focus(); // No changes have occurred. + this.in.groupName.focus(); // No changes have occurred. return; } else { return; // Impatient client is spamming. @@ -137,7 +145,7 @@ export class GroupJoinerScreen extends SkScreen { this.socket.on("connect", () => { this._setFormState(State.CHOOSING_GROUP); // Listen for group creation / deletion events. - this.socket!.on(Group.Exist.EVENT_NAME, this.onNotifyGroupExist.bind(this)); + this.socket!.on(Group.Exist.EVENT_NAME, this._onNotifyGroupExist.bind(this)); }); this.socket.on("connect_error", (error: object) => { this.socket = undefined; @@ -168,69 +176,72 @@ export class GroupJoinerScreen extends SkScreen { /** * */ - private onNotifyGroupExist(response: Group.Exist.NotifyStatus): void { + private _onNotifyGroupExist(response: Group.Exist.NotifyStatus): void { if (response === Group.Exist.RequestCreate.Response.NOPE) { this.top.toast(`The server rejected your request to` - + ` create a new group \"${this.groupNameInput.value}\".`); + + ` create a new group \"${this.in.groupName.value}\".`); return; } + if (response === Group.Exist.RequestCreate.Response.OKAY) { + this.top.toast(`server accepted request to create new group \"${this.in.groupName.value}\".`); + this.top.toast("connecting to new group..."); + this._attemptToJoinExistingGroup(); + return; + } + const makeOption = (groupName: Group.Name): HTMLOptionElement => { + // If we didn't know about this group yet, create a new + // option for it (Insert into list in alphabetical order): + const newOpt = document.createElement("option"); + newOpt.value = groupName; + //console.log(newOpt.value); + for (const otherOpt of dataListArr) { + if (newOpt.value.localeCompare(otherOpt.value) < 0) { + dataList.insertBefore(newOpt, otherOpt); + break; + } + } + if (!newOpt.parentElement) { + dataList.appendChild(newOpt); + } + return newOpt; + }; const dataList = this.groupNameDataList; const dataListArr = Array.from(dataList.children) as HTMLOptionElement[]; - for (const [groupName, status,] of Object.entries(response)) { + Object.entries(response).forEach(([groupName, status,]) => { const optElem = dataListArr.find((opt: HTMLOptionElement) => opt.value === groupName) - || (() => { - // If we didn't know about this group yet, create a new - // option for it (Insert into list in alphabetical order): - const newOpt = document.createElement("option"); - newOpt.value = groupName; - for (const otherOpt of dataListArr) { - if (newOpt.value.localeCompare(otherOpt.value) < 0) { - dataList.insertBefore(newOpt, otherOpt); - break; - } - } - if (!newOpt.parentElement) { - dataList.appendChild(newOpt); - } - return newOpt; - })(); + || makeOption(groupName); switch (status) { case Group.Exist.Status.IN_LOBBY: - optElem.remove(); + optElem.textContent = "In Lobby"; break; case Group.Exist.Status.IN_GAME: optElem.textContent = "In Game"; break; case Group.Exist.Status.DELETE: - optElem.textContent = "In Lobby"; + optElem.remove(); break; } - } - if (response === Group.Exist.RequestCreate.Response.OKAY) { - console.info(`server accepted request to create new group \`${this.groupNameInput.value}\`.`); - console.log("connecting to new group..."); - this.attemptToJoinExistingGroup(); - } + }); } private _initializeGroupNameHandlers(huiSubmit: () => Promise): void { - const input = this.groupNameInput; + const input = this.in.groupName; const submitInput = (): void => { if (!input.value || !input.validity.valid) return; if (this.state === State.IN_GROUP) { - this.nextButton.focus(); + this.nav.next.focus(); } else { - this.passphraseInput.focus(); + this.in.passphrase.focus(); } }; - this.groupNameInput.oninput = async (ev) => { + this.in.groupName.oninput = async (ev) => { if (this.state === State.IN_GROUP) { await huiSubmit(); // ^This will take us back to the state `CHOOSING_GROUP`. } - this.passphraseInput.value = ""; - this.isGroupOwner = false; // <-- Not necessary. Just feels nice to do. + this.in.passphrase.value = ""; + this.#clientIsGroupHost = false; // <-- Not necessary. Just feels nice to do. }; input.onkeydown = (ev) => { if (ev.key === "Enter") { submitInput(); @@ -245,12 +256,12 @@ export class GroupJoinerScreen extends SkScreen { */ private _initializePassphraseHandlers(): void { const submitInput = async (): Promise => { - if (!this.passphraseInput.validity.valid) return; + if (!this.in.passphrase.validity.valid) return; // Short-circuit when no change has occurred: - if (this.socket!.nsp === SkServer.Nsps.GROUP_LOBBY_PREFIX + this.groupNameInput.value) { + if (this.socket!.nsp === SkServer.Nsps.GROUP_LOBBY_PREFIX + this.in.groupName.value) { if (this.socket!.connected) { this._setFormState(State.IN_GROUP); - this.nextButton.focus(); // No changes have occurred. + this.nav.next.focus(); // No changes have occurred. return; } else { return; // Impatient client is spamming. @@ -258,21 +269,21 @@ export class GroupJoinerScreen extends SkScreen { } const groupExists = (Array.from(this.groupNameDataList.children) as HTMLOptionElement[]) - .some((opt) => opt.value === this.groupNameInput.value); + .some((opt) => opt.value === this.in.groupName.value); if (groupExists) { - this.isGroupOwner = false; - await this.attemptToJoinExistingGroup(); + this.#clientIsGroupHost = false; + await this._attemptToJoinExistingGroup(); } else { - this.isGroupOwner = true; + this.#clientIsGroupHost = true; this.socket!.emit(Group.Exist.EVENT_NAME, new Group.Exist.RequestCreate( - this.groupNameInput.value, - this.passphraseInput.value, + this.in.groupName.value, + this.in.passphrase.value, ), ); } }; - this.passphraseInput.onkeydown = (ev) => { if (ev.key === "Enter") { + this.in.passphrase.onkeydown = (ev) => { if (ev.key === "Enter") { submitInput(); }}; } @@ -280,16 +291,20 @@ export class GroupJoinerScreen extends SkScreen { /** * */ - private async attemptToJoinExistingGroup(): Promise { + private async _attemptToJoinExistingGroup(): Promise { const url = (() => { - const url = new URL(this.hostUrlInput.value); - url.pathname = SkServer.Nsps.GROUP_LOBBY_PREFIX + this.groupNameInput.value; + const url = new window.URL(this.in.hostUrl.value); + url.pathname = SkServer.Nsps.GROUP_LOBBY_PREFIX + this.in.groupName.value; return url.toString(); })(); this.socket?.close(); const top = this.top; + const userInfo = StorageHooks.getLastUserInfo(); this.socket = (await top.socketIo)(url, { - query: { passphrase: this.passphraseInput.value, }, + query: { + passphrase: this.in.passphrase.value, + userInfo, + }, }); this.socket.on("connect", () => { this._setFormState(State.IN_GROUP); @@ -302,7 +317,7 @@ export class GroupJoinerScreen extends SkScreen { if (reason === "io server disconnect") { this.socket = undefined; top.toast("The server disconnected you from your group."); - this.requestGoToScreen(SkScreen.Id.GROUP_JOINER, {}); + this.requestGoToScreen(SkScreen.Id.GROUP_JOINER, {}, SkScreen.NavDir.BACKWARD); } }); } @@ -317,16 +332,22 @@ export class GroupJoinerScreen extends SkScreen { /** * A helper for `_lazyLoad`. Does not hook up event processors. */ - private _initializeFormContents(): HTMLFormElement { + private _initializeFormContents(): HTMLElement { + // @ts-expect-error : RO= + this.in = {}; const OMHC = OmHooks.Screen.Impl.GroupJoiner.Class; - const contentWrapper = document.createElement("form"); + const contentWrapper = document.createElement("div"/*"form"*/); + // contentWrapper.method = "POST"; // Not actually used, since the default onsubmit behaviour is prevented. contentWrapper.classList.add( OmHooks.General.Class.INPUT_GROUP, OMHC.CONTENT_WRAPPER, ); - function createGenericTextInput(labelText: string): HTMLInputElement { + this.nav.prev.classList.add(OmHooks.General.Class.INPUT_GROUP_ITEM); + contentWrapper.appendChild(this.nav.prev); + + function createGenericTextInput(labelText: string, classStr: string): HTMLInputElement { const input = document.createElement("input"); - input.classList.add(OmHooks.General.Class.INPUT_GROUP_ITEM); + input.classList.add(OmHooks.General.Class.INPUT_GROUP_ITEM, classStr); input.type = "text"; input.autocomplete = "off"; input.spellcheck = false; @@ -337,12 +358,14 @@ export class GroupJoinerScreen extends SkScreen { contentWrapper.appendChild(label); return input; }{ - const hostUrl - = (this.hostUrlInput as HTMLElement) - = createGenericTextInput("Host URL"); - hostUrl.type = "url"; - hostUrl.classList.add(OMHC.HOST_URL); - hostUrl.autocomplete = "on"; + // @ts-expect-error : RO= + const hostUrl = this.in.hostUrl + = Object.assign(createGenericTextInput("Host URL", OMHC.HOST_URL), >{ + type: "url", + maxLength: 128, + autocomplete: "on", + required: true, + }); const suggestedHostDesc = GroupJoinerScreen.SUGGEST_HOST(this.top.webpageHostType); if (suggestedHostDesc) { const suggestOpt = document.createElement("option"); @@ -352,39 +375,35 @@ export class GroupJoinerScreen extends SkScreen { .insertAdjacentElement("afterbegin", suggestOpt); } hostUrl.setAttribute("list", OmHooks.GLOBAL_IDS.PUBLIC_GAME_HOST_URLS); - hostUrl.maxLength = 128; }{ - const nspsName - = (this.groupNameInput as HTMLElement) - = createGenericTextInput("Group Name"); - nspsName.classList.add(OMHC.GROUP_NAME); - nspsName.pattern = Group.Name.REGEXP.source; - nspsName.maxLength = Group.Name.MaxLength; - const nspsList - = (this.groupNameDataList as HTMLElement) + // @ts-expect-error : RO= + const nspsName = this.in.groupName + = Object.assign(createGenericTextInput("Group Name", OMHC.GROUP_NAME), + >{ + pattern: Group.Name.REGEXP.source, + minLength: 1, + maxLength: Group.Name.MaxLength, + autocomplete: "on", + required: true, + }); + // @ts-expect-error : RO= + const nspsList = this.groupNameDataList = document.createElement("datalist"); nspsList.id = OmHooks.GLOBAL_IDS.CURRENT_HOST_GROUPS; this.baseElem.appendChild(nspsList); nspsName.setAttribute("list", nspsList.id); }{ const pass - = (this.passphraseInput as HTMLElement) - = createGenericTextInput("Group Passphrase"); - pass.classList.add(OMHC.PASSPHRASE); + // @ts-expect-error : RO= + = this.in.passphrase + = createGenericTextInput("Group Passphrase", OMHC.PASSPHRASE); pass.pattern = Group.Passphrase.REGEXP.source; pass.maxLength = Group.Passphrase.MaxLength; }{ - const nextBtn - = (this.nextButton as HTMLElement) - = document.createElement("input"); - nextBtn.type = "submit"; - nextBtn.classList.add( - OmHooks.General.Class.INPUT_GROUP_ITEM, - OMHC.NEXT_BUTTON, - ); - nextBtn.textContent = nextBtn.value = "Next"; - contentWrapper.appendChild(nextBtn); + this.nav.next.classList.add(OmHooks.General.Class.INPUT_GROUP_ITEM); + contentWrapper.appendChild(this.nav.next); } + Object.freeze(this.in); return contentWrapper; } } diff --git a/src/client/screen/impl/GroupLobby.ts b/src/client/screen/impl/GroupLobby.ts index 0bd669c0..2b9e91f0 100644 --- a/src/client/screen/impl/GroupLobby.ts +++ b/src/client/screen/impl/GroupLobby.ts @@ -1,15 +1,29 @@ +import { Player } from "defs/TypeDefs"; +import { Group } from "defs/OnlineDefs"; import { Game } from "game/Game"; -import { OmHooks, SkScreen } from "../SkScreen"; - - +import { OmHooks, Coord, SkScreen, StorageHooks } from "../SkScreen"; type SID = SkScreen.Id.GROUP_LOBBY; +const OMHC = OmHooks.Screen.Impl.GroupLobby.Class; /** * */ export class GroupLobbyScreen extends SkScreen { + private readonly _players: Record; + private readonly teamsElem: HTMLElement; + private readonly teamElems: Record; + + private readonly in: Readonly<{ + username: HTMLInputElement; + teamId: HTMLInputElement; + avatar: HTMLSelectElement; + }>; + + /** + * @override + */ public get initialScreen(): SkScreen.Id { return SkScreen.Id.GROUP_JOINER; } @@ -18,34 +32,221 @@ export class GroupLobbyScreen extends SkScreen { * @override */ protected _lazyLoad(): void { - ; + // @ts-expect-error : RO= + this._players = {}; + this._createInputs(); + this.nav.prev.textContent = "Return To Joiner"; + + /* @ts-expect-error : RO= */ + {this.teamsElem = document.createElement("div"); + this.teamsElem.classList.add(OMHC.SEC_TEAMS); + this.baseElem.appendChild(this.teamsElem);} + + // @ts-expect-error : RO= + this.teamElems = {}; + + {const goSetup = this.nav.next; + goSetup.textContent = "Setup Game"; + goSetup.onclick = () => { + this.requestGoToScreen(SkScreen.Id.SETUP_ONLINE, {}); + } + this.baseElem.appendChild(goSetup);} } /** - * @override */ - protected _abstractOnBeforeEnter(args: SkScreen.CtorArgs): Promise { - - // Listen for when the server sends tbe game constructor arguments: - this.top.socket!.once( - Game.CtorArgs.EVENT_NAME, - async (gameCtorArgs: Game.CtorArgs) => { - this.requestGoToScreen(SkScreen.Id.PLAY_ONLINE, gameCtorArgs); - }, + private _createInputs(): void { + const base = document.createElement("div"); + base.classList.add( + OmHooks.General.Class.INPUT_GROUP, + OMHC.SEC_CLIENT_INFO, ); - return Promise.resolve(); + + const uname = Object.assign(document.createElement("input"), >{ + type : "text", + minLength : 1, + maxLength : Player.Username.MAX_LENGTH, + pattern : Player.Username.REGEXP.source, + value : localStorage.getItem(StorageHooks.LocalKeys.USERNAME) ?? "", + onchange : this._submitInputs.bind(this), + }); + uname.classList.add(OmHooks.General.Class.INPUT_GROUP_ITEM); + base.appendChild(uname); + + const teamId = Object.assign(document.createElement("input"), >{ + type : "number", + min : "0", + max : "0", + step : "1", + value : "0", + onchange : this._submitInputs.bind(this), + }); + teamId.classList.add(OmHooks.General.Class.INPUT_GROUP_ITEM); + base.appendChild(teamId); + + const avatar = document.createElement("select"); + // TODO.impl avatar selection element + + // @ts-expect-error : RO= + this.in = Object.freeze({ + username: uname, + teamId, + avatar, + }); + this.baseElem.appendChild(base); } + private _submitInputs(): void { + if (!this.in.username.validity.valid || !this.in.teamId.validity.valid) { + return; + } + localStorage.setItem(StorageHooks.LocalKeys.USERNAME, this.in.username.value); + localStorage.setItem(StorageHooks.LocalKeys.AVATAR, this.in.avatar.value); + this.top.socket!.emit(Group.Socket.UserInfoChange.EVENT_NAME, { + username: this.in.username.value, + teamId: parseInt(this.in.teamId.value), + avatar: Player.Avatar.LOREM_IPSUM, // TODO.impl add an input field for `userInfo.avatar`. + }); + }; /** * @override */ - protected _abstractOnBeforeLeave(): boolean { - // Make sure we stop listening for the game to start - // in case it hasn't started yet: - this.top.socket!.removeListener(Game.CtorArgs.EVENT_NAME); + protected async _abstractOnBeforeEnter(navDir: SkScreen.NavDir, args: SkScreen.EntranceArgs[SID]): Promise { + if (navDir === "forward") { + this.nav.next.disabled = !this.top.clientIsGroupHost; + this.teamsElem.textContent = ""; + this._submitInputs(); + this.top.socket!.on( + Group.Socket.UserInfoChange.EVENT_NAME, + this._onUserInfoChange.bind(this), + ); + // Listen for when the server sends tbe game constructor arguments: + this.top.socket!.once( + Game.CtorArgs.Event.NAME, + async (gameCtorArgs: Game.CtorArgs) => { + this.requestGoToScreen(SkScreen.Id.PLAY_ONLINE, gameCtorArgs); + }, + ); + } + } + + /** + * @override + */ + protected _abstractOnBeforeLeave(navDir: SkScreen.NavDir): boolean { + if (navDir === SkScreen.NavDir.BACKWARD) { + // Make sure we stop listening for the game to start + // in case it hasn't started yet: + this.top.socket!.removeListener(Game.CtorArgs.Event.NAME); + } return true; } + + /** + */ + private _onUserInfoChange(res: Group.Socket.UserInfoChange.Res): void { + Object.entries(res).forEach(([socketId, desc]) => { + const userInfo = this._players[socketId]; + + // If player is in a team on their own and they are leaving it: + if (userInfo && this.teamElems[userInfo.teamId].childElementCount === 1 + && (desc === undefined || desc.teamId !== userInfo.teamId)) { + this.teamElems[userInfo.teamId].remove(); + delete this.teamElems[userInfo.teamId]; + } + + // If player is joining a team that has no HTML element yet: + if (desc && this.teamElems[desc.teamId] === undefined) { + const teamElem = this.teamElems[desc.teamId] = document.createElement("div"); + teamElem.classList.add(OMHC.TEAM); + teamElem.onclick = (ev) => { + this.in.teamId.value = desc.teamId.toString(); + } + this.teamsElem.appendChild(teamElem); + } + + if (desc === undefined) { + // Player has left the group: + userInfo.base.remove(); + delete this._players[socketId]; + } else if (userInfo === undefined) { + // New player has joined the group: + const userInfo + = this._players[socketId] + = new GroupLobbyScreen.UserInfo(desc); + this.teamElems[desc.teamId].appendChild(userInfo.base); + } else { + // Player changed their user information: + userInfo.update(desc); + } + }); + this.in.teamId.max = Object.keys(this._players).length.toString(); + } +} +export namespace GroupLobbyScreen { + /** + */ + export class UserInfo implements Player.UserInfo { + #username: Player.Username; + #teamId: number; + #avatar: Player.Avatar; + + public base: HTMLElement; + private el: Readonly<{ + username: HTMLElement; + teamId: HTMLElement; + avatar: HTMLElement; + }>; + + public constructor(desc: Player.UserInfo) { + this.base = document.createElement("div"); + this.base.classList.add(OMHC.PLAYER); + const mkDiv = (): HTMLDivElement => { + const div = document.createElement("div"); + this.base.appendChild(div); + return div; + } + this.el = Object.freeze({ + username: mkDiv(), + teamId: mkDiv(), + avatar: mkDiv(), + }); + this.el.username.classList.add(OMHC.PLAYER_NAME); + this.username = desc.username; + this.teamId = desc.teamId; + } + + public update(desc: Player.UserInfo): void { + this.username = desc.username; + this.teamId = desc.teamId; + this.avatar = desc.avatar; + }; + + public get username(): Player.Username { + return this.#username; + } + public set username(newUsername: Player.Username) { + this.el.username.textContent = newUsername; + this.#username = newUsername; + } + + public get teamId(): number { + return this.#teamId; + } + public set teamId(newTeamId: number) { + this.el.teamId.textContent = newTeamId.toString(); + this.#teamId = newTeamId; + } + + public get avatar(): Player.Avatar { + return this.#avatar; + } + public set avatar(newAvatar: Player.Avatar) { + this.#avatar = newAvatar; + this.el.avatar; // TODO.impl set the avatar image. + } + } } Object.freeze(GroupLobbyScreen); -Object.freeze(GroupLobbyScreen.prototype); +Object.freeze(GroupLobbyScreen.prototype); \ No newline at end of file diff --git a/src/client/screen/impl/Home.ts b/src/client/screen/impl/Home.ts index 50c26600..2a38496a 100644 --- a/src/client/screen/impl/Home.ts +++ b/src/client/screen/impl/Home.ts @@ -20,7 +20,8 @@ export class HomeScreen extends SkScreen { ); const nav - = (this.navElem as HTMLElement) + // @ts-expect-error : RO= + = this.navElem = document.createElement("div"); nav.classList.add( OmHooks.General.Class.TEXT_SELECT_DISABLED, @@ -45,7 +46,7 @@ export class HomeScreen extends SkScreen { elem.focus(); }); // TODO.impl play a keyboard click sound. - this.top.sfx; + // this.top.sfx; }); nav.appendChild(elem); }; @@ -82,6 +83,7 @@ export class HomeScreen extends SkScreen { const button = document.createElement("button"); button.onclick = (desc.screenId instanceof Function) ? desc.screenId : () => { // TODO.impl play a health-up sound. + // this.top.sfx.; this.requestGoToScreen(desc.screenId as SkScreen.Id, {}); }; addToNav(button, desc); @@ -114,4 +116,4 @@ export class HomeScreen extends SkScreen { } } Object.freeze(HomeScreen); -Object.freeze(HomeScreen.prototype); +Object.freeze(HomeScreen.prototype); \ No newline at end of file diff --git a/src/client/screen/impl/HowToHost.ts b/src/client/screen/impl/HowToHost.ts index d3ac0c1e..51185e5f 100644 --- a/src/client/screen/impl/HowToHost.ts +++ b/src/client/screen/impl/HowToHost.ts @@ -22,4 +22,4 @@ export namespace HowToHostScreen { ]); } Object.freeze(HowToHostScreen); -Object.freeze(HowToHostScreen.prototype); +Object.freeze(HowToHostScreen.prototype); \ No newline at end of file diff --git a/src/client/screen/impl/HowToPlay.ts b/src/client/screen/impl/HowToPlay.ts index 6d1098d6..d25d3b50 100644 --- a/src/client/screen/impl/HowToPlay.ts +++ b/src/client/screen/impl/HowToPlay.ts @@ -12,7 +12,6 @@ export class HowToPlayScreen extends SkScreen { protected _lazyLoad(): void { ; } - } Object.freeze(HowToPlayScreen); -Object.freeze(HowToPlayScreen.prototype); +Object.freeze(HowToPlayScreen.prototype); \ No newline at end of file diff --git a/src/client/screen/impl/Play.ts b/src/client/screen/impl/Play.ts index ed7ca584..9b567730 100644 --- a/src/client/screen/impl/Play.ts +++ b/src/client/screen/impl/Play.ts @@ -4,7 +4,7 @@ import { SCROLL_INTO_CENTER } from "defs/TypeDefs"; // import type { OnlineGame } from "../../game/OnlineGame"; import type { BrowserGameMixin } from "../../game/BrowserGame"; -import { OmHooks, SkScreen } from "../SkScreen"; +import { OmHooks, Coord, SkScreen } from "../SkScreen"; /** * If and only if this screen is the current screen, then its @@ -17,7 +17,7 @@ import { OmHooks, SkScreen } from "../SkScreen"; export abstract class _PlayScreen< SID extends SkScreen.Id.PLAY_OFFLINE | SkScreen.Id.PLAY_ONLINE, G extends Game.Type.Browser, - Game extends BrowserGameMixin = BrowserGameMixin, + Game extends BrowserGameMixin = BrowserGameMixin, > extends SkScreen { /** @@ -30,8 +30,6 @@ export abstract class _PlayScreen< private readonly playersBar: HTMLElement; - private readonly backToHomeButton: HTMLButtonElement; - /** * Must be disabled when * - The game does not exist. @@ -52,14 +50,11 @@ export abstract class _PlayScreen< * so there's no question that it can, under certain conditions be * undefined. */ - // #currentGame: undefined | any extends G ? never : {[G_ in G]: - // G extends Game.Type.OFFLINE ? OfflineGame - // : G extends Game.Type.ONLINE ? OnlineGame - // : never - // }[G]; #currentGame: undefined | Game; protected abstract readonly wantsAutoPause: boolean; + + protected abstract readonly askConfirmBeforeLeave: boolean; /** * Automatically added and removed from listeners when entering * and leaving this screen. @@ -86,8 +81,10 @@ export abstract class _PlayScreen< ); const gridHtml = _PlayScreen.createCenterColElem(); - (this._gridBaseElem as HTMLElement) = gridHtml.grid; - (this._gridImplHost as HTMLElement) = gridHtml.implHost; + // @ts-expect-error : RO= + this._gridBaseElem = gridHtml.grid; + // @ts-expect-error : RO= + this._gridImplHost = gridHtml.implHost; this._gridImplHost.appendChild(document.createComment("grid impl host")); this.baseElem.appendChild(gridHtml.top); gridHtml.pauseOl.addEventListener("click", (ev) => { @@ -142,19 +139,23 @@ export abstract class _PlayScreen< /** * @override */ - protected async _abstractOnBeforeEnter(args: SkScreen.CtorArgs): Promise { + protected async _abstractOnBeforeEnter(navDir: SkScreen.NavDir, args: SkScreen.EntranceArgs[SID]): Promise { document.addEventListener("visibilitychange", this.#onVisibilityChange); this.pauseButton.disabled = true; this._statusBecomePaused(); // <-- Leverage some state initialization. this.#currentGame = await this._createNewGame( - args as (typeof args & Game.CtorArgs), + args as Game.CtorArgs, ); - this._gridBaseElem.addEventListener("keydown", this.#gridOnKeyDown); + this._gridBaseElem.addEventListener("keydown", this.#gridOnKeyDown, { + // the handler will call stopPropagation. As a result, + // nothing inside this element can ever receive keyboard events. + capture: true, + }); await this.currentGame!.reset(); // ^Wait until resetting has finished before attaching the // grid element to the screen so that the DOM changes made - // by populating tiles with CSP's will have batched reflow. + // by populating tiles with CSP's will be batched. const html = this.currentGame!.htmlElements; this._gridImplHost.appendChild(html.gridImpl); // ^The order of insertion does not matter (it used to). @@ -166,6 +167,7 @@ export abstract class _PlayScreen< setTimeout(() => { if (!document.hidden) { this._statusBecomePlaying(); } }, 500); + // ^This delay is for "aesthetic" purposes (not functional). } return; } @@ -173,8 +175,8 @@ export abstract class _PlayScreen< /** * @override */ - protected _abstractOnBeforeLeave(): boolean { - if (!window.confirm("Are you sure you would like to leave?")) { + protected _abstractOnBeforeLeave(navDir: SkScreen.NavDir): boolean { + if (this.askConfirmBeforeLeave && !window.confirm("Are you sure you would like to leave?")) { return false; } document.removeEventListener("visibilitychange", this.#onVisibilityChange); @@ -203,7 +205,7 @@ export abstract class _PlayScreen< return this.#currentGame; } - protected abstract async _createNewGame(ctorArgs: Game.CtorArgs): Promise; + protected abstract async _createNewGame(ctorArgs: Game.CtorArgs): Promise; /** @@ -221,6 +223,7 @@ export abstract class _PlayScreen< // console.log(`key: ${ev.key}, code: ${ev.code},` // + ` keyCode: ${ev.keyCode}, char: ${ev.char},` // + ` charCode: ${ev.charCode}`); + ev.stopPropagation(); const game = this.currentGame!; if (ev.ctrlKey && ev.key === " " && !ev.repeat) { // If switching operator: @@ -248,21 +251,22 @@ export abstract class _PlayScreen< } - private _statusBecomePlaying(): void { + protected _statusBecomePlaying(): void { const OHGD = OmHooks.Grid.Dataset.GAME_STATE; this.currentGame?.statusBecomePlaying(); this.pauseButton.textContent = "Pause"; this.#pauseReason = undefined; this._gridBaseElem.dataset[OHGD.KEY] = OHGD.VALUES.PLAYING; + this.pauseButton.onclick = this._statusBecomePaused.bind(this); + this.resetButton.disabled = true; + window.requestAnimationFrame((time) => { - this.pauseButton.onclick = this._statusBecomePaused.bind(this); - this.resetButton.disabled = true; this._gridBaseElem.focus(); }); } - private _statusBecomePaused(): void { + protected _statusBecomePaused(): void { const OHGD = OmHooks.Grid.Dataset.GAME_STATE; this.currentGame?.statusBecomePaused(); this.pauseButton.textContent = "Unpause"; @@ -285,7 +289,7 @@ export abstract class _PlayScreen< * - The current game exists. * - The current game is paused or it is over. */ - private _resetGame(): void { + protected _resetGame(): void { this.currentGame!.reset(); this.pauseButton.disabled = false; if (this.wantsAutoPause) { @@ -306,17 +310,20 @@ export abstract class _PlayScreen< ); controlsBar.setAttribute("role", "menu"); - function createControlButton(buttonText: string): HTMLButtonElement { - const button = document.createElement("button"); + function createControlButton( + buttonText: string, + button?: TU.Omit, + ): HTMLButtonElement { + button = button ?? document.createElement("button"); button.textContent = buttonText; button.classList.add(OmHooks.General.Class.INPUT_GROUP_ITEM); button.addEventListener("pointerenter", (ev) => { window.requestAnimationFrame((time) => { - button.focus(); + button!.focus(); }); }); controlsBar.appendChild(button); - return button; + return button as HTMLButtonElement; } controlsBar.addEventListener("pointerleave", (ev) => { window.requestAnimationFrame((time) => { @@ -324,19 +331,18 @@ export abstract class _PlayScreen< }); }); - { const bth - = (this.backToHomeButton as HTMLButtonElement) - = createControlButton("Return To Homepage"); - bth.onclick = this.requestGoToScreen.bind(this, SkScreen.Id.HOME); + { const bth = createControlButton("", this.nav.prev); } { const pause - = (this.pauseButton as HTMLButtonElement) + // @ts-expect-error : RO= + = this.pauseButton = createControlButton(""); } { const reset - = (this.resetButton as HTMLButtonElement) + // @ts-expect-error : RO= + = this.resetButton = createControlButton("Reset"); reset.onclick = this._resetGame.bind(this); } @@ -346,7 +352,8 @@ export abstract class _PlayScreen< private _initializePlayersBar(): void { const playersBar - = (this.playersBar as HTMLElement) + // @ts-expect-error : RO= + = this.playersBar = document.createElement("div"); playersBar.classList.add(OmHooks.Screen.Impl.Play.Class.PLAYERS_BAR); this.baseElem.appendChild(playersBar); @@ -439,4 +446,4 @@ export namespace _PlayScreen { } } Object.freeze(_PlayScreen); -Object.freeze(_PlayScreen.prototype); +Object.freeze(_PlayScreen.prototype); \ No newline at end of file diff --git a/src/client/screen/impl/PlayOffline.ts b/src/client/screen/impl/PlayOffline.ts index 9c1c9661..0af5862a 100644 --- a/src/client/screen/impl/PlayOffline.ts +++ b/src/client/screen/impl/PlayOffline.ts @@ -1,6 +1,6 @@ import type { OfflineGame } from "../../game/OfflineGame"; -import { SkScreen } from "../SkScreen"; +import { Coord, SkScreen } from "../SkScreen"; import { Game, _PlayScreen } from "./Play"; type G = Game.Type.OFFLINE; @@ -9,28 +9,41 @@ type G = Game.Type.OFFLINE; */ export class PlayOfflineScreen extends _PlayScreen { + /** + * @override + */ public get initialScreen(): SkScreen.Id { return SkScreen.Id.SETUP_OFFLINE; } - declare public readonly currentGame: OfflineGame | undefined; + /** + * @override + */ + // @ts-expect-error : Redeclaring accessor as property. + declare public readonly currentGame: OfflineGame | undefined; /** * @override */ protected readonly wantsAutoPause = true; + /** + * @override + */ + protected readonly askConfirmBeforeLeave = true; /** * @override */ protected _lazyLoad(): void { super._lazyLoad(); + this.nav.prev.innerHTML = "Return To Setup"; + // ^Prevent jank due to pointer hover animation. } /** * @override */ - protected async _createNewGame(ctorArgs: Game.CtorArgs): Promise> { + protected async _createNewGame(ctorArgs: Game.CtorArgs): Promise> { // TODO.impl use game-setup args passed in from _abstractOnBeforeEnter return new (await import( /* webpackChunkName: "game/offline" */ @@ -39,4 +52,4 @@ export class PlayOfflineScreen extends _PlayScreen } } Object.freeze(PlayOfflineScreen); -Object.freeze(PlayOfflineScreen.prototype); +Object.freeze(PlayOfflineScreen.prototype); \ No newline at end of file diff --git a/src/client/screen/impl/PlayOnline.ts b/src/client/screen/impl/PlayOnline.ts index 5e43c169..d9682709 100644 --- a/src/client/screen/impl/PlayOnline.ts +++ b/src/client/screen/impl/PlayOnline.ts @@ -1,20 +1,38 @@ import type { OnlineGame } from "../../game/OnlineGame"; -import { SkScreen } from "../SkScreen"; +import { Coord, SkScreen } from "../SkScreen"; import { Game, _PlayScreen } from "./Play"; +type SID = SkScreen.Id.PLAY_ONLINE; type G = Game.Type.ONLINE; /** * */ -export class PlayOnlineScreen extends _PlayScreen { +export class PlayOnlineScreen extends _PlayScreen { + /** + * @override + */ + protected readonly askConfirmBeforeLeave = false; + /** + * @override + */ public get initialScreen(): SkScreen.Id { return SkScreen.Id.GROUP_JOINER; }; + /** + * @override + */ + public getNavPrevArgs(): SkScreen.NavPrevRet { + return [SkScreen.Id.GROUP_LOBBY, {}, SkScreen.NavDir.BACKWARD,]; + }; - declare public readonly currentGame: OnlineGame | undefined; + /** + * @override + */ + // @ts-expect-error : Redeclaring accessor as property. + declare public readonly currentGame: OnlineGame | undefined; /** * @override @@ -26,12 +44,25 @@ export class PlayOnlineScreen extends _PlayScreen { */ protected _lazyLoad(): void { super._lazyLoad(); + this.nav.prev.innerHTML = "Return To Lobby"; + } + + protected async _abstractOnBeforeEnter(navDir: SkScreen.NavDir, args: SkScreen.EntranceArgs[SID]): Promise { + (this.nav.prev as HTMLButtonElement).onclick = (ev) => { + if (this.top.clientIsGroupHost) { + // TODO.impl ask first. + this.top.socket!.emit(Game.CtorArgs.Event.NAME, Game.CtorArgs.Event.RETURN_TO_LOBBY_INDICATOR); + } else { + // TODO.impl leave the game but stay in the group. + } + }; + return super._abstractOnBeforeEnter(navDir, args); } /** * @override */ - protected async _createNewGame(ctorArgs: Game.CtorArgs): Promise> { + protected async _createNewGame(ctorArgs: Game.CtorArgs): Promise> { const game = new (await import( /* webpackChunkName: "game/online" */ "../../game/OnlineGame" @@ -40,10 +71,16 @@ export class PlayOnlineScreen extends _PlayScreen { this.top.socket!, ctorArgs, ); + this.top.socket!.on(Game.CtorArgs.EVENT_NAME_SERVER_APPROVE_UNPAUSE, () => { + this._statusBecomePlaying(); + }); + this.top.socket!.on(Game.CtorArgs.EVENT_NAME_SERVER_APPROVE_PAUSE, () => { + this._statusBecomePaused; + }); return Promise.resolve(game); } } export namespace PlayOnlineScreen { } Object.freeze(PlayOnlineScreen); -Object.freeze(PlayOnlineScreen.prototype); +Object.freeze(PlayOnlineScreen.prototype); \ No newline at end of file diff --git a/src/client/screen/impl/Setup.ts b/src/client/screen/impl/Setup.ts index 7bc743b2..8e893ef4 100644 --- a/src/client/screen/impl/Setup.ts +++ b/src/client/screen/impl/Setup.ts @@ -3,7 +3,8 @@ import { Coord } from "floor/Tile"; import type { Game } from "game/Game"; import { SkPickOne } from "../../utils/SkPickOne"; -import { OmHooks, SkScreen } from "../SkScreen"; +import { OmHooks, StorageHooks, SkScreen } from "../SkScreen"; +const OMHC = OmHooks.Screen.Impl.Setup.Class; type SID_options = SkScreen.Id.SETUP_OFFLINE | SkScreen.Id.SETUP_ONLINE; @@ -11,72 +12,111 @@ type SID_options = SkScreen.Id.SETUP_OFFLINE | SkScreen.Id.SETUP_ONLINE; /** * What coordinate systems are available will depend on what language * the user chooses. + * + * Implementation Note: subclasses must implement the `onClick` + * behaviour of the `_nextBtn` and `_prevBtn` buttons. */ // TODO.learn how to use the IndexDB web API. export abstract class _SetupScreen extends SkScreen { protected readonly langSel: _SetupScreen.LangPickOne; - - protected readonly nextBtn: HTMLButtonElement; + protected readonly langWeightExaggeration: HTMLInputElement; /** * @override */ protected _lazyLoad(): void { - this.baseElem.classList.add(OmHooks.Screen.Impl.Setup.Class.BASE); + this.baseElem.classList.add(OMHC.BASE); + this.baseElem.appendChild(this.nav.prev); // Language selection component: - (this.langSel as _SetupScreen.LangPickOne) = new _SetupScreen.LangPickOne(); + // @ts-expect-error : RO= + this.langSel = new _SetupScreen.LangPickOne(); this.baseElem.appendChild(this.langSel.baseElem); - const nextBtn - = (this.nextBtn as HTMLButtonElement) - = document.createElement("button"); - nextBtn.classList.add(OmHooks.Screen.Impl.Setup.Class.NEXT_BUTTON); - nextBtn.textContent = "Next"; - this.baseElem.appendChild(nextBtn); + this._createLangWeightExaggerationInput(); + + this.baseElem.appendChild(this.nav.next); + this._loadLastUsedPreset(); + } + + private _createLangWeightExaggerationInput(): void { + const lwe + // @ts-expect-error : RO= + = this.langWeightExaggeration + = document.createElement("input"); + lwe.classList.add(OMHC.LANG_WEIGHT_EXAGG); + lwe.type = "range"; + lwe.min = "0"; + lwe.max = Lang.WeightExaggeration.MAX.toString(); + lwe.step = "any"; + lwe.value = "1"; + { + const list = document.createElement("datalist"); + list.id = OmHooks.Screen.Impl.Setup.Id.LANG_WEIGHT_EXAGGERATION_LIST; + [{val:0,label:"0",}, {val:1,label:"1"},].forEach((tickDesc) => { + const opt = document.createElement("option"); + opt.value = tickDesc.val.toString(); + opt.label = tickDesc.label; + list.appendChild(opt); + }); + this.baseElem.appendChild(list); + } + lwe.setAttribute("list", OmHooks.Screen.Impl.Setup.Id.LANG_WEIGHT_EXAGGERATION_LIST); + this.baseElem.appendChild(lwe); + } + + /** + * @override + */ + protected async _abstractOnBeforeEnter(navDir: SkScreen.NavDir, args: SkScreen.EntranceArgs[SID]): Promise { + window.setTimeout(() => { + this.nav.next.focus(); + }, 100); // <-- An arbitrary short period of time. See super doc. + return; + } + + /** + * Load the user's last used preset to the gui controls. + */ + private _loadLastUsedPreset(): void { + // TODO.impl + const lastUsedPresetId = localStorage.getItem(StorageHooks.LocalKeys.GAME_PRESET); } - _abstractOnBeforeEnter(): Promise { - this.nextBtn.focus(); - return Promise.resolve(); + /** + * A helper for going to the next screen. + */ + protected _parseArgsFromGui(): Game.CtorArgs { + // TODO.impl + const args: TU.NoRo> + = Object.assign({}, _SetupScreen.DEFAULT_PRESET); + // ^temporary default until _loadLastUsedPreset is implemented. + args.langId = this.langSel.confirmedOpt.desc.id; + args.langWeightExaggeration = parseFloat(this.langWeightExaggeration.value); + return args; } } export namespace _SetupScreen { // TODO.impl If we keep this, use a recursive Object.freeze. // Currently not frozen to allow for easier testing. - export const DEFAULT_PRESET = >{ + export const DEFAULT_PRESET = >{ coordSys: Coord.System.EUCLID2, gridDimensions: { height: 21, width: 21, }, averageFreeHealthPerTile: 1.0 / 45.0, - langWeightScaling: 1.0, + langWeightExaggeration: 1.0, langId: "engl-low", playerDescs: [{ - isALocalOperator: true, - familyId: "HUMAN", - teamId: 0, - socketId: undefined, - username: "hello1", - noCheckGameOver: false, - familyArgs: { }, - }, { - isALocalOperator: true, - familyId: "HUMAN", - teamId: 1, - socketId: undefined, - username: "hello2", - noCheckGameOver: false, - familyArgs: { }, - }, { isALocalOperator: false, familyId: "CHASER", teamId: 1, socketId: undefined, username: "chaser1", + avatar: undefined, noCheckGameOver: true, familyArgs: {/* Uses all defaults. */}, }, { @@ -85,6 +125,7 @@ export namespace _SetupScreen { teamId: 1, socketId: undefined, username: "chaser2", + avatar: undefined, noCheckGameOver: true, familyArgs: { fearDistance: 6, @@ -100,11 +141,10 @@ export namespace _SetupScreen { export class LangPickOne extends SkPickOne { public constructor() { super(); + this.baseElem.classList.add(OMHC.LANG_SEL) Lang.FrontendDescs.forEach((desc) => { this.addOption(new LangPickOne.Option(desc)); }); - // TODO.impl set defaults from last used setup. - // Below line is a placeholder. this.selectOpt(this.options[0]); } public _onHoverOpt(opt: LangPickOne.Option): void { @@ -133,4 +173,4 @@ export namespace _SetupScreen { } } Object.freeze(_SetupScreen); -Object.freeze(_SetupScreen.prototype); +Object.freeze(_SetupScreen.prototype); \ No newline at end of file diff --git a/src/client/screen/impl/SetupOffline.ts b/src/client/screen/impl/SetupOffline.ts index 4743903d..0c1e5794 100644 --- a/src/client/screen/impl/SetupOffline.ts +++ b/src/client/screen/impl/SetupOffline.ts @@ -1,3 +1,7 @@ +import { Coord } from "floor/Tile"; +import type { Player } from "game/player/Player"; +import { Game } from "game/Game"; + import { OmHooks, SkScreen } from "../SkScreen"; import { _SetupScreen } from "./Setup"; @@ -12,19 +16,44 @@ export class SetupOfflineScreen extends _SetupScreen { protected _lazyLoad(): void { super._lazyLoad(); - this.nextBtn.onclick = (ev) => { - // TODO.design create ctorArgs from user presets. - const ctorArgs = Object.assign({}, _SetupScreen.DEFAULT_PRESET); - (ctorArgs.langId as string) = this.langSel.confirmedOpt.desc.id; - this.requestGoToScreen(SkScreen.Id.PLAY_OFFLINE, ctorArgs); + this.nav.next.onclick = (ev) => { + const args = this._parseArgsFromGui(); + this.requestGoToScreen(SkScreen.Id.PLAY_OFFLINE, args); }; } - protected _abstractOnBeforeEnter(args: SkScreen.CtorArgs): Promise { - return Promise.resolve(); + protected _abstractOnBeforeEnter(navDir: SkScreen.NavDir, args: SkScreen.EntranceArgs[SID]): Promise { + return super._abstractOnBeforeEnter(navDir, args); + } + + protected _parseArgsFromGui(): Game.CtorArgs { + type pArgs = Array; + const args = super._parseArgsFromGui(); + // TODO.impl get rid of this placeholder once this screen has inputs for + // the client to configure their own players. + (args.playerDescs as pArgs).splice(args.playerDescs.length, 0, { + isALocalOperator: true, + familyId: "HUMAN", + teamId: 0, + socketId: undefined, + username: "hello1", + avatar: undefined, + noCheckGameOver: false, + familyArgs: { }, + }, { + isALocalOperator: true, + familyId: "HUMAN", + teamId: 1, + socketId: undefined, + username: "hello2", + avatar: undefined, + noCheckGameOver: false, + familyArgs: { }, + },); + return args; } } export namespace SetupOfflineScreen { } Object.freeze(SetupOfflineScreen); -Object.freeze(SetupOfflineScreen.prototype); +Object.freeze(SetupOfflineScreen.prototype); \ No newline at end of file diff --git a/src/client/screen/impl/SetupOnline.ts b/src/client/screen/impl/SetupOnline.ts index 8b91e64d..ea2f7ee1 100644 --- a/src/client/screen/impl/SetupOnline.ts +++ b/src/client/screen/impl/SetupOnline.ts @@ -1,3 +1,5 @@ +import { Game } from "game/Game"; + import { OmHooks, SkScreen } from "../SkScreen"; import { _SetupScreen } from "./Setup"; type SID = SkScreen.Id.SETUP_ONLINE; @@ -8,6 +10,9 @@ type SID = SkScreen.Id.SETUP_ONLINE; */ export class SetupOnlineScreen extends _SetupScreen { + /** + * @override + */ public get initialScreen(): SkScreen.Id { return SkScreen.Id.GROUP_JOINER; } @@ -18,20 +23,21 @@ export class SetupOnlineScreen extends _SetupScreen { protected _lazyLoad(): void { super._lazyLoad(); - this.nextBtn.onclick = (ev) => { - // TODO.design create ctorArgs from user presets. - const ctorArgs = Object.assign({}, _SetupScreen.DEFAULT_PRESET); - (ctorArgs.langId as string) = this.langSel.confirmedOpt.desc.id; - this.requestGoToScreen(SkScreen.Id.GROUP_LOBBY, ctorArgs); + this.nav.next.textContent = "Start Game"; + this.nav.next.onclick = (ev) => { + const args = this._parseArgsFromGui(); + if (this.top.clientIsGroupHost) { + this.top.socket!.emit(Game.CtorArgs.Event.NAME, args); + } }; } /** * @override */ - protected _abstractOnBeforeEnter(args: SkScreen.CtorArgs): Promise { - return Promise.resolve(); + protected _abstractOnBeforeEnter(navDir: SkScreen.NavDir, args: SkScreen.EntranceArgs[SID]): Promise { + return super._abstractOnBeforeEnter(navDir, args); } } Object.freeze(SetupOnlineScreen); -Object.freeze(SetupOnlineScreen.prototype); +Object.freeze(SetupOnlineScreen.prototype); \ No newline at end of file diff --git a/src/client/utils/SkPickOne.ts b/src/client/utils/SkPickOne.ts index 4c121b33..0f9be147 100644 --- a/src/client/utils/SkPickOne.ts +++ b/src/client/utils/SkPickOne.ts @@ -24,7 +24,7 @@ export abstract class SkPickOne { const base = document.createElement("div"); base.tabIndex = 0; base.classList.add(OmHooks.SkPickOne.Class.BASE); - base.addEventListener("keydown", this.onKeyDown.bind(this)); + base.addEventListener("keydown", this._onKeyDown.bind(this)); base.setAttribute("role", "listbox"); base.addEventListener("pointerenter", (ev) => { window.requestAnimationFrame((time) => { @@ -42,7 +42,7 @@ export abstract class SkPickOne { this.baseElem.appendChild(opt.baseElem); opt.baseElem.addEventListener("pointerenter", this.hoverOpt.bind(this, opt)); opt.baseElem.addEventListener("click", this.selectOpt.bind(this, opt, true)); - opt._registerParent(this.onOptDisabledChange.bind(this)); + opt._registerParent(this._onOptDisabledChange.bind(this)); } public hoverOpt(opt: O): void { @@ -56,7 +56,7 @@ export abstract class SkPickOne { protected abstract _onHoverOpt(opt: O): void; public selectOpt(opt: O, doCallback: boolean = true): void { - if (!opt) throw new Error("opt must be defined"); + if (!opt) throw Error("opt must be defined"); // We must ensure hovering before executing confirmation: this.hoverOpt(opt); // Now that hovering is done, execute confirmation of selection: @@ -86,24 +86,24 @@ export abstract class SkPickOne { return this.#hoveredOpt; } - private onOptDisabledChange(opt: O): void { + private _onOptDisabledChange(opt: O): void { if (this.confirmedOpt === opt) { - this.isValid = !opt.disabled; + this._isValid = !opt.disabled; } } - private set isValid(newIsValid: boolean) { - if (this.isValid !== newIsValid) { + private set _isValid(newIsValid: boolean) { + if (this._isValid !== newIsValid) { this.baseElem.setAttribute("aria-invalid", (newIsValid ? "false": "true")); this.#isValid = newIsValid; // TODO.impl styling. } } - private get isValid(): boolean { + private get _isValid(): boolean { return this.#isValid; } - private onKeyDown(ev: KeyboardEvent): boolean { + private _onKeyDown(ev: KeyboardEvent): boolean { if (ev.key === " " || ev.key === "Enter") { this.selectOpt(this.hoveredOpt); ev.preventDefault(); diff --git a/src/node_modules/@types/snakey-utils/TypeUtils.d.ts b/src/node_modules/@types/snakey-utils/TypeUtils.d.ts index 6a755767..8344b6a8 100644 --- a/src/node_modules/@types/snakey-utils/TypeUtils.d.ts +++ b/src/node_modules/@types/snakey-utils/TypeUtils.d.ts @@ -12,29 +12,18 @@ declare namespace TU { -readonly [ K in keyof T ]: T[K]; }; - type ClosedProp = U extends Array - ? Array> - : U & {[ P in Exclude]: never;}; + // Same as ts3.5, but errs if K is not a key of T. + type Omit = Pick>; + + // Same as ts builtin, but errs if K is not a key of T. + type Pikk = Pick; + + // Same as ts builtin, but errs if K is not a key of T. + type Xcld = Exclude; // not used/needed yet. //type Modify>> = Omit & R; // not used/needed yet. //type Require = T & Pick, K>; -} - - -/** - * @returns - * A shallow copy of the given object containing all instance fields - * belonging to the object and not to any of its prototypes. Suitable - * for sending over an internet connection. - * - * **Important:** We don't actually need this! Socket.io implicitly - * sends objects serialized as JSON. - * - * @param obj - The object to create a shallow copy of with no prototype. - */ -// export const noProto = (obj: T): T => { -// return Object.assign(Object.create(null), obj); -// }; +} \ No newline at end of file diff --git a/src/server/Group.ts b/src/server/Group.ts index 36c12396..d4408453 100644 --- a/src/server/Group.ts +++ b/src/server/Group.ts @@ -1,10 +1,12 @@ import * as io from "socket.io"; +import type { Coord } from "floor/Tile"; +import type { Player } from "game/player/Player"; import { Game } from "game/Game"; import { ServerGame } from "./ServerGame"; -import type { Player } from "game/player/Player"; import { Group as _Group, SkServer } from "defs/OnlineDefs"; +import { GamepartManager } from "game/gameparts/GamepartManager"; export { ServerGame }; @@ -18,11 +20,11 @@ export class Group extends _Group { public readonly namespace: io.Namespace; public readonly name: Group.Name; public readonly passphrase: Group.Passphrase; - #currentGame: ServerGame | undefined; - private sessionHost: io.Socket; + #currentGame: ServerGame | undefined; + private _sessionHost: Group.Socket; - private readonly initialTtlTimeout: NodeJS.Timeout; - private readonly deleteExternalRefs: VoidFunction; + private readonly _initialTtlTimeout: NodeJS.Timeout; + private readonly _deleteExternalRefs: VoidFunction; /** * @@ -45,16 +47,16 @@ export class Group extends _Group { initialTtl: number, }>) { super(); - this.namespace = desc.namespace; - this.passphrase = desc.passphrase; + this.namespace = desc.namespace; + this.passphrase = desc.passphrase; this.#currentGame = undefined; - this.initialTtlTimeout = setTimeout(() => { - if (Object.keys(this.namespace.connected).length === 0) { + this._deleteExternalRefs = desc.deleteExternalRefs; + this._initialTtlTimeout = setTimeout(() => { + if (Object.keys(this.namespace.sockets).length === 0) { this.terminate(); } }, (desc.initialTtl * 1000)).unref(); - this.deleteExternalRefs = desc.deleteExternalRefs; // Call the connection-event handler: this.namespace.use((socket, next) => { @@ -62,6 +64,11 @@ export class Group extends _Group { if (handshake.query.passphrase !== this.passphrase) { next(new Error("Incorrect passphrase")); } + const userInfo = socket.handshake.query as Player.UserInfo; + if (userInfo === undefined || userInfo.teamId !== 0) { + next(new Error(`a socket attempted to connect to group` + + ` \`${this.name}\` without providing userInfo.`)); + } return next(); }).on("connection", this.onConnection.bind(this)); } @@ -78,54 +85,93 @@ export class Group extends _Group { // a game: socket.disconnect(); } - socket.username = undefined; - socket.teamId = undefined; - socket.updateId = 0; + socket.userInfo = socket.handshake.query.userInfo; + { + type Res = _Group.Socket.UserInfoChange.Res; + const EVENT_NAME = Group.Socket.UserInfoChange.EVENT_NAME; + // Notify all other clients in this group of the new player: + // NOTE: broadcast modifier not used since socket is not yet in this.sockets. + socket/* .broadcast */.emit(EVENT_NAME, {[socket.id]: socket.userInfo}); + // Notify the new player of all other players: + socket.emit(EVENT_NAME, Object.entries(this.sockets).reduce((res, [otherSocketId, otherSocket]) => { + res[otherSocketId] = otherSocket.userInfo; + return res; + }, {} as Res)); + } /** * Nobody has connected yet. * The first socket becomes the session host. */ - if (Object.keys(this.namespace.connected).length === 0) { - clearTimeout(this.initialTtlTimeout); - (this.initialTtlTimeout as NodeJS.Timeout) = undefined!; - this.sessionHost = socket; - // TODO.impl set socket.isPrivileged - socket.broadcast.emit(Group.Exist.EVENT_NAME, { + if (Object.keys(socket.nsp.connected).length === 1) { + clearTimeout(this._initialTtlTimeout); + // @ts-expect-error : RO= + this._initialTtlTimeout = undefined!; + this._sessionHost = socket; + this.namespace.server.of(SkServer.Nsps.GROUP_JOINER).emit(Group.Exist.EVENT_NAME, { [this.name]: Group.Exist.Status.IN_LOBBY, }); - socket.on(Game.CtorArgs.EVENT_NAME, ( - ctorArgs: Game.CtorArgs - | typeof Game.CtorArgs.RETURN_TO_LOBBY_INDICATOR - ) => { - // First, broadcast to the joiner namespace of this - // group's change in state: - this.namespace.server.of(SkServer.Nsps.GROUP_JOINER).emit(Group.Exist.EVENT_NAME, { - [this.name]: (ctorArgs !== Game.CtorArgs.RETURN_TO_LOBBY_INDICATOR) - ? Group.Exist.Status.IN_GAME - : Group.Exist.Status.IN_LOBBY, - }); - if (ctorArgs !== Game.CtorArgs.RETURN_TO_LOBBY_INDICATOR) { - this._createGameInstance(ctorArgs); - } else { - this.#currentGame!.onReturnToLobby(); - } - }); + socket.on(Game.CtorArgs.Event.NAME, this._socketOnHostCreateGame.bind(this)); } + socket.on( + Group.Socket.UserInfoChange.EVENT_NAME, + (req: _Group.Socket.UserInfoChange.Req) => { + if (typeof req.username !== "string" + || typeof req.teamId !== "number" + || typeof req.avatar !== "string") { + // User arguments did not match expected format. + console.log(`bad format: username: \`${req.username}\`` + + `, teamId: \`${req.teamId}\`, avatar: \`${req.avatar}\`.`); + return; + } + socket.userInfo = req; + const res = <_Group.Socket.UserInfoChange.Res>{ + [socket.id]: req, + }; + socket.nsp.emit(Group.Socket.UserInfoChange.EVENT_NAME, res); + //console.log("change ", res); + }, + ); socket.on("disconnect", (...args: any[]): void => { - if (socket === this.sessionHost) { + if (socket === this._sessionHost) { // If the host disconnects, end the session. // TODO.impl this seems like a bad decision. What about just broadcasting // that the host player has died, and choose another player to become // the host? this.terminate(); + return; } - if (Object.keys(this.namespace.sockets).length === 1) { + if (Object.keys(socket.nsp.sockets).length === 1) { this.terminate(); + return; } + const res = <_Group.Socket.UserInfoChange.Res>{ + [socket.id]: undefined, + }; + socket.nsp.emit(Group.Socket.UserInfoChange.EVENT_NAME, res); }); } + private _socketOnHostCreateGame( + ctorArgs: Game.CtorArgs + | typeof Game.CtorArgs.Event.RETURN_TO_LOBBY_INDICATOR, + ): void { + // First, broadcast to the joiner namespace of this + // group's change in state: + this.namespace.server.of(SkServer.Nsps.GROUP_JOINER).emit(Group.Exist.EVENT_NAME, { + [this.name]: (ctorArgs !== Game.CtorArgs.Event.RETURN_TO_LOBBY_INDICATOR) + ? Group.Exist.Status.IN_GAME + : Group.Exist.Status.IN_LOBBY, + }); + if (ctorArgs !== Game.CtorArgs.Event.RETURN_TO_LOBBY_INDICATOR) { + const failureReasons = this._createGameInstance(ctorArgs); + if (failureReasons.length) { + // TODO.impl handle failure reasons. + } + } else { + this.#currentGame!.onReturnToLobby(); + } + } public get isCurrentlyPlayingAGame(): boolean { return this.#currentGame !== undefined; @@ -148,8 +194,9 @@ export class Group extends _Group { }); nsps.removeAllListeners(); delete nsps.server.nsps[nsps.name]; - (this.namespace as io.Namespace) = undefined!; - (this.deleteExternalRefs)(); + // @ts-expect-error : RO= + this.namespace = undefined!; + (this._deleteExternalRefs)(); nsps.server.of(SkServer.Nsps.GROUP_JOINER).emit(Group.Exist.EVENT_NAME, { [this.name]: Group.Exist.Status.DELETE, @@ -165,42 +212,42 @@ export class Group extends _Group { * the Game constructor, which will in turn pass this information * to each client. * - * @param coordSys - - * @param gridDimensions - - * @returns false if the passed arguments were incomplete or invalid. + * @param ctorArgs + * The `playerDescs` field only contains descriptors for artificial + * players. Those for operated players are included by this method. + * + * @returns + * `false` if the passed arguments were incomplete or invalid. */ private _createGameInstance( - ctorArgs: Game.CtorArgs, - ): Readonly | undefined { - const failureReasons: Game.CtorArgs.FailureReasons = { - undefinedUsername: Object.values(this.sockets) - .filter((socket) => !socket.username) - .map((socket) => socket.id), - undefinedTeamId: Object.values(this.sockets) - .filter((socket) => !socket.teamId) - .map((socket) => socket.id), - }; - if (failureReasons.undefinedUsername.length || - failureReasons.undefinedTeamId.length) { + ctorArgs: Game.CtorArgs, + ): readonly string[] { + const failureReasons = GamepartManager.CHECK_VALID_CTOR_ARGS(ctorArgs); + if (failureReasons.length) { + console.log(failureReasons); return failureReasons; } + console.log(`group ${this.name} new game`); + // Everything needed to create a game exists. Let's do it! - (ctorArgs.playerDescs as Player.CtorArgs.PreIdAssignment[]) = [ + // @ts-expect-error : RO= + ctorArgs.playerDescs = [ ...ctorArgs.playerDescs, ...Object.values(this.sockets).map((socket) => { return Object.freeze({ isALocalOperator: false, familyId: "HUMAN", - teamId: socket.teamId!, + teamId: socket.userInfo.teamId, socketId: socket.id, - username: socket.username!, // checked above. + username: socket.userInfo.username, + avatar: socket.userInfo.avatar, noCheckGameOver: false, // TODO.design add a Group.Socket field for this. familyArgs: {}, }); }), ]; this.#currentGame = new ServerGame(this.namespace, ctorArgs); - return undefined; + return []; } public get sockets(): Record { @@ -208,7 +255,7 @@ export class Group extends _Group { } } export namespace Group { - export type Socket = _Group.Socket.ServerSide; + export type Socket = _Group.Socket; export type Name = _Group.Name; export type Passphrase = _Group.Passphrase; export namespace Query { @@ -217,4 +264,4 @@ export namespace Group { } } Object.freeze(Group); -Object.freeze(Group.prototype); +Object.freeze(Group.prototype); \ No newline at end of file diff --git a/src/server/ServerGame.ts b/src/server/ServerGame.ts index 8d524320..ca434744 100644 --- a/src/server/ServerGame.ts +++ b/src/server/ServerGame.ts @@ -30,6 +30,10 @@ export class ServerGame extends GamepartManager { * contain an `io.Socket` object. I could have made this a field * of the `Player` class, but it is only used for players of the * `HUMAN` family, which is designated by field and not by class. + * + * This does not update for players that join the group while the + * group is already in a game, which is currently the intended + * behaviour: players cannot join the game mid-game. */ protected readonly playerSockets: TU.RoArr; @@ -70,19 +74,26 @@ export class ServerGame extends GamepartManager { this.playerSockets = (gameDesc.playerDescs as Player.CtorArgs[]) .filter((playerDesc) => playerDesc.familyId === Player.Family.HUMAN) .map((playerDesc) => { - if (!playerDesc.socketId) { throw new Error; } + if (!playerDesc.socketId) { + throw Error("missing socket ID for player " + playerDesc.playerId); + } return this.namespace.sockets[playerDesc.socketId!]; }); - const humanPlayers = this.players - .filter((player) => player.familyId === Player.Family.HUMAN); + Promise.all(Object.values(this.namespace.sockets).map((socket) => { + return new Promise((resolve, reject) => { + socket.once(Game.CtorArgs.EVENT_NAME_CLIENT_READY_RESET, () => { + resolve(); + }); + }); + })).then(() => { + this.reset(); + }); - // TODO.fix shouldn't this go in the below loop? Right now, if a client - // operates multiple players, the listener for their server-side socket - // will be registered multiple times... - // Attach event listeners / handlers to each socket: - humanPlayers.map((player) => this.playerSockets[player.playerId]) - .forEach((socket) => { + // Pass on Game constructor arguments to each client: + // We need to go by sockets since each client may be operating + // upon (controlling) several of its own players. + Object.values(this.namespace.sockets).forEach((socket) => { // Attach the movement request handlers: // (these are detached in `onReturnToLobby`). socket.on( @@ -95,19 +106,14 @@ export class ServerGame extends GamepartManager { this.processBubbleRequest.bind(this), ); // TODO.impl pause-request handler: - }); - // Pass on Game constructor arguments to each client: - // We need to go by sockets since each client may be operating - // upon (controlling) several of its own players. - Object.values(this.namespace.sockets).forEach((socket) => { // Set `isALocalOperator` flags to match what this socket should see: gameDesc.playerDescs.forEach((playerDesc) => { (playerDesc.isALocalOperator as boolean) = (playerDesc.socketId === socket.id); }); socket.emit( - Game.CtorArgs.EVENT_NAME, + Game.CtorArgs.Event.NAME, gameDesc, ); }); @@ -117,9 +123,23 @@ export class ServerGame extends GamepartManager { * @override */ public async reset(): Promise { + console.log("starting reset"); + + // Be ready for clients to indicate readiness to unpause. + Promise.all(Object.values(this.namespace.sockets).map((socket) => { + return new Promise((resolve, reject) => { + socket.once(Game.CtorArgs.EVENT_NAME_CLIENT_READY_UNPAUSE, () => { + resolve(); + }); + }); + })).then(() => { + this.statusBecomePlaying(); + this.namespace.emit(Game.CtorArgs.EVENT_NAME_SERVER_APPROVE_UNPAUSE); + }); + const superPromise = super.reset(); - // TODO.design Should we wait for ACK's from all clients before - // enabling the privileged users' `stateBecomePlaying` buttons? + await superPromise; + this.namespace.emit( Game.Serialization.EVENT_NAME, this.serializeResetState(), @@ -138,7 +158,7 @@ export class ServerGame extends GamepartManager { * @override */ public _createOperatorPlayer(desc: Player.CtorArgs): never { - throw new TypeError("This should never be called for a ServerGame."); + throw TypeError("This should never be called for a ServerGame."); } diff --git a/src/server/SnakeyServer.ts b/src/server/SnakeyServer.ts index 707c606a..7964c566 100644 --- a/src/server/SnakeyServer.ts +++ b/src/server/SnakeyServer.ts @@ -120,9 +120,14 @@ export class SnakeyServer extends _SnakeyServer { initialTtl: Group.DEFAULT_TTL, })), ); + // Notify the group-creator that the group has been created and can now be joined. + socket.emit(Group.Exist.EVENT_NAME, Group.Exist.RequestCreate.Response.OKAY); + // Notify all sockets connected to the joiner namespace // of the new namespace created for the new group session: - socket.emit(Group.Exist.EVENT_NAME, Group.Exist.RequestCreate.Response.OKAY); + socket.nsp.emit(Group.Exist.EVENT_NAME, { + [desc.groupName]: Group.Exist.Status.IN_LOBBY, + }); }); } }