mirror of
https://github.com/goraph/17rooms.git
synced 2024-07-01 06:34:56 +03:00
294 lines
13 KiB
Lua
294 lines
13 KiB
Lua
|
-- Доступное пространство имён для объектов - все имена объектов должны начинаться с "room10_" или "zal_"
|
|||
|
-- Все описания можно менять
|
|||
|
-- Задача: Игрок должен найти в локации предмет lamp. Да-да, get lamp
|
|||
|
room {
|
|||
|
nam = "room10_zal";
|
|||
|
title = "Зал";
|
|||
|
door_ask = false;
|
|||
|
dsc = [[Ты находишься в просторном зале. Широкая лестница в центре зала ведёт наверх. Два столба у основания
|
|||
|
лестницы венчают статуи в виде сидящих на перилах кошек. Свет от роскошной люстры освещает портреты на стенах.^^
|
|||
|
К северу расположена гостиная, к югу прихожая, на западе столовая. Лестница ведёт наверх.]];
|
|||
|
n_to = 'room12_gostinnaya';
|
|||
|
u_to = 'room14_secondfloor';
|
|||
|
s_to = 'room3_hall';
|
|||
|
w_to = 'room7_stolovaya';
|
|||
|
score=false;
|
|||
|
before_Any = function(s, ev, w)
|
|||
|
if me():where() ^ '#safe' or me():where() ^ '#podsobka' then
|
|||
|
if w and not w:access() then
|
|||
|
p ("Ты же в ", me():where():noun'пр', ".")
|
|||
|
return
|
|||
|
end
|
|||
|
end
|
|||
|
if not s.door_ask then
|
|||
|
return false
|
|||
|
end
|
|||
|
s.door_ask = false
|
|||
|
if ev == "Yes" then
|
|||
|
p [[Ты толкаешь дверь и она открывается! Что за кретин проектировал особняк?]]
|
|||
|
_'#podsobka':attr'open'
|
|||
|
_'#podsobka'.was_open = true
|
|||
|
if not s.score then
|
|||
|
mp.score=mp.score+1;
|
|||
|
end;
|
|||
|
_'room10_zal'.score=true;
|
|||
|
return
|
|||
|
elseif ev == "No" then
|
|||
|
p [[Да, вряд-ли кто-то в здравом уме стал бы проектировать двери таким образом.]]
|
|||
|
return
|
|||
|
end
|
|||
|
return false
|
|||
|
end;
|
|||
|
obj = {
|
|||
|
obj {
|
|||
|
-"столбы,столб*";
|
|||
|
description = [[Массивные деревянные столбы установлены в начале лестницы. На каждом столбе находятся небольшие статуи кошек.]];
|
|||
|
}:attr'scenery';
|
|||
|
obj {
|
|||
|
-"перила|стены/жр|потолок";
|
|||
|
description = function(s) p ("Тебе нет дела до ", s:noun'рд', ".") end;
|
|||
|
}:attr'scenery';
|
|||
|
obj {
|
|||
|
-"люстра|свет";
|
|||
|
description = [[Красивая люстра... Антиквариат?]];
|
|||
|
}:attr'concealed,static';
|
|||
|
obj {
|
|||
|
-"кошки,статуи/мн";
|
|||
|
description = "Небольшие фигурки кошек, вырезанные из дерева. А может быть, это слоновая кость? Тут есть правая кошка и левая кошка.";
|
|||
|
}:attr'concealed,static,~animate';
|
|||
|
obj {
|
|||
|
-"левая кошка,левая статуя,левая,кошка,статуя";
|
|||
|
description = [[Левая статуя изображает сидящую кошку. Она точно такая же, как и правая.]];
|
|||
|
['before_Push,Pull,Turn'] = 'Кошка не сдвинулась с места.';
|
|||
|
}:attr'static,concealed,~animate';
|
|||
|
obj {
|
|||
|
-"правая кошка,правая статуя,кошка,статуя,правая,потёрт*";
|
|||
|
description = function(s)
|
|||
|
if _'#safe':hasnt'locked' then
|
|||
|
p [[Правая статуя смотрит в сторону. Этот дом -- одна сплошная тайна!]]
|
|||
|
return
|
|||
|
end
|
|||
|
p [[Правая статуя изображает сидящую кошку. Она точно такая же, как и левая. Хотя, если приглядеться, то тебе кажется, что эта кошка имеет больше потёртостей и смотрит немного в другую сторону. Впрочем, это чувство может быть обманчивым.]];
|
|||
|
end;
|
|||
|
['before_Push,Pull,Touch'] = [[Гм... Тебе кажется, что кошка не зафиксирована жёстко на столбе. Ты чувствуешь это по еле заметным колебаниям, когда ты пытаешься сдвинуть её с места.]];
|
|||
|
['before_Turn'] = function(s)
|
|||
|
if _'#safe':hasnt'locked' then
|
|||
|
p [[Ты поворачиваешь кошку обратно.]]
|
|||
|
_'#safe':attr'locked'
|
|||
|
else
|
|||
|
p [[Ты пробуешь повернуть кошку вокруг своей оси. Получается! При этом, ты слышишь хорошо различимый щелчок.]]
|
|||
|
_'#safe':attr'~locked'
|
|||
|
end
|
|||
|
end;
|
|||
|
}:attr'static,concealed,~animate';
|
|||
|
obj {
|
|||
|
-"портреты|картины";
|
|||
|
before_Take = [[Тёте Агате это не понравится.]];
|
|||
|
description = function(s)
|
|||
|
p[[Скорее всего на портретах изображены предки тётушки Агаты. Если присмотреться к одному из них, то можно найти еле-уловимое сходство... Ах, да это же и есть тётушка Агата!]]
|
|||
|
enable '#portrait'
|
|||
|
end;
|
|||
|
['before_LookUnder,Push,Pull,Transfer,Turn'] = function(s)
|
|||
|
if not disabled '#portrait' then
|
|||
|
return false
|
|||
|
end
|
|||
|
p [[Ты решаешь проверить все портреты и педантично изучаешь каждый из них. Под портретом на котором изображена сама тётушка Агата ты обнаруживаешь тайник!]]
|
|||
|
enable '#portrait'
|
|||
|
enable '#safe'
|
|||
|
_'#portrait'.opened = true
|
|||
|
end;
|
|||
|
}:attr'scenery';
|
|||
|
obj {
|
|||
|
-"портрет|картина|тётушка,Агата";
|
|||
|
opened = false;
|
|||
|
nam = '#portrait';
|
|||
|
dsc = function(s)
|
|||
|
p [[Среди портретов на стенах ты видишь портрет тётушки Агаты.]];
|
|||
|
if s.opened then
|
|||
|
p [[Картина сдвинута, на её месте находится сейф.]]
|
|||
|
end
|
|||
|
end;
|
|||
|
before_Take = [[Тёте Агате это не понравится!]];
|
|||
|
description = [[Это твоя тётушка Агата. Как живая!]];
|
|||
|
['before_Push,Pull,Transfer,Turn,LookUnder'] = function(s)
|
|||
|
if s.opened then
|
|||
|
p [[Ты сдвигаешь картину обратно.]]
|
|||
|
s.opened = false
|
|||
|
else
|
|||
|
p [[Поддавшись своему чутью, ты заглядываешь под портрет и, конечно же, обнаруживаешь там сейф!]];
|
|||
|
s.opened = true
|
|||
|
enable '#safe'
|
|||
|
end
|
|||
|
end;
|
|||
|
}:attr'~animate':disable();
|
|||
|
obj {
|
|||
|
-"сейф,тайник";
|
|||
|
nam = '#safe';
|
|||
|
title = [[В сейфе]];
|
|||
|
description = function(s)
|
|||
|
if s:has'open' then
|
|||
|
p [[Сейф открыт!]]
|
|||
|
mp:content(s)
|
|||
|
return
|
|||
|
end
|
|||
|
p [[На сейфе нет никаких признаков замка или кодовых ручек.]]
|
|||
|
end;
|
|||
|
before_Close = function(s)
|
|||
|
if me():where() == s and s:has'open' then
|
|||
|
p [[А если дверь не откроется?]]
|
|||
|
return
|
|||
|
end
|
|||
|
return false
|
|||
|
end;
|
|||
|
before_Enter = function(s)
|
|||
|
if s:has'open' then
|
|||
|
p [[Укрыться от всех невзгод в сейфе? Хороший план!]];
|
|||
|
return false
|
|||
|
else
|
|||
|
return false
|
|||
|
end
|
|||
|
end;
|
|||
|
}:attr 'scenery,openable,enterable,locked,container':disable():with {
|
|||
|
obj {
|
|||
|
-"сокровища|брильянты,алмазы|украшения|сокровище,золото,клад";
|
|||
|
description = [[Столько усилий и всё зря! Похоже, это неприкосновенный запас тётушки... Ты видишь тут: брильянты, золото, ювелирные украшения... Ты разочарована.]];
|
|||
|
before_Take = [[Грабить тётушку? Ты в своём уме? Пусть тут лежит.]];
|
|||
|
before_Enter = [[Что за пошлая мысль?]];
|
|||
|
};
|
|||
|
};
|
|||
|
door {
|
|||
|
-"лестница,ступен*";
|
|||
|
description = function(s)
|
|||
|
p [[Построено с размахом! На ступенях закреплена красная ковровая дорожка.]];
|
|||
|
if _'#podsobka':has'concealed' then
|
|||
|
_'#podsobka':attr'~concealed'
|
|||
|
p [[Под лестницей ты замечаешь небольшую дверь в подсобку.]]
|
|||
|
end
|
|||
|
end;
|
|||
|
before_LookUnder = function(s)
|
|||
|
_'#podsobka':attr'~concealed'
|
|||
|
p [[Под лестницей ты замечаешь небольшую дверь в подсобку.]]
|
|||
|
end;
|
|||
|
door_to = function(s)
|
|||
|
return std.call(here(), 'u_to')
|
|||
|
end;
|
|||
|
}:attr'scenery,open':with {
|
|||
|
obj {
|
|||
|
-"ковёр|ковровая дорожка,дорожка,красн*";
|
|||
|
description = function(s)
|
|||
|
p [[Это так в духе тётушки Агаты. Её любовь к роскоши выглядит скорее наивной, чем напыщенной.]];
|
|||
|
mp:content(s)
|
|||
|
end;
|
|||
|
before_Take = [[Дорожка надёжно закреплена.]];
|
|||
|
['before_Enter,Climb'] = [[Если хочешь подняться по лестнице, просто иди наверх.]];
|
|||
|
}:attr 'enterable'
|
|||
|
};
|
|||
|
obj {
|
|||
|
-"подсобка,кладовка,дверь,дверь подсобки,дверь в подсобку";
|
|||
|
nam = '#podsobka';
|
|||
|
title = [[В подсобке.]];
|
|||
|
inside_dsc = [[Ты находишься в подсобке.]];
|
|||
|
was_open = false;
|
|||
|
dsc = function(s)
|
|||
|
if s:hasnt'open' then
|
|||
|
p [[Под лестницей расположена дверь в подсобку.]];
|
|||
|
else
|
|||
|
p [[Дверь в подсобку открыта.]]
|
|||
|
mp:content(s)
|
|||
|
end
|
|||
|
end;
|
|||
|
description = function(s)
|
|||
|
if s:hasnt'open' then
|
|||
|
p [[Небольшая деревянная дверь подсобки закрыта. Замочной скважины не видно. Дверь без замка?]]
|
|||
|
return
|
|||
|
end
|
|||
|
return false
|
|||
|
end;
|
|||
|
["before_Open,Pull"] = function(s)
|
|||
|
if s:has'open' or s.was_open then
|
|||
|
return false
|
|||
|
end
|
|||
|
if s:once('1') then
|
|||
|
p [[Ты подёргала дверь. Не поддаётся. Странно.]];
|
|||
|
elseif s:once('2') then
|
|||
|
p [[Ты с силой дёргаешь дверь. Нет результата.]];
|
|||
|
else
|
|||
|
p [[Ты изо всех сил тянешь дверь на себя. Не открывается!]];
|
|||
|
end
|
|||
|
end;
|
|||
|
before_Attack = function(s)
|
|||
|
if s:has'open' then
|
|||
|
return false
|
|||
|
end
|
|||
|
p [[Ты не чувствуешь себя способной выломать эту дверь.]]
|
|||
|
end;
|
|||
|
before_Push = function(s)
|
|||
|
if s:has'open' then
|
|||
|
mp:xaction("Open", s)
|
|||
|
return
|
|||
|
end
|
|||
|
here().door_ask = true
|
|||
|
p [[Ха! Думаешь, дверь открывается в другую сторону? {$fmt em|Да?}]]
|
|||
|
end;
|
|||
|
}:attr'container,openable,enterable,concealed,static': with { 'lamp' };
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
-- Менять нельзя!!!! Это не ваш предмет!!! Вы не знаете как он выглядит, его придумает другой автор!!!
|
|||
|
obj {
|
|||
|
-"керосиновая лампа, лампа, старая лампа";
|
|||
|
nam = "lamp";
|
|||
|
kerosin = 0;
|
|||
|
description = function (s)
|
|||
|
p "Обычная керосиновая лампа.";
|
|||
|
if s.kerosin==0 then
|
|||
|
p "В ней нет керосина.";
|
|||
|
else
|
|||
|
p "Заправлена керосином.";
|
|||
|
end;
|
|||
|
if (s :has 'light') then
|
|||
|
p "Горит и светит.";
|
|||
|
else
|
|||
|
p "Не горит.";
|
|||
|
end;
|
|||
|
end;
|
|||
|
before_Fill = function(s,w)
|
|||
|
if not have('kerosin') then
|
|||
|
p "Тебе нечем наполнить лампу!";
|
|||
|
else
|
|||
|
_'lamp'.kerosin = 1;
|
|||
|
remove ('kerosin');
|
|||
|
p "Ты заправляешь лампу керосином, и избавляешься от опустевшей бутылочки.";
|
|||
|
end
|
|||
|
end;
|
|||
|
before_Burn = function(s,w)
|
|||
|
if not w then
|
|||
|
p "Чем ты хочешь зажечь лампу?";
|
|||
|
return true;
|
|||
|
end
|
|||
|
if not w^'matches' and not w^'kitchen_lighter' then
|
|||
|
p "Этим не зажечь лампу!";
|
|||
|
elseif w^'matches' then
|
|||
|
if s.kerosin==0 then
|
|||
|
p "Не выйдет! В лампе совершенно не осталось керосина! Сначала ее стоило бы наполнить чем-то горючим.";
|
|||
|
return true;
|
|||
|
end
|
|||
|
_'lamp':attr'light';
|
|||
|
remove ('matches');
|
|||
|
mp.score=mp.score+1;
|
|||
|
p "Ты поджигаешь лампу от последней спички.";
|
|||
|
else
|
|||
|
p "Зажигалка слишком толстая и не влазит в узкое горло керосиновой лампы.";
|
|||
|
end
|
|||
|
end;
|
|||
|
before_Rub = "Ты потёрла старую лампу, но ничего не произошло, и никакого джина из неё не вылезла. Попытаться, впрочем, стоило.";
|
|||
|
score=false;
|
|||
|
after_Take = function(s)
|
|||
|
if not s.score then
|
|||
|
mp.score=mp.score+1;
|
|||
|
end;
|
|||
|
_'lamp'.score=true;
|
|||
|
return false;
|
|||
|
end;
|
|||
|
};
|