You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1130 lines
39 KiB

require "snapshots"
mp.auto_animate = false
global {
list_clothing = std.list {};
}
game : dict {
["блузка/рд"] = 'блузки';
["блузка/вн"] = 'блузку';
["блуза/вн"] = 'блузу';
["блуза/рд"] = 'блузы';
["оторочка/рд"] = 'оторочки';
["оторочка/вн"] = 'оторочку';
["труселя/рд"] = 'труселей';
["труселя/вн"] = 'труселя';
["штаны/вн"] = 'штаны';
["термоштаны/вн"] = 'термоштаны';
["штаны/рд"] = 'штанов';
["термоштаны/рд"] = 'термоштанов';
["леггинсы/рд"] = 'леггинсов';
["легинсы/рд"] = 'легинсов';
["леггинсы/вн"] = 'леггинсы';
["легинсы/вн"] = 'легинсы';
["твидовый/рд"] = 'твидового';
["твидовый/вн"] = 'твидовый';
}
-- Синонимы из Cloak of Darkness. Не знаю почему это не стандарт.
Verb {
'#PutOn8',
'повес/ить',
'~ {noun}/вн,held на {noun}/вн,2,scene: PutOn',
'~ на {noun}/вн,2,scene {noun}/вн,held: PutOn reverse',
'~ {noun}/вн,held в {noun}/вн,2,scene: Insert',
}
Verb {
'#PutOn8_2',
'остав/ить',
'~ {noun}/вн,held на {noun}/пр,2,scene: PutOn',
}
-- Доступное пространство имён для объектов - все имена объектов должны начинаться с "room8_" или "garderob_"
-- Все описания можно менять
-- Задача: Игрок должен получить доступ на запад с помощью предмета thooskey. Изначально он должен быть закрыт. Игрок может придти в комнату как с этим предметом, так и без него
function room8_switch_temperature(temp, forced, showmsg)
local oldtemp = _('room8_garderob')._mode
-- TODO: очень тяжёлый цикл, надо как-то оптимизировать
list_clothing:for_each(function(v)
if (forced and v:where() ~= nil and v:where().nam == 'room8_control') then
return
end
if (
v.mode ~= nil
and v:where() ~= nil
and v:where().nam ~= 'emptyroom'
) then
local newobject = nil
if temp == 'hot' and v.paired_hot ~= nil then
newobject = _(v.paired_hot)
end
if temp == 'cold' and v.paired_cold ~= nil then
newobject = _(v.paired_cold)
end
if temp == 'neutral' and v.paired_neutral ~= nil then
newobject = _(v.paired_neutral)
end
if newobject ~= nil then
-- dprint('Меняем местами '..v.nam ..' и '..newobject.nam)
move(newobject, v:where());
if (v:has('worn')) then
newobject:attr('worn')
else
newobject:attr('~worn')
end
-- ЭТА СТРОКА ТРЕБУЕТ КОМНАТУ emptyroom В ФИНАЛЬНОЙ ИГРЕ
move(v, _('emptyroom'));
end
end
end)
_('room8_garderob')._mode = temp
if not showmsg then
return
end
if temp == 'cold' then
return 'В комнате становится холодно. Мороз захватывает вещи и выворачивает их. Твоя одежда покрывается мехом. Гардероб готов к зиме.'
end
if temp == 'hot' then
return 'В комнате становится жарко. Жара берёт каждую вещь и выжимает её для того, чтобы подготовить гардероб к летнему дню.'
end
if temp == 'neutral' then
return 'Комната возвращается в свою скучную неопределённо тёплую атмосферу.'
end
end
local function room8_drop_items()
local need_lever = (here()._mode ~= 'neutral');
if need_lever then
room8_switch_temperature('neutral', false, false);
end;
local need_take_clothing = false;
local need_wear_clothing = false;
local need_cloth = false;
list_clothing:for_each(function(v)
-- собрать свои вещи
if (v.own_clothes and not have(v)) then
need_take_clothing = true
take(v)
end
-- надеть свои вещи
if (v.own_clothes and v:has('~worn')) then
need_wear_clothing = true
v:attr('worn');
end
-- снять чужие вещи
if (not v.own_clothes and v:has('worn')) then
v:attr('~worn');
end
-- повесить остальные в шкаф
if (v:where() ~= nil and not v.own_clothes and v:where().nam ~= 'room8_clothes' and v.mode == 'neutral') then
move(v, 'room8_clothes');
need_cloth = true;
end
end)
if need_lever or need_cloth or need_wear_clothing or need_take_clothing then
p 'Ты ';
local txt = ''
if need_take_clothing then
txt = 'собираешь свои вещи'
if need_wear_clothing then
if need_cloth or need_lever then
txt = txt .. ', '
else
txt = txt .. ' и '
end
txt = txt .. 'надеваешь их'
end
elseif need_wear_clothing then
txt = 'надеваешь свои вещи'
end
if need_cloth then
if (txt ~= '') then
if (need_lever) then
txt = txt .. ', '
else
txt = txt .. ' и '
end
end
txt = txt .. 'аккуратно вешаешь одежду обратно в шкаф'
end;
if need_lever then
if (txt ~= '') then
txt = txt .. ' и '
end
txt = txt .. 'возвращаешь рычаг в среднее положение.'
else
txt = txt .. '.'
end;
pn(txt)
end;
end;
room {
nam = "room8_garderob";
title = "Гардеробная комната";
dsc = function(s)
if s:once() then
snapshots:write('entersroom');
end
local description = '';
if s.hot() then
description = [[Жарко. ]];
end
local clothes = ''
if _('room8_lock').obj[1] ~= nil then
clothes = clothes .. 'На замке двери висит '.._('room8_lock').obj[1]:noun('им')..'.';
end
if _('room8_control').obj[2] ~= nil then
clothes = clothes .. 'На рычаге висит '.._('room8_control').obj[2]:noun('им')..'.';
end
return description..[[
Ты стоишь в маленьком повороте прихожей, между шкафом с одеждой и пустой стеной, украшенной ярким плакатом. Рядом с плакатом находится серый рычаг с фигурной рукояткой. Комната продолжает прихожую (на западе) и упирается в дверь гаража (на востоке). Возле стены стоит пьедестал с надписью «Машина времени».
]]..clothes;
end;
e_to = function()
if _('room8_garagedoor'):has('locked') then
p 'Дверь закрыта на электронный замок.';
return;
end;
room8_drop_items();
return 'room9_garazh';
end;
w_to = function()
room8_drop_items();
return 'room3_hall';
end;
_mode = 'neutral';
hot = function()
return here()._mode == 'hot'
end;
cold = function()
return here()._mode == 'cold'
end;
temperature = function(temp)
if (temp ~= 'hot' and temp ~= 'cold' and temp ~= 'neutral') then
return
end
return room8_switch_temperature(temp, false, true)
end;
before_Listen = function(s)
if s.cold() then
return "Здесь тихо, и ты слышишь только своё замерзающее дыхание.";
elseif s.hot() then
return "Быстро разогретые крючки шкафа тихо шипят. Молчание.";
else
return "Тишина.";
end
end;
before_Smell = " не пахнет.";
}
obj {
-"вешалка/жр,но|вешалки/мн,жр,но";
nam = "room8_hanger";
found_in = 'room8_clothes';
description = 'Здесь нет вешалок, одежда висит на крючках.';
}: attr 'concealed,static';
obj {
-"рукоятка,рукоятка рычага/жр,но|монстр/мн,од|язык/но,мр";
nam = 'room8_control_end';
found_in = 'room8_control';
description = 'Изогнутый декоративный крюк на конце рычага изображает язык милого монстра. За эту рукоятку удобно хвататься.';
before_Receive = function(self, thing)
mp:xaction('PutOn', thing, _('room8_control'));
end;
}: attr 'concealed,static,~animate';
obj {
-"единорог/мр,од|единороги/мр,од,мн|фигура/жр,но|фигуры/мн,жр,но";
nam = 'room8_clothes_details';
found_in = 'room8_garderob';
description = 'Сцены из жизни какой-то девушки с мечом, которая захватывает волшебную страну единорогов, находит там какого-то пучеглазого монстра и уезжает с ним в большой дом, который подозрительно напоминает дом твоей тёти. Хм.';
}: attr 'concealed,static';
obj {
-"рычаг,кондиционер/мр,но";
nam = "room8_control";
found_in = 'room8_garderob';
description = function(self)
local r = 'Это тяжёлый вертикальный рычаг с рукояткой в виде изогнутого крюка'
if here().cold() then
r = r .. ', который поднят в сторону надписи "ШЕРСТЬ". Его можно '..fmt.b('толкнуть')..' вниз, в нейтральное положение.'
elseif here().hot() then
r = r .. ', который опущен в сторону надписи "ПЕСОК". Его можно '..fmt.b('потянуть')..' вверх, в нейтральное положение.'
else
r = r .. ', который выставлен между надписей "ШЕРСТЬ" и "ПЕСОК". Его можно '..fmt.b('потянуть')..' вверх или '..fmt.b('толкнуть')..' вниз.'
end
pn(r)
if self.obj[2] ~= nil then
pn ('На рычаге висит '..self.obj[2]:noun('им')..'.')
end;
return true
end;
after_Receive = function(self, thing)
local weight = 0
if thing.weight ~= nil then
weight = thing.weight
end
if weight == 0 then
return ('Рычаг, конечно, не рассчитан на одежду, но '..thing:noun('им')..' для него — не проблема.');
end
if weight == 1 then
return ('Рычаг издаёт короткий скрип, но в остальном не замечает, что на нём висит '..thing:noun('им')..'.');
end
if weight == 2 then
return ('Рычаг скрипит, но выдерживает вес '..thing:noun('рд')..'.');
end
if weight > 2 then
if here().hot() then
return 'Рычаг громко скрипит под тяжестью одежды.';
else
return 'Рычаг со скрипом падает под тяжестью одежды в нижнее положение. '..room8_switch_temperature('hot', true, true)
end
end
end;
before_Pull = function(self)
if here().hot() and self.obj[2] ~= nil and self.obj[2].weight ~= nil and self.obj[2].weight > 2 then
return 'Тяжёлая одежда на рычаге не даёт поднять его.'
end;
if here().cold() then
return 'Это крайнее положение.'
end
if here().hot() then
return here().temperature('neutral')
end
return here().temperature('cold')
end;
before_Push = function()
if here().hot() then
return 'Это крайнее положение.'
end
if here().cold() then
return here().temperature('neutral')
end;
return here().temperature('hot')
end;
capacity = 2;
}: attr 'static,supporter,scenery';
obj {
-"зубчатый ключ,ключ";
nam = "thooskey";
description = "Зубчатый ключ.";
}:attr 'disabled';
obj {
-"дверь/жр,но";
nam = 'room8_garagedoor';
found_in = 'room8_garderob';
with_key = 'thooskey';
after_Unlock = function(s)
if _('thooskey' ~= nil) then
_('thooskey'):disable();
end
mp.score=mp.score+1;
return 'Ключ застревает в замке, но дверь всё-таки открывается.';
end;
description = function(s)
if s:has('locked') then
return "Закрытая дверь, на которой мигает электронный замок.";
end
return "Дверь в гараж, распахнутая настежь. Можно идти на запад.";
end;
when_open = 'Дверь в гараж открыта.';
}: attr 'scenery,openable,lockable,locked';
obj {
-"замок,электронный замок/мр,но";
nam = 'room8_lock';
before_Burn = function(self, thing)
if not (thing ^ 'matches' or thing ^ 'kitchen_lighter' or thing ^ 'kerosin' or thing ^ 'lamp') then
return 'Во-первых, '..thing:noun('им')..' ты не подожжёшь. Во-вторых, пожар скорее сожжёт весь дом, чем замок на этой двери.';
end
return 'Стальной корпус от этого не разогреется, а костёр скорее сожжёт дом, чем отдельный электронный замок. Плохая идея.';
end;
before_Unlock = function(self, thing)
pn('Жаль, но электронный замок не открывается '..thing:noun('тв')..', хотя в двери ты замечаешь замочную скважину.');
mp:xaction('Unlock', _('room8_garagedoor'), thing);
end;
found_in = 'room8_garderob';
before_Attack = 'Антивандальная защита замка состоит в том, что у него нет отверстий, а стальной корпус нельзя пробить.';
before_Touch = function(s)
if here().hot() then
return "Замок обжигающе горяч на ощупь.";
elseif here().cold() then
return "Осторожно, так и примёрзнуть пальцем можно. Он же ледяной.";
end;
return "Металл как металл.";
end;
capacity = 1;
after_Receive = function(self, thing)
local is_boiling = here().hot() and thing.mode == 'cold';
if is_boiling and not self:has('broken') then
pn ('Из-под '..thing:noun('рд')..' доносится резкий писк, затем что-то начинает шипеть и ты видишь струйку дыма. Дверь распахивается настежь.');
_('room8_garagedoor'):attr('open');
_('room8_garagedoor'):attr('~locked');
mp.score=mp.score+1;
self:attr('broken')
return true;
end;
return false;
end;
description = function(s)
local description = 'Электронный замок со стальным корпусом и гордой наклейкой «Модель "Невзломайка" с антивандальной защитой. Проверено в режиме от минус сорока до сорока градусов.» Это маленькая коробка с двумя лампочками.';
if s:has('broken') then
description = description .. ' Внутри замка что-то перегрелось и расплавилось. Он безнадёжно сломан.'
else
description = description .. ' Сейчас горит красная лампочка с надписью "Требуется ключ-карта".';
if here().hot() then
description = description .. " Воздух вокруг замка заметно нагрет, а лампочка немного мигает.";
elseif here().cold() then
description = description .. " Наклейка покрылась коркой льда.";
end;
end
pn(description);
return false;
end;
}: attr 'scenery,supporter,transparent';
clothing = Class {
check_inventory = function(level, nam, part)
local c = nil; -- одежда того же уровня
local j = nil; -- одежда более высокого уровня
me():inventory():for_each(function(v)
if not v:has('clothing') then
return
end
if not v:has('worn') then
return
end
local newlevel = v.getlevel(v)
local newpart = v.getpart(v)
if (
newlevel == level
and v.nam ~= nam
and newpart == part
) then
c = v
elseif newlevel > level and newpart == part then
j = v
level = newlevel
end
end)
return {c, j, level};
end;
getlevel = function(self)
if self == nil then
dprint('В функцию getlevel передан null')
return 0
end
local level = self.level;
if level == nil then
level = 0
end;
return level;
end;
getpart = function(self)
if self == nil then
dprint('В функцию getlevel передан null')
return 0
end
local part = self.part;
if part == nil then
part = 'top';
end;
return part;
end;
each_turn = function(s)
if here().nam == 'room8_garderob' or not have(s) or not s:has('worn') then
s:attr'~concealed'
else
s:attr'concealed'
end
end;
before_Any = function(s)
if here().nam == 'room14_secondfloor' then
return "Это не то место, где тебе это понадобится.";
else
return false;
end
end;
-- Проверка надевания: нельзя надеть майку на шубу
-- Проверка снятия: нельзя снять майку перед шубой
['before_Wear,Disrobe'] = function(self)
local level = self.getlevel(self);
local part = self.getpart(self)
local retval = self.check_inventory(level, self.nam, part);
local c = retval[1];
local j = retval[2];
level = retval[3];
if (j ~= nil) then
return 'Сначала нужно снять '..j:noun('вн')..'.';
end;
if (mp.event == 'Wear' and c ~= nil) then
return 'Ты не можешь одновременно носить '..c:noun('вн') .. ' и '..self:noun('вн')..'.';
end
if (mp.event == 'Disrobe') then
if here().nam == 'room8_garderob' then
return false;
else
return 'Ну не здесь же!';
end;
end;
return false;
end;
}: attr 'clothing';
-- Да, ты можешь писать "открыть крючок" потому что это синоним шкафа.
-- Но то, что крючки не смоделированы, должно намекать на их несущественность.
obj {
-"шкаф,гардероб/мр,но|крючки/мр,мн,но|крючок/мр,но|одежда/жр,но";
nam = 'room8_clothes';
before_Receive = function(self, thing)
if not thing:has('clothing') then
return 'Это — шкаф только для одежды.';
end;
return false;
end;
after_Receive = function(self, thing)
return('Ты находишь свободный крючок и вешаешь '..thing:noun('вн')..' в шкаф.');
end;
found_in = 'room8_garderob';
description = function(self)
local dsc = 'Старинный платяной шкаф с резными фигурами на дверцах.';
if self:has 'open' and #self.obj > 3 then
dsc = dsc .. ' Плотно забит одеждой.';
end
pn(dsc);
return false;
end;
}: attr 'container,openable,static,scenery';
--[[
не участвуют в системе одежды, невозможно снять: туфли, нижнее бельё
level = 0: шарф, головной платок
level = 1: штаны
level = 2: рубашка, майка
level = 3: пиджак, куртка
level = 4: шуба
--]]
clothing {
-"синяя кепка,кепка/жр,но";
nam = 'room8_cap';
level = 0;
part = 'head';
mode = 'neutral';
paired_hot = 'room8_baseballcap';
paired_cold = 'room8_ushanka';
description = 'Старая синяя кепка с греческой буквой «альфа».';
}
clothing {
-"чёрная ушанка,ушанка/жр,но";
nam = 'room8_ushanka';
part = 'head';
level = 0;
weight = 0;
mode = 'cold';
paired_hot = 'room8_baseballcap';
paired_neutral = 'room8_cap';
description = 'Чёрная тёплая ушанка с жёлтым геральдическим львом на лбу.';
}
-- я не знаю почему но auto_animate считает ЭТО живым
clothing {
-"белая бейсболка,бейсболка/жр,но";
nam = 'room8_baseballcap';
part = 'head';
level = 0;
mode = 'hot';
paired_neutral = 'room8_cap';
paired_cold = 'room8_ushanka';
description = 'Новенькая белая бейсболка.';
}: dict {
['бейсболка/вн'] = 'бейсболку';
['белая бейсболка/вн'] = 'белую бейсболку';
['бейсболка/дт'] = 'бейсболке';
['белая бейсболка/дт'] = 'белой бейсболке';
}: attr '~animate';
-- Сюжетная проблема: так как мы моделируем одежду до уровней,
-- героиня должна быть во что-то одета изначально.
-- Придётся давать ей вещи в самом начале игры.
clothing {
-"бра/ср|бюстгальтер,лифчик/мр";
nam = 'room8_underwear_top';
description = 'Твоё нижнее бельё.';
part = 'top';
own_clothes = true;
before_Disrobe = function()
return 'Да ни за что.';
end;
each_turn = function(s) end
}: attr 'worn,concealed';
clothing {
-"трусы,трусики,труселя/ср,мч,мн|белье,бельё/ср";
nam = 'room8_underwear_bottom';
part = 'bottom';
description = 'Твоё нижнее бельё.';
own_clothes = true;
before_Disrobe = function()
return 'Да ни за что.';
end;
each_turn = function(s) end
}: attr 'worn,concealed';
clothing {
-"туфли/жр,мч,мн|туфля/жр";
nam = 'room8_shoes';
part = 'feet';
description = 'Чёрные блестящие туфли на каблуке.';
own_clothes = true;
before_Disrobe = function()
return 'Да ни за что.';
end;
each_turn = function(s) end
}: attr 'worn,concealed';
clothing {
-"деловые штаны/ср,мч,мн";
nam = 'room8_pants';
own_clothes = true;
part = 'bottom';
mode = 'neutral';
description = 'Чёрные деловые штаны.';
paired_hot = 'room8_shorts';
paired_cold = 'room8_winterpants';
level = 1;
}: attr 'worn';
clothing {
-"шорты/ср,мч,мн";
nam = 'room8_shorts';
part = 'bottom';
mode = 'hot';
paired_neutral = 'room8_pants';
paired_cold = 'room8_winterpants';
description = 'Короткие серые шорты.';
level = 1;
}
clothing {
-"зимние штаны/ср,мч,мн";
nam = 'room8_winterpants';
part = 'bottom';
mode = 'cold';
paired_neutral = 'room8_pants';
paired_hot = 'room8_shorts';
weight = 3;
description = 'Зимние утеплённые штаны. Очень тяжёлые.';
level = 1;
}
clothing {
-"белая блузка,блузка,белая блуза,блуза/жр";
nam = 'room8_blouse';
part = 'top';
description = 'Белая блузка с принтом картины Малевича на груди.';
mode = 'neutral';
own_clothes = true;
level = 2;
weight = 1;
paired_cold = 'room8_winterblouse';
paired_hot = 'room8_shortblouse';
}: attr 'worn';
clothing {
-"вязаная блуза,шерстяная блуза,блуза/жр";
nam = 'room8_winterblouse';
part = 'top';
description = 'Белая вязаная блузка.';
mode = 'cold';
paired_neutral = 'room8_blouse';
paired_hot = 'room8_shortblouse';
level = 2;
weight = 2;
}
clothing {
-"блузка,мини-блузка,мини-блуза,блуза/жр";
nam = 'room8_shortblouse';
part = 'top';
description = 'Белая мини-блузка. Может быть, даже мини-мини.';
mode = 'hot';
paired_neutral = 'room8_blouse';
paired_cold = 'room8_winterblouse';
level = 2;
weight = 1;
}
clothing {
-"жилет/мр";
nam = 'room8_formalvest';
description = 'Чёрный короткий жилет.';
level = 3;
weight = 1;
part = 'top';
mode = 'hot';
paired_neutral = 'room8_formalcoat';
paired_cold = 'room8_winter_formalсoat';
}
clothing {
-"твидовый пиджак,пиджак/мр,но";
nam = 'room8_winter_formalсoat';
description = 'Чёрный твидовый пиджак. Очень тёплый.';
level = 3;
weight = 1;
part = 'top';
mode = 'cold';
paired_neutral = 'room8_formalcoat';
paired_hot = 'room8_formalvest';
}
clothing {
-"чёрный пиджак,черный пиджак,пиджак/мр,но";
nam = 'room8_formalcoat';
paired_hot = 'room8_formalvest';
paired_cold = 'room8_winter_formalсoat';
description = 'Чёрный женский пиджак. Выглядит очень профессионально.';
own_clothes = true;
level = 3;
weight = 2;
part = 'top';
mode = 'neutral';
}: attr 'worn';
take('room8_underwear_bottom');
take('room8_shoes');
take('room8_pants');
take('room8_blouse');
take('room8_formalcoat');
take('room8_underwear_top');
clothing {
-"леггинсы,легинсы/ср,мн";
nam = 'room8_leggins';
part = 'bottom';
level = 1;
mode = 'hot';
paired_cold = 'room8_thermo';
paired_neutral = 'room8_sport';
description = 'Белые спортивные леггинсы из быстро сохнущей ткани.';
}
clothing {
-"спортивные штаны,спортивки/ср,мн";
nam = 'room8_sport';
part = 'bottom';
level = 1;
mode = 'neutral';
found_in = 'room8_clothes';
paired_hot = 'room8_leggins';
paired_cold = 'room8_thermo';
description = 'Спортивные облегающие штаны с полосками.';
}
clothing {
-"термоштаны/ср,мн";
nam = 'room8_thermo';
part = 'bottom';
level = 1;
mode = 'cold';
paired_hot = 'room8_leggins';
paired_neutral = 'room8_sport';
description = 'Белые тёплые леггинсы для очень холодной погоды.';
}
clothing {
-"халат/мр";
nam = 'room8_robe';
level = 2;
weight = 2;
part = 'top';
mode = 'cold';
paired_neutral = 'room8_tshirt';
paired_hot = 'room8_sportshirt';
description = 'Махровый тёплый клетчатый халат, в котором всегда тепло и мягко.';
}
clothing {
-"майка/жр";
nam = 'room8_tshirt';
part = 'top';
mode = 'neutral';
level = 1;
paired_cold = 'room8_robe';
paired_hot = 'room8_sportshirt';
description = 'Лёгкая белая майка, на спине нарисованы крестики-нолики.';
}
clothing {
-"футболка/жр";
nam = 'room8_sportshirt';
mode = 'hot';
part = 'top';
level = 1;
paired_cold = 'room8_robe';
paired_neutral = 'room8_tshirt';
description = 'Спортивная полосатая футболка с короткими рукавами. На спине нарисован номер 7.';
}
clothing {
-"шуба/жр|мутон/мр";
nam = 'room8_wintercoat';
part = 'top';
level = 4;
weight = 3;
mode = 'cold';
paired_hot = 'room8_overcoat';
paired_neutral = 'room8_raincoat';
description = 'Меховая мутоновая шуба. Не совсем подходящая одежда для отапливаемых помещений. У меха какой-то странный зелёный оттенок.';
}
clothing {
-"дождевик/мр";
nam = 'room8_raincoat';
part = 'top';
paired_cold = 'room8_wintercoat';
paired_hot = 'room8_overcoat';
found_in = 'room8_clothes';
level = 4;
weight = 2;
mode = 'neutral';
description = 'Яркий синий непромокаемый дождевик.';
}
clothing {
-"накидка/жр";
nam = 'room8_overcoat';
part = 'top';
paired_cold = 'room8_wintercoat';
paired_neutral = 'room8_raincoat';
level = 4;
weight = 0;
mode = 'hot';
description = 'Лёгкая цветная полупрозрачная накидка.';
}
clothing {
-"тёплая рубашка/жр,но";
nam = 'room8_warmshirt';
part = 'top';
level = 2;
mode = 'cold';
paired_hot = 'room8_lightwear';
paired_neutral = 'room8_shirt';
description = 'Утеплённая салатовая рубашка с длинными рукавами.';
}
clothing {
-"рубашка/жр";
nam = 'room8_shirt';
part = 'top';
level = 2;
found_in = 'room8_clothes';
paired_hot = 'room8_lightwear';
paired_cold = 'room8_warmshirt';
mode = 'neutral';
description = 'Женская салатовая рубашка с длинными рукавами.';
}
clothing {
-"лёгкая рубашка,рубашка/жр,но";
nam = 'room8_lightwear';
part = 'top';
level = 2;
mode = 'hot';
paired_cold = 'room8_warmshirt';
paired_neutral = 'room8_shirt';
description = "Чёрная рубашка с длинными рукавами с большими дырами для вентиляции. Очень большими дырами.";
}
clothing {
-"шарф/мр";
nam = 'room8_winterscarf';
part = 'head';
level = 0;
mode = 'cold';
paired_neutral = 'room8_shawl';
paired_hot = 'room8_kerchief';
description = 'Шерстяной клетчатый шарф с надписью «ЭНИГМА».'
}
clothing {
-"шаль/жр";
nam = 'room8_shawl';
found_in = 'room8_clothes';
part = 'head';
level = 0;
weight = 1;
mode = 'neutral';
paired_cold = 'room8_winterscarf';
paired_hot = 'room8_kerchief';
description = 'Клетчатая шаль с витыми узорами по краям.';
}
clothing {
-"платок/мр";
nam = 'room8_kerchief';
part = 'head';
level = 0;
mode = 'hot';
paired_cold = 'room8_winterscarf';
paired_neutral = 'room8_shawl';
description = 'Лёгкий прозрачный платок для головы.';
}
clothing {
-"майка-свитер, майка, свитер/мр";
nam = 'room8_sweatershirt';
part = 'top';
weight = 2;
level = 3;
mode = 'hot';
paired_cold = 'room8_duckdown_jacket';
paired_neutral = 'room8_puffyvest';
description = 'Синяя майка, стилизованная под свитер. На ней даже напечатаны ниточки.';
}
clothing {
-"тёплый жилет,жилет/мр";
nam = 'room8_puffyvest';
part = 'top';
weight = 2;
level = 3;
mode = 'neutral';
paired_cold = 'room8_duckdown_jacket';
paired_hot = 'room8_sweatershirt';
description = 'Синий пуховой жилет с короткими рукавами.';
}
clothing {
-"пуховик/мр";
nam = 'room8_duckdown_jacket';
part = 'top';
weight = 3;
level = 3;
paired_hot = 'room8_sweatershirt';
paired_neutral = 'room8_puffyvest';
mode = 'cold';
description = 'Синий длинный пуховик для сорокаградусных морозов. В нём ты будешь выглядеть синим колобком. А если найти поясок, то колбаской.'
}
obj {
-"машина времени,машина/жр,но|пьедестал,переключатель/мр,но|кнопка/жр,но";
nam = 'room8_timemachine';
found_in = 'room8_garderob';
description = 'Маленький пьедестал с надписью «Машина времени однонаправленная». На пьедестале находится переключатель, который указывает на положение «ВЫКЛ».';
after_SwitchOn = function()
pn "Реальность немного расплывается… а затем собирается воедино.";
-- Метапарсер для команды UNDO занимает дефолтный слот снапшотов,
-- так что нам надо использовать свой слот
snapshots:restore('entersroom');
end;
after_Push = function()
pn "Реальность немного расплывается… а затем собирается воедино.";
snapshots:restore('entersroom');
end;
}: attr 'switchable,static,scenery';
obj {
-"плакат,постер,комикс/мр,но";
nam = 'room8_poster';
found_in = 'room8_garderob';
description = [[
Цветной комикс: человек заходит в магазин одежды.^
— Я ищу что-нибудь, что кричало бы «Тяжёлый металл!»^
— Мы положили в каждый карман вот этого пуховика по гантели. Надевать для примерки будете?
]];
}: attr 'static,scenery';
obj {
-"прихожая/жр,но|поворот/ср,но";
nam = 'room8_out_e';
found_in = 'room8_garderob';
description = 'Отсюда видна часть прихожей.';
}: attr 'static,concealed';
obj {
-"карман/мр,но|карманы/мн,мр,но";
nam = 'room8_out_pockets';
before_Drop = 'Нет, ты же можешь таскать с собой столько вещей!';
before_Receive = function(self, thing)
mp:xaction('Take', thing)
end;
description = 'Карманы пусты, в них нет ничего интересного.';
}: attr 'concealed,container';
take('room8_out_pockets');
obj {
-"стены/мн,жр,но|обои/мн,ср,но|стена/жр,но";
nam = 'room8_out_wallsw';
found_in = 'room8_garderob';
description = 'Обычные стены с бежевыми обоями. На одной из стен висит постер.';
}: attr 'scenery,~animate';
obj {
-"пол,линолеум/мр,но";
nam = 'room8_out_floor';
found_in = 'room8_garderob';
description = 'Непримечательный тёмно-коричневый линолеум.';
}: attr 'scenery,~animate';
obj {
-"потолок/мр,но";
nam = 'room8_out_ceiling';
found_in = 'room8_garderob';
description = 'Белый натяжной потолок со встроенными светильниками.';
}: attr 'scenery,~animate';
obj {
-"светильник/мр,но|светильники/мр,мн,но|лампочка/жр,но|лампочки/мн,жр,но";
nam = 'room8_out_ceilinglight';
found_in = 'room8_garderob';
description = 'Обычные лампочки в потолке освещают комнату мягким белым светом.';
}: attr 'scenery,~animate,light';
clothing {
-"юбка/жр";
nam = 'room8_skirt';
part = 'bottom';
weight = 1;
level = 1;
found_in = 'room8_clothes';
mode = 'neutral';
description = 'Красная длинная юбка в зелёный горошек.';
paired_hot = 'room8_miniskirt';
paired_cold = 'room8_coldskirt';
}
clothing {
-"миниюбка,мини-юбка,юбка,мини/жр";
nam = 'room8_miniskirt';
part = 'bottom';
weight = 0;
paired_neutral = 'room8_skirt';
paired_cold = 'room8_coldskirt';
level = 1;
mode = 'hot';
description = 'Красная мини-юбка с зелёными полосами по бокам.'
}: dict {
['миниюбка/рд'] = 'миниюбки';
['миниюбка/вн'] = 'миниюбку';
['мини-юбка/рд'] = 'мини-юбки';
['мини-юбка/вн'] = 'мини-юбку';
['мини/вн'] = 'мини';
['мини/рд'] = 'мини';
}
clothing {
-"вязаная юбка,юбка/жр";
nam = 'room8_coldskirt';
part = 'bottom';
weight = 2;
paired_neutral = 'room8_skirt';
paired_hot = 'room8_miniskirt';
level = 1;
mode = 'cold';
description = 'Длинная вязаная бордовая юбка с фигурной вышивкой по краям.';
}
clothing {
-"парадное платье,платье/ср";
nam = 'room8_parade_dress';
part = 'top';
description = 'Это огромное бордовое парадное платье с рюшами, несколькими внутренними юбками и длинным шлейфом.';
mode = 'neutral';
found_in = 'room8_clothes';
paired_hot = 'room8_eveningdress';
paired_cold = 'room8_colddress';
level = 2;
-- подлянка для игрока: платье достаточно тяжёлое, чтобы его перенести в тёплый режим, но там оно бесполезно
weight = 3;
}
clothing {
-"вечернее платье,платье/ср";
nam = 'room8_eveningdress';
part = 'top';
description = 'Длинное синее вечернее платье из легко проветриваемой ткани.';
mode = 'hot';
paired_neutral = 'room8_parade_dress';
paired_cold = 'room8_colddress';
level = 2;
weight = 1;
}
clothing {
-"тёплое платье,меховое платье,платье/ср|оторочка/жр";
nam = 'room8_colddress';
part = 'top';
description = 'Это красное вечернее утеплённое платье с меховой оторочкой.';
mode = 'cold';
paired_neutral = 'room8_parade_dress';
paired_hot = 'room8_eveningdress';
level = 2;
weight = 1;
}
clothing {
-"куртка/жр";
nam = 'room8_jacket';
found_in = 'room8_clothes';
part = 'top';
level = 3;
mode = 'neutral';
paired_cold = 'room8_hoody';
paired_hot = 'room8_top';
description = 'Кожаная куртка с нашивкой «ПИНГВИН». Хороша в пасмурный день.';
}
clothing {
-"топ,верх/мр";
nam = 'room8_top';
part = 'top';
level = 1;
mode = 'hot';
paired_neutral = 'room8_jacket';
paired_cold = 'room8_hoody';
description = 'Белый спортивный верх (топ) из быстро сохнущей ткани.';
}
clothing {
-"толстовка/жр";
nam = 'room8_hoody';
part = 'top';
level = 3;
paired_neutral = 'room8_jacket';
paired_hot = 'room8_top';
mode = 'cold';
description = 'Серая спортивная толстовка с длинными рукавами.';
}
std.for_each_obj(function(v)
if (v.check_inventory ~= nil and v.getlevel ~= nil) then
list_clothing:add(v)
end
end)