diff --git a/classes/Battles/InventoryItem.php b/classes/Battles/InventoryItem.php index 9e5d193..6548988 100644 --- a/classes/Battles/InventoryItem.php +++ b/classes/Battles/InventoryItem.php @@ -1,15 +1,25 @@ 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; + } } \ No newline at end of file diff --git a/main.php b/main.php index f74d294..0602c58 100644 --- a/main.php +++ b/main.php @@ -1,5 +1,6 @@ undressItem($drop); + unset($items); } //Пока что одеваем предмет отсюда. if ($dress) { - echo dressitem($dress); + $dressing = new InventoryItem(DBPDO::INIT()->ofetch('select * from inventory where item_id = ? ', $dress)); + $dressing->dressItem(); + unset($dressing); } if ($destruct) { $q = db::c()->query('SELECT `id`, `dressed`, `name`, `duration`, `maxdur` FROM `inventory` WHERE `owner` = ?i AND `id` = ?i', $_SESSION['uid'], $destruct); @@ -82,7 +86,7 @@ if ($edit) { // Подготавливаем отображение инфы и предметов. $userInfo = new UserInfo($user->getId()); $userStats = new UserStats($user->getId()); -$data = \Battles\Database\DBPDO::INIT()->ofetchAll('SELECT * FROM inventory WHERE owner_id = ? AND dressed_slot = 0 AND on_sale = 0', $user->getId()); +$data = DBPDO::INIT()->ofetchAll('SELECT * FROM inventory WHERE owner_id = ? AND dressed_slot = 0 AND on_sale = 0', $user->getId()); $iteminfo = []; foreach ($data as $row) { $iteminfo[] = new InventoryItem($row); @@ -134,96 +138,6 @@ function del_efs($id, $type) } } -// одеть предмет -function dressitem($id) -{ - define('HELMET', 1); - define('ARMOR', 2); - define('LEGS', 3); - define('BOOTS', 4); - define('GLOVES', 5); - define('WEAPON', 6); - define('SHIELD', 7); - define('BELT', 8); - define('RING', 9); - define('AMULET', 10); - define('DRESSITEM_ERROR', [ - 'TOO_MANY_ITEMS_IN_SLOTS' => 'Критическая ошибка: Переполнение слота!', - 'UNKNOWN_ITEM_TYPE' => 'Неизвестный тип предмета!', - 'ITEM_NOT_FOUND' => 'Предмет не найден!', - 'REQUIREMENTS_NOT_MET' => 'Персонаж не соответствует требованиям!', - ]); - $userStats = new UserStats($_SESSION['uid']); - $itemInSlot = []; - $selectedItemRow = db::c()->query('SELECT item_type,need_strength,need_dexterity,need_intuition,need_endurance,need_intelligence,need_wisdom FROM `inventory` WHERE item_id = ?i AND owner_id = ?i AND `dressed_slot` = 0 AND `durability` != 0', $id, $_SESSION['uid']); - - //$userStats->getStrength() - if (!$selectedItemRow->getNumRows()) { - //с предметом что-то сильно не ок, ошибка. - $error = DRESSITEM_ERROR['ITEM_NOT_FOUND']; - } else { - $selectedItem = $selectedItemRow->fetch_object(); - if ($selectedItem->need_strength > $userStats->getFullStats()->strength - || $selectedItem->need_dexterity > $userStats->getFullStats()->dexterity - || $selectedItem->need_intuition > $userStats->getFullStats()->intuition - || $selectedItem->need_endurance > $userStats->getFullStats()->endurance - || $selectedItem->need_intelligence > $userStats->getFullStats()->intelligence - || $selectedItem->need_wisdom > $userStats->getFullStats()->wisdom) { - $error = DRESSITEM_ERROR['REQUIREMENTS_NOT_MET']; - } else { - $itemInSlotRow = db::c()->query('SELECT dressed_slot FROM inventory WHERE owner_id = ?i AND dressed_slot > 0 AND item_type = ?i', $_SESSION['uid'], $selectedItem->item_type); - $itemInSlotQuantity = $itemInSlotRow->getNumRows(); - if ($itemInSlotQuantity) { - while ($row = $itemInSlotRow->fetch_object()) { - $itemInSlot[] = $row->dressed_slot; - } - } - if (in_array($selectedItem->item_type, [HELMET, ARMOR, LEGS, BOOTS, GLOVES, WEAPON, SHIELD, BELT, AMULET])) { - //работаем с нормальными слотами - if (!$itemInSlotQuantity) { - // просто одеваем предмет - db::c()->query('UPDATE inventory SET dressed_slot = item_type WHERE item_id = ?i', $id); - } elseif ($itemInSlotQuantity == 1) { - // снимаем предмет и одеваем вместо - db::c()->query('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = ?i', $itemInSlot[0]); - db::c()->query('UPDATE inventory SET dressed_slot = item_type WHERE item_id = ?i', $id); - } else { - // невозможная ситуация - два предмета в одиночном слоте. критическая ошибка, запись в лог, раздевание. - $error = DRESSITEM_ERROR['TOO_MANY_ITEMS_IN_SLOTS']; - db::c()->query('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot BETWEEN 1 AND 12 AND owner_id = ?i', $_SESSION['uid']); - } - } elseif ($selectedItem->item_type == RING) { - // работаем с кольцами - if ($itemInSlotQuantity < 3) { - // Сравниваем массив колец и массив слотов для колец. - $emptyRingSlots = array_diff([9, 10, 11], $itemInSlot); - // Сортируем массив свободных слотов по возрастанию. - sort($emptyRingSlots); - // Одеваем предмет в первый свободный слот. - db::c()->query('UPDATE inventory SET dressed_slot = ?i WHERE item_id = ?i', $emptyRingSlots[0], $id); - } elseif ($itemInSlotQuantity == 3) { - db::c()->query('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = 11'); - db::c()->query('UPDATE inventory SET dressed_slot = 11 WHERE item_id = ?i', $id); - // снимаем предмет из слота 11 и одеваем вместо - } else { - // невозможная ситуация - больше трёх предметов на три слота. критическая ошибка, запись в лог, раздевание. - $error = DRESSITEM_ERROR['TOO_MANY_ITEMS_IN_SLOTS']; - db::c()->query('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot BETWEEN 1 AND 12 AND owner_id = ?i', $_SESSION['uid']); - } - } else { - //предмет вообще не должен одеваться, ошибка - $error = DRESSITEM_ERROR['UNKNOWN_ITEM_TYPE']; - } - } - } - - if (isset($error)) { - return $error; - } else { - return null; - } -} - // Входим и выходим если можем. if ($goto) { $imove = true;