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 CHANGED
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "vimp-engine-core"
3
- version = "0.8.3"
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,6 +1,6 @@
1
1
  {
2
2
  "name": "vimp-engine",
3
- "version": "0.15.0",
3
+ "version": "0.16.0",
4
4
  "description": "VIMP — движок-приложение (мастер, P2P-транспорт, Worker-хост, мета, MVC-каркас клиента)",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -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;
@@ -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
  // хосту вообще без формы и обязан прийти к тем же значениям
@@ -491,11 +491,18 @@ body.hide-cursor {
491
491
  color: #ff0;
492
492
  }
493
493
 
494
- #auth-link p:nth-child(1) {
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-link p:nth-child(2) {
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 {
@@ -65,6 +65,9 @@ const SHELL = [
65
65
  },
66
66
  ],
67
67
  },
68
+ // версия пакета игры (manifest.packageVersion) — текст пишет
69
+ // main.js по AUTH_DATA
70
+ { tag: 'p', id: 'auth-version' },
68
71
  { tag: 'p', text: `© ${new Date().getFullYear()} VIMP` },
69
72
  ],
70
73
  },
@@ -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 &copy; #{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
- div.lobby-grid
5
- //- левая панель: профиль + форма создания комнаты (lobby-page-plan)
6
- div#lobby-setup-panel.card
7
- h2= 'VIMP'
8
- //- бейдж входа (Этап B2): управляется LobbyAuthView, показывается
9
- //- вместе с #lobby после успешной авторизации
10
- div#lobby-user
11
- div
12
- span= 'Signed in as '
13
- b#lobby-user-nick
14
- input#lobby-user-logout(type='button', value='Sign out')
15
- hr.lobby-divider
16
- h3.lobby-section-title= 'HOST A GAME'
17
- div#lobby-create
18
- //- селектор игры (lobby-page-plan): рабочий с первой же игрой в
19
- //- каталоге мастера, а не только когда их несколько
20
- div.form-row
21
- label.form-label(for='lobby-game')= 'Select Game'
22
- select#lobby-game.field-select
23
- div.form-row
24
- label.form-label(for='lobby-name')= 'Server name'
25
- input#lobby-name.field-text(type='text', maxlength='30')
26
- //- поля настроек комнаты генерируются по явной схеме roomForm
27
- //- манифеста активной игры (docs/en/plugin-api.md "Form schema")
28
- div#lobby-fields
29
- //- ошибки формы (formBuilder.renderFormErrors) и отказ загрузки
30
- //- плагина выбранной игры строкой в форме, а не в #tech-informer:
31
- //- тот кроет вкладку непрозрачным слоем и рассчитан на терминальные
32
- //- причины, а эти восстановимы (поправить поле, другая игра,
33
- //- повторный клик). Над кнопкой рядом с полями, к которым относятся
34
- div#lobby-error.form-error
35
- input#lobby-host(type='button', value='Create server')
36
- //- правая панель: вкладки Active Servers / Leaderboard (lobby-page-plan)
37
- div#lobby-browser-panel.card
38
- //- абсолютный слой: высоту .card задаёт форма слева (stretch), а
39
- //- список внутри скроллится, не раздувая карточку (lobby-page-plan)
40
- div.lobby-browser-inner
41
- div.lobby-tabs-header
42
- input#btn-show-servers.lobby-tab-btn.active(type='button', value='Active Servers')
43
- input#btn-show-leaderboard.lobby-tab-btn(type='button', value='Leaderboard')
44
- div#lobby-servers-content
45
- input#lobby-search.field-text(type='text', placeholder='Search servers…')
46
- ul#lobby-list
47
- p#lobby-empty= 'No servers available'
48
- input#lobby-more(type='button', value='Load more')
49
- div#lobby-leaderboard-content(style='display:none')
50
- div.lobby-leaderboard-header
51
- span#leaderboard-title
52
- span#leaderboard-total
53
- ol#lobby-leaderboard-list
54
- p#lobby-my-placement
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
@@ -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
  // создание комнаты (хост в этой же вкладке); лимит игроков/время