2021-05-04 14:35:02 +03:00
-- Доступное пространство имён для объектов - все имена объектов должны начинаться с "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 ;
2021-10-07 21:01:38 +03:00
} : attr ' static,~animate ' : disable ( ) ;
2021-05-04 14:35:02 +03:00
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 = [[Что за пошлая мысль?]] ;
2021-10-07 21:01:38 +03:00
} : attr ' static ' ;
2021-05-04 14:35:02 +03:00
} ;
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 ' ] = [[Если хочешь подняться по лестнице, просто иди наверх.]] ;
2021-10-07 21:01:38 +03:00
} : attr ' enterable,static '
2021-05-04 14:35:02 +03:00
} ;
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 )
2021-09-20 20:53:08 +03:00
if not w and _ ' kerosin ' : access ( ) then
mp : check_held ( _ ' kerosin ' ) ;
elseif w then
mp : check_held ( w ) ;
end ;
if not w and not have ( ' kerosin ' ) then
2021-05-04 14:35:02 +03:00
p " Т е б е нечем наполнить лампу!" ;
2021-09-20 20:53:08 +03:00
elseif w and not w ^ ' kerosin ' then
return false ;
2021-05-04 14:35:02 +03:00
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 ;
2021-09-20 20:53:08 +03:00
before_Rub = " Ты потёрла старую лампу, но ничего не произошло, и никакого джина из неё не вылезло. Попытаться, впрочем, стоило. " ;
2021-05-04 14:35:02 +03:00
score = false ;
after_Take = function ( s )
if not s.score then
mp.score = mp.score + 1 ;
end ;
_ ' lamp ' . score = true ;
return false ;
end ;
} ;
2021-09-20 20:53:08 +03:00
VerbExtend { " #Fill " ,
" в {noun}/вн {noun}/вн : Fill " ,
" ~ внутрь {noun}/рд {noun}/вн : Fill " ,
" ~ {noun}/вн {noun}/тв : Fill " ,
" ~ {noun}/вн в {noun}/вн : Fill reverse " ,
" ~ {noun}/вн внутрь {noun}/рд : Fill reverse " ,
" ~ {noun}/тв {noun}/вн : Fill reverse "
}
function mp : after_Fill ( w , wh )
if wh then
mp : message ' Fill.FILL2 '
else
mp : message ' Fill.FILL '
end
end
mp.msg . Fill.FILL2 = " Наполнять {#first/вн} {#second/тв} бессмысленно. "