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)