function BotExec($name) { global $db_prefix, $BotID, $BotNow; $query = "SELECT * FROM " . $db_prefix . "botstrat WHERE name = '" . $name . "' LIMIT 1"; $result = dbquery($query); if ($result) { $row = dbarray($result); $strat = json_decode($row['source'], true); $strat_id = $row['id']; foreach ($strat['nodeDataArray'] as $i => $arr) { if ($arr['category'] === "Start") { AddBotQueue($BotID, $strat_id, $arr['key'], $BotNow, 0); return 1; } } return 0; } else { return 0; } }
function ExecuteBlock($queue, $block, $childs) { global $db_prefix, $BotID, $BotNow; $BotNow = $queue['end']; $BotID = $queue['owner_id']; $strat_id = $queue['sub_id']; # Debug ( "Bot trace : " . $block['category'] . "(".$block['key']."): " . $block['text'] ); switch ($block['category']) { case "Start": $block_id = $childs[0]['to']; AddBotQueue($BotID, $strat_id, $block_id, $BotNow, 0); RemoveQueue($queue['task_id']); break; case "End": RemoveQueue($queue['task_id']); // Просто удалить блок, тем самым в очереди не остается ни одного задания AI исполняемой стратегии break; case "Label": // Начать выполнение новой цепочки // Выбрать из всех потомков тот, который выходит снизу блока (fromPort="B") $block_id = $childs[0]['to']; foreach ($childs as $i => $child) { if ($child['fromPort'] === "B") { $block_id = $child['to']; break; } } AddBotQueue($BotID, $strat_id, $block_id, $BotNow, 0); RemoveQueue($queue['task_id']); break; case "Branch": // Переход на другую метку с указанным текстом. $query = "SELECT * FROM " . $db_prefix . "botstrat WHERE id = {$strat_id} LIMIT 1"; $result = dbquery($query); if ($result) { $row = dbarray($result); $strat = json_decode($row['source'], true); $done = false; foreach ($strat['nodeDataArray'] as $i => $arr) { if ($arr['text'] === $block['text'] && $arr['category'] === "Label") { AddBotQueue($BotID, $strat_id, $arr['key'], $BotNow, 0); $done = true; break; } } if (!$done) { Debug("Не удалось найти метку перехода \"" . $block['text'] . "\""); } } else { Debug("Не удалось загрузить текущую стратегию при обработке перехода."); } RemoveQueue($queue['task_id']); break; case "Cond": // Проверка условия $result = eval("return ( " . $block['text'] . " );"); $block_id = $block_no = 0xdeadbeef; $prefix = ""; foreach ($childs as $i => $child) { if (strtolower($child['text']) === "no") { if ($result == false) { # Debug ($block['text'] . " : ".$prefix."NO"); $block_id = $child['to']; break; } else { $block_no = $child['to']; } } if (strtolower($child['text']) === "yes" && $result == true) { # Debug ($block['text'] . " : YES"); $block_id = $child['to']; break; } if (preg_match('/([0-9]{1,2}|100)%/', $child['text'], $matches) && $result == true) { // случайный переход $prc = str_replace("%", "", $matches[0]); $roll = mt_rand(1, 100); if ($roll <= $prc) { # Debug ($block['text'] . " : PROBABLY($roll/$prc) YES"); $block_id = $child['to']; break; } else { if ($block_no == 0xdeadbeef) { $prefix = "PROBABLY({$roll}/{$prc}) "; $result = false; } else { # Debug ($block['text'] . " : PROBABLY($roll/$prc) NO"); $block_id = $block_no; break; } } } // случайный переход } if ($block_id != 0xdeadbeef) { AddBotQueue($BotID, $strat_id, $block_id, $BotNow, 0); } else { Debug("Не удалось выбрать условный переход."); } RemoveQueue($queue['task_id']); break; default: // Обычный блок (квадрат), выход один. $sleep = eval($block['text'] . ";"); if ($sleep == NULL) { $sleep = 0; } $block_id = $childs[0]['to']; AddBotQueue($BotID, $strat_id, $block_id, $BotNow, $sleep); RemoveQueue($queue['task_id']); break; } }