vimp-engine 0.20.0 → 0.21.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/package.json +1 -1
- package/src/client/components/model/Stat.js +123 -2
- package/src/client/components/view/Stat.js +43 -0
- package/src/client/lib/accolades.js +56 -0
- package/src/client/main.js +33 -4
- package/src/client/style.css +19 -0
- package/src/config/lobby.js +64 -0
- package/src/config/master.js +30 -0
- package/src/config/opcodes.js +3 -1
- package/src/config/wsports.js +3 -0
- package/src/devtools/contract/rules/c11-stat-mode.js +60 -0
- package/src/devtools/contract/rules/c4-component-dependencies.js +9 -2
- package/src/devtools/contract/rules/c6-stat-columns.js +29 -1
- package/src/devtools/contract/rules/index.js +2 -1
- package/src/host/HostGame.js +103 -7
- package/src/host/meta/SocketManager.js +11 -0
- package/src/host/meta/core/RoundManager.js +9 -4
- package/src/host/meta/modules/Accolades.js +283 -0
- package/src/host/meta/modules/PlayerDataSync.js +484 -85
- package/src/lib/validators.js +47 -0
package/src/lib/validators.js
CHANGED
|
@@ -168,3 +168,50 @@ export const clampLimit = (value, fallback, max) => {
|
|
|
168
168
|
|
|
169
169
|
return Number.isInteger(num) ? Math.min(Math.max(num, 1), max) : fallback;
|
|
170
170
|
};
|
|
171
|
+
|
|
172
|
+
// Сколько завершённых игр движок может склеить в один запрос: окно склейки
|
|
173
|
+
// на его стороне — минута (lobbyConfig.playerData.minFlushInterval), столько
|
|
174
|
+
// игр в неё не влезает.
|
|
175
|
+
//
|
|
176
|
+
// Множитель СВЯЗАН с rank.maxPoints auth-сервиса (packages/auth/src/config/
|
|
177
|
+
// auth.js): мастер не должен пропускать то, что auth отклонит. Отклонённое
|
|
178
|
+
// тело для хоста неустранимо — PlayerDataSync повторял бы его до конца жизни
|
|
179
|
+
// комнаты, — поэтому при правке per-game maxGameScore проверяется и потолок
|
|
180
|
+
// суммы на той стороне.
|
|
181
|
+
const MERGED_GAMES_PER_WINDOW = 20;
|
|
182
|
+
|
|
183
|
+
// клампит результат игры (snakes-v3 этап 3.3): `best` — очки ОДНОЙ игры,
|
|
184
|
+
// `points` — сумма склеенных игр с прошлой синхронизации. Потолок одной
|
|
185
|
+
// игры объявляет сама игра (master:games[].maxGameScore), потолок суммы —
|
|
186
|
+
// это же значение на минутное окно синхронизации; всё, что больше, значит
|
|
187
|
+
// либо взломанного клиента, либо неверно настроенную игру, и мастер режет
|
|
188
|
+
// его перед проксированием, а не отклоняет запрос целиком: честная часть
|
|
189
|
+
// результата не должна пропадать из-за одной аномальной строки.
|
|
190
|
+
// Инвариант `best <= points` держится и после клампа — auth его требует
|
|
191
|
+
export const clampGameResult = (points, best, maxGameScore) => {
|
|
192
|
+
const maxPoints = maxGameScore * MERGED_GAMES_PER_WINDOW;
|
|
193
|
+
const toInt = value => {
|
|
194
|
+
const num = Math.trunc(Number(value));
|
|
195
|
+
|
|
196
|
+
return Number.isFinite(num) ? Math.max(num, 0) : 0;
|
|
197
|
+
};
|
|
198
|
+
const cappedBest = Math.min(toInt(best), maxGameScore);
|
|
199
|
+
const cappedPoints = Math.min(toInt(points), maxPoints);
|
|
200
|
+
|
|
201
|
+
return {
|
|
202
|
+
points: cappedPoints,
|
|
203
|
+
// best > points — битый клиент: сумма не может быть меньше своего
|
|
204
|
+
// максимума. Поднимать сумму до максимума значило бы дорисовать
|
|
205
|
+
// месячному рейтингу очки, которых не было, поэтому режется best
|
|
206
|
+
best: Math.min(cappedBest, cappedPoints),
|
|
207
|
+
// превышение логируется вызывающим: это сигнал о сломанной игре
|
|
208
|
+
clamped: cappedBest !== toInt(best) || cappedPoints !== toInt(points),
|
|
209
|
+
};
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
// Ключ сопоставления ника с глобальным топом. Уникальность users.nick в auth
|
|
213
|
+
// регистронезависимая (миграция 002), поэтому и сравнивать надо так же —
|
|
214
|
+
// иначе «Alice» и «alice» разъедутся. Правило одно, а мест, где по нику
|
|
215
|
+
// ищут, три (host/meta/modules/Accolades.js, client/components/model/Stat.js
|
|
216
|
+
// и сам auth), поэтому оно живёт здесь, а не переписывается в каждом.
|
|
217
|
+
export const nickKey = nick => String(nick ?? '').toLowerCase();
|