Что делает функция
Игрок получает награду раз в сутки при первом входе. Можно начислять валюту, опыт или предмет. Если игрок не зашел — серия сбрасывается.
Добавляем таблицу в базу
CREATE TABLE daily_bonus (
user_id INT PRIMARY KEY,
last_claim DATE,
streak INT DEFAULT 0
);
Код
class DailyBonus {
private $db;
private $userId;
public function __construct(PDO $db, int $userId) {
$this->db = $db;
$this->userId = $userId;
}
public function claim(): int {
$today = date('Y-m-d');
$stmt = $this->db->prepare("SELECT * FROM daily_bonus WHERE user_id = :user_id");
$stmt->execute(['user_id' => $this->userId]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$row) {
$stmt = $this->db->prepare("INSERT INTO daily_bonus (user_id, last_claim, streak) VALUES (:user_id, :today, 1)");
$stmt->execute(['user_id' => $this->userId, 'today' => $today]);
$bonus = 100;
} else {
if ($row['last_claim'] < $today) {
$streak = ($row['last_claim'] == date('Y-m-d', strtotime('-1 day'))) ? $row['streak'] + 1 : 1;
$stmt = $this->db->prepare("UPDATE daily_bonus SET last_claim=:today, streak=:streak WHERE user_id=:user_id");
$stmt->execute(['today' => $today, 'streak' => $streak, 'user_id' => $this->userId]);
$bonus = 100 * $streak;
} else {
$bonus = 0;
}
}
if ($bonus > 0) {
$stmt = $this->db->prepare("UPDATE users SET gold = gold + :bonus WHERE id = :user_id");
$stmt->execute(['bonus' => $bonus, 'user_id' => $this->userId]);
}
return $bonus;
}
}
Идеи для развития
- добавить визуальную шкалу прогресса;
- ввести редкие награды на 7-й день;
- сохранять статистику пропусков.
Механика простая, но живая: игроки любят, когда игра что-то дарит просто за возвращение.
Использование
require 'DailyBonus.php';
$bonusSystem = new DailyBonus($pdo, $_SESSION['user_id']);
$bonus = $bonusSystem->claim();
if ($bonus > 0) echo "Ты получил $bonus золота за вход!";