Compare commits
305 Commits
noop-test-
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 7aa627c92b | |||
| 0fa667460b | |||
| 05d9c11075 | |||
| 06b47c8ebf | |||
| 78eec83c91 | |||
| e5571b9dee | |||
| ce8c8333cc | |||
| e00c57ca25 | |||
| 15ffb308c0 | |||
| 327ec37ead | |||
| 29ce6b79e3 | |||
| fb17ba6bee | |||
| bd30a1d7aa | |||
| a0795de843 | |||
| 09acf862b7 | |||
| 440e881078 | |||
| 4c990597b7 | |||
| dee38cf602 | |||
| 8b4bc846a5 | |||
| 07c805ea7e | |||
| c320792a9c | |||
| 711d9cd884 | |||
| 909abb1487 | |||
| 7cf6103544 | |||
| 689562aadd | |||
| 91616b653d | |||
| 29f47aff71 | |||
| 74ecc68b17 | |||
| 7b90701434 | |||
| 285d4bf705 | |||
| 889a9689ae | |||
| a67013af96 | |||
| 908d636cc2 | |||
| 4bf7ff46a8 | |||
| 2ea8bbd647 | |||
| cef60447ca | |||
| 1d6c34ef4b | |||
| 5d90b564af | |||
| bce929bb69 | |||
| 3621fb1944 | |||
| 7f5766d684 | |||
| 9bd37b5edb | |||
| 7c590f7b35 | |||
| 3e1b6aa622 | |||
| 1ecc8bd026 | |||
| 8d937baddb | |||
| 75582fbc2f | |||
| e69fa6d85f | |||
| 18eb38dba6 | |||
| b7ba32be7f | |||
| 6be78b5bb4 | |||
| 6be5b2efc7 | |||
| 0b779cc8d1 | |||
| e6f038056c | |||
| 0ce4d7ebd6 | |||
| be3c336bbf | |||
| 9cff1eca36 | |||
| 1a630648a1 | |||
| ee35b420b9 | |||
| 6bbd0a2199 | |||
| d661af3ec7 | |||
| 0a4975fe96 | |||
| 2c4cb471ab | |||
| acb5126389 | |||
| 846af246d9 | |||
| a8fcab58eb | |||
| d2d7ce3168 | |||
| 364a20e9b2 | |||
| 2488de8d96 | |||
| c8ced60086 | |||
| bb302b0ac7 | |||
| 0316acf702 | |||
| 8cd5950d14 | |||
| 9a8e0d4a00 | |||
| 35c9bb9bc8 | |||
| e24fd35e86 | |||
| 70226df95d | |||
| 6734e055af | |||
| c88a126fbc | |||
| fdb97fb123 | |||
| b9081adb2a | |||
| 90b55fadd5 | |||
| 39d881d375 | |||
| 3f3d4500cf | |||
| 8f2c10fdc4 | |||
| 8cc479fdee | |||
| 8b5ba130d9 | |||
| ac07945e92 | |||
| 96b042a4c2 | |||
| cc4011ff25 | |||
| aff9f3f276 | |||
| b0b88f432c | |||
| 82eef3f26e | |||
| f3eb0dfaaf | |||
| 37509b6f50 | |||
| 2a3627fed0 | |||
| fa34292a2c | |||
| 979485e762 | |||
| 781b4cbd34 | |||
| fcba9c74ab | |||
| 69e67b50e9 | |||
| e85920f4f3 | |||
| cdd5963e0f | |||
| 265e082b7b | |||
| 3f86d45bd3 | |||
| 9adf91162a | |||
| 79f98ce568 | |||
| 63edc13268 | |||
| 7c2b81d4fc | |||
| b352faf5f5 | |||
| 3ef3c721c4 | |||
| 18588a3718 | |||
| 1a7fb9552f | |||
| 1c879345c0 | |||
| 60369a24f3 | |||
| 9eb221cc76 | |||
| 4ee9aa036b | |||
| 7395b5b125 | |||
| 3612b502bb | |||
| 618a881268 | |||
| f39b13dcac | |||
| cc06e73e59 | |||
| c7188e4f8f | |||
| 07114e85dc | |||
| e0508c0d43 | |||
| 6b7cf5cdaf | |||
| 87bf4a4f5e | |||
| d7614ac85b | |||
| bb959832c4 | |||
| 6e7f0b28a4 | |||
| f07c8117a6 | |||
| d5cd19cdb1 | |||
| f85dfe4798 | |||
| 640fbd8577 | |||
| 0f49035e4f | |||
| d786a1a416 | |||
| 6e964241cc | |||
| d55bbf3309 | |||
| ff99f4e8c8 | |||
| 1e05b407a0 | |||
| ea12250556 | |||
| caaffe4ec8 | |||
| 6ae6039f0b | |||
| 055c911735 | |||
| 1476aedcf7 | |||
| bb493e09a0 | |||
| 9d3af81cb4 | |||
| 18ca1e91cc | |||
| dab1210e88 | |||
| f9028fcff3 | |||
| 656a4a764c | |||
| c8ead1a9ce | |||
| e462f4f943 | |||
| 8004a394b7 | |||
| 1307afd6fd | |||
| 65c1259916 | |||
| dbc65feeed | |||
| df11ef6fe0 | |||
| 0a96014565 | |||
| e6363c36e7 | |||
| fb0e82a5d2 | |||
| 87e11b44fd | |||
| 393352db5e | |||
| 5445fc1185 | |||
| 4782be419e | |||
| 8d04a7d315 | |||
| 773627a090 | |||
| 9b3acad235 | |||
| d582ee59c5 | |||
| f39e114c40 | |||
| c60d54f63b | |||
| e740be97a0 | |||
| 9ae626d5f8 | |||
| 1473bf80df | |||
| 955156a82f | |||
| 81944c71be | |||
| c42e14d90a | |||
| 27a228979e | |||
| 951005a951 | |||
| 89386b871e | |||
| 24f5cf2de9 | |||
| 84dc5a8e19 | |||
| ca317a2f53 | |||
| 7b6400c640 | |||
| ff62e22e03 | |||
| 0b65e902c2 | |||
| a3338b9430 | |||
| 51b331b679 | |||
| b7f15ebf51 | |||
| f99092717d | |||
| 3205e3e703 | |||
| d3e19fdd42 | |||
| 6b0e926d05 | |||
| 2ccd6e4527 | |||
| 0755d0820c | |||
| 564c6a82b5 | |||
| 1a99e1c362 | |||
| cb139b839e | |||
| 806fe2e878 | |||
| 8373bc0d2e | |||
| 0ca8ffdd90 | |||
| 2dc9bba7f9 | |||
| f5b35fd87f | |||
| 5ea729a3a8 | |||
| 481a83ca7c | |||
| f489a3d8f4 | |||
| a38bccca4d | |||
| bd1cd53332 | |||
| 3414b2458a | |||
| 19ce095e7f | |||
| de804d2529 | |||
| 46fc4fcb56 | |||
| 3b8fe08d9e | |||
| ebeb5e0d1b | |||
| e2263ec3a1 | |||
| 3eed9387be | |||
| dffba721e1 | |||
| 39c13fbeb4 | |||
| 4ff7edd030 | |||
| 42ebf6a763 | |||
| 0366eeffe8 | |||
| f8a08f78b1 | |||
| a105060c3a | |||
| dc0b7f9591 | |||
| bc2e37bf2f | |||
| c8f7fa1e1a | |||
| 9e24a5e1e1 | |||
| 90e44264a2 | |||
| 44663ba869 | |||
| 8941fe662c | |||
| f03ff1e0cd | |||
| 545e94dddc | |||
| 29a5698fe0 | |||
| c9beda6ea0 | |||
| 4e2a4d7318 | |||
| cc38567dd3 | |||
| a1f675194a | |||
| 2f837d15e6 | |||
| beb8b976d3 | |||
| 7dc08d851f | |||
| 36823472ed | |||
| 0510a1b144 | |||
| a54ff51227 | |||
| f866a02838 | |||
| fbf5791845 | |||
| 6fc5227f6e | |||
| 34e47888cc | |||
| 4d9f9991b7 | |||
| f99b4c6a0b | |||
| a8fe774382 | |||
| 61c945d7a6 | |||
| 8a1dd4f7b1 | |||
| b84ba244b6 | |||
| 5f626e0515 | |||
| 27c523273c | |||
| 2ad9865549 | |||
| 4266af92a4 | |||
| 461ce2cca3 | |||
| 3b93798e5b | |||
| ca6077d5d6 | |||
| c6633992cc | |||
| 6555caca58 | |||
| 6b21c1ce6f | |||
| c4bf5cfcef | |||
| 7de41ab9ba | |||
| 253ae570ec | |||
| 7bce82aaf7 | |||
| 974284c624 | |||
| 820abc86e8 | |||
| cd1e1490a5 | |||
| a97cf6a5bd | |||
| a48323d829 | |||
| 3cb24e7e5e | |||
| bb29ce78c1 | |||
| 36d81c55a1 | |||
| 33708515a0 | |||
| 28cd0642b7 | |||
| faa23e5eb5 | |||
| 2131d86472 | |||
| e240aa5584 | |||
| e6cbf26e92 | |||
| 348ab00b7e | |||
| 4b566af98d | |||
| 4b3340de60 | |||
| 1d802296e1 | |||
| 4f35883311 | |||
| 4ad089d60d | |||
| 0612c2f8d0 | |||
| ed5125c36b | |||
| 4bb119fd21 | |||
| e613010f0b | |||
| 424d9b9532 | |||
| 6589c72279 | |||
| e7dc511323 | |||
| 8fdb313cb2 | |||
| 98d2c799b4 | |||
| 7bd730816a | |||
| 7e417b7c4d | |||
| 6e68a6ddb1 | |||
| 47c251208c | |||
| 04103573d0 | |||
| fdd4096dba | |||
| 483edf66db | |||
| f2664db7d8 | |||
| 5b2314644f |
@ -3,7 +3,11 @@ WORKDIR /app
|
|||||||
COPY package.json ./
|
COPY package.json ./
|
||||||
RUN npm install
|
RUN npm install
|
||||||
COPY index.html ./
|
COPY index.html ./
|
||||||
|
COPY public ./public
|
||||||
COPY src ./src
|
COPY src ./src
|
||||||
|
COPY scripts ./scripts
|
||||||
|
COPY tests ./tests
|
||||||
|
COPY server ./server
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
FROM nginx:1.27-alpine
|
FROM nginx:1.27-alpine
|
||||||
|
|||||||
41
README.md
@ -1,3 +1,42 @@
|
|||||||
# airship-phaser
|
# airship-phaser
|
||||||
|
|
||||||
Top-down Phaser.js airship combat prototype
|
Top-down Phaser.js airship combat prototype.
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
npm test
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Production builds run the regression suite before Vite:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Runtime diagnostics
|
||||||
|
|
||||||
|
The browser keeps the latest 300 structured events in memory.
|
||||||
|
|
||||||
|
In Chrome DevTools:
|
||||||
|
|
||||||
|
```js
|
||||||
|
airshipDebug.getLogs()
|
||||||
|
airshipDebug.snapshot()
|
||||||
|
airshipDebug.clearLogs()
|
||||||
|
```
|
||||||
|
|
||||||
|
Useful events include:
|
||||||
|
|
||||||
|
- `scene:init`, `scene:create`, `scene:heartbeat`, `scene:shutdown`
|
||||||
|
- `combat:broadside-fired`
|
||||||
|
- `combat:player-hit-queued`
|
||||||
|
- `combat:player-hit-processed`
|
||||||
|
- `combat:pirate-hit`
|
||||||
|
- `game:finish`
|
||||||
|
- `hud:image-error`, `hud:helm-frame-error`, `hud:helm-knob-error`
|
||||||
|
- `runtime:error`, `runtime:unhandled-rejection`
|
||||||
|
|
||||||
|
If gameplay appears frozen, inspect `airshipDebug.snapshot()` first, then the tail of `airshipDebug.getLogs()`.
|
||||||
|
|||||||
418
index.html
@ -11,6 +11,178 @@
|
|||||||
overscroll-behavior: none;
|
overscroll-behavior: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.airship-loading #mobile-controls {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
#airship-loading-screen {
|
||||||
|
position: fixed;
|
||||||
|
inset: 0;
|
||||||
|
z-index: 2000;
|
||||||
|
display: grid;
|
||||||
|
place-items: center;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding:
|
||||||
|
max(24px, env(safe-area-inset-top))
|
||||||
|
max(22px, env(safe-area-inset-right))
|
||||||
|
max(28px, env(safe-area-inset-bottom))
|
||||||
|
max(22px, env(safe-area-inset-left));
|
||||||
|
background:
|
||||||
|
radial-gradient(circle at 50% 38%, rgba(15, 70, 77, .38), transparent 33%),
|
||||||
|
linear-gradient(180deg, #132837 0%, #0a1a25 52%, #07151e 100%);
|
||||||
|
color: #f7e3ad;
|
||||||
|
opacity: 1;
|
||||||
|
visibility: visible;
|
||||||
|
transition: opacity 360ms ease, visibility 360ms ease;
|
||||||
|
pointer-events: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#airship-loading-screen::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
inset: 0;
|
||||||
|
opacity: .22;
|
||||||
|
background-image:
|
||||||
|
linear-gradient(rgba(224, 177, 87, .08) 1px, transparent 1px),
|
||||||
|
linear-gradient(90deg, rgba(224, 177, 87, .06) 1px, transparent 1px);
|
||||||
|
background-size: 42px 42px;
|
||||||
|
mask-image: linear-gradient(to bottom, transparent, black 22%, black 78%, transparent);
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#airship-loading-screen.is-ready {
|
||||||
|
opacity: 0;
|
||||||
|
visibility: hidden;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.airship-loader {
|
||||||
|
position: relative;
|
||||||
|
width: min(420px, 88vw);
|
||||||
|
display: grid;
|
||||||
|
justify-items: center;
|
||||||
|
gap: 18px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.airship-loader-mark {
|
||||||
|
position: relative;
|
||||||
|
width: clamp(108px, 27vw, 150px);
|
||||||
|
aspect-ratio: 1;
|
||||||
|
border: 4px solid #8e5c22;
|
||||||
|
border-radius: 50%;
|
||||||
|
background:
|
||||||
|
radial-gradient(circle, #0c4b50 0 42%, #082f35 43% 57%, #071c25 58%);
|
||||||
|
box-shadow:
|
||||||
|
0 0 0 3px #d1a24e,
|
||||||
|
0 0 0 7px #4e3217,
|
||||||
|
inset 0 0 28px rgba(0,0,0,.55),
|
||||||
|
0 14px 38px rgba(0,0,0,.42);
|
||||||
|
}
|
||||||
|
|
||||||
|
.airship-loader-mark::before,
|
||||||
|
.airship-loader-mark::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
width: 72%;
|
||||||
|
height: 8px;
|
||||||
|
margin: -4px 0 0 -36%;
|
||||||
|
border-radius: 999px;
|
||||||
|
background: linear-gradient(90deg, #8d5d26, #f0cf77 46%, #8d5d26);
|
||||||
|
transform-origin: center;
|
||||||
|
animation: airship-loader-spin 2.8s linear infinite;
|
||||||
|
box-shadow: 0 1px 2px rgba(0,0,0,.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.airship-loader-mark::after {
|
||||||
|
animation-direction: reverse;
|
||||||
|
animation-duration: 4.2s;
|
||||||
|
transform: rotate(90deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.airship-loader-hub {
|
||||||
|
position: absolute;
|
||||||
|
inset: 36%;
|
||||||
|
z-index: 2;
|
||||||
|
border: 3px solid #61401d;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: radial-gradient(circle at 38% 35%, #f0d179, #a66c29 64%, #573516 100%);
|
||||||
|
box-shadow: 0 0 0 2px #e0b65d, 0 3px 8px rgba(0,0,0,.45);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes airship-loader-spin {
|
||||||
|
to { transform: rotate(360deg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.airship-loader-kicker {
|
||||||
|
margin: 4px 0 -8px;
|
||||||
|
color: #a8c6c9;
|
||||||
|
font: 700 11px/1.2 ui-sans-serif, system-ui, sans-serif;
|
||||||
|
letter-spacing: .34em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.airship-loader h1 {
|
||||||
|
margin: 0;
|
||||||
|
font: 700 clamp(28px, 8vw, 48px)/.95 Georgia, 'Times New Roman', serif;
|
||||||
|
letter-spacing: .02em;
|
||||||
|
text-shadow: 0 3px 0 rgba(74, 44, 15, .75);
|
||||||
|
}
|
||||||
|
|
||||||
|
.airship-loader-phase {
|
||||||
|
min-height: 20px;
|
||||||
|
margin: 0;
|
||||||
|
color: #f5dda0;
|
||||||
|
font: 700 13px/1.3 ui-sans-serif, system-ui, sans-serif;
|
||||||
|
letter-spacing: .04em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.airship-loader-track {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
height: 12px;
|
||||||
|
padding: 2px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 1px solid #8a5b27;
|
||||||
|
border-radius: 999px;
|
||||||
|
background: #06161d;
|
||||||
|
box-shadow: inset 0 2px 5px rgba(0,0,0,.65), 0 0 0 1px rgba(230,183,91,.16);
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.airship-loader-fill {
|
||||||
|
width: 6%;
|
||||||
|
height: 100%;
|
||||||
|
border-radius: inherit;
|
||||||
|
background:
|
||||||
|
linear-gradient(90deg, #18666b, #3f9a8d 62%, #e3bd62 100%);
|
||||||
|
box-shadow: 0 0 12px rgba(86, 191, 167, .5);
|
||||||
|
transition: width 180ms ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.airship-loader-meta {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 12px;
|
||||||
|
color: #85a8ad;
|
||||||
|
font: 600 10px/1.3 ui-monospace, SFMono-Regular, Menlo, monospace;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: .08em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.airship-loader-meta span:last-child {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.airship-loader-mark::before,
|
||||||
|
.airship-loader-mark::after { animation: none; }
|
||||||
|
#airship-loading-screen,
|
||||||
|
.airship-loader-fill { transition-duration: 1ms; }
|
||||||
|
}
|
||||||
|
|
||||||
#mobile-controls {
|
#mobile-controls {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
inset: 0;
|
inset: 0;
|
||||||
@ -20,16 +192,69 @@
|
|||||||
-webkit-user-select: none;
|
-webkit-user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#drag-stick {
|
||||||
|
position: absolute;
|
||||||
|
left: max(18px, env(safe-area-inset-left));
|
||||||
|
bottom: max(22px, env(safe-area-inset-bottom));
|
||||||
|
width: 132px;
|
||||||
|
height: 132px;
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.28);
|
||||||
|
border-radius: 50%;
|
||||||
|
background: rgba(7, 16, 24, 0.42);
|
||||||
|
box-shadow: inset 0 0 0 1px rgba(140, 211, 255, 0.08);
|
||||||
|
backdrop-filter: blur(5px);
|
||||||
|
-webkit-backdrop-filter: blur(5px);
|
||||||
|
pointer-events: auto;
|
||||||
|
touch-action: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#drag-stick::before,
|
||||||
|
#drag-stick::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
background: rgba(232, 242, 247, 0.18);
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#drag-stick::before {
|
||||||
|
left: 50%;
|
||||||
|
top: 12px;
|
||||||
|
bottom: 12px;
|
||||||
|
width: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#drag-stick::after {
|
||||||
|
top: 50%;
|
||||||
|
left: 12px;
|
||||||
|
right: 12px;
|
||||||
|
height: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#drag-thumb {
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
width: 58px;
|
||||||
|
height: 58px;
|
||||||
|
margin: -29px 0 0 -29px;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.5);
|
||||||
|
background: rgba(140, 211, 255, 0.28);
|
||||||
|
box-shadow: 0 3px 18px rgba(0, 0, 0, 0.28);
|
||||||
|
pointer-events: none;
|
||||||
|
will-change: transform;
|
||||||
|
}
|
||||||
|
|
||||||
.mobile-control {
|
.mobile-control {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
min-width: 62px;
|
min-width: 72px;
|
||||||
height: 62px;
|
height: 64px;
|
||||||
padding: 0 14px;
|
padding: 0 14px;
|
||||||
border: 1px solid rgba(255, 255, 255, 0.35);
|
border: 1px solid rgba(255, 255, 255, 0.35);
|
||||||
border-radius: 18px;
|
border-radius: 18px;
|
||||||
background: rgba(7, 16, 24, 0.68);
|
background: rgba(7, 16, 24, 0.68);
|
||||||
color: #e8f2f7;
|
color: #e8f2f7;
|
||||||
font: 700 18px/1 system-ui, sans-serif;
|
font: 700 13px/1 system-ui, sans-serif;
|
||||||
backdrop-filter: blur(6px);
|
backdrop-filter: blur(6px);
|
||||||
-webkit-backdrop-filter: blur(6px);
|
-webkit-backdrop-filter: blur(6px);
|
||||||
pointer-events: auto;
|
pointer-events: auto;
|
||||||
@ -42,72 +267,215 @@
|
|||||||
transform: scale(0.96);
|
transform: scale(0.96);
|
||||||
}
|
}
|
||||||
|
|
||||||
.mobile-control.left { left: max(14px, env(safe-area-inset-left)); bottom: max(18px, env(safe-area-inset-bottom)); }
|
.mobile-control.port {
|
||||||
.mobile-control.right { left: max(88px, calc(env(safe-area-inset-left) + 74px)); bottom: max(18px, env(safe-area-inset-bottom)); }
|
right: max(18px, env(safe-area-inset-right));
|
||||||
.mobile-control.throttle { right: max(14px, env(safe-area-inset-right)); bottom: max(92px, calc(env(safe-area-inset-bottom) + 74px)); }
|
bottom: max(100px, calc(env(safe-area-inset-bottom) + 82px));
|
||||||
.mobile-control.reverse { right: max(14px, env(safe-area-inset-right)); bottom: max(18px, env(safe-area-inset-bottom)); }
|
}
|
||||||
.mobile-control.port { left: max(14px, env(safe-area-inset-left)); bottom: max(100px, calc(env(safe-area-inset-bottom) + 82px)); font-size: 13px; }
|
|
||||||
.mobile-control.starboard { right: max(88px, calc(env(safe-area-inset-right) + 74px)); bottom: max(18px, env(safe-area-inset-bottom)); font-size: 13px; }
|
.mobile-control.starboard {
|
||||||
.mobile-control.restart { top: max(14px, env(safe-area-inset-top)); right: max(14px, env(safe-area-inset-right)); width: 48px; min-width: 48px; height: 48px; border-radius: 50%; }
|
right: max(18px, env(safe-area-inset-right));
|
||||||
|
bottom: max(26px, env(safe-area-inset-bottom));
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-control.restart {
|
||||||
|
top: max(14px, env(safe-area-inset-top));
|
||||||
|
right: max(14px, env(safe-area-inset-right));
|
||||||
|
width: 48px;
|
||||||
|
min-width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
padding: 0;
|
||||||
|
border-radius: 50%;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
@media (hover: hover) and (pointer: fine) {
|
@media (hover: hover) and (pointer: fine) {
|
||||||
#mobile-controls { display: none; }
|
#mobile-controls { display: none; }
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body class="airship-loading">
|
||||||
|
<div id="airship-loading-screen" role="status" aria-live="polite" aria-label="Loading Arrowstack Airship">
|
||||||
|
<div class="airship-loader">
|
||||||
|
<div class="airship-loader-mark" aria-hidden="true">
|
||||||
|
<div class="airship-loader-hub"></div>
|
||||||
|
</div>
|
||||||
|
<p class="airship-loader-kicker">ARROWSTACK AIRSHIP</p>
|
||||||
|
<h1>Preparing the Sparrow</h1>
|
||||||
|
<p class="airship-loader-phase" data-loading="phase">Warming the engines…</p>
|
||||||
|
<div class="airship-loader-track" aria-hidden="true">
|
||||||
|
<div class="airship-loader-fill" data-loading="fill"></div>
|
||||||
|
</div>
|
||||||
|
<div class="airship-loader-meta">
|
||||||
|
<span data-loading="percent">6%</span>
|
||||||
|
<span data-loading="network">Checking captain credentials…</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
(() => {
|
||||||
|
const root = document.querySelector('#airship-loading-screen');
|
||||||
|
const fill = root.querySelector('[data-loading="fill"]');
|
||||||
|
const phase = root.querySelector('[data-loading="phase"]');
|
||||||
|
const percent = root.querySelector('[data-loading="percent"]');
|
||||||
|
const network = root.querySelector('[data-loading="network"]');
|
||||||
|
let progress = 0.06;
|
||||||
|
let ready = false;
|
||||||
|
|
||||||
|
const setProgress = (value, label) => {
|
||||||
|
if (ready) return;
|
||||||
|
progress = Math.max(progress, Math.min(1, Number(value) || 0));
|
||||||
|
fill.style.width = `${Math.round(progress * 100)}%`;
|
||||||
|
percent.textContent = `${Math.round(progress * 100)}%`;
|
||||||
|
if (label) phase.textContent = label;
|
||||||
|
};
|
||||||
|
|
||||||
|
const setNetwork = (label) => {
|
||||||
|
if (label) network.textContent = label;
|
||||||
|
};
|
||||||
|
|
||||||
|
const finish = () => {
|
||||||
|
if (ready) return;
|
||||||
|
ready = true;
|
||||||
|
setNetwork(network.textContent);
|
||||||
|
fill.style.width = '100%';
|
||||||
|
percent.textContent = '100%';
|
||||||
|
phase.textContent = 'Ready to sail';
|
||||||
|
window.setTimeout(() => {
|
||||||
|
root.classList.add('is-ready');
|
||||||
|
document.body.classList.remove('airship-loading');
|
||||||
|
}, 140);
|
||||||
|
};
|
||||||
|
|
||||||
|
window.airshipLoading = { setProgress, setNetwork, finish };
|
||||||
|
window.addEventListener('airship:loading-progress', (event) => {
|
||||||
|
setProgress(event.detail?.progress, event.detail?.phase);
|
||||||
|
});
|
||||||
|
window.addEventListener('airship:game-ready', finish);
|
||||||
|
|
||||||
|
window.setTimeout(() => {
|
||||||
|
if (!ready && progress < 0.12) setProgress(0.12, 'Starting flight systems…');
|
||||||
|
}, 700);
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
|
||||||
<div id="app">
|
<div id="app">
|
||||||
<div id="game"></div>
|
<div id="game"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="mobile-controls" aria-label="Touch controls">
|
<div id="mobile-controls" aria-label="Touch controls">
|
||||||
<button class="mobile-control left" data-code="ArrowLeft" data-key="ArrowLeft" data-keycode="37" aria-label="Steer left">←</button>
|
<div id="drag-stick" aria-label="Drag to steer and throttle">
|
||||||
<button class="mobile-control right" data-code="ArrowRight" data-key="ArrowRight" data-keycode="39" aria-label="Steer right">→</button>
|
<div id="drag-thumb"></div>
|
||||||
<button class="mobile-control throttle" data-code="ArrowUp" data-key="ArrowUp" data-keycode="38" aria-label="Throttle">▲</button>
|
</div>
|
||||||
<button class="mobile-control reverse" data-code="ArrowDown" data-key="ArrowDown" data-keycode="40" aria-label="Reverse">▼</button>
|
|
||||||
<button class="mobile-control port" data-code="KeyQ" data-key="q" data-keycode="81" aria-label="Fire port broadside">PORT</button>
|
<button class="mobile-control port" data-code="KeyQ" data-key="q" data-keycode="81" aria-label="Fire port broadside">PORT</button>
|
||||||
<button class="mobile-control starboard" data-code="KeyE" data-key="e" data-keycode="69" aria-label="Fire starboard broadside">STARBOARD</button>
|
<button class="mobile-control starboard" data-code="KeyE" data-key="e" data-keycode="69" aria-label="Fire starboard broadside">STARBOARD</button>
|
||||||
|
<button class="mobile-control ship-action buy" data-action="open-dock" aria-label="Dock at port">DOCK</button>
|
||||||
<button class="mobile-control restart" data-code="KeyR" data-key="r" data-keycode="82" aria-label="Restart">↻</button>
|
<button class="mobile-control restart" data-code="KeyR" data-key="r" data-keycode="82" aria-label="Restart">↻</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script type="module" src="/src/game-v2.js"></script>
|
<script type="module" src="/src/game-entry.js"></script>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
const dispatchKey = (type, button) => {
|
const dispatchKey = (type, key, code, keyCode) => {
|
||||||
const keyCode = Number(button.dataset.keycode);
|
|
||||||
const event = new KeyboardEvent(type, {
|
const event = new KeyboardEvent(type, {
|
||||||
key: button.dataset.key,
|
key,
|
||||||
code: button.dataset.code,
|
code,
|
||||||
bubbles: true,
|
bubbles: true,
|
||||||
cancelable: true,
|
cancelable: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
Object.defineProperty(event, 'keyCode', { get: () => keyCode });
|
Object.defineProperty(event, 'keyCode', { get: () => keyCode });
|
||||||
Object.defineProperty(event, 'which', { get: () => keyCode });
|
Object.defineProperty(event, 'which', { get: () => keyCode });
|
||||||
window.dispatchEvent(event);
|
window.dispatchEvent(event);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const emitHelmVector = (x, y) => {
|
||||||
|
window.dispatchEvent(new CustomEvent('airship:helm-vector', { detail: { x, y } }));
|
||||||
|
};
|
||||||
|
|
||||||
|
const releaseStick = () => {
|
||||||
|
document.querySelector('#drag-thumb').style.transform = 'translate(0px, 0px)';
|
||||||
|
emitHelmVector(0, 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
const stick = document.querySelector('#drag-stick');
|
||||||
|
const thumb = document.querySelector('#drag-thumb');
|
||||||
|
const radius = 45;
|
||||||
|
let stickPointer = null;
|
||||||
|
|
||||||
|
const updateStick = (event) => {
|
||||||
|
const rect = stick.getBoundingClientRect();
|
||||||
|
let dx = event.clientX - (rect.left + rect.width / 2);
|
||||||
|
let dy = event.clientY - (rect.top + rect.height / 2);
|
||||||
|
const length = Math.hypot(dx, dy);
|
||||||
|
if (length > radius) {
|
||||||
|
dx = dx / length * radius;
|
||||||
|
dy = dy / length * radius;
|
||||||
|
}
|
||||||
|
|
||||||
|
thumb.style.transform = `translate(${dx}px, ${dy}px)`;
|
||||||
|
emitHelmVector(dx / radius, dy / radius);
|
||||||
|
};
|
||||||
|
|
||||||
|
stick.addEventListener('pointerdown', (event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
stickPointer = event.pointerId;
|
||||||
|
stick.setPointerCapture?.(event.pointerId);
|
||||||
|
updateStick(event);
|
||||||
|
});
|
||||||
|
|
||||||
|
stick.addEventListener('pointermove', (event) => {
|
||||||
|
if (event.pointerId !== stickPointer) return;
|
||||||
|
event.preventDefault();
|
||||||
|
updateStick(event);
|
||||||
|
});
|
||||||
|
|
||||||
|
const endStick = (event) => {
|
||||||
|
if (stickPointer !== null && event.pointerId !== undefined && event.pointerId !== stickPointer) return;
|
||||||
|
event.preventDefault?.();
|
||||||
|
stickPointer = null;
|
||||||
|
releaseStick();
|
||||||
|
};
|
||||||
|
|
||||||
|
stick.addEventListener('pointerup', endStick);
|
||||||
|
stick.addEventListener('pointercancel', endStick);
|
||||||
|
stick.addEventListener('lostpointercapture', endStick);
|
||||||
|
stick.addEventListener('contextmenu', (event) => event.preventDefault());
|
||||||
|
|
||||||
for (const button of document.querySelectorAll('.mobile-control')) {
|
for (const button of document.querySelectorAll('.mobile-control')) {
|
||||||
|
const isAction = Boolean(button.dataset.action);
|
||||||
|
const fire = (type) => {
|
||||||
|
if (isAction) {
|
||||||
|
if (type === 'keydown') {
|
||||||
|
window.dispatchEvent(new CustomEvent('airship:action', {
|
||||||
|
detail: { action: button.dataset.action },
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dispatchKey(type, button.dataset.key, button.dataset.code, Number(button.dataset.keycode));
|
||||||
|
};
|
||||||
|
|
||||||
const release = (event) => {
|
const release = (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
dispatchKey('keyup', button);
|
fire('keyup');
|
||||||
button.classList.remove('active');
|
button.classList.remove('active');
|
||||||
};
|
};
|
||||||
|
|
||||||
button.addEventListener('pointerdown', (event) => {
|
button.addEventListener('pointerdown', (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
button.setPointerCapture?.(event.pointerId);
|
button.setPointerCapture?.(event.pointerId);
|
||||||
dispatchKey('keydown', button);
|
fire('keydown');
|
||||||
button.classList.add('active');
|
button.classList.add('active');
|
||||||
});
|
});
|
||||||
|
|
||||||
button.addEventListener('pointerup', release);
|
button.addEventListener('pointerup', release);
|
||||||
button.addEventListener('pointercancel', release);
|
button.addEventListener('pointercancel', release);
|
||||||
button.addEventListener('lostpointercapture', () => {
|
button.addEventListener('lostpointercapture', () => {
|
||||||
dispatchKey('keyup', button);
|
fire('keyup');
|
||||||
button.classList.remove('active');
|
button.classList.remove('active');
|
||||||
});
|
});
|
||||||
button.addEventListener('contextmenu', (event) => event.preventDefault());
|
button.addEventListener('contextmenu', (event) => event.preventDefault());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
window.addEventListener('blur', releaseStick);
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -5,11 +5,14 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite --host 0.0.0.0",
|
"dev": "vite --host 0.0.0.0",
|
||||||
"build": "vite build",
|
"test": "node --test tests/*.test.mjs",
|
||||||
|
"test:watch": "node --test --watch tests/*.test.mjs",
|
||||||
|
"build": "npm test && node scripts/materialize-controller-assets.mjs && vite build",
|
||||||
"preview": "vite preview --host 0.0.0.0"
|
"preview": "vite preview --host 0.0.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"phaser": "^3.90.0"
|
"phaser": "^3.90.0",
|
||||||
|
"keycloak-js": "^26.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"vite": "^7.0.0"
|
"vite": "^7.0.0"
|
||||||
|
|||||||
2
public/silent-check-sso.html
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html><body><script>parent.postMessage(location.href, location.origin);</script></body></html>
|
||||||
19
scripts/materialize-controller-assets.mjs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import { mkdir, writeFile } from 'node:fs/promises';
|
||||||
|
import topHudData from '../src/assets/controller/top-hud.js';
|
||||||
|
import helmData from '../src/assets/controller/helm-action.js';
|
||||||
|
import cannonBase64 from '../src/assets/controller/cannon-roundel.js';
|
||||||
|
|
||||||
|
const outDir = new URL('../public/assets/controller/', import.meta.url);
|
||||||
|
await mkdir(outDir, { recursive: true });
|
||||||
|
|
||||||
|
const writeDataUrl = async (name, dataUrl) => {
|
||||||
|
const match = /^data:[^;]+;base64,(.+)$/.exec(dataUrl);
|
||||||
|
if (!match) throw new Error(`Invalid data URL for ${name}`);
|
||||||
|
await writeFile(new URL(name, outDir), Buffer.from(match[1], 'base64'));
|
||||||
|
};
|
||||||
|
|
||||||
|
await writeDataUrl('top-hud.webp', topHudData);
|
||||||
|
await writeDataUrl('helm-sheet.webp', helmData);
|
||||||
|
await writeFile(new URL('cannon-roundel.jpg', outDir), Buffer.from(cannonBase64, 'base64'));
|
||||||
|
|
||||||
|
console.log('Materialized controller assets');
|
||||||
14
server/Dockerfile
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
FROM golang:1.23-alpine AS build
|
||||||
|
WORKDIR /src
|
||||||
|
COPY go.mod ./
|
||||||
|
RUN go mod download
|
||||||
|
COPY . .
|
||||||
|
RUN CGO_ENABLED=0 GOOS=linux go test -mod=mod ./... && go build -mod=mod -trimpath -ldflags='-s -w' -o /out/airship-server .
|
||||||
|
|
||||||
|
FROM alpine:3.21
|
||||||
|
RUN apk add --no-cache ca-certificates
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=build /out/airship-server /app/airship-server
|
||||||
|
EXPOSE 8080
|
||||||
|
HEALTHCHECK --interval=10s --timeout=3s --start-period=5s --retries=5 CMD wget -qO- http://127.0.0.1:8080/health >/dev/null || exit 1
|
||||||
|
ENTRYPOINT ["/app/airship-server"]
|
||||||
14
server/README.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# Airship multiplayer server
|
||||||
|
|
||||||
|
Go transport/authentication service for the Phaser airship game.
|
||||||
|
|
||||||
|
Current slice:
|
||||||
|
|
||||||
|
- verifies Keycloak access tokens
|
||||||
|
- persists authenticated player profiles to PostgreSQL
|
||||||
|
- issues one-time 30-second WebSocket tickets
|
||||||
|
- maintains one live connection per Keycloak subject
|
||||||
|
- validates and broadcasts player transform/hull snapshots at 10 Hz
|
||||||
|
- exposes `/health`, `/api/me`, `/api/ws-ticket`, and `/ws`
|
||||||
|
|
||||||
|
This is intentionally a transport/presence milestone. Player combat, pirates, projectiles, trading and economy still run in the Phaser client and are the next systems to move server-side.
|
||||||
9
server/go.mod
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
module airship-server
|
||||||
|
|
||||||
|
go 1.23
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/coreos/go-oidc/v3 v3.12.0
|
||||||
|
github.com/gorilla/websocket v1.5.3
|
||||||
|
github.com/jackc/pgx/v5 v5.7.2
|
||||||
|
)
|
||||||
1116
server/main.go
Normal file
276
server/main_test.go
Normal file
@ -0,0 +1,276 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestTicketSingleUse(t *testing.T) {
|
||||||
|
store := newTicketStore()
|
||||||
|
value, err := store.issue("player-1", "Dave")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if item, ok := store.consume(value); !ok || item.Subject != "player-1" {
|
||||||
|
t.Fatalf("first consume failed: %#v %v", item, ok)
|
||||||
|
}
|
||||||
|
if _, ok := store.consume(value); ok {
|
||||||
|
t.Fatal("ticket must be one-time")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestTransformSanitizers(t *testing.T) {
|
||||||
|
if got := clampFloat(-5, 0, worldSize); got != 0 {
|
||||||
|
t.Fatalf("clamp low=%v", got)
|
||||||
|
}
|
||||||
|
if got := clampFloat(6000, 0, worldSize); got != worldSize {
|
||||||
|
t.Fatalf("clamp high=%v", got)
|
||||||
|
}
|
||||||
|
if got := clampFloat(math.NaN(), 0, worldSize); got != 0 {
|
||||||
|
t.Fatalf("nan=%v", got)
|
||||||
|
}
|
||||||
|
if got := normalizeAngle(-90); got != 270 {
|
||||||
|
t.Fatalf("angle=%v", got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAudienceMatch(t *testing.T) {
|
||||||
|
if !audienceMatches(claims{AuthorizedParty: "airship-web"}, "airship-web") {
|
||||||
|
t.Fatal("azp should match")
|
||||||
|
}
|
||||||
|
if !audienceMatches(claims{Audience: []interface{}{"account", "airship-web"}}, "airship-web") {
|
||||||
|
t.Fatal("aud should match")
|
||||||
|
}
|
||||||
|
if audienceMatches(claims{AuthorizedParty: "other"}, "airship-web") {
|
||||||
|
t.Fatal("wrong client must not match")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestServerMovementUsesInputNotClientTransform(t *testing.T) {
|
||||||
|
state := newPlayerState("player-1", "Dave", 0, 0)
|
||||||
|
startX, startY := state.X, state.Y
|
||||||
|
input := inputState{Throttle: 1, Steer: 0.4, Seq: 7}
|
||||||
|
now := time.Unix(100, 0)
|
||||||
|
for i := 0; i < 30; i++ {
|
||||||
|
stepPlayer(&state, input, now.Add(time.Duration(i)*simTick), simTick.Seconds())
|
||||||
|
}
|
||||||
|
if state.InputSeq != 7 {
|
||||||
|
t.Fatalf("input seq=%d", state.InputSeq)
|
||||||
|
}
|
||||||
|
if state.Speed <= 0 || state.Speed > playerMaxSpeed {
|
||||||
|
t.Fatalf("speed=%v", state.Speed)
|
||||||
|
}
|
||||||
|
if state.X == startX && state.Y == startY {
|
||||||
|
t.Fatal("authoritative simulation did not move player")
|
||||||
|
}
|
||||||
|
if state.Angle == 0 {
|
||||||
|
t.Fatal("steer input did not change angle")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDockedInputFreezesAuthoritativeShip(t *testing.T) {
|
||||||
|
state := newPlayerState("player-1", "Dave", 0, 0)
|
||||||
|
state.Speed = 150
|
||||||
|
x, y := state.X, state.Y
|
||||||
|
stepPlayer(&state, inputState{Docked: true, Seq: 1}, time.Now(), simTick.Seconds())
|
||||||
|
if state.Speed != 0 || state.X != x || state.Y != y {
|
||||||
|
t.Fatalf("docked ship moved: speed=%v x=%v y=%v", state.Speed, state.X, state.Y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBroadsideSpawnsThreeServerProjectilesAndEnforcesReload(t *testing.T) {
|
||||||
|
h := newHub("TEST")
|
||||||
|
c := &client{state: newPlayerState("one", "One", 0, 0), lastFire: map[string]time.Time{}}
|
||||||
|
h.clients[c.state.ID] = c
|
||||||
|
now := time.Unix(100, 0)
|
||||||
|
if !h.fire("one", "port", now) {
|
||||||
|
t.Fatal("first fire should succeed")
|
||||||
|
}
|
||||||
|
if len(h.projectiles) != 3 {
|
||||||
|
t.Fatalf("projectiles=%d", len(h.projectiles))
|
||||||
|
}
|
||||||
|
if h.fire("one", "port", now.Add(100*time.Millisecond)) {
|
||||||
|
t.Fatal("reload should reject early second broadside")
|
||||||
|
}
|
||||||
|
if !h.fire("one", "port", now.Add(broadsideReload)) {
|
||||||
|
t.Fatal("broadside should fire after reload")
|
||||||
|
}
|
||||||
|
if len(h.projectiles) != 6 {
|
||||||
|
t.Fatalf("projectiles after reload=%d", len(h.projectiles))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestServerProjectileAppliesDamageDeathAndKill(t *testing.T) {
|
||||||
|
h := newHub("TEST")
|
||||||
|
shooter := &client{state: newPlayerState("one", "One", 0, 0), lastFire: map[string]time.Time{}}
|
||||||
|
target := &client{state: newPlayerState("two", "Two", 0, 0), lastFire: map[string]time.Time{}}
|
||||||
|
shooter.state.X, shooter.state.Y = 1000, 1000
|
||||||
|
target.state.X, target.state.Y = 1050, 1000
|
||||||
|
target.state.Hull = shotDamage
|
||||||
|
h.clients[shooter.state.ID] = shooter
|
||||||
|
h.clients[target.state.ID] = target
|
||||||
|
now := time.Unix(100, 0)
|
||||||
|
h.projectiles["shot"] = projectileState{
|
||||||
|
ID: "shot", OwnerID: shooter.state.ID, X: target.state.X, Y: target.state.Y,
|
||||||
|
Damage: shotDamage, bornAt: now,
|
||||||
|
}
|
||||||
|
h.step(now.Add(simTick), simTick.Seconds())
|
||||||
|
if target.state.Alive {
|
||||||
|
t.Fatal("target should be dead")
|
||||||
|
}
|
||||||
|
if target.state.Deaths != 1 || shooter.state.Kills != 1 {
|
||||||
|
t.Fatalf("kills/deaths=%d/%d", shooter.state.Kills, target.state.Deaths)
|
||||||
|
}
|
||||||
|
if target.state.LastKiller != "One" {
|
||||||
|
t.Fatalf("killer=%q", target.state.LastKiller)
|
||||||
|
}
|
||||||
|
if _, ok := h.projectiles["shot"]; ok {
|
||||||
|
t.Fatal("hit projectile should be removed")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestServerRespawnsDestroyedPlayer(t *testing.T) {
|
||||||
|
state := newPlayerState("player-1", "Dave", 0, 1)
|
||||||
|
now := time.Unix(100, 0)
|
||||||
|
state.Alive = false
|
||||||
|
state.Hull = 0
|
||||||
|
state.Speed = 120
|
||||||
|
state.RespawnAt = now.Add(respawnDelay).UnixMilli()
|
||||||
|
stepPlayer(&state, inputState{}, now.Add(respawnDelay+time.Millisecond), simTick.Seconds())
|
||||||
|
if !state.Alive || state.Hull != playerMaxHull || state.Speed != 0 {
|
||||||
|
t.Fatalf("bad respawn: %+v", state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func TestFakeCaptainsJoinSnapshotsWithoutSocketRecipients(t *testing.T) {
|
||||||
|
h := newHub("TEST", 3)
|
||||||
|
recipients, players, _ := h.snapshot()
|
||||||
|
if len(recipients) != 0 {
|
||||||
|
t.Fatalf("fake captains must not be websocket recipients: %d", len(recipients))
|
||||||
|
}
|
||||||
|
if len(players) != 3 {
|
||||||
|
t.Fatalf("fake captain count=%d", len(players))
|
||||||
|
}
|
||||||
|
for _, player := range players {
|
||||||
|
if !player.Bot || !strings.HasPrefix(player.ID, "bot:") {
|
||||||
|
t.Fatalf("expected bot snapshot state: %+v", player)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFakeCaptainEngagesNearbyHumanWithAuthoritativeBroadside(t *testing.T) {
|
||||||
|
h := newHub("TEST", 1)
|
||||||
|
var bot *client
|
||||||
|
for _, candidate := range h.clients {
|
||||||
|
if candidate.state.Bot {
|
||||||
|
bot = candidate
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if bot == nil {
|
||||||
|
t.Fatal("missing fake captain")
|
||||||
|
}
|
||||||
|
human := &client{
|
||||||
|
state: newPlayerState("human", "Human", 0, 0),
|
||||||
|
lastFire: map[string]time.Time{},
|
||||||
|
}
|
||||||
|
bot.state.X, bot.state.Y, bot.state.Angle = 1000, 1000, 0
|
||||||
|
human.state.X, human.state.Y = 1300, 1000
|
||||||
|
h.clients[human.state.ID] = human
|
||||||
|
|
||||||
|
now := time.Unix(200, 0)
|
||||||
|
h.step(now, simTick.Seconds())
|
||||||
|
if len(h.projectiles) != 3 {
|
||||||
|
t.Fatalf("expected fake captain broadside, projectiles=%d", len(h.projectiles))
|
||||||
|
}
|
||||||
|
if bot.input.Seq == 0 {
|
||||||
|
t.Fatal("fake captain input sequence did not advance")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func TestExpandedWorldAndSmallerShipCombatScale(t *testing.T) {
|
||||||
|
if worldSize != 5400 {
|
||||||
|
t.Fatalf("worldSize=%v", worldSize)
|
||||||
|
}
|
||||||
|
if shipHitRadius != 34 {
|
||||||
|
t.Fatalf("shipHitRadius=%v", shipHitRadius)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFakeCaptainDoesNotAggroHumanAcrossWholeWorld(t *testing.T) {
|
||||||
|
h := newHub("TEST", 1)
|
||||||
|
var bot *client
|
||||||
|
for _, candidate := range h.clients {
|
||||||
|
if candidate.state.Bot {
|
||||||
|
bot = candidate
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
human := &client{
|
||||||
|
state: newPlayerState("human-far", "Human", 0, 0),
|
||||||
|
lastFire: map[string]time.Time{},
|
||||||
|
}
|
||||||
|
bot.state.X, bot.state.Y = 500, 500
|
||||||
|
human.state.X, human.state.Y = 5000, 5000
|
||||||
|
h.clients[human.state.ID] = human
|
||||||
|
|
||||||
|
input, fireSide := h.fakeCaptainDecisionLocked(bot, time.Unix(300, 0))
|
||||||
|
if fireSide != "" {
|
||||||
|
t.Fatalf("far human should not trigger broadside: %s", fireSide)
|
||||||
|
}
|
||||||
|
if input.Throttle <= 0 {
|
||||||
|
t.Fatalf("bot should patrol when human is far: %+v", input)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func TestShippingRouteWeatherCalmsAuthoritativeWind(t *testing.T) {
|
||||||
|
h := newHub("TEST")
|
||||||
|
h.setWeatherRoutes([]weatherRoute{{
|
||||||
|
ID: "route-1", FromX: 1000, FromY: 1000, ToX: 3600, ToY: 1000, Width: 220,
|
||||||
|
}})
|
||||||
|
now := time.UnixMilli(0)
|
||||||
|
lane := h.weatherWindAtLocked(2200, 1000, now)
|
||||||
|
open := h.weatherWindAtLocked(2200, 2200, now)
|
||||||
|
if lane.RouteInfluence < 0.9 {
|
||||||
|
t.Fatalf("lane influence=%v", lane.RouteInfluence)
|
||||||
|
}
|
||||||
|
if open.RouteInfluence > 0.05 {
|
||||||
|
t.Fatalf("open influence=%v", open.RouteInfluence)
|
||||||
|
}
|
||||||
|
if lane.Strength >= open.Strength {
|
||||||
|
t.Fatalf("lane wind=%v open wind=%v", lane.Strength, open.Strength)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWeatherLayoutIsSanitizedAndOnlyAcceptedOnce(t *testing.T) {
|
||||||
|
h := newHub("TEST")
|
||||||
|
h.setWeatherRoutes([]weatherRoute{{
|
||||||
|
ID: "route", FromX: -20, FromY: 100, ToX: 9000, ToY: 200, Width: 900,
|
||||||
|
}})
|
||||||
|
if len(h.weatherRoutes) != 1 {
|
||||||
|
t.Fatalf("routes=%d", len(h.weatherRoutes))
|
||||||
|
}
|
||||||
|
route := h.weatherRoutes[0]
|
||||||
|
if route.FromX != 0 || route.ToX != worldSize || route.Width != 320 {
|
||||||
|
t.Fatalf("unsanitized route=%+v", route)
|
||||||
|
}
|
||||||
|
h.setWeatherRoutes([]weatherRoute{{ID: "replacement", FromX: 1, FromY: 1, ToX: 2, ToY: 2, Width: 120}})
|
||||||
|
if h.weatherRoutes[0].ID != "route" {
|
||||||
|
t.Fatal("weather layout should be immutable after first accepted layout")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAuthoritativeMovementIncludesWeatherDrift(t *testing.T) {
|
||||||
|
state := newPlayerState("weather-player", "Weather", 0, 0)
|
||||||
|
state.X, state.Y = 2000, 2000
|
||||||
|
startX, startY := state.X, state.Y
|
||||||
|
stepPlayerWithWind(&state, inputState{Seq: 1}, time.Unix(100, 0), 1, 12, -7)
|
||||||
|
if state.X == startX || state.Y == startY {
|
||||||
|
t.Fatalf("weather drift not applied: x=%v y=%v", state.X, state.Y)
|
||||||
|
}
|
||||||
|
}
|
||||||
51
src/assets/airships.svg
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="64" viewBox="0 0 512 64" shape-rendering="crispEdges">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="playerBalloon" x1="0" y1="0" x2="1" y2="1">
|
||||||
|
<stop offset="0" stop-color="#f7f0d6"/>
|
||||||
|
<stop offset="0.5" stop-color="#d7c39e"/>
|
||||||
|
<stop offset="1" stop-color="#8f6947"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="pirateBalloon" x1="0" y1="0" x2="1" y2="1">
|
||||||
|
<stop offset="0" stop-color="#8995a1"/>
|
||||||
|
<stop offset="0.55" stop-color="#4a5660"/>
|
||||||
|
<stop offset="1" stop-color="#202833"/>
|
||||||
|
</linearGradient>
|
||||||
|
<symbol id="player" viewBox="0 0 64 64">
|
||||||
|
<path d="M32 3 26 9h12z" fill="#b34d2d" stroke="#2a1b16" stroke-width="2"/>
|
||||||
|
<rect x="31" y="3" width="2" height="10" fill="#493026"/>
|
||||||
|
<ellipse cx="32" cy="26" rx="17" ry="21" fill="url(#playerBalloon)" stroke="#3a2a22" stroke-width="2"/>
|
||||||
|
<path d="M20 13c7 6 17 6 24 0M17 25c9 5 21 5 30 0M20 38c7-5 17-5 24 0" fill="none" stroke="#8d5d36" stroke-width="2"/>
|
||||||
|
<path d="M32 6v39M25 8c-4 11-4 26 1 37M39 8c4 11 4 26-1 37" fill="none" stroke="#9c6a3d" stroke-width="2"/>
|
||||||
|
<path d="M12 30 21 26l-2 10zM52 30 43 26l2 10z" fill="#b97842" stroke="#3a2a22" stroke-width="2"/>
|
||||||
|
<path d="M24 43h16l6 8-14 10-14-10z" fill="#6f4528" stroke="#2b1b13" stroke-width="2"/>
|
||||||
|
<rect x="25" y="45" width="14" height="6" fill="#a96b38"/>
|
||||||
|
<rect x="29" y="48" width="6" height="7" fill="#2e2522"/>
|
||||||
|
<circle cx="21" cy="48" r="2" fill="#c78d4c"/>
|
||||||
|
<circle cx="43" cy="48" r="2" fill="#c78d4c"/>
|
||||||
|
<path d="M31 12h3v28h-3z" fill="#f7ecd1" opacity=".65"/>
|
||||||
|
</symbol>
|
||||||
|
<symbol id="pirate" viewBox="0 0 64 64">
|
||||||
|
<rect x="31" y="2" width="2" height="11" fill="#38241c"/>
|
||||||
|
<path d="M33 3h14l-5 5 5 4H33z" fill="#b33b2f" stroke="#381f1a" stroke-width="2"/>
|
||||||
|
<ellipse cx="32" cy="27" rx="17" ry="21" fill="url(#pirateBalloon)" stroke="#241b1b" stroke-width="2"/>
|
||||||
|
<path d="M20 14c7 5 17 5 24 0M17 27c9 5 21 5 30 0M20 39c7-5 17-5 24 0" fill="none" stroke="#6e4a36" stroke-width="2"/>
|
||||||
|
<path d="M32 6v40M25 9c-4 11-4 25 1 36M39 9c4 11 4 25-1 36" fill="none" stroke="#72503c" stroke-width="2"/>
|
||||||
|
<path d="M10 31 21 25l-2 13zM54 31 43 25l2 13z" fill="#6f4934" stroke="#211818" stroke-width="2"/>
|
||||||
|
<path d="M21 43h22l5 9-16 9-16-9z" fill="#493126" stroke="#211716" stroke-width="2"/>
|
||||||
|
<rect x="22" y="45" width="20" height="7" fill="#6f4933"/>
|
||||||
|
<circle cx="20" cy="48" r="2" fill="#c85e46"/>
|
||||||
|
<circle cx="44" cy="48" r="2" fill="#c85e46"/>
|
||||||
|
<path d="M28 47h8v4h-8z" fill="#1e2228"/>
|
||||||
|
</symbol>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<g transform="translate(0 0)"><use href="#player" width="64" height="64"/><circle cx="29" cy="60" r="3" fill="#d7e4e9" opacity=".5"/><circle cx="35" cy="61" r="2" fill="#d7e4e9" opacity=".35"/></g>
|
||||||
|
<g transform="translate(64 0)"><use href="#player" width="64" height="64"/><circle cx="28" cy="59" r="4" fill="#d7e4e9" opacity=".45"/><circle cx="36" cy="60" r="3" fill="#d7e4e9" opacity=".32"/></g>
|
||||||
|
<g transform="translate(128 0)"><use href="#player" width="64" height="64"/><circle cx="30" cy="61" r="2" fill="#d7e4e9" opacity=".4"/><circle cx="35" cy="59" r="4" fill="#d7e4e9" opacity=".28"/></g>
|
||||||
|
<g transform="translate(192 0)"><use href="#player" width="64" height="64"/><circle cx="32" cy="60" r="4" fill="#d7e4e9" opacity=".42"/></g>
|
||||||
|
|
||||||
|
<g transform="translate(256 0)"><use href="#pirate" width="64" height="64"/><circle cx="29" cy="60" r="3" fill="#7d8790" opacity=".35"/></g>
|
||||||
|
<g transform="translate(320 0)"><use href="#pirate" width="64" height="64"/><circle cx="35" cy="60" r="4" fill="#7d8790" opacity=".28"/></g>
|
||||||
|
<g transform="translate(384 0)"><use href="#pirate" width="64" height="64"/><circle cx="28" cy="60" r="4" fill="#7d8790" opacity=".3"/><circle cx="36" cy="61" r="2" fill="#7d8790" opacity=".2"/></g>
|
||||||
|
<g transform="translate(448 0)"><use href="#pirate" width="64" height="64"/><circle cx="32" cy="60" r="3" fill="#7d8790" opacity=".32"/></g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.9 KiB |
BIN
src/assets/cannonball.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
1
src/assets/controller/cannon-action.js
Normal file
1
src/assets/controller/cannon-roundel-0.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default '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';
|
||||||
1
src/assets/controller/cannon-roundel-1.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default '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';
|
||||||
1
src/assets/controller/cannon-roundel-2.js
Normal file
1
src/assets/controller/cannon-roundel-3.js
Normal file
1
src/assets/controller/cannon-roundel.js
Normal file
1
src/assets/controller/enemy-health-hires-0.js
Normal file
1
src/assets/controller/enemy-health-hires-1.js
Normal file
1
src/assets/controller/enemy-health-hires-2.js
Normal file
1
src/assets/controller/enemy-health-v2-0.js
Normal file
1
src/assets/controller/enemy-health-v2-1.js
Normal file
1
src/assets/controller/enemy-health-v2-2.js
Normal file
1
src/assets/controller/enemy-health-v2-3.js
Normal file
1
src/assets/controller/enemy-health-v2-4.js
Normal file
10
src/assets/controller/enemy-health.js
Normal file
1
src/assets/controller/helm-action.js
Normal file
1
src/assets/controller/helm-frame.js
Normal file
1
src/assets/controller/helm-knob.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default 'data:image/webp;base64,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';
|
||||||
1
src/assets/controller/helm-sheet-0.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
// Deprecated transfer fragment; helm now uses the sprite sheet in helm-action.js.\n
|
||||||
1
src/assets/controller/left-status.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default 'data:image/webp;base64,UklGRiINAABXRUJQVlA4WAoAAAAQAAAA0AAAOwAAQUxQSOEEAAABoGzbtuq42ec8mZkL5Aoz4weY2WFOWszMKUthZugzMzOnzWi2S1ZUYTbdc3ZDpSc9ybpJMyImAE0qqqoCEbT94cecfGLNk054uLyOpLPOZhBRxYACqEibq3PUVrte8OIGmjeXJAAwJd/dnZ+MjqEAEmlvkhoApBDI4E0jqsDQzvl3fL+uVCp/d8+yN+Z0DgOkraUXkQSDj126kTRvDgWw3Xkvl9cz5fryy+dtC1WJg2oBJiy4bQUZPDtR5Bbdvpwkg7m7m7mR5JpDAKhIKskYgMgAki1EWgEiALYq/EaaeTYK9DwaSDN3pnS3wN96dxwMQJPaioyTRIGkGtkqkKhK0wGiCsy+fTlJy0AUydFryOBsoJG/PNYzaBjSdowaMyrfXTs/aWS+u3Z+lADoHIrqIVO7G5+fgmHDAUCaD4AosN15LwZ6wwToeTTQnI11I5c9+8qtvcVCdbH3puUffvJ+uVS7/PU75VLtdR8+uGTJTStfvqJYKF7xQqWv1PDy0mtfee3Ki3aaBGkFQBXIzXuTDhFIeohIguToNaSx8W7cYvcvmwltCUASYPQbTABBegGAMY8FmjNTNwtpzcw8rZmnNQshmIVq8ywtmAUj3xoDaQ1ABuE8hw7F5Hx37fxkTO6ZMuct0timPfCZCSItApHd+nsffvn+b8ul2uXv7vvuh7UbaM72bSxCWwYd37DBxnZuvmor5ESkFQA5JZiZeVozc3O2d+N1CgDSEhjKGHWuf+HcHbumQFVaAO4RMmCltOJQACrSbEKaR4ibkfy1d8dBAFSbC+t/YaS6G/nzq3M7OgBVqW6W+ftcUfEoIelGbuhbXtwKA2sysIqIJjVV6gJwO0OkkG4kubqwfVd3d34KGq31aE5n91u0kO5mZKWvVFq39OYlxUKhcNVFO3Tlu3a46KpCoVC46qKdB0PqABS3M8RLtRnrrPSV+iqs+ctjPVCpR2b/To8a0qstDGystjCgkWsOQd2CQ/pjp16vZk03/n70kETTIcHNHmKqbmO4DPUmciEt4mj8uTBRJRVk8iv0iKOTRYikSnCFh5ijhZ+PykFSySW0qKMzPJBTSQGZ9Dot6mgMR0HTJDjHIo/uv06HplDZ+WfzuKPx7QkitSDDXmOIPAYWkQoHvkWPPPOVW0NqQTDmLVrcMfAKJCmQw9wN5lHn/ut8aBrRIa/RYs5t81EQpBYc+LFbxBkfy0kdSNDLEG/Gt8ZCUKfqQRvMY81twxwo6hUZ/Co3e6QZP50oUhcEM34jzWPM+NbWCRopOGzpRtI8tty4egakIRBMmPfyZtLiyp1f7Q5FgwXIzX95My2mnH7dVhA0XBTIzXuTwaPJ+MtlAkGWosCYZ0hvDm//geEyqCJjSTDmsU1uWbkFM0bgH0cPUUH2iuQEMngGboHV69eWMu3768e+0pa9r/LaDDSpInfZ76Q1yoxkeP7SO56aPyXfnWXntF07u7fwU4dApTkggpkvb2awRpiRK268+qAckCACFU0rCj16DWnmnsrNyNWFrQAgEahkrCpbfjSzAlsVV5NkMHenu5uRXF3YCtBEBRBEtiiw7Xkvl9ez2ln949KrtgJUEeuqwNDORYUXKmv72b+28tK5O00CVBHzkgDAkKkdO52+U8fUIQBUEfsimqB2ooL/hiKiqiKC/+MBAFZQOCAaCAAAMCYAnQEq0QA8AD7tYqZPqaUkIiyYvhkwHYlqbMgstPo0cVgy3t9FRe4v7Tx7/ou+z6PNvvz4NlL4Cr/QO3T/OeG/nXCrGwwW9uoP7k7q7ZqvlFTQP2VS//yd4E9bpq8X2YJHvCkwF8qteZNR6r3zfOPLIN68D17FM4Vus2K6lhG0AUdsHd+pnVNym1PwiIn9+AUnLclw6BW0wmgLLks6yCPEqwAYJNZq9LhrjT4yo9DMrXsvvoFA6zhqsxTWSfpLjf0cq6BKqEN4bAa8B+7ng/7RkxsjxE/4wgawv43z/8xbZEnynQ9lJkt1Ki9winOqFc4ibM7ard5l1pFyhX6bmThOkFzF7lBKKq1Fi2Lpv03dFhy8UQ2SikutZQp6d7P5HL/ST+1eG8TGQuj3XarjDdpJoB2BAQ4KbgAA/mxWcEZ3ne+RSU4l/POgD7r9DicH0xfHqN54Npe4qtvV190xwxFrqEs2WOR7MAsUoaMMGgU9LxkmlROcb6g/8ESHEaAXbjtj9P88qS4kLnaojD43eStQahwi3oFqWINFcKY5omWDI+KK2zChhGh/SIJSk96EMHUneyd/o+ndlQqWyDT8Um/0iGLGCHGLc6BXQKjewfOra7CJCGLbMF5vUCSfQ7p5GrE4m8uetZz0c85dY2pSpChu2P6c1alw+SjWOAU4euJ9K0FQ8vcBeArQ+wRhKzQ1UCyynxB376X9OSFiHknVnReCxwcvsLZvn8yngh1uQFflHCCGdSUvcMqk/J9N8VUFWw+CXK9H3OPmK+tpJfBsyVL0Fx57l358fm2YqIbOmStemPh/J2H/YUBP9wBUgEP2f5pihb3xQzoEyI1bjgmGj9ncPNkzFYppetQXP34D0LPQacV/rS1CF/DKrqb2HpKwCh+cV7F95kAOlyAAYT7mgHLGZJ6WFDcLZsGmarYzeLMRKZN0q7qhzP5/WFqzhgaa0mxmQaKc5sQAtz6fq43mz1Anm0PfoeAEBODtzuuKXRH/P7X3LJAKDa5JdqBalync5/1sUwVjfHde6Tclmvk22bRo0ee4WpKAFEQ/GwtmN3hx3GLquFd4KPNWuoEuAi6aPwGnoKqpmNAS686aggi+vqbqOOmgPNPp2ecjDnBwYecwLW/MaKSzpiLmPziPCEnPDFCsTF3YWb82qVgNufrRKcCZNIeDClF2ryWF/joR9AMtlzbU3Z4LWWAHpviFkeHqrs5vRVjcp9F1CWKhqu/ADUzY3rSdh/a/aCfTM6p3RbwrF0H2hNg2Jjz7ZP3PTtmZT+h1Q3QmSOFbtkeWY9bTQaJmCpv18gqdKW7j/Gqi7oNGitaORAAdMAjZHfRwt/QzpdnW7mDOTd44tmuIXNfZSCw4clGtlC25TB1+loC6d9+g2atR+ssNuZpiyPiyuMEIe/e59dBD7sdsLbZn0fVqIBJHC5Sf8U5WQEzxcahRZBKbUm5KLaokKfDjtBYz81TWWl3/IT5QYsdrbobc0M/f5yOKOgtiwgqkaf9a97GubUUvu1kQQLYRn1U6BiJFSZxWTeJ9R3cOXkGGkgPLw205lfogrnDiofY+e0pbEhSfyQweGaEV/ZvUJODgxgAJO5wgzBFe1Lnw5TsVJ2pX1O80vzZINGdcW7xiLX3lVv83Muz+wb/g3CIQCP/X4Ra/K+FjY3v3Cf6hvtiA4t2taZl97R98Rri06u3U0NI0tCXWOGofxV5qEnA9ykLoUtFsTNdDisJYH/4ItXfy2L1eCEktft9ReG4KEgdvCXCzDjMqlY3iggMCQI6+xDrnOv2hHJeKN/zz6d07f//0XcVQ0lS3mlGIyX9U2xGQhh0clvtjQO2pELN7RL4dad9K+BZW25Ec0XwwsSIbx2FBmtU/C9Vg4URHwFCBb285t+QRWuaPTmjMBkEAPPUwykCjXVTemUmGVz50gVowT3R1Jugq/A9Y+gvlaLmVgfi0pg9H4lC3bEFjKdhAAvDKi68yZpU5aAfggy+TgNChkS6CR3RmzdLec5aqnJFRUghe4HX54OqLzIrvx9M5hyB9n4zAXTWtAcaKEd24zMbZ4l9HL1jqtZzE+DNQy//IxhnRemTNdbP4kGENiKx1p1rahKFSaJpgOYpD0mUVgjouGukV1Oo8hp575KCGY8Ypvwpr8CJXtkhUVj8HmQMaIVTsAxJjhswmCGPjTQToBXhMzTcXfbOy7RniODCAWa9+2kkKh8cuerfyuABtn7C72to6tJ4Fa73xNEsSplBo5lNEA7sX1wNWfkpQwYC842wGJNZqi6IKHGzEzM8lAMlwr8Wy4/F0HAUQEn8SP9uaVy9HTll2Z2yGAVSS/RMZcvH8xPRUoZC7aN0r33lVcxtMQtFO//Vw+XzF5kNuvrxqY5JV9NsbPR9GILmuUmnYJ65OCE/+C9O0TJDP5ujcrwYE9dkWM7vxknFIKcH+bt1dBU/J47idSbkTxiHDkyD4ZmndW5VCAz4RX+b4w1XtPtCmHwtZ9gg8fpBnfqHRn0BnZ+4s7ujcMZhhBrST/aF/+2VGdgwfmyPImSasTEy7iVM1oHar0lHLx98xnbQhJZSoBCEBW5J+YYaHbD+F3VvaePM1PR98A/IKA2cDa7WFJddESIsMG+HpiGF5SkflpvRPL+RA091U7mr3Uomouv/XDWMlibzEP6YN0/NwkWvDpfKpHZBwtJyFUHXfrDn1nhogBlH3iXe78Iig/ZdyeHbNpIvYCvNlnT2eoiOyBifPSe2n6F7i6ELLlRW9b/LohbgCTQ/i6YAAAA==';
|
||||||
1
src/assets/controller/player-health-0.js
Normal file
1
src/assets/controller/player-health-frame-00.js
Normal file
1
src/assets/controller/player-health-frame-01.js
Normal file
1
src/assets/controller/player-health-frame-02.js
Normal file
1
src/assets/controller/player-health-frame-03.js
Normal file
1
src/assets/controller/player-health-frame-v2-00.js
Normal file
1
src/assets/controller/player-health-frame-v2-02.js
Normal file
1
src/assets/controller/player-health-frame-v2-03.js
Normal file
BIN
src/assets/controller/player-health-fresh-sheet.png
Normal file
|
After Width: | Height: | Size: 715 KiB |
1
src/assets/controller/player-health-hires-0.js
Normal file
1
src/assets/controller/player-health-hires65-00.js
Normal file
1
src/assets/controller/player-health-hires65-01.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default 'EeQ1gvS+BYuOQDjNLIJ4GY12iM1oBPl1iSaQEyLEDiElBosSTUE8OVx3CCoVenQHFG4aBJWRRPNygXecFugEdGYGQadA4zoorxmUh8rcn995SpoCZXU8gj7QK9AglKBPFkrveEqfJ6HVngx2JmYbUFrTx4Pavj3PVEd07LQnn4HWqkA/0kIsD/TmiTx3pajN1ZmH2iJsyLPahtqKO1DdUad2lCu2jDkd6HZn0oPeBuZgerum8LI4qw9wBa+seHPRU4Y51QY03/6SN/AKUJ38QZs454rOvJmE9r43TgDl2ixCvzU3mHIF4uVfSFOH/s9a0/Sh3pqkgFyZZjWp8fjUOWV+VDRA15nAhUFnXojOji9rNCZ9YT4dYfLwqjBVFybjf/Nljc5qBKdc2aI3deVJFNtShNEAfNiVV6F6IEqL6pooKP+1KWnYrnnyk4zuqGDJD1DftwT16Tc1KS0Yi2dekiRhoCN/wkJFvo+B1SOSuBnYn1cEE5uKdCYgyI+w0REXYRhaglyzgWcFmWFj0OMBVhqCsHxGjxlWflgPdq/pC1yQ426y4kjmB8LTjmfXZvBBOTDUjddj6LN21EIENzA1M2OLqWrG15aW1EtuzBOqnxIDY4dedJmqRzimRcDYrhiPHwjThWe1wNrFoRRHmb59J76KvbkWKdN3zYkzHrMGmDY/+GWHnjsjgCUyhVtCmF93NqzWj99b3zr5/m/ee4+/fu/S7Yt8h6+8887tv/Avf/n9SxcvXnzy4ju373Cbt3n79kVu8p99f//7//76v7/+9fd/3OTmK688/fQrr/znzc1N8qZNr5z5XZMpPVXetxaYA9cFgPz82CP/sPrK6uqlx59sb767bauqXnbdR77z02/8/QCbr3HzlbdfuXnz5ubm5p8P9PYf33ht8zVe+zACAiZPmx+dPzWo5VEzj9opkTG3Pn33mx/56ff+vG6+/cc3+NYvLkXY1hzTeWbarB3NUYxQwhAiN4JZLj/Uf6gLYnbx5t1ffu+bH/nmN+/szry1/uHG+pn19TMfvsUP7+rfWm5d21jfOPPCb9bX19+6xvVrN/7jxrXXr7327LPPvvDCC++/8ML7W3xEftT1Z5HnAlZPh798JGOwIAjCVIW9RZC92b8WEf5vToUtrk5B2pbDCoIgiAiHFZF20242m829zeC9wc3m4t7FvbaVQY5dM7Ku59efvbzsIkZPi8oglM8H62ERwd3X8/n13vX16xdt27YyWG9ktx7MdT1v5+1cRDhgPXI+n6/n87qXXSHGGJeD19M0nWOK78OESw5s13Vdc9B6dMihrus6DNahDvW8rmtO6K+qS7FU3UaNa7obxErvsfuz+uo5igZQdx5PdcWIqixB0/heXZi6Rdc3UVXR6DCeRnikaIinDrdSlGLrVxWl2KqkTxyL0vsdJRmuNvBeLSS6gJYUYe8q+BykyNoAGvr46uCBBjiKrpeABmCnLgl4VNkGzkbIU0NcbZj702mdxNxLigLeNrjz907nLPJqwlwBmA7qpgC4Os5j8JcnUUXgRR0FFH77FP4Tf0cBQGorQ2OpRTSek8oR+Vg4PIwtF3qGzrO9GjJedGhwxAMw3qsXAeZEAtqD4fTKa/nFCLOnX7h+h//o4Pa7L/cPd+L2e387tPXRnIlRzai3/H/0/9H/b/n/6OssnDXe7fVaUpJp6A5zvMtTWuXWeLfv3G+V+z7v8qk4NqkfQPoge98ZCxYBKLDnaVmmdfb8XKJSLqix90OCRHCeoPRWDHsUGqP0cGzWIPctSp8sWbSf0qv6pFwgoM5PIm8ewNeoMga69pSp80BszfDHocoPj93iDbBExYeBoA3S1FtAXirelOaO5aeoNwXYKU2Fyg8g7Xb3IHV/Lw3azFD5yJtBKl/p4GyFBnNnXBqUJkODqTQd6o+AWBanRqP9SJf6Mm2murhTNErkS0CbAzJZOrTbkSVNu7knXleTdkuylGkXV2l6VZTdOE/LzdcxK0b3OVo+o8oJWt7QxEeb1uFmqPvhI03jLU9KtA7dIkSG0PpxgiK1t2h/ocKU9N578IcTCjIgp9ckarT/MAnJrROuQ90JMU37eVzJ49o1oqpOt4Fx2v/BbTFEV5Yve3jvh7x48eJBvPjnFR2G5APT4Xlui+E4xM82w/EPh+vXiJOe4biGnZ9mbP5l69wIKyP9J8bk82PlqPspY/Etvvg1P+oqjMe3nqpF27TPeO1Glw/G6ukoKzBWH4qwQXeecXp/dBVrjN3jUVVm3A4ia55xuxlZJcbtGSeiNhjDg2gaYwyPKJfx+1xUXY1dpB9JBxnL0xE0Oc1YnomigLG8vCeCygcZxzvRUzjOmD4TPaOM6duix2VML4dHSouHccbzcEgNa9kF4AHG9ukwo3+QUwD8V+MaM60VKQ0DXTfi2l/DQ2+NcT0UgLycMwr4GN3POF8JC9cgdA0ORXsYjzDdS0ZZtk4Rxh4Yv8I4j5mZj+Xcfm7JdRwEjPHn4YdDeSt3bP9oLxjDGAFuqcw4/8hwCPhgItqeDIGjTEJneAPaTELnEYLDNSaipRAAE1LYn2AyioG/YDI6MWlvmgmpvUyTv+bNbVsaAtuWpn1zX7Fk2VzhS5aw9eWErJFPynigq9/ShiVsAOiz1EMTup6xNUuIxKzVZXqgyWYG1j35ZscYmsyZQxMWraEJYT7ShN+21rSE+RQAJwlrfttaTZPOYMkYniyfMIYm5cfzMK4JNxYHHFNowso+a31NyI6tQscSnp3KJGQkYTvThCfyxhDlBlAyBJqQjjFEubVoC09Iz9hLnnSfSBv6rCfkhaafiJGsmjopCnmy6RuquEJesVMypXvVDqqQgaFcle7ADE/IQrJoBFvIY56Joi7kqpnili1kwwq+8NgxG0Nd2DIxbgvpZ20Q+8KiZwRfOOab4P260Bkygi6sGmHNF2aAnAme1YVNG9UtXRh4Rsq68BgGTfCML2f3wOgTvvCpnAUY6sIBIxzRhYE/ZAJfWLaCMJwwcfSEL37dRKX9Tl9Yh8mFZV9opfwlYXj5oV36iH3htxezBmAgDHnwRyl9BGFYdPdaAGPIs/eV1YEvJOEboG0MOTOhL/+iMCSnprMJGXnBBQbco9mEizxSBVCopnxF/EgZ8vJabfxIfVoRDWfIjc4WjpJoLJVm66/5irqpM1svNbFLEdJsXa+m96k5+BVptp5xyjomq0PyiYYWMIfkrdmins+aQ/J0XguJOuQv3EAP8pB6cIesV9QgD1lsK2G3OyQUf88eVtX8SB7WF9Q8ZQ+Xf6WE38nDqYqWwBS5EdNYu09JbA+fX9XCJXt4taMjRPbwT/NK2JdPj/jefEzH3yzYw6uLWnr68PQ5FXDCHv7LghLwh0c8FXlNH556XEnZH3bu0THUh4+OJGYMvqQB/CGfrKtIfuEPj3kqWpv6kBONpIz1B+UCi08KxPWuYSk6AjGtIssF4oSrYt0gHvq82LhBvAQP4ntTg1jUQGIQpw9oQCE2NBxU6NZ0nxxBoVdVLG4axNwd0iL/phD3wxNj1SB+MCEXOGgQT3rb5AIKsTjoyeEQy/m8WDhjEC8FYoBCfBWzYpArRKh0iAfrE/iMDCjEE0UFmUIkFIauQlSx2yG2DkB6aV4hVhSw6BAVcH6kEDUgEWsFKXCI+Du5GYlYHBJjW+K6k5SxfToZY0GuaREXUgkZVxMzNo4mY/TFEo2YlrqpY9GlBTE04ikpLKIYX9CIlUEZsIg7kjPWEzI2/a6+3r3NI9aPCGUWsVgVKuMRF4XQiBB+tO0R60JoxGpWZobPeMRZoYsaUYhe2SMWhNCI+/eJACLdcGSaD2u0ngVGBECkD/JChzXiUl7ogEdcktmXasTVQch2PGLLl8Ej1vMyJZFYFAGPuF8oiMTEjL4MJnHUScZ4v0R7DyYxMWNTJKhE9D6CBZEoAS6xKFHGpEMioJLbO+hiEmUSlY5LoBKTM0oQNEMlykQmUaZkGe8wKSdT0owNy6AvUkcERLosA13L';
|
||||||
1
src/assets/controller/player-health-hires65-02.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default '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';
|
||||||
1
src/assets/controller/player-health-hires65-03.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default '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';
|
||||||
1
src/assets/controller/player-health-hq-frame.js
Normal file
1
src/assets/controller/player-health-v2-1.js
Normal file
1
src/assets/controller/player-health-v2-2.js
Normal file
1
src/assets/controller/player-health-v2-3.js
Normal file
1
src/assets/controller/player-health-v2-4.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default 'qec+vpCfLWLP0E2SH5jhZYDQAOhmTfJuU/5zZNNa/mq+PawgCql9a6Ehxb7rdYEFuZ1AAA==';
|
||||||
1
src/assets/controller/player-health-v4-0.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default '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';
|
||||||
1
src/assets/controller/player-health-v4-1.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default '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';
|
||||||
1
src/assets/controller/player-health-v4-2.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default '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';
|
||||||
1
src/assets/controller/player-health-v4-3.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default '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';
|
||||||
6
src/assets/controller/player-health.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import c0 from './player-health-v4-0.js';
|
||||||
|
import c1 from './player-health-v4-1.js';
|
||||||
|
import c2 from './player-health-v4-2.js';
|
||||||
|
import c3 from './player-health-v4-3.js';
|
||||||
|
|
||||||
|
export default `data:image/webp;base64,${c0}${c1}${c2}${c3}`;
|
||||||
1
src/assets/controller/radar-panel.js
Normal file
1
src/assets/controller/right-controls.js
Normal file
1
src/assets/controller/top-hud-0.js
Normal file
1
src/assets/controller/top-hud-1.js
Normal file
1
src/assets/controller/top-hud-2.js
Normal file
1
src/assets/controller/top-hud-v2-0.js
Normal file
1
src/assets/controller/top-hud-v2-1.js
Normal file
1
src/assets/controller/top-hud-v3-0.js
Normal file
1
src/assets/controller/top-hud-v4-0.js
Normal file
1
src/assets/controller/top-hud-v4-1.js
Normal file
1
src/assets/controller/top-hud-v5-0.js
Normal file
1
src/assets/controller/top-hud-v5-1.js
Normal file
1
src/assets/controller/top-hud-v5-2.js
Normal file
1
src/assets/controller/top-hud-v5-3.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default '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';
|
||||||
6
src/assets/controller/top-hud.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import c0 from './top-hud-v5-0.js';
|
||||||
|
import c1 from './top-hud-v5-1.js';
|
||||||
|
import c2 from './top-hud-v5-2.js';
|
||||||
|
import c3 from './top-hud-v5-3.js';
|
||||||
|
|
||||||
|
export default `data:image/webp;base64,${c0}${c1}${c2}${c3}`;
|
||||||
56
src/assets/explosions.svg
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="384" height="64" viewBox="0 0 384 64" shape-rendering="crispEdges">
|
||||||
|
<defs>
|
||||||
|
<radialGradient id="blast" cx="50%" cy="50%" r="55%">
|
||||||
|
<stop offset="0" stop-color="#fff6b0"/>
|
||||||
|
<stop offset="0.28" stop-color="#ffd457"/>
|
||||||
|
<stop offset="0.58" stop-color="#f28b2b"/>
|
||||||
|
<stop offset="0.82" stop-color="#b23d25"/>
|
||||||
|
<stop offset="1" stop-color="#4b241f" stop-opacity=".2"/>
|
||||||
|
</radialGradient>
|
||||||
|
<radialGradient id="smoke" cx="50%" cy="45%" r="60%">
|
||||||
|
<stop offset="0" stop-color="#6d635e"/>
|
||||||
|
<stop offset=".65" stop-color="#3d3a3d"/>
|
||||||
|
<stop offset="1" stop-color="#20242b" stop-opacity=".1"/>
|
||||||
|
</radialGradient>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<g transform="translate(0 0)">
|
||||||
|
<circle cx="32" cy="32" r="8" fill="url(#blast)"/>
|
||||||
|
<path d="M32 15l4 11 12-6-7 12 10 7-13 1-2 12-7-10-11 7 6-12-10-7 13-1z" fill="#ffb52e" opacity=".88"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(64 0)">
|
||||||
|
<circle cx="32" cy="32" r="15" fill="url(#blast)"/>
|
||||||
|
<circle cx="20" cy="31" r="7" fill="#f47a25"/>
|
||||||
|
<circle cx="45" cy="27" r="8" fill="#ff9a2e"/>
|
||||||
|
<circle cx="36" cy="45" r="8" fill="#d94f24"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(128 0)">
|
||||||
|
<circle cx="32" cy="32" r="22" fill="url(#blast)"/>
|
||||||
|
<circle cx="16" cy="28" r="8" fill="#f36f25"/>
|
||||||
|
<circle cx="48" cy="25" r="9" fill="#f7932f"/>
|
||||||
|
<circle cx="43" cy="46" r="9" fill="#cf4a24"/>
|
||||||
|
<circle cx="23" cy="47" r="8" fill="#e15c25"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(192 0)">
|
||||||
|
<circle cx="32" cy="32" r="19" fill="#b84a27" opacity=".9"/>
|
||||||
|
<circle cx="19" cy="26" r="10" fill="#ed7029" opacity=".88"/>
|
||||||
|
<circle cx="45" cy="29" r="11" fill="#d65b25" opacity=".86"/>
|
||||||
|
<circle cx="35" cy="45" r="10" fill="#7a3427" opacity=".82"/>
|
||||||
|
<circle cx="31" cy="30" r="7" fill="#ffc948" opacity=".8"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(256 0)">
|
||||||
|
<circle cx="25" cy="30" r="13" fill="url(#smoke)" opacity=".92"/>
|
||||||
|
<circle cx="42" cy="28" r="14" fill="url(#smoke)" opacity=".88"/>
|
||||||
|
<circle cx="34" cy="43" r="13" fill="url(#smoke)" opacity=".84"/>
|
||||||
|
<circle cx="22" cy="46" r="8" fill="#272b31" opacity=".7"/>
|
||||||
|
<circle cx="46" cy="45" r="7" fill="#272b31" opacity=".65"/>
|
||||||
|
<circle cx="31" cy="29" r="4" fill="#cc5927" opacity=".8"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(320 0)">
|
||||||
|
<circle cx="24" cy="31" r="12" fill="url(#smoke)" opacity=".7"/>
|
||||||
|
<circle cx="41" cy="30" r="13" fill="url(#smoke)" opacity=".68"/>
|
||||||
|
<circle cx="34" cy="43" r="12" fill="url(#smoke)" opacity=".62"/>
|
||||||
|
<circle cx="18" cy="42" r="6" fill="#252a31" opacity=".45"/>
|
||||||
|
<circle cx="48" cy="43" r="6" fill="#252a31" opacity=".42"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.6 KiB |
BIN
src/assets/islands/dock_island.png
Normal file
|
After Width: | Height: | Size: 102 KiB |
BIN
src/assets/islands/medium_island.png
Normal file
|
After Width: | Height: | Size: 115 KiB |
BIN
src/assets/islands/pirate_island.png
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
src/assets/islands/rocky_island.png
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
src/assets/islands/small_island.png
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
src/assets/islands/trading_outpost_island.png
Normal file
|
After Width: | Height: | Size: 115 KiB |
BIN
src/assets/islands/volcanic_island.png
Normal file
|
After Width: | Height: | Size: 112 KiB |
BIN
src/assets/player-airship-4frame.png
Normal file
|
After Width: | Height: | Size: 212 KiB |
BIN
src/assets/shipyard-ui/active.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
src/assets/shipyard-ui/close_button.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
src/assets/shipyard-ui/ship_preview.png
Normal file
|
After Width: | Height: | Size: 359 KiB |
BIN
src/assets/shipyard-ui/ship_selector.png
Normal file
|
After Width: | Height: | Size: 236 KiB |
BIN
src/assets/shipyard-ui/title_banner.png
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
src/assets/shipyard-ui/upgrades.png
Normal file
|
After Width: | Height: | Size: 157 KiB |
1
src/assets/steampunk-hud-compact/p0.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default 'iVBORw0KGgoAAAANSUhEUgAAAMMAAAFaCAMAAACUvxmnAAAAwFBMVEUAAAATJCafYhxYKwduSRrTjjFpHALgp1Fca13GdSFtYwkOOkIiS1JUKgWpj1iiWwlTKQOSWxezhDX4zGiPKwYqFgiQVhD43Zeac0f/AAAvFQNzhXF2RxB0Rg5hlJj//ADq8d6Vo52k09rfuoWoMQA5Qzr3egHnoA5PeoGJMQWMNAGZkEhrdGcAAHGevMPdeUP///8STk5+ucOYZkz/yDsAAP8AfwA9hJMA//94h0t5xM+Ja1DOJQX/AP/NhxLQi0W9tSUYAAAAQHRSTlMA/Pr6+vwN/Pz8Cvz8YvwOmGzz/PtdmPz8AZr9YqD9Af39/fwI/QQJ/VWZCwgC/fsBBf0L/QEC/QER/W/9AW0L6qf8SQAAH4dJREFUeNrtXQd74zbSJjEgQVJiUae08tpeb8sl1+/r7f//q28KAHZJzvou1j2cxCoUBeLF9BloGQR/T4q/rZRS+zKLgzulYxnsQRkF++Dz8S4RZCX+KVgfVKhWQVCWd7Pyj7/EZZYdCUAQ53sVgoJQQ07ChB+Un/FF/J4lK+vowh5VATEAIA5Uitwe//aNPnyvEMqg3O/3u1VZxlmulEFNCEP6C6E2kdrmZXnePyCcVRxkfwcFOf41+0ETFGdBqRQtOf2lpsbJa7WOiBuWF0rLh6rKekz7VXKb9ZcQB0ULiP+9nvCLZfavQUB2VPGcSYhCKDbGbPC9idJIMSLEphW9QXsbfM3irCQajugPdz4tHfG7wSIG5eoH16VE+cfVLgywCoTabA6IAeUJMUQGZUmHrOBqg2zRUP2oSmSrVU+QldYPDw8V/p3PK0co3Sv5n17SO3f8wb22R/cPDyIrh802JA2oD4igxmkzgYqQkDeoHuYQgVb4v963LnWBxk7CGeAAVWMbyrhET8SXieSxTWl0mdbyx0IEgKqLEGiiGxW2CT9PFfMIzxK1iNbrdXQbpcNZ0JKdvVZl5E4VsAWRZQN5BIBwhMBS/ygxAA9vUY6UKfjgIgw/ehRqrRgB8AWguQo9+VHlLZ8hg9rzQ3eifIuYDuAwoDLoFoAfIDcBYzQPt0RafFyEywV/rLcqtbN8q6utBMTxEU1imr5qVAi/jB5XjMFsWI6WCWFYfmckC5GnSNmVtYSH5aNfQ8gKKBlETDYx8qPquh79QtHFMH5hoLkXJmpBoKcFgVgwiFSJdXKU6M6wlpatx84H+IVCN1dDeRJn+Y2Ey325QCMe6cHktK61HsGAT0nSxoDB0UEgtGhBIOzSkV432l48HYweTrU29FkxAq7AEfw3yIiU5NOyb1UYuVELOlurIYZQdTH4QZ8+ffq0bBuDwtA1lo4NDQ7iBIj389Kw2WxMOjKsMmFiYPhBwfbZY4hCIL+ciVWyjMLnL4RvIOdofFvQ7JiLZfIJzc7yL8nSnYc2iU1SM3n7euGkCcUW/CTWFIu0VqoFIhoTMhPqtfZ8pJAyZsNaKo8B1/pLOsIITbZXD5m+TMLk+Tnxkktu2LLBU5KQPiytOAG5umYSGi+lRsU+GlWUNc4NwhYGtUcmBDHOzWMQRtcDhVjTSYMxcVrPnz5+/PS8tDqB+DGwaLPhD09I3xdWnugUkls3lI4KFY3xARVCmRGdxglCWKvWO6geMdUiYM3CMMOHC6OLkXVZJB+/86J9XLYweI1GVX5CiP/2n0/PoWeEIsvkVUBHbaPuL1FHYUeidYNB1c1xwqB0HOw7GMKu0WyNr6Zsa9u+45iRaazSx6e/0IcL4pRlQ8gRR2t2';
|
||||||
1
src/assets/steampunk-hud-compact/p1.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default 'OhzBoPsr2DV9HQxQBWiq1FCJBxgWHXQTDhFSXFgSZJadj59I4dlJ4+vnZDGGoWf9wmvz6J6vkO2gAoAuH2757iQGRRiQSQuUHPZRqC9PT8/MDIawIGnQb4iBXETA4csUhvDVGFA+ISRbxLYqIX14/vTpmfWfnAZhmOQDvB4DxZBBDmH4agx6GgNwuIeLjkYXhYmQkFT94Q+Juy68KQYIq6B80G/GB9ZpNuwkOeLgWIYWGPm566aRfjMMKWHIKHlQb4khTVXbwCGCxbJt8BRZ09dimOC7SkMyrYghbvz0D+p0yCmaspOXYHVBnCAlt6dw5PpGGEiWcomX9NthUBKZijQtBAOL08K6EaD4CN6ODyHHS1nwAG8lS+ixWoxYuIkLFJdW29TyLTCQUZJUdI/CpF+JYTE5i1ZOOMzSwHRi7x/DoCNtMQTBmQsNb+IfKPiOfBS36GZjHAgRhqkVe51dApNSoGGrAjkJwOs4MZGlc4W1PdYi/N5eOdPPRX89aWQpVE29L5dqKLps3SElD9A7wsegeza9ww83UlltTfJ7V5KA1Jq8efvLSulXEdBXSBu+NmW/GA9COloPu7GKlVLRCjwj2ll/B4KwgU2wrcqZ6PVEU6VlOLXKrWXVqnpJAahNzpD0DkO7XAb+m1w0aUAkLeaTUW2N1xuuN/bYTDqzJMPartrmeOh0qvKGqqriB6H+B/Rs39k3u9PpFHpoqm8lwBg5xHOo5Fp2ZHul3uVaF21e4qtKroXj5P269Vs0zHK/gqorULpAbVZ+BU9v0bEppyrnGXUT4slebMzdEttRGzkpr1w11bYhUKq0KogHDEFkI/86OX6/tdA5MabZZc3F4/Eh7IvHH+sJBbvKozCYuQkCjm1+pOMQd4DFEw214Fu5WuWrMguO2ZFaPNzlyeQv40VwryxNLEKZW62QMJBY47smx/7Vs6sUx8c4I/lZ7VfnmNoNEw2ux+DzyrmA8ysWfZy+nitny+gpz6Z4f3MDqtzT5KjbE3fbea7HRYxCBCi6hi1Iddv+hIsnZZWNE6o4+5F+LnE3i/ekWBF1/DRUJbUPY+rMff7cbSgXh4Mp2PeQc1Y30UMZHyfFl8In5ERwobEufexbqNgcyMVgUKlAt+1q0+NCNpnCV1kixSAuAuEoQWHYFU91myWahEkAmEeqKLo8db4IQF2YAlzAiu+bRl2wX/tzDXUhXDGLAje4ITbD0Ccf7BFo7BM7vXzaCpbtWuWlaFIfbB18YQNkZ/fWKgjsS4D1RnNVZbm0SdJt0SV+9YEaw2KybCvZ8uUYxBVBaMTLNrTLmDvk8QpUelNErAua3XKZFNLiST0IvUO3xDEnFaw1N29C16dKb0vuNDcK8+zS1o2RYwRohfij265SSDX98HTYcOEEUomcQaN6Pwbig8LI8IzWZrORuq++LcyngiHB0Odz7n1sNnAYfCx2B8/nhwrNRrercYkPhmeXHA6IIbViwnsqFAlkcJbcgee93hzoNDxRugnXUei1MNVG6k63quGyI8dReumMte8w40VvSL60nV2oeO8BCznaO8awRwTHY3BCtoQ61bQ/wSAbNhTTK5b06+kI8aAbSltrVfZineBcF0qSpSZgl5To2jXQoEpLBZkW2aYLpMCFUVqcY/xIjADur5BUpanbNEJHQVIun2hBk8tpmOzCc/miAwK5UJuhcLIL7+SPYP/kNX1AF7GNW5bbsPY9pxQNuyxQLFGN67/bzTq22wxXSfs5iCnXtkRftYKpLDgXEnvrvu3XoxmQi+HtjgEncNGGew0Og1LWbJckqAAp';
|
||||||
1
src/assets/steampunk-hud-compact/p2.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default 'dDIrW0kGzDua3Tc2EaFXrYPyjnWVshReDeA1yloQaOMMhImq8s5YOFreDDtCeQ6hq7sk1GsEKdVQCaW5RFY+gKt9a+h0XKB6bWzzc1YpWQBapMyzei3TKPSrg6VfBAS3RWu0Y0mRWqsJ4JPROMhZuFzL14ptbUP+uBW2uz1XEhCL6ewv3IOypVdoxXlg97QoyMr+Bi7/KhuPKnNougumsKJEneoWp/G0CshrSIjhkkg6WVP/F0f/j1/awXweZ/ai8SDSP1d8OSrA7IIWehC/j8yJ+6lBGxBT+XOZ/bX8+Wd7NVIG+XZdFOhUqG2rea/XIBFu8l0XQzQ6vm6IQxR3jA2+O7r22+BwmVJ9Cto6nYP4/dZY1+JU72wkQiL3JUNoYgMLejwFopGkX12PQwhQdiWigujX1/c0dOva9YiuYoy2C6HZbaIL1U7sJXwvHE/ooVgXRTG1lDjbYeliB6ofZReDpfcsVuvueCE0QSjP7sSz7qwThpgiOFI7VEPXoJv6InTKhi034S3zqRzG23lo3bj357o1eMevuepn65ywNTt8W40nhpkUIyLr40757Vnn3592FfiUAWe3m65xucUPBzW0t/glwQ9+3YtGeIovXOQxP3G7NLeuqVO68tQ+4OtavTMulsDcF67sCA46L4K90we4tB4Se2TvQHTGNgHnymnPtTLI8V0i4HTEYTgFd0oYN6oQkkRD37fdFwYbq98xhozTdkUYjncqTGWOniFJKC+K7/OHXqjSZ8XRAMYa+X0yIYjP2uaxqBF5/OM/ZPnHc2GldEGlL6oCUZHvIbgzxS6Dla4PB1PbIgfVjPflXYHgOl5xqFubr8hE5XckTiRI9YGygWTZVLQVwP2IU/xYKk07sJeJ7LteuML3wx1J04M2G7AQErtPllsQ+Z34ujjItN4Y+qEFilKYbJJw4Qrf1Z1oRIw2SW1sh+rZGLPRC9cfUeW9qLVGayp7yF82qt6o0P2mBdR9RH8YrmopTS3DAtmRFG5/nVZXs6F3I0oYJjGGxQJZsGw21+m78RFlULmfHy7RvvJOWfkZFfNhdx/mtfI1vohUAQVpo93O0B/dxvKP4sPe74NWxvZI/e7W+3DVJZXuXRObNsQvXfU+pd8G3UmwlNutjgwC/YMtCuuRyvd7pWMAraI3+EZVsaWfPtxL1Br7Xla7O0BV1zsKvashiOKOJIkwHGPobTalBgS0N7PcAyPs1mSnzWtpj+zuKJH7n1z2WHuy7fN7wkC9Z3D/igD41/cSaPiwT7uN52D/cQjkxh0VBTLeAzDSK93dk07nanRX0x1hiIPTPysGpe+pH/Sn0V8QoZ4/3hEIGO6PZDN7RxCCE6z9zma7j4E83eme7FLV/DBINs/JJrnqnnwcRd/h6bTzdOLfJeTB3f7bhZZ29zVd6fu7f9rP/xToeOdceN//UuFMM80000wzzTTTTDPNNNNMM80000wzzTTTTDPNNNNMM80000wzzTTTTDPNNNNMM80000wzzTTTTDPNNNNMM80000wzzTTTTDPNNNNMM80000wzzTTTTDPNNNNMM80000wzzTTTTDPNNNNMM80000wzzXSHFGfZvSOg+zvdP4qyDO75jmdZsKrUWlX5nc7/iBwI9vZ2t9W3oLw3ZmQlP61Aqc2B7om+/z0fzu7lBm6lAIhXzIXDIVKgldqLQGX3wI2SbuGZWSHSAGlEd2OUG0vu85juW38HMiTrz7cdphtX892r+R3DiIN3fUe97Cs+nPd8y2dV1zXdhRtUxEDordybm4Xq';
|
||||||
1
src/assets/steampunk-hud-compact/p2a.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default 'dDIrW0kGzDua3Tc2EaFXrYPyjnWVshReDeA1yloQaOMMhImq8s5YOFreDDtCeQ6hq7sk1GsEKdVQCaW5RFY+gKt9a+h0XKB6bWzzc1YpWQBapMyzei3TKPSrg6VfBAS3RWu0Y0mRWqsJ4JPROMhZuFzL14ptbUP+uBW2uz1XEhCL6ewv3IOypVdoxXlg97QoyMr+Bi7/KhuPKnNougumsKJEneoWp/G0CshrSIjhkkg6WVP/F0f/j1/awXweZ/ai8SDSP1d8OSrA7IIWehC/j8yJ+6lBGxBT+XOZ/bX8+Wd7NVIG+XZdFOhUqG2rea/XIBFu8l0XQzQ6vm6IQxR3jA2+O7r22+BwmVJ9Cto6nYP4/dZY1+JU72wkQiL3JUNoYgMLejwFopGkX12PQwhQdiWigujX1/c0dOva9YiuYoy2C6HZbaIL1U7sJXwvHE/ooVgXRTG1lDjbYeliB6ofZReDpfcsVuvueCE0QSjP7sSz7qwThpgiOFI7VEPXoJv6InTKhi034S3zqRzG23lo3bj357o1eMevuepn65ywNTt8W40nhpkUIyLr40757Vnn3592FfiUAWe3m65xucUPBzW0t/glwQ9+3YtGeIovXOQxP3G7NLeuqVO68tQ+4OtavTMulsDcF67sCA46L4K90we4tB4Se2TvQHTGNgHnymnPtTLI8V0i4HTEYTgFd0oYN6oQkkRD37fdFwYbq98xhozTdkUYjncqTGWOniFJKC+K7/OHXqjSZ8XRAMYa+X0yIYjP2uaxqBF5/OM/ZPnHc2GldEGlL6oCUZHvIbgzxS6Dla4PB1PbIgfVjPflXYHgOl5xqFubr8hE5XckTiRI9YGygWTZVLQVwP2IU/xYKk07sJeJ7LteuML3wx1J04M2G7AQ';
|
||||||
1
src/assets/steampunk-hud-compact/p2b.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default 'ErtPllsQ+Z34ujjItN4Y+qEFilKYbJJw4Qrf1Z1oRIw2SW1sh+rZGLPRC9cfUeW9qLVGayp7yF82qt6o0P2mBdR9RH8YrmopTS3DAtmRFG5/nVZXs6F3I0oYJjGGxQJZsGw21+m78RFlULmfHy7RvvJOWfkZFfNhdx/mtfI1vohUAQVpo93O0B/dxvKP4sPe74NWxvZI/e7W+3DVJZXuXRObNsQvXfU+pd8G3UmwlNutjgwC/YMtCuuRyvd7pWMAraI3+EZVsaWfPtxL1Br7Xla7O0BV1zsKvashiOKOJIkwHGPobTalBgS0N7PcAyPs1mSnzWtpj+zuKJH7n1z2WHuy7fN7wkC9Z3D/igD41/cSaPiwT7uN52D/cQjkxh0VBTLeAzDSK93dk07nanRX0x1hiIPTPysGpe+pH/Sn0V8QoZ4/3hEIGO6PZDN7RxCCE6z9zma7j4E83eme7FLV/DBINs/JJrnqnnwcRd/h6bTzdOLfJeTB3f7bhZZ29zVd6fu7f9rP/xToeOdceN//UuFMM80000wzzTTTTDPNNNNMM80000wzzTTTTDPNNNNMM80000wzzTTTTDPNNNNMM80000wzzTTTTDPNNNNMM80000wzzTTTTDPNNNNMM80000wzzTTTTDPNNNNMM80000wzzTTTTDPNNNNMM80000wzzTTTTDPNNNNMM80000wzzXSHFGfZvSOg+zvdP4qyDO75jmdZsKrUWlX5nc7/iBwI9vZ2t9W3oLw3ZmQlP61Aqc2B7om+/z0fzu7lBm6lAIhXzIXDIVKgldqLQGX3wI2SbuGZWSHSAGlEd2OUG0vu85juW38HMiTrz7cdphtX892r+R3DiIN3fUe97Cs+nPd8y2dV1zXdhRtUxEDordybm4Xq';
|
||||||
1
src/assets/steampunk-hud-compact/p3.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default 'vSoGerJ4z/fcxhnr2t5n1d8VXeSJuUHMeI+sQEtaMgIEkNC0dV0U5rAxBv83BfKGcNQWBqKI3533RkU4C4KC5b84HDY4+SiKVIQYDL3hO7xrVbOdyt+bdmNERGKECGieCECmj3OPTBQafhMRR0TB6y2xonxHul3STM4kIzUpgcY1l/kT0f3cFSERQqliFae7oxMr3pFEfRMmCAKcr4mMZQR5hwZBlHoUxIpq9V7EabU/aYaAUysOhADfiSojrZUgwuNklwyhUAyCTNY+z9+DICELSGJqUgSWIpwzKFZhcPexJlOEh9FvGHsC+T5QhL367c1RhVqsDXtjYgIvOD7o4b3EEYAoN0kUIlbICIL3qhsqZ/GjW7w30qSYQlMUcPZjTnqMGbsZuqBoVIPlKVQYEL4CRDZMEq+DLi+Gy1lQKoieNhREhIIg6iNYdGFozwoEAOrA341vA0EsKPfkSCkOXmU3OHuXBscX2IADplGKs4ZNpFICUfR4sFwOeEEQUD9IllSKj9vbbjGeiRvVupbbrEvIEuM6x1lDZRzzsSzDp4xTgP35YmxTaVxMEoqNSTekyaovP8tkIFEoUArXHzU/hS26D4Ab5WivdFKgyK4V2Ttk4MM17Bj+oGXR+oL1O+Zy3/YUBYSk2wwVYYiBQNCXyNjynd/D3U2ql+PqYwSAUYtWG+YlDoKLvFrtVx06n+Upr/aaLSJdJ8/GWfE5+J3cdJ70ACRV6NKCZGmxGOg28U4mQShu0AeGUGw2B1NrSaooFJOc5AKh4qSsc2pC68rgJ5QGnNOa7WmkhpbIYhiCwFAQ9TriNzfog0BAMdIdxUq1qJePAwakFJs+eqgeh1eJj+X2jzRvtXHWsj17O3PEsORXXRzs7FKGDen2mnXNHkulyXV2rB35SLB+lOIXeenfN+5VkkjIx9jwO5QGTSaJ12AAgVEIhkWfF7x+KZU8gFT7ijRlwZ5UgZiQJEsiGU6lKZDKakSjmeyTvCaMND6nLhgbPPbd4leRJFYG4iK0lqg1Z4shHAGRIkW0UqmqLtY7ymClahOtCYHDsLQglCs4TBFbDYmV816c/Dn4vDXbRpKg4UC46GLg1/LQsU4IgrwEKgRJU3YJwx7j4YIG8xhwOErX03QiJmjZD+YD639uy3fWqn7+k0hSaHrK0BMb8XGLRrr8h+wdVSqMgPJ4QaFjjeEk4FiIgab/JQy/oIEFYcRlDORJ6WoUodnykB/3J/VHkASHMLQ1oW1MvyTJl5Z+tDGQsWBHzRpxQa3j4KyVWdN6IANCjfHK2hyQtIjIdU5wbSJ0EuWSluxPFelTGEr8o4bKTDkpZREFJRHawevYpqjNiEtajU6drCqyAQP9w+GJ/xdjfpURPH3gB3ZGiMIpdIlCDBR2c7oGbQhLlnzK6EyxNoVW67Vhw77oogCJm0jptpcZoTUr3GJpNoenpydM1zf0VbgdA7vVLYU24DKWDD00mTV0b8akjTZ4iaFkYr0uimKt9Hqt1Fpsb5cTKEyGhElMUxlPGdYzYeBvHLhcEim2RwziNgwSGmyRAHauME9sQA4BpWvK9CQJX7xsoqKgikxRozAVaK3XbH0X3cCJclgWpgs+An005X9W+mj9SQe2tvgGt2NAAIQh/3cfZbBGkyjpvjZQPmSIQQdTOELfo6LBxRTFrpF2zrqcwLADzSG9iVwlugnNQN2EgR4KTG2QE7kP9jhgE6tktcF6MoYQkeV4KcglfaCH2lDWve6PrslFpBJwqCo4TmNwIQVEwgZoJngNgsdQox1APvwkonTMFIkSiHNoXLRV';
|
||||||
1
src/assets/steampunk-hud-compact/p4.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default 'WpyuUs8Fz/8DY0iSgmtKA7PHkmGjmolWUUayFKXOqRBHoaNTt2FIoX5BEMby4TOpAwoSgOn4N+fdDClzIvN3GJKid3E7pdRi2FIoUE7pg/fHKsRXshYLB+pWPhRoEVC+VxbDnqwSxmsDDDRwgWrwMsCQkPYPGMEegoNOqtJMWVfSeWXno6DNUZQtfbM+IIKXF8FwfIyVWFZteqHSwrLBFG7mH/yrYo2M6BlYaCnEFn6eMq4VYiBhSgpy6xotQaRDj+kqH8SfEwaSppUtEoBgkEAD2nEGlS7Uumhm7l+RNHHpu4tBKZtFKIiPE0ETCROdhVelBI5ycFcmuY5BNxheTINhBZLASTUYupUYNKTtiX9oY2BGtDEoCZkksFxNlvM1NAvenrNR2+sQwMnSCwVZHLxSNG+tsqI0RvWqSWbdxtDoQ5KsHQaPosHAUj4Zge84cx7Mr4iUug6BDTHZVgoUTU18eAwqpQ4RmmqbfPRKYhhZTGAgdz2IKQsagUaiJnD5OOEiyK2laR+CSNK1HIhnqNNQH14shjgoqQCMf1FID2D1dLEUQgEzKEAfrFFqY1BcA8SkSHIY0clNJDXLaJNOli0xDJG+altwdFFLcceloKpJRME907cYO323fnky1i6V4upJp5Vz+zTF79+/Y4pCpqJGc1QgiuePHxpKPtTEVkrFvnNOabUAh8FwLAxJsqeDV5QmipE8DE2RA1y1SbCWeqhNGI31D+Q37ZcpBNL9MAilvhGlDuH19Vg8lto4gipNk5QLJ9A+oagir72DT10dJm09+jcoKinYTIlivtrZpb3HEKk0go5pDYuOTncwiJPr2KXUaRSNcrG8kYO1ASpyks4FmWu05WIincxxq8QahGG7tcFKmrYqGlJrwKmOYihQTFW3Fi5+2qaJ4bV2SgWuXuQzUKhORNWQTic7L8YQOj5sHYYcSE8g5PpKX5b0egoDalr/3KjxDymc4su1viCuWt+Hapdf/MK3+CwskByU87j/BrAYdkpKS8Ai15dxcgMjIApl2dDN5JxQ3NbWik92G0h18iZrGJtw2yF2WgR4aoySCMwHwUBOjmtPEvMNgl+ycV4jWnErjLgHUgeJ+SgevVhlsrz4PfUcgmutkWb7hT+HOOJl6THYUyZKWsj6P4hYIpQZ82wxfHRxEwxjb/BOkodXp8uz4v7I69pwsXuISRBZw20eh1EKMAhcx07Q5/27t00WQ1GgDZ4QJcGgCcYFw5SV7U7czW1IBP05bvsYWxMo0a9RnZOcA1rgYSYlO0sKj+FDIbXnkRK+soUNkvKtmtSImPYVrVb7/cODlOpu2z10LFu9yDj4XIXCB1wr7vJz8kF92rFkH80oxULkrRMqCbBpGDhRw1kr2wbqjPh8fUywS7fBkXo7K9vx5ObbUYhy5A7FzLrsf1exhYHPO8FwpOAFFYEnpahxPsTAeq1dRZrq6zBMRKWzK94WpB4K2UTROONeXIHuec3N+6bieLkft6INYZB/tUoRo48RWYq3UnCmUCeiCpEaA0F80qgYIVswrUZL0rZiQ6sxjSELzojgZYMUgdlw/wf0flWWWXmBsnhFUZ+idDV3BYecMByprwSh6DTPVY3WFkBYQRkrGdWR6EwcXGrLuryDLpwo3SveEMVRnm/F8RK4vol95ftwTRclPfyNapWu1xSTLB0/U/5AyyZuVys1kdSyKHGLYzS+hKKxrChJvC5jtQ1MG5U2m0PRFsJU9myOdOCiToOu1Y+zxowsQvY1AJIjxXvDbG8ymsxqp+Nj1mffp8ElI3bsRptAlDaLe0yK';
|
||||||
1
src/assets/steampunk-hud-compact/p5.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default 'lqiCv4QPKUL34Bt1UieGqG3zEAaxARFQjk9QaaWvV6oGkiQQuFCJbOf4Hsf6NrKfQm8Oa27HLDF1C1utuBD0FWpajQZ27bKboh0B4BvmvGkhmlru5QR/TNpKZEG67VTb6Hm5IwbJhTQHqKWEpmHhi2O99nQ6moq6fpymsUtXa6XcF6/9ZVkYZyERw3ocxHI5AYFdtBglFYLPC3sY4iDTmhdsmVDMLpdMpFJxtTrW6sexDYidj6fmmKHskzZ6hl84m4NJlZjAUBin0NTlXUeSpmD4d+5iQJsE602EOUeyUWGxoY05OjE3doBIZF0/ThET7a7zGFc94gQag1PquKGzFmkaFadRDFAb33glQ6hSiYO5L9el/8PwkdlAvY6ITKG/0G2M6PfjKjRMOQ6qKLMvksLoQttmEcnjmDiNYYCiBcF6OHb72xR2fY0muyH5KzKCpUi5+rG6hRFNL8v3K4IVUMudKl6cmDuNVGqzVYN0aBQDNY82vDvUblORzQJUCYoGedBZShKIAVWhoCJbwXJwWwuo0wdylz+hfNIQX5LE8cc2WAlIOjSxQwyKzDE5NdkOxwE4ouBMKO1hoO66s9vGNsMpQfmVGJZkFk6/BMphSOhDmWEqloWyifW1fWQ1GVWwUsQxq+GNaIRhqwayVElIWeg6UhxlpNQVU9Tcguh2DFRR0dJqwys8cPj2pdBfhA+kERx0irWO+vv5lv29lbYpqLwQRnY7PoSp6ek0YWAnFXFhSaXiBSJpCSu4DYMWDMok5Fp2R8qyuTKmLEAyGqnyeaVKowv7KgsjfU3eHtDsQHCFsjQd44MV2YgvRG1UK0v6VgyWD+rlcEANwCtkwGynD9YRO05kqraeEyMAaijwZq9BBFgTgtQHumDjVdYkroeC2fYqfTGy3ekDzl56QFT/ZQyv1Af18oIeX++k2sqibGrayODqsawP1D2mxg5v020sH8WuNW0cTQWjXXho2pquXz7sZ+W+jUVcoiXzOdcrbKvU7mtqltc5jyolVml4W5Xmim/I+wxT0onIbr2n1Es2vuK5Zs2sknXdpuLhlN3bQmxQ/e2JGeWMdrk1XQ0xaKfKRunwNRhUTS6NMMRlxb197/tCGnNr02XepoeyEQk7PNF+K4nj3eJhJuimT2VdWgqMWb4O+4k2WEjQtlJ9l7w0L119oyg1GAqK3akPxL2AVuNEG5fVSeiuqeIkRUyaMMZryqGgeES5GncI0hPh6p9mSaIUKOsz4oH8nxbFc7JHRg2Mui3e17Y/jbKkMSevc1u7BZeThNIXoUgemi9FXA/HaUe8kdjucOQtqV7DW9sUwIW/4dd4pHsSKuV3izVpeXGbNnAy6figE23qs4xbkXKxcmLEyRBkL4XPrFiteeai6pF77fx6JLY59a6eLPLYthPusDcNM+W2PtbqJjZQkAhbwaAPL6gPKm9X0XnfoqtKUG9ByYZSaOqQkThX5UNMXJY1nyWtJM49AAMt9tX5eLWxksTcC6GEXNuWTxql1OdALm5NDocXU5xdGJO3i+jg7Zzd5BhZloArnNuNprbGJe0bcdShOiAoKn5O7RN4jHmDZzsUq50gudy53UzxR+32VhYA4K8vn9FCnluGu7LbVCEctPuGjWTo1wa0RMQIwYjL3k3vX8oonGp+wKmc7wGwjUN5kK2u7kle4MwOf1PgMrTFQj//V6eeXMlywqDDe5PFkw6QVez8cu26clyUFpuSnibxmzapkVqu2WzLtgPl7Lm0BpQ0PzkCXYSLXbctc2L/DFxffTUGCrhtUSW/9jsLp4DyW1QrRzDN';
|
||||||
1
src/assets/steampunk-hud-compact/p6.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export default '9uYttCRgQRHoYjfW54PxJv5VDCRMhON0y+9QRHR9e/B0yvNdl/rvkaoWBnC73AYlrHInynurz2z0we5IguqmH8AeuR0lYRmcbv5BWsnfoWnLPMMRDPSb7l0lcY9+BQL05myXKEG/7bdJ3P+J83O+i2MvePFl4lPyynYeTzad2Y02i2Kx4KpVXbvodTgTQ8adXvWD8LjZqP3KXpbj84l14jRxHv9ez0d57Mb8byjQdJDV4HDNR4BkJ063tAX73Hjtz2S7ukYodpO7KXTLx/iirW/+NMZBPiHjHf4Wv9rdTWKIW34bwhYYGNS/myO74Leg06XrlvTrxz///l/aLcmvXycE+Fv5m/10ehrD3fyzOH/+jfj/thrxT4BhppnekP4f81ecpmNs8W4AAAAASUVORK5CYII=';
|
||||||
12
src/assets/steampunk-hud-mobile-v2.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import p0 from './steampunk-hud-compact/p0.js';
|
||||||
|
import p1 from './steampunk-hud-compact/p1.js';
|
||||||
|
import p2a from './steampunk-hud-compact/p2a.js';
|
||||||
|
import p2b from './steampunk-hud-compact/p2b.js';
|
||||||
|
import p3 from './steampunk-hud-compact/p3.js';
|
||||||
|
import p4 from './steampunk-hud-compact/p4.js';
|
||||||
|
import p5 from './steampunk-hud-compact/p5.js';
|
||||||
|
import p6 from './steampunk-hud-compact/p6.js';
|
||||||
|
|
||||||
|
const base64 = [p0, p1, p2a, p2b, p3, p4, p5, p6].join('').replace(/\s+/g, '');
|
||||||
|
|
||||||
|
export default `data:image/png;base64,${base64}`;
|
||||||