battles/classes/Battles/InventoryItem.php

167 lines
7.0 KiB
PHP
Raw Normal View History

2019-01-11 21:57:15 +00:00
<?php
namespace Battles;
use Battles\Models\Inventory;
2019-01-11 21:57:15 +00:00
class InventoryItem extends Item
{
private ?string $present;
private int $owner_id;
private const TOO_MANY_ITEMS_IN_SLOTS = 'Критическая ошибка: Переполнение слота!';
private const UNKNOWN_ITEM_TYPE = 'Неизвестный тип предмета!';
private const REQUIREMENTS_NOT_MET = 'Персонаж не соответствует требованиям!';
2019-01-12 09:47:23 +00:00
/**
* InventoryItem constructor.
*
* @param $row
*/
2019-01-12 09:47:23 +00:00
public function __construct($row)
{
parent::__construct($row);
$this->owner_id = $row->owner_id;
$this->present = $row->present;
2019-01-12 09:47:23 +00:00
}
2019-01-11 21:57:15 +00:00
public function printInfo()
{
echo $this->getAllInfo();
if ($this->present) {
echo "<p style='color: maroon; font-style: italic'>Это подарок от $this->present. Вы не можете передать его кому-либо ещё.</p>";
}
2019-01-11 21:57:15 +00:00
}
2019-01-11 22:18:18 +00:00
public function printImage()
{
if (in_array($this->item_type, range(1, 12))) {
echo <<<HTML
<a href=/main.php?edit=1&dress=$this->item_id title='Надеть'>
<img src="/i/sh/$this->image" class="item-wrap-normal" alt="">
</a>
HTML;
} else {
echo <<<IMG
<img src="/i/sh/$this->image" class="item-wrap-normal" alt="">
IMG;
2019-01-11 22:30:12 +00:00
}
2019-01-11 22:18:18 +00:00
}
public function printControls()
{
// Для кнопок управления под картинкой.
}
private function dressStatsChecks(): bool
{
$checkStats = new UserStats($this->owner_id);
$stat = $checkStats->getFullStats();
return $this->need_strength > $stat->strength
|| $this->need_dexterity > $stat->dexterity
|| $this->need_intuition > $stat->intuition
|| $this->need_endurance > $stat->endurance
|| $this->need_intelligence > $stat->intelligence
|| $this->need_wisdom > $stat->wisdom;
}
/**
* Одевание предмета из инвентаря в слот.
* @return bool|string
*/
public function dressItem()
{
$itemInSlot = [];
if ($this->dressStatsChecks()) {
return self::REQUIREMENTS_NOT_MET;
}
// считаем сколько ОДЕТЫХ предметов в слоте в который мы хотим одеть предмет. 1=просто вещь 1-3=шашни с кольцами
// Count добавленный в первый запрос возвращает одну строку в любом случае.
// fetch возвращает одну строку в любом случае.
$weared = Inventory::getDressed($this->item_type, $this->owner_id);
$wearedCount = Inventory::countDressed($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) {
//если слот занят, снимаем старый предмет и одеваем новый предмет
Inventory::undressOne($itemInSlot[0], $this->owner_id);
Inventory::dressOne($this->item_id, $this->owner_id);
} elseif (!$wearedCount->c) {
//если слот пуст, одеваем новый предмет
Inventory::dressOne($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);
// Одеваем предмет в первый свободный слот.
Inventory::dressOneToSlot($this->item_id, $emptyRingSlots[0]);
} elseif ($wearedCount->c == 3) {
// Cнимаем предмет из последнего слота 11 и одеваем новый предмет
Inventory::changeRings($this->item_id);
} else {
/* проверка на переполнение слотов */
$error = self::TOO_MANY_ITEMS_IN_SLOTS;
DressedItems::undressAllItems($this->owner_id);
}
} else {
$error = self::UNKNOWN_ITEM_TYPE;
}
return $error ?? true;
}
// Выбрасываем вещь.
public function drop(): string
{
if (empty($this->item_id)) {
return 'Ошибка: предмет не найден!';
}
if (Inventory::isWeared($this->item_id)) {
return 'Ошибка: нельзя выбросить одетый предмет!';
}
Inventory::destroyItem($this->item_id, $this->owner_id);
GameLogs::addUserLog(User::getInstance()->getId(), User::getInstance()->getLogin() . ' выбросил предмет ' . $this->name . ' id:(cap' . $this->item_id . ')');
return 'Предмет ' . $this->name . ' выброшен.';
}
/** Снятие всех предметов, которые не подходят по статам. */
public static function autoDrop()
{
$DI = new DressedItems(User::getInstance()->getId());
foreach ($DI->getItemsInSlots() as $dressedItem)
{
$ITM = new self($dressedItem);
if (!$ITM->dressStatsChecks()) {
$DI->undressItem($dressedItem->dressed_slot);
}
}
}
/** Надеюсь, временная заглушка, которая объединяет get_meshok() и другую выдачу одной строкой.
* @return string
*/
public static function getWeightData(): string
{
$all = Inventory::getWeight(User::getInstance()->getId());
$max = User::getInstance()->stats()->getMaxWeight();
$css = $all > $max ? ' style="color:maroon;"' : '';
return "<span$css>$all / $max</span>";
}
2019-01-11 21:57:15 +00:00
}