dev #41
@ -1,15 +1,25 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Battles;
|
namespace Battles;
|
||||||
|
|
||||||
|
use Battles\Database\DBPDO;
|
||||||
|
|
||||||
class InventoryItem extends Item
|
class InventoryItem extends Item
|
||||||
{
|
{
|
||||||
private $present;
|
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)
|
public function __construct($row)
|
||||||
{
|
{
|
||||||
parent::__construct($row);
|
parent::__construct($row);
|
||||||
if (isset($row['present'])) {
|
$this->owner_id = $row->owner_id;
|
||||||
$this->present = $row['present'];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function printInfo()
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
98
main.php
98
main.php
@ -1,5 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use Battles\Database\DBPDO;
|
||||||
use Battles\DressedItems;
|
use Battles\DressedItems;
|
||||||
use Battles\GameLogs;
|
use Battles\GameLogs;
|
||||||
use Battles\InventoryItem;
|
use Battles\InventoryItem;
|
||||||
@ -50,10 +51,13 @@ if ($edit) {
|
|||||||
if ($drop) {
|
if ($drop) {
|
||||||
$items = new DressedItems($_SESSION['uid']);
|
$items = new DressedItems($_SESSION['uid']);
|
||||||
$items->undressItem($drop);
|
$items->undressItem($drop);
|
||||||
|
unset($items);
|
||||||
}
|
}
|
||||||
//Пока что одеваем предмет отсюда.
|
//Пока что одеваем предмет отсюда.
|
||||||
if ($dress) {
|
if ($dress) {
|
||||||
echo dressitem($dress);
|
$dressing = new InventoryItem(DBPDO::INIT()->ofetch('select * from inventory where item_id = ? ', $dress));
|
||||||
|
$dressing->dressItem();
|
||||||
|
unset($dressing);
|
||||||
}
|
}
|
||||||
if ($destruct) {
|
if ($destruct) {
|
||||||
$q = db::c()->query('SELECT `id`, `dressed`, `name`, `duration`, `maxdur` FROM `inventory` WHERE `owner` = ?i AND `id` = ?i', $_SESSION['uid'], $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());
|
$userInfo = new UserInfo($user->getId());
|
||||||
$userStats = new UserStats($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 = [];
|
$iteminfo = [];
|
||||||
foreach ($data as $row) {
|
foreach ($data as $row) {
|
||||||
$iteminfo[] = new InventoryItem($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) {
|
if ($goto) {
|
||||||
$imove = true;
|
$imove = true;
|
||||||
|
Loading…
Reference in New Issue
Block a user