кхе-кхе. А где в твоей функции 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)
Неактивен