battles/lab_enter.php
Igor Barkov (iwork) 3502904656 Рефакторинг, очистка, работа над ошибками, связанными с базой, отказ от глобальной переменной $user во многих файлах.
Singleton в некоторых местах вместо решения #42.
Новые шаги для решения #16 и #52.
Closes #42.
Closes #32.
Closes #31.
2022-01-27 01:15:33 +02:00

449 lines
21 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
use Battles\Template;
use Battles\User;
require_once "functions.php";
$errkom = '';
mysql_query('DELETE FROM `laba_zv` WHERE `time` < "' . (time() - 1 * 60 * 60) . '"');
$var = mysql_fetch_array(mysql_query('SELECT `id`, `vals` FROM `actions` WHERE `vals` > "' . time() . '" AND `uid` = "' . $user['id'] . '" AND `vars` = "go_labirint" LIMIT 1'));
$zv = mysql_fetch_array(mysql_query('SELECT * FROM `laba_zv` WHERE `uid1` = "' . $user['id'] . '" OR `uid2` = "' . $user['id'] . '" OR `uid3` = "' . $user['id'] . '" OR `uid4` = "' . $user['id'] . '" LIMIT 1'));
$re = '';
if (isset($_GET['exitlaba'])) {
if (isset($zv['id'])) {
$re = 'Подали заявку и убегаем? Не хорошо!';
} else {
mysql_query("UPDATE `users`, `online` SET `users`.`room` = '2601', `online`.`room` = '2601' WHERE `online`.`id` = `users`.`id` AND `online`.`id` = '{$user['id']}'");
header('Location: city.php');
}
} elseif (isset($_GET['pz1'])) {
if (isset($zv['id'])) {
$re = 'Вы уже подали заявку...';
} else {
if ($user['level'] < 4) {
$re = 'Персонажам до 4-го уровня запрещается посещать лабиринт!';
} elseif (isset($var['id'])) {
$tm = timeOut($var['vals'] - time());
$re = 'Следующий поход через: ' . $tm;
} else {
$_POST['type_gors'] = (int)$_POST['type_gors'];
if ($_POST['type_gors'] == 0 && $user['level'] > 6) {
$re = 'Лабиринт для новичков доступен для 4-6 уровней!';
} elseif ($_POST['type_gors'] == 1 && $user['level'] < 7) {
$re = 'Лабиринт для опытных доступен с 7 уровня!';
} elseif ($_POST['type_gors'] == 2 && ($user['level'] < 9 || $user['rep_laba'] < 20000)) {
$re = 'Легендарный Лабиринт доступен с 9 уровня!<br />Так-же требуется 20000 репутации Лабиринтов! У Вас : ' . $user['rep_laba'] . ' репутации Лабиринтов.';
} else {
mysql_query('INSERT INTO `laba_zv` (`uid1`, `time`, `com`, `pass`, `type`, `level`) VALUES ("' . $user['id'] . '", "' . time() . '", "' . mysql_real_escape_string(htmlspecialchars($_POST['text'])) . '", "' . mysql_real_escape_string($_POST['text']) . '", "' . mysql_real_escape_string($_POST['type_gors']) . '", "' . $user['level'] . '")');
header('Location: lab_enter.php');
}
}
}
} elseif (isset($_GET['cancelzv'])) {
if (!isset($zv['id'])) {
$re = 'Вы не участвуете ни в одной из заявок!<br />';
} else {
$i = 1;
$j = 4;
$k = 0;
$h = 0;
while ($i <= 4) {
if ($k == 0 && $zv['uid' . $i] != $user['id']) {
$k = $zv['uid' . $i];
$h = $i;
}
$i++;
}
$i = 1;
while ($i <= 4) {
if ($zv['uid' . $i] == $user['id']) {
if ($i > 1) {
$zv['uid' . $i] = 0;
} else {
$zv['uid' . $i] = $k;
$zv['uid' . $h] = 0;
}
}
if ($zv['uid' . $i] == 0) {
$j--;
}
$i++;
}
if ($j < 1) {
mysql_query('DELETE FROM `laba_zv` WHERE `id` = "' . $zv['id'] . '" LIMIT 1');
} else {
mysql_query('UPDATE `laba_zv` SET `uid1` = "' . $zv['uid1'] . '", `uid2` = "' . $zv['uid2'] . '", `uid3` = "' . $zv['uid3'] . '", `uid4` = "' . $zv['uid4'] . '" WHERE `id` = "' . $zv['id'] . '" lIMIT 1');
}
$re = 'Заявка успешно отменена!<br />';
unset($zv);
}
} elseif (isset($_GET['priemzv'])) {
if (isset($zv['id'])) {
$re = 'Вы уже состоите в одной из заявок!';
} else {
$tozv = mysql_fetch_array(mysql_query('SELECT * FROM `laba_zv` WHERE `id` = "' . mysql_real_escape_string($_GET['priemzv']) . '" LIMIT 1'));
if (!isset($tozv['id'])) {
$re = 'Заявка не найдена!';
} elseif (isset($var['id'])) {
$tm = timeOut($var['vals'] - time());
$re = 'Следующий поход через: ' . $tm;
} else {
if ($tozv['uid1'] > 0 && $tozv['uid2'] > 0 && $tozv['uid3'] > 0 && $tozv['uid4'] > 0) {
$re = 'В заявке нет свободных мест!';
} else {
$i = 1;
$j = 0;
while ($i <= 4) {
if ($tozv['uid' . $i] == 0 && $j == 0) {
$j = $i;
}
$i++;
}
mysql_query('UPDATE `laba_zv` SET `uid' . $j . '` = "' . $user['id'] . '" WHERE `id` = "' . $tozv['id'] . '" LIMIT 1');
header('Location: lab_enter.php');
}
}
}
} elseif (isset($_GET['startzv'])) {
if (!isset($zv['id'])) {
$re = 'Вы должны сначала подать заявку!';
} elseif ($zv['uid1'] != $user['id']) {
$re = 'Вы должны являться лидером группы!';
} else {
if ($zv['type'] == 0) {
$level = 5;
} elseif ($zv['type'] == 1) {
$level = 8;
} elseif ($zv['type'] == 2) {
$level = 10;
}
$k = floor(2.5 * $level);
$s = $k * 2 + 3;
$r = 10;
$count = 1;
$a = [];
for ($y = 0; $y < $s; $y++) {
for ($x = 0; $x < $s; $x++) {
$a[$y][$x] = 1;
}
}
for ($x = 0; $x < $s; $x++) {
$a[0][$x] = 0;
$a[$s - 1][$x] = 0;
$a[$x][0] = 0;
$a[$x][$s - 1] = 0;
}
$x = $y = ($k - 1) >> 1;
$a[$y * 2 + 2][$x * 2 + 2] = 0;
while (1) {
do {
$d = rand(0, 3);
for ($i = 0; $i < 4; $i++) {
if ($d == 0 && $a[$y * 2 + 2][$x * 2 + 4]) {
$a[$y * 2 + 2][$x++ * 2 + 3] = 0;
$a[$y * 2 + 2][$x * 2 + 2] = 0;
$i = 5;
$count++;
break;
} elseif ($d == 1 && $a[$y * 2][$x * 2 + 2]) {
$a[$y-- * 2 + 1][$x * 2 + 2] = 0;
$a[$y * 2 + 2][$x * 2 + 2] = 0;
$i = 5;
$count++;
break;
} elseif ($d == 2 && $a[$y * 2 + 2][$x * 2]) {
$a[$y * 2 + 2][$x-- * 2 + 1] = 0;
$a[$y * 2 + 2][$x * 2 + 2] = 0;
$i = 5;
$count++;
break;
} elseif ($d == 3 && $a[$y * 2 + 4][$x * 2 + 2]) {
$a[$y++ * 2 + 3][$x * 2 + 2] = 0;
$a[$y * 2 + 2][$x * 2 + 2] = 0;
$i = 5;
$count++;
break;
}
$d = ($d + 1) % 4;
}
} while ($i != 4);
if ($count >= $k * $k) {
break;
}
$x = rand(0, $k - 1);
$y = rand(0, $k - 1);
while ($a[$y * 2 + 2][$x * 2 + 2] || !$a[$y * 2 + 2][$x * 2 + 4] && !$a[$y * 2][$x * 2 + 2] && !$a[$y * 2 + 2][$x * 2] && !$a[$y * 2 + 4][$x * 2 + 2]) {
if (++$x >= $k) {
$x = 0;
if (++$y >= $k) {
$y = 0;
}
}
}
}
$rnds = [rand(1, 3), rand(1, 3)];
$srg = [];
$objects = [];
if ($rnds[0] == 1) {
$a[2][1] = 0;
$a[2][2] = 0;
$srg = [2, 1];
$objects[2][1] = '<div title="Вход в подземелье" class="ddpStart"></div>';
} elseif ($rnds[0] == 2) {
$a[$k][1] = 0;
$a[$k][2] = 0;
$srg = [$k, 1];
$objects[$k][1] = '<div title="Вход в подземелье" class="ddpStart"></div>';
} elseif ($rnds[0] == 3) {
$a[$k * 2][1] = 0;
$a[$k * 2][2] = 0;
$srg = [$k * 2, 1];
$objects[$k * 2][1] = '<div title="Вход в подземелье" class="ddpStart"></div>';
}
if ($rnds[1] == 1) {
$a[2][$k * 2 + 1] = 0;
$a[2][$k * 2] = 0;
$objects[2][$k * 2 + 1] = '<div title="Выход из подземелье" class="ddpExit"></div>';
} elseif ($rnds[1] == 2) {
$a[$k][$k * 2 + 1] = 0;
$a[$k][$k * 2] = 0;
$objects[$k][$k * 2 + 1] = '<div title="Выход из подземелье" class="ddpExit"></div>';
} elseif ($rnds[1] == 3) {
$a[$k * 2][$k * 2 + 1] = 0;
$a[$k * 2][$k * 2] = 0;
$objects[$k * 2][$k * 2 + 1] = '<div title="Выход из подземелье" class="ddpExit"></div>';
}
$map = [];
$i = 1;
while ($i < count($a) - 1) {
$j = 1;
while ($j < count($a[$i]) - 1) {
if ($a[$i][$j] == 0 && $i > 1 && $j > 1 && $i <= $k * 2 && $j <= $k * 2) {
$map[] = [$i, $j];
}
$j++;
}
$i++;
}
$proc1 = round(1.7 * $level); //Сколько % занимают сундуки
$proc2 = round(2.5 * $level); //Сколько % занимают монстры
$proc3 = round(1.35 * $level); //Сколько % занимают хилки
$proc4 = round(0.5 * $level); //Сколько % занимают ловушки
$proc5 = round(0.1 * $level); //Сколько % занимают пандоры
$proc6 = round(0.2 * $level); // Сколько занимает Антидот
$proc1 = round($proc1 / 2);
$proc1 = round(count($map) / 100 * $proc1);
$proc2 = round($proc2 / 2);
$proc2 = round(count($map) / 100 * $proc2);
$proc3 = round($proc3 / 2);
$proc3 = round(count($map) / 100 * $proc3);
$proc4 = round($proc4 / 2);
$proc4 = round(count($map) / 100 * $proc4);
$proc5 = round($proc5 / 2);
$proc5 = round(count($map) / 100 * $proc5);
$proc6 = round($proc6 / 2);
$proc6 = round(count($map) / 100 * $proc6);
$usi = 0;
mysql_query('INSERT INTO `laba_now` (`time`, `uid`, `users`, `map_id`, `end`, `type`) VALUES ("' . time() . '", "' . $user['id'] . '", "-1", "0", "0", "' . $zv['type'] . '")');
$ding = mysql_insert_id();
$i = 1;
while ($i <= 4) {
if ($zv['uid' . $i] > 0) {
$plu = mysql_fetch_array(mysql_query('SELECT `id` FROM `users` WHERE `id` = "' . $zv['uid' . $i] . '" LIMIT 1'));
if (isset($plu['id'])) {
mysql_query("UPDATE `users`, `online` SET `users`.`room` = '1052', `online`.`room` = '1052', `users`.`x` = '" . $srg[0] . "', `users`.`y` = '" . $srg[1] . "', `users`.`xf` = '" . $srg[0] . "', `users`.`yr` = '" . $srg[1] . "', `users`.`laba` = '" . $ding . "' WHERE `online`.`id` = `users`.`id` AND `online`.`id` = '" . $plu['id'] . "'");
$usi++;
}
}
$i++;
}
mysql_query('UPDATE `laba_now` SET `users` = "' . $usi . '" WHERE `id` = "' . $ding . '" LIMIT 1');
mysql_query('INSERT INTO `laba_map` (`id`, `data`, `update`) VALUES ("' . $ding . '", "' . json_encode($a) . '", "' . time() . '")');
mysql_query('DELETE FROM `laba_zv` WHERE `id` = "' . $zv['id'] . '" LIMIT 1');
$i = 1;
while ($i <= 6) {
if (${'proc' . $i} > 0) {
$j = 0;
while ($j < ${'proc' . $i}) {
$cord = $map[rand(0, count($map) - 1)];
$obj = '';
if ($i == 1) {
$obj = 'ddp1s';
} elseif ($i == 2) {
$obj = 'ddp1m';
} elseif ($i == 3) {
$obj = 'ddp1h';
} elseif ($i == 4) {
$obj = 'ddp1l';
} elseif ($i == 5) {
$obj = 'ddp1p';
} elseif ($i == 6) {
$obj = 'ddp1a';
}
mysql_query('INSERT INTO `laba_obj` (`lib`, `x`, `y`, `type`, `img`, `name`, `time`, `use`) VALUES ("' . $ding . '", "' . $cord[0] . '", "' . $cord[1] . '", "' . $i . '", "' . $obj . '", "{standart}", "' . time() . '", "0")');
$j++;
}
}
$i++;
}
mysql_query('DELETE FROM `laba_zv` WHERE `id` = "' . $zv['id'] . '" LIMIT 1');
header('Location: labirint.php');
}
}
Template::header('Вход в Лабиринты');
?>
<div style="float: right;">
<input type="button" onclick="location.href='lab_enter.php';" value="Обновить">
<input type="button" onclick="location.href='?exitlaba=1';" value="Покинуть вход">
</div>
<div style="padding-left: 0;" align="center">
<h3>Вход в Лабиринты</h3>
</div>
<?
if (isset($_GET['del_com'])) {
if (User::getInstance()->getAdmin()) {
mysql_query('UPDATE `laba_zv` SET `com` = "" WHERE `id` = "' . (int)$_GET['del_com'] . '" LIMIT 1');
$re = 'Комментарий удалён';
} else {
$re = 'Вы не можете удалять комментарии.';
}
}
if ($user['level'] >= 4) {
if (isset($_GET['quest'])) {
$q2 = mysql_fetch_array(mysql_query('SELECT * FROM `qst_user` WHERE `uid` = "' . $user['id'] . '" AND `cancel` = "0" AND `finish` = "0" LIMIT 1'));
if (!isset($q2['id'])) {
$q3 = mysql_fetch_array(mysql_query('SELECT * FROM `qst_user` WHERE `uid` = "' . $user['id'] . '" AND (`cancel` > "' . time() . '" OR `finish` > "' . time() . '") LIMIT 1'));
if (isset($q3['id'])) {
if ($q3['cancel'] > time()) {
$tm = timeOut($q3['cancel'] - time());
} else {
$tm = timeOut($q3['finish'] - time());
}
$re = 'Нельзя брать задания так часто, разрешенный лимит: Один раз в 12 часов.<br /> Следующее задание можно взять через : ' . $tm;
} else {
$rand = [];
$sp = mysql_query('SELECT `id`, `name` FROM `qst` WHERE `level` = "' . $user['level'] . '"');
while ($pl = mysql_fetch_array($sp)) {
$rand[] = $pl;
}
$rand = $rand[rand(0, count($rand) - 1)];
if ($rand['id'] > 0) {
$re = 'Вы успешно взяли задание &quot;' . $rand['name'] . '&quot;!<br />';
mysql_query('INSERT INTO `qst_user` (`uid`, `time`, `qid`) VALUES ("' . $user['id'] . '", "' . time() . '", "' . $rand['id'] . '")');
} else {
$re = 'Неудалось взять задание, нет подходящих заданий у Хранителя Лабиринта<br />';
}
}
} else {
$re = 'У вас уже есть задание.';
}
}
$q2 = mysql_fetch_array(mysql_query('SELECT * FROM `qst_user` WHERE `uid` = "' . $user['id'] . '" AND `cancel` = "0" AND `finish` = "0" LIMIT 1'));
$q1 = mysql_fetch_array(mysql_query('SELECT * FROM `qst` WHERE `id` = "' . $q2['qid'] . '" LIMIT 1'));
if (isset($q2['id']) && isset($_GET['cancelqst'])) {
mysql_query('UPDATE `qst_user` SET `cancel` = "' . (time() + 6 * 3600) . '" WHERE `id` = "' . $q2['id'] . '" LIMIT 1');
unset($q1, $q2);
$re = 'Вы успешно отказались от задания...<br />';
}
if (isset($q1['id'])) {
$re .= '<br /><b>Задание : </b> ' . $q1['name'] . ' [' . $q2['val'] . '/' . $q1['obj_val'] . ']<br /><a href="?cancelqst=1">&bull; Отказаться (Следующее можно будет взять через 12 часов)</a><br />';
if ($q2['val'] >= $q1['obj_val']) {
if (isset($_GET['finishqst'])) {
$re = 'Вы успешно завершили задание и получили: ';
if ($q1['cr'] > 0) {
$re .= ' ' . $q1['cr'] . ' кр. ';
}
if ($q1['rep'] > 0) {
$re .= ' ' . $q1['rep'] . ' репутации. ';
}
$re .= '<br />';
$user['money'] += $q1['cr'];
$user['doblest'] += $q1['rep'];
$user['rep_laba'] += $q1['rep'];
mysql_query('UPDATE `users` SET `money` = "' . $user['money'] . '", `doblest` = "' . $user['doblest'] . '", `rep_laba` = "' . $user['rep_laba'] . '" WHERE `id` = "' . $user['id'] . '" LIMIT 1');
mysql_query('UPDATE `qst_user` SET `finish` = "' . (time() + 60 * 60 * 12) . '" WHERE `id` = "' . $q2['id'] . '" AND `uid` = "' . $user['id'] . '" LIMIT 1');
unset($q1, $q2);
}
$re .= ' <a href="?finishqst=1">&bull; Завершить задание и получить награду!</a>';
}
} else {
?>
<input onclick="location.href='lab_enter.php?quest=1'" type="submit" name="quest"
value='Взять квестовое задание' style="background-color:#A9AFC0"/>
<? }
} ?>
<?
$sp = mysql_query('SELECT * FROM `laba_zv` ORDER BY `id` DESC');
$typez = [0 => 'Для новичков', 1 => 'Для опытных', 2 => 'Для легендарных'];
while ($pl = mysql_fetch_array($sp)) {
$userszv = '';
$i = 1;
while ($i <= 4) {
if ($pl['uid' . $i] > 0) {
$plu = mysql_fetch_array(mysql_query('SELECT `id`, `align`, `login`, `level` FROM `users` WHERE `id` = "' . $pl['uid' . $i] . '" LIMIT 1'));
if (isset($plu['id'])) {
$userszv .= ', <img src="i/align_' . $plu['align'] . '.gif"><b>' . $plu['login'] . '</b> [' . $plu['level'] . ']';
}
}
$i++;
}
$userszv = ltrim($userszv, ', ');
if ($pl['com'] != '') {
if (User::getInstance()->getAdmin()) {
$del = ' <a href=\'lab_enter.php?del_com=' . $pl['id'] . '\'>Удалить комментарий</a>';
} else {
$del = '';
}
$userszv .= ' (Комментарий: ' . $pl['com'] . '' . $del . ')';
}
if (!isset($zv['id'])) {
$userszv .= ' <input onclick="location.href=\'?priemzv=' . $pl['id'] . '\'" type="button" value="Принять">';
}
echo '<div><span class=date>' . date('H:i', $pl['time']) . '</span> Тип : <b>' . $typez[$pl['type']] . '</b> | ' . $userszv . '</div>';
}
?>
<hr>
<? if (!isset($zv['id'])) { ?>
<table width="350" border="0" cellspacing="0" cellpadding="0">
<tr>
<td valign="top">
<form id="from" autocomplete="off" name="from"
action="lab_enter.php?pz1=<? echo mt_rand(1000000, 99999999); ?>" method="post">
<fieldset style='padding-left: 5px; width=50%'>
<legend><b> Группа </b></legend>
Тип похода:
<select name="type_gors" style="margin-left:7px;" id="type_gors">
<option value="0">Новичок</option>
<option value="1">Опытный</option>
<option value="2">Легендарный</option>
</select>
<br/>
Комментарий
<input type="text" name="text" maxlength="40" size="40"/>
<br/>
<input type="submit" name="add" value="Создать группу"/>
&nbsp;<br/>
</fieldset>
</form>
</td>
</tr>
</table>
<? } else { ?>
<? if ($zv['uid1'] == $user['id']) { ?>
<input type="button" onclick="location.href='lab_enter.php?startzv=1';" value="Начать поход">
<? } ?>
<input type="button" onclick="location.href='lab_enter.php?cancelzv=1';" value="Отозвать заявку">
<? } ?>
<? if ($re != '') {
echo '<br /><font color=red>' . $re . '</font>';
}