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

MAGICON.FB

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

25.09.2012 (0.3)

К настоящему времени разработана база объектов класса «предмет» <obj> для игры «Магикон». База может использоваться и для других игр. Полностью сформированы все наборы доспехов из некомпозитных материалов, наборы литого оружия, четыре вида арбалетов, болты, стрелы и другие предметы разных типов. Описания к некоторым из предметов отсутствуют. Так же в базах отсутствуют наборы необходимых для изготовления предметов материалов.

Разработаны базы объектов класса «свойство» <property> и класса «часть тела» <body> для игры «Магикон». Базы могут использоваться и для других игр.

Разработана база текстов для вывода информации по уронам-защитам.

Собран интерпретатор onObjSel, в функцию которого входит выполнение типовых действий для того или иного объекта. В настоящее время для onObjSel поддерживается работа всех основных классов сверхкласса oneself.

В интерпретаторе onNewLoc собрана возможность интерпретации динамических текстов локаций.

Интерпретатор inputText способен выполнить любую строку кода, введённую в поле ввода (команда run [$Выражение]). Так же он оснащён функциями arr [$Имя_Массива] – выводит содержимое массива, all objects – выводит все созданные в игре предметы, obj [#Число] или obj [$ID предмета] — выводит содержимое предмета по его идентификатору или по номеру в базе.

Модуль setScreen позволяет выбирать три режима настройки интерфейса.

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

Интерпретатор Заголовков int.loc.head – воспроизводит объекты класса «заголовок» <заголовок>, работает из под управления onNewLoc.

int.loc.body – интерпретатор описаний локации. Интерпретирует динамические тексты в описании локации. Для этого используется текст, помещённый в переменную $lvar['локация.исходник']. Работает из под управления onNewLoc. Использует интерпретатор динамической строки int.DIN.

int.time.hours – функция возвращает одно из четырёх значений выражения, в зависимости от часа.

int.time.years – функция возвращает одно из четырёх значений выражения, в зависимости от месяца.

int.time.month – функция возвращает одно из двенадцати значений выражения, в зависимости от месяца.

int.time.days – функция возвращает одно из семи значений выражения, в зависимости от дня недели.

int.link — функция интерпретирует объект класса «ссылка» <link>.

int.link.obj – в настоящее время не работает. Планируется поддержка ссылок, позволяющая поднимать «предмет» с локации, респаунинг ссылок.

int.act.goto – интерпретатор обусловленных переходов. В настоящее время поддерживает любой обусловленный переход, воссозданный на локации. Все обусловленные переходы являются составной частью иных объектов, либо являются самостоятельными объектами класса «переход» <goto>. Тег класса в случае объекта класса переход указывается, как <goto: :goto>, этот же тег является телом объекта. Так же поддерживаются все переходы при использовании камней телепортации.

int.inventory – интерпретатор инвентаря. Воссоздаёт предметы в окне инвентаря. В данном случае, предметы — это не класс объектов, а термин из описания QSP. Грубо говоря - строки в окне «Предметы» («Инвентарь»). Использует интерпретатор объекта int.inventory.obj, который воссоздаёт строку из данных из тела объекта ($object_array[]).

int.obj.property – воссоздаёт текст описания объекта, используя тело объекта ($object_array[]). В настоящее время поддерживает все объекты класса «предмет». В будущем планируется ввести поддержку разных валют в игре (т. е. один товар можно покупать за одни деньги, другой за другие, или в одной стране за одни, в другой за другие), соответственно придётся несколько изменить и интерпретатор.

int.hero.property – воссоздаёт текст описания «свойства», используя тело свойства. В настоящее время поддерживает несколько видов «свойств»: текстовое, свойство накопления, свойство с максимальным значением, натуральное свойство.

gen.ahref.actObj – генератор ссылок на одевание «предмета».

add.new.obj - добавляет в игру новый объект.

del.obj – удаляет объект из игры по ай-дишнику и все дочерние объекты, очищает родительские объекты от удаляемого. Использует функции del.obj.id, get.daughter.obj, clr.parent.obj.

get.obj.id – получает предмет из ай-ди.

get.id.obj – получает ай-ди первого предмета в базе, тело которого содержит строку, соответствующую регулярному выражению.

get.similar.obj – получает ай-диобъекта идентичного искомому.

grv.str.inObj – функция проверяет, содержит ли тело объекта текст, соответствующий регулярному выражению.

redo.obj.inCharge – изменяет положение предметов в базе, в зависимости от содержимого их зарядов.

new.id.obj – генератор ай-дишников для объектов. Вполне возможно, что в этой функции нет нужды.

del.str.inObj.id — удаляет из тела объекта указанный текст.

prv.pos.inObj– проверяет есть ли на теле свободное место для предмета.

use.obj.actObj – ещё не создано. Будет надевать предмет на тело, если есть такая возможность.

menu.in.body– ещё не создано. Будет надевать предмет на тело, если есть такая возможность.

11.10.2012 (0.4)

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

Модифицирована локация int.DIN. Теперь вместо оператора dynamic на ней используется функция dyneval, что позволило избавиться от лишней переменной.

Слегка подкорректирован интерпретатор заголовков int.loc.head. Он научился выводить стандартную надпись не только для локаций места, но и для других локаций.

18.10.2012 (0.5)

Проработана структура локации [chest]. Удалось добиться возможности вложения одного сундука в другой. Для примера, в f.b_v0.2 была создана гардеробная комната с несколькими шкафами. В шкафах были созданы полки. Всё это обрабатывается локациями [chest] и onNewLoc.

Создан небольшой интерпретатор динамических названий сундуков int.chest.name. Выдаёт три результата: «Неизвестно» - если сундук ещё не осматривался, «Пусто» - если сундук осматривался и пуст, и «Есть вещи» - если сундук осматривался и в нём присутствуют объекты класса «предмет».

Введён новый тег [put.stop], позволяющий запрещать сброс предмета на определённых локациях. При наличии этого тега в заголовке, у предмета не выводится действие «выбросить» в контекстном меню.

Введён вывод количества сброшенных на локации предметов. Мелочь, а приятно.

Спроектировано несколько стандартных хранилищ для игры. Загромождение базы пока не влияет на игру. И это хорошо.

На локации onObjSel доработан вывод ссылок, позволяющих использовать предметы, подходящие для указанной позиции. Ссылки выводились некорректно, поскольку предметы изначально отсеивались по коротким именам позиций. Сейчас каждый предмет проверяется на возможность добавления, получает список позиций, в которые он может быть добавлен, и этот список потом сверяется с коротким именем «части тела». Если в списке присутствует короткое имя «части тела», ссылка на использование предмета выводится, в противном случае не выводится.

Слегка подкорректирована работа базы позиций get.obj.pos в зависимости от признака предмета. Теперь, если список позиций уже сформирован, он не переформируется по-новой.

Интерпретатор динамических текстов обучен распознавать конструкции вида (Мужеский пол/Женский пол). Встречая подобную конструкцию в исходном тексте описания локации интерпретатор выбирает между первым и вторым вариантом в зависимости от пола героя.

Добавлена возможность указывать точную позицию в базе объектов, в которую можно добавить объект. ВНИМАНИЕ!!! Текущий объект в этом случае затирается.

Исправлена ошибка, приводившая к блокированию ссылки на перемещение при просмотре камней телепортации без заряда.

Доработан интерпретатор inputText. Введены новые команды: all objects table — выводит все созданные в игре объекты в виде таблицы; и daughters [$Выражение] — в качестве выражения выступает ай-ди родительского объекта, при этом выводятся все его дочерние объекты первого уровня.

19.10.2012 (0.6)

Создан модификатор replace.obj, который перемещает часть объекта или весь объект в новую позицию.

Модификатор take.obj научен поднимать предметы «на тело».

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

Выявлена и устранена ошибка на локации onObjSel, из-за которой не выводился пункт «В инвентарь» контекстного меню, когда просматривались предметы, одетые на тело.

Расширены базы. В частности база base.new.obj расширена новой функцией, позволяющей получать склонения имен предметов. Правда это только стандартные имена. Возможно это расширение базы себя не оправдает, а будет проще ввести дополнительный тег склонения, в котором будут перечислены оставшиеся пять склонений. База base.new.bodypart расширена функцией, позволяющей получать сопроводительный текст при надевании предмета.

28.02.2013 (0.7)

Доведён до ума модификатор take.obj. Теперь появилась возможность поднимать предметы не только «на тело», но и в рюкзак. Попутно из него вынесены некоторые алгоритмы, которые будут задействованы в других модификаторах. Доработан интерпретатор гиперссылок на предметы — создана полностью готовая модель растений. Фактически — это гиперссылки, которые могут респавниться. Для добавления растения в игру, нужно просто ввести статический текст, и динамический текст, содержащий гиперссылку с предметом. Например:

 Посреди поляны стояла одинокая берёза. <DIN1:[link.1]:1DIN>
 

Естественно тело ссылки имеет вид:

 <link> [name:На берёзе созрело несколько яблок.<br>:name] <obj:[:яблоко:]:obj> [k:result=rand(2,5):k]
 

Таким образом на экран будет выводиться:

Посреди поляны стояла одинокая берёза. На берёзе созрело несколько яблок.

Как только герой срывает яблоки, ссылка исчезает с экрана. В данном случае респаунинг не предусмотрен, поэтому ссылка выводиться больше не будет. Если же респаунинг предусмотрен, алгоритм сам будет возвращать ссылку по прошествии определённого времени. Выявлена и устранена ошибка, препятствовавшая респаунингу ссылки (лишняя строка сравнения текущего времени и времени респаунинга).

Изменены некоторые цветовые ассоциации для действий и объектов. Упрощены.

Усовершенствован модификатор replace.obj. Теперь помещая объект в контейнер, он проверяет не присутствуют ли в контейнере идентичные объекты. Если идентичные объекты присутствуют, он просто соединяет их в один объект.

Улучшен генератор ссылок объектов для надевания.

Пункты меню, позволяющие премещать предметы внутри инвентаря, закончены.

2.03.2013 (0.8)

Сконструирован календарь, вынесен в отдельную локацию int.time.calendar. Отлично работает со стандартными параметрами. Должен так же отлично работать и с остальными.

take.obj научен поднимать неисчислимые предметы. Концепт неисчислимых предметов несколько изменён, как мне кажется, в лучшую сторону.

Выявлена и устранена ошибка в remastering.obj, приводившая к дублированию строки.

4.03.2013 (0.9)

Завершён обработчик, срабатывающий по нажатии пункта меню «Съесть», - menu.obj.eat. В связи с этим была введена функция minus.obj, уменьшающая количество предметов в ячейке, и полностью удаляющая объект, если количество становится равным нулю. Введена функция, которая воспроизводит сопроводительный текст для действий (print.word), что позволяет использовать одну переменную (массив), которая уничтожается, когда в ней нет необходимости.

Проработан алгоритм сброса предмета на локации (menu.obj.put). Устранена ошибка, приводившая к дублированию пунктов контекстного меню при выборе предмета в инвентаре.

10.05.2013 (0.10)

Исправлены ошибки в алгоритме сброса предметов menu.obj.put, приводившие к выводу лишнего предмета в списке. Полностью проработана и введена функция продажи, осталось ввести соответствующие игре подсчёты бонусов, но голая функция готова.

Подкорректирована работа подпрограммы inputText – теперь её можно использовать как функцию, вызывая непосредственно из кода игры. Соответственно подкорректирована функция inputText.obj.

Полностью собрана конструкция покупки на базе take.obj и prv.obj.pay. Выявлена ошибка при покупке множества предметов, когда не хватает денег.

13.05.2013 (0.11.1)

Оттачиваю необходимые фишки, такие, как «тёмная комната». Иными словами пытаюсь начать писать игру и подгоняю движок под её нужды. Решено было сделать освещение одним из свойств локации, а не «целью». Это позволит движку быстро и просто работать с различными видами освещения различных локаций автоматически. Т.е. Достаточно будет указать параметром вид освещения и движок автоматически воспроизведёт лишь доступные действия и описания. Вполне возможно, что не было нужды вводить тег освещение, достаточно было указывать освещение просто свойством локации. Например [black-light]. Возможно несколько позже я так и сделаю. Возможно тёмная комната — это тип местности, как например туман, и различаются они только схемой освещения, что в принципе некритично для текстовой игры. По сути что тёмная комната, что туман обладают одинаковыми свойствами для текстовой игры, значит они должны включаться одинаковыми параметрами, однако не стоит забывать, что такую вещь, как тьма можно рразогнать светом, а вот туман — нельзя.

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

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

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

14.06.2013(0.11.1)

Введён интерпретатор освещённости. int.lighting Вообще, сюда можно нагрузить интерпретацию разных состояний местности, но пока только освещённость. Интерпретатор работает следующим образом: при обращении к интерпретатору, интерпретатор обрабатывает заголовок текущей локации на наличие тега light. Если тег присутствует и содержит значение "тёмная комната", интерпретатор возвращает значение "темно". Если тег отсутствует, интерпретатор проверяет, имеется ли в заголовке признак [зависит от времени] и выставляет освещённость соответственно текущему времени суток.

Разработано первое заклинание "Перст Гемеры", которое позволяет на время осветить комнату. Движок сработан таким образом, что чтение заклинания освещает комнату лишь на время.

2.07.2013(0.11.2)

В связи с изменением библиотеки easy.math.qsp был изменён механизм работы чит-команды arr. Соответствующие поправки в движок внесены.

3.07.2013(0.11.2)

Изменена конструкция помощи. Теперь помощь выводится при обращении к функции [help], которая стала обязательной локацией, если планируется использовать помощь и подсказки.

Изменён принцип работы функции get.daughter.obj – теперь результаты поиска можно вносить в тот массив, который нужен Вам. Передаётся вторым аргументом. По умолчанию используется $array_id[], т.е. Можно не указывать, какой массив Вы хотите заполнить результатом, тогда будет заполнен $array_id[]. Не забывайте уничтожать массив после использования.

Добалена возможность создавать заблокированные предметы.

6.07.2013(0.11.3)

Сконструирован вид дневника, а так же введены новые интерпретаторы для обработки текстов дневника.

Исправлена критическая ошибка в подпрограмме get.daughter.obj, приводившая к неявному зацикливанию и полному зависанию игры при поиске в пустом массиве.

9.07.2013(0.11.3)

Доработана чит-команда «all objects table». Теперь при её запросе html-теги выводятся неизменными.

10.07.2013(0.11.3)

Известно, что обработка локации происходит уже после того, как мы её посетили. Т.е. Код на локации onNewLoc будет выполнен после кода на самой локации. Это не совсем удобно, поскольку некоторые скрипты необходимо выполнить уже после onNewLoc. Для таких скриптов введены сопровождающие локации. Их названия указываются в переменной $lvar['scripts'].

13.07.2013(0.11.4)

Введена функция, меняющая два объекта местами rtp.obj. Полезно для сортировки объектов.

14.07.2013(0.11.5)

Изменен порядок начисления времени. Теперь независимо от того, сколько времени тратится на переход, всё время в игре определяется набором переменных time, а не одной лишь переменной time['all']. Это позволяет увеличить время в мире. Если всё время игры хранить в одной переменной, максимальное время игры будет всего сорок лет.

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

[year:] - в каком году должен быть прореспавнен объект.

[day:] - в какой день года должен быть прореспавнен объект.

[hour:] - в какой час дня должен быть прореспавнен объект.

[minute:] - в какую минуту часа должен быть прореспавнен объект.

[secunde:] - в какую секунду минуты должен быть прореспавнен объект. Секунд в минуте 100!!!

14.07.2013(0.12.0)

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

15.07.2013(0.12.1)

Подкорректированна локация 'int.calendar' в соответствии с вновь созданной функцией сложения времени. Изменён концепт времени (смотри диздоки) и респавна. В связи с этим будут концептуально изменяться все механизмы, использующие механизм респавна и времени. Переходы, ссылки и прочие. Заодним будут изменены подходы к базам и локациям-функциям. Всё это в совокупности будет сопровождаться инструкицями, пояснениями и диздоками (это я их так называю, уж больно слово хорошее, на самом деле это не диздоки, а сопроводительные записки к механизмам). К чему я всё это говорю. Движок наконец-то будет переведён на новый уровень, а значит с этого момента, после создания резервных копий данная инструкция будет неактуальна. Добро пожаловать в MAGICON.FB v 1.0.

20.07.2013(1.0.0)

Категорический переход на новую версию движка и планомерная переработка функций. Наравне с изменением $respawn_array[], пришлось отказаться от передачи количества и заряда в тегах. В связи с этим подправлена работа некоторых функций. Ошибок после исправления пока не обнаружено. В базу объектов введён новый столбец $run_array[]. Решено было, что это целесообразнее, чем теги типа [run::run]. В $run_array[] передаётся динамический код, который будет выполняться всякий раз, когда производятся хоть какие-нибудь манипуляции с предметом. Этому коду будут отправляться всего два аргумента: инструкция в виде ключевого слова, или управляющей конструкции, и ай-ди предмета. Таким образом можно выполнять разного рода манипуляции с переменными, не затрагивая тело самого предмета. Можно удалить код после выполнения и не мучаться с кучей $replace. Если необходимо будет постепенно удалять куски кода, можно воспользоваться метками строк. Короче возможности почти безгарничные.:)

21.07.2013(1.0.1)

Полностью переделана база предметов base.new.obj. Теперь она работает быстрее и проще. Создание объекта происходит только по пустому управляющему слову. Управляющая конструкция расширена, теперь она может содержать несколько ключевых слов.

get.obj – ключевое слово, позволяющее получить тело объекта, не создавая его. Полезно, если необходимо откатить объект к стандартному значению, или получить определённый подвид из базы.

База выводит ошибку, сообщая, когда в ней отсутствует создаваемый предмет. База по-прежнему выдаёт списки текстов, иллюстраций, ингредиентов и прочее.

База научилась заполнять заряд предмета, чего раньше делать не умела.

21.07.2013(1.0.2)

В соответствии с новой спецификацией исправлена база base.new.bodypart и другие базы.

22.07.2013(1.0.3)

Подправлены алгоритмы выборки имени в основном движке. Теперь имя предметов может записываться как

 [name:Имя Предмета|Имени Предмета|Имени Предмета|Имя Предмета|Именем Предмета|Имени Предмета:name]

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

Исправлена ошибка в функции replace.obj, приводившая к неверной передаче заряда.

Исправлена ошибка в обработке заклинания, приводившая к неверному воспроизведению локации хранилища.

Исправлены мелкие ошибки других переходов.

26.07.2013(1.0.4)

Исправлены ошибки в алгоритмах и недочёты. Удалены лишние переменные из движка.

31.07.2013(1.0.5)

Введена новая вспомогательная функция склеивающая две строки с числовыми тегами в одну remastering.tag.number.

Пример:

$func('remastering.tag.number','[:деревянная_булава:] [1:[zerrvrlv] [rtgrt]:1] [3:[rttgtreg]:3] ','[1: name:дуб:name weight:1 :1]')='[1:[zerrvrlv][rtgrt]:1][2:[rttgtreg]:2][3:name:дуб:name weight:1 :3]'

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

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

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

31.07.2013(1.0.6)

Локация кузницы [smithing] вынесена в основной файл игры.

01.08.2013(1.0.7)

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

Исправлена ошибка в порядке интерпретации динамических текстов локаций. Интерпретация такой формы динамического текста, как «(мужской/женский)», вынесена непосредственно в локацию int.loc.body. Локация int.loc.body переименована в int.din.text

Исправлена локация int.loc.head, теперь она работает с локациями крафтинга, и не использует переменную $curloc. Таким образом теперь можно интерпретировать заголовок любой локации даже не находясь на ней. Несколько подкорректированы цветовые ассоциации заголовков.

Исправлен алгоритм поиска предметов, надеваемых на часть тела, на локации onObjSel. Была допущена ошибка в логике алгоритма, которая приводила к тому, что предметы находившиеся в сумках второго уровня не определялись, как «предметы в позицию». В связи с этим была разработана и введена функция поиска всех дочерних объектов, начиная с первого уровня вложений и заканчивая последним, - get.daughter.obj.all. Функция удаления объекта del.obj так же была изменена. Теперь объект удаляется не просто абы как, а вместе со всеми дочерними объектами, включая подуровни. Это было и раньше, однако теперь код сократился и стал проще благодаря новой функции.

Проработан и полностью введён в эксплуатацию механизм вывода текстов дополнительного описания. Он использует массив $print[], удаляемый сразу после вывода описания. Дополнительное описание теперь выводится только в двух случаях: при выборе объекта, и при переходе на новую локацию (таковой переход осуществляется практически постоянно при совершении любого действия).

Переменная $array_id заменена переменной $temp_id.

В модуль баз добавлены две вспомогательные локации. search.similar.obj – находит подобные объекты и возвращает список их ай-ди и общее количество. gen.ahref.inMount – генерирует ссылки для сборки предмета.

Подправлена база диалогов торговца base.dialog.seller, из которой берутся приветственные фразы и прочее.

Добавлена локация подсчёта уровня героя в зависимости от накопленного опыта. Работа проверена. Основано на концепции счётчиков. hero.level

Aleks Versus'Game Adventure Making'Really Unimaginable Stories'2013-2024
Наверх