Некто'; public $pass; public $email = 'неизвестно'; public $realname; public $borndate; public $info; public $level = 0; public $align = 0; public $clan = 0; public $money = 0; public $strength = 0; public $dexterity = 0; public $intuition = 0; public $endurance = 0; public $intelligence = 0; public $wisdom = 0; public $health; public $mana; public $ip; public $session_id; public $admin = 0; public $enter_game; public $room; public $block; public $shadow; // Удар кулаком всегда 1-2. public $minDamage = 1; public $maxDamage = 2; //Броня без предметов не существует. public $headArmor = 0; public $chestArmor = 0; public $legArmor = 0; public $free_stat_points = 0; public const STAT_MAXIMUM_AMOUNT = 40; private const ERROR_STAT_IS_MAXIMUM = 'Ошибка: Параметр достиг своего лимита!'; private const ERROR_STAT_UNKNOWN = 'Ошибка: Неизвестный параметр!'; // Пока несуществующие, для совместимости. public $married = 'Someone или нет.'; public $experience = 200; public $battle = 0; public $in_tower = 0; // Скорее башню похороним чем запустим... public $zayavka = 0; // Динамически рассчитываемые public $maxHealth = 5; public $maxMana = 5; protected static $db; public function __construct(int $user) { self::$db = DBPDO::INIT(); $user_query = self::$db->fetch('SELECT * FROM users WHERE id = ? OR login = ?', [$user, $user]); foreach ($this as $key => $value) { if (isset($user_query[$key])) { $this->$key = $user_query[$key]; } } $this->maxHealth = round(($this->endurance * 3) + ($this->endurance / 2) * ($this->level - 1) + ($this->endurance / 5) * (($this->level - 1) * ($this->level - 2) / 2)); $this->maxMana = round(($this->wisdom * 3) + ($this->wisdom / 2) * ($this->level - 1) + ($this->wisdom / 5) * (($this->level - 1) * ($this->level - 2) / 2)); } /** * Отдаёт информацию о базовом(!) стате. * @param $stat_name - имя стата. Может принимать значения 'strength', 'dexterity', 'intuition', 'endurance', 'intelligence', 'wisdom'. * @param int $isMainWindow - переключатель "главного окна". Если включить, дополнительно будет показывать ссылку на повышение стата на 1, при условии наличия свободных очков статов. * @return string * @throws GameException */ public function getStat($stat_name, $isMainWindow = 0):string { $allowed = ['strength', 'dexterity', 'intuition', 'endurance', 'intelligence', 'wisdom']; if (in_array($stat_name, $allowed)) { if ($this->free_stat_points && $isMainWindow && $this->$stat_name < self::STAT_MAXIMUM_AMOUNT) { return sprintf('%s [+]', $this->$stat_name, mt_rand(), $stat_name); } else { return $this->$stat_name; } } else { throw new GameException(self::ERROR_STAT_UNKNOWN); } } /** * Повышает один из выбранных статов на 1, но не выше self::STAT_MAXIMUM_AMOUNT при условии наличия свободных очков статов. * @param string $stat_name - имя стата. Может принимать значения 'strength', 'dexterity', 'intuition', 'endurance', 'intelligence', 'wisdom'. * @throws GameException */ public function addOnePointToStat(string $stat_name) { $allowed = ['strength', 'dexterity', 'intuition', 'endurance', 'intelligence', 'wisdom']; if (in_array($stat_name, $allowed)) { if ($this->free_stat_points > 0 && $this->$stat_name <= self::STAT_MAXIMUM_AMOUNT) { $query = "UPDATE users SET {$stat_name} = {$stat_name} + 1, free_stat_points = free_stat_points - 1 WHERE id = ?"; self::$db->execute($query,$this->id); } else { throw new GameException(self::ERROR_STAT_IS_MAXIMUM); } } else { throw new GameException(self::ERROR_STAT_UNKNOWN); } } protected function showStarSign(): ?string { /* * 1 aries * 2 taurus * 3 gemini * 4 cancer * 5 leo * 6 virgo * 7 libra * 8 scorpio * 9 sagittarios * 10 capricorn * 11 aquarius * 12 pisches */ $zodiac = [ 356 => "10", 326 => "09", 296 => "08", 266 => "07", 235 => "06", 203 => "05", 172 => "04", 140 => "03", 111 => "02", 78 => "01", 51 => "12", 20 => "11", 0 => "10", ]; $dayOfYear = date("z", strtotime($this->borndate)); $isLeapYear = date("L", strtotime($this->borndate)); //Высокосный? if ($isLeapYear && $dayOfYear > 59) { --$dayOfYear; } foreach ($zodiac as $day => $sign) { if ($dayOfYear > $day) { break; } } return $sign ?? null; } public function getHealth(): string { return $this->health . '/' . $this->maxHealth; } public function getMana(): string { return $this->mana . '/' . $this->maxMana; } public static function setUserEffect(int $userId, int $type, string $name, int $time):bool { return self::$db->execute('INSERT INTO users_effects (owner_id, type, name, remaining_time) VALUES (?,?,?,?)',[$userId, $type, $name, $time]); } public static function removeUserEffect(int $userId, int $type):bool { if (self::$db->fetch('SELECT 1 FROM users_effects WHERE owner_id = ? AND type = ?', [$userId, $type])) { self::$db->execute('DELETE FROM users_effects WHERE owner_id = ? AND type = ?', [$userId, $type]); } return false; } }