1232 lines
67 KiB
HTML
1232 lines
67 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ru">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>PvZ — Панель администратора и конфигуратор баланса</title>
|
||
<link rel="icon" type="image/x-icon" href="../favicon.ico">
|
||
<link rel="stylesheet" href="css/style.css">
|
||
</head>
|
||
<body>
|
||
<div class="app-container">
|
||
<!-- Header -->
|
||
<header class="app-header">
|
||
<div class="brand">
|
||
<span class="brand-icon">🌻</span>
|
||
<div>
|
||
<div class="brand-title">PvZ Configurator & Admin Panel</div>
|
||
<div class="brand-sub">Управление балансом, кампанией и сессиями • Plants vs. Zombies</div>
|
||
</div>
|
||
</div>
|
||
<div class="header-actions">
|
||
<a href="../" target="_blank" class="btn btn-secondary btn-sm" title="Открыть игру в новой вкладке">🎮 Играть</a>
|
||
<div id="admin-status-indicator" class="admin-status-badge">
|
||
<span id="admin-status-dot" class="status-dot offline"></span>
|
||
<span id="admin-status-text">Не авторизован</span>
|
||
</div>
|
||
<button id="btn-admin-password-modal-open" class="btn btn-secondary btn-sm" style="display: none;" title="Сменить мастер-пароль администратора">🔑 Сменить пароль</button>
|
||
<button id="btn-login-modal-open" class="btn btn-primary btn-sm">🔑 Войти</button>
|
||
<button id="btn-admin-logout" class="btn btn-secondary btn-sm" style="display: none;">Выйти</button>
|
||
</div>
|
||
</header>
|
||
|
||
<!-- Tab Navigation -->
|
||
<nav class="tabs-navigation">
|
||
<button class="nav-tab-btn active" data-tab="tab-dashboard">📊 Дашборд</button>
|
||
<button id="tab-btn-levels" class="nav-tab-btn" data-tab="tab-levels">🎮 Редактор кампании</button>
|
||
<button id="tab-btn-sessions" class="nav-tab-btn" data-tab="tab-sessions">📱 Сессии игроков</button>
|
||
<button id="tab-btn-logs" class="nav-tab-btn" data-tab="tab-logs">📜 Логи входов</button>
|
||
<button class="nav-tab-btn" data-tab="tab-players">👥 Игроки</button>
|
||
<button class="nav-tab-btn" data-tab="tab-economy">💰 Экономика</button>
|
||
<button class="nav-tab-btn" data-tab="tab-zombies">🧟 Зомби и бой</button>
|
||
<button class="nav-tab-btn" data-tab="tab-plants">🌻 Растения</button>
|
||
<button class="nav-tab-btn" data-tab="tab-zengarden">🌿 Сад Дзен</button>
|
||
<button class="nav-tab-btn" data-tab="tab-presets">⚡ Пресеты и события</button>
|
||
<button class="nav-tab-btn" data-tab="tab-bugs">🐛 Баги <span id="badge-bugs-count" class="badge-count" style="display:none;">0</span></button>
|
||
<button class="nav-tab-btn" data-tab="tab-backups">💾 Бэкапы</button>
|
||
</nav>
|
||
|
||
<!-- TAB 1: DASHBOARD -->
|
||
<section id="tab-dashboard" class="tab-pane active">
|
||
<div class="dashboard-grid">
|
||
<div class="stat-card">
|
||
<div class="stat-icon">👥</div>
|
||
<div class="stat-info">
|
||
<div id="dash-total-users" class="stat-value">—</div>
|
||
<div class="stat-label">Всего игроков</div>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">⚡</div>
|
||
<div class="stat-info">
|
||
<div id="dash-active-24h" class="stat-value">—</div>
|
||
<div class="stat-label">Активных за 24ч</div>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">📱</div>
|
||
<div class="stat-info">
|
||
<div id="dash-active-sessions" class="stat-value" style="color: var(--accent-cyan);">—</div>
|
||
<div class="stat-label">Активных сессий</div>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">📜</div>
|
||
<div class="stat-info">
|
||
<div id="dash-total-logs" class="stat-value" style="color: var(--accent-purple);">—</div>
|
||
<div class="stat-label">Событий входов</div>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">🎮</div>
|
||
<div class="stat-info">
|
||
<div id="dash-campaign-levels" class="stat-value" style="color: var(--accent-gold);">25</div>
|
||
<div class="stat-label">Этапов кампании</div>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">💰</div>
|
||
<div class="stat-info">
|
||
<div id="dash-total-coins" class="stat-value">—</div>
|
||
<div class="stat-label">Всего монет в обороте</div>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">🚫</div>
|
||
<div class="stat-info">
|
||
<div id="dash-banned-users" class="stat-value">—</div>
|
||
<div class="stat-label">Заблокировано</div>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">🐛</div>
|
||
<div class="stat-info">
|
||
<div id="dash-total-bugs" class="stat-value">—</div>
|
||
<div class="stat-label">Баг-репортов</div>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">🧟</div>
|
||
<div class="stat-info">
|
||
<div id="dash-total-zombies" class="stat-value" style="color: var(--accent-red);">—</div>
|
||
<div class="stat-label">Зомби уничтожено (всего)</div>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">🌱</div>
|
||
<div class="stat-info">
|
||
<div id="dash-total-plants" class="stat-value" style="color: var(--accent-green);">—</div>
|
||
<div class="stat-label">Посажено растений</div>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">☀️</div>
|
||
<div class="stat-info">
|
||
<div id="dash-total-sun" class="stat-value" style="color: var(--accent-gold);">—</div>
|
||
<div class="stat-label">Солнца выращено</div>
|
||
</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="stat-icon">⚖️</div>
|
||
<div class="stat-info">
|
||
<div id="dash-active-preset" class="stat-value" style="font-size: 18px; color: #a5d6a7;">—</div>
|
||
<div class="stat-label">Активный пресет</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Quick Live Events -->
|
||
<div class="section-panel">
|
||
<div class="section-header">
|
||
<div>
|
||
<div class="section-title">⚡ Оперативные Live-События (Серверный переключатель)</div>
|
||
<div class="section-desc">Включение глобальных событий для всех подключенных игроков в реальном времени.</div>
|
||
</div>
|
||
<button id="btn-save-events-quick" class="btn btn-primary btn-sm">💾 Применить события</button>
|
||
</div>
|
||
<div class="events-grid">
|
||
<div class="event-card">
|
||
<div class="event-info">
|
||
<h4>🌟 Double Gold Weekend</h4>
|
||
<p>Удваивает выпадение монет из зомби и в Саду Дзен.</p>
|
||
</div>
|
||
<label class="switch">
|
||
<input type="checkbox" id="event-doubleGold">
|
||
<span class="slider-round"></span>
|
||
</label>
|
||
</div>
|
||
<div class="event-card">
|
||
<div class="event-info">
|
||
<h4>⚡ Fast Cooldowns</h4>
|
||
<p>Ускоренная перезарядка семян для динамичного боя.</p>
|
||
</div>
|
||
<label class="switch">
|
||
<input type="checkbox" id="event-fastCooldowns">
|
||
<span class="slider-round"></span>
|
||
</label>
|
||
</div>
|
||
<div class="event-card">
|
||
<div class="event-info">
|
||
<h4>☀️ Super Sun Drop</h4>
|
||
<p>Солнце с неба и подсолнухов падает в 2 раза чаще.</p>
|
||
</div>
|
||
<label class="switch">
|
||
<input type="checkbox" id="event-infiniteSun">
|
||
<span class="slider-round"></span>
|
||
</label>
|
||
</div>
|
||
<div class="event-card">
|
||
<div class="event-info">
|
||
<h4>🧟 Turbo Zombie Wave</h4>
|
||
<p>Зомби бегут и атакуют с повышенной скоростью (+30%).</p>
|
||
</div>
|
||
<label class="switch">
|
||
<input type="checkbox" id="event-turboZombies">
|
||
<span class="slider-round"></span>
|
||
</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- TAB: CAMPAIGN LEVEL EDITOR -->
|
||
<section id="tab-levels" class="tab-pane">
|
||
<div class="section-panel">
|
||
<div class="section-header">
|
||
<div>
|
||
<div class="section-title">🎮 Визуальный редактор этапов кампании</div>
|
||
<div class="section-desc">Настройка 25 уровней в 5 мирах: состав волн, биомы, награды, модификаторы и диалоги Дэйва.</div>
|
||
</div>
|
||
<div style="display: flex; gap: 8px; flex-wrap: wrap;">
|
||
<button id="btn-reload-levels" class="btn btn-secondary btn-sm" title="Загрузить все уровни с сервера">📋 Загрузить все уровни</button>
|
||
<button id="btn-reset-level" class="btn btn-danger btn-sm" title="Сбросить текущий уровень к заводским настройкам">🔄 Сбросить к стандарту</button>
|
||
<button id="btn-save-level" class="btn btn-primary btn-sm" title="Сохранить уровень в базу данных">💾 Сохранить уровень</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Level Selector Toolbar -->
|
||
<div class="level-selector-bar">
|
||
<div class="level-selector-left">
|
||
<label class="form-label" style="margin-bottom:0; font-weight: bold;">Выбор уровня:</label>
|
||
<select id="level-select-dropdown" class="form-select" style="min-width: 240px;">
|
||
<!-- Populated via JS -->
|
||
</select>
|
||
<button id="btn-create-custom-level" class="btn btn-secondary btn-sm">➕ Создать этап</button>
|
||
</div>
|
||
<div class="level-badge-info">
|
||
Текущий этап: <span id="current-level-badge-code" class="code-badge">1-1</span>
|
||
<span id="current-level-badge-world" class="world-tag">☀️ Солнечный День</span>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Level Quick Grid Selector (1-1 .. 5-5) -->
|
||
<div class="levels-grid-nav" id="levels-grid-selector">
|
||
<!-- 25 level pills populated dynamically via JS -->
|
||
</div>
|
||
|
||
<!-- Level Editor Form Layout -->
|
||
<div class="level-editor-layout">
|
||
<!-- Column 1: Basic Info & Modifiers -->
|
||
<div class="level-editor-col">
|
||
<!-- 1. Basic Level Info -->
|
||
<div class="sub-panel">
|
||
<h3 class="sub-panel-title">📋 Основная информация об этапе</h3>
|
||
|
||
<div class="form-row-2">
|
||
<div class="form-group">
|
||
<label class="form-label">Код уровня (Code):</label>
|
||
<input type="text" id="level-code" class="form-input" placeholder="например, 1-1" value="1-1">
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Порядковый номер (#):</label>
|
||
<input type="number" id="level-number" class="form-input" min="1" max="100" value="1">
|
||
</div>
|
||
</div>
|
||
|
||
<div class="form-group">
|
||
<label class="form-label">Название этапа (Title):</label>
|
||
<input type="text" id="level-title" class="form-input" placeholder="Название..." value="Первые шаги">
|
||
</div>
|
||
|
||
<div class="form-group">
|
||
<label class="form-label">Описание и подсказка (Description):</label>
|
||
<textarea id="level-desc" class="form-textarea" rows="2" placeholder="Краткое описание уровня...">Знакомство с садом и простыми зомби</textarea>
|
||
</div>
|
||
|
||
<div class="form-row-2">
|
||
<div class="form-group">
|
||
<label class="form-label">Мир (World):</label>
|
||
<select id="level-world" class="form-select">
|
||
<option value="1">1: ☀️ Солнечный День (Day)</option>
|
||
<option value="2">2: 🌙 Ночной Двор (Night)</option>
|
||
<option value="3">3: 🏊 Бассейн (Pool)</option>
|
||
<option value="4">4: 🌫️ Ночной Туман (Fog)</option>
|
||
<option value="5">5: 🏠 Крыша Дома (Roof)</option>
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Биом / Окружение (Biome):</label>
|
||
<select id="level-biome" class="form-select">
|
||
<option value="day">☀️ День (day)</option>
|
||
<option value="night">🌙 Ночь (night)</option>
|
||
<option value="pool">🏊 Бассейн (pool)</option>
|
||
<option value="fog">🌫️ Туман (fog)</option>
|
||
<option value="roof">🏠 Крыша (roof)</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="form-row-3">
|
||
<div class="form-group">
|
||
<label class="form-label">Награда (Монеты 💰):</label>
|
||
<input type="number" id="level-reward-coins" class="form-input" value="100" min="0" step="10">
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Награда (Кристаллы 💎):</label>
|
||
<input type="number" id="level-reward-crystals" class="form-input" value="0" min="0" step="1">
|
||
</div>
|
||
<div class="form-group" style="display:flex; flex-direction:column; justify-content:center;">
|
||
<label class="form-label">Босс-уровень:</label>
|
||
<label class="checkbox-label" style="margin-top:6px;">
|
||
<input type="checkbox" id="level-is-boss">
|
||
<span style="color: var(--accent-red); font-weight:bold;">👑 Финальный Босс</span>
|
||
</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 2. Level Modifiers -->
|
||
<div class="sub-panel" style="margin-top: 16px;">
|
||
<h3 class="sub-panel-title">⚡ Модификаторы и правила этапа</h3>
|
||
|
||
<div class="control-item" style="margin-bottom: 12px;">
|
||
<div class="control-header">
|
||
<span class="control-label">🧟 Здоровье зомби (HP Multiplier)</span>
|
||
<span id="val-mod-zombie-hp" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="mod-zombie-hp" class="range-slider" min="0.5" max="3.0" step="0.1" value="1.0">
|
||
</div>
|
||
|
||
<div class="control-item" style="margin-bottom: 12px;">
|
||
<div class="control-header">
|
||
<span class="control-label">🏃 Скорость зомби (Speed Multiplier)</span>
|
||
<span id="val-mod-zombie-speed" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="mod-zombie-speed" class="range-slider" min="0.5" max="2.5" step="0.1" value="1.0">
|
||
</div>
|
||
|
||
<div class="form-row-2" style="margin-bottom: 12px;">
|
||
<div class="form-group">
|
||
<label class="form-label">Кастомное стартовое солнце:</label>
|
||
<input type="number" id="mod-starting-sun" class="form-input" placeholder="По умолчанию (50)" value="50" min="0" step="25">
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Специальное Live-событие:</label>
|
||
<select id="mod-special-event" class="form-select">
|
||
<option value="none">Стандартный бой (нет)</option>
|
||
<option value="doubleGold">🌟 Двойное золото (Double Gold)</option>
|
||
<option value="fastCooldowns">⚡ Турбо перезарядка (Fast CD)</option>
|
||
<option value="infiniteSun">☀️ Обильное солнце (Sun Drop x2)</option>
|
||
<option value="turboZombies">🧟 Яростные зомби (Turbo)</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="form-row-2">
|
||
<label class="checkbox-label">
|
||
<input type="checkbox" id="mod-conveyor-deck">
|
||
<span>📦 Режим конвейерной ленты</span>
|
||
</label>
|
||
<label class="checkbox-label">
|
||
<input type="checkbox" id="mod-fast-recharge">
|
||
<span>⚡ Ускоренная перезарядка семян</span>
|
||
</label>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 3. Dave Dialogue Editor -->
|
||
<div class="sub-panel" style="margin-top: 16px;">
|
||
<h3 class="sub-panel-title">🧔 Диалог Безумного Дэйва перед боем</h3>
|
||
|
||
<div class="form-row-2">
|
||
<div class="form-group">
|
||
<label class="form-label">Иконка спикера:</label>
|
||
<select id="dialogue-speaker" class="form-select">
|
||
<option value="🧔">🧔 Безумный Дэйв</option>
|
||
<option value="🌻">🌻 Подсолнух</option>
|
||
<option value="🧟">🧟 Доктор Зомбосс</option>
|
||
<option value="🧠">🧠 Мозги!</option>
|
||
<option value="☀️">☀️ Солнце</option>
|
||
<option value="🏊">🏊 Водный спасатель</option>
|
||
<option value="🌫️">🌫️ Мгла и туман</option>
|
||
<option value="🏠">🏠 Хозяин дома</option>
|
||
<option value="🤖">🤖 Zombot 1000</option>
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Текст кнопки подтверждения:</label>
|
||
<input type="text" id="dialogue-btn-text" class="form-input" value="ДАЛЕЕ / В БОЙ ⚔️">
|
||
</div>
|
||
</div>
|
||
|
||
<div class="form-group">
|
||
<label class="form-label">Заголовок сообщения:</label>
|
||
<input type="text" id="dialogue-title" class="form-input" placeholder="Заголовок диалога...">
|
||
</div>
|
||
|
||
<div class="form-group">
|
||
<label class="form-label">Текст реплики:</label>
|
||
<textarea id="dialogue-text" class="form-textarea" rows="3" placeholder="Реплика Дэйва перед началом уровня (оставьте пустым, если диалог не требуется)..."></textarea>
|
||
</div>
|
||
|
||
<!-- Live Preview Box -->
|
||
<div class="dialogue-preview-box" id="dialogue-preview-box">
|
||
<div class="dialogue-preview-speaker" id="dialogue-preview-speaker">🧔</div>
|
||
<div class="dialogue-preview-content">
|
||
<div class="dialogue-preview-title" id="dialogue-preview-title">Безумный Дэйв предупреждает:</div>
|
||
<div class="dialogue-preview-text" id="dialogue-preview-text">Эй, сосед! Будь начеку!</div>
|
||
<div class="dialogue-preview-btn" id="dialogue-preview-btn">ДАЛЕЕ / В БОЙ ⚔️</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Column 2: Visual Wave Configurator -->
|
||
<div class="level-editor-col">
|
||
<div class="sub-panel" style="min-height: 100%;">
|
||
<div class="sub-panel-header">
|
||
<div>
|
||
<h3 class="sub-panel-title">🌊 Визуальный конфигуратор волн</h3>
|
||
<div class="section-desc">Настройка состава зомби, плотности и таймингов каждой волны.</div>
|
||
</div>
|
||
<button id="btn-add-wave" class="btn btn-primary btn-sm">➕ Добавить волну</button>
|
||
</div>
|
||
|
||
<!-- Waves List Container -->
|
||
<div id="level-waves-container" class="waves-list-container">
|
||
<!-- Dynamically populated wave cards -->
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- TAB: ACTIVE SESSIONS -->
|
||
<section id="tab-sessions" class="tab-pane">
|
||
<div class="section-panel">
|
||
<div class="section-header">
|
||
<div>
|
||
<div class="section-title">📱 Активные сессии игроков в реальном времени</div>
|
||
<div class="section-desc">Мониторинг авторизованных токенов, IP-адресов, устройств и завершение подозрительных сессий.</div>
|
||
</div>
|
||
<div style="display: flex; gap: 8px; align-items: center;">
|
||
<span class="badge badge-info">Активно: <b id="sessions-total-count">0</b></span>
|
||
<button id="btn-refresh-sessions" class="btn btn-secondary btn-sm">🔄 Обновить</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Filter Bar -->
|
||
<div style="display: flex; gap: 12px; margin-bottom: 16px; flex-wrap: wrap;">
|
||
<input type="text" id="sessions-search-input" class="form-input" style="max-width: 320px;" placeholder="🔍 Поиск по нику игрока или IP...">
|
||
</div>
|
||
|
||
<div class="table-responsive">
|
||
<table class="admin-table">
|
||
<thead>
|
||
<tr>
|
||
<th>Игрок</th>
|
||
<th>IP-адрес</th>
|
||
<th>Устройство и браузер</th>
|
||
<th>Создана</th>
|
||
<th>Последняя активность</th>
|
||
<th>Токен</th>
|
||
<th>Действия</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody id="sessions-table-body">
|
||
<tr><td colspan="7" style="text-align: center; color: var(--text-dim);">Загрузка активных сессий...</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- TAB: LOGIN AUDIT LOGS -->
|
||
<section id="tab-logs" class="tab-pane">
|
||
<div class="section-panel">
|
||
<div class="section-header">
|
||
<div>
|
||
<div class="section-title">📜 Журнал аудита авторизаций и входов</div>
|
||
<div class="section-desc">Полная история попыток входа, регистраций, блокировок и сработок защиты от перебора.</div>
|
||
</div>
|
||
<div style="display: flex; gap: 8px; align-items: center;">
|
||
<span class="badge badge-purple">Событий: <b id="logs-total-count">0</b></span>
|
||
<button id="btn-refresh-logs" class="btn btn-secondary btn-sm">🔄 Обновить</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Filter Bar -->
|
||
<div style="display: flex; gap: 12px; margin-bottom: 16px; flex-wrap: wrap;">
|
||
<input type="text" id="logs-filter-username" class="form-input" style="max-width: 240px;" placeholder="🔍 Поиск по нику...">
|
||
<input type="text" id="logs-filter-ip" class="form-input" style="max-width: 200px;" placeholder="🔍 Поиск по IP...">
|
||
<select id="logs-filter-status" class="form-select" style="max-width: 200px;">
|
||
<option value="all">Все статусы</option>
|
||
<option value="success">✅ Успешный вход</option>
|
||
<option value="registered">🎉 Новая регистрация</option>
|
||
<option value="wrong_password">❌ Неверный пароль</option>
|
||
<option value="banned_login_attempt">🚫 Заблокирован</option>
|
||
<option value="rate_limited">⚠️ Превышен лимит</option>
|
||
<option value="user_not_found">❓ Не найден</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="table-responsive">
|
||
<table class="admin-table">
|
||
<thead>
|
||
<tr>
|
||
<th>Время события</th>
|
||
<th>Пользователь</th>
|
||
<th>IP-адрес</th>
|
||
<th>Устройство и браузер</th>
|
||
<th>Статус аутентификации</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody id="logs-table-body">
|
||
<tr><td colspan="5" style="text-align: center; color: var(--text-dim);">Загрузка журнала аудита...</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- TAB 2: PLAYERS -->
|
||
<section id="tab-players" class="tab-pane">
|
||
<div class="section-panel">
|
||
<div class="section-header">
|
||
<div>
|
||
<div class="section-title">👥 База учетных записей и прогресса игроков</div>
|
||
<div class="section-desc">Поиск, просмотр инвентаря, правка баланса, бан и сброс паролей.</div>
|
||
</div>
|
||
<div style="display: flex; gap: 8px;">
|
||
<button id="btn-create-player-open" class="btn btn-primary btn-sm">➕ Создать игрока</button>
|
||
<button id="btn-refresh-players" class="btn btn-secondary btn-sm">🔄 Обновить</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Filter Bar -->
|
||
<div style="display: flex; gap: 12px; margin-bottom: 16px; flex-wrap: wrap;">
|
||
<input type="text" id="player-search-input" class="form-input" style="max-width: 280px;" placeholder="🔍 Поиск по нику или ID...">
|
||
<select id="player-filter-status" class="form-select" style="max-width: 180px;">
|
||
<option value="all">Все игроки</option>
|
||
<option value="active">Активные</option>
|
||
<option value="banned">Заблокированные</option>
|
||
<option value="admin">Администраторы</option>
|
||
</select>
|
||
<select id="player-sort-select" class="form-select" style="max-width: 180px;">
|
||
<option value="id_asc">ID (возрастание)</option>
|
||
<option value="id_desc">ID (убывание)</option>
|
||
<option value="coins_desc">Монеты (макс.)</option>
|
||
<option value="level_desc">Уровень (макс.)</option>
|
||
<option value="login_desc">Последний вход</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="table-responsive">
|
||
<table class="admin-table">
|
||
<thead>
|
||
<tr>
|
||
<th>ID</th>
|
||
<th>Никнейм</th>
|
||
<th>Статус</th>
|
||
<th>Уровень</th>
|
||
<th>Монеты</th>
|
||
<th>Рекорд</th>
|
||
<th>Регистрация</th>
|
||
<th>Последний вход</th>
|
||
<th>Действия</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody id="players-table-body">
|
||
<tr><td colspan="9" style="text-align: center; color: var(--text-dim);">Загрузка игроков...</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- TAB 3: ECONOMY -->
|
||
<section id="tab-economy" class="tab-pane">
|
||
<div class="section-panel">
|
||
<div class="section-header">
|
||
<div>
|
||
<div class="section-title">💰 Баланс экономики, цен и солнца</div>
|
||
<div class="section-desc">Управление генерацией ресурсов, стоимостью карт и дропом монет.</div>
|
||
</div>
|
||
<button id="btn-save-economy" class="btn btn-primary btn-sm">💾 Сохранить экономику</button>
|
||
</div>
|
||
|
||
<div class="controls-grid">
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">☀️ Множитель солнца</span>
|
||
<span id="val-econ-sunMultiplier" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="econ-sunMultiplier" class="range-slider" min="0.2" max="5.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Увеличивает количество солнца, даваемое подсолнухами и падающее с неба.</p>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">🌱 Стартовое солнце</span>
|
||
<span id="val-econ-startingSun" class="control-badge">50</span>
|
||
</div>
|
||
<input type="range" id="econ-startingSun" class="range-slider" min="0" max="1000" step="25" value="50">
|
||
<p class="section-desc">Количество солнца в начале каждого уровня.</p>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">🪙 Дроп монет из зомби</span>
|
||
<span id="val-econ-coinDropRate" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="econ-coinDropRate" class="range-slider" min="0.1" max="5.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Вероятность и частота выпадения серебряных и золотых монет.</p>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">☁️ Частота солнца с неба</span>
|
||
<span id="val-econ-sunDropRate" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="econ-sunDropRate" class="range-slider" min="0.1" max="5.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Интервал падения небесного солнца на дневных уровнях.</p>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">🛒 Множитель цен в магазине</span>
|
||
<span id="val-econ-plantCostMultiplier" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="econ-plantCostMultiplier" class="range-slider" min="0.1" max="5.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Стоимость покупки закрытых растений в магазине Дэйва.</p>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">🔧 Стоимость крафта в мастерской</span>
|
||
<span id="val-econ-upgradeCostMultiplier" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="econ-upgradeCostMultiplier" class="range-slider" min="0.1" max="5.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Расход материалов на прокачку 2 и 3 уровней растений.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- TAB 4: ZOMBIES & COMBAT -->
|
||
<section id="tab-zombies" class="tab-pane">
|
||
<div class="section-panel">
|
||
<div class="section-header">
|
||
<div>
|
||
<div class="section-title">🧟 Баланс зомби и боевой сложности</div>
|
||
<div class="section-desc">Глобальные множители характеристик орды и плотности волн.</div>
|
||
</div>
|
||
<button id="btn-save-zombies" class="btn btn-primary btn-sm">💾 Сохранить параметры зомби</button>
|
||
</div>
|
||
|
||
<div class="controls-grid">
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">❤️ Здоровье зомби (HP)</span>
|
||
<span id="val-zom-hpMultiplier" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="zom-hpMultiplier" class="range-slider" min="0.2" max="5.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Запас прочности всех типов зомби и боссов.</p>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">🏃 Скорость передвижения</span>
|
||
<span id="val-zom-speedMultiplier" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="zom-speedMultiplier" class="range-slider" min="0.2" max="3.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Скорость ходьбы и бега зомби по газону.</p>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">💥 Урон от укусов зомби</span>
|
||
<span id="val-zom-damageMultiplier" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="zom-damageMultiplier" class="range-slider" min="0.2" max="5.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Урон, наносимый растениям при поедании.</p>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">🌊 Плотность спавна волн</span>
|
||
<span id="val-zom-waveDensityMultiplier" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="zom-waveDensityMultiplier" class="range-slider" min="0.5" max="3.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Количество зомби, появляющихся в каждой волне.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- TAB 5: PLANTS -->
|
||
<section id="tab-plants" class="tab-pane">
|
||
<div class="section-panel">
|
||
<div class="section-header">
|
||
<div>
|
||
<div class="section-title">🌻 Баланс растений и стрельбы</div>
|
||
<div class="section-desc">Урон снарядов, прочность стеноорехов и скорость перезарядки семян.</div>
|
||
</div>
|
||
<button id="btn-save-plants" class="btn btn-primary btn-sm">💾 Сохранить растения</button>
|
||
</div>
|
||
|
||
<div class="controls-grid">
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">🎯 Урон снарядов растений</span>
|
||
<span id="val-plant-damageMultiplier" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="plant-damageMultiplier" class="range-slider" min="0.2" max="5.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Урон всех типов горошин, спор и снарядов катапульт.</p>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">🛡️ Прочность растений (HP)</span>
|
||
<span id="val-plant-hpMultiplier" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="plant-hpMultiplier" class="range-slider" min="0.2" max="5.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Здоровье Стеноорехов, Высоких орехов и обычных трав.</p>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">⏳ Скорость перезарядки семян (CD)</span>
|
||
<span id="val-plant-cooldownMultiplier" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="plant-cooldownMultiplier" class="range-slider" min="0.1" max="3.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Меньше — быстрее готовность пакетов семян в слотах.</p>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">☀️ Частота производства подсолнухов</span>
|
||
<span id="val-plant-sunProduceIntervalMultiplier" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="plant-sunProduceIntervalMultiplier" class="range-slider" min="0.2" max="3.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Меньше — чаще Подсолнухи и Солнцегрибы генерируют солнце.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- TAB 6: ZEN GARDEN -->
|
||
<section id="tab-zengarden" class="tab-pane">
|
||
<div class="section-panel">
|
||
<div class="section-header">
|
||
<div>
|
||
<div class="section-title">🌿 Баланс Сада Дзен и пассивного дохода</div>
|
||
<div class="section-desc">Шанс выпадения саженцев, скорость роста и сбор монет улиткой Стинки.</div>
|
||
</div>
|
||
<button id="btn-save-zengarden" class="btn btn-primary btn-sm">💾 Сохранить Сад Дзен</button>
|
||
</div>
|
||
|
||
<div class="controls-grid">
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">🎁 Шанс выпадения саженцев из зомби</span>
|
||
<span id="val-zen-dropRateMultiplier" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="zen-dropRateMultiplier" class="range-slider" min="0.1" max="5.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Частота получения новых горшечных ростков в боях.</p>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">🌱 Скорость созревания растений</span>
|
||
<span id="val-zen-growthRateMultiplier" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="zen-growthRateMultiplier" class="range-slider" min="0.2" max="5.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Ускорение перехода саженца от ростка до взрослого цветка.</p>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">🧪 Эффективность удобрений</span>
|
||
<span id="val-zen-fertilizerMultiplier" class="control-badge">1.0x</span>
|
||
</div>
|
||
<input type="range" id="zen-fertilizerMultiplier" class="range-slider" min="0.5" max="4.0" step="0.1" value="1.0">
|
||
<p class="section-desc">Бонус к производству золотых монет при уходе.</p>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<div class="control-header">
|
||
<span class="control-label">💧 Интервал полива (минуты)</span>
|
||
<span id="val-zen-waterIntervalMinutes" class="control-badge">30 мин</span>
|
||
</div>
|
||
<input type="range" id="zen-waterIntervalMinutes" class="range-slider" min="1" max="120" step="1" value="30">
|
||
<p class="section-desc">Как часто растениям в саду требуется вода.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- TAB 7: PRESETS & EVENTS -->
|
||
<section id="tab-presets" class="tab-pane">
|
||
<div class="section-panel">
|
||
<div class="section-header">
|
||
<div>
|
||
<div class="section-title">⚡ Готовые пресеты сложности и Live-События</div>
|
||
<div class="section-desc">Мгновенное переключение баланса всей игры на сервере одним нажатием.</div>
|
||
</div>
|
||
</div>
|
||
|
||
<h3 style="font-size: 16px; margin-bottom: 12px; color: var(--accent-cyan);">📚 Каталог пресетов баланса</h3>
|
||
<div class="presets-grid">
|
||
<div class="preset-card">
|
||
<div class="preset-title">🌻 Classic 2009</div>
|
||
<div class="preset-desc">Классический баланс оригинальной Plants vs. Zombies 2009 года. Полная гармония и аутентичность.</div>
|
||
<button class="btn btn-secondary btn-sm btn-apply-preset" data-preset="Classic 2009">Применить Classic</button>
|
||
</div>
|
||
|
||
<div class="preset-card">
|
||
<div class="preset-title">💀 Hardcore</div>
|
||
<div class="preset-desc">Для ветеранов: зомби толще и быстрее (+60% HP, +30% Speed), меньше солнца и золота (-20%), жесткие волны.</div>
|
||
<button class="btn btn-secondary btn-sm btn-apply-preset" data-preset="Hardcore">Применить Hardcore</button>
|
||
</div>
|
||
|
||
<div class="preset-card">
|
||
<div class="preset-title">☕ Casual Chill</div>
|
||
<div class="preset-desc">Расслабленный режим: стартовое солнце 150, быстрый откат семян, ослабленные зомби (-40% HP), щедрые монеты.</div>
|
||
<button class="btn btn-secondary btn-sm btn-apply-preset" data-preset="Casual Chill">Применить Casual</button>
|
||
</div>
|
||
|
||
<div class="preset-card">
|
||
<div class="preset-title">💥 Mayhem Mode</div>
|
||
<div class="preset-desc">Полный хаос: тройной спавн зомби, тройной урон растений, фонтаны солнца и золота!</div>
|
||
<button class="btn btn-secondary btn-sm btn-apply-preset" data-preset="Mayhem Mode">Применить Mayhem</button>
|
||
</div>
|
||
|
||
<div class="preset-card">
|
||
<div class="preset-title">⚡ Speedrun 2x</div>
|
||
<div class="preset-desc">Скоростное прохождение: зомби и растения работают на скорости 1.5x, мгновенный откат семян.</div>
|
||
<button class="btn btn-secondary btn-sm btn-apply-preset" data-preset="Speedrun 2x">Применить Speedrun</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- TAB 8: BUG REPORTS -->
|
||
<section id="tab-bugs" class="tab-pane">
|
||
<div class="section-panel">
|
||
<div class="section-header">
|
||
<div>
|
||
<div class="section-title">🐛 Модерация баг-репортов сообщества</div>
|
||
<div class="section-desc">Просмотр отзывов игроков, смена статусов, официальные ответы и удаление спама.</div>
|
||
</div>
|
||
<button id="btn-refresh-bugs" class="btn btn-secondary btn-sm">🔄 Обновить баги</button>
|
||
</div>
|
||
|
||
<!-- Filter Bar -->
|
||
<div style="display: flex; gap: 12px; margin-bottom: 16px; flex-wrap: wrap;">
|
||
<select id="bug-filter-status" class="form-select" style="max-width: 200px;">
|
||
<option value="all">Все статусы</option>
|
||
<option value="новый">🔴 Новые</option>
|
||
<option value="в работе">🟡 В работе</option>
|
||
<option value="исправлено">✅ Исправленные</option>
|
||
<option value="отклонено">⚪ Отклоненные</option>
|
||
</select>
|
||
<select id="bug-filter-category" class="form-select" style="max-width: 200px;">
|
||
<option value="all">Все категории</option>
|
||
<option value="bug">Баги</option>
|
||
<option value="feature">Идеи / Фичи</option>
|
||
<option value="visual">Графика и UI</option>
|
||
<option value="balance">Баланс</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div class="table-responsive">
|
||
<table class="admin-table">
|
||
<thead>
|
||
<tr>
|
||
<th>ID</th>
|
||
<th>Дата</th>
|
||
<th>Автор</th>
|
||
<th>Категория</th>
|
||
<th>Статус</th>
|
||
<th>Описание проблемы</th>
|
||
<th>Ответ / Решение</th>
|
||
<th>Действия</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody id="bugs-table-body">
|
||
<tr><td colspan="8" style="text-align: center; color: var(--text-dim);">Загрузка баг-репортов...</td></tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- TAB 9: BACKUPS -->
|
||
<section id="tab-backups" class="tab-pane">
|
||
<div class="section-panel">
|
||
<div class="section-header">
|
||
<div>
|
||
<div class="section-title">💾 Резервные копии и восстановление базы данных</div>
|
||
<div class="section-desc">Полный экспорт всех игроков, профилей, рекордов, конфигураций и баг-репортов в формате JSON.</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="controls-grid" style="grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));">
|
||
<div class="control-item">
|
||
<h4 style="font-size: 16px; color: var(--accent-green); margin-bottom: 8px;">📤 Экспорт резервной копии</h4>
|
||
<p class="section-desc" style="margin-bottom: 16px;">Выгрузка полного слепка SQLite базы данных в файл pvz_backup.json для сохранения на локальный диск.</p>
|
||
<button id="btn-export-backup" class="btn btn-primary">💾 Скачать полный бэкап</button>
|
||
</div>
|
||
|
||
<div class="control-item">
|
||
<h4 style="font-size: 16px; color: var(--accent-gold); margin-bottom: 8px;">📥 Восстановление из файла</h4>
|
||
<p class="section-desc" style="margin-bottom: 16px;">Восстановление базы данных из ранее сохраненного файла бэкапа JSON.</p>
|
||
<input type="file" id="backup-file-input" accept=".json" style="display: none;">
|
||
<button id="btn-trigger-import" class="btn btn-warning">📂 Выбрать файл и восстановить</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
|
||
<!-- MODAL: LOGIN -->
|
||
<div id="modal-login" class="modal-overlay">
|
||
<div class="modal-box">
|
||
<div class="modal-header">
|
||
<div class="modal-title">🔑 Авторизация администратора</div>
|
||
<button class="modal-close-btn" data-close="modal-login">✕</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<p class="section-desc" style="margin-bottom: 16px;">Введите мастер-пароль администратора для получения полного доступа к редактированию баланса, управлению игроками и бэкапам.</p>
|
||
<div class="form-group">
|
||
<label class="form-label">Пароль администратора:</label>
|
||
<input type="password" id="admin-password-input" class="form-input" placeholder="Пароль администратора...">
|
||
</div>
|
||
<div id="login-error-msg" class="form-error" style="display: none; color: var(--accent-red); font-size: 13px; margin-top: 8px;"></div>
|
||
</div>
|
||
<div class="modal-footer">
|
||
<button class="btn btn-secondary" data-close="modal-login">Отмена</button>
|
||
<button id="btn-submit-login" class="btn btn-primary">Войти в панель</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- MODAL: CHANGE ADMIN PASSWORD -->
|
||
<div id="modal-admin-password" class="modal-overlay">
|
||
<div class="modal-box">
|
||
<div class="modal-header">
|
||
<div class="modal-title">🔑 Смена мастер-пароля администратора</div>
|
||
<button class="modal-close-btn" data-close="modal-admin-password">✕</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div class="form-group">
|
||
<label class="form-label">Текущий пароль:</label>
|
||
<input type="password" id="admin-current-password" class="form-input" placeholder="Введите текущий пароль...">
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Новый пароль (минимум 6 символов):</label>
|
||
<input type="password" id="admin-new-password" class="form-input" placeholder="Введите новый пароль...">
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Повторите новый пароль:</label>
|
||
<input type="password" id="admin-confirm-password" class="form-input" placeholder="Повторите новый пароль...">
|
||
</div>
|
||
<div id="admin-password-error" class="form-error" style="display: none; color: var(--accent-red); font-size: 13px; margin-top: 8px;"></div>
|
||
</div>
|
||
<div class="modal-footer">
|
||
<button class="btn btn-secondary" data-close="modal-admin-password">Отмена</button>
|
||
<button id="btn-submit-change-admin-password" class="btn btn-primary">💾 Сохранить новый пароль</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- MODAL: EDIT PLAYER -->
|
||
<div id="modal-edit-player" class="modal-overlay">
|
||
<div class="modal-box" style="max-width: 600px;">
|
||
<div class="modal-header">
|
||
<div class="modal-title">✏️ Редактирование игрока: <span id="edit-player-title-name" style="color: var(--accent-cyan);"></span></div>
|
||
<button class="modal-close-btn" data-close="modal-edit-player">✕</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<input type="hidden" id="edit-player-id">
|
||
<div class="form-row-2">
|
||
<div class="form-group">
|
||
<label class="form-label">Баланс монет (Coins):</label>
|
||
<input type="number" id="edit-player-coins" class="form-input" min="0" step="10">
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Текущий уровень (Level):</label>
|
||
<input type="number" id="edit-player-level" class="form-input" min="1" max="25">
|
||
</div>
|
||
</div>
|
||
<div class="form-row-2">
|
||
<div class="form-group">
|
||
<label class="form-label">Макс. открытый уровень:</label>
|
||
<input type="number" id="edit-player-maxlevel" class="form-input" min="1" max="25">
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Рекорд очков (High Score):</label>
|
||
<input type="number" id="edit-player-highscore" class="form-input" min="0" step="100">
|
||
</div>
|
||
</div>
|
||
<h4 style="color: #a5d6a7; margin: 16px 0 8px; font-size: 13px;">🧪 Материалы крафта в Мастерской</h4>
|
||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 10px; margin-bottom: 16px;">
|
||
<div>
|
||
<label class="form-label">Биогумус 🌿</label>
|
||
<input type="number" id="edit-player-mat-bioHumus" class="form-input" min="0">
|
||
</div>
|
||
<div>
|
||
<label class="form-label">Металлолом ⚙️</label>
|
||
<input type="number" id="edit-player-mat-scrapMetal" class="form-input" min="0">
|
||
</div>
|
||
<div>
|
||
<label class="form-label">Эссенция ☀️</label>
|
||
<input type="number" id="edit-player-mat-sunEssence" class="form-input" min="0">
|
||
</div>
|
||
<div>
|
||
<label class="form-label">Кристаллы 💎</label>
|
||
<input type="number" id="edit-player-mat-crystals" class="form-input" min="0">
|
||
</div>
|
||
</div>
|
||
|
||
<h4 style="color: #a5d6a7; margin: 16px 0 8px; font-size: 13px;">🌿 Сад Дзен</h4>
|
||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 10px; margin-bottom: 16px;">
|
||
<div>
|
||
<label class="form-label">Удобрения 🧪</label>
|
||
<input type="number" id="edit-player-zen-fertilizer" class="form-input" min="0">
|
||
</div>
|
||
<div>
|
||
<label class="form-label">Шоколад 🍫</label>
|
||
<input type="number" id="edit-player-zen-chocolate" class="form-input" min="0">
|
||
</div>
|
||
</div>
|
||
|
||
<div class="form-group">
|
||
<label class="form-label">Тема оформления (Theme):</label>
|
||
<select id="edit-player-theme" class="form-select">
|
||
<option value="classic">Классическая (Classic)</option>
|
||
<option value="night">Ночная (Night)</option>
|
||
<option value="cyberpunk">Киберпанк (Cyberpunk)</option>
|
||
</select>
|
||
</div>
|
||
|
||
<div style="border-top: 1px solid var(--border-color); padding-top: 12px; margin-top: 12px; display: flex; gap: 16px;">
|
||
<label style="display: flex; align-items: center; gap: 8px; font-size: 13px; cursor: pointer;">
|
||
<input type="checkbox" id="edit-player-is-admin">
|
||
<span style="color: var(--accent-gold);">⭐ Права администратора</span>
|
||
</label>
|
||
<label style="display: flex; align-items: center; gap: 8px; font-size: 13px; cursor: pointer;">
|
||
<input type="checkbox" id="edit-player-is-banned">
|
||
<span style="color: var(--accent-red);">🚫 Блокировка аккаунта</span>
|
||
</label>
|
||
</div>
|
||
<div id="edit-ban-reason-container" class="form-group" style="margin-top: 12px; display: none;">
|
||
<label class="form-label">Причина блокировки:</label>
|
||
<input type="text" id="edit-player-ban-reason" class="form-input" placeholder="Укажите причину бана...">
|
||
</div>
|
||
</div>
|
||
<div class="modal-footer">
|
||
<button class="btn btn-secondary" data-close="modal-edit-player">Отмена</button>
|
||
<button id="btn-save-player-edit" class="btn btn-primary">💾 Сохранить изменения</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- MODAL: PLAYER STATS & INSPECT -->
|
||
<div id="modal-player-stats" class="modal-overlay">
|
||
<div class="modal-box" style="max-width: 680px;">
|
||
<div class="modal-header">
|
||
<div class="modal-title">📊 Статистика игрока: <span id="stats-player-username" style="color: var(--accent-cyan);"></span> <span id="stats-player-badge"></span></div>
|
||
<button class="modal-close-btn" data-close="modal-player-stats">✕</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<input type="hidden" id="stats-player-id">
|
||
<div style="display: flex; justify-content: space-between; align-items: center; background: rgba(15, 23, 42, 0.6); padding: 12px 16px; border-radius: 8px; margin-bottom: 16px; border: 1px solid var(--border-color);">
|
||
<div>
|
||
<div style="font-size: 11px; color: var(--text-dim); text-transform: uppercase;">Аккаунт</div>
|
||
<div style="font-size: 15px; font-weight: bold; color: #fff;" id="stats-player-id-line">ID #—</div>
|
||
</div>
|
||
<div>
|
||
<div style="font-size: 11px; color: var(--text-dim); text-transform: uppercase;">Регистрация</div>
|
||
<div style="font-size: 13px; color: var(--text-main);" id="stats-player-created">—</div>
|
||
</div>
|
||
<div>
|
||
<div style="font-size: 11px; color: var(--text-dim); text-transform: uppercase;">Последний вход</div>
|
||
<div style="font-size: 13px; color: var(--text-main);" id="stats-player-login">—</div>
|
||
</div>
|
||
</div>
|
||
|
||
<h4 style="color: var(--accent-cyan); margin: 0 0 10px; font-size: 13px; text-transform: uppercase; letter-spacing: 0.5px;">⚔️ Боевая статистика (Lifetime)</h4>
|
||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 10px; margin-bottom: 16px;">
|
||
<div class="stat-card" style="padding: 10px;">
|
||
<div style="font-size: 18px; font-weight: bold; color: var(--accent-red);" id="stats-zombies-killed">0</div>
|
||
<div style="font-size: 11px; color: var(--text-dim);">🧟 Зомби убито</div>
|
||
</div>
|
||
<div class="stat-card" style="padding: 10px;">
|
||
<div style="font-size: 18px; font-weight: bold; color: var(--accent-gold);" id="stats-sun-produced">0</div>
|
||
<div style="font-size: 11px; color: var(--text-dim);">☀️ Солнца собрано</div>
|
||
</div>
|
||
<div class="stat-card" style="padding: 10px;">
|
||
<div style="font-size: 18px; font-weight: bold; color: var(--accent-green);" id="stats-plants-planted">0</div>
|
||
<div style="font-size: 11px; color: var(--text-dim);">🌱 Посажено растений</div>
|
||
</div>
|
||
<div class="stat-card" style="padding: 10px;">
|
||
<div style="font-size: 18px; font-weight: bold; color: var(--accent-cyan);" id="stats-levels-cleared">0</div>
|
||
<div style="font-size: 11px; color: var(--text-dim);">🎖️ Этапов пройдено</div>
|
||
</div>
|
||
<div class="stat-card" style="padding: 10px;">
|
||
<div style="font-size: 18px; font-weight: bold; color: var(--accent-gold);" id="stats-coins-earned">0</div>
|
||
<div style="font-size: 11px; color: var(--text-dim);">💰 Всего заработано</div>
|
||
</div>
|
||
</div>
|
||
|
||
<h4 style="color: #a5d6a7; margin: 16px 0 10px; font-size: 13px; text-transform: uppercase; letter-spacing: 0.5px;">🧪 Ресурсы и материалы</h4>
|
||
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(110px, 1fr)); gap: 10px; margin-bottom: 16px;">
|
||
<div style="background: rgba(30, 41, 59, 0.7); padding: 8px 12px; border-radius: 6px; border: 1px solid var(--border-color);">
|
||
<div style="font-size: 11px; color: var(--text-dim);">Монеты 💰</div>
|
||
<div style="font-size: 16px; font-weight: bold; color: var(--accent-gold);" id="stats-coins-val">0</div>
|
||
</div>
|
||
<div style="background: rgba(30, 41, 59, 0.7); padding: 8px 12px; border-radius: 6px; border: 1px solid var(--border-color);">
|
||
<div style="font-size: 11px; color: var(--text-dim);">Биогумус 🌿</div>
|
||
<div style="font-size: 16px; font-weight: bold; color: #81c784;" id="stats-biohumus-val">0</div>
|
||
</div>
|
||
<div style="background: rgba(30, 41, 59, 0.7); padding: 8px 12px; border-radius: 6px; border: 1px solid var(--border-color);">
|
||
<div style="font-size: 11px; color: var(--text-dim);">Металлолом ⚙️</div>
|
||
<div style="font-size: 16px; font-weight: bold; color: #90caf9;" id="stats-scrap-val">0</div>
|
||
</div>
|
||
<div style="background: rgba(30, 41, 59, 0.7); padding: 8px 12px; border-radius: 6px; border: 1px solid var(--border-color);">
|
||
<div style="font-size: 11px; color: var(--text-dim);">Эссенция ☀️</div>
|
||
<div style="font-size: 16px; font-weight: bold; color: #ffe082;" id="stats-essence-val">0</div>
|
||
</div>
|
||
<div style="background: rgba(30, 41, 59, 0.7); padding: 8px 12px; border-radius: 6px; border: 1px solid var(--border-color);">
|
||
<div style="font-size: 11px; color: var(--text-dim);">Кристаллы 💎</div>
|
||
<div style="font-size: 16px; font-weight: bold; color: #b39ddb;" id="stats-crystals-val">0</div>
|
||
</div>
|
||
</div>
|
||
|
||
<h4 style="color: #80cbc4; margin: 16px 0 10px; font-size: 13px; text-transform: uppercase; letter-spacing: 0.5px;">🌿 Сад Дзен и Рекорды</h4>
|
||
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 12px;">
|
||
<div style="background: rgba(30, 41, 59, 0.7); padding: 10px 14px; border-radius: 6px; border: 1px solid var(--border-color);">
|
||
<div style="font-size: 12px; font-weight: 600; color: #a7f3d0; margin-bottom: 6px;">🪴 Сад Дзен</div>
|
||
<div style="font-size: 13px;" id="stats-zen-summary">—</div>
|
||
</div>
|
||
<div style="background: rgba(30, 41, 59, 0.7); padding: 10px 14px; border-radius: 6px; border: 1px solid var(--border-color);">
|
||
<div style="font-size: 12px; font-weight: 600; color: #fde68a; margin-bottom: 6px;">🏆 Лучший счет</div>
|
||
<div style="font-size: 13px;" id="stats-scores-summary">—</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="modal-footer">
|
||
<button class="btn btn-secondary" data-close="modal-player-stats">Закрыть</button>
|
||
<button id="btn-stats-jump-edit" class="btn btn-primary">✏️ Редактировать ресурсы</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- MODAL: CREATE PLAYER -->
|
||
<div id="modal-create-player" class="modal-overlay">
|
||
<div class="modal-box">
|
||
<div class="modal-header">
|
||
<div class="modal-title">➕ Создать нового игрока</div>
|
||
<button class="modal-close-btn" data-close="modal-create-player">✕</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div class="form-group">
|
||
<label class="form-label">Имя пользователя (логин):</label>
|
||
<input type="text" id="create-player-username" class="form-input" placeholder="Логин игрока..." maxlength="20">
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Пароль:</label>
|
||
<input type="password" id="create-player-password" class="form-input" placeholder="Пароль...">
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Стартовые монеты:</label>
|
||
<input type="number" id="create-player-coins" class="form-input" value="150" min="0">
|
||
</div>
|
||
<label style="display: flex; align-items: center; gap: 8px; font-size: 13px; cursor: pointer;">
|
||
<input type="checkbox" id="create-player-is-admin">
|
||
<span>Сделать администратором</span>
|
||
</label>
|
||
</div>
|
||
<div class="modal-footer">
|
||
<button class="btn btn-secondary" data-close="modal-create-player">Отмена</button>
|
||
<button id="btn-submit-create-player" class="btn btn-primary">Создать игрока</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- MODAL: RESET PASSWORD -->
|
||
<div id="modal-reset-password" class="modal-overlay">
|
||
<div class="modal-box">
|
||
<div class="modal-header">
|
||
<div class="modal-title">🔑 Сброс пароля игрока <span id="reset-pwd-username" style="color:#00e5ff;"></span></div>
|
||
<button class="modal-close-btn" data-close="modal-reset-password">✕</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<input type="hidden" id="reset-pwd-user-id">
|
||
<div class="form-group">
|
||
<label class="form-label">Новый пароль:</label>
|
||
<input type="password" id="reset-pwd-input" class="form-input" placeholder="Введите новый пароль...">
|
||
</div>
|
||
</div>
|
||
<div class="modal-footer">
|
||
<button class="btn btn-secondary" data-close="modal-reset-password">Отмена</button>
|
||
<button id="btn-submit-reset-pwd" class="btn btn-danger">Сбросить пароль</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- MODAL: MODERATE BUG -->
|
||
<div id="modal-moderate-bug" class="modal-overlay">
|
||
<div class="modal-box">
|
||
<div class="modal-header">
|
||
<div class="modal-title">🐛 Модерация баг-репорта #<span id="bug-mod-id"></span></div>
|
||
<button class="modal-close-btn" data-close="modal-moderate-bug">✕</button>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div style="background: rgba(255,255,255,0.04); padding: 12px; border-radius: var(--radius-md); margin-bottom: 16px;">
|
||
<div style="font-size: 11px; color: var(--text-muted);" id="bug-mod-meta"></div>
|
||
<div style="font-size: 13px; color: var(--text-main); margin-top: 6px;" id="bug-mod-text"></div>
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Статус обращения:</label>
|
||
<select id="bug-mod-status" class="form-select">
|
||
<option value="новый">🔴 Новый</option>
|
||
<option value="в работе">🟡 В работе</option>
|
||
<option value="исправлено">✅ Исправлено</option>
|
||
<option value="отклонено">⚪ Отклонено</option>
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Официальный ответ администратора / фикс:</label>
|
||
<textarea id="bug-mod-reply" class="form-textarea" rows="3" placeholder="Укажите версию фикса или пояснение..."></textarea>
|
||
</div>
|
||
</div>
|
||
<div class="modal-footer">
|
||
<button id="btn-bug-delete" class="btn btn-danger btn-sm" style="margin-right: auto;">🗑️ Удалить</button>
|
||
<button class="btn btn-secondary" data-close="modal-moderate-bug">Отмена</button>
|
||
<button id="btn-bug-mod-save" class="btn btn-primary">💾 Сохранить статус</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Toast Container -->
|
||
<div id="toast-container" class="toast-container"></div>
|
||
|
||
<!-- Scripts -->
|
||
<script src="js/configurator.js"></script>
|
||
</body>
|
||
</html>
|