Ну, это разновидность моего подхода... Хотя выкомменчивать всяко эффективнее, чем удалять - не потребуется потом заново вводить то, что потер.
А как же многократный undo, без которого жизнь стала бы куда тяжелее?.. )) Я вообще обычно предпочитаю логику, хотя по причине гуманитарных склонностей и не очень с ней дружу. К способу, который так понравился Мастеру, прибегаю только в совершенно безнадежных случаях или когда меня вынуждают искать баг в коде на незнакомом мне языке (ТАДС, например).
Неактивен
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)
Неактивен
Хмм...что-то я запутался...Как заставить спросить у актера про место, в котором находишься?...И ваще мона пжлста хотя б маленький пример диалога?... а то торможу...
Неактивен
Диалоги можно сделать двумя принципиально разными способами:
1) Меню с предконструированными частями разговора;
2) Задать обработчики действий "спросить о" и "рассказать о" для набора предметов (которые могут фигурировать в качестве темы разговора).
Для реализации первого способа есть библиотека "меню" для TADS (http://rtads.org), которой я, впрочем ещё не пользовался. При желании, можно написать самому.
Если пользуешься вторым способом, чтобы не нарушать билль о правах игрока, не стоит привязывать к диалогам, которые инициирует сам игрок, критические для прохождения события. К тому же, по хорошему, темы разговора должны быть логичными и приходить на ум сами собой.
Неактивен
masterofshadows написал:
Хмм...что-то я запутался...Как заставить спросить у актера про место, в котором находишься?...И ваще мона пжлста хотя б маленький пример диалога?... а то торможу...
Хмммм... про место, в котором находишься, видимо, лучше действительно спрашивать, используя менюшную систему. "Спросить Васю о месте, в котором находишься" - задолюаешься реализовывать парсерными средствами, даже если ты опытный автор, да и мало кто из игроков догадается ввести именно такую команду.
К сожалению, как и Gremour, библиотекой менюшных диалогов я никогда не пользовался. ГрАнд, вся надежда на тебя!
Неактивен
Вопрос не совсем конкретный.
В прямом виде спрашивать о месте где находишься (вась, скажи, а где я нахожусь?), нельзя в силу ограничений парсера и ожиданий игрока от него. Но можно и нужно, чтобы персонаж отвечал на вопросы о названии локации или её характерных особенностях. В ответе прописать описания для случая когда игрок в локации, и вовне.
Неактивен
Хмм...А будут ли такие переходы из парсера в меню адекватно влиять на играбельность, геймплей и на общий вид игры? Или тут смотря как сделаешь?
Неактивен
Сделай переход в режим меню по команде "(по)говорить с". Не забудь упомянуть о таком способе общения с актёрами в хелпе (по команде "помощь"). В некоторых местах можно переходить автоматически (если актёр сам затевает диалог).
Выход назад в парсер, естественно, одним из вариантов диалога.
Неактивен
masterofshadows написал:
Хмм...что-то я запутался...Как заставить спросить у актера про место, в котором находишься?...И ваще мона пжлста хотя б маленький пример диалога?... а то торможу...
ИМХО проще всего присвоить локации какое-то имя, которое будут отображаться в статусной строке, а потом реализовать предмет класса thing с таким же названием.
Кроме того, я как-то делал ради интереса модуль меню. Меню активируется при входе в режим диалога, система собственно напоминает собой ту что была использована в игре Remeses. В аплоаде на urq.allquests.ru исходник до сих пор лежит. Можешь использовать его. Разобраться там просто.
С меню Гранада я так и не смог толком разобраться. Вернее разобрался, но как заставить этот модуль корректно работать в конкретной игре так и не понял.
Отредактировано - VampirE - (21.11.2007 17:39)
Неактивен
- VampirE - написал:
masterofshadows написал:
Хмм...что-то я запутался...Как заставить спросить у актера про место, в котором находишься?...И ваще мона пжлста хотя б маленький пример диалога?... а то торможу...
ИМХО проще всего присвоить локации какое-то имя, которое будут отображаться в статусной строке, а потом реализовать предмет класса thing с таким же названием.
ИМХО в рамках диалоговой системы "спросить про/рассказать про" это все равно будет, мягко говоря, неинтуитивно. Как раз тот случай когда меню имеет преимущество перед парсером.
Неактивен
uux написал:
- VampirE - написал:
masterofshadows написал:
Хмм...что-то я запутался...Как заставить спросить у актера про место, в котором находишься?...И ваще мона пжлста хотя б маленький пример диалога?... а то торможу...
ИМХО проще всего присвоить локации какое-то имя, которое будут отображаться в статусной строке, а потом реализовать предмет класса thing с таким же названием.
ИМХО в рамках диалоговой системы "спросить про/рассказать про" это все равно будет, мягко говоря, неинтуитивно. Как раз тот случай когда меню имеет преимущество перед парсером.
Позволю не согласиться. Находясь во дворце, вполне логично "спросить про дворец", или попав на ферму, расспросить о ней хозяина. Это делать можно и тоньше, не акцентируя внимание на формальном названии локации, а на характерных для неё объектах.
НЕ заморачивайтесь на технических аспектах! Во многих случаях простое решение будет легче для вас и игрока. Как пример - обход использования трех объектов в команде, отказ от наречий в пользу сопутствующих действий и т.п.
masterofshadows, пожалуйста, уточни, что ты же ты имел в виду?
Неактивен
я всего-то навсего хотел спросить как можно технически реализовать вопрос, адресованный актеру, касающийся не объекта итп а локации или местности...А также потом еще спросил как реализовать диалог можно..т.е. у мну был не адин замороченный вопрос..а два отдельных...если слишком пространственно выразился тогда и сейчас..извиняюсь=)
Неактивен
Создай объект (свойство location оставь неопределённым) и присвой ему все синонимы, которые приходят в голову при мысли о локации. И разговаривай об этом объекте. То есть, то, что сказал Vampire.
Неактивен
masterofshadows написал:
я всего-то навсего хотел спросить как можно технически реализовать вопрос, адресованный актеру, касающийся не объекта итп а локации или местности...А также потом еще спросил как реализовать диалог можно..т.е. у мну был не адин замороченный вопрос..а два отдельных...если слишком пространственно выразился тогда и сейчас..извиняюсь=)
Не совсем понятно со вторым вопросом, про пример диалога. Конкретнее, что нужно? Транскрипт диалога? Пример реализации диалога при парсерном общении (спросить о/рассказать о) - а чем в таком случае не устраивает пример про Жеглова с Груздевым? Или пример реализации менюшного диалога?
Отредактировано uux (24.11.2007 09:08)
Неактивен
хмм...в последнем сообщение я уже фактически ничего не спрашивал=)...все возможные пути решения мне уже предложили, я лишь сижу думаю, каким бы лучше...меня попросили разъяснить, что я имел ввиду своим вопросом, ну вот я из вежливости написал=)
Неактивен
Довел до ума систему меню. Можно конструировать в игре диалоги любой сложности.
Если кому интересно, то http://file.raid.ru/get.php?f=f795c0c4e … fb08a133c5.
Неактивен
Посмотрел меню. Да, работает
Думаю пользоваться им врядли кто-то кроме тебя будет, просто потому, что используется измененный advr.t, да еще и старой сборки.
Неактивен
Вообще-то advr.t не используется. Просто для полноты добавил. Уникален только menu.t, можно вставлять в любую разработку и свободно пользовать.
Так что может кому и понадобиться, буду только рад. Что касается своих возможных игр, планирую что именно эту систему буду использовать в диалогах.
Отредактировано - VampirE - (01.12.2007 19:57)
Неактивен
Это заморочки с примером. Вставь menu.t в любой проект и увидишь как все прекрасно заработает.
Неактивен
Хорошо и просто. Только при нажатии клавиши, отличной от цифры, все же не нужно выпадать в ошибку...
Должна быть защита от дурака
Я так понимаю, есть ограничение на 9 вариантов, из которых 1 занят выходом из диалога?
Неактивен
Пожелания учел, выкладываю исправленное содержимое файла menu.t.
/* Правила использования: dyevushka : Actor location = startroom sdesc = "девушка" rdesc = "девушки" ddesc = "девушке" vdesc = "девушку" tdesc = "девушкой" pdesc = "девушке" noun = 'девушка' 'девушки' 'девушке' 'девушкой' ' девушку' 'девушке#d' 'девушкой#t' 'девушкою#t' ldesc = "Красивая девушка. Блондинка." isHer = true verDoTalk(actor) = {} doTalk(actor) = { "Девушка оценивающе смотрит на вас."; answers([ '- Привет.' hello '- Как тебя зовут?' name '- Нет. Ничего.' ext ]); } ; hello: menu action = { "- Привет."; name.hide := nil; } ; name: menu hide = true action = { "- Аня."; self.hide := true; } ; Функцию answers возможно вставлять в любой метод. ext - стандартный выход из диалога, если вам нужно, что бы персонаж, к примеру, тоже прощался в ответ - достаточно вписать вместо ext свой метод. */ answers: function; menu: object hide = nil //спрятать пункт меню? true - да, nil - нет was = 0 //был ли вызов пункта меню? если да, то сколько раз? action={} //ну, соответсвенно, содержимое диалога isreturn = true; //выводит последние ответы ; ext: menu //заглушка по умолчанию для завершения разговора isreturn=nil action={} was=0 ; answers: function (Buttons) { local i, j, arr; arr := []; j := 0; "\b"; for (i:=2; i <= length(Buttons); i+=2) { if (Buttons[i].hide = nil) { j++; say(j); ") "; say(Buttons[i-1]); "\n"; arr := arr + Buttons[i]; } } Handler: if (j < 10) i := cvtnum(inputkey()); else { "\bВаш выбор: "; i := cvtnum(input()); } if (i > j or i = 0) goto Handler; "\b"; arr[i].action; arr[i].was++; if (arr[i].isreturn = true) answers(Buttons); }
Отредактировано - VampirE - (03.12.2007 12:33)
Неактивен