'Сдать в магазин', 'buymarket' => 'Купить с рук', 'sellshop' => 'Продать', 'buyshop' => 'Купить', ]; private const BUY_QUERY = <<optype = $operationType; } $this->price = $row->price ?? null; $this->shop_item_quantity = $row->shop_item_quantity ?? null; $this->item_id = $row->item_id ?? $row->id; if ($operationType === 'buyshop' || $operationType === 'buymarket') { $this->offerId = $row->offer_id ?? 0; // Ид позиции в магазине. $this->jsonBarterList = $row->barter_items_list_json ?? null; } if ($operationType === 'buymarket') { $this->ownerId = $row->owner_id; } } public function printInfo(): string { $str = $this->getAllInfo(); if ($this->optype === 'buyshop') { $str .= $this->getLowItemQuantityNote(); $str .= $this->getBarterList(); } if ($this->optype === 'sellshop') { $str .= $this->getTextBasedOnPrice(); } if ($this->optype === 'buymarket') { $str .= $this->getBarterList(); $str .= '

Продавец: ' . Nick::id($this->ownerId)->full(1); } return $str; } private function getBarterList(): string { if (!$this->jsonBarterList) { return ''; } $str = '

Помимо денег требуются следующие товары:'; foreach (json_decode($this->jsonBarterList) as $item) { $str .= '
↣ ' . Item::getItemById($item->item_id)->name . ', ' . $item->quantity . ' шт.'; } $str .= '
'; return $str; } private function getLowItemQuantityNote(): string { if ($this->shop_item_quantity < 1 || $this->shop_item_quantity > 19) { return ''; } return "
На складе осталось $this->shop_item_quantity единиц товара!
"; } private function getTextBasedOnPrice(): string { if ($this->getSellPriceMean() < 50) { $goods = 'этот хлам'; } elseif ($this->getSellPriceMean() < 100) { $goods = 'этот посредственный товар'; } elseif ($this->getSellPriceMean() < 500) { $goods = 'этот неплохой предмет'; } elseif ($this->getSellPriceMean() < 1000) { $goods = 'эту отличную штуку'; } else { $goods = 'это превосходное изделие'; } return "
В среднем за $goods можно выручить {$this->getSellPriceMean()} кр.
"; } public function printImage(): string { if (!$this->image) { $this->image = 'noitem.png'; } return ""; } public static function buyItem($id, User $buyer) { $check = DBPDO::$db->ofetch("select * from trade_offers where offer_id = ?", $id); $item = new Item(DBPDO::$db->fetch('select * from items where id = ?', $check->shop_item_id)); $price = $item->calculateItemCost(); if ( !self::checkAndRemoveBarteredItems($check->barter_items_list_json, $buyer->getId()) || !self::checkAndPayTheBills($price, $buyer) || !self::checkAndChangeRemainingItems($check->shop_item_quantity, $check->shop_item_id) ) { return; } DBPDO::$db->execute(self::BUY_QUERY, [$buyer->getId(), $check->shop_item_id]); $deloText = $buyer->getLogin() . " купил товар «" . $item->name . "» id:(" . $check->shop_item_id . ") в магазине за " . $price . "."; GameLogs::addUserLog($buyer->getId(), $deloText); self::$status = "Предмет " . $item->name . " куплен за " . $price . "."; } private static function checkAndRemoveBarteredItems(?string $json_list, int $user_id): bool { if (empty($json_list)) { return true; } $allowItemRemove = true; foreach (json_decode($json_list) as $item) { $row = DBPDO::$db->ofetch('select sum(1) as s from inventory where name = ? and owner_id = ?', [Item::getItemById($item->item_id)->name, $user_id]); if ($row->s < $item->quantity) { $allowItemRemove = false; } } if (!$allowItemRemove) { self::$status = self::NO_BARTER_ITEMS; return false; } foreach (json_decode($json_list) as $item) { $query = 'delete from inventory where name = ? and owner_id = ? limit ' . (int)$item->quantity; // У-у-у, сука! https://phpdelusions.net/pdo#limit DBPDO::$db->execute($query, [Item::getItemById($item->item_id)->name, $user_id]); } return true; } private static function checkAndPayTheBills(int $price, User $user): bool { if ($user->getMoney() > $price) { $user->setMoney($user->getMoney() - $price); $user->saveMoney(); return true; } try { $bank = new Bank($user->getId()); $bank->withdrawMoney($price); return true; } catch (GameException $e) { self::$status = 'Банковская ошибка! ' . self::NO_MONEY; return false; } } private static function checkAndChangeRemainingItems(int $current_quantity, $item_id): bool { if (empty($current_quantity)) { self::$status = self::NO_ITEMS_IN_STOCK; return false; } if ($current_quantity === -1) { return true; } DBPDO::$db->execute("update trade_offers set shop_item_quantity = shop_item_quantity -1 where shop_item_quantity != -1 and shop_item_id = ? ", $item_id); return true; } public static function sellItem($id, User $seller, $bankTrade = 0) { $db = new DBPDO(); $item = $db->ofetch('select * from inventory where item_id = ?', $id); $sellingItemName = $item->name; // Продажа за цену от нуля до половины стоимости. $sellingPrice = $item->price > 1 ? mt_rand(0, $item->price / 2) : mt_rand(0, 1); $db->execute('delete from inventory where item_id = ?', $id); if ($bankTrade) { $bank = new Bank($seller->getId()); $bank->setMoney($bank->getMoney() + $sellingPrice); Bank::setBankMoney($bank->getMoney(), $seller->getId(), 'sellShop'); } else { $db->execute('update users set money = money - ? where id = ?', [$sellingPrice, $_SESSION['uid']]); } $deloText = "{$seller->getLogin()} продал товар «{$sellingItemName}» id:($id) в магазине за $sellingPrice кр."; GameLogs::addUserLog($seller->getId(), $deloText); if ($sellingPrice == 0) { self::$status = "После длительных и изнурительных торгов вы плюнули на всё и просто подарили ваш «{$sellingItemName}» торговцу."; } else { self::$status = "Вы продали «{$sellingItemName}» за $sellingPrice кр."; } } /** Подчсчёт средней суммы продажи. * @return int */ private function getSellPriceMean(): ?int { if ($this->price > 1) { $arr = range(0, $this->price / 2); return array_sum($arr) / count($arr); } else { return $this->price == 1 ? 1 : null; } } /** * Для кнопок управления под картинкой предмета в зависимости от ситуации. */ public function printControls(): string { if (!in_array($this->optype, ['setmarket', 'buymarket', 'sellshop', 'buyshop',])) { return ''; } $str = $this->optype == 'setmarket' ? '' : ''; $hiddenValue = $this->optype === 'buyshop' ? $this->offerId : $this->item_id; $button_name = self::BUTTON[$this->optype]; return <<
$str
FORM; } /** * @return int */ public function getItemType(): int { return $this->item_type; } /** Выдача магазинных предметов по запросу. * Ввелась чтобы перебить takeshopitem() в functions с идентичным функционалом. * @param int $item_id ИД предмета. * @param int $to ИД пперсонажа-получателя. */ public static function giveNewItem(int $item_id, int $to): array { $check = DBPDO::$db->ofetch('select 1 from items where id = ?', $item_id); if (!$check) { return []; } DBPDO::$db->execute(self::BUY_QUERY, [$to, $item_id]); $return = DBPDO::$db->ofetch('select image, name from inventory where item_id = ?', DBPDO::$db->lastInsertId()); return [ 'img' => $return->image, 'name' => $return->name, 'id' => $item_id, ]; } }