示例#1
0
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;
    }
}
示例#2
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;
    }
}