Тема закрыта
Бета-версия 0.9.0.0 доступна для скачивания: http://ifwiki.ru/ТОМ
В этой версии добавлено определение используемого интерфейса, что дает возможность подстраивать код игры под различные платформы (пока выбор между ТОМ-консолью и Миленой).
Добавлена функция input().
Демоигра адаптирована для проигрывания в Милене, добавлены картинки.
Весь функционал, предусмотренный для версии 1.0 разработан.
До релиза первой версии необходимо провести:
- поиск и исправление багов и глюков, полировку и доводку функционала;
- доработку демоигры про мышек;
- доработку документации;
- разработку набора примеров, полностью покрывающих функционал;
- полное портирование библиотеки рТАДСа (собственной библиотеки к 1й версии не планируется);
- возможно что-то еще забыл...
Отредактировано ASBer (07.01.2009 23:17)
Неактивен
ASBer написал:
- полное портирование библиотеки рТАДСа (собственной библиотеки к 1й версии не планируется);
Изумлен. Это серьезно? Это возможно?
Неактивен
Korwin написал:
ASBer написал:
- полное портирование библиотеки рТАДСа (собственной библиотеки к 1й версии не планируется);
Изумлен. Это серьезно? Это возможно?
Это трудоемко, долго и муторно, но возможно.
Обе системы - парсерные, объектноориентированные, с C++ подобным языком. Это их роднит.
Надеюсь, что портирование библиотеки в дальнейшем позволит портировать игры между платформами, а также облегчит написание игр для ТОМа авторам, имеющим опыт работы в RTADS.
Неактивен
библиотека РТАДСа хороша, но раз уж её перевод является делом трудоёмким, то стоит обратить внимание и на её недостаток: автор небольшого квеста может быть сильно удивлён тем, какие возможности будет иметь игрок в его игре благодаря командам, которые автор и не собирался использовать! помню тестовую головоломку 'волк, коза и капуста', в которой можно было дать капусту козе, которая потом не отдаёт её обратно. так что, реакция типа 'в этой игре Вам не потребуется использовать слово дать ' - очень даже неплохой вариант.
UPD
ещё один момент- библиотека не может быть всенаправленной. т е один автор пишет фэнтезюху, другой- звёздную эпопею. один из них обязательно будет недоволен тем, что его игра будет иметь команды, лоиающие атмосферу игры, о которых автор и не задумывался, и вообще не собирался с ними заморачиваться.
Отредактировано noname (08.01.2009 12:04)
Неактивен
noname написал:
библиотека РТАДСа хороша, но раз уж её перевод является делом трудоёмким, то стоит обратить внимание и на её недостаток: автор небольшого квеста может быть сильно удивлён тем, какие возможности будет иметь игрок в его игре благодаря командам, которые автор и не собирался использовать! помню тестовую головоломку 'волк, коза и капуста', в которой можно было дать капусту козе, которая потом не отдаёт её обратно. так что, реакция типа 'в этой игре Вам не потребуется использовать слово дать ' - очень даже неплохой вариант.
noname, разные мнения есть на этот счет. Я вот считаю, что хорошо, когда возможности стандартной библиотеки шире того, что нужно в игре - ИМХО обрезАть существующие фичи гораздо проще, чем создавать недостающие.
noname написал:
ещё один момент- библиотека не может быть всенаправленной. т е один автор пишет фэнтезюху, другой- звёздную эпопею. один из них обязательно будет недоволен тем, что его игра будет иметь команды, лоиающие атмосферу игры, о которых автор и не задумывался, и вообще не собирался с ними заморачиваться.
Опять-таки - что, так сложно закомментить "лишние" глаголы? Если автору сложно с этим заморачиваться, то, извиняюсь за грубость, в топку таких авторов (точнее, их произведения).
Отредактировано uux (09.01.2009 06:57)
Неактивен
noname написал:
автор небольшого квеста может быть сильно удивлён тем, какие возможности будет иметь игрок в его игре благодаря командам, которые автор и не собирался использовать!
Библиотеку РТАДС я постараюсь сохранить в максимально близком к оригиналу состоянии. Переделывать ее логику в мои планы не входит.
-----
Если же рассуждать о метафизике ИЛ, то чем больше глаголов игра "понимает", тем лучше. Это производит выгодное впечатление и о игре и о платформе.
Другое дело что умолчальные реакции на действия ИМХО должны быть максимально нейтральны, и не приводить к тупиковым состояниям.
Неактивен
стёр старые версии. скачал всё новое. нет примера с черепом. что хочу: простой пример 2х2 локации, где ГГ может перемещаться на север-запад-юг-восток. а то- в примерах этого нет, а в мышках- пока трудно ориентироваться с непривычки.
если не сложно, то лучше 2-а примера: один- см выше, второй- когда каждая локация имеет уникальное имя (мой дом(на поляне) <-> цветочная поляна <-> горная тропа <-> тёмная пещера ), а перемещения осуществляются по названию локации.
хотелось бы начать разбираться с самого простого. предупреждаю: 'въезжать' буду долго. новые простые примеры будут требоваться постоянно. задумки никакой особой нет- просто проба парсера. на основе усвоенного из примеров буду постепенно усложнять свою 'игру'.
upd
как-то я так с порога "наехал"- извиняюсь за стиль. есть желание разбираться. есть желание делать это с помощью автора платформы - не так одиноко, и меньше мозги напрягать придётся
upd
и ещё: как ТОМ-квесты запускать под интерфейс Милены? хотелось бы тестить свои творилова как под консольным так и под графическим интерфейсом.
Отредактировано noname (01.02.2009 23:22)
Неактивен
noname, постараюсь накидать примеров с локациями.
Обновленный пример с черепом, выложу чуть позже, вместе с черным плащем.
Милена нужна версии 2.0 с последним обновлением модулей.
Библиотеру tom.dll в милене нужно заменить на свежую.
Далее в Милене: Файл->Открыть->Выбираем файлы с расширением .tom->Выбираем файл->Open
Или выбрать для открытия файлов.tom Милену как программу по умолчанию (как у меня ).
Отредактировано ASBer (02.02.2009 09:38)
Неактивен
ну, что там? просто перемещение по пустым локациям с переходами. и не нужно ничего на скорую руку в движке 'вылизывать' - дай как есть. я готов ко всему, кроме 'пропадания'. неужели у тя времени совсем нет?
upd
эх, зря я поленился в мышках разобраться- к этому времени вполне мог бы уже содрать перемещения с лабиринта
Отредактировано noname (02.02.2009 21:41)
Неактивен
ну если совсем просто - то примерно так:
файл удален - устарел
Отредактировано ASBer (28.07.2009 13:15)
Неактивен
ок! похоже- то, что нужно, и при этом- довольно просто. сложных примеров мне не надо- я ж сам хочу свою прогу делать. спасибо. буду разбираться. некоторые другие команды из мышек, типа взять, осмотреть, мне более понятны. а на перемещения глянул, и решил попросить помощи.
upd
Перемещения в примере парсерные. Если делать на меню, как в лабиринте у мышек - будет попроще.
хочу попробовать чистого парсера. на правильном русском. без менюшек. и с по-возможности полным контролем над вводом игрока: сколько слов ввёл? какие конкретно? в каких формах? в каком порядке? и т п - может понадобиться для правильного реагирования.
впрочем, что конкретно понадобится- будет видно по ходу работы над прогой. пока для себя решил использовать в своём творилове только простые фразы- без связок 'и', т е каждый ввод- одно действие. зато постараюсь сделать хотя бы одну команду с большим(3-и или более) кол-вом аргументов.
Отредактировано noname (02.02.2009 23:49)
Неактивен
>хочу попробовать чистого парсера. на правильном русском.
- тогда смотри пример по морфологии и разбирайся с ключами.
>с по-возможности полным контролем над вводом игрока: сколько слов ввёл? какие конкретно? в каком порядке?
- смотри глобальную переменную token[]
>в каких формах
- для объектов, возвращаемых парсером, смотри свойство .key
>решил использовать в своём творилове только простые фразы- без связок 'и'
- связки 'и' сейчас сделать крайне затруднительно, это появится только во 2й версии.
>постараюсь сделать хотя бы одну команду с большим(3-и или более) кол-вом аргументов.
- а вот это как раз без проблем.
Отредактировано ASBer (03.02.2009 09:23)
Неактивен
начал врубаться в язык. щазз продумываю структуру будущей программы. редактирую в обычном блокноте.
upd
вопрос такой:
описание локации выводится в двух случаях: когда ГГ входит в комнату, и когда ГГ вводит команду осмотреться
как сделать, что бы в обоих случаях вызывалась одна и та же фунция вывода описания?
при этом стандартный onEnter() тоже нужен - для некоторых локаций он будет определён по-своему, а по умолчанию- должен вызывать вышеупомянутую функцию
попробовал разные способы- чё-та не получилось... по-ходу я не разобрался с использованием функций
хотелось бы мини-микро-примерчик на эту тему, или просто отрывок- что нужно вставить в пример с локациями, что бы это работало
upd
насчёт вложенных локаций: универсальную команду "выйди[из локации]" сделать легко, насчёт "войти в локацию" - чуток посложнее. нужно вводить именованные входы. пока отложил это дело.
хотел сделать пример, похожий на мой с РТАДСа, и заметил такую заморочку: ДО объявления объекта ссылаться на него- некорректно.
т е
location a1.cls=место
.север = a2
.восток = b1
.описание = "моя первая локация"
location b1.cls=место
.север = b2
.запад = a1
.описание = "комната для роботов, которым нечем заняться"
location a2.cls=место
.юг = a1
.восток = b2
.описание = "мой первый объект"
location b2.cls=место
.запад = a2
.юг = b1
.описание = "цветовой код открывает дверь"
не прокатит. нужно вначале прописать все локации, а потом- все переходы. видимо, эта же особенность помешала мне сделать функцию из первой части этого сообщения. учту
upd
не знаю, кому как, а мне удобно, что бы все служебные слова и системные переменные имели только английские имена, что бы оставить русские имена для моих функций и переменных. впрочем, английские имена я тоже буду использовать
Отредактировано noname (04.02.2009 07:35)
Неактивен
unique сейф
.title="сейф%; НдМр; ИпЕч //неодуш, мужск род, именит падеж, ед число
ИпЕч=; РпЕч=ов; ДпЕч=ам; ВпЕч=ы; ТпЕч=ами; ПпЕч=ах"
.lex = .title
.описание="Надёжный сейф."
unique ты
........................................................
.осмотреться()
{
%<location>
%{actor.loc.title}</location>
%{actor.loc.описание}
}
.осмотреть(obj)
{
%obj.описание
}
action осмотреться
.pat = "осмотреться=осмотрись"
action осмотреть
.pat = "осмотреть=осмотри @объект:описание*Вп" //вначале писал просто "осмотреть=осмотри @объект", потом- скопировал с мышек
пишу "осмотреть сейф", выдаёт: "слово <сейф> мне не известно". хм.. а после чего слово становится известно?
Неактивен
В .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)
Неактивен
ОК!
1. с сейфом действительно лажанулся- там до сейфа были кусты. недопеределал.
2. %{obj.описание} - фигурные скобки позволяют вставлять выражения в оператор вывода?
3. предопределение спасает дело. возможно, для больших квестов, такая 'строгость' сыграет положительную роль.
4. готов ли полный список служебных слов? хорошо бы найти редактор, аналогичный блокноту, но в котором можно их подцвечивать. где-то на форуме упоминали "блокнот++"
5.
Мой дом
Тут тепло и уютно.. На восток выходит деревянная дверь.
> выйти
Цветочная поляна
Тут красиво! На западе поляны стоит симпатичный домик. На севере видна тропа,
уходящая в горы.
> войди в дом
Это предложение непонятно!
> войди в домик
Это предложение непонятно!
> войди
Мой дом
Тут тепло и уютно.. На восток выходит деревянная дверь.
>
поясняю сложность с командой 'войди' : из одной и той же локации могут быть входы в различные другие локации. и даже если вход всего один, то и тогда команда 'войди' без параметра, кажется мне не совсем 'красивой'. таким образом реализация команды 'войди' тесно связана с реализацией переходов по названиям локаций: 'иди в дом', 'войди в дом'... впрочем, кое-что полезное из примера СЗЮВ.tom я-таки вынес.
6. сложность с выводом описания и по входу и по 'осмотреться' была в том, что функция не работала. щазз попробую ещё раз- с фигурными скобками там, где надо, и с предопределением, если понадобится.
Неактивен
2. %{obj.описание} - фигурные скобки позволяют вставлять выражения в оператор вывода?
Фигурные скобки позволяют вставлять выражения в любую строку. Так как все что справа от оператора % это строка, то и в оператор вывода тоже.
4. готов ли полный список служебных слов?
Практически все служебные слова перечислены в Вике на страничке ТОМ: язык программирования. Правда пока не все описаны...
хорошо бы найти редактор, аналогичный блокноту, но в котором можно их подцвечивать.
Думаю пойдет любой редактор с подсветкой синтаксиса Си.
5. поясняю сложность с командой 'войди' : из одной и той же локации могут быть входы в различные другие локации. и даже если вход всего один, то и тогда команда 'войди' без параметра, кажется мне не совсем 'красивой'. таким образом реализация команды 'войди' тесно связана с реализацией переходов по названиям локаций: 'иди в дом', 'войди в дом'...
Добавить параметры в команды совсем не сложно, но тогда для всех входов-выходов будут нужны .title и .lex, и желательно с синонимами. Но так будет правильно.
Отредактировано ASBer (04.02.2009 21:50)
Неактивен
Eten написал:
Хороший редактор с подсветкой СИ и прочих языков - Bred3.
Скачал, посмотрел - в целом понравилось.
но
- разбираться с подсветкой придется долго и серьезно.
- даже просто скопировать подсветку с .cpp на .tom не получилось получилось
- подсветка СИ к ТОМу подходит лишь отчасти, в некоторых местах подсвечивается как ошибки.
Отредактировано ASBer (05.02.2009 13:26)
Неактивен
2Korwin: я еще настройку синтаксиса поковыряю, и выложу. Пока еще сыро.
2Gremour: спасибо, посмотрю!
Неактивен
ASBer, возьми любой файл с подсветкой и глянь че у них там по написано. Методом проб и ошибок дойдешь. К тому же это не так сложно, т.к. видел не раз такие файлы у других разработчиков своих прог со скриптовыми языками.
Ах да, чуть не забыл. Этот плагин клорер используется не только в этом редакторе, так что ты себе облегчишь труд если не на все 100%, то хотя бы на 50%.
Отредактировано Eten (05.02.2009 19:29)
Неактивен
ну, вот появилось чуток свободного от работы и гулянок время, и вот что я наваял:
> с
a2
складское помещение
здесь есть: ты и сейф
выходы: этой дорогой не пройти, этой дорогой не пройти, a1, b2.
> в
b2
странная комната
здесь есть: ты, дубовый стол и стеклянный стол
выходы: этой дорогой не пройти, a2, b1, этой дорогой не пройти.
> осмотреть ты
Слово <ты> мне неизвестно.
> осмотреть стол
Непонятно, что имелось в виду: стеклянный стол или дубовый стол;
> дубовый
Это предложение непонятно!
>
радует та лёгкость, с которой выводится список находящихся в комнате объектов в правильных формах, с разделением запятыми и союзом 'и'. видимо, есть так же и простые средства убрать из этого списка ГГ ? а как насчёт выходов: может, стоит создать особый класс 'выходы', что бы можно было показывать список всех выходов из данной локации(я имею ввиду сзюв)?
и, мне таки совсем непонятно, чего он не выводит описание стола? вот моя прога: <прикреплённые файлы>
upd: да, и хорошо бы русские и латинские буквы в именах пользовательских переменных различать по цвету. а то, например, 'монстр' содержит не известно сколько русских и латинских букв. на глаз не различимо, а для интерпретёра- да.
Отредактировано noname (05.02.2009 23:44)
Неактивен
если убрать один из столов, то 'осмотреть стол' работает нормально, а 'осмотреть дубовый стол'- нет. код мышек мне так же не помог:
> осм домик
На опушке леса, там, где просыпается солнышко, стоит маленький домик.
Он настолько мал, что сразу его и не заметишь. Да-да, это самый настоящий Мышкин
дом. Он сложен из толстых веток и глины, щели аккуратно заткнуты мягким мхом,
окошко с занавесочками и незаметная дверка.
> осм мышиный дом
Это предложение непонятно!
> осм мышиный домик
Это предложение непонятно!
то ли лексемы для прилагательных надо как-то по-особому прописывать, то ли я наткнулся на недоделанное место в платформе.
Неактивен
радует та лёгкость, с которой выводится список находящихся в комнате объектов в правильных формах, с разделением запятыми и союзом 'и'. видимо, есть так же и простые средства убрать из этого списка ГГ ?
нужно в {actor.loc.item} добавить некий аспект:
{actor.loc.item:аспект} //слово "аспект" заменить на необходимый признак.
в этом в случае в список попадают только те объекты, которые унаследованы от класса с именем "аспект", или имеют истинное свойство с именем "аспект".
Т.е. чтобы ГГ не отображался в списке, необходимо чтобы ГГ не имел некое свойство, которое имеют все остальные предметы в локации.
пример:
class нечто //наследуем от него всё сущее ... unique ты.cls = нечто //в том числе и ГГ, так как нечто имеет полезные свойства .нечто = нет //нейтрализуем аспект "нечто" для ГГ ... ... %{actor.loc.item:нечто} //в локации отображаем все, что имеет аспект "нечто" ...
а как насчёт выходов: может, стоит создать особый класс 'выходы', что бы можно было показывать список всех выходов из данной локации(я имею ввиду сзюв)?
Да, можно. Смотри мой пример с выходами/входами.
> осмотреть стол
Непонятно, что имелось в виду: стеклянный стол или дубовый стол;
> дубовый
Это предложение непонятно!
Да, уточнения все еще не работают. Нужно заново вводить более полную команду.
Но эта команда должна быть предусмотренна в игре!
upd: да, и хорошо бы русские и латинские буквы в именах пользовательских переменных различать по цвету. а то, например, 'монстр' содержит не известно сколько русских и латинских букв. на глаз не различимо, а для интерпретёра- да.
И мне это тоже хотелось бы...
'осмотреть стол' работает нормально, а 'осмотреть дубовый стол'- нет. код мышек мне так же не помог
В мышках пока нет команд с определениями.
Чтобы это работало нужно:
- к столам добавить лексемы с прилагательными "красный" и "зеленый".
- к действию "осмотреть" добавить шаблон с двумя переменными для объекта - одна переменная для существительного, 2я для прилагательного.
- к действию "осмотреть" добавить проверку на то, что обе переменные ссылаются на один объект.
Отредактировано ASBer (06.02.2009 10:36)
Неактивен
спасиб! пожалуй, так и библиотеку создать недолго
планирую: вводить постепенно новые команды, обыгрывать традиционно сложные для парсеров фразы.
в далёком будущем: могу попробовать сляпать на дельфях прогу, помогающую убирать/добавлять/редактировать объекты игрового мира в тексте проги. обещать пока ничего не берусь.
Неактивен
-а как насчёт выходов: может, стоит создать особый класс 'выходы', что бы можно было показывать список всех выходов из данной локации(я имею ввиду сзюв)?
-Да, можно. Смотри мой пример с выходами/входами.
если делать таким способом, то каждому выходу придётся давать уникальное имя. этого делать не хотелось бы. а хотелось бы для каждой локации указывать существующие выходы, и куда они ведут. все навороты к выходам сверх этого- описать где-нить один раз, и забыть.
если в строчке
location a1.cls=место
убрать слово location, работа программы нисколько не изменится, так как по-любому объект 'a1' в результате принадлежит классу 'место'.
думаю вот что: с одной стороны, объект типа 'location' должен иметь соотв свойства и методы, для простой организации работы с переходами как по направлениям, так и по названиям локаций. с другой стороны... в нормальной литературной игре и список объектов, и список выходов должны быть 'замаскированы' в описаниях локаций. т е игрок видит вменяемую литературную 'картину' обстановки, и взаимодействует с упомянутыми в тексте сущностями в меру своего разумения.
постоянно спотыкаюсь на элементарных вещах. надеюсь побыстрее преодолеть 'барьер' и работать над тестовой прогой с большей эффективностью.
вопросы:
1)
описан класс T_parent_class
как создать класс-наследник T_child_class, который унаследует все его свойства и методы?
из описания ясно только, как создавать экземпляры классов. пробовал через '=' сделать классы одинаковыми- не вышло.
2)
что конкретно означает ошибка 'null=object!' ?
upd
если в строчке
location a1.cls=место
убрать слово location, работа программы нисколько не изменится, так как по-любому объект 'a1' в результате принадлежит классу 'место'.
ой, последняя фраза, видимо не верна. через class определяются как классы, так и качества объектов. вроде бы всё больше разбираюсь, а 'прояснения' в голове не наступает.
Отредактировано noname (06.02.2009 20:54)
Неактивен
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 , жду-недождусь, когда будет реализована возможность ходить по сторонам света
это нужно в связи с тем, что хочу попробовать сгенерить большой мир со случайной расстановкой обстановки и неписей
типа не игра, а что-то врде какой-то модели
в этом случае без компасных направлений будет тяжко
Неактивен
не знаю, поймёт ли кто юмор:
Выбор тестируемого модуля:
1. UnusVerb.tml - неиспользуемые глаголы
2. Main.tml - минимальный набор классов и действий.
> 2
Включить в тест модуль неиспользуемых глаголов? (UnusVerb.tml)
да/нет> да
Хижина
Ветхая деревянная хижина. Все здесь очень старое, и непригодно для
использования.
Здесь есть стол и заплетенное паутиной окно. Ты находишься тут и старик
находится тут.
> старик, скажи: старик, возьми ложку
Старик: старик возьми ложку
Старик взял ложку со стола.
:)
Отредактировано noname (21.07.2009 23:45)
Неактивен
Старик сказал - старик сделал! А если не сделал - не старик.
Отредактировано ASBer (22.07.2009 07:39)
Неактивен
> старик, скажи: "Старик, возьми ложку"
Старик: старик возьми ложку
Старик: вот, уже сам с собой начал говорить...
Старик взял ложку со стола.
noname так лучше?
Неактивен
ASBer написал:
noname так лучше?
во всяком случае этот вариант даст мне возможность 'подглядеть' как научить непися отличать свои собственные фразы от чужих
Быстренько накидал модуль с картой и перемещениями по компасу - Map.tml
Теперь в библиотеке 3 модуля. Но все 3 сырыееее...
быстро это у тебя получается
UPD
> осмотреться
Ветхая деревянная хижина. Все здесь очень старое, и непригодно для
использования.
по команде осмотреться 'не видны' предметы, которые есть в комнате. так например, RTADS бы их упомянул по-любому, если они там есть (и не скрыты намеренно)- для этого квестоделу не приходится добавлять ни строчки кода
//
впрочем, ещё не известно как лучше для литературной игры, но для простых игр лишних сложностей не надо
Отредактировано noname (22.07.2009 15:16)
Неактивен
noname написал:
по команде осмотреться 'не видны' предметы, которые есть в комнате.
Ок. Можно по команде "осмотреться" дергать метод OnEnter() текущей локации.
Тогда будет выводиться все как при входе в локацию.
Сейчас "осмотреться" = "осмотреть {loc}" - т.е. выводится свойство "описание" текущей локации.
> осмотреться
Хижина
Ветхая деревянная хижина. Все здесь очень старое, и непригодно для
использования.
Здесь есть стол и заплетенное паутиной окно. Ты находишься тут и старик
находится тут.
> осмотри хижину
Ветхая деревянная хижина. Все здесь очень старое, и непригодно для
использования.
В любом случае для каждой конкретной локации это можно поменять, перегрузив метод OnEnter() и свойство "описание"
Отредактировано ASBer (22.07.2009 15:36)
Неактивен
понял. метод OnEnter нашёл. там совсем не сложно
думаю, вызывать OnEnter при осмотре- не вполне корректно- ведь там могут и какие-то события на локацию быть повешены
в ООП лучше всё сразу делать строго 'правильно', что бы потом непонятные глюки не возникали
---
так же обратил внимание на следующий момент:
допустим, в игре есть с десяток различных деревянных предметов. описание прилагательного деревянный придётся прописывать для каждого,
или же
можно вынести описание прилагательного во всех формах отдельно,
а в описании предметов только указывать те прилагательные, которые могут к нему относиться (естественно, с учётом рода предмета)?
UPD
и, да- исправить команду 'осмотреться' вполне смогу самостоятельно
сейчас думаю над демо-квестом этих модулей. пока есть такая идея: взять старючий квест ( закон об интеллектуальной собственности действует в РФ только с 1993года), причём такой, чтоб его можно было постепенно расширять и дополнять для демонстрации новых возможностей
квест я уже выбрал. там как раз перемещения сделаны по сзюв (но и 'нормальные' перемещения тоже будут реализованы в финальной версии игры )
квест хотя и был в своё время очень популярен(и его даже буржуи друг у друга плагиатили), но- совсем простой, и оригинальной первой версии на русском нет
Отредактировано noname (22.07.2009 16:00)
Неактивен
noname написал:
думаю, вызывать OnEnter при осмотре- не вполне корректно- ведь там могут и какие-то события на локацию быть повешены
OnEnter как раз и создавался для вывода описания локации. Он срабатывает только на управляемого персонажа и вешать на него дополнительные события не совсем корректно.
Для перемещений есть более универсальные обработчики событий - ChkMoveObj(), BefMoveObj(), AftMoveObj() - срабатывают при любом перемешении и для всех объектов.
noname написал:
допустим, в игре есть с десяток различных деревянных предметов. описание прилагательного деревянный придётся прописывать для каждого,
или же можно вынести описание прилагательного во всех формах отдельно, а в описании предметов только указывать те прилагательные, которые могут к нему относиться (естественно, с учётом рода предмета)?
Достаточно описать для одного объекта, а в остальные раскопировать. При этом описание должно быть полным - для всех родов. Каждый объект воспримет только ту часть, которая ему подходит.
Возможен например такой вариант:
global.прилагательное_деревянный = "... полное описание ..."
...
А.деревянный = global.прилагательное_деревянный
Б.деревянная = global.прилагательное_деревянный
В.деревянное = global.прилагательное_деревянный
Хотя лучше все же будет так:
global.прилагательное_деревянный = "... описание для м.р. ..."
global.прилагательное_деревянная = "... описание для ж.р. ..."
global.прилагательное_деревянное = "... описание для с.р. ..."
...
А.деревянный = global.прилагательное_деревянный
Б.деревянная = global.прилагательное_деревянная
В.деревянное = global.прилагательное_деревянное
noname написал:
и, да- исправить команду 'осмотреться' вполне смогу самостоятельно
Код в студию!
Отредактировано ASBer (22.07.2009 16:23)
Неактивен
вот код:
персонаж.осмотрелся() { //осмотрел(loc) %{loc.описание} %{loc.item:предмет_по_месту}.{loc.item:персонаж_по_месту}.{menu()} }
сделал по аналогии с OnEnter, только применительно к текущей локации(loc)
не понятна роль {menu()} в конце
его надо исправлять на loc.menu, или это что-то глобальное?
Неактивен
noname написал:
не понятна роль {menu()} в конце
его надо исправлять на loc.menu, или это что-то глобальное?
Меню крепится к локации, следовательно должно быть loc.menu().
Если в локации есть хотя-бы одно menu_item(), строка меню добавится к описанию.
Неактивен
ага, припоминаю ( менюшки )
---
итак, собравшись с силами таки решился взяться за тот самый квест
И сразу появилась куча собственных идей, которые подавил на корню:
лучше сделать для начала простой доделанный плагиат перевод, чем вообще ничего не доделать
а после- мож и своё что-нить получится
---
итак, квест реально простой, но возник вопрос:
допустим, имеются 4-ре локации a1,a2,b1 и b2 (2x2),
и надо, что бы м/ду a2 и b2 проход бы не был возможен
я понимаю, что где-то в длинном тексте мышек это можно выцепить, НО из мини-демы модуля map этого не видно
подскажи плизз максимально короткий и простой способ
---
и, да- убедился, что я правильно сделал, взявшись за простую и известную вдоль и поперёк игру- мне сейчас очень не хватает навыков кодинга в ТОМе
Отредактировано noname (23.07.2009 13:37)
Неактивен
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)
Неактивен
в этой игре полно локаций, и они представляют из себя отнюдь НЕ прямоугольный лабиринт
думаю, хорошим выходом будет снабдить каждую локацию списком выходов (я уже так когда-то делал)
при этом хорошо бы, что бы выйти было возможно и по сзюв, и по названию локации-цели, и по командам войти/выйти
попробую поискать у себя примеры в архивах
---
опять, же подразнюсь немного: в RTADS в создаваемой локации автор может указать, в каком направлении из неё можно выйти, и куда при этом игрок попадёт- довольно просто с точки зрения автора. точно не помню, но вроде бы и переход в соседнюю локацию по названию тоже поддерживается(а может и нет) // недостатком ( с точки зрения автора) в этом случае может быть необходимость самому отслеживать, что бы переходы были двусторонними(т е и туда и обратно), прописывая один и тот же переход в обеих локациях. но это уже выбор автора- односторонние переходы хоть и редки, но тоже бывают
UPD
кроме переходов сзюв(они-чаще всего) в игре есть переходы вверх/вниз, а так же перенос в несвязанные локации, а так же одна комната с входом, но без выходов ( выход- с помощью особых действий ); а так же локации, в которых возможности персонажа ограничены только общением с одним неписем, а почти все остальные действия в этой ситуации лишены смысла
// т е на самом деле карта- именно прямоугольный лабиринт, НО соседние локации очень часто разделены(нет прохода)
Отредактировано noname (23.07.2009 14:27)
Неактивен
пример (с предпоследними библиотеками):
include "std.lib\UnusVerb.tml" include "std.lib\Main.tml" include "std.lib\Map.tml" location название_локации { // текст локации убрал (ибо- спойер), но проверено- всё работает this + ГГ // вводим главного героя }
проблема в том, что куда бы я не впихивал pers.title="ты; Мр2лЕч;", всё равно игруха пишет: "ГГ находится тут", а надо: "ты находишься тут". хотя по-большому счёту отображение присутствия ГГ вообще лучше убрать- ведь [почти]всегда ГГ находится там, где находится // ИМХО лучше отображение ГГ по-умолчанию убрать, но оставить возможность его включать по желанию автора
UPD
заодно дай пример переопределения некоторых свойств ГГ: внешний вид и инвентарь на момент начала квеста
Отредактировано noname (23.07.2009 15:03)
Неактивен
игруха пишет: "ГГ находится тут", а надо: "ты находишься тут".
Чтобы писалось "ты находишься тут" вообще ничего менять у ГГ не надо! Если не работае - присылай код на мыло.
title для персонажей уже использованы в main.tml - их менять нельзя.
ГГ.описание = "самый крутой герой!" //меняет описание ГГ
ГГ.по_имени = "Вас%; ЕчОд; Ип; Зп=ь; Зп=я; Ип=я; Рп=и; Дп=е; Вп=ю; Тп=ей; Пп=е;" //меняет имя ГГ
ГГ.персонаж_по_месту = нет //отключает отображение ГГ в локации
unique нож //создаем предмет
{ cls = предмет
this.МожноВзять = да
ГГ + this //помещаем предмет в инвентарь ГГ
}
Отредактировано ASBer (23.07.2009 15:45)
Неактивен
вот вырезка из твоего собственного примера:
include "std.lib\UnusVerb.tml" include "std.lib\Main.tml" include "std.lib\Map.tml" //отладка действий //осмотрел.Debug = да //взял.Debug = да //команда.Debug = да //создаем тестовую локацию location хижина { cls = место title = "хижин%; ЖрЕчНдСи; Ип; Ип=а; Рп=ы; Дп=е; Вп=у; Тп=ой; Пп=е;" this.старая = "стар%; ЖрЕчНдПи; Ип; Ип=ая; Рп=ой; Дп=ой; Вп=ую; Тп=ой; Пп=ой;" this.ветхая = "ветх%; ЖрЕчНдПи; Ип; Ип=ая; Рп=ой; Дп=ой; Вп=ую; Тп=ой; Пп=ой;" this.деревянная = "деревянн%; ЖрЕчНдПи; Ип; Ип=ая; Рп=ой; Дп=ой; Вп=ую; Тп=ой; Пп=ой;" this.описание = "__Ветхая деревянная хижина. Все здесь очень старое, и непригодно для использования." unique стол { cls = предмет title = "стол%; МрЕчНдСи; Ип; Ип=; Рп=а; Дп=у; Вп=; Тп=ом; Пп=е;" this.старый = "стар%; МрЕчНдПи; Ип; Ип=ый; Рп=ого; Дп=ому; Вп=ый; Тп=ым; Пп=ом;" this.деревянный = "деревянн%; МрЕчНдПи; Ип; Ип=ый; Рп=ого; Дп=ому; Вп=ый; Тп=ым; Пп=ом;" this.описание = "{fnOписание()}" fnOписание() { if(item) return "{item:предмет_по_месту}." else return "на столе ничего нет" } counting ложка { cls = предмет title = "лож%; ЖрНдСи; ИпЕч; ИпЕч=ка; РпЕч=ки; ДпЕч=ке; ВпЕч=ку; ТпЕч=кой; ПпЕч=ке; ИпМч=ки; РпМч=ек; ДпМч=кам; ВпМч=ки; ТпМч=ками; ПпМч=ках;" this.деревянная = "деревянн%; ЖрНдПи; Ип; ИпЕч=ая; РпЕч=ой; ДпЕч=ой; ВпЕч=ую; ТпЕч=ой; ПпЕч=ой; ИпМч=ые; РпМч=ых; ДпМч=ым; ВпМч=ые; ТпМч=ыми; ПпМч=ых;" this.МожноВзять = да } this + ложка } unique окно { cls = предмет this.предмет_по_месту = "заплетенное паутиной окно" } unique старик { cls = персонаж this.по_имени = "старик%; МрЕчОдСи; Ип; Зп=; Ип=; Рп=а; Дп=у; Вп=а; Тп=ом; Пп=е;" } this + ГГ //вводим главного героя }
в таком варианте она обзывает героя ГГ, а не ты
( т е если весь пример урезать до такого состояния )
// и, да- а как вообще убрать постоянные упоминания присуствия ГГ в каждой локации?
ЗЫ
не то, чтоб я настаивал на том, чтобы главгерой в локациях не упоминался, просто хочу, чтобы была возможность сделать и так и эдак- по желанию автора. конкретно в этом квесте(и в большинстве других) главгерой в описаниях локаций не упоминается
Отредактировано noname (23.07.2009 15:53)
Неактивен
noname написал:
в таком варианте она обзывает героя ГГ, а не ты
Угу, но это только при первом показе так... дальше нормально показывает "ты".
Исправлю.
noname написал:
и, да- а как вообще убрать постоянные упоминания присуствия ГГ в каждой локации?
Смотри мой пост выше: ГГ.персонаж_по_месту = нет //отключает отображение ГГ в локации
Неактивен
взял со стола ложку
осмотрел стол
надписи "на столе ничего нет" я не увидел
у меня этот баг не повторяется...
1. описание стола сделано в тесте, а не в библиотеке.
2. такое может быть, если на столе есть еще что-то невидимое - объект без свойства "предмет_по_месту"
3. покажи код стола
Отредактировано ASBer (23.07.2009 18:59)
Неактивен
код приведён в сообщении #121
ИМХО: необходимо разделить примеры библиотек, так как в навороченной куче всё работает, а при попытке сделать отдельно самому- нет
библиотеки- последние из выложенных здесь
Неактивен
код из сообщения #121 работает правильно...
попробуй в столе заменить
fnOписание()
{ if(item) return "{item:предмет_по_месту}."
else return "на столе ничего нет"
}
на
fnOписание()
{ if(item:предмет_по_месту.num) return "{item:предмет_по_месту}."
else return "на столе ничего нет"
}
Неактивен
Скорее стол засорился
поменяй на
fnOписание()
{ if(item) return "{item}."
else return "на столе ничего нет"
}
и увидишь сколько там мусора
Неактивен
fnOписание() { if(item) return "{item}." else return "на столе ничего нет" }
ТОМ - Текстовая Основа Миростроения v.0.9.2.1 beta. ASBer(C)2008-2009
Контактный адрес - 2008_TOM@mail.ru
Введите '?', 'help' или 'помощь' для справки.
Хижина
Ветхая деревянная хижина. Все здесь очень старое, и непригодно для
использования.
Здесь есть стол и заплетенное паутиной окно. ГГ находится тут и старик находится
тут.
> осм стол
?item?.
> взять ложку
Ты взял ложку со стола.
> осм стол
?item?.
>
этот пример привёл исключительно из-за того, что у моего ГГ тоже не всё как надо отображалось.
так например, один из предметов, для которого не было указано местоположения было невозможно осмотреть, так как этого предмета здесь нет, НО в инвентаре его было видно
видимо, надо перед началом игры делать какую-то читску памяти
---
с другой стороны, мож ты найдёшь другое решение проблемы
Неактивен
ТОМ - Текстовая Основа Миростроения v.0.9.2.1 beta. ASBer(C)2008-2009
Последние библиотеки идут с версией v.0.9.2.2 (возьми в папке Libs4tom/Bin)
Отредактировано ASBer (23.07.2009 20:08)
Неактивен
всё, разобрался: всё у меня было правильно распаковано, НО у меня с *.tom стояла ассоциация файлов с другим constom.exe, в другом месте, про который я уже и забыл
теперь пример из #121 работает как надо
Неактивен
ещё вопрос:
допустим, у ГГ есть спелое аппетитное съедобное красное яблоко, и все прилагательные для яблока указаны
как сделать, что бы при осмотре инвентаря ГГ видел именно 'красное яблоко', а не просто 'яблоко'(и не какое-нить другое)
UPD
ой, что-то я ударился в усложнения. так, вопрос про яблоко пока не актуален. попробую сделать эту примитивную игруху поближе к оригиналу
UPD
щазз более актуально выкладывание предметов(просто на пол)- сразу проще будет тестировать корректность работы игрухи
Отредактировано noname (23.07.2009 21:07)
Неактивен
как выкладывать(и обменивать) предметы- тоже разобрался
есть ещё такая непонятка:
в некоторой локации надо запретить некоторые действия(почти все). как было бы правильнее всего это сделать?
ЗЫ
разобрался почти во всём, что необходимо для этой примитивной игрушки
но в таком(приближённом к оригиналу) виде, в наши дни она будет смотреться как позор парсера
как будет готова- начну её доводить до ума, усложнять и переделывать
Неактивен
noname написал:
в некоторой локации надо запретить некоторые действия(почти все). как было бы правильнее всего это сделать?
Наверное проще всего вариант "в лоб" - в каждом действии прописать проверку текущей локации.
персонаж.взял()
{ if(loc==запретная_локация)
{ %ты не можешь здесь ничего брать!
return;
}
//...
}
и далее также по всем действиям...
Или еще вариант - с подменой персонажа.
Подменный не должен наследоваться от класса "персонаж"
И в него нужно скопировать только те обработчики действий, которые нужны в этой локации.
Отредактировано ASBer (23.07.2009 22:18)
Неактивен
отчёт о приблизительном времени работы над игрой:
нормальная реализация данной игры требут от 3-х до 30-ти дней упорного перевода и кодинга
я скорее всего провожусь над ней месяца 3-и ( я ж ещё по олдгамесам шарюсь и играю в тамошние игрухи регулярно )
с учётом того, что её придётся доводить до ума- думаю, в этом году успею ( впрочем, меньше чем через неделю у меня днюха, а потом- буду искать работу; с другой стороны- когда я буду работать я мож больше времени буду именно написанием квеста заниматься, чем сейчас, когда целыми днями занимаюсь всякой фигнёй) // короче буду стремиться сделать в этом году (и не просто сделать бету, НО ещё и успеть её отшлифовать обезбажить и доработать )
особых чудес от игры ждать не стоит- её все уже прошли в том или ином варианте. я делаю её в-основном ради овладения навыками кодинга в ТОМе
ЗЫ
а комнату с невозможностью выполнения почти всех действий можно ещё реализовать через меню- оставить только возможные пункты
и ещё вопрос: допустим, устройство(напр лифт) имеет 9-ть нумерованных кнопок (от 1 до 9):
игрок пишет (к примеру): езжай на 6й этаж (или езжаё на шестой этаж) - как бы сделать это в ТОМе ?
Неактивен
с учётом того, что её придётся доводить до ума- думаю, в этом году успею
А можно я набьюсь в бета-тестеры?
В файле набросок к лифту.
P.S. есть небольшая условность - числа в команде должны быть ПЕРЕД объектом. "5 этаж" - правильно. "Этаж 5" - будет ошибка.
--------------------------------------------------------------------------------
Прикрепленные файлы:
SixFloors.tom, Размер: 1,800 байт, Скачано: 27
Отредактировано ASBer (28.07.2009 13:28)
Неактивен
в бетатестеры, конечно можно. но- не скоро
---
немного теории
что вообще автору может быть нужно от движка?:
- лично мне хотелось бы, чтоб от игрока требовался ввод фраз, правильных с т з русского языка // в том числе и знаки препинания // в этой игре знаков препинания пока не нужно
- штоп можно было сделать всё, что хочется, И штоп игра на вводимые фразы реагировала так, как хочет именно этот автор именно в этом квесте // т е - широкие возможности использования движка
- штоп движок хорошо различала различные фразы: т е понимал отличие 'кинуть банку в коробку' от 'кинуть коробку в банку'; И особенно это актуально для обработки ошибок: напр если игрок пытается неправильно использовать известный проге глагол- автор пишет на этот случай один текст(напр подсказку по исп этого глагола), а если он пытается использовать какое-то непонятное слово(команду, судя по тому, что слово идёт в начале фразы) с известным проге предметом- автор пишет на этот случай другой текст(напр подсказку по исп предмета)
---
впрочем, пока буду делать основной 'костяк' игры
позже- обязательно нужно будет доработать, штоп она понимала все упомянутые в описаниях существительные, глаголы (и прилагательные?) И выдавала разумные ответы на любую фразу; (особенно- если фраза построена неверно- ведь в этом случае игроку необходима помощь программы)
//
на сюжет именно этой поделки можно не обращать внимания- он может заинтересовать только после полной переделки. напр если весь сюжет этого квеста станет необязательной частью более другого квеста. т е всё, что я сейчас делаю имеет ценность скорее как тренировка в кодинге, чем как создание новой игры // да, много времени убивает перевод- я-то знаю, как там что переводится, но как сделать эти фразы читабельными на русском- приходится поломать голову
Отредактировано noname (25.07.2009 13:33)
Неактивен
в Багтрекер я тебе уже написал кое-о-чём
теперь вот что:
не нашёл, как переопределить стандартное сообщение "<предмет> не годится для этого действия."
Отредактировано noname (25.07.2009 18:00)
Неактивен
ох блин, ежовая морковка!
не сходятся в этой игре на квадратной карте входы с выходами.
первый проект однозначно необходимо делать совместно с автором платформы
тем более, что библиотека пока в стадии разработки
- заодно будет видно, что в библиотеку следует добавить
---
в связи с этим даю объяву в разделе 'игры' с просьбой солюшенов маленьких игр:
щазз открою там тему UPD: ссылка на тему
UPD
с тебя, ASBer - библиотека, с меня- перевод и кодинг, с любителей парсерных игр- солюшен
все промежуточные результаты работы буду выкладывать на форум
Отредактировано noname (26.07.2009 15:29)
Неактивен
Здесь важно понимать различие: если действие даёт 2 разных результата - это 2 разных действия, даже если они используют один глагол. И описывать из нужно как 2 разных объекта
ага- понял. это как стандартное 'открыл' и особое 'открыл_фонарик'
Название объекта также является его свойством. Поэтому пример будет один
ну, щазз не буду вдаваться в уточнения, НО в более сложных квестах эта тема ещё всплывёт
UPD: жду пример :)
Отредактировано noname (27.07.2009 18:19)
Неактивен
ASBer написал:
noname написал:
в таком варианте она обзывает героя ГГ, а не ты
Угу, но это только при первом показе так... дальше нормально показывает "ты".
Исправлю.noname написал:
и, да- а как вообще убрать постоянные упоминания присуствия ГГ в каждой локации?
Смотри мой пост выше: ГГ.персонаж_по_месту = нет //отключает отображение ГГ в локации
не знаю, обратил ли ты внимание: при первом показе прога опять называет игрока ГГ, а не на ты
я-то в любом случае отключу показ героя, но если в ООП-проге есть такой глюк, значит где-то чего-то некорректно сделано
Неактивен
Название объекта также является его свойством. Поэтому пример будет один
Отредактированно ASBer (Сегодня 19:32)
ты это, не томи- этож наверняка несложно- такой пример сделать ( пример задания особой обработки команды над двумя предметами ). с примерами как-то гораздо проще с языком разбираться
ЗЫ
возможно, в ближайшие дни до конца месяца буду занят. после планирую дописывать второго Спелеолога до куда смогу И выкладывать списки необходимых изменений в библиотеках. ну, там по-мелочи: спуститься вниз, подняться наверх, различные синонимы
саму игру (будет называться Спелеолог-2) планирую довести до 'кандидатского минимума': штоп она понимала по-возможности все упомянутые ею же в описаниях слова, а в случаях ввода неиспользуемых в игре команд давала по-возможности разумные ответы/помощь. так же планирую привинтить к ней систему подсказок и сделать версию под графичексий интерфейс
игра, конечно, простенькая. ну так значит- проще будет довести её до приличного состояния. и тем самым- отработать на ней основные приёмы написания парсерных игр
Неактивен
noname написал:
ты это, не томи- этож
Пример на один глагол и два объекта.
--------------------------------------------------------------------------------
Прикрепленные файлы:
to_pawn.tom, Размер: 2,050 байт, Скачано: 30
Отредактировано ASBer (27.07.2009 23:26)
Неактивен
отличный пример!
надо заметить, что он понравился мне ещё и тем, что показал возможность творить на ТОМе совершенно другим способом- этот код впечатлил меня свободой, предоставляемой ТОМом квестописцам. расширил моё видение ТОМа. ещё немного и я влюблюсь в ТОМ
и, конечно, в моих квестах(буде таковые случатся) будет ГГ и использование библиотек, НО впечатление свободы, оказанное этим примером на моё больное воображение уркиниста- неизгладимо
на самом же деле этот пример просто демонстрирует создание особой реакции на действие с двумя предметами друг на друга
эту тему регулярно просматривают около 30чел, а качают примеры - 2-3чел, поэтому выкладываю 'полный солюшен' этого примера (или правильнее сказать- лог):
ТОМ - Текстовая Основа Миростроения v.0.9.2.2 beta. ASBer(C)2008-2009
Контактный адрес - 2008_TOM@mail.ru
Введите '?', 'help' или 'помощь' для справки.
КАК ЗАЛОЖИТЬ ЗА ВОРОТНИК, ДА НЕ НАПИТЬСЯ
Ты сидишь за идеально сервированным столом. Перед тобой лежит накрахмаленная
салфетка и стоит запотевшая рюмка водки (пятьдесят граммов).
> заложить
Что заложить?
> заложить рюмку
Куда заложить?
> заложить воротник за рюмку
Рюмка не годится для этого действия.
> заложить рюмку за воротник
Рука неуверенно потянулась к рюмке и вернулась назад. Нет! Воспитание не
позволяет пить без салфетки.
> заложить салфетку за воротник
Ты взял салфетку, неторопясь расправил ее и аккуратно заложил за воротник,
провел по ней рукой, еще раз убедившись, что она на месте.
> заложить рюмку за воротник
Ты хорошо выверенным молниеносным движением схватил рюмку, потянулся к ней
дрожащими губами, шумно выдохнул и одним махом заложил за воротник!
> заложить салфетку за воротник
Ты поправил уже заложенную за воротник салфетку и жадно сглотнул.
> заложить рюмку за воротник
Что толку в пустой рюмке - за воротник не заложишь.
Отредактировано noname (28.07.2009 00:10)
Неактивен
fireton, единственный известный мне способ понять язык - это начать писать на нем
Подругому никак...
Неактивен
Тогда вот пока вам совсем маленькая но зато классическая игрушка - Плащ тьмы.
Возможности стандартной библиотеки пока гораздо скромнее рТАДСа - например, надеть плащ не получится.
В остальном получилось довольно близко к оригиналу...
О всех замеченных багах, несуразностях или нелогичности прошу писать сюда - исправлю
--------------------------------------------------------------------------------
Прикрепленные файлы:
Cloak.rar, Размер: 188,580 байт, Скачано: 26
Неактивен
> з
Ты ушел на запад в гардероб.
Гардероб
Стены этой маленькой комнаты, очевидно, когда-то имели множество крючков для
одежды. Сейчас же остался только один. Единственная дверь ведет на восток.
Здесь есть маленький бронзовый крючок для одежды.
> повесить плащ
Куда повесить?
> на крючок
Маленький бронзовый крючок для одежды не годится для этого действия.
насколько я знаю RTADSа(довольно плохо), он понимает уточняющие фразы. т е если после 'куда повесить?' ответить 'на крючок' то он бы понял(хотя реально там какой-то пример с яблоками приводился: взять яблоко - какое яблоко - зелёное - ты взял зелёное яблоко)
// это я так - штоп тебе было чем заняться
Неактивен
> инв
У тебя есть бархатный плащ.
> з
Ты ушел на запад в гардероб.
Гардероб
Стены этой маленькой комнаты, очевидно, когда-то имели множество крючков для
одежды. Сейчас же остался только один. Единственная дверь ведет на восток.
Здесь есть маленький бронзовый крючок для одежды.
> осм его
Бархатный плащ или маленький бронзовый крючок для одежды?
> маленький крючок
Это просто маленький бронзовый крючок, прикрученный к стене.
noname, в ТОМе уточнения работают. Но я еще подумаю...
Отредактировано ASBer (06.08.2009 14:33)
Неактивен
Бархатный плащ или маленький бронзовый крючок для одежды?
насколько я понимаю, общепринятой реакцией для парсеров, которые поддерживают местоимения, было бы "осмотреть маленький бронзовый крючок для одежды", т к 'крючок'- последнее существительное, употреблённое в подходящей форме
с другой стороны, если ТОМ запоминает 2-а последних сущ каждой формы- тем лучше. наверное
Неактивен
Парсер не поддерживает местоимений - они поддерживаются библиотекой.
По последнему упоминанию объекта можно сделать - это правильно.
Здесь на троне правит королева в короне.
> осм ее
Королеву или корону?
вот с этим уже хуже... буду думать
Отредактировано ASBer (06.08.2009 17:20)
Неактивен
Разбавляю ваши технические несуразности песней, что безумству упорных мы поём.
ASBer, снимаю шляпу, кажись всё всерьёз и надолго.
Неактивен
noname написал:
Бархатный плащ или маленький бронзовый крючок для одежды?
насколько я понимаю, общепринятой реакцией для парсеров, которые поддерживают местоимения, было бы "осмотреть маленький бронзовый крючок для одежды", т к 'крючок'- последнее существительное, употреблённое в подходящей форме
с другой стороны, если ТОМ запоминает 2-а последних сущ каждой формы- тем лучше. наверное
Порой, входя в режим машинальной игры, игрок не вчитывается в текст и не видет упоминаемых там предметов. Для него "она", "его", "ими" это тот предмет, с котором он только что имел дело.
Ну, или может случиться так:
>открыть коробку
Коробка полностью обмотана скотчем и открыть её не просто
>осм её
Коробка полностью и качественно обмотана скотчем.
>сорвать скотч
Ты долго скреб ногтями, пытаясь зацепиться, но тщетно
>потрясти коробку
Без результата.
>подбросить коробку и пнуть её
Ты бросил коробку на пол.
(сообщение демона) В комнату зашла твоя возлюбленная Елена.
Что Вы хотели бы пнуть: коробку или Елену?
Отредактировано GrAndrey (07.08.2009 09:39)
Неактивен
И до кучи вот еще игра про золотой череп портирована на стандартную библиотеку ТОМа.
--------------------------------------------------------------------------------
Прикрепленные файлы:
GOLDSKLR.rar, Размер: 188,249 байт, Скачано: 33
Отредактировано ASBer (11.08.2009 09:04)
Неактивен
Пещера
Ты находишься внутри темной и затхлой пещеры. Солнечный свет прорывается через
проход, расположенный к югу.
Здесь есть пьедестал и здесь есть мелкий камень.
когда я на RTADS описал стол и яблоки на нём, то в описании локации, при входе в неё, перечислялся и стол и
предметы на нём
примерно так:
стол находится здесь. зелёное яблоко и красное яблоко находятся на столе
вот как-то так. вполне логично, что ГГ, входя в комнату(пещеру) видит предметы на столе(на пъедестале).
если они только не спрятаны под чем-то
---
насчёт спелеолога: команда выложить/положить/бросить почему-то не работает. она вообще есть в библиотеке? без
неё немного неудобно тестить работу с предметами. ещё немного повыделываюсь: а не доделать ли библиотечные
команды 'вниз' и 'вверх', что бы понималось 'спуститься вниз' и 'подняться наверх'. сейчас этого нет
ЗЫ
у меня вроде бы последняя версия библиотеки, НО не последняя версия ТОМ
---
работе над спелеологом ОЧЕНЬ мешает одна игрушка с oldgames, называется xcom-apocalypse. уже почти две недели в неё играю и просто не в состоянии от неё оторваться(играю из-под дос-бокса)
Неактивен
ASBer написал:
Здесь на троне правит королева в короне.
> осм ее
Королеву или корону?вот с этим уже хуже... буду думать
А разве нужно что-то придумывать? Обычная жизненная ситуация.
Насчет примера про "пнуть Елену". Можно как-то отделить объекты в описаниях, инициированных игроком, от объектов в описаниях, инициированных программой?
Отредактировано Cheshire (19.08.2009 14:13)
Неактивен
Cheshire написал:
ASBer написал:
Здесь на троне правит королева в короне.
> осм ее
Королеву или корону?вот с этим уже хуже... буду думать
А разве нужно что-то придумывать? Обычная жизненная ситуация.
Если в тексте присутствуют персонаж и объект, то персонаж как правило более значим. В данном примере корона никак не акцентирована и служит как дополнительное описание самой королевы.
Cheshire написал:
Насчет примера про "пнуть Елену". Можно как-то отделить объекты в описаниях, инициированных игроком, от объектов в описаниях, инициированных программой?
угу, это можно.
Отредактировано ASBer (19.08.2009 15:08)
Неактивен
Уж очень всё заманчивее и заманчивее выглядит ТОМ...
А кстати, что с Миленой, движется?
1) можно ли в ТОМ конструировать фразы-обращения, например "Робот, возьми гайку и закрути винт."? Или "Попросить робота взять гайку и закрутить винт"?
2) Насчёт "ты" и "вы" - даже при обращении на "ты" можно избежать личных окончаний, т.к. они лишь в прошедшем времени. Вместо "ты взял" - пишем "ты берёшь".
Обращение на "ты" должно быть, имхо, обусловлено сюжетом. Я тоже сторонник обращения на "вы", но вот сейчас делаю сюжет, герой которого - ученик колдуна. При всём уважении к игроку я не могу позволить обращения на "вы", ибо оно не так погрузит игрока в атмосферу, не заставит почувствовать себя учеником.
Отредактировано oleksus (24.08.2009 11:27)
Неактивен
oleksus написал:
А кстати, что с Миленой, движется?
На вике лежит графический интерфейс для тома на основе милены лайт.
Там можно менять шрифт, форматировать текст, вставлять картинки и музыку. Все работает - спасибо Александру Графу
oleksus написал:
можно ли в ТОМ конструировать фразы-обращения, например "Робот, возьми гайку и закрути винт."?
В текущей версии можно только в два этапа:
>Робот, возьми гайку
>Робот, закрути винт
Но я думаю что эта проблема решаема, скоро иcправлю.
oleksus написал:
Насчёт "ты" и "вы" - даже при обращении на "ты" можно избежать личных окончаний, т.к. они лишь в прошедшем времени. Вместо "ты взял" - пишем "ты берёшь".
Личные окончания вполне нормально подставляются если правильно указан род персонажа (по умолчанию - Мр), с этим проблем быть не должно. Если только я еще не все глаголы в библиотеке расписал...
oleksus написал:
Обращение на "ты" должно быть, имхо, обусловлено сюжетом. Я тоже сторонник обращения на "вы", но вот сейчас делаю сюжет, герой которого - ученик колдуна. При всём уважении к игроку я не могу позволить обращения на "вы", ибо оно не так погрузит игрока в атмосферу, не заставит почувствовать себя учеником.
Добавлю в библиотеку возможность обращения к персонажу на "Вы". Пусть авторы игр сами решают как правильно.
Неактивен
А что насчёт фразы "Пусть робот возьмёт гайку."?
Мне кажется, эта фраза универсальнее, поскольку в ней содержится ёмкий посыл для персонажа, чтобы он сам додумался, как это сделать.
Да и не всякому роботу так прямо "скажешь", что делать.
То есть, глагол "пусть" может как раз быть предназначен для такого "непрямого" управления.
Неактивен
oleksus написал:
А что насчёт фразы "Пусть робот возьмёт гайку."?
Без проблем.
Нужно создать действие "пусть" с соответствующим шаблоном.
Но я не уверен что такое действие должно быть включено в стандартную библиотеку.
Неактивен
Все файлы игр (.tom, .tml) это обычные текстовые файлы.
Можно просматривать и редактировать любым текстовым редактором.
Неактивен
Начиная с версии 0.9.2.8 beta возможна вставка выражений на естественном языке в код игры.
Для анализа выражений в коде игры использует тот-же парсер, что и для команд в процессе самой игре.
Выражения ЕЯ могут встраиваться в конструкции языка программирования.
Выражения ЕЯ не могут встраиваться в вычисляемые выражения - формулы, присвоения и т.п.
В конце выражения ЕЯ обязательно должна стоять точка.
Парсерная ошибка в коде приравнивается к синтаксической ошибке и приводит к прерыванию выполнения кода.
Выражения ЕЯ в коде эквивалентно оператору "<" для объекта this.
выполнение строки с синтаксисом:
команда на ЕЯ.
эквивалентно выполнению операции:
this < "команда на ЕЯ"
Неактивен
Скачал ТОМ, попытался разобраться... Не очень получилось, если честно.
Если б какие-нибудь уроки были, о создании игры с нуля...
И, как я понимаю, словоформы задавать приходится вручную, т.е. ни генератора словоформ, ни утилитки никаких нет.
Неактивен
fireton написал:
Скачал ТОМ, попытался разобраться... Не очень получилось, если честно.
Если б какие-нибудь уроки были, о создании игры с нуля...
Набор примеров есть на ифвике - tom_sample.rar
Там примеры на различные темы, но без использования стандартной библиотеки.
Пошаговые уроки о создании игры с нуля наверное имеет смысл делать на основе стандартной библиотеки, которая всё еще в разработке...
В составе самой библиотеки есть тест и пара простых игр, можно попробовать делать по аналогии с ними.
В любом случае прийдется разбираться самостоятельно - удобочитаемого вводного материала пока к сожалению нет.
С удовольствием готов отвечать на любые возникающие вопросы - в данный момент я в отпуске, поэтому сейчас самое время
fireton написал:
И, как я понимаю, словоформы задавать приходится вручную, т.е. ни генератора словоформ, ни утилитки никаких нет.
Платформа не имеет жестко заданных парадигм словообразования. Библиотеки и даже отдельные игры могут применять свою собственную систему генерации словоформ и их согласования. Поэтому утилитку можно сделать только для стандартной библиотеки, которая всё еще в разработке...
Для существительных и прилагательных можно взять алгоритм генератора рТАДСа, если GrAndrey разрешит.
Для глаголов все сложнее... но новые глаголы нужны не так частно.
Неактивен
noname написал:
насколько я понимаю, утилитками тут не обойдёшся- нужны словари.
Одно другому не мешает, особенно если учесть что словари - ну ооочень дальняя перспектива.
Неактивен
наименование = "пещер%; ЖрЕчНдСи; Ип; Ип=а; Рп=ы; Дп=е; Вп=у; Тп=ой; Тп=ою; Пп=е;"
По отдельности, в принципе, понятно -- Жр - женский род, Рп - родительный падеж и т.д. Но вот непонятно, почему не всегда все ключи прописываются, или наоборот, после где-нибудь идет строчка this.род_число = "ЖрЕч" (или даже ЖрМрЕч)? Что означает первый Ип? Что означают Си и Пи (существительное/прилагательное? а что за "и")?
Нужны примеры с предметами в множественном числе, исчислимыми предметами, со сложными названиями (нож Васи, клубок ниток) и т.д.
Неактивен
Добавил ссылки на статьи http://ifwiki.ru/ТОМ:_Лексема и http://ifwiki.ru/ТОМ:_Морфологический_ключ
возможно это поможет...
Cheshire написал:
Но вот непонятно, почему не всегда все ключи прописываются
Потому что иногда можно сократить описание лексемы, не прописав некоторые ключи.
Например:
"пещер%; ЖрЕчНдСи; Ип; Ип=а; Рп=ы; Дп=е; Вп=у; Тп=ой; Тп=ою; Пп=е;"
эквивалентно
"пещер%; ; ЖрЕчНдСиИп; ЖрЕчНдСиИп=а; ЖрЕчНдСиРп=ы; ЖрЕчНдСиДп=е; ЖрЕчНдСиВп=у; ЖрЕчНдСиТп=ой; ЖрЕчНдСиТп=ою; ЖрЕчНдСиПп=е;"
Если для лексемы указан, например, женский род, то и каждая словоформа лексемы будет отнесена к женскому роду. В таком случае Жр достаточно указать один раз как свойство всей лексемы.
Cheshire написал:
или наоборот, после где-нибудь идет строчка this.род_число = "ЖрЕч" (или даже ЖрМрЕч)?
Это я сумел победить доработав парсер. В текущей версии в this.род_число = "ЖрЕч" никакой необходимости нет и можно забыть как страшный сон.
Cheshire написал:
Что означает первый Ип?
Первый Ип - это словоформа по умолчанию. Если Вы напишите
%{пещера}
на экран будет выведено
пещера
т.е. тоже самое, как если бы Вы написали
%{пещера*Ип}
Cheshire написал:
Что означают Си и Пи (существительное/прилагательное? а что за "и")?
Совершенно верно! Существительное имя , Прилагательное имя
Cheshire написал:
Нужны примеры с предметами в множественном числе, исчислимыми предметами, со сложными названиями (нож Васи, клубок ниток) и т.д.
Можно покопаться в играх, там это есть.
Принцип согласования по ключам тот же самый, только ключи подлиннее.
На самом деле механизм получился очень гибкий, думаю я сам еще не до конца осознал все его возможности...
upd:
Еще очень рекомендую разобраться с примером Морфология.tom (есть в наборе примеров)
Неактивен
Разбирался тут с ТОМ, и вот что заметил:
Я (ГГ) безприкословно слушаюсь всех. Например:
> зеркало, скажи "гоблин, скажи привет"
Зеркало: гоблин скажи привет
Ты: привет
или
> зеркало, скажи гоблин, возьми меч
Зеркало: гоблин возьми меч.
Ты взял меч из пещеры.
Почему ГГ так слушается других персонажей? Если они скажут ему убиться он тоже убъется?
Неактивен
Alexandr написал:
Почему ГГ так слушается других персонажей? Если они скажут ему убиться он тоже убъется?
Конечно
ГГ такой же персонаж как и все остальные NPC. Чтобы ГГ не слушал команд NPC нужно прописать метод
ГГ.свобода_воли(){ return нет }
Неактивен
Тема закрыта