Вход Регистрация
Файл: pages/progress/collector.php
Строк: 174
<?php
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']='/collector.php'$_SERVER['SCRIPT_NAME']='/collector.php'; }

require_once 
'./system/common.php'; require_once './system/functions.php'; require_once './system/user.php';
if(!
$user){header('Location: /');exit;}
$uid=(int)$user['id']; $title='Коллекции';
$base=db_fetch_one('SELECT * FROM `collector` WHERE `user`=:u LIMIT 1',['u'=>$uid]);
if(!
$base){ db_execute('INSERT INTO `collector` (`user`,`coll`,`stats`) VALUES (:u,1,0)',['u'=>$uid]); $base=['coll'=>1,'stats'=>0]; }
$defs=game_collector_defs();
// coll is the NEXT collection to complete; 7 means all six are completed.
$next=max(1,min(7,(int)($base['coll']??1)));
$expected=game_collector_expected_bonus($next);
// Repair old incremental/repeated claim values deterministically from completed tiers.
if((int)($base['stats']??0)!==$expected || (int)($user['collector_bonus']??0)!==$expected){
    
db_execute('UPDATE `collector` SET `stats`=:s WHERE `user`=:u',['s'=>$expected,'u'=>$uid]);
    
db_execute('UPDATE `users` SET `collector_bonus`=:s WHERE `id`=:u',['s'=>$expected,'u'=>$uid]);
    
$base['stats']=$expected$user['collector_bonus']=$expected;
}

if(isset(
$_POST['drop'])){
    
security_require_csrf();
    if(
$next>6){ $_SESSION['ok']='Все коллекции уже собраны.'header('Location: /collector/'.$uid.'/'); exit; }
    
$d=$defs[$next];
    if((int)
$user['battle_collector'] >= (int)$d['need']){
        
$head=game_collector_drop($uid,$next);
        
db_execute('UPDATE `users` SET `battle_collector`=GREATEST(0,`battle_collector`-:n) WHERE `id`=:u',['n'=>(int)$d['need'],'u'=>$uid]);
        
$_SESSION['ok']='Получена голова коллекции №'.$head.'. Повторные головы сохраняются.';
    } else 
$_SESSION['ok']='Недостаточно побед для получения головы.';
    
header('Location: /collector/'.$uid.'/'); exit;
}
if(isset(
$_POST['claim'])){
    
security_require_csrf();
    if(
$next>6){ $_SESSION['ok']='Все коллекции уже собраны.'header('Location: /collector/'.$uid.'/'); exit; }
    
$pdo=db_pdo(); $pdo->beginTransaction();
    try{
        
$locked=db_fetch_one('SELECT `coll`,`stats` FROM `collector` WHERE `user`=:u FOR UPDATE',['u'=>$uid]);
        
$cur=max(1,min(7,(int)($locked['coll']??1)));
        if(
$cur!==$next || $cur>6) throw new RuntimeException('Коллекция уже изменилась. Откройте её ещё раз.');
        
$d=$defs[$cur];
        if(
game_collector_unique_count($uid,$cur)<(int)$d['heads']) throw new RuntimeException('Коллекция ещё не собрана полностью.');
        
$new=$cur+1$stats=game_collector_expected_bonus($new);
        
db_execute('UPDATE `collector` SET `coll`=:c,`stats`=:s WHERE `user`=:u',['c'=>$new,'s'=>$stats,'u'=>$uid]);
        
db_execute('UPDATE `users` SET `collector_bonus`=:s WHERE `id`=:u',['s'=>$stats,'u'=>$uid]);
        
$pdo->commit(); $_SESSION['ok']='Коллекция собрана! Общий бонус коллекций теперь +'.$stats.' к сумме параметров.';
    }catch(
Throwable $e){ if($pdo->inTransaction())$pdo->rollBack(); $_SESSION['ok']=$e->getMessage(); }
    
header('Location: /collector/'.$uid.'/'); exit;
}
$title='Коллекции'; require_once './system/h.php';
if(!empty(
$_SESSION['ok'])){echo '<div class="ok center">'.security_html((string)$_SESSION['ok']).'</div>';unset($_SESSION['ok']);}
$base=db_fetch_one('SELECT * FROM `collector` WHERE `user`=:u LIMIT 1',['u'=>$uid]) ?: $base$next=max(1,min(7,(int)($base['coll']??1)));
?>
<div class="main collector-page"><div class="block_zero center blue">Побеждай на арене<br>и собирай коллекции!</div>
<?php if($next<=6): $d=$defs[$next]; $energy=min((int)$user['battle_collector'],(int)$d['need']); ?>
<div class="collector-current center"><div class="blue"><?=security_html($d['name'])?></div>
<?=game_progress_markup($energy,(int)$d['need'],'Победы до следующей головы')?>
<img class="collector-badge" src="/images/collector/<?=$next?>.png" alt=""><br>
<?php if(game_collector_unique_count($uid,$next)>=(int)$d['heads']): ?>
<form method="post" action="/collector/<?=$uid?>/" class="inline-form"><?=security_csrf_field()?><input type="hidden" name="claim" value="1"><button class="btn" type="submit"><span class="end"><span class="label">Завершить коллекцию</span></span></button></form>
<?php elseif((int)$user['battle_collector'] >= (int)$d['need']): ?>
<form method="post" action="/collector/<?=$uid?>/" class="inline-form"><?=security_csrf_field()?><input type="hidden" name="drop" value="1"><button class="btn" type="submit"><span class="end"><span class="label">Получить случайную голову</span></span></button></form>
<?php else: ?><a class="btn" href="/arena/"><span class="end"><span class="label">На арену</span></span></a><?php endif; ?></div>
<?php else: ?><div class="ok center">✓ Все коллекции собраны</div><?php endif; ?>
<?php 
foreach($defs as $coll=>$def): $heads=game_collector_heads($uid,$coll); $uniq=count(array_filter($heads,fn($x)=>$x>0)); $completed=$coll<$next?>
<div class="collection-set center"><div><?=$completed?'✓ ':'🏆 '?>Коллекция: <span style="color:<?=security_html($def['color'])?>"><?=security_html($def['name'])?></span></div>
<?=game_progress_markup($uniq,(int)$def['heads'],'Собрано голов')?>
<div class="collection-heads"><?php for($h=1;$h<=(int)$def['heads'];$h++): $q=(int)($heads[$h]??0); ?><span class="collector-head <?=$q?'owned':'missing'?>"><img src="/images/collector/<?=$coll?>/<?=$h?>.png" alt=""><?php if($q>1): ?><b>x<?=$q?></b><?php endif; ?></span><?php endfor; ?></div>
<div class="blue">Бонус качества: <span class="dgreen">+<?=n_f((int)$def['bonus'])?></span> к сумме параметров</div></div><?php endforeach; ?>
<div class="block_zero center blue">Общий действующий бонус коллекций:<br><span class="dgreen">+<?=n_f((int)($base['stats']??0))?></span> к сумме параметров</div>
<div class="hint"><li>Повторная голова не ломает прогресс: она хранится отдельно.</li><li>Каждый бонус коллекции распределяется по силе, живучести, ловкости и защите; указанное число — итоговая сумма, а не ×4.</li></div></div>
<?php require './system/f.php'?>
Онлайн: 3
Реклама