Сделал фонарик в игре. И обнаружил удивительную вещь.
Если фонарик хотя бы один раз включить в темной комнате, потом его можно спокойно выключать. Комната остается освещенной! Это ж обалдеть какая дырка!
Стал смотреть 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 у источника света никогда не становится nil, если он был однажды включен. Фонарик у меня отнаследован от lightsource, switchItem. Так вот, doTurnon - берется от lightsource, а doTurnoff в lightsource нет, поэтому берется от switchItem, который про islit - ни ухом, ни рылом. Вот и получается, что если фонарик включить, то он остается гореть даже, если его выключать потом.
Неактивен