Файл: pages/combat/altars.php
Строк: 393
<?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']='/altars.php';$_SERVER['SCRIPT_NAME']='/altars.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;}
$uid=(int)$user['id'];$snap=game_v51_snapshot_user($uid);$clanId=(int)($snap['clan_id']??0);$title='Древние алтари';
if($clanId<=0){require './system/h.php';echo '<div class="menuList"><li><a href="/fights/"><img src="/images/icon/arrow.png" alt="">Назад</a></li></div><div class="block_zero center"><span class="red">Древние алтари доступны только игрокам, состоящим в клане.</span></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_altars($uid);$_SESSION['ok']='Вы записаны на ближайшую битву за алтарь.';}
elseif(in_array($act,['attack','target','stone','grass'],true)){$_SESSION['ok']=(string)(game_v51_event_action('altar',$uid,$act)['message']??'Действие выполнено.');}
else throw new RuntimeException('Неизвестное действие.');
}catch(Throwable $e){$_SESSION['err']=$e->getMessage();}
header('Location:/altars/');exit;
}
try{$event=game_v51_current_altars();}catch(Throwable $e){$event=null;$_SESSION['err']='Не удалось продолжить битву за Алтари. Попробуйте ещё раз.';if(function_exists('app_log_write'))app_log_write('EVENTS','Altars battle page failed',['type'=>get_class($e),'message'=>$e->getMessage()]);}
$member=($event && $event['state']==='running' && (int)$event['id']>0)?db_fetch_one('SELECT * FROM `altar_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('altar',$uid,(int)$event['start_at']):false;
$last=db_fetch_one('SELECT * FROM `altar_v512_result` WHERE `user_id`=:u ORDER BY `event_id` DESC LIMIT 1',['u'=>$uid]);$progress=game_v51_altar_progress($clanId);
function altar512_history(int $clanId,int $limit=20): void {
$events=db_prepare("SELECT * FROM `altar_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 r.*,c.`name` FROM `altar_v512_clan_result` r LEFT JOIN `clans` c ON c.`id`=r.`clan_id` WHERE r.`event_id`=:e AND r.`clan_id`=:c LIMIT 1',['e'=>$eid,'c'=>$clanId]);$top=db_prepare('SELECT r.*,c.`name` FROM `altar_v512_clan_result` r LEFT JOIN `clans` c ON c.`id`=r.`clan_id` WHERE r.`event_id`=:e ORDER BY r.`place` ASC LIMIT 3',['e'=>$eid])->fetchAll();$leaders=db_prepare('SELECT `user_id`,`name`,`damage`,`kills` FROM `altar_v512_member` WHERE `event_id`=:e AND `is_bot`=0 ORDER BY `damage` 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 '<b>'.security_html(game_v51_altar_name((int)$mine['altar_before'])).'</b><br>Клан занял <b>'.(int)$mine['place'].' место</b><br>Урон клана: <b>'.n_f((int)$mine['damage']).'</b><br>Зачёты: <b>'.(int)$mine['points'].' из 10</b><br>';echo (int)$mine['captured']===1?'<span class="green">Алтарь захвачен!</span>':'<span class="red">Алтарь не захвачен.</span>';echo ' Прогресс: <b>'.(int)$mine['altar_before'].' → '.(int)$mine['altar_after'].'</b><br>Награда в казну: <img src="/images/icon/gold.png" alt=""> '.n_f((int)$mine['reward_gold']).' <img src="/images/icon/silver.png" alt=""> '.n_f((int)$mine['reward_silver']);}else echo '<span class="grey">Ваш клан не участвовал.</span>';
echo '<div class="event-separator"></div><b>♛ Лучшие кланы ♛</b><br>';foreach($top as $r)echo (int)$r['place'].'. '.security_html((string)($r['name']??'Клан')).' — '.n_f((int)$r['damage']).' урона '.((int)$r['captured']===1?'<span class="green">захват</span>':'').'<br>';
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 altar512_history($clanId,20);require './system/f.php';exit;endif;?>
<?php if($event && $event['state']==='running' && $member):
$eid=(int)$event['id'];$member=db_fetch_one('SELECT * FROM `altar_v512_member` WHERE `id`=:i',['i'=>(int)$member['id']])??$member;$clanState=game_v51_clan_altars($eid,$clanId);
$target=null;if((int)$member['target_id']>0)$target=db_fetch_one('SELECT * FROM `altar_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 `altar_v512_member` WHERE `event_id`=:e AND `id`<>:i AND `dead`=0 ORDER BY RAND() LIMIT 1',['e'=>$eid,'i'=>(int)$member['id']]);
$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;$self=game_v51_user_mannequin($uid,(int)($user['r']??0));$enemy=$target?game_v51_member_portrait($target,1):'/images/boss/18.png';$alive=(int)(db_fetch_one('SELECT COUNT(*) c FROM `altar_v512_member` WHERE `event_id`=:e AND `dead`=0',['e'=>$eid])['c']??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());
?>
<div class="title center"><?=security_html((string)$clanState['name'])?> · <?=(int)$clanState['level']?> из 10</div>
<div class="block_zero center">Битва идёт<br>До окончания: <b><?=security_html(_time(max(0,(int)$event['battle_end']-time())))?></b><br><small>Битва завершится в <?=date('H:i',(int)$event['battle_end'])?></small><br>Урон клана: <b class="green"><?=n_f((int)$clanState['damage'])?></b> / <?=n_f((int)$clanState['required'])?><br>Место клана: <b><?=max(1,(int)$clanState['place'])?></b><br><a href="/altars/">Осмотреть поле боя</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"><?=$alive?></b></div><div class="event-log"><?php foreach(db_prepare('SELECT `text` FROM `altar_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="title center"><?=security_html((string)$progress['name'])?> <span class="grey"><?=(int)$progress['level']?> из 10</span></div>
<div class="block_zero center"><img src="/images/barbars/undying.jpg" width="100%" alt="Древние алтари"></div>
<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('altar'))?></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="/altars/">Осмотреть поле боя</a> · <a href="/altars/?history=1">летопись битв</a></div></div>
<?php if($last && !$member):$captured=(int)$last['captured']===1;?>
<div class="event-result-v53 center"><div class="event-result-title <?=$captured?'win':'lose'?>"><?=$captured?'Алтарь захвачен!':'Алтарь не захвачен'?></div><b><?=security_html(game_v51_altar_name((int)$last['altar_before']))?></b><br>Место клана: <b><?=n_f((int)$last['place'])?></b><br>Прогресс клана: <b><?=(int)$last['altar_before']?> → <?=(int)$last['altar_after']?></b><br>Ваш урон: <b class="green"><?=n_f((int)$last['damage'])?></b><br>Убийств: <b><?=n_f((int)$last['kills'])?></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'])?> опыта<br><small><?=date('d.m.Y H:i',(int)$last['finished_at'])?></small></div>
<?php endif;?>
<div class="block center"><div class="blue">Личный бонус Статуи клана</div>Статуя: <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;?></div>
<?php endif;?>
<div class="mini-line"></div><ul class="hint"><li>Доступ только героям, состоящим в клане. Для участия заранее запишитесь на ближайшую битву.</li><li>Каждый герой сражается сам, а результат клана складывается из урона всех участников.</li><li>За каждые 5 000 урона клан получает зачёт. Три лучших клана при выполнении нормы продвигаются дальше.</li><li>Битва начинается и завершается сама по игровому расписанию.</li></ul>
<?php require './system/f.php';?>