This commit is contained in:
Ivor Barhansky 2023-11-09 19:24:47 +02:00
parent 1645f58a63
commit fc17eada24
19 changed files with 1255 additions and 953 deletions

486
AI.php Normal file
View File

@ -0,0 +1,486 @@
<?php
use Core\Db;
use Helper\Conversion;
use Item\Data\Bonuses;
use Item\Data\Properties;
use Item\Data\Requirements;
use Model\Constant\ShopOtdel;
ini_set('xdebug.var_display_max_depth', 10);
ini_set('xdebug.var_display_max_children', 256);
ini_set('xdebug.var_display_max_data', 1024);
if (!defined('GAME_VERSION')) {
require_once '_incl_data/autoload.php';
}
//const GAME = true;
$user = User::start();
//var_dump($user->info['testStats'], $user->info['testStats2']);
//exit();
$im = Db::getColumn("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'items_main'");
$iu = Db::getColumn("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'items_users'");
$u = Db::getColumn("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users'");
$s = Db::getColumn("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'stats'");
$p = Db::getRows('select * from const_stats');
var_dump((new ShopOtdel())->getGroups());
?>
<div style="display: grid; grid-template-columns: 50% 50%; word-wrap: break-word;">
<div>
<b><u>$user->[info]</u></b><br>
<?php
$rr = 1;
foreach ($user->info as $k => $v) {
if (isset($user->is[$k])) {
$k .= " <span style='background-color: lightcyan;'>[{$user->is[$k]}]</span>";
}
if ($k == 'stats') {
echo 'stats = ARRAY<br>';
foreach (Conversion::dataStringToArray($v) as $dk => $dv) {
if (isset($user->is[$dk])) {
$dk .= " <span style='background-color: lightcyan;'>[{$user->is[$dk]}]</span>";
}
echo "<span style='background-color: #99FFCC; margin-left: 5px;'>$dk = $dv</span><br>";
}
$k = '';
$v = '';
}
echo "$rr. $k = $v<br>";
$rr++;
}
?>
</div>
<div>
<b><u>$user->[stats]</u></b><br>
<?php
$rr = 1;
foreach ($user->stats as $k => $v) {
if (isset($user->is[$k])) {
$k .= " <span style='background-color: lightcyan;'>[{$user->is[$k]}]";
} else {
$k = "<span>$k";
}
echo "$rr. $k</span> = $v<br>";
$rr++;
if (is_array($v)) {
foreach ($v as $k2 => $v2) {
echo "<span style='background-color: #99FFCC; margin-left: 5px;'>$k2 = $v2</span><br>";
if (is_array($v2)) {
foreach ($v2 as $k3 => $v3) {
echo "<span style='background-color: aliceblue; margin-left: 10px;'>$k3 = $v3</span><br>";
if ($k3 === 'data' && $v3 !== '[]') {
$v3 .= '|add_mib2=43';
$itemData = Conversion::dataStringToArray($v3);
echo 'DATA TR_<br>';
foreach ((new Requirements($itemData))->get() as $k => $v) {
echo "$k = $v<br>";
}
echo 'DATA ADD_<br>';
foreach ((new Bonuses($itemData))->get() as $k => $v) {
echo "$k = $v<br>";
}
}
}
}
}
}
}
?>
</div>
</div>
<hr>
Совпадения по параметрам $user->info и $user->stats. Возможно, это ничего не значит, а может и дублирование.<br><br>
<?php
$i = 1;
$i2 = 1;
foreach ($user->info as $a => $b) {
if (isset($user->stats[$a])) {
echo "$i. info = stats: $a = $b<br>";
$i++;
}
}
echo '<br>';
foreach ($user->stats as $a2 => $b2) {
if (isset($user->info[$a2])) {
echo "$i2. stats = info: $a2 = $b2<br>";
$i2++;
}
}
?>
<br>
<div style="display: grid; grid-template-columns: auto auto;">
<div> Поля в базе users
<?php var_dump($u); ?>
</div>
<div> Поля в базе stats
<?php var_dump($s); ?>
</div>
</div>
<div style="margin-top: 10px; background-color: aliceblue">Отдельно, уже согласованные параметры предметов, которые могут находиться исключительно в поле data</div>
<div style="display: grid; grid-template-columns: auto auto auto; background-color: aliceblue">
<div> sv_* (хотим убрать)
<?php var_dump(Properties::$names); ?>
</div>
</div>
<div style="display: grid; grid-template-columns: auto auto;">
<div> Поля в базе items_main
<?php var_dump($im); ?>
</div>
<div> Поля в базе items_users
<?php var_dump($iu); ?>
</div>
</div>
<hr>
<hr> Параметры игрока.<br><br>
<div style="display: grid; grid-template-columns: auto auto auto;">
<div> Заскриптованные
<?php var_dump($user->is); ?>
</div>
<div> Хотим оставить
</div>
<div> Хотим убрать
</div>
</div>
<hr> Все возможные поля в $user->stats. Некоторые имена полей генерируются динамически на лету, поэтому соответствия имени нет. А каких-то, возможно просто не существует.<br><br>
<?php
$st['clanpos'] = 0;
$st['levels'] = 0;
$st['levels'] = 0;
$st['id'] = 0;
$st['login'] = 0;
$st['lvl'] = 0;
$st['hpNow'] = 0;
$st['hpAll'] = 0;
$st['mpNow'] = 0;
$st['mpAll'] = 0;
$st['zona'] = 0;
$st['zonb'] = 0;
$st['items'] = 0;
$st['effects'] = 0;
$st['reting'] = 0;
$st['vip'] = 0;
$st['items_img'] = 0;
$st['reting'] = 0;
$st['wp'] = 0;
$st['items'] = 0;
$st['reting'] = 0;
$st['art'] = 0;
$st['maks_itm'] = 0;
$st['zonb'] = 0;
$st['zona'] = 0;
$st['a'] = 0;
$st['mg'] = 0;
$st['s'] = 0;
$st['effects'] = 0;
$st['puti'] = 0;
$st['slvtm'] = 0;
$st['act'] = 0;
$st['noeffectbattle1'] = 0;
$st['items_img'] = 0;
$st['set_pog'] = 0;
$st['set_pog2'] = 0;
$st['act'] = 0;
$st['effects'] = 0;
$st['raztac'] = 0;
$st['set_natoe'] = 0;
$st['act'] = 0;
$st['hpAll'] = 0;
$st['s4'] = 0;
$st['mpAll'] = 0;
$st['m1'] = 0;
$st['s3'] = 0;
$st['m2'] = 0;
$st['s6'] = 0;
$st['s3'] = 0;
$st['m4'] = 0;
$st['s2'] = 0;
$st['m5'] = 0;
$st['za'] = 0;
$st['s4'] = 0;
$st['zm'] = 0;
$st['zaproc'] = 0;
$st['s5'] = 0;
$st['m19'] = 0;
$st['s3'] = 0;
$st['antm3'] = 0;
$st['s5'] = 0;
$st['m10'] = 0;
$st['m11'] = 0;
$st['m11a'] = 0;
$st['m8'] = 0;
$st['zona'] = 0;
$st['zonb'] = 0;
$st['pm'] = 0;
$st['a'] = 0;
$st['mg'] = 0;
$st['zm'] = 0;
$st['s5'] = 0;
$st['pm'] = 0;
$st['s5'] = 0;
$st['m11a'] = 0;
$st['pm'] = 0;
$st['a'] = 0;
$st['aall'] = 0;
$st['m2all'] = 0;
$st['mg'] = 0;
$st['m2all'] = 0;
$st['zm'] = 0;
$st['zma'] = 0;
$st['mib'] = 0;
$st['mab'] = 0;
$st['mg'] = 0;
$st['pm'] = 0;
$st['pa'] = 0;
$st['za'] = 0;
$st['mall'] = 0;
$st['mg'] = 0;
$st['mall'] = 0;
$st['m11'] = 0;
$st['pm'] = 0;
$st['m11'] = 0;
$st['m10'] = 0;
$st['pa'] = 0;
$st['m10'] = 0;
$st['za'] = 0;
$st['za'] = 0;
$st['za'] = 0;
$st['yzm'] = 0;
$st['yzma'] = 0;
$st['yza'] = 0;
$st['za'] = 0;
$st['hpVinos'] = 0;
$st['hpAll'] = 0;
$st['s4'] = 0;
$st['mpAll'] = 0;
$st['mpVinos'] = 0;
$st['s6'] = 0;
$st['hpProc'] = 0;
$st['hpAll'] = 0;
$st['mpProc'] = 0;
$st['hpNow'] = 0;
$st['hpAll'] = 0;
$st['hpNow'] = 0;
$st['hpAll'] = 0;
$st['mpNow'] = 0;
$st['mpAll'] = 0;
$st['mpNow'] = 0;
$st['mpAll'] = 0;
$st['zona'] = 0;
$st['zonb'] = 0;
$st['ozash'] = 0;
$st['ozmsh'] = 0;
$st['weapon1'] = 0;
$st['weapon2'] = 0;
$st['sheld1'] = 0;
$st['sv_'] = 0;
$st['sv_i'] = 0;
$st['dom'] = 0;
$st['prsu'] = 0;
$st['x'] = 0;
$st['y'] = 0;
$st['s'] = 0;
$st['reting'] = 0;
$st['reting'] = 0;
$st['maxves'] = 0;
$st['speed_dungeon'] = 0;
$st['speedhp'] = 0;
$st['exp'] = 0;
$st['reting'] = 0;
$st['reting'] = 0;
$st['btl_cof'] = 0;
$st['prckr'] = 0;
$st['btl_cof'] = 0;
$st['prckr'] = 0;
$st['btl_cof'] = 0;
$st['prckr'] = 0;
$st['prckr'] = 0;
$st['id'] = 0;
$st['hpAll'] = 0;
$st['hpAll'] = 0;
$st['mpAll'] = 0;
$st['mpAll'] = 0;
$st['this_animal'] = 0;
$st['this_animal'] = 0;
$st['hpAll'] = 0;
$st['mpAll'] = 0;
$st['hpAll'] = 0;
$st['mpAll'] = 0;
$st['add_'] = 0;
$st['add_'] = 0;
$st['add_'] = 0;
$st['s1'] = 0;
$st['s1'] = 0;
$st['m2'] = 0;
$st['s1'] = 0;
$st['s1'] = 0;
$st['pa2'] = 0;
$st['m2'] = 0;
$st['s1'] = 0;
$st['s1'] = 0;
$st['pa2'] = 0;
$st['m2'] = 0;
$st['s1'] = 0;
$st['s1'] = 0;
$st['pa2'] = 0;
$st['m7'] = 0;
$st['s1'] = 0;
$st['s1'] = 0;
$st['pa2'] = 0;
$st['m7'] = 0;
$st['s1'] = 0;
$st['pa2'] = 0;
$st['m7'] = 0;
$st['s2'] = 0;
$st['s2'] = 0;
$st['pa1'] = 0;
$st['m4'] = 0;
$st['s2'] = 0;
$st['s2'] = 0;
$st['pa1'] = 0;
$st['m2'] = 0;
$st['m4'] = 0;
$st['s2'] = 0;
$st['s2'] = 0;
$st['pa1'] = 0;
$st['m2'] = 0;
$st['m4'] = 0;
$st['m15'] = 0;
$st['s2'] = 0;
$st['s2'] = 0;
$st['pa1'] = 0;
$st['m2'] = 0;
$st['m4'] = 0;
$st['m15'] = 0;
$st['s2'] = 0;
$st['s2'] = 0;
$st['pa1'] = 0;
$st['m2'] = 0;
$st['m4'] = 0;
$st['m15'] = 0;
$st['s2'] = 0;
$st['pa1'] = 0;
$st['m2'] = 0;
$st['m4'] = 0;
$st['m15'] = 0;
$st['s3'] = 0;
$st['s3'] = 0;
$st['pa4'] = 0;
$st['m3'] = 0;
$st['m1'] = 0;
$st['s3'] = 0;
$st['s3'] = 0;
$st['pa4'] = 0;
$st['m3'] = 0;
$st['m1'] = 0;
$st['s3'] = 0;
$st['s3'] = 0;
$st['pa4'] = 0;
$st['m3'] = 0;
$st['m1'] = 0;
$st['m5'] = 0;
$st['s3'] = 0;
$st['s3'] = 0;
$st['pa4'] = 0;
$st['m3'] = 0;
$st['m1'] = 0;
$st['m5'] = 0;
$st['s3'] = 0;
$st['s3'] = 0;
$st['pa4'] = 0;
$st['m3'] = 0;
$st['m1'] = 0;
$st['m5'] = 0;
$st['m14'] = 0;
$st['m3'] = 0;
$st['m1'] = 0;
$st['m5'] = 0;
$st['m14'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['s4'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['s4'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['s4'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['m19'] = 0;
$st['s4'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['m19'] = 0;
$st['s4'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['za'] = 0;
$st['zm'] = 0;
$st['s4'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['za'] = 0;
$st['zm'] = 0;
$st['s4'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['za'] = 0;
$st['zm'] = 0;
$st['s4'] = 0;
$st['hpAll'] = 0;
$st['za'] = 0;
$st['zm'] = 0;
$st['s5'] = 0;
$st['m11'] = 0;
$st['pzm'] = 0;
$st['s6'] = 0;
$st['mpAll'] = 0;
$st['speedmp'] = 0;
$st['s6'] = 0;
$st['pzm'] = 0;
$st['m10'] = 0;
$stnames = [];
foreach ($st as $k => $v) {
if (isset($user->is[$k])) {
$v = $user->is[$k];
}
$stnames[$k] = $v;
}
var_dump($stnames);
echo "<h5>Текущая таблица параметров</h5>";
foreach ($p as $prow) {
echo "{$prow['sys_name']}{$prow['name']}";
if ($prow['is_percentage']) {
echo " (%)";
}
if ($prow['is_requirement']) {
echo " <span style='background-color: lightpink;'>[требуется]</span> ";
}
if ($prow['is_bonus']) {
echo " <span style='background-color: lightgreen;'>[даёт]</span> ";
}
echo "<br>";
}

View File

@ -1,3 +1,8 @@
<?php
use Enum\ShopId;
?>
<style>
.wares {
display: grid;
@ -39,8 +44,8 @@
У вас в наличии:
<?php elseif ($actionGifts): ?>
<strong>Отдел «Сделать подарки»</strong>
<?php elseif (isset($shop::OTDEL_NAME[$otdel])): ?>
<strong>Отдел «<?= $shop::OTDEL_NAME[$otdel] ?>»</strong>
<?php elseif ($shop->shopOtdel->getName($otdel)): ?>
<strong>Отдел «<?= $shop->shopOtdel->getName($otdel) ?>»</strong>
<?php endif; ?>
</td>
</tr>
@ -127,7 +132,7 @@
<td style="width: 280px; vertical-align: top;">
<div style="display: flex; align-items: flex-end; font-size: smaller; flex-direction: column; gap: 2px;">
<?= $goLis; ?>
<?php if ($shopId === $shop::MAIN): ?>
<?php if ($shopId === ShopId::MAIN): ?>
<button onclick="location.href='main.php?loc=1.180.0.9&rnd=<?= $code; ?>'">Центральная Площадь</button>
<button onclick="location.href='main.php?loc=1.180.0.368&rnd=<?= $code; ?>'">Подпольная лавка</button>
<button onclick="location.href='main.php?loc=1.180.0.13&rnd=<?= $code; ?>'">Магазин «Берёзка»</button>
@ -164,12 +169,12 @@
//$i = 1;
foreach ($otdels as $k => $v) {
$color = $otdel === $k ? '#C7C7C7' : '#e2e0e0';
if (in_array($k, array_keys($shop::OTDEL_GROUP_NAME))) {
if (in_array($k, array_keys($shop->shopOtdel->getGroups()))) {
if ($i !== 1) {
echo '<br>';
}
echo sprintf('<div style="background-color: #d5d5d5;"><img src="/i/shop_ico/%s.png" alt="%s"> <strong>%s</strong></div>',
$i, $shop::OTDEL_GROUP_NAME[$k], $shop::OTDEL_GROUP_NAME[$k]);
$i, $shop->shopOtdel->getGroups()[$k], $shop->shopOtdel->getGroups()[$k]);
$i++;
}
if ($k === 100) {

View File

@ -0,0 +1,35 @@
<?php
namespace Enum;
enum ShopId: int
{
case MAIN = 1;
case BEREZKA = 2;
case LUKA = 5; // ïåùåðà òûñÿ÷è ïðîêëÿòèé
case FLOWER = 6;
case BOOKS = 7;
case ANIMALS = 8; // ìàãàçèí íîâè÷êà
case TAVERN = 9; // íàêîâàëüíÿ
case IZLOM = 10;
case BLOOD_ALTAR = 11; //àëòàðü êðîâè
case TEMPLE = 14;
case MUSHROOMS = 17; // îáùèé ðûöàðñêèé
case REFERALS = 27;
case RULF_HRUNT = 33; // áåçäíà
case SHOP_KAT = 44; // ìàãàçèí ðóëüôà õðóíòà, à òû ÷òî òàêîå?
case LABORATORY = 45;
case NEWBIE = 106; // ïåùåðà ìãëû
case KNIGHTS_MAIN = 400; //ìàãàçèí ðåôåðàëîâ
case SHOP_PRIZ = 404; // êàìîðêà Ëóêè
case SHOP_2 = 609; // ìàãàçèí ãðèáîåäà??
case ANVIL = 700; // êàòàêîìáû
case ARTEFACTS = 777; //ìàãàçèí ñàìîöâåòîâ
case DUNGEON_BEZDNA = 801; // õðàì?!
case DUNGEON_PTP = 802; // èçëîì?!
case DUNGEON_CATACOMBS = 803; //ëàáîðàòîðèÿ?!?!
case DUNGEON_MISTY = 804;
case CRYSTALS = 1050;
}

View File

@ -0,0 +1,10 @@
<?php
namespace Enum;
enum StatFilterCellName: string
{
case Bonus = 'is_bonus';
case Requirement = 'is_requirement';
case Percentage = 'is_percentage';
}

View File

@ -1,228 +0,0 @@
<?php
use Helper\Conversion;
class Item
{
public static array $parameterName = [
'sex' => 'Пол',
'align' => 'Склонность',
'lvl' => 'Уровень',
'antm3' => 'Мф. против мощности крита',
'spasenie' => 'Спасение после смерти',
'exp' => 'Получаемый опыт (%)',
'gold' => 'Благодать Ангела',
'repair_discount' => 'Скидка на ремонт вещей',
'repair_z' => 'Бесплатное извлечение заточек',
'repair_r' => 'Бесплатное извлечение рун',
'speed_dungeon' => 'Скорость передвижения по подземельям',
's1' => 'Сила',
's2' => 'Ловкость',
's3' => 'Интуиция',
's4' => 'Выносливость',
's5' => 'Интеллект',
's6' => 'Мудрость',
's7' => 'Духовность',
'a1' => 'Мастерство владения ножами, кинжалами',
'a2' => 'Мастерство владения топорами, секирами',
'a3' => 'Мастерство владения дубинами, молотами',
'a4' => 'Мастерство владения мечами',
'a5' => 'Мастерство владения магическими посохами',
'aall' => 'Мастерство владения оружием',
'mg1' => 'Мастерство владения магией огня',
'mg2' => 'Мастерство владения магией воздуха',
'mg3' => 'Мастерство владения магией воды',
'mg4' => 'Мастерство владения магией земли',
'mg7' => 'Мастерство владения серой магией',
'mall' => 'Мастерство владения магией стихий',
'hpAll' => "Уровень жизни (HP)",
'mpAll' => "Уровень маны (МP)",
'pa1' => 'Мф. мощности колющего урона',
'pa2' => 'Мф. мощности рубящего урона',
'pa3' => 'Мф. мощности дробящего урона',
'pa4' => 'Мф. мощности режущего урона',
'pm1' => 'Мф. мощности магии огня',
'pm2' => 'Мф. мощности магии воздуха',
'pm3' => 'Мф. мощности магии воды',
'pm4' => 'Мф. мощности магии земли',
'zona' => 'Дополнительная зона атаки',
'zonb' => '???',
'speedhp' => 'Регенерация здоровья (%)',
'speedmp' => 'Регенерация маны (%)',
'za' => 'Защита от урона',
'zm' => 'Защита от магии стихий',
'magic_cast' => 'Дополнительный каст за ход',
'm1' => 'Мф. критического удара (%)',
'm2' => 'Мф. против критического удара (%)',
'm3' => 'Мф. мощности крит. удара (%)',
'm4' => 'Мф. увертывания (%)',
'm5' => 'Мф. против увертывания (%)',
'm6' => 'Мф. контрудара (%)',
'm7' => 'Мф. парирования (%)',
'm8' => 'Мф. блока щитом (%)',
'm9' => 'Мф. удара сквозь броню (%)',
'm10' => 'Мф. мощности урона',
'm11' => 'Мф. мощности магии стихий',
'm14' => 'Мф. абс. критического удара (%)',
'm15' => 'Мф. абс. увертывания (%)',
'm18' => 'Мф. абс. блока щитом (%)',
'mib1' => 'Броня головы минимум',
'mab1' => 'Броня головы максимум',
'mib2' => 'Броня груди и живота минимум',
'mab2' => 'Броня груди и живота максимум',
'mib3' => 'Броня пояса минимум',
'mab3' => 'Броня пояса максимум',
'mib4' => 'Броня ног минимум',
'mab4' => 'Броня ног максимум',
];
public static array $parameterNameDeprecated = [
'acestar' => 'Следующий каст будет критическим',
'more_awards' => 'Повышеная награда %',
'align_bs' => 'Служитель закона',
'nopryh' => 'Прямое поподание',
'puti' => 'Запрет перемещения',
'enAll' => 'Уровень энергии',
'm21' => 'Мф. абс. попадания (%)',
'm16' => 'Мф. абс. парирования (%)',
'm17' => 'Мф. абс. контрудара (%)',
'm19' => 'Мф. абс. магический промах (%)',
'm20' => 'Мф. удача (%)',
'a6' => 'Мастерство владения луками',
'a7' => 'Мастерство владения арбалетами',
'm2all' => 'Мастерство владения магией',
'mg5' => 'Мастерство владения магией Света',
'mg6' => 'Мастерство владения магией Тьмы',
'tj' => 'Тяжелая броня',
'lh' => 'Легкая броня',
'minAtack' => 'Минимальный урон',
'maxAtack' => 'Максимальный урон',
'm11a' => 'Мф. мощности магии',
'pm5' => 'Мф. мощности магии Света',
'pm6' => 'Мф. мощности магии Тьмы',
'zma' => 'Защита от магии',
'za1' => 'Защита от колющего урона',
'za2' => 'Защита от рубящего урона',
'za3' => 'Защита от дробящего урона',
'za4' => 'Защита от режущего урона',
'zm1' => 'Защита от магии огня',
'zm2' => 'Защита от магии воздуха',
'zm3' => 'Защита от магии воды',
'zm4' => 'Защита от магии земли',
'zm5' => 'Защита от магии Света',
'zm6' => 'Защита от магии Тьмы',
'zm7' => 'Защита от серой магии',
'pza' => 'Понижение защиты от урона',
'pzm' => 'Понижение защиты от магии',
'pza1' => 'Понижение защиты от колющего урона',
'min_heal_proc' => 'Эффект лечения (%)',
'notravma' => 'Защита от травм',
'yron_min' => 'Минимальный урон',
'yron_max' => 'Максимальный урон',
'zaproc' => 'Блокировка Физического Урона (%)',
'zmproc' => 'Блокировка Магического Урона (%)',
'zm2proc' => 'Защита от магии Воздуха (%)',
'pza2' => 'Понижение защиты от рубящего урона',
'pza3' => 'Понижение защиты от дробящего урона',
'pza4' => 'Понижение защиты от режущего урона',
'pzm1' => 'Понижение защиты от магии огня',
'pzm2' => 'Понижение защиты от магии воздуха',
'pzm3' => 'Понижение защиты от магии воды',
'pzm4' => 'Понижение защиты от магии земли',
'pzm5' => 'Понижение защиты от магии Света',
'pzm6' => 'Понижение защиты от магии Тьмы',
'pzm7' => 'Понижение защиты от серой магии',
'tya1' => 'Колющие атаки',
'tya2' => 'Рубящие атаки',
'tya3' => 'Дробящие атаки',
'tya4' => 'Режущие атаки',
'tym1' => 'Огненные атаки',
'mg2static_points' => 'Уровень заряда (Воздух)',
'tym2' => 'Электрические атаки',
'tym3' => 'Ледяные атаки',
'tym4' => 'Земляные атаки',
'hpProc' => 'Уровень жизни (%)',
'mpProc' => 'Уровень маны (%)',
'tym5' => 'Атаки Света',
'tym6' => 'Атаки Тьмы',
'tym7' => 'Серые атаки',
'min_use_mp' => 'Уменьшает расход маны',
'pog' => 'Поглощение урона',
'pog2' => 'Поглощение урона',
'pog2p' => 'Процент поглощение урона',
'pog2mp' => 'Цена поглощение урона',
'maxves' => 'Увеличивает рюкзак',
'bonusexp' => 'Увеличивает получаемый опыт',
'speeden' => 'Регенерация энергии (%)',
'yza' => 'Уязвимость физическому урона (%)',
'yzm' => 'Уязвимость магии стихий (%)',
'yzma' => 'Уязвимость магии (%)',
'yza1' => 'Уязвимость колющему урона (%)',
'yza2' => 'Уязвимость рубящему урона (%)',
'yza3' => 'Уязвимость дробящему урона (%)',
'yza4' => 'Уязвимость режущему урона (%)',
'yzm1' => 'Уязвимость магии огня (%)',
'yzm2' => 'Уязвимость магии воздуха (%)',
'yzm3' => 'Уязвимость магии воды (%)',
'yzm4' => 'Уязвимость магии земли (%)',
'yzm5' => 'Уязвимость магии (%)',
'yzm6' => 'Уязвимость магии (%)',
'yzm7' => 'Уязвимость магии (%)',
'rep' => 'Репутация Рыцаря',
'hpVinos' => 'Бонус жизни',
'bronze' => 'Bronze Premium Account',
'silvers' => 'Silver Premium Account',
];
public static function test(string $data)
{
$t = self::parseDataString($data);
$r = [];
$b = [];
foreach ($t['tr'] as $k => $v) {
if (isset(self::$parameterName[explode('_', $k)[1]])) {
$k = "($k) " . self::$parameterName[explode('_', $k)[1]];
}
$r[$k] = $v;
}
foreach ($t['add'] as $k2 => $v2) {
if (isset(self::$parameterName[explode('_', $k2)[1]])) {
$k2 = "($k2) " . self::$parameterName[explode('_', $k2)[1]];
}
$b[$k2] = $v2;
}
return ['tr' => $r, 'add' => $b,];
}
public static function parseDataString(string $data)
{
$a = Conversion::dataStringToArray($data);
$sex = ['Мужской', 'Женский'];
$requirements = [];
$bonuses = [];
foreach ($a as $k => $v) {
if (str_starts_with($k, 'tr_')) {
$requirements[$k] = $v;
}
if (str_starts_with($k, 'add_')) {
$bonuses[$k] = $v;
}
if (isset($requirements['tr_sex'])) {
$requirements['tr_sex'] = $sex[$requirements['tr_sex']];
}
}
return ['tr' => $requirements, 'add' => $bonuses,];
}
}

View File

@ -2,77 +2,23 @@
namespace Item\Data;
use Model\Constant\Stat;
class Bonuses
{
public static array $names = [
'hpAll' => 'Уровень жизни (HP)',
'mpAll' => 'Уровень маны',
's1' => 'Сила',
's2' => 'Ловкость',
's3' => 'Интуиция',
's4' => 'Выносливость',
's5' => 'Интелект',
's6' => 'Мудрость',
'm1' => 'Мф. критического удара (%)',
'm2' => 'Мф. против критического удара (%)',
'm3' => 'Мф. мощности критического удара (%)',
'm4' => 'Мф. увертывания (%)',
'm5' => 'Мф. против увертывания (%)',
'm6' => 'Мф. контрудара (%)',
'm7' => 'Мф. парирования (%)',
'm8' => 'Мф. блока щитом (%)',
'm9' => 'Мф. пробоя брони (%)',
'm10' => 'Мф. мощности урона',
'm11' => 'Мф. мощности магии стихий',
'm14' => 'Мф. абс. критического удара (%)',
'm15' => 'Мф. абс. увертывания (%)',
'm18' => 'Мф. абс. блока щитом (%)',
'a1' => 'Мастерство владения ножами, кинжалами',
'a2' => 'Мастерство владения топорами, секирами',
'a3' => 'Мастерство владения дубинами, молотами',
'a4' => 'Мастерство владения мечами',
'a5' => 'Мастерство владения магическими посохами',
'aall' => 'Мастерство владения оружием',
'mall' => 'Мастерство владения магией стихий',
'mg1' => 'Мастерство владения магией огня',
'mg2' => 'Мастерство владения магией воздуха',
'mg3' => 'Мастерство владения магией воды',
'mg4' => 'Мастерство владения магией земли',
'mg7' => 'Мастерство владения серой магией',
'pa1' => 'Мф. мощности колющего урона',
'pa2' => 'Мф. мощности рубящего урона',
'pa3' => 'Мф. мощности дробящий урона',
'pa4' => 'Мф. мощности режущий урона',
'pm1' => 'Мф. мощности магии огня',
'pm2' => 'Мф. мощности магии воздуха',
'pm3' => 'Мф. мощности магии воды',
'pm4' => 'Мф. мощности магии земли',
'za' => 'Защита от урона',
'zm' => 'Защита от магии стихий',
'speedhp' => 'Регенерация здоровья (НР)',
'speedmp' => 'Регенерация маны (МР)',
'zona' => 'Дополнительная зона атаки',
'zonb' => 'Дополнительная зона блока',
'speed_dungeon' => 'Скорость перемещения по пещерам',
'antm3' => 'Мф. против мощности крит. удара',
'spasenie' => 'Спасение после смерти',
'exp' => 'Получаемый опыт (%)',
'repair_z' => 'Бесплатное извлечение заточек',
'repair_r' => 'Бесплатное извлечение рун',
'repair_discount' => 'Скидка на ремонт вещей',
'gold' => 'Благодать Ангела',
'magic_cast' => 'Дополнительное заклинание за ход',
];
private Stat $stat;
private array $result = [];
public function __construct(array $data)
{
$this->stat = new Stat();
foreach ($data as $bonusName => $value) {
if (!self::$names[$bonusName]) {
continue;
if (!$this->stat->getBonusNames()[$bonusName]) {
$this->result[$bonusName] = $value; //fixme на период отладки для отлова забытых
//continue;
}
$this->result[self::$names[$bonusName]] = $value;
$this->result[$this->stat->getBonusNames()[$bonusName]] = $value;
}
$this->armor($data);
}
@ -112,16 +58,10 @@ class Bonuses
public function addZonb(): void
{
if (isset($this->result[self::$names['zonb']])) {
$this->result[self::$names['zonb']]++;
if (isset($this->result[$this->stat->getBonusNames()['zonb']])) {
$this->result[$this->stat->getBonusNames()['zonb']]++;
} else {
$this->result[self::$names['zonb']] = 1;
$this->result[$this->stat->getBonusNames()['zonb']] = 1;
}
}
public static function getBonusSystemNames(): array
{
return array_keys(self::$names);
}
}

View File

@ -2,29 +2,10 @@
namespace Item\Data;
use Model\Constant\Stat;
class Requirements
{
public static array $names = [
'sex' => 'Пол',
'lvl' => 'Уровень',
's1' => 'Сила',
's2' => 'Ловкость',
's3' => 'Интуиция',
's4' => 'Выносливость',
's5' => 'Интелект',
's6' => 'Мудрость',
'a1' => 'Мастерство владения ножами, кинжалами',
'a2' => 'Мастерство владения топорами, секирами',
'a3' => 'Мастерство владения дубинами, молотами',
'a4' => 'Мастерство владения мечами',
'a5' => 'Мастерство владения магическими посохами',
'mg1' => 'Мастерство владения магией огня',
'mg2' => 'Мастерство владения магией воздуха',
'mg3' => 'Мастерство владения магией воды',
'mg4' => 'Мастерство владения магией земли',
'mg7' => 'Мастерство владения серой магией',
'align' => 'Склонность',
];
private static array $sex = [
0 => 'Мужской',
1 => 'Женский',
@ -39,12 +20,15 @@ class Requirements
private int $alignValue = 0;
private array $result = [];
private Stat $stat;
public function __construct(array $data)
{
$this->stat = new Stat();
foreach ($data as $requirementName => $value) {
if (!self::$names[$requirementName]) {
continue;
if (!$this->stat->getRequirementNames()[$requirementName]) {
$this->result[$requirementName] = $value; //fixme на период отладки для отлова забытых
//continue;
}
if ($requirementName === 'sex') {
if (self::$sex[$value]) {
@ -56,16 +40,20 @@ class Requirements
if ($requirementName === 'align') {
if (self::$align[$value]) {
$this->alignValue = $value;
$this->result[$requirementName]['sysvalue'] = $value;
$value = self::$align[$value];
} else {
continue;
}
}
//$this->result[$this->stat->getRequirementNames()[$requirementName]] = $value;
$this->result[$requirementName] = [
'name' => self::$names[$requirementName],
'name' => $this->stat->getRequirementNames()[$requirementName],
'value' => $value,
];
}
}
public function get(): array

View File

@ -32,18 +32,13 @@ class DataModel
{
$result = [];
foreach ($this->data as $k => $v) {
if ($this->searchByPrefix($prefix, $k)) {
if (str_starts_with($k, $prefix)) {
$result[str_replace($prefix, '', $k)] = $v;
}
}
return $result;
}
private function searchByPrefix(string $prefix, string $string): bool
{
return substr($string, 0, strlen($prefix)) === $prefix;
}
public function getBonuses(): array
{
return $this->getPrefixed('add_');

View File

@ -5,107 +5,34 @@ namespace Location;
use Core\Config;
use Core\Db;
use Delo;
use Enum\ShopId;
use Helper\Conversion;
use Item\Data\Bonuses;
use Item\Data\Properties;
use Item\Data\Requirements;
use Item\DataModel;
use Model\Constant\ShopOtdel;
use User;
class Shop
{
private const ITEM_GENERATION_CURRENT = 2;
public const MAIN = 1;
public const BEREZKA = 2;
public const CRYSTALS = 1050;
public const REFERALS = 27;
public const TEMPLE = 14;
public const IZLOM = 10;
public const LABORATORY = 45;
public const ARTEFACTS = 777; //магазин самоцветов
public const KNIGHTS_MAIN = 400; //магазин рефералов
public const DUNGEON_BEZDNA = 801; // храм?!
public const DUNGEON_PTP = 802; // излом?!
public const DUNGEON_CATACOMBS = 803; //лаборатория?!?!
public const DUNGEON_MISTY = 804;
//public const BOOKS = 7;
public const MUSHROOMS = 17; // общий рыцарский
public const RULF_HRUNT = 33; // бездна
public const LUKA = 5; // пещера тысячи проклятий
public const ANVIL = 700; // катакомбы
public const NEWBIE = 106; // пещера мглы
//public const FLOWER = 6;
public const SHOP_2 = 609; // магазин грибоеда??
public const SHOP_KAT = 44; // магазин рульфа хрунта, а ты что такое?
public const SHOP_PRIZ = 404; // каморка Луки
//public const BLOOD_ALTAR = 11; //алтарь крови
public const TAVERN = 9; // наковальня
public const ANIMALS = 8; // магазин новичка
public const OTDEL_NAME = [
1 => 'Кастеты,ножи',
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;
public ShopOtdel $shopOtdel;
private ShopId $shopId;
private array $wares;
private int $otdel;
private int $itemId;
private $buyer;
public function __construct(int $shopId, int $otdel = 1)
public function __construct(ShopId $shopId, int $otdel = 1)
{
$this->shopOtdel = new ShopOtdel();
$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]);
where sid = ? and r = ? and kolvo > 0 order by pos', [$shopId->value, $otdel]);
$this->buyer = new class {
public function getId(): int
@ -178,23 +105,23 @@ class Shop
}
}
private function itemUp()
private function itemUp(): void
{
$this->changeItemPositionByInt(-1);
}
private function changeItemPositionByInt(int $modificator)
private function changeItemPositionByInt(int $modificator): void
{
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]);
[$modificator, $this->shopId->value, $this->otdel, $this->itemId]);
}
private function itemDown()
private function itemDown(): void
{
$this->changeItemPositionByInt(1);
}
public function printWares()
public function printWares(): void
{
foreach ($this->wares as $pl) {
$data = new DataModel($pl['item_id']);
@ -229,7 +156,7 @@ class Shop
if ($pl['iznos'] > 0) {
$pl['iznosMAXi'] = $pl['iznos'];
}
if ($pl['iznosMAXi'] > 0 && $pl['iznosMAXi'] !== 999999999) {
if ($pl['iznosMAXi'] > 0 && $pl['iznosMAXi'] < 1000) {
$is2 .= 'Долговечность: 0/' . $pl['iznosMAXi'] . '<br>';
}
@ -264,11 +191,14 @@ class Shop
$is2 .= '<ul style="margin: 0; padding: 0 30px;">';
foreach ($itemRequirements->get() as $dataName => $dataInfo) {
if ($dataName === 'align' || $dataName === 'sex') {
$is2 .= $this->buyer->hasExactly($dataName, intval($dataInfo['value'])) ? '<li>' : '<li style="color: crimson; list-style-type: \'× \';">';
$value = $dataName === 'align' ? intval($dataInfo['sysvalue']) : intval($dataInfo['value']);
$is2 .= $this->buyer->hasExactly($dataName, $value) ? '<li>' : '<li style="color: crimson; list-style-type: \'× \';">';
} else {
$is2 .= $this->buyer->hasEnough($dataName, intval($dataInfo['value'])) ? '<li>' : '<li style="color: crimson; list-style-type: \'× \';">';
}
$is2 .= $dataInfo['name'] . ': ' . $dataInfo['value'];
$name = empty($dataInfo['name']) ? $dataName : $dataInfo['name'];
$is2 .= $name . ': ' . $dataInfo['value'];
//$is2 .= $dataName . ': ' . $dataInfo;
$is2 .= '</li>';
}
$is2 .= '</ul>';
@ -391,7 +321,7 @@ HTML;
private function name(string $name, ?string $defaultName, int $itemid): string
{
$styleSuffix = '';
if ($this->shopId == self::SHOP_2) {
if ($this->shopId === ShopId::SHOP_2) {
$styleSuffix = 'WL';
}
if (!empty($defaultName)) {
@ -437,10 +367,10 @@ HTML;
private function price(int $credits, int $eurocredits, int $voinstvennost): string
{
$result = 'Цена: ';
if ($this->shopId === self::SHOP_2) {
if ($this->shopId === ShopId::SHOP_2) {
$result .= $this->printColoredValue($this->buyer->getVoinstvennost() >= $voinstvennost, $voinstvennost);
$result .= ' Воинственности ';
} elseif ($this->shopId === self::BEREZKA || $this->shopId === self::ARTEFACTS) {
} elseif ($this->shopId === ShopId::BEREZKA || $this->shopId === ShopId::ARTEFACTS) {
$result .= '<span style="color: cornflowerblue;">';
$result .= $this->printColoredValue($this->buyer->getEuroCredits() >= $eurocredits, $eurocredits);
$result .= ' екр.</span> ';
@ -524,14 +454,23 @@ HTML;
} else {
$result = '<img src="' . Config::img() . '/i/items/' . $image . '" alt="' . $name . '"><br>';
}
if ($this->shopId == self::SHOP_2) {
$result .= '<a href="javascript:void(' . $id . ');" onClick="top.buyShopNow(' . $id . ',\'?' . 'otdel=' . $this->otdel . '&buyVn=' . $id . '&sd4=' . $this->buyer->getNextAct() . '\',\'' . $name . '\',\'??\',\' ??.\');">купить</a>';
} elseif (($this->shopId == self::BEREZKA || $this->shopId == self::ARTEFACTS) && $this->buyer->hasEnoughEuroCredits($eurocredits)) {
$result .= '<a href="javascript:void(' . $id . ');" onClick="top.buyShopNow(' . $id . ',\'?' . 'otdel=' . $this->otdel . '&buyEkr=' . $id . '&sd4=' . $this->buyer->getNextAct() . '\',\'' . $name . '\',\'' . $eurocredits . '\',\' екр.\');">купить</a>';
if ($this->shopId == ShopId::SHOP_2) {
$js = <<<JS
<button onClick="top.buyShopNow($id,'?otdel=$this->otdel&buyVn=$id&sd4={$this->buyer->getNextAct()}','$name')">Купить</button>
JS;
} elseif (($this->shopId == ShopId::BEREZKA || $this->shopId == ShopId::ARTEFACTS) && $this->buyer->hasEnoughEuroCredits($eurocredits)) {
$js = <<<JS
<button onClick="top.buyShopNow($id,'?otdel=$this->otdel&buyEkr=$id&sd4={$this->buyer->getNextAct()}','$name',$eurocredits,'екр.')">Купить</button>
JS;
} elseif ($this->buyer->hasEnoughCredits($credits)) {
$result .= '<a href="javascript:void(' . $id . ');" onClick="top.buyShopNow(' . $id . ',\'?' . 'otdel=' . $this->otdel . '&buy=' . $id . '&sd4=' . $this->buyer->getNextAct() . '\',\'' . $name . '\',\'' . $credits . '\',\' кр.\');">купить</a>';
$js = <<<JS
<button onClick="top.buyShopNow($id,'?otdel=$this->otdel&buy=$id&sd4={$this->buyer->getNextAct()}','$name',$credits,'кр.')">Купить</button>
JS;
} else {
return '';
}
return $result;
return $result . $js;
}
private function adminOptions(int $itemId, int $itemPosition): string
@ -556,7 +495,7 @@ 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]);
$item = Db::getRow($sql, [$itemid, $this->shopId->value]);
if (!$this->buyer->hasEnoughCredits($item['price_1'])) {
return 'Покупка не удалась.';
}
@ -572,7 +511,7 @@ HTML;
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]);
$item = Db::getRow($sql, [$itemid, $this->shopId->value]);
if (!$this->buyer->hasEnoughEuroCredits($item['price_2'])) {
return 'Покупка не удалась.';
}
@ -588,7 +527,7 @@ HTML;
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]);
$item = Db::getRow($sql, [$itemid, $this->shopId->value]);
if (!$this->buyer->hasEnoughVoinstvennost($item['price_4'])) {
return 'Покупка не удалась.';
}
@ -604,9 +543,8 @@ HTML;
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];
foreach (Db::getColumn('select r from items_shop where sid = ? group by r', [$this->shopId->value]) as $v) {
$result[$v] = $this->shopOtdel->getName($v);
}
return $result;
}
@ -614,11 +552,11 @@ HTML;
public function getUserWallet(): string
{
$result = '';
if ($this->shopId === self::MAIN) {
if ($this->shopId === ShopId::MAIN) {
$result = $this->buyer->getCredits() . ' кр.';
} elseif (in_array($this->shopId, [self::BEREZKA, self::ARTEFACTS])) {
} elseif (in_array($this->shopId, [ShopId::BEREZKA, ShopId::ARTEFACTS])) {
$result = $this->buyer->getEuroCredits() . ' екр.';
} elseif ($this->shopId === self::SHOP_2) {
} elseif ($this->shopId === ShopId::SHOP_2) {
$result = $this->buyer->getVoinstvennost() . ' воинственности.';
}
return $result;

View File

@ -0,0 +1,18 @@
<?php
namespace Model\Constant;
use Core\Db;
class Constant
{
protected static string $tableName = '';
protected array $rows = [];
public function __construct()
{
$this->rows = Db::getRows('select * from ' . self::$tableName);
}
}

View File

@ -0,0 +1,47 @@
<?php
namespace Model\Constant;
class ShopOtdel extends Constant
{
public function __construct()
{
self::$tableName = 'const_shop_otdels';
parent::__construct();
}
public function getName(int $id): string
{
foreach ($this->rows as $row) {
if ($row['id'] === $id) {
return $row['name'];
}
}
return '';
}
/**
* Âîçâðàùàåò ñïèñîê ãðóïï òîâàðîâ, ãäå id áåð¸òñÿ èç ïåðâîãî òîâàðà â ãðóïïå.
* Ëîãèêà ñòðàííàÿ èç çà legacy-ðåøåíèÿ.
* @return array
*/
public function getGroups(): array
{
$groups = [];
foreach ($this->getGrouped() as $name => $arr) {
$groups[$name] = array_keys($arr)[0];
}
return array_flip($groups);
}
public function getGrouped(): array
{
$result = [];
foreach ($this->rows as $row) {
//$result[$row['id']] = [$row['name'], $row['group_name']];
$result[$row['group_name']][$row['id']] = $row['name'];
}
return $result;
}
}

View File

@ -0,0 +1,40 @@
<?php
namespace Model\Constant;
use Enum\StatFilterCellName;
class Stat extends Constant
{
public function __construct()
{
self::$tableName = 'const_stats';
parent::__construct();
}
public function getBonusNames(): array
{
return $this->filterByCell(StatFilterCellName::Bonus);
}
private function filterByCell(StatFilterCellName $cellName): array
{
$result = [];
foreach ($this->rows as $row) {
if (!$row[$cellName->value]) {
continue;
}
if ($row['sys_name'] === 'level') {
$row['sys_name'] = 'lvl';
}
$result[$row['sys_name']] = $row['name'];
}
return $result;
}
public function getRequirementNames(): array
{
return $this->filterByCell(StatFilterCellName::Requirement);
}
}

View File

@ -11,6 +11,8 @@ use User\InfoBox;
use User\ItemsModel;
use User\Reputation;
use User\Stats;
use User\UserCalculatedStats;
use User\UserStats;
class User
{
@ -1099,12 +1101,8 @@ class User
where users.' . $cell . ' = ?';
$result = Db::getRow($query, [$user]);
$temp = Conversion::dataStringToArray($result['stats']);
$result['testStats'] = new User\UserStats(
$temp
);
$result['testStats2'] = new \User\UserCalculatedStats($result['testStats']);
$result['testStats2'] = new UserCalculatedStats(new UserStats(Conversion::dataStringToArray($result['stats'])));
return $result ?: [];
}
@ -5174,103 +5172,103 @@ class User
[$u['id']]);
$t = $this->items['tr'];
$x = 0;
$notr = 0;
$t = $this->items['tr'];
$x = 0;
$notr = 0;
if (empty($itm['data'])) {
if ($this->info['twink'] > 0) {
//Не дороже 100 екр.
if ($itm['price2'] > 1 || $itm['2price'] > 1) {
$notr++;
}
}
if ($itm['iznosNOW'] >= ceil($itm['iznosMAX']) && $itm['iznosMAXi'] != 999999999) {
if (empty($itm['data'])) {
if ($this->info['twink'] > 0) {
//Не дороже 100 екр.
if ($itm['price2'] > 1 || $itm['2price'] > 1) {
$notr++;
}
if ($notr > 0 && $itm['inOdet'] != 0) {
//снимаем предмет
$this->snatItem($itm['id'], $u['id']);
$snIt++;
}
} else {
$po = Conversion::dataStringToArray($itm['data']);
$po['lvl'] = $u['level'];
//проверяем требования
$j = 1;
while ($j <= 4) {
if (!isset($po['tr_s' . $j]) && $itm['type'] != 26) {
$po['tr_s' . $j] = 0;
}
$j++;
}
while ($x < count($t)) {
$n = $t[$x];
if (isset($po['tr_' . $n]) && $n == 'sex') {
if ($po['tr_' . $n] != $this->info['sex']) {
$notr++;
}
} elseif (isset($po['tr_' . $n])) {
if ($po['tr_' . $n] > $this->stats[$n] && $n != 'align' && $n != 'align_bs') {
$notr++;
}
}
$x++;
}
if ($this->info['twink'] > 0) {
//Не дороже 100 екр.
if ($itm['price2'] > 1 || $itm['2price'] > 1) {
$notr++;
}
//Нельзя руны + чарки
if (isset($po['rune']) && $po['rune'] > 0) {
$notr++;
}
if (isset($po['spell_id']) && $po['spell_id'] > 0) {
$notr++;
}
}
if (isset($po['sudba']) && $po['sudba'] == 1) {
$po['sudba'] = $u['login'];
Db::sql('update items_users set data = ? where id = ? and uid = ?', [Conversion::arrayToDataString($po), $itm['iduid'], $u['id']]);
}
if (isset($po['srok']) && $po['srok'] > 0) {
$itm['srok'] = $po['srok'];
}
if (isset($po['vip_sale']) && $sn['silver'] < 2 && ($itm['time_create'] - time()) < 0) {
if ($itm['item_id'] == 4704) {
$po['musor2'] = 4708;
}
ItemsModel::itemDecay($itm['id'], $itm['overType'], $u['id'], (int)$po['musor2'], $itm['type'], $itm['name']);
$notr++;
}
if ($itm['iznosNOW'] >= ceil($itm['iznosMAX']) && $itm['iznosMAXi'] != 999999999) {
$notr++;
}
if ($notr > 0 && $itm['inOdet'] != 0) {
//снимаем предмет
$this->snatItem($itm['id'], $u['id']);
$snIt++;
}
//проверяем срок годности
if ($itm['iznosNOW'] >= ceil($itm['iznosMAX']) && $itm['iznosMAXi'] != 999999999 && isset($po['musor']) && $po['musor'] > 0) {
//предмет сломался
$this->itemDestroy($itm['id'], $u['id'], (int)$po['musor']);
}
if ($itm['time_create'] + $itm['srok'] <= time() && $itm['srok'] > 0 && $itm['time_sleep'] == 0) {
if ($itm['inOdet'] != 0) {
$this->snatItem($itm['id'], $u['id']);
$snIt++;
}
//удаляем предмет
if ($itm['item_id'] == 4704) {
$po['musor2'] = 4708;
}
ItemsModel::itemDecay($itm['id'], $itm['overType'], $u['id'], (int)$po['musor2'], $itm['type'], $itm['name']);
}
}
if ($itm['iznosNOW'] >= ceil($itm['iznosMAX']) && $itm['iznosMAXi'] != 999999999) {
$notr++;
}
if ($notr > 0 && $itm['inOdet'] != 0) {
//снимаем предмет
$this->snatItem($itm['id'], $u['id']);
$snIt++;
}
} else {
$po = Conversion::dataStringToArray($itm['data']);
$po['lvl'] = $u['level'];
//проверяем требования
$j = 1;
while ($j <= 4) {
if (!isset($po['tr_s' . $j]) && $itm['type'] != 26) {
$po['tr_s' . $j] = 0;
}
$j++;
}
while ($x < count($t)) {
$n = $t[$x];
if (isset($po['tr_' . $n]) && $n == 'sex') {
if ($po['tr_' . $n] != $this->info['sex']) {
$notr++;
}
} elseif (isset($po['tr_' . $n])) {
if ($po['tr_' . $n] > $this->stats[$n] && $n != 'align' && $n != 'align_bs') {
$notr++;
}
}
$x++;
}
if ($this->info['twink'] > 0) {
//Не дороже 100 екр.
if ($itm['price2'] > 1 || $itm['2price'] > 1) {
$notr++;
}
//Нельзя руны + чарки
if (isset($po['rune']) && $po['rune'] > 0) {
$notr++;
}
if (isset($po['spell_id']) && $po['spell_id'] > 0) {
$notr++;
}
}
if (isset($po['sudba']) && $po['sudba'] == 1) {
$po['sudba'] = $u['login'];
Db::sql('update items_users set data = ? where id = ? and uid = ?', [Conversion::arrayToDataString($po), $itm['iduid'], $u['id']]);
}
if (isset($po['srok']) && $po['srok'] > 0) {
$itm['srok'] = $po['srok'];
}
if (isset($po['vip_sale']) && $sn['silver'] < 2 && ($itm['time_create'] - time()) < 0) {
if ($itm['item_id'] == 4704) {
$po['musor2'] = 4708;
}
ItemsModel::itemDecay($itm['id'], $itm['overType'], $u['id'], (int)$po['musor2'], $itm['type'], $itm['name']);
$notr++;
}
if ($itm['iznosNOW'] >= ceil($itm['iznosMAX']) && $itm['iznosMAXi'] != 999999999) {
$notr++;
}
if ($notr > 0 && $itm['inOdet'] != 0) {
//снимаем предмет
$this->snatItem($itm['id'], $u['id']);
$snIt++;
}
//проверяем срок годности
if ($itm['iznosNOW'] >= ceil($itm['iznosMAX']) && $itm['iznosMAXi'] != 999999999 && isset($po['musor']) && $po['musor'] > 0) {
//предмет сломался
$this->itemDestroy($itm['id'], $u['id'], (int)$po['musor']);
}
if ($itm['time_create'] + $itm['srok'] <= time() && $itm['srok'] > 0 && $itm['time_sleep'] == 0) {
if ($itm['inOdet'] != 0) {
$this->snatItem($itm['id'], $u['id']);
$snIt++;
}
//удаляем предмет
if ($itm['item_id'] == 4704) {
$po['musor2'] = 4708;
}
ItemsModel::itemDecay($itm['id'], $itm['overType'], $u['id'], (int)$po['musor2'], $itm['type'], $itm['name']);
}
}
if ($snIt > 0) {
$this->testItems($uid, $sn, 1);
} elseif ($dt == 0) {

View File

@ -1,97 +0,0 @@
<?php
namespace User;
class Parameters
{
public static array $parameterName = [
'spasenie' => 'Спасение после смерти',
'puti' => 'Запрет перемещения',
'align' => 'Склонность',
'hpAll' => 'Уровень жизни (HP)',
'mpAll' => 'Уровень маны (МP)',
'sex' => 'Пол',
'lvl' => 'Уровень',
's1' => 'Сила',
's2' => 'Ловкость',
's3' => 'Интуиция',
's4' => 'Выносливость',
's5' => 'Интеллект',
's6' => 'Мудрость',
's7' => 'Духовность',
'm1' => 'Мф. критического удара (%)',
'm2' => 'Мф. против критического удара (%)',
'm3' => 'Мф. мощности крит. удара (%)',
'm4' => 'Мф. увертывания (%)',
'm5' => 'Мф. против увертывания (%)',
'm6' => 'Мф. контрудара (%)',
'm7' => 'Мф. парирования (%)',
'm8' => 'Мф. блока щитом (%)',
'm9' => 'Мф. удара сквозь броню (%)',
'm14' => 'Мф. абс. критического удара (%)',
'm15' => 'Мф. абс. увертывания (%)',
'm18' => 'Мф. абс. блока щитом (%)',
'm19' => 'Мф. абс. магический промах (%)',
'a1' => 'Мастерство владения ножами, кинжалами',
'a2' => 'Мастерство владения топорами, секирами',
'a3' => 'Мастерство владения дубинами, молотами',
'a4' => 'Мастерство владения мечами',
'a5' => 'Мастерство владения магическими посохами',
'aall' => 'Мастерство владения оружием',
'mall' => 'Мастерство владения магией стихий',
'mg1' => 'Мастерство владения магией огня',
'mg2' => 'Мастерство владения магией воздуха',
'mg3' => 'Мастерство владения магией воды',
'mg4' => 'Мастерство владения магией земли',
'mg7' => 'Мастерство владения серой магией',
'minAtack' => 'Минимальный урон бота в пещере',
'maxAtack' => 'Максимальный урон бота в пещере',
'm10' => 'Мф. мощности урона',
'm11' => 'Мф. мощности магии стихий',
'pa1' => 'Мф. мощности колющего урона',
'pa2' => 'Мф. мощности рубящего урона',
'pa3' => 'Мф. мощности дробящего урона',
'pa4' => 'Мф. мощности режущего урона',
'pm1' => 'Мф. мощности магии огня',
'pm2' => 'Мф. мощности магии воздуха',
'pm3' => 'Мф. мощности магии воды',
'pm4' => 'Мф. мощности магии земли',
'pm7' => 'Мф. мощности серой магии',
'za' => 'Защита от урона',
'zm' => 'Защита от магии стихий',
'magic_cast' => 'Дополнительный каст за ход',
'min_heal_proc' => 'Эффект лечения (%)',
'notravma' => 'Защита от травм',
'yron_min' => 'Минимальный урон',
'yron_max' => 'Максимальный урон',
'speedhp' => 'Регенерация здоровья (%)',
'speedmp' => 'Регенерация маны (%)',
'tya1' => 'Колющие атаки',
'tya2' => 'Рубящие атаки',
'tya3' => 'Дробящие атаки',
'tya4' => 'Режущие атаки',
'tym1' => 'Огненные атаки',
'mg2static_points' => 'Уровень заряда (Воздух)',
'tym2' => 'Электрические атаки',
'tym3' => 'Ледяные атаки',
'tym4' => 'Земляные атаки',
'tym7' => 'Серые атаки',
'min_use_mp' => 'Уменьшает расход маны',
'pog' => 'Поглощение урона (прием)',
'pog2' => 'Поглощение урона (прием)',
'pog2p' => 'Процент поглощение урона (прием)',
'pog2mp' => 'Цена поглощение урона (прием)',
'maxves' => 'Увеличивает рюкзак',
'antm3' => 'Мф. против мощности крита',
'repair_z' => 'Бесплатное извлечение заточек',
'repair_r' => 'Бесплатное извлечение рун',
'rep' => 'Репутация Рыцаря',
'repair_discount' => 'Скидка на ремонт вещей',
'hpVinos' => 'Бонус жизни',
'gold' => 'Благодать Ангела',
'speed_dungeon' => 'Скорость передвижения по подземельям',
'zona' => 'Дополнительная зона атаки',
];
public static array $parameterNameDeprecated = [];
}

View File

@ -5,16 +5,20 @@ namespace User;
use Core\Config;
use Core\Db;
use Helper\Conversion;
use Item\Data\Bonuses;
use User;
class Stats
{
private User $u;
private array $sysNames = [];
public function __construct(User $user)
{
$this->u = $user;
$this->sysNames = Db::getColumn('select sys_name from const_stats where is_bonus = true');
$this->sysNames['hpAll'] = $this->sysNames['hpall'];
$this->sysNames['mpAll'] = $this->sysNames['mpall'];
unset($this->sysNames['hpall'], $this->sysNames['mpall']);
}
/**
@ -115,17 +119,6 @@ class Stats
];
}
/**
* Присваиваем только разрешенные значения.
*/
private static function a(&$array, string $key, $value): void
{
if (!in_array($key, array_keys(Bonuses::getBonusSystemNames()))) {
return;
}
$array[$key] = $value;
}
public function getStats(int|array|null $uid = null, $i1 = 0, $res = 0, $reimg = false, $btl_cache = false): array
{
if (empty($uid) || $uid == $this->u->info['id'] && $res != 1) {
@ -141,30 +134,8 @@ class Stats
return [];
}
$st = [
'maxves' => 0,
'pzm' => 0,
'yza' => 0,
'yza1' => 0,
'yza2' => 0,
'yza3' => 0,
'yza4' => 0,
'yza5' => 0,
'yza6' => 0,
'yza7' => 0,
'yzm' => 0,
'yzm1' => 0,
'yzm2' => 0,
'yzm3' => 0,
'yzm4' => 0,
'yzm5' => 0,
'yzm6' => 0,
'yzm7' => 0,
'yzma' => 0,
'pbe' => 0,
'os7' => 0,
'' => 0,
];
$st = array_fill_keys($this->sysNames, 0);
$s_vi = [];
$s_v = [];
$u['clanpos'] = 0;
@ -229,7 +200,6 @@ class Stats
item_id, inslot, useInBattle, btl_zd, iznosNOW, iznosMAX, magic_inci, name, items_users.id, img, `2h`
from items_users left join items_main on items_main.id = item_id where inOdet != 0 and uid = ?', [$u['id']]);
$ia = Bonuses::getBonusSystemNames();
$h = 0;
$hnd1 = 0;
$hnd2 = 0;
@ -266,20 +236,8 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
} elseif ($wearedItem['inOdet'] == 14 && $wearedItem['type'] == 13) {
$sht1 = 1;
}
$sts = explode('|', $wearedItem['data']);
$i = 0;
$sti = [];
while ($i < count($sts)) {
$ste = explode('=', $sts[$i]);
if (isset($ste[1])) {
if (!isset($sti[$ste[0]])) {
$sti[$ste[0]] = 0;
}
$sti[$ste[0]] += intval($ste[1]);
}
$i++;
}
$sti = Conversion::dataStringToArray($wearedItem['data']);
if ($wearedItem['inOdet'] <= 18 && $wearedItem['inOdet'] > 0) {
$st['reting'] += 1;
}
@ -436,24 +394,22 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
$st['zona'] += $sti['zona'];
}
//Добавляем статы от данного предмета
if (!isset($sti['restart_stats'])) {
$i = 0;
while ($i < count($ia)) {
while ($i < count($this->sysNames)) {
//Действует на (Действует на)
if (isset($ia[$i]) && isset($sti['add_' . $ia[$i]])) {
if ($ia[$i] != 'zmproc' && $ia[$i] != 'zaproc') {
if (!isset($st[$ia[$i]])) {
$st[$ia[$i]] = 0;
}
$st[$ia[$i]] += intval($sti['add_' . $ia[$i]]);
if (isset($this->sysNames[$i]) && isset($sti['add_' . $this->sysNames[$i]])) {
if (!isset($st[$this->sysNames[$i]])) {
$st[$this->sysNames[$i]] = 0;
}
if ($this->sysNames[$i] != 'zmproc' && $this->sysNames[$i] != 'zaproc') {
$st[$this->sysNames[$i]] += intval($sti['add_' . $this->sysNames[$i]]);
} else {
if (!isset($st[$ia[$i]])) {
$st[$ia[$i]] = 0;
}
$st[$ia[$i]] = 100 - $st[$ia[$i]];
$st[$ia[$i]] = $st[$ia[$i]] - $st[$ia[$i]] / 100 * intval($sti['add_' . $ia[$i]]);
$st[$ia[$i]] = 100 - $st[$ia[$i]];
$st[$this->sysNames[$i]] = 100 - $st[$this->sysNames[$i]];
$st[$this->sysNames[$i]] = $st[$this->sysNames[$i]] - $st[$this->sysNames[$i]] / 100 * intval($sti['add_' . $this->sysNames[$i]]);
$st[$this->sysNames[$i]] = 100 - $st[$this->sysNames[$i]];
}
}
$i++;
@ -461,15 +417,16 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
} else {
$reitm[] = $sti;
}
$i = 0;
while ($i < count($ia)) {
if (isset($ia[$i]) && isset($sti['sv_' . $ia[$i]])) {
if (!isset($s_v[$ia[$i]])) {
$s_v[$ia[$i]] = 0;
$s_v['z'][$wearedItem['inOdet']][$ia[$i]] = 0;
while ($i < count($this->sysNames)) {
if (isset($this->sysNames[$i]) && isset($sti['sv_' . $this->sysNames[$i]])) {
if (!isset($s_v[$this->sysNames[$i]])) {
$s_v[$this->sysNames[$i]] = 0;
$s_v['z'][$wearedItem['inOdet']][$this->sysNames[$i]] = 0;
}
$s_v[$ia[$i]] += intval($sti['sv_' . $ia[$i]]);
$s_v['z'][$wearedItem['inOdet']][$ia[$i]] += intval($sti['sv_' . $ia[$i]]);
$s_v[$this->sysNames[$i]] += intval($sti['sv_' . $this->sysNames[$i]]);
$s_v['z'][$wearedItem['inOdet']][$this->sysNames[$i]] += intval($sti['sv_' . $this->sysNames[$i]]);
}
$i++;
}
@ -598,49 +555,48 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
if (isset($sts['add_silver'])) {
$st['slvtm'] = $e['timeUse'] + $e['actionTime'];
}
$i = 0;
while ($i < count($ia)) {
if (isset($ia[$i])) {
if (isset($sts['add_' . $ia[$i]])) {
if (!isset($sti[$ia[$i]])) {
$sti[$ia[$i]] = 0;
while ($i < count($this->sysNames)) {
if (isset($this->sysNames[$i])) {
if (isset($sts['add_' . $this->sysNames[$i]])) {
if (!isset($sti[$this->sysNames[$i]])) {
$sti[$this->sysNames[$i]] = 0;
}
$sti[$ia[$i]] += intval($sts['add_' . $ia[$i]]);
$sti[$this->sysNames[$i]] += intval($sts['add_' . $this->sysNames[$i]]);
}
if (isset($sts['add_' . $ia[$i]])) {
if ($ia[$i] != 'zaproc' && $ia[$i] != 'zmproc') {
if (!isset($st[$ia[$i]])) {
$st[$ia[$i]] = 0;
}
$st[$ia[$i]] += intval($sts['add_' . $ia[$i]]);
if (isset($sts['add_' . $this->sysNames[$i]])) {
if (!isset($st[$this->sysNames[$i]])) {
$st[$this->sysNames[$i]] = 0;
}
if ($this->sysNames[$i] != 'zaproc' && $this->sysNames[$i] != 'zmproc') {
$st[$this->sysNames[$i]] += intval($sts['add_' . $this->sysNames[$i]]);
} else {
if (!isset($st[$ia[$i]])) {
$st[$ia[$i]] = 0;
}
$st[$ia[$i]] = 100 - $st[$ia[$i]];
$st[$ia[$i]] = $st[$ia[$i]] - $st[$ia[$i]] / 100 * intval(
$sts['add_' . $ia[$i]]
$st[$this->sysNames[$i]] = 100 - $st[$this->sysNames[$i]];
$st[$this->sysNames[$i]] = $st[$this->sysNames[$i]] - $st[$this->sysNames[$i]] / 100 * intval(
$sts['add_' . $this->sysNames[$i]]
);
$st[$ia[$i]] = 100 - $st[$ia[$i]];
$st[$this->sysNames[$i]] = 100 - $st[$this->sysNames[$i]];
}
}
}
$i++;
}
$i = 0;
while ($i < count($ia)) {
if (isset($ia[$i])) {
if (isset($sts['sv_' . $ia[$i]])) {
if (!isset($s_vi[$ia[$i]])) {
$s_vi[$ia[$i]] = 0;
while ($i < count($this->sysNames)) {
if (isset($this->sysNames[$i])) {
if (isset($sts['sv_' . $this->sysNames[$i]])) {
if (!isset($s_vi[$this->sysNames[$i]])) {
$s_vi[$this->sysNames[$i]] = 0;
}
$s_vi[$ia[$i]] += intval($sts['sv_' . $ia[$i]]);
$s_vi[$this->sysNames[$i]] += intval($sts['sv_' . $this->sysNames[$i]]);
}
if (isset($sts['sv_' . $ia[$i]])) {
if (!isset($s_v[$ia[$i]])) {
$s_v[$ia[$i]] = 0;
if (isset($sts['sv_' . $this->sysNames[$i]])) {
if (!isset($s_v[$this->sysNames[$i]])) {
$s_v[$this->sysNames[$i]] = 0;
}
$s_v[$ia[$i]] += intval($sts['sv_' . $ia[$i]]);
$s_v[$this->sysNames[$i]] += intval($sts['sv_' . $this->sysNames[$i]]);
}
}
$i++;
@ -792,43 +748,45 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
$st['set_pog2'][$ctt]['m'] = $sts['add_pog2mp'];
unset($ctt);
}
$i = 0;
while ($i < count($ia)) {
if (isset($ia[$i]) && isset($sts['add_' . $ia[$i]])) {
if ($ia[$i] != 'zaproc' && $ia[$i] != 'zmproc') {
if (!isset($sti[$ia[$i]])) {
$sti[$ia[$i]] = 0;
}
$sti[$ia[$i]] += intval($sts['add_' . $ia[$i]]);
if (!isset($st[$ia[$i]])) {
$st[$ia[$i]] = 0;
}
$st[$ia[$i]] += intval($sts['add_' . $ia[$i]]);
} else {
$sti[$ia[$i]] = 100 - $sti[$ia[$i]];
$sti[$ia[$i]] = $sti[$ia[$i]] - $sti[$ia[$i]] / 100 * intval(
$sts['add_' . $ia[$i]]
);
$sti[$ia[$i]] = 100 - $sti[$ia[$i]];
$st[$ia[$i]] = 100 - $st[$ia[$i]];
$st[$ia[$i]] = $st[$ia[$i]] - $st[$ia[$i]] / 100 * intval($sts['add_' . $ia[$i]]);
$st[$ia[$i]] = 100 - $st[$ia[$i]];
$i = 0;
while ($i < count($this->sysNames)) {
if (isset($this->sysNames[$i]) && isset($sts['add_' . $this->sysNames[$i]])) {
if ($this->sysNames[$i] != 'zaproc' && $this->sysNames[$i] != 'zmproc') {
if (!isset($sti[$this->sysNames[$i]])) {
$sti[$this->sysNames[$i]] = 0;
}
$sti[$this->sysNames[$i]] += intval($sts['add_' . $this->sysNames[$i]]);
if (!isset($st[$this->sysNames[$i]])) {
$st[$this->sysNames[$i]] = 0;
}
$st[$this->sysNames[$i]] += intval($sts['add_' . $this->sysNames[$i]]);
} else {
$sti[$this->sysNames[$i]] = 100 - $sti[$this->sysNames[$i]];
$sti[$this->sysNames[$i]] = $sti[$this->sysNames[$i]] - $sti[$this->sysNames[$i]] / 100 * intval(
$sts['add_' . $this->sysNames[$i]]
);
$sti[$this->sysNames[$i]] = 100 - $sti[$this->sysNames[$i]];
$st[$this->sysNames[$i]] = 100 - $st[$this->sysNames[$i]];
$st[$this->sysNames[$i]] = $st[$this->sysNames[$i]] - $st[$this->sysNames[$i]] / 100 * intval($sts['add_' . $this->sysNames[$i]]);
$st[$this->sysNames[$i]] = 100 - $st[$this->sysNames[$i]];
}
}
$i++;
}
$i = 0;
while ($i < count($ia)) {
if (isset($ia[$i]) && isset($sts['add_' . $ia[$i]])) {
if (!isset($s_vi[$ia[$i]])) {
$s_vi[$ia[$i]] = 0;
while ($i < count($this->sysNames)) {
if (isset($this->sysNames[$i]) && isset($sts['add_' . $this->sysNames[$i]])) {
if (!isset($s_vi[$this->sysNames[$i]])) {
$s_vi[$this->sysNames[$i]] = 0;
}
$s_vi[$ia[$i]] += intval($sts['sv_' . $ia[$i]]);
if (!isset($s_v[$ia[$i]])) {
$s_v[$ia[$i]] = 0;
$s_vi[$this->sysNames[$i]] += intval($sts['sv_' . $this->sysNames[$i]]);
if (!isset($s_v[$this->sysNames[$i]])) {
$s_v[$this->sysNames[$i]] = 0;
}
$s_v[$ia[$i]] += intval($sts['sv_' . $ia[$i]]);
$s_v[$this->sysNames[$i]] += intval($sts['sv_' . $this->sysNames[$i]]);
}
$i++;
}
@ -842,90 +800,29 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
//Характеристики от статов
if (!isset($st['hpAll'])) {
$st['hpAll'] = 0;
}
$st['hpAll'] += $st['s4'] * 5;
if (!isset($st['mpAll'])) {
$st['mpAll'] = 0;
}
$st['mpAll'] += $st['s6'] * 10;
//Турнир
if (!isset($st['m1'])) {
$st['m1'] = 0;
}
$st['m1'] += $st['s3'] * 5;
// мф.анти-крит = 2.5
if (!isset($st['m2'])) {
$st['m2'] = 0;
}
$st['m2'] += $st['s3'] * 5;
// мф.уворот = 2.5
if (!isset($st['m4'])) {
$st['m4'] = 0;
}
$st['m4'] += $st['s2'] * 5;
// мф.анти-уворот = 2.5
if (!isset($st['m5'])) {
$st['m5'] = 0;
}
$st['m5'] += $st['s2'] * 5;
if (!isset($st['za'])) {
$st['za'] = 0;
}
$st['za'] += $st['s4'] * 1.0;
if (!isset($st['zm'])) {
$st['zm'] = 0;
}
$st['zm'] += $st['s4'] * 0.0;
if (!isset($st['zaproc'])) { //Тут зм 'zaproc'=>'Защита от урона (%)','zmproc'=>'Защита от магии стихий (%)
$st['zaproc'] = 0;
}
$st['zaproc'] += round($st['s5'] * 0);
if (!isset($st['m19'])) {
$st['m19'] = 0;
}
$st['m19'] += round($st['s3'] * 0.03);
//Мощности
//Мощность против "Мощность крит. урона". Гамс
if (!isset($st['antm3'])) {
$st['antm3'] = 0;
}
$st['antm3'] += $st['s5'] * 0.5;
if (!isset($st['m10'])) {
$st['m10'] = 0;
}
$st['m10'] += 0;
if (!isset($st['m11'])) {
$st['m11'] = 0;
}
$st['m11'] += 0;
if (!isset($st['m11a'])) {
$st['m11a'] = 0;
}
$st['m11a'] += 0;
if (!isset($st['m8'])) {
$st['m8'] = 0;
}
$st['m8'] += 0;
//Бонусы комплектов
$i = 0;
if (!empty($coms['new']) && is_array($coms['new'])) {
@ -942,9 +839,9 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
//добавляем действия комплекта
$ij = 0;
$sti = Conversion::dataStringToArray($com['data']);
while ($ij < count($ia)) {
if (isset($ia[$ij]) && isset($sti[$ia[$ij]])) {
$st[$ia[$ij]] += $sti[$ia[$ij]];
while ($ij < count($this->sysNames)) {
if (isset($this->sysNames[$ij]) && isset($sti[$this->sysNames[$ij]])) {
$st[$this->sysNames[$ij]] += $sti[$this->sysNames[$ij]];
}
$ij++;
}
@ -1014,20 +911,11 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
if ($sht1 == 1) {
$st['zonb']++;
}/* Владения */
//mib1-mib4, mab1-mab4 armor??
$i = 1;
while ($i <= 7) {
if (!isset($st['pm' . $i])) {
$st['pm' . $i] = 0;
}
if (!isset($st['a' . $i])) {
$st['a' . $i] = 0;
}
if (!isset($st['mg' . $i])) {
$st['mg' . $i] = 0;
}
if (!isset($st['zm' . $i])) {
$st['zm' . $i] = 0;
}
if (isset($st['s5'])) {
$st['pm' . $i] += $st['s5'] * 0.5;
}
@ -1047,26 +935,6 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
$st['zm' . $i] += $st['zma'];
}
if ($i <= 4) {
if (!isset($st['mib' . $i])) {
$st['mib' . $i] = 0;
}
if (!isset($st['mab' . $i])) {
$st['mab' . $i] = 0;
}
if (!isset($st['mg' . $i])) {
$st['mg' . $i] = 0;
}
if (!isset($st['pm' . $i])) {
$st['pm' . $i] = 0;
}
if (!isset($st['pa' . $i])) {
$st['pa' . $i] = 0;
}
if (!isset($st['za' . $i])) {
$st['za' . $i] = 0;
}
$st['mib' . $i] += 0;
$st['mab' . $i] += 0;
if (isset($st['mall'])) {
$st['mg' . $i] += $st['mall'];
}
@ -1081,7 +949,9 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
}
}
$i++;
}//Уязвимость оружие и магиям
}
//Уязвимость оружие и магиям
$i = 1;
while ($i <= 7) {
$st['yzm' . $i] += $st['yzma'];
@ -1127,7 +997,9 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
$st['mpNow'] = 0;
} elseif ($st['mpNow'] > $st['mpAll']) {
$st['mpNow'] = $st['mpAll'];
}//зоны блока и удара
}
//зоны блока и удара
if ($st['zona'] < 1) {
$st['zona'] = 1;
}
@ -1140,6 +1012,7 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
if ($st['zonb'] > 3) {
$st['zonb'] = 3;
}
$st['ozash'] = $oza;
$st['ozmsh'] = $ozm;
$st['weapon1'] = $hnd1;
@ -1154,18 +1027,14 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
$st['y'] = $u['y'];
$st['s'] = $u['s'];
$st['reting'] = 1 + ceil($st['reting']);
$this->addDungeonsBonuses($u['id'], $st);
//Добавочный подьем для игроков
$st['maxves'] += 500;
$st['maxves'] += 100;
if ($u['admin'] > 0) { // ускоренная регенерация и пробег по подземелью
$st['speed_dungeon'] = 1000;
$st['speedhp'] = 1000;
$st['speed_dungeon'] = 500;
$st['speedhp'] = 500;
if ($u['battle']) {
Db::sql("update stats set
tactic1 = tactic2 = tactic3 = tactic4 = tactic5 = tactic6 = tactic7 = 25,
@ -1176,7 +1045,9 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
if (date('H') >= 22 && date('H') <= 10) {
$st['exp'] += 25;
}//Сохраняем рейтинг игрока
}
//Сохраняем рейтинг игрока
$st['reting'] = floor($st['reting']);
if (isset($st['btl_cof'], $st['prckr']) && $st['btl_cof'] != $st['prckr']) {
@ -1227,7 +1098,7 @@ from items_users left join items_main on items_main.id = item_id where inOdet !=
$sts = Conversion::dataStringToArray($data);
foreach ($sts as $paramName => $value) {
//todo убедиться, что не могут прилететь параметры, которых нет в словарей бонусов предметов
if (!str_contains(implode(',', Bonuses::getBonusSystemNames()), 'add_' . $paramName)) { // есть ли параметр в разрешенных?
if (!str_contains(implode(',', $this->sysNames), 'add_' . $paramName)) { // есть ли параметр в разрешенных?
continue;
}
if (empty($st['add_' . $paramName])) {

View File

@ -4,53 +4,59 @@ namespace User;
class UserCalculatedStats
{
private UserStats $userStats;
private UserStats $baseUserStats;
public int $hpAll;
public int $mpAll;
public function __construct(
private readonly UserStats $us
) {
UserStats $userStats
)
{
$this->userStats = $userStats;
$this->baseUserStats = $userStats;
$this->hpAll = $this->hpAll();
$this->mpAll = $this->mpAll();
}
private function hpAll(): int
{
$hpAll = $this->us->s4 * 5;
$hpAll += match (true){
$this->us->s4 >= 200 => 850,
$this->us->s4 >= 175 => 600,
$this->us->s4 >= 150 => 450,
$this->us->s4 >= 125 => 400,
$this->us->s4 >= 100 => 250,
$this->us->s4 >= 75 => 175,
$this->us->s4 >= 50 => 100,
$this->us->s4 >= 25 => 50,
$hpAll = $this->userStats->s4 * 5;
$hpAll += match (true) {
$this->userStats->s4 >= 200 => 850,
$this->userStats->s4 >= 175 => 600,
$this->userStats->s4 >= 150 => 450,
$this->userStats->s4 >= 125 => 400,
$this->userStats->s4 >= 100 => 250,
$this->userStats->s4 >= 75 => 175,
$this->userStats->s4 >= 50 => 100,
$this->userStats->s4 >= 25 => 50,
default => 0
};
return $hpAll;
}
private function mpAll():int
private function mpAll(): int
{
$mpAll = $this->us->s6 * 10;
$mpAll = $this->userStats->s6 * 10;
$mpAll += match (true) {
$this->us->s6 >= 200 => 1500,
$this->us->s6 >= 175 => 900,
$this->us->s6 >= 150 => 700,
$this->us->s6 >= 125 => 500,
$this->us->s6 >= 100 => 350,
$this->us->s6 >= 75 => 250,
$this->us->s6 >= 50 => 150,
$this->us->s6 >= 25 => 50,
$this->userStats->s6 >= 200 => 1500,
$this->userStats->s6 >= 175 => 900,
$this->userStats->s6 >= 150 => 700,
$this->userStats->s6 >= 125 => 500,
$this->userStats->s6 >= 100 => 350,
$this->userStats->s6 >= 75 => 250,
$this->userStats->s6 >= 50 => 150,
$this->userStats->s6 >= 25 => 50,
default => 0
};
return $mpAll;
}
public function __toString():string
public function __toString(): string
{
$arr = [];
foreach ($this as $k=>$v) {
foreach ($this as $k => $v) {
if (empty($v) || $k === 'us') {
continue;
}
@ -62,7 +68,7 @@ class UserCalculatedStats
public function __debugInfo()
{
$arr = [];
foreach ($this as $k=>$v) {
foreach ($this as $k => $v) {
if ($k === 'us') {
continue;
}

View File

@ -21,12 +21,8 @@ readonly class UserStats
public int $mg3;
public int $mg4;
public int $mg7;
//public int $hpAll;
//public int $mpAll;
public function __construct(
array $a
)
public function __construct(array $a)
{
$this->s1 = $a['s1'] ?? 0;
$this->s2 = $a['s2'] ?? 0;
@ -45,53 +41,6 @@ readonly class UserStats
$this->mg3 = max($a['mg3'] ?? 0, $a['mall'] ?? 0);
$this->mg4 = max($a['mg4'] ?? 0, $a['mall'] ?? 0);
$this->mg7 = $a['mg7'] ?? 0;
//$this->hpAll = $this->hpAll();
//$this->mpAll = $this->mpAll();
}
/*private function hpAll(): int
{
$hpAll = $this->s4 * 5;
$hpAll += match (true){
$this->s4 >= 200 => 850,
$this->s4 >= 175 => 600,
$this->s4 >= 150 => 450,
$this->s4 >= 125 => 400,
$this->s4 >= 100 => 250,
$this->s4 >= 75 => 175,
$this->s4 >= 50 => 100,
$this->s4 >= 25 => 50,
default => 0
};
return $hpAll;
}
private function mpAll():int
{
$mpAll = $this->s6 * 10;
$mpAll += match (true) {
$this->s6 >= 200 => 1500,
$this->s6 >= 175 => 900,
$this->s6 >= 150 => 700,
$this->s6 >= 125 => 500,
$this->s6 >= 100 => 350,
$this->s6 >= 75 => 250,
$this->s6 >= 50 => 150,
$this->s6 >= 25 => 50,
default => 0
};
return $mpAll;
}*/
public function __toString():string
{
$arr = [];
foreach ($this as $k=>$v) {
if (empty($v)) {
continue;
}
$arr[$k] = $v;
}
return json_encode($arr);
}
}

300
css/inf.css Normal file
View File

@ -0,0 +1,300 @@
body {
background-color: #dedede;
margin: 5px;
}
hr {
height: 1px;
}
img {
border: 0;
}
button {
border: solid 1pt #B0B0B0;
font-family: MS Sans Serif, sans-serif;
font-size: 11px;
color: #191970;
padding: 2px 7px 2px 7px;
}
button:active {
padding: 3px 6px 1px 8px;
}
.ttl_css {
position: absolute;
text-shadow: 0 0 2px #fff;
padding: 4px 8px;
border: 1px solid rgba(255, 255, 255, 0.25);
background-color: #cfcfcf;
border-radius: 3px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
box-shadow: 0 0 3px #000000;
-webkit-box-shadow: 0 0 3px #000000;
-moz-box-shadow: 0 0 3px #000000;
}
.findlg {
filter: alpha(opacity=37);
opacity: 0.37;
-moz-opacity: 0.37;
margin-bottom: 10px;
}
.findlg:hover {
filter: alpha(opacity=100);
opacity: 1.00;
-moz-opacity: 1.00;
}
.gifin {
position: absolute;
left: 112px;
top: 428px;
padding: 5px;
background-color: #fcfef3;
border: 1px solid #6e6960;
font-size: 12px;
max-width: 300px;
min-height: 100px;
min-width: 150px;
}
.pg_btn1 {
width: 27px;
height: 78px;
cursor: pointer;
display: block;
}
.pg_btn1:hover {
background-position: -27px;
cursor: pointer;
}
.pg_btn1:active {
background-position: -55px;
cursor: pointer;
}
.pg_btn2 {
background-position: -54px;
width: 27px;
height: 78px;
cursor: pointer;
display: block;
}
.pg_btn2:hover {
background-position: -27px;
cursor: pointer;
}
.pg_btn2:active {
background-position: 1px;
cursor: pointer;
}
progress {
-webkit-appearance: none;
appearance: none;
}
.prog0 {
width: 10em;
height: 1em;
}
.prog0::-webkit-progress-bar {
background-color: #eee;
border-radius: 2px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25) inset;
}
.prog0[value]::-webkit-progress-value {
background-image: -webkit-linear-gradient(-45deg,
transparent 33%, rgba(0, 0, 0, .1) 33%,
rgba(0, 0, 0, .1) 66%, transparent 66%),
-webkit-linear-gradient(top,
rgba(255, 255, 255, .25),
rgba(0, 0, 0, .25)),
-webkit-linear-gradient(left, #09c, #7FFFD4);
border-radius: 2px;
background-size: 35px 20px, 100% 100%, 100% 100%;
}
.prog1 {
width: 10em;
height: 1em;
}
.prog1::-webkit-progress-bar {
background-color: #eee;
border-radius: 2px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25) inset;
}
.prog1[value]::-webkit-progress-value {
background-image: -webkit-linear-gradient(-45deg,
transparent 33%, rgba(0, 0, 0, .1) 33%,
rgba(0, 0, 0, .1) 66%, transparent 66%),
-webkit-linear-gradient(top,
rgba(255, 255, 255, .25),
rgba(0, 0, 0, .25)),
-webkit-linear-gradient(left, #7FFFD4, #F4A460);
border-radius: 2px;
background-size: 35px 20px, 100% 100%, 100% 100%;
}
.prog2 {
width: 10em;
height: 1em;
}
.prog2::-webkit-progress-bar {
background-color: #eee;
border-radius: 2px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25) inset;
}
.prog2[value]::-webkit-progress-value {
background-image: -webkit-linear-gradient(-45deg,
transparent 33%, rgba(0, 0, 0, .1) 33%,
rgba(0, 0, 0, .1) 66%, transparent 66%),
-webkit-linear-gradient(top,
rgba(255, 255, 255, .25),
rgba(0, 0, 0, .25)),
-webkit-linear-gradient(left, #F4A460, #FFC0CB);
border-radius: 2px;
background-size: 35px 20px, 100% 100%, 100% 100%;
}
.prog3 {
width: 10em;
height: 1em;
}
.prog3::-webkit-progress-bar {
background-color: #eee;
border-radius: 2px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25) inset;
}
.prog3[value]::-webkit-progress-value {
background-image: -webkit-linear-gradient(-45deg,
transparent 33%, rgba(0, 0, 0, .1) 33%,
rgba(0, 0, 0, .1) 66%, transparent 66%),
-webkit-linear-gradient(top,
rgba(255, 255, 255, .25),
rgba(0, 0, 0, .25)),
-webkit-linear-gradient(left, #FFC0CB, #FFD700);
border-radius: 2px;
background-size: 35px 20px, 100% 100%, 100% 100%;
}
.prog4 {
width: 10em;
height: 1em;
}
.prog4::-webkit-progress-bar {
background-color: #eee;
border-radius: 2px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25) inset;
}
.prog4[value]::-webkit-progress-value {
background-image: -webkit-linear-gradient(-45deg,
transparent 33%, rgba(0, 0, 0, .1) 33%,
rgba(0, 0, 0, .1) 66%, transparent 66%),
-webkit-linear-gradient(top,
rgba(255, 255, 255, .25),
rgba(0, 0, 0, .25)),
-webkit-linear-gradient(left, #FFD700, #FF0000);
border-radius: 2px;
background-size: 35px 20px, 100% 100%, 100% 100%;
}
.prog5 {
width: 10em;
height: 1em;
}
.prog5::-webkit-progress-bar {
background-color: #eee;
border-radius: 2px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.25) inset;
}
.prog5[value]::-webkit-progress-value {
background-image: -webkit-linear-gradient(-45deg,
transparent 33%, rgba(0, 0, 0, .1) 33%,
rgba(0, 0, 0, .1) 66%, transparent 66%),
-webkit-linear-gradient(top,
rgba(255, 255, 255, .25),
rgba(0, 0, 0, .25)),
-webkit-linear-gradient(left, #FF0000, #FF0000);
border-radius: 2px;
background-size: 35px 20px, 100% 100%, 100% 100%;
}
.dvfirs {
overflow: hidden;
white-space: nowrap;
float: left;
margin-left: 20px;
width: 350px;
text-align: center;
}
.dvsec {
overflow: hidden;
white-space: nowrap;
float: left;
width: 140px;
}
.dvtre {
overflow: hidden;
white-space: nowrap;
float: left;
width: 60px;
}
div.grid-container-main {
display: grid;
grid-template-columns: 265px auto 111px;
gap: 10px 5px;
grid-template-areas:
' . . .'
'footer footer footer';
}
div.grid-container-main > div {
vertical-align: top;
}
div.grid-container-main > div.bottom {
grid-area: footer;
}
div.grid-container-main > div.center {
margin-top: 18px;
}
span.donatedEkr {
background-color: lightyellow;
padding: 2px;
border-radius: 4px;
}

View File

@ -3,6 +3,7 @@
use Core\Config;
use Core\Db;
use Core\View;
use Enum\ShopId;
use Helper\Conversion;
use Location\Shop;
use User\Clan;
@ -28,13 +29,13 @@ $giftsvars = [];
$otdel = 1;
if ((int)$u->info['room'] === 10) {
$shopId = Shop::MAIN;
$shopId = ShopId::MAIN;
}
if ((int)$u->info['room'] === 368) {
$shopId = Shop::SHOP_2;
$shopId = ShopId::SHOP_2;
}
if ((int)$u->info['room'] === 13) {
$shopId = Shop::BEREZKA;
$shopId = ShopId::BEREZKA;
}
if ($_SERVER["REQUEST_METHOD"] === "GET") { //неясно почему, $_GET вызывается буквалльно всегда, даже на пустом месте.
@ -91,7 +92,7 @@ if ($actionSale) {
ItemsModel::delete($item['id']);
$u->addKr($sellprice);
$status = "Вы успешно продали предмет «{$item['name']}» за $sellprice кр.";
Delo::add(2, 'shopid:' . $shopId, $u->info['id'], "Предмет «{$item['name']}» [id:{$item['id']}] продан за $sellprice кр.", -$sellprice);
Delo::add(2, 'shopid:' . $shopId->value, $u->info['id'], "Предмет «{$item['name']}» [id:{$item['id']}] продан за $sellprice кр.", -$sellprice);
}
}
}
@ -132,7 +133,7 @@ $renderArgs = [
'shop' => $shop,
'goLis' => $goLis,
'code' => $code,
'shopId' => $shopId,
'shopId' => $shopId->value,
'otdels' => $shop->getUsedOtdels(),
'i' => 1,
];