Хм, столкнулся с проблемой. У протагониста уже есть предмет, пусть "пузырек с ядом". Исследуя отдаленные районы квеста он находит второй точно такой же "пузырек с ядом". Предметы по идее абсолютно идентичны (массовое производство приводит к этому), более того это контейнеры, и их содержимое отличается (в одном из пузырьков на самом деле простая вода), однако об этом нельзя узнать, если не попробовать (а умный протагонист не станет пить из пузырька с ядом, чтоб не почувствовать легкого недомогания).
Собственно есть ли выход из ситуации:
Вы имеете в виду "пузырек с ядом" или "пузырек с ядом"?
Кроме как поменять сценарий?
Самое страшное - таких предметов на самом деле на два, а четыре
Неактивен
Предложу теоретическое решение, без кода.
При первом нахождении 2-го, 3-го и 4-го пузырька нужно изменять их лексические свойства на "второй пузырек", "третий ..," и т.д., в зависимости от того, сколько пузырьков игрок уже нашел.
Нужно создать где-нибудь счетчик найденных пузырьков, у самих пузырьков прописать флаг "найден", а в метод doTake вставить проверку этого флага и изменение описания пузырьков.
Также при нахождении первого альтернативного объекта нужно давать нумерацию и первому экземпляру ("первый пузырек").
Или можно менять лексические свойства пузырьков в зависимости от того, что в них находится. Например, изначально в пузырьке налита вода. Называется оно "Пузырек с водой". Если игрок извлечет воду, пузырек станет называться "[Первый/второй/третий/четвертый] пустой пузырек". Нумерация должна появляться, если пустых пузырьков несколько, что несложно проверить.
Как только игрок зальет туда, скажем, водку, по методу doFill (или как там он называется) у пузырька опять изменятся лексические свойства и он станет "Пузырек с водкой".
Отредактировано Hind (05.12.2007 17:09)
Неактивен
Есть класс нумерованных предметов - numberedObject. Никогда не использовал, но судя по описанию, может подойти.
Указанный метод тоже может пройти, но только сам подумай - если они одинаковые, как их различает ГП?
Неактивен
Hind, спасибо, очень интересный вариант
Гранд, с этим как раз и проблемы - дело не в практическом решении, я не могу придумать как их будет различать игрок. В идеале, если игрок ложит эти пузырьки в разные контейнеры (например один в карман, а другой в сумку), или просто не берет одновременно два в руку (например выкладывает пузырьки попеременно в разных локациях), то он должен быть в состоянии их различить, так как они не перепутаются. Но нужна возможность обратиться к каждому из них в отдельности. Если этого не делать, то протагонист сможет отравить всех вокруг из пузырька в котором, как окажется в конце игры, был не яд а вода.
Неактивен
Кстати, сделал пару "пузырьков". При вводе "пузырек с ядом" пишет: Какой "пузырек of ядом" вы имеете ввиду?
Проблема, видимо, в том что в процедуру разбора несостыковок передается уже преобразованная строка с предлогом 'of' нужная для английского разборщика. Как бы это обойти. А вызывается она, как я понял, уже напрямую из интерпертатора?
parseDisambig: function(str, lst, ...) //Вместо 100-104 кодов ошибок { local i, tot, cnt; "Котор"; if (lst[1].isactor) ok(lst[1],'ых','ого','ое','ую'); else if (lst[1].isThem) "ые"; else if (lst[1].gender=1) "ый"; else if (lst[1].gender=2) "ую"; else "ое"; " \"<< str >>\" Вы имеете в виду: "; for (i := 1, cnt := length(lst) ; i <= cnt ; ++i) { if (dToS(lst[i],&vdesc)!=str) lst[i].vdesc; else lst[i].disamvdesc; //кстати, в чем смысл этой строки? Может сразу выводить только disamvdesc? if (i < cnt - 1) ", "; if (i + 1 = cnt) " или "; } "?"; }
PS Что за многоточия в аргументах функции? Это что-то вроде необязательных параметров или как?
Отредактировано - VampirE - (05.12.2007 19:46)
Неактивен
В общем, вот, что можно сделать со свойством disamvdesc:
puzyryek1 : item location = startroom sdesc = "пузырек c ядом" rdesc = "пузырка c ядом" ddesc = "пузырку c ядом" vdesc = "пузырек c ядом" tdesc = "пузырком c ядом" pdesc = "пузырека c ядом" adjective = 'ядом' 'ядом#r' 'первый' disamvdesc = "первый пузырек" noun = 'пузырек' 'пузырка' 'пузырку' 'пузырком' 'пузырека' 'пузырку#d' 'пузырком#t' ldesc = "Пузырек." isHim = true ; puzyryek2 : item location = startroom sdesc = "пузырек c ядом" rdesc = "пузырка c ядом" ddesc = "пузырку c ядом" vdesc = "пузырек c ядом" tdesc = "пузырком c ядом" pdesc = "пузырека c ядом" adjective = 'ядом' 'ядом#r' 'второй' disamvdesc = "второй пузырек" noun = 'пузырек' 'пузырка' 'пузырку' 'пузырком' 'пузырека' 'пузырку#d' 'пузырком#t' ldesc = "Пузырек." isHim = true ;
Правда, при этом в фун-ии parseDisambig пришлось строку
if (dToS(lst[i],&vdesc)!=str) lst[i].vdesc; else lst[i].disamvdesc;
заменить на
lst[i].disamvdesc;
иначе disamvdesc отображаться не хочет.
Отредактировано - VampirE - (05.12.2007 20:30)
Неактивен
Ух ты, а я и не знал про disamvdesc
Главное, следить, чтобы игрок не получал ответов типа: "Вы имеете в виду первый пузырек с йадом или четвертый пузырек с йадом?", когда он встретил в игре всего два...
Я к тому, что нумеровать их надо в порядке нахождения, даже если игрок может найти их в произвольном порядке.
Кстати, похоже, динамическое нумерование должно происходить не в doTake, а в момент первого появления в поле внимания игрока - иначе он просто не сможет взять его: в инвентаре будет "Пузырек с йадом", в шкафу тоже будет "Пузырек с йадом".
Возникает вопрос - а есть ли универсальный, который будет вызываться при первом появлении объекта в кадре?
Для объектов, явно перечисляемых движком при осмотре комнаты (isListed) это, очевидно, vdesc.
С остальными, похоже, нужно разбираться индивидиуально.
Неактивен
Здорово, я тоже не знал про disamvdesc Спасибо Вампир, это свойство похоже должно решить все мои проблемы с йадом
Кстати, даже если игрок встретил в игре всего два или три пузырька, то он может догадаться написать "взять четвертый пузырек с ядом" и узнать есть ли такой в игре предмет по ответу ртадса
Неактивен
goraph написал:
он может догадаться написать "взять четвертый пузырек с ядом" и узнать есть ли такой в игре предмет по ответу ртадса
Так в том и фишка, что "четвертый пузырек" окажется четвертым и получит такое имя и лексические свойства (которые позволили бы к нему так обратиться) только после его нахождения. )))
Я сейчас как раз пишу код для этого )
Коварно, зато правдоподобно (думаю, я бы тоже, найдя по очереди несколько одинаковых пузырьков, начал бы называть их "первый", "второй" и т.п., сделав какие-нибудь метки для простоты) и защищает от спойлера.
Неактивен
С нумерацией все понятно - лучше всего вводить в момент входа в локацию с пузырьком (вбить скрипт в функцию осмотра комнаты). Впрочем, дело вкуса.
А вот нумерация может появляться если у игрока в кармане есть маркер. Это даже можно сделать пазлом. А ещё, актер может отказываться брать пузырек, мотивируя риском ошибки. Тут очень много вариантов, которые могут сделать игру только интереснее!
Неактивен
GrAndrey написал:
А вот нумерация может появляться если у игрока в кармане есть маркер. Это даже можно сделать пазлом. А ещё, актер может отказываться брать пузырек, мотивируя риском ошибки. Тут очень много вариантов, которые могут сделать игру только интереснее!
Ага, я уже думал об этом. "Я могу случайно перепутать пузырьки, так что лучше пока его не брать."
Меня сейчас интересует, как изменить свойство adjective... Что оно вообще такое? Ему ничего не присваивается, оно только задается при создании объекта...
Неактивен
А вот еще пример: игрок встречает какого-то персонажа. Так как его имени он не знает, то может обращаться к нему как "человек" и т.д. А вот если персонаж узнает имя собеседника, возможно ли потом изменять значение переменных с падежами vdesc, pdesc и т.д. на имя персонажа?
Ну что? Кто-то знает как избежать смены предлога на "of"? Когда Гранд писал о "некоторых экзотических случаях" он это имел ввиду?
Отредактировано - VampirE - (05.12.2007 23:46)
Неактивен
Пример манипуляций с лексемами и пару других фишек из Дримора.
class monster: Actor,living ... death(killer)= // !!!!!!!!!!!!!!! DEATH !!!!!!!!!!!!!!! { // создаем объект класса "труп" local corp := new trup; // список существительных local nnouns:=[]; // список прилагательных и пара переменных local adj:=[],z,i; // вынос трупа на сцену corp.moveInto(self.location); // уносим актера self.moveInto(nil); //обозначаем кем был этот труп corp.monstr:=self; // вес трупа зависит от макс хитов хозяина corp.weight:=self.mhp/4; // сообщение о смерти в зависимости от персонажей, оружия и оверкила killer.curweapon.killmess(killer,self,self.hp*(-1)); // скока лута в актере z:=length(self.contents); // перебрасываем лут в труп for(i:=1; i<=z;i++) self.contents[1].moveInto(corp); // берем список имен погибшего nnouns:=getwords(self, &noun); // присваиваем их свежему трупу for (i:=1;i<=length(nnouns);i++) addword(corp,&noun,nnouns[i]) ; // собираем список прилагательных adj:=getwords(self, &adjective); // их тоже приписываем тушке for (i:=1;i<=length(adj);i++) addword(corp,&adjective,adj[i]) ; // тельце будет отзывается на "он, она, оно" по обстоятельствам // ударить его -> Злодей умер -> ударить его -> Он уже мертв. setit(corp); } ; class trup: surface //!!!!!!!!!!!!!!!!!Trup!!!!!!!!!!!!!!!! ... monstr= nil sdesc ="труп <<monstr.rdesc>>" ... pdesc ="трупе <<monstr.rdesc>>" noun ='трупа' 'трупу' 'трупу#d' 'труп' 'трупом' 'трупом#t' 'трупе' 'тело' 'тела' 'телу' 'телу#d' 'телом' 'телом#t' 'теле' adjective='трупа' 'трупа#r' isHim = true ;
По аналогии с addword() работает и delword()
Неактивен
Hind написал:
Меня сейчас интересует, как изменить свойство adjective... Что оно вообще такое? Ему ничего не присваивается, оно только задается при создании объекта...
adjective - это лексическое свойство-прилагательные, соответственно. Проще говоря, оно определяет набор прилагательных (или существительных-определительных), с помощью которых игрок может обращаться к объекту. Для изменения лексических свойств (добавления/удаления) используются функции addword/delword. Далее см. в мануале (в "Справочнике по языку программирования" или, по-моему, где-то есть в главах про парсер - что-то вроде "Динамический словарный запас").
Отредактировано uux (06.12.2007 06:10)
Неактивен
- VampirE - написал:
Ну что? Кто-то знает как избежать смены предлога на "of"? Когда Гранд писал о "некоторых экзотических случаях" он это имел ввиду?
Есть идея (правда, без кода, код предоставляю написать ГрАнду, так как оптимизация системных библиотек - его епархия): в parseDisambig перед выводом запроса просматривать переменную str
на предмет вхождения в нее подстроки ' of ' и безжалостно заменять оную на пробел. На мой взгляд, единственная проблема, которая может возникнуть - это случай, когда в русскоязычной игре активно используются англоязычные словосочетания, но уж это-то совершенно точно экзотика. Других побочных эффектов придумать не могу. Может, ГрАнд меня поправит.
Неактивен
- VampirE - написал:
А вот еще пример: игрок встречает какого-то персонажа. Так как его имени он не знает, то может обращаться к нему как "человек" и т.д. А вот если персонаж узнает имя собеседника, возможно ли потом изменять значение переменных с падежами vdesc, pdesc и т.д. на имя персонажа?
ГрАндовский пример в принципе дает ответ на этот вопрос, но вот еще одна прямая подсказка: vdesc, pdesc и т. д. - это не переменные, а методы. Соответственно, их можно оформить в виде кусков кода в фигурных скобках и включить туда условные операторы. До остального, думаю, догадаешься сам;).
Неактивен
Есть идея (правда, без кода, код предоставляю написать ГрАнду, так как оптимизация системных библиотек - его епархия): в parseDisambig перед выводом запроса просматривать переменную str на предмет вхождения в нее подстроки ' of ' и безжалостно заменять оную на пробел.
Это-то понятно. Но будет не очень красиво смотреться. По смылсу там все равно должен будет стоять какой-то предлог.
А про методы спасибо. Я даже совсем забыл про это.
Неактивен
goraph написал:
Хм, столкнулся с проблемой. У протагониста уже есть предмет, пусть "пузырек с ядом". Исследуя отдаленные районы квеста он находит второй точно такой же "пузырек с ядом". Предметы по идее абсолютно идентичны (массовое производство приводит к этому), более того это контейнеры, и их содержимое отличается (в одном из пузырьков на самом деле простая вода), однако об этом нельзя узнать, если не попробовать (а умный протагонист не станет пить из пузырька с ядом, чтоб не почувствовать легкого недомогания).
Собственно есть ли выход из ситуации:
Вы имеете в виду "пузырек с ядом" или "пузырек с ядом"?
Кроме как поменять сценарий?
Самое страшное - таких предметов на самом деле на два, а четыре
1. А если это будут зеленый, синий, лиловый, грязный, пузырек с ядом - это повредит сюжету? Они действительно долждны быть совершенно одинаковыми?
2. Пусть игрок догадается чем и как их пометить и это будет пазл, иначе их можно случайным образом путать друг с другом...
Дать ему алмаз или маркер... пусть рисует на пузырьках череп и кости...
Неужели так трудно запомнить: спирт в пузырьке из под микстуры от кашля с надписью "яд"!!!
Неактивен
- VampirE - написал:
Есть идея (правда, без кода, код предоставляю написать ГрАнду, так как оптимизация системных библиотек - его епархия): в parseDisambig перед выводом запроса просматривать переменную str на предмет вхождения в нее подстроки ' of ' и безжалостно заменять оную на пробел.
Это-то понятно. Но будет не очень красиво смотреться. По смылсу там все равно должен будет стоять какой-то предлог.
В случае с of это не так.
Эту конструкцию ГрАнд специально придумал для случаев, когда определяющее существительное в родительном падеже следует за определяемым (конструкции вида "дверь гаража", которая будет заменена на "дверь of гаража"). Поэтому тут-то как раз никаких предлогов (с точки зрения русского человека, а не TADS;) не требуется. Больше такое представление, насколько я понимаю, нигде не используется.
To GrAnd: Андрей, поправь меня, если я ошибаюсь.
Неактивен
AlsoKorwin написал:
1. А если это будут зеленый, синий, лиловый, грязный, пузырек с ядом - это повредит сюжету? Они действительно долждны быть совершенно одинаковыми?
Я думаю - да, иначе Гор не спрашивал бы;).
Неактивен
uux написал:
Эту конструкцию ГрАнд специально придумал для случаев, когда определяющее существительное в родительном падеже следует за определяемым (конструкции вида "дверь гаража", которая будет заменена на "дверь of гаража"). Поэтому тут-то как раз никаких предлогов (с точки зрения русского человека, а не TADS;) не требуется. Больше такое представление, насколько я понимаю, нигде не используется.
To GrAnd: Андрей, поправь меня, если я ошибаюсь.
Совершенно верно. ТАДС по умолчанию ожидает увидеть определяемое существительное после прилагательного, и делает исключение лишь при наличии предлога 'of'. В русском языке на его месте могут быть самые разные предлоги, что задается в specialWords строкой 'of'='для'='против'='типа'='из'='под'='от'='на'='в'='с'. Но предлога может не быть, так как он будет "заложен" в родительном падеже определения. Для этих случаев создается дополнительная лексема прилагательного с меткой #r. Предпарсер переделывает такие конструкции к виду "существительное для прилагательное" К сожалению, парсер все предлоги приводит к одному коду, и может вернуть только 'of'. Уж коль пошла такая пьянка, то можно сохранть предлоги для дальнейшего использования, но у меня уже голова идет кругом от последних программерских изысков
Неактивен
AlsoKorwin написал:
1. А если это будут зеленый, синий, лиловый, грязный, пузырек с ядом - это повредит сюжету? Они действительно долждны быть совершенно одинаковыми?
2. Пусть игрок догадается чем и как их пометить и это будет пазл, иначе их можно случайным образом путать друг с другом...
Дать ему алмаз или маркер... пусть рисует на пузырьках череп и кости...
Неужели так трудно запомнить: спирт в пузырьке из под микстуры от кашля с надписью "яд"!!!
Не хотелось бы делать разноцветные пузырьки, хотелось бы чтобы игрок думал что в новом пузырьке такой же точно яд, и продолжал его использовать (с на удивление другим эффектом), мог специально подменить их (хотя другие персонажи могут и не отличать зеленый пузырек от лилового) или спутать.
С точки же зрения громоздкости, для игрока разницы между "синим пузырьком" и "вторым пузырьком" вроде нету никакой.
Потому наверное лучше менять названия динамически - сначала когда игрок зашел в комнату/нашел пузырек, и второй раз потом, когда проидентифицировал.
А вот маркер это идея.
И
"Я могу случайно перепутать пузырьки, так что лучше пока его не брать."
Тоже классно.
Неактивен
Дописал пример с динамической нумерацией. Пузырьки нумеруются по ходу появления в кадре, при старте игры они абсолютно одинаковы и называются просто "пузырек" без свойства adjective.
Код и .gam в приложенном файле.
Когда игрок видит объект (то есть выполняется метод vdesc), вызывается метод det (определить), который указывает, как надо перечислять предметы.
В нем используется объект enumerator (перечислитель), в котором хранятся необходимые данные и метод, изменяющий лексические данные объекта/
Если метод vdesc не вызывается автоматически (например, предмет не isListed), нужно вызывать det вручную, например, при входе в комнату с пузырьком.
P.S. Сорри, что не указаны проходы. Три локации, из текущей на восток и снова на восток.
Скачать
Отредактировано Hind (06.12.2007 22:19)
Неактивен
GrAndrey написал:
uux написал:
Эту конструкцию ГрАнд специально придумал для случаев, когда определяющее существительное в родительном падеже следует за определяемым (конструкции вида "дверь гаража", которая будет заменена на "дверь of гаража"). Поэтому тут-то как раз никаких предлогов (с точки зрения русского человека, а не TADS;) не требуется. Больше такое представление, насколько я понимаю, нигде не используется.
To GrAnd: Андрей, поправь меня, если я ошибаюсь.Совершенно верно. ТАДС по умолчанию ожидает увидеть определяемое существительное после прилагательного, и делает исключение лишь при наличии предлога 'of'. В русском языке на его месте могут быть самые разные предлоги, что задается в specialWords строкой 'of'='для'='против'='типа'='из'='под'='от'='на'='в'='с'. Но предлога может не быть, так как он будет "заложен" в родительном падеже определения. Для этих случаев создается дополнительная лексема прилагательного с меткой #r. Предпарсер переделывает такие конструкции к виду "существительное для прилагательное" К сожалению, парсер все предлоги приводит к одному коду, и может вернуть только 'of'. Уж коль пошла такая пьянка, то можно сохранть предлоги для дальнейшего использования, ...
Пришел в голову обходной путь. Поскольку предлоги "из", "под", "от" и т. д. (а) и сами по себе встречаются в играх довольно редко, и (б) еще реже может возникнуть вариант, когда одному и тому же объекту соответствует сразу несколько таких предлогов, можно ввести для объекта специальное свойство, содержащее этот предлог-связку, например:
Letter: item noun='письмо' adjective='военкомата' predlog='из' sdesc="письмо из военкомата" ; Groove: fixeditem noun='канава' adjective='забором' predlog='под' sdesc="канава под забором" ; Clock: item noun='часы' adjective='брата' 'брата#r' sdesc="часы брата" predlog='' ;
и при запросе игроку вместо "of" подставлять свойство predlog.
GrAndrey написал:
но у меня уже голова идет кругом от последних программерских изысков
Да уж, активность на нашем форуме, какой давно уже не наблюдалось - практически со времен Гоуту Неубиваемого;).
Отредактировано uux (07.12.2007 01:08)
Неактивен