Файл: 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<=0 || $oldInvId<=0 || $newInvId<=0 || $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;
}