у мну тут весьма специфическая трабла...Мне позарез нужен актер, но опять-таки: то, что написал сам не пашет...
Ситуация:
Актер находится перед закрытой дверью...пока игрок не найдет способ открыть ее, мне надо, чтобы актер как-бы совершал попытки сломать дверь, при этом у него ничего не должно получаться( неплохо было бы сделать, чтобы сообщения выводились независимо от местанахождения игрока )...затем актер должен пройти внутрь, упасть там в обморок( ну соотсветсвенно с ним ни разговаривать ниче сделать низя) и выронил предмет...все...
Неактивен
masterofshadows написал:
у мну тут весьма специфическая трабла...Мне позарез нужен актер, но опять-таки: то, что написал сам не пашет...
Ситуация:
Актер находится перед закрытой дверью...пока игрок не найдет способ открыть ее, мне надо, чтобы актер как-бы совершал попытки сломать дверь, при этом у него ничего не должно получаться( неплохо было бы сделать, чтобы сообщения выводились независимо от местанахождения игрока )...затем актер должен пройти внутрь, упасть там в обморок( ну соотсветсвенно с ним ни разговаривать ниче сделать низя) и выронил предмет...все...
Приношу извинения за неоперативность ответа, но теперь наконец-то цепочка событий, не пускавшая меня на форум, если и не завершилась, то хотя бы временно прервалась. Вот мой вариант (в строгом соответствии с ТЗ спрашивавшего;):
Lady1: Actor
// Девушка, ломящаяся в дверь
sdesc="девушка"
ldesc="Если бы ты встретился с такой девушкой в иной обстановке - на вечеринке, спектакле или хотя бы в электричке -
ты бы обязательно попытался познакомиться с ней поближе. Однако сейчас она с такой целеустремленностью
и остервенением ломится в запертую дверь почты, не видя никого и ничего вокруг, что ты понимаешь -
лучше к ней не соваться."
// Запрещаем разговаривать с дамой
verDoAskAbout(actor, iobj)={"Пытаться начать праздный разговор с женщиной в таком состоянии означает как
минимум нарваться на грубость.";}
// Точно также можно определить verDoTellAbout, а также actorAction (с exit), чтобы пресечь все попытки
// коммуникации;)
actorDesc={"";} // Чтобы персонаж не отображался в описании комнаты - эту работу возьмет на себя демон
Lady1Daemon={if(parserGetMe().location=self.location) // Сообщения для случая, когда главный герой в
// одной комнате с девушкой
{switch(rand(5))
{case 1: "Девушка рвет на себя ручку двери, бормоча, \"и надо же было забыть его на работе...\"";
break;
case 2: "\"Сейчас прорвемся,\" выдыхает девушка и бросается на дверь всем своим хрупким телом,
пытаясь выбить ее. На дверь это не производит ровным счетом никакого впечатления.";
break;
// Ну, и так далее - случайные сообщения
}
}
else // Сообщения для случая, когда главный герой - в другой комнате (не видит девушку)
{switch(rand(5))
{case 1: "Со стороны почты доносятся глухие удары и чертыхание - никак не оставит девушка
своих попыток!";
break;
// И т. д., и т. п.
}
}
}
; // Конец определения девушки
// Нижеследующий кусок кода, по задумке, вставляется в метод/функцию, отвечающий за открывание двери.
// (Про то, как именно будет реализовано открывание двери, Мастер не спрашивал;).)
//
{"Видя, что ты собираешься открыть дверь, девушка отходит в сторону, нервно пританцовывая на месте со
взглядом, полным надежд и сомнений. Как только дверь распахивается, она тенью проносится мимо тебя
внутрь. Ты слышишь какой-то шелест, затем сдавленный вскрик: \"А! И здесь его нет!\", и глухой шлепок,
после чего наконец наступает тишина.";
unnotify(Lady1, &LadyDaemon); // Отключаем сообщения о попытках сломать дверь
Lady1.moveInto(nil); // Заменяем ломящуюся девушку...
Lady2.moveInto(PostOffice); // ...на девушку в обмороке (PostOffice - это помещение,
// куда ведет запертая дверь)
;
// Объект "девушка в обмороке"
Lady2: Actor
Examined=nil // Флаг, показывающий, осматривал ли игрок девушку или нет
ldesc={"Давешняя девушка лежит посреди комнаты. Похоже, она в глубоком обмороке.";
if(not self.Examined)
{// При первом осмотре находим предмет, который выронила девушка при падении
//
"Рядом с телом девушки ты замечаешь мобильный телефон, который она, должно быть,
выронила при падении.";
MobilePhone.moveInto(PostOffice);
// Устанавливаем флаг, чтобы не находить мобильный телефон при каждом осмотре
// девушки
self.Examined:=true;
}
}
actorDesc="Посреди комнаты неподвижно лежит девушка."
;Замечу, что инициировать демона необходимо командой notify, как показано у ГрАнда.
Кроме того, если игрок не может попасть в запертое здание почты каким-либо иным путем, кроме как открыв дверь, то перемещать объект Lady2 в общем-то не нужно, достаточно сразу определить его со свойством
location=PostOffice. Это исключительно дело личного вкуса и предпочтений программиста;).
Отредактировано uux (01.08.2007 07:25)
Неактивен
masterofshadows написал:
О тогда пока вы все расщедрились и охотно помогаете... не подскажете ли как убрать стандартное сообщение о нахождении прежмета в контейнере или в комнате ( ну открываешь шкаф а тадс сам пишет, что ты нашел в нем то и то)...
Сейчас подробно разбирать нет времени. Можно попробовать так:
MyContainer: openable, qcontainer
ldesc =
{
ZAG(self,&sdesc); " ";
if (self.isopen)
{
" открыт"; yao(self); ". ";
pass ldesc;
}
else
{
" закрыт"; yao(self); ". ";
}
// В стандартном openable далее идет опись содержимого, мы ее выкидываем
}
isopen = true
verDoOpen(actor) =
{
if (self.isopen)
{
ZAG(self,&sdesc); " уже открыт"; yao(self); "! ";
}
}
doOpen(actor) =
{"Ты открываешь <<self.sdesc>>.";
// Опять-таки, перечисление содержимого выкинуто
}
// qcontainer - это контейнер, "не разглашающий" свое содержимое в описании локации
// Вроде бы при таком раскладе содержимое можно будет увидеть только по команде "заглянуть в"/"обыскать", но лучше проверить самомуmasterofshadows написал:
так же мну раздражает, что когда находишь "спрятанную " вещь она автоматом берется...
О! Это совсем просто: определяешь объект как потомка одного из классов hider и назначаешь ему свойство autoTake =nil.
Но хочу предостеречь: эксперимент, поставленный мной на игроках (правда, англоязычных), показал, что большинство из них раздражается как раз тогда, когда найденный объект не перемещается автоматически в инвентарь
.
Неактивен
GrAndrey написал:
masterofshadows написал:
У мну проблемы с обыском "актера без сознания". Я последовал совету uux-а и при открытии дверей просто заменил актера на "актера без сознания", но в игре при вводе скажем:
- осм актера без сознания
мне выдает, что не знает слова "без". Я пробовал перефразировать, но бесполезно...
=====
И еще маленький вопрос - мот кто знает есть ли в стандартной библиотеке "SitDown" или же самому определять надо?1. Нужно добавить предлог-связку в специальные слова.
specialWords
'of'='для'='против'='типа'='из'='под'='от'='на'='в'='с' ='без' ,
... или определить
compoundWord 'без' 'сознания' 'безсознания';
И определить для актера
UnconsciousActor: Actor
noun='актер'
adjective='безсознания' 'безсознания#r'
;
Неактивен
masterofshadows написал:
Вот я и вернулся! Отдохнувший и веселый, с новыми вопросами... Точнее пока с одним вопросом, касающимся изменения окончания существительного. В мануале есть немного на эту тему, но подделать под свой случай я так и не смог.
Все просто:
1. Есть спрятанная книга.
2. Когда ее обнаруживаешь, то получается примерно так:
- Ты нашел книга и взял ее...
понятно, что фраза должна выглядеть : - ты нашел книгу и взял ее.
Как такого добиться я не врубаю...
А это, похоже, небольшой глючок перевода системных библиотек. В файле advr.t найди класс hider, в нем - метод searchObj, а в этом методе - следующие строчки:
/* note what we found, and move it to destination */
"<<ZAG(parserGetMe(),&sdesc)>> наш<<ella(actor)>> ";
tot := length(found);
i := 1;
while (i <= tot)
{
found[i].sdesc;Замени found[i].sdesc; на found[i].vdesc;, и наступит счастье;).
Небольшой офф-топик: мне чего-то пришло в голову, что мое объяснение сильно напоминает русскую народную сказку про Кащея Бессмертного: найди остров, на нем дуб, на дубе сундук и т. д.
Неактивен
masterofshadows написал:
Проблема мешает мне писать дальше игру и ваще выводит из себя...
<SNIP>
==============================
вот такой ужас...или у мну как всегда что-то с руками
Мастер, в дополнение к действительно исчерпывающему объяснению ГрАнда, хочу сделать (надеюсь, обнадеживающее) замечание общего характера: с руками у тебя все в порядке;). Просто такого рода опечатки (забытые завершающие кавычки/апостроф) - это, по моим наблюдениям, наиболее распространенная ошибка при программировании в TADS. Особенно часто она встречается при задании многочисленных лексических свойств. По степени неприятности с ней может соперничать, пожалуй, только забытая закрывающая фигурная скобка;).
Меня самого такого рода ошибки компиляции в начальных и не очень стадиях освоения TADS доводили до белого каления, заставляя практически биться головой о монитор и проклинать долбаный компилятор. Что характерно - компилятор всегда оказывался прав;). Когда счет таких случаев перевалил где-то за пятый десяток, я стал относиться к подобным ситуациям философски (опечатки будут встречаться всегда, пока программером будет оставаться человек) и даже выработал свои методы их выявления.
Итак, если интересно, то я борюсь с этим так. Всегда добавляю новый код сравнительно небольшими порциями (максимум - один объект) и перекомпилирую игру. Если вылезает подобная непонятная ошибка, которую при беглом взгляде на код выявить зачастую сложно, начинаю выкомменчивть "спорный" код символами /**/ мелкими участками (по две-три строки) до тех пор, пока ошибка при компиляции не исчезнет. Место, после выкомменчивания которого ошибка пропадает, просматриваю с пристрастием, если нужно (и возможно), разбиваю его комментами на еще более мелкие куски. И так до выявления ошибки.
(Правда, я и отлаживаю код таким же образом - после добавления максимум одного объекта/локации, но это, сознаюсь, на любителя, другой стиль программирования может предполагать и другие подходы к работе в этом плане).
Отредактировано uux (16.09.2007 22:30)
Неактивен
Gremour написал:
Можно использовать IDE с подсветкой синтаксиса. Забытые кавычки будет сразу видно. Я использую Imaginate.
Да, это тоже отличный способ, хотя, наверное, не панацея. Я об этом не подумал - просто слишком уж прикипел душой не к "Блокноту" даже, а к edit'у (хорошо, что не к edlin'у).
Эх... пора менять привычки
Неактивен
masterofshadows написал:
спс за действенные советы...уже сча они позволили хотя бы в половину ускорить процесс нахождения багов, хотя лично мне очень нравился старый способ - в строке и в прилегающих строках ( ха сча сдам хломидамонада, который мне етот способ показал) , изменять, удалять все что под руку попадется, пока не исчезнет ошибка=)
Ну, это разновидность моего подхода... Хотя выкомменчивать всяко эффективнее, чем удалять - не потребуется потом заново вводить то, что потер.
Неактивен
Xlomid[оманад] написал:
А как же многократный undo, без которого жизнь стала бы куда тяжелее?.. ))
А в моем любимом edit'е его нет. Не, точно, блин, пора менять привычки;).
Неактивен
masterofshadows написал:
Вот я и вернулся!...долго меня не было - все учеба проклятая!...и сразу небольшое дополнение насчет актеров...Как мона реализовать актера, который при определенном условии ( скажем наличии предмета в инвентаре итп )...имеет в этом случае новую тему для диалога..после которого перемещается в другую комнату и не желает с тобой разговаривать пока ты не совершишь опр действие или не принесешь другой предмет...фух ..надеюсь более-менее понятно объяснилю
В качестве ответа приведу вымышленный фрагмент игры с капитаном Жегловым в главной роли и Груздевым в качестве NPCя. Первый предмет, о котором будем спрашивать - орудие убийства - именной пистолет Груздева. Второй (который надо принести, чтобы актер соблаговолил вновь с тобой заговорить) - ордер на арест. Заранее прошу прощения у людей, помнящих сериал "Место встречи изменить нельзя" наизусть, а также у поборников исторической достоверности - я не помню в деталях, как развивалась эта сцена в фильме, и у меня нет уверенности, что ордер на арест выписывается в канцелярии, а в 2 часа ночи мОзги уже почти не работают.
Grusdev: actor
noun='груздев'
sdesc="Груздев"
location=ThisRoom
GunAsked=nil // Флаг, показывающий, спрашивали ли Груздева про пистолет
// В стандартной библиотеке RTADS ответы персонажей выбираются в зависимости от конкретного слова,
// которое использовал игрок, а не от объекта; такой подход позволяет избежать путаницы, когда
// в игре имеется много объектов с одинаковыми или пересекащимися лексическими свойствами
// (например, несколько домов, машин и т. д.). Однако в данном случае я предлагаю выбор ответов
// все-таки в зависимости от объекта - просто потому, что на первых порах он проще и нагляднее.
doAskAbout(actor, iobj)={if(not self.GunAsked)
{// Еще не спрашивали про пистолет; персонаж готов общаться
switch(iobj)
{case Gun: if(actor.isCarrying(Gun))
{// Оружие у нас; можем задать вопрос
"Ты достаешь из кармана пистолет и суешь Груздеву под нос.
\"Из этого оружия была убита Лариса Груздева. Узнаете?\"\n
Груздев вскакивает, с ужасом (вероятнее всего, притворным)
глядя на револьвер. \"Откуда это у вас? Этого не может быть!\"
кричит он почти в истерике и бросается в другую комнату.";
// Устанавливаем флаг, показывающий, что про пистолет уже
// спрашивали
self.GunAsked:=true;
// Перемещаем Груздева в другую комнату
self.moveInto(OtherRoom);
}
else
{// Пистолета у нас нет; блокируем вопрос
"Тебе не терпится спросить у Груздева про орудие убийства, но
ты сдерживаешься: для пущего эффекта надо бы дождаться
результатов баллистической экспертизы, которые должны вот-вот
поступить.";
}
break;
default: "\"Товарищ Жеглов, какое это имеет отношение к убийству моей жены?\"";
break;
}
}
else
{// Уже спрашивали про пистолет; блокируем общение с Груздевым, пока не
// получим ордер на его арест
if(not actor.isCarrying(Order_Na_Arest))
{"На твой взгляд, реакция Груздева на то, что Лариса была убита из его
пистолета, вполне доказывает его вину. Теперь ты будешь допрашивать его
как подозреваемого - вот только сначала надо послать Шарапова в канцелярию
за ордером на арест.";
}
else
{// Ордер у нас; появляются новые темы для разговора (добавить по вкусу)
switch(iobj)
{case Gun: ...
// и т. д.
}
}
}
}
;Отредактировано uux (09.11.2007 01:59)
Неактивен
masterofshadows написал:
Хмм...что-то я запутался...Как заставить спросить у актера про место, в котором находишься?...И ваще мона пжлста хотя б маленький пример диалога?... а то торможу...
Хмммм... про место, в котором находишься, видимо, лучше действительно спрашивать, используя менюшную систему. "Спросить Васю о месте, в котором находишься" - задолюаешься реализовывать парсерными средствами, даже если ты опытный автор, да и мало кто из игроков догадается ввести именно такую команду.
К сожалению, как и Gremour, библиотекой менюшных диалогов я никогда не пользовался. ГрАнд, вся надежда на тебя!![]()
Неактивен
- VampirE - написал:
masterofshadows написал:
Хмм...что-то я запутался...Как заставить спросить у актера про место, в котором находишься?...И ваще мона пжлста хотя б маленький пример диалога?... а то торможу...
ИМХО проще всего присвоить локации какое-то имя, которое будут отображаться в статусной строке, а потом реализовать предмет класса thing с таким же названием.
ИМХО в рамках диалоговой системы "спросить про/рассказать про" это все равно будет, мягко говоря, неинтуитивно. Как раз тот случай когда меню имеет преимущество перед парсером.
Неактивен
masterofshadows написал:
я всего-то навсего хотел спросить как можно технически реализовать вопрос, адресованный актеру, касающийся не объекта итп а локации или местности...А также потом еще спросил как реализовать диалог можно..т.е. у мну был не адин замороченный вопрос..а два отдельных...если слишком пространственно выразился тогда и сейчас..извиняюсь=)
Не совсем понятно со вторым вопросом, про пример диалога. Конкретнее, что нужно? Транскрипт диалога? Пример реализации диалога при парсерном общении (спросить о/рассказать о) - а чем в таком случае не устраивает пример про Жеглова с Груздевым? Или пример реализации менюшного диалога?
Отредактировано uux (24.11.2007 09:08)
Неактивен