Вход Регистрация
Файл: system/duel_bots.php
Строк: 124
<?php
/* Дуэльные NPC и fallback-подбор соперников: by Метриум (Стэлп) */

define('DUEL_BOT_MIN_ID', -9999);

function 
duel_bot_templates(): array {
    return [
        -
101 => ['login'=>'Страж Пепельных Врат','sex'=>0,'r'=>0,'scale'=>0.86,'rating'=>4,'items'=>[9,10,11,12,13,14,15,16]],
        -
102 => ['login'=>'Охотница Серых Троп','sex'=>1,'r'=>1,'scale'=>0.96,'rating'=>8,'items'=>[25,26,27,28,29,30,31,32]],
        -
103 => ['login'=>'Безмолвный Дуэлянт','sex'=>0,'r'=>0,'scale'=>1.04,'rating'=>13,'items'=>[9,26,11,28,13,30,15,32]],
        -
104 => ['login'=>'Клинок Бездны','sex'=>1,'r'=>1,'scale'=>1.12,'rating'=>20,'items'=>[25,10,27,12,29,14,31,16]],
        -
105 => ['login'=>'Ветеран Колизея','sex'=>0,'r'=>0,'scale'=>1.20,'rating'=>28,'items'=>[25,26,11,12,29,30,15,16]],
    ];
}

function 
duel_make_bot(array $user, ?int $forcedId=null): array {
    
$bots duel_bot_templates();
    
$ids array_keys($bots);
    
$id = ($forcedId !== null && isset($bots[$forcedId])) ? $forcedId $ids[array_rand($ids)];
    
$t $bots[$id];
    
$scale = (float)$t['scale'];
    
$level max(2, (int)$user['level'] + (int)round(($scale-1)*5));
    
$rating max(1, (int)round(max(5,(int)$user['duel_rating']) * $scale) + (int)$t['rating']);
    
$baseStr=max(20,(int)$user['str']); $baseVit=max(20,(int)$user['vit']);
    
$baseAgi=max(15,(int)$user['agi']); $baseDef=max(15,(int)$user['def']);
    
$bot = [
        
'_is_bot'=>1,'id'=>$id,'login'=>$t['login'],'sex'=>(int)$t['sex'],'r'=>(int)$t['r'],
        
'level'=>$level,'duel_rating'=>$rating,
        
'str'=>max(10,(int)round($baseStr*$scale)),
        
'vit'=>max(10,(int)round($baseVit*$scale)),
        
'agi'=>max(10,(int)round($baseAgi*(0.92+$scale/10))),
        
'def'=>max(10,(int)round($baseDef*$scale)),
        
'w_1'=>0,'w_2'=>0,'w_3'=>0,'w_4'=>0,'w_5'=>0,'w_6'=>0,'w_7'=>0,'w_8'=>0,
        
'_items'=>$t['items'],
    ];
    return 
$bot;
}

function 
duel_load_opponent(int $storedId, array $user): array {
    if (
$storedId 0) return duel_make_bot($user$storedId);
    if (
$storedId 0) {
        
$row db_fetch_array(db_query('SELECT * FROM `users` WHERE `id` = "'.(int)$storedId.'" LIMIT 1'));
        if (
$row && (int)$row['id'] !== (int)$user['id']) return $row;
    }
    return 
duel_select_opponent($user);
}

function 
duel_select_opponent(array $userint $avoid=0): array {
    
$uid=(int)$user['id']; $rating=max(0,(int)$user['duel_rating']);
    
$min=(int)floor($rating/2); $max=max($rating,5);
    
$avoidSql=$avoid>0?' AND `id`!='.$avoid:'';
    
// Без ORDER BY RAND(): выбираем из небольшого подходящего пула.
    
$q=db_query('SELECT * FROM `users` WHERE `id`!='.$uid.$avoidSql.' AND `save`=1 AND `duel_rating` BETWEEN '.$min.' AND '.$max.' ORDER BY `online` DESC, `id` DESC LIMIT 12');
    
$pool=[]; while($r=db_fetch_array($q)){ if($r$pool[]=$r; }
    if(
$pool) return $pool[array_rand($pool)];
    
$q=db_query('SELECT * FROM `users` WHERE `id`!='.$uid.$avoidSql.' AND `save`=1 ORDER BY ABS(`duel_rating`-'.$rating.') ASC, `id` DESC LIMIT 12');
    
$pool=[]; while($r=db_fetch_array($q)){ if($r$pool[]=$r; }
    if(
$pool) return $pool[array_rand($pool)];
    return 
duel_make_bot($user);
}

function 
duel_store_opponent(int $userId, array $opponent): void {
    
db_query('UPDATE `duel` SET `opponent`="'.(int)$opponent['id'].'" WHERE `user`="'.(int)$userId.'"');
}

function 
duel_opponent_item_ids(array $opponent): array {
    if (!empty(
$opponent['_is_bot'])) return array_pad(array_slice(array_map('intval',$opponent['_items'] ?? []),0,8),8,0);
    
$ids=[];
    for(
$slot=1;$slot<=8;$slot++){
        
$invId=(int)($opponent['w_'.$slot] ?? 0); $item=0;
        if(
$invId>0){ $row=db_fetch_array(db_query('SELECT `item` FROM `inv` WHERE `user`="'.(int)$opponent['id'].'" AND `id`="'.$invId.'" LIMIT 1')); if($row$item=(int)$row['item']; }
        
$ids[]=$item;
    }
    return 
$ids;
}
Онлайн: 3
Реклама