From d2c8c8d7d5ef30d90a8e9c009fb60385c0bd0e11 Mon Sep 17 00:00:00 2001 From: lopar Date: Mon, 30 Aug 2021 01:34:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=20shop=20=D1=83=D0=B5=D1=85=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=20=D0=B2=D1=81=D0=B5=20=D0=B7=D0=B0=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=81=D1=8B=20=D0=B2=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81.?= =?UTF-8?q?=20=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BE=D0=BD=20=D1=82?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=BE=D1=82=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=B6=D0=B0=D0=B5=D1=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- classes/{ => Battles}/Database/battles.sql | 0 classes/Battles/InventoryItem.php | 16 +- classes/Battles/Item.php | 64 +++--- classes/Battles/ShopItem.php | 49 ++--- config.php | 5 + shop.php | 223 ++++----------------- user_abilities.php | 8 +- 7 files changed, 115 insertions(+), 250 deletions(-) rename classes/{ => Battles}/Database/battles.sql (100%) diff --git a/classes/Database/battles.sql b/classes/Battles/Database/battles.sql similarity index 100% rename from classes/Database/battles.sql rename to classes/Battles/Database/battles.sql diff --git a/classes/Battles/InventoryItem.php b/classes/Battles/InventoryItem.php index 7c31570..ccf715b 100644 --- a/classes/Battles/InventoryItem.php +++ b/classes/Battles/InventoryItem.php @@ -27,7 +27,7 @@ class InventoryItem extends Item public function printInfo() { - parent::printAllInfo(); + echo $this->getAllInfo(); if ($this->present) { echo "

Это подарок от $this->present. Вы не можете передать его кому-либо ещё.

"; } @@ -48,9 +48,8 @@ IMG; } } - public function printControls() - { - /* Тут будут кнопки под картинкой. */ + public function printControls(){ + // Для кнопок управления под картинкой. } private function dressStatsChecks(): ?string @@ -130,14 +129,9 @@ IMG; return $error ?? true; } - /** - * @param $itemId - * - * @return bool - */ - public static function destroyItem($itemId): bool + public static function destroyItem($itemId) { - return DBPDO::INIT()->execute('delete from inventory where dressed_slot = 0 and owner_id = ? and item_id = ?', [$_SESSION['uid'], $itemId]); + DBPDO::INIT()->execute('delete from inventory where dressed_slot = 0 and owner_id = ? and item_id = ?', [$_SESSION['uid'], $itemId]); } /** Надеюсь, временная заглушка, которая объединяет get_meshok() и другую выдачу одной строкой. diff --git a/classes/Battles/Item.php b/classes/Battles/Item.php index d1f3ec5..1f17327 100644 --- a/classes/Battles/Item.php +++ b/classes/Battles/Item.php @@ -102,6 +102,14 @@ class Item $this->typename = 'Хлам'; } + $this->item_cost = $this->calculateItemCost(); + } + + /** Рассчёт стоимости предмета в зависимости от его характеристик. + * @return int + */ + private function calculateItemCost(): int + { $sum_stats = $this->add_strength + $this->add_dexterity + @@ -121,8 +129,7 @@ class Item $mods_cost_modifier = 2 + floor($sum_mods / 50); $damage_cost_modifier = 1 + floor($sum_damage / 100); $result = intval($sum_stats * $stats_cost_modifier + $sum_mods * $mods_cost_modifier + $sum_damage * $damage_cost_modifier); - - $this->item_cost = $result < 1 ? 1 : $result; + return $result < 1 ? 1 : $result; } protected function wrap(int $number): string @@ -134,50 +141,51 @@ class Item } } - protected function printAllInfo() + public function getAllInfo(): string { $needsLines = [ - "сила" => $this->need_strength, - "ловкость" => $this->need_dexterity, - "интуиция" => $this->need_intuition, - "выносливость" => $this->need_endurance, - "интеллект" => $this->need_intelligence, - "мудрость" => $this->need_wisdom, + 'сила' => $this->need_strength, + 'ловкость' => $this->need_dexterity, + 'интуиция' => $this->need_intuition, + 'выносливость' => $this->need_endurance, + 'интеллект' => $this->need_intelligence, + 'мудрость' => $this->need_wisdom, ]; $addsLines = [ - "Сила" => $this->add_strength, - "Ловкость" => $this->add_dexterity, - "Интуиция" => $this->add_intuition, - "Выносливость" => $this->add_endurance, - "Интеллект" => $this->add_intelligence, - "Мудрость" => $this->add_wisdom, - "Точность" => $this->add_accuracy, - "Увёртливость" => $this->add_evasion, - "Шанс крита" => $this->add_criticals, + 'Сила' => $this->add_strength, + 'Ловкость' => $this->add_dexterity, + 'Интуиция' => $this->add_intuition, + 'Выносливость' => $this->add_endurance, + 'Интеллект' => $this->add_intelligence, + 'Мудрость' => $this->add_wisdom, + 'Точность' => $this->add_accuracy, + 'Увёртливость' => $this->add_evasion, + 'Шанс крита' => $this->add_criticals, ]; - echo "$this->name (Масса: $this->weight)"; - echo "
Стоимость: " . $this->item_cost; - echo "
Долговечность: " . $this->durability; - echo "
$this->typename
"; + $str = "$this->name (Масса: $this->weight)"; + $str .= '
Стоимость: ' . $this->item_cost; + $str .= '
Долговечность: ' . $this->durability; + $str .= "
$this->typename
"; foreach ($needsLines as $stat => $value) { if ($value > 0) { - echo "
Требуется $stat" . $this->wrap($value); + $str .= "
Требуется $stat" . $this->wrap($value); } } foreach ($addsLines as $stat => $value) { if ($value) { - echo "
$stat" . $this->wrap($value); + $str .= "
$stat" . $this->wrap($value); } } if ($this->add_min_physical_damage && !$this->add_max_physical_damage) { - $damage = $this->add_min_physical_damage . " - " . $this->add_min_physical_damage; + $damage = $this->add_min_physical_damage . ' - ' . $this->add_min_physical_damage; } elseif (!$this->add_min_physical_damage && $this->add_max_physical_damage) { - $damage = $this->add_max_physical_damage . " - " . $this->add_max_physical_damage; + $damage = $this->add_max_physical_damage . ' - ' . $this->add_max_physical_damage; } elseif ($this->add_min_physical_damage && $this->add_max_physical_damage) { - $damage = $this->add_min_physical_damage . " - " . $this->add_max_physical_damage; + $damage = $this->add_min_physical_damage . ' - ' . $this->add_max_physical_damage; } if (isset($damage)) { - echo "
Урон: " . $damage; + $str .= '
Урон: ' . $damage; } + return $str; } } \ No newline at end of file diff --git a/classes/Battles/ShopItem.php b/classes/Battles/ShopItem.php index b8b7e8b..9c9c137 100644 --- a/classes/Battles/ShopItem.php +++ b/classes/Battles/ShopItem.php @@ -49,6 +49,7 @@ SQL; private $optype; private ?int $shop_item_quantity; private ?int $price; + public static string $status = ''; public function __construct($row, $operationType = null) { @@ -61,11 +62,12 @@ SQL; $this->item_id = $row->item_id ?? $row->id; } - public function printInfo() + public function printInfo(): string { - $this->printAllInfo(); + //$this->printAllInfo(); + $str = $this->getAllInfo(); if ($this->optype === 'buyshop' && $this->shop_item_quantity > 0 && $this->shop_item_quantity < 20) { - echo "
На складе осталось $this->shop_item_quantity единиц товара!
"; + $str .= "
На складе осталось $this->shop_item_quantity единиц товара!
"; } if ($this->optype === 'sellshop') { if ($this->getSellPriceMean() < 50) { @@ -79,36 +81,37 @@ SQL; } else { $goods = 'это превосходное изделие'; } - echo "
В среднем за $goods можно выручить {$this->getSellPriceMean()} кр.
"; + $str .= "
В среднем за $goods можно выручить {$this->getSellPriceMean()} кр.
"; } + return $str; } - public function printImage() + public function printImage(): string { if (!$this->image) { $this->image = 'noitem.png'; } - echo ""; + return ""; } //todo наличка после покупки отображается с задержкой. - public static function buyItem($id, User $buyer): string + public static function buyItem($id, User $buyer) { $db = new DBPDO(); $check = $db->ofetch("select * from trade_offers where shop_item_id = ?", $id); if (empty($check->shop_item_quantity) || empty($check->shop_item_id)) { - return self::NO_ITEMS_IN_STOCK; + self::$status = self::NO_ITEMS_IN_STOCK; } // TODO БАРТЕР! if (isset($check->barter_item_list_json)) { - echo "Работаем по бартеру!"; + self::$status = "Работаем по бартеру!"; } $db->execute(self::BUY_QUERY, [$buyer->getId(), $check->shop_item_id]); $item = $db->ofetch("select item_id, name, price from inventory where item_id = ?", $db->lastInsertId()); if (empty($item->item_id) || empty($item->name)) { - return 'Запрос в базу не прошёл.'; + self::$status = 'Запрос в базу не прошёл.'; } else { $user = new User($_SESSION['uid']); // Если не хватает налички, снимаем с банка с комиссией. @@ -117,14 +120,12 @@ SQL; $bank = new Bank($buyer->getId()); $bank->withdrawMoney($item->price); } catch (GameException $e) { - echo 'Банковская ошибка!'; - return self::NO_MONEY; + self::$status = 'Банковская ошибка! ' . self::NO_MONEY; } } else { $user->setMoney($user->getMoney() - $item->price); $user->saveMoney(); } - } if ($check->shop_item_quantity != -1) { @@ -133,10 +134,10 @@ SQL; $deloText = $buyer->getLogin() . " купил товар «" . $item->name . "» id:(" . $item->item_id . ") в магазине за " . $item->price . "."; GameLogs::addUserLog($buyer->getId(), $deloText); - return "Предмет " . $item->name . " куплен за " . $item->price . "."; + self::$status = "Предмет " . $item->name . " куплен за " . $item->price . "."; } - public static function sellItem($id, User $seller, $bankTrade = 0): string + public static function sellItem($id, User $seller, $bankTrade = 0) { $db = new DBPDO(); $item = $db->ofetch('select * from inventory where item_id = ?', $id); @@ -154,11 +155,10 @@ SQL; $deloText = "{$seller->getLogin()} продал товар «{$sellingItemName}» id:($id) в магазине за $sellingPrice кр."; GameLogs::addUserLog($seller->getId(), $deloText); if ($sellingPrice == 0) { - $status = "После длительных и изнурительных торгов вы плюнули на всё и просто подарили ваш «{$sellingItemName}» торговцу."; + self::$status = "После длительных и изнурительных торгов вы плюнули на всё и просто подарили ваш «{$sellingItemName}» торговцу."; } else { - $status = "Вы продали «{$sellingItemName}» за $sellingPrice кр."; + self::$status = "Вы продали «{$sellingItemName}» за $sellingPrice кр."; } - return $status; } /** Подчсчёт средней суммы продажи. @@ -177,18 +177,19 @@ SQL; /** * Для кнопок управления под картинкой предмета в зависимости от ситуации. */ - public function printControls() + public function printControls(): string { - if (in_array($this->optype, ['setmarket', 'unsetmarket', 'buymarket', 'sellshop', 'buyshop',])) { - $str = $this->optype == 'setmarket' ? '' : ''; - $button_name = self::BUTTON[$this->optype]; - echo <<
optype, ['setmarket', 'unsetmarket', 'buymarket', 'sellshop', 'buyshop',])) { + return ''; + } + $str = $this->optype == 'setmarket' ? '' : ''; + $button_name = self::BUTTON[$this->optype]; + return <<$str
FORM; - } } /** diff --git a/config.php b/config.php index d846875..e818988 100644 --- a/config.php +++ b/config.php @@ -9,6 +9,11 @@ use Battles\Database\DBPDO; use Battles\User; +include_once 'classes/Database/db.php'; +include_once 'classes/Database/Mysql.php'; +include_once 'classes/Database/Statement.php'; +include_once 'classes/Database/Exception.php'; + ini_set('display_errors', 'On'); error_reporting(E_ALL); const GAMEDOMAIN = "battles.lan"; diff --git a/shop.php b/shop.php index e79161f..4be9463 100644 --- a/shop.php +++ b/shop.php @@ -1,220 +1,75 @@ categoryType = $_GET['otdel']; + } else { + Shop::$current->categoryType = -1; + } +} if (!empty($_POST['sellshop'])) { - $status = ShopItem::sellItem($_POST['itemId'], User::$current, 1); + ShopItem::sellItem($_POST['itemId'], User::$current, 1); } if (!empty($_POST['buyshop'])) { - $status = ShopItem::buyItem($_POST['itemId'], User::$current); -} - -$bank = new Bank(User::$current->getId()); - -switch ($shopCategoryTypeNumber) { - default: - $shopCategoryType = "Все товары"; - break; - case Item::ITEM_TYPE_HELMET: - $shopCategoryType = "Шлемы"; - break; - case Item::ITEM_TYPE_ARMOR: - $shopCategoryType = "Броня"; - break; - case Item::ITEM_TYPE_LEGS: - $shopCategoryType = "Поножи"; - break; - case Item::ITEM_TYPE_BOOTS: - $shopCategoryType = "Сапоги"; - break; - case Item::ITEM_TYPE_GLOVES: - $shopCategoryType = "Перчатки"; - break; - case Item::ITEM_TYPE_WEAPON: - $shopCategoryType = "Оружие"; - break; - case Item::ITEM_TYPE_SHIELD: - $shopCategoryType = "Щиты"; - break; - case Item::ITEM_TYPE_BELT: - $shopCategoryType = "Пояса"; - break; - case Item::ITEM_TYPE_RING: - $shopCategoryType = "Кольца"; - break; - case Item::ITEM_TYPE_AMULET: - $shopCategoryType = "Амулеты"; - break; - case Item::ITEM_TYPE_CONSUMABLE: - $shopCategoryType = "Расходники"; - break; - case Item::ITEM_TYPE_OTHER: - $shopCategoryType = "Разное"; - break; - case 'sale': - $shopCategoryType = "Предметы в инвентаре"; - $saleItems = true; - break; -} -// MUST BE ARRAY! -$iteminfo = []; -if (!$saleItems) { - $shopItems = DBPDO::$db->ofetchAll("select * from items inner join trade_offers on id = shop_item_id where shop_id = 1 and shop_item_quantity !=0"); - foreach ($shopItems as $shopItemObject) { - $iteminfo[] = new ShopItem($shopItemObject, 'buyshop'); - } -} else { - $inventoryItems = DBPDO::$db->ofetchall("select * from inventory where on_sale = 0 and dressed_slot = 0 and durability > 0 and owner_id = ?", $user->getId()); - foreach ($inventoryItems as $inventoryItemObject) { - $iteminfo[] = new ShopItem($inventoryItemObject, 'sellshop'); - } + ShopItem::buyItem($_POST['itemId'], User::$current); } Template::header('Магазин'); ?> + -

Государственный магазин

← выйти на Центральную площадь -
+
-

- +

getCategoryName() ?>

+ categoryType === -1): ?>
Вы можете продать ваши предметы за сущие копейки.
- getItemType() != $shopCategoryTypeNumber && $shopCategoryTypeNumber != 'sale') { - continue; - } - echo "
"; - $ii->printImage(); - $ii->printControls(); - echo ""; - $ii->printInfo(); - } - ?> + getItemsList() ?>
- - Масса всех вещей:
- Деньги: getMoney() ?> [Б:getMoney() ?>]. -
+
+ + Масса всех вещей:
+ Деньги: getMoney() ?>. +
+

Отделы магазина
- Оружие - Шлемы - Броня - Поножи - Сапоги - Перчатки - Щиты - Пояса - Кольца - Амулеты - Расходники - Разное + Оружие + Шлемы + Броня + Поножи + Сапоги + Перчатки + Щиты + Пояса + Кольца + Амулеты + Расходники + Разное Все товары Продать вещи
+
+ Если у вас не хватит денег на покупку, деньги будут автоматически сняты с вашего банковского + счёта + с вычетом банковской комиссии за услуги. +
\ No newline at end of file diff --git a/user_abilities.php b/user_abilities.php index 26210ce..c3916c0 100644 --- a/user_abilities.php +++ b/user_abilities.php @@ -6,17 +6,19 @@ * One file to rule 'em all! */ +use Battles\Database\DBPDO; use Battles\Template; +use Battles\User; require_once 'functions.php'; if (!empty($_GET['teleport']) && $user->getAdmin() == 1) { - db::c()->query('UPDATE `users`,`online` SET `users`.`room` = 20,`online`.`room` = 20 WHERE `online`.`id` = `users`.`id` AND `online`.`id` = ?i', $_SESSION['uid']); + DBPDO::$db->execute('update users, online set users.room = 20, online.room = 20 where user_id = id and user_id = ?', User::$current->getId()); } # ORDEN PHP -$_POST['use'] = $_POST['use'] ?? null; +$_POST['use'] ??= null; if ($user->getAdmin()) { - $abil = db::c()->query('SELECT 1 FROM users WHERE id = ?i', $user->getId())->fetch_assoc(); + $abil = DBPDO::$db->fetch('SELECT 1 FROM users WHERE id = ?i', $user->getId()); //$abil = unserialize($abil['abil']); switch ($_POST['use']) { case "healing":