From 9dfdcef7b73e6678ad9b4cb86aa1dc4d74bd6b4b Mon Sep 17 00:00:00 2001 From: Alexander Yakovlev Date: Sun, 3 Oct 2021 14:41:38 +0700 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=B2=D1=82=D0=BE=D1=83=D0=B1=D0=BE?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20=D0=B3=D0=B0=D1=80=D0=B4=D0=B5=D1=80=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- room8.lua | 108 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 97 insertions(+), 11 deletions(-) diff --git a/room8.lua b/room8.lua index 302a20f..5b698be 100644 --- a/room8.lua +++ b/room8.lua @@ -44,7 +44,7 @@ Verb { -- Все описания можно менять -- Задача: Игрок должен получить доступ на запад с помощью предмета thooskey. Изначально он должен быть закрыт. Игрок может придти в комнату как с этим предметом, так и без него -function room8_switch_temperature(temp, forced) +function room8_switch_temperature(temp, forced, showmsg) local oldtemp = _('room8_garderob')._mode -- TODO: очень тяжёлый цикл, надо как-то оптимизировать list_clothing:for_each(function(v) @@ -80,6 +80,9 @@ function room8_switch_temperature(temp, forced) end end) _('room8_garderob')._mode = temp + if not showmsg then + return + end if temp == 'cold' then return 'В комнате становится холодно. Мороз захватывает вещи и выворачивает их. Твоя одежда покрывается мехом. Гардероб готов к зиме.' end @@ -91,6 +94,77 @@ function room8_switch_temperature(temp, forced) 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 = "Гардеробная комната"; @@ -118,9 +192,13 @@ room { p 'Дверь закрыта на электронный замок.'; return; end; + room8_drop_items(); return 'room9_garazh'; end; - w_to = 'room3_hall'; + w_to = function() + room8_drop_items(); + return 'room3_hall'; + end; _mode = 'neutral'; hot = function() return here()._mode == 'hot' @@ -132,7 +210,7 @@ room { if (temp ~= 'hot' and temp ~= 'cold' and temp ~= 'neutral') then return end - return room8_switch_temperature(temp, false) + return room8_switch_temperature(temp, false, true) end; before_Listen = function(s) if s.cold() then @@ -204,7 +282,11 @@ obj { return ('Рычаг скрипит, но выдерживает вес '..thing:noun('рд')..'.'); end if weight > 2 then - return 'Рычаг со скрипом падает под тяжестью одежды в нижнее положение. '..room8_switch_temperature('hot', true) + if here().hot() then + return 'Рычаг громко скрипит под тяжестью одежды.'; + else + return 'Рычаг со скрипом падает под тяжестью одежды в нижнее положение. '..room8_switch_temperature('hot', true, true) + end end end; before_Pull = function(self) @@ -284,13 +366,11 @@ obj { capacity = 1; after_Receive = function(self, thing) local is_boiling = here().hot() and thing.mode == 'cold'; - if is_boiling then + if is_boiling and not self:has('broken') then pn ('Из-под '..thing:noun('рд')..' доносится резкий писк, затем что-то начинает шипеть и ты видишь струйку дыма. Дверь распахивается настежь.'); _('room8_garagedoor'):attr('open'); _('room8_garagedoor'):attr('~locked'); - if not self:has('broken') then - mp.score=mp.score+1; - end; + mp.score=mp.score+1; self:attr('broken') return true; end; @@ -496,6 +576,7 @@ clothing { nam = 'room8_underwear_top'; description = 'Твоё нижнее бельё.'; part = 'top'; + own_clothes = true; before_Disrobe = function() return 'Да ни за что.'; end; @@ -507,6 +588,7 @@ clothing { nam = 'room8_underwear_bottom'; part = 'bottom'; description = 'Твоё нижнее бельё.'; + own_clothes = true; before_Disrobe = function() return 'Да ни за что.'; end; @@ -518,6 +600,7 @@ clothing { nam = 'room8_shoes'; part = 'feet'; description = 'Чёрные блестящие туфли на каблуке.'; + own_clothes = true; before_Disrobe = function() return 'Да ни за что.'; end; @@ -525,11 +608,12 @@ clothing { }: attr 'worn,concealed'; clothing { - -"штаны/ср,мч,мн"; + -"деловые штаны/ср,мч,мн"; nam = 'room8_pants'; + own_clothes = true; part = 'bottom'; mode = 'neutral'; - description = 'Чёрные формальные штаны.'; + description = 'Чёрные деловые штаны.'; paired_hot = 'room8_shorts'; paired_cold = 'room8_winterpants'; level = 1; @@ -547,7 +631,7 @@ clothing { } clothing { - -"зимние штаны,штаны,щтаны/ср,мч,мн"; + -"зимние штаны/ср,мч,мн"; nam = 'room8_winterpants'; part = 'bottom'; mode = 'cold'; @@ -564,6 +648,7 @@ clothing { part = 'top'; description = 'Белая блузка с принтом картины Малевича на груди.'; mode = 'neutral'; + own_clothes = true; level = 2; weight = 1; paired_cold = 'room8_winterblouse'; @@ -624,6 +709,7 @@ clothing { paired_hot = 'room8_formalvest'; paired_cold = 'room8_winter_formalсoat'; description = 'Чёрный женский пиджак. Выглядит очень профессионально.'; + own_clothes = true; level = 3; weight = 2; part = 'top';