Forum.iFiction.Ru

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

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

Вы не зашли.

0    0    #26
10.01.2009 21:22

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

меньше слов

Re: Новичок. Несколько вопросв.

кхе-кхе. А где в твоей функции doOpen(actor) собственно открывается шкафчик? wink
Либо добавь
self.setIsopen(true);
либо вообще убери эту функцию. Тогда програма будет отвечать так:
"Открыв шкафчик, ты обнаружил униформу. "

Неактивен

0    0    #27
11.01.2009 09:38

IO
Участник
Зарегистрирован: 07.01.2009
Сообщений: 15

Re: Новичок. Несколько вопросв.

Функцию удалил. Заработало. (нервно смеюсь).

Неактивен

0    0    #28
11.01.2009 18:06

IO
Участник
Зарегистрирован: 07.01.2009
Сообщений: 15

Re: Новичок. Несколько вопросв.

Необходимо:
игрок может выйти из комнаты только если одет в униформу, несет с собой рюкзак и батарейка заряжена. При чем если не соблюдено какое-то из требований, то текст разный для каждого.

У меня получилось что-то невразумительное (и естественно не рабочее):

Код:

CellDoor : lockableDoorway
    locked = true
    closed = true
    location = startroom
    doOpen(actor) = "красивый текст''

    if (Bag.location != Me)
    {
    "текст";
    CellDoor.setIslocked(true)
    else
    CellDoor.setIslocked(nil)
    }

    if (Uniform.IsWear = nil) 
    {
    "текст";
    CellDoor.setIslocked(true)
    else
    CellDoor.setIslocked(nil)
    }

    if (Battery.IsCharge = nil)
    {
    "текст";
    CellDoor.setIslocked(true)
    else
    CellDoor.setIslocked(nil)
    }
    ldesc = "красивый текст"
;

Отредактировано IO (11.01.2009 18:07)

Неактивен

0    0    #29
11.01.2009 18:54

Korwin
Гоблин, зеленый от недосыпа (+188, -16)
Откуда: Екатеринбург
Зарегистрирован: 27.11.2007
Сообщений: 795
Вебсайт

У трав, растущих на мягкой земле - слабые корни. (с)Korwin

Re: Новичок. Несколько вопросв.

IO написал:

Необходимо:
игрок может выйти из комнаты только если одет в униформу, несет с собой рюкзак и батарейка заряжена. При чем если не соблюдено какое-то из требований, то текст разный для каждого.

У меня получилось что-то невразумительное (и естественно не рабочее):

Я бы написал это так:

Код:

CellDoor : Doorway

    closed = true
    location = startroom
    ldesc = "красивый текст"

    verDoOpen(actor)={}  
 
    doOpen(actor) =
{
     if (Bag.location <> parserGetMe()) "текст1";
    else if (Uniform.IsWear = nil) "текст2";
    else if (Battery.IsCharge = nil) "текст3";
    else {"Красивый текст";pass doOpen;}
}
;

Но возможны и другие варианты.

Отредактировано Korwin (11.01.2009 18:58)

Неактивен

0    0    #30
11.01.2009 20:05

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

Re: Новичок. Несколько вопросв.

В данном конкретном случае это, наверное, роли не сыграет, но вообще идеологически правильнее заменить проверку условия

Korwin написал:

Код:

     if (Bag.location <> parserGetMe())

на

Код:

     if (not actor.isCarrying(Bag))

parserGetMe() - функция, возвращающая текущего главного персонажа; если команда обращена к другому персонажу в игре (например, >Вася, открой дверь), то все равно будет проверяться наличие сумки в инвентаре у главного героя. В моем варианте при такой команде будет проверяться наличие сумки у Васи.

isCarrying - это метод, проверяющий, находится ли предмет в инвентаре у персонажа. Эта проверка лучше, чем проверка свойства location, потому, что учитывает также предметы, находящиеся в контейнерах, которые несет персонаж. Для сумки это, конечно, пофиг, но если игрок положит батарею в сумку и эту сумку возьмет, то проверка на наличие в его инвентаре батареи по location не сработает, а вот isCarrying даст нужный результат.

Отредактировано uux (11.01.2009 20:06)

Неактивен

0    0    #31
12.01.2009 04:57

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

меньше слов

Re: Новичок. Несколько вопросв.

Правильный рабочий код таков:

Код:

CellDoor : Doorway

    closed = true
    location = startroom
    ldesc = "красивый текст"

    verDoOpen(actor)=
    {
       if (not actor.isCarrying(Bag)) "текст1";
       else if (Uniform.IsWear = nil) "текст2";
       else if (Battery.IsCharge = nil) "текст3";
    }  
 
    doOpen(actor) =
   {
      "Красивый текст";
      pass doOpen;
   }
;

verDoOpen(actor) предназначен для проверки допустимости действия и выводит всевозможные отговорки (при этом менять значения каких-либо свойств в нем категорически запрещено). Поэтому все напоминалки и запрещалки нужно перенести туда. Код исполнения будет уже в doOpen.
В принципе, код приведенный Корвином тоже должен быть рабочим, но верификация пустая и система неполную команду "открыть" без зазрений совести дополнит: (дверь), после чего выведет отговорку.

Неактивен

0    0    #32
12.01.2009 05:23

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

Re: Новичок. Несколько вопросв.

GrAndrey написал:

verDoOpen(actor) предназначен для проверки допустимости действия и выводит всевозможные отговорки (при этом менять значения каких-либо свойств в нем категорически запрещено). Поэтому все напоминалки и запрещалки нужно перенести туда. Код исполнения будет уже в doOpen.
В принципе, код приведенный Корвином тоже должен быть рабочим, но верификация пустая и система неполную команду "открыть" без зазрений совести дополнит: (дверь), после чего выведет отговорку.

На самом деле, предпочтительнее именно вариант Корвина с убранным на фиг verDoOpen. Поскольку дверь у нас - наследник класса doorway, то "умолчальный" verDoOpen еще и проверяет вариант, когда дверь уже открыта (в этом случае команда "открыть дверь" смысла не имеет). Или уж тогда вот так:

CellDoor : doorway  // Именно так, с маленькой буквы - по умолчанию ТАДС чувствителен к регистру идентификаторов
verDoOpen(actor)={inherited.verDoOpen(actor); // Вызываем верификатор родительского класса, чтобы отсечь варианты,
                                                                        // когда дверь уже открыта
                                                                        // или когда она заперта
                              if(not (self.isopen or self.islocked)) // Дополнительная проверка - чтобы избежать вывода 
                                                                                  // чего-то вроде "Она уже открыта. текст1"
                                {if (not actor.isCarrying(Bag)) "текст1";
                                  else if (Uniform.IsWear = nil) "текст2";
                                  else if (Battery.IsCharge = nil) "текст3";
                                }
                             }


А doOpen - как у ГрАнда.

Отредактировано uux (12.01.2009 05:49)

Неактивен

0    0    #33
14.01.2009 21:27

IO
Участник
Зарегистрирован: 07.01.2009
Сообщений: 15

Re: Новичок. Несколько вопросв.

35 огромных спасибо всем!
Пишу в поте лица!

Неактивен

Powered by PunBB
© copyright 2001–2024 iFiction.Ru