Вот начал писать игру к конкурсу. Возник следующий вопрос, в мануале не отраженный совсем.
Есть объект подвешенный на определенной высоте - 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 имеет смысл только в том слуае, если данная концепция используется в игре повсеместно (т. е., скажем, каждый второй объект будет виден, но недоступен, и при этом для каждого такого объекта будет на то своя причина). Если же таких объектов - один-два на всю игру, проще реализовать это "локальными" методами (ну, по типу того, как описано в моем предыдущем посте).
Правда, конечно же, это мое ИМХО и мой стиль программирования...
Неактивен
- 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, и будет Вам счастье;).
Еще раз приношу извинения за неточность в мануале. При следующем обновлении мануала обязательно исправлю.
Неактивен