diff --git a/engineering.lua b/engineering.lua new file mode 100644 --- /dev/null +++ b/engineering.lua @@ -0,0 +1,123 @@ +first_city_engineering_door = obj { + nam = "first_city_engineering_door"; + dsc = function(s) + if (first_city_engineering.open) then + return [[]]; + else + return [[{Двери}, ведущие в зал обслуживания заблокированы. ]]; + end; + end; +}; + +first_city_engineering_door_inside = obj { + nam = "first_city_engineering_door_inside"; +}; + +first_city_engineering = room { + nam = "first_city_engineering"; + disp = "Лсэрианотр, зал обслуживания"; + dsc = [[ + Вы находитесь в одном из залов обслуживания Лсэрианотра. Двери в помещение заблокированы и разблокировать их не представляется возможным. + ]]; + entered = function(s) + service_tunnels.position = "24"; + end; + obj = { + "first_city_door_control", + "first_city_door_control_cardreader", + "item_keys" + }; + way = { + kh_vroom("В сервиcный тоннель", "service_tunnels"); + }; +}; + +item_keys = obj { + nam = "item_keys"; + disp = "Ключи"; + dsc = "На столе лежат несколько {металлических пластин}. "; + act = function(s) + take(item_middle_rim_key); + take(item_airlock_key); + take(item_engineering_key); + take(item_blank_key); + disable(s); + return "Вы берете пластины себе"; + end; +}; + +--TODO (публичная демо-версия) сделать картинки ключей +--TODO (приватная демо-версия) сделать случайную генерацию ключей + +item_airlock_key = obj { + nam = "item_airlock_key"; + disp = "Ключ-карта"; + inv = [[Небольшая металлическая пластина около 6 см в ширину и 10 см в длину. На ней нет никаких символов, кроме трех цилиндров заключенных в квадрат. ]]; +}; + +item_middle_rim_key = obj { + nam = "item_middle_rim_key"; + disp = "Ключ-карта с отверстиями"; + inv = [[Небольшая металлическая пластина около 3 см в ширину и 10 см в длину, на ней в ряд через равные промежутки присутствуют отверстия или нарисованные круги: круг, отверстие, круг, отверстие, круг, отверстие, отверстие, круг ]]; -- 01010110 = 172 +}; + +item_engineering_key = obj { + nam = "item_engineering_key"; + disp = "Ключ-карта с отверстиями"; + inv = [[Небольшая металлическая пластина около 3 см в ширину и 10 см в длину, на ней в ряд через равные промежутки присутствуют отверстия или нарисованные круги: круг, отверстие, круг, круг, отверстие, круг, круг, круг ]]; -- 01001000 = 144 +}; + +item_blank_key = obj { + nam = "item_blank_key"; + disp = "Ключ-карта без отверстий"; + inv = [[Небольшая металлическая пластина около 3 см в ширину и 10 см в длину с восемью кругами, нарисованными на ней в ряд ]]; -- 00000000 = 0 +}; + +first_city_door_control_cardreader = obj { + nam = "first_city_door_control_cardreader"; + state = 0; + dsc = function(s) + if (s.state == 0 or s.state == 2) then + return "В терминале вы видите небольшую {щель}, около 3 сантиметров шириной."; + else + return "В терминале вы видите небольшую {щель}, около 3 сантиметров шириной. В ней застряла одна из ключ-карт"; + end; + end; + act = function(s) + if (s.state == 0 or s.state == 2) then + return "Очевидно, сюда что-то вставляется. "; + else + return "Ключ-карта застряла. Вы не сможете вытащить ее руками. "; + end; + end; + used = function(s, o) + if (s.state == 0) then + if (o == item_middle_rim_key) then + s.state = s.state + 1; + remove(item_middle_rim_key, pl); + first_city_middle_south.open(first_city_middle_south); + return "Аппарат начинает считывать карту. Вы слышите громкий щелчок. Вы слышите откуда-то издалека звук открывающихся огромных ворот. Карта остается в разъеме. "; + elseif (o == item_engineering_key) then + s.state = s.state + 1; + remove(item_engineering_key, pl); + return "Аппарат начинает считывать карту. Вы слышите громкий щелчок. Двери в комнату слегка приоткрываются. После чего с громким стуком захлопываются. Карта остается в разъеме. "; + elseif (o == item_blank_key) then + s.state = s.state + 1; + remove(item_blank_key, pl); + return "Аппарат начинает считывать карту. Вы слышите громкий щелчок. Карта остается в разъеме. "; + else + return "Это сюда не подойдет"; + end; + elseif (s.state == 1 and o == item_umbrella) then + s.state = 0; + return "Острым наконечником зонта вы поддеваете ключ и вытягиваете его из разъема. К сожалению, он более непригоден к использованию - вы видите, что он погнут"; + else + return "Прежде чем вставлять что-то еще, нужно извлечь ключ. "; + end; + end; +}; + +first_city_door_control = obj { + nam = "first_city_door_control"; + dsc = "Возле одной из стен стоит терминал."; +}; \ No newline at end of file diff --git a/first_city_inner_rim.lua b/first_city_inner_rim.lua --- a/first_city_inner_rim.lua +++ b/first_city_inner_rim.lua @@ -1,3 +1,90 @@ +-- TODO (приват) добавить описание шлюза +-- TODO (приват) картинка с дисплея терминала +-- TODO (приват) вменяемое описание цели данного паззла, тексты на навьярском или реалистичное объяснение их понятности персонажу +first_city_airlock_control = room { + nam = "first_city_airlock"; + disp = "Комната управления шлюзом центрального зала"; + dsc = function (s) + return "Вы находитесь в небольшой комнате. Перед вами расположен дисплей, на котором расположены три вертикальные полосы разной длины. " .. tostring(s.tanks[1]) .. "/" .. tostring(s.tanks[2]) .. "/" .. tostring(s.tanks[3]); + end; + tanks = {10, 0, 0}; + tanks_capacity = {10, 7, 3}; + selected_source = nil; + selected_target = nil; + detect = function(s) + if (tanks[2] == 5) then + return true; + else + return false; + end; + end; + obj = { + "first_city_transfer", + "first_city_select_s", + "first_city_select_p", + "first_city_select_a" + }; +}; + +first_city_transfer = obj { + nam = "first_city_transfer"; + dsc = "{Выполнить} ^"; + act = function(s) + if (first_city_airlock_control.selected_source and first_city_airlock_control.selected_target) then + local tmp = math.min(first_city_airlock_control.tanks[first_city_airlock_control.selected_source], first_city_airlock_control.tanks_capacity[first_city_airlock_control.selected_target] - first_city_airlock_control.tanks[first_city_airlock_control.selected_target]); + first_city_airlock_control.tanks[first_city_airlock_control.selected_source] = first_city_airlock_control.tanks[first_city_airlock_control.selected_source] - tmp; + first_city_airlock_control.tanks[first_city_airlock_control.selected_target] = first_city_airlock_control.tanks[first_city_airlock_control.selected_target] + tmp; + first_city_airlock_control.selected_source = nil; + first_city_airlock_control.selected_target = nil; + return "Выполнено"; + else + return "Невозможно выполнить"; + end; + end; +}; + +first_city_select_s = obj { + nam = "first_city_select_s"; + dsc = "{Выбрать первый баллон} ^"; + act = function(s) + if (not first_city_airlock_control.selected_source) then + first_city_airlock_control.selected_source = 1; + else + first_city_airlock_control.selected_target = 1; + end; + + return ""; + end; +}; + +first_city_select_p = obj { + nam = "first_city_select_p"; + dsc = "{Выбрать второй баллон} ^"; + act = function(s) + if (not first_city_airlock_control.selected_source) then + first_city_airlock_control.selected_source = 2; + else + first_city_airlock_control.selected_target = 2; + end; + + return ""; + end; +}; + +first_city_select_a = obj { + nam = "first_city_select_a"; + dsc = "{Выбрать третий баллон} ^"; + act = function(s) + if (not first_city_airlock_control.selected_source) then + first_city_airlock_control.selected_source = 3; + else + first_city_airlock_control.selected_target = 3; + end; + + return ""; + end; +}; + first_city_inner_south = room { nam = "first_city_inner_south"; disp = "Лсэрианотр, внутреннее кольцо, юг"; @@ -47,6 +134,11 @@ first_city_inner_north = room { east = "first_city_inner_east"; west = "first_city_inner_west"; navigatable = true; + entered = function(s) + if (first_city_airlock_control.detect(first_city_airlock_control)) then + path("first_city_to_center"):enable(); + end; + end; dsc = [[ Вы находитесь в северной части внутреннего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. ]]; @@ -54,8 +146,8 @@ first_city_inner_north = room { Вы находитесь в северной части внутреннего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. ]]; way = { - vroom("Центр города", "first_city_central_room_entrance"); - vroom("Левиафан", "leviathan_airlock"); + kh_vroom("Центр города", "first_city_central_room_entrance", "first_city_to_center"):disable(); + kh_vroom("Левиафан", "leviathan_airlock"); }; }; @@ -63,8 +155,7 @@ first_city_central_room_entrance = room nam = "first_city_central_room_entrance"; disp = "Лсэрианотр, Вход в центральный зал"; dsc = [[ - Вы находитесь у входа в центральный зал Лсэрианотра. Входная дверь закрывается и вода быстро откачивается из помещения. Вы снимаете скафандр и готовитесь к встрече с Уильямом. - Отсюда пути назад уже нет. + Вы находитесь у входа в центральный зал Лсэрианотра. Входная дверь закрывается и вода быстро откачивается из помещения. Вы снимаете скафандр и готовитесь к встрече с Уильямом. Отсюда пути назад уже нет. ]]; obj = { vway("Центральный зал", "{Вперед}", "final_scene_before_battle"); diff --git a/first_city_middle_rim.lua b/first_city_middle_rim.lua --- a/first_city_middle_rim.lua +++ b/first_city_middle_rim.lua @@ -1,10 +1,19 @@ +-- dependencies +dofile "powerplant.lua"; +dofile "engineering.lua"; + +-- TODO (приватная бета-версия) добавить описания ворот открытых и закрытых +-- TODO (приватная бета-версия) пометить описание инженерного зала в западный сектор + first_city_middle_south = room { nam = "first_city_middle_south"; disp = "Лсэрианотр, среднее кольцо, юг"; - gate = "first_city_inner_south"; east = "first_city_middle_east"; west = "first_city_middle_west"; navigatable = true; + open = function(s) + s.gate = "first_city_inner_south"; + end; dsc = [[ Вы находитесь в южной части среднего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. ]]; @@ -21,10 +30,15 @@ first_city_middle_east = room { navigatable = true; dsc = [[ Вы находитесь в восточной части среднего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. + Вы видите огромное здание, стоящее поодаль от других. Над огромными двойными дверями расположен символ, недвусмысленно намекающий на назначение этого здания даже незнакомым с языком Навьяр - три молнии, исходящие из круга в центре. Вы чувствуете слабую вибрацию, исходящую из этого здания. ]]; view = [[ Вы находитесь в восточной части среднего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. + Вы видите огромное здание, стоящее поодаль от других. Над огромными двойными дверями расположен символ, недвусмысленно намекающий на назначение этого здания даже незнакомым с языком Навьяр - три молнии, исходящие из круга в центре. Вы чувствуете слабую вибрацию, исходящую из этого здания. ]]; + way = { + kh_vroom("В здание", "first_city_powerplant", "to_powerplant"):disable(); + }; }; first_city_middle_west = room { diff --git a/first_city_outer_rim.lua b/first_city_outer_rim.lua --- a/first_city_outer_rim.lua +++ b/first_city_outer_rim.lua @@ -1,3 +1,10 @@ +--dependencies +dofile "service_tunnels.lua"; +dofile "hope.lua"; +dofile "hope_cutscene.lua"; + +-- TODO (приватная бета-версия) добавить описания ворот открытых и закрытых + char_first_city_guardian = obj { nam = "first_city_guardian"; disp = "Страж"; @@ -46,7 +53,6 @@ first_city_entrance = room { }; way = { vroom("Левиафан", "leviathan_airlock"); - vroom("В здание", "first_city_library"); }; }; @@ -109,6 +115,7 @@ first_city_outer_west = room { ]]; way = { vroom("Левиафан", "leviathan_airlock"); + vroom("В здание", "first_city_library"); }; }; @@ -134,9 +141,14 @@ first_city_outer_north = room { }; }; +path_first_city_tunnel = vroom("В сервисный тоннель", "service_tunnels"); + first_city_factory = room { nam = "first_city_factory"; disp = "Лсэрианотр, внешнее кольцо, завод"; + entered = function(s) + service_tunnels.position = "3"; + end; dsc = [[ Помещение, в котором вы находитесь, очевидно, некогда было заводом. Конвейеры, странные механизмы, разбросанные инструменты, долгие тысячелетия лежавшие без движения. ]]; @@ -144,23 +156,36 @@ first_city_factory = room { "item_pickaxe", "first_city_crack" }; + way = { + disable(path_first_city_tunnel); + }; }; first_city_crack = obj { nam = "first_city_crack"; dsc = "В дальней стене вы видите {трещину}. Сквозь нее пробивается слабый свет, очевидно там какое-то помещение."; - act = [[ - Нужно чем-то расширить эту щель, если вы хотите туда попасть - ]]; + act = function(s) + if (s.wide) then + return [[ + Вы видите за щелью какие-то тоннели. Вы сможете пролезть туда. + ]]; + else + return [[ + Нужно чем-то расширить эту щель, если вы хотите туда попасть + ]]; + end; + end; canhit = true; onhit = function(s) if (s.wide) then return "Трещина уже достаточно большая для вас, нет смысла еще что-то с ней делать." else s.wide = true; + enable(path_first_city_tunnel); return "Несколькими осторожными ударами кирки вы расширяете трещину достаточно, чтобы пролезть внутрь." end; end; + }; first_city_library = room { diff --git a/hope.lua b/hope.lua --- a/hope.lua +++ b/hope.lua @@ -48,7 +48,7 @@ hope_cargo_door = obj { pn([[Вы пытаетесь открыть люк, однако, похоже, он заблокирован с другой стороны. В смотровом люке вы видите голову навьяра, смотрящего на вас. В темноте вы с трудом различаете цветные полосы на его головных плавниках. Полосы бегут нарочито медленно, чтобы вы успели его понять. Леарр мягко отодвигает вас от смотрового отверстия. тем же способом, она что-то говорит навьяру, находящемуся по ту сторону люка. Через несколько минут подобного общения Леарр кивает вам, показывая на дверь. ]]); s.state = 1; else - pn([[Вы пытаетесь открыть люк, однако, похоже, он заблокирован с другой стороны. В смотровом люке вы видите голову навьяра, смотрящего на вас. В темноте вы с трудом различаете цветные полосы на его головных плавниках. Полосы бегут нарочито медленно, чтобы вы успели его понять. Вы с трудом переводите цвета в символы: "Eyle'yhe'he'vji'a'rr vee'nn vtre'e'ran'rr" - он просит вас уйти ]]); + pn([[Вы пытаетесь открыть люк, однако, похоже, он заблокирован с другой стороны. В смотровом люке вы видите голову навьяра, смотрящего на вас. В темноте вы с трудом различаете цветные полосы на его головных плавниках. Полосы бегут нарочито медленно, чтобы вы успели его понять. Вы с трудом переводите цвета в символы: "Eyle'yhe'he'vji'a'rr vee'nn vtre'e'ran'rr" ]]); end; elseif (s.state == 1) then pn([[Вы начинаете открывать люк и огромное количество пузырей воздуха просачивается через образовавшуюся щель. Леарр жестом показывает вам, чтобы вы продолжали. Вы ждете, когда вода заполнит отсек, после чего открываете люк до конца. ]]); @@ -133,7 +133,6 @@ phaetlarr_hope_dlg = dlg { phr = { {"Указать на навьяра левой рукой, правой указать на себя, затем на дверь", "Навьяр кивает головой. \"I'rr vee'nn\"", function() -- Все втроем вы возвращаетесь на Левиафан - print "fuck"; walk("cutscene_hope"); return false; end;}; diff --git a/images/power_0.png b/images/power_0.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf4a19f71cb13890bd02d3367ba363febff2ef6 GIT binary patch literal 267 zc%17D@N?(olHy`uVBq!ia0vp^@*vE?1SBV%Y0LvsY$ZW{!3_UF&^$uA7ASJS)5S5Q zV$RiRj(n{K94>Q@{f^(Mm!YLJ_ku|8reDWCrP+xxWvz`?V0dvn;hLNZ7oWp_!9b}? z)+c!XcFiey@ksl}{ijbfj$YcCs`TL5w9+lt45rs#62G|4LDBvC;)}sO-Wk7D#dBHW zR-Vy+S)6NG>dY|j>$$Wg(#xbLzm#9)v$KERlnKB8fByc@#&++Qy)S2dcVWDHKL4ui z(S4FG;_thezDuU7Ge-JZT=y+}b|%A8@kM9sn(PUwhCAH-Bus8iT*Lg?rOWd9Zretn PUl=@H{an^LB{Ts51F3Re diff --git a/images/power_1.png b/images/power_1.png new file mode 100644 index 0000000000000000000000000000000000000000..911cda0ea6ae5b693be0e4c57d2fd3c9cb2b8911 GIT binary patch literal 276 zc%17D@N?(olHy`uVBq!ia0vp^@*vE?1SBV%Y0LvsY$ZW{!3_UF&^$uA7AV45;1OBO zz`%C|gc+x5^GO2*w|KfZhE&YC8WzoWK!HPe^Y8eXwHb3(_b2G6ecH~Dd;MV3iY$Yc zjw}7g)*bKQD42X@ea;kN$z^Y*&ULwz+A?pu!mik&>C9Ei+*U0MR(<$r|Hb!(p5vS; z@7&#%bNC0I?vKe(uy}N4>WkCaI~jBzt-fo1ZBFE@*z)wG->(ulXtQZrv?&&Rf36qSpunyqkG$>GUp*?KeL3u}nWvo}w+VLpN4G=v%v5 Tc)gy*V@S%Z<%Ea|If<-h01#^}3T^E+jdBIagTe~DWM4fDhg{S diff --git a/images/power_bcg.png b/images/power_bcg.png new file mode 100644 index 0000000000000000000000000000000000000000..2b9fdbb528ba4b75a36b7d95d699ae93426379f4 GIT binary patch literal 1129 zc%17D@N?(olHy`uVBq!ia0vp^vq6}H2}u58uDcDS7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~uBzpw;GB8xBF)%c=0JQ*x8eT9klo~KFyh>nTu$sZZAYL$MSD+081M_oF z7srr_xVLjI7AYC>usr;4KTD-lUsF$E&*P0LJKs;;np2uRjWwve-bQXa^S`_AzdKv) zt^HnkX#e|#whPbBUunD4zsJnj*KIcE-^#ET*DiI}^}Q5cd{%8%kD2hP*zL0edXh?_ znQSC;SNEmg&3k3gbuolEd84k2 zc`UoW2J0<${(pV_Nw-$xn7p-%E}lNSCO+Z=|0M&hUPia%8dk}@mL&%-Pr6uf!r)e~ zpqrtVpn!Ps^{EV>?4%xRpXk_~ww7iTJivMoP7S+Vk)<)(Q( zlP*rIER27BV)Ei;vk$-jg|6Y>Pky2Bb#p2&?a#7&VVz}H&sos=^mz823v0j1evvg@ zEAZo-#)0mOQ$KHiq{+5e;;hPt|MzODA}9Wydd{#5C@l8&X~p^CD?Ptv{Imi(&iJ|K z+NU79ZaqIyW#r}N{_JS&T4n#fS$TZ>Ur!D++EsLK(O#L#BCv*E-z5M3Q15KyPG^dX zTRrFEUZtQ9TO_7BwOo{lcXZ3=i~X=A#YE1ir!2Vz6i!Eu-YHdW*wcUP2ba;Kb<)|l zyD!Eqf4c5=?mvUBz)pufGrnJ(aq+hHi4`mx9{foZSuE68@$o=^ocVQ&Fbij&S4Tzl zG^X<(ahk~B=GyRdTJn}TLLVI@L>Z?=_gyUVI>MY7!V-~Z>2_LEkiR8RFk$CY3Ekx` zHUgw5zM$#G{m*ei#=EOUJ+lrhn|d@us_ODF3DZVj?e2>vUzYV6W--kU6I-15!dE)^ z3X9oV9kW$c#;4 3) then + powerplant_defence_control_dlg.states[i] = 0; + end; + end; + end; + if (powerplant_defence_control_dlg.detect(powerplant_defence_control_dlg)) then + p("Защитные системы отключены"); --TODO сделать нормальный фидбэк + end; + end;}, + {6, always = true, "поворот против часовой", "Изображение на экране изменилось.", function(s) + for i = 1, 4 do + if (i ~= powerplant_defence_control_dlg.locked) then + powerplant_defence_control_dlg.states[i] = powerplant_defence_control_dlg.states[i] - 1; + if (powerplant_defence_control_dlg.states[i] < 0) then + powerplant_defence_control_dlg.states[i] = 3; + end; + end; + end; + if (powerplant_defence_control_dlg.detect(powerplant_defence_control_dlg)) then + p("Защитные системы отключены"); --TODO сделать нормальный фидбэк + end; + end;}, + {255, always = true, "выход", function(s) + back(); + end}, + }; +}; \ No newline at end of file diff --git a/service_tunnels.lua b/service_tunnels.lua --- a/service_tunnels.lua +++ b/service_tunnels.lua @@ -0,0 +1,98 @@ +service_tunnels_definitions = { + -- name # O ^ | + ["0"] = { name="nol'nol" , e1= "1" }; + ["1"] = { name="nol'lse" , e1= "0", e2= "7", e3= "2" }; + ["2"] = { name="nol'dyle" , e1= "3", e3= "1", e4= "8" }; + ["3"] = { name="nol'vlye" , e1= "2", e2= "4" , ex = "first_city_factory"}; + ["4"] = { name="nol'elt" , e2= "3", e3="10" }; + ["5"] = { name="nol'tei" , e1="11" }; + -- name # O ^ | + ["6"] = { name="lse'nol" , e2="12", e3= "7" }; + ["7"] = { name="lse'lse" , e2= "1", e3= "6", e4="13" }; + ["8"] = { name="lse'dyle" , e1="14", e3= "9", e4="02" }; + ["9"] = { name="lse'vlye" , e2="15", e3= "8" }; + ["10"] = { name="lse'elt" , e2="11", e3= "4" }; + ["11"] = { name="lse'tei" , e1= "5", e2="10", e3="17" }; + -- name # O ^ | + ["12"] = { name="dyle'nol" , e2= "6", e3="18" }; + ["13"] = { name="dyle'lse" , e1="19", e2="14", e4= "7" }; + ["14"] = { name="dyle'dyle", e1= "8", e2="13" }; + ["15"] = { name="dyle'vlye", e1="16", e2= "9", e3="21" }; + ["16"] = { name="dyle'elt" , e1="15", e3="22", e4="17" }; + ["17"] = { name="dyle'tei" , e3="11", e4="16" }; + -- name # O ^ | + ["18"] = { name="vlye'nol" , e3="12", e4="24" }; + ["19"] = { name="vlye'lse" , e1="13", e2="20" }; + ["20"] = { name="vlye'dyle", e2="19", e4="21" }; + ["21"] = { name="vlye'vlye", e3="15", e4="20" }; + ["22"] = { name="vlye'elt" , e1="28", e2="23", e3="16" }; + ["23"] = { name="vlye'tei" , e2="22" }; + -- name # O ^ | + ["24"] = { name="elt'nol" , e1="30", e2="25", e4="18", ex = "first_city_engineering"}; + ["25"] = { name="elt'lse" , e2="24", e3="26" }; + ["26"] = { name="elt'dyle" , e3="25" }; + ["27"] = { name="elt'vlye" , e1="33", e2="28" }; + ["28"] = { name="elt'elt" , e1="22", e2="27", e3="34", e4="29" }; + ["29"] = { name="elt'tei" , e1="35", e4="28" }; + -- name # O ^ | + ["30"] = { name="tei'nol" , e1="24", e2="31" }; + ["31"] = { name="tei'lse" , e2="30", e3="32" }; + ["32"] = { name="tei'dyle" , e3="31", e4="33" }; + ["33"] = { name="tei'vlye" , e1="27", e4="32" }; + ["34"] = { name="tei'elt" , e3="28" }; + ["35"] = { name="tei'tei" , e1="29" , ex = "first_city_powerplant"}; +}; + +service_tunnels = room { + nam = "service_tunnels"; + disp = "Сервисные тоннели"; + position = "0"; + position = "0"; + definitions = service_tunnels_definitions; + entered = function(s) + path('e1'):disable(); + path('e2'):disable(); + path('e3'):disable(); + path('e4'):disable(); + path('ex'):disable(); + if (s.definitions[s.position].e1) then + path('e1'):enable(); + end; + if (s.definitions[s.position].e2) then + path('e2'):enable(); + end; + if (s.definitions[s.position].e3) then + path('e3'):enable(); + end; + if (s.definitions[s.position].e4) then + path('e4'):enable(); + end; + if (s.definitions[s.position].ex) then + path('ex'):enable(); + end; + end; + dsc = function(s) + return "Вы находитесь в сервисном тоннеле Лсэрианотра. Табличка сообщает вам, что вы находитесь в секции " .. s.definitions[s.position].name .. ". "; + end; + way = { + kh_vroom('В направлении #', function() + service_tunnels.position = service_tunnels.definitions[service_tunnels.position].e1; + return service_tunnels; + end, "e1"); + kh_vroom('В направлении O', function() + service_tunnels.position = service_tunnels.definitions[service_tunnels.position].e2; + return service_tunnels; + end, "e2"); + kh_vroom('В направлении \\^', function() + service_tunnels.position = service_tunnels.definitions[service_tunnels.position].e3; + return service_tunnels; + end, "e3"); + kh_vroom('В направлении |', function() + service_tunnels.position = service_tunnels.definitions[service_tunnels.position].e4; + return service_tunnels; + end, "e4"); + kh_vroom("Выход", function() + return service_tunnels.definitions[service_tunnels.position].ex; + end, "ex"); + }; +} \ No newline at end of file diff --git a/utils.lua b/utils.lua --- a/utils.lua +++ b/utils.lua @@ -27,4 +27,55 @@ PartyUtils = { end; end; end; -}; \ No newline at end of file +}; + +--[[ + functions, design to simplify some typical actions while developing Instead game +]] +EngineUtils = { + getValue = function(source, param) + local value = ""; + if (type(source) == "function") then + value = source(param); + else + value = source; + end; + + return value; + end; +}; + +--[[ + internal space +]] +_kh = { + vroom_enter = function(s) + walk(EngineUtils.getValue(s.where)); + end; + vroom_save = function(s) + if need then + local t = stead.string.format("%s = kh_vroom(%s, %q, %s);\n", + name, stead.tostring(self.disp), + stead.deref(self.where), stead.deref(self.nam)); + h:write(t); + end + stead.savemembers(h, self, name,false); + end; +}; + +--[[ + vroom with additional functionality +]] +function kh_vroom(disp, target, nam) + if (not nam) then + nam = disp; + end; + return room { + nam = nam; + disp = disp; + where = target; + enter = _kh.vroom_enter; + --enter = _kh.vroom_enter; + --save = _kh.vroom_save; + }; +end; \ No newline at end of file