Вход Регистрация
Файл: system/v35_features.php
Строк: 159
<?php
/* Доработки предметов, питомцев и прогрессии: by Метриум (Стэлп) */
declare(strict_types=1);

function 
game_v35_bootstrap(): void {
    static 
$done=false; if($done) return; $done=true;
    if((int)(
function_exists('game_meta_get')?game_meta_get('v35_schema','0'):0)>=2) return;
    
// В исходном дампе таблица pet существует, но каталог пустой. Заполняем только при миграции.
    
try {
        
$count=(int)(db_result(db_query('SELECT COUNT(*) FROM `pet`'),0) ?: 0);
        if(
$count===0){
            
$pets=[
                [
1,'Дракон','1.png',250,25,25,25,25,10],
                [
2,'Гидра','2.png',500,35,35,35,35,15],
                [
3,'Цербер','3.png',1000,50,50,50,50,20],
                [
4,'Феникс','4.png',2500,75,75,75,75,30],
            ];
            foreach(
$pets as $p){
                
db_execute('INSERT INTO `pet` (`id`,`name`,`screen`,`cena`,`vit`,`str`,`agi`,`def`,`mana`) VALUES (:id,:name,:screen,:cena,:vit,:str,:agi,:def,:mana)',[
                    
':id'=>$p[0],':name'=>$p[1],':screen'=>$p[2],':cena'=>$p[3],':vit'=>$p[4],':str'=>$p[5],':agi'=>$p[6],':def'=>$p[7],':mana'=>$p[8]
                ]);
            }
        }
        if(
function_exists('game_meta_set')) game_meta_set('v35_schema','2');
    } catch(
Throwable $e){ error_log('[V35_PETS] '.$e->getMessage()); }
}

function 
game_item_base_row(int $itemId): ?array {
    
$r=db_fetch_assoc(db_query('SELECT `id`,`bonus`,`_str`,`_vit`,`_agi`,`_def`,`quality` FROM `shop` WHERE `id`='.$itemId.' LIMIT 1'));
    return 
$r ?: null;
}

/**
 * Переносит все вложенные улучшения старой надетой вещи на новую вещь того же слота.
 * Улучшения не складываются бесконечно: старая вещь сбрасывается до своих базовых значений,
 * а новая получает именно разницу между старой улучшенной и старой базовой вещью.
 */
function game_transfer_item_enhancements(int $uid,int $oldInvId,int $newInvId): bool {
    if(
$uid<=|| $oldInvId<=|| $newInvId<=|| $oldInvId===$newInvId) return false;
    
$old=db_fetch_assoc(db_query('SELECT * FROM `inv` WHERE `id`='.$oldInvId.' AND `user`='.$uid.' LIMIT 1'));
    
$new=db_fetch_assoc(db_query('SELECT * FROM `inv` WHERE `id`='.$newInvId.' AND `user`='.$uid.' LIMIT 1'));
    if(!
$old || !$new) return false;
    
$oldItem=db_fetch_assoc(db_query('SELECT `id`,`w`,`quality` FROM `items` WHERE `id`='.(int)$old['item'].' LIMIT 1'));
    
$newItem=db_fetch_assoc(db_query('SELECT `id`,`w`,`quality` FROM `items` WHERE `id`='.(int)$new['item'].' LIMIT 1'));
    if(!
$oldItem || !$newItem || (int)$oldItem['w']!==(int)$newItem['w']) return false;
    
$ob=game_item_base_row((int)$old['item']); $nb=game_item_base_row((int)$new['item']);
    if(!
$ob || !$nb) return false;
    
$fields=['_str','_vit','_agi','_def']; $newStats=[];
    foreach(
$fields as $f){
        
$delta=max(0,(int)$old[$f]-(int)$ob[$f]);
        
$newStats[$f]=(int)$nb[$f]+$delta;
    }
    
$maxBonus=game_item_bonus_max((int)$newItem['quality']);
    
$newBonus=min($maxBonus,max((int)$nb['bonus'],(int)$old['bonus']));
    
$newSmith=max(0,(int)$old['smith']);
    
$newRune=max(0,min(6,(int)$old['rune']));
    
$newStars=max(0,min(5,(int)($old['stars']??0)));
    
db_pdo()->beginTransaction();
    try {
        
db_execute('UPDATE `inv` SET `bonus`=:b,`smith`=:s,`rune`=:r,`stars`=:st,`_str`=:str,`_vit`=:vit,`_agi`=:agi,`_def`=:def WHERE `id`=:id AND `user`=:u',[
            
':b'=>$newBonus,':s'=>$newSmith,':r'=>$newRune,':st'=>$newStars,':str'=>$newStats['_str'],':vit'=>$newStats['_vit'],':agi'=>$newStats['_agi'],':def'=>$newStats['_def'],':id'=>$newInvId,':u'=>$uid
        
]);
        
db_execute('UPDATE `inv` SET `bonus`=:b,`smith`=0,`rune`=0,`stars`=0,`_str`=:str,`_vit`=:vit,`_agi`=:agi,`_def`=:def WHERE `id`=:id AND `user`=:u',[
            
':b'=>(int)$ob['bonus'],':str'=>(int)$ob['_str'],':vit'=>(int)$ob['_vit'],':agi'=>(int)$ob['_agi'],':def'=>(int)$ob['_def'],':id'=>$oldInvId,':u'=>$uid
        
]);
        
db_pdo()->commit();
        return 
true;
    } catch(
Throwable $e){ if(db_pdo()->inTransaction()) db_pdo()->rollBack(); error_log('[ITEM_TRANSFER] '.$e->getMessage()); return false; }
}

function 
game_trophy_defs_v35(): array {
    global 
$names,$quests,$undying_kills,$skill;
    
$out=[];
    for(
$i=1;$i<=9;$i++){
        
$raw=(string)($names[$i]??('Трофей '.$i));
        
$parts=preg_split('~<brs*/?>~i',$raw,2);
        
$title=trim(strip_tags((string)($parts[0]??('Трофей '.$i))));
        
$out[$i]=[
            
'name'=>$title,
            
'quests'=>(int)($quests[$i]??0),
            
'undying'=>(int)($undying_kills[$i]??0),
            
'skill'=>(int)($skill[$i]??0),
        ];
    }
    return 
$out;
}
Онлайн: 3
Реклама