Файл: 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(!$c) db_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; }
}