Обновить clicker.html
This commit is contained in:
+23
-45
@@ -100,18 +100,11 @@
|
||||
@media (max-width: 768px) {
|
||||
.game-container { grid-template-columns: 1fr; }
|
||||
}
|
||||
|
||||
/* Статус API */
|
||||
.api-status {
|
||||
position: fixed;
|
||||
top: 10px;
|
||||
left: 10px;
|
||||
padding: 8px 16px;
|
||||
border-radius: 20px;
|
||||
font-size: 12px;
|
||||
background: rgba(0, 0, 0, 0.7);
|
||||
color: #aaa;
|
||||
z-index: 1000;
|
||||
position: fixed; top: 10px; left: 10px;
|
||||
padding: 8px 16px; border-radius: 20px;
|
||||
font-size: 12px; background: rgba(0, 0, 0, 0.7);
|
||||
color: #aaa; z-index: 1000;
|
||||
}
|
||||
.api-status.connected { color: #4caf50; }
|
||||
.api-status.error { color: #f44336; }
|
||||
@@ -119,7 +112,7 @@
|
||||
</head>
|
||||
<body>
|
||||
<div class="api-status" id="apiStatus">⏳ API: ожидание...</div>
|
||||
|
||||
|
||||
<div class="game-container">
|
||||
<div class="clicker-section">
|
||||
<div class="stats">
|
||||
@@ -139,8 +132,11 @@
|
||||
|
||||
<script>
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// СОСТОЯНИЕ ИГРЫ
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// КОНФИГУРАЦИЯ
|
||||
// ══════════════════════════════════════════════════════════
|
||||
const MY_SAVE = 'main_save';
|
||||
const TABLE_NAME = 'game_save';
|
||||
|
||||
let gameState = {
|
||||
score: 0,
|
||||
totalClicks: 0,
|
||||
@@ -173,10 +169,9 @@
|
||||
};
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// API КЛИЕНТ (через bridge в родителе)
|
||||
// API КЛИЕНТ
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
let api = null;
|
||||
const TABLE_NAME = 'game_save';
|
||||
const statusEl = document.getElementById('apiStatus');
|
||||
|
||||
function updateStatus(text, type = '') {
|
||||
@@ -184,20 +179,17 @@
|
||||
statusEl.className = 'api-status ' + type;
|
||||
}
|
||||
|
||||
// Ждём готовности API
|
||||
async function waitForAPI() {
|
||||
if (window.gameApi) {
|
||||
api = window.gameApi;
|
||||
updateStatus('✓ API подключён', 'connected');
|
||||
return true;
|
||||
}
|
||||
|
||||
return new Promise((resolve) => {
|
||||
const timeout = setTimeout(() => {
|
||||
updateStatus('✗ API недоступен, используем localStorage', 'error');
|
||||
updateStatus(' API недоступен, используем localStorage', 'error');
|
||||
resolve(false);
|
||||
}, 5000);
|
||||
|
||||
window.addEventListener('gameApiReady', () => {
|
||||
clearTimeout(timeout);
|
||||
api = window.gameApi;
|
||||
@@ -207,14 +199,13 @@
|
||||
});
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
// ══════════════════════════════════════════════════════════
|
||||
// СОХРАНЕНИЕ / ЗАГРУЗКА
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
async function loadGame() {
|
||||
// Пытаемся загрузить через API
|
||||
if (api) {
|
||||
try {
|
||||
const result = await api.selectData(TABLE_NAME, { key: 'game_state' });
|
||||
const result = await api.selectData(TABLE_NAME, { key: 'game_state' }, MY_SAVE);
|
||||
if (result.data && result.data.length > 0) {
|
||||
const savedState = JSON.parse(result.data[0].value);
|
||||
gameState = { ...gameState, ...savedState };
|
||||
@@ -229,8 +220,6 @@
|
||||
console.warn('API загрузка не удалась:', e.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback на localStorage
|
||||
const saved = localStorage.getItem('clickerGame');
|
||||
if (saved) {
|
||||
const savedState = JSON.parse(saved);
|
||||
@@ -243,38 +232,31 @@
|
||||
}
|
||||
|
||||
async function saveGame() {
|
||||
// Сохраняем через API
|
||||
if (api) {
|
||||
try {
|
||||
// Сначала удаляем старую запись
|
||||
await api.deleteData(TABLE_NAME, { key: 'game_state' });
|
||||
// Затем вставляем новую
|
||||
await api.deleteData(TABLE_NAME, { key: 'game_state' }, MY_SAVE);
|
||||
await api.insertData(TABLE_NAME, {
|
||||
key: 'game_state',
|
||||
value: JSON.stringify(gameState),
|
||||
updated_at: new Date().toISOString()
|
||||
});
|
||||
}, MY_SAVE);
|
||||
return;
|
||||
} catch (e) {
|
||||
console.warn('API сохранение не удалось:', e.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback
|
||||
localStorage.setItem('clickerGame', JSON.stringify(gameState));
|
||||
}
|
||||
|
||||
async function resetGame() {
|
||||
if (!confirm('Сбросить весь прогресс?')) return;
|
||||
|
||||
if (api) {
|
||||
try {
|
||||
await api.deleteData(TABLE_NAME, { key: 'game_state' });
|
||||
await api.deleteData(TABLE_NAME, { key: 'game_state' }, MY_SAVE);
|
||||
} catch (e) {
|
||||
console.warn('API удаление не удалось:', e.message);
|
||||
}
|
||||
}
|
||||
|
||||
localStorage.removeItem('clickerGame');
|
||||
location.reload();
|
||||
}
|
||||
@@ -344,16 +326,16 @@
|
||||
const power = getClickPower();
|
||||
gameState.score += power;
|
||||
gameState.totalClicks++;
|
||||
|
||||
|
||||
const animation = document.createElement('div');
|
||||
animation.className = 'click-animation';
|
||||
animation.textContent = `+${power}`;
|
||||
animation.style.left = `${event.clientX}px`;
|
||||
animation.style.top = `${event.clientY}px`;
|
||||
document.body.appendChild(animation);
|
||||
|
||||
|
||||
setTimeout(() => animation.remove(), 1000);
|
||||
|
||||
|
||||
updateUI();
|
||||
}
|
||||
|
||||
@@ -369,24 +351,20 @@
|
||||
// ИНИЦИАЛИЗАЦИЯ
|
||||
// ═══════════════════════════════════════════════════════════
|
||||
(async () => {
|
||||
// Ждём API
|
||||
await waitForAPI();
|
||||
|
||||
// Создаём таблицу при первом запуске
|
||||
|
||||
if (api) {
|
||||
try {
|
||||
await api.createTable(TABLE_NAME, {
|
||||
'key': 'TEXT',
|
||||
'value': 'TEXT',
|
||||
'updated_at': 'TEXT'
|
||||
}, 'Таблица сохранений игры');
|
||||
}, MY_SAVE, 'Таблица сохранений кликера');
|
||||
} catch (e) {
|
||||
// Таблица уже существует — это нормально
|
||||
console.log('Таблица уже существует или:', e.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Загружаем игру
|
||||
|
||||
await loadGame();
|
||||
updateUI();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user