Добавлен Clamp,
опубликован
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.
MBST = MultiboardSetText
Обе функции вычленены из BJ, но используют один глобальный multiboarditem, в результате чего пропадают все утечки, связанные с мультибордом. Обе лежат в библиотеке MBItems.
А, и exit = exitwhen, это дефайн, как можно догадаться.
На самом деле всё очень просто и понятно - сначала мы проходимся по строкам сверху вниз, смещая значения на 1 вверх, потом присваиваем первой строке новое значение, а потом отображаем это в мультиборде. Плюс имеем возможность в любой момент изменить количество строк в окошке, даже во время игры. Достаточно просто изменить значение переменной Rows и вызвать функцию LogsMBInit(), после чего добавить одно строчку через AddLog().
Ну, по сути, это всё на сегодня, вы можете оставлять комменты класса "код — говно, идея — шлак", но их я буду игнорировать или даже удалять, а можете предложить что-нибудь вроде "у тебя в функции х не очень удачно написано у, лучше делай так: z", к таким комментам я буду прислушиваться и обсуждать. Ну и конечно же вы можете предложить свою помощь в разработке.
Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Он жи КРИТУЕТ, если при инициализации создавать
Или ты про ?)
Оно рвёт поток там, где он так и так сам обрывается же.
У меня кстати два мультиборда, так что я при запуске карты убиваю двух котят =(
Но ок, перепилю на таймер.
И еще, суть как в фалауте — если знаешь как, то пройдешь за полчаса, использовав знания, полученные во время предыдущих прохождений, но потеряешь много интересного. Многие вещи будут случайными, так или иначе
Выбирая разные сетапы при старте, будешь получать разные возможности для прохождения.
Ловкий, восприимчивый, удачливый, но слабый, хилый и не очень умный и харизматичный? Пожалуйста — вы идеальный вор, и опираясь на это, откроете для себя много нового в игре.