@vimp-games/tanks 0.4.0 → 0.4.1

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.
@@ -0,0 +1,754 @@
1
+ /* @ts-self-types="./vimp_tanks_core.d.ts" */
2
+
3
+ /**
4
+ * Клиентский режим ядра (срез 2.6): интерполяция снапшотов, предикт
5
+ * своего танка, визуальный спавн снарядов и распаковка кадров v3.
6
+ * Живёт в главном потоке вкладки клиента; горячие позиции читаются
7
+ * zero-copy плоским Float32-буфером, событийные кадры — JSON-строкой.
8
+ */
9
+ class ClientCore {
10
+ __destroy_into_raw() {
11
+ const ptr = this.__wbg_ptr;
12
+ this.__wbg_ptr = 0;
13
+ ClientCoreFinalization.unregister(this);
14
+ return ptr;
15
+ }
16
+ free() {
17
+ const ptr = this.__destroy_into_raw();
18
+ wasm.__wbg_clientcore_free(ptr, 0);
19
+ }
20
+ /**
21
+ * Ввод игрока: action ('down'/'up') + имя клавиши — в историю
22
+ * предикта.
23
+ * @param {string} action
24
+ * @param {string} key_name
25
+ * @param {number} local_now
26
+ */
27
+ apply_input(action, key_name, local_now) {
28
+ const ptr0 = passStringToWasm0(action, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
29
+ const len0 = WASM_VECTOR_LEN;
30
+ const ptr1 = passStringToWasm0(key_name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
31
+ const len1 = WASM_VECTOR_LEN;
32
+ wasm.clientcore_apply_input(this.__wbg_ptr, ptr0, len0, ptr1, len1, local_now);
33
+ }
34
+ /**
35
+ * Локальный цикл смены оружия (авторитетное подтверждение — панелью).
36
+ * @param {boolean} back
37
+ */
38
+ cycle_weapon(back) {
39
+ wasm.clientcore_cycle_weapon(this.__wbg_ptr, back);
40
+ }
41
+ /**
42
+ * Дамп клиентского состояния для отладки: сетевой буфер
43
+ * (глубина, окно seq, оффсет, последний кадр), свой gameId,
44
+ * размеры hot-буфера и очереди событийных кадров.
45
+ * @returns {string}
46
+ */
47
+ debug_json() {
48
+ let deferred1_0;
49
+ let deferred1_1;
50
+ try {
51
+ const ret = wasm.clientcore_debug_json(this.__wbg_ptr);
52
+ deferred1_0 = ret[0];
53
+ deferred1_1 = ret[1];
54
+ return getStringFromWasm0(ret[0], ret[1]);
55
+ } finally {
56
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
57
+ }
58
+ }
59
+ /**
60
+ * Чистая распаковка кадра v3 → JSON {port, seq, serverTime,
61
+ * camera, player, snapshot} (замена unpackFrame в тестах);
62
+ * 'null' при несовпадении версии или повреждённом кадре.
63
+ * @param {Uint8Array} data
64
+ * @returns {string}
65
+ */
66
+ decode_frame(data) {
67
+ let deferred2_0;
68
+ let deferred2_1;
69
+ try {
70
+ const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_malloc);
71
+ const len0 = WASM_VECTOR_LEN;
72
+ const ret = wasm.clientcore_decode_frame(this.__wbg_ptr, ptr0, len0);
73
+ deferred2_0 = ret[0];
74
+ deferred2_1 = ret[1];
75
+ return getStringFromWasm0(ret[0], ret[1]);
76
+ } finally {
77
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
78
+ }
79
+ }
80
+ /**
81
+ * Указатель на hot-буфер (zero-copy чтение из JS:
82
+ * new Float32Array(wasm.memory.buffer, ptr, len) — view
83
+ * пересоздавать каждый тик, рост памяти WASM инвалидирует
84
+ * buffer).
85
+ * @returns {number}
86
+ */
87
+ hot_ptr() {
88
+ const ret = wasm.clientcore_hot_ptr(this.__wbg_ptr);
89
+ return ret >>> 0;
90
+ }
91
+ /**
92
+ * Копия hot-буфера (nodejs-таргет; горячий путь браузера —
93
+ * hot_ptr).
94
+ * @returns {Float32Array}
95
+ */
96
+ hot_values() {
97
+ const ret = wasm.clientcore_hot_values(this.__wbg_ptr);
98
+ var v1 = getArrayF32FromWasm0(ret[0], ret[1]).slice();
99
+ wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
100
+ return v1;
101
+ }
102
+ /**
103
+ * Свой gameId из последнего player-блока; -1, если ещё не
104
+ * приходил.
105
+ * @returns {number}
106
+ */
107
+ my_game_id() {
108
+ const ret = wasm.clientcore_my_game_id(this.__wbg_ptr);
109
+ return ret;
110
+ }
111
+ /**
112
+ * Создаёт клиентское ядро из JSON-конфига `{engine: {...}, game: {...}}`
113
+ * (собирается src/lib/clientCoreConfig.js из CONFIG_DATA + opcodes).
114
+ * @param {string} config_json
115
+ */
116
+ constructor(config_json) {
117
+ const ptr0 = passStringToWasm0(config_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
118
+ const len0 = WASM_VECTOR_LEN;
119
+ const ret = wasm.clientcore_new(ptr0, len0);
120
+ if (ret[2]) {
121
+ throw takeFromExternrefTable0(ret[1]);
122
+ }
123
+ this.__wbg_ptr = ret[0];
124
+ ClientCoreFinalization.register(this, this.__wbg_ptr, this);
125
+ return this;
126
+ }
127
+ /**
128
+ * EMA-оценка (serverTime − localNow); NaN, если кадров ещё не
129
+ * было.
130
+ * @returns {number}
131
+ */
132
+ offset() {
133
+ const ret = wasm.clientcore_offset(this.__wbg_ptr);
134
+ return ret;
135
+ }
136
+ /**
137
+ * Бинарный кадр из транспорта: распаковка, вставка в буфер по
138
+ * seq (+дедупликация/опоздавшие), reconciliation предикта по
139
+ * player-блоку. false — кадр отброшен (чужой порт/версия/
140
+ * повреждён).
141
+ * @param {Uint8Array} data
142
+ * @param {number} local_now
143
+ * @returns {boolean}
144
+ */
145
+ push_frame(data, local_now) {
146
+ const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_malloc);
147
+ const len0 = WASM_VECTOR_LEN;
148
+ const ret = wasm.clientcore_push_frame(this.__wbg_ptr, ptr0, len0, local_now);
149
+ return ret !== 0;
150
+ }
151
+ /**
152
+ * Полный сброс (порт CLEAR).
153
+ */
154
+ reset() {
155
+ wasm.clientcore_reset(this.__wbg_ptr);
156
+ }
157
+ /**
158
+ * Весь рендер-тик: выдача пересечённых кадров (фильтр дублей
159
+ * своих эффектов → JSON-очередь), интерполяция, шаг предикта,
160
+ * запись hot-буфера. Возвращает длину hot-буфера в
161
+ * f32-элементах.
162
+ * @param {number} local_now
163
+ * @returns {number}
164
+ */
165
+ sample(local_now) {
166
+ const ret = wasm.clientcore_sample(this.__wbg_ptr, local_now);
167
+ return ret >>> 0;
168
+ }
169
+ /**
170
+ * Смена режима игрок/спектатор (KEYSET_DATA).
171
+ * @param {boolean} active
172
+ */
173
+ set_active(active) {
174
+ wasm.clientcore_set_active(this.__wbg_ptr, active);
175
+ }
176
+ /**
177
+ * Данные карты (MAP_DATA): мир raycast + сброс буфера и
178
+ * предикта.
179
+ * @param {string} map_json
180
+ */
181
+ set_map(map_json) {
182
+ const ptr0 = passStringToWasm0(map_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
183
+ const len0 = WASM_VECTOR_LEN;
184
+ const ret = wasm.clientcore_set_map(this.__wbg_ptr, ptr0, len0);
185
+ if (ret[1]) {
186
+ throw takeFromExternrefTable0(ret[0]);
187
+ }
188
+ }
189
+ /**
190
+ * Модель танка пользователя (известна при авторизации).
191
+ * @param {string} model
192
+ */
193
+ set_model(model) {
194
+ const ptr0 = passStringToWasm0(model, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
195
+ const len0 = WASM_VECTOR_LEN;
196
+ wasm.clientcore_set_model(this.__wbg_ptr, ptr0, len0);
197
+ }
198
+ /**
199
+ * Авторитетное состояние панели (PANEL_DATA): патроны/активное оружие.
200
+ * @param {string} panel_json
201
+ */
202
+ sync_panel(panel_json) {
203
+ const ptr0 = passStringToWasm0(panel_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
204
+ const len0 = WASM_VECTOR_LEN;
205
+ wasm.clientcore_sync_panel(this.__wbg_ptr, ptr0, len0);
206
+ }
207
+ /**
208
+ * Записи расхождения предикта с авторитетным состоянием
209
+ * (JSON {samples, violations, dropped, maxDelta, records});
210
+ * очередь очищается. 'null' — детектор выключен (конфиг без
211
+ * секции divergence, боевой путь).
212
+ * @returns {string}
213
+ */
214
+ take_divergence() {
215
+ let deferred1_0;
216
+ let deferred1_1;
217
+ try {
218
+ const ret = wasm.clientcore_take_divergence(this.__wbg_ptr);
219
+ deferred1_0 = ret[0];
220
+ deferred1_1 = ret[1];
221
+ return getStringFromWasm0(ret[0], ret[1]);
222
+ } finally {
223
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
224
+ }
225
+ }
226
+ /**
227
+ * Событийные кадры JSON-строкой [{game, camera}, ...] в
228
+ * форме, готовой для applyShot; вызывать при флаге hasFrames
229
+ * hot-буфера, очередь очищается.
230
+ * @returns {string}
231
+ */
232
+ take_frames() {
233
+ let deferred1_0;
234
+ let deferred1_1;
235
+ try {
236
+ const ret = wasm.clientcore_take_frames(this.__wbg_ptr);
237
+ deferred1_0 = ret[0];
238
+ deferred1_1 = ret[1];
239
+ return getStringFromWasm0(ret[0], ret[1]);
240
+ } finally {
241
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
242
+ }
243
+ }
244
+ /**
245
+ * Локальный визуальный выстрел: гейты (кулдаун/патроны/pending-бомба/
246
+ * жив/активен) внутри. JSON спавна для applyGameData либо None.
247
+ * @param {number} local_now
248
+ * @returns {string | undefined}
249
+ */
250
+ try_fire(local_now) {
251
+ const ret = wasm.clientcore_try_fire(this.__wbg_ptr, local_now);
252
+ let v1;
253
+ if (ret[0] !== 0) {
254
+ v1 = getStringFromWasm0(ret[0], ret[1]).slice();
255
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
256
+ }
257
+ return v1;
258
+ }
259
+ }
260
+ if (Symbol.dispose) ClientCore.prototype[Symbol.dispose] = ClientCore.prototype.free;
261
+ exports.ClientCore = ClientCore;
262
+
263
+ /**
264
+ * Публичный ABI ядра для JS-оболочки (Worker хоста / тестовый харнесс).
265
+ */
266
+ class GameCore {
267
+ __destroy_into_raw() {
268
+ const ptr = this.__wbg_ptr;
269
+ this.__wbg_ptr = 0;
270
+ GameCoreFinalization.unregister(this);
271
+ return ptr;
272
+ }
273
+ free() {
274
+ const ptr = this.__destroy_into_raw();
275
+ wasm.__wbg_gamecore_free(ptr, 0);
276
+ }
277
+ /**
278
+ * Живые игроки плоским массивом [id, teamId, x, y, ...]
279
+ * (аналог Game.getAlivePlayers для меты).
280
+ * @returns {Float32Array}
281
+ */
282
+ alive_players() {
283
+ const ret = wasm.gamecore_alive_players(this.__wbg_ptr);
284
+ var v1 = getArrayF32FromWasm0(ret[0], ret[1]).slice();
285
+ wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
286
+ return v1;
287
+ }
288
+ /**
289
+ * Ввод игрока: seq + action ('down'/'up') + имя клавиши
290
+ * (wire-формат 'seq:action:name' разбирает JS-оболочка).
291
+ * @param {number} game_id
292
+ * @param {number} seq
293
+ * @param {string} action
294
+ * @param {string} key_name
295
+ */
296
+ apply_input(game_id, seq, action, key_name) {
297
+ const ptr0 = passStringToWasm0(action, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
298
+ const len0 = WASM_VECTOR_LEN;
299
+ const ptr1 = passStringToWasm0(key_name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
300
+ const len1 = WASM_VECTOR_LEN;
301
+ wasm.gamecore_apply_input(this.__wbg_ptr, game_id, seq, ptr0, len0, ptr1, len1);
302
+ }
303
+ /**
304
+ * Содержал ли последний `pack_body()` событийные блоки
305
+ * (трассеры/бомбы/взрывы/удаления). JS-Worker вызывает после
306
+ * `pack_body()` для выбора канала WebRTC: события → meta
307
+ * (reliable), только позиции → state.
308
+ * @returns {boolean}
309
+ */
310
+ body_has_events() {
311
+ const ret = wasm.gamecore_body_has_events(this.__wbg_ptr);
312
+ return ret !== 0;
313
+ }
314
+ /**
315
+ * Полная очистка мира (смена карты).
316
+ */
317
+ clear() {
318
+ wasm.gamecore_clear(this.__wbg_ptr);
319
+ }
320
+ /**
321
+ * Курированный дамп мира для отладки (тела, коллайдеры,
322
+ * карта, нав-граф, spatial-сетка, rng, аккумулятор) —
323
+ * читаемая альтернатива serialize_state.
324
+ * @returns {string}
325
+ */
326
+ debug_json() {
327
+ let deferred1_0;
328
+ let deferred1_1;
329
+ try {
330
+ const ret = wasm.gamecore_debug_json(this.__wbg_ptr);
331
+ deferred1_0 = ret[0];
332
+ deferred1_1 = ret[1];
333
+ return getStringFromWasm0(ret[0], ret[1]);
334
+ } finally {
335
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
336
+ }
337
+ }
338
+ /**
339
+ * @param {Uint8Array} data
340
+ */
341
+ deserialize_state(data) {
342
+ const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_malloc);
343
+ const len0 = WASM_VECTOR_LEN;
344
+ const ret = wasm.gamecore_deserialize_state(this.__wbg_ptr, ptr0, len0);
345
+ if (ret[1]) {
346
+ throw takeFromExternrefTable0(ret[0]);
347
+ }
348
+ }
349
+ /**
350
+ * Копия последнего кадра (nodejs-таргет не отдаёт память
351
+ * наружу; горячий путь браузера использует frame_ptr + память
352
+ * WASM).
353
+ * @returns {Uint8Array}
354
+ */
355
+ frame_bytes() {
356
+ const ret = wasm.gamecore_frame_bytes(this.__wbg_ptr);
357
+ var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
358
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
359
+ return v1;
360
+ }
361
+ /**
362
+ * Указатель на буфер последнего кадра (zero-copy чтение из JS:
363
+ * new Uint8Array(wasm.memory.buffer, ptr, len)).
364
+ * @returns {number}
365
+ */
366
+ frame_ptr() {
367
+ const ret = wasm.gamecore_frame_ptr(this.__wbg_ptr);
368
+ return ret >>> 0;
369
+ }
370
+ /**
371
+ * @param {number} game_id
372
+ * @returns {boolean}
373
+ */
374
+ is_alive(game_id) {
375
+ const ret = wasm.gamecore_is_alive(this.__wbg_ptr, game_id);
376
+ return ret !== 0;
377
+ }
378
+ /**
379
+ * @param {number} game_id
380
+ * @returns {number}
381
+ */
382
+ last_input_seq(game_id) {
383
+ const ret = wasm.gamecore_last_input_seq(this.__wbg_ptr, game_id);
384
+ return ret >>> 0;
385
+ }
386
+ /**
387
+ * Загружает карту из JSON (см. scripts/export-maps.js).
388
+ * @param {string} map_json
389
+ */
390
+ load_map(map_json) {
391
+ const ptr0 = passStringToWasm0(map_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
392
+ const len0 = WASM_VECTOR_LEN;
393
+ const ret = wasm.gamecore_load_map(this.__wbg_ptr, ptr0, len0);
394
+ if (ret[1]) {
395
+ throw takeFromExternrefTable0(ret[0]);
396
+ }
397
+ }
398
+ /**
399
+ * Информация о загруженной карте: setId, масштабированные
400
+ * респауны, размеры мира (JSON).
401
+ * @returns {string}
402
+ */
403
+ map_info() {
404
+ let deferred1_0;
405
+ let deferred1_1;
406
+ try {
407
+ const ret = wasm.gamecore_map_info(this.__wbg_ptr);
408
+ deferred1_0 = ret[0];
409
+ deferred1_1 = ret[1];
410
+ return getStringFromWasm0(ret[0], ret[1]);
411
+ } finally {
412
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
413
+ }
414
+ }
415
+ /**
416
+ * Создаёт ядро из JSON-конфига `{engine: {...}, game: {...}}`
417
+ * (собирается JS-оболочкой из game.js + models.js + weapons.js +
418
+ * opcodes.js, см. PLAN.md §3.4).
419
+ * @param {string} config_json
420
+ */
421
+ constructor(config_json) {
422
+ const ptr0 = passStringToWasm0(config_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
423
+ const len0 = WASM_VECTOR_LEN;
424
+ const ret = wasm.gamecore_new(ptr0, len0);
425
+ if (ret[2]) {
426
+ throw takeFromExternrefTable0(ret[1]);
427
+ }
428
+ this.__wbg_ptr = ret[0];
429
+ GameCoreFinalization.register(this, this.__wbg_ptr, this);
430
+ return this;
431
+ }
432
+ /**
433
+ * Пакует broadcast-тело кадра, дренируя накопленные события
434
+ * снапшота. Вызывать один раз на отправляемый кадр (throttle
435
+ * частоты отправки — забота JS-оболочки).
436
+ */
437
+ pack_body() {
438
+ const ret = wasm.gamecore_pack_body(this.__wbg_ptr);
439
+ if (ret[1]) {
440
+ throw takeFromExternrefTable0(ret[0]);
441
+ }
442
+ }
443
+ /**
444
+ * Собирает per-user кадр v3 во внутренний буфер, возвращает
445
+ * длину. Кадр читается zero-copy через frame_ptr() + память
446
+ * WASM. player_id < 0 — кадр без player-блока (наблюдатель).
447
+ * @param {number} server_time
448
+ * @param {number} seq
449
+ * @param {boolean} has_camera
450
+ * @param {number} camera_x
451
+ * @param {number} camera_y
452
+ * @param {boolean} force_reset
453
+ * @param {string | null | undefined} shake
454
+ * @param {number} player_id
455
+ * @returns {number}
456
+ */
457
+ pack_frame(server_time, seq, has_camera, camera_x, camera_y, force_reset, shake, player_id) {
458
+ var ptr0 = isLikeNone(shake) ? 0 : passStringToWasm0(shake, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
459
+ var len0 = WASM_VECTOR_LEN;
460
+ const ret = wasm.gamecore_pack_frame(this.__wbg_ptr, server_time, seq, has_camera, camera_x, camera_y, force_reset, ptr0, len0, player_id);
461
+ return ret >>> 0;
462
+ }
463
+ /**
464
+ * Полные данные всех игроков (Game.getPlayersData) одной
465
+ * JSON-строкой для первого кадра (FIRST_SHOT_DATA). Не
466
+ * дренирует накопители.
467
+ * @returns {string}
468
+ */
469
+ players_data() {
470
+ let deferred1_0;
471
+ let deferred1_1;
472
+ try {
473
+ const ret = wasm.gamecore_players_data(this.__wbg_ptr);
474
+ deferred1_0 = ret[0];
475
+ deferred1_1 = ret[1];
476
+ return getStringFromWasm0(ret[0], ret[1]);
477
+ } finally {
478
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
479
+ }
480
+ }
481
+ /**
482
+ * Координаты танка [x, y] (скруглены до 2 знаков) или пустой
483
+ * массив.
484
+ * @param {number} game_id
485
+ * @returns {Float32Array}
486
+ */
487
+ position_of(game_id) {
488
+ const ret = wasm.gamecore_position_of(this.__wbg_ptr, game_id);
489
+ var v1 = getArrayF32FromWasm0(ret[0], ret[1]).slice();
490
+ wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
491
+ return v1;
492
+ }
493
+ /**
494
+ * @param {number} game_id
495
+ */
496
+ remove_actor(game_id) {
497
+ wasm.gamecore_remove_actor(this.__wbg_ptr, game_id);
498
+ }
499
+ /**
500
+ * Удаляет игроков и снаряды, возвращает JSON-массив имён для
501
+ * очистки полотна клиентов (Game.removePlayersAndShots).
502
+ * @returns {string}
503
+ */
504
+ remove_players_and_shots() {
505
+ let deferred1_0;
506
+ let deferred1_1;
507
+ try {
508
+ const ret = wasm.gamecore_remove_players_and_shots(this.__wbg_ptr);
509
+ deferred1_0 = ret[0];
510
+ deferred1_1 = ret[1];
511
+ return getStringFromWasm0(ret[0], ret[1]);
512
+ } finally {
513
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
514
+ }
515
+ }
516
+ /**
517
+ * @param {number} game_id
518
+ */
519
+ remove_scripted_actor(game_id) {
520
+ wasm.gamecore_remove_scripted_actor(this.__wbg_ptr, game_id);
521
+ }
522
+ /**
523
+ * Респаун/смена команды (аналог Game.changePlayerData).
524
+ * @param {number} game_id
525
+ * @param {number} team_id
526
+ * @param {number} x
527
+ * @param {number} y
528
+ * @param {number} angle_deg
529
+ */
530
+ reset_actor(game_id, team_id, x, y, angle_deg) {
531
+ wasm.gamecore_reset_actor(this.__wbg_ptr, game_id, team_id, x, y, angle_deg);
532
+ }
533
+ /**
534
+ * Сброс здоровья/боезапаса всех танков (аналог Panel.reset).
535
+ */
536
+ reset_all_vitals() {
537
+ wasm.gamecore_reset_all_vitals(this.__wbg_ptr);
538
+ }
539
+ /**
540
+ * Дамп состояния симуляции (Worker Handoff, Этап 5.2).
541
+ * @returns {Uint8Array}
542
+ */
543
+ serialize_state() {
544
+ const ret = wasm.gamecore_serialize_state(this.__wbg_ptr);
545
+ if (ret[3]) {
546
+ throw takeFromExternrefTable0(ret[2]);
547
+ }
548
+ var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
549
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
550
+ return v1;
551
+ }
552
+ /**
553
+ * @param {number} game_id
554
+ * @param {string} model
555
+ * @param {number} team_id
556
+ * @param {number} x
557
+ * @param {number} y
558
+ * @param {number} angle_deg
559
+ */
560
+ spawn_actor(game_id, model, team_id, x, y, angle_deg) {
561
+ const ptr0 = passStringToWasm0(model, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
562
+ const len0 = WASM_VECTOR_LEN;
563
+ const ret = wasm.gamecore_spawn_actor(this.__wbg_ptr, game_id, ptr0, len0, team_id, x, y, angle_deg);
564
+ if (ret[1]) {
565
+ throw takeFromExternrefTable0(ret[0]);
566
+ }
567
+ }
568
+ /**
569
+ * @param {number} game_id
570
+ * @param {string} model
571
+ * @param {number} team_id
572
+ * @param {number} x
573
+ * @param {number} y
574
+ * @param {number} angle_deg
575
+ */
576
+ spawn_scripted_actor(game_id, model, team_id, x, y, angle_deg) {
577
+ const ptr0 = passStringToWasm0(model, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
578
+ const len0 = WASM_VECTOR_LEN;
579
+ const ret = wasm.gamecore_spawn_scripted_actor(this.__wbg_ptr, game_id, ptr0, len0, team_id, x, y, angle_deg);
580
+ if (ret[1]) {
581
+ throw takeFromExternrefTable0(ret[0]);
582
+ }
583
+ }
584
+ /**
585
+ * Шаг симуляции: фиксированные подшаги физики + ИИ ботов.
586
+ * @param {number} dt
587
+ */
588
+ step(dt) {
589
+ wasm.gamecore_step(this.__wbg_ptr, dt);
590
+ }
591
+ /**
592
+ * События за тик (kill/health/ammo/weapon/shake) одной
593
+ * JSON-строкой; буфер очищается.
594
+ * @returns {string}
595
+ */
596
+ take_events() {
597
+ let deferred1_0;
598
+ let deferred1_1;
599
+ try {
600
+ const ret = wasm.gamecore_take_events(this.__wbg_ptr);
601
+ deferred1_0 = ret[0];
602
+ deferred1_1 = ret[1];
603
+ return getStringFromWasm0(ret[0], ret[1]);
604
+ } finally {
605
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
606
+ }
607
+ }
608
+ }
609
+ if (Symbol.dispose) GameCore.prototype[Symbol.dispose] = GameCore.prototype.free;
610
+ exports.GameCore = GameCore;
611
+ function __wbg_get_imports() {
612
+ const import0 = {
613
+ __proto__: null,
614
+ __wbg_Error_92b29b0548f8b746: function(arg0, arg1) {
615
+ const ret = Error(getStringFromWasm0(arg0, arg1));
616
+ return ret;
617
+ },
618
+ __wbg___wbindgen_throw_344f42d3211c4765: function(arg0, arg1) {
619
+ throw new Error(getStringFromWasm0(arg0, arg1));
620
+ },
621
+ __wbindgen_init_externref_table: function() {
622
+ const table = wasm.__wbindgen_externrefs;
623
+ const offset = table.grow(4);
624
+ table.set(0, undefined);
625
+ table.set(offset + 0, undefined);
626
+ table.set(offset + 1, null);
627
+ table.set(offset + 2, true);
628
+ table.set(offset + 3, false);
629
+ },
630
+ };
631
+ return {
632
+ __proto__: null,
633
+ "./vimp_tanks_core_bg.js": import0,
634
+ };
635
+ }
636
+
637
+ const ClientCoreFinalization = (typeof FinalizationRegistry === 'undefined')
638
+ ? { register: () => {}, unregister: () => {} }
639
+ : new FinalizationRegistry(ptr => wasm.__wbg_clientcore_free(ptr, 1));
640
+ const GameCoreFinalization = (typeof FinalizationRegistry === 'undefined')
641
+ ? { register: () => {}, unregister: () => {} }
642
+ : new FinalizationRegistry(ptr => wasm.__wbg_gamecore_free(ptr, 1));
643
+
644
+ function getArrayF32FromWasm0(ptr, len) {
645
+ ptr = ptr >>> 0;
646
+ return getFloat32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);
647
+ }
648
+
649
+ function getArrayU8FromWasm0(ptr, len) {
650
+ ptr = ptr >>> 0;
651
+ return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);
652
+ }
653
+
654
+ let cachedFloat32ArrayMemory0 = null;
655
+ function getFloat32ArrayMemory0() {
656
+ if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) {
657
+ cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer);
658
+ }
659
+ return cachedFloat32ArrayMemory0;
660
+ }
661
+
662
+ function getStringFromWasm0(ptr, len) {
663
+ return decodeText(ptr >>> 0, len);
664
+ }
665
+
666
+ let cachedUint8ArrayMemory0 = null;
667
+ function getUint8ArrayMemory0() {
668
+ if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
669
+ cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
670
+ }
671
+ return cachedUint8ArrayMemory0;
672
+ }
673
+
674
+ function isLikeNone(x) {
675
+ return x === undefined || x === null;
676
+ }
677
+
678
+ function passArray8ToWasm0(arg, malloc) {
679
+ const ptr = malloc(arg.length * 1, 1) >>> 0;
680
+ getUint8ArrayMemory0().set(arg, ptr / 1);
681
+ WASM_VECTOR_LEN = arg.length;
682
+ return ptr;
683
+ }
684
+
685
+ function passStringToWasm0(arg, malloc, realloc) {
686
+ if (realloc === undefined) {
687
+ const buf = cachedTextEncoder.encode(arg);
688
+ const ptr = malloc(buf.length, 1) >>> 0;
689
+ getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);
690
+ WASM_VECTOR_LEN = buf.length;
691
+ return ptr;
692
+ }
693
+
694
+ let len = arg.length;
695
+ let ptr = malloc(len, 1) >>> 0;
696
+
697
+ const mem = getUint8ArrayMemory0();
698
+
699
+ let offset = 0;
700
+
701
+ for (; offset < len; offset++) {
702
+ const code = arg.charCodeAt(offset);
703
+ if (code > 0x7F) break;
704
+ mem[ptr + offset] = code;
705
+ }
706
+ if (offset !== len) {
707
+ if (offset !== 0) {
708
+ arg = arg.slice(offset);
709
+ }
710
+ ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
711
+ const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
712
+ const ret = cachedTextEncoder.encodeInto(arg, view);
713
+
714
+ offset += ret.written;
715
+ ptr = realloc(ptr, len, offset, 1) >>> 0;
716
+ }
717
+
718
+ WASM_VECTOR_LEN = offset;
719
+ return ptr;
720
+ }
721
+
722
+ function takeFromExternrefTable0(idx) {
723
+ const value = wasm.__wbindgen_externrefs.get(idx);
724
+ wasm.__externref_table_dealloc(idx);
725
+ return value;
726
+ }
727
+
728
+ let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
729
+ cachedTextDecoder.decode();
730
+ function decodeText(ptr, len) {
731
+ return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
732
+ }
733
+
734
+ const cachedTextEncoder = new TextEncoder();
735
+
736
+ if (!('encodeInto' in cachedTextEncoder)) {
737
+ cachedTextEncoder.encodeInto = function (arg, view) {
738
+ const buf = cachedTextEncoder.encode(arg);
739
+ view.set(buf);
740
+ return {
741
+ read: arg.length,
742
+ written: buf.length
743
+ };
744
+ };
745
+ }
746
+
747
+ let WASM_VECTOR_LEN = 0;
748
+
749
+ const wasmPath = `${__dirname}/vimp_tanks_core_bg.wasm`;
750
+ const wasmBytes = require('fs').readFileSync(wasmPath);
751
+ const wasmModule = new WebAssembly.Module(wasmBytes);
752
+ let wasmInstance = new WebAssembly.Instance(wasmModule, __wbg_get_imports());
753
+ let wasm = wasmInstance.exports;
754
+ wasm.__wbindgen_start();