Вход Регистрация
Файл: system/pets_v507.php
Строк: 130
<?php
/* Питомцы v50.7: единый уровень 1–80, безопасная прокачка и единый расчёт. by Метриум (Стэлп) */
declare(strict_types=1);

function 
pet_v507_bootstrap(): void {
    static 
$done=false; if($done) return; $done=true;
    
$ver=(int)game_meta_get('pet_v507_schema','0');
    if(
$ver>=1) return;
    
$c=db_fetch_one("SHOW COLUMNS FROM `pet_u` LIKE 'level'");
    if(!
$cdb_query("ALTER TABLE `pet_u` ADD COLUMN `level` tinyint unsigned NOT NULL DEFAULT 1 AFTER `screen`");
    
db_query("UPDATE `pet_u` SET `level`=LEAST(80,GREATEST(1,COALESCE(`level`,1),COALESCE(`lvl_str`,1),COALESCE(`lvl_vit`,1),COALESCE(`lvl_agi`,1),COALESCE(`lvl_def`,1),COALESCE(`lvl_mana`,1)))");
    
game_meta_set('pet_v507_schema','1');
}

function 
pet_v507_level(array $pet): int {
    return 
max(1,min(80,(int)($pet['level'] ?? max((int)($pet['lvl_str']??1),(int)($pet['lvl_vit']??1),(int)($pet['lvl_agi']??1),(int)($pet['lvl_def']??1),(int)($pet['lvl_mana']??1)))));
}

function 
pet_v507_cost(int $level): array {
    
$level=max(1,min(79,$level));
    
// Плавная прогрессия: ранние уровни доступны новичку, верхние требуют серьёзных вложений.
    
$silver=(int)round(1800 + ($level*$level*340) + pow($level,1.55)*190);
    
$gold=max(1,(int)floor(($level+5)/6));
    if(
$level>=40$gold+=1;
    if(
$level>=60$gold+=2;
    return [
'silver'=>min(3500000,$silver),'gold'=>min(25,$gold)];
}

function 
pet_v507_gain(array $catalog,int $nextLevel): array {
    
$factor=1.0 min(1.4,$nextLevel/70);
    
$gain=[];
    foreach([
'str','vit','agi','def'] as $stat){
        
$base=max(1,(int)($catalog[$stat]??1));
        
$gain[$stat]=max(1,(int)round(max(2,$base*.055)*$factor));
    }
    
$manaBase=max(0,(int)($catalog['mana']??0));
    
$gain['mana']=$manaBase>0?max(1,(int)round(max(1,$manaBase*.04)*$factor)):0;
    return 
$gain;
}

function 
pet_v507_total(array $pet): int {
    return 
max(0,(int)($pet['str']??0)+(int)($pet['vit']??0)+(int)($pet['agi']??0)+(int)($pet['def']??0));
}

function 
pet_v507_upgrade(int $uid,int $ownedId): array {
    
pet_v507_bootstrap();
    
$pdo=db_pdo(); $pdo->beginTransaction();
    try{
        
$pet=db_fetch_one('SELECT * FROM `pet_u` WHERE `id`=:i AND `user_id`=:u LIMIT 1 FOR UPDATE',['i'=>$ownedId,'u'=>$uid]);
        if(!
$pet) throw new RuntimeException('Питомец не найден.');
        
$level=pet_v507_level($pet);
        if(
$level>=80) throw new RuntimeException('Питомец уже достиг максимального 80 уровня.');
        
$catalog=db_fetch_one('SELECT * FROM `pet` WHERE `id`=:p LIMIT 1',['p'=>(int)$pet['pet_id']]) ?: $pet;
        
$cost=pet_v507_cost($level); $next=$level+1$gain=pet_v507_gain($catalog,$next);
        
$pay=db_prepare('UPDATE `users` SET `s`=`s`-:s,`g`=`g`-:g,`str`=`str`+:str,`vit`=`vit`+:vit,`agi`=`agi`+:agi,`def`=`def`+:def,`mana`=`mana`+:mana WHERE `id`=:u AND `s`>=:s2 AND `g`>=:g2',[
            
's'=>$cost['silver'],'g'=>$cost['gold'],'str'=>$gain['str'],'vit'=>$gain['vit'],'agi'=>$gain['agi'],'def'=>$gain['def'],'mana'=>$gain['mana'],'u'=>$uid,'s2'=>$cost['silver'],'g2'=>$cost['gold']
        ]);
        if(
$pay->rowCount()!==1) throw new RuntimeException('Недостаточно серебра или золота для улучшения.');
        
db_execute('UPDATE `pet_u` SET `level`=:l,`lvl_str`=:l1,`lvl_vit`=:l2,`lvl_agi`=:l3,`lvl_def`=:l4,`lvl_mana`=:l5,`str`=`str`+:str,`vit`=`vit`+:vit,`agi`=`agi`+:agi,`def`=`def`+:def,`mana`=`mana`+:mana WHERE `id`=:i AND `user_id`=:u',[
            
'l'=>$next,'l1'=>$next,'l2'=>$next,'l3'=>$next,'l4'=>$next,'l5'=>$next,'str'=>$gain['str'],'vit'=>$gain['vit'],'agi'=>$gain['agi'],'def'=>$gain['def'],'mana'=>$gain['mana'],'i'=>$ownedId,'u'=>$uid
        
]);
        
$pdo->commit();
        return [
'level'=>$next,'cost'=>$cost,'gain'=>$gain];
    }catch(
Throwable $e){ if($pdo->inTransaction()) $pdo->rollBack(); throw $e; }
}
Онлайн: 2
Реклама