mirror of
https://github.com/goraph/17rooms.git
synced 2024-05-04 14:38:15 +03:00
1045 lines
36 KiB
Lua
1045 lines
36 KiB
Lua
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)
|
||
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 temp == 'cold' then
|
||
return 'В комнате становится холодно. Мороз захватывает вещи и выворачивает их. Твоя одежда покрывается мехом. Гардероб готов к зиме.'
|
||
end
|
||
if temp == 'hot' then
|
||
return 'В комнате становится жарко. Жара берёт каждую вещь и выжимает её для того, чтобы подготовить гардероб к летнему дню.'
|
||
end
|
||
if temp == 'neutral' then
|
||
return 'Комната возвращается в свою скучную неопределённо тёплую атмосферу.'
|
||
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;
|
||
return 'room9_garazh';
|
||
end;
|
||
w_to = 'room3_hall';
|
||
_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)
|
||
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
|
||
return 'Рычаг со скрипом падает под тяжестью одежды в нижнее положение. '..room8_switch_temperature('hot', true)
|
||
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 then
|
||
pn ('Из-под '..thing:noun('рд')..' доносится резкий писк, затем что-то начинает шипеть и ты видишь струйку дыма. Дверь распахивается настежь.');
|
||
_('room8_garagedoor'):attr('open');
|
||
_('room8_garagedoor'):attr('~locked');
|
||
if not self:has('broken') then
|
||
mp.score=mp.score+1;
|
||
end;
|
||
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';
|
||
before_Disrobe = function()
|
||
return 'Да ни за что.';
|
||
end;
|
||
each_turn = function(s) end
|
||
}: attr 'worn,concealed';
|
||
|
||
clothing {
|
||
-"трусы,трусики,труселя/ср,мч,мн|белье,бельё/ср";
|
||
nam = 'room8_underwear_bottom';
|
||
part = 'bottom';
|
||
description = 'Твоё нижнее бельё.';
|
||
before_Disrobe = function()
|
||
return 'Да ни за что.';
|
||
end;
|
||
each_turn = function(s) end
|
||
}: attr 'worn,concealed';
|
||
|
||
clothing {
|
||
-"туфли/жр,мч,мн|туфля/жр";
|
||
nam = 'room8_shoes';
|
||
part = 'feet';
|
||
description = 'Чёрные блестящие туфли на каблуке.';
|
||
before_Disrobe = function()
|
||
return 'Да ни за что.';
|
||
end;
|
||
each_turn = function(s) end
|
||
}: attr 'worn,concealed';
|
||
|
||
clothing {
|
||
-"штаны/ср,мч,мн";
|
||
nam = 'room8_pants';
|
||
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';
|
||
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 = 'Чёрный женский пиджак. Выглядит очень профессионально.';
|
||
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)
|