Файл: 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 $user, int $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;
}