Вход
Приветствую Вас Гость
 

MAGICON.FB

История разработки движка

24.09.2013(1.0.8)

Возможно ранее исправлялась, но теперь вновь исправлена функция get.word.inPos. Для понимания ошибки следует знать, что функция выбирала из строки вида jjjj|hhhh|jjjk|....|ldldld слово стоящее в указанной позиции. Позиции разграничиваются вертикальной чертой. Таким образом если указано

 $func('get.word.inPos','first|second|third',1)
 

будет выбрано слово 'first'. Если указана вторая позиция — слово 'second' и так далее. Чтобы предупредить ошибки связанные с неправильным указанием позиции (больше, чем есть на самом деле) был введён простенький алгоритм, возвращающий последнее значение. Так, если отдать команду

 $func('get.word.inPos','first|second|third',4)
 

будет возвращено слово 'third'. Однако, если мы отдаём такую команду:

 $func('get.word.inPos','first|second|third|',4)
 

должна возвращаться пустая строка. Т.е. слово без значения. Ошибка заключалась в том, что и в этом случае возвращалось слово «third». Однако добавив всего одно действие, подставляющее в конец исходной строки вертикальную черту, мы получили возможность не только исправить ошибку, но и упростить на две лишние строки алгоритм функции. Т.о. были исправлены две ошибки, функциональность подпрограммы расширилась и, помимо всего прочего, она стала проще. Вслед за этим, а точнее в первую очередь, была исправлена функция get.word.end, которая выбирает один из трёх вариантов строки вида f|s|t в зависимости от передаваемого на неё числа. Алгоритм функции так же был упрощён и переписан более наглядно, введён индикатор ошибок.

Доработаны локации hero.health и hero.mana, создана локация hero.luck. Учтены различные ньюансы изменения состояний свойств «здоровье», «мана» и «удача». Прикинут концепт очков дополнительного урона в зависимости от силы:

 +URON = (POWER.MAX  POWER.ALL) * 10
 

Расшифровывается это так: добавочный урон равен удесятерённой свободной силе. На самом деле для игрока это правило действует наоборот. Добавочный урон равен свободной силе поделённой на десять. Поскольку для игрока значения урона выводятся в единицах, а программа считает с точностью до сотых, фактически каждая единица свободной силы даёт +0.1 урона. Таким образом при свободной силе в 300 очков приходится +30 ед урона. Свободная сила — это часть силы, не расходуемой на ношение груза. Отношение свободной силы к общей силе будет так же влиять и на скорость передвижения игрока и на потребляемые усилия.

Добавлены тексты в базу base.word.screen.

27.09.2013(1.0.9)

Скорректирована программа суммирования временных промежутков summ.time. Теперь она отвязана от календаря int.time.calendar. Календарь вычисляет дату сам, исходя из текущих значений разрядов времени. Добита программа, запускающая скрипты воздействий int.influence.scripts, написан скрипт регенерации, успешно опробован. Написана подпрограмма conv.time, конвертирующая время в указанную величину. Может конвертировать в любую величину, как в большую так и в меньшую сторону, учитывая високосные годы. Подправлена база основных описаний. Придумана концепция прокачки здоровья, позволяющая помимо основного здоровья прокачивать регенерацию (увеличивать скорость регенерации [сокращать время регенерации от 1 часа скажем до десяти минут] и силу регенерации [+1 в час +2 в час и т.д.]).

01.10.2013(1.0.10)

Введены переменные $time['last.all'] и $time['new.all'], где хранятся значения предыдущего момента времени и текущего в виде набора тегов. Было сделано для того, чтобы не вычислять всякий раз из показателей time['hours'], time['last.hours'] и т. д. Однако не пригодились пока.

В связи с новым концептом увеличения не только силы восстановления, но и скорости, переписан интерпретатор свойств героя int.hero.property. Теперь он корректно отображает записи типа «(+1 ед. в 1 час 23 минуты)».

Скрипт обработки воздействий на героя (от свойств героя) вынесен в отдельную локацию hero.vosst.time, поскольку во всех четырёх случаях он был идентичен. В самом теле воздействия осталось только обращение к этой локации с передачей аргументов.

Исправлены мелкие недочёты скриптов и выводимых надписей.

07.10.2013(1.0.11)

Собран механизм, помещающий патроны в ружья. Реализован на локации menu.obj.inCharge с участием локации redo.obj.inCharge. Механизм получился очень гибким и удобным в игровом плане, однако потребовалось пересмотреть работу локации поиска подобных предметов get.similar.obj. Теперь при поиске подобных объектов учитывается наличие дочерних объектов (присутствие оных не позволяет считать объект подобным). Теоретически эту подпрограмму можно перестроить так, чтобы сравнение велось по полным веткам. Т.е. находить абсолютно идентичные объекты с абсолютно идентичными вложениями дочерних объектов, однако пока это не нужно, и смысла в усложнении локации я не вижу. Для улучшения локации специально прорабатывалась новая функция библиотеки easy.math.qsp,предназначенная для сравнения массивов. Однако она так и не была использована.

08.10.2013(1.1.0)

Слегка подправлены базы base.img и base.help.

Возникла интересная идея, выполнять дополнительный код при простом щелчке на предмете, чтобы генерировать пункты меню, которых в стандартном плане нет. Однако целесообразность такого подхода пока под cомнением. С другой стороны это позволило бы ввести проверку на соответствие условий и добавлять пункт меню только тогда, когда все условия совпадают. Пункты меню в этом случае будут обращаться к одной единственной специальной локации, которая вновь будет выполнять динамический код предмета (это может быть та же самая локация run.dynamic.script). Для примера, как работает это механизм:

  1. На локации onObjSel проверяется содержимое $run_array на наличие метки «![:new.menu:]». Если метка присутствует, происходит обращение к локации run.dynamic.script, с управляющим словом «new.menu». В качестве аргументов передаётся ай-ди предмета, как обычно.
  2. run.dynamic.script выполняет код из $run_array, где проводятся нужные проверки на условия, и если условия соответствуют добавляется пункт меню, обработчиком которого вновь является команда run.dynamic.script. Так же создаются временные значения, вносящиеся в массив $OOS[] OOS[].
  3. Если пункт меню был добавлен и выбран, происходит обращение к run.dynamic.script, где аргументам присваиваются значения из массива $OOS[] OOS[]. run.dynamic.script вновь обращается к $run_array, передавая необходимые аргументы. Таким образом локация, создающая дополнительный пункт меню, и локация его выполняющая, - на самом деле не существует, однако это одна и та же локация и она выполняет свою работу. А я думал, зачем использовать лишний переход типа run.dynamic.script, ведь код $run_array мог выполняться на любой технической локации, но чутьё сыграло мне на руку. Каким-то чудом я предвидел подобную возможность.
  4. $run_array выполняется, выполнение пункта меню завершается, на локации onObjSel удаляется массив $OOS[] OOS.

Разработка этого концепта пока откладывается. Необходимо добить заряд/разряд огнестрельного оружия, луков, арбалетов, посохов.

Так же возникла идея отказаться от использования меню, полностью переведя движок на гиперссылки. Это потребует существенной переработки интерфейса. Так же придётся конкретно подумать о совместимости игр, чтобы старые были полностью совместимы с новыми, что означает, что нельзя будет избавиться от некоторых локаций движка.

Если меню уберётся возникнет необходимость в пиктографии, чтобы уменьшить объёмы текста на экране. Однако невозможно отказаться от панели инвентаря, поскольку она всегда должна быть перед глазами, всегда должны быть легко доступна и иметь возможность прокрутки. Однако. При портировании игр на другие платформы отказ от контекстных меню неизбежен, отказ от нескольких открытых окон — тоже, что возвращает нас к необходимости глубоко продумать интерфейс. Полностью перевести его на html. На заметку: построение громоздких html страниц жрёт много ресурсов даже на сильных компах. Вывод тут только один: минимизировать html-код, но перевести игры полностью на него с появлением Quest Navigator.

Выяснилось, что ключевое слово, как таковое используется редко, поэтому, вычислять его нужно лишь на той локации, где оно действительно необходимо. Следует пересмотреть конструкции всех локаций вычисляющих ключевое слово.

08.10.2013 (1.1.1)

Закончена работа над механизмом зарядки-разрядки огнестрельного оружия. Механизм проверен, недостатки пока не вскрылись.

Исправлен недочёт в работе take.obj – меновые предметы не могут автоматически помещаться на тело!

01.12.2013(1.2.0)

Выявлена ошибка в работе механизма разрядки оружия не позволявшая заряжать оружие по-новой. Устранена. Исправлено некорректное поведение replace.obj, не передававшей правильный ай-ди.

02.12.2013(1.2.1)

Выявлена ошибка связанная с недоработкой плеера версии 5.7.0. $result – общий массив для всех локаций, из-за чего результат, записанный в него может теряться, и воспроизводится не необходимое значение, а иное. Изначально предполагалось, что расширение массива за счёт индексации $result поможет решить проблему, однако поскольку в результат функции передаётся всегда значение $result[0], это значение может быть затёрто при обращении к вложенным функциям. Следовательно, было необходимо перестроить функции так, чтобы результат записывался в $result только в конце выполнения функции. Таким образом были вновь переправлены все подпрограммы движка и баз данных.

05.12.2013(1.2.2)

C подачи Taunco добавил в движок функцию отрисовки шкалы. Типа здоровье, мана, выносливость. Отрисовывает шкалу с использованием рисунков из базы рисунков base.img, что позволяет проверять наличие требуемого рисунка ещё до отрисовки. Если рисунок отсутствует, или передаётся цвет символов заполнения, шкала отрисовывается в виде символов в моноширинном шрифте.

В связи с появлением новой функции был сделан набросок опции интерфейса «отрисовка статов героя». Статы отрисовываются в виде шкал четырёх цветов.

Пересмотрена концепция генерируемых гиперссылок для объектов. Теперь объекты создаются и привязываются к ссылке во время спавна. И не удаляются. Это будет загромождать таблицу данных объектами, которые возможно никогда не будут использоваться, однако это позволит создавать несколько объектов на одну ссылку. Немного доработана локация int.link. Не закончена. Подправлен функционал локации del.obj. Теперь можно удалять только дочерние объекты, не затрагивая родительский объект.

06.12.2013(1.2.3)

В базу base.new.obj добавлен пустой объект для формирования абсолютно новых объектов. Так, если необходимо создать абсолютно новый объект используя базу, можно воспользоваться этим пустым объектом.

Вновь пересмотрена концепция объектов в ссылках. Подробнее описано в спецификации link.obj.txt

charge_array[] - для ссылок: сколько раз спавнилась

kolvo_array[] - метка. Если 0 — производим спавн, если 1 не производим спавн. Если 2 — предметов больше нет.

Выявлена и исправлена ошибка в проверке на перемещение объекта prv.obj.id. Ошибка состояла в том, что не учитывался полностью перемещённый объект, который перемещался в уже существующий, а из прежнего места удалялся.

07.12.2013(1.2.4)

Исправлена ошибка, приводившая к неверному выводу списка объектов в кошельке. Переработан респавн наличного капитала для торговцев. Дописан вывод стоимости предмета в зависимости от ситуации. Так стоимость теперь выводится с учётом того, находится ли герой на локации торговли или нет. Так же учитывается, продаёт герой или покупает.

11.12.2013(1.2.5)

Системная переменная $GAME_INTERFACE['obj.image.stat'] имеет два значения «show» - показывать изображения предмета в описании, и «hide» - не показывать изображения предмета в описании. Если не указывать эту переменную, то по умолчанию изображения показываются.

12.12.2013(1.2.6)

Пересмотрена форма записи освещённости локации, теперь она указывается в теге [place::place].

Разработка концепции магической энергии принадлежащей текущему месту потребовала как-то запоминать текущее время на локации. Вводить новый столбец не хотелось, поэтому будет использоваться $kolvo_array[]. Для локаций в $kolvo_array[] записывается последний момент посещения. Это позволяет высчитывать из периода респавна разные плюшки.

Сегодня были собраны две локации устанавливающие значение магической энергии на локации, завтра приступим к работе с заклинаниями.

13.12.2013 (1.2.7)

Разработка концепции магической энергии привела к конструированию локаций работы с магической энергией. Это были локации magic.megenergy.set magic.megenergy.spwn magic.megenergy.spell. Поскольку на локациях повторялся практически один и тот же код с разницей в вычислениях, было решено оставить только одну общую локацию, выполняющую все четыре функции. Выставление магических энергий локации (set), регенерация магических энергий локации (respawn), проверка соответствия магических энергий локации требованиям заклинания (prove), расход магических энергий локации заклинанием (spell).

Создана локация magic.add.spell, добавляющая заклятие в указанную книгу магии.

Доведён до ума механизм чтения заклинаний. На примере заклинания Перст Гемеры механизм обкатан. Теперь это полноценная конструкция, способная обрабатывать заклинания вида, как расходующие ману, так и расходующие магическую энергию местности.

18.12.2013 (1.2.8)

Добавлена новая команда для отладчика «goto», которая позволяет осуществлять переход на указанную локацию. Если локация указана неверно, отладчик выдаёт соответствующее сообщение. Название локации указывается без кавычек.

Сконструирована заготовка скрипта боевых заклинаний. Пока она оторвана от системы боя и ничего не может. Единственное, проверена работоспособность заклинаний с маной.

Изменены порядки переходов. Теперь, если GAME_VALUE['goto'] = 0, не сбрасываются различные счётчики локации. Вместо определения по $time['goto'].

Исправлены мелкие недочёты на локации remastering.obj. В частности убраны некоторые неиспользуемые теги и заменены на используемые.

Создана функция get.loc.id, которая получает айди места, в независимости от того, находится герой на локации места или «в сундуке».

27.12.2013 (1.2.9)

Введена локация сравнения списков типов prv.onTarget. Списки имеют вид:

[оружие] [двуручное] [меч]

Локация имеет два режима. one – результат верен, если хотя бы одно совпадение типов верно. all – результат верен, если все типы совпадают.

Поправлены некоторые функции. Добавлена возможность сбрасывать на локации предметы лишь определенных типов.

28.12.2013 (1.2.10)

Добавлена новая чит-команда. main html – выводит текст из окна основного описания так, как бы он выглядел при usehtml = 0.

15.04.2014 (1.3.0)

Изменён концепт локаций специальных возможностей. Теперь специальные возможности будут указываться в теге [spec: :spec]. Например для локации крафтинга [spec:[smithing]:spec]. Это позволит избежать размножения обязательных локаций. Немного нагрузит локацию [chest], но не сильно. В связи с необходимостью хорошенько переработать код, версия движка изменена на 1.3.0. Резервные копии сделаны.

Введён генератор заголовков локаций для локаций-хранилищ. Добавлена надстройка для процедуры menu.obj.putmenu.obj.put.onAltar, фиксирующая ай-ди объекта, который нужно подзарядить. Осталось дело за малым: написать первый алтарь и процедуру подзарядки от принесённых в жертву вещей.

Задумано полномасштабное изменение записи ссылок в динамическом тексте. Сейчас они слишком сложны.

17.04.2014(1.3.1)

Изменён синтаксис динамических записей в тексте.

Теперь теги <DIN#: :#DIN> - используются только для выделения динамических конструкций с кодом внутри. Поддерживаются любые уровни вложенности. Единственное: требуется верно соблюдать нумерацию - открывающий и закрывающий тег должны иметь одинаковый номер. Номера тегов в одном куске текста не должны повторяться, но могут быть любыми. Следить за порядком номеров нет необходимости. Раньше требовалось соблюдать порядок нумерации. К сожалению не удалось добиться от регэкспа распознавания нежелательных слов в строках, а так и нумерация этих тегов оказалась бы лишней.

(/) - по прежнему распознаётся, как пол, вложенность идентичных конструкций не поддерживается. Прочие конструкции:

[th]утро|день|вечер|ночь[/th] — как видно, теперь теги заключены в угловые скобки с обеих сторон. Вложенность тегов подобного рода не ограничена. Однако нельзя использовать внутри этих текстов угловые скобки, поскольку конструкция может быть неверно распознана. Если есть необходимость вывести угловые скобки на экран (поместив внутри тегов), используйте мнемоники &#91; и &#93;

Наборы тегов будут пополняться.

18.04.2014(1.3.2)

Пересмотрена концепция составления идентификаторов гиперссылок. Теперь они вводятся в текст с помощью простых тегов. Так же пересмотрена концепция ай-ди локаций и хранилищ. Теперь ай-ди может не включать конструкцию вида [б:00]_, а может содержать одно из ключевых слов. Для локации места place; место; и т. д. Смотри документацию по идентификаторам. Это позволит упростить написание кода и исключит вложения угловых скобок в неподходящих местах.

22.04.2014(1.3.3)

Переработан и упрощён интерпретатор общего интерфейса. Изменены режимы. Подробнее о них будет составлена соответствующая спецификация. Доработана функция алтаря «принести в жертву». Осталось доработать функции «зарядить предмет» и «прокачаться». Но функция прокачаться будет доступна ещё не скоро.

29.04.2014(1.3.3.1)

Слегка подправлена локация int.inventory.obj. Теперь всем предметам в игре можно задать один цвет.

22.05.2014(1.3.3.2)

Расширена база текстов b.w.s и база текстов-объектов base.new.bodypart в целях добавления строки дополнительного описания, поясняющей игроку, почему он не может использовать предмет. Скорректированы некоторые другие мелочи в визуализации.

23.05.2014(1.3.3.3)

Подправлен алтарь. Доработаны функции «зарядить предмет». Добавлено свойство божества в charge_array[], подсчитывающее баланс между добрыми делами и злодеяниями.

Подправлены сообщения между базой текстов «b.w.s» и базой текстов «game.help» - более удобная и простая поддержка помощи по интерфейсу. Введена база текстов движка «b.d.t» - перенесены тексты, отвечающие за пункты меню и некоторые другие. В будущем планируется вынести из движка вообще все тексты и цвета для того, чтобы обеспечивать более удобную перекройку интерфейса. Подправлены интерпретаторы дневников. Теперь из под настроек можно сменить представление дневника. Доработаны разные мелочи.

08.06.2014(1.3.3.4)

Скорректирована локация onNewLoc. Теперь можно писать динамическое описание в поле «Описание» в Qgen, что даст молодым авторам некую свободу. Программа сама будет очищать и перезаписывать экран.

21.10.2014(1.3.4.0)

Изменён порядок записи ссылки в тексте. Теперь текст ссылки вписывается следом за коротким словом, т. е. ссылка в тексте имеет вид:

[lnk]SHORT_WORD|Первый вариант|Последний вариант[/lnk]

Таким образом из тела ссылки исключаются теги [name: :name] [other: :other]. Соответственно поправлен код некоторых локаций.

Исправлена ошибка на локации int.diary, приводившая к неверному возвращению экрана игры по закрытии дневника после смены режимов отображения.

25.10.2014(1.3.4.1)

Переработаны и исправлены локации торговли. Теперь диалоги торговли и сундуков создаются в общей локации [chest]. Так же немного расширены функции локаций места. В идеале это позволит генерировать локации с вложенными локациями, и прочим, автоматически, т. е. делать стандартные локации и лабиринты. Исправлены мелкие ошибки.

26.10.2014(1.3.4.2)

Исправлены мелкие ошибки локации inputText.

27.10.2014(1.3.4.3)

Исправлена ошибка функции prv.obj.pay, приводившая к тому, что можно было продавать предмет без добавления денег в кошелёк.

Исправлены ошибки функции take.obj, приводившие к неверным обращениям. Исправлены мелкие ошибки. Добавлена функция logs error в inputText, которая выводит только логи ошибок.

Добавлена вспомогательная процедура “kill.var.olegus”, которая удаляет элемент массива по текстовому индексу. Может удалять до восьми элементов одновременно.

28.10.2014(1.3.4.4)

Исправлена структура надстроек алтаря. Теперь нет нужды добавлять новый признак [on Altar]. Структура скорректирована в соответствии с общей механикой движка.

Расширен функционал функции get.daughter.obj. Теперь можно задать дополнительный фильтр, проверяющий присутствует ли в $run_array[] строка соответствующая регулярному выражению.

Исправлен и расширен функционал inputText. Описание команд лежит в файле commandcom.txt.

01.11.2014(1.3.4.5)

Собраны механизмы вывода дополнительных текстов на локации:

  • $dvar[] - массив, куда помещаются строки текста, выводимого на локации до тех пор, пока герой не перейдёт на новую локацию. Строки можно добавлять (и соответственно выводить) только на втором обновлении описания локации. Т.е. если герой только перешёл на локацию с другой локации массив уничтожится и ни одна строка не будет выведена. Если же добавить строку в массив, когда герой находится на текущей локации, и вновь зайти на текущую, строка появится на экране.

  • $tvar['приветствие.'+$args['LID']] – переменная приветствия. Может использоваться для генерации фразы, которая должна быть получена лишь один раз, а потом постоянно выводиться. Не обрабатывается интерпретатором динамических текстов из под служебной локации onNewLoc, т. е. автору нужно самому озаботиться обработкой, если она нужна. Удаляется фраза приветствия предыдущей локации. Обязательно удаляется, но даже если не будет удалена, ничего страшного, поскольку фраза с предыдущей локации не будет выведена на текущей. Текст переменной приветствия будет выведен перед остальным описанием локации.

  • $lvar['локация.дополнительные тексты'] — переменная дополнительного текста, который будет выведен один раз в описании локации. Выводится до диалоговых реплик $dvar[], но после остального описания. Т.е. в конце описания как такового. Как и значение $lvar['локация.исходник'], удаляется после вывода описания локации на экран. Т.е. каждый раз нужно заново заполнять, если есть необходимость. Может служить для формирования дополнительных текстов например при переходах.

Пока это все способы дополнения текстов основного описания и мне кажется, что пока больше не нужно.

Исправлены мелкие ошибки на локации prv.obj.pay, добавлены тексты в базы текстов. Слегка изменено поведение реплик торговцев в соответствии с новыми возможностями вывода дополнений к тексту основного описания. База base.dialog.seller заменена базой b.d.s, которая соответствует новым спецификациям баз.

04.11.2014(1.3.4.6)

Собрана функция, выбирающая строки по разделителю «cut.str.inArray»

06.11.2014(1.3.4.7)

Функция cut.str.inArray вынесена в библиотеку easy.math.qsp, где называется #str.inArray#.

Немного подправлена структура локации int.loc.interface.

19.11.2014(1.3.4.8)

Изменена функция get.tag.num. Теперь из одиночных тегов можно извлекать не только непробельные значения. Подробнее см. документацию по вспомогательным функциям.

Разработана концепция диалогов для персонажей. Собран механизм разбора диалога на реплики и занесения их в микробазу.

20.11.2014(1.3.4.9)

Удалена переменная $floor и заменена на $GAME_VALUE['inventory.floor']. Слегка изменена функция int.inventory. Продолжаю работать над движком диалогов. Пока продвинулся недалеко. По большей части дорабатывал концепцию.

Изменена функция get.tag.cont. Сделана чуть проще, и расширена возможностью получать содержимое html-тегов. Вложение однотипных html-тегов при этом не поддерживается.

Наверх