Добавлен , опубликован

Процесс разработки

Содержание:
Как я уже писал в своём блоге, я занялся созданием довольно сложной карты, призванной стать осуществлением моей давней задумки - полноценной нелинейной РПГ в варкрафте.

В далёком 2010 году я уже предпринял подобную попытку, результатом которой стала карта One Life To Revivall, или, сокращённо, OLTR. Но из-за недостатка знаний, опыта, терпения и мотивации я забил на неё в тот самый момент, когда она была сделана намного больше, чем на половину. Сейчас я могу написать весь код, который там есть, за пару-тройку дней, а не за два месяца, причём намного аккуратнее, оптимальнее и даже красивее, но - поезд ушёл, да и концепция на мой взгляд оставляла желать лучшего, ведь весь упор я хотел сделать на геймплее, который был максимально приближен к стандартному, а сюжет был только "для галочки".
Нынче ситуация обратная: у меня есть неплохая идея, хороший сюжет, силы, время и, что самое главное, мотивация. Но давайте лучше перейдём к самой разработке.
Если вы играли в Fallout, то наверняка помните, что слева внизу был эдакий экранчик, который отражал все события, происходящие в игре, так сказать, вёл журнал событий, или, если коротко - писал логи. Не знаю, как он называется на самом деле, но я его знал как logbox.
И, поскольку любая другая система плоды своей деятельности должна была показывать в этом самом логбоксе, я и решил написать его в первую очередь. Сказано - сделано, создаём мультиборд и пишем функцию, которая в этот мультиборд пишет строки, сдвигая текущие вверх, результат на скрине справа (там, правда, ещё видно диалог, но это совсем другая песня и к сегодняшней теме она не относится, равно как и сам текст в этом логбоксе).

Библиотека со всем этим делом выглядит вот так
lib Logs init Init uses MBItems
{
    multiboard MB_Logs
    
    private string array    LogString
    private int             Rows        = 4

    private void add_row_assistant(string row)
    {
        int i = Rows
        loop
        {
            LogString[i] = LogString[i-1]
            i--
            exit i == 0
        }
        LogString[0] = row
        loop
        {
            MBST(MB_Logs, 0, i, LogString[Rows-i])
            exit i == Rows
            i++
        }
    }
    
    void AddLog(string what)
    {
        add_row_assistant(what)
    }

    void LogsMBInit()
    {
        TriggerSleepAction(.01)
        MB_Logs = CreateMultiboard()
        MultiboardSetColumnCount(MB_Logs, 1)
        MultiboardSetRowCount   (MB_Logs, Rows+1)
        int i = 0
        loop
        {
            MBSS(MB_Logs, 0, i, true, false)
            exit i == Rows
            i++
        }
        MultiboardSetItemsWidth (MB_Logs, .3)
        MultiboardSetTitleText  (MB_Logs, "Actions Log")
        MultiboardDisplay       (MB_Logs, false)
    }

    private void Init()
    {
        LogsMBInit()
    }
}
MBSS = MultiboardSetStyle
MBST = MultiboardSetText
Обе функции вычленены из BJ, но используют один глобальный multiboarditem, в результате чего пропадают все утечки, связанные с мультибордом. Обе лежат в библиотеке MBItems.
А, и exit = exitwhen, это дефайн, как можно догадаться.

На самом деле всё очень просто и понятно - сначала мы проходимся по строкам сверху вниз, смещая значения на 1 вверх, потом присваиваем первой строке новое значение, а потом отображаем это в мультиборде. Плюс имеем возможность в любой момент изменить количество строк в окошке, даже во время игры. Достаточно просто изменить значение переменной Rows и вызвать функцию LogsMBInit(), после чего добавить одно строчку через AddLog().

Ну, по сути, это всё на сегодня, вы можете оставлять комменты класса "код — говно, идея — шлак", но их я буду игнорировать или даже удалять, а можете предложить что-нибудь вроде "у тебя в функции х не очень удачно написано у, лучше делай так: z", к таким комментам я буду прислушиваться и обсуждать. Ну и конечно же вы можете предложить свою помощь в разработке.

`
ОЖИДАНИЕ РЕКЛАМЫ...