ну, вот появилось чуток свободного от работы и гулянок время, и вот что я наваял:
> с
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)
Неактивен