From d0241d60535e6bfa1878c447847d3fedeba8162f Mon Sep 17 00:00:00 2001 From: "svoboda200786@gmail.com" Date: Tue, 10 Jun 2025 00:23:43 +0300 Subject: [PATCH] test --- .env.example | 9 + .gitea/workflows/deploy.yml | 57 + .gitignore | 5 + bc | 1 + package-lock.json | 1552 +++++++++++++++++ package.json | 12 + public/images/almagest_avatar.webp | Bin 0 -> 411712 bytes public/images/balard_avatar.jpg | Bin 0 -> 3231 bytes public/images/elena_avatar.gif | Bin 0 -> 41175 bytes public/images/elena_avatar.jpg | Bin 0 -> 2161 bytes public/images/elena_avatar.webp | Bin 0 -> 283554 bytes public/js/auth.js | 212 +++ public/js/client_del.js | 583 +++++++ public/js/gameSetup.js | 256 +++ public/js/gameplay.js | 444 +++++ public/js/main.js | 482 +++++ public/js/ui.js | 534 ++++++ public/style_alt.css | 1399 +++++++++++++++ server/auth/authService.js | 153 ++ server/bc.js | 393 +++++ server/core/config.js | 112 ++ server/core/db.js | 94 + server/core/logger.js | 93 + server/data/characterAbilities.js | 178 ++ server/data/characterStats.js | 47 + server/data/dataUtils.js | 72 + server/data/index.js | 75 + server/data/taunts.js | 118 ++ server/game/GameManager.js | 559 ++++++ server/game/instance/GameInstance.js | 752 ++++++++ server/game/instance/Player.js | 0 .../game/instance/PlayerConnectionHandler.js | 502 ++++++ server/game/instance/TurnTimer.js | 237 +++ server/game/logic/aiLogic.js | 133 ++ server/game/logic/combatLogic.js | 472 +++++ server/game/logic/cooldownLogic.js | 154 ++ server/game/logic/effectsLogic.js | 153 ++ server/game/logic/gameStateLogic.js | 133 ++ server/game/logic/index.js | 66 + server/game/logic/tauntLogic.js | 151 ++ server/services/SocketService.js | 0 server/views/index.ejs | 237 +++ 42 files changed, 10430 insertions(+) create mode 100644 .env.example create mode 100644 .gitea/workflows/deploy.yml create mode 100644 .gitignore create mode 160000 bc create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/images/almagest_avatar.webp create mode 100644 public/images/balard_avatar.jpg create mode 100644 public/images/elena_avatar.gif create mode 100644 public/images/elena_avatar.jpg create mode 100644 public/images/elena_avatar.webp create mode 100644 public/js/auth.js create mode 100644 public/js/client_del.js create mode 100644 public/js/gameSetup.js create mode 100644 public/js/gameplay.js create mode 100644 public/js/main.js create mode 100644 public/js/ui.js create mode 100644 public/style_alt.css create mode 100644 server/auth/authService.js create mode 100644 server/bc.js create mode 100644 server/core/config.js create mode 100644 server/core/db.js create mode 100644 server/core/logger.js create mode 100644 server/data/characterAbilities.js create mode 100644 server/data/characterStats.js create mode 100644 server/data/dataUtils.js create mode 100644 server/data/index.js create mode 100644 server/data/taunts.js create mode 100644 server/game/GameManager.js create mode 100644 server/game/instance/GameInstance.js create mode 100644 server/game/instance/Player.js create mode 100644 server/game/instance/PlayerConnectionHandler.js create mode 100644 server/game/instance/TurnTimer.js create mode 100644 server/game/logic/aiLogic.js create mode 100644 server/game/logic/combatLogic.js create mode 100644 server/game/logic/cooldownLogic.js create mode 100644 server/game/logic/effectsLogic.js create mode 100644 server/game/logic/gameStateLogic.js create mode 100644 server/game/logic/index.js create mode 100644 server/game/logic/tauntLogic.js create mode 100644 server/services/SocketService.js create mode 100644 server/views/index.ejs diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..a8cf526 --- /dev/null +++ b/.env.example @@ -0,0 +1,9 @@ +DB_HOST=localhost +DB_USER=your_mysql_user +DB_PASSWORD=your_mysql_password +DB_NAME=your_game_db +DB_PORT=3306 + +BC_APP_PORT=3200 +BC_APP_HOSTNAME=127.0.0.1 +NODE_ENV=development \ No newline at end of file diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..0b6276a --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,57 @@ +name: Deploy Project BC + +on: + push: # Запускать при событии push + branches: + - main # Только для ветки main (или master, или ваша основная ветка) + +jobs: + deploy: + runs-on: ubuntu-latest # Указываем метку раннера, на котором должна выполняться задача. + # Убедитесь, что ваш зарегистрированный раннер имеет эту метку. + # Можно использовать и более специфичную, например, 'self-hosted' или имя вашего сервера, если вы так его пометили. + + steps: + - name: Checkout repository + uses: actions/checkout@v3 # Стандартное действие для скачивания кода репозитория на раннер + + - name: Setup Node.js # Если вам нужно определенная версия Node.js для npm install + uses: actions/setup-node@v3 + with: + node-version: '18' # Укажите нужную вам LTS или другую версию Node.js + + - name: Install Dependencies + run: | # Выполняем команды в рабочей директории раннера (куда был склонирован репозиторий) + echo "Current directory: $(pwd)" + if [ -f package.json ]; then + echo "package.json found. Installing dependencies..." + npm install --omit=dev + else + echo "package.json not found. Skipping npm install." + fi + working-directory: ./ # Указывает, что npm install нужно выполнять в корне склонированного репозитория + # Если package.json для bc.js в подпапке server/, то: + # working-directory: ./server + + - name: Execute Deploy Script on Server + uses: appleboy/ssh-action@master # Популярное действие для выполнения команд по SSH + with: + host: ${{ secrets.DEPLOY_HOST }} # IP или домен вашего сервера, где нужно выполнить деплой + username: ${{ secrets.DEPLOY_USER }} # Имя пользователя для SSH-доступа + key: ${{ secrets.SSH_PRIVATE_KEY }} # Приватный SSH-ключ для доступа + port: ${{ secrets.DEPLOY_PORT || 22 }} # Порт SSH, по умолчанию 22 + script: | + echo "Starting deployment on server for project bc..." + cd /home/nodejs/bc/ # Путь к рабочей копии проекта на сервере + git fetch origin main # Или ваша основная ветка + git reset --hard origin/main + + # Если npm install должен выполняться на сервере деплоя, а не на раннере: + # if [ -f package.json ]; then + # echo "Installing server-side npm dependencies..." + # npm install --omit=dev + # fi + + echo "Restarting PM2 process for bc..." + pm2 restart bc # Имя или ID вашего bc приложения в PM2 + echo "Deployment for bc finished." \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0e9ab5f --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.env +*.log +.idea/ +node_modules/ +1.bat \ No newline at end of file diff --git a/bc b/bc new file mode 160000 index 0000000..1cfb69a --- /dev/null +++ b/bc @@ -0,0 +1 @@ +Subproject commit 1cfb69af0a0a5c188661b1ba5fe60d8d4940c7e2 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4e1f36c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1552 @@ +{ + "name": "bc", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "bcryptjs": "^3.0.2", + "dotenv": "^16.5.0", + "ejs": "^3.1.10", + "express": "^5.1.0", + "jsonwebtoken": "^9.0.2", + "mysql2": "^3.14.1", + "socket.io": "^4.8.1", + "uuid": "^11.1.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.18", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz", + "integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.15.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", + "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/bcryptjs": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz", + "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT" + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/lru.min": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz", + "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mysql2": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.1.tgz", + "integrity": "sha512-7ytuPQJjQB8TNAYX/H2yhL+iQOnIBjAMam361R7UAL0lOVXWjtdrmoL9HYKqKoLp/8UUTRcvo1QPvK9KL7wA8w==", + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.1", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru.min": "^1.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "license": "MIT", + "dependencies": { + "lru-cache": "^7.14.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c9c78ea --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "dependencies": { + "bcryptjs": "^3.0.2", + "dotenv": "^16.5.0", + "ejs": "^3.1.10", + "express": "^5.1.0", + "jsonwebtoken": "^9.0.2", + "mysql2": "^3.14.1", + "socket.io": "^4.8.1", + "uuid": "^11.1.0" + } +} diff --git a/public/images/almagest_avatar.webp b/public/images/almagest_avatar.webp new file mode 100644 index 0000000000000000000000000000000000000000..c4ca05ee004b1c0aafd2ee11deb9b7a5d15462f6 GIT binary patch literal 411712 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 z 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�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

j`gPyR>}_~z=^`s!20<*)QV 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�!^SinH=J@J; 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

;Q zl=9Fe^X^AVc^V=Nt06Wc%Y_Z9B)TuFQ^&}Q6^C>sg#_6Ss^B(+00MH-au|y@5N5_$ z1ckV!Trh%|9Arueu@QiPBVLzM?pQvxCsNP___BJ6~;>3+<1 zWO6AMC0L?2O(9ZR1Byu_uWVx;;aPxG)PT@hl50R@)Fw!O(T1vx& z=JPzBWCIM7#K_O$jJjwd6?A|)WT$Ae3n>y3%vr2#W`Wha=BQ-=(gk^z{6- zU;m4ge)+w}DQs;Z;pSA0@cNhBe@D+=wUC*OTol{O{-R}RG+00ny=yE)cMfjaZg+Xq zrXsXiCri|+l8(x&a?Ywss@SIhrLp^#gR@VMQz#`FJKOh$mLRf>WC>xR#TMXB36mix zSSm*p5+OA++yNMb2Z0$CcM?z^ie@MVL2z}^;oCIG!GtFQYZ@q%0Xu#39BI(Aeto9i zKfgb`n(MDUeEt`I{aX({JrCPEqem$Rv2I;n^7aK|NkV7|=TaLsrRw|MpvOaNw!Qyq zRz;t^Qx~>ZbKSqz#_#i7vnU;>!iQ7>66k3}PS&Yx8)9m2cT7nmwnU~GeaHkVB-ZVj z56?b()c`w!Q)_?9n6BufQtx`O6`CXo0u&%6&hli2rZKgbCMCGcwJ=|cTH@lSsnjwu zOXL{nd!t6azwWXoby1Unc_aoIFvf`F&P0?nT_GpE=asGunk)oX!}cmk@^*FyO=L0? zWeuYoCDaJ9b{>-&zII9+p_&AuH;WNot}f)l9ZNbYB4&Hw>5}c;7CB)A35EzV_Qj82U zWM`5n^g?KqxFI@WW((>gS%k?@2 zndb;&4!dR~kU>Ga2xqRc-g{#n?iM?Zxhw4OINYm3R!?jneSG@XQfvYdv*WZ(s$zt) z*(e}Y81R6hjAjZ50d6?Oi7fynOA*zgbGy5hAAIk0Sk{bkr-zF6^^8<*6KG|eM4t3| zgL6E5`K>SBIwg;?@yDrrd-y1@0k@IWY41GKey%{zTvat0~V(kw+bz^yPuH<2y- zUP>s$a3Pf^Sq3x#NSVWyo|Qm2L4;9usZ+b_yx z`QtCiK4TZ@_2ZBRZ})~tZ|q5dn3m37HB9v|nK6qtmXWAsZ8rxO8_S*5K$5Lel|)(w zbHzSgsRg@lwr0ZVXoyKkhd_`%38o52lMKuDZDcYE02&J!13i;krQx8n0xqD)wdf=O zIwTP%AxRSYoYt(Bg_nG!WiUrV3dm)xGv@}s+rBD`_lu|RnOIjx=z>GUD)gH zySj5I5ab>lt-ung6ERN;QA)bO4Vt7}+n_EesA4;qi2-@{T+K%>I9%=_WR8KR7!o^F zD~(*MW_HF#&Cm`IF-+x7o<$tmi;2O|65a;2N-hr=gr>JhB$(YEk&PPJIheQU?QHBq ztlT8#wvi4v*v^CZwixPT^b*`X6mT-Ap{KYTWYI3TSRug-w%uqVjjhkDzLcob=J5c0>j&5@Xv@X49O$H>XI^rWq6&oFOk6!78#DK>8ptBU9Ftq$u>b z=Qm!CZ_f`jC?FEAG_HnfwxM#U1x1yTxYMD2=%ZAcELF^Pcdm&Z((*yi?9dQ-!D)m(i{w$X`;2Yo$MFI5_% z!L9}`a<-@XmBU_l>X-uQevij-Fnnvy6X)3%*ZX)I`gbx@g+mqFVqnEyD7ldYjX9vu z3kgOQY$lc9wv$Fu4qcG@%0v5RY3uvnSRaN!Hq=0hk~7Q}(B0J9UXCGki^Aiy5FWk# z54GIF!IS@Afa&w~r*Z@MyQYOk%K?=b(6ZL){ve9g~V` zTIK=?4cd}grELRNQV7&(&Y^-CiY2z^{?xx!<>{l>pTEXk+8QC*@K}}ny+8c&Yes}D zSD0uwR+@Rv)^Y@?$Al_~66453$Fm!NK~dc@8(2uzgZrDiXOh}oX_z)S+|XbH!?9>* z@$#KF9;Q%JoP^!GeUA)l^cnAn2CRIULXyB|-$yt2g*PH9*N9s4P_|wCWKRkMQeQN&dzxv@1 zHc!rs4K`K==20UwRr2ce$3#2~4rxFg6g zs#-V?<=zlVRK>l_&*g9wII_rV`i9n_*$x6SF&o}(VBPIC24ElzF~CTxk({QN_X&aN z!>z;RP8MSUU?ip!r!lcaM>rA0sx+o~87=`d4d1H`JOYQ?%F0#7lJmi1Frm&o*wc=% zl)$hXL+BH8q7AS|!)*q2YzzZufG3o=n~|X5p*c0>pu-W!LN~UmGY^;E?iZ{D0C9;C z&b@bB+ORgAwC>2^#MYSZM5*2P3Auo7m1qmtMJ;ewunIXahzJ9bFmg>-vP(T&FeVYA zctn6p4mfEf8XkK>6lZ(;_THpn2*+A*G0ee9?0s!k3M~X>h*9P(Az}_FOvF%FW?P&? zI4p*egNbqqFp2HFMuCIEz0NS31&+c-#hVu7&kvKAgaJ%76X`dbWAh;*YCcB8xWjOVfj+m<{b4o)FALMycqTL4>17HnfMgEk3) zY*Grd{rUXtzxCE(_w_HY&nYSQg*?#qbhPWmcmMEie%u9)!+_Ru6^pB-lv0ywR@uTd z*W<_6%rpRSt70-*lUSsP+?%;@%dm#f=2*;JdMzX|D6n7gaB;82D^^b$jBRDs1u-GN z-&EI%QUsJBAV4v|vJYA5%+cPHOj2;fj-i^_;$SRhpi&=GB~#+mLO>fsBhK-}!95TS zOjs&Ig6u#L4Y8`T;>GQoSzkL}|Hij}zIX8Y{r$m*j~82a4~*juv8-{&LxaeR_b-^; zh$c5?D#_Crj)l<$VsGxm;3iM96dTJ#+>cdhlsqJWR3xgr4@D9QFzkTswZpbx7L^Vh zW7)E!pDsQy_W)$DF07?)PlzE)YZigT_poW253L%Fb7SdX9%J$ZIB%c{dV^YjOS9PRTrRE{TN>S+DsXDT8~1y2l^227K}S0vqSFRiXjK|F zp>Am646&lOFeNYnkamh$o#LwZccUA1nVjb*FEgMCq-eIb%tH+ZNorK8azTw!%)J`# z168xJ0AHa{u&5%ycoM19MxYX*mBSoP0|CIK1x8WWpdckTs|<013JxK3CqoeHaa3+I zXvk1vds_>j0uX5T_9S$JLcpL0ganYo>81o3)zXFKMob!3Y|n!32$I%uij`1B;^E|G zhJ;ffcRMA9!J~UMx>WsekJ!QjB}~McE`+hL=`eM zDzi&Z?&~u|Vd-bvtG$_rE!%17Cg&*!muA?2M4L-llvG^Uc%E(7nu1i)SRGR5vWd;UMrr{|nq-mKT(S)V57 z7jK{b_K!dM&;Q!L_RII5{U?9oNGlKXV^Vu}c_hyDO z?Hr@sQ*R+h!ng{0w-2RSx^Kt*VS-C46qc~~M| z%2DctF-_7Sx6?Q@-6aJ%fwg#80AeiSc9v9fxo`?3#N>DligTy76ok}fkFqn$Yx1^1 zZSOov5)wqL(F?r_t`eq_sL1VOSWfJA5*gHOHaJw$E;DkNs@$6Z?j3-TGzuX?dC=X4as&OnW3HRrIdq%fTZ&-7Pv!jf+Zx-D1v%p z9$JrA<`o-4m_a09a|5D407JPqNWcUTtNu)ladH^C(Ax;20+p~; zV#ggPjUacKjKrEl8$`?iaVB*PdUM;HMgyS`BvO(gAQ4#-88kO(q@)5<$yuH`JLQxH zv70oQotbD-9DAqIA?)MJw`iUfScfD0$-+On*^{_X0A9m8jCf#Z9m*=prjnH` zmTs=nHrzOhw@}$$4+kYRmcWq(QpqXWjSAWGq+7Hsr#-F>NM!AWR0K@M*o+x>`}tKG zZVL0;(|NUXvkcLVu)%ZQoSSn9=t9n3wM?`T1eXN43Dc@V8VIVe%QMIxSlbn3j&x3I}j2%o!ng+$liYMF%N!oF2fqFtBspp%G_8vL#uv&51S+2~e z1hajy`Kj^)2hC_LChelh^!|aNIAsz*C~-@P=M39II1B(9926m|3qAVi-sp-8ly}*N z^RN)0wH*N%;T$y)Kv`SCG|I``P7qYtY1_@5S))c*7QyS>hvyl9ibyD8Ov4=oV^X;} ziG@TFm{~)pg$(rUMpP0cJJ3+u=U{?hN-Son7ta?8bcX^!lz1}(L?UlQf(m)d8#&Ri z4LJ=F9T5Z8sWBqQYq!U&j;K1E$KLg_yR;Z5V2%>ZjdQQo(|9l24Nix1pkQJJ*gG@^ z=!E#*QR;%+y*c3^n-!pGAH(AoI_PY1$g+Y45D5VUQSLaXgl5kEy=jxmry~vhq6?gZYSz;&>KqHs?JgBRC=iXd{su)1hfMZpM+a)4A&H_o^*6nN; zC33T7yBjJ=B)y8gp^`JHsH2D>+mU_D2}XB6bWYhVkipYRb%HP?G1fBn>E5^Mm?64- zbBvRFt*Hm}&mH*OeRdlJP+KKw8|fm`H8WLGA??M-p<ZuX~2tGc|lt#LOpXr~k`0f{6d?C*Q|n9=6QF0sZ>{r0$ZS+Q+A5U8r@s)S(WWP>EP)d?0VNoGXYkSG z#YM`=>hiAsotJM8k1v;=4sP$y^Bcpo_~eIA)4_wMw>94T0*7fiFc_Y|W8(tMPG_2gKs{+2*$`5MWx8ZwcqY%o>K{b*3$}qy`&h#Z$A?Ga zZmEumVn@;#!|iAnH9$H_*8<64d5oUFo13dE7(pIc*YtAw<=M~WlG!!~r;EKPa*04v zS&&xS-kBp)gl=`TUg@|rb_+_XU>4gabq~VQI@iYS^8IBppERvxk#yrA1jhgZ63|$6 z%2+^JvW^i5=-n8%Oj}%-SJom&>}=dnsk+%&u7qWFyCwldBRM2pLorNH~R5 zbTB8q2qY2?3*DrGR441+ z=m1c=O_wYa-EniY=Tbe|M5X8y>S@OKP_+^{xVP7sBTn?X6;6+tSKq2}m(M=>)W{Qa zKXt1)lM*3t4BQ`fOsB%iU_nP^bTc$dQ%SQewkmh0Ex{^H)MPOuJ9ZjLkftW)yZ_y&7XAGD^^97{ovm=wQw0U; zcmGb~*}M+#x{>XvwyCnou}Y=Ydd7EE_lBQ8j!zp5o-&M%p?g?3xmME@bnR{S%vi44j2Uu?Bg*#n9>E^r9dbeB z08WfB3MhccYIlTS52^@)PS5}j1jKb%>weAUb*Uqgdr}|-0s%z;t#GSyxmh8Rk@KZ5 zAAj}tzx_Y|_D_H20e}3LKi>`(_@Dnf|FqoquiSoT|9XG@7yr|L?N|S)ul(a*bj{%x z?+WFSAV^}uaL5X<(jKlkWJBgYLUAr%!*zG#;YJC3+c!HwQ24Oa98w>s^?lyUQ3VL( z>{0uVm=^b{h6PKg84wYvDs*}rfF1A<=gCr0srtT9XL&59E7r_xGW6#1)fe@LPgc`N zDt6ZCbgS8RshetMv^MK1tag~w2{J4tvo`@y^|E{1XO2fHNH<-d4?cXf*IzgHS3pJ5 zfeUsJTQ?#DGBK;lAXw@>O{|SE5du(ewcQ<6Os8y8b>%+NhkGCmg}s~6jCPfEfZSNw$DedaKHes5u|Q59lq->IW=7ZP=Q;)x0lI&7kW2m-6k z$u)rOR5U2$M43fsQwnGj%fyk~O;ss?nUD;)O|gq!@_>+C9@M#$oAt(!gG7~&bnQ2fvU*^8?5RJRG zgj!&?(CH%RCMskjD5)bzb!`23~Qk4BRG?tH&|WlM1{BtaU!16v?zdv8R>b$c0YB0?YY-oK_ys7>Zn z7$v1m_d*6)!o-9v141^*^Et~CT`S_v6;;zW7w2py4_@unOwu@5I6h{v?P2XRJznzI z9{LcagpEWRxvklbQs99lBn!lj5|U;}4IlU#rZbKCkZ&$3Ngt*I({mzx=Jwzx#{7`<*xM zKfB`(|MtJ}|GSj${?h;a-@o$pw=e`M4uRF#1Jc5>&8pLp)G-t(o_FinPKa^`9_w^y zY*PWy8D+bJzKi%Ib{R!!6R#fX{F1HGZm|W)4na8v#i1P=QZ#}f&Q?||7TCSHdUcP3 zAu)|fmvUxKH<}NhsVWk^{YC|4%@*2~9C%#}ox&O9j?dw+1zy#zo#x?gXDY8s>vWw9 z!$2I`y*<*yhuO=Ej}e24jC7T50EpOds4=rGf%mF`L|~Lawj1+k0~*5mdEyNv@zD@IXi8N=3EJFc7OUB(FAlxCwV-NECyEQ1cOsCGk(8353V-T~@_CJi3*2@| zI$kIO;utj=4pyg90T`I<4$uZ^yG2RP7IWMYj4m)q$XP2|ENQKgnG%IKh-Qp>XkF?+ z8HPluvPRToq_eBrCR3P7IpTF&b6Dl!ojOitmEw<8|I;4Qn>h@z-ma2v+3b)NX|UHA zW7pV8Cbw2Gp-PYMrH8wa0AfHb`(9b3f!rHT4vfxheFV3vjnK5?!snTWt%he!it*bl_yfvNW)H>76>-m zww?FWulZg7B^WK#%DZ1E99vB^SZ=;b38?#i@0WK^C?!Q235Ksh@n+l0d9usxwtG&d z#P-QOUWbVq!MLGJOmpdl6#)b(9mXgIWq^4?bz0e9HH3}6|G>*%hK&HG%ku3GWF?aM zg6$OaqIK}bBGk|a(kPu`$yKz#4lYo%{`38%* zPtg*5K6r3X7b0LXX`f$Hz%Yi;z+s{jZ1 z!ZB2LEH-pOLfo#)yRIMfeDFG$E6Fvyx~@Ajx61W6q<3Kp6vS{pg%uGOjS_@xLyEYQ zbM3Od?kKRCamhYBOpzs$gi^$2*n%-DSr#e_gu?AktLX{V;k}ep)pV^~0}O#kdbN&@ ztc_T#5Ja_dU^PP=?J_&YZNU(ZTC)x6%{+z$8L9;(D6ppM$bol^APKO9mMoidym!(4 zDx!&2E{+L%{(Mky0V4_HC|76jLlE zCkHvDECX6F0hQxH?sjUkH&c`higU9M&cf~vs>0dh=!g@q5r&&gk|2o-oR}opKzU*$ zM1!2AY1*4eNFJDDVy`Y^uWyZcsO_nodJVIns5eEn7AUwu66r8G+mLJ{a08|jfC`Aa zT_c;^(C#$A^o$zBR;13fn})1eds=9{NQzQzugN|r+|Dr72@J)UdOpRTFR+{ zwA5)lV%lh{oXn9nnd1gyZ}v^oC5pmgZ?}{)QVR;}sW&sLmlj*x4w--!+sq_^L_rBu zR0(Ik`A?zGJYBulm(peIV@utP+aQ!yzW7CNzp+&zv>K2yZImOA?Sl<00@MASbv%!r z1~qYA#B3pKk2(uAEpQOQ1c-?u0#A_axO6_w!CD^FNZP{)zxqSG-~J|F(5^rcOqGhJ+sC^ zuAjnr@`|;xW!B2+yVu*$p2QvNV|jnj#~% zJ7U!x)K-Bz*GwDAnr67lAWhGDWq?T9AlpIPFb%+rfXvx*s-RsV9faUun@(|i6-5e^Z=bpC!@<4E!rr$tO?`-C7SUD$H5r18!GR!P%*lbOvb&{P zGA9TaFnMJh2j@wFiSA_M)IMM6D@MhW>&MeP`e5xjX@Pv{oGEe297I{<&;kZP7}Id7 zWW5<>vLxfeyOuf&cZxKJ{bc0KtWt>!%07ruAaQq@Bkwm0o7sZf~@E+;u5MLXpg-gR4 zh0sMNtWl-!(cRq`B^fR{!gZVTKy{~%bNj99oK+qhdHPvBq1vWVL$)R$fIuVECBlPf z#KxfP#rb$w5d_mt1hJ7gh3K}b(Q~@o$m4d8K$%2>6p_8CDDf@?B$&+1yta~Bl7+i0 zex23L$Be`Ra1IxD3R_eMg0z<<`JA!We#i!tG~X(gH7Zn14D(`(se9aRU4uRw2)07UN-f> z%|L3A)p7Rq8DPk0fLg9d0WHHo1sN1XNxVPz;qJ2MEKC6l6e3e>k}A%OWAkE=R+`d~NfC;Ps3owc+noy|HOIp;>b z?9_|*VH+t<0+R(rJY-m)Ah_7qW05b#5y`fU*)D@prqUoHTyj&kl2fZTvx-8CiBM;j zp_H2jk%p(8m64g-B}Ir#+`Zy*)-mj|q!1}&VcXM8N_tK!z&sRC1h|qIDw3_36u3Iw0U#bY;0b$El1qW`Dr)cE?o@@g7epKdU+dcn zVcYY^I9TrKtTZ)VBabRq8VopSu~TkK4Z?N@K=f`?43a<&N}O&fjv44(CU#;HfxrMH zheC!mFj96i$?l{9+QSqRm5FgJ4-g<`G4|%pY+RIZX-f1rB}m&9If0DBO!C&$BvZHj zm<+VrB&?OUyCSMJQp^DW<+Qc-axC!CsQNYy30%^|o^cGh=UqiRbSfmm$8&D+vX@+& z*Ry^URqs;{UHY~uj*A2!AtPk;8o_aqfEG@ZHF^fT4w6V1k}8dcn|-EWJZv{ZSf=f^ zB{jAUB&p)5U`h$7E$m%w7a*Pk1#je`VHvod#uS3|bXZO0T^_EKg|q-9>U@3pygg29 zu|`OsqsE(JOb7_kFbT!2*vyB88+<&zci4d2<+PPnXJ&u$b#m9EBCsmg?(1I~>3g3) zhsdqe7|U}s7AAQeNQu^{x=OpmL(g@D1ctkiTiQ1;vyJ3zWTp_IW79cNWqWdv4u}+e z8xTt&58-^z@gpw3YTjsb?VQs}b7-Px=C;^x8*mb;vNkiul^6pC2cYfkbwwW$ zAh!L8ex;tm{;wEIVd57RF+*0biiJG zVjQE}XFe*a3Cr8yS9g8xDB_;+12`48~SB?2fA z0ilVME>~xbHfB&7y}-qpyG|A56j;gPmIz98TT){PAad*#=WTX>q#gdG%*FSCmrhon4D_EHjEXDUQxVGwj~t&OE@6XkO4@D_ z(Y=sVAo-Zjs>obU*OX8#gjy}3@>z{BY)UC?RY(Pxp(0I`;Lrvj2F`|=2KuHq&t`V- zA!Zc2j^EGfsPr7=apTI0J&UNI0f23Ys%{#Dr6-Xr#jGg<(Su=I06@hd0-!W=DG^|* z0En2F54 zVP*nt(WQ5C^#w77!HVIKm@TsRmHx?ho|XnvA{@x z6&#`tal5P{gBsKT3E*gqoI-cw*{%~JLj+WybRSl4dURUmZkf=X0;=-u-Cb)seL4@y zvQg2!=(VfK)&Vnz>YqI!dnN^|SO=*)9HTos2bWg=+^hPvr(Sv}IeXAmSrBIfn@2;W zux1a-Mz(U!+*GHqXMs=^rbQ_dA&qPZ3eIq^M@%4jBLNFGf}3}*J|3Q|eOFdwE_7GZ zrH?2gGJ^yn0ALsApnI^84`+**jgJsZh$|(P<_PtuCP|48v@IgHuo3QitD=p~@BtCC zq1(SEKHVJOne?V}yc|)eQ2|W24<|zE8sV0rQ9^-_xfRA7<>DPm{y3994LxRh7#2%D zQaMIs{Wq7brac zOA;}5XV8;`yaQCJ!Ss3OV_&{ur?W;#$u*mLz90L{NAmu0&fC!4UGIMb#e2(lA38u5 z)d_3vvpaay+20rdAVx4`rK9(eol%SI*|1Zd0T|-Mn!v3P#k_VlCb~k^u2O(Of(mYO zgt0^`b6g9@Yo8BRk=aF5+TC#_&R4U`+X4)2}nGG1#khE*ZtZDzUc8sv7! zgRE-dnsmSraTc-Hl%w6ov?T)@fTZY@RE5<83ORQ)HX@^vW@FS$hTJK`@aT_x9OmTDquWhSN?HHxdsGQ~^PT2`s>5utsjQRb*$9yQ!w44JpU)xU~=A zxjtW89BrZYb_5Ps9I}M_TYKEJ+d)$~*sgOwV3^w-)<(-?F&GH}&APc06oPw|M5T!9G96;)jy7BIAPFYRVPm|(JHJPM>3RPp za~$o=vF@=y`oO2}Ig|@;dpuLN9s$@PXGqc#5>>~GH?Nv98IiY9w`%vZg>EQqn}Jk! zcg}DxeGE!~fSP;t+@HN1TB36K9Csl>B27wJkjlLVtC0)bH9-?oGu{wum#OxT*jGJQ?R@2OsCuf`{LJgo(}AXo=F3+b z(k{DhIKzb4)1|V+W@%znnz$XVuW1ojDvK?J*w{byHmgl+sSc5qpoHd7zq6V5_g1bsP$s~dxAtRyO6NfA@ zRJW!xda5E2jdmwQZnKIkByNxt1cpR1tR_I8I>dd3?F)C1N{_}Ol0Hp{>gM~7bYNdd z#&%TIjUkBBU)itAx}Uo66PGCxNZ2KZJ;_j{C}21c#Kc;cCW3X< zJ+-vXRH>?R?W__7A)zE~Z;${2EOX#o4P9Qcj86-r1DgWhOgIv+*)Z%5U1@940o&1? zTo+qO9L?&{xXku;9VAfOt58!`gTs3}Cjb>1xRHo-8}JfwWb{1F#k!2VHAqF?7O;Sd zoV~1ynHJizLz>}K3(W`%EpDAQZb)vEM1gfXVu%UMcGw{SD)d-f*=MJUvAx3BP7(@` zK^_=EXd<07RTHF;woRBNcRfD8d2S#K^|lL?v~@j-n(8z_0vrLsJ0Sc#=N@ib_fu6S zWgzQ-6d*@CHMXTHDOB(@7lXIM=Ozx}-li*z8^qvJvX>9xGH2d_ly)kSEr<{RU=yj4 zJ8C;6MTrq80m?u!9B_yY1w$3N9Vn8-pbEXE8 z(B9oyMM zwOrUnl9ci;fyZk*(pPsjon$f7iEM_JOy7O<-D{!>@z`CYM8qKhVTd+Na7Id!YTcrZ zhl$qAZj~j!&g`}jicC7S*AtA>pb%&9Zh4lPbGR=sEn@7ed)GOOExVG7YN{I#Z$Gsc zdb(RSw*rIIH-4YKSsMdO&S1L`hqPukWT%xahp0`9!+HE1-9;fHQKYOr6u_}uU`B|F z5GopwH2bSh>_ zK?|JxgOU_Q%e!aCxC<^pqKRyxu^oE5k zuCvJK9=pH>p@c0vrD1lpr(0eoHODc$T!YX`G9YU!54V+a%F#yF?q(F+P6A#Oj?Kp$ zc2CE&cMg>C<*qK3!sknOFpikF`&1E@nsw$h$cT#>$)y&61c0h2NKhrgvzm{bLCvO*W01v{R!Wvyh6Z~bSPj@ zia9WfK~wkHZ;-n)b}wlT3&kftR#9_pYv2su8-q>Zp1#pTAO<-m+Ia1vmFHElG_q6MYeO0!H6r!Hqc@u?oezcVo7h8JbgC(Mp9JeD)*uU z023^TJsVTq5@+Bs7xoYDogR zX@OR~sG_uJxLebtQiBL;PIc?nqm}w@k}TogbHZK*^|Go7_CbxgwF^+U1LdV6AgAmc z2j2tyZey=@Kec4eN@MMexC*qe+`S}NIRgo)ZKb+vKh?!N=pG3@*Q3w=;O)ov1O2u= zmm-N@w)gd?F0Uqyfb3jCBq5NZ09%CGaJ-ssgD5H5@UwTMc{_7)ZngpiU{eyF=9Z!TTfb+e1~!vQlE16lqAXguyB_+|ad60R$v^SQipAkZA}K z#W9OP(4#UKv#qhcUsNG%Mx8_T%cZ>$mkgXzshTFa2sl=&6 zV^N+0j~akwM=BT;ndGRlCt-!`XtYMTnT(kzB1Sd$$$@)(8XJ2$5K!3z^UBaC$G&{N zU482ErnsGQJVaPdIhO6cxL$dlcY3`-eWKnk%*6>oSO^NpNVrTn2<%LkUQT;}z)d4k zv%wr2lN!p(-6Rn}0^33oMODF_B?$}yIlScc1sK*M%8?Y;zUh zp_gvkb)f>|sQ?-@g z7O9(LGY^DNniR>&1y-`j?;PG+Af5R-pUNCjF1hF0k1d?Mc!bnwG0@KH%C^o_Y6cD0gp4Gsfm$lpE;%!1?V=UV!uCZ{@ zDjib^P&~@5m>Dn8leOrrh6vbET3rgEuMKK$H5?_Rx^0O_(Fcw=*rzgdNNRKd+|D5w zjsa;ltDx4lvDo1#Gi02s$M-*;KZ76M8G7c)j~)K}?=Bvnx^rWylo+qwH(v3^b)KNV z3!g7RufC0s$KbfwXFM2%_26c%({_c##AOLdJ0y!kMGrxgY@KA<6v7BV3rdGVAr&JQ z(S{G^y`;BtAUGirGi@{+iB)+AS+c>Rh=Xh-jah5R%dB@R5|DcnCL*X{Qz$#ma#I5e zl8T@)_e@2!Q0~Jqt-3`#25Didu^+UcQWhs5J6b?Y z4xtEvZQV2{I!=;^-hJ;G_NaI$3`O>`5q6wqm}uohOHLbh8FDfS8%^(6q}WV(kewbg z-rXPKha2s--7*H4S^Lnym7td*he(yy)T7M(b32s@tzp|(52_=EEb1|v+bOWrPjg3j3Z@D;u)o$g-To?4)bEpdVb|h%2ko|^6jyG_pvaGWMuV9FG?Fmo(7E3 zDanW>=ILdn)C}mGNHW8|IbD7WYMhzn%mMUn!X9TmVfqZn>-1c^@KKrm2> z#|btNU<%yUacNIrioL=&yho#laHR}t>ufZa_lo;H9ZiOwVl>G> z6M|&Nk{Gqc5Jb#cv|F)+hH+KPC`Ce)Wzq&nk^)0|pt8MT`SxtHu!68XiXgV+yPo>b zj4u^@XRrTi|Kb~GefS%``NJ~xhKTJ#xat&q_o;t!eLm^e=YFXEs=~-Q&2F>LXSW=2 zg%4Hfq=-zA0vRL=J_MLVpD4Ae+P6xg=t;5IPG#Smi#2=vazSUvgu#Lg2rz0;S+O&R z#UdpFWm8$%7|$W_#hk^|Y~fB|j~i>(BJLG@Y8Io05Yhob~)Fuw6h3d5>AP_c_}pL_F(1o11HwCy;sC7 zcWH=2fmiuH#hk9Q2@|OIJ)&q%iP?6lwO89i!$?UW8Y1eAF~9e6o*1{T85-+2#(N(s zmQtB*#2X1M!H_XyHUmtiI0rh06Pd;+N;GtaU=PV~m|`FtD9|{EE;HXBy*Y;4@CGSC zAf%hAvB01K20%qj3zv{N?zpNt&*2zq90W(TB}fV!C!2PUp{Z=7Q0Uf!2@c@QEb%VI zB6Xa8%NJ{V&33QOoE)e-8ne~SW~_ZsHJ6qV4N0!(nnzhx?}ldWY?l^y7e*Dk&;%W^ zNX|&_s(fzqcC0wAyZ9cbaK7rHSZvy=?W;mDS|MSFgkCkG+kpHVs^-7D(*2j3z*VZCgV%j0LvI zYA9q(o<1C-8_xqxr5?|7m`z2BwuykEtLimYa7UEN_;If%Z{fa#GmJ;{aILTViP|NKvGz;Xs8x zDjCpVHz%8d8Ky)GmZ?P2BM=_1R&S~Slx?G8I|~Ads2!jBC-|!*-%|aI-cIPh!{7Ru z@teiN8GQ{kCXJ2E?854Ndt4vedwagVw*Y!Tg}+ceZT9}dTpOP+=>GiMPmj5xS|ryU z^93<`RBd}gO115sRHDu^NvKxfsIqL#aYzKHD-JGSj_^J!7sCT0+{n#D6(I;p1VGy$ zH5=B%8nY5;01<4H16AsUd2pgJwq4~JDc}wTq)OnlXl_Y}vh`LTm(zJ!o*gTSCaR9y zH2}LXm=bT{vg&bqf&h@EQrE#Avv$kMNlKJRBJHM84$y8U;pDZniVTNUB%uUWdiUs( z6q&G0ClMYQr}b z1c=?9W<~(28lTe)B<2R=6gkF9L)eQ&4-9dZcp1W@&aJoSbsTiZ#Z*UW7f6R(!nx-% zn5){o<(Rr!RnpydIjhE~!zw`_NwQ==ZEz1UTeDzzFMJDaCZ zti%V*$Zfer*!B@s8mzREo>?A2Bo>RUEI}FsnMo*Rn~Wsvks4xp_gTUSw369Xb3VAY znPCY?R(U#fGG=d!p*zd_tS?vD261Qlp||Q*EL?6`AaRnbvMp9ofH@%GG07z*DFNvt z2e%arr4LyEED8+-h*s6wQd#eGS<-}5fTT#9D-V5~2P>ysX9t72<~7rtcW+tuD<|Rz z%$hsZZ9gxeU$6dq4_`fUf4ZJw1@*Yk};P9Z3jaI98?oXzP;PsqIt>nTUH8 zA`;ro;##-~gXFf9kTzsMv@!)=s@uJ48_}XS3?Zu^8WU|EaL@;{Vx7@>WyeW?OcG3> zBh+mwg((Q2dxbg3+v1n&puK6#*?D4=bs!1A3I`0r0h5QSwj{6bUDfp7JdUCtQHVkl zw$vom8#@Or0Rus!(Pz6obF3;@A+7@-L-&R%S2+S|jee6Cbw^GY?L2u5piQV@ZN|~H zs^=Dj8-Z9X?45vSfxu0ywDj-Z$qU z*-*9Koo9|$kI%Exsc>dXqd-V9V}H6Ec@3FT6$n6?<(X<}DeWvZ8PYzzXiSxfU(Rk!kXr7w z45^-GWTDgqkkJ;oF;WF3xVlko8A?%NTcU_eN|=Nwvw<|y+x1Y0ZrYj!YPfT%IeDnF ziM<5}7cOf9lv#XE=N#TEeE^xHpqR^D-Vr<=8kI!GS*;HS6GWma4~C7MyVnD4mN^Oo z!;pyDq#QvkRT*k3?_d=6Mn+PNo~)+{?=lnddR;B^V1F4WpS|>1&`3xymcUc}w!t07 zkM)<|^9w`o`3LJqWuq`%l?B#gVuk`py4?f>TTVa`G)0oPZI1&p#iljEWA^L5fYZ@} z1Rwz!5D20a%#lL|X=uweMng4#0WJwcffEQFptV6dL1?Pcx;=xP!Uf2YOpXRx!eU4k zWLm@rj;2oVE=81q3Iw51UuGh77P`Xmq?1>10j=??daIR&)t^+JI>&HBdu zaab3mN%QI%mqG)h=Dm$z(9M)y7-Q>dYvNpc=CQdLK^hqrSZ~@kSR86{ z_6Qe}+)Y(#Hto4m+zr*b*R9Oj-4Thh-Bi;Qc2CX0=oT7REp$79ZYCB+rkFJn7)tw; z!XswD8M}9wMWAPMa#%SFzFYZfvx`D=GAcI8z0dlrT%sm#KbS9fUyoQ|`Pp`!UZ7>x z8-Nf;oP+z~_1n|j-~7C4ZO{VKV!_?J&fVkF%9bT3IfombncQP^?_RwTaXk~4ccG?^ zU{m8{y&3l2dGR&puea*4jw*aVj20FfYN$c;kY8`VD+Tw8rh2~TGM8dRY%`kodwr<_ zvsO{yv7LKsgtpt*Y*#mDgiN14gk8F^o$anIAX0nAu4Qd=v|6;bs#${Dq>v3D(Xh1) z5U5I-K|*8~Cy}B#QcxuTJsKCz`wYI&HDh6c)ZXgL&-?gVCo{VzOKRAeN=`WHSXmue zoJ8CZ1Ezw)5=ivrPV#DsRXQk;mYB!fhx1GJ6m9Cl#jSV>in1)hkW z?zu2h#XCa=JUi$Vm{*EUW;&?4&xZAb^~3x6ti<)W9>QKUT3~f~+epNbA=Ro3F&6eT z;!I&!1&|6v^$C;?heJhPjI+o40DDo&-YglZP=Nsf$V^m@CVLX;85*`mN}N=JycjY- z0EWp)tPJ>&k(}hJ>~JO-lmg3M53%~gOoBu7O69vFfui$&amFsih7sM2dHj>(A8+7vJ%1dHxwk^rlb zVv&Zus@_xw+8*=nuE}&HhoOc{s^Oq92^uF|fv6S)P+>y=Xo({x&f<#TU`}E+*r{C* z5Hw9J(r8<$N35mM6zsWume?)eI;+99Ic+IHD01%+^QfX9`&IMy92&$igQ$z>#Wk4}qxZdTV9huRi;ZH+m}##S+nOo>+LL7!d|N|_kBl(kLR+Y@t>spleM z0$Vi0Q{U@r?myi9iuM>9kSJ7mH)pt)9(9{W8mpK6?e52p%U(T9kztyY!Sqv6L%aXq}VRyO~kf zm?WUalr&a~14XWU0Rd%l-p5dk7G zEt#MMz?@8#U^Nu&wlS=e!c35x2}&r=0vW`z#3=|2N1<^m)MAL?0ZaxRf-!YZhp5{{ z1vpTcN{`iJtw7i$P-kT2j9xIm-^%F{k67Da0kiG8c;?tcQ3spjz)Kbwk~>xvHQ1>M zT3e_?ds z)eRK@^db-dOG3mV6=A?phe-nD+~MJUTCZMW6|4HHu)EQKF>cL|nBZs!J;)j$74XoA zPzdQ36>8?a9BQF1S=gh}@$_X@IN4Ga%`kdXRrH=V2XiY}vzl=!_rr<6>QoJlf;}it z7F6ZCdCY_L=#~2JeP>CSi#y2K_5+P43g310om{EaYA;9I>Qvpv$@TakJ~n$`j+I-I z@guiir*lEuW~8pqV7KZK_UarMtp@L30{p=~9B3T?NsVCh-5sK>=0x{ls{_TAZOZ!Io}+(5nM%*JBiB=O|MMN2`8 z+cY_+vOHR7Y(gw;($v@nOxiDtMxp`@NK&!EY*DNu)+2fI!O>JD?C!Az&pMY;>r3Yg8uL?YUEj2-}`6xOd60siZ@d zghtOCLhJzBq4W;eAsWt)>34l6yL=WCm zBXd6cN6+WD^Jew_KD+C=dH?aXGf>T`pRdO<_)yMUt{Zq+IDnC1iH60fN(SxGJ1LSS zDjNDUpdM4|9F-5V7dmsugIz3Lj(&}*wEtv&ploz8Jaq#_d_94yG;lP3$*AC zD2q)64ebRmL0M%Pv;h|fB$1a(BXt|V@hS)1-N2w9&5w%{l8%IeQ%ue1o2%8mbj%~j zMkC1tv9jm%WYQcqCLkcQop208a@An>G@Afcg@7Y(0J1PpDQz0axuA62U4|t>(+Jy4 zp@}-$^UOu+(<=@d;Vf?+w3JkYOKzv$TBQKntHN6g9S#TC2I&ct;67wu!XeuLGPnT9 zUKexJrP7`E12q)lv{jW*N?VZ}wuPXg@1`->0O%{nw?LfVNXNV73`x zid8Prwp=dFz8@*xM&)xCC9*4v>}>34-laznS}KC7QDC=Kb9?DzZUlRZW4KDa1X0Si z8@rz{Du{F9sFjl(6=I7}tgPHUUhG}clEb8_Q6z@+z`kmqtoH65X_wWa-mKB|ZfbP) z9yUhdA~FY@NghewDL-RIfC5;H9NP0rHk#7x)%glwI^D-Zzc}uNVKUxZ zKB9mN$#$G``J9WnTIRxs2D`dnzdod($@2B&zSLvF2I?_leUs0#$9G@sn_xFfqM*el zW9(9jPqmc>*B@r?c{x5+Hz-21F8K}{8&ixVp{Puk zSz82UC!^hddD3MWBHUy^N*QO85+VgvVv~dcmL%?ma2}+QTE%YBW<;VgSnN4I7GjtP z49P&OHiRGqbSwr?snW9%tJq+G(cvg8mriFkq!oK`Li$kEY>!7>yrYp-mc%|_nQdId z=>nDxKqmvV@sOvOB*0i0CB+swn|<8s6IE?-#>$R0ZzpI~iI@$cWo)EeYQ$_ypX{kU zpSyg$>^+GQ{-i!%$NGJ%*R^|36yL^jV{QT=0En3Y5hg=KqHWWYto4|fvs1q0&xe&A zq<{27nXhP{?*xnMj@73qtOi zZCg!lOGFe1C0mWDP`7CeM>KJ0rpV9}<36thFDZI^pVKo2jYX34V7816FSe70Vb*<{ z>{5+MI0P(omRIFa5wFp8=dz9AJ3%DM$r`j0OiMtjFaYP+b5KYa0Gi_f5hN*DtDIxD zA6}p!1CX>mab*qZh+v7aKw8280&{>tpg9&9K}d_7R)!(3O(ekq*lIMaX4~B@3)iD} z-%1)%3Q6T7|0YZWCI{HUa2cVX7S_I0eE>9$5ir4r|$&pjLzQqciGAXOB^ zY!Zdwy(wT8vOS>$j&=}f97h$sXpTGUQBX5h7uthi2p~=%*`b>4-ri`V%3HlbZmbPGQb>j_NKBHzlCykL%Kvn zW|#y8QLP{wSqFVsY(w|6=GHoxN3k6*r5kyRv*?(Uz51G+-Xrp$G{3Vfo(}JCKTbZo zyCa249+I7&x<$(x7Md%$yolS7W1$r8BH=uxj*T==Q*13!v8E*}$@-jX6CgQjsVeW) z7=m{1S|^lg#3q0I<-4D~`KglDcvYS*DA{PVg|I;K*viGc{^+}Jit_RA_tR(Uw#?(_ z^V%8RcuX(4CoFfp($dAru>}B48>&kHNlHTrQkfjNw7^)XiR{G&p)tb-7zj$7DpLbB z6dTGe%qm(|C9vA66v(0q3GJ;pzZ5+dPO4%%#v%g*5x{5xZ0B6jo}`Jhot(WM0xU&9 zgVin5#imm1J#k#K`?+1da%w919*LktL}qn>Nvh20QhlFdy1}x!7-)~5HcpDoaB7H3 z1F=;SX+cs*T40`#01zq@Q=H(2bvb@}K8C(UiZGvF@yEZ+Z~y7|`ecz>0lT9pOhb}X zoG?N&Qkaxf1MetM>dr-v=>v7-bM*OL|58PkrF1)7XcXM^5 zk(qb_i8~G;L}H*xY^Ev-JZX=j?Z#ysfY=O?5M;QZ;;0|SqAE8sV^JgbYCgd4=g|e4 zXpavty~jMbtQEO=EM;c}Wa1!P$BRv-swUKKH*t^wbY^9@iYx_kOr-lM8i>Sc0}ae! z$kLgJKIf;GoN9m>q&z%ObbN96AFwV z1GE&^kXJk;A&3zzT9lVt6>A*W@wSuXga#p0m{=f+a|K3{<-(REC8nsGoq`}Hj?wM( znaT5L$H?6jw&akLVpEtc@N^A@%yE`W4#IH_1qg9~K!hrmmIa*}Dcw4KNi;xYX5=-; zxryzBPf9ik3<3lifss<>-3r+d90j5hvCHnUMnXoc_4L$I$ZQ)Ucqa!9N^*Bm>|{?Z zPy%Msq^ZzH=Au!~HSg^)!#(xhRgnP?7@+Op=8`rXBW6iOh@oIl=xtAgh{S4mq^8F< zO3^x07zd3Va!FZ5-$&i!ex&$(bS7wy@y4wEW&{hRpF89xP?g%EkDgzpr_z!1$8)*w z@%pUXBpId69OOb`p{8y_HRD`+)PxKfEldjuZ>XX4!E>JfxaZ1@UdJ0ImH0IWXafvl ztDt=@&cnxjdd+3}{O04|b(0Cp(P!uV{x_Y@cz1*&FC|l_w3e=qxh0io8)1p6N!$)- z3OT~GkF17TX4@?*LKqczKw%O=dmU*DPf|)~C0sQK!7{3CXp5@5Z4nf^bGDcEH6Wto zEZG)%0#*dR2a=XusybCX8)yBX<)#1uR&tNUF>1DF95p|udwz@S8o=`lF5R_4T1g4m zNRXt+eM6e+tR^!sp>KAbd4sdNJtUMMs6&xyGMucQZf_h95eN}O;M3pphmS2d*12!7I1<11%JFXs$27iq3TJ(Ji0vUdNWBv01kp6NkC1=t$?ejhAy|7 zyhB|SP{~8Eususp2TgLu5(}NE%ZGB_HO_u@L^B$y{Z$o?xpbFH)SNatdJ~jcj@z)0 zS<}IZIbwvO#2H6fHzX9h%(!=wFb35T_vxwxxWFV}m0Il8nWfbo6=1~9HkkH?hU}t% zK%kLW;4CsdW3r=U9I}Qu8L?OiM&R^`y_AT&8ye)8V943yu^XTbk`YJPNxfBS1NCmG zPT-D%NHj6Z5C)1l4ZE1!P@;#+j2%iuC|MxhmMS-WU77}w0cc|Y09fXM95*NnxR`fa zI+mHpu(Ol`1knX@EMaQmh?^;8=CWrJbwH6FTT4j|U(zTX>jr=@+Z1!!q?oqA5>-4A zae=xHlCf`s5hZUS0hL)PG?j9w382fSDz`~wTPb&Pu#lFz&NF4KVoN5cKr*4b1Bqsf zSjaO~H4^|g=UAj2*fsin*G{pYxyuSu>j&oi~Ckn7iB$`sJY$sWyUNil=x#!w{M zsJm@3OPv=#sGQD(*4>;(ZD}f#yvvS7^*FvZ*Ws!?UeEc-?Ze&9XxKhEKm4v`b_pAy zE%d37(wH1IA>|o8Z?{Yb6+m57Wfh7D(;i(0G^#>vS81BUq@<-HU<8XARS-#OK|~;n z8A!>ZDD|8wQ9=vS5C!|^Y(}jP!G~434#AERqu2vfQL;VksZ+f$C98S*#pPmO+7{e# zR`yJT;oV8y=-KvI9N{f<`K)Z$SsR@;dX$N{5C*m}n+|%WvJ4~5DCVruuME&|9%EIe z5##x^CK|HfLY=$k`x6fz{Cs|4uAjNTKbbv|EA*<K3T z;bg6<#5vHp1n=`KIXf6jMzLzqjx{WnkbpB8;8GELhBDbhE07 zlbKU7$V>)GWUhO8%mN7{6C{YjS!_eY0|FdUGz07?tBGb9oOnWr5lT35MA%J8?7;_A zu`CqFX0V;74)uCpC{@%7LZ z3PX1+QIabeAlm{GJ&~|UoQMfKgisVpZMOjgaKwm9j%EacIo@!JD1#|M;4Ez)nS=Ja z#>&AM49cC6hSd#Fh-e`xPzlg1JT`bcDLXvM(bgSDRp<`cq=%?cP@jsL<#e>Y?zNBP_zbsj+%l8szrN1ze9OF{A=ky;v?Rj$zGhZWmEgf?eE|5=7Wce zeLedirePDwdpQRJJ{U0>Aud5%?d_TK!^dy8`uf{E=mqL5QcJO(zvso*y&T?6ILfos z?9W&&PkeH~QedsAB)<^?vn<8hRv_5R<&i-dB*; zVP)qSmcM?%$HyW@xQjC*YA7`lrGq?u4)5{|Q?+R!HjHefB~WqHl?WjXFx4b1lw~7z zOGy%C1yDy+TVMg>MlL(MZ*%fUc^9p|y@3^g5ezVT7d_ykp6%%Vyrn$vC8hW zI+)PRJTJ7K4i$E96zBHgQJ63ECwI>>smYbz6a%Rx#L7rQU<^GX$Fe1)tldGw=4?-& zV%Tu%5P%lP1Y#fx!Rnb9b+hkB$Lq^DfAjIH`JSh4u2fc+#^)9{)$VAp0^uP&AK3Fg z5Ei&QrhvUT+8g#Fc}D#L(u|HUk#@3L6GEO7k^>5M2Oq-y8~b{nGcRq|EfwQ5)Tm_J zhbo{zpeh6kWRd}Qn*_nr6CrH@MImc)+nkJKK+`iqOF4FsYGijqW$AAC#OQ$#(~{I} ztIHB*uwymU#13{9w^U5keHmI!V34K8q0Pg)Nix7gV^ht-jK-L7h@walqGC?GMlcL$ z7)iQ=t3e?;$T0%XrkoBSV8;Uyn5ktml=5)eVuK?^9L#_*oyo`axXt6qE_2!yXgC6Z z2m)8VS}3njfY1r0hDHK(+rTL(NlUV=FzWCu1Bn6<0RdY3f`%7nhO*w?Z@c4qdpjT^ zSubpIRi86!jUa?1aY7Z)Xlj5sf;p1VXp$o};W6rkQL$!AvtlEp%7HF$I15nZ?tyI#M>)wo9Q7+nTC)62| zCATfAEU_h!h&UjMdplotPVV1uc7Zf#&rsb?79((hEbQH*DsxIp-R*E_iwR_D-FsJy zn-__~gLBrScJ9-G74CEm(d$on@<%MXqEZQK4z3Gt2`CFeOtV|>R!J$SAi5A_dO(ah z=W}|y-|3(tq#{6$08A-ilu5;CUZ*5SAGNlHnfqRKjRl@Eor>{PA$h2|kmDM{4)tMI zgwY|_+qdWIh0Kxmvuj^eR<(>(_p^+T_j?b7697B`#o%7nYwP;LyC40?%Xgc7z!DMw ztEM1rjfO*jj)RVP03Z`e3Zp=sX%3|b!w?NxhgpuDmBz`5xk0gHd(FlO$lX~>dh2Tk zn$+s*)s(hCg#a`LqXUT(%9!PP(AAPHXyKHANV|nlQXvxnIvh(=buQUzVKJyk+O4Fg zg{lL%4eNMg0GbmJLkSkki~uAI034f`5$b5@sm3FrKsw@pg4)rciM?5u?X>`mL>~lf z0h1)=(9tnG&7fTI~w5Cs(s zV|UBltO<^`Gui3Tp%AMz#}s>?TtJdE2`5pX2K;k*zu)sWJolf`dC=a*Bi&Z(_={J1 zvd)8EMCi7j43zNv!g**G5eHecIfJC<-2Ld+|4Mth9lO(h`P+Wurytx;`qbAeCW$IY zAN~a6q?NYKUD{rJ%JmMtcGv51f-y*+VL@}9T)#aklDLV>4mu?1%}m`ISrTqGReNfKnG{OZEGob} zm0bd@u%w0(ZCf?40^Va)o#LJSvyPA5G63E2K!i&IL`3!c+-8$mP43-JP|mCmEzjw9 z>VYk5-exdwY^QcMIyQUI=`c4w_~}n;)?gTP$hE2$v zIbPJqGqJ-lyQT~YDMfXtYQ)-mN7@o=#>3{hmotqj$Tc6wl*zPvX|v{)V%JGvwYH9R z0e&Rs=+cdt_1mS)t~qfYwSIrBz3fk`&d$A4*W1OH#SWP$50>_0;JfUV{8J1hwrGw0TC!AMS~VL5`c*Tm3@wemg&QJENb<% zOSWOhU@l#DN1!4SJIKM^t;_1IZ#|5Ig^}kBOq3a|;N3JP+k~3Bn<7z^FrdN=v4m?x zg9+A{byFCVL>R%s^3aOd856w?2n;iXc0_tW1Itv0W~=C;QEqAj0qmAE(HlwhB)gtJ z+0F9608R{Hkz)^Hd4T;&ZWM}*8p(;w+R(JXm6{g=7DQK zfOg0ob&#}nCK}VFkaN6m2Wz;^4oW!;&J5|;i@+u^Kp$9+G)_+y?Ie;UojT=~56@gZ zBms$u1nfbfK#SmE4OX7$#7w+3nh*x>}=$l_g>rez|Mu5*pKYCa;>CoWgIreUd zsS`5Gr__usarT&e@s0cQQr_aR+`RkjCzw%ooyop9C+T+HIL1`mZ zkRhCsSR$x}ZLwGhj6FNu2o@*nDDN0iKwG2BORkNQa<{2rdz7Ylb=2~lNg}x|E*I_{ z*p3;tcA7(@CdV_yAX$o2JQ1%v%_A>dEQpwGDQ*HpIXMb@R4N8o>|+#(M8=vn*+62V zheHiRor{;Z5!vLWoj_eOTO-4bM1f=`o05_~xq9A@jQesWN4>K5Cr7<)rWX4&p(75H zuHV0`uUp7c}z=_3Z%MQKkDN+ z+K&~kg|WL?1zYJD6b)wyD za2yi|1O$;SsHU@EnyP^bmh`DkiEes#!9WEp&{lUxL5D<4F-u}#TijZi)dmWd!m;dE zQTxpV6tmdfIw!!XW1xjZSYQOfeeN3cP#|jL*dPtknG|w3t5Mml3Z#pU2H+ZI6GUr= zW4>{)b1p-5_qxL&j++3Do{Q(`g9&!BcO+vW&BMEmAq6l|W|fQ+*&;-GOPny1;}RiA zfJj0FSwI9J5~MM%B6oXxtLA0swOqQBa4fyJ$bli`Kx$!jOe}!0n#!aX z%!BubpLc#cthS%|+IwzS2uCZx;qB48*X!fRvg6wG;!dih^Gtg48jQZw_cB()Y+jQf zla?}QrPU@E<21K-FJrT)9|f!g9FN{+qoHa#XSIox6-F$}umwUJ3B?3}E?WpnP$`Nc zFe%iAkp-z}%az6hA|SBJ>TaKq2-*-N?3t&_28cwu<@1O3^IhXna|l+MRefViZzn=3 zhBS3xZ>j94SmDj!qOlXr-0K5n8)Oenz-H#o;~sYJo|(0>7_(tiruxe+hI3Xs1+4S6+{gOU>tlkgu z4)(VeA1@zk4OQgS_CdctbM3S9d`TbcIjg{EE4gdE-hcbN5Agb0?{^<5*T`}4DWJkr_J0tQKLoEyKhKNLj}MD<9J9TZ3xurr-U?s%ZBytmC6_BP2Q zb7rcHq*0atQi9f*L^+Og`>kJVp50?37Pu1=i$>8RnJI8Oa5I{fI=Dp5Jlm$K@^-`c zJj&kYld7h@QxyT+&0~b_sdq~dNMYEU#&m)hp>kWDma6EZ&;lSx0XhLMR)9@3bC8i7 zfmBHa1cs7MZcvp4bJ?%;{(c>1##y|*1m&bkXBA;Elsi>nZRFO@8hK!agp!UDN(XCU zOhc@SyED3;Q`bfnr3tizlK`^a-JDJ z0!RXpx;^wIQ5?rK$iNtx69hzigup=!+%blzmWTi;6p}$;n)Bgxp3kPs(>h#$FQCXB zj!4V^wJpq~#2k=`bjvF2<*A+98OErBh3!popR*1Np=~*&JFR1oBZ(tz5ELs_t?9m! zDl>4DbfEziwYc|<%Unora*($sjk_8Xds%M*(@t&`vN=uI%Qn(_6%=Fl*?V0aE0CK} z_6lDRF3>%<;)QuB&c_&d@EHk(#GU=u?ax1u^Z(XSzy6plI({~N$Me1Z)8F!FsNF#uG5uIQzb!YGUAN_rDiLI)lwB^M51ABA?RTV zokR$L+-c44XFGy5405!c_j#tMg`{~;zL)|;d#%|w?_R)BRo?b<7aw*{-+2^)Y*R8K z;zSQ^GaAF7iM^4CHHj*F0MyB_E3(So&a}B$t;&%ajY+SlCj1B~o>?g}kNuj|U~msdLW z9uw7&?%&^UTt5^P_W;n13h+7T}?aR%5k^~4N6R*I2i7tl-W#bl{qXr;3x-m!>fQzql~dJ zs=X~{0DuPsSW=9-YrVaGx$V@^0*tZP`=RvHtg^t^7!~72G!TI$vAV_}Br~_2@;F)t zNFOayyS$k?#tqq0MAkrNv`V{E&FM}t+>wQ=cF~YKY&ek`QzVEB=ejd%p4ktaF{-|w z<&cL7jN)WxZh{qsW}2O>EcKGWxH4cL;PCA<+4Bk_u(=XuaBye8tz2|hfBrJ(lFzH3 z@rcyt`3wC0clrIBm=`yRx5`NvLY3)&+EQ?d3|nn$AWJ^qZ7DLcMr*`v1y)zR7)tNs{YyDc{lmjl}oZ?~xKxgYcoE2t!kkMsFA7j1BtA!oEp zkjA+Lc{=YJ=QV2PsCOYtu*MiP1r{{ErDxcOmPMW<76sg$HZeUUjeuC#ZH*|PfmNnz z*-fpj&s5ers%=&^0<2WB`K&=9p+hR+X{2v~U=`c!aA^OY^Xqk*TeHzdwZcg;Z|D)T z)|KT#AdxK0`O11|ZrV{RoW1nL*SvRCp@V^^koTrL%UN^?AelrIyJbP;JUUi6%_#x9 z=vx;`$ljdY?eX)Rr~7aJ?8)^T?bYV{pXtBP|H}HsIj>a6SaFjR zvQcI$zW?y@&E4BOj%e{*?a$+Q@eF)!I=`Sk=EwKn-ddukEhRMj?G8r#2QKv(GjFQAXGp|Rm3yU77!WbHFTY%5xN~rCA1at z*jb+D8aW#YMy+ElbBVfN>82x7AVM>VAh2Y0T`Bws+DuDKnL9q}E!S*O?OrNjs0xKK zvG&d+lW+(kQqp75K_LK9n^>Bd2DOc>5hX(L3{YVUG}v7abtHn(Z4OnH>w-iJf?ct@ zjRPZ5DOMJ$c<+OGJh0ZG@OIS;czU$%Ke!*uoX>6@pHqYNT91$O8P3+c-;H(l4p$tK zTua?pp3`(H)v&c&kOLJc0R*F=fF?u`(1z_vv-a5$z3|w%-{J`AZ|N35jlHv@?6}{ zrbe>6NSL}&IqAMuv)Fs0iwW#*Ko%@M3%`_E5@M_-yJyD|ilsPbY$4k^R1(3knFB~h zMQ@dIm{a}Qgx&bEzhw;ri19JgS}9Q0B2fnYtnIqg9Vc{F0~VyhEm|9F4? zjs5N6t`pDHR>7l!yZAwOox_`w&s#O9MkZ|)T31~h&!Rw-8Qn$M{AA{;>lxl}fPPAf z2W`e*e(ZSoV10YrNZIH8ZU1`V$L(d}&%s{IJRaUnwl;=7NU>{a6mMlJ?cMeu*y?$_ zFU}L;y_iYb5~b7jnhc3DZdgYsY^W((;uD@Uq+3)d1X!fP-K8h8wvkd7;c=*ux=`t< z`>qiKsFRp*N}`fNl7RsUNNuXGbPkBEu(xx>8vMF@}0b@BAsrKXu0gRrB@ z^4h<>=BW>IzIOei_r1MLGtbZK^80^q_vN<_`1zne&H2hCRR){4L9Eg~Z{g}u_s?_h zL03jC=ni!~W;ME>eEl93ODVi{^motuW8BZa>bfq()ph|@1|%R>u6sD@LC@bGU+)pQ zr}UojtkmN+$spvI7>r1^*6tC31BXKFrIf4K&MH9ac5hcX>4+ol?LjQA%RM|IdmtC= zfE@=V4S+ehl@k+#&p1$^8S%`$HOH6^W;4fDLwk2dRlVC$!%kyi4BsnrI4ogJdH~q$ zq9&Exq6|i9Rckkjxclcmj3GXmm_ebN9f?t3K+WvUHIg5fB$W#HN^W_zRSDp*5x$%~ zug=jdl;n4CF?bhM*?qe0e)NiOo@_8WoUe4w9`k5J(6^ye?k_gXP8{UUC1M~Nh|m)x zbrKm#9PwV=;dMp}yTY9N4p{~WifyWL?e#JtRmoNyo|#}#$Rx7a0EmD%8n zlp2OOp@^kitq74EFh~fIU}<=q`zmYNTct?IsPTQBewYL6I;q~pd2|D*i+`*ePB&)%SFB~8%^ch~dCh(QGruvJwN3y}J5ie3jz z6nW4l`BGmL*3bb(@AY_WOTs*&>*TBNJp1a+kDmA7xvN6jN{_Xnn3!C&* zw&(Ua-FS?nB(R-DvS|xRxE)b-Zka&g_MI;mL z(vB*@HiW<`YNJ2_ETV4HtZ~{%kR+$kkR|2_$k0R)N-_x^qIuq$59QuDee{|;(?T?t z3Xw!LJtW3i%X7CWUlx40a{R#T1TtN8GO}~d?#5I>^-*)B^X^AH^#f*Zwi%n4gs3FW zFWs$UW0i9t1_nEe`_VvCO>|~z^3Lym^quREul1i+gj{#tZ|wB|o*&?!J^1j;Z}%Up zZolUN_FeaJ%4{KOJN?>z=H&|JZ1fH2<@AN{njDEnZ&ubxWxCFt{e1hrfAHWv@+$Y8 zmKSp$Q7OXK+BqK|_PI6tQr|5pRTnZfXXBtsF(45_1Wabls(TUyi}yCd#zE}>W>N#U zow6DvdB+pDG3G+nvX)dTcb~hUsS?EC4$v19Bba4G07WmQD;M90D=rrl|t_WjmjyctG(Ypa^ZBtNrYw1%}YGjts3Wj zy~D2P2e5DP!gOOz6RBZqBXEGkq&(<#X$)UmgVU4yt=)Sbntt`n-6O9q_XD5RT8aQ% ziKivqAXN@gveTyWZWI_WtK9)KHH zyc02G6$$sW9D?~!X>H^wFRF2><|w`)hxZ0qEXvbdLkyVCJq z07{`lG*O=!dZaL?>#$pms-WJlF>1e}%Ma$OZ}V6G=J(%v_XTlnsZ41*^RMInV>$oG z*LnF0#sF*FqETu&f(VELZY(z{L(`+MX;V6FqVnkb@at2aIpGH9%wAh1-!3Du(aKtwPpFFpB63KX7ubcB}6rqWHTIV(%U-tR{&!v8k zvC^D^ZFP<{cypnLFv;%O`GIy3gdwh6w9|%+CH4v)K&JGF*CYj9* zRfA#+qKe!mlFi#Xrny_nO{#Kl56tnjkK$t<#yRK*7b|urT_}-8kr1cgs`p`H$Z1T; zmN-z_W6XR@ zw4@7-n3D-AL$+=nXhhD2ihA@r#i#=(11Q-F;7CL`U1+y$!6?`-t(-j$Itk(=!RuLE zD#QuOJ~UNTh%)z4;Jd|lA-!ziawkB?RzqS{P8^8KZ@7eZjYHZe{P=>Oj$%Cz#yMVf zA>;6M-rFC)Jihe1=gCMPEV-G&P*4MsrERFtNsOUDnLADqqHa_u@RR{cQ0R&S7Lx%| zmYK{5x>+Nnr|BZ)4wDSD4v6z8C*pQHM>QB=iB)njCyKpb>$FDB0K8Znq+X>B&e)+9hmA6_9d$o5B2@Ft~i&BseRU> z*hN(~>ig~vIArck@DNt0(Py?Cr25z+&cbZKwpkGwYJuIp+~)rH8-MZBho8?OfA!hl z_kG!a_~H4(um4$Z^T+McU-;2~>$m+|{`Q=|-;yRRgV%IQAPrCz>nIK^jC`Z_TJ15Q zB#8OS5C5cYqO!ulxzxzT232@7I3joeB zaM#=phNlJLbfm{)X`OV@e&Cpkb_d_X;|agrsq2gN>2kk6K@=jC=kanqxaQe6p1alQ zc=RwDQAw4emYL;z>H6uhJ&`n{p5 zyQiQ9LSzIr8?Rht*)SY5P)ySd-jslJCv{pvh%W1l(ZZsLBZ5?Mnqo(o0Fkh1$hvQ0 zD5?p2O0xELT$BmH@9WyrtXveq6_~q)pui zn1bQiY0kNR?C71x0y_Wz9Rq8_B(yOYXcrRX0TLrTKKa0gR4VXC!IJQR;u zBLswlL@*Snxc8JQ2gVql=5|dkCLW?_&5mYWrODdF<`#E5FaV=5BR4P~z=J{n8iV`j z(HlMbZZ+Dlf+Nx-J*=^g*%lGBw@?b!#-h9cZ?# zc#Jp}5VjYH{gfB0>;@%C!_mV+QW&r1xCi6U|9PIioW_~$0a9lnIMdlmB`vhEU%u|sOQ4uD z?3EjfYBoZFHn}-fEz;~~Xfd&j=^BIpZ(nOuH>F|AmbpS}n6^g*+f@2~`T4xM-5)k| z(5>1E0&sjN`S`8#@Zngr@Vsbm*6&Y{f@IFfW*1`?wGb(+I7VJ@(7=X7kA?Qmmz7c= zkN`z8%ya5_Jx7T>2^1it!7z%H_sP)&h*TLRWLOt$t4_Og&F`~%sKpu@NGPmlPqTa- zg;{kbYzKEb>jBMzP0zW`C=aaSgfMIfC&Zh_dGGODy2~vkMrLnNSz^;NS?xh@R*~TH zOjR&Q?6-dWqu*Wso(CWPUb45S5k2~Go{y*N>)ZE_=YDC7VP;dOCS!Oc!d`*H@M32M zs@ON~5}eniSm8bM%j3gAzi%3!>b)WEic_$I*`lVBSJgH+dkXfvGhVOufsi)IO1dL5 zkR~eJrg8%t$-qShNo2qQz(Wr*1(*j7Fo!`MD3U|vxjfPkr(?PrDH%~SA%qjN!0I9~ z0Ea+$za!XPp6+OX=0$hT*-acQOGh-Km!5*AVjFj zHiHyokcBrGIms0D_zOoZ6Cu_p|eqEZE3p)v6lA9f=UOtbSj5?A1(!N|nwRdh>Q`;N>=&ck$ z-|eGdutdFx2=-Ryyw-B^)&^-x!r1+AdmKyq?P}lV*kfo21W;h|7G2|c=2;XAKoGz< zj`96LQ4}&5NZ7g>gJIu=48^(haMvTwBx_He%Q+I+a>j)l+FB_K4@77RrBvErjsm4LV5&l3 zbEs?6Q6iXjL%Mbz-HPrQD?E-AYR95+I=R0BMAY8fnJzk3Tx@EJcdxqoG9^JDKr!0; zoE9#%inC=pJEiEs;Q8U#-_517cHT}E+z7~GDkxcO2}JqS!JO?qQnms<<8#0N&+LEu z$B#Y!`9eQb?+w@4x$duz=l*o&>)zzW{qT16sMvWD5V%*9p1Er5jL@CTsb0r(7K3%q z;jCO|OFpX?BnOxW`z*w{m<;zOR9)}QdM_n%&zRbx6r*HzBNLKY!!c1P6+NVYM4JrR z*+yWJ*^J?Ec3Tz4CM?j0yje*^1Uf_kmkJ@E7|w0i!4`!cq7yj_OwL(U*9}A$S{?RR z*5z)M7Z~m^VkcJZSXBWiZDiZd#T=hUntpb?f6yun*Fvhg(Fpgu(qx;$wuV3nGjYD|K`wfl^6+727UTUA#=p!xpt$94Y ze6)O-mufFBA4V_2HFFd5RgCwJ^V_)=C4?k-(KxW$Nt0+B4guC%SqK#NV%FGbWu!+I zbf}qn&0g*j1$uz}a&8PTtW<#ZU>uWTq$MWD!Kt@a389dRVkgpT!iM7_#_;TH7$6A+ zo*04Md<%i2y7HmP;XSf#OggDaLLk^HAA#(Mzcv7^;k$1aly5DlQ<< zzS&M*Mgc+Az@Pvzy+J@3@< zs2|_LC1phv0XhdI*~sH)ToqSliL>o-jB)I_^2vQqV@$(gr=Hhutk3t)XSub^!%sg= z_sf>-=RDpVSe)N;Kfm6dHNX3vKxm8Y@bA+55ApnSk6-rs7|paHvQe4=R8@;(nuHpL zYC}K!u61B(xpF}@pV9WNuBfCQy)S;wbI!JlDs#Ly(jpI&e$BytHNW`!!7S5g>fYYrH__mE*&; z>^XJ2=cVyM;ug*&-?3n`Jd`R~OK!KQZB$fa2TKflE0dIn@TeBo?j(Q?pc^cpnIx*? z6{?nT_R>lOWIz;3gab`LkQq)a@FJnUjOYgFq)WpfDo!v*PUws&#zI7p0 z49F&G0Ufh&=hDQksZ4sehD4D{H&iGb64fTsfz+(YA|&`kr|fQKg|wl)+sGI~Eg*-+ zIOTRSH+toQPq!+Tz&vS3JI9G$nx{gt8az!Z3@IO90VTFUMq*NXRV+%?!y;_Z#E z*Ht0x{(eSAk-I~Fh4pSfzEj}v-4n11QFyz@K{X{CS%gQ3oDW>l?k4ZG?(*lp6j$H_X+9K6)I za~$ul^YeaMY)FZ=ZOCdi%aKVOMWV<|wF#erYve$47UsCoVb8Be9=>`yerPiWMU|dA zt^W3x>VD62*3E$rp5OYO4~8O4s1gAEF@FQ^KXT`veCFAUru(geIwn}b0#w>fMS&_D zPxXt>s0l{W60q(K3_s`FS3kL_>jo6H3#e`e(r%lF@6)8mIZyVL9d*bye*Iv2QCH#n z`gI_?ivrKm!E-SOz!LHJ@{hiQcDolI0Fkm8hfrwm!*KrEmF8q|>TbV|Z6s~!hUef0 z0FQ5Ep%T5kMzp1~UT-;}VdNoi2sm8IU(!9BrN#vfKJu&Nt-di|EY60iDaKmD} z_{%%h!T^jorKIQ-6%*garLo7z6r-@2w1knZ)qQ`R-(Rf~NDj+UxNeQ9k?VSMq5(gb&yBllj^M~;Mn|d9aGtoLvUzz*)JhWH+f$X!P1@$_(j(T(k zXk57OgORTMMtEH>(`JGRsyAo>000PLs5r=p$^Ze5FhL;bZdNt(KD{mj7tB4)qIaBC zXvf5uLZGmXph3-0mv)`S?Tp8eHYdfzOj_v2%&d_^<2Z+X-@Us@ECJDND->XvjJYRZ z+jf@PxrQf2Mn?G<)SFaH+FDlRpl%ldBg^680;+oF*}Yzx+r59i=KY2NVmzB@pp9dh z<0+pdHCLz>OKBl=paoc>Zki)(XX%wxw^@6wmWvAD71Y4{NY2|*Z^(i9_UoF(W((BR z#G`D!S=R@1|JHeR(jjzfH%OO|Rxfg#Y^Zn5$NfJ40MFm&2kXt$Io)+PRH4S~{Jj1! zSN6W)F<-UTt$s*7ZJn;?Aw@$tO#qo@CWOJ3h=I2WXbeB5oTqD0Ohgt9&MGw^TI?OC z6zq`6HaJT6V7%^4yK{+2Aj}Hxj8dd)j2r-v8bD!mL@=n=P3^s!B^i|5Awlg05e~XH zYTVzOVE1NevyT&(JaPN9RM)&+%;D}DW9$)}gH~Uj$633E7&%PP&aN}Of1gj=s~h5d zynhR~rOi+kIx6NGMepfm-zVlgnfqdTzr;b;tzehf=Kl|b-(dgl5oqG0%c0&XKdDMPIu?A3WKeRM4Z@+%4kR}1TBal zumyyuXxv2+Ef?;E+#noxQ<<5=9+2n+;RuTwSmj>0`!KV?N(AdzwE705#r`Zm;kxs|X1W*AK z8;dHeqtQkKNyo^BKpim#PS2)nLYuX@Ut=wJQeE25H!c$6P@eBKj|pkBpUS>T+=eEu zfw;ZARMDXQ^3s2Me0<;Am$6>Qu$A6>yC1*ucgHu6Wxuf-59=W4Hp7X1=1tYS^>nS1 zz1|h5&1?k7L_-#{Cs`8ciBV`vHBr=dnlwUMbS})1**&}^@E+#9>L)WMV#sE<6++s) z7dT0rIUSAE=z^Vb6v1LV!I-tPdxOKEBH3ks-ntJdYnV&`3V{p*GxRjbiK&o)1j499 zc{d~$IBjlK5imB4vhL29CzBRC57blb-o+^M7LsDbgodoKB?LS`eXm~Lb-y?<)kxjh zp{jQ8Vw4byT(Ca^ew|rjh1iph>WA_8OvcNa1NTb#CZ-0kYEX;9=;_X7T)gqq7e}yO zaV2u*-UBWly}KHj&(U&y z&+e-z7Jvmx06Jwt8?a5GGvs6`t4ad9A>PU8h;Adu+X6O-5IuS>7^g?TmbfAsC^3-X z%i7d2dN>|8K>pgvo_C0|ajU8U8_lT6KBLd9aT&d-un4HBnb}9* z8$TzMR!IB8gH}lZ=YXVePA3nOmpPAO87C4k+`x(tT9gLm##Vs?sqWW0{5aSmRPLNp zxjtvY*u+j@8z~K{HizarvpuW=qP9x1%jiv=4&_E`FZ7r-w3DOCI&IRd*oq_~pQUb$p4p9XFX7;YglWkzP9*F z58wQe^`+zWUif-lKeyJk=l82e9nSuiDmsM2}-i;6hywEcxy5di1XKmg?KBFe@XKw=k^4>|$JWJ@$dovLfE@ zs(kNA$$pFTD3L6-s3uTSl6B?vt%@`>2N@ucnK3dB667`~*#X2SvP2+<(ZDbP#3C{^ zYO%nO&N^x!Co+Jc;RHe6EtBj;gbV5oibD;`sw1uMUa@rdN`!grpS|bEoWxZ(cE@pd zYY%(4`xxL!pqRW${b(LvtfMZTOuxLxY>XN4SnY-6i+hZvWX?gCH~Wbd*?~7`P`Bo0UxTNTAFdbgFFbO13BA~fJ+$m_9rKD%F@7*F$I6(l4F)QLn!K(Z}i z6u8K{+d6!A16XVV1qd2rUEU2k3`3DIkb&jo${_dN5+qKrp}BPZ_0w#xw|{v11M(MG z2&{L*G47d+STi9*UAo%yb2rd_G|F+59`=JZ_UiUn-oC}#ovkiPEh;LYF#}bf&x|KI z&+ZtJu3y&jYi)IJ_*m`iGh^Wao}qhD*pIKx=k@pZd68^;7*Jo&-J~D5f6V@|&KGaZ z0%<4n`1$&0f9@|_id=NhS9?5Vr0oK!g=q@f=ltZ~c>AHL-R3;*p2LefY&dfr?my-_ z?tNonhRFyFZfj22kGiA9ITW(J%Uaetrf5J>jjvz({Pyh0>AkU!5l7gt>7=aN*N;cG zRU%So+US-B0efK+k}Wuf78~Um$q;F2AiJq5O=K8I9+(oupvqlnVCL)LZf3R{Y3i;# z?mIo#v8pUtXEiuVS(g%~21ps@D+P|NZ zOL?4C72cK>JL^lONAse+8Qfx|ik^{Jm`J=41VJVUK^ehk<%Eg^<8CZ@6i6aah*NW8ZGdUblEr-+TV!@7umiq-&o5p-e&pr5_or95 zZn^rA3A}x~Va&{sLcQHLS#Ry@%g2XL_I{ezvOP(Rlrai1kVc`MP#_s(Xfb=D*wOAr zS@-CDp)Oy2^~D40(}((eWgM+nNtsk|2LN@XmwT%j8t8OVfuepiQO}7A2?s#qHc1di zG~Br7o5%Rs6?T+_2&E?Xf=2SdG(2q-Tgs_qOe0`|+lds@lPMS?wkz=HUP=iJhnX@3 zY!i@10oq_IfzUw%k`+qF&U1HM-x|DY?Nwb4eD9Czc<*oF(gpX33|C`l0LYxW&oS~{ z%#V6~lVzpDvD>ln{E5B>AR@I}z$;6Zm`I35SwS}uY0Q9N?*aCtHN%)6-X0Dti>K|C zV^-dZETF}{GLOZXH>vsf2Wls;@8dXF+}XHm)-F$RL)5@Urw}utgvbu$zykmbdyyDa z`HrO!69v)(A_N+qj+@Gyu1^2+lZiTeZZ z@uydD%{A-b$@x~kziaO&=x^~KzV`6q(doF!KkNPm&yVjsw0J$| ztYfrbAzH3(AK^xY@^p)S_*F0hP)M_R{M1ADP-S@EO{Zwopvq=u748>vo|GlJ7p1e9 zgJel+Uf#J`x?4U9+p_=u4*$sH@x}YOvfyDhn)-U@aQ|tHm33a6-!KB|Rw)bB%)yP? z>qwhpfB6_oMr&p~fod&l3i@QPC32`WRAYRuPS0+eVoXP9LTrnheE7&de3+T6SUZ&S z%Qf3BdqU}P`EBQrlj&(i+h~)^JEO#&DAMd$BCt24=<&HcF=puOET12xhC`5@PY&$9O;d3nQ<)lj;K_&t`pn3FVLMX-5M`UQvnQD-s7G;|#l5AH zhk#h{s8j<7lPpe1N_gq_me!~SbF5X)*Z6X0ou#VvILkYI>(eju{PE+@T)z3#`u>CC z%bMDRAA0xtdv}kLNA27g-Gv_BaJ^lt2NHynK9Cp#%AIsXDr!wf>szxdE{dGaDy(f%8LjMYpjFhEk0x2?*_}06W3n|(v`Ue-_u@?7 z_*R~N{$`X6WJckK-}y5_c(${ zRMC3@73p*8eb%uy7c2A`v238mN6O#Jmpk`+&hG4{0fde)!7)MwoFXJS?hr@>OzaMl zkEJDY6j0DX2fdNVVjSOhk7ora#2DhB5J%=wq3HeHJv|{P)+_=_a|uoYGYG&Cv01v_ z={C+`U3ghkA~2IBuw>pY1oTZ^-i{UA*S6;8G52`c-D{<4_wk~d6RQjyiwCSwgQ2Q- z?uoeRTbb1_S4g+;VLUR%WuF^0cQdy)dl(hOX+U$#3psdb)H{tD<=&l7E4R0+dj#bA zoIk{mFYc$M78wLzM^EJ+?4M2EADr{MAN`Ky2hE>&oww`XjAwmQeMHX5sKz|+*mq5$ zfv}{Jv6<-DC7rTzV^wy2{^lH_=v~e(dQH$0z?m-Q(+h_EYaZ_wj|Eiy35bemwboP?ZhB`N6yZph`T0 zc3HX?evrG^vT{D1FV0bP`(_TNWFi3Gmy#MO-3Y!7j8v(%cc_&N$_TS`iM(sU?}h6iMWhjrSexrY+Y+sCQ_?D-yFJ4S)R z_C3wzUB@F55ts^vZO+oQAwX~_0Ti9;ZA4H-%${oqTs7u-A!xqD#*>F8A%^_nq@{ z_21XaljWy#F66wmzBj$xavj&=@re7E;dor|`+o9mRM*LX2_*mx)oiv^QXregfGLH& z_^?i&nF8CR81A9BYjpbY>AAn9pzp1Y36{kFx5ZZ2j3VxsfFf!&4~^uS337KBt50Z=TQj0V7>0k*n!I*uXh z(sEWV&F-J#nDbKYmG`4m3Nh(H+Jt0Qa49O2)ZuWNC18W$skl&wUYDW~Zl{AZitYNo zk0i56bnCeTvlS)!-o3u8=X?5dRY&sHVs@m4cQv|LU~9cH8oIySd`A7w!sDmJJfA8ngnUiTF`8`A~p&U_uy(hD)=hrb<7~nOh*V? zV$onzK>#&X+8OSQk#=WrdEk79E{C6|lHMJp0d^!{=GB)vN7EzD{g>`d1nP!Y=l({! z6EwrhU{ECF3oy; zjQcn4^@*C}(nVh0i_y2x1L|z_a~EIw7&zdpZTGP=TrP5Qdgr2 z*!Pv@$6vqC74J&kbhMUq9b%mhTUBPN1D~(5rQ8tpD zY(BU3#m(~uy3slFUJ%)b{OpTSov%^xF03;8JWWSjNSeZy-t_nP-%gGeY+GcBjH->z zg%d9H(Jmp9>FM5mwWY#Tzx-es22Ne%NdtLF`)WhuW-mNW71Gvhm(@Mp7U|SjZ(KKM^CW}01+PCbLW8u z;plNx0?QL;2MkJQBB!B>%vlEuciz=zWcO5?q|sn=j3C$u^ieQdy!Is{&*oAaWi0|@ z`{Z0f_Q6E8+2y?Rc<|h8kch+(g;4-#08RG$d&c8~)_yhXd-HxD3s5j^_Nu3c303&9 z^FA%U!TRld*u{Kje0Au3aXjbiULIGsJsLOp_=;BVVxT}`f=UuhwnF6~1X;?<>5G^P z+vkNL=+MeqJj`-GX{a|+pS<7y-R0>TNC*HD;TTn#M7-O1*SDXy-hBP8{i{>uNqP!) zsqGXH6kxQs{Tk+zjcxcK?z58AVAnxSCJ3N~ig;o*rJ<;Ru){GEE+|6IEQpkmC3Mox zCBR{fk{bEJA(38ebvj!KU?-2vas-JnEv&4xl|g~b;SN9(m|zG=26AcbsCW0vof_ZX z=s=g+55pJ7?LD{GuWCMU&1&{r=dovLwwMHVh&p6ydcXIM=k`2XmB9`YEP%o6w8H@A zg^OEDx-8H+?iR|4cJK1IY^P3X%e?HnI^+3x-Y)alxaZy1KK1J9i&h+<-R3wY?Ct^7 zxc$5>`yIDore5io~>VTZa@PQq+}?V|4DKG&@%YC}a?X zbqWw|Ai`v%Ap}%rw08i3+<@La?$>)9P!-d*Gtou5#uRa48%p!$_oZZBTDt6sacJCx z$zj{3B^vVz(xF4nSl%v~iwEw;LKuRd03Xs9reS=goN)hiX{wbiDg~ zAEWEjt?da>R2G4$FN;8n4Jn-KIIz8ucjL3KsLq}Rjc)ToZ&fA2gj6~~plLK%61vO{T_up}J8R9N8NF%PU=z!^*P}{covqLV zAFxN%F?=g8n{{L8*XzfN&M*1X$jr=TvqC|loehOCN=^bvrzqmea&ZEuK@3GC z7K+gY;+QRkx z!t=}X>EY~jt!~(r3EXq?IF|acp(3#D6-H@46!4frAOz_S4Tf_SaYi4h)ofBL#LgXRT)gS*u|5H}wn3zl5gM~tIs&zoP zH3uRsNK6B|pC zN}6nC5LGot71WBU8h2}u5qd8QC-QR2xUqPTbXlC101p`K)w@15?>`oIuXH`K_U;`0 zae0uh7jx;v!(QE~xop#gcTeFHdf*?dUfZ8D-*4}>A1}jayO$nRh2l<075x&zxaNO@byGB@{8bmvg|@ z;@<7XsJ1wE@-VGU#@z_ctMl!?-V&plIhv>8VwNS7z$AuIsW2!kC?b}UWnqxQ2ocMj zm>kFI)=@!{8+G8UX5KV{P7`8Ozo|VK)dhQt<3R1fRKO`f)pahN_0Gj(QE@VNAN#_Y z_YNxV)HQQjTE3l`w9D0<=kB8(dP5te?Wk5^NRmV&nok3#I7oShWf$+vtOtrGfv$%L zNtjbXU=o3dvIGd!@-b?D=sDM^F&oV27WxUkzq20~Cb4Ha*5!WNM_%CvBtc};#fvfR zR0-Bl7qc;qRnL1{i%vR0(NKW%Xtb@3*+V~{oNU~w-ZYoR5;s*Rj|VTgncn8Kj<+k} zDE->@i9+8kR89t(H+L14MRqjeY9*Ruk&;L0>JE4j>y#%efT8)<2nr2c8f_UG9sA%*ZG{HmzpoqI5 z7~pm;DrlfKJR%4LYzGZ6(mOyP5xA|%&Qy6ok1y`$4*Uv__vW=83^T?uQbULgGCFApnzp4oK3=u7!22oWr-r}Olb58 z9lHDVZFqb1GftGAUr*b6u4GKe25h=>4JXQE>-ns%<30KOCNEc;l(9+ric=DC8Y~)J zWCBLW;AxE|Ez15_^$@)HaNT9SXTN?omtu^%(<$Yb*Lb<^siP*Z`{K~e`|Bqj_pVua zHnpEFpGq&bu6OS2w%#<4XTG@ouJnTW)_CCI*N~tKy7Gf(s-3v{jD$efJNYMggV7k=#(&zfV|J1V2)yF@d zQ+fhDy}csSR2ak{yR~mV@AYGptWl#KfARxKlRIDMI=xy4QCm$A8MU+$crVYB`wGgg z^J5N`02x2M7;x9w(mm4dsDeN-Gqvx$k0wXs2~=#AjUAsT4=>kVQ33>nSQ<_y0}oM5 zAj%jAwo~)AO6;*fvqJD~0~l97jgQ{3kVXV$VS%p9B%?6-jzi5pxcm0|wzfu}ayF%- zTkc;GKE`f++fhi=K0I;vfwwPn=_aZ&F@%7~ObB>&tPs#F=FrTl{l()8r%5r zcRNP9D5EJ!O_DsR3LT_Y(L2QZtA?I0^7_&J!~ak}e!npKcJgFjn2-@-v`I}KFar=u zS#v?!VCwB&IJbSe`Bm}A1VASxIBW|!;NHdA4iC-FAhF4i1a*h=vp03Y?s}`Q@8ZiY zl$qvq_~t!JHT1j}HE$Snz^I(F$tL7BU#sP~OCn|1W7mTrDfqrSg6b@Jghd_Erp za#aFTkkM13MVwNQnyIZ28)8l85Sx*pa!N==vZ@iQy*s*;&JiM|V@bR_hExP*!S)%e zOb_DL*e$ZC2!LQ3n(bJsb{XUvj(F&y0|R?TdI%CgS8n2`HSf#0eBklCy~0be`(6ypVbK{)v9T~w27%y6 z!ZzR{udQPSq!t^f$8b^z=5T?Sl*G7Cj`!vg6GqG>I|WryeCfRZKy^G{&tIO+Ykd$K z)G=zhGFRPF#pv;-jsy2oOKsSRTWO}s>#>{tp}Jqt8C9p}&L{M>!q&pFAXvZ6;luiyFQd7iC5zCIPFxj)OcFX(6C zNBY^4s~3vk8kJZ?r-~>Z=a<;=6X9M!-PsH8SwJO_w6?g$}~QDI;?3fFFhVT4e7=rB=HXSkJZ)$Y}Les%Xwf#nd`76-k5ag3B`i~@New>i%u-M0q@YCr+* zT^_2C$H8tLRmrx5VN%4zq3!5?Pgc>8Q^`hlKB%PxagXX-W)!C$wc78Can0MCxkOAH zbU1tWzE7@~uj5t6ng`yncjo>>O&CAcy7xktpQotyS8iW<{mBp9yEL+$Ly8SbPi)&z zAna3!W^|q=U4Gs5y3R0LCWi=sw15BsI2M-na*aY0Qk*dR_qP|ie@dQ<-`O>&AMifu zy_ntX?Nk~enL$bkY*LY=fyyHLoi*RlIvbDs*&odcL{-?+NSFjuyn5kP-yIo98l||y zm{8#wC^*M@Dz}<_wD-Y|GiX`IHtst1L%g5YrC96b@qBl8*SU`QAlr)*9N(oM8yZ!GO$%r(Bl_bq@&i?y5=Xon zqn7fTg0GxZjY{^*ZR!4ctIF#7UA)Wk0@A~(dshiF1@!dGr=NLsIh`M$#PdjAYYqI^ z#TW^_Mw?!7JT8iVr1}*2y*)H>!o=7h(?kL|RDw$AI7}40NkZbtbyu(V+FtMN{TrA0 z_II!Myt=I*Wgh>`m$$jl5ivCg2u@FP#0JBAH;e@Ub2|bCwxw|IK~>XT)@Wh_KrFZm zYU+^SnqSfFBI{??kL%Z<3p>V)bqzo;k!aENfhJH1A&b>7*nhj1S%Q zdM@lmfq(^x7B$tDPiG;4mJCSRdBGS2N#+sIRNkD7=H170-ah}T3I&@vbM-!$bqt~s zDM2mlnT}>jnNr>}+RUS4;09Eb(29h~C@_aA*#Id8Y8>1gJzo}KaS|PpZ1vF4tV*28 zGjKq4=kfWtf5aN|JzkYIO3ij>c0cuKG;8tX!o!96-KzsD9A2)LZL_k+Sx5J|eXUm? z&(56(n={*0Q%J%xRaw*HZ23SE5)7%bZ_c)PZF)mNQ4wqdKoTgUyul6#3(Cswab5p{ z>&TT^OW||%^8I}NJ$`(eXKVBFiT67(hR7ioMsjLjoO%ZL2YDV99GOrnYvnP%u=GLhTKI=N?p}{S)taWQSqOEu zpgJ1%vTjy3rkBu5{dkQT-{Tq0c*+sq9=JY7`;6w-lO0uz8=@A*K*O?a9hDv4P@ph0 zHc-;!2ZuyEquUAsMbzcqpQxxX-70{Jxn#=~jvNUgZ&HZ+o?rU+(4QGHu^{7<`{cxMm||yGAd* z{(92q+LiCl+h>la?_zYxdk$P*J*=6XirXP3y3u8(qiD%vW|`<|Fa{{1C^vkRWm`fl zlAW?r(aWov;6(Hjx3l`__{e$I-M?S&l1C&!8iN>sKml8cA_!tDIsltl4$rYqr(egM z5h0Es2^^|SkJ^|iPJ0>rn^Ynga*emxI& zHP6q_S>2CU+la-RVf*E``~8*AAJ}4x4iy*{dUW^vaIZxxDJ^MxL^9(9rF{JLUhF+h zMMPTX=`7ob(V|sKwBvU3nz{SgWX$}QzwqKcs|(7Tk-_U+c;8QWX5iX&iFO*r2^h;_LCG}C9dFTYwT#>eQbca3Z* zsRUSiGZULuvoaoya`#B|QGNQbDMc&*A%Q&*o8%5hQ> zhV98JV#evRIBU#$+?l41A9~T5HH?*ei&|Pd2Sun(My6T2ond)<(Ke@16GJ3pvUj%E zN3X7U_dRCO?3|gaUmlU;19dhNN0LYc1c1%;l8+}QLP#WHt5ys|$Yvi2fC|v1tj~zE zc;a)ZAC&i!ue<-b{BUt()tMcS`u3UgYCTVkbICckPhCwIqpje5u8wNVt>sOV)iMg0 z2?({jOFgoGc!lc=c?nJj0!g8pyuZ(9x6b(TsGdJ|oDanb-LUQ_o>M*1kDto^f%M`r z=jPn#-5e@<=REGzu{UrJ)(7rqivh6FNF9S3yFtZyII2uh_>ptB2UX?8S$9hsshnvC zOfIr1OeWX?MIa%BHXy^KS+9lS4=^uNAI|+oU3&pU^dm@=W;zTfc?g}wfD20m-})ad&K+K;~Q0fl=`XaYD%mj() zfx<*0A<|gpID&4fA_WFO5EL)X%bvIGDA*l&+xhwy@&!Guc0PrBQ?;O;X$%|YPN<@) zYqo=8GuR*y-3@VKy^cd{wJ8Wy)Af*17Dr$qzEy+T9!|#P^vgNCj?W!m^zQ4?qT4F5 zZB)HejFbUk7qa&z13>o9RAEdxS5BOq7>VKBhps-u{p#(glC=uVx5gZF7U5QtZm-vQ zyna0WFh71K&!ZCyLr4HI>wWHeeZIf_9(;Sxsf|`q}XqEW$ldmfqRW;o3jBZ1uvv1!YF5jMKeZKKqP65fj zvP!9&?WPewAMO`<+aBeZn7sSsYE7kW1tNsjRgIQg*{MLejX(^Scp?>ke9|^8`sq)n zxZC5m!_Df&4JhK7zMh30S!LOE7X~wEk+gKK_As8T@xzM;-;AQs7P6^IHn2b>D7qHR za49q}K$2vfRf;!LLxc8MT~K!R1Xp2?sXeY=sXfiAUkJ6?-DrM!f%ENG`SMJ0faLiU-xrxXdim}8 za5HO8KfT``WTv^kvy$M2csAC!CQ+?}#EP?ltNY8B>ci`1@itYIx^@pp@F-$YVg9q* z?e4k$gL*7d3BIfI#ylQA*X`>iosVKr8cog%4|L?rI#)d#Vsu=&X^kA1)PPo#r3@09 zhsa1(%u0Lj9>XANTE`iI3@xA}IZ*%rCms^zrmBt9j+%GP!9u^YebI(rPU?uec?@O- z)dzXp9J@%CJN&$l`nrV$fRp@m|NeOQzWb-s$9S{x1!FWv(Q~wWH8^Tjqh?fh9f>$GWpo>=iE8WBcU3E0Ub?S6}RZ_Y9z}|Kt(wKYa!!I}N z$8h6TWA&Pk+TUaSBOD*~{fKlQa2*+CLLBez`$hq^m0%}uI5(*rKteEB06hWXMN14s zICdw{jxlRLcr?arbot9-5hi5Jw58=d3Hy^*6z$I2qIx-W`$nreG7BPW2}-vbBt8CQ!o13 z>CM~Lv^g%FdE%i4LoI6PKBILq=k4ZAXeGwH;`A=&Gq|46df|R0kPvg~y}t5{C;u`( zUS{rUBJ72%(R=$hOz!r_Z`{{X+(_!p0$J$MrIovZXwtClCYnl)*Wq((rjwDDhOcMs zy?$itRMsdqBAk;X)|->d=jVfWp8f2($9pM7WkgZu^Dz7PP5%1gb#@Dz$Jf4l@%BS$ zB!jTPK~#b%fG8vzAjwc#gO<6Lh-2s8hu1BC~OC34aRNMuq=da zl}LsSDrA`!(_m7}S~Qb!@kSxuydWyI~qRCh)-M(`S?OLEUlE9gjW2Hiw3gNT9R< zIOy1BLLy`!X7_MoTUy?^F~|FAboQp8>$Q<{RI}Hrxo%(T_=|?y2VyCe_8-mbFM{*Z zHQ>h9`aTZd!n-?l>5$e=$ho}S?0$Y+4#4%QN83wl?+Syx&gmSy+@F;uEClaaFN@7r zIjlwzU0-hLtuOA|QSQwc(NfLW z{l*?2x!!9bhjR$mytw!C_Fwco<^C2vYEkSdG57tIUNnZ)Zw0q)(M$V@pLXG|7cbf&wHN6q}M#o_}p| z%x>6ZY)*3R1;gfY^yRlxKx=j*h;esowrUGPk00~;+-1f_g;jEy!cIXWsRh!u2$Q8i zp%@y*${-bQ3v>{0f+$Qfuq@ttdzzYk(uBdHm_(Hxh_Jg*h@?&F_|kj#@eV>?XFL{Q z%(~6Fx>xTkq0^C3nQdUo*KL=@bviH+LlC0Gb8|=l+N6R30Ruvcav(B33CTT9bVV8>11^n$j#J!!cYpZ{ z^V0{od%^O~ms`un@$x;7&dc06vr^RbeXgxlqUMgv_J_|i%1oooF$A`woNRiNW=$>c zeX8(#I3M%nt&x!jJDPApkdkndO@x=3m19p>K4D$&eMGSsb3Wno`d(ih)6ciLDwqYw zH>AhU)(5W=hwpn>J7ARV`So}M*K>P)bdK|NJkz)Uz8_k3OtOZilk%>5`wsNgBaJiO}$@tDuw?)va_b{muXVh`zRwdzNQ=iMLaec*8$31ft{CtcMM zw5aAhwhRj9*o(A;Am7e@&Ev6q$L0tYE5#QDvt&7v16aU8gFzmf}T%Lda`1tk9Uw{AlCC5PL1C6A#uHCe%|7xWm8A8lN856tR+rj45h}zefDDj1lF}Z6 z%~62HqJUQ1lxE8UNzLwidvq?0ImSIL8<7SYomd@=Rjo-4B(&)1;GvEKssoZsYQ z|2$oZ*hGM|ah2^y&ur`*Py-^z6-i_aAkMeaJiVi%F*e~bA~CwDeG?(OHBFqBl$lKZJj#?zr z{c(I;{*AlH^RpUf`+Tb^A;dwk6R?exD(Q_eY%LQ(HmWacKV}V-zRtB{bkF_#<#KOx zaSVk`n2-;0bn9A=w+1Xm`Fc3V>KG;Ux8C=E@^Jlp=dGT%op)8KyOjWFm9PD&N4>D# zzFO}df61yMhu5Gl-A~cw>5l34z6~ z3IK!CG__q|HxW${=Ned7U%FE`lSh9(ZI0P-Ej}D8c?s|p9@X%}Jm=6dw6S%y2Wz+i zaxBdUCzQ@HCeLpeGc>HES)0o8v4AG%^NyXDOpxegj?=D6)A_4wz&I)G%obBD(j(L=9p(-r5oj3Z`T>B+bi3=ss8uI3N?HyQWeZS<1qlt1LkkfEz>pv!lR~PyeY^t+CLniEW$U(3^mwf8K;NOm zf(VZRf-sPg@0?y`5mm};FWR}=Y$POR&WMSs_Kr+V*9zSp%|X9jM?A-2lym`y*yMW@wTk3u_30we`1Jpl$uy9>6gn5&CsJ17vy zfQsh`Vq&&Ld0fSAuL0m_`t$qwC&tH*$zyRTim+9T_rw*U&dBcb%jUz=Qg@+C`{DJW zPrs&j-xUwXX#0-l{`Q%H(M~%UF2`@H20S`Q9bYf3u{S)7umA{4?6B=Mu-hq6aAs%T zbz%kUp~qRTw;A^L=DWk&506EFkkPAuTyE}lzej_HVEYV!mnP3|&ZGZ$ebf2szN~0` zN_Bu;69ge?kb5tTcueb-pV#t4p6D_+)el~0`sQWu(N~@GZ8o&-+`)1BL04L}k3+z| zwc2h52pqc}8aTKwNihHvmYsJ^uER8`WpK5vQ%Y>LINIS?;W?h-hVtl-*HHZkrqGz zod%0Ismun6$U`I10indo%<@PbWP+XDRUw^RR3kRJ(Gh)ZS2G zlx|O?J_40{=P|kW9>k$+`yAfe4Iy(_B!k@tRio8Sbc1yc7SZ?eF^a4%eS`I_aryjs zx_aw}Ca&KW9=<5**7lh-W4aaZx_^KE`t53mItxcN_s81M&~u?I4uCT=+j}9ZFBd*H zd3BHHtmh;9+~Qb2{o=X*sBZiG=^Wbp(s{Re#*?jV&mCCJ9x5JpYZ++N)oR&m!XC!z z8(*KL(%QaII?kXv_6@=L;e0bg)4B6CS8c2A$_MjszgYPCe8KPMr`|0oqntiCJ>EA# zZ$F?r&gVV9?%gWuoNxy^Q~?smLRH#LMYUi7s0v$30JbRLQgCKvNA>mJ{QN0&nAPr= zXV+^;D~y&1_Lr|WVg=HHETO&x=#SFHaY!?nd zl4uhkA_SaZQf;w{G!te*N<-;5a(=1h>nV;AQLaIu0vwh>4UMiHqtin$IqOmu{Y^_ctp|^++^M8)a=&Z8Je!*tHQ(Yq#0v(2)=X)j}d<3_)Pm69EIR zXG*L>pSte8R1@q`DUJ)hS%M)uNh7WISE)}iWn$IXDZV&fK34wk mmnWycb=I5v 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�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 literal 0 HcmV?d00001 diff --git a/public/images/elena_avatar.gif b/public/images/elena_avatar.gif new file mode 100644 index 0000000000000000000000000000000000000000..d61cdeac1490ba15e9e98596a947e7a28f222804 GIT binary patch literal 41175 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 G`~LuIo(`q} literal 0 HcmV?d00001 diff --git a/public/images/elena_avatar.jpg b/public/images/elena_avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7163c0e89280d74da2a5ed4672bb12610dd50420 GIT binary patch literal 2161 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

=NkXy80EkM%2N;4w>z&t1O+z6dce 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�h5C!Q{TGa%%pfu<@MXLaUsv&l; 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%0DA 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 `${window.location.origin}${base_path}${path}`; + console.log('[Auth.js] API URLs will be relative to:', window.location.origin); // <--- ДОБАВЛЕНО + + const JWT_TOKEN_KEY = 'jwtToken'; + + async function handleAuthResponse(response, formType) { + console.log(`[Auth.js handleAuthResponse] Handling response for form: ${formType}. Response status: ${response.status}`); // <--- ДОБАВЛЕНО + const regButton = registerForm ? registerForm.querySelector('button') : null; + const loginButton = loginForm ? loginForm.querySelector('button') : null; + + try { + const data = await response.json(); + console.log(`[Auth.js handleAuthResponse] Parsed data for ${formType}:`, data); // <--- ДОБАВЛЕНО + + if (response.ok && data.success && data.token) { + console.log(`[Auth.js handleAuthResponse] ${formType} successful. Token received.`); // <--- ДОБАВЛЕНО + localStorage.setItem(JWT_TOKEN_KEY, data.token); + + clientState.isLoggedIn = true; + clientState.loggedInUsername = data.username; + clientState.myUserId = data.userId; + console.log('[Auth.js handleAuthResponse] Client state updated:', JSON.parse(JSON.stringify(clientState))); // <--- ДОБАВЛЕНО + + + ui.setAuthMessage(''); + ui.showGameSelectionScreen(data.username); + + console.log('[Auth.js handleAuthResponse] Disconnecting and reconnecting socket with new token.'); // <--- ДОБАВЛЕНО + if (socket.connected) { + socket.disconnect(); + } + socket.auth = { token: data.token }; + socket.connect(); + + } else { + console.warn(`[Auth.js handleAuthResponse] ${formType} failed or token missing. Message: ${data.message}`); // <--- ДОБАВЛЕНО + clientState.isLoggedIn = false; + clientState.loggedInUsername = ''; + clientState.myUserId = null; + localStorage.removeItem(JWT_TOKEN_KEY); + ui.setAuthMessage(data.message || 'Ошибка сервера.', true); + } + } catch (error) { + console.error(`[Auth.js handleAuthResponse] Error processing ${formType} response JSON or other:`, error); // <--- ДОБАВЛЕНО + clientState.isLoggedIn = false; + clientState.loggedInUsername = ''; + clientState.myUserId = null; + localStorage.removeItem(JWT_TOKEN_KEY); + ui.setAuthMessage('Произошла ошибка сети или ответа сервера. Попробуйте снова.', true); + } finally { + console.log(`[Auth.js handleAuthResponse] Re-enabling buttons for ${formType}.`); // <--- ДОБАВЛЕНО + if (regButton) regButton.disabled = false; + if (loginButton) loginButton.disabled = false; + } + } + + + // --- Обработчики событий DOM --- + if (registerForm) { + console.log('[Auth.js] Attaching submit listener to registerForm.'); // <--- ДОБАВЛЕНО + registerForm.addEventListener('submit', async (e) => { + e.preventDefault(); + console.log('[Auth.js] Register form submitted.'); // <--- ДОБАВЛЕНО + + const usernameInput = document.getElementById('register-username'); + const passwordInput = document.getElementById('register-password'); + + if (!usernameInput || !passwordInput) { + console.error('[Auth.js] Register form username or password input not found!'); // <--- ДОБАВЛЕНО + return; + } + + const username = usernameInput.value; + const password = passwordInput.value; + console.log(`[Auth.js] Attempting to register with username: "${username}", password length: ${password.length}`); // <--- ДОБАВЛЕНО + + const regButton = registerForm.querySelector('button'); + const loginButton = loginForm ? loginForm.querySelector('button') : null; + if (regButton) regButton.disabled = true; + if (loginButton) loginButton.disabled = true; // Блокируем обе кнопки на время запроса + + ui.setAuthMessage('Регистрация...'); + const apiUrl = getApiUrl('/auth/register'); + console.log('[Auth.js] Sending register request to:', apiUrl); // <--- ДОБАВЛЕНО + + try { + const response = await fetch(apiUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username, password }), + }); + console.log('[Auth.js] Received response from register request.'); // <--- ДОБАВЛЕНО + await handleAuthResponse(response, 'register'); + if (response.ok && clientState.isLoggedIn && registerForm) { + console.log('[Auth.js] Registration successful, resetting register form.'); // <--- ДОБАВЛЕНО + registerForm.reset(); + } + } catch (error) { + console.error('[Auth.js] Network error during registration fetch:', error); // <--- ДОБАВЛЕНО + ui.setAuthMessage('Ошибка сети при регистрации. Пожалуйста, проверьте ваше подключение.', true); + if (regButton) regButton.disabled = false; + if (loginButton) loginButton.disabled = false; + } + }); + } else { + console.warn('[Auth.js] registerForm element not found, listener not attached.'); // <--- ДОБАВЛЕНО + } + + if (loginForm) { + console.log('[Auth.js] Attaching submit listener to loginForm.'); // <--- ДОБАВЛЕНО + loginForm.addEventListener('submit', async (e) => { + e.preventDefault(); + console.log('[Auth.js] Login form submitted.'); // <--- ДОБАВЛЕНО + + const usernameInput = document.getElementById('login-username'); + const passwordInput = document.getElementById('login-password'); + + if (!usernameInput || !passwordInput) { + console.error('[Auth.js] Login form username or password input not found!'); // <--- ДОБАВЛЕНО + return; + } + + const username = usernameInput.value; + const password = passwordInput.value; + console.log(`[Auth.js] Attempting to login with username: "${username}", password length: ${password.length}`); // <--- ДОБАВЛЕНО + + const loginButton = loginForm.querySelector('button'); + const regButton = registerForm ? registerForm.querySelector('button') : null; + if (loginButton) loginButton.disabled = true; + if (regButton) regButton.disabled = true; + + ui.setAuthMessage('Вход...'); + const apiUrl = getApiUrl('/auth/login'); + console.log('[Auth.js] Sending login request to:', apiUrl); // <--- ДОБАВЛЕНО + + try { + const response = await fetch(apiUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username, password }), + }); + console.log('[Auth.js] Received response from login request.'); // <--- ДОБАВЛЕНО + await handleAuthResponse(response, 'login'); + // Форма логина обычно не сбрасывается или перенаправляется немедленно, + // это делает showGameSelectionScreen + } catch (error) { + console.error('[Auth.js] Network error during login fetch:', error); // <--- ДОБАВЛЕНО + ui.setAuthMessage('Ошибка сети при входе. Пожалуйста, проверьте ваше подключение.', true); + if (loginButton) loginButton.disabled = false; + if (regButton) regButton.disabled = false; + } + }); + } else { + console.warn('[Auth.js] loginForm element not found, listener not attached.'); // <--- ДОБАВЛЕНО + } + + if (logoutButton) { + console.log('[Auth.js] Attaching click listener to logoutButton.'); // <--- ДОБАВЛЕНО + logoutButton.addEventListener('click', () => { + console.log('[Auth.js] Logout button clicked.'); // <--- ДОБАВЛЕНО + logoutButton.disabled = true; + + if (clientState.isLoggedIn && clientState.isInGame && clientState.currentGameId) { + if (clientState.currentGameState && + clientState.currentGameState.gameMode === 'pvp' && + !clientState.currentGameState.isGameOver) { + console.log('[Auth.js] Player is in an active PvP game. Emitting playerSurrender.'); + socket.emit('playerSurrender'); + } + else if (clientState.currentGameState && + clientState.currentGameState.gameMode === 'ai' && + !clientState.currentGameState.isGameOver) { + console.log('[Auth.js] Player is in an active AI game. Emitting leaveAiGame.'); + socket.emit('leaveAiGame'); + } + } + + console.log('[Auth.js] Removing JWT token from localStorage.'); // <--- ДОБАВЛЕНО + localStorage.removeItem(JWT_TOKEN_KEY); + + clientState.isLoggedIn = false; + clientState.loggedInUsername = ''; + clientState.myUserId = null; + console.log('[Auth.js] Client state reset for logout.'); // <--- ДОБАВЛЕНО + + ui.showAuthScreen(); + ui.setAuthMessage("Вы успешно вышли из системы."); + + console.log('[Auth.js] Disconnecting and reconnecting socket after logout.'); // <--- ДОБАВЛЕНО + if (socket.connected) { + socket.disconnect(); + } + socket.auth = { token: null }; + socket.connect(); // Это вызовет 'connect' в main.js, который затем вызовет showAuthScreen + }); + } else { + console.warn('[Auth.js] logoutButton element not found, listener not attached.'); // <--- ДОБАВЛЕНО + } + console.log('[Auth.js] initAuth finished.'); // <--- ДОБАВЛЕНО +} \ No newline at end of file diff --git a/public/js/client_del.js b/public/js/client_del.js new file mode 100644 index 0000000..2b8afef --- /dev/null +++ b/public/js/client_del.js @@ -0,0 +1,583 @@ +// /public/js/client.js + +document.addEventListener('DOMContentLoaded', () => { + const socket = io({ + // Опции Socket.IO, если нужны + // transports: ['websocket'], // Можно попробовать для отладки, если есть проблемы с polling + }); + + // --- Состояние клиента --- + let currentGameState = null; + let myPlayerId = null; // Технический ID слота в игре ('player' или 'opponent') + let myUserId = null; // ID залогиненного пользователя (из БД) + let myCharacterKey = null; + let opponentCharacterKey = null; + let currentGameId = null; + let playerBaseStatsServer = null; + let opponentBaseStatsServer = null; + let playerAbilitiesServer = null; + let opponentAbilitiesServer = null; + let isLoggedIn = false; + let loggedInUsername = ''; + let isInGame = false; + + // --- DOM Элементы --- + const authSection = document.getElementById('auth-section'); + const registerForm = document.getElementById('register-form'); + const loginForm = document.getElementById('login-form'); + const authMessage = document.getElementById('auth-message'); + const statusContainer = document.getElementById('status-container'); + const userInfoDiv = document.getElementById('user-info'); + const loggedInUsernameSpan = document.getElementById('logged-in-username'); + const logoutButton = document.getElementById('logout-button'); + + const gameSetupDiv = document.getElementById('game-setup'); + const createAIGameButton = document.getElementById('create-ai-game'); + const createPvPGameButton = document.getElementById('create-pvp-game'); + const joinPvPGameButton = document.getElementById('join-pvp-game'); // Убедитесь, что ID в HTML 'join-pvp-game' + const findRandomPvPGameButton = document.getElementById('find-random-pvp-game'); + const gameIdInput = document.getElementById('game-id-input'); + const availableGamesDiv = document.getElementById('available-games-list'); + const gameStatusMessage = document.getElementById('game-status-message'); + const pvpCharacterRadios = document.querySelectorAll('input[name="pvp-character"]'); + + const gameWrapper = document.querySelector('.game-wrapper'); + const attackButton = document.getElementById('button-attack'); + const returnToMenuButton = document.getElementById('return-to-menu-button'); + const gameOverScreen = document.getElementById('game-over-screen'); + const abilitiesGrid = document.getElementById('abilities-grid'); + + const turnTimerSpan = document.getElementById('turn-timer'); + const turnTimerContainer = document.getElementById('turn-timer-container'); + + // --- Функции управления UI --- + function showAuthScreen() { + authSection.style.display = 'block'; + userInfoDiv.style.display = 'none'; + gameSetupDiv.style.display = 'none'; + gameWrapper.style.display = 'none'; + hideGameOverModal(); + setAuthMessage("Ожидание подключения к серверу..."); + statusContainer.style.display = 'block'; + isInGame = false; + disableGameControls(); + resetGameVariables(); + if (turnTimerContainer) turnTimerContainer.style.display = 'none'; + if (turnTimerSpan) turnTimerSpan.textContent = '--'; + } + + function showGameSelectionScreen(username) { + authSection.style.display = 'none'; + userInfoDiv.style.display = 'block'; + loggedInUsernameSpan.textContent = username; + gameSetupDiv.style.display = 'block'; + gameWrapper.style.display = 'none'; + hideGameOverModal(); + setGameStatusMessage("Выберите режим игры или присоединитесь к существующей."); + statusContainer.style.display = 'block'; + socket.emit('requestPvPGameList'); + updateAvailableGamesList([]); // Очищаем перед запросом + if (gameIdInput) gameIdInput.value = ''; + const elenaRadio = document.getElementById('char-elena'); + if (elenaRadio) elenaRadio.checked = true; + isInGame = false; + disableGameControls(); + resetGameVariables(); // Сбрасываем игровые переменные при выходе в меню + if (turnTimerContainer) turnTimerContainer.style.display = 'none'; + if (turnTimerSpan) turnTimerSpan.textContent = '--'; + enableSetupButtons(); // Включаем кнопки на экране выбора игры + } + + function showGameScreen() { + hideGameOverModal(); + authSection.style.display = 'none'; + userInfoDiv.style.display = 'block'; // Оставляем инфо о пользователе + gameSetupDiv.style.display = 'none'; + gameWrapper.style.display = 'flex'; + setGameStatusMessage(""); // Очищаем статус, т.к. есть индикатор хода + statusContainer.style.display = 'none'; // Скрываем общий статус контейнер + isInGame = true; + disableGameControls(); // Кнопки включатся, когда будет ход игрока + if (turnTimerContainer) turnTimerContainer.style.display = 'block'; // Показываем таймер + if (turnTimerSpan) turnTimerSpan.textContent = '--'; // Начальное значение + } + + function resetGameVariables() { + currentGameId = null; currentGameState = null; myPlayerId = null; + myCharacterKey = null; opponentCharacterKey = null; + playerBaseStatsServer = null; opponentBaseStatsServer = null; + playerAbilitiesServer = null; opponentAbilitiesServer = null; + window.gameState = null; window.gameData = null; window.myPlayerId = null; + } + + function hideGameOverModal() { + const hiddenClass = window.GAME_CONFIG?.CSS_CLASS_HIDDEN || 'hidden'; + if (gameOverScreen && !gameOverScreen.classList.contains(hiddenClass)) { + gameOverScreen.classList.add(hiddenClass); + if (window.gameUI?.uiElements?.gameOver?.modalContent) { + window.gameUI.uiElements.gameOver.modalContent.style.transform = 'scale(0.8) translateY(30px)'; + window.gameUI.uiElements.gameOver.modalContent.style.opacity = '0'; + } + const opponentPanel = window.gameUI?.uiElements?.opponent?.panel; + if (opponentPanel?.classList.contains('dissolving')) { + opponentPanel.classList.remove('dissolving'); + opponentPanel.style.opacity = '1'; opponentPanel.style.transform = 'scale(1) translateY(0)'; + } + } + } + + function setAuthMessage(message, isError = false) { + if (authMessage) { + authMessage.textContent = message; + authMessage.className = isError ? 'error' : 'success'; + authMessage.style.display = message ? 'block' : 'none'; + } + if (message && gameStatusMessage) gameStatusMessage.style.display = 'none'; + } + + function setGameStatusMessage(message, isError = false) { + if (gameStatusMessage) { + gameStatusMessage.textContent = message; + gameStatusMessage.style.display = message ? 'block' : 'none'; + gameStatusMessage.style.color = isError ? 'var(--damage-color, red)' : 'var(--turn-color, yellow)'; + if (statusContainer) statusContainer.style.display = message ? 'block' : 'none'; + } + if (message && authMessage) authMessage.style.display = 'none'; + } + + function getSelectedCharacterKey() { + let selectedKey = 'elena'; + if (pvpCharacterRadios) { + pvpCharacterRadios.forEach(radio => { if (radio.checked) selectedKey = radio.value; }); + } + return selectedKey; + } + + function enableGameControls(enableAttack = true, enableAbilities = true) { + if (attackButton) attackButton.disabled = !enableAttack; + if (abilitiesGrid) { + const cls = window.GAME_CONFIG?.CSS_CLASS_ABILITY_BUTTON || 'ability-button'; + abilitiesGrid.querySelectorAll(`.${cls}`).forEach(b => { b.disabled = !enableAbilities; }); + } + if (window.gameUI?.uiElements?.controls?.buttonBlock) window.gameUI.uiElements.controls.buttonBlock.disabled = true; + } + function disableGameControls() { enableGameControls(false, false); } + + function disableSetupButtons() { + if(createAIGameButton) createAIGameButton.disabled = true; + if(createPvPGameButton) createPvPGameButton.disabled = true; + if(joinPvPGameButton) joinPvPGameButton.disabled = true; + if(findRandomPvPGameButton) findRandomPvPGameButton.disabled = true; + if(availableGamesDiv) availableGamesDiv.querySelectorAll('button').forEach(btn => btn.disabled = true); + } + function enableSetupButtons() { + if(createAIGameButton) createAIGameButton.disabled = false; + if(createPvPGameButton) createPvPGameButton.disabled = false; + if(joinPvPGameButton) joinPvPGameButton.disabled = false; + if(findRandomPvPGameButton) findRandomPvPGameButton.disabled = false; + // Кнопки в списке игр включаются в updateAvailableGamesList + } + + // --- Инициализация обработчиков событий --- + if (registerForm) registerForm.addEventListener('submit', (e) => { + e.preventDefault(); + const u = document.getElementById('register-username').value; + const p = document.getElementById('register-password').value; + registerForm.querySelector('button').disabled = true; + if(loginForm) loginForm.querySelector('button').disabled = true; + socket.emit('register', { username: u, password: p }); + }); + if (loginForm) loginForm.addEventListener('submit', (e) => { + e.preventDefault(); + const u = document.getElementById('login-username').value; + const p = document.getElementById('login-password').value; + if(registerForm) registerForm.querySelector('button').disabled = true; + loginForm.querySelector('button').disabled = true; + socket.emit('login', { username: u, password: p }); + }); + if (logoutButton) logoutButton.addEventListener('click', () => { + logoutButton.disabled = true; socket.emit('logout'); + isLoggedIn = false; loggedInUsername = ''; myUserId = null; + resetGameVariables(); isInGame = false; disableGameControls(); + showAuthScreen(); setGameStatusMessage("Вы вышли из системы."); + logoutButton.disabled = false; + }); + if (createAIGameButton) createAIGameButton.addEventListener('click', () => { + if (!isLoggedIn) { setGameStatusMessage("Пожалуйста, войдите.", true); return; } + disableSetupButtons(); + socket.emit('createGame', { mode: 'ai', characterKey: 'elena' }); // AI всегда за Елену + setGameStatusMessage("Создание игры против AI..."); + }); + if (createPvPGameButton) createPvPGameButton.addEventListener('click', () => { + if (!isLoggedIn) { setGameStatusMessage("Пожалуйста, войдите.", true); return; } + disableSetupButtons(); + socket.emit('createGame', { mode: 'pvp', characterKey: getSelectedCharacterKey() }); + setGameStatusMessage("Создание PvP игры..."); + }); + if (joinPvPGameButton) joinPvPGameButton.addEventListener('click', () => { // Убедитесь, что ID кнопки 'join-pvp-game' + if (!isLoggedIn) { setGameStatusMessage("Пожалуйста, войдите.", true); return; } + const gameId = gameIdInput.value.trim(); + if (gameId) { + disableSetupButtons(); + socket.emit('joinGame', { gameId: gameId }); + setGameStatusMessage(`Присоединение к игре ${gameId}...`); + } else setGameStatusMessage("Введите ID игры.", true); + }); + if (findRandomPvPGameButton) findRandomPvPGameButton.addEventListener('click', () => { + if (!isLoggedIn) { setGameStatusMessage("Пожалуйста, войдите.", true); return; } + disableSetupButtons(); + socket.emit('findRandomGame', { characterKey: getSelectedCharacterKey() }); + setGameStatusMessage("Поиск случайной PvP игры..."); + }); + if (attackButton) attackButton.addEventListener('click', () => { + if (isLoggedIn && isInGame && currentGameId && currentGameState && !currentGameState.isGameOver) { + socket.emit('playerAction', { actionType: 'attack' }); + } else { /* обработка ошибки/некорректного состояния */ } + }); + function handleAbilityButtonClick(event) { + const abilityId = event.currentTarget.dataset.abilityId; + if (isLoggedIn && isInGame && currentGameId && abilityId && currentGameState && !currentGameState.isGameOver) { + socket.emit('playerAction', { actionType: 'ability', abilityId: abilityId }); + } else { /* обработка ошибки/некорректного состояния */ } + } + if (returnToMenuButton) returnToMenuButton.addEventListener('click', () => { + if (!isLoggedIn) { showAuthScreen(); return; } + returnToMenuButton.disabled = true; + resetGameVariables(); isInGame = false; disableGameControls(); hideGameOverModal(); + showGameSelectionScreen(loggedInUsername); // Возвращаемся на экран выбора + // Кнопка включится при следующем показе модалки + }); + + function initializeAbilityButtons() { + // ... (код без изменений, как был) + if (!abilitiesGrid || !window.gameUI || !window.GAME_CONFIG) { + if (abilitiesGrid) abilitiesGrid.innerHTML = '

Ошибка загрузки способностей.

'; + return; + } + abilitiesGrid.innerHTML = ''; + const config = window.GAME_CONFIG; + const abilitiesToDisplay = playerAbilitiesServer; + const baseStatsForResource = playerBaseStatsServer; + + if (!abilitiesToDisplay || abilitiesToDisplay.length === 0 || !baseStatsForResource) { + abilitiesGrid.innerHTML = '

Нет доступных способностей.

'; + return; + } + const resourceName = baseStatsForResource.resourceName || "Ресурс"; + const abilityButtonClass = config.CSS_CLASS_ABILITY_BUTTON || 'ability-button'; + + abilitiesToDisplay.forEach(ability => { + const button = document.createElement('button'); + button.id = `ability-btn-${ability.id}`; + button.classList.add(abilityButtonClass); + button.dataset.abilityId = ability.id; + let cooldown = ability.cooldown; + let cooldownText = (typeof cooldown === 'number' && cooldown > 0) ? ` (КД: ${cooldown} х.)` : ""; + let title = `${ability.name} (${ability.cost} ${resourceName})${cooldownText} - ${ability.description || 'Нет описания'}`; + button.setAttribute('title', title); + const nameSpan = document.createElement('span'); nameSpan.classList.add('ability-name'); nameSpan.textContent = ability.name; button.appendChild(nameSpan); + const descSpan = document.createElement('span'); descSpan.classList.add('ability-desc'); descSpan.textContent = `(${ability.cost} ${resourceName})`; button.appendChild(descSpan); + const cdDisplay = document.createElement('span'); cdDisplay.classList.add('ability-cooldown-display'); cdDisplay.style.display = 'none'; button.appendChild(cdDisplay); + button.addEventListener('click', handleAbilityButtonClick); + abilitiesGrid.appendChild(button); + }); + const placeholder = abilitiesGrid.querySelector('.placeholder-text'); + if (placeholder) placeholder.remove(); + } + + function updateAvailableGamesList(games) { + if (!availableGamesDiv) return; + availableGamesDiv.innerHTML = '

Доступные PvP игры:

'; + if (games && games.length > 0) { + const ul = document.createElement('ul'); + games.forEach(game => { + if (game && game.id) { + const li = document.createElement('li'); + li.textContent = `ID: ${game.id.substring(0, 8)}... - ${game.status || 'Ожидает игрока'}`; + const joinBtn = document.createElement('button'); + joinBtn.textContent = 'Присоединиться'; + joinBtn.dataset.gameId = game.id; + + // === ИЗМЕНЕНИЕ: Деактивация кнопки "Присоединиться" для своих игр === + if (isLoggedIn && myUserId && game.ownerIdentifier === myUserId) { + joinBtn.disabled = true; + joinBtn.title = "Вы не можете присоединиться к своей же ожидающей игре."; + } else { + joinBtn.disabled = false; + } + // === КОНЕЦ ИЗМЕНЕНИЯ === + + joinBtn.addEventListener('click', (e) => { + if (!isLoggedIn) { setGameStatusMessage("Пожалуйста, войдите.", true); return; } + if (e.target.disabled) return; // Не обрабатывать клик по отключенной кнопке + disableSetupButtons(); + socket.emit('joinGame', { gameId: e.target.dataset.gameId }); + }); + li.appendChild(joinBtn); + ul.appendChild(li); + } + }); + availableGamesDiv.appendChild(ul); + } else { + availableGamesDiv.innerHTML += '

Нет доступных игр. Создайте свою!

'; + } + enableSetupButtons(); // Включаем основные кнопки создания/поиска + } + + + // --- Обработчики событий Socket.IO --- + socket.on('connect', () => { + console.log('[Client] Socket connected:', socket.id); + if (isLoggedIn && myUserId) { // Проверяем и isLoggedIn и myUserId + socket.emit('requestGameState'); // Запрашиваем состояние, если были залогинены + } else { + showAuthScreen(); // Иначе показываем экран логина + } + }); + + socket.on('registerResponse', (data) => { + setAuthMessage(data.message, !data.success); + if (data.success && registerForm) registerForm.reset(); + if(registerForm) registerForm.querySelector('button').disabled = false; + if(loginForm) loginForm.querySelector('button').disabled = false; + }); + + socket.on('loginResponse', (data) => { + setAuthMessage(data.message, !data.success); + if (data.success) { + isLoggedIn = true; + loggedInUsername = data.username; + myUserId = data.userId; // === ИЗМЕНЕНИЕ: Сохраняем ID пользователя === + setAuthMessage(""); + showGameSelectionScreen(data.username); + } else { + isLoggedIn = false; loggedInUsername = ''; myUserId = null; + if(registerForm) registerForm.querySelector('button').disabled = false; + if(loginForm) loginForm.querySelector('button').disabled = false; + } + }); + + socket.on('gameNotFound', (data) => { + console.log('[Client] Game not found/ended:', data?.message); + resetGameVariables(); isInGame = false; disableGameControls(); hideGameOverModal(); + if (turnTimerContainer) turnTimerContainer.style.display = 'none'; + if (turnTimerSpan) turnTimerSpan.textContent = '--'; + + if (isLoggedIn) { + showGameSelectionScreen(loggedInUsername); + setGameStatusMessage(data?.message || "Активная игровая сессия не найдена."); + } else { + showAuthScreen(); + setAuthMessage(data?.message || "Пожалуйста, войдите."); + } + }); + + socket.on('disconnect', (reason) => { + console.log('[Client] Disconnected:', reason); + setGameStatusMessage(`Отключено: ${reason}. Обновите страницу.`, true); + disableGameControls(); + if (turnTimerSpan) turnTimerSpan.textContent = 'Откл.'; + // Не сбрасываем isLoggedIn, чтобы при переподключении можно было восстановить сессию + }); + + socket.on('gameCreated', (data) => { // Сервер присылает это после успешного createGame + console.log('[Client] Game created by this client:', data); + currentGameId = data.gameId; + myPlayerId = data.yourPlayerId; // Сервер должен прислать роль создателя + // Остальные данные (gameState, baseStats) придут с gameStarted или gameState (если это PvP ожидание) + // Если это PvP и игра ожидает, сервер может прислать waitingForOpponent + }); + + + socket.on('gameStarted', (data) => { + if (!isLoggedIn) return; + console.log('[Client] Game started:', data); + // ... (остальной код gameStarted без изменений, как был) + if (window.gameUI?.uiElements?.opponent?.panel) { + const opponentPanel = window.gameUI.uiElements.opponent.panel; + if (opponentPanel.classList.contains('dissolving')) { + opponentPanel.classList.remove('dissolving'); + opponentPanel.style.opacity = '1'; opponentPanel.style.transform = 'scale(1) translateY(0)'; + } + } + currentGameId = data.gameId; myPlayerId = data.yourPlayerId; currentGameState = data.initialGameState; + playerBaseStatsServer = data.playerBaseStats; opponentBaseStatsServer = data.opponentBaseStats; + playerAbilitiesServer = data.playerAbilities; opponentAbilitiesServer = data.opponentAbilities; + myCharacterKey = playerBaseStatsServer?.characterKey; opponentCharacterKey = opponentBaseStatsServer?.characterKey; + + if (data.clientConfig) window.GAME_CONFIG = { ...data.clientConfig }; + else if (!window.GAME_CONFIG) { + window.GAME_CONFIG = { PLAYER_ID: 'player', OPPONENT_ID: 'opponent', CSS_CLASS_HIDDEN: 'hidden' }; + } + window.gameState = currentGameState; + window.gameData = { playerBaseStats: playerBaseStatsServer, opponentBaseStats: opponentBaseStatsServer, playerAbilities: playerAbilitiesServer, opponentAbilities: opponentAbilitiesServer }; + window.myPlayerId = myPlayerId; + + showGameScreen(); initializeAbilityButtons(); + if (window.gameUI?.uiElements?.log?.list) window.gameUI.uiElements.log.list.innerHTML = ''; + if (window.gameUI && typeof window.gameUI.addToLog === 'function' && data.log) { + data.log.forEach(logEntry => window.gameUI.addToLog(logEntry.message, logEntry.type)); + } + requestAnimationFrame(() => { + if (window.gameUI && typeof window.gameUI.updateUI === 'function') { + window.gameUI.updateUI(); + } + }); + hideGameOverModal(); setGameStatusMessage(""); + }); + + // Используется для восстановления состояния уже идущей игры + socket.on('gameState', (data) => { + if (!isLoggedIn) return; + console.log('[Client] Received full gameState (e.g. on reconnect):', data); + // Это событие теперь может дублировать 'gameStarted' для переподключения. + // Убедимся, что логика похожа на gameStarted. + currentGameId = data.gameId; + myPlayerId = data.yourPlayerId; + currentGameState = data.gameState; // Используем gameState вместо initialGameState + playerBaseStatsServer = data.playerBaseStats; + opponentBaseStatsServer = data.opponentBaseStats; + playerAbilitiesServer = data.playerAbilities; + opponentAbilitiesServer = data.opponentAbilities; + myCharacterKey = playerBaseStatsServer?.characterKey; + opponentCharacterKey = opponentBaseStatsServer?.characterKey; + + if (data.clientConfig) window.GAME_CONFIG = { ...data.clientConfig }; + else if (!window.GAME_CONFIG) { + window.GAME_CONFIG = { PLAYER_ID: 'player', OPPONENT_ID: 'opponent', CSS_CLASS_HIDDEN: 'hidden' }; + } + window.gameState = currentGameState; + window.gameData = { playerBaseStats: playerBaseStatsServer, opponentBaseStats: opponentBaseStatsServer, playerAbilities: playerAbilitiesServer, opponentAbilities: opponentAbilitiesServer }; + window.myPlayerId = myPlayerId; + + if (!isInGame) showGameScreen(); // Показываем экран игры, если еще не там + initializeAbilityButtons(); // Переинициализируем кнопки + + // Лог при 'gameState' может быть уже накопленным, добавляем его + if (window.gameUI?.uiElements?.log?.list && data.log) { // Очищаем лог перед добавлением нового при полном обновлении + window.gameUI.uiElements.log.list.innerHTML = ''; + } + if (window.gameUI && typeof window.gameUI.addToLog === 'function' && data.log) { + data.log.forEach(logEntry => window.gameUI.addToLog(logEntry.message, logEntry.type)); + } + + requestAnimationFrame(() => { + if (window.gameUI && typeof window.gameUI.updateUI === 'function') { + window.gameUI.updateUI(); + } + }); + hideGameOverModal(); + // Таймер будет обновлен следующим событием 'turnTimerUpdate' + }); + + + socket.on('gameStateUpdate', (data) => { + if (!isLoggedIn || !isInGame || !currentGameId || !window.GAME_CONFIG) return; + currentGameState = data.gameState; window.gameState = currentGameState; + if (window.gameUI?.updateUI) window.gameUI.updateUI(); + if (window.gameUI?.addToLog && data.log) { + data.log.forEach(log => window.gameUI.addToLog(log.message, log.type)); + } + }); + + socket.on('logUpdate', (data) => { + if (!isLoggedIn || !isInGame || !currentGameId || !window.GAME_CONFIG) return; + if (window.gameUI?.addToLog && data.log) { + data.log.forEach(log => window.gameUI.addToLog(log.message, log.type)); + } + }); + + socket.on('gameOver', (data) => { + // ... (код без изменений, как был) + if (!isLoggedIn || !currentGameId || !window.GAME_CONFIG) { + if (!currentGameId && isLoggedIn) socket.emit('requestGameState'); + else if (!isLoggedIn) showAuthScreen(); + return; + } + const playerWon = data.winnerId === myPlayerId; + currentGameState = data.finalGameState; window.gameState = currentGameState; + if (window.gameUI?.updateUI) window.gameUI.updateUI(); + if (window.gameUI?.addToLog && data.log) { + data.log.forEach(log => window.gameUI.addToLog(log.message, log.type)); + } + if (window.gameUI?.showGameOver) { + const oppKey = window.gameData?.opponentBaseStats?.characterKey; + window.gameUI.showGameOver(playerWon, data.reason, oppKey, data); + } + if (returnToMenuButton) returnToMenuButton.disabled = false; + setGameStatusMessage("Игра окончена. " + (playerWon ? "Вы победили!" : "Вы проиграли.")); + if (window.gameUI?.updateTurnTimerDisplay) { // Обновляем UI таймера + window.gameUI.updateTurnTimerDisplay(null, false, currentGameState?.gameMode); // Передаем null, чтобы показать "Конец" или скрыть + } + }); + + socket.on('waitingForOpponent', () => { + if (!isLoggedIn) return; + setGameStatusMessage("Ожидание присоединения оппонента..."); + disableGameControls(); // Боевые кнопки неактивны + disableSetupButtons(); // Кнопки создания/присоединения тоже, пока ждем + if (createPvPGameButton) createPvPGameButton.disabled = false; // Оставляем активной "Создать PvP" для отмены + if (window.gameUI?.updateTurnTimerDisplay) { + window.gameUI.updateTurnTimerDisplay(null, false, 'pvp'); // Таймер неактивен + } + }); + + socket.on('opponentDisconnected', (data) => { + if (!isLoggedIn || !isInGame || !currentGameId || !window.GAME_CONFIG) return; + const name = data.disconnectedCharacterName || 'Противник'; + if (window.gameUI?.addToLog) window.gameUI.addToLog(`🔌 Противник (${name}) отключился.`, 'system'); + if (currentGameState && !currentGameState.isGameOver) { + setGameStatusMessage(`Противник (${name}) отключился. Ожидание...`, true); + disableGameControls(); + } + }); + + socket.on('gameError', (data) => { + console.error('[Client] Server error:', data.message); + if (isLoggedIn && isInGame && currentGameState && !currentGameState.isGameOver && window.gameUI?.addToLog) { + window.gameUI.addToLog(`❌ Ошибка игры: ${data.message}`, 'system'); + disableGameControls(); setGameStatusMessage(`Ошибка: ${data.message}.`, true); + } else { + setGameStatusMessage(`❌ Ошибка: ${data.message}`, true); + if (isLoggedIn) enableSetupButtons(); // Если на экране выбора игры, включаем кнопки + else { // Если на экране логина + if(registerForm) registerForm.querySelector('button').disabled = false; + if(loginForm) loginForm.querySelector('button').disabled = false; + } + } + }); + + socket.on('availablePvPGamesList', (games) => { + if (!isLoggedIn) return; + updateAvailableGamesList(games); + }); + + socket.on('noPendingGamesFound', (data) => { // Вызывается, когда создается новая игра после поиска + if (!isLoggedIn) return; + setGameStatusMessage(data.message || "Свободных игр не найдено. Создана новая для вас."); + updateAvailableGamesList([]); // Очищаем список + // currentGameId и myPlayerId должны были прийти с gameCreated + isInGame = false; // Еще не в активной фазе боя + disableGameControls(); + disableSetupButtons(); // Мы в ожидающей игре + if (window.gameUI?.updateTurnTimerDisplay) { + window.gameUI.updateTurnTimerDisplay(null, false, 'pvp'); + } + }); + + socket.on('turnTimerUpdate', (data) => { + if (!isInGame || !currentGameState || currentGameState.isGameOver) { + if (window.gameUI?.updateTurnTimerDisplay && !currentGameState?.isGameOver) { // Только если не game over + window.gameUI.updateTurnTimerDisplay(null, false, currentGameState?.gameMode); + } + return; + } + if (window.gameUI && typeof window.gameUI.updateTurnTimerDisplay === 'function') { + // Определяем, является ли текущий ход ходом этого клиента + const isMyActualTurn = myPlayerId && currentGameState.isPlayerTurn === (myPlayerId === GAME_CONFIG.PLAYER_ID); + window.gameUI.updateTurnTimerDisplay(data.remainingTime, isMyActualTurn, currentGameState.gameMode); + } + }); + + showAuthScreen(); // Начальный экран +}); \ No newline at end of file diff --git a/public/js/gameSetup.js b/public/js/gameSetup.js new file mode 100644 index 0000000..13ead6d --- /dev/null +++ b/public/js/gameSetup.js @@ -0,0 +1,256 @@ +// /public/js/gameSetup.js + +// ПРИМЕРНЫЕ РЕАЛИЗАЦИИ ВСПОМОГАТЕЛЬНЫХ ФУНКЦИЙ (лучше передавать из main.js) +/* +function parseJwtPayloadForValidation(token) { + try { + if (typeof token !== 'string') return null; + const base64Url = token.split('.')[1]; + if (!base64Url) return null; + const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); + const jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) { + return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); + }).join('')); + return JSON.parse(jsonPayload); + } catch (e) { + return null; + } +} + +function isTokenValid(token) { + if (!token) { + return false; + } + const decodedToken = parseJwtPayloadForValidation(token); + if (!decodedToken || !decodedToken.exp) { + localStorage.removeItem('jwtToken'); + return false; + } + const currentTimeInSeconds = Math.floor(Date.now() / 1000); + if (decodedToken.exp < currentTimeInSeconds) { + localStorage.removeItem('jwtToken'); + return false; + } + return true; +} +*/ +// Конец примерных реализаций + +export function initGameSetup(dependencies) { + const { socket, clientState, ui, utils } = dependencies; // Предполагаем, что utils.isTokenValid передается + const { + createAIGameButton, createPvPGameButton, joinPvPGameButton, + findRandomPvPGameButton, gameIdInput, availableGamesDiv, pvpCharacterRadios + } = ui.elements; + + // Получаем функцию isTokenValid либо из utils, либо используем локальную, если она определена выше + const checkTokenValidity = utils?.isTokenValid || window.isTokenValidFunction; // window.isTokenValidFunction - если вы определили ее глобально/локально + + if (typeof checkTokenValidity !== 'function') { + console.error("[GameSetup.js] CRITICAL: isTokenValid function is not available. Auth checks will fail."); + // Можно добавить фоллбэк или аварийное поведение + } + + + // --- Вспомогательные функции --- + function getSelectedCharacterKey() { + let selectedKey = 'elena'; // Значение по умолчанию + if (pvpCharacterRadios) { + pvpCharacterRadios.forEach(radio => { + if (radio.checked) { + selectedKey = radio.value; + } + }); + } + return selectedKey; + } + + function updateAvailableGamesList(games) { + if (!availableGamesDiv) return; + availableGamesDiv.innerHTML = '

Доступные PvP игры:

'; + if (games && games.length > 0) { + const ul = document.createElement('ul'); + games.forEach(game => { + if (game && game.id) { + const li = document.createElement('li'); + li.textContent = `ID: ${game.id.substring(0, 8)}... - ${game.status || 'Ожидает игрока'}`; + + const joinBtn = document.createElement('button'); + joinBtn.textContent = 'Присоединиться'; + joinBtn.dataset.gameId = game.id; + + if (clientState.isLoggedIn && clientState.myUserId && game.ownerIdentifier === clientState.myUserId) { + joinBtn.disabled = true; + joinBtn.title = "Вы не можете присоединиться к своей же ожидающей игре."; + } else { + joinBtn.disabled = false; + } + + joinBtn.addEventListener('click', (e) => { + // --- ПРОВЕРКА ТОКЕНА ПЕРЕД ДЕЙСТВИЕМ --- + if (typeof checkTokenValidity === 'function' && (!clientState.isLoggedIn || !checkTokenValidity(localStorage.getItem('jwtToken')))) { + if (typeof ui.redirectToLogin === 'function') { + ui.redirectToLogin('Для присоединения к игре необходимо войти или обновить сессию.'); + } else { + alert('Для присоединения к игре необходимо войти или обновить сессию.'); + window.location.href = '/'; // Фоллбэк + } + return; + } + // --- КОНЕЦ ПРОВЕРКИ ТОКЕНА --- + + if (e.target.disabled) return; + + ui.disableSetupButtons(); + socket.emit('joinGame', { gameId: e.target.dataset.gameId }); + ui.setGameStatusMessage(`Присоединение к игре ${e.target.dataset.gameId.substring(0, 8)}...`); + }); + li.appendChild(joinBtn); + ul.appendChild(li); + } + }); + availableGamesDiv.appendChild(ul); + } else { + availableGamesDiv.innerHTML += '

Нет доступных игр. Создайте свою!

'; + } + ui.enableSetupButtons(); + } + + // --- Обработчики событий DOM --- + if (createAIGameButton) { + createAIGameButton.addEventListener('click', () => { + // --- ПРОВЕРКА ТОКЕНА ПЕРЕД ДЕЙСТВИЕМ --- + if (typeof checkTokenValidity === 'function' && (!clientState.isLoggedIn || !checkTokenValidity(localStorage.getItem('jwtToken')))) { + if (typeof ui.redirectToLogin === 'function') { + ui.redirectToLogin('Для создания игры необходимо войти или обновить сессию.'); + } else { + alert('Для создания игры необходимо войти или обновить сессию.'); + window.location.href = '/'; // Фоллбэк + } + return; + } + // --- КОНЕЦ ПРОВЕРКИ ТОКЕНА --- + + ui.disableSetupButtons(); + socket.emit('createGame', { mode: 'ai', characterKey: 'elena' }); // Персонаж для AI может быть фиксированным + ui.setGameStatusMessage("Создание игры против AI..."); + }); + } + + if (createPvPGameButton) { + createPvPGameButton.addEventListener('click', () => { + // --- ПРОВЕРКА ТОКЕНА ПЕРЕД ДЕЙСТВИЕМ --- + if (typeof checkTokenValidity === 'function' && (!clientState.isLoggedIn || !checkTokenValidity(localStorage.getItem('jwtToken')))) { + if (typeof ui.redirectToLogin === 'function') { + ui.redirectToLogin('Для создания PvP игры необходимо войти или обновить сессию.'); + } else { + alert('Для создания PvP игры необходимо войти или обновить сессию.'); + window.location.href = '/'; // Фоллбэк + } + return; + } + // --- КОНЕЦ ПРОВЕРКИ ТОКЕНА --- + + ui.disableSetupButtons(); + const characterKey = getSelectedCharacterKey(); + socket.emit('createGame', { mode: 'pvp', characterKey: characterKey }); + ui.setGameStatusMessage("Создание PvP игры..."); + }); + } + + if (joinPvPGameButton) { + joinPvPGameButton.addEventListener('click', () => { + // --- ПРОВЕРКА ТОКЕНА ПЕРЕД ДЕЙСТВИЕМ --- + if (typeof checkTokenValidity === 'function' && (!clientState.isLoggedIn || !checkTokenValidity(localStorage.getItem('jwtToken')))) { + if (typeof ui.redirectToLogin === 'function') { + ui.redirectToLogin('Для присоединения к игре необходимо войти или обновить сессию.'); + } else { + alert('Для присоединения к игре необходимо войти или обновить сессию.'); + window.location.href = '/'; // Фоллбэк + } + return; + } + // --- КОНЕЦ ПРОВЕРКИ ТОКЕНА --- + + const gameId = gameIdInput ? gameIdInput.value.trim() : ''; + if (gameId) { + ui.disableSetupButtons(); + socket.emit('joinGame', { gameId: gameId }); + ui.setGameStatusMessage(`Присоединение к игре ${gameId}...`); + } else { + ui.setGameStatusMessage("Введите ID игры, чтобы присоединиться.", true); + } + }); + } + + if (findRandomPvPGameButton) { + findRandomPvPGameButton.addEventListener('click', () => { + // --- ПРОВЕРКА ТОКЕНА ПЕРЕД ДЕЙСТВИЕМ --- + if (typeof checkTokenValidity === 'function' && (!clientState.isLoggedIn || !checkTokenValidity(localStorage.getItem('jwtToken')))) { + if (typeof ui.redirectToLogin === 'function') { + ui.redirectToLogin('Для поиска игры необходимо войти или обновить сессию.'); + } else { + alert('Для поиска игры необходимо войти или обновить сессию.'); + window.location.href = '/'; // Фоллбэк + } + return; + } + // --- КОНЕЦ ПРОВЕРКИ ТОКЕНА --- + + ui.disableSetupButtons(); + const characterKey = getSelectedCharacterKey(); + socket.emit('findRandomGame', { characterKey: characterKey }); + ui.setGameStatusMessage("Поиск случайной PvP игры..."); + }); + } + + // --- Обработчики событий Socket.IO --- + + socket.on('gameCreated', (data) => { + if (!clientState.isLoggedIn) return; + + console.log('[GameSetup] Game created by this client:', data); + clientState.currentGameId = data.gameId; + clientState.myPlayerId = data.yourPlayerId; + ui.updateGlobalWindowVariablesForUI(); + }); + + socket.on('availablePvPGamesList', (games) => { + // Проверяем, залогинен ли пользователь, ПЕРЕД обновлением списка. + // Если пользователь разлогинился, а список пришел, его не нужно показывать на экране логина. + if (!clientState.isLoggedIn) { + if (availableGamesDiv) availableGamesDiv.innerHTML = ''; // Очищаем, если пользователь не залогинен + return; + } + updateAvailableGamesList(games); + }); + + socket.on('noPendingGamesFound', (data) => { + if (!clientState.isLoggedIn) return; + + ui.setGameStatusMessage(data.message || "Свободных игр не найдено. Создана новая для вас. Ожидание оппонента..."); + updateAvailableGamesList([]); + + if (data.gameId) clientState.currentGameId = data.gameId; + if (data.yourPlayerId) clientState.myPlayerId = data.yourPlayerId; + ui.updateGlobalWindowVariablesForUI(); + + clientState.isInGame = false; + ui.disableSetupButtons(); + + if (window.gameUI?.updateTurnTimerDisplay) { + window.gameUI.updateTurnTimerDisplay(null, false, 'pvp'); + } + }); + + socket.on('waitingForOpponent', () => { + if (!clientState.isLoggedIn) return; + + ui.setGameStatusMessage("Ожидание присоединения оппонента..."); + ui.disableSetupButtons(); + + if (window.gameUI?.updateTurnTimerDisplay) { + window.gameUI.updateTurnTimerDisplay(null, false, 'pvp'); + } + }); +} \ No newline at end of file diff --git a/public/js/gameplay.js b/public/js/gameplay.js new file mode 100644 index 0000000..95110dd --- /dev/null +++ b/public/js/gameplay.js @@ -0,0 +1,444 @@ +// /public/js/gameplay.js + +export function initGameplay(dependencies) { + const { socket, clientState, ui } = dependencies; + const { returnToMenuButton } = ui.elements; + + const attackButton = document.getElementById('button-attack'); + const abilitiesGrid = document.getElementById('abilities-grid'); + + // Инициализируем флаг в clientState, если он еще не существует (лучше делать в main.js) + if (typeof clientState.isActionInProgress === 'undefined') { + clientState.isActionInProgress = false; + } + + // --- Вспомогательные функции --- + function enableGameControls(enableAttack = true, enableAbilities = true) { + // console.log(`[GP] enableGameControls called. enableAttack: ${enableAttack}, enableAbilities: ${enableAbilities}, isActionInProgress: ${clientState.isActionInProgress}`); + if (clientState.isActionInProgress) { + if (attackButton) attackButton.disabled = true; + if (abilitiesGrid) { + const config = window.GAME_CONFIG || {}; + const cls = config.CSS_CLASS_ABILITY_BUTTON || 'ability-button'; + abilitiesGrid.querySelectorAll(`.${cls}`).forEach(b => { b.disabled = true; }); + } + // console.log(`[GP] Action in progress, controls remain disabled.`); + if (window.gameUI?.updateUI) requestAnimationFrame(() => window.gameUI.updateUI()); + return; + } + + if (attackButton) attackButton.disabled = !enableAttack; + if (abilitiesGrid) { + const config = window.GAME_CONFIG || {}; + const cls = config.CSS_CLASS_ABILITY_BUTTON || 'ability-button'; + abilitiesGrid.querySelectorAll(`.${cls}`).forEach(b => { b.disabled = !enableAbilities; }); + } + // console.log(`[GP] Controls set. Attack disabled: ${attackButton ? attackButton.disabled : 'N/A'}`); + if (window.gameUI?.updateUI) { + requestAnimationFrame(() => window.gameUI.updateUI()); // Обновляем UI, чтобы 반영 반영反映 изменения в disabled + } + } + + function disableGameControls() { + // console.log(`[GP] disableGameControls called.`); + if (attackButton) attackButton.disabled = true; + if (abilitiesGrid) { + const config = window.GAME_CONFIG || {}; + const cls = config.CSS_CLASS_ABILITY_BUTTON || 'ability-button'; + abilitiesGrid.querySelectorAll(`.${cls}`).forEach(b => { b.disabled = true; }); + } + if (window.gameUI?.updateUI) { + requestAnimationFrame(() => window.gameUI.updateUI()); // Обновляем UI, чтобы 반영 반영反映 изменения в disabled + } + } + + function initializeAbilityButtons() { + if (!abilitiesGrid || !window.gameUI || !window.GAME_CONFIG) { + if (abilitiesGrid) abilitiesGrid.innerHTML = '

Ошибка загрузки способностей.

'; + return; + } + abilitiesGrid.innerHTML = ''; + const config = window.GAME_CONFIG; + const abilitiesToDisplay = clientState.playerAbilitiesServer; + const baseStatsForResource = clientState.playerBaseStatsServer; + + if (!abilitiesToDisplay || abilitiesToDisplay.length === 0 || !baseStatsForResource) { + abilitiesGrid.innerHTML = '

Нет доступных способностей.

'; + return; + } + + const resourceName = baseStatsForResource.resourceName || "Ресурс"; + const abilityButtonClass = config.CSS_CLASS_ABILITY_BUTTON || 'ability-button'; + + abilitiesToDisplay.forEach(ability => { + const button = document.createElement('button'); + button.id = `ability-btn-${ability.id}`; + button.classList.add(abilityButtonClass); + button.dataset.abilityId = ability.id; + let cooldown = ability.cooldown; + let cooldownText = (typeof cooldown === 'number' && cooldown > 0) ? ` (КД: ${cooldown} х.)` : ""; + let title = `${ability.name} (${ability.cost} ${resourceName})${cooldownText} - ${ability.description || 'Нет описания'}`; + button.setAttribute('title', title); + const nameSpan = document.createElement('span'); nameSpan.classList.add('ability-name'); nameSpan.textContent = ability.name; button.appendChild(nameSpan); + const descSpan = document.createElement('span'); descSpan.classList.add('ability-desc'); descSpan.textContent = `(${ability.cost} ${resourceName})`; button.appendChild(descSpan); + const cdDisplay = document.createElement('span'); cdDisplay.classList.add('ability-cooldown-display'); cdDisplay.style.display = 'none'; button.appendChild(cdDisplay); + button.addEventListener('click', handleAbilityButtonClick); + abilitiesGrid.appendChild(button); + }); + const placeholder = abilitiesGrid.querySelector('.placeholder-text'); + if (placeholder) placeholder.remove(); + } + + function handleAbilityButtonClick(event) { + const abilityId = event.currentTarget.dataset.abilityId; + const username = clientState.loggedInUsername || 'N/A'; + console.log(`[CLIENT ${username}] handleAbilityButtonClick. AbilityID: ${abilityId}, isActionInProgress: ${clientState.isActionInProgress}`); + + if (clientState.isLoggedIn && + clientState.isInGame && + clientState.currentGameId && + abilityId && + clientState.currentGameState && + !clientState.currentGameState.isGameOver && + !clientState.isActionInProgress) { // <--- ПРОВЕРКА ФЛАГА + + console.log(`[CLIENT ${username}] Emitting playerAction (ability: ${abilityId}). Setting isActionInProgress = true.`); + clientState.isActionInProgress = true; // <--- УСТАНОВКА ФЛАГА + disableGameControls(); // <--- БЛОКИРОВКА СРАЗУ + socket.emit('playerAction', { actionType: 'ability', abilityId: abilityId }); + } else { + console.warn(`[CLIENT ${username}] Cannot perform ability action. Conditions not met or action in progress. InGame: ${clientState.isInGame}, GameOver: ${clientState.currentGameState?.isGameOver}, ActionInProgress: ${clientState.isActionInProgress}`); + } + } + + // --- Обработчики событий DOM --- + if (attackButton) { + attackButton.addEventListener('click', () => { + const username = clientState.loggedInUsername || 'N/A'; + console.log(`[CLIENT ${username}] Attack button clicked. isActionInProgress: ${clientState.isActionInProgress}`); + + if (clientState.isLoggedIn && + clientState.isInGame && + clientState.currentGameId && + clientState.currentGameState && + !clientState.currentGameState.isGameOver && + !clientState.isActionInProgress) { // <--- ПРОВЕРКА ФЛАГА + + console.log(`[CLIENT ${username}] Emitting playerAction (attack). Setting isActionInProgress = true.`); + clientState.isActionInProgress = true; // <--- УСТАНОВКА ФЛАГА + disableGameControls(); // <--- БЛОКИРОВКА СРАЗУ + socket.emit('playerAction', { actionType: 'attack' }); + } else { + console.warn(`[CLIENT ${username}] Cannot perform attack action. Conditions not met or action in progress. InGame: ${clientState.isInGame}, GameOver: ${clientState.currentGameState?.isGameOver}, ActionInProgress: ${clientState.isActionInProgress}`); + } + }); + } + + if (returnToMenuButton) { + returnToMenuButton.addEventListener('click', () => { + if (!clientState.isLoggedIn) { + ui.showAuthScreen(); + return; + } + returnToMenuButton.disabled = true; // Блокируем сразу, чтобы избежать двойных кликов + clientState.isActionInProgress = false; // Сбрасываем на всякий случай, если покидаем игру + clientState.isInGame = false; + disableGameControls(); + ui.showGameSelectionScreen(clientState.loggedInUsername); + }); + } + + + // --- ОБЩИЙ ОБРАБОТЧИК ДЛЯ ЗАПУСКА/ВОССТАНОВЛЕНИЯ ИГРЫ --- + function handleGameDataReceived(data, eventName = "unknown") { + if (!clientState.isLoggedIn) { + console.warn(`[CLIENT] handleGameDataReceived (${eventName}) called, but client not logged in. Ignoring.`); + return; + } + const username = clientState.loggedInUsername || 'N/A'; + console.log(`[CLIENT ${username}] handleGameDataReceived from event: ${eventName}. GameID: ${data.gameId}, YourPlayerID: ${data.yourPlayerId}, GS.isPlayerTurn: ${data.initialGameState?.isPlayerTurn || data.gameState?.isPlayerTurn}`); + + clientState.isActionInProgress = false; // <--- СБРОС ФЛАГА при получении нового полного состояния + + clientState.currentGameId = data.gameId; + clientState.myPlayerId = data.yourPlayerId; + clientState.currentGameState = data.initialGameState || data.gameState; + clientState.playerBaseStatsServer = data.playerBaseStats; + clientState.opponentBaseStatsServer = data.opponentBaseStats; + clientState.playerAbilitiesServer = data.playerAbilities; + clientState.opponentAbilitiesServer = data.opponentAbilities; + clientState.myCharacterKey = data.playerBaseStats?.characterKey; + clientState.opponentCharacterKey = data.opponentBaseStats?.characterKey; + + if (clientState.currentGameState && !clientState.currentGameState.isGameOver) { + clientState.isInGame = true; + } else if (clientState.currentGameState && clientState.currentGameState.isGameOver) { + clientState.isInGame = false; + } + + if (data.clientConfig) { + window.GAME_CONFIG = { ...window.GAME_CONFIG, ...data.clientConfig }; + } else if (!window.GAME_CONFIG) { + window.GAME_CONFIG = { PLAYER_ID: 'player', OPPONENT_ID: 'opponent', CSS_CLASS_HIDDEN: 'hidden' }; // Базовый конфиг + } + ui.updateGlobalWindowVariablesForUI(); + + const gameWrapperElement = document.querySelector('.game-wrapper'); + if (clientState.isInGame && clientState.currentGameState && !clientState.currentGameState.isGameOver) { + const isGameWrapperVisible = gameWrapperElement && (gameWrapperElement.style.display === 'flex' || getComputedStyle(gameWrapperElement).display === 'flex'); + if (!isGameWrapperVisible) { + ui.showGameScreen(); + } + } + + initializeAbilityButtons(); + + if (window.gameUI?.uiElements?.log?.list) { + window.gameUI.uiElements.log.list.innerHTML = ''; + } + if (window.gameUI?.addToLog && data.log) { + data.log.forEach(logEntry => { + window.gameUI.addToLog(logEntry.message, logEntry.type); + }); + } + + requestAnimationFrame(() => { + if (window.gameUI?.updateUI) { + window.gameUI.updateUI(); + } + if (clientState.isInGame && clientState.currentGameState && !clientState.currentGameState.isGameOver && window.GAME_CONFIG) { + const config = window.GAME_CONFIG; + const isMyActualTurn = clientState.myPlayerId && + ((clientState.currentGameState.isPlayerTurn && clientState.myPlayerId === config.PLAYER_ID) || + (!clientState.currentGameState.isPlayerTurn && clientState.myPlayerId === config.OPPONENT_ID)); + + console.log(`[CLIENT ${username}] handleGameDataReceived - Determining controls. isMyActualTurn: ${isMyActualTurn}`); + if (isMyActualTurn) { + enableGameControls(); + } else { + disableGameControls(); + } + } else if (clientState.currentGameState && clientState.currentGameState.isGameOver) { + console.log(`[CLIENT ${username}] handleGameDataReceived - Game is over, disabling controls.`); + disableGameControls(); + } + }); + + if (clientState.currentGameState && clientState.currentGameState.isGameOver) { + // Обработка gameOver уже есть в своем обработчике + } else if (eventName === 'gameStarted' || eventName === 'gameState (reconnect)') { + console.log(`[CLIENT ${username}] ${eventName} - Clearing game status message because it's a fresh game/state load.`); + ui.setGameStatusMessage(""); + } else { + if (clientState.isInGame) { + // Если это просто gameStateUpdate, и игра активна, убедимся, что нет сообщения об ожидании + const statusMsgElement = document.getElementById('game-status-message'); + const currentStatusText = statusMsgElement ? statusMsgElement.textContent : ""; + if (!currentStatusText.toLowerCase().includes("отключился")) { // Не стираем сообщение об отключении оппонента + ui.setGameStatusMessage(""); + } + } + } + if (clientState.currentGameState && clientState.currentGameState.isGameOver) { + if (window.gameUI?.showGameOver && !document.getElementById('game-over-screen').classList.contains(window.GAME_CONFIG?.CSS_CLASS_HIDDEN || 'hidden')) { + // Экран уже показан + } else if (window.gameUI?.showGameOver) { + let playerWon = false; + if (data.winnerId) { + playerWon = data.winnerId === clientState.myPlayerId; + } else if (clientState.currentGameState.player && clientState.currentGameState.opponent) { + // Дополнительная логика определения победителя, если winnerId нет (маловероятно при корректной работе сервера) + if (clientState.currentGameState.player.currentHp > 0 && clientState.currentGameState.opponent.currentHp <=0) { + playerWon = clientState.myPlayerId === clientState.currentGameState.player.id; + } else if (clientState.currentGameState.opponent.currentHp > 0 && clientState.currentGameState.player.currentHp <=0) { + playerWon = clientState.myPlayerId === clientState.currentGameState.opponent.id; + } + } + window.gameUI.showGameOver(playerWon, data.reason || "Игра завершена", clientState.opponentCharacterKey || data.loserCharacterKey, { finalGameState: clientState.currentGameState, ...data }); + } + if (returnToMenuButton) returnToMenuButton.disabled = false; + } + } + + + // --- Обработчики событий Socket.IO --- + socket.on('gameStarted', (data) => { + handleGameDataReceived(data, 'gameStarted'); + }); + + socket.on('gameState', (data) => { + handleGameDataReceived(data, 'gameState (reconnect)'); + }); + + socket.on('gameStateUpdate', (data) => { + if (!clientState.isLoggedIn || !clientState.isInGame || !clientState.currentGameId || !window.GAME_CONFIG) return; + const username = clientState.loggedInUsername || 'N/A'; + console.log(`[CLIENT ${username}] Event: gameStateUpdate. GS.isPlayerTurn: ${data.gameState?.isPlayerTurn}`); + + clientState.isActionInProgress = false; // <--- СБРОС ФЛАГА + clientState.currentGameState = data.gameState; + ui.updateGlobalWindowVariablesForUI(); + + if (window.gameUI?.updateUI) { + requestAnimationFrame(() => { + window.gameUI.updateUI(); + if (clientState.isInGame && clientState.currentGameState && !clientState.currentGameState.isGameOver && window.GAME_CONFIG) { + const config = window.GAME_CONFIG; + const isMyActualTurn = clientState.myPlayerId && + ((clientState.currentGameState.isPlayerTurn && clientState.myPlayerId === config.PLAYER_ID) || + (!clientState.currentGameState.isPlayerTurn && clientState.myPlayerId === config.OPPONENT_ID)); + + console.log(`[CLIENT ${username}] gameStateUpdate - Determining controls. isMyActualTurn: ${isMyActualTurn}`); + if (isMyActualTurn) { + enableGameControls(); + } else { + disableGameControls(); + } + + const statusMsgElement = document.getElementById('game-status-message'); + const currentStatusText = statusMsgElement ? statusMsgElement.textContent : ""; + if (!currentStatusText.toLowerCase().includes("отключился")) { + ui.setGameStatusMessage(""); + } + + } else if (clientState.currentGameState && clientState.currentGameState.isGameOver) { + console.log(`[CLIENT ${username}] gameStateUpdate - Game is over, disabling controls.`); + disableGameControls(); + } + }); + } + + if (window.gameUI?.addToLog && data.log) { + data.log.forEach(log => window.gameUI.addToLog(log.message, log.type)); + } + }); + + socket.on('logUpdate', (data) => { + if (!clientState.isLoggedIn || !clientState.isInGame || !clientState.currentGameId || !window.GAME_CONFIG) return; + // const username = clientState.loggedInUsername || 'N/A'; + // console.log(`[CLIENT ${username}] Event: logUpdate. Logs:`, data.log); + if (window.gameUI?.addToLog && data.log) { + data.log.forEach(log => window.gameUI.addToLog(log.message, log.type)); + } + }); + + socket.on('gameOver', (data) => { + if (!clientState.isLoggedIn || !clientState.currentGameId || !window.GAME_CONFIG) { + if (!clientState.currentGameId && clientState.isLoggedIn) socket.emit('requestGameState'); + else if (!clientState.isLoggedIn) ui.showAuthScreen(); + return; + } + const username = clientState.loggedInUsername || 'N/A'; + console.log(`[CLIENT ${username}] Event: gameOver. WinnerID: ${data.winnerId}, Reason: ${data.reason}`); + + clientState.isActionInProgress = false; // <--- СБРОС ФЛАГА + const playerWon = data.winnerId === clientState.myPlayerId; + clientState.currentGameState = data.finalGameState; + clientState.isInGame = false; + + ui.updateGlobalWindowVariablesForUI(); + + if (window.gameUI?.updateUI) requestAnimationFrame(() => window.gameUI.updateUI()); + if (window.gameUI?.addToLog && data.log) { + data.log.forEach(log => window.gameUI.addToLog(log.message, log.type)); + } + if (window.gameUI?.showGameOver) { + const oppKey = clientState.opponentCharacterKey || data.loserCharacterKey; + window.gameUI.showGameOver(playerWon, data.reason, oppKey, data); + } + if (returnToMenuButton) returnToMenuButton.disabled = false; + + if (window.gameUI?.updateTurnTimerDisplay) { + window.gameUI.updateTurnTimerDisplay(null, false, clientState.currentGameState?.gameMode); + } + disableGameControls(); + }); + + socket.on('opponentDisconnected', (data) => { + if (!clientState.isLoggedIn || !clientState.isInGame || !clientState.currentGameId || !window.GAME_CONFIG) return; + const username = clientState.loggedInUsername || 'N/A'; + console.log(`[CLIENT ${username}] Event: opponentDisconnected. PlayerID: ${data.disconnectedPlayerId}`); + const name = data.disconnectedCharacterName || clientState.opponentBaseStatsServer?.name || 'Противник'; + + if (clientState.currentGameState && !clientState.currentGameState.isGameOver) { + ui.setGameStatusMessage(`Противник (${name}) отключился. Ожидание...`, true); + disableGameControls(); + } + }); + + socket.on('playerReconnected', (data) => { // Обработчик события, что оппонент переподключился + if (!clientState.isLoggedIn || !clientState.isInGame || !clientState.currentGameId || !window.GAME_CONFIG) return; + const username = clientState.loggedInUsername || 'N/A'; + console.log(`[CLIENT ${username}] Event: playerReconnected. PlayerID: ${data.reconnectedPlayerId}, Name: ${data.reconnectedPlayerName}`); + // const name = data.reconnectedPlayerName || clientState.opponentBaseStatsServer?.name || 'Противник'; + + if (clientState.currentGameState && !clientState.currentGameState.isGameOver) { + // Сообщение о переподключении оппонента обычно приходит через 'logUpdate' + // Но если нужно немедленно убрать статус "Ожидание...", можно сделать здесь: + const statusMsgElement = document.getElementById('game-status-message'); + const currentStatusText = statusMsgElement ? statusMsgElement.textContent : ""; + if (currentStatusText.toLowerCase().includes("отключился")) { + ui.setGameStatusMessage(""); // Очищаем сообщение об ожидании + } + // Логика enable/disableGameControls будет вызвана следующим gameStateUpdate или turnTimerUpdate + } + }); + + + socket.on('turnTimerUpdate', (data) => { + if (!clientState.isInGame || !clientState.currentGameState || !window.GAME_CONFIG) { + if (window.gameUI?.updateTurnTimerDisplay && clientState.currentGameState && !clientState.currentGameState.isGameOver) { + window.gameUI.updateTurnTimerDisplay(null, false, clientState.currentGameState.gameMode); + } + return; + } + + if (clientState.currentGameState.isGameOver) { + if (window.gameUI?.updateTurnTimerDisplay) { + window.gameUI.updateTurnTimerDisplay(null, false, clientState.currentGameState.gameMode); + } + // disableGameControls() уже должен быть вызван в gameOver + return; + } + // const username = clientState.loggedInUsername || 'N/A'; + // console.log(`[CLIENT ${username}] Event: turnTimerUpdate. Remaining: ${data.remainingTime}, isPlayerTurnForTimer: ${data.isPlayerTurn}, isPaused: ${data.isPaused}`); + + + if (window.gameUI && typeof window.gameUI.updateTurnTimerDisplay === 'function') { + const config = window.GAME_CONFIG; + const isMyTurnForTimer = clientState.myPlayerId && clientState.currentGameState && + ((data.isPlayerTurn && clientState.myPlayerId === config.PLAYER_ID) || // Серверное data.isPlayerTurn здесь авторитетно для таймера + (!data.isPlayerTurn && clientState.myPlayerId === config.OPPONENT_ID)); + + window.gameUI.updateTurnTimerDisplay(data.remainingTime, isMyTurnForTimer, clientState.currentGameState.gameMode); + + // Если игра НЕ на паузе (серверной или клиентской из-за дисконнекта оппонента) + if (!data.isPaused) { + // Управление кнопками должно быть на основе isPlayerTurn из gameState, а не из turnTimerUpdate + // gameStateUpdate обработает это. Здесь только если нужно немедленно реагировать на isPlayerTurn из таймера, + // но это может привести к конфликтам с gameState.isPlayerTurn. + // Лучше положиться на gameStateUpdate. + // Однако, если ТАЙМЕР НЕ ПРИОСТАНОВЛЕН и это МОЙ ХОД по таймеру, то кнопки должны быть активны. + // Это может быть полезно, если gameStateUpdate запаздывает. + if (isMyTurnForTimer && !clientState.currentGameState.isGameOver) { // Дополнительная проверка на GameOver + enableGameControls(); + } else if (!isMyTurnForTimer && !clientState.currentGameState.isGameOver){ // Иначе, если не мой ход + disableGameControls(); + } + + const statusMsgElement = document.getElementById('game-status-message'); + const currentStatusText = statusMsgElement ? statusMsgElement.textContent : ""; + if (!currentStatusText.toLowerCase().includes("отключился") && !clientState.currentGameState.isGameOver) { + // console.log(`[CLIENT ${username}] turnTimerUpdate - Clearing game status message as timer is active and not paused.`); + ui.setGameStatusMessage(""); + } + } else { // Если игра на паузе (по данным таймера) + // console.log(`[CLIENT ${username}] turnTimerUpdate - Game is paused, disabling controls.`); + disableGameControls(); // Отключаем управление, если таймер говорит, что игра на паузе + } + } + }); + + // Начальная деактивация (на всякий случай, хотя showAuthScreen/showGameSelectionScreen должны это делать) + disableGameControls(); +} \ No newline at end of file diff --git a/public/js/main.js b/public/js/main.js new file mode 100644 index 0000000..111dc69 --- /dev/null +++ b/public/js/main.js @@ -0,0 +1,482 @@ +// /public/js/main.js + +import { initAuth } from './auth.js'; +import { initGameSetup } from './gameSetup.js'; +import { initGameplay } from './gameplay.js'; +// ui.js загружен глобально и ожидает window.* переменных + +// --- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ДЛЯ РАБОТЫ С JWT (для isTokenValid) --- +function parseJwtPayloadForValidation(token) { + try { + if (typeof token !== 'string') { + return null; + } + const parts = token.split('.'); + if (parts.length !== 3) { + return null; + } + const base64Url = parts[1]; + const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); + const jsonPayload = decodeURIComponent(atob(base64).split('').map(function(c) { + return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); + }).join('')); + return JSON.parse(jsonPayload); + } catch (e) { + console.error("[Main.js parseJwtPayloadForValidation] Error parsing JWT payload:", e, "Token:", token); + return null; + } +} + +function isTokenValid(token) { + if (!token) { + return false; + } + const decodedToken = parseJwtPayloadForValidation(token); + if (!decodedToken || typeof decodedToken.exp !== 'number') { + localStorage.removeItem('jwtToken'); + return false; + } + const currentTimeInSeconds = Math.floor(Date.now() / 1000); + if (decodedToken.exp < currentTimeInSeconds) { + localStorage.removeItem('jwtToken'); + return false; + } + return true; +} +// --- КОНЕЦ ВСПОМОГАТЕЛЬНЫХ ФУНКЦИЙ ДЛЯ JWT --- + + +document.addEventListener('DOMContentLoaded', () => { + console.log('[Main.js] DOMContentLoaded event fired.'); + + const initialToken = localStorage.getItem('jwtToken'); + console.log('[Main.js] Initial token from localStorage:', initialToken ? 'Exists' : 'Not found'); + + let clientState = { + isLoggedIn: false, + loggedInUsername: '', + myUserId: null, + isInGame: false, + currentGameId: null, + currentGameState: null, + myPlayerId: null, // Роль в текущей игре (player/opponent) + myCharacterKey: null, + opponentCharacterKey: null, + playerBaseStatsServer: null, + opponentBaseStatsServer: null, + playerAbilitiesServer: null, + opponentAbilitiesServer: null, + isActionInProgress: false, // <--- ВАЖНО: Флаг для предотвращения двойных действий + }; + + if (initialToken && isTokenValid(initialToken)) { + const decodedToken = parseJwtPayloadForValidation(initialToken); + if (decodedToken && decodedToken.userId && decodedToken.username) { + console.log("[Main.js] Token found and confirmed valid, pre-populating clientState:", decodedToken); + clientState.isLoggedIn = true; + clientState.myUserId = decodedToken.userId; // Это ID пользователя из БД + clientState.loggedInUsername = decodedToken.username; + } else { + console.warn("[Main.js] Token deemed valid by isTokenValid, but payload incomplete. Clearing."); + localStorage.removeItem('jwtToken'); + } + } else if (initialToken) { + console.warn("[Main.js] Initial token was present but invalid/expired. It has been cleared."); + } else { + console.log("[Main.js] No initial token found in localStorage."); + } + + console.log('[Main.js] Initial clientState after token check:', JSON.parse(JSON.stringify(clientState))); + + console.log('[Main.js] Initializing Socket.IO client...'); + const socket = io({ + path:base_path + "/socket.io", // base_path определяется в HTML + autoConnect: false, // Подключаемся вручную после инициализации всего + auth: { token: localStorage.getItem('jwtToken') } + }); + console.log('[Main.js] Socket.IO client initialized.'); + + // --- DOM Элементы --- + console.log('[Main.js] Getting DOM elements...'); + const authSection = document.getElementById('auth-section'); + const loginForm = document.getElementById('login-form'); + const registerForm = document.getElementById('register-form'); + const authMessage = document.getElementById('auth-message'); + const statusContainer = document.getElementById('status-container'); // Общий контейнер для сообщений + const userInfoDiv = document.getElementById('user-info'); + const loggedInUsernameSpan = document.getElementById('logged-in-username'); + const logoutButton = document.getElementById('logout-button'); + const gameSetupDiv = document.getElementById('game-setup'); + const createAIGameButton = document.getElementById('create-ai-game'); + const createPvPGameButton = document.getElementById('create-pvp-game'); + const joinPvPGameButton = document.getElementById('join-pvp-game'); + const findRandomPvPGameButton = document.getElementById('find-random-pvp-game'); + const gameIdInput = document.getElementById('game-id-input'); + const availableGamesDiv = document.getElementById('available-games-list'); + const gameStatusMessage = document.getElementById('game-status-message'); // Сообщение на экране выбора игры + const pvpCharacterRadios = document.querySelectorAll('input[name="pvp-character"]'); + const gameWrapper = document.querySelector('.game-wrapper'); + const returnToMenuButton = document.getElementById('return-to-menu-button'); // Кнопка в gameOver модальном окне + const turnTimerContainer = document.getElementById('turn-timer-container'); + const turnTimerSpan = document.getElementById('turn-timer'); + + // --- Функции обновления UI и состояния --- + function updateGlobalWindowVariablesForUI() { + window.gameState = clientState.currentGameState; + window.gameData = { + playerBaseStats: clientState.playerBaseStatsServer, + opponentBaseStats: clientState.opponentBaseStatsServer, + playerAbilities: clientState.playerAbilitiesServer, + opponentAbilities: clientState.opponentAbilitiesServer + }; + window.myPlayerId = clientState.myPlayerId; // Роль игрока (player/opponent) + } + + function resetGameVariables() { + console.log("[Main.js resetGameVariables] Resetting game variables. State BEFORE:", JSON.parse(JSON.stringify(clientState))); + clientState.currentGameId = null; + clientState.currentGameState = null; + clientState.myPlayerId = null; + clientState.myCharacterKey = null; + clientState.opponentCharacterKey = null; + clientState.playerBaseStatsServer = null; + clientState.opponentBaseStatsServer = null; + clientState.playerAbilitiesServer = null; + clientState.opponentAbilitiesServer = null; + clientState.isActionInProgress = false; // <--- Сброс флага + updateGlobalWindowVariablesForUI(); + console.log("[Main.js resetGameVariables] Game variables reset. State AFTER:", JSON.parse(JSON.stringify(clientState))); + } + + function explicitlyHideGameOverModal() { + if (window.gameUI?.uiElements?.gameOver?.screen && window.GAME_CONFIG) { + const gameOverScreenElement = window.gameUI.uiElements.gameOver.screen; + const modalContentElement = window.gameUI.uiElements.gameOver.modalContent; + const messageElement = window.gameUI.uiElements.gameOver.message; + const hiddenClass = window.GAME_CONFIG.CSS_CLASS_HIDDEN || 'hidden'; + + if (gameOverScreenElement && !gameOverScreenElement.classList.contains(hiddenClass)) { + gameOverScreenElement.classList.add(hiddenClass); + gameOverScreenElement.style.opacity = '0'; + if (modalContentElement) { + modalContentElement.style.transform = 'scale(0.8) translateY(30px)'; + modalContentElement.style.opacity = '0'; + } + } + if (messageElement) messageElement.textContent = ''; + } + } + + function showAuthScreen() { + console.log("[Main.js showAuthScreen] Showing Auth Screen. Resetting game state."); + if(authSection) authSection.style.display = 'block'; + if(userInfoDiv) userInfoDiv.style.display = 'none'; + if(gameSetupDiv) gameSetupDiv.style.display = 'none'; + if(gameWrapper) gameWrapper.style.display = 'none'; + explicitlyHideGameOverModal(); + if(statusContainer) statusContainer.style.display = 'block'; // Показываем общий контейнер для сообщений + clientState.isInGame = false; + resetGameVariables(); // Включает сброс isActionInProgress + if (turnTimerContainer) turnTimerContainer.style.display = 'none'; + if (turnTimerSpan) turnTimerSpan.textContent = '--'; + if(registerForm && registerForm.querySelector('button')) registerForm.querySelector('button').disabled = false; + if(loginForm && loginForm.querySelector('button')) loginForm.querySelector('button').disabled = false; + if(logoutButton) logoutButton.disabled = true; // Кнопка выхода неактивна на экране логина + } + + function showGameSelectionScreen(username) { + console.log(`[Main.js showGameSelectionScreen] Showing Game Selection Screen for ${username}.`); + if(authSection) authSection.style.display = 'none'; + if(userInfoDiv) userInfoDiv.style.display = 'block'; + if(loggedInUsernameSpan) loggedInUsernameSpan.textContent = username; + if(logoutButton) logoutButton.disabled = false; + if(gameSetupDiv) gameSetupDiv.style.display = 'block'; + if(gameWrapper) gameWrapper.style.display = 'none'; + explicitlyHideGameOverModal(); + setGameStatusMessage("Выберите режим игры или присоединитесь к существующей."); + if(statusContainer) statusContainer.style.display = 'block'; + + if (socket.connected) { + console.log("[Main.js showGameSelectionScreen] Socket connected, requesting PvP game list."); + socket.emit('requestPvPGameList'); + } else { + console.warn("[Main.js showGameSelectionScreen] Socket not connected, cannot request PvP game list yet."); + // Можно попробовать подключить сокет, если он не подключен + // socket.connect(); // Или дождаться авто-реконнекта + } + + if (availableGamesDiv) availableGamesDiv.innerHTML = '

Доступные PvP игры:

Загрузка...

'; + if (gameIdInput) gameIdInput.value = ''; + const elenaRadio = document.getElementById('char-elena'); + if (elenaRadio) elenaRadio.checked = true; // Персонаж по умолчанию + clientState.isInGame = false; + clientState.isActionInProgress = false; // <--- Сброс флага при переходе в меню + if (turnTimerContainer) turnTimerContainer.style.display = 'none'; + if (turnTimerSpan) turnTimerSpan.textContent = '--'; + enableSetupButtons(); // Включаем кнопки настройки игры + if (window.gameUI?.uiElements?.gameOver?.returnToMenuButton) { + window.gameUI.uiElements.gameOver.returnToMenuButton.disabled = false; // Убедимся, что кнопка в модалке gameOver активна + } + } + + function showGameScreen() { + console.log("[Main.js showGameScreen] Showing Game Screen."); + if(authSection) authSection.style.display = 'none'; + if(userInfoDiv) userInfoDiv.style.display = 'block'; // userInfo (имя, выход) остается видимым + if(logoutButton) logoutButton.disabled = false; + if(gameSetupDiv) gameSetupDiv.style.display = 'none'; + if(gameWrapper) gameWrapper.style.display = 'flex'; // Используем flex для game-wrapper + setGameStatusMessage(""); // Очищаем сообщение статуса игры при входе на экран игры + if(statusContainer) statusContainer.style.display = 'none'; // Скрываем общий статус-контейнер на игровом экране + clientState.isInGame = true; + // clientState.isActionInProgress остается false до первого действия игрока + updateGlobalWindowVariablesForUI(); + if (turnTimerContainer) turnTimerContainer.style.display = 'block'; + if (turnTimerSpan) turnTimerSpan.textContent = '--'; // Таймер обновится по событию + } + + function setAuthMessage(message, isError = false) { + console.log(`[Main.js setAuthMessage] Message: "${message}", isError: ${isError}`); + if (authMessage) { + authMessage.textContent = message; + authMessage.className = isError ? 'error' : 'success'; + authMessage.style.display = message ? 'block' : 'none'; + } + // Если показываем authMessage, скрываем gameStatusMessage + if (message && gameStatusMessage && gameStatusMessage.style.display !== 'none') { + gameStatusMessage.style.display = 'none'; + } + } + + function setGameStatusMessage(message, isError = false) { + console.log(`[Main.js setGameStatusMessage] Message: "${message}", isError: ${isError}`); + if (gameStatusMessage) { + gameStatusMessage.textContent = message; + gameStatusMessage.style.display = message ? 'block' : 'none'; + gameStatusMessage.style.color = isError ? 'var(--damage-color, red)' : 'var(--turn-color, yellow)'; // или другой цвет для обычных сообщений + // Управляем видимостью общего контейнера статуса + if (statusContainer) statusContainer.style.display = message ? 'block' : 'none'; + } + // Если показываем gameStatusMessage, скрываем authMessage + if (message && authMessage && authMessage.style.display !== 'none') { + authMessage.style.display = 'none'; + } + } + + function disableSetupButtons() { + if(createAIGameButton) createAIGameButton.disabled = true; + if(createPvPGameButton) createPvPGameButton.disabled = true; + if(joinPvPGameButton) joinPvPGameButton.disabled = true; + if(findRandomPvPGameButton) findRandomPvPGameButton.disabled = true; + if(availableGamesDiv) availableGamesDiv.querySelectorAll('button').forEach(btn => btn.disabled = true); + } + function enableSetupButtons() { + if(createAIGameButton) createAIGameButton.disabled = false; + if(createPvPGameButton) createPvPGameButton.disabled = false; + if(joinPvPGameButton) joinPvPGameButton.disabled = false; + if(findRandomPvPGameButton) findRandomPvPGameButton.disabled = false; + // Кнопки в списке доступных игр управляются в updateAvailableGamesList в gameSetup.js + } + + function redirectToLogin(message) { + console.log(`[Main.js redirectToLogin] Redirecting to login. Message: "${message}"`); + clientState.isLoggedIn = false; + clientState.loggedInUsername = ''; + clientState.myUserId = null; + clientState.isInGame = false; + localStorage.removeItem('jwtToken'); + resetGameVariables(); // Сбрасываем все игровые переменные, включая isActionInProgress + + if (socket.auth) socket.auth.token = null; // Обновляем auth объект сокета + if (socket.connected) { + console.log("[Main.js redirectToLogin] Socket connected, disconnecting before showing auth screen."); + socket.disconnect(); + } + + showAuthScreen(); + setAuthMessage(message || "Для продолжения необходимо войти или обновить сессию.", true); + } + + // --- Сборка зависимостей для модулей --- + console.log('[Main.js] Preparing dependencies for modules...'); + const dependencies = { + socket, + clientState, + ui: { + showAuthScreen, + showGameSelectionScreen, + showGameScreen, + setAuthMessage, + setGameStatusMessage, + resetGameVariables, + updateGlobalWindowVariablesForUI, + disableSetupButtons, + enableSetupButtons, + redirectToLogin, + elements: { + loginForm, registerForm, logoutButton, + createAIGameButton, createPvPGameButton, joinPvPGameButton, + findRandomPvPGameButton, gameIdInput, availableGamesDiv, + pvpCharacterRadios, returnToMenuButton, + // Не передаем сюда все элементы из ui.js, так как ui.js сам их менеджит. + // Если какой-то модуль должен напрямую менять что-то из ui.js.uiElements, + // то можно передать ui.js.uiElements целиком или конкретные элементы. + } + }, + utils: { + isTokenValid, + parseJwtPayloadForValidation // На всякий случай, если понадобится где-то еще + } + }; + + console.log('[Main.js] Initializing auth module...'); + initAuth(dependencies); + console.log('[Main.js] Initializing gameSetup module...'); + initGameSetup(dependencies); + console.log('[Main.js] Initializing gameplay module...'); + initGameplay(dependencies); + console.log('[Main.js] All modules initialized.'); + + // --- Обработчики событий Socket.IO --- + socket.on('connect', () => { + const currentToken = localStorage.getItem('jwtToken'); + if (socket.auth) socket.auth.token = currentToken; // Убедимся, что auth объект сокета обновлен + else socket.auth = { token: currentToken }; // Если auth объекта не было + + console.log('[Main.js Socket.IO] Event: connect. Socket ID:', socket.id, 'Auth token associated with this connection attempt:', !!currentToken); + + if (clientState.isLoggedIn && clientState.myUserId && isTokenValid(currentToken)) { + console.log(`[Main.js Socket.IO] Client state indicates logged in as ${clientState.loggedInUsername} (ID: ${clientState.myUserId}) and token is valid. Requesting game state.`); + // Если мы на экране выбора игры, показываем сообщение о восстановлении + if (!clientState.isInGame && (gameSetupDiv.style.display === 'block' || authSection.style.display === 'block')) { + setGameStatusMessage("Восстановление игровой сессии..."); + } + socket.emit('requestGameState'); + } else { + if (clientState.isLoggedIn && !isTokenValid(currentToken)) { + console.warn('[Main.js Socket.IO connect] Client state says logged in, but token is invalid/expired. Redirecting to login.'); + redirectToLogin("Ваша сессия истекла. Пожалуйста, войдите снова."); + } else { + console.log('[Main.js Socket.IO connect] Client state indicates NOT logged in or no valid token. Showing auth screen if not already visible.'); + if (authSection.style.display !== 'block') { + showAuthScreen(); // Показываем экран логина, если еще не на нем + } + setAuthMessage("Пожалуйста, войдите или зарегистрируйтесь."); // Сообщение по умолчанию для экрана логина + } + } + }); + + socket.on('connect_error', (err) => { + console.error('[Main.js Socket.IO] Event: connect_error. Message:', err.message, err.data ? JSON.stringify(err.data) : ''); + const errorMessageLower = err.message ? err.message.toLowerCase() : ""; + const isAuthError = errorMessageLower.includes('auth') || errorMessageLower.includes('token') || + errorMessageLower.includes('unauthorized') || err.message === 'invalid token' || + err.message === 'no token' || (err.data && typeof err.data === 'string' && err.data.toLowerCase().includes('auth')); + + if (isAuthError) { + console.warn('[Main.js Socket.IO connect_error] Authentication error during connection. Redirecting to login.'); + redirectToLogin("Ошибка аутентификации. Пожалуйста, войдите снова."); + } else { + let currentScreenMessageFunc = setAuthMessage; + if (clientState.isLoggedIn && clientState.isInGame) { + currentScreenMessageFunc = setGameStatusMessage; + } else if (clientState.isLoggedIn) { // Если залогинен, но не в игре (на экране выбора) + currentScreenMessageFunc = setGameStatusMessage; + } + currentScreenMessageFunc(`Ошибка подключения: ${err.message}. Попытка переподключения...`, true); + // Если не залогинены и не на экране авторизации, показываем его + if (!clientState.isLoggedIn && authSection.style.display !== 'block') { + showAuthScreen(); + } + } + if (turnTimerSpan) turnTimerSpan.textContent = 'Ошибка'; + }); + + socket.on('disconnect', (reason) => { + console.warn('[Main.js Socket.IO] Event: disconnect. Reason:', reason); + let messageFunc = setAuthMessage; // По умолчанию сообщение для экрана авторизации + if (clientState.isInGame) { + messageFunc = setGameStatusMessage; + } else if (clientState.isLoggedIn && gameSetupDiv.style.display === 'block') { + messageFunc = setGameStatusMessage; + } + + if (reason === 'io server disconnect') { + messageFunc("Соединение разорвано сервером. Пожалуйста, попробуйте войти снова.", true); + redirectToLogin("Соединение разорвано сервером. Пожалуйста, войдите снова."); + } else if (reason === 'io client disconnect') { + // Это преднамеренный дисконнект (например, при logout или смене токена). + // Сообщение уже должно быть установлено функцией, вызвавшей дисконнект. + // Ничего не делаем здесь, чтобы не перезаписать его. + console.log('[Main.js Socket.IO] Disconnect was intentional (io client disconnect). No additional message needed.'); + } else { // Другие причины (например, проблемы с сетью) + messageFunc(`Потеряно соединение: ${reason}. Попытка переподключения...`, true); + } + if (turnTimerSpan) turnTimerSpan.textContent = 'Откл.'; + clientState.isActionInProgress = false; // На всякий случай сбрасываем флаг при дисконнекте + }); + + socket.on('gameError', (data) => { + console.error('[Main.js Socket.IO] Event: gameError. Message:', data.message, 'Data:', JSON.stringify(data)); + clientState.isActionInProgress = false; // Сбрасываем флаг при ошибке сервера + + if (data.message && (data.message.toLowerCase().includes("сессия истекла") || data.message.toLowerCase().includes("необходимо войти"))) { + redirectToLogin(data.message); + return; + } + + if (clientState.isInGame && window.gameUI?.addToLog) { + window.gameUI.addToLog(`❌ Ошибка сервера: ${data.message}`, 'system'); + // Если ошибка произошла в игре, но игра не закончилась, кнопки могут остаться заблокированными. + // Возможно, стоит проверить, чей ход, и разблокировать, если ход игрока и игра не окончена. + // Но это зависит от типа ошибки. Сейчас просто логируем. + } else if (clientState.isLoggedIn) { + setGameStatusMessage(`❌ Ошибка: ${data.message}`, true); + enableSetupButtons(); // Разблокируем кнопки, если ошибка на экране выбора игры + } else { + setAuthMessage(`❌ Ошибка: ${data.message}`, true); + if(registerForm && registerForm.querySelector('button')) registerForm.querySelector('button').disabled = false; + if(loginForm && loginForm.querySelector('button')) loginForm.querySelector('button').disabled = false; + } + }); + + socket.on('gameNotFound', (data) => { + console.log('[Main.js Socket.IO] Event: gameNotFound. Message:', data?.message, 'Data:', JSON.stringify(data)); + clientState.isInGame = false; + resetGameVariables(); // Включает сброс isActionInProgress + explicitlyHideGameOverModal(); + if (turnTimerContainer) turnTimerContainer.style.display = 'none'; + if (turnTimerSpan) turnTimerSpan.textContent = '--'; + + if (clientState.isLoggedIn && isTokenValid(localStorage.getItem('jwtToken'))) { + if (gameSetupDiv.style.display !== 'block') { // Если мы не на экране выбора игры, показываем его + showGameSelectionScreen(clientState.loggedInUsername); + } + setGameStatusMessage(data?.message || "Активная игровая сессия не найдена. Выберите новую игру."); + } else { + redirectToLogin(data?.message || "Пожалуйста, войдите для продолжения."); + } + }); + + // --- Инициализация UI --- + console.log('[Main.js] Initializing UI visibility...'); + if(authSection) authSection.style.display = 'none'; + if(gameSetupDiv) gameSetupDiv.style.display = 'none'; + if(gameWrapper) gameWrapper.style.display = 'none'; + if(userInfoDiv) userInfoDiv.style.display = 'none'; + if(statusContainer) statusContainer.style.display = 'block'; // Показываем общий контейнер для сообщений + + if (clientState.isLoggedIn) { + console.log('[Main.js] Client is considered logged in. Will attempt session recovery on socket connect.'); + // Не показываем экран выбора игры сразу, дожидаемся 'connect' и 'requestGameState' + setAuthMessage("Подключение и восстановление сессии..."); // Используем authMessage для начального сообщения + } else { + console.log('[Main.js] Client is NOT considered logged in. Showing auth screen.'); + showAuthScreen(); + setAuthMessage("Подключение к серверу..."); + } + + console.log('[Main.js] Attempting to connect socket...'); + socket.connect(); // Подключаемся здесь, после всей инициализации + console.log('[Main.js] socket.connect() called.'); +}); \ No newline at end of file diff --git a/public/js/ui.js b/public/js/ui.js new file mode 100644 index 0000000..3e69e9a --- /dev/null +++ b/public/js/ui.js @@ -0,0 +1,534 @@ +// /public/js/ui.js +// Этот файл отвечает за обновление DOM на основе состояния игры, +// полученного от client.js (который, в свою очередь, получает его от сервера). + +(function() { + // --- DOM Элементы --- + const uiElements = { + player: { + panel: document.getElementById('player-panel'), + name: document.getElementById('player-name'), + avatar: document.getElementById('player-panel')?.querySelector('.player-avatar'), + hpFill: document.getElementById('player-hp-fill'), hpText: document.getElementById('player-hp-text'), + resourceFill: document.getElementById('player-resource-fill'), resourceText: document.getElementById('player-resource-text'), + status: document.getElementById('player-status'), + effectsContainer: document.getElementById('player-effects'), + buffsList: document.getElementById('player-effects')?.querySelector('.player-buffs'), + debuffsList: document.getElementById('player-effects')?.querySelector('.player-debuffs') + }, + opponent: { + panel: document.getElementById('opponent-panel'), + name: document.getElementById('opponent-name'), + avatar: document.getElementById('opponent-panel')?.querySelector('.opponent-avatar'), + hpFill: document.getElementById('opponent-hp-fill'), hpText: document.getElementById('opponent-hp-text'), + resourceFill: document.getElementById('opponent-resource-fill'), resourceText: document.getElementById('opponent-resource-text'), + status: document.getElementById('opponent-status'), + effectsContainer: document.getElementById('opponent-effects'), + buffsList: document.getElementById('opponent-effects')?.querySelector('.opponent-buffs'), + debuffsList: document.getElementById('opponent-effects')?.querySelector('.opponent-debuffs') + }, + controls: { + turnIndicator: document.getElementById('turn-indicator'), + buttonAttack: document.getElementById('button-attack'), + buttonBlock: document.getElementById('button-block'), + abilitiesGrid: document.getElementById('abilities-grid'), + turnTimerContainer: document.getElementById('turn-timer-container'), + turnTimerSpan: document.getElementById('turn-timer') + }, + log: { + list: document.getElementById('log-list'), + }, + gameOver: { + screen: document.getElementById('game-over-screen'), + message: document.getElementById('result-message'), + returnToMenuButton: document.getElementById('return-to-menu-button'), + modalContent: document.getElementById('game-over-screen')?.querySelector('.modal-content') + }, + gameHeaderTitle: document.querySelector('.game-header h1'), + playerResourceTypeIcon: document.getElementById('player-resource-bar')?.closest('.stat-bar-container')?.querySelector('.bar-icon i'), + opponentResourceTypeIcon: document.getElementById('opponent-resource-bar')?.closest('.stat-bar-container')?.querySelector('.bar-icon i'), + playerResourceBarContainer: document.getElementById('player-resource-bar')?.closest('.stat-bar-container'), + opponentResourceBarContainer: document.getElementById('opponent-resource-bar')?.closest('.stat-bar-container'), + + // === НОВЫЕ ЭЛЕМЕНТЫ для переключателя панелей === + panelSwitcher: { + controlsContainer: document.querySelector('.panel-switcher-controls'), + showPlayerBtn: document.getElementById('show-player-panel-btn'), + showOpponentBtn: document.getElementById('show-opponent-panel-btn') + }, + battleArenaContainer: document.querySelector('.battle-arena-container') + // === КОНЕЦ НОВЫХ ЭЛЕМЕНТОВ === + }; + + function addToLog(message, type = 'info') { + const logListElement = uiElements.log.list; + if (!logListElement) return; + const li = document.createElement('li'); + li.textContent = message; + const config = window.GAME_CONFIG || {}; + const logTypeClass = config[`LOG_TYPE_${type.toUpperCase()}`] ? `log-${config[`LOG_TYPE_${type.toUpperCase()}`]}` : `log-${type}`; + li.className = logTypeClass; + logListElement.appendChild(li); + requestAnimationFrame(() => { logListElement.scrollTop = logListElement.scrollHeight; }); + } + + function updateFighterPanelUI(panelRole, fighterState, fighterBaseStats, isControlledByThisClient) { + const elements = uiElements[panelRole]; + const config = window.GAME_CONFIG || {}; + + if (!elements || !elements.hpFill || !elements.hpText || !elements.resourceFill || !elements.resourceText || !elements.status || !fighterState || !fighterBaseStats) { + if (elements) { + if(elements.name) elements.name.innerHTML = (panelRole === 'player') ? ' Ожидание данных...' : ' Ожидание игрока...'; + if(elements.hpText) elements.hpText.textContent = 'N/A'; + if(elements.resourceText) elements.resourceText.textContent = 'N/A'; + if(elements.status) elements.status.textContent = 'Неизвестно'; + if(elements.buffsList) elements.buffsList.innerHTML = 'Нет'; + if(elements.debuffsList) elements.debuffsList.innerHTML = 'Нет'; + if(elements.avatar) elements.avatar.src = 'images/default_avatar.png'; + if(panelRole === 'player' && uiElements.playerResourceTypeIcon) uiElements.playerResourceTypeIcon.className = 'fas fa-question'; + if(panelRole === 'opponent' && uiElements.opponentResourceTypeIcon) uiElements.opponentResourceTypeIcon.className = 'fas fa-question'; + if(panelRole === 'player' && uiElements.playerResourceBarContainer) uiElements.playerResourceBarContainer.classList.remove('mana', 'stamina', 'dark-energy'); + if(panelRole === 'opponent' && uiElements.opponentResourceBarContainer) uiElements.opponentResourceBarContainer.classList.remove('mana', 'stamina', 'dark-energy'); + if(elements.panel) elements.panel.style.opacity = '0.5'; + } + return; + } + if (elements.panel) elements.panel.style.opacity = '1'; + + if (elements.name) { + let iconClass = 'fa-question'; + const characterKey = fighterBaseStats.characterKey; + if (characterKey === 'elena') { iconClass = 'fa-hat-wizard icon-elena'; } + else if (characterKey === 'almagest') { iconClass = 'fa-staff-aesculapius icon-almagest'; } + else if (characterKey === 'balard') { iconClass = 'fa-khanda icon-balard'; } + let nameHtml = ` ${fighterBaseStats.name || 'Неизвестно'}`; + if (isControlledByThisClient) nameHtml += " (Вы)"; + elements.name.innerHTML = nameHtml; + } + + if (elements.avatar && fighterBaseStats.avatarPath) { + elements.avatar.src = fighterBaseStats.avatarPath; + elements.avatar.classList.remove('avatar-elena', 'avatar-almagest', 'avatar-balard'); + elements.avatar.classList.add(`avatar-${fighterBaseStats.characterKey}`); + } else if (elements.avatar) { + elements.avatar.src = 'images/default_avatar.png'; + elements.avatar.classList.remove('avatar-elena', 'avatar-almagest', 'avatar-balard'); + } + + const maxHp = Math.max(1, fighterBaseStats.maxHp); + const maxRes = Math.max(1, fighterBaseStats.maxResource); + const currentHp = Math.max(0, fighterState.currentHp); + const currentRes = Math.max(0, fighterState.currentResource); + elements.hpFill.style.width = `${(currentHp / maxHp) * 100}%`; + elements.hpText.textContent = `${Math.round(currentHp)} / ${fighterBaseStats.maxHp}`; + elements.resourceFill.style.width = `${(currentRes / maxRes) * 100}%`; + elements.resourceText.textContent = `${currentRes} / ${fighterBaseStats.maxResource}`; + + const resourceBarContainerToUpdate = (panelRole === 'player') ? uiElements.playerResourceBarContainer : uiElements.opponentResourceBarContainer; + const resourceIconElementToUpdate = (panelRole === 'player') ? uiElements.playerResourceTypeIcon : uiElements.opponentResourceTypeIcon; + if (resourceBarContainerToUpdate && resourceIconElementToUpdate) { + resourceBarContainerToUpdate.classList.remove('mana', 'stamina', 'dark-energy'); + let resourceClass = 'mana'; let iconClass = 'fa-flask'; + if (fighterBaseStats.resourceName === 'Ярость') { resourceClass = 'stamina'; iconClass = 'fa-fire-alt'; } + else if (fighterBaseStats.resourceName === 'Темная Энергия') { resourceClass = 'dark-energy'; iconClass = 'fa-skull'; } + resourceBarContainerToUpdate.classList.add(resourceClass); + resourceIconElementToUpdate.className = `fas ${iconClass}`; + } + + const statusText = fighterState.isBlocking ? (config.STATUS_BLOCKING || 'Защищается') : (config.STATUS_READY || 'Готов(а)'); + elements.status.textContent = statusText; + elements.status.classList.toggle(config.CSS_CLASS_BLOCKING || 'blocking', fighterState.isBlocking); + + if (elements.panel) { + let borderColorVar = 'var(--panel-border)'; + elements.panel.classList.remove('panel-elena', 'panel-almagest', 'panel-balard'); + if (fighterBaseStats.characterKey === 'elena') { elements.panel.classList.add('panel-elena'); borderColorVar = 'var(--accent-player)'; } + else if (fighterBaseStats.characterKey === 'almagest') { elements.panel.classList.add('panel-almagest'); borderColorVar = 'var(--accent-almagest)'; } + else if (fighterBaseStats.characterKey === 'balard') { elements.panel.classList.add('panel-balard'); borderColorVar = 'var(--accent-opponent)'; } + let glowColorVar = 'rgba(0, 0, 0, 0.4)'; + if (fighterBaseStats.characterKey === 'elena') glowColorVar = 'var(--panel-glow-player)'; + else if (fighterBaseStats.characterKey === 'almagest') glowColorVar = 'var(--panel-glow-almagest)'; + else if (fighterBaseStats.characterKey === 'balard') glowColorVar = 'var(--panel-glow-opponent)'; + elements.panel.style.borderColor = borderColorVar; + elements.panel.style.boxShadow = `0 0 15px ${glowColorVar}, inset 0 0 10px rgba(0, 0, 0, 0.3)`; + } + } + + function generateEffectsHTML(effectsArray) { + const config = window.GAME_CONFIG || {}; + if (!effectsArray || effectsArray.length === 0) return 'Нет'; + return effectsArray.map(eff => { + let effectClasses = config.CSS_CLASS_EFFECT || 'effect'; + const title = `${eff.name}${eff.description ? ` - ${eff.description}` : ''} (Осталось: ${eff.turnsLeft} х.)`; + const displayText = `${eff.name} (${eff.turnsLeft} х.)`; + if (eff.isFullSilence || eff.id.startsWith('playerSilencedOn_') || eff.type === config.ACTION_TYPE_DISABLE) effectClasses += ' effect-stun'; + else if (eff.grantsBlock) effectClasses += ' effect-block'; + else if (eff.type === config.ACTION_TYPE_DEBUFF) effectClasses += ' effect-debuff'; + else if (eff.type === config.ACTION_TYPE_BUFF || eff.type === config.ACTION_TYPE_HEAL) effectClasses += ' effect-buff'; + else effectClasses += ' effect-info'; + return `${displayText}`; + }).join(' '); + } + + function updateEffectsUI(currentGameState) { + if (!currentGameState || !window.GAME_CONFIG) return; + const mySlotId = window.myPlayerId; + const config = window.GAME_CONFIG; + if (!mySlotId) return; + const opponentSlotId = mySlotId === config.PLAYER_ID ? config.OPPONENT_ID : config.PLAYER_ID; + const myState = currentGameState[mySlotId]; + const opponentState = currentGameState[opponentSlotId]; + const typeOrder = { [config.ACTION_TYPE_BUFF]: 1, grantsBlock: 2, [config.ACTION_TYPE_HEAL]: 3, [config.ACTION_TYPE_DEBUFF]: 4, [config.ACTION_TYPE_DISABLE]: 5 }; + const sortEffects = (a, b) => { + let orderA = typeOrder[a.type] || 99; if (a.grantsBlock) orderA = typeOrder.grantsBlock; if (a.isFullSilence || a.id.startsWith('playerSilencedOn_')) orderA = typeOrder[config.ACTION_TYPE_DISABLE]; + let orderB = typeOrder[b.type] || 99; if (b.grantsBlock) orderB = typeOrder.grantsBlock; if (b.isFullSilence || b.id.startsWith('playerSilencedOn_')) orderB = typeOrder[config.ACTION_TYPE_DISABLE]; + return (orderA || 99) - (orderB || 99); + }; + + if (uiElements.player && uiElements.player.buffsList && uiElements.player.debuffsList && myState && myState.activeEffects) { + const myBuffs = []; const myDebuffs = []; + myState.activeEffects.forEach(e => { + const isBuff = e.type === config.ACTION_TYPE_BUFF || e.grantsBlock || e.type === config.ACTION_TYPE_HEAL; + const isDebuff = e.type === config.ACTION_TYPE_DEBUFF || e.type === config.ACTION_TYPE_DISABLE || e.isFullSilence || e.id.startsWith('playerSilencedOn_'); + if (isBuff) myBuffs.push(e); else if (isDebuff) myDebuffs.push(e); else myDebuffs.push(e); + }); + myBuffs.sort(sortEffects); myDebuffs.sort(sortEffects); + uiElements.player.buffsList.innerHTML = generateEffectsHTML(myBuffs); + uiElements.player.debuffsList.innerHTML = generateEffectsHTML(myDebuffs); + } else if (uiElements.player && uiElements.player.buffsList && uiElements.player.debuffsList) { + uiElements.player.buffsList.innerHTML = 'Нет'; uiElements.player.debuffsList.innerHTML = 'Нет'; + } + + if (uiElements.opponent && uiElements.opponent.buffsList && uiElements.opponent.debuffsList && opponentState && opponentState.activeEffects) { + const opponentBuffs = []; const opponentDebuffs = []; + opponentState.activeEffects.forEach(e => { + const isBuff = e.type === config.ACTION_TYPE_BUFF || e.grantsBlock || e.type === config.ACTION_TYPE_HEAL; + const isDebuff = e.type === config.ACTION_TYPE_DEBUFF || e.type === config.ACTION_TYPE_DISABLE || e.isFullSilence || e.id.startsWith('effect_'); + if (isBuff) opponentBuffs.push(e); else if (isDebuff) opponentDebuffs.push(e); else opponentDebuffs.push(e); + }); + opponentBuffs.sort(sortEffects); opponentDebuffs.sort(sortEffects); + uiElements.opponent.buffsList.innerHTML = generateEffectsHTML(opponentBuffs); + uiElements.opponent.debuffsList.innerHTML = generateEffectsHTML(opponentDebuffs); + } else if (uiElements.opponent && uiElements.opponent.buffsList && uiElements.opponent.debuffsList) { + uiElements.opponent.buffsList.innerHTML = 'Нет'; uiElements.opponent.debuffsList.innerHTML = 'Нет'; + } + } + + function updateTurnTimerDisplay(remainingTimeMs, isCurrentPlayerActualTurn, gameMode) { + const timerSpan = uiElements.controls.turnTimerSpan; + const timerContainer = uiElements.controls.turnTimerContainer; + + if (!timerSpan || !timerContainer) return; + + if (window.gameState && window.gameState.isGameOver) { + timerContainer.style.display = 'block'; + timerSpan.textContent = 'Конец'; + timerSpan.classList.remove('low-time'); + return; + } + + if (remainingTimeMs === null || remainingTimeMs === undefined) { + timerContainer.style.display = 'block'; + timerSpan.classList.remove('low-time'); + if (gameMode === 'ai' && !isCurrentPlayerActualTurn) { + timerSpan.textContent = 'Ход ИИ'; + } else if (gameMode === 'pvp' && !isCurrentPlayerActualTurn) { + timerSpan.textContent = 'Ход оппонента'; + } else { + timerSpan.textContent = '--'; + } + } else { + timerContainer.style.display = 'block'; + const seconds = Math.ceil(remainingTimeMs / 1000); + timerSpan.textContent = `0:${seconds < 10 ? '0' : ''}${seconds}`; + + if (seconds <= 10 && isCurrentPlayerActualTurn) { + timerSpan.classList.add('low-time'); + } else { + timerSpan.classList.remove('low-time'); + } + } + } + + + function updateUI() { + const currentGameState = window.gameState; + const gameDataGlobal = window.gameData; + const configGlobal = window.GAME_CONFIG; + const myActualPlayerId = window.myPlayerId; + + if (!currentGameState || !gameDataGlobal || !configGlobal || !myActualPlayerId) { + updateFighterPanelUI('player', null, null, true); + updateFighterPanelUI('opponent', null, null, false); + if(uiElements.gameHeaderTitle) uiElements.gameHeaderTitle.innerHTML = `Ожидание данных...`; + if(uiElements.controls.turnIndicator) uiElements.controls.turnIndicator.textContent = "Ожидание данных..."; + if(uiElements.controls.buttonAttack) uiElements.controls.buttonAttack.disabled = true; + if(uiElements.controls.buttonBlock) uiElements.controls.buttonBlock.disabled = true; + if(uiElements.controls.abilitiesGrid) uiElements.controls.abilitiesGrid.innerHTML = '

Загрузка способностей...

'; + if (uiElements.controls.turnTimerContainer) uiElements.controls.turnTimerContainer.style.display = 'none'; + if (uiElements.controls.turnTimerSpan) { + uiElements.controls.turnTimerSpan.textContent = '--'; + uiElements.controls.turnTimerSpan.classList.remove('low-time'); + } + return; + } + if (!uiElements.player.panel || !uiElements.opponent.panel || !uiElements.controls.turnIndicator || !uiElements.controls.abilitiesGrid || !uiElements.log.list) { + console.warn("updateUI: Некоторые базовые uiElements не найдены."); + return; + } + + const actorSlotWhoseTurnItIs = currentGameState.isPlayerTurn ? configGlobal.PLAYER_ID : configGlobal.OPPONENT_ID; + const opponentActualSlotId = myActualPlayerId === configGlobal.PLAYER_ID ? configGlobal.OPPONENT_ID : configGlobal.PLAYER_ID; + const myStateInGameState = currentGameState[myActualPlayerId]; + const myBaseStatsForUI = gameDataGlobal.playerBaseStats; + if (myStateInGameState && myBaseStatsForUI) updateFighterPanelUI('player', myStateInGameState, myBaseStatsForUI, true); + else updateFighterPanelUI('player', null, null, true); + + const opponentStateInGameState = currentGameState[opponentActualSlotId]; + const opponentBaseStatsForUI = gameDataGlobal.opponentBaseStats; + const isOpponentPanelDissolving = uiElements.opponent.panel?.classList.contains('dissolving'); + if (opponentStateInGameState && opponentBaseStatsForUI) { + if (uiElements.opponent.panel && (uiElements.opponent.panel.style.opacity !== '1' || (uiElements.opponent.panel.classList.contains('dissolving') && currentGameState.isGameOver === false) )) { + const panel = uiElements.opponent.panel; + if (panel.classList.contains('dissolving')) { + panel.classList.remove('dissolving'); panel.style.transition = 'none'; panel.offsetHeight; + panel.style.opacity = '1'; panel.style.transform = 'scale(1) translateY(0)'; panel.style.transition = ''; + } else { panel.style.opacity = '1'; panel.style.transform = 'scale(1) translateY(0)'; } + } else if (uiElements.opponent.panel && !isOpponentPanelDissolving) { + uiElements.opponent.panel.style.opacity = '1'; + } + updateFighterPanelUI('opponent', opponentStateInGameState, opponentBaseStatsForUI, false); + } else { + if (!isOpponentPanelDissolving) updateFighterPanelUI('opponent', null, null, false); + else console.log("[UI UPDATE DEBUG] Opponent panel is dissolving, skipping content update."); + } + + updateEffectsUI(currentGameState); + + if (uiElements.gameHeaderTitle && gameDataGlobal.playerBaseStats && gameDataGlobal.opponentBaseStats) { + const myName = gameDataGlobal.playerBaseStats.name; const opponentName = gameDataGlobal.opponentBaseStats.name; + const myKey = gameDataGlobal.playerBaseStats.characterKey; const opponentKey = gameDataGlobal.opponentBaseStats.characterKey; + let myClass = 'title-player'; let opponentClass = 'title-opponent'; + if (myKey === 'elena') myClass = 'title-enchantress'; else if (myKey === 'almagest') myClass = 'title-sorceress'; else if (myKey === 'balard') myClass = 'title-knight'; + if (opponentKey === 'elena') opponentClass = 'title-enchantress'; else if (opponentKey === 'almagest') opponentClass = 'title-sorceress'; else if (opponentKey === 'balard') opponentClass = 'title-knight'; + uiElements.gameHeaderTitle.innerHTML = `${myName} ${opponentName}`; + } else if (uiElements.gameHeaderTitle) { + const myName = gameDataGlobal.playerBaseStats?.name || 'Игрок 1'; const myKey = gameDataGlobal.playerBaseStats?.characterKey; + let myClass = 'title-player'; if (myKey === 'elena') myClass = 'title-enchantress'; else if (myKey === 'almagest') myClass = 'title-sorceress'; + uiElements.gameHeaderTitle.innerHTML = `${myName} Ожидание игрока...`; + } + + const canThisClientAct = actorSlotWhoseTurnItIs === myActualPlayerId; + const isGameActive = !currentGameState.isGameOver; + const myCharacterState = currentGameState[myActualPlayerId]; + + if (uiElements.controls.turnIndicator) { + if (isGameActive) { + const currentTurnActor = currentGameState.isPlayerTurn ? currentGameState.player : currentGameState.opponent; + uiElements.controls.turnIndicator.textContent = `Ход ${currentGameState.turnNumber}: ${currentTurnActor?.name || 'Неизвестно'}`; + uiElements.controls.turnIndicator.style.color = (currentTurnActor?.id === myActualPlayerId) ? 'var(--turn-color)' : 'var(--text-muted)'; + } else { + uiElements.controls.turnIndicator.textContent = "Игра окончена"; + uiElements.controls.turnIndicator.style.color = 'var(--text-muted)'; + } + } + + if (uiElements.controls.buttonAttack) { + uiElements.controls.buttonAttack.disabled = !(canThisClientAct && isGameActive); + const myCharKey = gameDataGlobal.playerBaseStats?.characterKey; + let attackBuffId = null; + if (myCharKey === 'elena') attackBuffId = configGlobal.ABILITY_ID_NATURE_STRENGTH; + else if (myCharKey === 'almagest') attackBuffId = configGlobal.ABILITY_ID_ALMAGEST_BUFF_ATTACK; + if (attackBuffId && myCharacterState && myCharacterState.activeEffects) { + const isAttackBuffReady = myCharacterState.activeEffects.some(eff => (eff.id === attackBuffId || eff.id === GAME_CONFIG.ABILITY_ID_NATURE_STRENGTH || eff.id === GAME_CONFIG.ABILITY_ID_ALMAGEST_BUFF_ATTACK) && eff.isDelayed && eff.turnsLeft > 0 && !eff.justCast); + uiElements.controls.buttonAttack.classList.toggle(configGlobal.CSS_CLASS_ATTACK_BUFFED || 'attack-buffed', isAttackBuffReady && canThisClientAct && isGameActive); + } else { uiElements.controls.buttonAttack.classList.remove(configGlobal.CSS_CLASS_ATTACK_BUFFED || 'attack-buffed'); } + } + if (uiElements.controls.buttonBlock) uiElements.controls.buttonBlock.disabled = true; + + const actingPlayerState = myCharacterState; + const actingPlayerAbilities = gameDataGlobal.playerAbilities; + const actingPlayerResourceName = gameDataGlobal.playerBaseStats?.resourceName; + const opponentStateForDebuffCheck = currentGameState[opponentActualSlotId]; + + uiElements.controls.abilitiesGrid?.querySelectorAll(`.${configGlobal.CSS_CLASS_ABILITY_BUTTON || 'ability-button'}`).forEach(button => { + const abilityId = button.dataset.abilityId; + const abilityDataFromGameData = actingPlayerAbilities?.find(ab => ab.id === abilityId); + if (!(button instanceof HTMLButtonElement) || !isGameActive || !canThisClientAct || !actingPlayerState || !actingPlayerAbilities || !actingPlayerResourceName || !abilityDataFromGameData) { + if (button instanceof HTMLButtonElement) button.disabled = true; + button.classList.remove(configGlobal.CSS_CLASS_NOT_ENOUGH_RESOURCE||'not-enough-resource', configGlobal.CSS_CLASS_BUFF_IS_ACTIVE||'buff-is-active', configGlobal.CSS_CLASS_ABILITY_SILENCED||'is-silenced', configGlobal.CSS_CLASS_ABILITY_ON_COOLDOWN||'is-on-cooldown'); + const cooldownDisplay = button.querySelector('.ability-cooldown-display'); + if (cooldownDisplay) cooldownDisplay.style.display = 'none'; + return; + } + const hasEnoughResource = actingPlayerState.currentResource >= abilityDataFromGameData.cost; + const isOnCooldown = (actingPlayerState.abilityCooldowns?.[abilityId] || 0) > 0; + const isGenerallySilenced = actingPlayerState.activeEffects?.some(eff => eff.isFullSilence && eff.turnsLeft > 0); + const isAbilitySpecificallySilenced = actingPlayerState.disabledAbilities?.some(dis => dis.abilityId === abilityId && dis.turnsLeft > 0); + const isSilenced = isGenerallySilenced || isAbilitySpecificallySilenced; + const silenceTurnsLeft = isAbilitySpecificallySilenced ? (actingPlayerState.disabledAbilities?.find(dis => dis.abilityId === abilityId)?.turnsLeft || 0) : (isGenerallySilenced ? (actingPlayerState.activeEffects.find(eff => eff.isFullSilence)?.turnsLeft || 0) : 0); + const isBuffAlreadyActive = abilityDataFromGameData.type === configGlobal.ACTION_TYPE_BUFF && actingPlayerState.activeEffects?.some(eff => eff.id === abilityId); + const isTargetedDebuffAbility = abilityId === configGlobal.ABILITY_ID_SEAL_OF_WEAKNESS || abilityId === configGlobal.ABILITY_ID_ALMAGEST_DEBUFF; + const effectIdForDebuff = 'effect_' + abilityId; + const isDebuffAlreadyOnTarget = isTargetedDebuffAbility && opponentStateForDebuffCheck && opponentStateForDebuffCheck.activeEffects?.some(e => e.id === effectIdForDebuff); + button.disabled = !hasEnoughResource || isBuffAlreadyActive || isSilenced || isOnCooldown || isDebuffAlreadyOnTarget; + button.classList.remove(configGlobal.CSS_CLASS_NOT_ENOUGH_RESOURCE||'not-enough-resource', configGlobal.CSS_CLASS_BUFF_IS_ACTIVE||'buff-is-active', configGlobal.CSS_CLASS_ABILITY_SILENCED||'is-silenced', configGlobal.CSS_CLASS_ABILITY_ON_COOLDOWN||'is-on-cooldown'); + const cooldownDisplay = button.querySelector('.ability-cooldown-display'); + if (isOnCooldown) { + button.classList.add(configGlobal.CSS_CLASS_ABILITY_ON_COOLDOWN||'is-on-cooldown'); + if (cooldownDisplay) { cooldownDisplay.textContent = `КД: ${actingPlayerState.abilityCooldowns[abilityId]}`; cooldownDisplay.style.display = 'block'; } + } else if (isSilenced) { + button.classList.add(configGlobal.CSS_CLASS_ABILITY_SILENCED||'is-silenced'); + if (cooldownDisplay) { const icon = isGenerallySilenced ? '🔕' : '🔇'; cooldownDisplay.textContent = `${icon} ${silenceTurnsLeft}`; cooldownDisplay.style.display = 'block'; } + } else { + if (cooldownDisplay) cooldownDisplay.style.display = 'none'; + if (!isOnCooldown && !isSilenced) { + button.classList.toggle(configGlobal.CSS_CLASS_NOT_ENOUGH_RESOURCE||'not-enough-resource', !hasEnoughResource); + button.classList.toggle(configGlobal.CSS_CLASS_BUFF_IS_ACTIVE||'buff-is-active', isBuffAlreadyActive); + } + } + let titleText = `${abilityDataFromGameData.name} (${abilityDataFromGameData.cost} ${actingPlayerResourceName})`; + let descriptionTextFull = abilityDataFromGameData.description; + if (typeof abilityDataFromGameData.descriptionFunction === 'function') { + const opponentBaseStatsForDesc = gameDataGlobal.opponentBaseStats; + descriptionTextFull = abilityDataFromGameData.descriptionFunction(configGlobal, opponentBaseStatsForDesc); + } + if (descriptionTextFull) titleText += ` - ${descriptionTextFull}`; + let abilityBaseCooldown = abilityDataFromGameData.cooldown; + if (typeof abilityBaseCooldown === 'number' && abilityBaseCooldown > 0) titleText += ` (Исходный КД: ${abilityBaseCooldown} х.)`; + if (isOnCooldown) titleText += ` | На перезарядке! Осталось: ${actingPlayerState.abilityCooldowns[abilityId]} х.`; + if (isSilenced) titleText += ` | Под безмолвием! Осталось: ${silenceTurnsLeft} х.`; + if (isBuffAlreadyActive) { + const activeEffect = actingPlayerState.activeEffects?.find(eff => eff.id === abilityId); + const isDelayedBuffReady = isBuffAlreadyActive && activeEffect && activeEffect.isDelayed && !activeEffect.justCast && activeEffect.turnsLeft > 0; + if (isDelayedBuffReady) titleText += ` | Эффект активен и сработает при следующей базовой атаке (${activeEffect.turnsLeft} х.)`; + else if (isBuffAlreadyActive) titleText += ` | Эффект уже активен${activeEffect ? ` (${activeEffect.turnsLeft} х.)` : ''}. Нельзя применить повторно.`; + } + if (isDebuffAlreadyOnTarget && opponentStateForDebuffCheck) { + const activeDebuff = opponentStateForDebuffCheck.activeEffects?.find(e => e.id === 'effect_' + abilityId); + titleText += ` | Эффект уже наложен на ${gameDataGlobal.opponentBaseStats?.name || 'противника'}${activeDebuff ? ` (${activeDebuff.turnsLeft} х.)` : ''}.`; + } + if (!hasEnoughResource) titleText += ` | Недостаточно ${actingPlayerResourceName} (${actingPlayerState.currentResource}/${abilityDataFromGameData.cost})`; + button.setAttribute('title', titleText); + }); + } + + function showGameOver(playerWon, reason = "", opponentCharacterKeyFromClient = null, data = null) { + const config = window.GAME_CONFIG || {}; + const clientSpecificGameData = window.gameData; + const currentActualGameState = window.gameState; + const gameOverScreenElement = uiElements.gameOver.screen; + + if (!gameOverScreenElement) { return; } + + const resultMsgElement = uiElements.gameOver.message; + const myNameForResult = clientSpecificGameData?.playerBaseStats?.name || "Игрок"; + const opponentNameForResult = clientSpecificGameData?.opponentBaseStats?.name || "Противник"; + + if (resultMsgElement) { + let winText = `Победа! ${myNameForResult} празднует!`; + let loseText = `Поражение! ${opponentNameForResult} оказался(лась) сильнее!`; + if (reason === 'opponent_disconnected') { + let disconnectedName = data?.disconnectedCharacterName || opponentNameForResult; + winText = `${disconnectedName} покинул(а) игру. Победа присуждается вам!`; + } else if (reason === 'turn_timeout') { + if (!playerWon) { + loseText = `Время на ход истекло! Поражение. ${opponentNameForResult} побеждает!`; + } else { + winText = `Время на ход у ${opponentNameForResult} истекло! Победа!`; + } + } + resultMsgElement.textContent = playerWon ? winText : loseText; + resultMsgElement.style.color = playerWon ? 'var(--heal-color)' : 'var(--damage-color)'; + } + + const opponentPanelElement = uiElements.opponent.panel; + if (opponentPanelElement) { + opponentPanelElement.classList.remove('dissolving'); + opponentPanelElement.style.transition = 'none'; opponentPanelElement.offsetHeight; + const loserCharacterKeyForDissolve = data?.loserCharacterKey; + if (currentActualGameState && currentActualGameState.isGameOver === true && playerWon) { + if (loserCharacterKeyForDissolve === 'balard' || loserCharacterKeyForDissolve === 'almagest') { + opponentPanelElement.classList.add('dissolving'); + opponentPanelElement.style.opacity = '0'; + } else { + opponentPanelElement.style.opacity = '1'; opponentPanelElement.style.transform = 'scale(1) translateY(0)'; + } + } else { + opponentPanelElement.style.opacity = '1'; opponentPanelElement.style.transform = 'scale(1) translateY(0)'; + } + opponentPanelElement.style.transition = ''; + } + + setTimeout((finalStateInTimeout) => { + if (gameOverScreenElement && finalStateInTimeout && finalStateInTimeout.isGameOver === true) { + if (gameOverScreenElement.classList.contains(config.CSS_CLASS_HIDDEN || 'hidden')) { + gameOverScreenElement.classList.remove(config.CSS_CLASS_HIDDEN || 'hidden'); + } + if(window.getComputedStyle(gameOverScreenElement).display === 'none') gameOverScreenElement.style.display = 'flex'; + gameOverScreenElement.style.opacity = '0'; + requestAnimationFrame(() => { + gameOverScreenElement.style.opacity = '1'; + if (uiElements.gameOver.modalContent) { + uiElements.gameOver.modalContent.style.transition = 'transform 0.4s cubic-bezier(0.2, 0.9, 0.3, 1.2), opacity 0.4s ease-out'; + uiElements.gameOver.modalContent.style.transform = 'scale(1) translateY(0)'; + uiElements.gameOver.modalContent.style.opacity = '1'; + } + }); + } else { + if (gameOverScreenElement) { + gameOverScreenElement.style.transition = 'none'; + if (uiElements.gameOver.modalContent) uiElements.gameOver.modalContent.style.transition = 'none'; + gameOverScreenElement.classList.add(config.CSS_CLASS_HIDDEN || 'hidden'); + gameOverScreenElement.style.opacity = '0'; + if (uiElements.gameOver.modalContent) { + uiElements.gameOver.modalContent.style.transform = 'scale(0.8) translateY(30px)'; + uiElements.gameOver.modalContent.style.opacity = '0'; + } + gameOverScreenElement.offsetHeight; + } + } + }, config.DELAY_BEFORE_VICTORY_MODAL || 1500, currentActualGameState); + } + + // === НОВАЯ ФУНКЦИЯ для настройки переключателя панелей === + function setupPanelSwitcher() { + const { showPlayerBtn, showOpponentBtn } = uiElements.panelSwitcher; + const battleArena = uiElements.battleArenaContainer; + + if (showPlayerBtn && showOpponentBtn && battleArena) { + showPlayerBtn.addEventListener('click', () => { + battleArena.classList.remove('show-opponent-panel'); + showPlayerBtn.classList.add('active'); + showOpponentBtn.classList.remove('active'); + }); + + showOpponentBtn.addEventListener('click', () => { + battleArena.classList.add('show-opponent-panel'); + showOpponentBtn.classList.add('active'); + showPlayerBtn.classList.remove('active'); + }); + + // По умолчанию при загрузке (если кнопки видимы) панель игрока активна + // CSS уже должен это обеспечивать, но для надежности можно убедиться + if (window.getComputedStyle(uiElements.panelSwitcher.controlsContainer).display !== 'none') { + battleArena.classList.remove('show-opponent-panel'); + showPlayerBtn.classList.add('active'); + showOpponentBtn.classList.remove('active'); + } + } + } + // === КОНЕЦ НОВОЙ ФУНКЦИИ === + + window.gameUI = { + uiElements, + addToLog, + updateUI, + showGameOver, + updateTurnTimerDisplay + }; + + // Настраиваем переключатель панелей при загрузке скрипта + setupPanelSwitcher(); + +})(); \ No newline at end of file diff --git a/public/style_alt.css b/public/style_alt.css new file mode 100644 index 0000000..ba69ff7 --- /dev/null +++ b/public/style_alt.css @@ -0,0 +1,1399 @@ +/* === style_alt.css (Изменения для user-info и game-header) === */ +@import url('https://fonts.googleapis.com/css2?family=MedievalSharp&family=Roboto:wght@300;400;700&display=swap'); +@import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css'); + +:root { + /* --- Переменные цветов и шрифтов (из локальной версии) --- */ + --font-main: 'Roboto', sans-serif; + --font-fancy: 'MedievalSharp', cursive; + + --bg-gradient-dark: linear-gradient(160deg, #1f243a, #10121c); + --panel-bg: rgba(16, 18, 28, 0.8); + --panel-border: #4a5072; + + --panel-glow-player: rgba(80, 150, 255, 0.3); + --panel-glow-opponent: rgba(255, 80, 80, 0.3); + --panel-glow-almagest: rgba(199, 108, 255, 0.3); + + + --text-light: #e8effc; + --text-muted: #9badce; + --text-heading: #ffffff; + + --accent-player: #6c95ff; + --accent-opponent: #ff6c6c; + --accent-almagest: #c76cff; + + --hp-color: #de4b4b; + --mana-color: #58a8d0; + --stamina-color: #ffb347; + --dark-energy-color: #ab47bc; + --bar-bg: #252a44; + + --button-bg: linear-gradient(145deg, #556190, #3f4a70); + --button-hover-bg: linear-gradient(145deg, #6a79b0, #556190); + --button-text: var(--text-light); + + --button-ability-bg: linear-gradient(145deg, #305a5e, #1f4043); + --button-ability-hover-bg: linear-gradient(145deg, #407a7e, #305a5e); + --button-ability-border: #4db0b5; + + --button-disabled-bg: #333950; + --button-disabled-text: #6b7491; + + --log-bg: rgba(10, 12, 20, 0.85); + --log-border: var(--panel-border); + --log-text: var(--text-muted); + + --icon-color: var(--text-muted); + --damage-color: #ff8080; + --heal-color: #90ee90; + --block-color: #add8e6; + --effect-color: #d8bfd8; + --turn-color: #ffd700; + --system-color: #7fffd4; + + --modal-bg: rgba(16, 18, 28, 0.97); + --modal-content-bg: #2a2f45; + + --scrollbar-thumb: #4a5072; + --scrollbar-track: #10121c; + + --shake-duration: 0.4s; + --cast-duration: 0.6s; + --dissolve-duration: 6.0s; + + --log-panel-fixed-height: 280px; + + --timer-text-color: var(--turn-color); + --timer-icon-color: #b0c4de; + --timer-low-time-color: var(--damage-color); + + /* === Переменные для переключателя панелей (мобильный вид) - ИЗ СЕРВЕРНОЙ ВЕРСИИ === */ + --panel-switcher-bg: rgba(10, 12, 20, 0.9); + --panel-switcher-border: var(--panel-border); + --panel-switcher-button-bg: var(--button-bg); + --panel-switcher-button-text: var(--button-text); + --panel-switcher-button-active-bg: var(--accent-player); + --panel-switcher-button-active-text: #fff; +} + +/* --- Базовые Стили и Сброс --- */ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + height: 100%; +} + +body { + font-family: var(--font-main); + background: var(--bg-gradient-dark) fixed; + color: var(--text-light); + line-height: 1.5; + height: 100vh; + overflow: hidden; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 10px; +} + +h1, h2, h3, h4 { + font-family: var(--font-fancy); + color: var(--text-heading); + margin-bottom: 0.75em; + font-weight: normal; +} + +button { + font-family: var(--font-main); +} + +i { + margin-right: 6px; + color: var(--icon-color); + width: 1.2em; + text-align: center; +} + +* { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track); +} + +*::-webkit-scrollbar { + width: 8px; +} + +*::-webkit-scrollbar-track { + background: var(--scrollbar-track); + border-radius: 4px; +} + +*::-webkit-scrollbar-thumb { + background-color: var(--scrollbar-thumb); + border-radius: 4px; + border: 2px solid var(--scrollbar-track); +} + + +/* === Стили для Экранов Аутентификации и Настройки Игры (из локальной версии) === */ +.auth-game-setup-wrapper { + width: 100%; + max-width: 700px; + margin: 20px auto; + background: var(--panel-bg); + border: 1px solid var(--panel-border); + border-radius: 10px; + box-shadow: 0 5px 20px rgba(0, 0, 0, 0.5); + color: var(--text-light); + text-align: center; + max-height: calc(100vh - 40px); + overflow-y: hidden; /* Сохраняем из локальной */ + position: relative; /* <<< Добавлено для позиционирования #user-info (из локальной) */ +} + +.auth-game-setup-wrapper h2, +.auth-game-setup-wrapper h3 { + font-family: var(--font-fancy); + color: var(--text-heading); + margin-bottom: 1em; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + padding-bottom: 0.5em; +} + +.auth-game-setup-wrapper h3 { + font-size: 1.2em; + margin-top: 1.5em; +} + +.auth-game-setup-wrapper button, +#auth-section form button { + font-family: var(--font-main); + background: var(--button-bg); + color: var(--button-text); + border: 1px solid rgba(0, 0, 0, 0.3); + border-radius: 6px; + padding: 10px 18px; + margin: 8px 5px; + cursor: pointer; + transition: all 0.15s ease; + font-weight: bold; + text-transform: uppercase; + letter-spacing: 0.5px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); + outline: none; +} + +.auth-game-setup-wrapper button:hover:enabled, +#auth-section form button:hover:enabled { + background: var(--button-hover-bg); + transform: translateY(-2px) scale(1.02); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4); +} + +.auth-game-setup-wrapper button:active:enabled, +#auth-section form button:active:enabled { + transform: translateY(0px) scale(1); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); +} + +.auth-game-setup-wrapper button:disabled, +#auth-section form button:disabled { + background: var(--button-disabled-bg) !important; + color: var(--button-disabled-text) !important; + border-color: transparent !important; + cursor: not-allowed !important; + opacity: 0.7; + transform: none !important; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.4) !important; + filter: grayscale(50%); +} + +.auth-game-setup-wrapper input[type="text"], +#auth-section input[type="text"], +#auth-section input[type="password"] { + padding: 10px; + border-radius: 5px; + border: 1px solid var(--panel-border); + background-color: var(--bar-bg); + color: var(--text-light); + margin: 5px 5px 10px 5px; + font-size: 0.9em; + width: calc(100% - 22px); + max-width: 300px; + box-sizing: border-box; + outline: none; + transition: border-color 0.2s ease, box-shadow 0.2s ease; +} + +.auth-game-setup-wrapper input[type="text"]:focus, +#auth-section input[type="text"]:focus, +#auth-section input[type="password"]:focus { + border-color: var(--accent-player); + box-shadow: 0 0 8px rgba(108, 149, 255, 0.4); +} + +#available-games-list { + margin-top: 20px; + text-align: left; + max-height: 250px; + height: 100px; /* Сохраняем из локальной */ + overflow-y: scroll; + padding: 10px 15px; + background-color: rgba(0, 0, 0, 0.25); + border: 1px solid var(--log-border); + border-radius: 6px; +} + +#available-games-list h3 { + margin-top: 0; + margin-bottom: 10px; + padding-bottom: 5px; + border-bottom: 1px dashed rgba(255, 255, 255, 0.1); +} + +#available-games-list ul { + list-style: none; + padding: 0; + margin: 0; +} + +#available-games-list li { + padding: 10px; + border-bottom: 1px solid rgba(74, 80, 114, 0.5); + display: flex; + justify-content: space-between; + align-items: center; + font-size: 0.9em; +} + +#available-games-list li:last-child { + border-bottom: none; +} + +#available-games-list li button { + padding: 6px 10px; + font-size: 0.8em; + margin-left: 10px; + flex-shrink: 0; +} + +#status-container { + height: 40px; /* Сохраняем из локальной */ +} + +#auth-message, +#game-status-message { + font-weight: bold; + font-size: 1.1em; + padding: 5px; + background-color: rgba(0, 0, 0, 0.1); + border-radius: 4px; + display: block; + margin-bottom: 5px; + text-align: center; +} + +#auth-message.success { + color: var(--heal-color); +} + +#auth-message.error { + color: var(--damage-color); +} + +#game-status-message { + color: var(--turn-color); +} + + +#auth-section form { + margin-bottom: 20px; +} + +/* === ИЗМЕНЕНИЕ: Стили для #user-info (из локальной версии) === */ +#user-info { + position: absolute; + top: 10px; /* Отступ сверху */ + right: 15px; /* Отступ справа */ + line-height: 1.5; + text-align: right; /* Выравнивание текста и кнопки вправо */ + z-index: 10; /* Чтобы был поверх другого контента в .auth-game-setup-wrapper */ +} + +#user-info p { + margin: 0 10px 0 0; /* Уменьшен нижний отступ */ + font-size: 0.9em; /* Уменьшен шрифт приветствия */ + color: var(--text-muted); + line-height: 2.5; +} + +#user-info p #logged-in-username { + font-weight: bold; + color: var(--text-light); +} + +#user-info div { + display: flex; + flex-direction: row; +} + +#logout-button { + background: linear-gradient(145deg, #6e3c3c, #502626) !important; /* Более темный красный */ + color: #f0d0d0 !important; /* Светло-розовый текст */ + padding: 6px 12px !important; /* Уменьшены паддинги */ + font-size: 0.8em !important; /* Уменьшен шрифт */ + margin: 0 !important; /* Убираем внешние отступы */ + letter-spacing: 0.2px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3) !important; + border: 1px solid #422020 !important; /* Темная рамка */ +} + +#logout-button:hover:enabled { + background: linear-gradient(145deg, #834545, #6e3c3c) !important; + transform: translateY(-1px) !important; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4) !important; +} +#logout-button i { + margin-right: 4px; /* Уменьшен отступ иконки */ +} +/* === КОНЕЦ ИЗМЕНЕНИЯ === */ + + +.character-selection { + margin-top: 15px; + margin-bottom: 15px; + padding: 15px; + background-color: rgba(0, 0, 0, 0.2); + border-radius: 6px; + border: 1px solid rgba(74, 80, 114, 0.5); +} + +.character-selection h4 { + font-size: 1.1em; + color: var(--text-muted); + margin-bottom: 10px; + border: none; + padding: 0; + text-align: center; +} + +.character-selection label { + display: inline-block; + margin: 0 15px; + cursor: pointer; + font-size: 1.05em; + padding: 5px 10px; + border-radius: 4px; + transition: background-color 0.2s ease, color 0.2s ease; + user-select: none; +} + +.character-selection input[type="radio"] { + display: none; +} + +.character-selection input[type="radio"]:checked + label { + color: #fff; + font-weight: bold; +} + +.character-selection input[type="radio"][value="elena"]:checked + label { + background-color: var(--accent-player); + box-shadow: 0 0 8px rgba(108, 149, 255, 0.5); +} + +.character-selection input[type="radio"][value="almagest"]:checked + label { + background-color: var(--accent-almagest); + box-shadow: 0 0 8px rgba(199, 108, 255, 0.5); +} + +.character-selection label:hover { + background-color: rgba(255, 255, 255, 0.1); +} + +.character-selection label i { + margin-right: 8px; + vertical-align: middle; +} + +label[for="char-elena"] i { + color: var(--accent-player); +} + +label[for="char-almagest"] i { + color: var(--accent-almagest); +} + +/* --- Основная Структура Игры (.game-wrapper) --- */ +.game-wrapper { + width: 100%; + height: 100%; + max-width: 1400px; + margin: 0 auto; + padding: 10px; + display: flex; + flex-direction: column; + gap: 10px; + overflow: hidden; +} + +/* === ИЗМЕНЕНИЕ: .game-header удален, стили для него больше не нужны (из локальной версии) === */ + +/* Глобальные стили для кнопок переключения панелей - ИЗ СЕРВЕРНОЙ ВЕРСИИ */ +.panel-switcher-controls { + display: none; /* Скрыт по умолчанию для десктопа */ + flex-shrink: 0; + padding: 8px 5px; + background: var(--panel-switcher-bg); + border-bottom: 1px solid var(--panel-switcher-border); + gap: 10px; +} +.panel-switch-button { + flex: 1; + padding: 8px 10px; + font-size: 0.9em; + font-weight: bold; + text-transform: uppercase; + background: var(--panel-switcher-button-bg); + color: var(--panel-switcher-button-text); + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 5px; + cursor: pointer; + transition: background-color 0.2s, color 0.2s, transform 0.1s; + display: flex; + align-items: center; + justify-content: center; +} +.panel-switch-button i { margin-right: 8px; } +.panel-switch-button:hover { filter: brightness(1.1); } +.panel-switch-button.active { + background: var(--panel-switcher-button-active-bg); + color: var(--panel-switcher-button-active-text); + box-shadow: 0 0 8px rgba(255,255,255,0.3); +} + +.battle-arena-container { + flex-grow: 1; + display: flex; + gap: 10px; + overflow: hidden; + /* === ИЗМЕНЕНИЕ: Добавляем верхний отступ, если .game-header был убран, а .game-wrapper виден (из локальной версии) === */ + /* margin-top: 10px; /* или padding-top: 10px; на .game-wrapper, если нужно */ + /* === Изменения из серверной для работы переключения панелей === */ + position: relative; + min-height: 0; +} + +.player-column, +.opponent-column { + flex: 1; + display: flex; + flex-direction: column; + gap: 10px; + min-width: 0; + overflow: hidden; +} + +/* Остальные стили панелей, кнопок, лога и т.д. из локальной версии */ +.fighter-panel, +.controls-panel-new, +.battle-log-new { + background: var(--panel-bg); + border: 1px solid var(--panel-border); + border-radius: 8px; + box-shadow: 0 0 15px rgba(0, 0, 0, 0.4), inset 0 0 10px rgba(0, 0, 0, 0.3); + padding: 15px; + display: flex; + flex-direction: column; + overflow: hidden; + transition: box-shadow 0.3s ease, border-color 0.3s ease, opacity 0.3s ease-out, transform 0.3s ease-out; +} + +.fighter-panel.panel-elena { + border-color: var(--accent-player); +} +.fighter-panel.panel-almagest { + border-color: var(--accent-almagest); +} +.fighter-panel.panel-balard { + border-color: var(--accent-opponent); +} + + +.panel-header { + flex-shrink: 0; + display: flex; + align-items: center; + gap: 10px; + padding-bottom: 10px; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + margin-bottom: 0; +} + +.fighter-name { + font-size: 1.6em; + margin: 0; + flex-grow: 1; + text-align: left; +} + +.fighter-name .icon-elena { color: var(--accent-player); } +.fighter-name .icon-almagest { color: var(--accent-almagest); } +.fighter-name .icon-balard { color: var(--accent-opponent); } + + +.character-visual { + flex-shrink: 0; + margin-bottom: 0; +} + +.avatar-image { + display: block; + max-width: 50px; + height: auto; + border-radius: 50%; + border: 2px solid var(--panel-border); + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5); +} + +.avatar-image.avatar-elena { border-color: var(--accent-player); } +.avatar-image.avatar-almagest { border-color: var(--accent-almagest); } +.avatar-image.avatar-balard { border-color: var(--accent-opponent); } + + +.panel-content { + flex-grow: 1; + overflow-y: auto; + padding-right: 5px; + display: flex; + flex-direction: column; + gap: 10px; /* Добавлено из серверной версии для консистентности */ + min-height: 0; + padding-top: 10px; + margin-top: 0; +} + +.stat-bar-container { + display: flex; + align-items: center; + gap: 10px; + flex-shrink: 0; +} + +.stat-bar-container .bar-icon { + flex-shrink: 0; + font-size: 1.4em; +} +.stat-bar-container.health .bar-icon { color: var(--hp-color); } +.stat-bar-container.mana .bar-icon { color: var(--mana-color); } +.stat-bar-container.stamina .bar-icon { color: var(--stamina-color); } +.stat-bar-container.dark-energy .bar-icon { color: var(--dark-energy-color); } + + +.bar-wrapper { + flex-grow: 1; +} + +.bar { + border-radius: 4px; + height: 20px; + border: 1px solid rgba(0, 0, 0, 0.5); + overflow: hidden; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5); + position: relative; + background-color: var(--bar-bg); +} + +.bar-fill { + display: block; + height: 100%; + border-radius: 3px; + position: relative; + z-index: 2; + transition: width 0.4s ease-out; +} + +.bar-text { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + z-index: 3; + display: flex; + justify-content: center; + align-items: center; + font-size: 0.75em; + font-weight: bold; + color: #fff; + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.9); + padding: 0 5px; + white-space: nowrap; + pointer-events: none; +} +.health .bar-fill { background-color: var(--hp-color); } +.mana .bar-fill { background-color: var(--mana-color); } +.stamina .bar-fill { background-color: var(--stamina-color); } +.dark-energy .bar-fill { background-color: var(--dark-energy-color); } + + +.status-area { + font-size: 0.9em; + display: flex; + align-items: baseline; + gap: 5px; + flex-shrink: 0; + min-height: 1.5em; +} + +.status-area .icon-status { + font-size: 1em; + flex-shrink: 0; + margin-top: 0.1em; +} + +.status-area strong { + color: var(--text-muted); + font-weight: normal; + flex-shrink: 0; + margin-right: 3px; +} + +.status-area span { + font-weight: bold; +} + +.status-area span.blocking { + color: var(--block-color); + font-style: italic; +} + +.effects-area { + font-size: 0.9em; + display: flex; + flex-direction: column; + gap: 8px; /* Добавлено из серверной версии для консистентности */ + flex-shrink: 0; + min-height: 3em; +} + +.effect-category { + display: flex; + align-items: baseline; + gap: 5px; +} + +.effect-category strong { + color: var(--text-muted); + font-weight: normal; + font-family: var(--font-main); + font-size: 0.9em; + flex-shrink: 0; + margin-right: 3px; +} + +.effect-category .icon-effects-buff, +.effect-category .icon-effects-debuff { + font-size: 1em; + flex-shrink: 0; + margin-top: 0.1em; + width: 1.2em; + text-align: center; +} + +.effect-category .icon-effects-buff { color: var(--heal-color); } +.effect-category .icon-effects-debuff { color: var(--damage-color); } + +.effect-list { + display: inline; + line-height: 1.4; + min-width: 0; + font-weight: bold; +} + +.effect { + display: inline-block; + margin: 2px 3px 2px 0; + padding: 1px 6px; + font-size: 0.8em; + border-radius: 10px; + border: 1px solid; + cursor: default; + font-weight: 600; + background-color: rgba(0, 0, 0, 0.2); + white-space: nowrap; + vertical-align: baseline; +} +.effect-buff { border-color: var(--heal-color); color: var(--heal-color); } +.effect-debuff { border-color: var(--damage-color); color: var(--damage-color); } +.effect-stun { border-color: var(--turn-color); color: var(--turn-color); } +.effect-block { border-color: var(--block-color); color: var(--block-color); } +.effect-info { border-color: var(--text-muted); color: var(--text-muted); } + +.controls-panel-new { + flex-grow: 1; + min-height: 0; + display: flex; + flex-direction: column; +} + +#turn-indicator { + flex-shrink: 0; + text-align: center; + font-size: 1.4em; + margin-bottom: 10px; + padding-bottom: 8px; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + transition: color 0.3s ease; +} + +.turn-timer-display { + flex-shrink: 0; + text-align: center; + font-size: 0.9em; + color: var(--timer-text-color); + margin-top: -5px; + margin-bottom: 10px; + padding: 5px; + background-color: rgba(0,0,0,0.15); + border-radius: 4px; + border-top: 1px solid rgba(255,255,255,0.05); +} + +.turn-timer-display i { + color: var(--timer-icon-color); + margin-right: 8px; +} + +#turn-timer { + font-weight: bold; + font-size: 1.1em; + min-width: 35px; + display: inline-block; + text-align: left; +} + +#turn-timer.low-time { + color: var(--timer-low-time-color); + animation: pulse-timer-warning 1s infinite ease-in-out; +} + +.controls-layout { + flex-grow: 1; + display: flex; + flex-direction: column; + gap: 10px; + overflow: hidden; + min-height: 0; +} + +.control-group { + flex-shrink: 0; +} + +.control-group h4 { + font-size: 0.9em; + color: var(--text-muted); + margin-bottom: 5px; + padding-bottom: 5px; + border-bottom: 1px dashed var(--panel-border); + text-transform: uppercase; + letter-spacing: 1px; +} + +.basic-actions { + display: flex; + gap: 10px; +} + +.action-button.basic { + flex: 1; + padding: 8px 5px; + font-size: 0.85em; + font-weight: bold; + background: var(--button-bg); + color: var(--button-text); + border: 1px solid rgba(0, 0, 0, 0.3); + border-radius: 5px; + cursor: pointer; + transition: all 0.15s ease; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); + outline: none; +} + +.action-button.basic:hover:enabled { + background: var(--button-hover-bg); + transform: translateY(-1px); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.5); +} + +.action-button.basic:active:enabled { + transform: translateY(0px); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); +} + +#button-attack.attack-buffed:enabled { + border: 2px solid var(--heal-color); + box-shadow: 0 0 10px 2px rgba(144, 238, 144, 0.6), 0 3px 6px rgba(0, 0, 0, 0.5); + background: linear-gradient(145deg, #70c070, #5a9a5a); + transform: translateY(-1px); +} + + +.ability-list { + flex-grow: 1; + display: flex; + flex-direction: column; + min-height: 0; + overflow: hidden; +} + +.ability-list h4 { + flex-shrink: 0; +} + +.abilities-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(75px, 1fr)); + gap: 8px; + padding: 8px; + padding-bottom: 12px; + background-color: rgba(0, 0, 0, 0.2); + border-radius: 4px; + overflow-y: auto; + border: 1px solid rgba(0, 0, 0, 0.3); + flex-grow: 1; + position: relative; +} + +.abilities-grid::after { + content: ''; + display: block; + height: 10px; + width: 100%; +} + +.abilities-grid .placeholder-text { + grid-column: 1 / -1; + text-align: center; + color: var(--text-muted); + align-self: center; + font-size: 0.9em; + padding: 15px 0; +} + +.ability-button { + aspect-ratio: 1 / 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 5px; + border-radius: 6px; + background: var(--button-ability-bg); + border: 1px solid var(--button-ability-border); + color: #fff; + text-align: center; + line-height: 1.15; + cursor: pointer; + transition: all 0.2s ease-out; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6); + position: relative; + overflow: hidden; + outline: none; +} + +.ability-button .ability-name { + font-size: 0.75em; + font-weight: bold; + margin-bottom: 2px; + display: block; + width: 95%; +} + +.ability-button .ability-desc { + font-size: 0.65em; + font-weight: normal; + color: #aaccce; + opacity: 0.8; + text-shadow: none; + max-height: 2em; + overflow: hidden; + width: 95%; + display: block; + margin-top: auto; +} + +.ability-button:hover:enabled { + transform: scale(1.03) translateY(-1px); + background: var(--button-ability-hover-bg); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.5), 0 0 8px rgba(77, 176, 181, 0.4); + border-color: #77d9dd; +} + +.ability-button:active:enabled { + transform: scale(1) translateY(0); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.3); + filter: brightness(0.9); +} + +.ability-button:disabled, +.action-button.basic:disabled { + background: var(--button-disabled-bg) !important; + border-color: transparent !important; + color: var(--button-disabled-text) !important; + cursor: not-allowed !important; + transform: none !important; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.4) !important; + opacity: 0.7; + text-shadow: none !important; + filter: grayscale(50%); +} + +.ability-button.not-enough-resource { + border: 2px dashed var(--damage-color); + animation: pulse-red-border 1s infinite ease-in-out; +} +.ability-button.not-enough-resource:disabled { + border-color: var(--damage-color); + box-shadow: inset 0 0 8px rgba(255, 80, 80, 0.2), 0 3px 6px rgba(0, 0, 0, 0.2), inset 0 1px 3px rgba(0, 0, 0, 0.4); +} + +.ability-button.buff-is-active { + border: 2px solid var(--heal-color); + box-shadow: 0 0 8px rgba(144, 238, 144, 0.5); +} + +.ability-button.buff-is-active:disabled { + border-color: var(--heal-color); +} + +.ability-button.is-on-cooldown, +.ability-button.is-silenced { + filter: grayscale(70%) brightness(0.8); +} + +.ability-button.is-on-cooldown:disabled, +.ability-button.is-silenced:disabled { + filter: grayscale(70%) brightness(0.7); +} + +.ability-button.is-on-cooldown .ability-name, +.ability-button.is-silenced .ability-name, +.ability-button.is-on-cooldown .ability-desc, +.ability-button.is-silenced .ability-desc { + opacity: 0.6; +} + +.ability-button.is-on-cooldown .ability-desc, +.ability-button.is-silenced .ability-desc { + display: none; +} + +.ability-cooldown-display { + position: absolute; + bottom: 5px; + left: 0; + width: 100%; + text-align: center; + font-size: 0.75em; + font-weight: bold; + color: var(--turn-color); + text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.7); + pointer-events: none; + display: none; + line-height: 1; +} + +.ability-button.is-on-cooldown .ability-cooldown-display, +.ability-button.is-silenced .ability-cooldown-display { + display: block !important; +} + + +.battle-log-new { + height: var(--log-panel-fixed-height); + flex-shrink: 0; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.battle-log-new h3 { + flex-shrink: 0; + font-size: 1.4em; + margin-bottom: 10px; + text-align: center; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + padding-bottom: 8px; +} + +#log-list { + list-style: none; + flex-grow: 1; + overflow-y: auto; + background-color: var(--log-bg); + border: 1px solid var(--log-border); + font-size: 0.85em; + border-radius: 6px; + color: var(--log-text); + padding: 10px; + min-height: 0; + word-wrap: break-word; +} + +#log-list li { + padding: 4px 8px; + border-bottom: 1px solid rgba(74, 80, 114, 0.5); + line-height: 1.35; + transition: background-color 0.3s; +} + +#log-list li:last-child { + border-bottom: none; +} + +#log-list li:hover { + background-color: rgba(255, 255, 255, 0.03); +} +.log-damage { color: var(--damage-color); font-weight: 500; } +.log-heal { color: var(--heal-color); font-weight: 500; } +.log-block { color: var(--block-color); font-style: italic; } +.log-info { color: #b0c4de; } +.log-turn { + font-weight: bold; + color: var(--turn-color); + margin-top: 6px; + border-top: 1px solid rgba(255, 215, 0, 0.3); + padding-top: 6px; + font-size: 1.05em; + display: block; +} +.log-system { + font-weight: bold; + color: var(--system-color); + font-style: italic; + opacity: 0.8; +} +.log-effect { + font-style: italic; + color: var(--effect-color); +} + +.modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: var(--modal-bg); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; + backdrop-filter: blur(4px) brightness(0.7); + opacity: 0; + pointer-events: none; + transition: opacity 0.4s ease-out; +} + +.modal.hidden { + display: none !important; +} + +.modal:not(.hidden) { + opacity: 1; + pointer-events: auto; +} + +.modal-content { + background: var(--modal-content-bg); + padding: 40px 50px; + border-radius: 10px; + text-align: center; + border: 1px solid var(--panel-border); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.6); + color: var(--text-light); + transform: scale(0.8) translateY(30px); + opacity: 0; + transition: transform 0.4s cubic-bezier(0.2, 0.9, 0.3, 1.2), opacity 0.4s ease-out; +} + +.modal:not(.hidden) .modal-content { + transform: scale(1) translateY(0); + opacity: 1; +} + +.modal-content h2#result-message { + margin-bottom: 25px; + font-family: var(--font-fancy); + font-size: 2.5em; + line-height: 1.2; +} + +.modal-action-button { + padding: 12px 30px; + font-size: 1.1em; + cursor: pointer; + background: var(--button-bg); + color: var(--button-text); + border: 1px solid rgba(0, 0, 0, 0.3); + border-radius: 6px; + margin-top: 20px; + font-weight: bold; + text-transform: uppercase; + letter-spacing: 1px; + transition: all 0.2s ease; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4); + outline: none; +} + +.modal-action-button:hover:enabled { + background: var(--button-hover-bg); + transform: scale(1.05) translateY(-1px); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.5); +} + +.modal-action-button:active:enabled { + transform: scale(1) translateY(0); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4); +} + +.modal-action-button:disabled { + background: var(--button-disabled-bg); + color: var(--button-disabled-text); + cursor: not-allowed; + opacity: 0.7; +} + +.modal-action-button i { + margin-right: 8px; +} + +@keyframes pulse-red-border { + 0%, 100% { border-color: var(--damage-color); } + 50% { border-color: #ffb3b3; } +} + +@keyframes pulse-timer-warning { + 0%, 100% { color: var(--timer-low-time-color); transform: scale(1); } + 50% { color: #ff6347; transform: scale(1.05); } +} + +@keyframes flash-effect { + 0%, 100% { + box-shadow: var(--initial-box-shadow, 0 0 15px rgba(0, 0, 0, 0.4), inset 0 0 10px rgba(0, 0, 0, 0.3)); + border-color: var(--initial-border-color, var(--panel-border)); + transform: scale(1); + } + 50% { + box-shadow: 0 0 25px 10px var(--flash-color-outer, rgba(255, 255, 255, 0.7)), + inset 0 0 15px var(--flash-color-inner, rgba(255, 255, 255, 0.4)), + 0 0 15px rgba(0, 0, 0, 0.4); + border-color: var(--flash-border-color, #ffffff); + transform: scale(1.005); + } +} + +[class*="is-casting-"] { + animation: flash-effect var(--cast-duration) ease-out; +} + +#player-panel.is-casting-heal, #opponent-panel.is-casting-heal { + --flash-color-outer: rgba(144, 238, 144, 0.7); --flash-color-inner: rgba(144, 238, 144, 0.4); + --flash-border-color: var(--heal-color); +} +#player-panel.is-casting-fireball, #opponent-panel.is-casting-fireball { + --flash-color-outer: rgba(255, 100, 100, 0.7); --flash-color-inner: rgba(255, 100, 100, 0.4); + --flash-border-color: var(--damage-color); +} +#player-panel.is-casting-shadowBolt, #opponent-panel.is-casting-shadowBolt { + --flash-color-outer: rgba(138, 43, 226, 0.6); --flash-color-inner: rgba(138, 43, 226, 0.3); + --flash-border-color: var(--dark-energy-color); +} + +@keyframes shake-opponent { + 0%, 100% { transform: translateX(0); } + 10%, 30%, 50%, 70%, 90% { transform: translateX(-4px) rotate(-0.5deg); } + 20%, 40%, 60%, 80% { transform: translateX(4px) rotate(0.5deg); } +} + +#opponent-panel.is-shaking { + animation: shake-opponent var(--shake-duration) cubic-bezier(.36, .07, .19, .97) both; + transform: translate3d(0, 0, 0); + backface-visibility: hidden; + perspective: 1000px; +} + +#opponent-panel.dissolving { + opacity: 0; + transform: scale(0.9) translateY(20px); + transition: opacity var(--dissolve-duration) ease-in, transform var(--dissolve-duration) ease-in; + pointer-events: none; +} + +@keyframes shake-short { + 0%, 100% { transform: translateX(0); } + 25% { transform: translateX(-3px); } + 50% { transform: translateX(3px); } + 75% { transform: translateX(-3px); } +} + +.shake-short { + animation: shake-short 0.3s ease-in-out; +} + +/* --- Отзывчивость (Медиа-запросы) --- */ +@media (max-width: 900px) { + body { + height: auto; min-height: 100vh; /* Из серверной, чтобы обеспечить высоту */ + overflow-y: auto; + padding: 5px 0; font-size: 15px; + justify-content: flex-start; + } + .auth-game-setup-wrapper { + max-height: none; + padding-top: 60px; /* Отступ для #user-info из локальной */ + } + /* === ИЗМЕНЕНИЕ: Адаптация #user-info (из локальной версии) === */ + #user-info { top: 5px; right: 10px; } + #user-info p { font-size: 0.85em; } + #logout-button { padding: 5px 10px !important; font-size: 0.75em !important; } + /* === КОНЕЦ ИЗМЕНЕНИЯ === */ + + .game-wrapper { padding: 5px; gap: 5px; height: auto; min-height: calc(100vh - 10px); width: 100%; } /* min-height и width из серверной */ + /* === ИЗМЕНЕНИЕ: game-header удален (из локальной версии) === */ + + /* Показываем кнопки переключения на мобильных - ИЗ СЕРВЕРНОЙ ВЕРСИИ */ + .panel-switcher-controls { + display: flex; + } + + .battle-arena-container { + /* flex-direction: column; height: auto; overflow: visible; - из локальной версии заменяется логикой ниже */ + gap: 0; /* Убираем отступ между колонками, т.к. они будут накладываться - ИЗ СЕРВЕРНОЙ ВЕРСИИ */ + /* position: relative; overflow: hidden; flex-grow: 1; min-height: 350px; - Эти стили уже есть глобально, но тут подтверждаем */ + } + + /* Стили для колонок при переключении - ИЗ СЕРВЕРНОЙ ВЕРСИИ */ + .player-column, + .opponent-column { + /* width: 100%; height: auto; overflow: visible; - из локальной версии заменяется логикой ниже */ + position: absolute; /* Для наложения */ + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow-y: auto; /* Прокрутка содержимого колонки */ + transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out; + padding: 5px; /* Добавлено для отступов внутри колонок на мобильных */ + gap: 8px; /* Добавлено для отступов между панелями внутри колонок */ + } + + .player-column { transform: translateX(0); opacity: 1; z-index: 10; pointer-events: auto; } + .opponent-column { transform: translateX(100%); opacity: 0; z-index: 5; pointer-events: none; } + + .battle-arena-container.show-opponent-panel .player-column { transform: translateX(-100%); opacity: 0; z-index: 5; pointer-events: none; } + .battle-arena-container.show-opponent-panel .opponent-column { transform: translateX(0); opacity: 1; z-index: 10; pointer-events: auto; } + + + .fighter-panel, .controls-panel-new, .battle-log-new { + min-height: auto; /* Высота по контенту */ + height: auto; + padding: 10px; + flex-grow: 0; /* Локальное */ + flex-shrink: 1; /* Локальное */ + } + .fighter-panel { flex-shrink: 0; } /* Из серверной для panel-switcher */ + .fighter-panel .panel-content { flex-grow: 1; min-height: 0; } /* Из серверной для panel-switcher */ + + .controls-panel-new { min-height: 200px; flex-shrink: 0; } /* flex-shrink из серверной */ + .battle-log-new { height: auto; min-height: 150px; flex-shrink: 0; } /* flex-shrink из серверной */ + + #log-list { max-height: 200px; } + .abilities-grid { max-height: none; overflow-y: visible; padding-bottom: 8px; } + .abilities-grid::after { display: none; } + .ability-list, .controls-layout { overflow: visible; } /* Локальное */ + .fighter-name { font-size: 1.3em; } + .panel-content { margin-top: 10px; /* Локальное, но теперь panel-content изменен для серверного panel-switcher, возможно, не нужно */ } + .stat-bar-container .bar-icon { font-size: 1.2em; } + .bar { height: 18px; } + .effects-area, .effect { font-size: 0.85em; } + #turn-indicator { font-size: 1.2em; margin-bottom: 8px; } + .turn-timer-display { font-size: 0.85em; margin-bottom: 8px; padding: 4px; } + #turn-timer { font-size: 1em; } + .action-button.basic { font-size: 0.8em; padding: 8px 4px; } + .abilities-grid { grid-template-columns: repeat(auto-fit, minmax(80px, 1fr)); gap: 8px; padding: 8px; } + .ability-button { font-size: 0.75em; padding: 5px; } + .ability-button .ability-name { margin-bottom: 2px; } + .ability-button .ability-desc { font-size: 0.65em; } + .modal-content { padding: 25px 30px; width: 90%; max-width: 400px; } + .modal-content h2#result-message { font-size: 1.8em; } + .modal-action-button { font-size: 1em; padding: 10px 20px; } + #game-setup { max-width: 95%; padding: 15px; } + #game-setup h2 { font-size: 1.6em; } + #game-setup h3 { font-size: 1.1em; } + #game-setup button { padding: 8px 12px; font-size: 0.9em; } + #game-setup input[type="text"] { width: calc(100% - 90px); max-width: 200px; padding: 8px; } + #available-games-list { max-height: 180px; } + .character-selection label { margin: 0 10px; font-size: 1em; } +} + +@media (max-width: 480px) { + body { font-size: 14px; } + /* === ИЗМЕНЕНИЕ: Адаптация #user-info для мобильных (из локальной версии) === */ + .auth-game-setup-wrapper { padding-top: 50px; /* Еще немного места сверху */ } + #user-info { + top: 5px; + right: 5px; + display: flex; /* В одну строку */ + flex-direction: row; + align-items: center; + gap: 8px; + } + #user-info p { margin-bottom: 0; font-size: 0.8em; } + #logout-button { padding: 4px 8px !important; font-size: 0.7em !important; } + #logout-button i { margin-right: 3px; } + /* === КОНЕЦ ИЗМЕНЕНИЯ === */ + + /* Стили для panel-switcher на очень маленьких экранах - ИЗ СЕРВЕРНОЙ ВЕРСИИ */ + .panel-switch-button .button-text { display: none; } /* Скрываем текст, оставляем иконки */ + .panel-switch-button i { margin-right: 0; font-size: 1.2em; } + .panel-switch-button { padding: 6px 8px; } + + /* Локальные изменения */ + .fighter-name { font-size: 1.2em; } + .avatar-image { max-width: 40px; } /* Из серверной, но не противоречит */ + .abilities-grid { grid-template-columns: repeat(auto-fit, minmax(65px, 1fr)); gap: 5px; padding: 5px; padding-bottom: 10px; } + .ability-button { font-size: 0.7em; padding: 4px; } + .ability-button .ability-name { margin-bottom: 1px; } + .ability-button .ability-desc { display: none; } + #log-list { font-size: 0.8em; max-height: 150px; } + .modal-content { padding: 20px; } + .modal-content h2#result-message { font-size: 1.6em; } + .modal-action-button { font-size: 0.9em; padding: 8px 16px; } + .auth-game-setup-wrapper { padding-left: 15px; padding-right: 15px; } + #game-setup { padding: 10px; } + #game-setup h2 { font-size: 1.4em; } + #game-setup button { padding: 7px 10px; font-size: 0.85em; margin: 5px; } + #game-setup input[type="text"], + #game-setup button { display: block; width: 100%; margin-left: 0; margin-right: 0; } + #game-setup input[type="text"] { max-width: none; margin-bottom: 10px; } + #game-setup div>input[type="text"]+button { margin-top: 5px; } + #available-games-list { max-height: 120px; } + #available-games-list li button { font-size: 0.75em; padding: 5px 8px; } + .character-selection { padding: 10px; } + .character-selection label { margin: 0 5px 5px 5px; font-size: 0.9em; display: block; } + .character-selection label i { margin-right: 5px; } + #turn-indicator { font-size: 1.1em; } + .turn-timer-display { font-size: 0.8em; margin-top: -3px; margin-bottom: 6px; } + #turn-timer { font-size: 0.95em; } +} \ No newline at end of file diff --git a/server/auth/authService.js b/server/auth/authService.js new file mode 100644 index 0000000..99325c2 --- /dev/null +++ b/server/auth/authService.js @@ -0,0 +1,153 @@ +// /server/auth/authService.js +const bcrypt = require('bcryptjs'); // Для хеширования паролей +const jwt = require('jsonwebtoken'); // <<< ДОБАВЛЕНО +const db = require('../core/db'); // Путь к вашему модулю для работы с базой данных + +const SALT_ROUNDS = 10; // Количество раундов для генерации соли bcrypt + +/** + * Регистрирует нового пользователя и генерирует JWT. + * @param {string} username - Имя пользователя. + * @param {string} password - Пароль пользователя. + * @returns {Promise} Объект с результатом: { success: boolean, message: string, token?: string, userId?: number, username?: string } + */ +async function registerUser(username, password) { + console.log(`[AuthService DEBUG] registerUser called with username: "${username}"`); + + if (!username || !password) { + console.warn('[AuthService DEBUG] Validation failed: Username or password empty.'); + return { success: false, message: 'Имя пользователя и пароль не могут быть пустыми.' }; + } + if (password.length < 6) { + console.warn(`[AuthService DEBUG] Validation failed for "${username}": Password too short.`); + return { success: false, message: 'Пароль должен содержать не менее 6 символов.' }; + } + + try { + // Этап A: Проверка существующего пользователя + console.log(`[AuthService DEBUG] Stage A: Checking if user "${username}" exists...`); + // Предполагаем, что db.query возвращает массив, где первый элемент - это массив строк (результатов) + const [existingUsers] = await db.query('SELECT id FROM users WHERE username = ?', [username]); + console.log(`[AuthService DEBUG] Stage A: existingUsers query result length: ${existingUsers.length}`); + + if (existingUsers.length > 0) { + console.warn(`[AuthService DEBUG] Registration declined for "${username}": Username already taken.`); + return { success: false, message: 'Это имя пользователя уже занято.' }; + } + console.log(`[AuthService DEBUG] Stage A: Username "${username}" is available.`); + + // Этап B: Хеширование пароля + console.log(`[AuthService DEBUG] Stage B: Hashing password for user "${username}"...`); + const hashedPassword = await bcrypt.hash(password, SALT_ROUNDS); + console.log(`[AuthService DEBUG] Stage B: Password for "${username}" hashed successfully.`); + + // Этап C: Сохранение пользователя в БД + console.log(`[AuthService DEBUG] Stage C: Attempting to insert user "${username}" into DB...`); + // Предполагаем, что db.query для INSERT возвращает объект результата с insertId + const [result] = await db.query( + 'INSERT INTO users (username, password_hash) VALUES (?, ?)', + [username, hashedPassword] + ); + console.log(`[AuthService DEBUG] Stage C: DB insert result for "${username}":`, result); + + if (result && result.insertId) { + const userId = result.insertId; + // Генерируем JWT токен + const tokenPayload = { userId: userId, username: username }; + const token = jwt.sign( + tokenPayload, + process.env.JWT_SECRET, // Используем секрет из .env + { expiresIn: process.env.JWT_EXPIRES_IN || '1h' } // Используем срок из .env или по умолчанию 1 час + ); + + console.log(`[AuthService] Пользователь "${username}" успешно зарегистрирован с ID: ${userId}. Токен выдан.`); + return { + success: true, + message: 'Регистрация прошла успешно! Вы вошли в систему.', + token: token, // <<< ВОЗВРАЩАЕМ ТОКЕН + userId: userId, + username: username // Возвращаем и имя пользователя + }; + } else { + console.error(`[AuthService] Ошибка БД при регистрации пользователя "${username}": Запись не была вставлена или insertId отсутствует. Result:`, result); + return { success: false, message: 'Ошибка сервера при регистрации (данные не сохранены). Попробуйте позже.' }; + } + + } catch (error) { + console.error(`[AuthService] КРИТИЧЕСКАЯ ОШИБКА (catch block) при регистрации пользователя "${username}":`, error); + if (error.sqlMessage) { + console.error(`[AuthService] MySQL Error Message: ${error.sqlMessage}`); + console.error(`[AuthService] MySQL Error Code: ${error.code}`); + console.error(`[AuthService] MySQL Errno: ${error.errno}`); + } + return { success: false, message: 'Внутренняя ошибка сервера при регистрации.' }; + } +} + +/** + * Выполняет вход пользователя и генерирует JWT. + * @param {string} username - Имя пользователя. + * @param {string} password - Пароль пользователя. + * @returns {Promise} Объект с результатом: { success: boolean, message: string, token?: string, userId?: number, username?: string } + */ +async function loginUser(username, password) { + console.log(`[AuthService DEBUG] loginUser called with username: "${username}"`); + + if (!username || !password) { + console.warn('[AuthService DEBUG] Login validation failed: Username or password empty.'); + return { success: false, message: 'Имя пользователя и пароль не могут быть пустыми.' }; + } + + try { + console.log(`[AuthService DEBUG] Searching for user "${username}" in DB...`); + const [users] = await db.query('SELECT id, username, password_hash FROM users WHERE username = ?', [username]); + console.log(`[AuthService DEBUG] DB query result for user "${username}" (length): ${users.length}`); + + if (users.length === 0) { + console.warn(`[AuthService DEBUG] Login failed: User "${username}" not found.`); + return { success: false, message: 'Неверное имя пользователя или пароль.' }; + } + + const user = users[0]; + console.log(`[AuthService DEBUG] User "${username}" found. ID: ${user.id}. Comparing password...`); + + const passwordMatch = await bcrypt.compare(password, user.password_hash); + console.log(`[AuthService DEBUG] Password comparison result for "${username}": ${passwordMatch}`); + + if (passwordMatch) { + // Генерируем JWT токен + const tokenPayload = { userId: user.id, username: user.username }; + const token = jwt.sign( + tokenPayload, + process.env.JWT_SECRET, // Используем секрет из .env + { expiresIn: process.env.JWT_EXPIRES_IN || '1h' } // Используем срок из .env или по умолчанию 1 час + ); + + console.log(`[AuthService] Пользователь "${user.username}" (ID: ${user.id}) успешно вошел в систему. Токен выдан.`); + return { + success: true, + message: 'Вход выполнен успешно!', + token: token, // <<< ВОЗВРАЩАЕМ ТОКЕН + userId: user.id, + username: user.username // Возвращаем имя пользователя + }; + } else { + console.warn(`[AuthService DEBUG] Login failed for user "${user.username}": Incorrect password.`); + return { success: false, message: 'Неверное имя пользователя или пароль.' }; + } + + } catch (error) { + console.error(`[AuthService] КРИТИЧЕСКАЯ ОШИБКА (catch block) при входе пользователя "${username}":`, error); + if (error.sqlMessage) { + console.error(`[AuthService] MySQL Error Message: ${error.sqlMessage}`); + console.error(`[AuthService] MySQL Error Code: ${error.code}`); + console.error(`[AuthService] MySQL Errno: ${error.errno}`); + } + return { success: false, message: 'Внутренняя ошибка сервера при входе.' }; + } +} + +module.exports = { + registerUser, + loginUser +}; \ No newline at end of file diff --git a/server/bc.js b/server/bc.js new file mode 100644 index 0000000..5a79ddb --- /dev/null +++ b/server/bc.js @@ -0,0 +1,393 @@ +// /server/bc.js - Главный файл сервера Battle Club + +require('dotenv').config({ path: require('node:path').resolve(process.cwd(), '.env') }); + +const express = require('express'); +const http = require('http'); +const { Server } = require('socket.io'); +const path = require('path'); +const APP_BASE_PATH = process.env.APP_BASE_PATH || ""; +const jwt = require('jsonwebtoken'); +const cors = require('cors'); +// const cookieParser = require('cookie-parser'); // Раскомментируйте, если решите использовать куки для токена напрямую + +const authService = require('./auth/authService'); +const GameManager = require('./game/GameManager'); +const db = require('./core/db'); // Используется для auth, не для игр в этом варианте +const GAME_CONFIG = require('./core/config'); + +const app = express(); +const server = http.createServer(app); + +// --- НАСТРОЙКА EXPRESS --- +console.log(`[BC.JS CONFIG] Reading environment variables for Express CORS...`); +console.log(`[BC.JS CONFIG] NODE_ENV: ${process.env.NODE_ENV}`); +console.log(`[BC.JS CONFIG] process.env.CORS_ORIGIN_CLIENT: ${process.env.CORS_ORIGIN_CLIENT}`); +const clientOrigin = process.env.CORS_ORIGIN_CLIENT || (process.env.NODE_ENV === 'development' ? '*' : undefined); +console.log(`[BC.JS CONFIG] Effective clientOrigin for HTTP CORS: ${clientOrigin === '*' ? "'*'" : clientOrigin || 'NOT SET (CORS will likely fail if not development)'}`); + +if (!clientOrigin && process.env.NODE_ENV !== 'development' && process.env.NODE_ENV !== undefined) { + console.warn("[BC.JS CONFIG WARNING] CORS_ORIGIN_CLIENT is not set for a non-development and non-undefined NODE_ENV. HTTP API requests from browsers might be blocked by CORS."); +} +app.use(cors({ + origin: clientOrigin, + methods: ["GET", "POST"], + credentials: true // Важно для работы с куками, если они используются для токенов +})); + +app.use(express.json()); +// app.use(cookieParser()); // Раскомментируйте, если JWT будет передаваться через httpOnly cookie + +const publicPath = path.join(__dirname, '..', 'public'); +console.log(`[BC.JS CONFIG] Serving static files from: ${publicPath}`); +app.use(express.static(publicPath)); + +// --- НАСТРОЙКА EJS --- +app.set('view engine', 'ejs'); +// Указываем, где лежат шаблоны. Папка 'views' рядом с bc.js (т.е. server/views) +app.set('views', path.join(__dirname, 'views')); +console.log(`[BC.JS CONFIG] EJS view engine configured. Views directory: ${app.get('views')}`); + + +// --- HTTP МАРШРУТЫ --- + +// Главная страница, рендеринг EJS шаблона +app.get('/', (req, res) => { + // Попытка извлечь токен из localStorage (недоступно на сервере напрямую) + // или из cookie (если настроено). + // Для EJS на сервере нам нужно определить состояние пользователя ДО рендеринга. + // Это обычно делается через проверку сессии или токена в cookie. + // Так как ваш клиент хранит токен в localStorage, при первом GET запросе + // на сервер токен не будет доступен в заголовках или куках автоматически. + // + // Вариант 1: Клиент делает AJAX-запрос для проверки токена после загрузки, + // а сервер отдает базовый HTML, который потом обновляется. (Текущий подход с main.js) + // + // Вариант 2: Сервер отдает базовый HTML, и клиент сам решает, что показывать, + // основываясь на токене в localStorage. (Текущий подход с main.js) + // + // Вариант 3: Передавать токен в cookie (httpOnly для безопасности), + // тогда сервер сможет его читать при GET запросе. + // + // Для простоты демонстрации EJS, предположим, что мы хотим передать + // некоторую базовую информацию, а клиентская логика main.js все равно отработает. + // Мы не можем здесь напрямую прочитать localStorage клиента. + + res.render('index', { // Рендерим server/views/index.ejs + title: 'Battle Club RPG', // Передаем заголовок страницы + base_path:APP_BASE_PATH, + // Можно передать базовую структуру HTML, а main.js заполнит остальное + // Либо, если бы токен был в куках, мы могли бы здесь сделать: + // const userData = authService.verifyTokenFromCookie(req.cookies.jwtToken); + // isLoggedIn: !!userData, loggedInUsername: userData ? userData.username : '', ... + }); +}); + + +// --- HTTP МАРШРУТЫ АУТЕНТИФИКАЦИИ --- +app.post('/auth/register', async (req, res) => { + const { username, password } = req.body; + console.log(`[BC HTTP /auth/register] Attempt for username: "${username}" from IP: ${req.ip}. Origin: ${req.headers.origin}`); + if (!username || !password) { + console.warn('[BC HTTP /auth/register] Bad request: Username or password missing.'); + return res.status(400).json({ success: false, message: 'Имя пользователя и пароль обязательны.' }); + } + const result = await authService.registerUser(username, password); + if (result.success) { + console.log(`[BC HTTP /auth/register] Success for "${username}".`); + // Если вы используете куки для токена: + // res.cookie('jwtToken', result.token, { httpOnly: true, secure: process.env.NODE_ENV === 'production', sameSite: 'strict' }); + res.status(201).json(result); + } else { + console.warn(`[BC HTTP /auth/register] Failed for "${username}": ${result.message}`); + res.status(400).json(result); + } +}); + +app.post('/auth/login', async (req, res) => { + const { username, password } = req.body; + console.log(`[BC HTTP /auth/login] Attempt for username: "${username}" from IP: ${req.ip}. Origin: ${req.headers.origin}`); + if (!username || !password) { + console.warn('[BC HTTP /auth/login] Bad request: Username or password missing.'); + return res.status(400).json({ success: false, message: 'Имя пользователя и пароль обязательны.' }); + } + const result = await authService.loginUser(username, password); + if (result.success) { + console.log(`[BC HTTP /auth/login] Success for "${username}".`); + // Если вы используете куки для токена: + // res.cookie('jwtToken', result.token, { httpOnly: true, secure: process.env.NODE_ENV === 'production', sameSite: 'strict' }); + res.json(result); + } else { + console.warn(`[BC HTTP /auth/login] Failed for "${username}": ${result.message}`); + res.status(401).json(result); + } +}); + +// --- НАСТРОЙКА SOCKET.IO --- +console.log(`[BC.JS CONFIG] Reading environment variables for Socket.IO CORS...`); +console.log(`[BC.JS CONFIG] process.env.CORS_ORIGIN_SOCKET: ${process.env.CORS_ORIGIN_SOCKET}`); +const socketCorsOrigin = process.env.CORS_ORIGIN_SOCKET || (process.env.NODE_ENV === 'development' ? '*' : undefined); +console.log(`[BC.JS CONFIG] Effective socketCorsOrigin for Socket.IO CORS: ${socketCorsOrigin === '*' ? "'*'" : socketCorsOrigin || 'NOT SET (Socket.IO CORS will likely fail if not development)'}`); + +if (!socketCorsOrigin && process.env.NODE_ENV !== 'development' && process.env.NODE_ENV !== undefined) { + console.warn("[BC.JS CONFIG WARNING] CORS_ORIGIN_SOCKET is not set for a non-development and non-undefined NODE_ENV. Socket.IO connections from browsers might be blocked by CORS."); +} + +const io = new Server(server, { + path: '/socket.io/', + cors: { + origin: socketCorsOrigin, + methods: ["GET", "POST"], + credentials: true + }, +}); +console.log(`[BC.JS CONFIG] Socket.IO server configured with path: ${io.path()} and effective CORS origin: ${io.opts.cors.origin === '*' ? "'*'" : io.opts.cors.origin || 'NOT SET'}`); + +const gameManager = new GameManager(io); +const loggedInUsersBySocketId = {}; // Этот объект используется только для логирования в bc.js, основная логика в GameManager + +// --- MIDDLEWARE АУТЕНТИФИКАЦИИ SOCKET.IO --- +io.use(async (socket, next) => { + const token = socket.handshake.auth.token; + const clientIp = socket.handshake.headers['x-forwarded-for']?.split(',')[0].trim() || socket.handshake.address; + const originHeader = socket.handshake.headers.origin; + const socketPath = socket.nsp.name; + + console.log(`[BC Socket.IO Middleware] Auth attempt for socket ${socket.id} from IP ${clientIp}. Token ${token ? 'present' : 'absent'}. Origin: ${originHeader}. Path: ${socketPath}`); + + if (token) { + try { + const decoded = jwt.verify(token, process.env.JWT_SECRET); + socket.userData = { userId: decoded.userId, username: decoded.username }; + console.log(`[BC Socket.IO Middleware] Socket ${socket.id} authenticated for user ${decoded.username} (ID: ${decoded.userId}).`); + return next(); + } catch (err) { + console.warn(`[BC Socket.IO Middleware] Socket ${socket.id} auth failed: Invalid token. Error: ${err.message}. Proceeding as unauthenticated.`); + // Не вызываем next(new Error(...)) чтобы не отключать сокет сразу, + // а позволить клиенту обработать это (например, показать экран логина). + // Однако, если бы мы хотели строго запретить неаутентифицированные сокеты: + // return next(new Error('Authentication error: Invalid token')); + } + } else { + console.log(`[BC Socket.IO Middleware] Socket ${socket.id} has no token. Proceeding as unauthenticated.`); + } + // Если токена нет или он невалиден, все равно вызываем next() без ошибки, + // чтобы соединение установилось, но socket.userData не будет установлен. + // Логика на стороне сервера должна будет проверять наличие socket.userData. + next(); +}); + +// --- ОБРАБОТЧИКИ СОБЫТИЙ SOCKET.IO --- +io.on('connection', (socket) => { + const clientIp = socket.handshake.headers['x-forwarded-for']?.split(',')[0].trim() || socket.handshake.address; + const originHeader = socket.handshake.headers.origin; + const socketPath = socket.nsp.name; + + if (socket.userData && socket.userData.userId) { + console.log(`[BC Socket.IO Connection] Authenticated user ${socket.userData.username} (ID: ${socket.userData.userId}) connected. Socket: ${socket.id}, IP: ${clientIp}, Origin: ${originHeader}, Path: ${socketPath}`); + loggedInUsersBySocketId[socket.id] = socket.userData; // Для логирования здесь + + if (gameManager && typeof gameManager.getAvailablePvPGamesListForClient === 'function') { + console.log(`[BC Socket.IO Connection] Sending initial available PvP games list to authenticated user ${socket.userData.username} (Socket: ${socket.id})`); + const availableGames = gameManager.getAvailablePvPGamesListForClient(); + socket.emit('availablePvPGamesList', availableGames); + } else { + console.error("[BC Socket.IO Connection] CRITICAL: gameManager or getAvailablePvPGamesListForClient not found for sending initial list!"); + } + + if (gameManager && typeof gameManager.handleRequestGameState === 'function') { + gameManager.handleRequestGameState(socket, socket.userData.userId); + } else { + console.error("[BC Socket.IO Connection] CRITICAL: gameManager or handleRequestGameState not found for authenticated user!"); + } + } else { + console.log(`[BC Socket.IO Connection] Unauthenticated user connected. Socket: ${socket.id}, IP: ${clientIp}, Origin: ${originHeader}, Path: ${socketPath}.`); + // Неаутентифицированные пользователи не должны иметь доступа к игровым функциям, + // но могут получать базовую информацию, если это предусмотрено. + // Например, список игр, если он публичный (в данном проекте он для залогиненных). + // socket.emit('authRequired', { message: 'Please login to access game features.' }); // Можно отправить такое сообщение + } + + socket.on('logout', () => { // Это событие инициируется клиентом, когда он нажимает "Выйти" + const username = socket.userData?.username || 'UnknownUserOnLogout'; + const userId = socket.userData?.userId; + console.log(`[BC Socket.IO 'logout' event] User: ${username} (ID: ${userId || 'N/A'}, Socket: ${socket.id}). Performing server-side cleanup for logout.`); + + // Здесь важно не просто удалить данные из loggedInUsersBySocketId (это локальный объект для логов), + // а также убедиться, что GameManager корректно обрабатывает выход игрока из игры, если он там был. + // GameManager.handleDisconnect должен вызываться автоматически при socket.disconnect() со стороны клиента. + // Дополнительно, если logout это не просто disconnect, а явное действие: + if (userId && gameManager) { + // Если игрок был в игре, GameManager.handleDisconnect должен был отработать при последующем socket.disconnect(). + // Если нужно специфическое действие для logout перед disconnect: + // gameManager.handleExplicitLogout(userId, socket.id); // (потребовало бы добавить такой метод в GameManager) + } + + if (loggedInUsersBySocketId[socket.id]) { + delete loggedInUsersBySocketId[socket.id]; + } + socket.userData = null; // Очищаем данные пользователя на сокете + // Клиент сам вызовет socket.disconnect() и socket.connect() с новым (null) токеном. + console.log(`[BC Socket.IO 'logout' event] Session data for socket ${socket.id} cleared on server. Client is expected to disconnect and reconnect.`); + }); + + + socket.on('playerSurrender', () => { + if (!socket.userData?.userId) { + console.warn(`[BC Socket.IO 'playerSurrender'] Denied for unauthenticated socket ${socket.id}.`); + socket.emit('gameError', { message: 'Необходимо войти в систему, чтобы сдаться в игре.' }); + return; + } + const identifier = socket.userData.userId; + const username = socket.userData.username; + console.log(`[BC Socket.IO 'playerSurrender'] Request from user ${username} (ID: ${identifier}, Socket: ${socket.id})`); + if (gameManager && typeof gameManager.handlePlayerSurrender === 'function') { + gameManager.handlePlayerSurrender(identifier); + } else { + console.error("[BC Socket.IO 'playerSurrender'] CRITICAL: gameManager or handlePlayerSurrender method not found!"); + socket.emit('gameError', { message: 'Ошибка сервера при обработке сдачи игры.' }); + } + }); + + socket.on('leaveAiGame', () => { + if (!socket.userData?.userId) { + console.warn(`[BC Socket.IO 'leaveAiGame'] Denied for unauthenticated socket ${socket.id}.`); + socket.emit('gameError', { message: 'Необходимо войти в систему, чтобы покинуть AI игру.' }); + return; + } + const identifier = socket.userData.userId; + const username = socket.userData.username; + console.log(`[BC Socket.IO 'leaveAiGame'] Request from user ${username} (ID: ${identifier}, Socket: ${socket.id})`); + + if (gameManager && typeof gameManager.handleLeaveAiGame === 'function') { + gameManager.handleLeaveAiGame(identifier, socket); // Передаем сокет, если он нужен для ответа + } else { + console.error("[BC Socket.IO 'leaveAiGame'] CRITICAL: gameManager or handleLeaveAiGame method not found!"); + socket.emit('gameError', { message: 'Ошибка сервера при выходе из AI игры.' }); + } + }); + + socket.on('createGame', (data) => { + if (!socket.userData?.userId) { + console.warn(`[BC Socket.IO 'createGame'] Denied for unauthenticated socket ${socket.id}.`); + socket.emit('gameError', { message: 'Необходимо войти в систему для создания игры.' }); + return; + } + const identifier = socket.userData.userId; + const mode = data?.mode || 'ai'; + const charKey = data?.characterKey; + console.log(`[BC Socket.IO 'createGame'] Request from ${socket.userData.username} (ID: ${identifier}). Mode: ${mode}, Char: ${charKey}`); + gameManager.createGame(socket, mode, charKey, identifier); + }); + + socket.on('joinGame', (data) => { + if (!socket.userData?.userId) { + console.warn(`[BC Socket.IO 'joinGame'] Denied for unauthenticated socket ${socket.id}.`); + socket.emit('gameError', { message: 'Необходимо войти для присоединения к PvP игре.' }); + return; + } + const gameId = data?.gameId; + const userId = socket.userData.userId; // Используем userId из socket.userData + const charKey = data?.characterKey; // Клиент может предлагать персонажа при присоединении + console.log(`[BC Socket.IO 'joinGame'] Request from ${socket.userData.username} (ID: ${userId}). GameID: ${gameId}, Char: ${charKey}`); + gameManager.joinGame(socket, gameId, userId, charKey); + }); + + socket.on('findRandomGame', (data) => { + if (!socket.userData?.userId) { + console.warn(`[BC Socket.IO 'findRandomGame'] Denied for unauthenticated socket ${socket.id}.`); + socket.emit('gameError', { message: 'Необходимо войти для поиска случайной PvP игры.' }); + return; + } + const userId = socket.userData.userId; + const charKey = data?.characterKey; + console.log(`[BC Socket.IO 'findRandomGame'] Request from ${socket.userData.username} (ID: ${userId}). PrefChar: ${charKey}`); + gameManager.findAndJoinRandomPvPGame(socket, charKey, userId); + }); + + socket.on('requestPvPGameList', () => { + // Этот запрос может приходить и от неаутентифицированных, если дизайн это позволяет. + // В текущей логике GameManager, список игр формируется для залогиненных. + // Если не залогинен, можно отправить пустой список или специальное сообщение. + console.log(`[BC Socket.IO 'requestPvPGameList'] Request from socket ${socket.id} (User: ${socket.userData?.username || 'Unauth'}).`); + if (gameManager && typeof gameManager.getAvailablePvPGamesListForClient === 'function') { + const availableGames = gameManager.getAvailablePvPGamesListForClient(); // GameManager сам решит, что вернуть + socket.emit('availablePvPGamesList', availableGames); + } else { + console.error("[BC Socket.IO 'requestPvPGameList'] CRITICAL: gameManager or getAvailablePvPGamesListForClient not found!"); + socket.emit('availablePvPGamesList', []); + } + }); + + socket.on('requestGameState', () => { + if (!socket.userData?.userId) { + console.warn(`[BC Socket.IO 'requestGameState'] Denied for unauthenticated socket ${socket.id}.`); + // Важно! Клиент main.js ожидает gameNotFound, чтобы показать экран логина + socket.emit('gameNotFound', { message: 'Необходимо войти для восстановления игры.' }); + return; + } + const userId = socket.userData.userId; + console.log(`[BC Socket.IO 'requestGameState'] Request from ${socket.userData.username} (ID: ${userId}, Socket: ${socket.id})`); + gameManager.handleRequestGameState(socket, userId); + }); + + socket.on('playerAction', (actionData) => { + if (!socket.userData?.userId) { + console.warn(`[BC Socket.IO 'playerAction'] Denied for unauthenticated socket ${socket.id}. Action: ${actionData?.actionType}`); + socket.emit('gameError', { message: 'Действие не разрешено: пользователь не аутентифицирован.' }); + return; + } + const identifier = socket.userData.userId; + console.log(`[BC Socket.IO 'playerAction'] Action from ${socket.userData.username} (ID: ${identifier}). Type: ${actionData?.actionType}, Details: ${JSON.stringify(actionData)}`); + gameManager.handlePlayerAction(identifier, actionData); + }); + + socket.on('disconnect', (reason) => { + const identifier = socket.userData?.userId; // Получаем из socket.userData, если был аутентифицирован + const username = socket.userData?.username || loggedInUsersBySocketId[socket.id]?.username || 'UnauthenticatedOrUnknown'; + + console.log(`[BC Socket.IO Disconnect] User ${username} (ID: ${identifier || 'N/A'}, Socket: ${socket.id}) disconnected. Reason: ${reason}.`); + if (identifier && gameManager) { // Если пользователь был аутентифицирован + gameManager.handleDisconnect(socket.id, identifier); + } + if (loggedInUsersBySocketId[socket.id]) { // Очистка из локального объекта для логов + delete loggedInUsersBySocketId[socket.id]; + } + // socket.userData автоматически очищается при дисконнекте самого объекта сокета + }); +}); + +// --- ЗАПУСК СЕРВЕРА --- +const PORT = parseInt(process.env.BC_APP_PORT || '3200', 10); +const HOSTNAME = process.env.BC_APP_HOSTNAME || '127.0.0.1'; + +if (isNaN(PORT)) { + console.error(`[BC Server FATAL] Invalid BC_APP_PORT: "${process.env.BC_APP_PORT}". Expected a number.`); + process.exit(1); +} + +server.listen(PORT, HOSTNAME, () => { + console.log(`[BC Server Startup] Battle Club HTTP Application Server running at http://${HOSTNAME}:${PORT}`); + if (HOSTNAME === '127.0.0.1') { + console.log(`[BC Server Startup] Server is listening on localhost only.`); + } else if (HOSTNAME === '0.0.0.0') { + console.log(`[BC Server Startup] Server is listening on all available network interfaces.`); + } else { + console.log(`[BC Server Startup] Server is listening on a specific interface: ${HOSTNAME}.`); + } + console.log(`[BC Server Startup] Static files served from: ${publicPath}`); + console.log(`[BC.JS Startup] EJS views directory: ${app.get('views')}`); + console.log(`[BC.JS Startup] Socket.IO server effective path: ${io.path()}`); + console.log(`[BC.JS Startup] HTTP API effective CORS origin: ${clientOrigin === '*' ? "'*'" : clientOrigin || 'NOT SET'}`); + console.log(`[BC.JS Startup] Socket.IO effective CORS origin: ${io.opts.cors.origin === '*' ? "'*'" : io.opts.cors.origin || 'NOT SET'}`); +}); + +process.on('unhandledRejection', (reason, promise) => { + console.error('[BC Server FATAL UnhandledRejection] Reason:', reason, 'Promise:', promise); + // process.exit(1); // Можно раскомментировать для падения сервера при неперехваченных промисах +}); + +process.on('uncaughtException', (err) => { + console.error('[BC Server FATAL UncaughtException] Error:', err); + process.exit(1); // Критические ошибки должны приводить к перезапуску через process manager +}); \ No newline at end of file diff --git a/server/core/config.js b/server/core/config.js new file mode 100644 index 0000000..267a85e --- /dev/null +++ b/server/core/config.js @@ -0,0 +1,112 @@ +// /server/core/config.js + +const GAME_CONFIG = { + // --- Баланс Игры --- + BLOCK_DAMAGE_REDUCTION: 0.5, // Множитель урона при блоке (0.5 = 50% снижение) + DAMAGE_VARIATION_MIN: 0.9, // Минимальный множитель урона (0.9 = 90%) + DAMAGE_VARIATION_RANGE: 0.2, // Диапазон вариации урона (0.2 = от 90% до 110%) + HEAL_VARIATION_MIN: 0.8, // Минимальный множитель лечения (0.8 = 80%) + HEAL_VARIATION_RANGE: 0.4, // Диапазон вариации лечения (0.4 = от 80% до 120%) + NATURE_STRENGTH_MANA_REGEN: 10, // Количество маны, восстанавливаемое "Силой природы" (и ее аналогом) + + // --- Условия ИИ и Игрока --- + OPPONENT_HEAL_THRESHOLD_PERCENT: 50, // Процент HP Баларда, НИЖЕ которого он будет пытаться лечиться (для AI) + PLAYER_MERCY_TAUNT_THRESHOLD_PERCENT: 60, // Процент HP Баларда, НИЖЕ которого Елена использует "доминирующие" насмешки (для AI/текстов) + PLAYER_HP_BLEED_THRESHOLD_PERCENT: 60, // % HP Елены, НИЖЕ которого Балард предпочитает Кровотечение Безмолвию (для AI) + BALARD_MANA_DRAIN_HIGH_MANA_THRESHOLD: 60, // % Маны Елены, ВЫШЕ которого Балард может использовать "Похищение Света" (для AI) + + // --- Способности Баларда (AI) - Конфигурация --- + SILENCE_DURATION: 3, // Длительность Безмолвия в ходах Елены (после хода Баларда) + SILENCE_SUCCESS_RATE: 0.7, // Шанс успеха наложения Безмолвия (70%) + BALARD_SILENCE_ABILITY_COST: 15, // Стоимость "Эха Безмолвия" в Ярости + BALARD_SILENCE_INTERNAL_COOLDOWN: 5, // К-во ходов Баларда КД ПОСЛЕ успешного использования Безмолвия + // BALARD_BLEED_COST: 15, // Если будете добавлять способность Кровотечение + // BALARD_BLEED_POWER: 5, + // BALARD_BLEED_DURATION: 2, + // BALARD_BLEED_COOLDOWN: 3, + + // --- Таймер Хода --- + TURN_DURATION_SECONDS: 60, // Длительность хода в секундах + TURN_DURATION_MS: 60 * 1000, // Длительность хода в миллисекундах + TIMER_UPDATE_INTERVAL_MS: 1000, // Интервал обновления таймера на клиенте (в мс) + RECONNECT_TIMEOUT_MS: 30000, + + // --- Идентификаторы и Типы --- + PLAYER_ID: 'player', // Технический идентификатор для слота 'Игрок 1' + OPPONENT_ID: 'opponent', // Технический идентификатор для слота 'Игрок 2' / 'Противник' + ACTION_TYPE_HEAL: 'heal', + ACTION_TYPE_DAMAGE: 'damage', + ACTION_TYPE_BUFF: 'buff', + ACTION_TYPE_DISABLE: 'disable', // Тип для контроля (безмолвие, стан и т.п.) + ACTION_TYPE_DEBUFF: 'debuff', // Тип для ослаблений, DoT и т.п. + ACTION_TYPE_DRAIN: 'drain', // Тип для Похищения Света + + // --- Строки для UI (могут быть полезны и на сервере для логов) --- + STATUS_READY: 'Готов(а)', // Сделал универсальным + STATUS_BLOCKING: 'Защищается', + + // --- Типы Логов (для CSS классов на клиенте, и для структурирования на сервере) --- + LOG_TYPE_INFO: 'info', + LOG_TYPE_DAMAGE: 'damage', + LOG_TYPE_HEAL: 'heal', + LOG_TYPE_TURN: 'turn', + LOG_TYPE_SYSTEM: 'system', + LOG_TYPE_BLOCK: 'block', + LOG_TYPE_EFFECT: 'effect', + + // --- CSS Классы (в основном для клиента, но константы могут быть полезны для согласованности) --- + CSS_CLASS_BLOCKING: 'blocking', + CSS_CLASS_NOT_ENOUGH_RESOURCE: 'not-enough-resource', + CSS_CLASS_BUFF_IS_ACTIVE: 'buff-is-active', + CSS_CLASS_ATTACK_BUFFED: 'attack-buffed', + CSS_CLASS_SHAKING: 'is-shaking', + CSS_CLASS_CASTING_PREFIX: 'is-casting-', // Например: is-casting-fireball + CSS_CLASS_HIDDEN: 'hidden', + CSS_CLASS_ABILITY_BUTTON: 'ability-button', + CSS_CLASS_ABILITY_SILENCED: 'is-silenced', + CSS_CLASS_ABILITY_ON_COOLDOWN: 'is-on-cooldown', // Для отображения кулдауна + + // --- Задержки (в миллисекундах) --- + // Эти задержки теперь в основном будут управляться сервером при отправке событий или планировании AI ходов + DELAY_OPPONENT_TURN: 1200, // Задержка перед ходом AI + DELAY_AFTER_PLAYER_ACTION: 500, // Сервер может использовать это для паузы перед следующим событием + // DELAY_AFTER_BLOCK: 500, // Менее релевантно для сервера напрямую + DELAY_INIT: 100, // Для клиентской инициализации, если нужна + DELAY_BEFORE_VICTORY_MODAL: 1500, // Для клиента, после получения gameOver + MODAL_TRANSITION_DELAY: 10, // Для анимации модалки на клиенте + + // --- Длительности анимаций (в миллисекундах, в основном для клиента, но сервер может знать для таймингов) --- + ANIMATION_SHAKE_DURATION: 400, + ANIMATION_CAST_DURATION: 600, + ANIMATION_DISSOLVE_DURATION: 6000, // var(--dissolve-duration) из CSS + + // --- Внутренние ID способностей (для удобства в логике, нужны и на сервере, и на клиенте) --- + // Игрока (Елена) + ABILITY_ID_HEAL: 'heal', // Малое Исцеление + ABILITY_ID_FIREBALL: 'fireball', // Огненный Шар + ABILITY_ID_NATURE_STRENGTH: 'naturesStrength', // Сила Природы + ABILITY_ID_DEFENSE_AURA: 'defenseAura', // Аура Защиты + ABILITY_ID_HYPNOTIC_GAZE: 'hypnoticGaze', // Гипнотический взгляд + ABILITY_ID_SEAL_OF_WEAKNESS: 'sealOfWeakness', // Печать Слабости + + // Противника (Балард - AI) + ABILITY_ID_BALARD_HEAL: 'darkPatronage', // Покровительство Тьмы + ABILITY_ID_BALARD_SILENCE: 'echoesOfSilence', // Эхо Безмолвия + ABILITY_ID_BALARD_MANA_DRAIN: 'manaDrainHeal', // Похищение Света + // ABILITY_ID_BALARD_BLEED: 'balardBleed', // Если будете добавлять + + // Противника (Альмагест - PvP - зеркало Елены) + ABILITY_ID_ALMAGEST_HEAL: 'darkHeal', // Темное Восстановление (Аналог heal) + ABILITY_ID_ALMAGEST_DAMAGE: 'shadowBolt', // Теневой Сгусток (Аналог fireball) + ABILITY_ID_ALMAGEST_BUFF_ATTACK: 'shadowEmpowerment', // Усиление Тьмой (Аналог naturesStrength) + ABILITY_ID_ALMAGEST_BUFF_DEFENSE: 'voidShield', // Щит Пустоты (Аналог defenseAura) + ABILITY_ID_ALMAGEST_DISABLE: 'mindShatter', // Раскол Разума (Аналог hypnoticGaze) + ABILITY_ID_ALMAGEST_DEBUFF: 'curseOfDecay', // Проклятие Увядания (Аналог sealOfWeakness) +}; + +// Для использования в Node.js модулях +if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { + module.exports = GAME_CONFIG; +} + +// console.log("config.js loaded from server/core/ and GAME_CONFIG object created/exported."); \ No newline at end of file diff --git a/server/core/db.js b/server/core/db.js new file mode 100644 index 0000000..eb9e4b6 --- /dev/null +++ b/server/core/db.js @@ -0,0 +1,94 @@ +// /server/core/db.js +require('dotenv').config({ path: require('node:path').resolve(process.cwd(), '.env') }); // Загружаем переменные из .env в process.env +const mysql = require('mysql2'); // Используем mysql2 для поддержки промисов и улучшенной производительности + +// Конфигурация подключения к вашей базе данных MySQL +// Значения теперь берутся из переменных окружения (файла .env) +const dbConfig = { + host: process.env.DB_HOST || 'localhost', + user: process.env.DB_USER, // Обязательно должно быть задано в .env + password: process.env.DB_PASSWORD, // Обязательно должно быть задано в .env + database: process.env.DB_NAME, // Обязательно должно быть задано в .env + port: parseInt(process.env.DB_PORT || '3306', 10), // Порт по умолчанию 3306, если не указан + waitForConnections: process.env.DB_WAIT_FOR_CONNECTIONS ? (process.env.DB_WAIT_FOR_CONNECTIONS === 'true') : true, + connectionLimit: parseInt(process.env.DB_CONNECTION_LIMIT || '10', 10), + queueLimit: parseInt(process.env.DB_QUEUE_LIMIT || '0', 10) +}; + +// Проверка, что все обязательные переменные окружения для БД заданы +if (!dbConfig.user || !dbConfig.password || !dbConfig.database || !dbConfig.host) { + console.error('[DB FATAL] Не все обязательные переменные окружения для БД заданы!'); + console.error('Убедитесь, что у вас есть файл .env в корне проекта и он содержит как минимум:'); + console.error('DB_HOST, DB_USER, DB_PASSWORD, DB_NAME'); + console.error('Текущие загруженные (некоторые могут быть undefined):'); + console.error(` DB_HOST: ${process.env.DB_HOST}`); + console.error(` DB_USER: ${process.env.DB_USER}`); + console.error(` DB_PASSWORD: ${process.env.DB_PASSWORD ? '****** (задано)' : 'undefined'}`); // Не выводим пароль в лог + console.error(` DB_NAME: ${process.env.DB_NAME}`); + console.error(` DB_PORT: ${process.env.DB_PORT}`); + process.exit(1); // Завершаем приложение, так как без БД оно не сможет работать корректно. +} + +// Создаем пул соединений. +let pool; +try { + pool = mysql.createPool(dbConfig); + console.log('[DB] Пул соединений MySQL успешно создан с конфигурацией из переменных окружения.'); +} catch (error) { + console.error('[DB FATAL] Не удалось создать пул соединений MySQL. Проверьте конфигурацию и переменные окружения. Ошибка:', error); + process.exit(1); +} + +// Обертка для выполнения запросов с использованием промисов из пула +const promisePool = pool.promise(); + +// Проверка соединения (опционально, но полезно для отладки при запуске) +if (promisePool) { + promisePool.getConnection() + .then(connection => { + console.log(`[DB] Успешно подключено к базе данных MySQL (${dbConfig.database}) на ${dbConfig.host}:${dbConfig.port} и получено соединение из пула.`); + connection.release(); + console.log('[DB] Соединение возвращено в пул.'); + }) + .catch(err => { + console.error('[DB] Ошибка при попытке получить соединение из пула или при подключении к MySQL:', err.message); + // Выводим полный объект ошибки для диагностики, если это не просто ошибка конфигурации + if (err.code !== 'ER_ACCESS_DENIED_ERROR' && err.code !== 'ER_BAD_DB_ERROR' && err.code !== 'ECONNREFUSED') { + console.error('[DB] Полные детали ошибки:', err); + } + + if (err.code === 'PROTOCOL_CONNECTION_LOST') { + console.error('[DB] Соединение с БД было потеряно.'); + } else if (err.code === 'ER_CON_COUNT_ERROR') { + console.error('[DB] В БД слишком много соединений.'); + } else if (err.code === 'ECONNREFUSED') { + console.error(`[DB] Соединение с БД было отклонено. Убедитесь, что сервер MySQL запущен и доступен по адресу ${dbConfig.host}:${dbConfig.port}.`); + } else if (err.code === 'ER_ACCESS_DENIED_ERROR') { + console.error(`[DB] Доступ к БД запрещен для пользователя '${dbConfig.user}'. Проверьте имя пользователя и пароль в вашем файле .env.`); + } else if (err.code === 'ER_BAD_DB_ERROR') { + console.error(`[DB] База данных "${dbConfig.database}" не найдена. Убедитесь, что она создана на сервере MySQL и указана верно в .env (DB_NAME).`); + } else { + console.error(`[DB] Неизвестная ошибка подключения к MySQL. Код: ${err.code}`); + } + // process.exit(1); // Раскомментируйте, если хотите падать при ошибке подключения + }); +} else { + console.error('[DB FATAL] promisePool не был создан. Это не должно было случиться.'); + process.exit(1); +} + +// Экспортируем пул с промисами +module.exports = promisePool; + +/* +Пример SQL для создания таблицы пользователей (если ее еще нет): + +CREATE TABLE IF NOT EXISTS users ( + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(255) NOT NULL UNIQUE, + password_hash VARCHAR(255) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +*/ \ No newline at end of file diff --git a/server/core/logger.js b/server/core/logger.js new file mode 100644 index 0000000..1a8485d --- /dev/null +++ b/server/core/logger.js @@ -0,0 +1,93 @@ +// /server/core/logger.js + +/** + * Простой логгер-обертка. + * В будущем можно заменить на более продвинутое решение (Winston, Pino), + * сохранив этот же интерфейс. + */ + +const LOG_LEVELS = { + DEBUG: 'DEBUG', + INFO: 'INFO', + WARN: 'WARN', + ERROR: 'ERROR', + FATAL: 'FATAL' +}; + +// Можно установить минимальный уровень логирования из переменной окружения или конфига +const CURRENT_LOG_LEVEL = process.env.LOG_LEVEL || LOG_LEVELS.INFO; + +function shouldLog(level) { + const levelsOrder = [LOG_LEVELS.DEBUG, LOG_LEVELS.INFO, LOG_LEVELS.WARN, LOG_LEVELS.ERROR, LOG_LEVELS.FATAL]; + return levelsOrder.indexOf(level) >= levelsOrder.indexOf(CURRENT_LOG_LEVEL); +} + +function formatMessage(level, moduleName, message, ...optionalParams) { + const timestamp = new Date().toISOString(); + let formattedMessage = `${timestamp} [${level}]`; + if (moduleName) { + formattedMessage += ` [${moduleName}]`; + } + formattedMessage += `: ${message}`; + + // Обработка дополнительных параметров (например, объектов ошибок) + const paramsString = optionalParams.map(param => { + if (param instanceof Error) { + return `\n${param.stack || param.message}`; + } + if (typeof param === 'object') { + try { + return `\n${JSON.stringify(param, null, 2)}`; + } catch (e) { + return '\n[Unserializable Object]'; + } + } + return param; + }).join(' '); + + return `${formattedMessage}${paramsString ? ' ' + paramsString : ''}`; +} + +const logger = { + debug: (moduleName, message, ...optionalParams) => { + if (shouldLog(LOG_LEVELS.DEBUG)) { + console.debug(formatMessage(LOG_LEVELS.DEBUG, moduleName, message, ...optionalParams)); + } + }, + info: (moduleName, message, ...optionalParams) => { + if (shouldLog(LOG_LEVELS.INFO)) { + console.info(formatMessage(LOG_LEVELS.INFO, moduleName, message, ...optionalParams)); + } + }, + warn: (moduleName, message, ...optionalParams) => { + if (shouldLog(LOG_LEVELS.WARN)) { + console.warn(formatMessage(LOG_LEVELS.WARN, moduleName, message, ...optionalParams)); + } + }, + error: (moduleName, message, ...optionalParams) => { + if (shouldLog(LOG_LEVELS.ERROR)) { + console.error(formatMessage(LOG_LEVELS.ERROR, moduleName, message, ...optionalParams)); + } + }, + fatal: (moduleName, message, ...optionalParams) => { // Fatal обычно означает, что приложение не может продолжать работу + if (shouldLog(LOG_LEVELS.FATAL)) { + console.error(formatMessage(LOG_LEVELS.FATAL, moduleName, message, ...optionalParams)); + // В реальном приложении здесь может быть process.exit(1) после логирования + } + }, + // Generic log function if needed, defaults to INFO + log: (moduleName, message, ...optionalParams) => { + logger.info(moduleName, message, ...optionalParams); + } +}; + +module.exports = logger; + +/* +Пример использования в другом файле: +const logger = require('../core/logger'); // Путь зависит от местоположения + +logger.info('GameManager', 'Новая игра создана', { gameId: '123', mode: 'pvp' }); +logger.error('AuthService', 'Ошибка аутентификации пользователя', new Error('Пароль неверный')); +logger.debug('GameInstance', 'Состояние игрока обновлено:', playerStateObject); +*/ \ No newline at end of file diff --git a/server/data/characterAbilities.js b/server/data/characterAbilities.js new file mode 100644 index 0000000..c90b926 --- /dev/null +++ b/server/data/characterAbilities.js @@ -0,0 +1,178 @@ +// /server/data/characterAbilities.js + +const GAME_CONFIG = require('../core/config'); // Путь к конфигу из server/data/ в server/core/ + +// Способности Игрока (Елена) +const elenaAbilities = [ + { + id: GAME_CONFIG.ABILITY_ID_HEAL, + name: 'Малое Исцеление', + cost: 20, + type: GAME_CONFIG.ACTION_TYPE_HEAL, + power: 30, + description: 'Восстанавливает ~30 HP' + }, + { + id: GAME_CONFIG.ABILITY_ID_FIREBALL, + name: 'Огненный Шар', + cost: 30, + type: GAME_CONFIG.ACTION_TYPE_DAMAGE, + power: 25, + description: 'Наносит ~25 урона врагу' + }, + { + id: GAME_CONFIG.ABILITY_ID_NATURE_STRENGTH, + name: 'Сила Природы', + cost: 15, + type: GAME_CONFIG.ACTION_TYPE_BUFF, + duration: 4, // Общая длительность эффекта + // Описание теперь может использовать configToUse (который будет GAME_CONFIG) + descriptionFunction: (configToUse, opponentBaseStats) => `Восст. ${configToUse.NATURE_STRENGTH_MANA_REGEN} маны при след. атаке. Эффект длится ${4 - 1} хода после применения.`, + isDelayed: true // Этот эффект применяется ПОСЛЕ следующей атаки, а не сразу + }, + { + id: GAME_CONFIG.ABILITY_ID_DEFENSE_AURA, + name: 'Аура Защиты', + cost: 15, + type: GAME_CONFIG.ACTION_TYPE_BUFF, + duration: 3, + grantsBlock: true, // Дает эффект блока на время действия + descriptionFunction: (configToUse, opponentBaseStats) => `Снижает урон на ${configToUse.BLOCK_DAMAGE_REDUCTION * 100}% (${3} хода)` + }, + { + id: GAME_CONFIG.ABILITY_ID_HYPNOTIC_GAZE, + name: 'Гипнотический взгляд', + cost: 30, + type: GAME_CONFIG.ACTION_TYPE_DISABLE, + effectDuration: 2, // Длительность безмолвия в ходах противника + cooldown: 6, + power: 5, // Урон в ход от взгляда + description: 'Накладывает на противника полное безмолвие на 2 хода и наносит 5 урона каждый его ход. КД: 6 х.' + }, + { + id: GAME_CONFIG.ABILITY_ID_SEAL_OF_WEAKNESS, + name: 'Печать Слабости', + cost: 30, + type: GAME_CONFIG.ACTION_TYPE_DEBUFF, + effectDuration: 3, // Длительность дебаффа + power: 10, // Количество ресурса противника, сжигаемое каждый ход + cooldown: 5, + // Описание теперь может адаптироваться к ресурсу оппонента + descriptionFunction: (configToUse, oppStats) => `Накладывает печать, сжигающую 10 ${oppStats ? oppStats.resourceName : 'ресурса'} противника каждый его ход в течение 3 ходов. КД: 5 х.` + } +]; + +// Способности Противника (Балард - AI) +const balardAbilities = [ + { + id: GAME_CONFIG.ABILITY_ID_BALARD_HEAL, + name: 'Покровительство Тьмы', + cost: 20, + type: GAME_CONFIG.ACTION_TYPE_HEAL, + power: 25, + successRate: 0.60, // Шанс успеха + description: 'Исцеляет ~25 HP с 60% шансом', + // Условие для AI: HP ниже порога + condition: (opSt, plSt, currentGameState, configToUse) => { + return (opSt.currentHp / opSt.maxHp) * 100 < configToUse.OPPONENT_HEAL_THRESHOLD_PERCENT; + } + }, + { + id: GAME_CONFIG.ABILITY_ID_BALARD_SILENCE, + name: 'Эхо Безмолвия', + cost: GAME_CONFIG.BALARD_SILENCE_ABILITY_COST, + type: GAME_CONFIG.ACTION_TYPE_DISABLE, + descriptionFunction: (configToUse, opponentBaseStats) => `Шанс ${configToUse.SILENCE_SUCCESS_RATE * 100}% заглушить случайное заклинание Елены на ${configToUse.SILENCE_DURATION} х.`, + condition: (opSt, plSt, currentGameState, configToUse) => { + const hpPercent = (opSt.currentHp / opSt.maxHp) * 100; + const isElenaAlreadySilenced = currentGameState?.player.disabledAbilities?.length > 0 || + currentGameState?.player.activeEffects?.some(eff => eff.id.startsWith('playerSilencedOn_')); // Проверяем и специфичное, и общее безмолвие на цели + const isElenaFullySilenced = currentGameState?.player.activeEffects?.some(eff => eff.isFullSilence && eff.turnsLeft > 0); + + return hpPercent >= configToUse.OPPONENT_HEAL_THRESHOLD_PERCENT && !isElenaAlreadySilenced && !isElenaFullySilenced && (opSt.silenceCooldownTurns === undefined || opSt.silenceCooldownTurns <= 0); + }, + successRateFromConfig: 'SILENCE_SUCCESS_RATE', + durationFromConfig: 'SILENCE_DURATION', + internalCooldownFromConfig: 'BALARD_SILENCE_INTERNAL_COOLDOWN' + }, + { + id: GAME_CONFIG.ABILITY_ID_BALARD_MANA_DRAIN, + name: 'Похищение Света', + cost: 10, + type: GAME_CONFIG.ACTION_TYPE_DRAIN, + powerManaDrain: 5, + powerDamage: 5, + powerHealthGainFactor: 1.0, + description: `Вытягивает 5 Маны у Елены, наносит 5 урона и восстанавливает себе здоровье (100% от украденного).`, + condition: (opSt, plSt, currentGameState, configToUse) => { + const playerManaPercent = (plSt.currentResource / plSt.maxResource) * 100; + const playerHasHighMana = playerManaPercent > (configToUse.BALARD_MANA_DRAIN_HIGH_MANA_THRESHOLD || 60); + return playerHasHighMana && (opSt.manaDrainCooldownTurns === undefined || opSt.manaDrainCooldownTurns <= 0); + }, + internalCooldownValue: 3 + } +]; + +// Способности Альмагест (PvP - зеркало Елены) +const almagestAbilities = [ + { + id: GAME_CONFIG.ABILITY_ID_ALMAGEST_HEAL, + name: 'Темное Восстановление', + cost: 20, + type: GAME_CONFIG.ACTION_TYPE_HEAL, + power: 30, + description: 'Поглощает жизненные тени, восстанавливая ~30 HP' + }, + { + id: GAME_CONFIG.ABILITY_ID_ALMAGEST_DAMAGE, + name: 'Теневой Сгусток', + cost: 30, + type: GAME_CONFIG.ACTION_TYPE_DAMAGE, + power: 25, + description: 'Запускает сгусток чистой тьмы, нанося ~25 урона врагу' + }, + { + id: GAME_CONFIG.ABILITY_ID_ALMAGEST_BUFF_ATTACK, + name: 'Усиление Тьмой', + cost: 15, + type: GAME_CONFIG.ACTION_TYPE_BUFF, + duration: 4, + descriptionFunction: (configToUse, opponentBaseStats) => `Восст. ${configToUse.NATURE_STRENGTH_MANA_REGEN} Темной Энергии при след. атаке. Эффект длится ${4 - 1} хода после применения.`, + isDelayed: true + }, + { + id: GAME_CONFIG.ABILITY_ID_ALMAGEST_BUFF_DEFENSE, + name: 'Щит Пустоты', + cost: 15, + type: GAME_CONFIG.ACTION_TYPE_BUFF, + duration: 3, + grantsBlock: true, + descriptionFunction: (configToUse, opponentBaseStats) => `Создает щит, снижающий урон на ${configToUse.BLOCK_DAMAGE_REDUCTION * 100}% (${3} хода)` + }, + { + id: GAME_CONFIG.ABILITY_ID_ALMAGEST_DISABLE, + name: 'Раскол Разума', + cost: 30, + type: GAME_CONFIG.ACTION_TYPE_DISABLE, + effectDuration: 2, + cooldown: 6, + power: 5, + description: 'Вторгается в разум противника, накладывая полное безмолвие на 2 хода и нанося 5 урона каждый его ход. КД: 6 х.' + }, + { + id: GAME_CONFIG.ABILITY_ID_ALMAGEST_DEBUFF, + name: 'Проклятие Увядания', + cost: 30, + type: GAME_CONFIG.ACTION_TYPE_DEBUFF, + effectDuration: 3, + power: 10, + cooldown: 5, + descriptionFunction: (configToUse, oppStats) => `Накладывает проклятие, истощающее 10 ${oppStats ? oppStats.resourceName : 'ресурса'} противника каждый его ход в течение 3 ходов. КД: 5 х.` + } +]; + +module.exports = { + elenaAbilities, + balardAbilities, + almagestAbilities +}; \ No newline at end of file diff --git a/server/data/characterStats.js b/server/data/characterStats.js new file mode 100644 index 0000000..3695bc4 --- /dev/null +++ b/server/data/characterStats.js @@ -0,0 +1,47 @@ +// /server/data/characterStats.js + +const GAME_CONFIG = require('../core/config'); // Путь к конфигу из server/data/ в server/core/ + +// --- Базовые Статы Персонажей --- + +const elenaBaseStats = { + id: GAME_CONFIG.PLAYER_ID, // Технический ID слота (может быть player или opponent в PvP) + characterKey: 'elena', // Уникальный ключ персонажа + name: "Елена", + maxHp: 120, + maxResource: 150, + attackPower: 15, + resourceName: "Мана", + avatarPath: 'images/elena_avatar.webp' // Путь к аватару +}; + +const balardBaseStats = { // Балард (для AI и, возможно, PvP) + id: GAME_CONFIG.OPPONENT_ID, // Технический ID слота (обычно opponent) + characterKey: 'balard', // Уникальный ключ персонажа + name: "Балард", + maxHp: 140, + maxResource: 100, + attackPower: 20, + resourceName: "Ярость", + avatarPath: 'images/balard_avatar.jpg' // Путь к аватару +}; + +const almagestBaseStats = { // Альмагест (для PvP) + id: GAME_CONFIG.OPPONENT_ID, // Технический ID слота (может быть player или opponent в PvP) + characterKey: 'almagest', // Уникальный ключ персонажа + name: "Альмагест", + maxHp: 120, // Статы как у Елены для зеркальности + maxResource: 150, + attackPower: 15, + resourceName: "Темная Энергия", + avatarPath: 'images/almagest_avatar.webp' // Путь к аватару +}; + +// Можно добавить других персонажей здесь, если потребуется + +module.exports = { + elenaBaseStats, + balardBaseStats, + almagestBaseStats + // ...и другие персонажи +}; \ No newline at end of file diff --git a/server/data/dataUtils.js b/server/data/dataUtils.js new file mode 100644 index 0000000..e9f0c9b --- /dev/null +++ b/server/data/dataUtils.js @@ -0,0 +1,72 @@ +// /server/data/dataUtils.js + +// Импортируем непосредственно определенные статы и способности +const { elenaBaseStats, balardBaseStats, almagestBaseStats } = require('./characterStats'); +const { elenaAbilities, balardAbilities, almagestAbilities } = require('./characterAbilities'); +// const { tauntSystem } = require('./taunts'); // Если нужны утилиты для насмешек + +/** + * Получает полный набор данных для персонажа по его ключу. + * Включает базовые статы и список способностей. + * @param {string} characterKey - Ключ персонажа ('elena', 'balard', 'almagest'). + * @returns {{baseStats: object, abilities: Array}|null} Объект с данными или null, если ключ неизвестен. + */ +function getCharacterData(characterKey) { + if (!characterKey) { + console.warn("[DataUtils] getCharacterData_called_with_null_or_undefined_key"); + return null; + } + switch (characterKey.toLowerCase()) { // Приводим к нижнему регистру для надежности + case 'elena': + return { baseStats: elenaBaseStats, abilities: elenaAbilities }; + case 'balard': + return { baseStats: balardBaseStats, abilities: balardAbilities }; + case 'almagest': + return { baseStats: almagestBaseStats, abilities: almagestAbilities }; + default: + console.error(`[DataUtils] getCharacterData: Unknown character key "${characterKey}"`); + return null; + } +} + +/** + * Получает только базовые статы для персонажа по его ключу. + * @param {string} characterKey - Ключ персонажа. + * @returns {object|null} Объект базовых статов или null. + */ +function getCharacterBaseStats(characterKey) { + const charData = getCharacterData(characterKey); + return charData ? charData.baseStats : null; +} + +/** + * Получает только список способностей для персонажа по его ключу. + * @param {string} characterKey - Ключ персонажа. + * @returns {Array|null} Массив способностей или null. + */ +function getCharacterAbilities(characterKey) { + const charData = getCharacterData(characterKey); + return charData ? charData.abilities : null; +} + +/** + * Получает имя персонажа по его ключу. + * @param {string} characterKey - Ключ персонажа. + * @returns {string|null} Имя персонажа или null. + */ +function getCharacterName(characterKey) { + const baseStats = getCharacterBaseStats(characterKey); + return baseStats ? baseStats.name : null; +} + +// Можно добавить другие утилитарные функции по мере необходимости, +// например, для поиска конкретной способности по ID у персонажа, +// или для получения данных для инициализации gameState и т.д. + +module.exports = { + getCharacterData, + getCharacterBaseStats, + getCharacterAbilities, + getCharacterName + // ...другие экспортируемые утилиты +}; \ No newline at end of file diff --git a/server/data/index.js b/server/data/index.js new file mode 100644 index 0000000..b126ba9 --- /dev/null +++ b/server/data/index.js @@ -0,0 +1,75 @@ +// /server/data/index.js + +// Импортируем отдельные части игровых данных +const { elenaBaseStats, balardBaseStats, almagestBaseStats } = require('./characterStats'); +const { elenaAbilities, balardAbilities, almagestAbilities } = require('./characterAbilities'); +const { tauntSystem } = require('./taunts'); // Предполагается, что taunts.js экспортирует объект tauntSystem + +// Собираем все данные в один объект gameData, +// который будет использоваться в других частях серверной логики (например, gameLogic, GameInstance). +// Эта структура аналогична той, что была в вашем исходном большом файле data.js. +const gameData = { + // Базовые статы персонажей по их ключам для удобного доступа + // (хотя dataUtils.js теперь предоставляет функции для этого, + // можно оставить и такую структуру для обратной совместимости или прямого доступа, если нужно) + baseStats: { + elena: elenaBaseStats, + balard: balardBaseStats, + almagest: almagestBaseStats + }, + + // Способности персонажей по их ключам + abilities: { + elena: elenaAbilities, + balard: balardAbilities, + almagest: almagestAbilities + }, + + // Система насмешек + tauntSystem: tauntSystem, + + + // Если вы хотите сохранить оригинальную структуру вашего предыдущего data.js, + // где были прямые ссылки на playerBaseStats, opponentBaseStats и т.д., + // вы можете добавить их сюда. Однако, с новой структурой dataUtils.js + // это становится менее необходимым, так как dataUtils предоставляет + // функции для получения данных по characterKey. + // Для примера, если бы playerBaseStats всегда был Елена, а opponentBaseStats всегда Балард: + // playerBaseStats: elenaBaseStats, // Обычно Елена + // opponentBaseStats: balardBaseStats, // Обычно Балард (AI) + // almagestBaseStats: almagestBaseStats, // Для Альмагест (PvP) + // playerAbilities: elenaAbilities, + // opponentAbilities: balardAbilities, // Способности Баларда (AI) + // almagestAbilities: almagestAbilities, + + // Рекомендуемый подход: экспортировать данные, сгруппированные по персонажам, + // а для получения данных конкретного "игрока" или "оппонента" в игре + // использовать dataUtils.getCharacterData(characterKey) в GameInstance/GameManager. + // Это более гибко, так как в PvP Елена может быть оппонентом, а Альмагест - игроком. +}; + +// Экспортируем собранный объект gameData +module.exports = gameData; + +/* +Примечание: +В GameInstance, GameManager, gameLogic и других модулях, где раньше был: +const gameData = require('./data'); // или другой путь к старому data.js + +Теперь будет: +const gameData = require('../data'); // или '../data/index.js' - Node.js поймет и так +или +const dataUtils = require('../data/dataUtils'); + +И если вы используете gameData напрямую: +const elenaStats = gameData.baseStats.elena; +const balardAbils = gameData.abilities.balard; + +Если используете dataUtils: +const elenaFullData = dataUtils.getCharacterData('elena'); +const balardAbils = dataUtils.getCharacterAbilities('balard'); + +Выбор зависит от того, насколько гранулированный доступ вам нужен в каждом конкретном месте. +Объект gameData, экспортируемый этим файлом, может быть полезен для gameLogic, +где функции могут ожидать всю структуру данных сразу. +*/ \ No newline at end of file diff --git a/server/data/taunts.js b/server/data/taunts.js new file mode 100644 index 0000000..16dea67 --- /dev/null +++ b/server/data/taunts.js @@ -0,0 +1,118 @@ +// /server/data/taunts.js + +// Предполагается, что GAME_CONFIG будет доступен в контексте, где используются эти насмешки, +// обычно он передается в функции игровой логики (например, serverGameLogic.getRandomTaunt). +// Если вы хотите использовать GAME_CONFIG.ABILITY_ID_... прямо здесь, вам нужно его импортировать: +const GAME_CONFIG = require('../core/config'); // Путь к конфигу + +const tauntSystem = { + elena: { // Насмешки Елены + balard: { // Против Баларда (AI) + // Триггер: Елена использует СВОЮ способность + selfCastAbility: { + [GAME_CONFIG.ABILITY_ID_HEAL]: [ "Свет лечит, Балард. Но не искаженную завистью искру.", "Я черпаю силы в Истине."], + [GAME_CONFIG.ABILITY_ID_FIREBALL]: [ "Прими очищающее пламя Света!", "Пусть твой мрак сгорит!" ], + [GAME_CONFIG.ABILITY_ID_NATURE_STRENGTH]: [ "Сама земля отвергает тебя, я черпаю её силу!", "Гармония природы со мной." ], + [GAME_CONFIG.ABILITY_ID_DEFENSE_AURA]: [ "Порядок восторжествует над твоим хаосом.", "Моя вера - моя защита." ], + [GAME_CONFIG.ABILITY_ID_HYPNOTIC_GAZE]: [ "Смотри мне в глаза, Балард. И слушай тишину.", "Твой разум - в моей власти." ], + [GAME_CONFIG.ABILITY_ID_SEAL_OF_WEAKNESS]: [ "Твоя ярость иссякнет, как вода в песке, Балард!", "Твоя сила угасает." ] + }, + // Триггер: Противник (Балард) совершает действие + onOpponentAction: { + [GAME_CONFIG.ABILITY_ID_BALARD_HEAL]: [ "Пытаешься отсрочить неизбежное жалкой темной силой?" ], + [GAME_CONFIG.ABILITY_ID_BALARD_SILENCE]: { // Реакция на "Эхо Безмолвия" Баларда + success: [ "(Сдавленный вздох)... Ничтожная попытка заглушить Слово!" ], // Если Балард успешно заглушил Елену + fail: [ "Твой шепот Тьмы слаб против Света Истины!" ] // Если попытка Баларда провалилась + }, + [GAME_CONFIG.ABILITY_ID_BALARD_MANA_DRAIN]: [ "Ты питаешься Светом, как паразит?!" ], + // Эти два триггера используются, когда АТАКА ОППОНЕНТА (Баларда) попадает по Елене или блокируется Еленой + attackBlocked: [ "Твои удары тщетны перед щитом Порядка." ], // Елена блокирует атаку Баларда + attackHits: [ "(Шипение боли)... Боль – лишь напоминание о твоем предательстве." ] // Атака Баларда попадает по Елене + }, + // Триггер: Базовая атака Елены + basicAttack: { + // 'merciful' и 'dominating' используются в gameLogic.getRandomTaunt в зависимости от HP Баларда + merciful: [ "Балард, прошу, остановись. Еще не поздно.", "Подумай о том, что потерял." ], + dominating: [ + "Глина не спорит с гончаром, Балард!", + "Ты ИЗБРАЛ эту гниль! Получай возмездие!", + "Самый страшный грех - грех неблагодарности!", + "Я сотру тебя с лика этой земли!" + ], + general: [ // Общие фразы, если специфичные не подходят (например, если PLAYER_MERCY_TAUNT_THRESHOLD_PERCENT не используется) + "Свет покарает тебя, Балард!", + "За все свои деяния ты ответишь!" + ] + }, + // Триггер: Изменение состояния боя + onBattleState: { + start: [ "Балард, есть ли еще путь назад?" ], // Начало AI боя с Балардом + opponentNearDefeat: [ "Конец близок, Балард. Прими свою судьбу." ] // Балард почти побежден + } + }, + almagest: { // Против Альмагест (PvP) + selfCastAbility: { + [GAME_CONFIG.ABILITY_ID_HEAL]: [ "Я исцеляюсь Светом, который ты отвергла.", "Жизнь восторжествует над твоей некромантией!", "Мое сияние не померкнет." ], + [GAME_CONFIG.ABILITY_ID_FIREBALL]: [ "Очищающий огонь для твоей тьмы!", "Почувствуй гнев праведного Света!", "Это пламя ярче твоих теней!" ], + [GAME_CONFIG.ABILITY_ID_NATURE_STRENGTH]: [ "Природа дает мне силу, а тебе - лишь презрение.", "Я черпаю из источника жизни, ты - из могилы." ], + [GAME_CONFIG.ABILITY_ID_DEFENSE_AURA]: [ "Мой щит отразит твою злобу.", "Свет - лучшая защита.", "Твои темные чары не пройдут!" ], + [GAME_CONFIG.ABILITY_ID_HYPNOTIC_GAZE]: [ "Смотри в глаза Истине, колдунья!", "Твои лживые речи умолкнут!", "Хватит прятаться за иллюзиями!" ], + [GAME_CONFIG.ABILITY_ID_SEAL_OF_WEAKNESS]: [ "Твоя темная сила иссякнет!", "Я ослабляю твою связь с бездной!", "Почувствуй, как тает твоя энергия!" ] + }, + onOpponentAction: { // Реакции Елены на действия Альмагест + [GAME_CONFIG.ABILITY_ID_ALMAGEST_HEAL]: [ "Лечишь раны тьмой? Она лишь глубже проникнет в тебя.", "Твоя магия несет лишь порчу, даже исцеляя." ], + [GAME_CONFIG.ABILITY_ID_ALMAGEST_DAMAGE]: [ "Твоя тень лишь царапает, не ранит.", "Слабый удар! Тьма делает тебя немощной." ], + [GAME_CONFIG.ABILITY_ID_ALMAGEST_BUFF_ATTACK]: [ "Черпаешь силы из бездны? Она поглотит и тебя.", "Твое усиление - лишь агония искаженной энергии." ], + [GAME_CONFIG.ABILITY_ID_ALMAGEST_BUFF_DEFENSE]: [ "Щит из теней? Он рассыпется прахом!", "Твоя защита иллюзорна, как и твоя сила." ], + [GAME_CONFIG.ABILITY_ID_ALMAGEST_DISABLE]: [ "(Сдавленно) Твои ментальные атаки отвратительны!", "Тьма в моей голове... я вырвусь!" ], + [GAME_CONFIG.ABILITY_ID_ALMAGEST_DEBUFF]: [ "Истощаешь мою силу? Я восстановлю ее Светом!", "Твое проклятие слабо." ], + attackBlocked: [ "Твоя атака разбилась о мой щит Света!", "Предсказуемо и слабо, Альмагест." ], + attackHits: [ "(Резкий вздох) Коснулась... Но Свет исцелит рану.", "Эта царапина - ничто!", "Ты заплатишь за это!" ] + }, + basicAttack: { + general: [ "Тьма не победит, Альмагест!", "Твои иллюзии рассеются перед Светом!", "Пока я стою, порядок будет восстановлен!" ] + }, + onBattleState: { + start: [ "Альмагест! Твоим темным делам пришел конец!", "Во имя Света, я остановлю тебя!", "Приготовься к битве, служительница тьмы!" ], + opponentNearDefeat: [ "Твоя тьма иссякает, колдунья!", "Сдавайся, пока Свет не испепелил тебя!", "Конец твоим злодеяниям близок!" ] + } + } + }, + almagest: { // Насмешки Альмагест + elena: { // Против Елены (PvP) + selfCastAbility: { + [GAME_CONFIG.ABILITY_ID_ALMAGEST_HEAL]: [ "Я питаюсь слабостью, Елена!", "Тьма дает мне силу!" ], + [GAME_CONFIG.ABILITY_ID_ALMAGEST_DAMAGE]: [ "Почувствуй холод бездны!", "Твой Свет померкнет перед моей тенью!" ], + [GAME_CONFIG.ABILITY_ID_ALMAGEST_BUFF_ATTACK]: [ "Силы Бездны со мной!", "Моя тень становится гуще!" ], + [GAME_CONFIG.ABILITY_ID_ALMAGEST_BUFF_DEFENSE]: [ "Мой щит выкован из самой тьмы!", "Попробуй пробить это, служительница Света!" ], + [GAME_CONFIG.ABILITY_ID_ALMAGEST_DISABLE]: [ "Твой разум сломлен!", "Умолкни, Светлая!", "Я владею твоими мыслями!" ], + [GAME_CONFIG.ABILITY_ID_ALMAGEST_DEBUFF]: [ "Твоя сила тает!", "Почувствуй гниль!", "Я истощаю твой Свет!" ] + }, + onOpponentAction: { // Реакции Альмагест на действия Елены + [GAME_CONFIG.ABILITY_ID_HEAL]: [ "Исцеляешься? Твои раны слишком глубоки!" ], + [GAME_CONFIG.ABILITY_ID_FIREBALL]: [ "Жалкое пламя! Мои тени поглотят его!" ], + [GAME_CONFIG.ABILITY_ID_NATURE_STRENGTH]: [ "Сила земли? Смешно! Бездну ничто не остановит." ], + [GAME_CONFIG.ABILITY_ID_DEFENSE_AURA]: [ "Твой щит из Света не спасет тебя от Тьмы!" ], + [GAME_CONFIG.ABILITY_ID_HYPNOTIC_GAZE]: [ "(Сдавленно, затем смех) Попытка управлять моим разумом? Жалко!", "Ты пытаешься заглянуть в Бездну?!" ], + [GAME_CONFIG.ABILITY_ID_SEAL_OF_WEAKNESS]: [ "Моя энергия вечна, дура!", "Это лишь раздражение!" ], + attackBlocked: [ "Твой блок не спасет тебя вечно, Елена!", "Это лишь задержка." ], + attackHits: [ "Ха! Чувствуешь силу Тьмы?", "Это только начало!", "Слабость!" ] + }, + basicAttack: { + general: [ "Почувствуй мою силу!", "Тени атакуют!", "Я наношу удар!" ] + }, + onBattleState: { + start: [ "Тысяча лет в заточении лишь усилили меня, Елена!", "Твой Свет скоро погаснет!", "Пора положить конец твоему господству!" ], + opponentNearDefeat: [ "Твой Свет гаснет!", "Ты побеждена!", "Бездне нужен твой дух!" ] + } + } + // Можно добавить секцию для Альмагест против Баларда, если такой бой возможен и нужен + // balard: { ... } + } + // Балард пока не имеет своей системы насмешек (он AI и его "реплики" могут быть частью логов его действий) + // Если Балард станет играбельным PvP персонажем, сюда можно будет добавить секцию balard: { elena: {...}, almagest: {...} } +}; + +module.exports = { + tauntSystem +}; \ No newline at end of file diff --git a/server/game/GameManager.js b/server/game/GameManager.js new file mode 100644 index 0000000..f16b30b --- /dev/null +++ b/server/game/GameManager.js @@ -0,0 +1,559 @@ +// /server/game/GameManager.js +const { v4: uuidv4 } = require('uuid'); +const GameInstance = require('./instance/GameInstance'); +const dataUtils = require('../data/dataUtils'); +const GAME_CONFIG = require('../core/config'); + +class GameManager { + constructor(io) { + this.io = io; + this.games = {}; // { gameId: GameInstance } + this.userIdentifierToGameId = {}; // { userId: gameId } + this.pendingPvPGames = []; // Массив gameId ожидающих PvP игр + console.log("[GameManager] Инициализирован."); + } + + _cleanupPreviousPendingGameForUser(identifier, reasonSuffix = 'unknown_cleanup_reason') { + const oldPendingGameId = this.userIdentifierToGameId[identifier]; + if (oldPendingGameId && this.games[oldPendingGameId]) { + const gameToRemove = this.games[oldPendingGameId]; + // Убеждаемся, что это именно ожидающая PvP игра этого пользователя + if (gameToRemove.mode === 'pvp' && + gameToRemove.ownerIdentifier === identifier && // Он владелец + gameToRemove.playerCount === 1 && // В игре только он + this.pendingPvPGames.includes(oldPendingGameId) && // Игра в списке ожидающих + (!gameToRemove.gameState || !gameToRemove.gameState.isGameOver) // И она не завершена + ) { + console.log(`[GameManager._cleanupPreviousPendingGameForUser] Пользователь ${identifier} имеет существующую ожидающую PvP игру ${oldPendingGameId}. Удаление. Причина: ${reasonSuffix}`); + this._cleanupGame(oldPendingGameId, `owner_action_removed_pending_pvp_game_${reasonSuffix}`); + return true; + } + } + return false; + } + + createGame(socket, mode = 'ai', chosenCharacterKey = null, identifier) { + console.log(`[GameManager.createGame] Пользователь: ${identifier} (Socket: ${socket.id}), Режим: ${mode}, Персонаж: ${chosenCharacterKey || 'По умолчанию'}`); + + const existingGameIdForUser = this.userIdentifierToGameId[identifier]; + + if (existingGameIdForUser && this.games[existingGameIdForUser]) { + const existingGame = this.games[existingGameIdForUser]; + if (existingGame.gameState && existingGame.gameState.isGameOver) { + console.warn(`[GameManager.createGame] Пользователь ${identifier} был в завершенной игре ${existingGameIdForUser}. Очистка перед созданием новой.`); + this._cleanupGame(existingGameIdForUser, `stale_finished_on_create_${identifier}`); + } else { + const isHisOwnPendingPvp = existingGame.mode === 'pvp' && + existingGame.ownerIdentifier === identifier && + existingGame.playerCount === 1 && + this.pendingPvPGames.includes(existingGameIdForUser); + + if (!isHisOwnPendingPvp) { + console.warn(`[GameManager.createGame] Пользователь ${identifier} уже в активной игре ${existingGameIdForUser} (режим: ${existingGame.mode}, владелец: ${existingGame.ownerIdentifier}). Невозможно создать новую.`); + socket.emit('gameError', { message: 'Вы уже находитесь в активной игре.' }); + this.handleRequestGameState(socket, identifier); + return; + } + } + } + + this._cleanupPreviousPendingGameForUser(identifier, `creating_new_game_mode_${mode}`); + console.log(`[GameManager.createGame] После возможной очистки, пользователь ${identifier} сопоставлен с: ${this.userIdentifierToGameId[identifier]}`); + + const stillExistingGameIdAfterCleanup = this.userIdentifierToGameId[identifier]; + if (stillExistingGameIdAfterCleanup && this.games[stillExistingGameIdAfterCleanup] && !this.games[stillExistingGameIdAfterCleanup].gameState?.isGameOver) { + console.error(`[GameManager.createGame] КРИТИЧЕСКАЯ ОШИБКА ЛОГИКИ: Пользователь ${identifier} все еще сопоставлен с активной игрой ${stillExistingGameIdAfterCleanup} после попытки очистки. Создание отклонено.`); + socket.emit('gameError', { message: 'Ошибка: не удалось освободить предыдущую игровую сессию.' }); + this.handleRequestGameState(socket, identifier); + return; + } + + const gameId = uuidv4(); + console.log(`[GameManager.createGame] Новый GameID: ${gameId}`); + const game = new GameInstance(gameId, this.io, mode, this); + this.games[gameId] = game; + + const charKeyForPlayer = mode === 'ai' ? (chosenCharacterKey || 'elena') : (chosenCharacterKey || 'elena'); + + if (game.addPlayer(socket, charKeyForPlayer, identifier)) { + this.userIdentifierToGameId[identifier] = gameId; + const playerInfo = Object.values(game.players).find(p => p.identifier === identifier); + const assignedPlayerId = playerInfo?.id; + const actualCharacterKey = playerInfo?.chosenCharacterKey; + + if (!assignedPlayerId || !actualCharacterKey) { + console.error(`[GameManager.createGame] КРИТИЧЕСКИ: Не удалось получить роль/ключ персонажа после addPlayer для ${identifier} в игре ${gameId}. Очистка.`); + this._cleanupGame(gameId, 'player_info_missing_after_add_on_create'); + socket.emit('gameError', { message: 'Ошибка сервера при создании роли в игре.' }); + return; + } + + console.log(`[GameManager.createGame] Игрок ${identifier} добавлен в игру ${gameId} как ${assignedPlayerId}. Карта пользователя обновлена. Текущая карта для ${identifier}: ${this.userIdentifierToGameId[identifier]}`); + socket.emit('gameCreated', { + gameId: gameId, + mode: mode, + yourPlayerId: assignedPlayerId, + chosenCharacterKey: actualCharacterKey + }); + + if (mode === 'ai') { + if (game.initializeGame()) { + console.log(`[GameManager.createGame] AI игра ${gameId} инициализирована GameManager, запуск...`); + game.startGame(); + } else { + console.error(`[GameManager.createGame] Инициализация AI игры ${gameId} не удалась в GameManager. Очистка.`); + this._cleanupGame(gameId, 'init_fail_ai_create_gm'); + } + } else if (mode === 'pvp') { + if (game.initializeGame()) { + if (!this.pendingPvPGames.includes(gameId)) { + this.pendingPvPGames.push(gameId); + } + socket.emit('waitingForOpponent'); + this.broadcastAvailablePvPGames(); + } else { + console.error(`[GameManager.createGame] Инициализация PvP игры ${gameId} (один игрок) не удалась. Очистка.`); + this._cleanupGame(gameId, 'init_fail_pvp_create_gm_single_player'); + } + } + } else { + console.error(`[GameManager.createGame] game.addPlayer не удалось для ${identifier} в ${gameId}. Очистка.`); + this._cleanupGame(gameId, 'player_add_failed_in_instance_gm_on_create'); + } + } + + joinGame(socket, gameIdToJoin, identifier, chosenCharacterKey = null) { + console.log(`[GameManager.joinGame] Пользователь: ${identifier} (Socket: ${socket.id}) пытается присоединиться к ${gameIdToJoin} с персонажем ${chosenCharacterKey || 'По умолчанию'}`); + const gameToJoin = this.games[gameIdToJoin]; + + if (!gameToJoin) { socket.emit('gameError', { message: 'Игра с таким ID не найдена.' }); return; } + if (gameToJoin.gameState?.isGameOver) { socket.emit('gameError', { message: 'Эта игра уже завершена.' }); this._cleanupGame(gameIdToJoin, `attempt_join_finished_game_${identifier}`); return; } + if (gameToJoin.mode !== 'pvp') { socket.emit('gameError', { message: 'К этой игре нельзя присоединиться (не PvP).' }); return; } + + const playerInfoInTargetGame = Object.values(gameToJoin.players).find(p => p.identifier === identifier); + if (gameToJoin.playerCount >= 2 && !playerInfoInTargetGame?.isTemporarilyDisconnected) { + socket.emit('gameError', { message: 'Эта PvP игра уже заполнена.' }); return; + } + // Запрещаем владельцу "присоединяться" к своей ожидающей игре как новый игрок, если он не был временно отключен. + // Если он хочет вернуться, он должен использовать requestGameState. + if (gameToJoin.ownerIdentifier === identifier && !playerInfoInTargetGame?.isTemporarilyDisconnected) { + console.warn(`[GameManager.joinGame] Пользователь ${identifier} пытается присоединиться к своей игре ${gameIdToJoin}, где он владелец и не отключен. Обработка как запрос на переподключение.`); + this.handleRequestGameState(socket, identifier); + return; + } + + const currentActiveGameIdUserIsIn = this.userIdentifierToGameId[identifier]; + if (currentActiveGameIdUserIsIn && this.games[currentActiveGameIdUserIsIn] && this.games[currentActiveGameIdUserIsIn].gameState?.isGameOver) { + console.warn(`[GameManager.joinGame] Пользователь ${identifier} был в завершенной игре ${currentActiveGameIdUserIsIn} при попытке присоединиться к ${gameIdToJoin}. Очистка старой.`); + this._cleanupGame(currentActiveGameIdUserIsIn, `stale_finished_on_join_attempt_${identifier}`); + } + + const stillExistingGameIdForUser = this.userIdentifierToGameId[identifier]; + if (stillExistingGameIdForUser && stillExistingGameIdForUser !== gameIdToJoin && this.games[stillExistingGameIdForUser] && !this.games[stillExistingGameIdForUser].gameState?.isGameOver) { + const usersCurrentGame = this.games[stillExistingGameIdForUser]; + const isHisOwnPendingPvp = usersCurrentGame.mode === 'pvp' && + usersCurrentGame.ownerIdentifier === identifier && + usersCurrentGame.playerCount === 1 && + this.pendingPvPGames.includes(stillExistingGameIdForUser); + + if (isHisOwnPendingPvp) { + console.log(`[GameManager.joinGame] Пользователь ${identifier} является владельцем ожидающей игры ${stillExistingGameIdForUser}, но хочет присоединиться к ${gameIdToJoin}. Очистка старой игры.`); + this._cleanupPreviousPendingGameForUser(identifier, `joining_another_game_${gameIdToJoin}`); + } else { + console.warn(`[GameManager.joinGame] Пользователь ${identifier} находится в другой активной игре ${stillExistingGameIdForUser}. Невозможно присоединиться к ${gameIdToJoin}.`); + socket.emit('gameError', { message: 'Вы уже находитесь в другой активной игре.' }); + this.handleRequestGameState(socket, identifier); + return; + } + } + console.log(`[GameManager.joinGame] После возможной очистки перед присоединением, пользователь ${identifier} сопоставлен с: ${this.userIdentifierToGameId[identifier]}`); + + const charKeyForJoin = chosenCharacterKey || 'elena'; + if (gameToJoin.addPlayer(socket, charKeyForJoin, identifier)) { + this.userIdentifierToGameId[identifier] = gameIdToJoin; + const joinedPlayerInfo = Object.values(gameToJoin.players).find(p => p.identifier === identifier); + + if (!joinedPlayerInfo || !joinedPlayerInfo.id || !joinedPlayerInfo.chosenCharacterKey) { + console.error(`[GameManager.joinGame] КРИТИЧЕСКИ: Не удалось получить роль/ключ персонажа после addPlayer для ${identifier}, присоединяющегося к ${gameIdToJoin}.`); + socket.emit('gameError', { message: 'Ошибка сервера при назначении роли в игре.' }); + if (this.userIdentifierToGameId[identifier] === gameIdToJoin) delete this.userIdentifierToGameId[identifier]; + return; + } + console.log(`[GameManager.joinGame] Игрок ${identifier} добавлен/переподключен к ${gameIdToJoin} как ${joinedPlayerInfo.id}. Карта пользователя обновлена. Текущая карта для ${identifier}: ${this.userIdentifierToGameId[identifier]}`); + socket.emit('gameCreated', { + gameId: gameIdToJoin, + mode: gameToJoin.mode, + yourPlayerId: joinedPlayerInfo.id, + chosenCharacterKey: joinedPlayerInfo.chosenCharacterKey + }); + + if (gameToJoin.playerCount === 2) { + console.log(`[GameManager.joinGame] Игра ${gameIdToJoin} теперь заполнена. Инициализация и запуск.`); + // Важно! Инициализация может обновить ключи персонажей, если они были одинаковыми. + if (gameToJoin.initializeGame()) { + gameToJoin.startGame(); + } else { + this._cleanupGame(gameIdToJoin, 'full_init_fail_pvp_join_gm'); return; + } + const idx = this.pendingPvPGames.indexOf(gameIdToJoin); + if (idx > -1) this.pendingPvPGames.splice(idx, 1); + this.broadcastAvailablePvPGames(); + } + } else { + console.warn(`[GameManager.joinGame] gameToJoin.addPlayer вернул false для пользователя ${identifier} в игре ${gameIdToJoin}.`); + } + } + + findAndJoinRandomPvPGame(socket, chosenCharacterKeyForCreation = 'elena', identifier) { + console.log(`[GameManager.findRandomPvPGame] Пользователь: ${identifier} (Socket: ${socket.id}), Персонаж для создания: ${chosenCharacterKeyForCreation}`); + + const existingGameIdForUser = this.userIdentifierToGameId[identifier]; + if (existingGameIdForUser && this.games[existingGameIdForUser]) { + const existingGame = this.games[existingGameIdForUser]; + if (existingGame.gameState && existingGame.gameState.isGameOver) { + console.warn(`[GameManager.findRandomPvPGame] Пользователь ${identifier} был в завершенной игре ${existingGameIdForUser}. Очистка.`); + this._cleanupGame(existingGameIdForUser, `stale_finished_on_find_random_${identifier}`); + } else { + console.warn(`[GameManager.findRandomPvPGame] Пользователь ${identifier} уже в активной/ожидающей игре ${existingGameIdForUser}. Невозможно найти случайную.`); + socket.emit('gameError', { message: 'Вы уже в активной или ожидающей игре.' }); + this.handleRequestGameState(socket, identifier); return; + } + } + + this._cleanupPreviousPendingGameForUser(identifier, `finding_random_game`); + console.log(`[GameManager.findRandomPvPGame] После возможной очистки, пользователь ${identifier} сопоставлен с: ${this.userIdentifierToGameId[identifier]}`); + + const stillExistingGameIdAfterCleanup = this.userIdentifierToGameId[identifier]; + if (stillExistingGameIdAfterCleanup && this.games[stillExistingGameIdAfterCleanup] && !this.games[stillExistingGameIdAfterCleanup].gameState?.isGameOver) { + console.error(`[GameManager.findRandomPvPGame] КРИТИЧЕСКАЯ ОШИБКА ЛОГИКИ: Пользователь ${identifier} все еще сопоставлен с активной игрой ${stillExistingGameIdAfterCleanup} после попытки очистки. Поиск случайной игры отклонен.`); + socket.emit('gameError', { message: 'Ошибка: не удалось освободить предыдущую игровую сессию для поиска.' }); + this.handleRequestGameState(socket, identifier); + return; + } + + let gameIdToJoin = null; + for (const id of [...this.pendingPvPGames]) { + const pendingGame = this.games[id]; + if (pendingGame && pendingGame.mode === 'pvp' && + pendingGame.playerCount === 1 && + pendingGame.ownerIdentifier !== identifier && + (!pendingGame.gameState || !pendingGame.gameState.isGameOver)) { + gameIdToJoin = id; break; + } else if (!pendingGame || (pendingGame?.gameState && pendingGame.gameState.isGameOver)) { + console.warn(`[GameManager.findRandomPvPGame] Найдена устаревшая/завершенная ожидающая игра ${id}. Очистка.`); + this._cleanupGame(id, `stale_finished_pending_on_find_random`); + } + } + + if (gameIdToJoin) { + console.log(`[GameManager.findRandomPvPGame] Найдена ожидающая игра ${gameIdToJoin} для ${identifier}. Присоединение...`); + const randomJoinCharKey = ['elena', 'almagest', 'balard'][Math.floor(Math.random() * 3)]; + this.joinGame(socket, gameIdToJoin, identifier, randomJoinCharKey); + } else { + console.log(`[GameManager.findRandomPvPGame] Подходящая ожидающая игра не найдена. Создание новой PvP игры для ${identifier}.`); + this.createGame(socket, 'pvp', chosenCharacterKeyForCreation, identifier); + } + } + + handlePlayerAction(identifier, actionData) { + const gameId = this.userIdentifierToGameId[identifier]; + const game = this.games[gameId]; + if (game) { + if (game.gameState?.isGameOver) { + const playerSocket = Object.values(game.players).find(p => p.identifier === identifier)?.socket; + if (playerSocket) { + console.warn(`[GameManager.handlePlayerAction] Действие от ${identifier} для игры ${gameId}, но игра завершена. Запрос состояния.`); + this.handleRequestGameState(playerSocket, identifier); + } else { + console.warn(`[GameManager.handlePlayerAction] Действие от ${identifier} для игры ${gameId}, игра завершена, но сокет для пользователя не найден.`); + this._cleanupGame(gameId, `action_on_over_no_socket_gm_${identifier}`); + } + return; + } + game.processPlayerAction(identifier, actionData); + } else { + console.warn(`[GameManager.handlePlayerAction] Игра для пользователя ${identifier} не найдена (сопоставлена с игрой ${gameId}). Очистка записи в карте.`); + delete this.userIdentifierToGameId[identifier]; + const clientSocket = this._findClientSocketByIdentifier(identifier); + if (clientSocket) clientSocket.emit('gameNotFound', { message: 'Ваша игровая сессия не найдена при совершении действия.' }); + } + } + + handlePlayerSurrender(identifier) { + const gameId = this.userIdentifierToGameId[identifier]; + console.log(`[GameManager.handlePlayerSurrender] Пользователь: ${identifier} сдался. GameID из карты: ${gameId}`); + const game = this.games[gameId]; + if (game) { + if (game.gameState?.isGameOver) { + console.warn(`[GameManager.handlePlayerSurrender] Пользователь ${identifier} в игре ${gameId} сдается, но игра УЖЕ ЗАВЕРШЕНА.`); + return; + } + if (typeof game.playerDidSurrender === 'function') game.playerDidSurrender(identifier); + else { console.error(`[GameManager.handlePlayerSurrender] КРИТИЧЕСКИ: GameInstance ${gameId} отсутствует playerDidSurrender!`); this._cleanupGame(gameId, "surrender_missing_method_gm"); } + } else { + console.warn(`[GameManager.handlePlayerSurrender] Игра для пользователя ${identifier} не найдена. Очистка записи в карте.`); + if (this.userIdentifierToGameId[identifier]) delete this.userIdentifierToGameId[identifier]; + } + } + + handleLeaveAiGame(identifier) { + const gameId = this.userIdentifierToGameId[identifier]; + console.log(`[GameManager.handleLeaveAiGame] Пользователь: ${identifier} покидает AI игру. GameID из карты: ${gameId}`); + const game = this.games[gameId]; + if (game) { + if (game.gameState?.isGameOver) { + console.warn(`[GameManager.handleLeaveAiGame] Пользователь ${identifier} в игре ${gameId} выходит, но игра УЖЕ ЗАВЕРШЕНА.`); + return; + } + if (game.mode === 'ai') { + if (typeof game.playerExplicitlyLeftAiGame === 'function') { + game.playerExplicitlyLeftAiGame(identifier); + } else { + console.error(`[GameManager.handleLeaveAiGame] КРИТИЧЕСКИ: GameInstance ${gameId} отсутствует playerExplicitlyLeftAiGame! Прямая очистка.`); + this._cleanupGame(gameId, "leave_ai_missing_method_gm"); + } + } else { + console.warn(`[GameManager.handleLeaveAiGame] Пользователь ${identifier} отправил leaveAiGame, но игра ${gameId} не в режиме AI (${game.mode}).`); + const clientSocket = this._findClientSocketByIdentifier(identifier); + if(clientSocket) clientSocket.emit('gameError', { message: 'Вы не в AI игре.' }); + } + } else { + console.warn(`[GameManager.handleLeaveAiGame] Игра для пользователя ${identifier} не найдена. Очистка записи в карте.`); + if (this.userIdentifierToGameId[identifier]) delete this.userIdentifierToGameId[identifier]; + const clientSocket = this._findClientSocketByIdentifier(identifier); + if(clientSocket) clientSocket.emit('gameNotFound', { message: 'AI игра не найдена для выхода.' }); + } + } + + _findClientSocketByIdentifier(identifier) { + for (const s of this.io.sockets.sockets.values()) { + if (s && s.userData && s.userData.userId === identifier && s.connected) return s; + } + return null; + } + + handleDisconnect(socketId, identifier) { + const gameIdFromMap = this.userIdentifierToGameId[identifier]; + console.log(`[GameManager.handleDisconnect] Socket: ${socketId}, Пользователь: ${identifier}, GameID из карты: ${gameIdFromMap}`); + const game = gameIdFromMap ? this.games[gameIdFromMap] : null; + + if (game) { + if (game.gameState?.isGameOver) { + console.log(`[GameManager.handleDisconnect] Игра ${gameIdFromMap} для пользователя ${identifier} (сокет ${socketId}) УЖЕ ЗАВЕРШЕНА. Игра будет очищена своей собственной логикой или следующим релевантным действием.`); + return; + } + + const playerInfoInGame = Object.values(game.players).find(p => p.identifier === identifier); + + if (playerInfoInGame) { // Игрок существует в этой игре + console.log(`[GameManager.handleDisconnect] Отключающийся сокет ${socketId} для пользователя ${identifier} (Роль: ${playerInfoInGame.id}) в игре ${gameIdFromMap}. Уведомление GameInstance.`); + if (typeof game.handlePlayerPotentiallyLeft === 'function') { + // Передаем фактический socketId, который отключился. PCH определит, устарел ли он. + game.handlePlayerPotentiallyLeft(playerInfoInGame.id, identifier, playerInfoInGame.chosenCharacterKey, socketId); + } else { + console.error(`[GameManager.handleDisconnect] КРИТИЧЕСКИ: GameInstance ${gameIdFromMap} отсутствует handlePlayerPotentiallyLeft!`); + this._cleanupGame(gameIdFromMap, "missing_reconnect_logic_on_disconnect_gm"); + } + } else { + console.warn(`[GameManager.handleDisconnect] Пользователь ${identifier} сопоставлен с игрой ${gameIdFromMap}, но не найден в game.players. Это может указывать на устаревшую запись userIdentifierToGameId. Очистка карты для этого пользователя.`); + if (this.userIdentifierToGameId[identifier] === gameIdFromMap) { + delete this.userIdentifierToGameId[identifier]; + } + } + } else { + if (this.userIdentifierToGameId[identifier]) { + console.warn(`[GameManager.handleDisconnect] Экземпляр игры для gameId ${gameIdFromMap} (пользователь ${identifier}) не найден. Очистка устаревшей записи в карте.`); + delete this.userIdentifierToGameId[identifier]; + } + } + } + + _cleanupGame(gameId, reason = 'unknown') { + console.log(`[GameManager._cleanupGame] Попытка очистки для GameID: ${gameId}, Причина: ${reason}`); + const game = this.games[gameId]; + + if (!game) { + console.warn(`[GameManager._cleanupGame] Экземпляр игры для ${gameId} не найден в this.games. Очистка связанных записей.`); + const pendingIdx = this.pendingPvPGames.indexOf(gameId); + if (pendingIdx > -1) { + this.pendingPvPGames.splice(pendingIdx, 1); + console.log(`[GameManager._cleanupGame] ${gameId} удален из pendingPvPGames.`); + } + Object.keys(this.userIdentifierToGameId).forEach(idKey => { + if (this.userIdentifierToGameId[idKey] === gameId) { + delete this.userIdentifierToGameId[idKey]; + console.log(`[GameManager._cleanupGame] Удалено сопоставление для пользователя ${idKey} с игрой ${gameId}.`); + } + }); + this.broadcastAvailablePvPGames(); + return false; + } + + console.log(`[GameManager._cleanupGame] Очистка игры ${game.id}. Владелец: ${game.ownerIdentifier}. Причина: ${reason}. Игроков в игре: ${game.playerCount}`); + if (typeof game.turnTimer?.clear === 'function') game.turnTimer.clear(); + if (typeof game.clearAllReconnectTimers === 'function') game.clearAllReconnectTimers(); + + if (game.gameState && !game.gameState.isGameOver) { + console.log(`[GameManager._cleanupGame] Пометка игры ${game.id} как завершенной, так как она очищается во время активности.`); + game.gameState.isGameOver = true; + // game.io.to(game.id).emit('gameOver', { winnerId: null, reason: `game_cleanup_${reason}`, finalGameState: game.gameState, log: game.consumeLogBuffer() }); + } + + Object.values(game.players).forEach(pInfo => { + if (pInfo?.identifier && this.userIdentifierToGameId[pInfo.identifier] === gameId) { + delete this.userIdentifierToGameId[pInfo.identifier]; + console.log(`[GameManager._cleanupGame] Очищено userIdentifierToGameId для игрока ${pInfo.identifier}.`); + } + }); + // Дополнительная проверка для владельца, если он не был в списке игроков (маловероятно, но для полноты) + if (game.ownerIdentifier && this.userIdentifierToGameId[game.ownerIdentifier] === gameId) { + if (!Object.values(game.players).some(p => p.identifier === game.ownerIdentifier)) { + delete this.userIdentifierToGameId[game.ownerIdentifier]; + console.log(`[GameManager._cleanupGame] Очищено userIdentifierToGameId для владельца ${game.ownerIdentifier} (не был в списке игроков).`); + } + } + + + const pendingIdx = this.pendingPvPGames.indexOf(gameId); + if (pendingIdx > -1) { + this.pendingPvPGames.splice(pendingIdx, 1); + console.log(`[GameManager._cleanupGame] ${gameId} удален из pendingPvPGames.`); + } + + delete this.games[gameId]; + console.log(`[GameManager._cleanupGame] Экземпляр игры ${gameId} удален. Осталось игр: ${Object.keys(this.games).length}. Ожидающих: ${this.pendingPvPGames.length}. Размер карты пользователей: ${Object.keys(this.userIdentifierToGameId).length}`); + this.broadcastAvailablePvPGames(); + return true; + } + + getAvailablePvPGamesListForClient() { + return [...this.pendingPvPGames] + .map(gameId => { + const game = this.games[gameId]; + if (game && game.mode === 'pvp' && game.playerCount === 1 && (!game.gameState || !game.gameState.isGameOver)) { + const p1Entry = Object.values(game.players).find(p => p.id === GAME_CONFIG.PLAYER_ID && !p.isTemporarilyDisconnected); + let p1Username = 'Игрок'; + let p1CharName = 'Неизвестный'; + const ownerId = game.ownerIdentifier; + + if (p1Entry) { // Используем данные из p1Entry, если он есть (более надежно) + p1Username = p1Entry.socket?.userData?.username || `User#${String(p1Entry.identifier).substring(0,4)}`; + const charData = dataUtils.getCharacterBaseStats(p1Entry.chosenCharacterKey); + p1CharName = charData?.name || p1Entry.chosenCharacterKey || 'Не выбран'; + } else if (ownerId){ // Резервный вариант, если p1Entry почему-то нет + const ownerSocket = this._findClientSocketByIdentifier(ownerId); + p1Username = ownerSocket?.userData?.username || `Owner#${String(ownerId).substring(0,4)}`; + const ownerCharKey = game.playerCharacterKey; + const charData = ownerCharKey ? dataUtils.getCharacterBaseStats(ownerCharKey) : null; + p1CharName = charData?.name || ownerCharKey || 'Не выбран'; + } + return { id: gameId, status: `Ожидает (${p1Username} за ${p1CharName})`, ownerIdentifier: ownerId }; + } else if (game && (game.playerCount !== 1 || game.gameState?.isGameOver)) { + console.warn(`[GameManager.getAvailablePvPGamesListForClient] Игра ${gameId} находится в pendingPvPGames, но не является допустимой ожидающей игрой (игроков: ${game.playerCount}, завершена: ${game.gameState?.isGameOver}). Удаление.`); + this._cleanupGame(gameId, 'invalid_pending_game_in_list'); + } + return null; + }) + .filter(info => info !== null); + } + + broadcastAvailablePvPGames() { + const list = this.getAvailablePvPGamesListForClient(); + this.io.emit('availablePvPGamesList', list); + } + + handleRequestGameState(socket, identifier) { + const gameIdFromMap = this.userIdentifierToGameId[identifier]; + console.log(`[GameManager.handleRequestGameState] Пользователь: ${identifier} (Socket: ${socket.id}) запрашивает состояние. GameID из карты: ${gameIdFromMap}`); + const game = gameIdFromMap ? this.games[gameIdFromMap] : null; + + if (game) { + const playerInfoInGame = Object.values(game.players).find(p => p.identifier === identifier); + + if (playerInfoInGame) { + if (game.gameState?.isGameOver) { + socket.emit('gameNotFound', { message: 'Ваша предыдущая игра уже завершена.' }); + // Не удаляем из userIdentifierToGameId здесь, _cleanupGame сделает это, если игра еще в this.games + return; + } + if (typeof game.handlePlayerReconnected === 'function') { + const reconnected = game.handlePlayerReconnected(playerInfoInGame.id, socket); + if (!reconnected) { + console.warn(`[GameManager.handleRequestGameState] game.handlePlayerReconnected для ${identifier} в ${game.id} вернул false.`); + // GameInstance должен был отправить ошибку. + } + } else { + console.error(`[GameManager.handleRequestGameState] КРИТИЧЕСКИ: GameInstance ${game.id} отсутствует handlePlayerReconnected!`); + this._handleGameRecoveryError(socket, game.id, identifier, 'gi_missing_reconnect_method_gm_on_request'); + } + } else { + // Игрок сопоставлен с игрой, но НЕ НАЙДЕН в game.players. Это может произойти, если PCH еще не добавил игрока (например, F5 на экране создания игры). + // Попытаемся добавить игрока в игру, если это PvP и есть место, или если это его же игра в режиме AI. + console.warn(`[GameManager.handleRequestGameState] Пользователь ${identifier} сопоставлен с игрой ${gameIdFromMap}, но НЕ НАЙДЕН в game.players. Попытка добавить/переподключить.`); + if (game.mode === 'pvp') { + // Пытаемся присоединить, предполагая, что он мог быть удален или это F5 перед полным присоединением + const chosenCharKey = socket.handshake.query.chosenCharacterKey || 'elena'; // Получаем ключ из запроса или дефолтный + if (game.addPlayer(socket, chosenCharKey, identifier)) { + // Успешно добавили или переподключили через addPlayer -> handlePlayerReconnected + const newPlayerInfo = Object.values(game.players).find(p => p.identifier === identifier); + socket.emit('gameCreated', { // Отправляем событие, как при обычном присоединении + gameId: game.id, + mode: game.mode, + yourPlayerId: newPlayerInfo.id, + chosenCharacterKey: newPlayerInfo.chosenCharacterKey + }); + if (game.playerCount === 2) { // Если игра стала полной + if(game.initializeGame()) game.startGame(); else this._cleanupGame(game.id, 'init_fail_pvp_readd_gm'); + const idx = this.pendingPvPGames.indexOf(game.id); + if (idx > -1) this.pendingPvPGames.splice(idx, 1); + this.broadcastAvailablePvPGames(); + } + } else { + // Не удалось добавить/переподключить через addPlayer + this._handleGameRecoveryError(socket, gameIdFromMap, identifier, 'player_readd_failed_in_gi_on_request'); + } + + } else if (game.mode === 'ai' && game.ownerIdentifier === identifier) { + // Для AI игры, если это владелец, пытаемся через handlePlayerReconnected + if (typeof game.handlePlayerReconnected === 'function') { + // Предполагаем, что роль PLAYER_ID, так как это AI игра и он владелец + const reconnected = game.handlePlayerReconnected(GAME_CONFIG.PLAYER_ID, socket); + if (!reconnected) { + this._handleGameRecoveryError(socket, game.id, identifier, 'ai_owner_reconnect_failed_on_request'); + } + } else { + this._handleGameRecoveryError(socket, game.id, identifier, 'gi_missing_reconnect_method_ai_owner_on_request'); + } + } else { + this._handleGameRecoveryError(socket, gameIdFromMap, identifier, 'player_not_in_gi_players_unhandled_case_on_request'); + } + } + } else { + socket.emit('gameNotFound', { message: 'Активная игровая сессия не найдена.' }); + if (this.userIdentifierToGameId[identifier]) { + console.warn(`[GameManager.handleRequestGameState] Экземпляр игры для gameId ${gameIdFromMap} (пользователь ${identifier}) не найден. Очистка устаревшей записи в карте.`); + delete this.userIdentifierToGameId[identifier]; + } + } + } + + _handleGameRecoveryError(socket, gameId, identifier, reasonCode) { + console.error(`[GameManager._handleGameRecoveryError] Ошибка восстановления игры (ID: ${gameId || 'N/A'}) для пользователя ${identifier}. Причина: ${reasonCode}.`); + socket.emit('gameError', { message: 'Ошибка сервера при восстановлении состояния игры. Попробуйте войти снова.' }); + + if (gameId && this.games[gameId]) { + this._cleanupGame(gameId, `recovery_error_gm_${reasonCode}_for_${identifier}`); + } else if (this.userIdentifierToGameId[identifier]) { + const problematicGameIdForUser = this.userIdentifierToGameId[identifier]; + delete this.userIdentifierToGameId[identifier]; + console.log(`[GameManager._handleGameRecoveryError] Очищено устаревшее userIdentifierToGameId[${identifier}], указывающее на ${problematicGameIdForUser}.`); + } + if (this.userIdentifierToGameId[identifier]) { // Финальная проверка + delete this.userIdentifierToGameId[identifier]; + console.warn(`[GameManager._handleGameRecoveryError] Принудительно очищено userIdentifierToGameId[${identifier}] в качестве финальной меры.`); + } + socket.emit('gameNotFound', { message: 'Ваша игровая сессия была завершена из-за ошибки. Пожалуйста, войдите снова.' }); + } +} + +module.exports = GameManager; \ No newline at end of file diff --git a/server/game/instance/GameInstance.js b/server/game/instance/GameInstance.js new file mode 100644 index 0000000..c6cd72d --- /dev/null +++ b/server/game/instance/GameInstance.js @@ -0,0 +1,752 @@ +// /server/game/instance/GameInstance.js +const { v4: uuidv4 } = require('uuid'); +const TurnTimer = require('./TurnTimer'); +const gameLogic = require('../logic'); +const dataUtils = require('../../data/dataUtils'); +const GAME_CONFIG = require('../../core/config'); +const PlayerConnectionHandler = require('./PlayerConnectionHandler'); + +class GameInstance { + constructor(gameId, io, mode = 'ai', gameManager) { + this.id = gameId; + this.io = io; + this.mode = mode; + this.gameManager = gameManager; + + this.playerConnectionHandler = new PlayerConnectionHandler(this); + + this.gameState = null; + this.aiOpponent = (mode === 'ai'); + this.logBuffer = []; + + this.playerCharacterKey = null; + this.opponentCharacterKey = null; + this.ownerIdentifier = null; + + this.turnTimer = new TurnTimer( + GAME_CONFIG.TURN_DURATION_MS, + GAME_CONFIG.TIMER_UPDATE_INTERVAL_MS, + () => this.handleTurnTimeout(), + (remainingTime, isPlayerTurnForTimer, isPaused) => { + // Логируем отправку обновления таймера + // console.log(`[GI TURN_TIMER_CB ${this.id}] Sending update. Remaining: ${remainingTime}, isPlayerT: ${isPlayerTurnForTimer}, isPaused (raw): ${isPaused}, effectivelyPaused: ${this.isGameEffectivelyPaused()}`); + this.io.to(this.id).emit('turnTimerUpdate', { + remainingTime, + isPlayerTurn: isPlayerTurnForTimer, + isPaused: isPaused || this.isGameEffectivelyPaused() + }); + }, + this.id + ); + + if (!this.gameManager || typeof this.gameManager._cleanupGame !== 'function') { + console.error(`[GameInstance ${this.id}] КРИТИЧЕСКАЯ ОШИБКА: Ссылка на GameManager недействительна.`); + } + console.log(`[GameInstance ${this.id}] Создан. Режим: ${mode}. PlayerConnectionHandler также инициализирован.`); + } + + get playerCount() { + return this.playerConnectionHandler.playerCount; + } + + get players() { + return this.playerConnectionHandler.getAllPlayersInfo(); + } + + setPlayerCharacterKey(key) { this.playerCharacterKey = key; } + setOpponentCharacterKey(key) { this.opponentCharacterKey = key; } + setOwnerIdentifier(identifier) { this.ownerIdentifier = identifier; } + + addPlayer(socket, chosenCharacterKey, identifier) { + return this.playerConnectionHandler.addPlayer(socket, chosenCharacterKey, identifier); + } + + removePlayer(socketId, reason) { + this.playerConnectionHandler.removePlayer(socketId, reason); + } + + handlePlayerPotentiallyLeft(playerIdRole, identifier, characterKey, disconnectedSocketId) { + this.playerConnectionHandler.handlePlayerPotentiallyLeft(playerIdRole, identifier, characterKey, disconnectedSocketId); + } + + handlePlayerReconnected(playerIdRole, newSocket) { + console.log(`[GameInstance ${this.id}] Делегирование handlePlayerReconnected в PCH для роли ${playerIdRole}, сокет ${newSocket.id}`); + return this.playerConnectionHandler.handlePlayerReconnected(playerIdRole, newSocket); + } + + clearAllReconnectTimers() { + this.playerConnectionHandler.clearAllReconnectTimers(); + } + + isGameEffectivelyPaused() { + return this.playerConnectionHandler.isGameEffectivelyPaused(); + } + + handlePlayerPermanentlyLeft(playerRole, characterKey, reason) { + console.log(`[GameInstance ${this.id}] Игрок окончательно покинул игру. Роль: ${playerRole}, Персонаж: ${characterKey}, Причина: ${reason}`); + if (this.gameState && !this.gameState.isGameOver) { + if (this.mode === 'ai' && playerRole === GAME_CONFIG.PLAYER_ID) { + this.endGameDueToDisconnect(playerRole, characterKey, "player_left_ai_game"); + } else if (this.mode === 'pvp') { + if (this.playerCount < 2) { + const remainingActivePlayerEntry = Object.values(this.players).find(p => p.id !== playerRole && !p.isTemporarilyDisconnected); + this.endGameDueToDisconnect(playerRole, characterKey, "opponent_left_pvp_game", remainingActivePlayerEntry?.id); + } + } + } else if (!this.gameState && Object.keys(this.players).length === 0) { + this.gameManager._cleanupGame(this.id, "all_players_left_before_start_gi_via_pch"); + } + } + + _sayTaunt(characterState, opponentCharacterKey, triggerType, subTriggerOrContext = null, contextOverrides = {}) { + if (!characterState || !characterState.characterKey) return; + if (!opponentCharacterKey) return; + if (!gameLogic.getRandomTaunt) { console.error(`[Taunt ${this.id}] _sayTaunt: gameLogic.getRandomTaunt недоступен!`); return; } + if (!this.gameState) return; + + let context = {}; + let subTrigger = null; + + if (typeof subTriggerOrContext === 'string' || typeof subTriggerOrContext === 'number') { + subTrigger = subTriggerOrContext; + } else if (typeof subTriggerOrContext === 'object' && subTriggerOrContext !== null) { + context = { ...subTriggerOrContext }; + } + context = { ...context, ...contextOverrides }; + + if ((triggerType === 'selfCastAbility' || triggerType === 'onOpponentAction') && + (typeof subTriggerOrContext === 'string' || typeof subTriggerOrContext === 'number')) { + context.abilityId = subTriggerOrContext; + subTrigger = subTriggerOrContext; + } else if (triggerType === 'onBattleState' && typeof subTriggerOrContext === 'string') { + subTrigger = subTriggerOrContext; + } else if (triggerType === 'basicAttack' && typeof subTriggerOrContext === 'string') { + subTrigger = subTriggerOrContext; + } + + const opponentFullData = dataUtils.getCharacterData(opponentCharacterKey); + if (!opponentFullData) return; + + const tauntText = gameLogic.getRandomTaunt( + characterState.characterKey, + triggerType, + subTrigger || context, + GAME_CONFIG, + opponentFullData, + this.gameState + ); + + if (tauntText && tauntText !== "(Молчание)") { + this.addToLog(`${characterState.name}: "${tauntText}"`, GAME_CONFIG.LOG_TYPE_INFO); + } + } + + initializeGame() { + console.log(`[GameInstance ${this.id}] Инициализация состояния игры. Режим: ${this.mode}. Активных игроков (PCH): ${this.playerCount}. Всего записей в PCH.players: ${Object.keys(this.players).length}. PlayerKey: ${this.playerCharacterKey}, OpponentKey: ${this.opponentCharacterKey}`); + + const p1ActiveEntry = Object.values(this.players).find(p => p.id === GAME_CONFIG.PLAYER_ID && !p.isTemporarilyDisconnected); + const p2ActiveEntry = Object.values(this.players).find(p => p.id === GAME_CONFIG.OPPONENT_ID && !p.isTemporarilyDisconnected); + + // Устанавливаем ключи персонажей, если они еще не установлены, на основе активных игроков в PCH + // Это важно, если initializeGame вызывается до того, как PCH успел обновить ключи в GI через сеттеры + if (p1ActiveEntry && !this.playerCharacterKey) this.playerCharacterKey = p1ActiveEntry.chosenCharacterKey; + if (p2ActiveEntry && !this.opponentCharacterKey && this.mode === 'pvp') this.opponentCharacterKey = p2ActiveEntry.chosenCharacterKey; + + + if (this.mode === 'ai') { + if (!p1ActiveEntry) { this._handleCriticalError('init_ai_no_active_player_gi', 'Инициализация AI игры: Игрок-человек не найден или не активен.'); return false; } + if (!this.playerCharacterKey) { this._handleCriticalError('init_ai_no_player_key_gi', 'Инициализация AI игры: Ключ персонажа игрока не установлен.'); return false;} + this.opponentCharacterKey = 'balard'; + } else { // pvp + if (this.playerCount === 1 && p1ActiveEntry && !this.playerCharacterKey) { + this._handleCriticalError('init_pvp_single_player_no_key_gi', 'PvP инициализация (1 игрок): Ключ персонажа игрока отсутствует.'); return false; + } + if (this.playerCount === 2 && (!this.playerCharacterKey || !this.opponentCharacterKey)) { + this._handleCriticalError('init_pvp_char_key_missing_gi', `Инициализация PvP: playerCount=2, но ключ персонажа отсутствует. P1Key: ${this.playerCharacterKey}, P2Key: ${this.opponentCharacterKey}.`); + return false; + } + } + + const playerData = this.playerCharacterKey ? dataUtils.getCharacterData(this.playerCharacterKey) : null; + const opponentData = this.opponentCharacterKey ? dataUtils.getCharacterData(this.opponentCharacterKey) : null; + + const isPlayerSlotFilledAndActive = !!(playerData && p1ActiveEntry); + const isOpponentSlotFilledAndActive = !!(opponentData && (this.mode === 'ai' || p2ActiveEntry)); + + if (this.mode === 'ai' && (!isPlayerSlotFilledAndActive || !opponentData) ) { + this._handleCriticalError('init_ai_data_fail_gs_gi', 'Инициализация AI игры: Не удалось загрузить данные игрока или AI для gameState.'); return false; + } + + this.logBuffer = []; + + // Имена берутся из playerData/opponentData, если они есть. PCH обновит их при реконнекте, если они изменились. + const playerName = playerData?.baseStats?.name || (p1ActiveEntry?.name || 'Ожидание Игрока 1...'); + let opponentName; + if (this.mode === 'ai') { + opponentName = opponentData?.baseStats?.name || 'Противник AI'; + } else { + opponentName = opponentData?.baseStats?.name || (p2ActiveEntry?.name || 'Ожидание Игрока 2...'); + } + + + this.gameState = { + player: isPlayerSlotFilledAndActive ? + this._createFighterState(GAME_CONFIG.PLAYER_ID, playerData.baseStats, playerData.abilities, playerName) : // Передаем имя + this._createFighterState(GAME_CONFIG.PLAYER_ID, { name: playerName, maxHp: 1, maxResource: 0, resourceName: 'N/A', attackPower: 0, characterKey: null }, [], playerName), + opponent: isOpponentSlotFilledAndActive ? + this._createFighterState(GAME_CONFIG.OPPONENT_ID, opponentData.baseStats, opponentData.abilities, opponentName) : // Передаем имя + this._createFighterState(GAME_CONFIG.OPPONENT_ID, { name: opponentName, maxHp: 1, maxResource: 0, resourceName: 'N/A', attackPower: 0, characterKey: null }, [], opponentName), + isPlayerTurn: (isPlayerSlotFilledAndActive && isOpponentSlotFilledAndActive) ? (Math.random() < 0.5) : true, + isGameOver: false, + turnNumber: 1, + gameMode: this.mode + }; + console.log(`[GameInstance ${this.id}] Состояние игры инициализировано. Игрок: ${this.gameState.player.name} (${this.gameState.player.characterKey}). Оппонент: ${this.gameState.opponent.name} (${this.gameState.opponent.characterKey}). IsPlayerTurn: ${this.gameState.isPlayerTurn}. Готово к старту: AI=${isPlayerSlotFilledAndActive && !!opponentData}, PvP1=${isPlayerSlotFilledAndActive}, PvP2=${isPlayerSlotFilledAndActive && isOpponentSlotFilledAndActive}`); + return (this.mode === 'ai') ? (isPlayerSlotFilledAndActive && !!opponentData) : isPlayerSlotFilledAndActive; + } + + _createFighterState(roleId, baseStats, abilities, explicitName = null) { + const fighterState = { + id: roleId, characterKey: baseStats.characterKey, name: explicitName || baseStats.name, // Используем explicitName если передано + currentHp: baseStats.maxHp, maxHp: baseStats.maxHp, + currentResource: baseStats.maxResource, maxResource: baseStats.maxResource, + resourceName: baseStats.resourceName, attackPower: baseStats.attackPower, + isBlocking: false, activeEffects: [], disabledAbilities: [], abilityCooldowns: {} + }; + (abilities || []).forEach(ability => { + if (typeof ability.cooldown === 'number' && ability.cooldown >= 0) { + fighterState.abilityCooldowns[ability.id] = 0; + } + }); + if (baseStats.characterKey === 'balard') { + fighterState.silenceCooldownTurns = 0; + fighterState.manaDrainCooldownTurns = 0; + } + return fighterState; + } + + startGame() { + console.log(`[GameInstance ${this.id}] Попытка запуска игры. Paused: ${this.isGameEffectivelyPaused()}`); + if (this.isGameEffectivelyPaused()) { + console.log(`[GameInstance ${this.id}] Запуск игры отложен: игра на паузе.`); + return; + } + + if (!this.gameState || !this.gameState.player?.characterKey || !this.gameState.opponent?.characterKey) { + console.warn(`[GameInstance ${this.id}] startGame: gameState или ключи персонажей не полностью инициализированы. Попытка повторной инициализации.`); + if (!this.initializeGame() || !this.gameState?.player?.characterKey || !this.gameState?.opponent?.characterKey) { + this._handleCriticalError('start_game_reinit_failed_sg_gi', 'Повторная инициализация перед стартом не удалась или ключи все еще отсутствуют в gameState.'); + return; + } + } + console.log(`[GameInstance ${this.id}] Запуск игры. Игрок в GS: ${this.gameState.player.name} (${this.playerCharacterKey}), Оппонент в GS: ${this.gameState.opponent.name} (${this.opponentCharacterKey}). IsPlayerTurn: ${this.gameState.isPlayerTurn}`); + + const pData = dataUtils.getCharacterData(this.playerCharacterKey); + const oData = dataUtils.getCharacterData(this.opponentCharacterKey); + + if (!pData || !oData) { + this._handleCriticalError('start_char_data_fail_sg_gi', `Не удалось загрузить данные персонажей при старте игры. PData: ${!!pData}, OData: ${!!oData}`); + return; + } + + // Обновляем имена в gameState на основе данных персонажей перед отправкой клиентам + // Это гарантирует, что имена из dataUtils (самые "правильные") попадут в первое gameStarted + if (this.gameState.player && pData?.baseStats?.name) this.gameState.player.name = pData.baseStats.name; + if (this.gameState.opponent && oData?.baseStats?.name) this.gameState.opponent.name = oData.baseStats.name; + + + this.addToLog('⚔️ Новая битва начинается! ⚔️', GAME_CONFIG.LOG_TYPE_SYSTEM); + + if(this.gameState.player?.characterKey && this.gameState.opponent?.characterKey) { + this._sayTaunt(this.gameState.player, this.gameState.opponent.characterKey, 'onBattleState', 'start'); + this._sayTaunt(this.gameState.opponent, this.gameState.player.characterKey, 'onBattleState', 'start'); + } else { + console.warn(`[GameInstance ${this.id}] Не удалось произнести стартовые насмешки во время startGame, gameState акторы/ключи не полностью готовы.`); + } + + const initialLog = this.consumeLogBuffer(); + + Object.values(this.players).forEach(playerInfo => { + if (playerInfo.socket?.connected && !playerInfo.isTemporarilyDisconnected) { + const dataForThisClient = playerInfo.id === GAME_CONFIG.PLAYER_ID ? + { playerBaseStats: pData.baseStats, opponentBaseStats: oData.baseStats, playerAbilities: pData.abilities, opponentAbilities: oData.abilities } : + { playerBaseStats: oData.baseStats, opponentBaseStats: pData.baseStats, playerAbilities: oData.abilities, opponentAbilities: pData.abilities }; + + playerInfo.socket.emit('gameStarted', { + gameId: this.id, + yourPlayerId: playerInfo.id, + initialGameState: this.gameState, + ...dataForThisClient, + log: [...initialLog], + clientConfig: { ...GAME_CONFIG } + }); + } + }); + + const firstTurnActor = this.gameState.isPlayerTurn ? this.gameState.player : this.gameState.opponent; + this.addToLog(`--- Ход ${this.gameState.turnNumber} начинается для: ${firstTurnActor.name} ---`, GAME_CONFIG.LOG_TYPE_TURN); + this.broadcastLogUpdate(); + + const isFirstTurnAi = this.mode === 'ai' && !this.gameState.isPlayerTurn; + console.log(`[GameInstance ${this.id}] Запуск таймера в startGame. isPlayerTurn: ${this.gameState.isPlayerTurn}, isFirstTurnAi: ${isFirstTurnAi}`); + this.turnTimer.start(this.gameState.isPlayerTurn, isFirstTurnAi); + + if (isFirstTurnAi) { + setTimeout(() => { + if (!this.isGameEffectivelyPaused() && this.gameState && !this.gameState.isGameOver && this.mode === 'ai' && !this.gameState.isPlayerTurn) { + this.processAiTurn(); + } + }, GAME_CONFIG.DELAY_OPPONENT_TURN); + } + } + + processPlayerAction(identifier, actionData) { + console.log(`[GameInstance ${this.id}] processPlayerAction от ${identifier}. Действие: ${actionData.actionType}. Текущий GS.isPlayerTurn: ${this.gameState?.isPlayerTurn}. Paused: ${this.isGameEffectivelyPaused()}`); + const actingPlayerInfo = Object.values(this.players).find(p => p.identifier === identifier); + if (!actingPlayerInfo || !actingPlayerInfo.socket) { + console.error(`[GameInstance ${this.id}] Действие от неизвестного или безсокетного идентификатора ${identifier}.`); return; + } + + if (this.isGameEffectivelyPaused()) { + actingPlayerInfo.socket.emit('gameError', {message: "Действие невозможно: игра на паузе."}); + return; + } + if (!this.gameState || this.gameState.isGameOver) { return; } + + const actingPlayerRole = actingPlayerInfo.id; + const isCorrectTurn = (this.gameState.isPlayerTurn && actingPlayerRole === GAME_CONFIG.PLAYER_ID) || + (!this.gameState.isPlayerTurn && actingPlayerRole === GAME_CONFIG.OPPONENT_ID); + + if (!isCorrectTurn) { + console.warn(`[GameInstance ${this.id}] Неверный ход! Игрок ${identifier} (роль ${actingPlayerRole}) пытался действовать. GS.isPlayerTurn: ${this.gameState.isPlayerTurn}`); + actingPlayerInfo.socket.emit('gameError', { message: "Не ваш ход." }); + return; + } + + console.log(`[GameInstance ${this.id}] Ход корректен. Очистка таймера.`); + if(this.turnTimer.isActive()) this.turnTimer.clear(); + + const attackerState = this.gameState[actingPlayerRole]; + const defenderRole = actingPlayerRole === GAME_CONFIG.PLAYER_ID ? GAME_CONFIG.OPPONENT_ID : GAME_CONFIG.PLAYER_ID; + const defenderState = this.gameState[defenderRole]; + + if (!attackerState || !attackerState.characterKey || !defenderState || !defenderState.characterKey) { + this._handleCriticalError('action_actor_state_invalid_gi', `Состояние/ключ Атакующего или Защитника недействительны.`); return; + } + const attackerData = dataUtils.getCharacterData(attackerState.characterKey); + const defenderData = dataUtils.getCharacterData(defenderState.characterKey); + if (!attackerData || !defenderData) { this._handleCriticalError('action_char_data_fail_process_gi', 'Ошибка данных персонажа при действии.'); return; } + + let actionIsValidAndPerformed = false; + + if (actionData.actionType === 'attack') { + this._sayTaunt(attackerState, defenderState.characterKey, 'basicAttack'); + gameLogic.performAttack(attackerState, defenderState, attackerData.baseStats, defenderData.baseStats, this.gameState, this.addToLog.bind(this), GAME_CONFIG, dataUtils, gameLogic.getRandomTaunt); + actionIsValidAndPerformed = true; + } else if (actionData.actionType === 'ability' && actionData.abilityId) { + const ability = attackerData.abilities.find(ab => ab.id === actionData.abilityId); + if (!ability) { + actingPlayerInfo.socket.emit('gameError', { message: "Неизвестная способность." }); + } else { + const validityCheck = gameLogic.checkAbilityValidity(ability, attackerState, defenderState, GAME_CONFIG); + if (validityCheck.isValid) { + this._sayTaunt(attackerState, defenderState.characterKey, 'selfCastAbility', ability.id); + attackerState.currentResource = Math.round(attackerState.currentResource - ability.cost); + gameLogic.applyAbilityEffect(ability, attackerState, defenderState, attackerData.baseStats, defenderData.baseStats, this.gameState, this.addToLog.bind(this), GAME_CONFIG, dataUtils, gameLogic.getRandomTaunt, null); + gameLogic.setAbilityCooldown(ability, attackerState, GAME_CONFIG); + actionIsValidAndPerformed = true; + } else { + this.addToLog(validityCheck.reason || `${attackerState.name} не может использовать "${ability.name}".`, GAME_CONFIG.LOG_TYPE_INFO); + actionIsValidAndPerformed = false; + } + } + } else { + actionIsValidAndPerformed = false; + } + + if (this.checkGameOver()) return; + this.broadcastLogUpdate(); + if (actionIsValidAndPerformed) { + setTimeout(() => this.switchTurn(), GAME_CONFIG.DELAY_AFTER_PLAYER_ACTION); + } else { + const isAiTurnForTimer = this.mode === 'ai' && !this.gameState.isPlayerTurn; + console.log(`[GameInstance ${this.id}] Действие не выполнено, перезапуск таймера. isPlayerTurn: ${this.gameState.isPlayerTurn}, isAiTurnForTimer: ${isAiTurnForTimer}`); + this.turnTimer.start(this.gameState.isPlayerTurn, isAiTurnForTimer); + } + } + + switchTurn() { + console.log(`[GameInstance ${this.id}] Попытка смены хода. Paused: ${this.isGameEffectivelyPaused()}, GameOver: ${this.gameState?.isGameOver}`); + if (this.isGameEffectivelyPaused()) { console.log(`[GameInstance ${this.id}] Смена хода отложена: игра на паузе.`); return; } + if (!this.gameState || this.gameState.isGameOver) { return; } + if(this.turnTimer.isActive()) this.turnTimer.clear(); + + const endingTurnActorRole = this.gameState.isPlayerTurn ? GAME_CONFIG.PLAYER_ID : GAME_CONFIG.OPPONENT_ID; + const endingTurnActorState = this.gameState[endingTurnActorRole]; + if (!endingTurnActorState || !endingTurnActorState.characterKey) { this._handleCriticalError('switch_turn_ending_actor_invalid_gi', `Состояние или ключ актора, завершающего ход, недействительны.`); return; } + const endingTurnActorData = dataUtils.getCharacterData(endingTurnActorState.characterKey); + if (!endingTurnActorData) { this._handleCriticalError('switch_turn_char_data_fail_gi', `Отсутствуют данные персонажа.`); return; } + + gameLogic.processEffects(endingTurnActorState.activeEffects, endingTurnActorState, endingTurnActorData.baseStats, endingTurnActorRole, this.gameState, this.addToLog.bind(this), GAME_CONFIG, dataUtils); + gameLogic.updateBlockingStatus(endingTurnActorState); + if (endingTurnActorState.abilityCooldowns && endingTurnActorData.abilities) gameLogic.processPlayerAbilityCooldowns(endingTurnActorState.abilityCooldowns, endingTurnActorData.abilities, endingTurnActorState.name, this.addToLog.bind(this), GAME_CONFIG); + if (endingTurnActorState.characterKey === 'balard') gameLogic.processBalardSpecialCooldowns(endingTurnActorState); + if (endingTurnActorState.disabledAbilities?.length > 0 && endingTurnActorData.abilities) gameLogic.processDisabledAbilities(endingTurnActorState.disabledAbilities, endingTurnActorData.abilities, endingTurnActorState.name, this.addToLog.bind(this), GAME_CONFIG); + + if (this.checkGameOver()) return; + + this.gameState.isPlayerTurn = !this.gameState.isPlayerTurn; + if (this.gameState.isPlayerTurn) this.gameState.turnNumber++; + + const currentTurnActorRole = this.gameState.isPlayerTurn ? GAME_CONFIG.PLAYER_ID : GAME_CONFIG.OPPONENT_ID; + const currentTurnActorState = this.gameState[currentTurnActorRole]; + if (!currentTurnActorState || !currentTurnActorState.name) { this._handleCriticalError('switch_turn_current_actor_invalid_gi', `Состояние или имя текущего актора недействительны.`); return; } + + this.addToLog(`--- Ход ${this.gameState.turnNumber} начинается для: ${currentTurnActorState.name} ---`, GAME_CONFIG.LOG_TYPE_TURN); + this.broadcastGameStateUpdate(); + + const currentTurnPlayerEntry = Object.values(this.players).find(p => p.id === currentTurnActorRole); + if (currentTurnPlayerEntry && currentTurnPlayerEntry.isTemporarilyDisconnected) { + console.log(`[GameInstance ${this.id}] Ход перешел к ${currentTurnActorRole}, но игрок ${currentTurnPlayerEntry.identifier} отключен. Таймер не запущен switchTurn.`); + } else { + const isNextTurnAi = this.mode === 'ai' && !this.gameState.isPlayerTurn; + console.log(`[GameInstance ${this.id}] Запуск таймера в switchTurn. isPlayerTurn: ${this.gameState.isPlayerTurn}, isNextTurnAi: ${isNextTurnAi}`); + this.turnTimer.start(this.gameState.isPlayerTurn, isNextTurnAi); + if (isNextTurnAi) { + setTimeout(() => { + if (!this.isGameEffectivelyPaused() && this.gameState && !this.gameState.isGameOver && this.mode === 'ai' && !this.gameState.isPlayerTurn) { + this.processAiTurn(); + } + }, GAME_CONFIG.DELAY_OPPONENT_TURN); + } + } + } + + processAiTurn() { + console.log(`[GameInstance ${this.id}] processAiTurn. Paused: ${this.isGameEffectivelyPaused()}, GameOver: ${this.gameState?.isGameOver}, IsPlayerTurn: ${this.gameState?.isPlayerTurn}`); + if (this.isGameEffectivelyPaused()) { console.log(`[GameInstance ${this.id}] Ход AI отложен: игра на паузе.`); return; } + if (!this.gameState || this.gameState.isGameOver || this.gameState.isPlayerTurn || !this.aiOpponent) { return; } + if(this.gameState.opponent?.characterKey !== 'balard' && this.aiOpponent) { + console.error(`[GameInstance ${this.id}] AI не Балард! Персонаж AI: ${this.gameState.opponent?.characterKey}. Принудительная смена хода.`); + this.switchTurn(); + return; + } + if(this.turnTimer.isActive()) this.turnTimer.clear(); + + const aiState = this.gameState.opponent; + const playerState = this.gameState.player; + if (!playerState || !playerState.characterKey) { this._handleCriticalError('ai_turn_player_state_invalid_gi', 'Состояние игрока недействительно для хода AI.'); return; } + + const aiDecision = gameLogic.decideAiAction(this.gameState, dataUtils, GAME_CONFIG, this.addToLog.bind(this)); + let actionIsValidAndPerformedForAI = false; + + if (aiDecision.actionType === 'attack') { + this._sayTaunt(aiState, playerState.characterKey, 'basicAttack'); + gameLogic.performAttack(aiState, playerState, dataUtils.getCharacterBaseStats(aiState.characterKey), dataUtils.getCharacterBaseStats(playerState.characterKey), this.gameState, this.addToLog.bind(this), GAME_CONFIG, dataUtils, gameLogic.getRandomTaunt); + actionIsValidAndPerformedForAI = true; + } else if (aiDecision.actionType === 'ability' && aiDecision.ability) { + this._sayTaunt(aiState, playerState.characterKey, 'selfCastAbility', aiDecision.ability.id); + aiState.currentResource = Math.round(aiState.currentResource - aiDecision.ability.cost); + gameLogic.applyAbilityEffect(aiDecision.ability, aiState, playerState, dataUtils.getCharacterBaseStats(aiState.characterKey), dataUtils.getCharacterBaseStats(playerState.characterKey), this.gameState, this.addToLog.bind(this), GAME_CONFIG, dataUtils, gameLogic.getRandomTaunt, null); + gameLogic.setAbilityCooldown(aiDecision.ability, aiState, GAME_CONFIG); + actionIsValidAndPerformedForAI = true; + } else if (aiDecision.actionType === 'pass') { + if (aiDecision.logMessage && this.addToLog) this.addToLog(aiDecision.logMessage.message, aiDecision.logMessage.type); + else if(this.addToLog) this.addToLog(`${aiState.name} пропускает ход.`, GAME_CONFIG.LOG_TYPE_INFO); + actionIsValidAndPerformedForAI = true; + } + + if (this.checkGameOver()) return; + this.broadcastLogUpdate(); + if (actionIsValidAndPerformedForAI) { + setTimeout(() => this.switchTurn(), GAME_CONFIG.DELAY_AFTER_PLAYER_ACTION); + } else { + console.error(`[GameInstance ${this.id}] AI не смог выполнить действие. Принудительная смена хода.`); + setTimeout(() => this.switchTurn(), GAME_CONFIG.DELAY_AFTER_PLAYER_ACTION); + } + } + + checkGameOver() { + if (!this.gameState || this.gameState.isGameOver) return this.gameState?.isGameOver ?? true; + + if (!this.gameState.isGameOver && this.gameState.player?.characterKey && this.gameState.opponent?.characterKey) { + const player = this.gameState.player; const opponent = this.gameState.opponent; + const pData = dataUtils.getCharacterData(player.characterKey); const oData = dataUtils.getCharacterData(opponent.characterKey); + if (pData && oData) { + const nearDefeatThreshold = GAME_CONFIG.OPPONENT_NEAR_DEFEAT_THRESHOLD_PERCENT || 0.2; + if (opponent.currentHp > 0 && (opponent.currentHp / oData.baseStats.maxHp) <= nearDefeatThreshold) { + this._sayTaunt(player, opponent.characterKey, 'onBattleState', 'opponentNearDefeat'); + } + if (player.currentHp > 0 && (player.currentHp / pData.baseStats.maxHp) <= nearDefeatThreshold) { + this._sayTaunt(opponent, player.characterKey, 'onBattleState', 'opponentNearDefeat'); + } + } + } + + const gameOverResult = gameLogic.getGameOverResult(this.gameState, GAME_CONFIG, this.mode); + if (gameOverResult.isOver) { + this.gameState.isGameOver = true; + if(this.turnTimer.isActive()) this.turnTimer.clear(); + this.clearAllReconnectTimers(); + this.addToLog(gameOverResult.logMessage, GAME_CONFIG.LOG_TYPE_SYSTEM); + + const winnerState = this.gameState[gameOverResult.winnerRole]; + const loserState = this.gameState[gameOverResult.loserRole]; + if (winnerState?.characterKey && loserState?.characterKey) { + this._sayTaunt(winnerState, loserState.characterKey, 'onBattleState', 'opponentNearDefeat'); + } + + console.log(`[GameInstance ${this.id}] Игра окончена. Победитель: ${gameOverResult.winnerRole || 'Нет'}. Причина: ${gameOverResult.reason}.`); + this.io.to(this.id).emit('gameOver', { + winnerId: gameOverResult.winnerRole, + reason: gameOverResult.reason, + finalGameState: this.gameState, + log: this.consumeLogBuffer(), + loserCharacterKey: loserState?.characterKey || 'unknown' + }); + this.gameManager._cleanupGame(this.id, `game_ended_${gameOverResult.reason}`); + return true; + } + return false; + } + + endGameDueToDisconnect(disconnectedPlayerRole, disconnectedCharacterKey, reason = "opponent_disconnected", winnerIfAny = null) { + if (this.gameState && !this.gameState.isGameOver) { + this.gameState.isGameOver = true; + if(this.turnTimer.isActive()) this.turnTimer.clear(); + this.clearAllReconnectTimers(); + + let actualWinnerRole = winnerIfAny; + let winnerActuallyExists = false; + + if (actualWinnerRole) { + const winnerPlayerEntry = Object.values(this.players).find(p => p.id === actualWinnerRole && !p.isTemporarilyDisconnected); + if (this.mode === 'ai' && actualWinnerRole === GAME_CONFIG.OPPONENT_ID) { + winnerActuallyExists = !!this.gameState.opponent?.characterKey; + } else if (winnerPlayerEntry) { + winnerActuallyExists = true; + } + } + + if (!winnerActuallyExists) { + actualWinnerRole = (disconnectedPlayerRole === GAME_CONFIG.PLAYER_ID ? GAME_CONFIG.OPPONENT_ID : GAME_CONFIG.PLAYER_ID); + const defaultWinnerEntry = Object.values(this.players).find(p => p.id === actualWinnerRole && !p.isTemporarilyDisconnected); + if (this.mode === 'ai' && actualWinnerRole === GAME_CONFIG.OPPONENT_ID) { + winnerActuallyExists = !!this.gameState.opponent?.characterKey; + } else if (defaultWinnerEntry) { + winnerActuallyExists = true; + } + } + + const finalWinnerRole = winnerActuallyExists ? actualWinnerRole : null; + const result = gameLogic.getGameOverResult(this.gameState, GAME_CONFIG, this.mode, reason, finalWinnerRole, disconnectedPlayerRole); + + this.addToLog(result.logMessage, GAME_CONFIG.LOG_TYPE_SYSTEM); + console.log(`[GameInstance ${this.id}] Игра завершена из-за отключения: ${reason}. Победитель: ${result.winnerRole || 'Нет'}.`); + this.io.to(this.id).emit('gameOver', { + winnerId: result.winnerRole, + reason: result.reason, + finalGameState: this.gameState, + log: this.consumeLogBuffer(), + loserCharacterKey: disconnectedCharacterKey, + disconnectedCharacterName: (reason === 'opponent_disconnected' || reason === 'player_left_ai_game' || reason === 'opponent_left_pvp_game') ? + (this.gameState[disconnectedPlayerRole]?.name || disconnectedCharacterKey) : undefined + }); + this.gameManager._cleanupGame(this.id, `disconnect_game_ended_gi_${result.reason}`); + } else if (this.gameState?.isGameOver) { + console.log(`[GameInstance ${this.id}] EndGameDueToDisconnect: игра уже была завершена.`); + this.gameManager._cleanupGame(this.id, `already_over_on_disconnect_cleanup_gi`); + } else { + console.log(`[GameInstance ${this.id}] EndGameDueToDisconnect: нет gameState.`); + this.gameManager._cleanupGame(this.id, `no_gamestate_on_disconnect_cleanup_gi`); + } + } + + playerExplicitlyLeftAiGame(identifier) { + if (this.mode !== 'ai' || (this.gameState && this.gameState.isGameOver)) { + console.log(`[GameInstance ${this.id}] playerExplicitlyLeftAiGame вызван, но не режим AI или игра завершена.`); + if (this.gameState?.isGameOver) this.gameManager._cleanupGame(this.id, `player_left_ai_already_over_gi`); + return; + } + + const playerEntry = Object.values(this.players).find(p => p.identifier === identifier); + if (!playerEntry || playerEntry.id !== GAME_CONFIG.PLAYER_ID) { + console.warn(`[GameInstance ${this.id}] playerExplicitlyLeftAiGame: Идентификатор ${identifier} не является игроком-человеком или не найден.`); + return; + } + + console.log(`[GameInstance ${this.id}] Игрок ${identifier} явно покинул AI игру.`); + if (this.gameState) { + this.gameState.isGameOver = true; + this.addToLog(`Игрок покинул битву с ${this.gameState.opponent?.name || 'AI'}.`, GAME_CONFIG.LOG_TYPE_SYSTEM); + } else { + this.addToLog(`Игрок покинул AI игру до ее полного начала.`, GAME_CONFIG.LOG_TYPE_SYSTEM); + } + + if (this.turnTimer.isActive()) this.turnTimer.clear(); + this.clearAllReconnectTimers(); + + this.io.to(this.id).emit('gameOver', { + winnerId: GAME_CONFIG.OPPONENT_ID, + reason: "player_left_ai_game", + finalGameState: this.gameState, + log: this.consumeLogBuffer(), + loserCharacterKey: playerEntry.chosenCharacterKey + }); + this.gameManager._cleanupGame(this.id, 'player_left_ai_explicitly_gi'); + } + + playerDidSurrender(surrenderingPlayerIdentifier) { + console.log(`[GameInstance ${this.id}] playerDidSurrender вызван для идентификатора: ${surrenderingPlayerIdentifier}`); + + if (!this.gameState || this.gameState.isGameOver) { + if (this.gameState?.isGameOver) { this.gameManager._cleanupGame(this.id, `surrender_on_finished_gi`); } + console.warn(`[GameInstance ${this.id}] Попытка сдачи в неактивной/завершенной игре от ${surrenderingPlayerIdentifier}.`); + return; + } + + const surrenderedPlayerEntry = Object.values(this.players).find(p => p.identifier === surrenderingPlayerIdentifier); + if (!surrenderedPlayerEntry) { + console.error(`[GameInstance ${this.id}] Сдающийся игрок ${surrenderingPlayerIdentifier} не найден.`); + return; + } + const surrenderingPlayerRole = surrenderedPlayerEntry.id; + + if (this.mode === 'ai') { + if (surrenderingPlayerRole === GAME_CONFIG.PLAYER_ID) { + console.log(`[GameInstance ${this.id}] Игрок ${surrenderingPlayerIdentifier} "сдался" (покинул) AI игру.`); + this.playerExplicitlyLeftAiGame(surrenderingPlayerIdentifier); + } else { + console.warn(`[GameInstance ${this.id}] Сдача в AI режиме от не-игрока (роль: ${surrenderingPlayerRole}). Игнорируется.`); + } + return; + } + + if (this.mode !== 'pvp') { + console.warn(`[GameInstance ${this.id}] Сдача вызвана в не-PvP, не-AI режиме: ${this.mode}. Игнорируется.`); + return; + } + + const surrenderedPlayerName = this.gameState[surrenderingPlayerRole]?.name || surrenderedPlayerEntry.chosenCharacterKey; + const surrenderedPlayerCharKey = this.gameState[surrenderingPlayerRole]?.characterKey || surrenderedPlayerEntry.chosenCharacterKey; + const winnerRole = surrenderingPlayerRole === GAME_CONFIG.PLAYER_ID ? GAME_CONFIG.OPPONENT_ID : GAME_CONFIG.PLAYER_ID; + const winnerName = this.gameState[winnerRole]?.name || `Оппонент`; + const winnerCharKey = this.gameState[winnerRole]?.characterKey; + + this.gameState.isGameOver = true; + if(this.turnTimer.isActive()) this.turnTimer.clear(); + this.clearAllReconnectTimers(); + + this.addToLog(`🏳️ ${surrenderedPlayerName} сдался! ${winnerName} объявляется победителем!`, GAME_CONFIG.LOG_TYPE_SYSTEM); + console.log(`[GameInstance ${this.id}] Игрок ${surrenderedPlayerName} (Роль: ${surrenderingPlayerRole}) сдался. Победитель: ${winnerName} (Роль: ${winnerRole}).`); + + if (winnerCharKey && surrenderedPlayerCharKey && this.gameState[winnerRole]) { + this._sayTaunt(this.gameState[winnerRole], surrenderedPlayerCharKey, 'onBattleState', 'opponentNearDefeat'); + } + + this.io.to(this.id).emit('gameOver', { + winnerId: winnerRole, reason: "player_surrendered", + finalGameState: this.gameState, log: this.consumeLogBuffer(), + loserCharacterKey: surrenderedPlayerCharKey + }); + this.gameManager._cleanupGame(this.id, "player_surrendered_gi"); + } + + handleTurnTimeout() { + if (!this.gameState || this.gameState.isGameOver) return; + console.log(`[GameInstance ${this.id}] Произошел таймаут хода.`); + const timedOutPlayerRole = this.gameState.isPlayerTurn ? GAME_CONFIG.PLAYER_ID : GAME_CONFIG.OPPONENT_ID; + + const winnerPlayerRoleIfHuman = timedOutPlayerRole === GAME_CONFIG.PLAYER_ID ? GAME_CONFIG.OPPONENT_ID : GAME_CONFIG.PLAYER_ID; + let winnerActuallyExists = false; + + if (this.mode === 'ai' && winnerPlayerRoleIfHuman === GAME_CONFIG.OPPONENT_ID) { + winnerActuallyExists = !!this.gameState.opponent?.characterKey; + } else { + const winnerEntry = Object.values(this.players).find(p => p.id === winnerPlayerRoleIfHuman && !p.isTemporarilyDisconnected); + winnerActuallyExists = !!winnerEntry; + } + + const result = gameLogic.getGameOverResult(this.gameState, GAME_CONFIG, this.mode, 'turn_timeout', winnerActuallyExists ? winnerPlayerRoleIfHuman : null, timedOutPlayerRole); + + this.gameState.isGameOver = true; + this.clearAllReconnectTimers(); + + this.addToLog(result.logMessage, GAME_CONFIG.LOG_TYPE_SYSTEM); + if (result.winnerRole && this.gameState[result.winnerRole]?.characterKey && this.gameState[result.loserRole]?.characterKey) { + this._sayTaunt(this.gameState[result.winnerRole], this.gameState[result.loserRole].characterKey, 'onBattleState', 'opponentNearDefeat'); + } + console.log(`[GameInstance ${this.id}] Ход истек для ${this.gameState[timedOutPlayerRole]?.name || timedOutPlayerRole}. Победитель: ${result.winnerRole ? (this.gameState[result.winnerRole]?.name || result.winnerRole) : 'Нет'}.`); + this.io.to(this.id).emit('gameOver', { + winnerId: result.winnerRole, + reason: result.reason, + finalGameState: this.gameState, + log: this.consumeLogBuffer(), + loserCharacterKey: this.gameState[timedOutPlayerRole]?.characterKey || 'unknown' + }); + this.gameManager._cleanupGame(this.id, `timeout_gi_${result.reason}`); + } + + _handleCriticalError(reasonCode, logMessage) { + console.error(`[GameInstance ${this.id}] КРИТИЧЕСКАЯ ОШИБКА: ${logMessage} (Код: ${reasonCode})`); + if (this.gameState && !this.gameState.isGameOver) this.gameState.isGameOver = true; + else if (!this.gameState) { + this.gameState = { isGameOver: true, player: {}, opponent: {}, turnNumber: 0, gameMode: this.mode }; + } + + if(this.turnTimer.isActive()) this.turnTimer.clear(); + this.clearAllReconnectTimers(); + + this.addToLog(`Критическая ошибка сервера: ${logMessage}. Игра будет завершена.`, GAME_CONFIG.LOG_TYPE_SYSTEM); + this.io.to(this.id).emit('gameOver', { + winnerId: null, + reason: `server_error_${reasonCode}`, + finalGameState: this.gameState, + log: this.consumeLogBuffer(), + loserCharacterKey: 'unknown' + }); + this.gameManager._cleanupGame(this.id, `critical_error_gi_${reasonCode}`); + } + + addToLog(message, type = GAME_CONFIG.LOG_TYPE_INFO) { + if (!message) return; + this.logBuffer.push({ message, type, timestamp: Date.now() }); + // Раскомментируйте для немедленной отправки логов, если нужно (но обычно лучше батчинг) + // this.broadcastLogUpdate(); + } + + consumeLogBuffer() { + const logs = [...this.logBuffer]; + this.logBuffer = []; + return logs; + } + + broadcastGameStateUpdate() { + if (this.isGameEffectivelyPaused()) { + console.log(`[GameInstance ${this.id}] broadcastGameStateUpdate отложено: игра на паузе.`); + return; + } + if (!this.gameState) { + console.warn(`[GameInstance ${this.id}] broadcastGameStateUpdate: gameState отсутствует.`); + return; + } + console.log(`[GameInstance ${this.id}] Отправка gameStateUpdate. IsPlayerTurn: ${this.gameState.isPlayerTurn}`); + this.io.to(this.id).emit('gameStateUpdate', { gameState: this.gameState, log: this.consumeLogBuffer() }); + } + + broadcastLogUpdate() { + if (this.isGameEffectivelyPaused() && this.logBuffer.some(log => log.type !== GAME_CONFIG.LOG_TYPE_SYSTEM)) { + const systemLogs = this.logBuffer.filter(log => log.type === GAME_CONFIG.LOG_TYPE_SYSTEM); + if (systemLogs.length > 0) { + this.io.to(this.id).emit('logUpdate', { log: systemLogs }); + } + this.logBuffer = this.logBuffer.filter(log => log.type !== GAME_CONFIG.LOG_TYPE_SYSTEM); // Оставляем несистемные + return; + } + if (this.logBuffer.length > 0) { + this.io.to(this.id).emit('logUpdate', { log: this.consumeLogBuffer() }); + } + } +} + +module.exports = GameInstance; \ No newline at end of file diff --git a/server/game/instance/Player.js b/server/game/instance/Player.js new file mode 100644 index 0000000..e69de29 diff --git a/server/game/instance/PlayerConnectionHandler.js b/server/game/instance/PlayerConnectionHandler.js new file mode 100644 index 0000000..d102294 --- /dev/null +++ b/server/game/instance/PlayerConnectionHandler.js @@ -0,0 +1,502 @@ +// /server/game/instance/PlayerConnectionHandler.js // +const GAME_CONFIG = require('../../core/config'); +const dataUtils = require('../../data/dataUtils'); + +class PlayerConnectionHandler { + constructor(gameInstance) { + this.gameInstance = gameInstance; // Ссылка на основной GameInstance + this.io = gameInstance.io; + this.gameId = gameInstance.id; + this.mode = gameInstance.mode; + + this.players = {}; // { socket.id: { id, socket, chosenCharacterKey, identifier, isTemporarilyDisconnected, name (optional from gameState) } } + this.playerSockets = {}; // { playerIdRole: socket } // Авторитетный сокет для роли + this.playerCount = 0; + + this.reconnectTimers = {}; // { playerIdRole: { timerId, updateIntervalId, startTimeMs, durationMs } } + this.pausedTurnState = null; // { remainingTime, forPlayerRoleIsPlayer, isAiCurrentlyMoving } + console.log(`[PCH for Game ${this.gameId}] Инициализирован.`); + } + + addPlayer(socket, chosenCharacterKey = 'elena', identifier) { + console.log(`[PCH ${this.gameId}] Попытка addPlayer. Socket: ${socket.id}, CharKey: ${chosenCharacterKey}, Identifier: ${identifier}`); + const existingPlayerByIdentifier = Object.values(this.players).find(p => p.identifier === identifier); + + if (existingPlayerByIdentifier) { + console.warn(`[PCH ${this.gameId}] Идентификатор ${identifier} уже связан с ролью игрока ${existingPlayerByIdentifier.id} (сокет ${existingPlayerByIdentifier.socket?.id}). Обрабатывается как возможное переподключение.`); + if (this.gameInstance.gameState && this.gameInstance.gameState.isGameOver) { + console.warn(`[PCH ${this.gameId}] Игрок ${identifier} пытается (пере)присоединиться к уже завершенной игре. Отправка gameError.`); + socket.emit('gameError', { message: 'Эта игра уже завершена.' }); + return false; + } + // Если игрок уже есть, и это не временное отключение, и сокет другой - это F5 или новая вкладка. + // GameManager должен был направить на handleRequestGameState, который вызовет handlePlayerReconnected. + // Прямой addPlayer в этом случае - редкий сценарий, но handlePlayerReconnected его обработает. + return this.handlePlayerReconnected(existingPlayerByIdentifier.id, socket); + } + + if (Object.keys(this.players).length >= 2 && this.playerCount >=2 && this.mode === 'pvp') { // В AI режиме только 1 человек + socket.emit('gameError', { message: 'Эта игра уже заполнена.' }); + return false; + } + if (this.mode === 'ai' && this.playerCount >=1) { + socket.emit('gameError', { message: 'К AI игре может присоединиться только один игрок.'}); + return false; + } + + + let assignedPlayerId; + let actualCharacterKey = chosenCharacterKey || 'elena'; + const charData = dataUtils.getCharacterData(actualCharacterKey); + + if (this.mode === 'ai') { + // if (this.playerSockets[GAME_CONFIG.PLAYER_ID]) { // Эта проверка уже покрыта playerCount >= 1 выше + // socket.emit('gameError', { message: 'Нельзя присоединиться к AI игре как второй игрок.' }); + // return false; + // } + assignedPlayerId = GAME_CONFIG.PLAYER_ID; + } else { // pvp + if (!this.playerSockets[GAME_CONFIG.PLAYER_ID]) { + assignedPlayerId = GAME_CONFIG.PLAYER_ID; + } else if (!this.playerSockets[GAME_CONFIG.OPPONENT_ID]) { + assignedPlayerId = GAME_CONFIG.OPPONENT_ID; + const firstPlayerInfo = Object.values(this.players).find(p => p.id === GAME_CONFIG.PLAYER_ID); + if (firstPlayerInfo && firstPlayerInfo.chosenCharacterKey === actualCharacterKey) { + if (actualCharacterKey === 'elena') actualCharacterKey = 'almagest'; + else if (actualCharacterKey === 'almagest') actualCharacterKey = 'elena'; + else actualCharacterKey = dataUtils.getAllCharacterKeys().find(k => k !== firstPlayerInfo.chosenCharacterKey) || 'elena'; + } + } else { // Оба слота заняты, но playerCount мог быть < 2 если кто-то в процессе дисконнекта + socket.emit('gameError', { message: 'Не удалось найти свободный слот в PvP игре (возможно, все заняты или в процессе переподключения).' }); + return false; + } + } + + // Если для этой роли УЖЕ был игрок (например, старый сокет при F5 до того, как сработал disconnect), + // то handlePlayerReconnected должен был бы это обработать. Этот блок здесь - подстраховка, + // если addPlayer вызван напрямую в таком редком случае. + const oldPlayerSocketIdForRole = Object.keys(this.players).find(sid => this.players[sid].id === assignedPlayerId && this.players[sid].socket?.id !== socket.id); + if (oldPlayerSocketIdForRole) { + const oldPlayerInfo = this.players[oldPlayerSocketIdForRole]; + console.warn(`[PCH ${this.gameId}] addPlayer: Найден старый сокет ${oldPlayerInfo.socket?.id} для роли ${assignedPlayerId}. Удаляем его запись.`); + if(oldPlayerInfo.socket) { try { oldPlayerInfo.socket.leave(this.gameId); oldPlayerInfo.socket.disconnect(true); } catch(e){} } + delete this.players[oldPlayerSocketIdForRole]; + } + + this.players[socket.id] = { + id: assignedPlayerId, + socket: socket, + chosenCharacterKey: actualCharacterKey, + identifier: identifier, + isTemporarilyDisconnected: false, + name: charData?.baseStats?.name || actualCharacterKey + }; + this.playerSockets[assignedPlayerId] = socket; + this.playerCount++; + socket.join(this.gameId); + console.log(`[PCH ${this.gameId}] Сокет ${socket.id} присоединен к комнате ${this.gameId} (addPlayer).`); + + + if (assignedPlayerId === GAME_CONFIG.PLAYER_ID) this.gameInstance.setPlayerCharacterKey(actualCharacterKey); + else if (assignedPlayerId === GAME_CONFIG.OPPONENT_ID) this.gameInstance.setOpponentCharacterKey(actualCharacterKey); + + if (!this.gameInstance.ownerIdentifier && (this.mode === 'ai' || (this.mode === 'pvp' && assignedPlayerId === GAME_CONFIG.PLAYER_ID))) { + this.gameInstance.setOwnerIdentifier(identifier); + } + + console.log(`[PCH ${this.gameId}] Игрок ${identifier} (Socket: ${socket.id}) добавлен как ${assignedPlayerId} с персонажем ${this.players[socket.id].name}. Активных игроков: ${this.playerCount}. Владелец: ${this.gameInstance.ownerIdentifier}`); + return true; + } + + removePlayer(socketId, reason = "unknown_reason_for_removal") { + const playerInfo = this.players[socketId]; + if (playerInfo) { + const playerRole = playerInfo.id; + const playerIdentifier = playerInfo.identifier; + console.log(`[PCH ${this.gameId}] Окончательное удаление игрока ${playerIdentifier} (Socket: ${socketId}, Role: ${playerRole}). Причина: ${reason}.`); + + if (playerInfo.socket) { + try { playerInfo.socket.leave(this.gameId); } catch (e) { console.warn(`[PCH ${this.gameId}] Ошибка при playerInfo.socket.leave: ${e.message}`); } + } + + if (!playerInfo.isTemporarilyDisconnected) { + this.playerCount--; + } + + delete this.players[socketId]; + if (this.playerSockets[playerRole]?.id === socketId) { + delete this.playerSockets[playerRole]; + } + this.clearReconnectTimer(playerRole); + + console.log(`[PCH ${this.gameId}] Игрок ${playerIdentifier} удален. Активных игроков сейчас: ${this.playerCount}.`); + this.gameInstance.handlePlayerPermanentlyLeft(playerRole, playerInfo.chosenCharacterKey, reason); + + } else { + console.warn(`[PCH ${this.gameId}] removePlayer вызван для неизвестного socketId: ${socketId}`); + } + } + + handlePlayerPotentiallyLeft(playerIdRole, identifier, characterKey, disconnectedSocketId) { + console.log(`[PCH ${this.gameId}] handlePlayerPotentiallyLeft для роли ${playerIdRole}, id ${identifier}, char ${characterKey}, disconnectedSocketId ${disconnectedSocketId}`); + const playerEntry = Object.values(this.players).find(p => p.id === playerIdRole && p.identifier === identifier); + + if (!playerEntry || !playerEntry.socket) { + console.warn(`[PCH ${this.gameId}] Запись игрока или сокет не найдены для ${identifier} (роль ${playerIdRole}) во время потенциального выхода. disconnectedSocketId: ${disconnectedSocketId}`); + // Если записи нет, возможно, игрок уже удален или это был очень старый сокет. + // Проверим, есть ли запись по disconnectedSocketId, и если да, удалим ее. + if (this.players[disconnectedSocketId]) { + console.warn(`[PCH ${this.gameId}] Найдена запись по disconnectedSocketId ${disconnectedSocketId}, удаляем ее.`); + this.removePlayer(disconnectedSocketId, 'stale_socket_disconnect_no_entry'); + } + return; + } + + if (playerEntry.socket.id !== disconnectedSocketId) { + console.log(`[PCH ${this.gameId}] Событие отключения для УСТАРЕВШЕГО сокета ${disconnectedSocketId} для игрока ${identifier} (Роль ${playerIdRole}). Текущий активный сокет: ${playerEntry.socket.id}. Игрок, вероятно, уже переподключился или сессия обновлена. Игнорируем дальнейшую логику "потенциального выхода" для этого устаревшего сокета.`); + if (this.players[disconnectedSocketId]) { + delete this.players[disconnectedSocketId]; // Удаляем только эту запись, не вызываем полный removePlayer + } + return; + } + + if (this.gameInstance.gameState && this.gameInstance.gameState.isGameOver) { + console.log(`[PCH ${this.gameId}] Игра уже завершена, не обрабатываем потенциальный выход для ${identifier}.`); + return; + } + if (playerEntry.isTemporarilyDisconnected) { + console.log(`[PCH ${this.gameId}] Игрок ${identifier} уже помечен как временно отключенный.`); + return; + } + + playerEntry.isTemporarilyDisconnected = true; + this.playerCount--; + console.log(`[PCH ${this.gameId}] Игрок ${identifier} (роль ${playerIdRole}, сокет ${disconnectedSocketId}) временно отключен. Активных: ${this.playerCount}. Запускаем таймер переподключения.`); + + const disconnectedName = playerEntry.name || this.gameInstance.gameState?.[playerIdRole]?.name || characterKey || `Игрок (Роль ${playerIdRole})`; + this.gameInstance.addToLog(`🔌 Игрок ${disconnectedName} отключился. Ожидание переподключения...`, GAME_CONFIG.LOG_TYPE_SYSTEM); + this.gameInstance.broadcastLogUpdate(); + + const otherPlayerRole = playerIdRole === GAME_CONFIG.PLAYER_ID ? GAME_CONFIG.OPPONENT_ID : GAME_CONFIG.PLAYER_ID; + const otherSocket = this.playerSockets[otherPlayerRole]; + const otherPlayerEntry = Object.values(this.players).find(p=> p.id === otherPlayerRole); + + if (otherSocket?.connected && otherPlayerEntry && !otherPlayerEntry.isTemporarilyDisconnected) { + otherSocket.emit('opponentDisconnected', { + disconnectedPlayerId: playerIdRole, + disconnectedCharacterName: disconnectedName, + }); + } + + if (this.gameInstance.turnTimer && (this.gameInstance.turnTimer.isActive() || (this.mode === 'ai' && this.gameInstance.turnTimer.isConfiguredForAiMove))) { + this.pausedTurnState = this.gameInstance.turnTimer.pause(); + console.log(`[PCH ${this.gameId}] Таймер хода приостановлен из-за отключения. Состояние:`, JSON.stringify(this.pausedTurnState)); + } else { + this.pausedTurnState = null; + } + + this.clearReconnectTimer(playerIdRole); + const reconnectDuration = GAME_CONFIG.RECONNECT_TIMEOUT_MS || 30000; + const reconnectStartTime = Date.now(); + + const updateInterval = setInterval(() => { + const remaining = reconnectDuration - (Date.now() - reconnectStartTime); + if (remaining <= 0 || !this.reconnectTimers[playerIdRole] || this.reconnectTimers[playerIdRole]?.timerId === null) { // Добавлена проверка на существование таймера + if (this.reconnectTimers[playerIdRole]?.updateIntervalId) clearInterval(this.reconnectTimers[playerIdRole].updateIntervalId); + if (this.reconnectTimers[playerIdRole]) this.reconnectTimers[playerIdRole].updateIntervalId = null; // Помечаем, что интервал очищен + this.io.to(this.gameId).emit('reconnectTimerUpdate', { disconnectingPlayerId: playerIdRole, remainingTime: 0 }); + return; + } + this.io.to(this.gameId).emit('reconnectTimerUpdate', { disconnectingPlayerId: playerIdRole, remainingTime: Math.ceil(remaining) }); + }, 1000); + + const timeoutId = setTimeout(() => { + if (this.reconnectTimers[playerIdRole]?.updateIntervalId) { // Очищаем интервал, если он еще существует + clearInterval(this.reconnectTimers[playerIdRole].updateIntervalId); + this.reconnectTimers[playerIdRole].updateIntervalId = null; + } + this.reconnectTimers[playerIdRole].timerId = null; // Помечаем, что основной таймаут сработал или очищен + + const stillDiscPlayer = Object.values(this.players).find(p => p.id === playerIdRole && p.identifier === identifier); + if (stillDiscPlayer && stillDiscPlayer.isTemporarilyDisconnected) { + this.removePlayer(stillDiscPlayer.socket.id, "reconnect_timeout"); + } + }, reconnectDuration); + this.reconnectTimers[playerIdRole] = { timerId: timeoutId, updateIntervalId: updateInterval, startTimeMs: reconnectStartTime, durationMs: reconnectDuration }; + } + + handlePlayerReconnected(playerIdRole, newSocket) { + const identifier = newSocket.userData?.userId; + console.log(`[PCH RECONNECT_ATTEMPT] gameId: ${this.gameId}, Role: ${playerIdRole}, Identifier: ${identifier}, NewSocket: ${newSocket.id}`); + + if (this.gameInstance.gameState && this.gameInstance.gameState.isGameOver) { + newSocket.emit('gameError', { message: 'Игра уже завершена.' }); + return false; + } + + let playerEntry = Object.values(this.players).find(p => p.id === playerIdRole && p.identifier === identifier); + console.log(`[PCH RECONNECT_ATTEMPT] Found playerEntry:`, playerEntry ? {id: playerEntry.id, identifier: playerEntry.identifier, oldSocketId: playerEntry.socket?.id, isTempDisc: playerEntry.isTemporarilyDisconnected} : null); + + if (playerEntry) { + const oldSocket = playerEntry.socket; + + // Обновляем сокет в playerEntry и в this.players / this.playerSockets, если сокет новый + if (oldSocket && oldSocket.id !== newSocket.id) { + console.log(`[PCH ${this.gameId}] New socket ${newSocket.id} for player ${identifier}. Old socket: ${oldSocket.id}. Updating records.`); + if (this.players[oldSocket.id]) delete this.players[oldSocket.id]; // Удаляем старую запись по старому socket.id + this.players[newSocket.id] = playerEntry; // Убеждаемся, что по новому ID есть актуальная запись + if (oldSocket.connected) { // Пытаемся корректно закрыть старый сокет + console.log(`[PCH ${this.gameId}] Disconnecting old stale socket ${oldSocket.id}.`); + oldSocket.disconnect(true); + } + } + playerEntry.socket = newSocket; // Обновляем сокет в существующей playerEntry + + if (oldSocket && oldSocket.id !== newSocket.id && this.players[oldSocket.id] === playerEntry) { + // Если вдруг playerEntry был взят по старому socket.id, и этот ID теперь должен быть удален + delete this.players[oldSocket.id]; + } + this.playerSockets[playerIdRole] = newSocket; // Обновляем авторитетный сокет для роли + + // Всегда заново присоединяем сокет к комнате + console.log(`[PCH ${this.gameId}] Forcing newSocket ${newSocket.id} (identifier: ${identifier}) to join room ${this.gameId} during reconnect.`); + newSocket.join(this.gameId); + + + if (playerEntry.isTemporarilyDisconnected) { + console.log(`[PCH ${this.gameId}] Переподключение игрока ${identifier} (Роль: ${playerIdRole}), который был временно отключен.`); + this.clearReconnectTimer(playerIdRole); // Очищаем таймер реконнекта + this.io.to(this.gameId).emit('reconnectTimerUpdate', { disconnectingPlayerId: playerIdRole, remainingTime: null }); // Сообщаем UI, что таймер остановлен + + playerEntry.isTemporarilyDisconnected = false; + this.playerCount++; // Восстанавливаем счетчик активных игроков + } else { + // Игрок не был помечен как временно отключенный. + // Это может быть F5 или запрос состояния на "том же" (или новом, но старый не отвалился) сокете. + // playerCount не меняется, т.к. игрок считался активным. + console.log(`[PCH ${this.gameId}] Игрок ${identifier} (Роль: ${playerIdRole}) переподключился/запросил состояние, не будучи помеченным как 'temporarilyDisconnected'. Old socket ID: ${oldSocket?.id}`); + } + + // Обновление имени + if (this.gameInstance.gameState && this.gameInstance.gameState[playerIdRole]?.name) { + playerEntry.name = this.gameInstance.gameState[playerIdRole].name; + } else { + const charData = dataUtils.getCharacterData(playerEntry.chosenCharacterKey); + playerEntry.name = charData?.baseStats?.name || playerEntry.chosenCharacterKey; + } + console.log(`[PCH ${this.gameId}] Имя игрока ${identifier} обновлено/установлено на: ${playerEntry.name}`); + + this.gameInstance.addToLog(`🔌 Игрок ${playerEntry.name || identifier} снова в игре! (Сессия обновлена)`, GAME_CONFIG.LOG_TYPE_SYSTEM); + this.sendFullGameStateOnReconnect(newSocket, playerEntry, playerIdRole); + + if (playerEntry.isTemporarilyDisconnected === false && this.pausedTurnState) { // Если игрок был временно отключен, isTemporarilyDisconnected уже false + this.resumeGameLogicAfterReconnect(playerIdRole); + } else if (playerEntry.isTemporarilyDisconnected === false && !this.pausedTurnState) { + // Игрок не был temp disconnected, и не было сохраненного состояния таймера (значит, он и не останавливался из-за этого игрока) + // Просто отправляем текущее состояние таймера, если он активен + console.log(`[PCH ${this.gameId}] Player was not temp disconnected, and no pausedTurnState. Forcing timer update if active.`); + if (this.gameInstance.turnTimer && this.gameInstance.turnTimer.isActive() && this.gameInstance.turnTimer.onTickCallback) { + const tt = this.gameInstance.turnTimer; + const elapsedTime = Date.now() - tt.segmentStartTimeMs; + const currentRemaining = Math.max(0, tt.segmentDurationMs - elapsedTime); + tt.onTickCallback(currentRemaining, tt.isConfiguredForPlayerSlotTurn, tt.isManuallyPausedState); + } else if (this.gameInstance.turnTimer && !this.gameInstance.turnTimer.isActive() && !this.gameInstance.turnTimer.isPaused() && !this.isGameEffectivelyPaused()) { + // Если таймер не активен, не на паузе, и игра не на общей паузе - возможно, его нужно запустить (если сейчас ход этого игрока) + const gs = this.gameInstance.gameState; + if (gs && !gs.isGameOver) { + const isHisTurnNow = (gs.isPlayerTurn && playerIdRole === GAME_CONFIG.PLAYER_ID) || (!gs.isPlayerTurn && playerIdRole === GAME_CONFIG.OPPONENT_ID); + const isAiTurnNow = this.mode === 'ai' && !gs.isPlayerTurn; + if(isHisTurnNow || isAiTurnNow) { + console.log(`[PCH ${this.gameId}] Timer not active, not paused. Game not paused. Attempting to start timer for ${playerIdRole}. HisTurn: ${isHisTurnNow}, AITurn: ${isAiTurnNow}`); + this.gameInstance.turnTimer.start(gs.isPlayerTurn, isAiTurnNow); + if (isAiTurnNow && !this.gameInstance.turnTimer.isConfiguredForAiMove && !this.gameInstance.turnTimer.isCurrentlyRunning) { + // Доп. проверка, чтобы AI точно пошел, если это его ход и таймер не стартовал для него как "AI move" + setTimeout(() => { + if (!this.isGameEffectivelyPaused() && this.gameInstance.gameState && !this.gameInstance.gameState.isGameOver && this.mode === 'ai' && !this.gameInstance.gameState.isPlayerTurn) { + this.gameInstance.processAiTurn(); + } + }, GAME_CONFIG.DELAY_OPPONENT_TURN); + } + } + } + } + } + return true; + + } else { // playerEntry не найден + console.warn(`[PCH ${this.gameId}] Попытка переподключения для ${identifier} (Роль ${playerIdRole}), но запись playerEntry не найдена. Это может быть новый игрок или сессия истекла.`); + // Если это новый игрок для этой роли, то addPlayer должен был быть вызван GameManager'ом. + // Если PCH вызывается напрямую, и игрока нет, это ошибка или устаревший запрос. + newSocket.emit('gameError', { message: 'Не удалось восстановить сессию (запись игрока не найдена). Попробуйте создать игру заново.' }); + return false; + } + } + + sendFullGameStateOnReconnect(socket, playerEntry, playerIdRole) { + console.log(`[PCH SEND_STATE_RECONNECT] gameId: ${this.gameId}, Role: ${playerIdRole}, Identifier: ${playerEntry.identifier}`); + if (!this.gameInstance.gameState) { + console.log(`[PCH SEND_STATE_RECONNECT] gameState отсутствует, попытка инициализации...`); + if (!this.gameInstance.initializeGame()) { // initializeGame должен установить gameState + this.gameInstance._handleCriticalError('reconnect_no_gs_after_init_pch_helper', 'PCH Helper: GS null после повторной инициализации при переподключении.'); + return; + } + console.log(`[PCH SEND_STATE_RECONNECT] gameState инициализирован. Player: ${this.gameInstance.gameState.player.name}, Opponent: ${this.gameInstance.gameState.opponent.name}`); + } + + const pData = dataUtils.getCharacterData(playerEntry.chosenCharacterKey); + const oppRoleKey = playerIdRole === GAME_CONFIG.PLAYER_ID ? GAME_CONFIG.OPPONENT_ID : GAME_CONFIG.PLAYER_ID; + + // Получаем ключ оппонента из gameState ИЛИ из сохраненных ключей в GameInstance + let oCharKey = this.gameInstance.gameState?.[oppRoleKey]?.characterKey || + (playerIdRole === GAME_CONFIG.PLAYER_ID ? this.gameInstance.opponentCharacterKey : this.gameInstance.playerCharacterKey); + const oData = oCharKey ? dataUtils.getCharacterData(oCharKey) : null; + + // Обновляем имена в gameState на основе сохраненных в PCH или данных персонажей + if (this.gameInstance.gameState) { + if (this.gameInstance.gameState[playerIdRole]) { + this.gameInstance.gameState[playerIdRole].name = playerEntry.name || pData?.baseStats?.name || 'Игрок'; + } + const opponentPCHEntry = Object.values(this.players).find(p => p.id === oppRoleKey); + if (this.gameInstance.gameState[oppRoleKey]) { + if (opponentPCHEntry?.name) { + this.gameInstance.gameState[oppRoleKey].name = opponentPCHEntry.name; + } else if (oData?.baseStats?.name) { + this.gameInstance.gameState[oppRoleKey].name = oData.baseStats.name; + } else if (this.mode === 'ai' && oppRoleKey === GAME_CONFIG.OPPONENT_ID) { + this.gameInstance.gameState[oppRoleKey].name = 'Балард'; // Фоллбэк для AI + } else { + this.gameInstance.gameState[oppRoleKey].name = 'Оппонент'; + } + } + } + console.log(`[PCH SEND_STATE_RECONNECT] Отправка gameStarted. Player GS: ${this.gameInstance.gameState?.player?.name}, Opponent GS: ${this.gameInstance.gameState?.opponent?.name}. IsPlayerTurn: ${this.gameInstance.gameState?.isPlayerTurn}`); + + socket.emit('gameStarted', { // Используем 'gameStarted' для полной синхронизации состояния + gameId: this.gameId, + yourPlayerId: playerIdRole, + initialGameState: this.gameInstance.gameState, + playerBaseStats: pData?.baseStats, + opponentBaseStats: oData?.baseStats || {name: (this.mode === 'pvp' ? 'Ожидание...' : 'Противник AI'), maxHp:1, maxResource:0, resourceName:'N/A', attackPower:0, characterKey: null}, + playerAbilities: pData?.abilities, + opponentAbilities: oData?.abilities || [], + log: this.gameInstance.consumeLogBuffer(), + clientConfig: { ...GAME_CONFIG } + }); + } + + resumeGameLogicAfterReconnect(reconnectedPlayerIdRole) { + const playerEntry = Object.values(this.players).find(p => p.id === reconnectedPlayerIdRole); + const reconnectedName = playerEntry?.name || this.gameInstance.gameState?.[reconnectedPlayerIdRole]?.name || `Игрок (Роль ${reconnectedPlayerIdRole})`; + console.log(`[PCH RESUME_LOGIC] gameId: ${this.gameId}, Role: ${reconnectedPlayerIdRole}, Name: ${reconnectedName}, PausedState: ${JSON.stringify(this.pausedTurnState)}, TimerActive: ${this.gameInstance.turnTimer?.isActive()}, GS.isPlayerTurn: ${this.gameInstance.gameState?.isPlayerTurn}`); + + const otherPlayerRole = reconnectedPlayerIdRole === GAME_CONFIG.PLAYER_ID ? GAME_CONFIG.OPPONENT_ID : GAME_CONFIG.PLAYER_ID; + const otherSocket = this.playerSockets[otherPlayerRole]; + const otherPlayerEntry = Object.values(this.players).find(p=> p.id === otherPlayerRole); + if (otherSocket?.connected && otherPlayerEntry && !otherPlayerEntry.isTemporarilyDisconnected) { + otherSocket.emit('playerReconnected', { + reconnectedPlayerId: reconnectedPlayerIdRole, + reconnectedPlayerName: reconnectedName + }); + if (this.gameInstance.logBuffer.length > 0) { // Отправляем накопившиеся логи другому игроку + otherSocket.emit('logUpdate', { log: this.gameInstance.consumeLogBuffer() }); + } + } + + // Обновляем состояние для всех (включая переподключившегося, т.к. его лог мог быть уже потреблен) + this.gameInstance.broadcastGameStateUpdate(); // Это отправит gameState и оставшиеся логи + + + if (!this.isGameEffectivelyPaused() && this.gameInstance.gameState && !this.gameInstance.gameState.isGameOver) { + // this.gameInstance.broadcastGameStateUpdate(); // Перенесено выше + + if (Object.keys(this.reconnectTimers).length === 0) { // Только если нет других ожидающих реконнекта + const currentTurnIsForPlayerInGS = this.gameInstance.gameState.isPlayerTurn; + const isCurrentTurnAiForTimer = this.mode === 'ai' && !currentTurnIsForPlayerInGS; + let resumedFromPausedState = false; + + if (this.pausedTurnState && typeof this.pausedTurnState.remainingTime === 'number') { + const gsTurnMatchesPausedTurn = (currentTurnIsForPlayerInGS && this.pausedTurnState.forPlayerRoleIsPlayer) || + (!currentTurnIsForPlayerInGS && !this.pausedTurnState.forPlayerRoleIsPlayer); + + if (gsTurnMatchesPausedTurn) { + console.log(`[PCH ${this.gameId}] Возобновляем таймер хода из pausedTurnState. Время: ${this.pausedTurnState.remainingTime}мс. Для игрока (в pausedState): ${this.pausedTurnState.forPlayerRoleIsPlayer}. GS ход игрока: ${currentTurnIsForPlayerInGS}. AI ход (в pausedState): ${this.pausedTurnState.isAiCurrentlyMoving}`); + this.gameInstance.turnTimer.resume( + this.pausedTurnState.remainingTime, + this.pausedTurnState.forPlayerRoleIsPlayer, // Это isConfiguredForPlayerSlotTurn для таймера + this.pausedTurnState.isAiCurrentlyMoving // Это isConfiguredForAiMove для таймера + ); + resumedFromPausedState = true; + } else { + console.warn(`[PCH ${this.gameId}] pausedTurnState (${JSON.stringify(this.pausedTurnState)}) не совпадает с текущим ходом в gameState (isPlayerTurn: ${currentTurnIsForPlayerInGS}). Сбрасываем pausedTurnState и запускаем таймер заново, если нужно.`); + } + this.pausedTurnState = null; // Сбрасываем в любом случае + } + + if (!resumedFromPausedState && this.gameInstance.turnTimer && !this.gameInstance.turnTimer.isActive() && !this.gameInstance.turnTimer.isPaused()) { + console.log(`[PCH ${this.gameId}] Запускаем таймер хода заново после реконнекта (pausedState не использовался или был неактуален, таймер неактивен и не на паузе). GS ход игрока: ${currentTurnIsForPlayerInGS}. AI ход для таймера: ${isCurrentTurnAiForTimer}`); + this.gameInstance.turnTimer.start(currentTurnIsForPlayerInGS, isCurrentTurnAiForTimer); + if (isCurrentTurnAiForTimer && !this.gameInstance.turnTimer.isConfiguredForAiMove && !this.gameInstance.turnTimer.isCurrentlyRunning) { + setTimeout(() => { + if (!this.isGameEffectivelyPaused() && this.gameInstance.gameState && !this.gameInstance.gameState.isGameOver && this.mode === 'ai' && !this.gameInstance.gameState.isPlayerTurn) { + this.gameInstance.processAiTurn(); + } + }, GAME_CONFIG.DELAY_OPPONENT_TURN); + } + } else if (!resumedFromPausedState && this.gameInstance.turnTimer && this.gameInstance.turnTimer.isActive()){ + console.log(`[PCH ${this.gameId}] Таймер уже был активен при попытке перезапуска после реконнекта (pausedTurnState не использовался/неактуален). Ничего не делаем с таймером.`); + } + } else { + console.log(`[PCH ${this.gameId}] Возобновление логики таймера отложено, есть другие активные таймеры реконнекта: ${Object.keys(this.reconnectTimers)}`); + } + } else { + console.log(`[PCH ${this.gameId}] Игра на паузе или завершена, логика таймера не возобновляется. Paused: ${this.isGameEffectivelyPaused()}, GameOver: ${this.gameInstance.gameState?.isGameOver}`); + } + } + + clearReconnectTimer(playerIdRole) { + if (this.reconnectTimers[playerIdRole]) { + clearTimeout(this.reconnectTimers[playerIdRole].timerId); + this.reconnectTimers[playerIdRole].timerId = null; // Явно обнуляем + if (this.reconnectTimers[playerIdRole].updateIntervalId) { + clearInterval(this.reconnectTimers[playerIdRole].updateIntervalId); + this.reconnectTimers[playerIdRole].updateIntervalId = null; // Явно обнуляем + } + delete this.reconnectTimers[playerIdRole]; // Удаляем всю запись + console.log(`[PCH ${this.gameId}] Очищен таймер переподключения для роли ${playerIdRole}.`); + } + } + + clearAllReconnectTimers() { + console.log(`[PCH ${this.gameId}] Очистка ВСЕХ таймеров переподключения.`); + for (const roleId in this.reconnectTimers) { + this.clearReconnectTimer(roleId); + } + } + + isGameEffectivelyPaused() { + if (this.mode === 'pvp') { + if (this.playerCount < 2 && Object.keys(this.players).length > 0) { + const p1Entry = Object.values(this.players).find(p => p.id === GAME_CONFIG.PLAYER_ID); + const p2Entry = Object.values(this.players).find(p => p.id === GAME_CONFIG.OPPONENT_ID); + + if ((p1Entry && p1Entry.isTemporarilyDisconnected) || (p2Entry && p2Entry.isTemporarilyDisconnected)) { + return true; + } + } + } else if (this.mode === 'ai') { + const humanPlayer = Object.values(this.players).find(p => p.id === GAME_CONFIG.PLAYER_ID); + return humanPlayer?.isTemporarilyDisconnected ?? false; // Если игрока нет, не на паузе. Если есть - зависит от его состояния. + } + return false; + } + + getAllPlayersInfo() { + return { ...this.players }; + } + + getPlayerSockets() { + return { ...this.playerSockets }; + } +} + +module.exports = PlayerConnectionHandler; \ No newline at end of file diff --git a/server/game/instance/TurnTimer.js b/server/game/instance/TurnTimer.js new file mode 100644 index 0000000..2274458 --- /dev/null +++ b/server/game/instance/TurnTimer.js @@ -0,0 +1,237 @@ +// /server/game/instance/TurnTimer.js + +class TurnTimer { + constructor(turnDurationMs, updateIntervalMs, onTimeoutCallback, onTickCallback, gameIdForLogs = '') { + this.initialTurnDurationMs = turnDurationMs; + this.updateIntervalMs = updateIntervalMs; + this.onTimeoutCallback = onTimeoutCallback; + this.onTickCallback = onTickCallback; // (remainingTimeMs, isForPlayerSlotTurn_timerPerspective, isTimerEffectivelyPaused_byLogic) + this.gameId = gameIdForLogs; + + this.timeoutId = null; + this.tickIntervalId = null; + + this.segmentStartTimeMs = 0; // Время начала текущего активного сегмента (после start/resume) + this.segmentDurationMs = 0; // Длительность, с которой был запущен текущий сегмент + + this.isCurrentlyRunning = false; // Идет ли активный отсчет (не на паузе, не ход AI) + this.isManuallyPausedState = false; // Была ли вызвана pause() + + // Состояние, для которого таймер был запущен (или должен быть запущен) + this.isConfiguredForPlayerSlotTurn = false; + this.isConfiguredForAiMove = false; + + console.log(`[TurnTimer ${this.gameId}] Initialized. Duration: ${this.initialTurnDurationMs}ms, Interval: ${this.updateIntervalMs}ms`); + } + + _clearInternalTimers() { + if (this.timeoutId) { + clearTimeout(this.timeoutId); + this.timeoutId = null; + } + if (this.tickIntervalId) { + clearInterval(this.tickIntervalId); + this.tickIntervalId = null; + } + } + + /** + * Запускает или перезапускает таймер хода. + * @param {boolean} isPlayerSlotTurn - true, если сейчас ход слота 'player'. + * @param {boolean} isAiMakingMove - true, если текущий ход делает AI. + * @param {number|null} [customRemainingTimeMs=null] - Если передано, таймер начнется с этого времени. + */ + start(isPlayerSlotTurn, isAiMakingMove = false, customRemainingTimeMs = null) { + console.log(`[TurnTimer ${this.gameId}] Attempting START. ForPlayer: ${isPlayerSlotTurn}, IsAI: ${isAiMakingMove}, CustomTime: ${customRemainingTimeMs}, ManualPause: ${this.isManuallyPausedState}`); + this._clearInternalTimers(); // Всегда очищаем старые таймеры перед новым запуском + + this.isConfiguredForPlayerSlotTurn = isPlayerSlotTurn; + this.isConfiguredForAiMove = isAiMakingMove; + + // Если это не resume (т.е. customRemainingTimeMs не передан явно как результат pause), + // то сбрасываем флаг ручной паузы. + if (customRemainingTimeMs === null) { + this.isManuallyPausedState = false; + } + + if (this.isConfiguredForAiMove) { + this.isCurrentlyRunning = false; // Для хода AI основной таймер не "бежит" для игрока + console.log(`[TurnTimer ${this.gameId}] START: AI's turn. Player timer not actively ticking.`); + if (this.onTickCallback) { + // Отправляем состояние "ход AI", таймер не тикает для игрока, не на ручной паузе + this.onTickCallback(this.initialTurnDurationMs, this.isConfiguredForPlayerSlotTurn, false); + } + return; + } + + // Если это не ход AI, то таймер должен работать для игрока (или оппонента-человека) + this.segmentDurationMs = (typeof customRemainingTimeMs === 'number' && customRemainingTimeMs > 0) + ? customRemainingTimeMs + : this.initialTurnDurationMs; + + this.segmentStartTimeMs = Date.now(); + this.isCurrentlyRunning = true; // Таймер теперь активен + // this.isManuallyPausedState остается как есть, если это был resume, или false, если это новый start + + console.log(`[TurnTimer ${this.gameId}] STARTED. Effective Duration: ${this.segmentDurationMs}ms. ForPlayer: ${this.isConfiguredForPlayerSlotTurn}. IsRunning: ${this.isCurrentlyRunning}. ManualPause: ${this.isManuallyPausedState}`); + + this.timeoutId = setTimeout(() => { + console.log(`[TurnTimer ${this.gameId}] Main TIMEOUT occurred. WasRunning: ${this.isCurrentlyRunning}, ManualPause: ${this.isManuallyPausedState}`); + // Проверяем, что таймер все еще должен был работать и не был на паузе + if (this.isCurrentlyRunning && !this.isManuallyPausedState) { + this._clearInternalTimers(); // Очищаем все, включая интервал + this.isCurrentlyRunning = false; + if (this.onTimeoutCallback) { + this.onTimeoutCallback(); + } + } else { + console.log(`[TurnTimer ${this.gameId}] Main TIMEOUT ignored (not running or manually paused).`); + } + }, this.segmentDurationMs); + + this.tickIntervalId = setInterval(() => { + // Таймер должен обновлять UI только если он isCurrentlyRunning и НЕ isManuallyPausedState + // isManuallyPausedState проверяется в onTickCallback, который должен передать "isPaused" клиенту + if (!this.isCurrentlyRunning) { // Если таймер был остановлен (clear/timeout) + this._clearInternalTimers(); // Убедимся, что этот интервал тоже остановлен + return; + } + + const elapsedTime = Date.now() - this.segmentStartTimeMs; + const remainingTime = Math.max(0, this.segmentDurationMs - elapsedTime); + + if (this.onTickCallback) { + // Передаем isManuallyPausedState как состояние "паузы" для клиента + this.onTickCallback(remainingTime, this.isConfiguredForPlayerSlotTurn, this.isManuallyPausedState); + } + + // Не очищаем интервал здесь при remainingTime <= 0, пусть setTimeout это сделает. + // Отправка 0 - это нормально. + }, this.updateIntervalMs); + + // Немедленная первая отправка состояния таймера + if (this.onTickCallback) { + console.log(`[TurnTimer ${this.gameId}] Initial tick after START. Remaining: ${this.segmentDurationMs}, ForPlayer: ${this.isConfiguredForPlayerSlotTurn}, ManualPause: ${this.isManuallyPausedState}`); + this.onTickCallback(this.segmentDurationMs, this.isConfiguredForPlayerSlotTurn, this.isManuallyPausedState); + } + } + + pause() { + console.log(`[TurnTimer ${this.gameId}] Attempting PAUSE. IsRunning: ${this.isCurrentlyRunning}, IsAI: ${this.isConfiguredForAiMove}, ManualPause: ${this.isManuallyPausedState}`); + + if (this.isManuallyPausedState) { // Уже на ручной паузе + console.log(`[TurnTimer ${this.gameId}] PAUSE called, but already manually paused. Returning previous pause state.`); + // Нужно вернуть актуальное оставшееся время, которое было на момент установки паузы. + // segmentDurationMs при паузе сохраняет это значение. + if (this.onTickCallback) { // Уведомляем клиента еще раз, что на паузе + this.onTickCallback(this.segmentDurationMs, this.isConfiguredForPlayerSlotTurn, true); + } + return { + remainingTime: this.segmentDurationMs, // Это время, которое осталось на момент паузы + forPlayerRoleIsPlayer: this.isConfiguredForPlayerSlotTurn, + isAiCurrentlyMoving: this.isConfiguredForAiMove // Важно сохранить, чей ход это был + }; + } + + let remainingTimeToSave; + + if (this.isConfiguredForAiMove) { + // Если ход AI, таймер для игрока не тикал, у него полное время + remainingTimeToSave = this.initialTurnDurationMs; + console.log(`[TurnTimer ${this.gameId}] PAUSED during AI move. Effective remaining: ${remainingTimeToSave}ms for player turn.`); + } else if (this.isCurrentlyRunning) { + // Таймер активно работал для игрока/оппонента-человека + const elapsedTime = Date.now() - this.segmentStartTimeMs; + remainingTimeToSave = Math.max(0, this.segmentDurationMs - elapsedTime); + console.log(`[TurnTimer ${this.gameId}] PAUSED while running. Elapsed: ${elapsedTime}ms, Remaining: ${remainingTimeToSave}ms from segment duration ${this.segmentDurationMs}ms.`); + } else { + // Таймер не был активен (например, уже истек, был очищен, или это был start() для AI) + // В этом случае, если не ход AI, то время 0 + remainingTimeToSave = 0; + console.log(`[TurnTimer ${this.gameId}] PAUSE called, but timer not actively running (and not AI move). Remaining set to 0.`); + } + + this._clearInternalTimers(); + this.isCurrentlyRunning = false; + this.isManuallyPausedState = true; + this.segmentDurationMs = remainingTimeToSave; // Сохраняем оставшееся время для resume + + if (this.onTickCallback) { + console.log(`[TurnTimer ${this.gameId}] Notifying client of PAUSE. Remaining: ${remainingTimeToSave}, ForPlayer: ${this.isConfiguredForPlayerSlotTurn}`); + this.onTickCallback(remainingTimeToSave, this.isConfiguredForPlayerSlotTurn, true); // isPaused = true + } + + return { + remainingTime: remainingTimeToSave, + forPlayerRoleIsPlayer: this.isConfiguredForPlayerSlotTurn, // Чей ход это был + isAiCurrentlyMoving: this.isConfiguredForAiMove // Был ли это ход AI + }; + } + + resume(remainingTimeMs, forPlayerSlotTurn, isAiMakingMove) { + console.log(`[TurnTimer ${this.gameId}] Attempting RESUME. SavedRemaining: ${remainingTimeMs}, ForPlayer: ${forPlayerSlotTurn}, IsAI: ${isAiMakingMove}, ManualPauseBefore: ${this.isManuallyPausedState}`); + + if (!this.isManuallyPausedState) { + console.warn(`[TurnTimer ${this.gameId}] RESUME called, but timer was not manually paused. Current state - IsRunning: ${this.isCurrentlyRunning}, IsAI: ${this.isConfiguredForAiMove}. Ignoring resume, let PCH handle start if needed.`); + // Если не был на ручной паузе, возможно, игра уже продолжается или была очищена. + // Не вызываем start() отсюда, чтобы избежать неожиданного поведения. + // PCH должен решить, нужен ли новый start(). + // Однако, если текущий ход совпадает, и таймер просто неактивен, можно запустить. + // Но лучше, чтобы PCH всегда вызывал start() с нуля, если resume не применим. + // Просто отправим текущее состояние, если onTickCallback есть. + if (this.onTickCallback) { + const currentElapsedTime = this.isCurrentlyRunning ? (Date.now() - this.segmentStartTimeMs) : 0; + const currentRemaining = this.isCurrentlyRunning ? Math.max(0, this.segmentDurationMs - currentElapsedTime) : this.segmentDurationMs; + this.onTickCallback(currentRemaining, this.isConfiguredForPlayerSlotTurn, this.isManuallyPausedState); + } + return; + } + + if (remainingTimeMs <= 0 && !isAiMakingMove) { // Если не ход AI и время вышло + console.log(`[TurnTimer ${this.gameId}] RESUME called with 0 or less time (and not AI move). Triggering timeout.`); + this.isManuallyPausedState = false; // Сбрасываем флаг + this._clearInternalTimers(); // Убедимся, что все остановлено + this.isCurrentlyRunning = false; + if (this.onTimeoutCallback) { + this.onTimeoutCallback(); + } + return; + } + + // Сбрасываем флаг ручной паузы и запускаем таймер с сохраненным состоянием + this.isManuallyPausedState = false; + this.start(forPlayerSlotTurn, isAiMakingMove, remainingTimeMs); // `start` теперь правильно обработает customRemainingTimeMs + } + + clear() { + console.log(`[TurnTimer ${this.gameId}] CLEAR called. WasRunning: ${this.isCurrentlyRunning}, ManualPause: ${this.isManuallyPausedState}`); + this._clearInternalTimers(); + this.isCurrentlyRunning = false; + // При полном clear сбрасываем и ручную паузу, т.к. таймер полностью останавливается. + // `pause` использует этот метод, но затем сам выставляет isManuallyPausedState = true. + this.isManuallyPausedState = false; + this.segmentDurationMs = 0; // Сбрасываем сохраненную длительность + this.segmentStartTimeMs = 0; + + // Опционально: уведомить клиента, что таймер остановлен (например, null или 0) + // if (this.onTickCallback) { + // this.onTickCallback(null, this.isConfiguredForPlayerSlotTurn, true); // isPaused = true (т.к. он остановлен) + // } + } + + isActive() { + // Таймер активен, если он isCurrentlyRunning и не на ручной паузе + return this.isCurrentlyRunning && !this.isManuallyPausedState; + } + + isPaused() { // Возвращает, находится ли таймер в состоянии ручной паузы + return this.isManuallyPausedState; + } + + // Этот геттер больше не нужен в таком виде, т.к. isConfiguredForAiMove хранит это состояние + // get isAiCurrentlyMakingMove() { + // return this.isConfiguredForAiMove && !this.isCurrentlyRunning; + // } +} + +module.exports = TurnTimer; \ No newline at end of file diff --git a/server/game/logic/aiLogic.js b/server/game/logic/aiLogic.js new file mode 100644 index 0000000..8c2ef34 --- /dev/null +++ b/server/game/logic/aiLogic.js @@ -0,0 +1,133 @@ +// /server/game/logic/aiLogic.js + +// GAME_CONFIG и gameData (или dataUtils) будут передаваться в decideAiAction как параметры, +// но для удобства можно импортировать GAME_CONFIG здесь, если он нужен для внутренних констант AI, +// не зависящих от передаваемого конфига. +// const GAME_CONFIG_STATIC = require('../../core/config'); // Если нужно для чего-то внутреннего + +/** + * Логика принятия решения для AI (Балард). + * @param {object} currentGameState - Текущее состояние игры. + * @param {object} dataUtils - Утилиты для доступа к данным игры (getCharacterData, getCharacterAbilities и т.д.). + * @param {object} configToUse - Конфигурационный объект игры (переданный GAME_CONFIG). + * @param {function} addToLogCallback - Функция для добавления лога (опционально, если AI должен логировать свои "мысли"). + * @returns {object} Объект с действием AI ({ actionType: 'attack' | 'ability' | 'pass', ability?: object, logMessage?: {message, type} }). + */ +function decideAiAction(currentGameState, dataUtils, configToUse, addToLogCallback) { + const opponentState = currentGameState.opponent; // AI Балард всегда в слоте opponent + const playerState = currentGameState.player; // Игрок всегда в слоте player (в AI режиме) + + // Убеждаемся, что это AI Балард и есть необходимые данные + if (opponentState.characterKey !== 'balard' || !dataUtils) { + console.warn("[AI Logic] decideAiAction called for non-Balard opponent or missing dataUtils. Passing turn."); + if (addToLogCallback) addToLogCallback(`${opponentState.name || 'AI'} пропускает ход из-за внутренней ошибки.`, configToUse.LOG_TYPE_SYSTEM); + return { actionType: 'pass', logMessage: { message: `${opponentState.name || 'AI'} пропускает ход.`, type: configToUse.LOG_TYPE_INFO } }; + } + + const balardCharacterData = dataUtils.getCharacterData('balard'); + if (!balardCharacterData || !balardCharacterData.abilities) { + console.warn("[AI Logic] Failed to get Balard's character data or abilities. Passing turn."); + if (addToLogCallback) addToLogCallback(`AI Балард пропускает ход из-за ошибки загрузки данных.`, configToUse.LOG_TYPE_SYSTEM); + return { actionType: 'pass', logMessage: { message: `Балард пропускает ход.`, type: configToUse.LOG_TYPE_INFO } }; + } + const balardAbilities = balardCharacterData.abilities; + + // Проверка полного безмолвия Баларда (от Гипнотического Взгляда Елены и т.п.) + const isBalardFullySilenced = opponentState.activeEffects.some( + eff => eff.isFullSilence && eff.turnsLeft > 0 + ); + + if (isBalardFullySilenced) { + // AI под полным безмолвием просто атакует. + // Лог о безмолвии добавляется в GameInstance перед вызовом этой функции или при обработке атаки. + // Здесь можно добавить лог о "вынужденной" атаке, если нужно. + if (addToLogCallback) { + // Проверяем, не был ли лог о безмолвии уже добавлен в этом ходу (чтобы не спамить) + // Это упрощенная проверка, в реальном приложении можно использовать флаги или более сложную логику. + // if (!currentGameState.logContainsThisTurn || !currentGameState.logContainsThisTurn.includes('под действием Безмолвия')) { + // addToLogCallback(`😵 ${opponentState.name} под действием Безмолвия! Атакует в смятении.`, configToUse.LOG_TYPE_EFFECT); + // if(currentGameState) currentGameState.logContainsThisTurn = (currentGameState.logContainsThisTurn || "") + 'под действием Безмолвия'; + // } + } + return { actionType: 'attack' }; + } + + const availableActions = []; + + // 1. Проверяем способность "Покровительство Тьмы" (Лечение) + const healAbility = balardAbilities.find(a => a.id === configToUse.ABILITY_ID_BALARD_HEAL); + if (healAbility && opponentState.currentResource >= healAbility.cost && + (opponentState.abilityCooldowns?.[healAbility.id] || 0) <= 0 && // Общий КД + healAbility.condition(opponentState, playerState, currentGameState, configToUse)) { + availableActions.push({ weight: 80, type: 'ability', ability: healAbility, requiresSuccessCheck: true, successRate: healAbility.successRate }); + } + + // 2. Проверяем способность "Эхо Безмолвия" + const silenceAbility = balardAbilities.find(a => a.id === configToUse.ABILITY_ID_BALARD_SILENCE); + if (silenceAbility && opponentState.currentResource >= silenceAbility.cost && + (opponentState.silenceCooldownTurns === undefined || opponentState.silenceCooldownTurns <= 0) && // Спец. КД + (opponentState.abilityCooldowns?.[silenceAbility.id] || 0) <= 0 && // Общий КД + silenceAbility.condition(opponentState, playerState, currentGameState, configToUse)) { + // Условие в silenceAbility.condition уже проверяет, что Елена не под безмолвием + availableActions.push({ weight: 60, type: 'ability', ability: silenceAbility, requiresSuccessCheck: true, successRate: configToUse.SILENCE_SUCCESS_RATE }); + } + + // 3. Проверяем способность "Похищение Света" (Вытягивание маны и урон) + const drainAbility = balardAbilities.find(a => a.id === configToUse.ABILITY_ID_BALARD_MANA_DRAIN); + if (drainAbility && opponentState.currentResource >= drainAbility.cost && + (opponentState.manaDrainCooldownTurns === undefined || opponentState.manaDrainCooldownTurns <= 0) && // Спец. КД + (opponentState.abilityCooldowns?.[drainAbility.id] || 0) <= 0 && // Общий КД + drainAbility.condition(opponentState, playerState, currentGameState, configToUse)) { + availableActions.push({ weight: 50, type: 'ability', ability: drainAbility }); + } + + // 4. Базовая атака - всегда доступна как запасной вариант с низким весом + availableActions.push({ weight: 30, type: 'attack' }); + + + if (availableActions.length === 0) { + // Этого не должно происходить, так как атака всегда добавляется + if (addToLogCallback) addToLogCallback(`${opponentState.name} не может совершить действие (нет доступных).`, configToUse.LOG_TYPE_INFO); + return { actionType: 'pass', logMessage: { message: `${opponentState.name} пропускает ход.`, type: configToUse.LOG_TYPE_INFO } }; + } + + // Сортируем действия по весу в порядке убывания (самые приоритетные в начале) + availableActions.sort((a, b) => b.weight - a.weight); + + // console.log(`[AI Logic] Available actions for Balard, sorted by weight:`, JSON.stringify(availableActions.map(a => ({type: a.type, name: a.ability?.name, weight: a.weight})), null, 2)); + + + // Перебираем действия в порядке приоритета и выбираем первое подходящее + for (const action of availableActions) { + if (action.type === 'ability') { + if (action.requiresSuccessCheck) { + // Для способностей с шансом успеха, "бросаем кубик" + if (Math.random() < action.successRate) { + if (addToLogCallback) addToLogCallback(`⭐ ${opponentState.name} решает использовать "${action.ability.name}" (попытка успешна)...`, configToUse.LOG_TYPE_INFO); + return { actionType: action.type, ability: action.ability }; + } else { + // Провал шанса, добавляем лог и ИИ переходит к следующему действию в списке (если есть) + if (addToLogCallback) addToLogCallback(`💨 ${opponentState.name} пытался использовать "${action.ability.name}", но шанс не сработал!`, configToUse.LOG_TYPE_INFO); + continue; // Пробуем следующее приоритетное действие + } + } else { + // Способность без проверки шанса (например, Похищение Света) + if (addToLogCallback) addToLogCallback(`⭐ ${opponentState.name} решает использовать "${action.ability.name}"...`, configToUse.LOG_TYPE_INFO); + return { actionType: action.type, ability: action.ability }; + } + } else if (action.type === 'attack') { + // Атака - если дошли до нее, значит, более приоритетные способности не были выбраны или провалили шанс + if (addToLogCallback) addToLogCallback(`🦶 ${opponentState.name} решает атаковать...`, configToUse.LOG_TYPE_INFO); + return { actionType: 'attack' }; + } + } + + // Фоллбэк, если по какой-то причине ни одно действие не было выбрано (не должно происходить, если атака всегда есть) + console.warn("[AI Logic] AI Balard failed to select any action after iterating. Defaulting to pass."); + if (addToLogCallback) addToLogCallback(`${opponentState.name} не смог выбрать подходящее действие. Пропускает ход.`, configToUse.LOG_TYPE_INFO); + return { actionType: 'pass', logMessage: { message: `${opponentState.name} пропускает ход.`, type: configToUse.LOG_TYPE_INFO } }; +} + +module.exports = { + decideAiAction +}; \ No newline at end of file diff --git a/server/game/logic/combatLogic.js b/server/game/logic/combatLogic.js new file mode 100644 index 0000000..7b0f4da --- /dev/null +++ b/server/game/logic/combatLogic.js @@ -0,0 +1,472 @@ +// /server/game/logic/combatLogic.js + +// GAME_CONFIG и dataUtils будут передаваться в функции как параметры. +// effectsLogic может потребоваться для импорта, если updateBlockingStatus используется здесь напрямую, +// но в вашем GameInstance.js он вызывается отдельно. +// const effectsLogic = require('./effectsLogic'); // Если нужно + +/** + * Обрабатывает базовую атаку одного бойца по другому. + * @param {object} attackerState - Состояние атакующего бойца из gameState. + * @param {object} defenderState - Состояние защищающегося бойца из gameState. + * @param {object} attackerBaseStats - Базовые статы атакующего (из dataUtils.getCharacterBaseStats). + * @param {object} defenderBaseStats - Базовые статы защищающегося (из dataUtils.getCharacterBaseStats). + * @param {object} currentGameState - Текущее полное состояние игры. + * @param {function} addToLogCallback - Функция для добавления сообщений в лог игры. + * @param {object} configToUse - Конфигурационный объект игры (GAME_CONFIG). + * @param {object} dataUtils - Утилиты для доступа к данным игры. + * @param {function} getRandomTauntFunction - Функция gameLogic.getRandomTaunt, переданная для использования. + */ +function performAttack( + attackerState, + defenderState, + attackerBaseStats, + defenderBaseStats, + currentGameState, + addToLogCallback, + configToUse, + dataUtils, + getRandomTauntFunction +) { + // Расчет базового урона с вариацией + let damage = Math.floor( + attackerBaseStats.attackPower * + (configToUse.DAMAGE_VARIATION_MIN + Math.random() * configToUse.DAMAGE_VARIATION_RANGE) + ); + let wasBlocked = false; + let attackBonusesLog = []; // Для сбора информации о бонусах к атаке + + // --- ПРОВЕРКА И ПРИМЕНЕНИЕ БОНУСА ОТ ОТЛОЖЕННОГО БАФФА АТАКИ --- + const delayedAttackBuff = attackerState.activeEffects.find(eff => + eff.isDelayed && + (eff.id === configToUse.ABILITY_ID_NATURE_STRENGTH || eff.id === configToUse.ABILITY_ID_ALMAGEST_BUFF_ATTACK) && + eff.turnsLeft > 0 && + !eff.justCast + ); + + if (delayedAttackBuff) { + console.log(`[CombatLogic performAttack] Found active delayed buff: ${delayedAttackBuff.name} for ${attackerState.name}`); + + let damageBonus = 0; + // Если бы были прямые бонусы к урону атаки от этих баффов, они бы рассчитывались здесь + // Например: + // if (delayedAttackBuff.id === configToUse.ABILITY_ID_NATURE_STRENGTH && configToUse.NATURE_STRENGTH_ATTACK_DAMAGE_BONUS) { + // damageBonus = configToUse.NATURE_STRENGTH_ATTACK_DAMAGE_BONUS; + // } else if (delayedAttackBuff.id === configToUse.ABILITY_ID_ALMAGEST_BUFF_ATTACK && configToUse.ALMAGEST_ATTACK_BUFF_DAMAGE_BONUS) { + // damageBonus = configToUse.ALMAGEST_ATTACK_BUFF_DAMAGE_BONUS; + // } + + if (damageBonus > 0) { + damage += damageBonus; + attackBonusesLog.push(`урон +${damageBonus} от "${delayedAttackBuff.name}"`); + } + + let resourceRegenConfigKey = null; + if (delayedAttackBuff.id === configToUse.ABILITY_ID_NATURE_STRENGTH) { + resourceRegenConfigKey = 'NATURE_STRENGTH_MANA_REGEN'; + } else if (delayedAttackBuff.id === configToUse.ABILITY_ID_ALMAGEST_BUFF_ATTACK) { + resourceRegenConfigKey = 'ALMAGEST_DARK_ENERGY_REGEN'; // Предположительный ключ + } + + if (resourceRegenConfigKey && configToUse[resourceRegenConfigKey]) { + const regenAmount = configToUse[resourceRegenConfigKey]; + const actualRegen = Math.min(regenAmount, attackerBaseStats.maxResource - attackerState.currentResource); + if (actualRegen > 0) { + attackerState.currentResource = Math.round(attackerState.currentResource + actualRegen); + if (addToLogCallback) { + addToLogCallback( + `🌿 ${attackerState.name} восстанавливает ${actualRegen} ${attackerState.resourceName} от "${delayedAttackBuff.name}"!`, + configToUse.LOG_TYPE_HEAL + ); + } + } + } + } + // --- КОНЕЦ ПРОВЕРКИ И ПРИМЕНЕНИЯ ОТЛОЖЕННОГО БАФФА АТАКИ --- + + // Проверка на блок + if (defenderState.isBlocking) { + const initialDamage = damage; + damage = Math.floor(damage * configToUse.BLOCK_DAMAGE_REDUCTION); + wasBlocked = true; + if (addToLogCallback) { + let blockLogMsg = `🛡️ ${defenderBaseStats.name} блокирует атаку ${attackerBaseStats.name}! Урон снижен (${initialDamage} -> ${damage}).`; + if (attackBonusesLog.length > 0) { + blockLogMsg += ` (${attackBonusesLog.join(', ')})`; + } + addToLogCallback(blockLogMsg, configToUse.LOG_TYPE_BLOCK); + } + } else { + if (addToLogCallback) { + let hitLogMsg = `${attackerBaseStats.name} атакует ${defenderBaseStats.name}! Наносит ${damage} урона.`; + if (attackBonusesLog.length > 0) { + hitLogMsg += ` (${attackBonusesLog.join(', ')})`; + } + addToLogCallback(hitLogMsg, configToUse.LOG_TYPE_DAMAGE); + } + } + + // Применяем урон, убеждаемся, что HP не ниже нуля + const actualDamageDealtToHp = Math.min(defenderState.currentHp, damage); // Сколько HP реально отнято (не может быть больше текущего HP) + defenderState.currentHp = Math.max(0, Math.round(defenderState.currentHp - damage)); + + // --- Насмешка от защищающегося (defenderState) в ответ на атаку --- + if (getRandomTauntFunction && dataUtils) { + let subTriggerForTaunt = null; + if (wasBlocked) { + subTriggerForTaunt = 'attackBlocked'; + } else if (actualDamageDealtToHp > 0) { // Если не было блока, но был нанесен урон + subTriggerForTaunt = 'attackHits'; + } + // Можно добавить еще условие для промаха, если урон = 0 и не было блока (и actualDamageDealtToHp === 0) + // else if (damage <= 0 && !wasBlocked) { subTriggerForTaunt = 'attackMissed'; } // Если есть такой триггер + + if (subTriggerForTaunt) { + const attackerFullDataForTaunt = dataUtils.getCharacterData(attackerState.characterKey); + if (attackerFullDataForTaunt) { + const reactionTaunt = getRandomTauntFunction( + defenderState.characterKey, // Говорящий (защитник) + 'onOpponentAction', // Главный триггер + subTriggerForTaunt, // Подтриггер: 'attackBlocked' или 'attackHits' + configToUse, + attackerFullDataForTaunt, // Оппонент (атакующий) для говорящего + currentGameState + ); + if (reactionTaunt && reactionTaunt !== "(Молчание)") { + addToLogCallback(`${defenderState.name}: "${reactionTaunt}"`, configToUse.LOG_TYPE_INFO); + } + } + } + } +} + + +/** + * применяет111 эффект способности. + * @param {object} ability - Объект способности. + * @param {object} casterState - Состояние бойца, применившего способность. + * @param {object} targetState - Состояние цели способности. + * @param {object} casterBaseStats - Базовые статы кастера. + * @param {object} targetBaseStats - Базовые статы цели. + * @param {object} currentGameState - Текущее полное состояние игры. + * @param {function} addToLogCallback - Функция для добавления лога. + * @param {object} configToUse - Конфигурация игры. + * @param {object} dataUtils - Утилиты для доступа к данным игры. + * @param {function} getRandomTauntFunction - Функция gameLogic.getRandomTaunt. + * @param {function|null} checkIfActionWasSuccessfulFunction - (Опционально) Функция для проверки успеха действия для контекстных насмешек. + */ +function applyAbilityEffect( + ability, + casterState, + targetState, + casterBaseStats, + targetBaseStats, + currentGameState, + addToLogCallback, + configToUse, + dataUtils, + getRandomTauntFunction, + checkIfActionWasSuccessfulFunction // Пока не используется активно, outcome определяется внутри +) { + let abilityApplicationSucceeded = true; // Флаг общего успеха применения способности + let actionOutcomeForTaunt = null; // 'success' или 'fail' для специфичных насмешек (например, Безмолвие Баларда) + + switch (ability.type) { + case configToUse.ACTION_TYPE_HEAL: + const healAmount = Math.floor(ability.power * (configToUse.HEAL_VARIATION_MIN + Math.random() * configToUse.HEAL_VARIATION_RANGE)); + const actualHeal = Math.min(healAmount, casterBaseStats.maxHp - casterState.currentHp); + if (actualHeal > 0) { + casterState.currentHp = Math.round(casterState.currentHp + actualHeal); + if (addToLogCallback) addToLogCallback(`💚 ${casterBaseStats.name} применяет111 "${ability.name}" и восстанавливает ${actualHeal} HP!`, configToUse.LOG_TYPE_HEAL); + actionOutcomeForTaunt = 'success'; // Для реакции оппонента, если таковая есть на хил + } else { + if (addToLogCallback) addToLogCallback(`✨ ${casterBaseStats.name} применяет111 "${ability.name}", но не получает лечения (HP уже полное или хил = 0).`, configToUse.LOG_TYPE_INFO); + abilityApplicationSucceeded = false; + actionOutcomeForTaunt = 'fail'; + } + break; + + case configToUse.ACTION_TYPE_DAMAGE: + let damage = Math.floor(ability.power * (configToUse.DAMAGE_VARIATION_MIN + Math.random() * configToUse.DAMAGE_VARIATION_RANGE)); + let wasAbilityBlocked = false; + let actualDamageDealtByAbility = 0; + + if (targetState.isBlocking) { + const initialDamage = damage; + damage = Math.floor(damage * configToUse.BLOCK_DAMAGE_REDUCTION); + wasAbilityBlocked = true; + if (addToLogCallback) addToLogCallback(`🛡️ ${targetBaseStats.name} блокирует "${ability.name}" от ${casterBaseStats.name}! Урон снижен (${initialDamage} -> ${damage}).`, configToUse.LOG_TYPE_BLOCK); + } + + actualDamageDealtByAbility = Math.min(targetState.currentHp, damage); + targetState.currentHp = Math.max(0, Math.round(targetState.currentHp - damage)); + + if (addToLogCallback && !wasAbilityBlocked) { + addToLogCallback(`💥 ${casterBaseStats.name} применяет111 "${ability.name}" на ${targetBaseStats.name}, нанося ${damage} урона!`, configToUse.LOG_TYPE_DAMAGE); + } + + if (damage <= 0 && !wasAbilityBlocked) { // Если урон нулевой и не было блока (например, из-за резистов, которых пока нет) + abilityApplicationSucceeded = false; + actionOutcomeForTaunt = 'fail'; + } else if (wasAbilityBlocked) { + actionOutcomeForTaunt = 'blocked'; // Специальный исход для реакции на блок способности + } else if (actualDamageDealtByAbility > 0) { + actionOutcomeForTaunt = 'hit'; // Специальный исход для реакции на попадание способностью + } else { + actionOutcomeForTaunt = 'fail'; // Если урон 0 и не было блока (например цель уже мертва и 0 хп) + } + break; + + case configToUse.ACTION_TYPE_BUFF: + let effectDescriptionBuff = ability.description; + if (typeof ability.descriptionFunction === 'function') { + effectDescriptionBuff = ability.descriptionFunction(configToUse, targetBaseStats); // targetBaseStats здесь может быть casterBaseStats, если бафф на себя + } + // Обычно баффы накладываются на кастера + casterState.activeEffects.push({ + id: ability.id, name: ability.name, description: effectDescriptionBuff, + type: ability.type, duration: ability.duration, + turnsLeft: ability.duration, + grantsBlock: !!ability.grantsBlock, + isDelayed: !!ability.isDelayed, + justCast: true + }); + if (ability.grantsBlock && casterState.activeEffects.find(e => e.id === ability.id && e.grantsBlock)) { + // Требуется effectsLogic.updateBlockingStatus(casterState); + // но GameInstance вызывает его в switchTurn, так что здесь можно не дублировать, если эффект не мгновенный + } + if (addToLogCallback) addToLogCallback(`✨ ${casterBaseStats.name} накладывает эффект "${ability.name}"!`, configToUse.LOG_TYPE_EFFECT); + actionOutcomeForTaunt = 'success'; // Для реакции оппонента, если бафф на себя + break; + + case configToUse.ACTION_TYPE_DISABLE: + // Общее "полное безмолвие" от Елены или Альмагест + if (ability.id === configToUse.ABILITY_ID_HYPNOTIC_GAZE || ability.id === configToUse.ABILITY_ID_ALMAGEST_DISABLE) { + const effectIdFullSilence = ability.id === configToUse.ABILITY_ID_HYPNOTIC_GAZE ? 'fullSilenceByElena' : 'fullSilenceByAlmagest'; + if (!targetState.activeEffects.some(e => e.id === effectIdFullSilence)) { + targetState.activeEffects.push({ + id: effectIdFullSilence, name: ability.name, description: ability.description, + type: ability.type, duration: ability.effectDuration, turnsLeft: ability.effectDuration, + power: ability.power, isFullSilence: true, justCast: true + }); + if (addToLogCallback) addToLogCallback(`🌀 ${casterBaseStats.name} применяет111 "${ability.name}" на ${targetBaseStats.name}! Способности цели заблокированы на ${ability.effectDuration} хода!`, configToUse.LOG_TYPE_EFFECT); + actionOutcomeForTaunt = 'success'; + } else { + if (addToLogCallback) addToLogCallback(`${casterBaseStats.name} пытается применить "${ability.name}", но эффект уже активен на ${targetState.name}!`, configToUse.LOG_TYPE_INFO); + abilityApplicationSucceeded = false; + actionOutcomeForTaunt = 'fail'; + } + } + // Специальное Безмолвие Баларда + else if (ability.id === configToUse.ABILITY_ID_BALARD_SILENCE && casterState.characterKey === 'balard') { + const success = Math.random() < configToUse.SILENCE_SUCCESS_RATE; + actionOutcomeForTaunt = success ? 'success' : 'fail'; // Этот outcome используется в tauntLogic + if (success) { + const targetAbilitiesList = dataUtils.getCharacterAbilities(targetState.characterKey); + const availableAbilitiesToSilence = targetAbilitiesList.filter(pa => + !targetState.disabledAbilities?.some(d => d.abilityId === pa.id) && + !targetState.activeEffects?.some(eff => eff.id === `playerSilencedOn_${pa.id}`) && + pa.id !== configToUse.ABILITY_ID_NONE // Исключаем "пустую" абилку, если она есть + ); + if (availableAbilitiesToSilence.length > 0) { + const abilityToSilence = availableAbilitiesToSilence[Math.floor(Math.random() * availableAbilitiesToSilence.length)]; + const turns = configToUse.SILENCE_DURATION; + targetState.disabledAbilities.push({ abilityId: abilityToSilence.id, turnsLeft: turns + 1 }); + targetState.activeEffects.push({ + id: `playerSilencedOn_${abilityToSilence.id}`, name: `Безмолвие: ${abilityToSilence.name}`, + description: `Способность "${abilityToSilence.name}" временно недоступна.`, + type: configToUse.ACTION_TYPE_DISABLE, sourceAbilityId: ability.id, + duration: turns, turnsLeft: turns + 1, justCast: true + }); + if (addToLogCallback) addToLogCallback(`🔇 Эхо Безмолвия! "${abilityToSilence.name}" у ${targetBaseStats.name} заблокировано на ${turns} хода!`, configToUse.LOG_TYPE_EFFECT); + } else { + if (addToLogCallback) addToLogCallback(`${casterBaseStats.name} пытается наложить Безмолвие, но у ${targetBaseStats.name} нечего глушить!`, configToUse.LOG_TYPE_INFO); + actionOutcomeForTaunt = 'fail'; // Переопределяем, т.к. нечего было глушить + } + } else { + if (addToLogCallback) addToLogCallback(`💨 Попытка ${casterBaseStats.name} наложить Безмолвие на ${targetBaseStats.name} провалилась!`, configToUse.LOG_TYPE_INFO); + } + } + break; + + case configToUse.ACTION_TYPE_DEBUFF: + const effectIdDebuff = 'effect_' + ability.id; // Уникальный ID для дебаффа на цели + if (!targetState.activeEffects.some(e => e.id === effectIdDebuff)) { + let effectDescriptionDebuff = ability.description; + if (typeof ability.descriptionFunction === 'function') { + effectDescriptionDebuff = ability.descriptionFunction(configToUse, targetBaseStats); + } + targetState.activeEffects.push({ + id: effectIdDebuff, name: ability.name, description: effectDescriptionDebuff, + type: configToUse.ACTION_TYPE_DEBUFF, sourceAbilityId: ability.id, + duration: ability.effectDuration, turnsLeft: ability.effectDuration, + power: ability.power, justCast: true + }); + if (addToLogCallback) addToLogCallback(`📉 ${casterBaseStats.name} накладывает "${ability.name}" на ${targetBaseStats.name}! Эффект продлится ${ability.effectDuration} хода.`, configToUse.LOG_TYPE_EFFECT); + actionOutcomeForTaunt = 'success'; + } else { + if (addToLogCallback) addToLogCallback(`${casterBaseStats.name} пытается применить "${ability.name}", но эффект уже активен на ${targetState.name}!`, configToUse.LOG_TYPE_INFO); + abilityApplicationSucceeded = false; + actionOutcomeForTaunt = 'fail'; + } + break; + + case configToUse.ACTION_TYPE_DRAIN: // Пример для Манадрейна Баларда + if (casterState.characterKey === 'balard' && ability.id === configToUse.ABILITY_ID_BALARD_MANA_DRAIN) { + let manaDrained = 0; let healthGained = 0; let damageDealtDrain = 0; + if (ability.powerDamage > 0) { + let baseDamageDrain = ability.powerDamage; + if (targetState.isBlocking) { // Маловероятно, что дрейны блокируются, но для полноты + baseDamageDrain = Math.floor(baseDamageDrain * configToUse.BLOCK_DAMAGE_REDUCTION); + } + damageDealtDrain = Math.max(0, baseDamageDrain); + targetState.currentHp = Math.max(0, Math.round(targetState.currentHp - damageDealtDrain)); + } + const potentialDrain = ability.powerManaDrain; + const actualDrain = Math.min(potentialDrain, targetState.currentResource); + + if (actualDrain > 0) { + targetState.currentResource = Math.max(0, Math.round(targetState.currentResource - actualDrain)); + manaDrained = actualDrain; + const potentialHeal = Math.floor(manaDrained * (ability.powerHealthGainFactor || 0)); // Убедимся, что фактор есть + const actualHealGain = Math.min(potentialHeal, casterBaseStats.maxHp - casterState.currentHp); + if (actualHealGain > 0) { + casterState.currentHp = Math.round(casterState.currentHp + actualHealGain); + healthGained = actualHealGain; + } + } + + let logMsgDrain = `⚡ ${casterBaseStats.name} применяет11111 "${ability.name}"! `; + if (damageDealtDrain > 0) logMsgDrain += `Наносит ${damageDealtDrain} урона ${targetBaseStats.name}. `; + if (manaDrained > 0) { + logMsgDrain += `Вытягивает ${manaDrained} ${targetBaseStats.resourceName} у ${targetBaseStats.name}`; + if(healthGained > 0) logMsgDrain += ` и исцеляется на ${healthGained} HP!`; else logMsgDrain += `!`; + } else if (damageDealtDrain > 0) { + logMsgDrain += `${targetBaseStats.name} не имеет ${targetBaseStats.resourceName} для похищения.`; + } else { + logMsgDrain += `Не удалось ничего похитить у ${targetBaseStats.name}.`; + } + + if (addToLogCallback) addToLogCallback(logMsgDrain, (manaDrained > 0 || damageDealtDrain > 0) ? configToUse.LOG_TYPE_DAMAGE : configToUse.LOG_TYPE_INFO); + + if (manaDrained <= 0 && damageDealtDrain <= 0 && healthGained <= 0) { + abilityApplicationSucceeded = false; + actionOutcomeForTaunt = 'fail'; + } else { + actionOutcomeForTaunt = 'success'; + } + } + break; + + default: + if (addToLogCallback) addToLogCallback(`Неизвестный тип способности: ${ability?.type} для "${ability?.name}"`, configToUse.LOG_TYPE_SYSTEM); + console.warn(`applyAbilityEffect: Неизвестный тип способности: ${ability?.type} для способности ${ability?.id}`); + abilityApplicationSucceeded = false; + actionOutcomeForTaunt = 'fail'; + } + + // --- Насмешка от цели (targetState) в ответ на применение способности оппонентом (casterState) --- + // Вызываем только если способность не была нацелена на самого себя И есть функция насмешек + if (getRandomTauntFunction && dataUtils && casterState.id !== targetState.id) { + const casterFullDataForTaunt = dataUtils.getCharacterData(casterState.characterKey); + if (casterFullDataForTaunt) { + let tauntContext = { abilityId: ability.id }; + + // Если для этой способности был определен исход (например, для безмолвия Баларда, или попадание/блок урона) + // Используем actionOutcomeForTaunt, который мы установили в switch-case выше + if (actionOutcomeForTaunt === 'success' || actionOutcomeForTaunt === 'fail' || actionOutcomeForTaunt === 'blocked' || actionOutcomeForTaunt === 'hit') { + tauntContext.outcome = actionOutcomeForTaunt; + } + // Для способностей типа DAMAGE, 'blocked' и 'hit' будут ключами в taunts.js (например, Elena onOpponentAction -> ABILITY_ID_ALMAGEST_DAMAGE -> blocked: [...]) + // Это не стандартные 'attackBlocked' и 'attackHits', а специфичные для реакции на *способность* + // Если вы хотите использовать общие 'attackBlocked'/'attackHits' и для способностей, вам нужно будет изменить логику в taunts.js + // или передавать здесь другие subTrigger'ы, если способность заблокирована/попала. + + const reactionTaunt = getRandomTauntFunction( + targetState.characterKey, // Кто говорит (цель способности) + 'onOpponentAction', // Триггер + tauntContext, // Контекст: ID способности кастера (оппонента) и, возможно, outcome + configToUse, + casterFullDataForTaunt, // Оппонент для говорящего - это кастер + currentGameState + ); + if (reactionTaunt && reactionTaunt !== "(Молчание)") { + addToLogCallback(`${targetState.name}: "${reactionTaunt}"`, configToUse.LOG_TYPE_INFO); + } + } + } +} + + +/** + * Проверяет валидность использования способности. + * @param {object} ability - Объект способности. + * @param {object} casterState - Состояние бойца, который пытается применить способность. + * @param {object} targetState - Состояние цели (может быть тем же, что и casterState). + * @param {object} configToUse - Конфигурационный объект игры (GAME_CONFIG). + * @returns {object} - { isValid: boolean, reason: string|null } + */ +function checkAbilityValidity(ability, casterState, targetState, configToUse) { + if (!ability) return { isValid: false, reason: "Способность не найдена." }; + + if (casterState.currentResource < ability.cost) { + return { isValid: false, reason: `${casterState.name} пытается применить "${ability.name}", но не хватает ${casterState.resourceName} (${casterState.currentResource}/${ability.cost})!` }; + } + + if ((casterState.abilityCooldowns?.[ability.id] || 0) > 0) { + return { isValid: false, reason: `"${ability.name}" еще на перезарядке (${casterState.abilityCooldowns[ability.id]} х.).` }; + } + + // Специальные кулдауны для Баларда + if (casterState.characterKey === 'balard') { + if (ability.id === configToUse.ABILITY_ID_BALARD_SILENCE && (casterState.silenceCooldownTurns || 0) > 0) { + return { isValid: false, reason: `"${ability.name}" (спец. КД) еще на перезарядке (${casterState.silenceCooldownTurns} х.).` }; + } + if (ability.id === configToUse.ABILITY_ID_BALARD_MANA_DRAIN && (casterState.manaDrainCooldownTurns || 0) > 0) { + return { isValid: false, reason: `"${ability.name}" (спец. КД) еще на перезарядке (${casterState.manaDrainCooldownTurns} х.).` }; + } + } + + // Проверка на безмолвие + const isCasterFullySilenced = casterState.activeEffects.some(eff => eff.isFullSilence && eff.turnsLeft > 0); + const isAbilitySpecificallySilenced = casterState.disabledAbilities?.some(dis => dis.abilityId === ability.id && dis.turnsLeft > 0); + if (isCasterFullySilenced) { + return { isValid: false, reason: `${casterState.name} не может использовать способности из-за полного безмолвия!` }; + } + if (isAbilitySpecificallySilenced) { + const specificSilenceEffect = casterState.disabledAbilities.find(dis => dis.abilityId === ability.id); + return { isValid: false, reason: `Способность "${ability.name}" у ${casterState.name} временно заблокирована (${specificSilenceEffect.turnsLeft} х.)!` }; + } + + + // Проверка наложения баффа, который уже активен (кроме обновляемых) + if (ability.type === configToUse.ACTION_TYPE_BUFF && casterState.activeEffects.some(e => e.id === ability.id)) { + // Исключение для "отложенных" баффов, которые можно обновлять (например, Сила Природы) + if (!ability.isDelayed) { // Если isDelayed не true, то нельзя обновлять. + return { isValid: false, reason: `Эффект "${ability.name}" уже активен у ${casterState.name}!` }; + } + } + + // Проверка наложения дебаффа, который уже активен на цели + const isTargetedDebuff = ability.type === configToUse.ACTION_TYPE_DEBUFF || + (ability.type === configToUse.ACTION_TYPE_DISABLE && ability.id !== configToUse.ABILITY_ID_BALARD_SILENCE); // Безмолвие Баларда может пытаться наложиться повторно (и провалиться) + + if (isTargetedDebuff && targetState.id !== casterState.id) { // Убедимся, что это не бафф на себя, проверяемый как дебафф + const effectIdToCheck = (ability.type === configToUse.ACTION_TYPE_DISABLE && ability.id !== configToUse.ABILITY_ID_BALARD_SILENCE) ? + (ability.id === configToUse.ABILITY_ID_HYPNOTIC_GAZE ? 'fullSilenceByElena' : 'fullSilenceByAlmagest') : + ('effect_' + ability.id); + + if (targetState.activeEffects.some(e => e.id === effectIdToCheck)) { + return { isValid: false, reason: `Эффект "${ability.name}" уже наложен на ${targetState.name}!` }; + } + } + + return { isValid: true, reason: null }; +} + + +module.exports = { + performAttack, + applyAbilityEffect, + checkAbilityValidity +}; \ No newline at end of file diff --git a/server/game/logic/cooldownLogic.js b/server/game/logic/cooldownLogic.js new file mode 100644 index 0000000..73e48a7 --- /dev/null +++ b/server/game/logic/cooldownLogic.js @@ -0,0 +1,154 @@ +// /server/game/logic/cooldownLogic.js + +// GAME_CONFIG будет передаваться в функции как параметр configToUse +// const GAME_CONFIG_STATIC = require('../../core/config'); // Если нужен для внутренних констант + +/** + * Обрабатывает отсчет общих кулдаунов для способностей игрока в конце его хода. + * Длительность кулдауна уменьшается на 1. + * @param {object} cooldownsObject - Объект с кулдаунами способностей ({ abilityId: turnsLeft }). + * @param {Array} characterAbilities - Полный список способностей персонажа (для получения имени). + * @param {string} characterName - Имя персонажа (для лога). + * @param {function} addToLogCallback - Функция для добавления лога. + * @param {object} configToUse - Конфигурационный объект игры (GAME_CONFIG). + */ +function processPlayerAbilityCooldowns(cooldownsObject, characterAbilities, characterName, addToLogCallback, configToUse) { + if (!cooldownsObject || !characterAbilities) { + // console.warn(`[CooldownLogic] processPlayerAbilityCooldowns: Missing cooldownsObject or characterAbilities for ${characterName}`); + return; + } + + for (const abilityId in cooldownsObject) { + // Проверяем, что свойство принадлежит самому объекту, а не прототипу, и что кулдаун активен + if (Object.prototype.hasOwnProperty.call(cooldownsObject, abilityId) && cooldownsObject[abilityId] > 0) { + cooldownsObject[abilityId]--; // Уменьшаем кулдаун + + if (cooldownsObject[abilityId] === 0) { + const ability = characterAbilities.find(ab => ab.id === abilityId); + if (ability && addToLogCallback) { + addToLogCallback( + `Способность "${ability.name}" персонажа ${characterName} снова готова!`, + configToUse.LOG_TYPE_INFO // Используем LOG_TYPE_INFO из переданного конфига + ); + } + } + } + } +} + +/** + * Обрабатывает отсчет для отключенных (заглушенных) способностей игрока в конце его хода. + * Длительность заглушения уменьшается на 1. + * @param {Array} disabledAbilitiesArray - Массив объектов заглушенных способностей. + * @param {Array} characterAbilities - Полный список способностей персонажа (для получения имени). + * @param {string} characterName - Имя персонажа (для лога). + * @param {function} addToLogCallback - Функция для добавления лога. + * @param {object} configToUse - Конфигурационный объект игры (GAME_CONFIG). + */ +function processDisabledAbilities(disabledAbilitiesArray, characterAbilities, characterName, addToLogCallback, configToUse) { + if (!disabledAbilitiesArray || disabledAbilitiesArray.length === 0) { + return; + } + + const stillDisabled = []; // Новый массив для активных заглушений + for (let i = 0; i < disabledAbilitiesArray.length; i++) { + const dis = disabledAbilitiesArray[i]; + dis.turnsLeft--; // Уменьшаем длительность заглушения + + if (dis.turnsLeft > 0) { + stillDisabled.push(dis); + } else { + // Заглушение закончилось + if (addToLogCallback) { + const ability = characterAbilities.find(ab => ab.id === dis.abilityId); + if (ability) { + addToLogCallback( + `Способность "${ability.name}" персонажа ${characterName} больше не заглушена!`, + configToUse.LOG_TYPE_INFO + ); + } else { + // Если способность не найдена по ID (маловероятно, но возможно при ошибках данных) + addToLogCallback( + `Заглушение для неизвестной способности персонажа ${characterName} (ID: ${dis.abilityId}) закончилось.`, + configToUse.LOG_TYPE_INFO + ); + } + } + // Также нужно удалить соответствующий эффект из activeEffects, если он там был (например, playerSilencedOn_X) + // Это должно происходить в effectsLogic.processEffects, когда эффект с id `playerSilencedOn_${dis.abilityId}` истекает. + // Здесь мы только управляем массивом `disabledAbilities`. + } + } + + // Обновляем исходный массив, удаляя истекшие заглушения + disabledAbilitiesArray.length = 0; // Очищаем массив (сохраняя ссылку, если она используется где-то еще) + disabledAbilitiesArray.push(...stillDisabled); // Добавляем обратно только те, что еще активны +} + +/** + * Устанавливает или обновляет кулдаун для способности. + * Также обрабатывает специальные внутренние кулдауны для Баларда. + * @param {object} ability - Объект способности, для которой устанавливается кулдаун. + * @param {object} casterState - Состояние персонажа, применившего способность. + * @param {object} configToUse - Конфигурационный объект игры (GAME_CONFIG). + */ +function setAbilityCooldown(ability, casterState, configToUse) { + if (!ability || !casterState || !casterState.abilityCooldowns) { + console.warn("[CooldownLogic] setAbilityCooldown: Missing ability, casterState, or casterState.abilityCooldowns."); + return; + } + + let baseCooldown = 0; + if (typeof ability.cooldown === 'number' && ability.cooldown > 0) { // Убедимся, что исходный КД > 0 + baseCooldown = ability.cooldown; + } + + // Специальные внутренние КД для Баларда - они могут перебивать общий КД + if (casterState.characterKey === 'balard') { + if (ability.id === configToUse.ABILITY_ID_BALARD_SILENCE && + typeof ability.internalCooldownFromConfig === 'string' && // Проверяем, что есть ключ для конфига + typeof configToUse[ability.internalCooldownFromConfig] === 'number') { + // Устанавливаем значение для специального счетчика КД Баларда + casterState.silenceCooldownTurns = configToUse[ability.internalCooldownFromConfig]; + // Этот специальный КД также становится текущим общим КД для этой способности + baseCooldown = configToUse[ability.internalCooldownFromConfig]; + } else if (ability.id === configToUse.ABILITY_ID_BALARD_MANA_DRAIN && + typeof ability.internalCooldownValue === 'number') { // Здесь КД задан прямо в данных способности + casterState.manaDrainCooldownTurns = ability.internalCooldownValue; + baseCooldown = ability.internalCooldownValue; + } + } + + if (baseCooldown > 0) { + // Устанавливаем кулдаун. Добавляем +1, так как кулдаун уменьшится в конце текущего хода + // (когда будет вызван processPlayerAbilityCooldowns для этого персонажа). + casterState.abilityCooldowns[ability.id] = baseCooldown + 1; + } else { + // Если у способности нет базового кулдауна (baseCooldown === 0), + // убеждаемся, что в abilityCooldowns для нее стоит 0. + casterState.abilityCooldowns[ability.id] = 0; + } +} + +/** + * Обрабатывает специальные кулдауны для Баларда в конце его хода. + * @param {object} balardState - Состояние Баларда. + */ +function processBalardSpecialCooldowns(balardState) { + if (balardState.characterKey !== 'balard') return; + + if (balardState.silenceCooldownTurns !== undefined && balardState.silenceCooldownTurns > 0) { + balardState.silenceCooldownTurns--; + } + if (balardState.manaDrainCooldownTurns !== undefined && balardState.manaDrainCooldownTurns > 0) { + balardState.manaDrainCooldownTurns--; + } +} + + +module.exports = { + processPlayerAbilityCooldowns, + processDisabledAbilities, + setAbilityCooldown, + processBalardSpecialCooldowns +}; \ No newline at end of file diff --git a/server/game/logic/effectsLogic.js b/server/game/logic/effectsLogic.js new file mode 100644 index 0000000..69295d5 --- /dev/null +++ b/server/game/logic/effectsLogic.js @@ -0,0 +1,153 @@ +// /server/game/logic/effectsLogic.js + +// GAME_CONFIG и dataUtils будут передаваться в функции как параметры. +// const GAME_CONFIG_STATIC = require('../../core/config'); // Если нужен для внутренних констант +// const DATA_UTILS_STATIC = require('../../data/dataUtils'); // Если нужен для внутренних констант + +/** + * Обрабатывает активные эффекты (баффы/дебаффы) для бойца в конце его хода. + * Длительность эффекта уменьшается на 1. + * Периодические эффекты (DoT, сжигание ресурса и т.п.) срабатывают, если эффект не "justCast" в этом ходу. + * @param {Array} activeEffectsArray - Массив активных эффектов бойца (из gameState.player.activeEffects или gameState.opponent.activeEffects). + * @param {object} ownerState - Состояние бойца, на котором эффекты (currentHp, currentResource и т.д.). + * @param {object} ownerBaseStats - Базовые статы бойца (включая characterKey, name, maxHp, maxResource). + * @param {string} ownerRoleInGame - Роль бойца в игре ('player' или 'opponent'), для контекста. + * @param {object} currentGameState - Полное текущее состояние игры. + * @param {function} addToLogCallback - Функция для добавления сообщений в лог игры. + * @param {object} configToUse - Конфигурационный объект игры (GAME_CONFIG). + * @param {object} dataUtils - Утилиты для доступа к данным игры (getCharacterData, getCharacterAbilities и т.д.). + */ +function processEffects( + activeEffectsArray, + ownerState, + ownerBaseStats, + ownerRoleInGame, // 'player' или 'opponent' + currentGameState, + addToLogCallback, + configToUse, + dataUtils +) { + if (!activeEffectsArray || activeEffectsArray.length === 0) { + return; + } + + const ownerName = ownerBaseStats.name; + const effectsToRemoveIndexes = []; + + for (let i = 0; i < activeEffectsArray.length; i++) { + const effect = activeEffectsArray[i]; + + // --- Применяем периодический эффект (DoT, сжигание ресурса и т.п.), если он не только что наложен --- + if (!effect.justCast) { + // 1. Урон от эффектов полного безмолвия (Гипнотический Взгляд, Раскол Разума) + // Эти эффекты наносят урон цели В КОНЦЕ ее хода. + if (effect.isFullSilence && typeof effect.power === 'number' && effect.power > 0) { + const damage = effect.power; // Урон, заложенный в эффекте + ownerState.currentHp = Math.max(0, Math.round(ownerState.currentHp - damage)); + if (addToLogCallback) { + addToLogCallback( + `😵 Эффект "${effect.name}" наносит ${damage} урона персонажу ${ownerName}! (HP: ${ownerState.currentHp}/${ownerBaseStats.maxHp})`, + configToUse.LOG_TYPE_DAMAGE + ); + } + } + + // 2. Сжигание ресурса (Печать Слабости, Проклятие Увядания) + // Эти эффекты сжигают ресурс цели В КОНЦЕ ее хода. + // ID эффекта на цели имеет префикс 'effect_' + ID способности, которая его наложила. + const isResourceBurnDebuff = effect.id === 'effect_' + configToUse.ABILITY_ID_SEAL_OF_WEAKNESS || + effect.id === 'effect_' + configToUse.ABILITY_ID_ALMAGEST_DEBUFF; + if (isResourceBurnDebuff && typeof effect.power === 'number' && effect.power > 0) { + const resourceToBurn = effect.power; // Количество ресурса, сжигаемое за ход + if (ownerState.currentResource > 0) { + const actualBurn = Math.min(ownerState.currentResource, resourceToBurn); + ownerState.currentResource = Math.max(0, Math.round(ownerState.currentResource - actualBurn)); + if (addToLogCallback) { + addToLogCallback( + `🔥 Эффект "${effect.name}" сжигает ${actualBurn} ${ownerBaseStats.resourceName} у ${ownerName}! (Ресурс: ${ownerState.currentResource}/${ownerBaseStats.maxResource})`, + configToUse.LOG_TYPE_EFFECT + ); + } + } + } + // Примечание: Отложенные эффекты (isDelayed: true, например, Сила Природы) + // применяют свою основную силу в GameInstance.processPlayerAction (после атаки), а не здесь. + // Здесь они просто тикают по длительности. + } + + // --- Уменьшаем длительность --- + effect.turnsLeft--; + effect.justCast = false; // Эффект больше не считается "just cast" после обработки этого хода + + // --- Отмечаем для удаления, если длительность закончилась --- + if (effect.turnsLeft <= 0) { + effectsToRemoveIndexes.push(i); + if (addToLogCallback) { + addToLogCallback( + `Эффект "${effect.name}" на персонаже ${ownerName} закончился.`, + configToUse.LOG_TYPE_EFFECT + ); + } + // Если это был эффект, дающий блок, нужно обновить статус блокировки + if (effect.grantsBlock) { + updateBlockingStatus(ownerState); // Вызываем сразу, т.к. эффект удаляется + } + // Если это был эффект заглушения конкретной способности (playerSilencedOn_X), + // то соответствующая запись в ownerState.disabledAbilities должна быть удалена в cooldownLogic.processDisabledAbilities. + // Здесь мы просто удаляем сам эффект из activeEffects. + } + } + + // Удаляем эффекты с конца массива, чтобы не нарушить индексы при удалении + for (let i = effectsToRemoveIndexes.length - 1; i >= 0; i--) { + activeEffectsArray.splice(effectsToRemoveIndexes[i], 1); + } + + // После удаления всех истекших эффектов, еще раз обновляем статус блока, + // так как какой-то из удаленных эффектов мог быть последним дающим блок. + // (хотя updateBlockingStatus вызывается и при удалении конкретного блокирующего эффекта) + updateBlockingStatus(ownerState); +} + +/** + * Обновляет статус 'isBlocking' для бойца на основе его активных эффектов. + * Боец считается блокирующим, если у него есть хотя бы один активный эффект с флагом grantsBlock: true. + * @param {object} fighterState - Состояние бойца (объект из gameState.player или gameState.opponent). + */ +function updateBlockingStatus(fighterState) { + if (!fighterState || !fighterState.activeEffects) { + // console.warn("[EffectsLogic] updateBlockingStatus: fighterState or activeEffects missing."); + if (fighterState) fighterState.isBlocking = false; // Если нет эффектов, то точно не блокирует + return; + } + // Боец блокирует, если есть ХОТЯ БЫ ОДИН активный эффект, дающий блок + const wasBlocking = fighterState.isBlocking; + fighterState.isBlocking = fighterState.activeEffects.some(eff => eff.grantsBlock && eff.turnsLeft > 0); + + // Можно добавить лог, если статус блока изменился, для отладки + // if (wasBlocking !== fighterState.isBlocking && addToLogCallback) { + // addToLogCallback(`${fighterState.name} ${fighterState.isBlocking ? 'встает в защиту' : 'перестает защищаться'} из-за эффектов.`, 'info'); + // } +} + +/** + * Проверяет, находится ли персонаж под действием полного безмолвия. + * @param {object} characterState - Состояние персонажа из gameState. + * @param {object} configToUse - Конфигурационный объект игры. + * @returns {boolean} true, если персонаж под полным безмолвием, иначе false. + */ +function isCharacterFullySilenced(characterState, configToUse) { + if (!characterState || !characterState.activeEffects) { + return false; + } + return characterState.activeEffects.some( + eff => eff.isFullSilence && eff.turnsLeft > 0 + ); +} + + +module.exports = { + processEffects, + updateBlockingStatus, + isCharacterFullySilenced +}; \ No newline at end of file diff --git a/server/game/logic/gameStateLogic.js b/server/game/logic/gameStateLogic.js new file mode 100644 index 0000000..cafe475 --- /dev/null +++ b/server/game/logic/gameStateLogic.js @@ -0,0 +1,133 @@ +// /server/game/logic/gameStateLogic.js + +// GAME_CONFIG будет передаваться в функции как параметр configToUse. +// dataUtils также может передаваться, если нужен для какой-то логики здесь. + +/** + * Внутренняя проверка условий конца игры (основано на HP). + * @param {object} currentGameState - Текущее состояние игры. + * // configToUse и dataUtils здесь не используются, но могут понадобиться для более сложных условий + * @param {object} configToUse - Конфигурация игры. + * @param {object} dataUtils - Утилиты для доступа к данным. + * @returns {boolean} true, если игра окончена по HP, иначе false. + */ +function checkGameOverInternal(currentGameState, configToUse, dataUtils) { + if (!currentGameState || currentGameState.isGameOver) { + // Если игра уже помечена как оконченная, или нет состояния, возвращаем текущий статус + return currentGameState ? currentGameState.isGameOver : true; + } + + // Убеждаемся, что оба бойца определены в gameState и не являются плейсхолдерами + if (!currentGameState.player || !currentGameState.opponent || + !currentGameState.player.characterKey || !currentGameState.opponent.characterKey || // Проверяем, что персонажи назначены + currentGameState.opponent.name === 'Ожидание игрока...' || // Дополнительная проверка на плейсхолдер + !currentGameState.opponent.maxHp || currentGameState.opponent.maxHp <= 0) { + return false; // Игра не может закончиться по HP, если один из бойцов не готов/не определен + } + + const playerDead = currentGameState.player.currentHp <= 0; + const opponentDead = currentGameState.opponent.currentHp <= 0; + + return playerDead || opponentDead; // Игра окончена, если хотя бы один мертв +} + +/** + * Определяет результат завершения игры (победитель, проигравший, причина). + * Вызывается, когда checkGameOverInternal вернул true или игра завершается по другой причине (дисконнект, таймаут). + * @param {object} currentGameState - Текущее состояние игры. + * @param {object} configToUse - Конфигурация игры (GAME_CONFIG). + * @param {string} gameMode - Режим игры ('ai' или 'pvp'). + * @param {string} [explicitReason=null] - Явная причина завершения (например, 'turn_timeout', 'opponent_disconnected'). + * Если null, причина определяется по HP. + * @param {string} [explicitWinnerRole=null] - Явный победитель (если известен, например, при дисконнекте). + * @param {string} [explicitLoserRole=null] - Явный проигравший (если известен). + * @returns {{isOver: boolean, winnerRole: string|null, loserRole: string|null, reason: string, logMessage: string}} + */ +function getGameOverResult( + currentGameState, + configToUse, + gameMode, + explicitReason = null, + explicitWinnerRole = null, + explicitLoserRole = null +) { + if (!currentGameState) { + return { isOver: true, winnerRole: null, loserRole: null, reason: 'error_no_gamestate', logMessage: 'Ошибка: нет состояния игры.' }; + } + + // Если причина уже задана (например, дисконнект или таймаут), используем ее + if (explicitReason) { + let winnerName = explicitWinnerRole ? (currentGameState[explicitWinnerRole]?.name || explicitWinnerRole) : 'Никто'; + let loserName = explicitLoserRole ? (currentGameState[explicitLoserRole]?.name || explicitLoserRole) : 'Никто'; + let logMsg = ""; + + if (explicitReason === 'turn_timeout') { + logMsg = `⏱️ Время хода для ${loserName} истекло! Победа присуждается ${winnerName}!`; + } else if (explicitReason === 'opponent_disconnected') { + logMsg = `🔌 Игрок ${loserName} отключился. Победа присуждается ${winnerName}!`; + if (gameMode === 'ai' && explicitLoserRole === configToUse.PLAYER_ID) { // Игрок отключился в AI игре + winnerName = currentGameState.opponent?.name || 'AI'; // AI "выиграл" по факту, но не формально + logMsg = `🔌 Игрок ${loserName} отключился. Игра завершена.`; + explicitWinnerRole = null; // В AI режиме нет формального победителя при дисконнекте игрока + } + } else { + logMsg = `Игра завершена. Причина: ${explicitReason}. Победитель: ${winnerName}.`; + } + + return { + isOver: true, + winnerRole: explicitWinnerRole, + loserRole: explicitLoserRole, + reason: explicitReason, + logMessage: logMsg + }; + } + + // Если явной причины нет, проверяем по HP + const playerDead = currentGameState.player?.currentHp <= 0; + const opponentDead = currentGameState.opponent?.currentHp <= 0; + + if (!playerDead && !opponentDead) { + return { isOver: false, winnerRole: null, loserRole: null, reason: 'not_over_hp', logMessage: "" }; // Игра еще не окончена по HP + } + + let winnerRole = null; + let loserRole = null; + let reason = 'hp_zero'; + let logMessage = ""; + + if (gameMode === 'ai') { + if (playerDead) { // Игрок проиграл AI + winnerRole = configToUse.OPPONENT_ID; // AI победил + loserRole = configToUse.PLAYER_ID; + logMessage = `😭 ПОРАЖЕНИЕ! ${currentGameState.opponent.name} оказался сильнее! 😭`; + } else { // Игрок победил AI (opponentDead) + winnerRole = configToUse.PLAYER_ID; + loserRole = configToUse.OPPONENT_ID; + logMessage = `🏁 ПОБЕДА! Вы одолели ${currentGameState.opponent.name}! 🏁`; + } + } else { // PvP режим + if (playerDead && opponentDead) { // Ничья - победа присуждается игроку в слоте 'player' (или по другим правилам) + winnerRole = configToUse.PLAYER_ID; + loserRole = configToUse.OPPONENT_ID; + logMessage = `⚔️ Ничья! Оба бойца пали! Победа присуждается ${currentGameState.player.name} по правилам арены!`; + reason = 'draw_player_wins'; + } else if (playerDead) { + winnerRole = configToUse.OPPONENT_ID; + loserRole = configToUse.PLAYER_ID; + logMessage = `🏁 ПОБЕДА! ${currentGameState.opponent.name} одолел(а) ${currentGameState.player.name}! 🏁`; + } else { // opponentDead + winnerRole = configToUse.PLAYER_ID; + loserRole = configToUse.OPPONENT_ID; + logMessage = `🏁 ПОБЕДА! ${currentGameState.player.name} одолел(а) ${currentGameState.opponent.name}! 🏁`; + } + } + + return { isOver: true, winnerRole, loserRole, reason, logMessage }; +} + + +module.exports = { + checkGameOverInternal, + getGameOverResult +}; \ No newline at end of file diff --git a/server/game/logic/index.js b/server/game/logic/index.js new file mode 100644 index 0000000..780102b --- /dev/null +++ b/server/game/logic/index.js @@ -0,0 +1,66 @@ +// /server/game/logic/index.js + +// Импортируем функции из всех специализированных логических модулей + +const { + performAttack, + applyAbilityEffect, + checkAbilityValidity +} = require('./combatLogic'); + +const { + processPlayerAbilityCooldowns, + processDisabledAbilities, + setAbilityCooldown, + processBalardSpecialCooldowns +} = require('./cooldownLogic'); + +const { + processEffects, + updateBlockingStatus, + isCharacterFullySilenced +} = require('./effectsLogic'); + +const { + decideAiAction +} = require('./aiLogic'); + +const { + getRandomTaunt +} = require('./tauntLogic'); // Предполагаем, что getRandomTaunt вынесен в tauntLogic.js + +const { + checkGameOverInternal, // Внутренняя проверка на HP + getGameOverResult // Определяет победителя и причину для checkGameOver в GameInstance +} = require('./gameStateLogic'); // Предполагаем, что логика завершения игры вынесена + + +// Экспортируем все импортированные функции, чтобы они были доступны +// через единый объект 'gameLogic' в GameInstance.js +module.exports = { + // Combat Logic + performAttack, + applyAbilityEffect, + checkAbilityValidity, + + // Cooldown Logic + processPlayerAbilityCooldowns, + processDisabledAbilities, + setAbilityCooldown, + processBalardSpecialCooldowns, + + // Effects Logic + processEffects, + updateBlockingStatus, + isCharacterFullySilenced, + + // AI Logic + decideAiAction, + + // Taunt Logic + getRandomTaunt, + + // Game State Logic (например, для условий завершения) + checkGameOverInternal, + getGameOverResult +}; \ No newline at end of file diff --git a/server/game/logic/tauntLogic.js b/server/game/logic/tauntLogic.js new file mode 100644 index 0000000..1356631 --- /dev/null +++ b/server/game/logic/tauntLogic.js @@ -0,0 +1,151 @@ +// /server/game/logic/tauntLogic.js +const GAME_CONFIG = require('../../core/config'); +// Предполагаем, что gameData.tauntSystem импортируется или доступен. +// Если tauntSystem экспортируется напрямую из data/taunts.js: +// const { tauntSystem } = require('../../data/taunts'); +// Если он часть общего gameData, который собирается в data/index.js: +const gameData = require('../../data'); // Тогда используем gameData.tauntSystem + +/** + * Получает случайную насмешку из системы насмешек. + * @param {string} speakerCharacterKey - Ключ персонажа, который говорит. + * @param {string} trigger - Тип триггера насмешки (например, 'selfCastAbility', 'onBattleState', 'onOpponentAction'). + * @param {string|number|object} [subTriggerOrContext={}] - Может быть ID способности, специфичный ключ состояния ('start', 'dominating') или объект контекста. + * @param {object} configToUse - Конфигурационный объект игры (GAME_CONFIG). + * @param {object} opponentFullData - Полные данные персонажа, к которому обращена насмешка (цель). + * @param {object} currentGameState - Текущее полное состояние игры. + * @returns {string} Текст насмешки или "(Молчание)". + */ +function getRandomTaunt(speakerCharacterKey, trigger, subTriggerOrContext = {}, configToUse, opponentFullData, currentGameState) { + // console.log(`[TauntLogic DEBUG] Called with: speaker=${speakerCharacterKey}, trigger=${trigger}, subTriggerOrContext=`, subTriggerOrContext, `opponentKey=${opponentFullData?.baseStats?.characterKey}`); + + const tauntSystemToUse = gameData.tauntSystem || (gameData.default && gameData.default.tauntSystem); // Совместимость, если gameData имеет default экспорт + if (!tauntSystemToUse) { + console.error("[TauntLogic ERROR] tauntSystem is not available from gameData import!"); + return "(Молчание)"; + } + + const speakerTauntBranch = tauntSystemToUse[speakerCharacterKey]; + if (!speakerTauntBranch) { + // console.log(`[TauntLogic] No taunt branch for speaker: ${speakerCharacterKey}`); + return "(Молчание)"; + } + + const opponentKeyForTaunts = opponentFullData?.baseStats?.characterKey; + if (!opponentKeyForTaunts) { + // console.log(`[TauntLogic] Opponent key for taunts not available for speaker ${speakerCharacterKey}, trigger ${trigger}. OpponentData:`, opponentFullData); + // Особый случай для старта AI игры, где оппонент (AI Балард) может быть известен, даже если opponentFullData не полон + if (trigger === 'onBattleState' && subTriggerOrContext === 'start' && speakerCharacterKey === 'elena' && currentGameState.gameMode === 'ai') { + // Елена против Баларда (AI) в начале боя + const elenaVsBalardStartTaunts = speakerTauntBranch.balard?.onBattleState?.start; + if (Array.isArray(elenaVsBalardStartTaunts) && elenaVsBalardStartTaunts.length > 0) { + return elenaVsBalardStartTaunts[Math.floor(Math.random() * elenaVsBalardStartTaunts.length)] || "(Молчание)"; + } + } + return "(Молчание)"; + } + + const specificTauntBranch = speakerTauntBranch[opponentKeyForTaunts]; + if (!specificTauntBranch || !specificTauntBranch[trigger]) { + // console.log(`[TauntLogic] No specific taunt branch or trigger branch for ${speakerCharacterKey} vs ${opponentKeyForTaunts}, trigger: ${trigger}`); + return "(Молчание)"; + } + + let tauntSet = specificTauntBranch[trigger]; + let context = {}; + let subTriggerKey = null; // Это будет ключ для прямого доступа к массиву насмешек, например, ID способности или 'start' + + if (typeof subTriggerOrContext === 'string' || typeof subTriggerOrContext === 'number') { + subTriggerKey = subTriggerOrContext; + // Если subTriggerOrContext - это ID способности, помещаем его в контекст для onOpponentAction + if (trigger === 'onOpponentAction' || trigger === 'selfCastAbility') { + context.abilityId = subTriggerOrContext; + } + } else if (typeof subTriggerOrContext === 'object' && subTriggerOrContext !== null) { + context = { ...subTriggerOrContext }; + // Если ID способности передан в контексте, используем его как subTriggerKey для прямого доступа + if (context.abilityId && (trigger === 'selfCastAbility' || trigger === 'onOpponentAction')) { + subTriggerKey = context.abilityId; + } else if (trigger === 'onBattleState' && typeof context === 'string') { // на случай если GameInstance передает строку для onBattleState + subTriggerKey = context; + } + } + // Для basicAttack subTriggerKey может быть 'merciful', 'dominating' или null (тогда general) + if (trigger === 'basicAttack' && typeof subTriggerOrContext === 'string') { + subTriggerKey = subTriggerOrContext; + } + + + // console.log(`[TauntLogic DEBUG] Parsed: trigger=${trigger}, subTriggerKey=${subTriggerKey}, context=`, context); + + let potentialTaunts = []; + + if (subTriggerKey !== null && typeof tauntSet === 'object' && !Array.isArray(tauntSet) && tauntSet[subTriggerKey]) { + // Если есть subTriggerKey и tauntSet - это объект (а не массив), то получаем вложенный набор + tauntSet = tauntSet[subTriggerKey]; + } else if (Array.isArray(tauntSet)) { + // Если tauntSet уже массив (например, для onOpponentAttackBlocked), используем его как есть + potentialTaunts = tauntSet; // Присваиваем сразу + } else if (typeof tauntSet === 'object' && tauntSet.general) { // Фоллбэк на general, если subTriggerKey не найден в объекте + tauntSet = tauntSet.general; + } + + + // Специальная обработка для onOpponentAction с исходом (success/fail) + if (trigger === 'onOpponentAction' && typeof tauntSet === 'object' && !Array.isArray(tauntSet) && context.outcome) { + if (tauntSet[context.outcome]) { + potentialTaunts = tauntSet[context.outcome]; + } else { + // console.log(`[TauntLogic] No outcome '${context.outcome}' for onOpponentAction, abilityId ${context.abilityId}`); + potentialTaunts = []; // Явно пустой, чтобы не упасть ниже + } + } else if (Array.isArray(tauntSet)) { + potentialTaunts = tauntSet; + } + + + // Обработка basicAttack (merciful/dominating/general) + if (trigger === 'basicAttack' && specificTauntBranch.basicAttack) { // Убедимся что ветка basicAttack существует + const basicAttackBranch = specificTauntBranch.basicAttack; + if (speakerCharacterKey === 'elena' && opponentKeyForTaunts === 'balard' && currentGameState && currentGameState[GAME_CONFIG.OPPONENT_ID]) { + const opponentState = currentGameState[GAME_CONFIG.OPPONENT_ID]; // Балард всегда оппонент для Елены в этом контексте + if (opponentState && opponentState.maxHp > 0) { + const opponentHpPerc = (opponentState.currentHp / opponentState.maxHp) * 100; + if (opponentHpPerc <= configToUse.PLAYER_MERCY_TAUNT_THRESHOLD_PERCENT && basicAttackBranch.dominating) { + potentialTaunts = basicAttackBranch.dominating; + } else if (basicAttackBranch.merciful) { + potentialTaunts = basicAttackBranch.merciful; + } else if (basicAttackBranch.general) { // Фоллбэк на general если нет merciful + potentialTaunts = basicAttackBranch.general; + } + } else if (basicAttackBranch.general) { // Если нет HP данных, используем general + potentialTaunts = basicAttackBranch.general; + } + } else if (basicAttackBranch.general) { // Общий случай для basicAttack + potentialTaunts = basicAttackBranch.general; + } + // Если subTriggerKey был ('merciful'/'dominating') и он найден в basicAttackBranch, то tauntSet уже установлен выше + // Этот блок if (trigger === 'basicAttack') должен быть более специфичным или объединен с логикой subTriggerKey выше. + // Пока оставим как есть, предполагая, что subTriggerKey для basicAttack обрабатывается отдельно. + // Если subTriggerKey был 'merciful' или 'dominating', и такой ключ есть в basicAttackBranch, то tauntSet уже должен быть им. + if (subTriggerKey && basicAttackBranch[subTriggerKey]) { + potentialTaunts = basicAttackBranch[subTriggerKey]; + } else if (potentialTaunts.length === 0 && basicAttackBranch.general) { // Если не нашли по subTriggerKey, берем general + potentialTaunts = basicAttackBranch.general; + } + } + + + if (!Array.isArray(potentialTaunts) || potentialTaunts.length === 0) { + // console.log(`[TauntLogic] No potential taunts found or empty array for ${speakerCharacterKey} vs ${opponentKeyForTaunts}, trigger: ${trigger}, subTriggerKey: ${subTriggerKey}`); + return "(Молчание)"; + } + + const selectedTaunt = potentialTaunts[Math.floor(Math.random() * potentialTaunts.length)]; + // console.log(`[TauntLogic] Selected for ${speakerCharacterKey} vs ${opponentKeyForTaunts} (Trigger: ${trigger}, SubTriggerKey: ${subTriggerKey}): "${selectedTaunt}"`); + return selectedTaunt || "(Молчание)"; +} + +module.exports = { + getRandomTaunt +}; \ No newline at end of file diff --git a/server/services/SocketService.js b/server/services/SocketService.js new file mode 100644 index 0000000..e69de29 diff --git a/server/views/index.ejs b/server/views/index.ejs new file mode 100644 index 0000000..da859d7 --- /dev/null +++ b/server/views/index.ejs @@ -0,0 +1,237 @@ + + + + + + Битва: Елена vs Балард (Сетевая Версия) + + + + + + + + +
+ +
+
+
Ожидание подключения к серверу...
+
+ +
+

Вход / Регистрация

+
+

Регистрация

+ + + +
+
+
+

Вход

+ + + +
+
+ + +
+ + + + + + + + + + + + + + + + \ No newline at end of file