Вот начал писать игру к конкурсу. Возник следующий вопрос, в мануале не отраженный совсем.
Есть объект подвешенный на определенной высоте - unreachable. Есть предмет с помощью которого объект можно сбить.
В итоге когда для метательного объекта прописывается глагол для сбивания объекта (doDrop (actor, inPrep, io)), интерперетатор пишет, что до объекта опять же не добраться. Как заставить реагировать объект? Конечно, возможно определить два состояния для объекта, но чувствую (и в коде это отражено), что стандартные средства есть соответсвующие просто я не знаю как их включить.
Вообще считаю вопросы связанные с reachable и unreachable объектами должны быть как-то отражены в мануале. А то система очень уж путанная. Я уж не говорю о путанице связанной с тем когда объекты видны, но недосягаемы и когда объекты не видны и не досягаемы.
Неактивен
- VampirE - написал:
Вот начал писать игру к конкурсу. Возник следующий вопрос, в мануале не отраженный совсем.
Есть объект подвешенный на определенной высоте - unreachable. Есть предмет с помощью которого объект можно сбить.
В итоге когда для метательного объекта прописывается глагол для сбивания объекта (doDrop (actor, inPrep, io)), интерперетатор пишет, что до объекта опять же не добраться. Как заставить реагировать объект? Конечно, возможно определить два состояния для объекта, но чувствую (и в коде это отражено), что стандартные средства есть соответсвующие просто я не знаю как их включить.
Вообще считаю вопросы связанные с 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 ""стандартные определения для игр", хотя, возможно, действительно несколько непоследовательно и недостаточно полно.
Неактивен
Да, еще вот "переспал" с идеей про reachable/unreachable объекты и понял вот что: в принципе, глубоко лезть в дебри reachable/unreachable имеет смысл только в том слуае, если данная концепция используется в игре повсеместно (т. е., скажем, каждый второй объект будет виден, но недоступен, и при этом для каждого такого объекта будет на то своя причина). Если же таких объектов - один-два на всю игру, проще реализовать это "локальными" методами (ну, по типу того, как описано в моем предыдущем посте).
Правда, конечно же, это мое ИМХО и мой стиль программирования...
Неактивен
uux написал:
Правда, конечно же, это мое ИМХО и мой стиль программирования...
Однако, изящно!
Отредактировано Korwin (28.05.2007 06:09)
Неактивен
Лично мой метод в подобных случаях - искать выводимое сообщение в тексте основной библиотеки. Изучить, что за функция её вызывает, какая функция вызывает эту, и, либо изменить код, либо дополнительно пройтись дебаггером. Последний вообще позволяет изучить на примере полный цикл парсинга. Правда, мой предпарсинг сильно его удлинняет, поэтому советую его проскакивать с помощью брекпоинта.
Неактивен
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 в описании глагола это спряжение его, да?
Неактивен
Мне кажется, дело в путанице с 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)
Неактивен
- VampirE - написал:
2 uux
Спасибо за код, разобрался. Но тут опять проблема. Создал глагол "сбивать":
sbitVerb: deepverb
verb = 'сбить' 'сбей' 'снести' 'сноси'
vopr = "Что "
sdesc = "сбить"
prepDefault = withPrep
ioAction(withPrep) = 'SbitWith'
;
PS type в описании глагола это спряжение его, да?
Елки-моталки, вот так вот допустишь неточность (да что там "скромничать" - ошибку aka ляп в переводе), а она тебя потом, через несколько лет, догонит;).
Сейчас блин повозился с дебаггером и выяснил: type для глагола - это не его спряжение, а (как там оно у филологов правильно называется? его управление. Насколько я смог вспомнить, type=1 означает, что глагол использует для косвенного объекта творительный падеж ("сбить грушу камнем"), type=2 - дательный падеж "дать грушу другу", а type=3 означает возможность использования как творительного, так и дательного падежа. type=0 (значение по умолчанию), соответственно, означает, что ни один из этих падежей не используется.
В мануале совершенно не по делу написано, что type - это спряжение. Меня сбило с панталыку то, одна из функций-формирователей окончаний использует одноименный аргумент в качестве флага для формирования окончания глагола.
В Вашем примере, уважаемый VampirE, для sbitVerb достаточно определить type=1, и будет Вам счастье;).
Еще раз приношу извинения за неточность в мануале. При следующем обновлении мануала обязательно исправлю.
Неактивен
Ну наконец-то.
Про спряжение глагола я тоже подумал из-за функции форматирования. И заметил, что типа аж четыре. А в функции форматирования фигурирует только type = 1. Так что сомнения определенные были.
А мануалы я читаю крайне невнимательно. Прошу простить, если что не так. Уж такой я человек.
За ТАДС серьезно сел недавно только, а мануал читать уже сил нет.
Еще раз всем спасибо.
2 uux
Нужно будет эту выноску про типы и падежи в мануал добавить, а то вот такие трудновылавливаемые штуки вылезают.
Неактивен