mirror of https://github.com/goraph/17rooms
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
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)
|
|
|