Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

0    0    #1
27.05.2007 15:45

- VampirE -
Участник (+3)
Зарегистрирован: 22.06.2006
Сообщений: 101

Reachable и unreachable объекты

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

Есть объект подвешенный на определенной высоте - unreachable. Есть предмет с помощью которого объект можно сбить.

В итоге когда для метательного объекта прописывается глагол для сбивания объекта (doDrop (actor, inPrep, io)), интерперетатор пишет, что до объекта опять же не добраться. Как заставить реагировать объект? Конечно, возможно определить два состояния для объекта, но чувствую (и в коде это отражено), что стандартные средства есть соответсвующие просто я не знаю как их включить. smile

Вообще считаю вопросы связанные с reachable и unreachable объектами должны быть как-то отражены в мануале. А то система очень уж путанная. Я уж не говорю о путанице связанной с тем когда объекты видны, но недосягаемы и когда объекты не видны и не досягаемы.

Неактивен

0    0    #2
27.05.2007 18:32

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Reachable и unreachable объекты

- VampirE - написал:

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

Есть объект подвешенный на определенной высоте - unreachable. Есть предмет с помощью которого объект можно сбить.

В итоге когда для метательного объекта прописывается глагол для сбивания объекта (doDrop (actor, inPrep, io)), интерперетатор пишет, что до объекта опять же не добраться. Как заставить реагировать объект? Конечно, возможно определить два состояния для объекта, но чувствую (и в коде это отражено), что стандартные средства есть соответсвующие просто я не знаю как их включить. smile

Вообще считаю вопросы связанные с reachable и unreachable объектами должны быть как-то отражены в мануале. А то система очень уж путанная. Я уж не говорю о путанице связанной с тем когда объекты видны, но недосягаемы и когда объекты не видны и не досягаемы.

Хорошо бы, конечно, увидеть непосредственно код - было бы проще помочь.

Можно обратить внимание на метод validIo/validDo для данного глагола.

Я бы реализовал это примерно вот так:

Grusha: item
sdesc="груша"
Hanging=true
// Эти два определения позволяют "отсечь" большинство возможных глаголов:
dobjGen(actor, verb, iobj, prep)={if(self.Hanging)
                                                    {Груша висит слишком высоко.";
                                                      exit;
                                                    }
                                                 }
iobjGen(actor, verb, iobj, prep)={if(self.Hanging)
                                                    {Груша висит слишком высоко.";
                                                      exit;
                                                    }
                                                 }
// Далее определяем методы для тех глаголов, которые должны работать в том числе
// и для висящей груши: например, verDoInspect (осмотреть), verIoAskAbout (спросить о
// груше), verIoTellAbout (рассказать о груше) и т. п.; в том числе и для глагола, чтобы
// сбить объект ("бросить палку в грушу"):
verIoThrowAt(actor)={}
ioThrowAt(actor, dobj)={if(not self.Hanging)
                                      {"Ты уже благополучно сбил грушу.";
                                      }
                                    else
                                      {if(dobj<>Palka)
                                          {"Этим грушу не сбить.";
                                          }
                                       else
                                          {"Прицелившись, ты швыряешь палку. Сбитая груша 
                                             смачно плюхается в траву под деревом.";
                                            self.Hanging:=nil;
                                          }
                                      }
                                   }
;

Про dobjGen/iobjGen можно почитать в разделе "Последовательность синтаксического анализа". reachable/unreachable отражено там же, а также в Приложении B ""стандартные определения для игр", хотя, возможно, действительно несколько непоследовательно и недостаточно полно.

Неактивен

0    0    #3
28.05.2007 05:36

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Reachable и unreachable объекты

Да, еще вот "переспал" с идеей про reachable/unreachable объекты и понял вот что: в принципе, глубоко лезть в дебри reachable/unreachable имеет смысл только в том слуае, если данная концепция используется в игре повсеместно (т. е., скажем, каждый второй объект будет виден, но недоступен, и при этом для каждого такого объекта будет на то своя причина). Если же таких объектов - один-два на всю игру, проще реализовать это "локальными" методами (ну, по типу того, как описано в моем предыдущем посте).

Правда, конечно же, это мое ИМХО и мой стиль программирования...

Неактивен

0    0    #4
28.05.2007 06:08

Korwin
Гоблин, зеленый от недосыпа (+188, -16)
Откуда: Екатеринбург
Зарегистрирован: 27.11.2007
Сообщений: 795
Вебсайт

У трав, растущих на мягкой земле - слабые корни. (с)Korwin

Re: Reachable и unreachable объекты

uux написал:

Правда, конечно же, это мое ИМХО и мой стиль программирования...

Однако, изящно!

Отредактировано Korwin (28.05.2007 06:09)

Неактивен

0    0    #5
28.05.2007 13:35

GrAndrey
папа RTADS и Бяка (+49, -2)
Откуда: Москва
Зарегистрирован: 15.09.2002
Сообщений: 1198
Вебсайт

меньше слов

Re: Reachable и unreachable объекты

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

Неактивен

0    0    #6
28.05.2007 14:06

- VampirE -
Участник (+3)
Зарегистрирован: 22.06.2006
Сообщений: 101

Re: Reachable и unreachable объекты

2 uux

Спасибо за код, разобрался. Но тут опять проблема. Создал глагол "сбивать":

sbitVerb: deepverb
    verb = 'сбить' 'сбей' 'снести' 'сноси'
    vopr = "Что "
    sdesc = "сбить"
    prepDefault = withPrep
    ioAction(withPrep) = 'SbitWith'
;

Прописал объекту, который сбивает:

kamen : item, unlisteditem
    location = startroom
    sdesc = "камень"

    doThrowAt(actor, io) = {
                    if (io = o1 || io = o2)
                             self.beatMet;       
                           }
    ioThrowAt(actor,io) =
                           {
                               self.doThrowAt(actor,io);
                           }
    doSbitWith(actor, io) =
                           {
                               self.doThrowAt(actor,io);
                           }
    ioSbitWith(actor,io) =
                           {
                               self.doThrowAt(actor,io);
                           }
    beatMet = {
               
           "\tСобытие.";
                                  
              }
    isHim = true
;

При использовании глагола метнуть - все работает. Однако, при использовании свежесозданного глагола "сбить" ругается: "Я не понимаю это предложение." или "Я не знаю как сбить это.". Все перепробывал, присваивал этот метод и другим предметам, по отношению к которым применяется действие - никак.

PS type в описании глагола это спряжение его, да? smile

Неактивен

0    0    #7
28.05.2007 19:48

Gremour
Участник (+1)
Откуда: Беларусь
Зарегистрирован: 09.11.2004
Сообщений: 234

Re: Reachable и unreachable объекты

Мне кажется, дело в путанице с IoVerb и DoVerb в твоём коде.

Глагол "сбить грушу камнем" подразумевает прямой объект do = груша, а косвенный io = камень

Итого, в базовом классе у тебя должно быть (модифицируем базовый класс всех объектов, чтобы он отвечал на воздействие новым глаголом):

Код:

modify thing:
    verIoSbitWith(actor) = // !! Верификатор Io не имеет второго параметра -- особенности парсера!!
    {
        "<<ZAG(self, &sdesc)>> не подходит для этого. "; // все, чем нельзя сбивать "Стол не подходит для этого."
    }
    verDoSbitWith(actor, iobj) =
    {
        "<<ZAG(self, &vdesc)>> бессмысленно сбивать. "; // все, что нельзя сбивать "Дерево бессмысленно сбивать."
    }
;

Теперь в классах "камень" и "груша" эти верификаторы надо занулить соответственно, и добавить обработчики действия:

Код:

kamen: item
    verIoSbitWith (actor) = {}
    ioSbitWith (actor, dobj) = 
    { 
        if (dobj = grusha)  
            ; // -- сбили 
        else            
            ; // -- если есть объекты с зануленным 
              //    верификатором verDoSbitWith кроме груши
    }
;

grusha: item
    verDoSbitWith(actor, iobj) = {}
;

Вообще, перечитай манул, главу 4. С этими косвенными объектами такой конфуз... Должно быть 3 функции на глагол с 2мя объектами типа твоего:

  verIoГлагол(actor) = { ... }
  verDoГлагол(actor, iobj) = { ...}
  ioГлагол(actor, dobj) = { ... }

Отредактировано Gremour (28.05.2007 19:59)

Неактивен

0    0    #8
28.05.2007 21:00

uux
Участник (+884, -80)
Откуда: Москва
Зарегистрирован: 02.12.2006
Сообщений: 1624

Re: Reachable и unreachable объекты

- VampirE - написал:

2 uux

Спасибо за код, разобрался. Но тут опять проблема. Создал глагол "сбивать":

sbitVerb: deepverb
    verb = 'сбить' 'сбей' 'снести' 'сноси'
    vopr = "Что "
    sdesc = "сбить"
    prepDefault = withPrep
    ioAction(withPrep) = 'SbitWith'
;

PS type в описании глагола это спряжение его, да? smile

Елки-моталки, вот так вот допустишь неточность (да что там "скромничать" - ошибку aka ляп в переводе), а она тебя потом, через несколько лет, догонит;).

Сейчас блин повозился с дебаггером и выяснил: type для глагола - это не его спряжение, а (как там оно у филологов правильно называется?wink его управление. Насколько я смог вспомнить, type=1 означает, что глагол использует для косвенного объекта творительный падеж ("сбить грушу камнем"), type=2 - дательный падеж "дать грушу другу", а type=3 означает возможность использования как творительного, так и дательного падежа. type=0 (значение по умолчанию), соответственно, означает, что ни один из этих падежей не используется.

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

В Вашем примере, уважаемый VampirE, для sbitVerb достаточно определить type=1, и будет Вам счастье;).

Еще раз приношу извинения за неточность в мануале. При следующем обновлении мануала обязательно исправлю.

Неактивен

0    0    #9
28.05.2007 21:25

- VampirE -
Участник (+3)
Зарегистрирован: 22.06.2006
Сообщений: 101

Re: Reachable и unreachable объекты

Ну наконец-то. smile

Про спряжение глагола я тоже подумал из-за функции форматирования. И заметил, что типа аж четыре. А в функции форматирования фигурирует только type = 1. Так что сомнения определенные были.

А мануалы я читаю крайне невнимательно. Прошу простить, если что не так. Уж такой я человек. smile

За ТАДС серьезно сел недавно только, а мануал читать уже сил нет. smile

Еще раз всем спасибо.

2 uux

Нужно будет эту выноску про типы и падежи в мануал добавить, а то вот такие трудновылавливаемые штуки вылезают. wink

Неактивен

Powered by PunBB
© copyright 2001–2024 iFiction.Ru