'Кастеты,ножи',
2 => 'Топоры',
3 => 'Дубины,булавы',
4 => 'Мечи',
5 => 'Магические посохи',
6 => 'Сапоги',
7 => 'Перчатки',
8 => 'Рубахи',
9 => 'Легкая броня',
10 => 'Тяжелая броня',
11 => 'Шлемы',
12 => 'Наручи',
13 => 'Пояса',
14 => 'Поножи',
15 => 'Щиты',
16 => 'Серьги',
17 => 'Ожерелья',
18 => 'Кольца',
19 => 'Заклинания: нейтральные',
20 => 'Заклинания: боевые и защитные',
21 => 'Заклинания: карманные',
22 => 'Заклинания: исцеляющие',
23 => 'Заклинания: манящие',
24 => 'Заклинания: стратегические',
25 => 'Заклинания: тактические',
26 => 'Заклинания: сервисные',
27 => 'Амуниция',
28 => 'Эликсиры',
29 => 'Еда',
30 => 'Подарки',
31 => 'Подарки: недобрые',
32 => 'Подарки: упаковка',
33 => 'Подарки: открытки',
34 => 'Подарки: фейерверки',
35 => 'Усиление оружия: Заточки',
36 => 'Плащи и Накидки:',
37 => 'Готовые Комплекты:',
];
public const OTDEL_GROUP_NAME = [
1 => 'Оружие',
6 => 'Одежда',
15 => 'Щиты',
16 => 'Ювелирные товары',
19 => 'Заклинания',
27 => 'Амуниция',
28 => 'Эликсиры',
30 => 'Подарки',
35 => 'Прочее',
];
private int $shopId;
private array $wares;
private int $otdel;
private int $itemId;
private $buyer;
public function __construct(int $shopId, int $otdel = 1)
{
$this->otdel = $otdel;
$this->itemId = intval($_GET['itmid']);
$this->shopId = $shopId;
$this->wares = Db::getRows('select * from
items_shop
left join items_main on items_shop.item_id = items_main.id
where sid = ? and r = ? and kolvo > 0 order by pos', [$shopId, $otdel]);
$this->buyer = new class {
public function getId(): int
{
return User::start()->info['id'];
}
public function getCredits(): float
{
return User::start()->info['money'];
}
public function getEuroCredits(): float
{
return User::start()->info['money2'];
}
public function getVoinstvennost(): int
{
return (int)User::start()->rep['rep3'] - (int)User::start()->rep['rep3_buy'];
}
public function getNextAct()
{
return User::start()->info['nextAct']; // что ты такое?!
}
public function isAdmin(): bool
{
return User::start()->isAdmin();
}
public function hasEnough(string $parameter, int $value): bool
{
return User::start()->stats[$parameter] >= $value;
}
public function hasExactly(string $parameter, int $value): bool
{
return User::start()->stats[$parameter] === $value;
}
public function hasEnoughCredits(int $itemprice): bool
{
return $this->getCredits() >= $itemprice;
}
public function hasEnoughEuroCredits(int $itemprice): bool
{
return $this->getEuroCredits() >= $itemprice;
}
public function hasEnoughVoinstvennost(int $itemprice): bool
{
return $this->getVoinstvennost() >= $itemprice;
}
};
if ($this->buyer->isAdmin()) {
if (isset($_GET['itmup'])) {
$this->itemUp();
} elseif (isset($_GET['itmdown'])) {
$this->itemDown();
}
}
if ($_SERVER["REQUEST_METHOD"] === "GET") {
if ($_GET['itmup']) {
$this->itemUp();
}
}
}
private function itemUp()
{
$this->changeItemPositionByInt(-1);
}
private function changeItemPositionByInt(int $modificator)
{
Db::sql('update items_shop set pos = pos + ? where sid = ? and r = ? and item_id = ? and kolvo > 0',
[$modificator, $this->shopId, $this->otdel, $this->itemId]);
}
private function itemDown()
{
$this->changeItemPositionByInt(1);
}
public function printWares()
{
foreach ($this->wares as $pl) {
$data = new DataModel($pl['item_id']);
$itemRequirements = new Requirements($data->getRequirements());
$itemBonuses = new Bonuses($data->getBonuses());
$itemProperties = new Properties($data->getProperties());
$itemData = $data->getAll();
$pl['price_1'] = $this->calculateMinimalPrice($pl['price1'], $pl['price_1'], $pl['tr_items']);
$pl['price_2'] = $this->calculateMinimalPrice($pl['price2'], $pl['price_2'], $pl['tr_items']);
if (($pl['type'] >= 18 && $pl['type'] <= 24) || $pl['type'] == 26 || $pl['type'] == 27) {
$itemBonuses->addZonb();
}
$is2 = $this->name($pl['name'], $pl['renameadd'], $pl['item_id']);
if ($pl['massa'] > 0) {
$is2 .= '(Масса: ' . round($pl['massa'], 2) . ')';
}
$is2 .= $this->icons($itemRequirements->getAlign(), $itemData['art'], $itemData['sudba']);
$is2 .= $this->price($pl['price_1'], $pl['price_2'], $pl['price_4']);
if ($pl['kolvo'] < 50) {
$is2 .= ' (остаток на складе: ' . $pl['kolvo'] . ')';
}
$is2 .= $this->needItems($pl['tr_items']);
//долговечность
if ($pl['iznos'] > 0) {
$pl['iznosMAXi'] = $pl['iznos'];
}
if ($pl['iznosMAXi'] > 0 && $pl['iznosMAXi'] !== 999999999) {
$is2 .= 'Долговечность: 0/' . $pl['iznosMAXi'] . '
';
}
if ($itemData['battleUseZd'] > 0) {
$is2 .= 'Задержка использования: ' . ConversionHelper::secondsToTimeout($itemData['battleUseZd']) . '
';
}
$is2 = rtrim($is2, '
');
//Срок годности предмета
if ($itemData['srok'] > 0) {
$pl['srok'] = $itemData['srok'];
}
if ($pl['srok'] > 0) {
$is2 .= '
Срок годности: ' . ConversionHelper::secondsToTimeout($pl['srok']);
}
if ($pl['magic_chance'] > 0) {
$is2 .= '
Вероятность срабатывания: ' . min([$pl['magic_chance'], 100]) . '%';
}
//Продолжительность действия магии:
if ((int)$pl['magic_inci'] > 0) {
$magicDuration = Db::getValue('select actiontime from eff_main where id2 = ?', [(int)$pl['magic_inci']]);
if ($magicDuration > 0) {
$is2 .= '
Продолжительность действия: ' . ConversionHelper::secondsToTimeout($magicDuration);
}
}
if ($itemRequirements->get()) {
$is2 .= '
Требуется минимальное:';
$is2 .= '
';
foreach ($itemRequirements->get() as $dataName => $dataInfo) {
if ($dataName === 'align' || $dataName === 'sex') {
$is2 .= $this->buyer->hasExactly($dataName, intval($dataInfo['value'])) ? '- ' : '
- ';
} else {
$is2 .= $this->buyer->hasEnough($dataName, intval($dataInfo['value'])) ? '
- ' : '
- ';
}
$is2 .= $dataInfo['name'] . ': ' . $dataInfo['value'];
$is2 .= '
';
}
$is2 .= '
';
}
if ($itemBonuses->get()) {
$is2 .= '
Действует на:';
$is2 .= '';
foreach ($itemBonuses->get() as $name => $value) {
if ($name === 'Броня') {
$is2 .= '- ' . $name . ': ' . $value . '
';
continue;
}
$color = $value > 0 ? 'darkgreen' : 'darkred';
$is2 .= '- ' . $name . ': ' . ($value > 0 ? '+' . $value : $value) . '
';
}
$is2 .= '
';
}
$is2 .= '
Свойства предмета:';
foreach ($itemProperties->get() as $name => $value) {
$is2 .= '
' . $name . ': ' . $value;
}
if ($pl['2too'] === 1) {
$is2 .= '
Второе оружие';
}
if ($pl['2h'] === 1) {
$is2 .= '
Двуручное оружие';
}
if (!empty($itemData['imposed'])) {
if (empty($itemData['imposed_name'])) {
$itemData['imposed_name'] = 'Неизвестное зачарование';
}
$itemData['imposed_name'] = str_replace('Чары ', '', $itemData['imposed_name']);
$is2 .= '
Зачарование: ' . $itemData['imposed_name'];
}
if (!empty($itemData['free_stats']) && $itemData['free_stats'] > 0) {
$is2 .= '
+' . $itemData['free_stats'] . ' дополнительных характеристик';
}
//Встроенная магия
if (!empty($pl['magic_inci']) || !empty($pl['magic_inc'])) {
if (empty($pl['magic_inc'])) {
$pl['magic_inc'] = $pl['magic_inci'];
}
$magic = Db::getRow('select id2, mname, minfo, img from eff_main where type1 = 12345 and id2 = ?', [$pl['magic_inc']]);
if ($magic['id2']) {
$is2 .= '
Встроено заклятие
' . $magic['minfo'] . '
';
}
}
$is2 .= $this->getcomplect($itemData['complect']);
if ($pl['max_text'] - $pl['use_text'] > 0) {
$is2 .= 'Количество символов: ' . ($pl['max_text'] - $pl['use_text']) . '
';
}
$is2 .= '';
if (!empty($itemData['gravi'])) {
$is2 .= '
' . $itemData['gravi'] . '';
}
if (!empty($itemData['info'])) {
$pl['info'] .= '
' . $itemData['info'];
}
if (!empty($pl['info'])) {
$is2 .= '' . $pl['info'] . '
';
}
if (isset($itemData['noremont'])) {
$is2 .= 'Предмет не подлежит ремонту
';
}
if (isset($itemData['nosale'])) {
$is2 .= 'Предмет нельзя продать
';
}
if (isset($itemData['nomodif'])) {
$is2 .= 'Предмет нельзя улучшать
';
}
if (isset($itemData['nodelete'])) {
$is2 .= 'Предмет нельзя выбросить
';
}
if (isset($itemData['sleep_moroz']) && $itemData['sleep_moroz'] > 0) {
$is2 .= 'Предмет не портится во время сна
';
}
$is2 .= '';
$is1 = $this->imageAndControls($pl['id'], $pl['type'], $pl['img'], $pl['name'], $pl['price_1'], $pl['price_2']);
echo <<$is1
{$this->adminOptions($pl['id'], $pl['pos'])} $is2
HTML;
}
if (empty($this->wares)) {
echo 'Прилавок магазина пуст.
';
}
}
private function calculateMinimalPrice($basePrice, $shopPrice, $needItems)
{
if ($shopPrice < 0.01 && !$needItems) {
$shopPrice = $basePrice;
}
if ($shopPrice < 0) {
$shopPrice = 0;
}
return $shopPrice;
}
private function name(string $name, ?string $defaultName, int $itemid): string
{
$styleSuffix = '';
if ($this->shopId == self::SHOP_2) {
$styleSuffix = 'WL';
}
if (!empty($defaultName)) {
$name .= ' (Предмет: ' . $defaultName . ')';
}
if (!empty($styleSuffix)) {
$name = '' . $name . ' ' . $styleSuffix . ' ';
}
return '' . $name . ' ';
}
private function icons(?int $align, ?int $artefact, ?int $destiny): string
{
$str = ' ';
if (!empty($align)) {
$str .= '';
}
if (!empty($artefact)) {
$str .= '';
}
$str .= $this->destiny($destiny);
return $str;
}
private function destiny($d): string
{
if (empty($d)) {
return '';
}
if ($d == 0) {
$str = 'первым, кто наденет его';
} elseif ($d == 1) {
$str = 'первым, кто возьмёт его';
} else {
$str = $d;
}
return '';
}
private function price(int $credits, int $eurocredits, int $voinstvennost): string
{
$result = 'Цена: ';
if ($this->shopId === self::SHOP_2) {
$result .= $this->printColoredValue($this->buyer->getVoinstvennost() >= $voinstvennost, $voinstvennost);
$result .= ' Воинственности ';
} elseif ($this->shopId === self::BEREZKA || $this->shopId === self::ARTEFACTS) {
$result .= '';
$result .= $this->printColoredValue($this->buyer->getEuroCredits() >= $eurocredits, $eurocredits);
$result .= ' екр. ';
} else {
$result .= $this->printColoredValue($this->buyer->getCredits() >= $credits, $credits);
$result .= ' кр.';
}
return '
' . $result . ' ';
}
/**
* Если в первом параметре передаётся false, строка во втором параметре красится в красный цвет.
* @param bool $check
* @param $value
* @return string
*/
private function printColoredValue(bool $check, $value): string
{
$color = $check ? 'inherit' : 'red';
return sprintf('%s', $color, $value);
}
private function needItems(string $items): string
{
if (!$items || Config::get('noitembuy')) {
return '';
}
$result = '';
$trn = true;
$itemsArray = explode(',', $items);
foreach ($itemsArray as $keyvalue) {
[$key, $value] = explode('=', $keyvalue);
if (!empty($key) && !empty($value)) {
$neededItemName = Db::getValue('select name from items_main where id = ?', [$key]);
if ($neededItemName) {
$neededItemsInInventoryCount = Db::getValue(
'select count(*) from items_users where item_id = ? and inShop = 0 and inOdet = 0 and `delete` in (0,1000) and uid = ?',
[$key, $this->buyer->getId()]);
if ($neededItemsInInventoryCount < (int)$value) {
$trn = false;
}
$result .= '[' . $neededItemName . '] x' . $value . ', ';
}
}
}
return $this->printColoredValue($trn, '
Требует предмет: ' . rtrim($result, ', ') . ' ') . '
';
}
private function getcomplect(?int $complect): string
{
if (!isset($complect)) {
return '';
}
$cname = 'Неизвестный Комплект';
$text = '';
$stmt = Db::getRows('select * from complects where com = ? order by x', [$complect]);
foreach ($stmt as $row) {
$cname = $row['name'];
$text .= ' • ' . $row['x'] . ' предметов:
';
//действие комплекта
$complectBonuses = new Bonuses(ConversionHelper::dataStringToArray($row['data']));
foreach ($complectBonuses->get() as $name => $value) {
$text .= ' ';
if ($name === 'Броня') {
$text .= $name . ': ' . $value;
} else {
$text .= $name . ': ' . ($value > 0 ? '+' . $value : $value);
}
$text .= '
';
}
}
return "
Часть комплекта: $cname
$text";
}
private function imageAndControls(int $id, int $type, string $image, string $name, float $credits, float $eurocredits): string
{
if ($type == 71) {
$result = '
';
} else {
$result = '
';
}
if ($this->shopId == self::SHOP_2) {
$result .= 'купить';
} elseif (($this->shopId == self::BEREZKA || $this->shopId == self::ARTEFACTS) && $this->buyer->hasEnoughEuroCredits($eurocredits)) {
$result .= 'купить';
} elseif ($this->buyer->hasEnoughCredits($credits)) {
$result .= 'купить';
}
return $result;
}
private function adminOptions(int $itemId, int $itemPosition): string
{
if (!$this->buyer->isAdmin()) {
return '';
}
$time = microtime();
return <<
↿
$itemPosition
⇂
HTML;
}
public function buy(int $itemid): string
{
$sql = 'select sid, items_shop.price_1, name from items_shop left join items_main on item_id = id where item_id = ? and sid = ?';
$item = Db::getRow($sql, [$itemid, $this->shopId]);
if (!$this->buyer->hasEnoughCredits($item['price_1'])) {
return 'Покупка не удалась.';
}
$newId = User\ItemsModel::addItem($itemid, $this->buyer->getId());
Db::sql('update items_users set `1price` = ? where id = ?', [$item['price_1'], $newId]);
User::start()->info['money'] -= $item['price_1'];
User::start()->addKr(-$item['price_1']);
Delo::add(1, "shopid:{$item['sid']}", $this->buyer->getId(), "Покупка «{$item['name']}» по цене {$item['price_1']}.", $item['price_1']);
return "Вы купили «{$item['name']}» по цене {$item['price_1']}.";
}
public function buyEkr(int $itemid): string
{
$sql = 'select sid, items_shop.price_2, name from items_shop left join items_main on item_id = id where item_id = ? and sid = ?';
$item = Db::getRow($sql, [$itemid, $this->shopId]);
if (!$this->buyer->hasEnoughEuroCredits($item['price_2'])) {
return 'Покупка не удалась.';
}
$newId = User\ItemsModel::addItem($itemid, $this->buyer->getId());
Db::sql('update items_users set `2price` = ? where id = ?', [$item['price_2'], $newId]);
User::start()->info['money2'] -= $item['price_2'];
User::start()->addEkr(-$item['price_2']);
Delo::add(1, "shopid:{$item['sid']}", $this->buyer->getId(), "Покупка «{$item['name']}» по цене {$item['price_2']}.", $item['price_2']);
return "Вы купили «{$item['name']}» по цене {$item['price_2']}.";
}
public function buyVn(int $itemid): string
{
$sql = 'select sid, items_shop.price_4, name from items_shop left join items_main on item_id = id where item_id = ? and sid = ?';
$item = Db::getRow($sql, [$itemid, $this->shopId]);
if (!$this->buyer->hasEnoughVoinstvennost($item['price_4'])) {
return 'Покупка не удалась.';
}
$newId = User\ItemsModel::addItem($itemid, $this->buyer->getId());
Db::sql('update items_users set `4price` = ? where id = ?', [$item['price_4'], $newId]);
User::start()->rep['rep3'] -= $item['price_4'];
User::start()->addVoinstvennost(-$item['price_4']);
Delo::add(1, "shopid:{$item['sid']}", $this->buyer->getId(), "Покупка «{$item['name']}» по цене {$item['price_4']}.", $item['price_4']);
return "Вы купили «{$item['name']}» по цене {$item['price_4']}.";
}
public function getUsedOtdels(): array
{
$result = [];
$o = Db::getColumn('select r from items_shop where sid = ? group by r', [$this->shopId]);
foreach ($o as $v) {
$result[$v] = self::OTDEL_NAME[$v];
}
return $result;
}
public function getUserWallet(): string
{
$result = '';
if ($this->shopId === self::MAIN) {
$result = $this->buyer->getCredits() . ' кр.';
} elseif (in_array($this->shopId, [self::BEREZKA, self::ARTEFACTS])) {
$result = $this->buyer->getEuroCredits() . ' екр.';
} elseif ($this->shopId === self::SHOP_2) {
$result = $this->buyer->getVoinstvennost() . ' воинственности.';
}
return $result;
}
}