кхе-кхе. А где в твоей функции doOpen(actor) собственно открывается шкафчик? ![]()
Либо добавь
self.setIsopen(true);
либо вообще убери эту функцию. Тогда програма будет отвечать так:
"Открыв шкафчик, ты обнаружил униформу. "
Неактивен
Необходимо:
игрок может выйти из комнаты только если одет в униформу, несет с собой рюкзак и батарейка заряжена. При чем если не соблюдено какое-то из требований, то текст разный для каждого.
У меня получилось что-то невразумительное (и естественно не рабочее):
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)
Неактивен
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)
Неактивен
В данном конкретном случае это, наверное, роли не сыграет, но вообще идеологически правильнее заменить проверку условия
Korwin написал:
Код:
if (Bag.location <> parserGetMe())
на
if (not actor.isCarrying(Bag))
parserGetMe() - функция, возвращающая текущего главного персонажа; если команда обращена к другому персонажу в игре (например, >Вася, открой дверь), то все равно будет проверяться наличие сумки в инвентаре у главного героя. В моем варианте при такой команде будет проверяться наличие сумки у Васи.
isCarrying - это метод, проверяющий, находится ли предмет в инвентаре у персонажа. Эта проверка лучше, чем проверка свойства location, потому, что учитывает также предметы, находящиеся в контейнерах, которые несет персонаж. Для сумки это, конечно, пофиг, но если игрок положит батарею в сумку и эту сумку возьмет, то проверка на наличие в его инвентаре батареи по location не сработает, а вот isCarrying даст нужный результат.
Отредактировано uux (11.01.2009 20:06)
Неактивен
Правильный рабочий код таков:
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.
В принципе, код приведенный Корвином тоже должен быть рабочим, но верификация пустая и система неполную команду "открыть" без зазрений совести дополнит: (дверь), после чего выведет отговорку.
Неактивен
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)
Неактивен