Plague: дневники разработки. День 1

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

Plague: дневник разработки.

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

В далёком 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", к таким комментам я буду прислушиваться и обсуждать. Ну и конечно же вы можете предложить свою помощь в разработке.

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
26
12 лет назад
0
Pague?
0
30
12 лет назад
0
Оп, спасибо, не заметил
3
29
12 лет назад
3
TriggerSleepAction(.01)
NNNNOOOOOOOOOOOOOOOOOOOOO
0
30
12 лет назад
0
Ну вот еще, пихать триггер просто чтобы инициализировать мультиборд.
Он жи КРИТУЕТ, если при инициализации создавать
Или ты про
0.01
?)
4
29
12 лет назад
4
КАЖДЫЙ РАЗ КОГДА ТЫ ИСПОЛЬЗУЕШЬ ЭТУ ФУНКЦИЮ, УМИРАЕТ КОТЕНОК
0
30
12 лет назад
0
Альтернатива для создания мультиборда? Таймер? Триггер?
Оно рвёт поток там, где он так и так сам обрывается же.
У меня кстати два мультиборда, так что я при запуске карты убиваю двух котят =(
Но ок, перепилю на таймер.
1
26
12 лет назад
1
А полная нелинейность, это куча продуманных разветвлений сюжета, или же генерация событий по формулам (все, что было сделано персонажем в предыдущих событиях, определяет параметры, по которым генерируются следующие события; правда, не представляю, как это в варике можно реализовать)?
0
30
12 лет назад
0
От действий игрока будет зависить многое, то есть, например, если он оказал эффект А, то случится одно, если оказал эффект Б, то другое, а если оказал оба эффекта, то будет третье, причем таких "эффектов" может быть довольно много. В идеале нужно будет писать только прямые зависимости, а наложения сами получаться будут.
И еще, суть как в фалауте — если знаешь как, то пройдешь за полчаса, использовав знания, полученные во время предыдущих прохождений, но потеряешь много интересного. Многие вещи будут случайными, так или иначе
Выбирая разные сетапы при старте, будешь получать разные возможности для прохождения.
Ловкий, восприимчивый, удачливый, но слабый, хилый и не очень умный и харизматичный? Пожалуйста — вы идеальный вор, и опираясь на это, откроете для себя много нового в игре.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.