Выбор случайного конфига для карты

Тема в разделе "Программирование / Скриптинг", создана пользователем pokypka20, 18 авг 2014.

  1. pokypka20

    pokypka20

    Сообщения:
    250
    Симпатии:
    30
    Есть конфиг в котором названия sky_name, можно ли сделать так чтобы каждая текстурка при смене карты случайным образом устанавливалась.
    Тоесть конфиг sky_name.txt
    sky_day1
    sky_day2
    и т.д

    При смене карты выбирается один вариант и включается, как такое можно реализовать?
     
  2. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.975
    Симпатии:
    2.982
    pokypka20, рандом. Давали уже много примеров и еще я где-то тут реализацию похожего писал. Пора бы уже самому что-то ковырять.

    И да, харе создавать новые темы, задавай все вопросы в одной теме.
     
  3. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.515
    Симпатии:
    1.969
    Верно. Пишешь файл, в каждой новой строке - новый путь (текстура). Далее используешь рандом от 1 до числа последней строки. Через while считываешь строки, нужная строка (рандома) - и есть твоя текстура.
     
  4. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.515
    Симпатии:
    1.969
    Нет. Так где-то лишь наполовину (относительно) крутишь цикл и записываешь лишь нужную строку. Единственное - надо знать максимум строк.
     
  5. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.515
    Симпатии:
    1.969
    PHP:
    public OnMapStart()
    {
        new 
    Handle:file OpenFile("cfg/sky_name.txt""r");
        if (
    file == INVALID_HANDLESetFailState("Не удалось открыть cfg/sky_name.txt!");
        else
        {
            new 
    random GetRandomInt(15);
            
    decl String:path[200];
            while (
    random && !IsEndOfFile(file) && ReadFileLine(filepathsizeof(path))) random--;
        }
        
    CloseHandle(file);
    }
    Сильно сложно? :)
    Даже !IsEndOfFile(file) не обязателен - это так, на всякий случай вписал, если ТС что "попортит". :acute:
    if (file == INVALID_HANDLE) SetFailState("Не удалось открыть cfg/sky_name.txt!"); тоже можно убирать, но не желательно, особенно саму проверку.
    А у твоего варианта, я так понял, все строки хранятся в SM и цикл всегда 100%.
     
  6. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.975
    Симпатии:
    2.982
    AlmazON, из-за человеческой глупости предпочитаю безопасный код, а то скажешь что надо вписать кол-во строк и начнется: - а как это? - а что это? - как? - а куда? - а можешь сделать? И в итоге все ровно напартачат, поэтому лучше предохраняться.


    Оффтоп
     
  7. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.515
    Симпатии:
    1.969
    Хорошо. Вот код, который минимально использует цикл и требует лишь 1 вместилище для 1 строки (вместо целого массива индексов):
    PHP:
    public OnMapStart()
    {
        new 
    Handle:file OpenFile("cfg/sky_name.txt""r");
        if (
    file == INVALID_HANDLESetFailState("Не удалось открыть cfg/sky_name.txt!");
        else
        {
            static 
    m;
            new 
    random GetRandomInt(0, (m:-m)), random;
            
    decl String:path[200];
            while (!
    IsEndOfFile(file) && ReadFileLine(filepathsizeof(path)) && --r){}
            if (
    rrandom-r;
        }
    CloseHandle(file);
    }
    Поскольку на месте максимума всё равно был бы квар/константа, то такой код почти также нагружает сервер, как и предыдущий, но умеет сам определять максимум строк в файле + может обновляться (пусть и не каждый раз).
    К тому же, по идее, в нём чаще будут читаться первая и последняя строчки, что в обычном рандоме получается реже.
     
    Последнее редактирование: 19 авг 2014
    pokypka20 нравится это.
  8. pokypka20

    pokypka20

    Сообщения:
    250
    Симпатии:
    30
    Спасибо, старался не вмешиваться в ваш разговор ждал релизного ответа :D
     
  9. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.515
    Симпатии:
    1.969
    Во-первых, я там {} забыл, так что сразу высчитает неверно + при обновлении списка, когда он уменьшается часто будет выбирать последнюю позицию. Это была скорее альфа-версия)
    Сейчас сделал релиз, смотри выше.
    Вообще, по сути, можно сделать команду обновления списка текстур, когда это необходимо.
     
    Последнее редактирование: 19 авг 2014