M server/src/main.rs => server/src/main.rs +2 -2
@@ 15,8 15,8 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use std::net::Ipv4Addr;
-use crate::mathutil::{rot2d, v3_to_v2};
-use bevy::math::{vec2, vec3};
+use crate::mathutil::rot2d;
+use bevy::math::vec2;
use bevy::utils::tracing;
use bevy::{ecs::event::ManualEventReader, prelude::*};
use bevy_rapier2d::prelude::*;
M starkingdoms-client/index.html => starkingdoms-client/index.html +31 -92
@@ 2,41 2,24 @@
<html lang="en">
<head>
<meta charset="UTF-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <title>StarKingdoms</title>
+ <title>StarKingdoms.IO</title>
</head>
<body class="bg-grid">
- <div id="gamewindow">
- <!-- Canvas gets added here by the game script -->
- </div>
-
<div class="popup popup-center popup-max-width-300" id="server_selector">
<h1>StarKingdoms</h1>
<h2>Join Game</h2>
- <form id="join-fm">
- <label>Choose server</label>
+ <form id="join-fm" class="form">
+ <label for="username" class="label">Username</label>
+ <input class="textentry" id="username" required autocomplete="off" />
- <div class="fm-select">
- <button
- class="fm-select-button"
- role="combobox"
- aria-labelledby="server selector"
- aria-haspopup="listbox"
- aria-expanded="false"
- aria-controls="fm-select-dropdown"
- >
- <span class="fm-selected-value">Loading servers list</span>
- <span class="fm-arrow"></span>
- </button>
- <ul class="fm-select-dropdown" role="listbox" id="fm-select-dropdown">
- <!-- Filled by TS -->
- </ul>
- </div>
+ <label class="label" for="select">Server</label>
+ <select id="select" class="select" autocomplete="off">
+ <option>Loading server list, please wait...</option>
+ </select>
+
+ <button id="launch-btn" class="btn">Launch!</button>
- <label for="username" class="username-label">Username</label>
- <input class="username-box" id="username" required autocomplete="off" />
- <button id="launch-btn" class="launch-btn">Launch!</button>
<span id="server-danger" class="server-danger hidden">
<svg
xmlns="http://www.w3.org/2000/svg"
@@ 53,75 36,31 @@
Here be dragons! You have a <b>prerelease server</b> selected. Expect
bugs, and save data on this server may be wiped at any time.
</span>
+
+ <span id="account-info" class="account-info"
+ >You are not logged in. Save data will be stored in your browser
+ cache. <a href="/login/">Log in</a> to save your data on the server
+ and sync it between devices.</span
+ >
</form>
</div>
- <div
- class="popup popup-wmin log-hidden log-container popup-max-width-300"
- id="packet_log"
+ <span class="footer-left" id="footer-left">StarKingdoms Client</span>
+ <span class="footer-right" id="footer-right"
+ >Made with
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ viewBox="0 0 20 20"
+ fill="currentColor"
+ class="footer-icon"
+ >
+ <path
+ d="M9.653 16.915l-.005-.003-.019-.01a20.759 20.759 0 01-1.162-.682 22.045 22.045 0 01-2.582-1.9C4.045 12.733 2 10.352 2 7.5a4.5 4.5 0 018-2.828A4.5 4.5 0 0118 7.5c0 2.852-2.044 5.233-3.885 6.82a22.049 22.049 0 01-3.744 2.582l-.019.01-.005.003h-.002a.739.739 0 01-.69.001l-.002-.001z"
+ />
+ </svg>
+ by the StarKingdoms team</span
>
- <h1>Packet Log</h1>
- <table class="log">
- <thead>
- <tr class="log-wfull">
- <th class="log-wfull log-lalign log-header log-w50">#</th>
- <th class="log-wfull log-lalign log-header">Dir</th>
- <th class="log-wfull log-lalign log-header log-w240">Type</th>
- <th class="log-wfull log-lalign log-header">Delta</th>
- </tr>
- </thead>
- <tbody id="log_body"></tbody>
- </table>
- <hr />
- <h1>Packet Explorer</h1>
- <p id="explorer_selected" class="mono">Selected: --</p>
- <table class="mono json" id="explorer_json"></table>
- </div>
-
- <div class="popup chat-container hidden" id="chat">
- <h1>Chat</h1>
- <div id="chatbox" class="chat-table mono">
- <!-- Filled by script -->
- </div>
- <input
- placeholder="Enter message or command here..."
- class="chat-box"
- id="chatentry"
- required
- autocomplete="off"
- />
- </div>
-
- <div class="hud hidden" id="hud">
- <div class="popup" id="hud-content-wrapper">
- <table>
- <thead>
- <tr>
- <th class="hud-d">Position</th>
- <th class="hud-d">Velocity</th>
- <th class="hud-d">Track Angle</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td id="pos">
- <span id="pos-val-x">--</span>, <span id="pos-val-y">--</span>
- </td>
- <td id="velocity">
- <span id="velocity-val">--</span>
- </td>
- <td id="track">
- <span id="track-val">--</span>
- </td>
- </tr>
- </tbody>
- </table>
- </div>
- </div>
-
- <span class="footer-left" id="footer-left"></span>
- <span class="footer-right" id="footer-right"></span>
- <script type="module" src="src/main.ts"></script>
+ <script type="module" src="src/routes/menu/main.ts"></script>
</body>
</html>
M starkingdoms-client/package.json => starkingdoms-client/package.json +3 -0
@@ 11,7 11,10 @@
"devDependencies": {
"@types/debug": "^4.1.12",
"@types/node": "^20.10.0",
+ "autoprefixer": "^10.4.16",
+ "postcss": "^8.4.31",
"prettier": "^3.1.0",
+ "sass": "^1.69.5",
"typescript": "^5.2.2",
"vite": "^5.0.0"
},
A starkingdoms-client/play/index.html => starkingdoms-client/play/index.html +96 -0
@@ 0,0 1,96 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="UTF-8" />
+ <meta
+ name="viewport"
+ content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"
+ />
+ <meta http-equiv="X-UA-Compatible" content="ie=edge" />
+ <title>StarKingdoms.IO</title>
+ </head>
+ <body>
+ <div class="game" id="gamewindow"></div>
+
+ <div
+ class="popup popup-wmin log-hidden log-container popup-max-width-300"
+ id="packet_log"
+ >
+ <h1>Packet Log</h1>
+ <table class="log">
+ <thead>
+ <tr class="log-wfull">
+ <th class="log-wfull log-lalign log-header log-w50">#</th>
+ <th class="log-wfull log-lalign log-header">Dir</th>
+ <th class="log-wfull log-lalign log-header log-w240">Type</th>
+ <th class="log-wfull log-lalign log-header">Delta</th>
+ </tr>
+ </thead>
+ <tbody id="log_body"></tbody>
+ </table>
+ <hr />
+ <h1>Packet Explorer</h1>
+ <p id="explorer_selected" class="mono">Selected: --</p>
+ <table class="mono json" id="explorer_json"></table>
+ </div>
+
+ <div class="popup chat-container" id="chat">
+ <h1>Chat</h1>
+ <div id="chatbox" class="chat-table mono">
+ <!-- Filled by script -->
+ </div>
+ <input
+ placeholder="Enter message or command here..."
+ class="chat-box"
+ id="chatentry"
+ required
+ autocomplete="off"
+ />
+ </div>
+
+ <div class="hud" id="hud">
+ <div class="popup" id="hud-content-wrapper">
+ <table>
+ <thead>
+ <tr>
+ <th class="hud-d">Position</th>
+ <th class="hud-d">Velocity</th>
+ <th class="hud-d">Track Angle</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td id="pos">
+ <span id="pos-val-x">--</span>, <span id="pos-val-y">--</span>
+ </td>
+ <td id="velocity">
+ <span id="velocity-val">--</span>
+ </td>
+ <td id="track">
+ <span id="track-val">--</span>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+ <span class="footer-left" id="footer-left">StarKingdoms Client</span>
+ <span class="footer-right" id="footer-right"
+ >Made with
+ <svg
+ xmlns="http://www.w3.org/2000/svg"
+ viewBox="0 0 20 20"
+ fill="currentColor"
+ class="footer-icon"
+ >
+ <path
+ d="M9.653 16.915l-.005-.003-.019-.01a20.759 20.759 0 01-1.162-.682 22.045 22.045 0 01-2.582-1.9C4.045 12.733 2 10.352 2 7.5a4.5 4.5 0 018-2.828A4.5 4.5 0 0118 7.5c0 2.852-2.044 5.233-3.885 6.82a22.049 22.049 0 01-3.744 2.582l-.019.01-.005.003h-.002a.739.739 0 01-.69.001l-.002-.001z"
+ />
+ </svg>
+ by the StarKingdoms team</span
+ >
+
+ <script type="module" src="../src/routes/ingame/main.ts"></script>
+ </body>
+</html>
R starkingdoms-client/src/css/chat.css => starkingdoms-client/src/css/chat.scss +4 -2
@@ 1,11 1,13 @@
+@use "font";
+
.chat-container {
+ @extend .font-2;
+
position: absolute;
top: 0.5em;
right: 0.5em;
width: 30vw;
height: min-content;
- font-size: 0.875rem; /* 14px */
- line-height: 1.25rem; /* 20px */
font-weight: 500;
}
.chat-table {
A starkingdoms-client/src/css/font.scss => starkingdoms-client/src/css/font.scss +43 -0
@@ 0,0 1,43 @@
+:root {
+ --sans-serif-font-family: ui-sans-serif, system-ui, -apple-system,
+ BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans",
+ sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol",
+ "Noto Color Emoji";
+ --mono-font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
+ "Liberation Mono", "Courier New", monospace;
+
+ font-family: var(--sans-serif-font-family);
+ @extend .font-3;
+}
+
+.mono {
+ font-family: var(--mono-font-family);
+}
+
+.font-1 {
+ font-size: 0.75rem;
+ line-height: 1rem;
+}
+.font-2 {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+}
+.font-3 {
+ font-size: 1rem;
+ line-height: 1.5rem;
+}
+.font-4 {
+ font-size: 1.125rem;
+ line-height: 1.75rem;
+}
+.font-5 {
+ font-size: 1.25rem;
+ line-height: 1.75rem;
+}
+
+h1 {
+ @extend .font-5;
+}
+h2 {
+ @extend .font-4;
+}
R => +11 -7
@@ 1,15 1,19 @@
.footer-left {
font-size: 0.75rem;
line-height: 2rem;
@use "font";
%footer-common {
@extend .font-1;
position: absolute;
bottom: 0.5em;
}
.footer-left {
@extend %footer-common;
left: 1em;
}
.footer-right {
font-size: 0.75rem;
line-height: 2rem;
position: absolute;
bottom: 0.5em;
@extend %footer-common;
right: 1em;
}
.footer-icon {
D starkingdoms-client/src/css/form.css => starkingdoms-client/src/css/form.css +0 -158
@@ 1,158 0,0 @@
-.launch-btn {
- appearance: none;
- width: 100%;
- padding: 1em;
- margin-top: 1em;
- color: var(--text);
- background: transparent;
- border: 2px solid var(--links);
- border-radius: 5px;
- transition: 0.1s ease-in-out;
-}
-.launch-btn:hover {
- cursor: pointer;
- background-color: var(--links-transparent);
-}
-
-.username-label {
- margin-top: 1em;
-}
-.fm-select {
- margin-bottom: 1em;
- position: relative;
-}
-
-.username-box {
- appearance: none;
- background: transparent;
- color: var(--text);
- padding: 0.675em 1em;
- border: 1px solid var(--links);
- border-radius: 0.25rem;
- cursor: text;
- width: 100%;
- max-width: 100%;
-}
-.username-box:focus {
- outline: none;
- background-color: var(--links-ultratransparent);
-}
-
-.fm-select-button {
- appearance: none;
- background: transparent;
- color: var(--text);
- width: 100%;
- padding: 0.675em 1em;
- border: 1px solid var(--links);
- border-radius: 0.25rem;
- cursor: pointer;
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-.fm-selected-value {
- text-align: left;
-}
-.fm-arrow {
- border-left: 5px solid transparent;
- border-right: 5px solid transparent;
- border-top: 6px solid var(--links);
- transition: transform ease-in-out 0.3s;
-}
-.fm-select-dropdown {
- position: absolute;
- list-style: none;
- width: 100%;
- box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
- background-color: var(--bg-secondary-1);
- border: 1px solid var(--links);
- border-radius: 4px;
- padding: 10px;
- margin-top: 10px;
- max-height: 200px;
- overflow-y: auto;
- transition: 0.2s ease;
-
- /*transform: scaleY(0);*/
- opacity: 0;
- visibility: hidden;
-}
-.fm-select-dropdown:focus-within {
- box-shadow: 0 10px 25px var(--links-ultratransparent);
-}
-
-.fm-select-dropdown li {
- position: relative;
- cursor: pointer;
- display: flex;
- gap: 1rem;
- align-items: center;
-}
-
-.fm-select-dropdown li label {
- width: 100%;
- padding: 8px 10px;
- cursor: pointer;
-}
-
-.fm-select-dropdown::-webkit-scrollbar {
- width: 7px;
-}
-.fm-select-dropdown::-webkit-scrollbar-track {
- background: #f1f1f1;
- border-radius: 25px;
-}
-
-.fm-select-dropdown::-webkit-scrollbar-thumb {
- background: #ccc;
- border-radius: 25px;
-}
-
-.fm-select-dropdown li + li {
- margin-top: 5px;
-}
-
-.fm-select-dropdown li,
-.fm-select-dropdown input ~ label {
- border-radius: 5px;
-}
-
-.fm-select-dropdown li:hover,
-.fm-select-dropdown input:checked ~ label {
- background-color: var(--surface-0);
-}
-.fm-select-dropdown input:focus ~ label {
- background-color: var(--surface-1);
-}
-
-.fm-select-dropdown input[type="radio"] {
- position: absolute;
- left: 0;
- opacity: 0;
-}
-.fm-select.active .fm-arrow {
- transform: rotate(180deg);
-}
-.fm-select.active .fm-select-dropdown {
- opacity: 1;
- visibility: visible;
- /*transform: scaleY(1);*/
-}
-.server-danger {
- width: 100%;
- display: block;
- height: max-content;
- margin-top: 1em;
- color: var(--error);
- font-size: 0.875rem;
- line-height: 1.25rem;
-}
-.server-danger.hidden {
- display: none;
-}
-.server-danger-icon {
- height: 1.25rem;
- vertical-align: middle;
- display: inline-block;
-}
A starkingdoms-client/src/css/form.scss => starkingdoms-client/src/css/form.scss +80 -0
@@ 0,0 1,80 @@
+@use "font";
+
+.form {
+ input,
+ select {
+ margin-bottom: 0.75em;
+ }
+ button {
+ margin-top: 0.25em;
+ }
+}
+
+%form-element-shared {
+ appearance: none;
+ background: transparent;
+ color: var(--text);
+ padding: 0.675em 1em;
+ border: 1px solid var(--links);
+ border-radius: 0.25rem;
+ cursor: text;
+ width: 100%;
+ max-width: 100%;
+}
+
+.btn {
+ @extend %form-element-shared;
+ border: 2px solid var(--links);
+ transition: 0.1s ease-in-out;
+}
+.btn:hover {
+ cursor: pointer;
+ background-color: var(--links-transparent);
+}
+
+.textentry {
+ @extend %form-element-shared;
+}
+.textentry:focus {
+ outline: none;
+ background-color: var(--links-ultratransparent);
+}
+.textentry-error {
+ border: 1px solid var(--error);
+}
+
+.select {
+ @extend %form-element-shared;
+ position: relative;
+ border: 1px solid var(--links);
+ border-radius: 0.25em;
+ cursor: pointer;
+}
+.select::after {
+ content: "";
+ width: 0.8em;
+ height: 0.5em;
+ background-color: var(--links);
+ clip-path: polygon(100% 0%, 0 0%, 50% 100%);
+}
+
+%form-footer-shared {
+ @extend .font-2;
+ width: 100%;
+ display: block;
+ height: max-content;
+ margin-top: 1em;
+}
+
+.account-info {
+ @extend %form-footer-shared;
+}
+.server-danger {
+ @extend %form-footer-shared;
+ color: var(--error);
+}
+.server-danger-icon {
+ height: 1.25rem;
+ vertical-align: middle;
+ display: inline-block;
+}
R starkingdoms-client/src/css/game.css => starkingdoms-client/src/css/game.scss +0 -0
D starkingdoms-client/src/css/globals.css => starkingdoms-client/src/css/globals.css +0 -45
@@ 1,45 0,0 @@
-html {
- box-sizing: border-box;
-}
-*,
-*:before,
-*:after {
- box-sizing: inherit;
-}
-
-body {
- background-color: var(--bg);
- color: var(--body);
- /* Stolen from Tailwind. Looks good in most places. */
- font-family:
- ui-sans-serif,
- system-ui,
- -apple-system,
- BlinkMacSystemFont,
- "Segoe UI",
- Roboto,
- "Helvetica Neue",
- Arial,
- "Noto Sans",
- sans-serif,
- "Apple Color Emoji",
- "Segoe UI Emoji",
- "Segoe UI Symbol",
- "Noto Color Emoji";
- font-size: 1rem;
- line-height: 1.5rem;
-}
-
-.mono {
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
- "Liberation Mono", "Courier New", monospace;
-}
-
-h1 {
- font-size: 1.25rem;
- line-height: 1.75rem;
-}
-h2 {
- font-size: 1.125rem;
- line-height: 1.75rem;
-}
A starkingdoms-client/src/css/globals.scss => starkingdoms-client/src/css/globals.scss +19 -0
@@ 0,0 1,19 @@
+@use "font";
+
+html {
+ box-sizing: border-box;
+}
+*,
+*:before,
+*:after {
+ box-sizing: inherit;
+}
+
+body {
+ background-color: var(--bg);
+ color: var(--body);
+}
+
+a {
+ color: var(--links);
+}
R starkingdoms-client/src/css/grid.css => starkingdoms-client/src/css/grid.scss +0 -0
R starkingdoms-client/src/css/hud.css => starkingdoms-client/src/css/hud.scss +0 -0
R starkingdoms-client/src/css/json.css => starkingdoms-client/src/css/json.scss +0 -0
R starkingdoms-client/src/css/log.css => starkingdoms-client/src/css/log.scss +0 -0
R => +0 -4
@@ 29,7 29,3 @@
margin: 0 0 0.5em;
color: var(--sub-headline);
}
.hidden {
display: none;
visibility: hidden;
}
D starkingdoms-client/src/css/style.css => starkingdoms-client/src/css/style.css +0 -10
@@ 1,10 0,0 @@
-@import "globals.css";
-@import "grid.css";
-@import "popup.css";
-@import "footer.css";
-@import "form.css";
-@import "json.css";
-@import "log.css";
-@import "game.css";
-@import "hud.css";
-@import "chat.css";
A starkingdoms-client/src/css/style.scss => starkingdoms-client/src/css/style.scss +11 -0
@@ 0,0 1,11 @@
+@import "globals.scss";
+@import "grid.scss";
+@import "popup.scss";
+@import "footer.scss";
+@import "form.scss";
+@import "json.scss";
+@import "log.scss";
+@import "game.scss";
+@import "hud.scss";
+@import "chat.scss";
+@import "utils.scss";
R starkingdoms-client/src/css/themes/catppuccin-common/definitions.css => starkingdoms-client/src/css/themes/catppuccin-mocha.scss +27 -3
@@ 1,7 1,31 @@
-/* Common name definitions for all Catppuccin-based themes. */
-/* This is also a good reference if you want to make your own themes, for what variables you *must* define. */
-
:root {
+ --rosewater: 245, 224, 220;
+ --flamingo: 242, 205, 205;
+ --pink: 245, 194, 231;
+ --mauve: 203, 166, 247;
+ --red: 243, 139, 169;
+ --maroon: 235, 160, 172;
+ --peach: 250, 179, 135;
+ --yellow: 249, 226, 175;
+ --green: 166, 227, 161;
+ --teal: 148, 226, 213;
+ --sky: 137, 220, 235;
+ --sapphire: 116, 199, 236;
+ --blue: 137, 180, 250;
+ --lavender: 180, 190, 254;
+ --text: 205, 214, 244;
+ --subtext1: 186, 194, 222;
+ --subtext0: 166, 173, 200;
+ --overlay2: 147, 153, 178;
+ --overlay1: 127, 132, 156;
+ --overlay0: 108, 112, 134;
+ --surface2: 88, 91, 112;
+ --surface1: 69, 71, 90;
+ --surface0: 49, 50, 68;
+ --base: 30, 30, 46;
+ --mantle: 24, 24, 37;
+ --crust: 17, 17, 27;
+
/* Background colors */
--bg: rgb(var(--base));
--bg-secondary-1: rgb(var(--crust));
D starkingdoms-client/src/css/themes/catppuccin-mocha/colors.css => starkingdoms-client/src/css/themes/catppuccin-mocha/colors.css +0 -31
@@ 1,31 0,0 @@
-/* Color palette from Catppuccin Mocha. Thanks! */
-@import "../catppuccin-common/definitions.css";
-
-:root {
- --rosewater: 245, 224, 220;
- --flamingo: 242, 205, 205;
- --pink: 245, 194, 231;
- --mauve: 203, 166, 247;
- --red: 243, 139, 169;
- --maroon: 235, 160, 172;
- --peach: 250, 179, 135;
- --yellow: 249, 226, 175;
- --green: 166, 227, 161;
- --teal: 148, 226, 213;
- --sky: 137, 220, 235;
- --sapphire: 116, 199, 236;
- --blue: 137, 180, 250;
- --lavender: 180, 190, 254;
- --text: 205, 214, 244;
- --subtext1: 186, 194, 222;
- --subtext0: 166, 173, 200;
- --overlay2: 147, 153, 178;
- --overlay1: 127, 132, 156;
- --overlay0: 108, 112, 134;
- --surface2: 88, 91, 112;
- --surface1: 69, 71, 90;
- --surface0: 49, 50, 68;
- --base: 30, 30, 46;
- --mantle: 24, 24, 37;
- --crust: 17, 17, 27;
-}
A starkingdoms-client/src/css/utils.scss => starkingdoms-client/src/css/utils.scss +4 -0
@@ 0,0 1,4 @@
+.hidden {
+ display: none;
+ visibility: hidden;
+}
M starkingdoms-client/src/hub.ts => starkingdoms-client/src/hub.ts +1 -1
@@ 11,7 11,7 @@ import {
SpawnPlayerPacket,
} from "./protocol.ts";
import { appendPacket } from "./packet_ui.ts";
-import { global } from "./main.ts";
+import { global } from "./routes/ingame/main.ts";
import { startRender } from "./rendering.ts";
import { addMessage } from "./chat.ts";
D starkingdoms-client/src/main.ts => starkingdoms-client/src/main.ts +0 -196
@@ 1,196 0,0 @@
-import createDebug from "debug";
-import { ClientHub, hub_connect } from "./hub.ts";
-import { ConfigServer, loadConfig } from "./config.ts";
-import "./css/style.css";
-import "./css/themes/catppuccin-mocha/colors.css";
-import { Part, Planet } from "./protocol.ts";
-import * as PIXI from "pixi.js";
-
-let config = await loadConfig();
-
-const logger = createDebug("main");
-logger(
- `Hello, world! StarKingdoms ${APP_VERSION} (${COMMIT_HASH}) at your service!`,
-);
-/*
-if (window.localStorage.getItem("stk-packet-mode") === "debug") {
- document.getElementById("packet_log")!.classList.remove("log-hidden");
-} else {
- document.getElementById("packet_log")!.remove();
-}
-
- */
-
-export interface GlobalData {
- client: ClientHub | null;
- me: GlobalMe | null;
-
- players_map: Map<number, string>;
- inverse_players_map: Map<string, number>;
-
- planets_map: Map<number, Planet>;
-
- parts_map: Map<number, Part>;
-
- up: boolean;
- down: boolean;
- left: boolean;
- right: boolean;
-
- rendering: GlobalRendering | null;
-}
-
-export interface GlobalRendering {
- app: PIXI.Application;
- player_text_map: Map<number, PIXI.Text>;
- planet_sprite_map: Map<number, PIXI.Sprite>;
- part_sprite_map: Map<number, PIXI.Sprite>;
-}
-
-export interface GlobalMe {
- username: string;
- part_id: number;
-}
-
-export const global: GlobalData = {
- client: null,
- me: null,
- players_map: new Map(),
- inverse_players_map: new Map(),
- planets_map: new Map(),
- parts_map: new Map(),
- up: false,
- down: false,
- left: false,
- right: false,
- rendering: null,
-};
-
-export function player(): Part | undefined {
- if (global.me !== null) {
- return global.parts_map.get(global.me!.part_id);
- } else {
- return undefined;
- }
-}
-
-const version_string = `StarKingdoms Client ${APP_VERSION} (${COMMIT_HASH})`;
-document.getElementById("footer-left")!.innerHTML = version_string;
-document.getElementById("footer-right")!.innerHTML =
- `Made with <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="footer-icon"><path d="M9.653 16.915l-.005-.003-.019-.01a20.759 20.759 0 01-1.162-.682 22.045 22.045 0 01-2.582-1.9C4.045 12.733 2 10.352 2 7.5a4.5 4.5 0 018-2.828A4.5 4.5 0 0118 7.5c0 2.852-2.044 5.233-3.885 6.82a22.049 22.049 0 01-3.744 2.582l-.019.01-.005.003h-.002a.739.739 0 01-.69.001l-.002-.001z" /></svg> by the StarKingdoms team`;
-
-// Dropdown stuff
-const custom_select = document.querySelector(".fm-select")!;
-const custom_select_btn = <HTMLButtonElement>(
- document.querySelector(".fm-select-button")!
-);
-
-custom_select_btn.onclick = (e) => {
- e.stopPropagation();
- e.preventDefault();
- custom_select.classList.toggle("active");
- custom_select_btn.setAttribute(
- "aria-expanded",
- custom_select_btn.getAttribute("aria-expanded") === "true"
- ? "false"
- : "true",
- );
-};
-
-const selected_value = document.querySelector(".fm-selected-value")!;
-
-// Populate the main page server selector
-
-let inverse_server_lookup: { [name: string]: string } = {};
-
-const dropdown = document.getElementById("fm-select-dropdown")!;
-
-dropdown.innerHTML = "";
-
-for (let server_id in config.servers) {
- let server: ConfigServer = config.servers[server_id];
- if (
- server.isDevelopment &&
- window.localStorage.getItem("stk-mode") !== "debug"
- ) {
- continue;
- }
- let html_text = `
- <li>
- <input type="radio" id="${server_id}" name="server" autocomplete="off" ${
- server.isPrimary ? "checked" : ""
- } />
- <label for="${server_id}">${server.name}</label>
- </li>
- `;
- inverse_server_lookup[server.name] = server_id;
- dropdown.innerHTML += html_text;
- if (server.isPrimary) {
- selected_value.textContent = server.name;
- }
-}
-
-const options_list = document.querySelectorAll(".fm-select-dropdown li");
-options_list.forEach((option) => {
- function handler(e: Event) {
- if (
- e.type === "click" &&
- (<PointerEvent>e).clientX !== 0 &&
- (<PointerEvent>e).clientY !== 0
- ) {
- // @ts-ignore
- selected_value.textContent = this.children[1].textContent;
- custom_select.classList.remove("active");
- }
- if (e.type === "keyup") {
- console.log((<KeyboardEvent>e).target!);
- // @ts-ignore
- selected_value.textContent = this.textContent;
- custom_select.classList.remove("active");
- }
- if (
- !config.servers[inverse_server_lookup[selected_value.textContent!]]
- .isProduction
- ) {
- document.getElementById("server-danger")!.classList.remove("hidden");
- } else {
- document.getElementById("server-danger")!.classList.add("hidden");
- }
- }
- // @ts-ignore
- option.onkeyup = handler;
- // @ts-ignore
- option.onclick = handler;
-});
-
-function setStatus(stat: string) {
- document.getElementById("launch-btn")!.textContent = stat;
-}
-
-document.getElementById("join-fm")!.onsubmit = async (e) => {
- e.preventDefault();
-
- setStatus("Connecting...");
- (<HTMLButtonElement>custom_select_btn).disabled = true;
- (<HTMLInputElement>document.getElementById("username")!).disabled = true;
-
- try {
- let server_name = selected_value.textContent!;
- let server_id = inverse_server_lookup[server_name];
- let server: ConfigServer = config.servers[server_id];
-
- let username = (<HTMLInputElement>document.getElementById("username")!)
- .value;
-
- logger(
- `connecting to ${server.clientHubUrl} as ${username} with auth = none`,
- );
-
- global.client = await hub_connect(server.clientHubUrl, username);
- } catch (e) {
- setStatus("Connection failed!");
- console.error(e);
- (<HTMLButtonElement>custom_select_btn).disabled = false;
- (<HTMLInputElement>document.getElementById("username")!).disabled = false;
- }
-};
M starkingdoms-client/src/packet_ui.ts => starkingdoms-client/src/packet_ui.ts +1 -2
@@ 1,5 1,4 @@
-// @ts-ignore
-import { Direction, Packet, type_direction } from "./protocol.ts";
+import { Packet, type_direction } from "./protocol.ts";
import createDebug from "debug";
const logger = createDebug("jsonview");
M starkingdoms-client/src/rendering.ts => starkingdoms-client/src/rendering.ts +1 -8
@@ 1,18 1,11 @@
import * as PIXI from "pixi.js";
-import { global, player } from "./main.ts";
+import { global, player } from "./routes/ingame/main.ts";
import { part_texture_url, planet_texture_url } from "./textures.ts";
const PART_WIDTH = 50;
const PART_HEIGHT = 50;
export function startRender() {
- // hide the launch popup
- document.getElementById("server_selector")!.classList.add("hidden");
- // show the HUD
- document.getElementById("hud")!.classList.remove("hidden");
- // and chat
- document.getElementById("chat")!.classList.remove("hidden");
-
let app = new PIXI.Application({
width: window.innerWidth,
height: window.innerHeight,
A starkingdoms-client/src/routes/ingame/main.ts => starkingdoms-client/src/routes/ingame/main.ts +114 -0
@@ 0,0 1,114 @@
+import createDebug from "debug";
+import { ClientHub, hub_connect } from "../../hub.ts";
+import "../../css/style.scss";
+import "../../css/themes/catppuccin-mocha.scss";
+import { Part, Planet } from "../../protocol.ts";
+import * as PIXI from "pixi.js";
+import { addMessage } from "../../chat.ts";
+import { loadConfig } from "../../config.ts";
+
+export interface GlobalData {
+ client: ClientHub | null;
+ me: GlobalMe | null;
+
+ players_map: Map<number, string>;
+ inverse_players_map: Map<string, number>;
+
+ planets_map: Map<number, Planet>;
+
+ parts_map: Map<number, Part>;
+
+ up: boolean;
+ down: boolean;
+ left: boolean;
+ right: boolean;
+
+ rendering: GlobalRendering | null;
+}
+
+export interface GlobalRendering {
+ app: PIXI.Application;
+ player_text_map: Map<number, PIXI.Text>;
+ planet_sprite_map: Map<number, PIXI.Sprite>;
+ part_sprite_map: Map<number, PIXI.Sprite>;
+}
+
+export interface GlobalMe {
+ username: string;
+ part_id: number;
+}
+
+export const global: GlobalData = {
+ client: null,
+ me: null,
+ players_map: new Map(),
+ inverse_players_map: new Map(),
+ planets_map: new Map(),
+ parts_map: new Map(),
+ up: false,
+ down: false,
+ left: false,
+ right: false,
+ rendering: null,
+};
+
+async function init() {
+ (window as any).__initialized = true;
+ // @ts-ignore
+ init = undefined;
+
+ const config = await loadConfig();
+
+ const logger = createDebug("main");
+ logger(
+ `Hello, world! StarKingdoms ${APP_VERSION} (${COMMIT_HASH}) at your service!`,
+ );
+ logger("Current view: /play");
+
+ document.getElementById("footer-left")!.innerHTML =
+ `StarKingdoms Client ${APP_VERSION} (${COMMIT_HASH})`;
+
+ addMessage("server-message", "Connecting to the game server...");
+
+ let params = new URLSearchParams(window.location.search);
+
+ if (!params.has("srv")) {
+ addMessage(
+ "server-error",
+ "Server ID missing. Redirecting to main menu in 5 seconds.",
+ );
+ setTimeout(() => {
+ window.location.href = "/";
+ }, 5000);
+ return;
+ }
+ if (!params.has("username")) {
+ addMessage(
+ "server-error",
+ "Username missing. Redirecting to main menu in 5 seconds.",
+ );
+ setTimeout(() => {
+ window.location.href = "/";
+ }, 5000);
+ return;
+ }
+
+ let server_id = params.get("srv")!;
+ let username = params.get("username")!;
+
+ let server = config.servers[server_id];
+
+ await hub_connect(server.clientHubUrl, username);
+}
+
+if ((window as any).__initialized === undefined) {
+ init();
+}
+
+export function player(): Part | undefined {
+ if (global.me !== null) {
+ return global.parts_map.get(global.me!.part_id);
+ } else {
+ return undefined;
+ }
+}
A starkingdoms-client/src/routes/menu/main.ts => starkingdoms-client/src/routes/menu/main.ts +68 -0
@@ 0,0 1,68 @@
+import { ConfigServer, loadConfig } from "../../config.ts";
+import createDebug from "debug";
+import "../../css/themes/catppuccin-mocha.scss";
+import "../../css/style.scss";
+
+// HMR wrapper, to prevent doing reinit twice
+let initialized: boolean | undefined;
+
+async function init() {
+ let config = await loadConfig();
+
+ const logger = createDebug("main");
+ logger(
+ `Hello, world! StarKingdoms ${APP_VERSION} (${COMMIT_HASH}) at your service!`,
+ );
+ logger("Current view: <index>");
+
+ initialized = true;
+
+ const is_development = window.localStorage.getItem("stk-mode") === "debug";
+
+ document.getElementById("footer-left")!.innerHTML =
+ `StarKingdoms Client ${APP_VERSION} (${COMMIT_HASH})`;
+
+ // fill in the select box
+ const select_box = <HTMLSelectElement>document.getElementById("select")!;
+ const username_box = <HTMLInputElement>document.getElementById("username")!;
+ const nonprod_warning = document.getElementById("server-danger")!;
+
+ const form = <HTMLFormElement>document.getElementById("join-fm")!;
+ form.onsubmit = (e) => {
+ e.preventDefault();
+ window.location.href = `/play/?srv=${select_box.value}&username=${username_box.value}`;
+ };
+
+ select_box.innerHTML = "";
+
+ select_box.onchange = () => {
+ if (
+ config.servers[select_box.value] !== undefined &&
+ !config.servers[select_box.value].isProduction
+ ) {
+ nonprod_warning.classList.remove("hidden");
+ } else {
+ nonprod_warning.classList.add("hidden");
+ }
+ };
+
+ for (let server_id in config.servers) {
+ let server: ConfigServer = config.servers[server_id];
+
+ if (server.isDevelopment && !is_development) continue;
+
+ let new_option = document.createElement("option");
+ new_option.value = server_id;
+ new_option.innerText = server.name;
+
+ select_box.appendChild(new_option);
+
+ if (server.isPrimary) {
+ select_box.value = server_id;
+ }
+ }
+}
+
+if (initialized === undefined) {
+ init();
+}
M starkingdoms-client/src/textures.ts => starkingdoms-client/src/textures.ts +2 -2
@@ 1,7 1,7 @@
import { PartType, PlanetType } from "./protocol.ts";
import tex_earth from "./assets/earth.svg";
import tex_hearty from "./assets/hearty.svg";
-import tex_cargo_on from "./assets/cargo_on.svg";
+import tex_cargo_off from "./assets/cargo_off.svg";
import tex_missing from "./assets/missing.svg";
export function planet_texture_url(type: PlanetType): string {
@@ 15,7 15,7 @@ export function part_texture_url(type: PartType): string {
if (type == PartType.Hearty) {
return tex_hearty;
} else if (type == PartType.Cargo) {
- return tex_cargo_on;
+ return tex_cargo_off;
}
return tex_missing;
}
M starkingdoms-client/vite.config.ts => starkingdoms-client/vite.config.ts +15 -0
@@ 1,5 1,8 @@
import { defineConfig } from "vite";
+import { resolve } from "path";
import * as child from "child_process";
+//@ts-ignore
+import autoprefixer from "autoprefixer";
const commitHash = child
.execSync("git describe --no-match --always --abbrev=8 --dirty")
@@ 15,5 18,17 @@ export default defineConfig({
build: {
target: ["chrome89", "edge89", "firefox89", "safari15"],
cssCodeSplit: false,
+ rollupOptions: {
+ input: {
+ main: resolve(__dirname, "index.html"),
+ play: resolve(__dirname, "play/index.html"),
+ },
+ },
+ },
+ appType: "mpa",
+ css: {
+ postcss: {
+ plugins: [autoprefixer({})],
+ },
},
});
M starkingdoms-client/yarn.lock => starkingdoms-client/yarn.lock +177 -1
@@ 426,6 426,48 @@
resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz#90267db13f64d6e9ccb5ae3eac92786a7c77a516"
integrity sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==
+anymatch@~3.1.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+autoprefixer@^10.4.16:
+ version "10.4.16"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8"
+ integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==
+ dependencies:
+ browserslist "^4.21.10"
+ caniuse-lite "^1.0.30001538"
+ fraction.js "^4.3.6"
+ normalize-range "^0.1.2"
+ picocolors "^1.0.0"
+ postcss-value-parser "^4.2.0"
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+browserslist@^4.21.10:
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619"
+ integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==
+ dependencies:
+ caniuse-lite "^1.0.30001541"
+ electron-to-chromium "^1.4.535"
+ node-releases "^2.0.13"
+ update-browserslist-db "^1.0.13"
+
call-bind@^1.0.0:
version "1.0.5"
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513"
@@ 435,6 477,26 @@ call-bind@^1.0.0:
get-intrinsic "^1.2.1"
set-function-length "^1.1.1"
+caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541:
+ version "1.0.30001565"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz#a528b253c8a2d95d2b415e11d8b9942acc100c4f"
+ integrity sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==
+
+"chokidar@>=3.0.0 <4.0.0":
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
+ integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
debug@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
@@ 456,6 518,11 @@ earcut@^2.2.4:
resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a"
integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==
+electron-to-chromium@^1.4.535:
+ version "1.4.599"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.599.tgz#754d368c7d6086c92099236de10dbbc93dfb7688"
+ integrity sha512-FdLI0/h+PvShEqmBMnZCdbgabAuQiiM9Ph8hVGmPOR5GU1XXZgwLRCMogE63OrUxcDEOBlEMVYAgtkJjWFnhRA==
+
esbuild@^0.19.3:
version "0.19.7"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.7.tgz#b9a7235097b81278dcf090e2532ed13c95a2ee84"
@@ 484,11 551,28 @@ esbuild@^0.19.3:
"@esbuild/win32-ia32" "0.19.7"
"@esbuild/win32-x64" "0.19.7"
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
eventemitter3@^4.0.0:
version "4.0.7"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+fraction.js@^4.3.6:
+ version "4.3.7"
+ resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7"
+ integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==
+
fsevents@~2.3.2, fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
@@ 509,6 593,13 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@
has-symbols "^1.0.3"
hasown "^2.0.0"
+glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
gopd@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
@@ 540,6 631,35 @@ hasown@^2.0.0:
dependencies:
function-bind "^1.1.2"
+immutable@^4.0.0:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f"
+ integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
ismobilejs@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ismobilejs/-/ismobilejs-1.1.1.tgz#c56ca0ae8e52b24ca0f22ba5ef3215a2ddbbaa0e"
@@ 555,6 675,21 @@ nanoid@^3.3.6:
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+node-releases@^2.0.13:
+ version "2.0.13"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d"
+ integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-range@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+ integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==
+
object-inspect@^1.9.0:
version "1.13.1"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
@@ 565,6 700,11 @@ picocolors@^1.0.0:
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+picomatch@^2.0.4, picomatch@^2.2.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
pixi.js@^7.3.2:
version "7.3.2"
resolved "https://registry.yarnpkg.com/pixi.js/-/pixi.js-7.3.2.tgz#86f0287a3763e9141691f496e384a2763fb6552c"
@@ 601,6 741,11 @@ pixi.js@^7.3.2:
"@pixi/text-bitmap" "7.3.2"
"@pixi/text-html" "7.3.2"
+postcss-value-parser@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
+ integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
+
postcss@^8.4.31:
version "8.4.31"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"
@@ 627,6 772,13 @@ qs@^6.11.2:
dependencies:
side-channel "^1.0.4"
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
rollup@^4.2.0:
version "4.5.2"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.5.2.tgz#2cf0ef0a57cb4038c50a66356684fd30071d0595"
@@ 646,6 798,15 @@ rollup@^4.2.0:
"@rollup/rollup-win32-x64-msvc" "4.5.2"
fsevents "~2.3.2"
+sass@^1.69.5:
+ version "1.69.5"
+ resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.5.tgz#23e18d1c757a35f2e52cc81871060b9ad653dfde"
+ integrity sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==
+ dependencies:
+ chokidar ">=3.0.0 <4.0.0"
+ immutable "^4.0.0"
+ source-map-js ">=0.6.2 <2.0.0"
+
set-function-length@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed"
@@ 665,11 826,18 @@ side-channel@^1.0.4:
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
-source-map-js@^1.0.2:
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
typescript@^5.2.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.2.tgz#00d1c7c1c46928c5845c1ee8d0cc2791031d4c43"
@@ 680,6 848,14 @@ undici-types@~5.26.4:
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+update-browserslist-db@^1.0.13:
+ version "1.0.13"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4"
+ integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==
+ dependencies:
+ escalade "^3.1.1"
+ picocolors "^1.0.0"
+
url@^0.11.0:
version "0.11.3"
resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad"