Forum.iFiction.Ru

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

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

Вы не зашли.

0    0    #1
29.07.2007 14:49

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Помогите - актер и скриптование демонами

у мну тут весьма специфическая трабла...Мне позарез нужен актер, но опять-таки: то, что написал сам не пашет...
Ситуация:
Актер находится перед закрытой дверью...пока игрок не найдет способ открыть ее, мне надо, чтобы актер как-бы совершал попытки сломать дверь, при этом у него ничего не должно получаться(  неплохо было бы сделать, чтобы сообщения выводились независимо от местанахождения игрока )...затем актер должен пройти внутрь, упасть там в обморок( ну соотсветсвенно с ним ни разговаривать ниче сделать низя) и выронил предмет...все...

Неактивен

0    0    #2
30.07.2007 07:45

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

Re: Помогите - актер и скриптование демонами

Я бы сделал так. Реализовал бы это через демон (или запал, если актер должен ломиться через определенное число ходов).

Демон запускаешь когда тебе надо: он должен выводить сообщения о том, что кто-то ломиться в дверь. По событии открытия двери, демон останавливается и актер с соответствующим сообщением попадает внутрь. Далее просто помещаешь в комнату заранее созданного актера.

ЗЫ Сейчас сижу на работе, тадса нет под рукой. Если что непонятно - говори, напишу примерный код потом.

Отредактировано - VampirE - (30.07.2007 07:45)

Неактивен

0    0    #3
30.07.2007 10:34

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Re: Помогите - актер и скриптование демонами

последние 2 предложения( или 3 ) понятно...не могу только представить код демона...

Неактивен

0    0    #4
30.07.2007 18:19

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

меньше слов

Re: Помогите - актер и скриптование демонами

делается это примерно так:

Код:

replace init: function
{
    ......   // покоцано много-много
    setdaemon(lifeDaemon, nil);                       // запускаем демона жизни!
    .....
}

lifeDaemon: function(parm)                             // Оживляем Васю!
{
    if (Vasya.location=lift)
    if (liftdoor.isopen)
    {
        "Из открытой теперь двери лифта донесся дикий рев \"Порву суку на грелки!  Я тебе %№"* покажу, как меня запирать!\";
        if (vodka.location=etazh12) 
         {
            “\n Но вскоре крик затих - видимо, он нашел водку. "; 
            vasya.moveInto(nil); 
            vasyavdym.moveInto(etazh12);
            ogurec.moveInto(etazh12);
         }
        else
        global.achtung:=true;       
    }
    else
    {
     switch (triedToBreakin)
     {
       case 0: "От шахты лифта донеслась гулкая и невнятная, но явно нецензурная брань. "; break;
       case 1: "Откуда-то сверху донеслись глухие удары. Морзянка, сэр."; break;
       ....
       default: "Меланхоличный стук повторяется несколько раз и затихает. ";
     }
      triedToBreakin++;
    }
}

Также приведу жуткий пример из Дримора:

Код:

replace init: function
{
    ......   // покоццано много-много
    setdaemon(lifeDaemon, nil);                       // запускаем демона жизни!
    .....
}

lifeDaemon: function(parm)                             // Оживляем всех к тому пригодных
{
local o;
o := firstobj(living); 
 while (o <> nil)
 {
  o.live;
  o := nextobj(o, living);
 }
}


class living: object  //Живое
cons=true // изначально в сознании
enemy=[]  // изначально у него нет врагов
live=
{
 local o,enlist,i;
 enlist:=[];
 // Если есть враги, и они здесь, то создадим их список
 if (self.enemy!=nil && self.enemy!=[] && self.cons)
 for ( i:=1; i<=length(self.enemy); i++ )
 if (self.enemy[i].isReachable(self)) enlist+=self.enemy[i];

 // если бежали, "чекаем мораль"
 if (enlist!=[] && self.isflee)
  if (self.moralcheck(Me))
  {
    self.backToFightMes;
    self.isflee:=nil;
  }
  else self.flee;
    

 // если не бежим, деремся
 if (!self.isflee)
 {
    // случайным образом выбираем противника
    if (enlist!=[]) self.fight(enlist[rand(length(enlist))]); 
 }
}
;

Неактивен

0    0    #5
31.07.2007 11:43

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Re: Помогите - актер и скриптование демонами

спс...теперь более-менее понятно, хотя не мог бы объяснить, что делает global.achtung....

Неактивен

0    0    #6
31.07.2007 19:49

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

меньше слов

Re: Помогите - актер и скриптование демонами

masterofshadows написал:

спс...теперь более-менее понятно, хотя не мог бы объяснить, что делает global.achtung....

В стандартных библиотеках ничего, этот параметр такая-же фантазия как объекты vasya, etazh12 и другое.

Неактивен

0    0    #7
01.08.2007 07:20

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

Re: Помогите - актер и скриптование демонами

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)

Неактивен

0    0    #8
01.08.2007 12:32

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Re: Помогите - актер и скриптование демонами

О тогда пока вы все расщедрились и охотно помогаете... не подскажете ли как убрать стандартное сообщение о нахождении прежмета в контейнере или в комнате  (  ну открываешь шкаф а тадс сам пишет, что ты нашел в нем то и то)...так же мну раздражает, что когда находишь "спрятанную " вещь она автоматом берется...
Как бы обойти это?

Неактивен

0    0    #9
01.08.2007 21:38

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

Re: Помогите - актер и скриптование демонами

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.

Но хочу предостеречь: эксперимент, поставленный мной на игроках (правда, англоязычных), показал, что большинство из них раздражается как раз тогда, когда найденный объект не перемещается автоматически в инвентарьwink.

Неактивен

0    0    #10
02.08.2007 10:54

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Re: Помогите - актер и скриптование демонами

спс еще раз...ща буду копить новые вопросы=)

Неактивен

0    0    #11
06.08.2007 10:07

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

меньше слов

Re: Помогите - актер и скриптование демонами

Просьба, создавать темы для отдельных вопросов и указывать проблему в их названии.

Неактивен

0    0    #12
08.08.2007 16:17

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Re: Помогите - актер и скриптование демонами

Я решил не захламлять форум новой темой и написать в старой, тем более, что вопросы незначительные( я надеюсь ).
У мну проблемы с обыском "актера без сознания". Я последовал совету uux-а и при открытии дверей просто заменил актера на "актера без сознания", но в игре при вводе скажем:
- осм актера без сознания
мне выдает, что не знает слова "без". Я пробовал перефразировать, но бесполезно...
=====
И еще маленький вопрос - мот кто знает есть ли в стандартной библиотеке "SitDown" или же самому определять надо?

Неактивен

0    0    #13
08.08.2007 16:29

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

меньше слов

Re: Помогите - актер и скриптование демонами

masterofshadows написал:

У мну проблемы с обыском "актера без сознания". Я последовал совету uux-а и при открытии дверей просто заменил актера на "актера без сознания", но в игре при вводе скажем:
- осм актера без сознания
мне выдает, что не знает слова "без". Я пробовал перефразировать, но бесполезно...
=====
И еще маленький вопрос - мот кто знает есть ли в стандартной библиотеке "SitDown" или же самому определять надо?

1. Нужно добавить предлог-связку в специальные слова.

specialWords
   'of'='для'='против'='типа'='из'='под'='от'='на'='в'='с' ='без' ,

2. Есть только "сесть на"

Неактивен

0    0    #14
08.08.2007 20:56

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

Re: Помогите - актер и скриптование демонами

GrAndrey написал:

masterofshadows написал:

У мну проблемы с обыском "актера без сознания". Я последовал совету uux-а и при открытии дверей просто заменил актера на "актера без сознания", но в игре при вводе скажем:
- осм актера без сознания
мне выдает, что не знает слова "без". Я пробовал перефразировать, но бесполезно...
=====
И еще маленький вопрос - мот кто знает есть ли в стандартной библиотеке "SitDown" или же самому определять надо?

1. Нужно добавить предлог-связку в специальные слова.

specialWords
   'of'='для'='против'='типа'='из'='под'='от'='на'='в'='с' ='без' ,

... или определить
compoundWord 'без' 'сознания' 'безсознания';

И определить для актера

UnconsciousActor: Actor
noun='актер'
adjective='безсознания' 'безсознания#r'
;

Неактивен

0    0    #15
26.08.2007 14:10

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Re: Помогите - актер и скриптование демонами

Вот я и вернулся! Отдохнувший и веселый, с новыми вопросами... Точнее пока с одним вопросом, касающимся изменения окончания существительного. В мануале есть немного на эту тему, но подделать под свой случай я так и не смог.
Все просто:
1. Есть спрятанная книга.
2. Когда ее обнаруживаешь, то получается примерно так:
- Ты нашел книга и взял ее...
понятно, что фраза должна выглядеть : - ты нашел книгу и взял ее.
Как такого добиться я не врубаю...

Неактивен

0    0    #16
26.08.2007 19:26

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

Re: Помогите - актер и скриптование демонами

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;, и наступит счастье;).

Небольшой офф-топик: мне чего-то пришло в голову, что мое объяснение сильно напоминает русскую народную сказку про Кащея Бессмертного: найди остров, на нем дуб, на дубе сундук и т. д.

Неактивен

0    0    #17
27.08.2007 06:50

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

меньше слов

Re: Помогите - актер и скриптование демонами

uux написал:

мое объяснение сильно напоминает русскую народную сказку про Кащея Бессмертного: найди остров, на нем дуб, на дубе сундук и т. д.

... игла в яйце, яйцо в утке, утка в зайце, заяц в шоке...

Баг пофиксю!

Неактивен

0    0    #18
27.08.2007 11:07

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Re: Помогите - актер и скриптование демонами

Ну вот, хоть какая-то от меня польза...

Неактивен

0    0    #19
16.09.2007 12:08

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Re: Помогите - актер и скриптование демонами

Проблема мешает мне писать дальше игру и ваще выводит из себя...Я еще в начале игры создал комнату:
===============================
stuffroom: room
sdesc = "Чулан"
ldesc = "Комната завалена всяческим хламом. Ты приглядываешься - ага вон на востоке еще дверь...Тут тебе определенно не нравилось -  воздух в помещении был какой-то тяжелый, создавалось ощущение, будто тебя хотят вдавить в пол.
east = importantroom
north = startroom
;
===============================
затем совершенно забыл про нее и уже когда дописывал локацию и отлаживал интерактивность добавил предметов туда:
===============================
hlam: fixeditem
location = stuffroom
sdesc ="хлам"
rdesc ="хлама"
ddesc ="хламу"
vdesc ="хлам"
tdesc ="хламом"
pdesc ="хламе"
noun ='хлама' 'хламу' 'хлам' 'хламом' 'хламе' 'хламом#t' 'хламе#d'
isHim = true
ldesc = "Тут свалено множество тех объектов домашнего обихода, которые по разным причинам уже не могут выполнять поставленные их создателями задачи. Короче, здесь свален всяческий хлам - от кофемолки до бензопилы"
verDoTake( actor ) =
{
"Дотрагиваться до уже гниющей куче мусора совсем не хочется";
}
;

kofemolka: fixeditem
location = stuffroom
sdesc ="кофемолка"
rdesc ="кофемолки"
ddesc ="кофемолке"
vdesc ="кофемолку"
tdesc ="кофемолкой"
pdesc ="кофемолке"
noun ='кофемолка' 'кофемолки' 'кофемолку' 'кофемолкой' 'кофемолке' 'кофемолке#d' 'кофемолкой#t'
ldesc = "Хорошая была кофемолка, хоть ты камни перемалывай( насколько ты помнишь именно они привели ее в такое состояние )."
verDoTake( actor ) =
{
"Этот хлам тебе абсолютно не нужен, именно поэтому ты держишь его здесь.";
}
isHer = true
;

benzopila: fixeditem
location = stuffroom
sdesc ="бензопила"
rdesc ="бензопилы"
ddesc ="бензопиле"
vdesc ="бензопилу"
tdesc ="бензопилой"
pdesc ="бензопиле"
noun ='бензопила' 'бензопилы' 'бензопилу' 'бензопилой' 'бензопиле' 'бензопиле#d' 'бензопилой#t'
isHer = true
ldesc = "Гроза и истребитель местных елочек, видимо, была побеждена обычной влагой  - бензопилу покрывал сплошной слой ржавчины."
verDoTake( actor ) =
{
"Как священник, ты не имеешь никакого права брать в руки неисправное оружие=)";
}
verDoClean( actor ) =
{
"На это уйдут годы...";
}
;
==============================
после того как я добавил ети штуки сразу появились следущие ошибки=
==============================
warning: possible unterminated string(65)
C:\Program Files\TADS Tools\priest.t(68): error TADS-100: invalid token
C:\Program Files\TADS Tools\priest.t(68): error TADS-100: invalid token

замечу что ети ошибки выводит для комнаты строка 65 это sdesc...строка 68 это точка с запятой=)
==============================
вот такой ужас...или у мну как всегда что-то с руками

Неактивен

0    0    #20
16.09.2007 13:17

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

меньше слов

Re: Помогите - актер и скриптование демонами

masterofshadows написал:

Проблема мешает мне писать дальше игру и ваще выводит из себя...Я еще в начале игры создал комнату:
===============================
stuffroom: room
sdesc = "Чулан"
ldesc = "Комната завалена всяческим хламом. Ты приглядываешься - ага вон на востоке еще дверь...Тут тебе определенно не нравилось -  воздух в помещении был какой-то тяжелый, создавалось ощущение, будто тебя хотят вдавить в пол.
east = importantroom
north = startroom
;

Если текст именно такой, то проблема тут:

ldesc = "Комната завалена всяческим хламом. ..*покоцано*... в пол. "
east = importantroom

Т.е. не закрыты кавычки.

Неактивен

0    0    #21
16.09.2007 22:24

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

Re: Помогите - актер и скриптование демонами

masterofshadows написал:

Проблема мешает мне писать дальше игру и ваще выводит из себя...
<SNIP>
==============================
вот такой ужас...или у мну как всегда что-то с руками

Мастер, в дополнение к действительно исчерпывающему объяснению ГрАнда, хочу сделать (надеюсь, обнадеживающее) замечание общего характера: с руками у тебя все в порядке;). Просто такого рода опечатки (забытые завершающие кавычки/апостроф) - это, по моим наблюдениям, наиболее распространенная ошибка при программировании в TADS. Особенно часто она встречается при задании многочисленных лексических свойств. По степени неприятности с ней может соперничать, пожалуй, только забытая закрывающая фигурная скобка;).

Меня самого такого рода ошибки компиляции в начальных и не очень стадиях освоения TADS доводили до белого каления, заставляя практически биться головой о монитор и проклинать долбаный компилятор. Что характерно - компилятор всегда оказывался прав;). Когда счет таких случаев перевалил где-то за пятый десяток, я стал относиться к подобным ситуациям философски (опечатки будут встречаться всегда, пока программером будет оставаться человек) и даже выработал свои методы их выявления.

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

(Правда, я и отлаживаю код таким же образом - после добавления максимум одного объекта/локации, но это, сознаюсь, на любителя, другой стиль программирования может предполагать и другие подходы к работе в этом плане).

Отредактировано uux (16.09.2007 22:30)

Неактивен

0    0    #22
17.09.2007 01:12

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

Re: Помогите - актер и скриптование демонами

Можно использовать IDE с подсветкой синтаксиса. Забытые кавычки будет сразу видно. Я использую Imaginate.

Неактивен

0    0    #23
17.09.2007 05:32

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

Re: Помогите - актер и скриптование демонами

Gremour написал:

Можно использовать IDE с подсветкой синтаксиса. Забытые кавычки будет сразу видно. Я использую Imaginate.

Да, это тоже отличный способ, хотя, наверное, не панацея. Я об этом не подумал - просто слишком уж прикипел душой не к "Блокноту" даже, а к edit'у (хорошо, что не к edlin'у).

Эх... пора менять привычки

Неактивен

0    0    #24
18.09.2007 19:17

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Re: Помогите - актер и скриптование демонами

спс за действенные советы...уже сча они позволили хотя бы в половину ускорить процесс нахождения багов, хотя лично мне очень нравился старый способ - в строке и в прилегающих строках ( ха сча сдам хломидамонада, который мне етот способ показал) , изменять, удалять все что под руку попадется, пока не исчезнет ошибка=)

Неактивен

0    0    #25
19.09.2007 05:18

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

Re: Помогите - актер и скриптование демонами

masterofshadows написал:

спс за действенные советы...уже сча они позволили хотя бы в половину ускорить процесс нахождения багов, хотя лично мне очень нравился старый способ - в строке и в прилегающих строках ( ха сча сдам хломидамонада, который мне етот способ показал) , изменять, удалять все что под руку попадется, пока не исчезнет ошибка=)

Ну, это разновидность моего подхода... Хотя выкомменчивать всяко эффективнее, чем удалять - не потребуется потом заново вводить то, что потер.

Неактивен

0    0    #26
20.09.2007 00:43

Xlomid[оманад]
Участник (+85, -7)
Зарегистрирован: 21.06.2007
Сообщений: 178

Re: Помогите - актер и скриптование демонами

Ну, это разновидность моего подхода... Хотя выкомменчивать всяко эффективнее, чем удалять - не потребуется потом заново вводить то, что потер.

А как же многократный undo, без которого жизнь стала бы куда тяжелее?.. )) Я вообще обычно предпочитаю логику, хотя по причине гуманитарных склонностей и не очень с ней дружу. К способу, который так понравился Мастеру, прибегаю только в совершенно безнадежных случаях или когда меня вынуждают искать баг в коде на незнакомом мне языке (ТАДС, напримерsmile).

Неактивен

0    0    #27
20.09.2007 06:32

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

Re: Помогите - актер и скриптование демонами

Xlomid[оманад] написал:

А как же многократный undo, без которого жизнь стала бы куда тяжелее?.. ))

А в моем любимом edit'е его нет. Не, точно, блин, пора менять привычки;).

Неактивен

0    0    #28
09.11.2007 00:11

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Re: Помогите - актер и скриптование демонами

Вот я и вернулся!...долго меня не было - все учеба проклятая!...и сразу небольшое дополнение насчет актеров...Как мона реализовать актера, который при определенном условии ( скажем наличии предмета в инвентаре итп )...имеет в этом случае новую тему для диалога..после которого перемещается в другую комнату и не желает с тобой разговаривать пока ты не совершишь опр действие или не принесешь другой предмет...фух ..надеюсь более-менее понятно объяснилю

Неактивен

0    0    #29
09.11.2007 01:56

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

Re: Помогите - актер и скриптование демонами

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)

Неактивен

0    0    #30
20.11.2007 22:31

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Re: Помогите - актер и скриптование демонами

Хмм...что-то я запутался...Как заставить спросить у актера про место, в котором находишься?...И ваще мона пжлста хотя б маленький пример диалога?... а то торможу...

Неактивен

0    0    #31
20.11.2007 23:37

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

Re: Помогите - актер и скриптование демонами

Диалоги можно сделать двумя принципиально разными способами:
1) Меню с предконструированными частями разговора;
2) Задать обработчики действий "спросить о" и "рассказать о" для набора предметов (которые могут фигурировать в качестве темы разговора).

Для реализации первого способа есть библиотека "меню" для TADS (http://rtads.org), которой я, впрочем ещё не пользовался. При желании, можно написать самому.

Если пользуешься вторым способом, чтобы не нарушать билль о правах игрока, не стоит привязывать к диалогам, которые инициирует сам игрок, критические для прохождения события. К тому же, по хорошему, темы разговора должны быть логичными и приходить на ум сами собой.

Неактивен

0    0    #32
21.11.2007 05:16

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

Re: Помогите - актер и скриптование демонами

masterofshadows написал:

Хмм...что-то я запутался...Как заставить спросить у актера про место, в котором находишься?...И ваще мона пжлста хотя б маленький пример диалога?... а то торможу...

Хмммм... про место, в котором находишься, видимо, лучше действительно спрашивать, используя менюшную систему. "Спросить Васю о месте, в котором находишься" - задолюаешься реализовывать парсерными средствами, даже если ты опытный автор, да и мало кто из игроков догадается ввести именно такую команду.

К сожалению, как и Gremour, библиотекой менюшных диалогов я никогда не пользовался. ГрАнд, вся надежда на тебя!wink

Неактивен

0    0    #33
21.11.2007 09:51

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

меньше слов

Re: Помогите - актер и скриптование демонами

Вопрос не совсем конкретный.
В прямом виде спрашивать о месте где находишься (вась, скажи, а где я нахожусь?), нельзя в силу ограничений парсера и ожиданий игрока от него. Но можно и нужно, чтобы персонаж отвечал на вопросы о названии локации или её характерных особенностях. В ответе прописать описания для случая когда игрок в локации, и вовне.

Неактивен

0    0    #34
21.11.2007 10:14

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Re: Помогите - актер и скриптование демонами

Хмм...А будут ли такие переходы из парсера в меню адекватно влиять на играбельность, геймплей и на общий вид игры? Или тут смотря как сделаешь?

Неактивен

0    0    #35
21.11.2007 12:19

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

Re: Помогите - актер и скриптование демонами

Сделай переход в режим меню по команде "(по)говорить с". Не забудь упомянуть о таком способе общения с актёрами в хелпе (по команде "помощь"). В некоторых местах можно переходить автоматически (если актёр сам затевает диалог).

Выход назад в парсер, естественно, одним из вариантов диалога.

Неактивен

0    0    #36
21.11.2007 17:38

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

Re: Помогите - актер и скриптование демонами

masterofshadows написал:

Хмм...что-то я запутался...Как заставить спросить у актера про место, в котором находишься?...И ваще мона пжлста хотя б маленький пример диалога?... а то торможу...

ИМХО проще всего присвоить локации какое-то имя, которое будут отображаться в статусной строке, а потом реализовать предмет класса thing с таким же названием.

Кроме того, я как-то делал ради интереса модуль меню. Меню активируется при входе в режим диалога, система собственно напоминает собой ту что была использована в игре Remeses. В аплоаде на urq.allquests.ru исходник до сих пор лежит. Можешь использовать его. Разобраться там просто.

С меню Гранада я так и не смог толком разобраться. Вернее разобрался, но как заставить этот модуль корректно работать в конкретной игре так и не понял.

Отредактировано - VampirE - (21.11.2007 17:39)

Неактивен

0    0    #37
21.11.2007 20:46

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

Re: Помогите - актер и скриптование демонами

- VampirE - написал:

masterofshadows написал:

Хмм...что-то я запутался...Как заставить спросить у актера про место, в котором находишься?...И ваще мона пжлста хотя б маленький пример диалога?... а то торможу...

ИМХО проще всего присвоить локации какое-то имя, которое будут отображаться в статусной строке, а потом реализовать предмет класса thing с таким же названием.

ИМХО в рамках диалоговой системы "спросить про/рассказать про" это все равно будет, мягко говоря, неинтуитивно. Как раз тот случай когда меню имеет преимущество перед парсером.

Неактивен

0    0    #38
22.11.2007 00:31

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

меньше слов

Re: Помогите - актер и скриптование демонами

uux написал:

- VampirE - написал:

masterofshadows написал:

Хмм...что-то я запутался...Как заставить спросить у актера про место, в котором находишься?...И ваще мона пжлста хотя б маленький пример диалога?... а то торможу...

ИМХО проще всего присвоить локации какое-то имя, которое будут отображаться в статусной строке, а потом реализовать предмет класса thing с таким же названием.

ИМХО в рамках диалоговой системы "спросить про/рассказать про" это все равно будет, мягко говоря, неинтуитивно. Как раз тот случай когда меню имеет преимущество перед парсером.

Позволю не согласиться. Находясь во дворце, вполне логично "спросить про дворец", или попав на ферму, расспросить о ней хозяина. Это делать можно и тоньше, не акцентируя внимание на формальном названии локации, а на характерных для неё объектах.
НЕ заморачивайтесь на технических аспектах! Во многих случаях простое решение будет легче для вас и игрока. Как пример - обход использования трех объектов в команде, отказ от наречий в пользу сопутствующих действий и т.п.

masterofshadows, пожалуйста, уточни, что ты же ты имел в виду?

Неактивен

0    0    #39
24.11.2007 01:25

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Re: Помогите - актер и скриптование демонами

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

Неактивен

0    0    #40
24.11.2007 02:00

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

Re: Помогите - актер и скриптование демонами

Создай объект (свойство location оставь неопределённым) и присвой ему все синонимы, которые приходят в голову при мысли о локации. И разговаривай об этом объекте. То есть, то, что сказал Vampire.

Неактивен

0    0    #41
24.11.2007 08:43

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

Re: Помогите - актер и скриптование демонами

masterofshadows написал:

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

Не совсем понятно со вторым вопросом, про пример диалога. Конкретнее, что нужно? Транскрипт диалога? Пример реализации диалога при парсерном общении (спросить о/рассказать о) - а чем в таком случае не устраивает пример про Жеглова с Груздевым? Или пример реализации менюшного диалога?

Отредактировано uux (24.11.2007 09:08)

Неактивен

0    0    #42
24.11.2007 16:24

masterofshadows
Участник
Откуда: Кресло
Зарегистрирован: 22.07.2007
Сообщений: 29

Тихо, тихо ползи,
Улитка, по склону Фудзи,
Вверх, до самых высот!

Re: Помогите - актер и скриптование демонами

хмм...в последнем сообщение я уже фактически ничего не спрашивал=)...все возможные пути решения мне уже предложили, я лишь сижу думаю, каким бы лучше...меня попросили разъяснить, что я имел ввиду своим вопросом, ну вот я из вежливости написал=)

Неактивен

0    0    #43
01.12.2007 15:49

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

Re: Помогите - актер и скриптование демонами

Довел до ума систему меню. Можно конструировать в игре диалоги любой сложности.

Если кому интересно, то http://file.raid.ru/get.php?f=f795c0c4e … fb08a133c5. smile

Неактивен

0    0    #44
01.12.2007 18:37

goraph
Участник (+647, -223)
Зарегистрирован: 16.04.2007
Сообщений: 531

Основная добродетель гражданина есть недоверие.

Re: Помогите - актер и скриптование демонами

Посмотрел меню. Да, работает smile
Думаю пользоваться им врядли кто-то кроме тебя будет, просто потому, что используется измененный advr.t, да еще и старой сборки.

Неактивен

0    0    #45
01.12.2007 19:54

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

Re: Помогите - актер и скриптование демонами

Вообще-то advr.t не используется. Просто для полноты добавил. smile Уникален только menu.t, можно вставлять в любую разработку и свободно пользовать.

Так что может кому и понадобиться, буду только рад. Что касается своих возможных игр, планирую что именно эту систему буду использовать в диалогах.

Отредактировано - VampirE - (01.12.2007 19:57)

Неактивен

0    0    #46
01.12.2007 20:29

goraph
Участник (+647, -223)
Зарегистрирован: 16.04.2007
Сообщений: 531

Основная добродетель гражданина есть недоверие.

Re: Помогите - актер и скриптование демонами

Не знаю уж используется или не используется, но со стандартным advr.t пример не хочет компилироваться

Неактивен

0    0    #47
02.12.2007 21:42

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

Re: Помогите - актер и скриптование демонами

Это заморочки с примером. Вставь menu.t в любой проект и увидишь как все прекрасно заработает. smile

Неактивен

0    0    #48
03.12.2007 00:16

Hind
Участник
Откуда: Балашиха
Зарегистрирован: 24.10.2007
Сообщений: 135
Вебсайт

Не нервируйте меня! Мне скоро негде будет прятать трупы!

Re: Помогите - актер и скриптование демонами

Хорошо и просто. Только при нажатии клавиши, отличной от цифры, все же не нужно выпадать в ошибку...
Должна быть защита от дурака smile

Я так понимаю, есть ограничение на 9 вариантов, из которых 1 занят выходом из диалога?

Неактивен

0    0    #49
03.12.2007 12:28

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

Re: Помогите - актер и скриптование демонами

Пожелания учел, выкладываю исправленное содержимое файла menu.t. smile

Код:

/*
Правила использования:

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)

Неактивен

Powered by PunBB
© copyright 2001–2024 iFiction.Ru