Вход Регистрация
Файл: pages/combat/undying.php
Строк: 399
<?php
/** Долина бессмертных — битвы по игровому расписанию. */
declare(strict_types=1);
if(!
defined('GAME_ROOT')) define('GAME_ROOT',dirname(__DIR__,2));
chdir(GAME_ROOT);
if(
PHP_SAPI!=='cli'){$_SERVER['PHP_SELF']='/undying.php';$_SERVER['SCRIPT_NAME']='/undying.php';}
define('NO_GAME_LIVE_JS',true);
require_once 
'./system/common.php';require_once './system/functions.php';require_once './system/user.php';require_once './system/menu.php';
if(!
$user){header('Location:/');exit;}
$title='Долина бессмертных';$uid=(int)$user['id'];
if((int)
$user['level']<4){require './system/h.php';echo '<div class="block_zero center">Доступно с 4 уровня.</div>';require './system/f.php';exit;}

if((
$_SERVER['REQUEST_METHOD']??'GET')==='POST'){
    try{
        
security_require_csrf();$act=(string)($_POST['act']??'');
        if(
$act==='join'){game_v51_join_undying($uid);$_SESSION['ok']='Вы записаны на ближайшую битву.';}
        elseif(
in_array($act,['attack','target','stone','grass'],true)){$_SESSION['ok']=(string)(game_v51_event_action('undying',$uid,$act)['message']??'Действие выполнено.');}
        else throw new 
RuntimeException('Неизвестное действие.');
    }catch(
Throwable $e){$_SESSION['err']=$e->getMessage();}
    
header('Location:/undying/');exit;
}

try{
$event=game_v51_current_undying();}catch(Throwable $e){$event=null;$_SESSION['err']='Не удалось продолжить битву. Попробуйте ещё раз.';if(function_exists('app_log_write'))app_log_write('EVENTS','Undying battle page failed',['type'=>get_class($e),'message'=>$e->getMessage()]);}
$member=($event && $event['state']==='running' && (int)$event['id']>0)?db_fetch_one('SELECT * FROM `undying_v512_member` WHERE `event_id`=:e AND `user_id`=:u AND `is_bot`=0 LIMIT 1',['e'=>(int)$event['id'],'u'=>$uid]):null;
$signup=($event && $event['state']==='waiting')?game_v51_has_signup('undying',$uid,(int)$event['start_at']):false;
$last=db_fetch_one('SELECT r.*,e.`winner`,e.`finished_at` FROM `undying_v512_result` r JOIN `undying_v512_event` e ON e.`id`=r.`event_id` WHERE r.`user_id`=:u ORDER BY r.`event_id` DESC LIMIT 1',['u'=>$uid]);
$snap=game_v51_snapshot_user($uid)??[];

function 
undying512_history(int $uid,int $limit=20): void {
    
$events=db_prepare("SELECT * FROM `undying_v512_event` WHERE `state`='finished' AND `finished_at`>0 ORDER BY `id` DESC LIMIT ".max(1,min(50,$limit)))->fetchAll();
    if(!
$events){echo '<div class="block_zero center">Летопись пока пуста.</div>';return;}
    foreach(
$events as $e){
        
$eid=(int)$e['id'];
        
$mine=db_fetch_one('SELECT * FROM `undying_v512_result` WHERE `event_id`=:e AND `user_id`=:u LIMIT 1',['e'=>$eid,'u'=>$uid]);
        
$leaders=db_prepare('SELECT `user_id`,`name`,`damage`,`kills` FROM `undying_v512_member` WHERE `event_id`=:e AND `is_bot`=0 AND `user_id`>0 ORDER BY `damage` DESC,`kills` DESC LIMIT 3',['e'=>$eid])->fetchAll();
        echo 
'<div class="altar-history-entry center"><b>⚔ Летопись битвы</b><br><small>'.date('d.m.y H:i',(int)$e['finished_at']).'</small><br>';
        if(
$mine){
            echo ((int)
$mine['won']===1?'<span class="green">Победа!</span>':'<span class="red">Поражение</span>').'<br>';
            echo 
'Убийств: <b>'.n_f((int)$mine['kills']).'</b><br>Урон: <b>'.n_f((int)$mine['damage']).'</b><br>';
        } else echo 
'<span class="grey">Вы не участвовали в этой битве.</span><br>';
        if(
$leaders){echo '<div class="event-separator"></div><b>♛ Лучшие бойцы ♛</b><br>';foreach($leaders as $i=>$r)echo ($i+1).'. <a href="/user/'.(int)$r['user_id'].'/">'.security_html((string)$r['name']).'</a> — '.n_f((int)$r['damage']).' урона<br>';}
        echo 
'</div>';
    }
}

require 
'./system/h.php';
if(!empty(
$_SESSION['ok'])){echo '<div class="ok center">'.security_system_text((string)$_SESSION['ok']).'</div>';unset($_SESSION['ok']);}
if(!empty(
$_SESSION['err'])){echo '<div class="error center">'.security_html((string)$_SESSION['err']).'</div>';unset($_SESSION['err']);}
?>
<div class="menuList"><li><a href="/fights/"><img src="/images/icon/arrow.png" alt="">Назад</a></li></div>
<?php if(isset($_GET['history'])):?><div class="title">Летопись битв</div><?php undying512_history($uid,20);require './system/f.php';exit;endif;?>
<div class="title center">Долина бессмертных</div>
<div class="block_zero center"><img src="/images/barbars/undying.jpg" width="100%" alt="Долина бессмертных"></div>
<?php if($event && $event['state']==='running' && $member):
    
$eid=(int)$event['id'];
    
$member=db_fetch_one('SELECT * FROM `undying_v512_member` WHERE `id`=:i',['i'=>(int)$member['id']])??$member;
    
$target=null;if((int)$member['target_id']>0)$target=db_fetch_one('SELECT * FROM `undying_v512_member` WHERE `id`=:i AND `event_id`=:e AND `dead`=0',['i'=>(int)$member['target_id'],'e'=>$eid]);
    if(!
$target)$target=db_fetch_one('SELECT * FROM `undying_v512_member` WHERE `event_id`=:e AND `team`<>:tm AND `dead`=0 ORDER BY RAND() LIMIT 1',['e'=>$eid,'tm'=>(int)$member['team']]);
    
$self=game_v51_user_mannequin($uid,(int)($user['r']??0));$enemy=$target?game_v51_member_portrait($target,1):'/images/barbars/kingundying.png';
    
$sp=(int)round(100*(int)$member['hp']/max(1,(int)$member['max_hp']));$tp=$target?(int)round(100*(int)$target['hp']/max(1,(int)$target['max_hp'])):0;
    
$attackLeft=max(0,3-(time()-(int)$member['last_action']));$stoneLeft=max(0,(int)$member['stone_cd']-time());$grassLeft=max(0,(int)$member['grass_cd']-time());
    
$ally=(int)(db_fetch_one('SELECT COUNT(*) c FROM `undying_v512_member` WHERE `event_id`=:e AND `team`=0 AND `dead`=0',['e'=>$eid])['c']??0);$enemyCount=(int)(db_fetch_one('SELECT COUNT(*) c FROM `undying_v512_member` WHERE `event_id`=:e AND `team`=1 AND `dead`=0',['e'=>$eid])['c']??0);
?>
<div class="block center"><b>Битва идёт</b><br>До окончания: <b><?=security_html(_time(max(0,(int)$event['battle_end']-time())))?></b><br><small>Битва завершится в <?=date('H:i',(int)$event['battle_end'])?></small><br><a href="/undying/">Осмотреть поле боя</a></div>
<div class="altar-battle-v53"><div class="event-duel-head"><div><b><?=security_html((string)$member['name'])?></b><div class="event-hp"><span style="width:<?=$sp?>%"></span></div><small><?=n_f((int)$member['hp'])?> / <?=n_f((int)$member['max_hp'])?></small></div><div><b><?=security_html((string)($target['name']??'Нет цели'))?></b><div class="event-hp enemy"><span style="width:<?=$tp?>%"></span></div><small><?=$target?n_f((int)$target['hp']).' / '.n_f((int)$target['max_hp']):'0 / 0'?></small></div></div>
<div class="event-fighter-stage altar-stage"><img class="event-fighter self" src="<?=security_html($self)?>" alt="Ваш герой"><img class="event-fighter enemy" src="<?=security_html($enemy)?>" alt="Противник"><span class="event-hit-mark">VS</span></div>
<?php if((int)$member['dead']===1):?><div class="error center">Ваш герой выбыл из боя. Итог появится после завершения сражения.</div><?php else:?><div class="event-actions-grid">
<form method="post"><?=security_csrf_field()?><input type="hidden" name="act" value="attack"><button class="old-btn" type="submit" <?=$attackLeft>0?'disabled':''?>><?=$attackLeft>0?'Удар через '.$attackLeft.' сек.':'АТАКОВАТЬ'?></button></form>
<form method="post"><?=security_csrf_field()?><input type="hidden" name="act" value="target"><button class="old-btn" type="submit">Сменить цель</button></form>
<form method="post"><?=security_csrf_field()?><input type="hidden" name="act" value="stone"><button class="old-btn" type="submit" <?=$stoneLeft>0?'disabled':''?>><img src="/images/icon/stone.png" alt=""> <?=$stoneLeft>0?'Камень через '.$stoneLeft.' сек.':'Камень'?></button></form>
<form method="post"><?=security_csrf_field()?><input type="hidden" name="act" value="grass"><button class="old-btn" type="submit" <?=$grassLeft>0?'disabled':''?>><img src="/images/icon/grass.png" alt=""> <?=$grassLeft>0?'Трава через '.$grassLeft.' сек.':'Трава'?></button></form>
</div><?php endif;?>
<div class="event-side-count center">Союзники: <b class="green"><?=$ally?></b> &nbsp; Враги: <b class="red"><?=$enemyCount?></b></div><div class="event-log"><?php foreach(db_prepare('SELECT `text` FROM `undying_v512_log` WHERE `event_id`=:e ORDER BY `id` DESC LIMIT 8',['e'=>$eid])->fetchAll() as $l)echo '<div>• '.security_html((string)$l['text']).'</div>';?></div></div>
<?php else: ?>
<div class="event-lobby-v53 center">
<?php if($event && $event['state']==='waiting'):$left=max(0,(int)$event['start_at']-time());?>
<div>Следующая битва: <b><?=date('d.m.Y H:i',(int)$event['start_at'])?></b></div><div>До начала: <b><?=security_html(_time($left))?></b></div><div class="grey"><small>Часы битв: <?=security_html(game_v51_schedule_times('undying'))?></small></div>
<?php if(!$signup):?><form method="post" class="mt5"><?=security_csrf_field()?><input type="hidden" name="act" value="join"><button class="old-btn" type="submit">Записаться на битву</button></form><?php else:?><div class="green">✓ Вы записаны на ближайшую битву.</div><?php endif;?>
<?php 
elseif($event && $event['state']==='running'):?><div class="orange">Битва уже идёт. Вступить после начала нельзя.</div><div>До окончания: <b><?=security_html(_time(max(0,(int)$event['battle_end']-time())))?></b></div><?php else:?><div class="grey">Следующая битва ещё не подготовлена.</div><?php endif;?>
<div class="mt5"><a href="/undying/">Осмотреть поле боя</a> · <a href="/undying/?history=1">летопись битв</a></div></div>
<?php if($last && !$member):$won=(int)$last['won']===1;?>
<div class="event-result-v53 center"><div class="event-result-title <?=$won?'win':'lose'?>"><?=$won?'Победа!':'Поражение'?></div>Убийств: <b><?=n_f((int)$last['kills'])?></b><br>Нанесено урона: <b class="green"><?=n_f((int)$last['damage'])?></b><br>Награда: <img src="/images/icon/silver.png" alt=""> <?=n_f((int)$last['reward_silver'])?> серебра · <img src="/images/icon/exp.png" alt=""> <?=n_f((int)$last['reward_exp'])?> опыта · доблесть <?=n_f((int)$last['reward_valor'])?><?php if((int)$last['reward_gold']>0):?> · <img src="/images/icon/gold.png" alt=""> <?=n_f((int)$last['reward_gold'])?><?php endif;?><br><small><?=date('d.m.Y H:i',(int)$last['finished_at'])?></small></div>
<?php endif;?>
<div class="block center"><div class="blue">Личный бонус Статуи клана</div><?php if((int)($snap['clan_id']??0)>0):?>Статуя: <b><?=n_f((int)($snap['statue_level']??0))?> уровень</b><br><?php if((int)($snap['statue_bonus']??0)>0):?><span class="green">+<?=n_f((int)$snap['statue_bonus'])?> к сумме параметров</span><br><small>Активен до <?=date('H:i:s',(int)$snap['statue_until'])?></small><?php else:?><span class="orange">Бонус Статуи сейчас не активирован лидером</span><?php endif;?><?php else:?><span class="grey">Вы не состоите в клане.</span><?php endif;?></div>
<?php endif;?>
<div class="mini-line"></div><ul class="hint"><li>Чтобы вступить в ближайшую битву, заранее запишитесь кнопкой выше.</li><li>После начала битвы новые участники уже не принимаются.</li><li>Сражение начинается и завершается само по игровому расписанию, даже если локация закрыта.</li></ul>
<?php require './system/f.php';?>
Онлайн: 2
Реклама