diff --git a/src/App.jsx b/src/App.jsx
index ecb1782..3c292fa 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -56,15 +56,15 @@ function PlayerRoute() {
}
function IndexRoute() {
- // Direct hit on `/` without a gameId.
- // On a real deployment users should arrive with a ticket, so redirect them
- // back to the main Rublox site. On dev (localhost) just show a hint.
+ // Прямой заход на `/` без gameId.
+ // На реальном деплое юзер должен прийти с ticket'ом — редиректим обратно
+ // на главный сайт. На dev (localhost) показываем подсказку.
if (typeof window !== 'undefined' && window.location.hostname !== 'localhost'
&& window.location.hostname !== '127.0.0.1') {
window.location.assign(RUBLOX_HOME);
return null;
}
- return ;
+ return ;
}
export default function App() {
diff --git a/src/KubikonPlayer/KubikonPlayer.jsx b/src/KubikonPlayer/KubikonPlayer.jsx
index 0c69b39..24ca076 100644
--- a/src/KubikonPlayer/KubikonPlayer.jsx
+++ b/src/KubikonPlayer/KubikonPlayer.jsx
@@ -32,14 +32,14 @@ import KubikonMobileControls from './KubikonMobileControls';
// document.referrer пуст, если юзер открыл вкладку напрямую или прошло
// слишком много времени — тогда дефолт rublox.pro.
function exitPlayer(gameId) {
- // User clicked "Exit" — suppress browser-confirm on close (the
- // onBeforeUnload listener below reads this flag).
+ // Юзер явно нажал «Выход» — отключаем browser-confirm о закрытии
+ // (флаг читает onBeforeUnload listener ниже).
try { window.__rubloxExplicitExit = true; } catch {}
const env = (typeof import.meta !== 'undefined' && import.meta.env) || {};
const RUBLOX_HOME = env.VITE_RUBLOX_HOME || 'https://rublox.pro/app';
if (gameId) {
- // Pass gameId via ?game= — main site reads it and re-opens the
- // game card (so users return to the page they came from).
+ // Передаём gameId через ?game= — главный сайт прочитает и снова
+ // откроет карточку игры (юзер возвращается на ту же страницу).
const sep = RUBLOX_HOME.includes('?') ? '&' : '?';
window.location.assign(`${RUBLOX_HOME}${sep}game=${gameId}`);
} else {
diff --git a/src/api/API.js b/src/api/API.js
index 28e74f0..bc7662f 100644
--- a/src/api/API.js
+++ b/src/api/API.js
@@ -1,33 +1,33 @@
-// API endpoints for Rublox Player.
+// API-эндпоинты плеера Рублокса.
//
-// All backend URLs are configurable via Vite environment variables:
-// VITE_API_BASE — base URL for HTTP API (default: '' for localhost+vite-proxy)
-// VITE_REALTIME_HTTP — Colyseus matchmaking HTTP endpoint
-// VITE_REALTIME_WS — Colyseus WebSocket endpoint
-// VITE_RUBLOX_HOME — main Rublox site (where users are redirected if no JWT)
+// Все URL бэкенда настраиваются через Vite environment variables:
+// VITE_API_BASE — базовый URL HTTP-API (дефолт: '' для localhost+vite-proxy)
+// VITE_REALTIME_HTTP — Colyseus matchmaking HTTP-эндпоинт
+// VITE_REALTIME_WS — Colyseus WebSocket-эндпоинт
+// VITE_RUBLOX_HOME — главный сайт Рублокса (редирект если нет JWT)
//
-// See .env.example for a fully-working set of defaults that point at
-// the public staging environment (https://dev-api.rublox.pro).
+// См. .env.example с готовыми дефолтами на публичный staging
+// (https://dev-api.rublox.pro).
//
-// In dev (vite on localhost) BASE is empty so requests go to relative
-// /api-* paths, which vite.config.js proxies to staging/prod.
+// В dev (vite на localhost) BASE пустой и запросы идут на относительные
+// /api-* пути, которые vite.config.js проксирует на staging/prod.
const ENV = (typeof import.meta !== 'undefined' && import.meta.env) || {};
const IS_DEV = typeof window !== 'undefined'
&& (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1');
-// Empty BASE in dev → vite proxy handles routing.
-// In prod → either env-configured backend or current origin.
+// Пустой BASE в dev → vite-proxy роутит сам.
+// В prod → либо env-настроенный бэкенд, либо текущий origin.
const BASE = ENV.VITE_API_BASE
?? (IS_DEV ? '' : (typeof window !== 'undefined' ? window.location.origin : ''));
export const USER_addres = BASE + '/api-user';
export const STORYS_addres = BASE + '/api-storys';
-// Realtime (Colyseus) endpoints. Use HTTPS-protocol-relative variant when
-// served from HTTPS page (vite proxy handles /api-game), otherwise use
-// the env-configured direct URLs.
+// Эндпоинты realtime (Colyseus). По умолчанию используем HTTPS-relative
+// для HTTPS-страницы (vite-proxy обрабатывает /api-game), иначе берём
+// env-настроенные прямые URL.
const IS_HTTPS = typeof window !== 'undefined' && window.location.protocol === 'https:';
export const REALTIME_HTTP = ENV.VITE_REALTIME_HTTP
@@ -35,9 +35,9 @@ export const REALTIME_HTTP = ENV.VITE_REALTIME_HTTP
export const REALTIME_WS = ENV.VITE_REALTIME_WS
?? (IS_HTTPS ? `wss://${window.location.host}/api-game` : 'ws://localhost:8685');
-// Rublox main site — where to redirect users with no ticket/JWT.
+// Главный сайт Рублокса — куда редиректить юзеров без ticket/JWT.
export const RUBLOX_HOME = ENV.VITE_RUBLOX_HOME ?? 'https://rublox.pro/app';
-// Asset folders for profile photos & skins (served by user/storys microservices).
+// Папки ассетов для фото профиля и скинов (раздают user/storys-микросервисы).
export const FOLDER_PROFILE = USER_addres + '/assets/profile/';
export const FOLDER_STORYS = STORYS_addres + '/assets/skin/';
diff --git a/src/engine/GameRuntime.js b/src/engine/GameRuntime.js
index 8ae57b9..5407740 100644
--- a/src/engine/GameRuntime.js
+++ b/src/engine/GameRuntime.js
@@ -3126,7 +3126,7 @@ export class GameRuntime {
: '';
return `${playerBase}/${playMatch[1]}`;
}
- // Legacy /kubikon/* routes — redirect to main site.
+ // Legacy /kubikon/* роуты — редирект на главный сайт.
if (url.startsWith('/kubikon/gd')) return rubloxBase + '/app/gd';
if (url.startsWith('/kubikon')) return rubloxBase + '/app';
if (url.startsWith('/app')) return rubloxBase + url;
diff --git a/src/engine/PlayerController.js b/src/engine/PlayerController.js
index aade580..142f4ad 100644
--- a/src/engine/PlayerController.js
+++ b/src/engine/PlayerController.js
@@ -41,11 +41,11 @@ const CAMERA_MODES = ['third', 'first', 'front'];
const SIDEVIEW_DIST = 14;
const SIDEVIEW_HEIGHT = 2.5;
-// Build absolute /api-storys URL.
-// Uses VITE_API_BASE env if set (preferred for deployments where player
-// and API are on different domains), otherwise falls back to:
-// - empty base in dev (vite proxy handles routing)
-// - current origin in prod (assumes API is co-hosted)
+// Строит абсолютный URL для /api-storys.
+// Использует VITE_API_BASE если задан (предпочтительно когда плеер и API
+// на разных доменах), иначе fallback:
+// - пустой base в dev (vite-proxy роутит сам)
+// - текущий origin в prod (предполагаем что API на том же домене)
function _storysApiUrl(path) {
const env = (typeof import.meta !== 'undefined' && import.meta.env) || {};
if (env.VITE_API_BASE) {
diff --git a/src/engine/devlog.js b/src/engine/devlog.js
index cb6e54e..fd82cf1 100644
--- a/src/engine/devlog.js
+++ b/src/engine/devlog.js
@@ -1,12 +1,14 @@
/**
- * Dev-log клиент — шлёт логи на локальный Python-сервер
- * (c:\Users\min\Desktop\server\dev-tools\devlog-server.py)
+ * Dev-log клиент — шлёт логи на локальный HTTP-сервер на localhost:8765.
*
- * Сервер пишет в файл `devlog.txt` который Claude читает через Read tool.
- * Это убирает необходимость копировать логи из консоли вручную.
+ * Полезно когда нужно собирать console.* логи из браузера в файл для
+ * последующего просмотра (например при отладке вместе с AI-ассистентом).
*
* Активен только на localhost. На любом другом хосте запросы тихо
- * игнорируются (devlog-сервер недоступен).
+ * игнорируются (если devlog-сервер не запущен).
+ *
+ * Простой devlog-сервер можно собрать за 30 строк на Python/Node.js —
+ * принимать POST /log с JSON-body и писать в файл.
*
* Использование:
* import { devlog, attachConsoleHook } from './devlog';
diff --git a/src/fixtures/sample-game.json b/src/fixtures/sample-game.json
index 6258a8c..d45a2d4 100644
--- a/src/fixtures/sample-game.json
+++ b/src/fixtures/sample-game.json
@@ -1,9 +1,9 @@
{
"id": "sample",
- "title": "Sample Game (standalone mode)",
- "description": "A minimal demo project bundled with the player. Loaded when VITE_STANDALONE=true.",
+ "title": "Демо-игра (standalone-режим)",
+ "description": "Минимальный демо-проект встроенный в плеер. Загружается при VITE_STANDALONE=true.",
"author_id": 0,
- "author_username": "Rublox",
+ "author_username": "Рублокс",
"likes_count": 0,
"dislikes_count": 0,
"play_count": 0,
diff --git a/vite.config.js b/vite.config.js
index ad4a319..64b6037 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -1,23 +1,23 @@
import { defineConfig, loadEnv } from 'vite';
import react from '@vitejs/plugin-react';
-// Vite config for Rublox Player.
+// Vite-конфиг плеера Рублокса.
//
-// - port 5173 is fixed (player code and external links assume it)
-// - outDir 'build' (deployed under nginx /var/www/rublox-player/build/)
-// - manualChunks split babylon/colyseus into separate chunks
-// (engine ~46k lines, single-bundle build is >5 MB; browsers parse longer)
-// - define for process.env.NODE_ENV — shim for engine code that used the
-// CRA-provided global
-// - dev proxy targets staging by default; override via VITE_API_PROXY_TARGET
-// in .env.development.local to point at your own backend.
+// - порт 5173 фиксирован (код плеера и внешние ссылки на него рассчитывают)
+// - outDir 'build' (деплоится в nginx /var/www/rublox-player/build/)
+// - manualChunks выносят babylon/colyseus в отдельные чанки
+// (движок ~46к строк, single-bundle >5 МБ; браузер парсит дольше)
+// - define для process.env.NODE_ENV — шим для engine-кода, который
+// использовал CRA-провайденный глобал
+// - dev-proxy по умолчанию ходит на staging; переопределяй через
+// VITE_API_PROXY_TARGET в .env.development.local чтобы указать свой бэкенд.
export default defineConfig(({ mode }) => {
- // Load env so we can use VITE_API_PROXY_TARGET in proxy config.
+ // Грузим env чтобы взять VITE_API_PROXY_TARGET для proxy-конфига.
const env = loadEnv(mode, process.cwd(), '');
const PROXY_TARGET = env.VITE_API_PROXY_TARGET || 'https://dev-api.rublox.pro';
- // All backend prefixes the player talks to.
- // Each entry creates a Vite proxy: /api-X/* → ${PROXY_TARGET}/api-X/*
+ // Все префиксы бэкенда с которыми общается плеер.
+ // Каждая запись создаёт Vite-proxy: /api-X/* → ${PROXY_TARGET}/api-X/*
const proxyPrefixes = ['/api-user', '/api-storys', '/api-game'];
const proxy = Object.fromEntries(
proxyPrefixes.map((p) => [
@@ -29,8 +29,8 @@ export default defineConfig(({ mode }) => {
return {
plugins: [react()],
server: {
- // Bind IPv4 explicitly — Vite defaults to [::1] on Windows, which
- // breaks IPv4 localhost (ECONNREFUSED from curl / browser).
+ // Явно биндим IPv4 — Vite по умолчанию слушает [::1] на Windows,
+ // что ломает IPv4-localhost (ECONNREFUSED от curl/браузера).
host: '127.0.0.1',
port: 5173,
strictPort: true,