Сделал фонарик в игре. И обнаружил удивительную вещь.
Если фонарик хотя бы один раз включить в темной комнате, потом его можно спокойно выключать. Комната остается освещенной! Это ж обалдеть какая дырка!
Стал смотреть advr.t - там метода doTurnOff для источника света вообще не предусмотрено!
Это надо исправлять. А то фигня какая-то выходит. Я у себя поправлю, конечно, но в новую версию библиотеки это исправление должно войти обязательно!
Неактивен
Залечил вот так (добавил код в class lightsource):
doTurnoff(actor) =
{
local waslit := actor.location.islit;
// turn off the light
self.isActive := nil;
self.islit := nil;
"<<ZAG(parserGetMe(),&sdesc)>> выключ<<ok(parserGetMe(), 'или', 'ил', 'ило', 'ила')>> <<self.vdesc>>";
// если комната была освещена, а теперь - нет, то это надо обозначить...
if (!actor.location.islit and waslit)
{
", и все вокруг погрузилось во тьму.\b";
actor.location.enterRoom(actor);
}
else
". ";
}Неактивен
Необходимо использовать класс darkroom, у которого свойство islit вычислимо. Если источник света больше не islit, то комната должна без вопросов погрузиться в темноту. Правда, описание этого события целиком на совести автора.
Неактивен
Конечно, я использую darkroom.
В том то и дело, что в неисправленнои варианте islit у источника света никогда не становится nil, если он был однажды включен. Фонарик у меня отнаследован от lightsource, switchItem. Так вот, doTurnon - берется от lightsource, а doTurnoff в lightsource нет, поэтому берется от switchItem, который про islit - ни ухом, ни рылом. Вот и получается, что если фонарик включить, то он остается гореть даже, если его выключать потом.
Неактивен
Этот патч подойдет для случая lightsource, switchItem. Если прописать doTurnoff только для lightsource, то и свечку и банку со светлячком можно будет "выключать". Поэтому нужен патч, который для darkroom будет проверять что источник света ещё и включён.
Обновление: Верификация включения/выключения в lightsource не прописана и doTurnoff по умолчанию не будет доступен. Так что ставлю исправление Антона.
Отредактировано GrAndrey (17.07.2008 10:00)
Неактивен