Одевание предмета уехало в класс.
This commit is contained in:
@@ -1,15 +1,25 @@
|
||||
<?php
|
||||
namespace Battles;
|
||||
|
||||
use Battles\Database\DBPDO;
|
||||
|
||||
class InventoryItem extends Item
|
||||
{
|
||||
private $present;
|
||||
private $owner_id;
|
||||
private const TOO_MANY_ITEMS_IN_SLOTS = 'Критическая ошибка: Переполнение слота!';
|
||||
private const UNKNOWN_ITEM_TYPE = 'Неизвестный тип предмета!';
|
||||
private const REQUIREMENTS_NOT_MET = 'Персонаж не соответствует требованиям!';
|
||||
|
||||
/**
|
||||
* InventoryItem constructor.
|
||||
*
|
||||
* @param $row
|
||||
*/
|
||||
public function __construct($row)
|
||||
{
|
||||
parent::__construct($row);
|
||||
if (isset($row['present'])) {
|
||||
$this->present = $row['present'];
|
||||
}
|
||||
$this->owner_id = $row->owner_id;
|
||||
}
|
||||
|
||||
public function printInfo()
|
||||
@@ -35,5 +45,86 @@ IMG;
|
||||
}
|
||||
}
|
||||
|
||||
public function printControls() {}
|
||||
public function printControls()
|
||||
{
|
||||
/* Тут будут кнопки под картинкой. */
|
||||
}
|
||||
|
||||
private function dressStatsChecks(): ?string
|
||||
{
|
||||
$checkStats = new UserStats($this->owner_id);
|
||||
return
|
||||
$this->need_strength > $checkStats->getFullStats()->strength
|
||||
|| $this->need_dexterity > $checkStats->getFullStats()->dexterity
|
||||
|| $this->need_intuition > $checkStats->getFullStats()->intuition
|
||||
|| $this->need_endurance > $checkStats->getFullStats()->endurance
|
||||
|| $this->need_intelligence > $checkStats->getFullStats()->intelligence
|
||||
|| $this->need_wisdom > $checkStats->getFullStats()->wisdom
|
||||
? true : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Одевание предмета из инвентаря в слот.
|
||||
* @return bool|string
|
||||
*/
|
||||
public function dressItem()
|
||||
{
|
||||
$db = new DBPDO();
|
||||
$itemInSlot = [];
|
||||
if ($this->dressStatsChecks()) {
|
||||
return self::REQUIREMENTS_NOT_MET;
|
||||
}
|
||||
// считаем сколько ОДЕТЫХ предметов в слоте в который мы хотим одеть предмет. 1=просто вещь 1-3=шашни с кольцами
|
||||
// Count добавленный в первый запрос возвращает одну строку в любом случае.
|
||||
// fetch возвращает одну строку в любом случае.
|
||||
$weared = $db->ofetchAll('SELECT dressed_slot FROM inventory WHERE dressed_slot != 0 AND item_type = ? AND owner_id = ?', [$this->item_type, $this->owner_id]);
|
||||
$wearedCount = $db->ofetch('select count(dressed_slot) as c from inventory where dressed_slot !=0 and item_type = ? and owner_id = ?', [$this->item_type, $this->owner_id]);
|
||||
// Если в слоте есть предмет(ы), забиваем их массив одетых в слот предметов.
|
||||
if ($wearedCount) {
|
||||
foreach ($weared as $item) {
|
||||
$itemInSlot[] = $item->dressed_slot;
|
||||
}
|
||||
}
|
||||
if (in_array($this->item_type, [
|
||||
self::ITEM_TYPE_HELMET, self::ITEM_TYPE_ARMOR, self::ITEM_TYPE_LEGS, self::ITEM_TYPE_BOOTS,
|
||||
self::ITEM_TYPE_GLOVES, self::ITEM_TYPE_WEAPON, self::ITEM_TYPE_SHIELD, self::ITEM_TYPE_BELT,
|
||||
self::ITEM_TYPE_AMULET,
|
||||
])) {
|
||||
//работаем с нормальными слотами
|
||||
if ($wearedCount->c == 1) {
|
||||
//если слот занят, снимаем старый предмет и одеваем новый предмет
|
||||
DBPDO::INIT()->execute('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = ? AND owner_id = ?', [$itemInSlot[0], $this->owner_id]);
|
||||
DBPDO::INIT()->execute('UPDATE inventory SET dressed_slot = item_type WHERE item_id = ? AND owner_id = ?', [$this->item_id, $this->owner_id]);
|
||||
} elseif (!$wearedCount->c) {
|
||||
//если слот пуст, одеваем новый предмет
|
||||
DBPDO::INIT()->execute('UPDATE inventory SET dressed_slot = item_type WHERE item_id = ? AND owner_id = ?', [$this->item_id, $this->owner_id]);
|
||||
} else {
|
||||
/* проверка на переполнение слотов */
|
||||
$error = self::TOO_MANY_ITEMS_IN_SLOTS;
|
||||
DressedItems::undressAllItems($this->owner_id);
|
||||
}
|
||||
} elseif ($this->item_type == self::ITEM_TYPE_RING) {
|
||||
// работаем с кольцами
|
||||
if ($wearedCount->c < 3) {
|
||||
// Сравниваем массив колец и массив слотов для колец.
|
||||
$emptyRingSlots = array_diff([9, 10, 11], $itemInSlot);
|
||||
// Сортируем массив свободных слотов по возрастанию.
|
||||
sort($emptyRingSlots);
|
||||
// Одеваем предмет в первый свободный слот.
|
||||
DBPDO::INIT()->execute('update inventory set dressed_slot = ? where item_id = ?', [$emptyRingSlots[0], $this->item_id]);
|
||||
} elseif ($wearedCount->c == 3) {
|
||||
// Cнимаем предмет из последнего слота 11 и одеваем новый предмет
|
||||
DBPDO::INIT()->execute('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = 11');
|
||||
DBPDO::INIT()->execute('UPDATE inventory SET dressed_slot = 11 WHERE item_id = ?', $this->item_id);
|
||||
} else {
|
||||
/* проверка на переполнение слотов */
|
||||
$error = self::TOO_MANY_ITEMS_IN_SLOTS;
|
||||
DressedItems::undressAllItems($this->owner_id);
|
||||
}
|
||||
} else {
|
||||
$error = self::UNKNOWN_ITEM_TYPE;
|
||||
}
|
||||
|
||||
return isset($error) ? $error : true;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user