Тема закрыта
Бета-версия 0.9.0.0 доступна для скачивания: http://ifwiki.ru/ТОМ
В этой версии добавлено определение используемого интерфейса, что дает возможность подстраивать код игры под различные платформы (пока выбор между ТОМ-консолью и Миленой).
Добавлена функция input().
Демоигра адаптирована для проигрывания в Милене, добавлены картинки.
Весь функционал, предусмотренный для версии 1.0 разработан.
До релиза первой версии необходимо провести:
- поиск и исправление багов и глюков, полировку и доводку функционала;
- доработку демоигры про мышек;
- доработку документации;
- разработку набора примеров, полностью покрывающих функционал;
- полное портирование библиотеки рТАДСа (собственной библиотеки к 1й версии не планируется);
- возможно что-то еще забыл...
Отредактировано ASBer (07.01.2009 23:17)
Неактивен
Korwin написал:
ASBer написал:
- полное портирование библиотеки рТАДСа (собственной библиотеки к 1й версии не планируется);
Изумлен. Это серьезно? Это возможно?
Это трудоемко, долго и муторно, но возможно.
Обе системы - парсерные, объектноориентированные, с C++ подобным языком. Это их роднит.
Надеюсь, что портирование библиотеки в дальнейшем позволит портировать игры между платформами, а также облегчит написание игр для ТОМа авторам, имеющим опыт работы в RTADS.
Неактивен
noname, я постараюсь это учесть, когда начну ваять собственную библиотеку (родную для ТОМа).
Неактивен
noname написал:
автор небольшого квеста может быть сильно удивлён тем, какие возможности будет иметь игрок в его игре благодаря командам, которые автор и не собирался использовать!
Библиотеку РТАДС я постараюсь сохранить в максимально близком к оригиналу состоянии. Переделывать ее логику в мои планы не входит.
-----
Если же рассуждать о метафизике ИЛ, то чем больше глаголов игра "понимает", тем лучше. Это производит выгодное впечатление и о игре и о платформе.
Другое дело что умолчальные реакции на действия ИМХО должны быть максимально нейтральны, и не приводить к тупиковым состояниям.
Неактивен
noname, постараюсь накидать примеров с локациями.
Обновленный пример с черепом, выложу чуть позже, вместе с черным плащем.
Милена нужна версии 2.0 с последним обновлением модулей.
Библиотеру tom.dll в милене нужно заменить на свежую.
Далее в Милене: Файл->Открыть->Выбираем файлы с расширением .tom->Выбираем файл->Open
Или выбрать для открытия файлов.tom Милену как программу по умолчанию (как у меня ).
Отредактировано ASBer (02.02.2009 09:38)
Неактивен
ну если совсем просто - то примерно так:
файл удален - устарел
Отредактировано ASBer (28.07.2009 13:15)
Неактивен
Перемещения в примере парсерные. Если делать на меню, как в лабиринте у мышек - будет попроще.
Неактивен
>хочу попробовать чистого парсера. на правильном русском.
- тогда смотри пример по морфологии и разбирайся с ключами.
>с по-возможности полным контролем над вводом игрока: сколько слов ввёл? какие конкретно? в каком порядке?
- смотри глобальную переменную token[]
>в каких формах
- для объектов, возвращаемых парсером, смотри свойство .key
>решил использовать в своём творилове только простые фразы- без связок 'и'
- связки 'и' сейчас сделать крайне затруднительно, это появится только во 2й версии.
>постараюсь сделать хотя бы одну команду с большим(3-и или более) кол-вом аргументов.
- а вот это как раз без проблем.
Отредактировано ASBer (03.02.2009 09:23)
Неактивен
В .title сейфа были ошибки:
unique сейф
.title="сейф%; НдМр; ИпЕч; //неодуш, мужск род, именит падеж, ед число
ИпЕч=; РпЕч=a; ДпЕч=у; ВпЕч=; ТпЕч=ом; ПпЕч=е"
.lex = .title
.описание="Надёжный сейф."
и далее...
unique ты
........................................................
.осмотреться()
{
%<location>
%{actor.loc.title}</location>
%{actor.loc.описание}
}
.осмотреть(obj)
{
%{obj.описание}
}
Отредактировано ASBer (04.02.2009 08:56)
Неактивен
noname пишет:
редактирую в обычном блокноте.
- и я тоже
заметил такую заморочку: ДО объявления объекта ссылаться на него- некорректно.
- Да, конечно. ТОМ - это однопроходный интерпретатор. Но есть предопределение объектов:
location a1
location a2
location a3
и далее...
location a1
.описание локации a1
...
location a2
.описание локации a2
...
location a3
.описание локации a3
...
мне удобно, что бы все служебные слова и системные переменные имели только английские имена
Все служебные слова имеют английские имена.
Все служебные слова будут иметь русские синонимы. (сейчас пока не у всех)
Каким именно языком пользоваться - это решение автора игры.
Отредактировано ASBer (04.02.2009 09:24)
Неактивен
описание локации выводится в двух случаях: когда ГГ входит в комнату, и когда ГГ вводит команду осмотреться
как сделать, что бы в обоих случаях вызывалась одна и та же фунция вывода описания?
при этом стандартный onEnter() тоже нужен - для некоторых локаций он будет определён по-своему, а по умолчанию- должен вызывать вышеупомянутую функцию
попробовал разные способы- чё-та не получилось... по-ходу я не разобрался с использованием функций
хотелось бы мини-микро-примерчик на эту тему
Вообще здесь стандартное ООП. Переопределение методов, и вызовы методов классов работают как и везде. Не совсем понял проблему... можно поподробнее?
дополнение:
Хотя небольшой примерчик по функциям и методам действительно лишним не будет.
дополнение:
Добавил в пример входы-выходы и команды войти-выйти
Отредактировано ASBer (04.02.2009 10:41)
Неактивен
2. %{obj.описание} - фигурные скобки позволяют вставлять выражения в оператор вывода?
Фигурные скобки позволяют вставлять выражения в любую строку. Так как все что справа от оператора % это строка, то и в оператор вывода тоже.
4. готов ли полный список служебных слов?
Практически все служебные слова перечислены в Вике на страничке ТОМ: язык программирования. Правда пока не все описаны...
хорошо бы найти редактор, аналогичный блокноту, но в котором можно их подцвечивать.
Думаю пойдет любой редактор с подсветкой синтаксиса Си.
5. поясняю сложность с командой 'войди' : из одной и той же локации могут быть входы в различные другие локации. и даже если вход всего один, то и тогда команда 'войди' без параметра, кажется мне не совсем 'красивой'. таким образом реализация команды 'войди' тесно связана с реализацией переходов по названиям локаций: 'иди в дом', 'войди в дом'...
Добавить параметры в команды совсем не сложно, но тогда для всех входов-выходов будут нужны .title и .lex, и желательно с синонимами. Но так будет правильно.
Отредактировано ASBer (04.02.2009 21:50)
Неактивен
Eten написал:
Хороший редактор с подсветкой СИ и прочих языков - Bred3.
Скачал, посмотрел - в целом понравилось.
но
- разбираться с подсветкой придется долго и серьезно.
- даже просто скопировать подсветку с .cpp на .tom не получилось получилось
- подсветка СИ к ТОМу подходит лишь отчасти, в некоторых местах подсвечивается как ошибки.
Отредактировано ASBer (05.02.2009 13:26)
Неактивен
2Korwin: я еще настройку синтаксиса поковыряю, и выложу. Пока еще сыро.
2Gremour: спасибо, посмотрю!
Неактивен
радует та лёгкость, с которой выводится список находящихся в комнате объектов в правильных формах, с разделением запятыми и союзом 'и'. видимо, есть так же и простые средства убрать из этого списка ГГ ?
нужно в {actor.loc.item} добавить некий аспект:
{actor.loc.item:аспект} //слово "аспект" заменить на необходимый признак.
в этом в случае в список попадают только те объекты, которые унаследованы от класса с именем "аспект", или имеют истинное свойство с именем "аспект".
Т.е. чтобы ГГ не отображался в списке, необходимо чтобы ГГ не имел некое свойство, которое имеют все остальные предметы в локации.
пример:
class нечто //наследуем от него всё сущее ... unique ты.cls = нечто //в том числе и ГГ, так как нечто имеет полезные свойства .нечто = нет //нейтрализуем аспект "нечто" для ГГ ... ... %{actor.loc.item:нечто} //в локации отображаем все, что имеет аспект "нечто" ...
а как насчёт выходов: может, стоит создать особый класс 'выходы', что бы можно было показывать список всех выходов из данной локации(я имею ввиду сзюв)?
Да, можно. Смотри мой пример с выходами/входами.
> осмотреть стол
Непонятно, что имелось в виду: стеклянный стол или дубовый стол;
> дубовый
Это предложение непонятно!
Да, уточнения все еще не работают. Нужно заново вводить более полную команду.
Но эта команда должна быть предусмотренна в игре!
upd: да, и хорошо бы русские и латинские буквы в именах пользовательских переменных различать по цвету. а то, например, 'монстр' содержит не известно сколько русских и латинских букв. на глаз не различимо, а для интерпретёра- да.
И мне это тоже хотелось бы...
'осмотреть стол' работает нормально, а 'осмотреть дубовый стол'- нет. код мышек мне так же не помог
В мышках пока нет команд с определениями.
Чтобы это работало нужно:
- к столам добавить лексемы с прилагательными "красный" и "зеленый".
- к действию "осмотреть" добавить шаблон с двумя переменными для объекта - одна переменная для существительного, 2я для прилагательного.
- к действию "осмотреть" добавить проверку на то, что обе переменные ссылаются на один объект.
Отредактировано ASBer (06.02.2009 10:36)
Неактивен
noname написал:
-а как насчёт выходов: может, стоит создать особый класс 'выходы', что бы можно было показывать список всех выходов из данной локации(я имею ввиду сзюв)?
-Да, можно. Смотри мой пример с выходами/входами.если делать таким способом, то каждому выходу придётся давать уникальное имя. этого делать не хотелось бы.
я не вижу никакой проблемы, если каждому выходу будет соответствовать свой объект. Можно будет осматривать выходы, или делать с ними другие действия - например закрывать-открывать двери.
а хотелось бы для каждой локации указывать существующие выходы, и куда они ведут. все навороты к выходам сверх этого- описать где-нить один раз, и забыть.
Можно попробывать и так... но с ходу не могу придумать как.
если в строчке
location a1.cls=место
убрать слово location, работа программы нисколько не изменится, так как по-любому объект 'a1' в результате принадлежит классу 'место'.
Вообще то изменится. Помимо классов в ТОМе есть категории. Именно они задаются ключевыми словами location, unique, action и т.д. И слово "class" кстати тоже обозначает специальную категорию объектов для описания классов.
думаю вот что: с одной стороны, объект типа 'location' должен иметь соотв свойства и методы, для простой организации работы с переходами как по направлениям, так и по названиям локаций. с другой стороны... в нормальной литературной игре и список объектов, и список выходов должны быть 'замаскированы' в описаниях локаций. т е игрок видит вменяемую литературную 'картину' обстановки, и взаимодействует с упомянутыми в тексте сущностями в меру своего разумения.
Помоему такому подходу ничто не мешает... кроме отсутствия стандартной библиотеки
описан класс T_parent_class
как создать класс-наследник T_child_class, который унаследует все его свойства и методы?
class T_parent_class ... //описание свойств и методов класса class T_child_class.cls = T_parent_class ... //описание свойств и методов класса
При этом наследуются все свойства и методы класса-предка. Но при этом вложенные объекты .item по наследству не передаются.
что конкретно означает ошибка 'null=object!' ?
Это означает попытку присвоить объект некоторому пустому значению.
Отредактировано ASBer (06.02.2009 21:05)
Неактивен
В ближайшее время выйдет существенно переработанная и исправленная версия.
Надеюсь что эта и подобные ей ошибки повторяться не будут.
Отредактировано ASBer (27.06.2009 13:08)
Неактивен
noname написал:
положить и выложить - две разные команды
- выложить кафелем, например
Я думаю что "выложить"="положить на пол" и учитывая допустимую условность можно просто сделать синонимами "положить"="выложить".
>выложить на стол
>выложить в сундук
>выложить под кровать
Неактивен
uux, в ТОМе есть 2 возможности задать синонимы для глаголов:
- глобальные синонимы, которые подставляются перед началом парсинга;
- и локальные синонимы, которые действуют в границах парсерного шаблона.
Поэтому, предложенные тобой синонимы вполне реально сделать, если задавать их локально для каждого шаблона
Неактивен
Старик сказал - старик сделал! А если не сделал - не старик.
Отредактировано ASBer (22.07.2009 07:39)
Неактивен
> старик, скажи: "Старик, возьми ложку"
Старик: старик возьми ложку
Старик: вот, уже сам с собой начал говорить...
Старик взял ложку со стола.
noname так лучше?
Неактивен
noname написал:
по команде осмотреться 'не видны' предметы, которые есть в комнате.
Ок. Можно по команде "осмотреться" дергать метод OnEnter() текущей локации.
Тогда будет выводиться все как при входе в локацию.
Сейчас "осмотреться" = "осмотреть {loc}" - т.е. выводится свойство "описание" текущей локации.
> осмотреться
Хижина
Ветхая деревянная хижина. Все здесь очень старое, и непригодно для
использования.
Здесь есть стол и заплетенное паутиной окно. Ты находишься тут и старик
находится тут.
> осмотри хижину
Ветхая деревянная хижина. Все здесь очень старое, и непригодно для
использования.
В любом случае для каждой конкретной локации это можно поменять, перегрузив метод OnEnter() и свойство "описание"
Отредактировано ASBer (22.07.2009 15:36)
Неактивен
noname написал:
думаю, вызывать OnEnter при осмотре- не вполне корректно- ведь там могут и какие-то события на локацию быть повешены
OnEnter как раз и создавался для вывода описания локации. Он срабатывает только на управляемого персонажа и вешать на него дополнительные события не совсем корректно.
Для перемещений есть более универсальные обработчики событий - ChkMoveObj(), BefMoveObj(), AftMoveObj() - срабатывают при любом перемешении и для всех объектов.
noname написал:
допустим, в игре есть с десяток различных деревянных предметов. описание прилагательного деревянный придётся прописывать для каждого,
или же можно вынести описание прилагательного во всех формах отдельно, а в описании предметов только указывать те прилагательные, которые могут к нему относиться (естественно, с учётом рода предмета)?
Достаточно описать для одного объекта, а в остальные раскопировать. При этом описание должно быть полным - для всех родов. Каждый объект воспримет только ту часть, которая ему подходит.
Возможен например такой вариант:
global.прилагательное_деревянный = "... полное описание ..."
...
А.деревянный = global.прилагательное_деревянный
Б.деревянная = global.прилагательное_деревянный
В.деревянное = global.прилагательное_деревянный
Хотя лучше все же будет так:
global.прилагательное_деревянный = "... описание для м.р. ..."
global.прилагательное_деревянная = "... описание для ж.р. ..."
global.прилагательное_деревянное = "... описание для с.р. ..."
...
А.деревянный = global.прилагательное_деревянный
Б.деревянная = global.прилагательное_деревянная
В.деревянное = global.прилагательное_деревянное
noname написал:
и, да- исправить команду 'осмотреться' вполне смогу самостоятельно
Код в студию!
Отредактировано ASBer (22.07.2009 16:23)
Неактивен
noname написал:
не понятна роль {menu()} в конце
его надо исправлять на loc.menu, или это что-то глобальное?
Меню крепится к локации, следовательно должно быть loc.menu().
Если в локации есть хотя-бы одно menu_item(), строка меню добавится к описанию.
Неактивен
noname написал:
допустим, имеются 4-ре локации a1,a2,b1 и b2 (2x2),
и надо, что бы м/ду a2 и b2 проход бы не был возможен
В этом конкретном случае проще всего повесить на персонажей проверку ChkMoveObj()
персонаж.ChkMoveObj(From,To) { if(From==a2 and To==b2 or From==b2 and To==a2) { %здесь прохода нет! return нет //перемещение отменяется } }
В мышка смотри в файле Mouses.tom
МышеКрот.ПроверкаПеремещенияОбъекта(Откуда,Куда) { //Актер еще не вышел из локации, но намеревается это сделать ... return нет //перемещение запрещено }
P.S. модуль Map.tml предполагает что если локации расположены в соседних клетках, то проход между ними есть. "Стенами" между локациями служат пустые клетки карты.
Отредактировано ASBer (23.07.2009 14:02)
Неактивен
Тема закрыта