Вход Регистрация
Файл: pages/combat/aid.php
Строк: 135
<?php
/* Царство Аида v50.3 — восстановленный безопасный боевой модуль. */
declare(strict_types=1);
// Physical module map v50.6: public URL stays clean while code lives in /pages.
if (!defined('GAME_ROOT')) define('GAME_ROOT'dirname(__DIR__2));
chdir(GAME_ROOT);
if (
PHP_SAPI !== 'cli') { $_SERVER['PHP_SELF']='/aid.php'$_SERVER['SCRIPT_NAME']='/aid.php'; }

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; }

// Отдельный журнал действий не меняет старую таблицу события и не ломает админское управление Аидом.
db_query("CREATE TABLE IF NOT EXISTS `aid_v53_player` (
  `user_id` int unsigned NOT NULL,
  `damage` bigint unsigned NOT NULL DEFAULT 0,
  `attacks` int unsigned NOT NULL DEFAULT 0,
  `last_attack` int unsigned NOT NULL DEFAULT 0,
  `kills` int unsigned NOT NULL DEFAULT 0,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"
);

db_query("INSERT IGNORE INTO `aid` (`id`,`voln`,`time`,`status`,`hp`,`ten`,`gr`) VALUES (1,1,0,0,0,0,0)");
$uid=(int)$user['id'];

if ((
$_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') {
    try {
        
security_require_csrf();
        if ((string)(
$_POST['act'] ?? '') !== 'attack') throw new RuntimeException('Неизвестное действие.');
        
db_pdo()->beginTransaction();
        
$boss=db_fetch_one('SELECT * FROM `aid` WHERE `id`=1 LIMIT 1 FOR UPDATE');
        if (!
$boss || (int)$boss['status'] !== || (int)$boss['hp'] <= 0) throw new RuntimeException('Аид сейчас не участвует в сражении.');
        
$p=db_fetch_one('SELECT * FROM `aid_v53_player` WHERE `user_id`=:u LIMIT 1 FOR UPDATE',['u'=>$uid]);
        
$now=time();
        if (
$p && $now-(int)$p['last_attack'] < 3) throw new RuntimeException('До следующей атаки нужно немного подождать.');
        
$power=max(10,(int)$user['str']+(int)round((int)$user['agi']*.45));
        
$damage=max(1,(int)round($power*(mt_rand(82,118)/100)));
        
$damage=min((int)$boss['hp'],$damage);
        
$left=max(0,(int)$boss['hp']-$damage);
        
$kill=$left===0;
        
db_execute('UPDATE `aid` SET `hp`=:h,`status`=:s WHERE `id`=1',['h'=>$left,'s'=>$kill?0:1]);
        
db_execute('INSERT INTO `aid_v53_player` (`user_id`,`damage`,`attacks`,`last_attack`,`kills`) VALUES (:u,:d,1,:t,:k) ON DUPLICATE KEY UPDATE `damage`=`damage`+VALUES(`damage`),`attacks`=`attacks`+1,`last_attack`=VALUES(`last_attack`),`kills`=`kills`+VALUES(`kills`)',['u'=>$uid,'d'=>$damage,'t'=>$now,'k'=>$kill]);
        
$silver=min(5000,max(25,(int)floor($damage/50))); $exp=min(5000,max(20,(int)floor($damage/60))); $gold=$kill?5:0;
        
db_execute('UPDATE `users` SET `s`=LEAST(2000000000,`s`+:s),`exp`=LEAST(9000000000000000000,`exp`+:x),`g`=LEAST(2000000000,`g`+:g) WHERE `id`=:u',['s'=>$silver,'x'=>$exp,'g'=>$gold,'u'=>$uid]);
        
db_pdo()->commit();
        
$_SESSION['ok']='Вы нанесли Аиду '.n_f($damage).' урона. +'.n_f($silver).' серебра, +'.n_f($exp).' опыта'.($kill?' и +5 золота за последний удар.':'.');
    } catch (
Throwable $e) {
        if (
db_pdo()->inTransaction()) db_pdo()->rollBack();
        
$_SESSION['err']=$e->getMessage();
    }
    
header('Location:/aid'); exit;
}

$boss=db_fetch_one('SELECT * FROM `aid` WHERE `id`=1 LIMIT 1');
$mine=db_fetch_one('SELECT * FROM `aid_v53_player` WHERE `user_id`=:u LIMIT 1',['u'=>$uid]) ?: ['damage'=>0,'attacks'=>0,'kills'=>0,'last_attack'=>0];
$leaders=db_prepare('SELECT p.`damage`,p.`attacks`,p.`kills`,u.`id`,u.`login` FROM `aid_v53_player` p JOIN `users` u ON u.`id`=p.`user_id` ORDER BY p.`damage` DESC LIMIT 5')->fetchAll();
$title='Царство Аида'; require './system/h.php';
?>
<div class="menuList"><li><a href="/fights"><img src="/images/icon/arrow.png" alt="">Назад</a></li></div>
<div class="title">Царство Аида</div>
<div class="center"><img src="/images/town/hd/hell.jpg" alt="Царство Аида" style="display:block;width:100%;height:auto"></div>
<?php if ($boss && (int)$boss['status']===&& (int)$boss['hp']>0): ?>
<div class="block_zero center"><b class="red">Аид восстал из мёртвых!</b><br>Волна: <b><?=n_f((int)$boss['voln'])?></b><br>Осталось здоровья: <b class="green"><?=n_f((int)$boss['hp'])?></b><?php if((int)$boss['time']>time()):?><br>До завершения события: <b data-live-until="<?=(int)$boss['time']?>" data-live-format="short"><?=_time((int)$boss['time']-time())?></b><?php endif;?><form method="post" style="margin-top:6px"><?=security_csrf_field()?><input type="hidden" name="act" value="attack"><button class="old-btn" type="submit" data-cooldown-until="<?=max(time(),(int)$mine['last_attack']+3)?>">Атаковать Аида</button></form></div>
<?php else: ?>
<div class="block_zero center grey">Сейчас Аид не активен. Когда событие будет запущено администрацией, кнопка сражения автоматически станет доступна.</div>
<?php endif; ?>
<div class="title">Ваш результат</div><div class="block_zero center">Нанесено урона: <b><?=n_f((int)$mine['damage'])?></b><br>Атак: <b><?=n_f((int)$mine['attacks'])?></b> · Победных ударов: <b><?=n_f((int)$mine['kills'])?></b></div>
<?php if($leaders):?><div class="title">Лучшие по урону</div><div class="block_zero center"><?php foreach($leaders as $i=>$r):?><div><?=($i+1)?>. <a href="/user/<?= (int)$r['id'?>"><?=htmlspecialchars((string)$r['login'],ENT_QUOTES,'UTF-8')?></a> — <b><?=n_f((int)$r['damage'])?></b></div><?php endforeach;?></div><?php endif;?>
<div class="menuList"><li><a href="/fights"><img src="/images/icon/arrow.png" alt="">Вернуться к сражениям</a></li></div>
<?php require './system/f.php';
Онлайн: 3
Реклама