-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
193 lines (159 loc) · 8.15 KB
/
Copy pathscript.js
File metadata and controls
193 lines (159 loc) · 8.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
// Настройки
let coinPerTap = 1; // Количество монет, которое добавляется за один тап
let totalPower = 700; // Общая максимальная энергия
// Элементы DOM
let coinContainer = document.querySelector('.coin-container');
let coinImage = coinContainer.querySelector('img');
let coinValueElement = document.getElementById('coin-value');
let powerElement = document.getElementById('power');
let coinCountElement = document.querySelector('.coin-count-container h1');
let progressBar = document.querySelector('.progress');
// Переменные для монет и энергии
let coins = 0;
let power = 700;
let lastTapTime = 0;
const tapCooldown = 100; // Задержка между тапами (в миллисекундах)
let coinUpdateQueue = 0; // Очередь обновлений для серверных данных
let isUpdating = false; // Флаг, чтобы предотвратить несколько одновременных обновлений
// Сохранение времени последнего обновления
function saveLastUpdateTime() {
localStorage.setItem('lastUpdateTime', Date.now());
}
// Обновление энергии на основе времени
function updatePowerBasedOnTime() {
let lastUpdateTime = parseInt(localStorage.getItem('lastUpdateTime') || Date.now());
let currentTime = Date.now();
let elapsedTime = currentTime - lastUpdateTime;
let powerToAdd = Math.floor(elapsedTime / 1500); // Энергия восстанавливается каждые 1.5 секунды
// Обновляем энергию и не даём ей превышать максимальное значение
power = Math.min(Number(localStorage.getItem('power') || power) + powerToAdd, totalPower);
localStorage.setItem('power', power);
saveLastUpdateTime();
}
// Инициализация энергии и монет
updatePowerBasedOnTime();
localStorage.setItem('coins', coins);
localStorage.setItem('power', power);
saveLastUpdateTime();
// Функция обновления интерфейса
function updateDisplay() {
coinCountElement.textContent = Number(localStorage.getItem('coins')).toLocaleString();
let currentPower = Number(localStorage.getItem('power'));
powerElement.textContent = currentPower;
progressBar.style.width = `${(100 * currentPower) / totalPower}%`;
}
// Анимация для отображения монет
function showCoinValue(value, x, y) {
let newCoinValue = document.createElement('div');
newCoinValue.className = 'coin-value';
newCoinValue.textContent = `+${value}`;
newCoinValue.style.left = `${x}px`;
newCoinValue.style.top = `${y}px`;
coinContainer.appendChild(newCoinValue);
setTimeout(() => {
newCoinValue.classList.add('show');
}, 10);
setTimeout(() => {
coinContainer.removeChild(newCoinValue);
}, 1000);
}
// Вибрация устройства (если поддерживается)
function vibrateDevice() {
if ('vibrate' in navigator) {
navigator.vibrate(50); // Вибрация на 50 мс
}
}
// Шифрование chat_id (для безопасности)
function encryptChatId(chatId) {
return btoa(chatId.split('').reverse().join('')); // Простой метод для шифрования
}
// Функция обновления монет на сервере
function updateCoinOnServer() {
if (coinUpdateQueue > 0 && !isUpdating) {
isUpdating = true;
let amount = coinUpdateQueue;
coinUpdateQueue = 0;
let encryptedChatId = encryptChatId('1873407633'); // Замените на ваш chat_id
fetch(`update_coin.php?chat_id=${encryptedChatId}&amount=${amount}`)
.then(response => response.json())
.then(data => {
localStorage.setItem('coins', data.coin); // Обновляем количество монет
updateDisplay();
isUpdating = false;
if (coinUpdateQueue > 0) {
updateCoinOnServer(); // Обновляем, если в очереди еще есть монеты
}
})
.catch(() => {
coinUpdateQueue += amount; // Если запрос не удался, возвращаем монеты в очередь
isUpdating = false;
});
}
}
// Обработчик для касания (для мобильных устройств)
function handleTouch(e) {
e.preventDefault();
const currentTime = Date.now();
if (currentTime - lastTapTime < tapCooldown) {
return; // Если тап слишком быстрый, игнорируем
}
lastTapTime = currentTime;
vibrateDevice(); // Вибрация устройства при тапе
coins = Number(localStorage.getItem('coins'));
power = Number(localStorage.getItem('power'));
let touchPoints = e.targetTouches; // Массив касаний на экране
let addedCoins = 0;
for (let i = 0; i < touchPoints.length; i++) {
if (power >= coinPerTap) { // Если хватает энергии для одного тапа
let touch = touchPoints[i];
let rect = coinImage.getBoundingClientRect();
let x = touch.clientX - rect.left;
let y = touch.clientY - rect.top;
addedCoins += coinPerTap; // Добавляем монеты
power -= coinPerTap; // Уменьшаем энергию
showCoinValue(coinPerTap, x, y); // Показ анимации монет
// Добавляем небольшую случайную анимацию для монеты
let angle = Math.random() * 20 - 10;
let translateX = (Math.random() * 0.5 - 0.25).toFixed(2);
let translateY = (Math.random() * 0.5 - 0.25).toFixed(2);
coinImage.style.transform = `translate(${translateX}rem, ${translateY}rem) rotate(${angle}deg)`;
} else {
break; // Если энергии недостаточно, прекращаем цикл
}
}
if (addedCoins > 0) {
coins += addedCoins;
localStorage.setItem('coins', coins); // Сохраняем обновленное количество монет
localStorage.setItem('power', power); // Сохраняем обновленную энергию
coinUpdateQueue += addedCoins; // Добавляем монеты в очередь обновлений
updateDisplay(); // Обновляем интерфейс
updateCoinOnServer(); // Отправляем данные на сервер
}
setTimeout(() => {
coinImage.style.transform = 'translate(0px, 0px) rotate(0deg)';
}, 100);
updateDisplay(); // Обновляем интерфейс каждый раз
}
// Слушаем события касания и клика
coinContainer.addEventListener('touchstart', handleTouch);
if (!('ontouchstart' in window)) { // Для десктопных браузеров добавляем обработку кликов
coinContainer.addEventListener('click', (e) => {
handleTouch({
preventDefault: () => {},
targetTouches: [{
clientX: e.clientX,
clientY: e.clientY
}]
});
});
}
// Обновление энергии и монет каждую секунду
setInterval(() => {
updatePowerBasedOnTime();
updateDisplay();
}, 1500);
// Обновление монет на сервере каждую секунду
setInterval(updateCoinOnServer, 1000);
updateDisplay(); // Первоначальная инициализация интерфейса
// Сохранение времени последнего обновления при закрытии страницы
window.addEventListener('beforeunload', saveLastUpdateTime);