users[]['eff'] после использования, в противном случаи некотрые приемы используются через 1 ход
*/
class Priems
{
const FIRE = 'fire';
const WATER = 'water';
const AIR = 'air';
const EARTH = 'earth';
public $ue = [];
private $btl;
private $u;
private $mname = [
'огонь' => 1,
'воздух' => 2,
'вода' => 3,
'земля' => 4,
'свет' => 5,
'тьма' => 6,
'серая' => 7,
];
private $logColor = [
'crit' => '#f00',
'miss' => '#888',
self::FIRE => '#a00',
self::WATER => '#00a',
self::EARTH => '#0a0',
self::AIR => '#0af',
];
public function __construct(private readonly Stat $statnames = new Stat())
{
global $btl;
$this->btl = $btl;
$this->u = User::start();
$this->statnames->getRequirement();
}
/** Набив Статики
* @param int $uid если 0, будет использоваться id противника напротив.
* @return void
*/
public function addAirStaticPoints($uid = 0)
{
if ($uid == 0) {
$uid = $this->ue['id'];
}
$x = Db::getValue(
'select x from eff_users where uid = ? and `delete` = 0 and v2 = 260 and user_use = ? order by id desc limit 1',
[$uid, $this->u->info['id']]
);
if (empty($x) || $x >= 5) {
return;
}
$x++;
$data['add_mg2static_points'] = $x;
$data = Conversion::arrayToDataString($data);
Db::sql(
'update eff_users set x = ?, data = ? where uid = ? and `delete` = 0 and v2 = 260 and user_use = ?',
[$x, $data, $uid, $this->u->info['id']]
);
}
/** отнимаем ману
* @param $uid
* @param $mp
* @param $tp [not used]
* @return bool
*/
public function minMana($uid, $mp, $tp = null)
{
global $btl;
/* уменьшаем расход маны, если $mp > 0 */
//с вычетом уменьшения разсхода маныss
$mp -= round($mp / 100 * $btl->stats[$btl->uids[$uid]]['min_use_mp']);
$btl->stats[$btl->uids[$uid]]['mpNow'] -= $mp;
$mpNow = $this->zeromax($btl->stats[$btl->uids[$uid]]['mpNow'], $btl->stats[$btl->uids[$uid]]['mpAll']);
if ($mpNow > 0) {
Db::sql(
'update stats set mpnow = ? where id = ?',
[$btl->stats[$btl->uids[$uid]]['mpNow'], $uid]
);
}
return $mpNow > 0;
}
private function zeromax($num, $max)
{
if ($num <= 0) {
return 0;
}
if ($num > $max) {
$num = $max;
}
return $num;
}
/** используем прием каждый ход
* @param $eff
* @param $pr
* @return bool
*/
public function hodUsePriem($eff, $pr)
{
global $btl;
$u = $this->u; // Для присоедиянемых файлов.
$return_main = true;
$ue = Db::getRow(
'select * from users left join stats on (users.id = stats.id) where users.id = ? and battle = ? and hpnow > 0',
[$eff['uid'], $btl->i->id]
);
if (!empty($pr['file'])) {
if (file_exists('../../_incl_data/class/priems/' . $pr['file'] . '.php')) {
$hod = $eff['hod'];
require_once 'priems/' . $pr['file'] . '.php';
}
} elseif (!empty($pr['file3'])) {
if (file_exists('../../_incl_data/class/priems/' . $pr['file3'] . '.php')) {
$hod = $eff['hod'];
require_once 'priems/' . $pr['file3'] . '.php';
}
}
return $return_main;
}
public function magicRegen($ue, $hpmin, $tmp, $pl, $eff, $rp = 0, $dp = 0, $krituet = true, $dopyrn = 0)
{
global $btl;
$rr = [];
$uen = $ue['id'];
$usu = $eff['user_use'];
if ($eff['user_use'] < 1) {
$usu = $this->u->info['id'];
}
$k = $this->magKrit($ue['level'], $btl->stats[$btl->uids[$usu]]['mg' . $tmp]);
if (!$krituet) {
$k = 0;
}
$hpmin = $this->testPower($btl->stats[$btl->uids[$usu]], $btl->stats[$btl->uids[$uen]], $hpmin, $tmp, 2);
$hpmin = round($hpmin);
$dopyrn = $this->testPower($btl->stats[$btl->uids[$usu]], $btl->stats[$btl->uids[$uen]], $dopyrn, $tmp, 2);
$dopyrn = round($dopyrn);
if ($btl->users[$btl->uids[$uen]]['tactic7'] <= 0 && $dp == 0) {
$hpmin = 0;
$k = -1;
$dopyrn = 0;
}
if ($k == 1 && $hpmin != 0 && $krituet) {
//крит
$hpmin = $hpmin * 2;
} elseif ($k == -1 && $hpmin != 0) {
//промах
$hpmin = $hpmin / 2;
$dopyrn = $dopyrn / 2;
}
if ($hpmin < 1) {
$hpmin = 0;
} else {
$hpmin = rand(($hpmin * 0.97), $hpmin);
}
$hpmin += floor($dopyrn);
if (isset($btl->stats[$btl->uids[$uen]]['min_heal_proc'])) {
if ($btl->stats[$btl->uids[$uen]]['min_heal_proc'] > 100) {
$btl->stats[$btl->uids[$uen]]['min_heal_proc'] = 100;
}
$hpmin = round($hpmin / 100 * (100 + $btl->stats[$btl->uids[$uen]]['min_heal_proc']));
}
if ($btl->users[$btl->uids[$uen]]['tactic7'] > 0 && $dp == 0) {
//Отнимаем тактики, если это возможно
$btl->users[$btl->uids[$uen]]['tactic7'] -= $hpmin / $btl->stats[$btl->uids[$uen]]['hpAll'];
$btl->users[$btl->uids[$uen]]['tactic7'] = round($btl->users[$btl->uids[$uen]]['tactic7'], 2);
$btl->stats[$btl->uids[$uen]]['tactic7'] = $btl->users[$btl->uids[$uen]]['tactic7'];
if ($uen == $this->u->info['id']) {
$this->u->info['tactic7'] = $btl->users[$btl->uids[$uen]]['tactic7'];
$this->u->stats['tactic7'] = $btl->users[$btl->uids[$uen]]['tactic7'];
}
if ($btl->users[$btl->uids[$uen]]['tactic7'] < 0) {
$btl->users[$btl->uids[$uen]]['tactic7'] = 0;
}
}
$hp2 = floor($btl->stats[$btl->uids[$uen]]['hpNow'] + $hpmin);
if ($hp2 > $btl->stats[$btl->uids[$uen]]['hpAll']) {
$hpmin = floor($hp2 - $btl->stats[$btl->uids[$uen]]['hpAll']);
$hp2 = $btl->stats[$btl->uids[$uen]]['hpAll'];
} elseif ($hp2 < 0) {
$hp2 = 0;
}
$rr[0] = $hpmin; //урон
$rr[1] = $k; //тип
/* проверяем приемы защиты */
//получаем массив с приемами противника
$miny = 0; //на сколько едениц урон буде меньше (защита приема)
$minu = 0;
$sp1 = mysql_query(
'SELECT `e`.* FROM `eff_users` AS `e` WHERE `e`.`uid` = "' . $uen . '" AND `e`.`id_eff` = "22" AND `e`.`delete` = "0" AND `e`.`v1` = "priem" LIMIT 25'
);
while ($pl2 = mysql_fetch_assoc($sp1)) {
$pl2['priem'] = mysql_fetch_assoc(
mysql_query('SELECT * FROM `priems` WHERE `id` = "' . $pl2['v2'] . '" LIMIT 1')
);
if (isset($pl2['priem']['id'])) {
$dt1 = Conversion::dataStringToArray($pl2['priem']['date2']);
if (isset($dt1['yron_u2'])) {
$minu = $this->getdr(
$dt1['yron_u2'], [0 => 'lvl1', 1 => 'yr1', 2 => 'ts5', 3 => 'ts6'],
[0 => $btl->users[$btl->uids[$level]], 1 => $hpmin, 2 => 0, 3 => 0]
);
$miny -= $minu;
$hpmin += $minu;
$btl->delPriem($pl2, $btl->users[$btl->uids[$uen]]);
}
}
}
/* проверяем приемы ослабления */
//отнимаем НР
$btl->users[$btl->uids[$uen]]['hpNow'] = $hp2;
$btl->stats[$btl->uids[$uen]]['hpNow'] = $hp2;
mysql_query(
'UPDATE `stats` SET `hpNow` = ' . $hp2 . ',`tactic7` = ' . $btl->users[$btl->uids[$uen]]['tactic7'] . ' WHERE `id` = "' . $uen . '" LIMIT 1'
);
//заносим в лог боя
$vLog =
'time1=' . time() .
'||s1=' . $this->u->info['sex'] .
'||t1=' . $this->u->info['team'] .
'||login1=' . $this->u->info['login'] .
'||s2=' . $btl->users[$btl->uids[$uen]]['sex'] .
'||t2=' . $btl->users[$btl->uids[$uen]]['team'] .
'||login2=' . $btl->users[$btl->uids[$uen]]['login'];
$mas1 = [
'time' => time(),
'battle' => $btl->i->id,
'id_hod' => ($btl->hodID + 1),
'text' => '',
'vars' => $vLog,
'zona1' => '',
'zonb1' => '',
'zona2' => '',
'zonb2' => '',
'type' => '1',
];
if ($rp == 1) {
$mas1['id_hod']--;
}
$btl->takeExp($this->u->info['id'], ($hpmin * 0.33), $this->u->info['id'], $uen, true);
if ($hpmin > 0) {
$hpmin = '+' . ceil($hpmin);
} else {
$hpmin = '--';
}
$tco = [1 => '006699', 2 => '006699', 3 => '006699', 4 => '006699']; //не крит
$tcl = [1 => 'A00000', 2 => '008080', 3 => '0000FF', 4 => 'A52A2A']; //не крит
$tco = $tco[$tmp];
$tcl = $tcl[$tmp];
if ($k == 1) {
//крит
$tco = 'FF0000';
$tcl = 'FF0000';
} elseif ($k == -1) {
//промах
$tco = '979797';
$tcl = '979797';
}
$nmz = [
1 => [0 => 'огня', 1 => 'огненная'],
2 => [0 => 'воздуха', 1 => 'электрическая'],
3 => [0 => 'воды', 1 => 'водная'],
4 => [0 => 'земли', 1 => 'земляная'],
];
$nmz = $nmz[$tmp];
if ($rp == 1) {
$sx = [0 => '', 1 => 'а'];
$mas1['text'] = '{tm1} Заклинание "' . $pl['name'] . '" восстановило здоровье персонажа {u2}. ' . $hpmin . ' [' . ceil(
$hp2
) . '/' . $btl->stats[$btl->uids[$uen]]['hpAll'] . ']';
} else {
$mas1['text'] = '{tm1} {u1} {1x16x0} заклинание "' . $pl['name'] . '" и восстановил здоровье персонажа {u2} магией ' . $nmz[0] . '. ' . $hpmin . ' [' . ceil(
$hp2
) . '/' . $btl->stats[$btl->uids[$uen]]['hpAll'] . ']';
}
$btl->add_log($mas1);
$pz[(int)$id] = 1;
return $rr;
}
/** Какой-то нестандартный частный расчет маг.крита
* @param $l2
* @param $t
* @return int
*/
public function magKrit($l2, $t)
{
$r = $l2 * 2 - 7;
if ($r > $t) {
//магический промах (серый удар, в 2 раза меньше) 6%
//250 ед. защиты от магии дает 1% шанса увернуться от магии
//$r = -1; , промах --
$r = 0;
} else {
//каждая владелка дает 3% шанс крита
$r = ceil($t * 0.75);
if ($r > 30) {
$r = 30;
}
if (rand(0, 10000) < $r * 100) {
//крит удар
$r = 1;
} else {
$r = 0;
}
}
return $r;
}
public function testPower($s1, $s2, $y, $t, $t2)
{
global $u, $btl;
$r = 0;
if ($t2 == 2) {
//урон магией
$pm = [0 => 0, 1 => 0, 2 => 0, 3 => 0];
if ($t < 5) {
$pm[0] = $s1['m11'];
$pm[1] = $s2['zm'];
$pm[2] = $s2['antm11'];
}
if (isset($btl->i->id)) {
$pm[3] = $btl->zmgo($s2['zm' . $t]);
$pm[3] = round($pm[3]);
}
//урон = b*(1+m/100)*2^((p*10-z)/k)
$fx_vl = [
250,
250,
250,
250,
250,
250,
250,
250,
250,
350,
400,
450,
500,
550,
600,
650,
700,
750,
800,
850,
900,
950,
];
$fx = [
'b' => $y, //базовый урон
'm' => round($s1['pm' . $t] * 1 - $s2['antpm' . $t]), //мощь
'z' => round($s2['zm' . $t]), //защита цели ед.
'p' => round(($s1['pzm'] + $s1['pzm' . $t])), //подавление
'k' => $fx_vl[(0 + $s1['lvl'])], //коэффициент ; k=250 для 8ки, k=300 для 9ки и т.д. +20% на уровень
];
if (($fx['z'] + 250) - $fx['p'] * 10 < 0) { //защита не может уйти больше, чем в 250 ед.
$fx['p'] = ($fx['z'] + 250) / 10;
}
$fx['p'] = 0;
//
$p = $fx['b'] * (1 + $fx['m'] / 100) * pow(2, (($fx['z'] - $fx['p'] * 10) / $fx['k']));
//$p += $p/100*10;
$p -= $p / 100 * $pm[3];
//$p += floor($s1['s5']*0.25);
if ($p < round($y * 0.1)) {
$p = round($y * 0.1);
} elseif ($p > round($y * 10)) {
$p = $y * 10;
}
if (isset($s2['zm' . $t . 'proc'])) //защита от магии стихий (призрачки)
{
$p = floor($p / 100 * (100 - $s2['zm' . $t . 'proc']));
if ($p < 0) {
$p = 0;
}
}
if (isset($s2['zmproc'])) //защита от магии стихий (призрачки)
{
if ($s2['zmproc'] >= 75) {
$p = floor($p / 100 * (100 - 75));
} else {
$p = floor($p / 100 * (100 - $s2['zmproc']));
if ($p < 0) {
$p = 0;
}
}
}
$r = $p;
}
return round($r / 100 * 70);
}
/**@deprecated try to use getDynamicInfo() */
private function getdr($s, $v, $d)
{
$i = 0;
while ($i < count($v)) {
if (isset($v[$i])) {
$s = str_replace('{' . $v[$i] . '}', $d[$i], $s);
}
$i++;
}
$s = eval("return (" . $s . ");");
return floor($s);
}
/* uid - на кого кастуем
pr - id приема
data - дата, если -1, то добавляем дату3
d2 - добавляем дату3
tm - время использования, 77 - вечно
h - кол-во "вечных" ходов
uu - id юзера который использовал
tp - тип приема
*/
/** Оставлена для совместимости. На неё ссылается куча всего. */
public function magatack($u1, $u2, $yron, $type, $krit)
{
global $btl;
return $this->magicAttack($btl, $u1, $u2, $yron, $type, $krit);
}
/**
* Новая функция магического заклинания с приёма.
* Работает с числовыми приёмами в папке [priem].
* @param int $attackerId кто использует приём
* @param int $defenderId на кого использует приём
* @param float $damage базовый урон приёма
* @param string $damageType тип урона (стихия?) приходит строкой, и конвертируется функцией.
* @param bool $hasCritical флаг, что приём МОЖЕТ критовать
* @return array [0|damage] int урон, [1|crit] bool был ли крит, [2|miss] bool был ли промах, [3|miss_type] int тип промаха (всегда = 2).
* @author Insallah
*/
public function magicAttack(Battle $btl, $attackerId, $defenderId, $damage, $damageType, $hasCritical = false)
{
// Не так паршиво как прошлая, но всё ещё паршиво. Теперь хоть что-то понять можно.
$dmgRuNames = [
self::FIRE => 'огонь',
self::WATER => 'вода',
self::AIR => 'воздух',
self::EARTH => 'земля',
];
if (in_array($damageType, array_keys($dmgRuNames))) {
$damageType = $dmgRuNames[$damageType];
}
// Мощь.
// pm# = Мф. мощности магии определенного типа
// m11 = Мф. мощности магии стихий
// m11a = Мф. мощности магии
// ОКАЗЫВАЕТСЯ [pm# = m11 + m11a] где-то выше по коду!
$power = $btl->stats[$btl->uids[$attackerId]]['pm' . $this->mname[$damageType]];
// Подавление в процентах.
$suppression = 0;
$suppression += $btl->stats[$btl->uids[$attackerId]]['pzm'];
// Уязвимость магии стихий, из приёма 250.
$suppression += $btl->stats[$btl->uids[$attackerId]]['yzm'];
// Сколько у использующего умений числом.
$skills = $btl->stats[$btl->uids[$attackerId]]['mg' . $this->mname[$damageType]];
// Защита цели числом
// zm# = Защита от магии определенного типа
// zm = Защита от магии стихий
// zma = Защита от магии
// ОКАЗЫВАЕТСЯ [zm# = zm + zma] где-то выше по коду!
$defence = $btl->stats[$btl->uids[$defenderId]]['zm' . $this->mname[$damageType]];
// Минимум умений для 100% успеха приёма.
// У 8 екро-мага со старта 20, это очень много: 8 бьёт 10 без промаха.
$requiredSkills = $btl->users[$btl->uids[$defenderId]]['level'] * 2;
// Чёртово "Следующий каст будет критическим".
$isGarantCrit = $btl->stats[$btl->uids[$attackerId]]['acestar'] > 0;
// Подавляем защиту, понижая число на процент подавления.
$supressedDefence = Math::addPercent($defence, -min($suppression, 100));
// Урон зависит от умений и уровня противника.
$damage *= $skills - $requiredSkills;
// Увеличиваем урон, повышая число на мощь если урон > 0.
$poweredDamage = $damage > 0 ? $damage + $power : 0;
// Шанс крита равен уровню магического навыка
$isCritical = $hasCritical && $skills >= mt_rand(0, 100);
if ($isGarantCrit) {
$isCritical = true;
Db::sql(
'delete from eff_users where uid = ? and `delete` = 0 and data like ?',
[$attackerId, '%add_acestar%']
);
unset($q);
}
if ($skills >= $requiredSkills || $isCritical) {
$isHit = true;
} else {
$isCritical = false;
$missChance = 3 * ($requiredSkills - $skills);
$isHit = mt_rand(0, 100) > $missChance;
}
// Для совместимости. Старая функция возвращает это значение, вдруг оно где-то используется.
$pType = 0;
if ($isHit) {
// Урон = Повреждения - Защита, но не меньше 0. Округлено до целых.
//$finalDamage = max(round(Math::addPercent($poweredDamage, -$supressedDefence)), 0);
$finalDamage = $poweredDamage - $supressedDefence;
if ($isCritical) {
$finalDamage *= 2;
}
} else {
$finalDamage = 0;
// Для совместимости. Старая функция возвращает это значение, вдруг оно где-то используется.
$pType = 2;
}
// Призрачки, режут конечный урон после вычета защиты.
$ghostDefences = $this->hasGhostDefence($defenderId);
if ($ghostDefences['all']) {
$finalDamage /= 4;
}
// Костыль для призрачек. Когда вызовы русских стихий уберутся, будет не нужен.
if (in_array($damageType, $dmgRuNames)) {
$damageType = array_search($damageType, $dmgRuNames);
}
if ($ghostDefences[$damageType]) {
$finalDamage /= 2;
}
$finalDamage = max(round($finalDamage), 0);
// Для отладки.
if ($btl->users[$btl->uids[$attackerId]]['admin'] > 0) {
$s = "Подавление защиты: $suppression%, Бонус урона: $power, Навыки: $skills,
Усиление урона от уровня и скилла: damage x ($skills - $requiredSkills)
$damageType
Его Защита: ($defence -$suppression%) = $supressedDefence |
Мой Урон: ($damage +$power) = $poweredDamage
Мой Удар: ($poweredDamage -$supressedDefence) = $finalDamage";
$s .= $isCritical ? ' (крит *2)' : '';
echo "
$s
";
}
// !isHit потому что прошлая функуция возвращала Промах.
// pType ни на что не влияет, = 0 и просто становится = 2 при промахе. Зачем - загадка.
// -damage потому что где-то дальше код разворачивает результат меняя ему знак.
return [
(int)$finalDamage,
$isCritical,
!$isHit,
$pType, // для совместимости
'damage' => (int)$finalDamage,
'crit' => $isCritical,
'miss' => !$isHit,
'miss_type' => $pType,
];
}
/** Проверка есть ли на персонаже призрачные защиты для рассчёта урона через magicAttack
* @return array
*/
private function hasGhostDefence($uid)
{
$def = [
'all' => false,
self::FIRE => false,
self::AIR => false,
self::EARTH => false,
self::WATER => false,
];
$priems = Db::getRows('select v2 from eff_users where uid = ? and v2 in (141, 142, 144, 145, 146)', [$uid]);
foreach ($priems as $priem) {
if ($priem['v2'] == 141) {
$def['all'] = true;
}
if ($priem['v2'] == 142) {
$def[self::FIRE] = true;
}
if ($priem['v2'] == 144) {
$def[self::AIR] = true;
}
if ($priem['v2'] == 145) {
$def[self::WATER] = true;
}
if ($priem['v2'] == 146) {
$def[self::EARTH] = true;
}
}
return $def;
}
public function magatackfiz($u1, $u2, $yron, $type, $krit, $ymelki)
{
global $btl;
$cof_mag = [
0 => 250,
1 => 250,
2 => 250,
3 => 250,
4 => 250,
5 => 250,
6 => 250,
7 => 250,
8 => 250,
9 => 300,
10 => 360,
11 => 475,
12 => 520,
13 => 625,
14 => 750,
15 => 895,
16 => 1075,
17 => 1290,
18 => 1550,
19 => 1860,
20 => 2230,
21 => 2675,
];
$r = $yron;
//
if (!isset($ymelki) || $ymelki == '0') {
$ymelki = $type;
}
//
$prm = [
'ym' => $btl->stats[$btl->uids[$u1]]['mg' . $this->mname[$ymelki]], //умелки (магические умелки)
'y' => $btl->stats[$btl->uids[$u1]]['a' . $this->mname[$ymelki]], //умелки
'yv' => 0, //умения, значение коф.
'max_krit' => 0, //вероятность крита
];
//
// (уровень цени)*2 - 7 - минимальное умелок, чтобы не было промахов
/*
Для магии Света/Тьмы по формуле: Уровень Цели * 2 – 9
каждая умелка выше этой нормы увеличивает маг крит на 3%. но не больше 30%
*/
//Рассчет урона от приема
/*
b - базовый урон
m - мощь
z - защита цели [ед.]
p - подавление [ед.]
k - коэффициент ; k=250 для 8ки, k=300 для 9ки и т.д. +20% на уровень
*/
$prm['b'] = $r; //базовый урон
$prm['m'] = $btl->stats[$btl->uids[$u1]]['pa' . $this->mname[$type]]; //мощь
$prm['z'] = $btl->stats[$btl->uids[$u2]]['za' . $this->mname[$type]]; //защита цели (ед.)
$prm['p'] = $btl->stats[$btl->uids[$u1]]['pza' . $this->mname[$type]]; //подавление (ед.)
$prm['k'] = $cof_mag[$btl->users[$btl->uids[$u1]]['level']]; //коэффицент
//
if ($prm['p'] * 10 > $prm['k']) {
$prm['p'] = floor($prm['k'] / 10);
}
//
$r = $prm['b'] * (1 + $prm['m'] / 100) * pow(2, (($prm['p'] * 10 - $prm['z']) / $prm['k']));
if ($r < floor($prm['b'] * 0.2)) {
$r = floor($prm['b'] * 0.2);
} elseif ($r > floor($prm['b'] * 10)) {
$r = floor($prm['b'] * 10);
}
//
//$prm['y'] -= 5;
if ($type < $this->mname[$type]) {
$prm['yv'] = ($btl->users[$btl->uids[$u2]]['level'] * 2 - 7);
} else {
$prm['yv'] = ($btl->users[$btl->uids[$u2]]['level'] * 2 - 9);
}
//
if ($prm['y'] >= $prm['yv'] || (isset($this->mname[$ymelki]) && $prm['ym'] >= $prm['yv'])) {
if ($krit == 1) {
if (isset($this->mname[$ymelki])) {
$prm['max_krit'] = 3 * ($prm['ym'] - $prm['yv']);
} else {
$prm['max_krit'] = 3 * ($prm['y'] - $prm['yv']);
}
//echo '[Magical crit: '.$prm['max_krit'].'%]';
if ($prm['max_krit'] < 0) {
$prm['max_krit'] = 0;
} elseif ($prm['max_krit'] > 30) {
$prm['max_krit'] = 30;
}
//$prm['max_krit'] = round($prm['max_krit']/2);
//Крит возможен
if (rand(0, 100) <= $prm['max_krit']) {
$krit = true;
} else {
$krit = false;
}
} else {
$krit = false;
}
$promah = false;
} else {
$krit = false;
//Вероятность промоха
$prm['promah'] = 3 * ($prm['yv'] - $prm['ym']);
if ($prm['promah'] < 0) {
$prm['promah'] = 0;
} elseif ($prm['promah'] > 30) {
$prm['promah'] = 30;
}
if (rand(0, 100) <= $prm['promah']) {
$promah = true;
} else {
$promah = false;
}
}
//
if ($krit) {
$r = $r * 2;
$promah_type = 0;
} elseif ($promah) {
$r = rand(1, floor($r / 4));
$promah_type = 1;
if (rand(0, 100) < 50) {
$r = 0;
$promah_type = 2;
}
}
//
unset($prm);
//
return [floor($r), $krit, $promah, $promah_type];
}
public function magicAtack(
$ue,
$hpmin,
$tmp,
$pl,
$eff,
$rp = 0,
$mxx = 0,
$fiz = 0,
$nomf = 0,
$krituet = true,
$heal = 0,
$namenew = null
) {
$trawm_off = false;
global $btl;
if ($namenew != null) {
$pl['name'] = $namenew;
}
$rr = [];
$nhpmin = $hpmin;
$uen = $ue['id'];
$usu = $eff['user_use'];
if ($eff['user_use'] < 1) {
$usu = $this->u->info['id'];
}
if ($nomf == 0) {
$k = $this->magKrit($ue['level'], $btl->stats[$btl->uids[$usu]]['mg' . $tmp]);
if (!$krituet) {
$k = 0;
}
if ($fiz == 0) {
//магический урон
$hpmin = $this->testPower(
$btl->stats[$btl->uids[$usu]], $btl->stats[$btl->uids[$uen]], $hpmin, $tmp,
2
);
} else {
//физический урон
$wAp = $btl->stats[$btl->uids[$usu]]['pa' . $tmp . ''];
$wAp += $btl->stats[$btl->uids[$usu]]['m10'];
$wAp -= $btl->stats[$btl->uids[$uen]]['antpa' . $tmp . ''] * 1.75;
$wAp -= $btl->stats[$btl->uids[$uen]]['antm10'] * 1.75;
$hpmin += ceil((0.01 + $hpmin / 100) * (0.01 + 0.98 * $wAp)) - 1;
$hpmin -= round(
$hpmin / 100 * (35 * ($btl->stats[$btl->uids[$uen]]['za'] + $btl->stats[$btl->uids[$uen]]['za' . $tmp]) / 1200)
);
$hpmin = round($hpmin);
if (isset($btl->stats[$btl->uids[$uen]]['zaproc']) || isset($btl->stats[$btl->uids[$uen]]['za' . $fiz . 'proc'])) //защита от урона (призрачки)
{
$hpmin = floor(
$hpmin / 100 * (100 - $btl->stats[$btl->uids[$uen]]['zaproc'] - $btl->stats[$btl->uids[$uen]]['za' . $fiz . 'proc'])
);
if ($hpmin < 0) {
$hpmin = 0;
}
}
}
}
$hpmin = round($hpmin);
if ($k == 1 and $krituet) {
//крит
$hpmin = $hpmin * 2;
} elseif ($k == -1) {
//промах
$hpmin = $hpmin / 2;
}
if ($hpmin < $nhpmin * 0.2) {
$hpmin = $nhpmin * 0.2;
}
if ($hpmin < 1) {
$hpmin = 0;
} else {
if ($nomf == 0) {
$hpmin = rand(($hpmin * 0.97), $hpmin);
}
}
if ($mxx > 0 && $hpmin > $mxx) {
if ($k == 0) {
$hpmin = $mxx;
} elseif ($k == 1 && $hpmin / 2 > $mxx) {
$hpmin = $mxx * 2;
}
}
$rr[0] = $hpmin; //урон
$rr[1] = $k; //тип
/* проверяем приемы защиты */
//получаем массив с приемами противника
$miny = 0; //на сколько едениц урон буде меньше (защита приема)
$sp1 = mysql_query(
'SELECT `e`.* FROM `eff_users` AS `e` WHERE `e`.`uid` = "' . $uen . '" AND `e`.`id_eff` = "22" AND `e`.`delete` = "0" AND `e`.`v1` = "priem" LIMIT 25'
);
while ($pl2 = mysql_fetch_assoc($sp1)) {
$pl2['priem'] = mysql_fetch_assoc(
mysql_query('SELECT * FROM `priems` WHERE `id` = "' . $pl2['v2'] . '" LIMIT 1')
);
if (isset($pl2['priem']['id'])) {
$dt1 = Conversion::dataStringToArray($pl2['priem']['date2']);
if (isset($dt1['yron_u2'])) {
$minu = $this->getdr(
$dt1['yron_u2'], [0 => 'lvl1', 1 => 'yr1', 2 => 'ts5', 3 => 'ts6'],
[0 => $btl->users[$btl->uids[$level]], 1 => $hpmin, 2 => 1, 3 => 0]
);
$miny -= $minu;
$hpmin += $minu;
if (isset($dt1['rzEndMg']) && $dt1['rzEndMg'] == 1) {
$btl->delPriem($pl2, $btl->users[$btl->uids[$uen]]);
}
} elseif (isset($dt1['rzEndMg']) && $dt1['rzEndMg'] == 1) {
$btl->delPriem($pl2, $btl->users[$btl->uids[$uen]]);
}
}
}
$hpmin = $btl->testPogB($uen, $hpmin);
$hp2 = floor($btl->stats[$btl->uids[$uen]]['hpNow'] - $hpmin);
if ($btl->stats[$btl->uids[$usu]]['yrnhealmpprocmg' . $tmp] > 0 && $fiz == 0) {
//Часть урона восставнавливает ману
$btl->stats[$btl->uids[$usu]]['mpNow'] += round(
$hpmin / 100 * $btl->stats[$btl->uids[$usu]]['yrnhealmpprocmg' . $tmp]
);
//if($btl->stats[$btl->uids[$usu]]['mpNow'] > $btl->stats[$btl->uids[$usu]]['mpAll']) {
//$btl->stats[$btl->uids[$usu]]['mpNow'] = $btl->stats[$btl->uids[$usu]]['mpAll'];
//}
$btl->users[$btl->uids[$usu]]['mpNow'] = $btl->stats[$btl->uids[$usu]]['mpNow'];
if ($usu == $this->u->info['id']) {
$this->u->info['mpNow'] = $btl->stats[$btl->uids[$usu]]['mpNow'];
$this->u->stats['mpNow'] = $btl->stats[$btl->uids[$usu]]['mpNow'];
}
}
if ($hp2 < 0) {
$hp2 = 0;
} elseif ($hp2 > $btl->stats[$btl->uids[$uen]]['hpAll']) {
$hp2 = $btl->stats[$btl->uids[$uen]]['hpAll'];
}
$btl->stats[$btl->uids[$uen]]['last_hp'] = -floor($hpmin);
if ($heal != 0) {
if ($heal == -1) {
//хил на текущий урон с учетом мф
$btl->stats[$btl->uids[$eff['user_use']]]['hpNow'] += $hpmin;
if ($btl->stats[$btl->uids[$eff['user_use']]]['hpNow'] < 0) {
$btl->stats[$btl->uids[$eff['user_use']]]['hpNow'] = 0;
} elseif ($btl->stats[$btl->uids[$eff['user_use']]]['hpNow'] > $btl->stats[$btl->uids[$eff['user_use']]]['hpAll']) {
$btl->stats[$btl->uids[$eff['user_use']]]['hpNow'] = $btl->stats[$btl->uids[$eff['user_use']]]['hpAll'];
}
if ($eff['user_use'] == $this->u->info['id']) {
$this->u->stats['hpNow'] = $btl->stats[$btl->uids[$eff['user_use']]]['hpNow'];
}
$btl->users[$btl->uids[$eff['user_use']]]['hpNow'] = $btl->stats[$btl->uids[$eff['user_use']]]['hpNow'];
mysql_query(
'UPDATE `stats` SET `hpNow` = "' . $btl->stats[$btl->uids[$eff['user_use']]]['hpNow'] . '" WHERE `id` = "' . $eff['user_use'] . '" LIMIT 1'
);
} else {
//хил на конкретное число
}
}
/* проверяем приемы ослабления */
//отнимаем НР
$btl->users[$btl->uids[$uen]]['hpNow'] = $hp2;
$btl->stats[$btl->uids[$uen]]['hpNow'] = $hp2;
if ($uen == $this->u->info['id']) {
$this->u->stats['hpNow'] = $hp2;
}
// тяж травма для кровавых
if ($btl->i->type == 99 and $hp2 == 0 and !$trawm_off) {
//$eff['user_use']
//$sp1 = mysql_query('SELECT `e`.* FROM `eff_users` AS `e` WHERE `e`.`uid` = "'.$uen.'" AND `e`.`id_eff` = "22" AND `e`.`delete` = "0" AND `e`.`v1` = "priem" LIMIT 25');
$trawm_off = true;
//$at[2][$i]['ttravm']='получил Тяжелую травму.';
Effects::addInjury($btl->users[$btl->uids[$uen]]['id'], 3, $btl->users[$btl->uids[$eff['user_use']]]['level']);
}
$upd = mysql_query(
'UPDATE `stats` SET `hpNow` = ' . $hp2 . ',`last_hp` = "' . $btl->stats[$btl->uids[$uen]]['last_hp'] . '" WHERE `id` = "' . $uen . '" LIMIT 1'
);
//заносим в лог боя
$vLog = 'time1=' . time(
) . '||s1=' . $btl->users[$btl->uids[$usu]]['sex'] . '||t1=' . $btl->users[$btl->uids[$usu]]['team'] . '||login1=' . $btl->users[$btl->uids[$usu]]['login'] . '||s2=' . $btl->users[$btl->uids[$uen]]['sex'] . '||t2=' . $btl->users[$btl->uids[$uen]]['team'] . '||login2=' . $btl->users[$btl->uids[$uen]]['login'] . '';
$mas1 = [
'time' => time(),
'battle' => $btl->i->id,
'id_hod' => ($btl->hodID + 1),
'text' => '',
'vars' => $vLog,
'zona1' => '',
'zonb1' => '',
'zona2' => '',
'zonb2' => '',
'type' => '1',
];
if ($rp > 0) {
$mas1['id_hod']--;
}
$hpminkrit = 0;
if ($k == 1) {
$hpminkrit = $hpmin;
}
$btl->addNewStat(
[
'battle' => $this->u->info['battle'],
'uid1' => $this->u->info['id'],
'uid2' => $uen,
'time' => time(),
'type' => 0,
'a' => '10000',
'b' => 0,
'type_a' => 1,
'type_b' => 0,
'ma' => 1,
'mb' => 1,
'yrn' => $hpmin,
'yrn_krit' => $hpminkrit,
'tm1' => $this->u->info['team'],
'tm2' => $btl->users[$btl->uid[$uen]]['team'],
]
);
$btl->takeExp($this->u->info['id'], $hpmin, $usu, $uen);
if ($hpmin > 0) {
$hpmin = '-' . ceil($hpmin);
} else {
$hpmin = '--';
}
$tco = [
1 => '006699',
2 => '006699',
3 => '006699',
4 => '006699',
5 => '006699',
6 => '006699',
7 => '006699',
]; //не крит
$tcl = [
1 => 'A00000',
2 => '008080',
3 => '0000FF',
4 => 'A52A2A',
5 => '006699',
6 => '006699',
7 => '006699',
]; //не крит
$tco = $tco[$tmp];
$tcl = $tcl[$tmp];
if ($k == 1) {
//крит
$tco = 'FF0000';
$tcl = 'FF0000';
} elseif ($k == -1) {
//промах
$tco = 'CCCCCC';
$tcl = 'CCCCCC';
}
$nmz = [
1 => [0 => 'огня', 1 => 'огненный'],
2 => [0 => 'воздуха', 1 => 'электрический'],
3 => [0 => 'воды', 1 => 'холод'],
4 => [0 => 'земли', 1 => 'земляной'],
5 => [0 => 'Свет', 1 => 'Свет'],
6 => [0 => 'Тьма', 1 => 'Тьма'],
7 => [0 => 'Серая магия', 1 => 'Серая магия'],
];
$nmz = $nmz[$tmp];
if ($fiz > 0) {
$nmz = [
1 => [0 => ', колющая атака , ', 1 => 'колющий'],
2 => [0 => ', рубящая атака , ', 1 => 'рубящий'],
3 => [0 => ', дробящая атака , ', 1 => 'дробящий'],
4 => [0 => ', режущая атака , ', 1 => 'режущий'],
];
$nmz = $nmz[$fiz];
}
if ($rp == 1) {
if ($k == 0) {
$tcl = '000000';
$tco = '008000';
}
$sx = [0 => '', 1 => 'а'];
$mas1['text'] = '{tm1} {u2} утратил' . $sx[$btl->users[$btl->uids[$uen]]['sex']] . ' здоровье от "' . $pl['name'] . '". ' . $hpmin . ' [' . ceil(
$hp2
) . '/' . $btl->stats[$btl->uids[$uen]]['hpAll'] . ']';
} else {
if ($fiz == 1) {
$mas1['text'] = '{tm1} {u1} {1x16x0} прием "' . $pl['name'] . '" и поразил {u2}. ' . $hpmin . ' [' . ceil(
$hp2
) . '/' . $btl->stats[$btl->uids[$uen]]['hpAll'] . ']';
} else {
$mas1['text'] = '{tm1} {u1} {1x16x0} заклинание "' . $pl['name'] . '" и поразил магией ' . $nmz[0] . ' {u2}. ' . $hpmin . ' [' . ceil(
$hp2
) . '/' . $btl->stats[$btl->uids[$uen]]['hpAll'] . ']';
}
}
$btl->add_log($mas1);
$pz[(int)$id] = 1;
return $rr;
}
public function pruse($id)
{
global $btl;
$u = $this->u; // Для присоедиянемых файлов.
if ($id == 100500 && $this->u->info['animal'] > 0) {
$use_lst = $this->u->testAction(
'`uid` = "' . $this->u->info['id'] . '" AND `vars` = "animal_use' . $btl->i->id . '" LIMIT 1',
1
);
if (!isset($use_lst['id'])) {
$a = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `users_animal` WHERE `uid` = "' . $this->u->info['id'] . '" AND `id` = "' . $this->u->info['animal'] . '" AND `pet_in_cage` = "0" AND `delete` = "0" LIMIT 1'
)
);
if ($this->u->stats['hpNow'] < 1) {
echo 'Вы не можете выпустить зверя, вы потеряли все НР';
} elseif (isset($a['id']) && $a['eda'] < 1) {
echo 'Вы не накормили зверя...';
} elseif (isset($a['id'])) {
//Добавляем зверя в бой
$tp = [
1 => 'Кот',
2 => 'Сова',
3 => 'Светляк',
4 => 'Чертяка',
5 => 'Пес',
6 => 'Свин',
7 => 'Дракон',
];
$id = mysql_fetch_assoc(
mysql_query(
'SELECT `id` FROM `test_bot` WHERE `login` = "' . $tp[$a['type']] . ' [' . $a['level'] . ']" LIMIT 1'
)
);
if (isset($id['id']) && $btl->i->type != 500) {
$b = $this->u->addNewbot($id['id'], null, null);
if ($b > 0 && $b) {
$a['eda'] -= 4;
if ($a['eda'] < 0) {
$a['eda'] = 0;
}
$vLog = 'time1=' . time() . '||s1=' . $this->u->info['sex'] . '||t1=' . $this->u->info['team'] . '||login1=' . $this->u->info['login'] . '';
$mas1 = [
'time' => time(),
'battle' => $btl->i->id,
'id_hod' => $btl->hodID,
'vars' => $vLog,
'zona1' => '',
'zonb1' => '',
'zona2' => '',
'zonb2' => '',
'type' => '1',
];
$sex = $this->u->info['sex'] === 1 ? 'a' : '';
$mas1['text'] = "{tm1} {u1} выпустил$sex зверя "" . $a['name'] . '"';
$btl->add_log($mas1);
mysql_query(
'UPDATE `users` SET `login` = "' . $a['name'] . ' (зверь ' . $this->u->info['login'] . ')",`obraz` = "' . $a['obraz'] . '.gif",`battle` = "' . $btl->i->id . '" WHERE `id` = "' . $b['id'] . '" LIMIT 1'
);
mysql_query(
'UPDATE `stats` SET `team` = "' . $this->u->info['team'] . '" WHERE `id` = "' . $b['id'] . '" LIMIT 1'
);
mysql_query(
'UPDATE `users_animal` SET `eda` = "' . $a['eda'] . '" WHERE `id` = "' . $a['id'] . '" LIMIT 1'
);
$this->u->addAction(time(), 'animal_use' . $btl->i->id, $a['level']);
} else {
echo 'Не удалось выпустить зверя...';
}
} else {
//Бот не найден
echo '
Не удалось выпустить зверя - он боится...';
}
} else {
//зверь не найден
echo 'У Вас нет зверя ...';
}
} else {
//зверь уже выпущен
echo 'Вы уже выпускали зверя в этом бою ...';
}
} else {
$p = explode('|', $this->u->info['priems']);
$pz = explode('|', $this->u->info['priems_z']);
if ($p[(int)$id] > 0 && $pz[(int)$id] <= 0 && $this->u->info['hpNow'] >= 1) {
$pl = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `priems` WHERE `level`<=' . $this->u->info['level'] . ' AND `id` = ' . $p[(int)$id]
)
);
if (isset($pl['id']) && $pl['activ'] != 1) {
if ($pl['activ'] == 0) {
unset($pl);
} elseif ($pl['activ'] > 1) {
//Книжный прием
if ($this->testActiv($pl['activ']) == 0) {
unset($pl);
}
}
}
if (isset($pl['id'])) {
$notr = 0;
$pl['useon_user'] = $this->u->info['enemy'];
if (isset($_POST['useon']) && $_POST['useon'] != '' && $_POST['useon'] != 'none') {
$this->ue = mysql_fetch_assoc(
mysql_query(
'SELECT
`u`.`id`,`u`.`login`,`u`.`login2`,`u`.`online`,`u`.`admin`,`u`.`city`,`u`.`cityreg`,`u`.`align`,`u`.`clan`,
`u`.`level`,`u`.`money`,`u`.`money3`,`u`.`money4`,`u`.`battle`,`u`.`sex`,`u`.`obraz`,`u`.`win`,`u`.`win_t`,
`u`.`lose`,`u`.`lose_t`,`u`.`nich`,`u`.`timeMain`,`u`.`invis`,`u`.`bot_id`,`u`.`animal`,`u`.`type_pers`,
`u`.`notrhod`,`u`.`bot_room`,`u`.`inUser`,`u`.`inTurnir`,`u`.`inTurnirnew`,`u`.`stopexp`,`u`.`real`,
`st`.*
FROM `users` AS `u`
LEFT JOIN `stats` AS `st` ON (`u`.`id`=`st`.`id`)
WHERE (
`u`.`login`="' . mysql_real_escape_string($_POST['useon']) . '" OR
(
`u`.`login2` = "' . mysql_real_escape_string($_POST['useon']) . '" AND
`u`.`login2` != "")
) AND
(
`u`.`inUser` > 0 OR
(
`u`.`battle`="' . $btl->i->id . '" AND
`st`.`hpNow` > 0
)
) ORDER BY `u`.`id` DESC LIMIT 1'
)
);
if (isset($this->ue['id']) && $this->ue['inUser'] > 0) {
$this->ue = mysql_fetch_assoc(
mysql_query(
'SELECT
`u`.`id`,`u`.`login`,`u`.`login2`,`u`.`online`,`u`.`admin`,`u`.`city`,`u`.`cityreg`,`u`.`align`,`u`.`clan`,
`u`.`level`,`u`.`money`,`u`.`money3`,`u`.`money4`,`u`.`battle`,`u`.`sex`,`u`.`obraz`,`u`.`win`,`u`.`win_t`,
`u`.`lose`,`u`.`lose_t`,`u`.`nich`,`u`.`timeMain`,`u`.`invis`,`u`.`bot_id`,`u`.`animal`,`u`.`type_pers`,
`u`.`notrhod`,`u`.`bot_room`,`u`.`inUser`,`u`.`inTurnir`,`u`.`inTurnirnew`,`u`.`stopexp`,`u`.`real`,
`st`.*
FROM `users` AS `u`
LEFT JOIN `stats` AS `st` ON (`u`.`id`=`st`.`id`)
WHERE
`u`.`battle`="' . $btl->i->id . '" AND
`st`.`hpNow` > 0) AND
`u`.`id` = "' . $this->ue['inUser'] . '" ORDER BY `u`.`id` ASC LIMIT 1'
)
);
}
if (!isset($this->ue['id']) && $pl['trUser'] > 0) {
$notr++;
}
if ($pl['team'] == 1) {
//свои
if ($this->u->info['team'] != $this->ue['team']) {
$notr++;
}
} elseif ($pl['team'] == 2) {
//противники
if ($this->u->info['team'] == $this->ue['team']) {
$notr++;
}
}
} else {
$ga = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `battle_act` WHERE `battle` = "' . $btl->i->id . '" AND `uid1` = "' . $this->u->info['id'] . '" AND `uid2` = "' . $this->u->info['enemy'] . '" LIMIT 1'
)
);
if (($this->u->info['enemy'] == 0 || isset($ga['id'])) && ($pl['tr_hod'] > 0 || $pl['trUser'] > 0)) {
$notr++;
}
}
$notr += $this->testpriem($pl, 1, $this->ue['id']);
if ($this->ue['id'] > 0) {
$notr += $this->testRazmenOldUser($this->ue['id'], $this->u->info['enemy'], $pl['id']);
}
if ($notr == 0) {
mysql_query(
'UPDATE `stats` SET `last_pr` = "' . $pl['id'] . '" WHERE `id` = "' . $this->u->info['id'] . '" LIMIT 1'
);
//Приемы на персонажах
if ($this->ue['id'] > 0) {
$btl->priemsRazmen([$this->u->info['id'], $this->ue['id']], 'fast');
mysql_query(
'UPDATE `eff_users` SET `mark` = 1 WHERE `uid` = "' . $this->ue['id'] . '" AND `delete` = 0'
);
} else {
$btl->priemsRazmen([$this->u->info['id'], $this->u->info['enemy']], 'fast');
mysql_query(
'UPDATE `eff_users` SET `mark` = 1 WHERE `uid` = "' . $this->u->info['enemy'] . '" AND `delete` = 0'
);
}
mysql_query(
'UPDATE `eff_users` SET `mark` = 1 WHERE `uid` = "' . $this->u->info['id'] . '" AND `delete` = 0'
);
if (file_exists('../../_incl_data/class/priem/' . $pl['id'] . '.php')) {
require('../../_incl_data/class/priem/' . $pl['id'] . '.php');
$this->testDie($this->ue['id']);
} else {
echo 'useSkill' . $pl['id'];
}
if (!isset($cup)) {
$this->uppz($pl, $id);
//Отнимаем тактики
//$this->mintr($pl);
if ($pl['tr_hod'] > 0) {
$this->trhod($pl);
}
if ($pl['id'] != 258) {
if ($pl['cancel_eff'] == '') {
$pl['cancel_eff'] = '258';
} else {
$pl['cancel_eff'] .= ',258';
}
}
if ($pl['cancel_eff'] != '') {
$i = 0;
$e = explode(',', $pl['cancel_eff']);
while ($i < count($e)) {
if ($e[$i] > 0) {
if ($e[$i] == 258) {
$nem = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `eff_users` WHERE `uid` = "' . $this->u->info['id'] . '" AND `v1` = "priem" AND `v2` = "' . $e[$i] . '" AND `delete` = "0" AND `mark` = 1 LIMIT 1'
)
);
} else {
$nem = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `eff_users` WHERE `uid` = "' . $this->ue['id'] . '" AND `v1` = "priem" AND `v2` = "' . $e[$i] . '" AND `delete` = "0" AND `mark` = 1 LIMIT 1'
)
);
}
if (isset($nem['id'])) {
$nem['priem'] = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `priems` WHERE `id` = "' . $e[$i] . '" LIMIT 1'
)
);
if (isset($nem['id'])) {
$btl->delPriem($nem, $btl->users[$btl->uids[$this->ue['id']]], 500);
}
}
}
$i++;
}
}
}
}
}
}
}
}
//для папки priems
private function testActiv($id)
{
$r = 0;
if (
$this->u->info['admin'] > 0 ||
$this->u->info['nadmin'] > 0 ||
$this->u->info['id'] > 0) {
$r = 1;
} else {
$tst = $this->u->testAction(
'`uid` = "' . $this->u->info['id'] . '" AND `time` < ' . time() . ' AND `vars` = "read" AND `vals` = "' . $id . '" LIMIT 1',
1
);
if (isset($tst['id'])) {
$r = 1;
}
}
return $r;
}
public function testpriem($pl, $t = 1, $o = 0)
{
global $c, $u, $code, $btl;
$tr = Conversion::dataStringToArray($pl['tr']);
$d2 = Conversion::dataStringToArray($pl['date2']);
$x = 1;
$notr = 0;
if ($t == 2 && $pl['id'] == 181) {
$imun = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `eff_users` WHERE `uid` = "' . $this->u->info['enemy'] . '" and `v2`="191" and `delete`="0" LIMIT 1'
)
);
if ($imun) {
$notr++;
}
}
if (
isset($btl->stats[$btl->uids[$this->u->info['id']]]['nousepriem']) &&
$btl->stats[$btl->uids[$this->u->info['id']]]['nousepriem'] > 0 &&
$pl['nosh'] == 0 &&
($btl->stats[$btl->uids[$this->u->info['id']]]['noshock_voda'] <= 0 || !str_starts_with($pl['img'], 'wis_water_'))
) {
$notr++;
}
if (isset($btl->stats[$btl->uids[$this->u->info['id']]]['notuse_last_pr']) &&
$pl['id'] == $btl->stats[$btl->uids[$this->u->info['id']]]['notuse_last_pr']) {
$notr++;
}
while ($x <= 7) {
if (isset($btl->uids[$this->u->info['id']], $btl->users[$btl->uids[$this->u->info['id']]])) {
if ($btl->users[$btl->uids[$this->u->info['id']]]['tactic' . $x] < $pl['tt' . $x] && $x != 7 && $pl['tt' . $x] > 0) {
$notr++;
} elseif ($x == 7) {
if ($pl['tt' . $x] > 0 && $btl->users[$btl->uids[$this->u->info['id']]]['tactic' . $x] <= 0) {
$notr++;
}
}
}
$x++;
}
if ($pl['xuse'] > 0) {
$xu = $this->u->testAction(
'`vars` = "use_priem_' . $btl->i->id . '_' . $this->u->info['id'] . '" AND `vals` = "' . $pl['id'] . '" LIMIT ' . $pl['xuse'],
2
);
if ($xu[0] >= $pl['xuse']) {
$notr++;
}
}
$x = 0;
while ($x < count($this->statnames->sysRequirementNames)) {
$n = $this->statnames->sysRequirementNames[$x];
if (isset($tr['tr_' . $n])) {
if ($n == 'lvl') {
if ($tr['tr_' . $n] > $this->u->info['level']) {
$notr++;
}
} elseif ($tr['tr_' . $n] > $this->u->stats[$n]) {
$notr++;
}
}
$x++;
}
if ($pl['activ'] == 0 || ($this->testActiv($pl['activ']) == 0 && $pl['activ'] > 1)) {
$notr++;
}
//if($t==2)
//{
if (isset($d2['onlyOne']) || isset($d2['onlyOneX1'])) {
if (isset($d2['onlyOneX1'])) {
if ($d2['onlyOneX1'] == 1) {
$pru = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `eff_users` WHERE `uid` = "' . $this->u->info['id'] . '" AND `v2` = "' . $pl['id'] . '" AND `delete` = "0" AND `x` >= 1 LIMIT 1'
)
);
if (isset($pru['id']) && $pru['x'] >= $d2['onlyOne']) {
$notr++;
}
}
} elseif (isset($d2['onlyOne'])) {
if ($d2['onlyOne'] > 1) {
$pru = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `eff_users` WHERE `uid` = "' . $this->u->info['id'] . '" AND `v2` = "' . $pl['id'] . '" AND `delete` = "0" AND `x` > 1 LIMIT 1'
)
);
if (isset($pru['id']) && $pru['x'] >= $d2['onlyOne']) {
$notr++;
}
}
}
}
//Требует чтобы не было
if (isset($tr['tr_nousepriem'])) {
$x = 0;
$nouse = explode(',', $tr['tr_nousepriem']);
while ($x < count($nouse)) {
$nousev = explode('.', $nouse[$x]);
if (isset($btl->stats[$btl->uids[$this->u->info['id']]]['prsu'][$nousev[0]]) && $btl->stats[$btl->uids[$this->u->info['id']]]['prsu'][$nousev[0]] >= 0) {
if ($nousev[2] > 1) {
if ($nousev[2] <= $btl->stats[$btl->uids[$this->u->info['id']]]['prsu'][$nousev[0]]) {
$notr++;
}
} else {
$notr++;
}
}
$x++;
}
unset($nouse, $nousev);
}
if (isset($tr['tr_type_itm1'])) {
//требует наличие предмета определенного типа
$itmt = mysql_fetch_assoc(
mysql_query(
'SELECT `u`.`id` FROM `items_users` AS `u` LEFT JOIN `items_main` AS `m` ON `m`.`id` = `u`.`item_id` WHERE `m`.`type` = "' . $tr['tr_type_itm1'] . '" AND `u`.`inOdet` > 0 AND `u`.`uid` = "' . $this->u->info['id'] . '" AND `u`.`delete` = "0" LIMIT 1'
)
);
if (!isset($itmt['id'])) {
$notr++;
}
}
if (isset($tr['tr_mpNow'])) {
if (isset($btl->stats[$btl->uids[$this->u->info['id']]])) {
if ($btl->stats[$btl->uids[$this->u->info['id']]]['mpNow'] < round(
$tr['tr_mpNow'] / 100 * (100 - $btl->stats[$btl->uids[$this->u->info['id']]]['min_use_mp'])
)) {
$notr++;
}
} elseif ($this->u->info['mpNow'] < $tr['tr_mpNow']) {
$notr++;
}
}
if (isset($btl->uids[$this->u->info['id']], $btl->stats[$btl->uids[$this->u->info['id']]])) {
if ($pl['trUser'] == 1) {
//требует чтобы пользователь с кем-то разменивался (при ожидании прием гаснит)
if (isset($btl->ga[$this->u->info['id']][$this->u->info['enemy']])) {
$notr++;
}
} elseif ($pl['trUser'] == 2 && $o > 0) {
//требует чтобы пользователь с кем-то разменивался (при ожидании не пропадает, но не используется)
$ga = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `battle_act` WHERE `battle` = "' . $btl->i->id . '" AND `uid1` = "' . $this->u->info['id'] . '" AND `uid2` = "' . $btl->users[$btl->uids[$this->u->info['id']]]['enemy'] . '" LIMIT 1'
)
);
if (isset($ga['id'])) {
$notr++;
}
}
}
return $notr;
}
private function testRazmenOldUser($u2, $u1, $plid)
{
global $btl, $u;
$r = 0;
//Уровень -противника- ниже уровня -цели-
if ($btl->users[$btl->uids[$u2]]['id'] != $this->u->info['id']) {
if ($btl->users[$btl->uids[$u1]]['level'] < $btl->users[$btl->uids[$u2]]['level']) {
$r = 1;
echo 'Нельзя кастовать через слабого противника в сильного
';
} elseif ($btl->users[$btl->uids[$u1]]['bot'] > 0 && $btl->users[$btl->uids[$u2]]['bot'] == 0) {
echo 'Нельзя кастовать через монстров или зверя
';
$r = 1;
} elseif (
$btl->users[$btl->uids[$u1]]['id'] != $btl->users[$btl->uids[$u2]]['id'] &&
!in_array($plid, [35, 63, 64, 65, 66, 85, 86, 87, 88, 89, 90, 104, 105, 106, 107, 134, 135, 136, 137])
) //Атака в темную 90,89,88,87,86,85,35
{
$this->addPriem(
$this->u->info['id'], '344', 'add_m11=-' . round($this->u->stats['m11'] * 75 / 100), 1, 77, 1,
$this->u->stats['id'], 3, 'тьма', 0, 0, 1
); //ТУТ понижение урона при уроне через персонажа
}
}
return $r;
}
/**
* @param int $uid на кого кастуем
* @param int $pr id приема
* @param int|string $data дата, если -1, то добавляем дату3
* @param int $d2
* @param $tm
* @param int $h ход
* @param int $uu id юзера который использовал
* @param $max
* @param $bj
* @param $tp
* @param $ch
* @param $rdt
* @param $tr_life_user
* @param $noupdatebtl
* @param $noplus
* @param $pname
* @return bool
*/
public function addPriem(
$uid,
$pr,
$data,
$d2,
$tm,
$h,
$uu,
$max,
$bj,
$tp = 0,
$ch = 0,
$rdt = 0,
$tr_life_user = 0,
$noupdatebtl = 0,
$noplus = 0,
$pname = null
) {
global $btl;
//$pl = mysql_fetch_assoc(mysql_query('SELECT * FROM `priems` WHERE `id` = ' . (int)$pr));
$pl = Db::getRow('select * from priems where id = ?', [$pr]);
$r = false;
if (!$pl['id']) {
return false;
}
if ($data == -1) {
$data = $this->redate($pl['date3'], $this->u->info['id']);
} elseif ($d2 == 1) {
$data .= '|' . $this->redate($pl['date3'], $this->u->info['id']);
}
$this->cancelEffects($pl['cancel_eff2'], $uid, $btl);
if ($max <= 0) {
return false;
}
if ($noplus == 0) {
if ($pl['zmu'] == 1) {
$num = Db::getRow(
'select * from eff_users where bj = ? and user_use = ? and uid = ? and `delete` = 0',
[$bj, $this->u->info['id'], $uid]
);
} else {
$num = Db::getRow(
'select * from eff_users where bj = ? and uid = ? and `delete` = 0',
[$bj, $uid]
);
}
}
if (isset($num['id']) && ($num['user_use'] != $this->u->info['id'] && $pl['zmu'] != 2)) {
// удаляем эффект
Db::sql(
'update eff_users set `delete` = unix_timestamp() where id = ?',
[$num['id']]
);
$i = 0;
while ($i < count($btl->stats[$btl->uids[$uid]]['effects'])) {
if ($btl->stats[$btl->uids[$uid]]['effects'][$i]['id'] == $num['id']) {
//обновляем
$btl->stats[$btl->uids[$uid]]['effects'][$i]['delete'] = time();
}
$i++;
}
unset($num);
}
if (!isset($num['id'])) {
$q = 'insert into eff_users (tr_life_user, bj, user_use, hod, v2, img2, id_eff, uid, name, data, overtype, timeuse, v1) values (?,?,?,?,?,?,?,?,?,?,?,?,?)';
$image = !empty($pl['img']) ? $pl['img'] : $pl['id'];
$name = !empty($pname) ? $pname : $pl['name'];
$image .= '.gif';
Db::sql(
$q, [floor($tr_life_user), $bj, $uu, $h, $pl['id'], $image, 22, $uid, $name, $data, 0, $tm, 'priem']
);
$lid = Db::lastInsertId();
if ($lid) {
$r = true;
}
/* добавляем данные к $btl->eff */
if ($noupdatebtl == 0) {
$btl->stats[$btl->uids[$uid]] = $this->u->getStats($uid, 0);
}
} elseif ($num['x'] < $max) {
//Добавляем еще и обновляем заряды
$num['x']++;
$num['hod'] = $h;
if ($data != -1 && $data != '' && $d2 == 2) {
$num['data'] .= '|' . $data;
Db::sql(
'update eff_users set x = x + 1, hod = ?, data = ? where id = ?',
[$h, $num['data'], $num['id']]
);
} else {
Db::sql(
'update eff_users set x = x + 1, hod = ? where id = ?',
[$h, $num['id']]
);
}
$r = true;
} else {
//обновляем заряды
$num['hod'] = $h;
if ($data != -1 && $data != '' && $d2 == 2) {
$num['data'] .= '|' . $data;
Db::sql("update eff_users set hod = ?, data = ? where id = ?", [$h, $num['data'], $num['id']]);
} else {
Db::sql(
'update eff_users set hod = ? where id = ?',
[$h, $num['id']]
);
}
$r = true;
}
if (isset($num['id'])) {
foreach ($btl->stats[$btl->uids[$uid]]['effects'] as $effect) {
if ($effect['id'] != $num['id']) {
continue;
}
$effect['data'] = $num['data'];
$effect['hod'] = $num['hod'];
$effect['x'] = $num['x'];
}
}
return $r;
}
/** Получает строку data c шаблонной записью типа add_m11=2*{lvl1} и конвертирует в реальную строку.
*
Шаблон:
lvl1 = $uid[level]
ts5 = $uid[s5]
mpAll = $uid[mpAll]
* @param string $pl строка в формате data
* @param int $uid пользователь, параметры которого используются для подставки в шаблон.
* @return string строка в формате data с развёрнутыми шаблонами.
*/
public function redate($pl, $uid)
{
global $btl;
$i = 0;
if ($pl != '') {
$e = explode('|', $pl);
while ($i < count($e)) {
$f = explode('=', $e[$i]);
// $f[1] = $this->getdr(
// $f[1], [0 => 'lvl1', 1 => 'ts5', 2 => 'mpAll'], [
// 0 => $btl->users[$btl->uids[$uid]]['level'],
// 1 => $btl->stats[$btl->uids[$uid]]['s5'],
// 2 => $btl->stats[$btl->uids[$uid]]['mpAll'],
// ]
// );
$f[1] = $this->getDynamicInfo($f[1]);
if ($f[0] != '' && $f[1] != '') {
$e[$i] = implode('=', $f);
}
$i++;
}
$pl = implode('|', $e);
}
return $pl;
}
/**
* @param $match
* @return false|float
*/
private function getDynamicInfo($match)
{
$tmpl = [
'lvl1' => $this->u->info['level'],
'ts5' => $this->u->stats['s5'],
'mpAll' => $this->u->stats['mpAll'],
];
foreach ($tmpl as $k => $v) {
$match = str_ireplace('{' . $k . '}', $v, $match);
}
$p = $match[2];
if (preg_match('/(\d+)(?:\s*)([+\-*\/])(?:\s*)(\d+)/', $match[2], $matches) !== false) {
$operator = $matches[2];
switch ($operator) {
case '+':
$p = $matches[1] + $matches[3];
break;
case '-':
$p = $matches[1] - $matches[3];
break;
case '*':
$p = $matches[1] * $matches[3];
break;
case '/':
$p = $matches[1] / $matches[3];
break;
default:
}
}
return floor($p);
}
private function cancelEffects($effects_ids, $uid, Battle $btl)
{
$arr = explode(',', $effects_ids);
if (!is_array($arr) || empty($arr)) {
return;
}
foreach ($arr as $eid) {
if ($eid <= 0) {
continue;
}
$p = Db::getRow(
'select * from eff_users where uid = ? and v1 = ? and v2 = ? and `delete` = 0', [$uid, 'priem', $eid]
);
if (!$p['id']) {
continue;
}
$p['priem'] = Db::getRow('select * from priems where id = ?', [$eid]);
$btl->delPriem($p, $btl->users[$btl->uids[$uid]], 2);
}
}
public function testDie($u1)
{
global $btl;
//Персонаж 1 погиб от рук персонаж 2
$btl->spaCheck($btl->stats[$btl->uids[$u1]]['id']);
}
public function uppz($pl, $id)
{
global $u, $btl;
$this->actpridMax($pl);
$p = explode('|', $this->u->info['priems']);
$pz = explode('|', $this->u->info['priems_z']);
$pz[(int)$id] = $pl['zad'];
$i = 0;
$pe = explode(',', $pl['actprid']);
$piz = [];
while ($i < count($pe)) {
$piz[$pe[$i]] = 1;
$i++;
}
$i = 0;
$pe = explode(',', $pl['actprid_one']);
$piz2 = [];
while ($i < count($pe)) {
$piz2[$pe[$i]] = 1;
$i++;
}
$i = 0;
while ($i < count($p)) {
if ($p[$i] > 0) {
if (isset($piz[$p[$i]])) {
if ($pl['id'] == 281) {
//Жертва воде + воздуху дает 5 ед. задержки на землю и огонь
if ($p[$i] == 246 || $p[$i] == 186) {
$pz[$i] = 5;
} else {
$pz[$i] = $pl['zad'];
}
} else {
$pz[$i] = $pl['zad'];
}
}
if (isset($piz2[$p[$i]]) && $pz[$i] == 0) {
$pz[$i] = 1;
}
}
$i++;
}
$pz = implode('|', $pz);
$this->u->info['priems_z'] = $pz;
$btl->users[$btl->uids[$this->u->info['id']]]['priems_z'] = $pz;
$btl->stats[$btl->uids[$this->u->info['id']]]['priems_z'] = $pz;
$tr = Conversion::dataStringToArray($pl['tr']);
if (isset($tr['tr_mpNow'])) {
$tr['tr_mpNow'] = round($tr['tr_mpNow'] / 100 * (100 - $this->u->stats['min_use_mp']));
$btl->users[$btl->uids[$this->u->info['id']]]['mpNow'] -= $tr['tr_mpNow'];
$btl->stats[$btl->uids[$this->u->info['id']]]['mpNow'] -= $tr['tr_mpNow'];
if ($btl->stats[$btl->uids[$this->u->info['id']]]['mpNow'] < $btl->users[$btl->uids[$this->u->info['id']]]['mpNow']) {
$btl->users[$btl->uids[$this->u->info['id']]]['mpNow'] = $btl->stats[$btl->uids[$this->u->info['id']]]['mpNow'];
}
}
$this->u->info['mpNow'] = $btl->users[$btl->uids[$this->u->info['id']]]['mpNow'];
mysql_query(
'UPDATE `stats` SET `mpNow` = "' . $this->u->info['mpNow'] . '",`priems_z` = "' . $pz . '" WHERE `id` = "' . $this->u->info['id'] . '" LIMIT 1'
);
}
private function actpridMax($pl)
{
global $u, $btl;
if ($pl['actprid2'] > 0 || $pl['actprid3'] > 0) {
$i = 0;
$pe = explode('|', $this->u->info['priems']);
$piz = [];
while ($i < count($pe)) {
if ($pl['sbr'] == 0) {
//все блокируем
$psp = mysql_fetch_assoc(
mysql_query('SELECT * FROM `priems` WHERE `id` = "' . ((int)$pe[$i]) . '" LIMIT 1')
);
} else {
//Только текущую школу магии
$imgnm = '';
$nm = explode('_', $pl['img']);
if ($nm[0] == 'wis') { //магия
$imgnm = $nm[0] . '_' . $nm[1] . '%';
} else {
$imgnm = $nm[0] . '%';
}
//только данной школы
$psp = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `priems` WHERE `id` = "' . ((int)$pe[$i]) . '" AND `img` LIKE "' . $imgnm . '" LIMIT 1'
)
);
}
if ($pl['noprid'] == 0 && isset($psp['id']) && $psp['tr_hod'] == 0 && $psp['type_pr'] == 1 && $psp['noprid'] == 0) {
if ($pl['actprid2'] > 0) {
$piz[$pe[$i]] = (int)$pl['actprid2'];
} elseif ($pl['actprid3'] > 0) {
$piz[$pe[$i]] = $psp['zad'];
}
}
$i++;
}
$pz = explode('|', $this->u->info['priems_z']);
$p = explode('|', $this->u->info['priems']);
$i = 0;
while ($i < count($p)) {
if ($p[$i] > 0 && isset($piz[$p[$i]]) && $pz[$i] == 0) {
$pz[$i] = $piz[$p[$i]];
}
$i++;
}
$pz = implode('|', $pz);
$this->u->info['priems_z'] = $pz;
$btl->users[$btl->uids[$this->u->info['id']]]['priems_z'] = $pz;
$btl->stats[$btl->uids[$this->u->info['id']]]['priems_z'] = $pz;
}
}
private function trhod($pl)
{
global $u, $btl;
if ($this->u->info['notrhod'] == -1) {
$this->u->info['notrhod'] = 0;
if ($this->u->stats['magic_cast'] > 0) {
$this->u->info['notrhod'] = $this->u->stats['magic_cast'];
}
mysql_query(
'UPDATE `users` SET `notrhod` = "' . $this->u->info['notrhod'] . '" WHERE `id` = "' . $this->u->info['id'] . '" LIMIT 1'
);
}
if ($this->u->info['notrhod'] > 0) {
if ($pl['tr_hod'] > 0) {
$this->u->info['notrhod']--;
mysql_query(
'UPDATE `users` SET `notrhod` = "' . $this->u->info['notrhod'] . '" WHERE `id` = "' . $this->u->info['id'] . '" LIMIT 1'
);
}
} else {
$a1 = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `battle_act` WHERE `battle` = "' . $btl->i->id . '" AND `uid2` = "' . $this->u->info['id'] . '" AND `uid1` = "' . $this->u->info['enemy'] . '" LIMIT 1'
)
);
if (isset($a1['id'])) {
//противник ударил, пишем что игрок 2 пропустил ход
mysql_query(
'UPDATE `battle_act` SET `out2` = "1",`tpo2` = "2" WHERE `id` = "' . $a1['id'] . '" LIMIT 1'
);
$a1['out2'] = 1;
$a1['tpo2'] = 2;
$btl->atacks[$a1['id']] = $a1;
$btl->users[$this->u->info['id']]['priems_z'] = $this->u->info['priems_z'];
$btl->startAtack($a1['id']);
} else {
//бьем противника с пропуском хода
mysql_query(
'INSERT INTO `battle_act` (`battle`,`uid1`,`uid2`,`time`,`out1`,`type`,`tpo1`) VALUES ("' . $btl->i->id . '","' . $this->u->info['id'] . '","' . $this->u->info['enemy'] . '","' . time(
) . '","1","1","2")'
);
}
}
}
public function plusData($d1, $d2)
{
global $u;
$j1 = Conversion::dataStringToArray($d1);
$j2 = Conversion::dataStringToArray($this->redate($d2, $this->u->info['id']));
$v = $this->u->lookKeys($this->redate($d2, $this->u->info['id']), 0); // ключи 2
//добавляем данные друг к другу
$i = 0;
$inf = '';
while ($i < count($v)) {
$j1[$v[$i]] += $j2[$v[$i]];
$vi = str_replace('add_', '', $v[$i]);
if ($this->u->is[$vi] != '') {
if ($j2[$v[$i]] > 0) {
$inf .= $this->u->is[$vi] . ': +' . ($j2[$v[$i]] * (1 + $mpr['x'])) . ', ';
} elseif ($j2[$v[$i]] < 0) {
$inf .= $this->u->is[$vi] . ': ' . ($j2[$v[$i]] * (1 + $mpr['x'])) . ', ';
}
}
$i++;
}
$inf = rtrim($inf, ', ');
$j1 = Conversion::arrayToDataString($j1);
return $j1;
}
public function maxtr($x, $val)
{
global $u, $btl;
$this->u->info['tactic' . $x] += $val;
$btl->users[$btl->uids[$this->u->info['id']]]['tactic' . $x] += $val;
if ($this->u->info['tactic' . $x] < 0) {
$this->u->info['tactic' . $x] = 0;
}
if ($btl->users[$btl->uids[$this->u->info['id']]]['tactic' . $x] < 0) {
$btl->users[$btl->uids[$this->u->info['id']]]['tactic' . $x] = 0;
}
$rt = '`tactic' . $x . '`="' . $this->u->info['tactic' . $x] . '"';
mysql_query('UPDATE `stats` SET ' . $rt . ' WHERE `id` = "' . $this->u->info['id'] . '" LIMIT 1');
}
public function reuns($id)
{
global $u, $c, $code;
$p = explode('|', $this->u->info['priems']);
if ($p[(int)$id] > 0) {
//снимаем прием
$p[(int)$id] = 0;
$p = implode('|', $p);
mysql_query(
'UPDATE `stats` SET `priems` = "' . mysql_real_escape_string(
$p
) . '" WHERE `id` = "' . $this->u->info['id'] . '" LIMIT 1'
);
$this->u->info['priems'] = $p;
}
}
/** Одеть приём в слот?
* @param $id
* @return void
*/
public function uns($id)
{
global $u, $c, $code;
$pl = $this->getTechniquesInfo($id);
if (!isset($pl['id']) || $this->testpriem($pl, 1) != 0) {
return;
}
$yes = -1;
$non = -1;
$i = 0;
$p = explode('|', $this->u->info['priems']);
while ($i < $this->u->info['priemslot']) {
if ($non == -1 && $p[$i] == 0) {
$non = $i;
}
if ($p[$i] == $pl['id']) {
$yes = $i;
}
$i++;
}
if ($yes != -1) {
//такой прием уже стоит, ничего не делаем
return;
}
if ($non != -1) {
//одеваем прием
$p[$non] = $pl['id'];
$p = implode('|', $p);
$upd = mysql_query(
'UPDATE `stats` SET `priems` = "' . $p . '" WHERE `id` = "' . $this->u->info['id'] . '" LIMIT 1'
);
if ($upd) {
TrainingManager::getInstance()
->addPoint(
'my_user_fourth_quest', function (TrainingManager $manager) {
$manager->store();
}
);
$this->u->info['priems'] = $p;
}
} else {
//снимаем последний прием
echo 'Снимаем последний прием...';
}
}
//выводим приемы $id - 1 (вне боя), 2 - в бою
public function getTechniquesInfo(?int $id = null): array
{
if (isset($id)) {
return Db::getRow(
'select * from techniques_categories left join priems on techniques_categories.technique_id = priems.id
where priems.level <= ? and priems.activ > 0 and priems.id = ? order by priems.img,priems.level', [User::start()->info['level'], $id]
);
}
return Db::getRows(
'select * from techniques_categories left join priems on techniques_categories.technique_id = priems.id
where priems.level <= ? and priems.activ > 0 order by priems.img,priems.level', [User::start()->info['level']]
);
}
public function seeMy($t)
{
global $btl;
$i = 0;
$p = explode('|', $this->u->info['priems']);
$lvar = '';
$pr = '';
while ($i < $this->u->info['priemslot']) {
if ($p[$i] > 0) {
$pl = mysql_fetch_assoc(
mysql_query(
'SELECT * FROM `priems` WHERE `level`<="' . $this->u->info['level'] . '" AND `activ` > "0" AND `id` = "' . mysql_real_escape_string(
$p[$i]
) . '" LIMIT 1'
)
);
$lvar = $this->priemInfo($pl, $t, $i);
$pz = $lvar[1];
$lvar = $lvar[0];
if ($t == 1) {
if (isset($_GET['inv'])) {
$cl = 'href="javascript:void(0)" onclick="location.href=\'main.php?all=' . ((int)$_GET['all']) . '&skills=1&rz=4&p_raz=all\'"';
} else {
$cl = 'href="javascript:void(0)" onclick="location.href=\'main.php?all=' . ((int)$_GET['all']) . '&skills=1&unuse_priem=' . $i . '&rz=4&p_raz=\' + p_raz"';
}
} else {
if ($pl['type'] == 1) {
//моментально
if ($pl['onUser'] == 1) {
$oninuser = '';
if ($pl['team'] == 1) {
if ($this->u->info['login2'] != '') {
$oninuser = $this->u->info['login2'];
} else {
$oninuser = $this->u->info['login'];
}
} else {
if ($btl->users[$btl->uids[$this->u->info['enemy']]]['login2'] != '') {
$oninuser = $btl->users[$btl->uids[$this->u->info['enemy']]]['login2'];
} else {
$oninuser = $btl->users[$btl->uids[$this->u->info['enemy']]]['login'];
}
}
$cl = 'href="javascript:void(0);" onClick="top.priemOnUser(' . $i . ',1,\'' . $pl['name'] . '\',\'' . $oninuser . '\',\'' . $pl['img'] . '\');"';
unset($oninuser);
} else {
$cl = 'href="javascript:void(0);" onClick="usepriem(' . $i . ',1,\'' . $pl['img'] . '\');"';
}
} elseif ($pl['type'] == 2) {
//длительное
$cl = 'href="javascript:void(0);" onClick="usepriem(' . $i . ',1,\'' . $pl['img'] . '\');"';
} elseif ($pl['type'] == 3) {
$cl = 'href="javascript:void(0);" onClick="alert(\'Возможно используем?\');"';
}
}
$notr = $this->testpriem($pl, $t);
$cl2 = '';
$cli2 = '';
if ((($pz[$i] > 0 || $notr > 0) && $t == 2) || (isset($this->u->stats['nopriems']) && $pl['nosh'] == 0) || $this->u->stats['notuse_last_pr'] == $pl['id']) {
$cli2 = ' class="nopriemuse" ';
}
$pr .= '';
} else {
if (isset($_GET['inv'])) {
$pr .= '';
} else {
$pr .= '';
}
}
$i++;
}
if ($this->u->info['animal'] > 0 && $t == 2) {
$use_lst = $this->u->testAction(
'`uid` = "' . $this->u->info['id'] . '" AND `vars` = "animal_use' . $btl->i->id . '" LIMIT 1',
1
);
if (!isset($use_lst['id'])) {
$cl2 = '';
$pr .= '';
} else {
$cl2 = '" class="nopriemuse';
$pr .= '';
}
}
if ($t == 1) {
echo '' . $pr . '
';
} elseif ($t == 2) {
return str_replace('"', '\\"', $pr);
}
}
public function priemInfo($pl, $t, $id = false)
{
global $btl;
$pz = explode('|', $this->u->info['priems_z']);
$tr = Conversion::dataStringToArray($pl['tr']);
$trs = '';
$x = 0;
while ($x < count($this->statnames->sysRequirementNames)) {
$n = $this->statnames->sysRequirementNames[$x];
if (isset($tr['tr_' . $n])) {
if ($tr['tr_' . $n] > $this->u->stats[$n]) {
$trs .= '';
}
$trs .= '
• ';
$trs .= $this->statnames->requirementNames[$n] . ': ' . $tr['tr_' . $n];
if ($tr['tr_' . $n] > $this->u->stats[$n]) {
$trs .= '';
}
}
$x++;
}
$lvar = '';
$j = 1;
$nm = [1 => 'hit', 2 => 'krit', 3 => 'counter', 4 => 'block', 5 => 'parry', 6 => 'hp', 7 => 'spirit'];
while ($j <= 6) {
if ($pl['tt' . $j] > 0) {
$lvar .= ' ' . round(
$pl['tt' . $j],
2
) . ' ';
}
$j++;
}
if ($pl['tt7'] > 0) {
if ($lvar != '') {
$lvar .= '
';
}
$lvar .= 'Сила духа: ' . round($pl['tt' . $j], 2) . '
';
}
$lvar .= '
';
if ($pl['zad'] > 0) {
$lvar .= 'Задержка: ' . $pl['zad'];
if ($pz[$id] > 0) {
$lvar .= ' (еще ' . $pz[$id] . ')';
}
$lvar .= '
';
}
if (isset($tr['tr_mpNow']) && $tr['tr_mpNow'] > 0) {
$tr['tr_mpNow'] -= round($tr['tr_mpNow'] / 100 * $this->u->stats['min_use_mp']);
if ($this->u->info['mpNow'] < $tr['tr_mpNow'] || (isset($btl->stats[$btl->uids[$this->u->info['id']]]) && $btl->stats[$btl->uids[$this->u->info['id']]]['mpNow'] < $tr['tr_mpNow'])) {
$lvar .= '• Расход маны: ' . $tr['tr_mpNow'] . '
';
} else {
$lvar .= '• Расход маны: ' . $tr['tr_mpNow'] . '
';
}
}
if ($pl['tr_hod'] > 0) {
$lvar .= '• Прием тратит ход
';
}
if ($trs != '') {
$lvar .= 'Требования:' . $trs . '
';
} else {
$lvar .= '
';
}
$pl['info'] = preg_replace_callback("!(#)(.*?)(#)!is", [$this, 'getDynamicInfo'], $pl['info']);
$lvar .= $pl['info'];
return [0 => $lvar, 1 => $pz];
}
//Мощность / подавление / сопротивление и т.д.
public function getByCategory(?int $category_id = null)
{
$priems = $this->getTechniquesInfo();
$cl = '';
foreach ($priems as $priem) {
if ($this->pyes($priem['id']) || $this->testpriem($priem, 1) > 0) {
$cl = 'filter: alpha(opacity=35); -moz-opacity: 0.35; -khtml-opacity: 0.35; opacity: 0.35;';
}
echo
<<< HTML
HTML;
}
}
private function pyes($id)
{
global $u;
$p = explode('|', $this->u->info['priems']);
$r = false;
$i = 0;
while ($i < count($p)) {
if ($p[$i] == $id) {
$r = true;
}
$i++;
}
return $r;
}
public function devouringFlame($id, $uid, $j_id, Battle $btl)
{
$a = 0;
$u1 = 0;
$u2 = 0;
//
$uid1 = $btl->atacks[$id]['uid1'];
$uid2 = $btl->atacks[$id]['uid2'];
if ($uid == $uid1) {
$a = 1;
$u1 = $uid1;
$u2 = $uid2;
} elseif ($uid == $uid2) {
$a = 2;
$u1 = $uid2;
$u2 = $uid1;
}
if ($a <= 0) {
return;
}//Проверяем эффект
$prv['j_priem'] = $btl->stats[$btl->uids[$u1]]['u_priem'][$j_id][0];
$pvr['data'] = Conversion::dataStringToArray($btl->stats[$btl->uids[$u1]]['effects'][$prv['j_priem']]['data']);
$pName = $btl->stats[$btl->uids[$u1]]['effects'][$prv['j_priem']]['name'];
$pvr['hp'] = $pvr['data']['atgm'];
$pvr['hpNow'] = floor($btl->stats[$btl->uids[$u1]]['hpNow']);
$pvr['hpAll'] = $btl->stats[$btl->uids[$u1]]['hpAll'];
//Используем проверку на урон приемов
$pvr['hp'] = $btl->testYronPriem(
$btl->stats[$btl->uids[$u1]]['effects'][$prv['j_priem']]['user_use'], $u1, 12, $pvr['hp'], 7, true, false, 1
);
$pvr['hpNow'] -= $pvr['hp'];
$btl->priemYronSave($btl->stats[$btl->uids[$u1]]['effects'][$prv['j_priem']]['user_use'], $u1, $pvr['hp'], 0);
$pvr['hpNow'] = $this->zeromax($pvr['hpNow'], $pvr['hpAll']);
$btl->stats[$btl->uids[$u1]]['hpNow'] = $pvr['hpNow'];
Db::sql('update stats set hpnow = ? where id = ?', [$btl->stats[$btl->uids[$u1]]['hpNow'], $u1]);
$color = $this->logColor[self::FIRE];
$prv['text'] = '{u2} утратил здоровье от "{pr}" ';
if ($pvr['promah_type'] == 2) {
$pvr['hp'] = '-';
}
$prv['text'] .= sprintf(
"%s [%d/%d]", $color, -$pvr['hp'], $pvr['hpNow'], $pvr['hpAll']
);
$btl->priemAddLog(
$id, 1, 2, $u2, $u1, "$pName", $prv['text'], ($btl->hodID)
);
}
private function rezadEff($uid, $mg)
{
global $btl;
//$this->rezadEff($this->u->info['id'],'wis_fire_');
$md = '';
$md2 = '';
$ex = explode('|', $btl->users[$btl->uids[$uid]]['priems']);
$ex2 = explode('|', $btl->users[$btl->uids[$uid]]['priems_z']);
$i = 0;
$ty = [];
while ($i < count($ex)) {
if ($ex[$i] > 0) {
$md .= '`id` = "' . ((int)$ex[$i]) . '" OR ';
$ty[$ex[$i]] = $i;
}
$i++;
}
$md = rtrim($md, ' OR ');
if ($md != '') {
$md = '( ' . $md . ' ) AND ';
}
$sp = mysql_query('SELECT * FROM `priems` WHERE ' . $md . ' `img` LIKE "%' . $mg . '%"');
while ($pl = mysql_fetch_assoc($sp)) {
$ex2[$ty[$pl['id']]] = 0;
}
$md2 = implode('|', $ex2);
$btl->users[$btl->uids[$uid]]['priems_z'] = $md2;
$this->u->info['priems_z'] = $md2;
$upd = mysql_query('UPDATE `stats` SET `priems_z` = "' . $md2 . '" WHERE `id` = "' . ((int)$uid) . '" LIMIT 1');
unset($md, $md2, $ty);
return $upd;
}
/** Приём: Вспышка.
* Файлы: 34, 67, 68, 69.
* @param $level
* @param Battle $btl
* @param $id
* передаётся через pruse() в номерной файл и вызывается оттуда.
* @return void
*/
private function fireFlash($level, Battle $btl, $id)
{
if (empty($this->ue) || $this->ue['hpNow'] <= 0 || $btl->users[$this->ue['id']]['team'] == $this->u->info['team']) {
return;
}
$baseDamage = [8 => 40, 9 => 45, 10 => 50, 11 => 60];
$pvr = [];
$magicTargetTier = Db::getValue(
'select x from eff_users where uid = ? and v2 = 26 and `delete` = 0',
[$this->ue['id']]
);
$leveledDamage = $baseDamage[$level] + 40 / 100 * (5 * $magicTargetTier);
[$damage, $isCrit, $isMiss] = $this->magicAttack(
$btl, $this->u->info['id'], $this->ue['id'], $leveledDamage, self::FIRE, 1
);
//Используем проверку на урон приемов
$damage = $btl->testYronPriem(
$this->u->info['id'], $this->ue['id'], 21, $damage, 5,
true
);
$btl->priemYronSave($this->u->info['id'], $this->ue['id'], $damage, 0);
$this->ue['hpNow'] -= $damage;
$this->ue['hpNow'] = $this->zeromax($this->ue['hpNow'], $this->ue['hpAll']);
$btl->stats[$btl->uids[$this->ue['id']]]['hpNow'] = $this->ue['hpNow'];
Db::sql('update stats set hpnow = ? where id = ?', [$this->ue['hpNow'], $this->ue['id']]);
if ($isMiss) {
$color = $this->logColor['miss'];
} elseif ($isCrit) {
$color = $this->logColor['crit'];
} else {
$color = $this->logColor[self::FIRE];
}
$btl->priemAddLog(
$id,
1,
2,
$this->u->info['id'],
$this->ue['id'],
"Вспышка [$level]",
'{tm1}' . sprintf(
" %s %s [%d/%d]",
$btl->addlt(1, 19, $this->u->info['sex'], null),
$pvr['color'],
$isMiss ? '--' : -$damage,
(int)$this->ue['hpNow'],
(int)$this->ue['hpAll']
),
$btl->hodID + 1
);
}
/** Приём: Цель {стихия}
* Файлы: 25, 26, 27, 28.
* @param $element
* @param $pl
* @param $id
* @param Battle $btl
* @return bool (bool) достигнут ли лимит по стаку заклинаний.
*/
private function magicTarget($element, $pl, $id, Battle $btl)
{
$data = [
self::WATER => [25, 'воды'],
self::FIRE => [26, 'огня'],
self::AIR => [27, 'воздуха'],
self::EARTH => [28, 'земли'],
];
if (!in_array($element, array_keys($data)) || empty($this->ue)) {
return false;
}
$stacked = Db::getRow(
'select id, x from eff_users where uid = ? and v2 = ? and `delete` = 0',
[$this->ue['id'], $data[$element][0]]
);
$stackNumStr = $stacked['x'] > 0 ? $stacked['x'] + 1 : '';
if ($stacked['x'] >= 5) {
echo "На пероснаже достигнуто максиальное количество целей";
return true;
}
// Наброс эффекта от приёма.
$this->addEffPr($pl, $id);
$dataStr = $stacked['x'] > 0 ? Db::getValue(
'select data from eff_users where id = ?',
[$stacked['id']]
) : $pl['date3'];
// Костыль. Будет работать, пока приём изменяет ОДИН параметр.
$effect = "Защита от магии {$data[$element][1]}: " . current(Conversion::dataStringToArray($dataStr));
$color = $this->logColor[$element];
$name = "Цель {$data[$element][1]}";
if ($stacked['x'] > 0) {
$name .= " x($stackNumStr)";
}
$btl->priemAddLog(
$id,
1,
2,
$this->u->info['id'],
$this->ue['id'],
"$name",
'{tm1}' . sprintf(
" %s. (%s)",
$btl->addlt(1, 19, $this->u->info['sex'], null), $effect
),
$btl->hodID
);
return false;
}
private function addEffPr($pl, $id)
{
global $u, $btl;
$rcu = false;
$j = Conversion::dataStringToArray($pl['date2']);
$mpr = false;
$addch = 0;
$uid = $this->u->info['id'];
if (isset($this->ue['id'])) {
$uid = $this->ue['id'];
}
if (isset($j['onlyOne'])) {
$mpr = Db::getRow(
'select * from eff_users where v2 = ? and uid = ? and `delete` = 0 and mark = 1',
[$pl['id'], $uid]
);
//$mpr = mysql_fetch_assoc(mysql_query('SELECT * FROM `eff_users` WHERE `v2` = "' . $pl['id'] . '" AND `uid` = "' . $uid . '" AND `delete` = "0" AND `mark` = 1 LIMIT 1'));
}
// if ($pl['cancel_eff2'] != '') {
// $i = 0;
// $e = explode(',', $pl['cancel_eff2']);
// while ($i < count($e)) {
// if ($e[$i] > 0) {
// $nem = mysql_fetch_assoc(mysql_query('SELECT * FROM `eff_users` WHERE `uid` = "' . $uid . '" AND `v1` = "priem" AND `v2` = "' . $e[$i] . '" AND `delete` = "0" AND `mark` = 1 LIMIT 1'));
// if (isset($nem['id'])) {
// $nem['priem'] = mysql_fetch_assoc(mysql_query('SELECT * FROM `priems` WHERE `id` = "' . $e[$i] . '" LIMIT 1'));
// if (isset($nem['id'])) {
// $btl->delPriem($nem, $btl->users[$btl->uids[$uid]], 2);
// if ($nem['id'] == $mpr['id']) {
// unset($mpr);
// }
// }
// }
// }
// $i++;
// }
// }
if (!empty($pl['cancel_eff2'])) {
$this->cancelEffects($pl['cancel_eff2'], $uid, $btl);
}
$pld = [0 => ''];
$nc = 0;
if (isset($mpr['id']) && $j['onlyOne'] == 1) {
//отнимаем тактики
$addch = 1;
$this->mintr($pl);
$this->uppz($pl, $id);
//добавляем прием в эффекты
if (isset($this->ue['id'])) {
$btl->stats[$btl->uids[$uid]] = $this->u->getStats($this->ue, 0);
} else {
$btl->stats[$btl->uids[$uid]] = $this->u->getStats($this->u->info, 0);
}
$nc = 1;
} elseif (!isset($mpr['id'])) {
$data = '';
if (isset($j['date3Plus'])) {
$data = $this->redate($pl['date3'], $this->u->info['id']);
}
$hd1 = -1;
if ($pl['limit'] > 0) {
$tm = 77;
$hd1 = $pl['limit'];
} else {
$tm = 77;
}
if ($pl['limit'] == -2) {
$hd1 = $pl['limit'];
}
if ($pl['id'] == 239) //Вывод приемов которые не моментальные как бы
{
$btl->priemAddLogFast(
$uid, 0, $pl['name'],
'{tm' . $this->u->info['team'] . '} ' . $btl->addlt(
1, 17, $btl->users[$btl->uids[$uid]]['sex'],
null
) . '',
1, time()
);
}
$uu = $pl['id'] === 260 ? '' : $this->u->info['id'];
Db::sql(
'insert into eff_users (hod, v1, v2, img2, id_eff, uid, name, data, overtype, timeuse, user_use) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
[$hd1, 'priem', $pl['id'], $pl['img'] . '.gif', 22, $uid, $pl['name'], $data, 0, $tm, $uu]
);
unset($hd1, $uu);
//отнимаем тактики
$addch = 1;
$rcu = true;
$nc = 1;
$this->mintr($pl);
//$this->uppz($pl,$id);
//добавляем прием в эффекты
if (isset($this->ue['id'])) {
$btl->stats[$btl->uids[$uid]] = $this->u->getStats($this->ue, 0);
} else {
$btl->stats[$btl->uids[$uid]] = $this->u->getStats($this->u->info, 0);
}
} elseif ($j['onlyOne'] > 1) {
if ($mpr['x'] < $j['onlyOne'] && isset($j['date3Plus'])) {
$j1 = Conversion::dataStringToArray($mpr['data']);
$j2 = Conversion::dataStringToArray($this->redate($pl['date3'], $this->u->info['id']));
$v = $this->u->lookKeys($this->redate($pl['date3'], $this->u->info['id']), 0); // ключи 2
//добавляем данные друг к другу
$i = 0;
$inf = '';
while ($i < count($v)) {
$j1[$v[$i]] += $j2[$v[$i]];
$vi = str_replace('add_', '', $v[$i]);
if ($this->u->is[$vi] != '') {
if ($j2[$v[$i]] > 0) {
$inf .= $this->u->is[$vi] . ': +' . ($j2[$v[$i]] * (1 + $mpr['x'])) . ', ';
} elseif ($j2[$v[$i]] < 0) {
$inf .= $this->u->is[$vi] . ': ' . ($j2[$v[$i]] * (1 + $mpr['x'])) . ', ';
}
}
$i++;
}
$inf = rtrim($inf, ', ');
$j1 = Conversion::arrayToDataString($j1);
$pld[0] = ' x' . ($mpr['x'] + 1);
if ($j['refHod'] == 1) {
$mpr['hod'] = $pl['limit'];
}
$upd = mysql_query(
'UPDATE `eff_users` SET `hod` = "' . $mpr['hod'] . '",`data` = "' . $j1 . '",`x` = `x`+1 WHERE `id` = "' . $mpr['id'] . '" LIMIT 1'
);
if ($upd) {
//отнимаем тактики
$this->mintr($pl);
$this->uppz($pl, $id);
//добавляем прием в эффекты
if (isset($this->ue['id'])) {
$btl->stats[$btl->uids[$uid]] = $this->u->getStats($this->ue, 0);
} else {
$btl->stats[$btl->uids[$uid]] = $this->u->getStats($this->u->info, 0);
}
$addch = 1;
$rcu = true;
$nc = 1;
}
}
}
/* тратим свой ход */
if ($nc == 1 && $pl['tr_hod'] > 0) {
$this->trhod($pl);
}
//return $rcu;
}
public function mintr($pl)
{
global $u, $btl;
$x = 1;
$rt = '';
while ($x <= 7) {
if ($pl['ndt' . $x] == 0) {
$this->u->info['tactic' . $x] -= $pl['tt' . $x];
$btl->users[$btl->uids[$this->u->info['id']]]['tactic' . $x] -= $pl['tt' . $x];
}
if ($this->u->info['tactic' . $x] < 0) {
$this->u->info['tactic' . $x] = 0;
}
if ($btl->users[$btl->uids[$this->u->info['id']]]['tactic' . $x] < 0) {
$btl->users[$btl->uids[$this->u->info['id']]]['tactic' . $x] = 0;
}
//$rt .= ',`tactic'.$x.'`="'.$this->u->info['tactic'.$x].'"';
$rt .= ',`tactic' . $x . '`="' . $btl->users[$btl->uids[$this->u->info['id']]]['tactic' . $x] . '"';
$x++;
}
if ($pl['xuse'] > 0) {
$this->u->addAction(time(), 'use_priem_' . $btl->i->id . '_' . $this->u->info['id'], $pl['id']);
}
$rt = ltrim($rt, ',');
mysql_query('UPDATE `stats` SET ' . $rt . ' WHERE `id` = "' . $this->u->info['id'] . '" LIMIT 1');
}
/** Пожирающее пламя. Первичный каст на противника, на котором нет эффекта.
* Кастуется на 5 ходов. Считает сколько урона будет наноситься следующие 5 ходов.
* Конечный damage после множителей делится на 5 и пишется в БД (atgm=).
* Файлы: 33, 56, 57, 58, 59, 60.
* @param $id
* @param array $pl массив значений из БД priems.
* @param Battle $btl
* @return void
*/
private function devouringFlameInit($id, array $pl, Battle $btl)
{
$baseDamage = [6 => 53, 7 => 63, 8 => 77, 9 => 91, 10 => 110, 11 => 133,];
[$damage, , $isMiss] = $this->magicAttack(
$btl, $this->u->info['id'], $this->ue['id'], $baseDamage[$pl['level']], self::FIRE
);
if ($isMiss || $damage <= 0) {
return;
}
$color = $this->logColor[self::FIRE];
$logText = '{tm1}' . $btl->addlt(1, 19, $btl->users[$btl->uids[$this->u->info['id']]]['sex'], null) . '.';
$btl->priemAddLog(
$id, 1, 2, $this->u->info['id'], $this->ue['id'], "{$pl['name']}",
$logText, $btl->hodID + 1
);
$data = Conversion::arrayToDataString(['atgm' => max(floor($damage / 5), 1)]);
$this->addPriem(
$this->ue['id'], $pl['id'], $data, 0, 77, 5, $this->u->info['id'], 1, 'пожирающеепламя', 0, 0, 1
);
}
/** Кристаллизация. Отнимает от максимального стата (кроме выносливости) 20 на 3 хода.
* Если есть одинаковые статы из них выбирается случайный.
* Файл:267, приём 268. Понимай как хочешь.
* @param $id
* @param array $pl
* @param Battle $btl
* @return void
*/
private function crystalize($id, array $pl, Battle $btl)
{
$q = 'select stats as data from stats where id = ?
union all select stats as data from test_bot where id = ?
union all select data from eff_users where `delete` = 0 and uid = ?
union all select data from items_users where inodet > 0 and `delete` = 0 and uid = ?';
$datas = Db::getColumn($q, array_fill(0, 3, $this->ue['id']));
$stats = array_fill_keys(['s1', 's2', 's3', 's5', 's6'], 0);
foreach ($datas as $data) {
$data = Conversion::dataStringToArray($data);
print_r($data);
foreach (array_keys($stats) as $stat) {
if (isset($data[$stat])) {
$stats[$stat] += $data[$stat];
}
if (isset($data['add_' . $stat])) {
$stats[$stat] += $data['add_' . $stat];
}
}
}
$maxValue = max($stats);
$maxKeys = [];
foreach ($stats as $k => $v) {
if ($maxValue == $v) {
$maxKeys[] = $k;
}
}
shuffle($maxKeys);
$datastr = "|add_{$maxKeys[0]}=-20";
$debuffstr = "Замороженная " . mb_strtolower($this->u->is[$maxKeys[0]]);
$color = $this->logColor[self::WATER];
$logText = '{tm1}' . $btl->addlt(1, 19, $btl->users[$btl->uids[$this->u->info['id']]]['sex'], null) . '.';
$btl->priemAddLog(
$id, 1, 2, $this->u->info['id'], $this->ue['id'],
"{$pl['name']}: $debuffstr", $logText, $btl->hodID + 1
);
$this->addPriem($this->ue['id'], 268, $datastr, 2, 77, 3, $this->u->info['id'], 3, 0, 0, 1);
}
}