vimp-engine 0.15.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/Cargo.toml +1 -1
- package/package.json +1 -1
- package/src/client/components/view/Lobby.js +9 -0
- package/src/client/lib/engineVersion.js +11 -0
- package/src/client/main.js +12 -0
- package/src/client/style.css +37 -2
- package/src/client/views/gameShell.js +3 -0
- package/src/client/views/includes/auth.pug +3 -0
- package/src/client/views/includes/lobby.pug +57 -51
- package/src/config/lobby.js +4 -0
package/core/Cargo.toml
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "vimp-engine-core"
|
|
3
|
-
version = "0.8.
|
|
3
|
+
version = "0.8.4"
|
|
4
4
|
edition = "2024"
|
|
5
5
|
description = "VIMP — движковый каркас симуляции (физика, карта, снапшот-фрейминг, интерполяция/предикт/raycast-примитивы, нав-утилиты). Без wasm-bindgen — обёртки для WASM-ABI собирает game-crate."
|
|
6
6
|
license = "MIT"
|
package/package.json
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import Publisher from '../../../lib/Publisher.js';
|
|
2
|
+
import { ENGINE_VERSION } from '../../lib/engineVersion.js';
|
|
2
3
|
|
|
3
4
|
// Singleton LobbyView
|
|
4
5
|
|
|
@@ -34,6 +35,14 @@ export default class LobbyView {
|
|
|
34
35
|
this._leaderboardTotal = document.getElementById(elems.leaderboardTotalId);
|
|
35
36
|
this._myPlacement = document.getElementById(elems.myPlacementId);
|
|
36
37
|
|
|
38
|
+
// футер лобби: строка статична на всё время жизни вкладки, поэтому
|
|
39
|
+
// пишется здесь, а не через модель и publisher
|
|
40
|
+
const version = document.getElementById(elems.versionId);
|
|
41
|
+
|
|
42
|
+
if (version) {
|
|
43
|
+
version.textContent = `vimp-engine ${ENGINE_VERSION}`;
|
|
44
|
+
}
|
|
45
|
+
|
|
37
46
|
// заголовок игры для "<TITLE> TOP-N" (SVG-ориентир) — задаётся controller'ом
|
|
38
47
|
// при выборе игры (сама модель не хранит title манифеста)
|
|
39
48
|
this._gameTitle = '';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Версия npm-пакета движка, запечённая в бандл на сборке: сети для неё нет
|
|
2
|
+
// (у мастера нет version-эндпоинта), а лобби обязано показывать версию того
|
|
3
|
+
// кода, который сейчас исполняется, а не того, что развёрнут на сервере.
|
|
4
|
+
//
|
|
5
|
+
// Модуль лежит в client/lib, а не в src/config: config/* импортирует мастер
|
|
6
|
+
// под Node, а сюда тянется package.json пакета — он нужен только браузерному
|
|
7
|
+
// бандлу (в npm-тарболле vimp-engine package.json есть всегда, поэтому
|
|
8
|
+
// standalone SDK собирается у игры тем же импортом).
|
|
9
|
+
import pkg from '../../../package.json' with { type: 'json' };
|
|
10
|
+
|
|
11
|
+
export const ENGINE_VERSION = pkg.version;
|
package/src/client/main.js
CHANGED
|
@@ -422,6 +422,18 @@ socketMethods[PS_AUTH_DATA] = data => {
|
|
|
422
422
|
|
|
423
423
|
document.getElementById('logo').textContent = texts?.title || 'VIMP';
|
|
424
424
|
|
|
425
|
+
// версия пакета игры в футере формы входа. Здесь, а не в AuthView: его
|
|
426
|
+
// elems приходят из authSchema.elems игрового плагина, и футер каркаса —
|
|
427
|
+
// не его забота. Игра, собранная до появления packageVersion, оставляет
|
|
428
|
+
// строку пустой (#auth-link держит раскладку через space-between)
|
|
429
|
+
const authVersion = document.getElementById('auth-version');
|
|
430
|
+
|
|
431
|
+
if (authVersion) {
|
|
432
|
+
const packageVersion = activeGameManifest?.packageVersion;
|
|
433
|
+
|
|
434
|
+
authVersion.textContent = packageVersion ? `v${packageVersion}` : '';
|
|
435
|
+
}
|
|
436
|
+
|
|
425
437
|
// память клиента (localStorage) + принудительное значение поля с
|
|
426
438
|
// единственным вариантом. Здесь, а не в AuthView: solo-путь ниже отвечает
|
|
427
439
|
// хосту вообще без формы и обязан прийти к тем же значениям
|
package/src/client/style.css
CHANGED
|
@@ -491,11 +491,18 @@ body.hide-cursor {
|
|
|
491
491
|
color: #ff0;
|
|
492
492
|
}
|
|
493
493
|
|
|
494
|
-
|
|
494
|
+
/* три колонки: GitHub — версия игры — копирайт. Позициями заведует
|
|
495
|
+
space-between, а не nth-child: средний элемент бывает пустым (игра
|
|
496
|
+
собрана без packageVersion), и порядковые правила тогда съезжали бы */
|
|
497
|
+
#auth-link p:first-child {
|
|
495
498
|
text-align: left;
|
|
496
499
|
}
|
|
497
500
|
|
|
498
|
-
#auth-
|
|
501
|
+
#auth-version {
|
|
502
|
+
text-align: center;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
#auth-link p:last-child {
|
|
499
506
|
text-align: right;
|
|
500
507
|
}
|
|
501
508
|
|
|
@@ -712,6 +719,14 @@ body.hide-cursor {
|
|
|
712
719
|
color: #aaa;
|
|
713
720
|
}
|
|
714
721
|
|
|
722
|
+
/* колоночная обёртка панелей и футера: #lobby центрирует содержимое как
|
|
723
|
+
флекс-строка, поэтому футер обязан лежать в одном столбце с .lobby-grid,
|
|
724
|
+
а не быть её соседом */
|
|
725
|
+
.lobby-column {
|
|
726
|
+
display: flex;
|
|
727
|
+
flex-direction: column;
|
|
728
|
+
}
|
|
729
|
+
|
|
715
730
|
/* два столбца лобби (lobby-page-plan): настройки/создание слева, вкладки
|
|
716
731
|
Active Servers / Leaderboard справа; собственная ширина панелей
|
|
717
732
|
переопределяет фиксированный .card { width:256px } (id сильнее класса);
|
|
@@ -768,6 +783,20 @@ body.hide-cursor {
|
|
|
768
783
|
flex-shrink: 0;
|
|
769
784
|
}
|
|
770
785
|
|
|
786
|
+
/* версия пакета движка под панелями — тем же мелким кеглем, что и футер
|
|
787
|
+
формы входа (#auth-link) */
|
|
788
|
+
#lobby-footer {
|
|
789
|
+
font-size: 9px;
|
|
790
|
+
padding: 0 5px;
|
|
791
|
+
margin: 6px 0 10px;
|
|
792
|
+
text-align: center;
|
|
793
|
+
text-shadow: none;
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
#lobby-footer p {
|
|
797
|
+
margin: 0;
|
|
798
|
+
}
|
|
799
|
+
|
|
771
800
|
@media (max-width: 800px) {
|
|
772
801
|
.lobby-grid {
|
|
773
802
|
flex-direction: column;
|
|
@@ -775,6 +804,12 @@ body.hide-cursor {
|
|
|
775
804
|
gap: unset;
|
|
776
805
|
}
|
|
777
806
|
|
|
807
|
+
/* в столбик обёртка тянется на всю ширину: иначе она сжалась бы по
|
|
808
|
+
содержимому и увела бы панели из центра */
|
|
809
|
+
.lobby-column {
|
|
810
|
+
width: 100%;
|
|
811
|
+
}
|
|
812
|
+
|
|
778
813
|
/* в столбик высоту строкой никто не задаёт — возвращаем слой в поток,
|
|
779
814
|
иначе absolute-слой схлопнулся бы в 0 */
|
|
780
815
|
.lobby-browser-inner {
|
|
@@ -17,4 +17,7 @@ div#auth
|
|
|
17
17
|
div#auth-link
|
|
18
18
|
p
|
|
19
19
|
a(href='https://github.com/lgick/vimp') GitHub
|
|
20
|
+
//- версия пакета игры (manifest.packageVersion): проставляет main.js,
|
|
21
|
+
//- у игры, собранной до появления поля, строка остаётся пустой
|
|
22
|
+
p#auth-version
|
|
20
23
|
p © #{new Date().getFullYear()} VIMP
|
|
@@ -1,54 +1,60 @@
|
|
|
1
1
|
//- скрыт по умолчанию: открывается из main.js только после успешного логина
|
|
2
2
|
//- в #lobby-auth (Этап B2, LobbyAuthCtrl 'authenticated')
|
|
3
3
|
div#lobby(style='display:none')
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
//-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
div
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
//-
|
|
40
|
-
div
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
4
|
+
//- колоночная обёртка: сам #lobby — флекс-строка, центрирующая содержимое,
|
|
5
|
+
//- и футер под панелями иначе встал бы третьей колонкой рядом с ними
|
|
6
|
+
div.lobby-column
|
|
7
|
+
div.lobby-grid
|
|
8
|
+
//- левая панель: профиль + форма создания комнаты (lobby-page-plan)
|
|
9
|
+
div#lobby-setup-panel.card
|
|
10
|
+
h2= 'VIMP'
|
|
11
|
+
//- бейдж входа (Этап B2): управляется LobbyAuthView, показывается
|
|
12
|
+
//- вместе с #lobby после успешной авторизации
|
|
13
|
+
div#lobby-user
|
|
14
|
+
div
|
|
15
|
+
span= 'Signed in as '
|
|
16
|
+
b#lobby-user-nick
|
|
17
|
+
input#lobby-user-logout(type='button', value='Sign out')
|
|
18
|
+
hr.lobby-divider
|
|
19
|
+
h3.lobby-section-title= 'HOST A GAME'
|
|
20
|
+
div#lobby-create
|
|
21
|
+
//- селектор игры (lobby-page-plan): рабочий с первой же игрой в
|
|
22
|
+
//- каталоге мастера, а не только когда их несколько
|
|
23
|
+
div.form-row
|
|
24
|
+
label.form-label(for='lobby-game')= 'Select Game'
|
|
25
|
+
select#lobby-game.field-select
|
|
26
|
+
div.form-row
|
|
27
|
+
label.form-label(for='lobby-name')= 'Server name'
|
|
28
|
+
input#lobby-name.field-text(type='text', maxlength='30')
|
|
29
|
+
//- поля настроек комнаты генерируются по явной схеме roomForm
|
|
30
|
+
//- манифеста активной игры (docs/en/plugin-api.md "Form schema")
|
|
31
|
+
div#lobby-fields
|
|
32
|
+
//- ошибки формы (formBuilder.renderFormErrors) и отказ загрузки
|
|
33
|
+
//- плагина выбранной игры — строкой в форме, а не в #tech-informer:
|
|
34
|
+
//- тот кроет вкладку непрозрачным слоем и рассчитан на терминальные
|
|
35
|
+
//- причины, а эти восстановимы (поправить поле, другая игра,
|
|
36
|
+
//- повторный клик). Над кнопкой — рядом с полями, к которым относятся
|
|
37
|
+
div#lobby-error.form-error
|
|
38
|
+
input#lobby-host(type='button', value='Create server')
|
|
39
|
+
//- правая панель: вкладки Active Servers / Leaderboard (lobby-page-plan)
|
|
40
|
+
div#lobby-browser-panel.card
|
|
41
|
+
//- абсолютный слой: высоту .card задаёт форма слева (stretch), а
|
|
42
|
+
//- список внутри скроллится, не раздувая карточку (lobby-page-plan)
|
|
43
|
+
div.lobby-browser-inner
|
|
44
|
+
div.lobby-tabs-header
|
|
45
|
+
input#btn-show-servers.lobby-tab-btn.active(type='button', value='Active Servers')
|
|
46
|
+
input#btn-show-leaderboard.lobby-tab-btn(type='button', value='Leaderboard')
|
|
47
|
+
div#lobby-servers-content
|
|
48
|
+
input#lobby-search.field-text(type='text', placeholder='Search servers…')
|
|
49
|
+
ul#lobby-list
|
|
50
|
+
p#lobby-empty= 'No servers available'
|
|
51
|
+
input#lobby-more(type='button', value='Load more')
|
|
52
|
+
div#lobby-leaderboard-content(style='display:none')
|
|
53
|
+
div.lobby-leaderboard-header
|
|
54
|
+
span#leaderboard-title
|
|
55
|
+
span#leaderboard-total
|
|
56
|
+
ol#lobby-leaderboard-list
|
|
57
|
+
p#lobby-my-placement
|
|
58
|
+
//- футер: версию пакета движка проставляет LobbyView (engineVersion.js)
|
|
59
|
+
div#lobby-footer
|
|
60
|
+
p#lobby-version
|
package/src/config/lobby.js
CHANGED
|
@@ -96,6 +96,10 @@ export default {
|
|
|
96
96
|
leaderboardTitleId: 'leaderboard-title',
|
|
97
97
|
leaderboardTotalId: 'leaderboard-total',
|
|
98
98
|
myPlacementId: 'lobby-my-placement',
|
|
99
|
+
|
|
100
|
+
// футер: версия npm-пакета движка, запечённая в бандл при сборке
|
|
101
|
+
// (client/lib/engineVersion.js)
|
|
102
|
+
versionId: 'lobby-version',
|
|
99
103
|
},
|
|
100
104
|
|
|
101
105
|
// создание комнаты (хост в этой же вкладке); лимит игроков/время
|