2020-07-03 13:23:08 +00:00
|
|
|
|
<?php
|
2021-01-27 15:56:04 +00:00
|
|
|
|
|
2020-10-28 20:21:08 +00:00
|
|
|
|
namespace Battles;
|
2021-01-27 15:56:04 +00:00
|
|
|
|
|
2020-10-28 20:21:08 +00:00
|
|
|
|
use Exceptions\GameException;
|
2021-01-27 15:56:04 +00:00
|
|
|
|
use db;
|
2020-07-03 13:23:08 +00:00
|
|
|
|
|
|
|
|
|
class User
|
|
|
|
|
{
|
2020-07-22 09:29:31 +00:00
|
|
|
|
public $id = 0;
|
2020-07-21 08:36:21 +00:00
|
|
|
|
public $login = '<em>Некто</em>';
|
2020-08-30 00:59:29 +00:00
|
|
|
|
public $pass;
|
2020-07-21 08:36:21 +00:00
|
|
|
|
public $email = '<em>неизвестно</em>';
|
2020-07-03 13:23:08 +00:00
|
|
|
|
public $realname;
|
|
|
|
|
public $borndate;
|
|
|
|
|
public $info;
|
2020-07-21 08:36:21 +00:00
|
|
|
|
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;
|
2020-08-29 18:14:33 +00:00
|
|
|
|
public $health;
|
|
|
|
|
public $mana;
|
2020-07-03 13:23:08 +00:00
|
|
|
|
public $ip;
|
|
|
|
|
public $session_id;
|
2020-07-21 08:36:21 +00:00
|
|
|
|
public $admin = 0;
|
2020-07-03 13:23:08 +00:00
|
|
|
|
public $enter_game;
|
|
|
|
|
public $room;
|
|
|
|
|
public $block;
|
2020-07-06 10:41:20 +00:00
|
|
|
|
public $shadow;
|
2020-07-20 13:27:32 +00:00
|
|
|
|
// Удар кулаком всегда 1-2.
|
|
|
|
|
public $minDamage = 1;
|
|
|
|
|
public $maxDamage = 2;
|
2020-07-20 13:44:31 +00:00
|
|
|
|
//Броня без предметов не существует.
|
|
|
|
|
public $headArmor = 0;
|
|
|
|
|
public $chestArmor = 0;
|
|
|
|
|
public $legArmor = 0;
|
2020-07-22 14:04:15 +00:00
|
|
|
|
public $free_stat_points = 0;
|
2020-07-20 09:32:51 +00:00
|
|
|
|
public const STAT_MAXIMUM_AMOUNT = 40;
|
2020-07-21 08:36:21 +00:00
|
|
|
|
private const ERROR_STAT_IS_MAXIMUM = 'Ошибка: Параметр достиг своего лимита!';
|
|
|
|
|
private const ERROR_STAT_UNKNOWN = 'Ошибка: Неизвестный параметр!';
|
2020-07-03 13:49:39 +00:00
|
|
|
|
// Пока несуществующие, для совместимости.
|
2020-07-10 08:08:00 +00:00
|
|
|
|
public $married = 'Someone или нет.';
|
|
|
|
|
public $experience = 200;
|
2020-08-29 23:21:22 +00:00
|
|
|
|
public $battle = 0;
|
|
|
|
|
public $in_tower = 0; // Скорее башню похороним чем запустим...
|
|
|
|
|
public $zayavka = 0;
|
2020-07-10 08:08:00 +00:00
|
|
|
|
// Динамически рассчитываемые
|
2020-08-29 18:14:33 +00:00
|
|
|
|
public $maxHealth = 5;
|
|
|
|
|
public $maxMana = 5;
|
2020-07-04 10:49:43 +00:00
|
|
|
|
|
2020-07-03 13:33:34 +00:00
|
|
|
|
public function __construct($user)
|
2020-07-03 13:23:08 +00:00
|
|
|
|
{
|
2021-01-27 15:56:04 +00:00
|
|
|
|
$user_query = db::c()->query('SELECT * FROM users WHERE id = "?s" OR login = "?s"', $user, $user)->fetch_assoc();
|
2020-07-03 13:23:08 +00:00
|
|
|
|
foreach ($this as $key => $value) {
|
|
|
|
|
if (isset($user_query[$key])) {
|
|
|
|
|
$this->$key = $user_query[$key];
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-08-29 18:14:33 +00:00
|
|
|
|
$this->maxHealth = round(($this->endurance * 3) + ($this->endurance / 2) * ($this->level - 1) + ($this->endurance / 5) * (($this->level - 1) * ($this->level - 2) / 2));
|
2020-08-29 18:25:22 +00:00
|
|
|
|
$this->maxMana = round(($this->wisdom * 3) + ($this->wisdom / 2) * ($this->level - 1) + ($this->wisdom / 5) * (($this->level - 1) * ($this->level - 2) / 2));
|
2020-07-03 13:23:08 +00:00
|
|
|
|
}
|
2020-07-03 16:37:24 +00:00
|
|
|
|
|
2020-08-30 09:47:24 +00:00
|
|
|
|
/**
|
|
|
|
|
* Отдаёт информацию о базовом(!) стате.
|
2021-01-27 15:56:04 +00:00
|
|
|
|
* @param $stat_name - имя стата. Может принимать значения 'strength', 'dexterity', 'intuition', 'endurance', 'intelligence', 'wisdom'.
|
2020-08-30 09:47:24 +00:00
|
|
|
|
* @param int $isMainWindow - переключатель "главного окна". Если включить, дополнительно будет показывать ссылку на повышение стата на 1, при условии наличия свободных очков статов.
|
|
|
|
|
* @return string
|
2020-10-28 20:21:08 +00:00
|
|
|
|
* @throws GameException
|
2020-08-30 09:47:24 +00:00
|
|
|
|
*/
|
|
|
|
|
public function getStat($stat_name, $isMainWindow = 0)
|
2020-07-21 08:36:21 +00:00
|
|
|
|
{
|
2020-08-30 09:47:24 +00:00
|
|
|
|
$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 <a href="/main.php?edit=%s&ups=%s">[+]</a>', $this->$stat_name, mt_rand(), $stat_name);
|
|
|
|
|
} else {
|
|
|
|
|
return $this->$stat_name;
|
|
|
|
|
}
|
2020-07-21 08:36:21 +00:00
|
|
|
|
} else {
|
2021-01-27 15:56:04 +00:00
|
|
|
|
throw new GameException(self::ERROR_STAT_UNKNOWN);
|
2020-07-21 08:36:21 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-30 09:47:24 +00:00
|
|
|
|
/**
|
|
|
|
|
* Повышает один из выбранных статов на 1, но не выше self::STAT_MAXIMUM_AMOUNT при условии наличия свободных очков статов.
|
|
|
|
|
* @param $stat_name - имя стата. Может принимать значения 'strength', 'dexterity', 'intuition', 'endurance', 'intelligence', 'wisdom'.
|
2020-10-28 20:21:08 +00:00
|
|
|
|
* @throws GameException
|
2020-08-30 09:47:24 +00:00
|
|
|
|
*/
|
2020-07-21 08:36:21 +00:00
|
|
|
|
public function addOnePointToStat($stat_name)
|
|
|
|
|
{
|
|
|
|
|
$allowed = ['strength', 'dexterity', 'intuition', 'endurance', 'intelligence', 'wisdom'];
|
|
|
|
|
if (in_array($stat_name, $allowed)) {
|
2020-07-22 14:04:15 +00:00
|
|
|
|
if ($this->free_stat_points > 0 && $this->$stat_name <= self::STAT_MAXIMUM_AMOUNT) {
|
2020-07-21 08:36:21 +00:00
|
|
|
|
$query = 'UPDATE users SET ?f = ?f + 1, free_stat_points = free_stat_points - 1 WHERE id = ?i';
|
2021-01-27 15:56:04 +00:00
|
|
|
|
db::c()->query($query, $stat_name, $stat_name, $this->id);
|
2020-07-21 08:36:21 +00:00
|
|
|
|
} else {
|
2021-01-27 15:56:04 +00:00
|
|
|
|
throw new GameException(self::ERROR_STAT_IS_MAXIMUM);
|
2020-07-21 08:36:21 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
2021-01-27 15:56:04 +00:00
|
|
|
|
throw new GameException(self::ERROR_STAT_UNKNOWN);
|
2020-07-21 08:36:21 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-30 10:44:57 +00:00
|
|
|
|
protected function showStarSign()
|
2020-07-06 05:56:25 +00:00
|
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
* 1 aries
|
|
|
|
|
* 2 taurus
|
|
|
|
|
* 3 gemini
|
|
|
|
|
* 4 cancer
|
|
|
|
|
* 5 leo
|
|
|
|
|
* 6 virgo
|
|
|
|
|
* 7 libra
|
|
|
|
|
* 8 scorpio
|
|
|
|
|
* 9 sagittarios
|
|
|
|
|
* 10 capricorn
|
|
|
|
|
* 11 aquarius
|
|
|
|
|
* 12 pisches
|
|
|
|
|
*/
|
2020-07-05 17:29:30 +00:00
|
|
|
|
$zodiac[356] = "10";
|
|
|
|
|
$zodiac[326] = "09";
|
|
|
|
|
$zodiac[296] = "08";
|
|
|
|
|
$zodiac[266] = "07";
|
|
|
|
|
$zodiac[235] = "06";
|
|
|
|
|
$zodiac[203] = "05";
|
|
|
|
|
$zodiac[172] = "04";
|
|
|
|
|
$zodiac[140] = "03";
|
|
|
|
|
$zodiac[111] = "02";
|
|
|
|
|
$zodiac[78] = "01";
|
|
|
|
|
$zodiac[51] = "12";
|
|
|
|
|
$zodiac[20] = "11";
|
|
|
|
|
$zodiac[0] = "10";
|
|
|
|
|
$dayOfYear = date("z", strtotime($this->borndate));
|
|
|
|
|
$isLeapYear = date("L", strtotime($this->borndate)); //Высокосный?
|
2020-07-06 05:56:25 +00:00
|
|
|
|
if ($isLeapYear && $dayOfYear > 59) {
|
2020-07-05 17:29:30 +00:00
|
|
|
|
--$dayOfYear;
|
|
|
|
|
}
|
|
|
|
|
foreach ($zodiac as $day => $sign) {
|
|
|
|
|
if ($dayOfYear > $day) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return $sign ?? null;
|
|
|
|
|
}
|
2020-07-10 08:08:00 +00:00
|
|
|
|
|
2020-08-29 18:18:18 +00:00
|
|
|
|
public function getHealth(): string
|
2020-07-10 08:08:00 +00:00
|
|
|
|
{
|
2020-08-30 09:47:24 +00:00
|
|
|
|
return $this->health . '/' . $this->maxHealth;
|
2020-08-29 18:14:33 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-08-29 18:18:18 +00:00
|
|
|
|
public function getMana(): string
|
2020-08-29 18:14:33 +00:00
|
|
|
|
{
|
2020-08-30 09:47:24 +00:00
|
|
|
|
return $this->mana . '/' . $this->maxMana;
|
2020-07-10 08:08:00 +00:00
|
|
|
|
}
|
2020-07-03 13:23:08 +00:00
|
|
|
|
}
|