# HG changeset patch # User Silverwing # Date 2016-09-06 18:18:05 # Node ID b03c40a64562691bca614b447919ce4eb8b7eedf # Parent 988d1bf03cce05ab91385678f5271fa4ff26fb56 Venaedanotrr labyrinth implemented diff --git a/journey_venaedanotrr.lua b/journey_venaedanotrr.lua --- a/journey_venaedanotrr.lua +++ b/journey_venaedanotrr.lua @@ -640,7 +640,7 @@ ven_wiseman_dlg = dlg { {"[Цветокод]Нет", [[ "Тогда послушай. Этой легенде больше тысячи лет. В те времена навьяры жили в огромных городах и строили машины, помогающие им во всех областях. Однажды навьяры создали Наэтвьирра - машину, способную заменить им вождей. Но, к счастью, большинство навьяров поняли, что Наэтвьирр первым же делом уничтожит навьяров, не нужных ему. Опасаясь включения опасной машины, навьяры навсегда покинули город в надежде, что никто и никогда не найдет его". ]], code [[ psub("need_to_find"); ]]}; - {tag="need_to_find"} + {tag="need_to_find"}; {"[Цветокод]Мне нужен ключ от храма", [[ "Я дам тебе его в надежде, так же как дал его тем хевьярам. Надеюсь, ты примешь верное решение. Теперь уходи. Оставь меня в покое". ]], code [[ @@ -648,4 +648,429 @@ ven_wiseman_dlg = dlg { back(); ]]}; }; +}; + +ven_near_temple = room { + nam = "Ущелье, У входа в храм Венаэданотра"; + dsc = [[ + Вы стоите на дне глубокого ущелья. Вход навьярского храма, вытесанный в камне, украшен резными изображениями сцен из легенд, и покрыты древними письменами, чей смысл утрачен ныне даже для навьяров. + ]]; + way = { + kh_vroom("К храму", "ven_temple"); + kh_vroom("В Левиафан", "leviathan_airlock"); + }; +}; + +ven_temple_entrance = room { + var { + state = 0; + }; + nam = "Храм Венаэданотра, вход"; + dsc = function(s) + if (s.state == 3) then + return [[ + Массивные двери храма Ведаэданотра открыты, позволяя вам пройти. + ]]; + else + return [[ + Вход в храм Венаэданотра закрывают массивные металлические двери. На дверях вы видите три замочных скважины. + ]]; + end; + end; + way = { + kh_vroom("В ущелье", "ven_near_temple"); + kh_vroom("В храм", function(s) + if (ven_temple_entrance.state == 3) then + return "ven_temple_l1"; + else + pr("Двери не открываются"); + end; + end); + }; + obj = { + 'ven_temple_lock_red', + 'ven_temple_lock_green', + 'ven_temple_lock_blue' + }; +}; + +ven_temple_lock_red = obj { + var { + state = 0; + }; + nam = "ven_temple_lock_red"; + dsc = "{Первая скважина} отмечена красным цветом.^"; + act = function(s) + if (s.state == 1) then + return "Этот замок уже открыт. "; + else + return "Мне нужен ключ. "; + end; + end; + use = function(s, o) + if (o == item_ven_key_chieftain) then + ven_temple_entrance.state = ven_temple_entrance.state + 1; + remove(o, pl); + pr("Вы вставляете ключ в скважину и поворачиваете его. "); + if (ven_temple_entrance == 3) then + pr("Двери с грохотом раздвигаются, открывая вам проход во внутренние помещения храма. "); + end; + return false; + else + return "Это сюда не подходит. "; + end; + end; +}; + +ven_temple_lock_green = obj { + var { + state = 0; + }; + nam = "ven_temple_lock_green"; + dsc = "{Вторая скважина} отмечена красным цветом.^"; + act = function(s) + if (s.state == 1) then + return "Этот замок уже открыт. "; + else + return "Мне нужен ключ. "; + end; + end; + use = function(s, o) + if (o == item_ven_key_library) then + ven_temple_entrance.state = ven_temple_entrance.state + 1; + remove(o, pl); + pr("Вы вставляете ключ в скважину и поворачиваете его. "); + if (ven_temple_entrance == 3) then + pr("Двери с грохотом раздвигаются, открывая вам проход во внутренние помещения храма. "); + end; + return false; + else + return "Это сюда не подходит. "; + end; + end; +}; + +ven_temple_lock_blue = obj { + var { + state = 0; + }; + nam = "ven_temple_lock_blue"; + dsc = "{Третья скважина} отмечена красным цветом.^"; + act = function(s) + if (s.state == 1) then + return "Этот замок уже открыт. "; + else + return "Мне нужен ключ. "; + end; + end; + use = function(s, o) + if (o == item_ven_key_tower) then + s.state = 1; + ven_temple_entrance.state = ven_temple_entrance.state + 1; + remove(o, pl); + pr("Вы вставляете ключ в скважину и поворачиваете его. "); + if (ven_temple_entrance == 3) then + pr("Двери с грохотом раздвигаются, открывая вам проход во внутренние помещения храма. "); + end; + return false; + else + return "Это сюда не подходит. "; + end; + end; +}; + + + +ven_temple_l1 = labyrinth { + dir1 = "На север"; + dir2 = "На восток"; + dir3 = "На юг"; + dir4 = "На запад"; + exit = "Выйти"; + nam = "ven_temple_l1"; + disp = "Венаэданотр, храм"; + position = "03"; + dsc = function(s) + if true then + return tostring(s.position); + end; + if (s.map[s.position].name) then + return s.map[s.position].name; + else + return [[ + Вы стоите посреди запутанного лабиринта. Металлические стены по сторонам здесь ничем не отличаются от стен в других коридорах этого лабиринта. + ]]; + end; + end; + map = { + ["00"] = { + e1 = "10"; + e2 = "01"; + }; + ["01"] = { + e4 = "00"; + }; + ["02"] = { + e1 = "12"; + e2 = "03"; + }; + ["03"] = { + name = [[ + Вы стоите у входа в храм + ]], + e1 = "13", + e2 = "04", + e4 = "02", + ex = "ven_temple_entrance" + }; + ["04"] = { + e1 = "14", + e2 = "05", + e4 = "03" + }; + ["05"] = { + e1 = "15", + e2 = "06", + e4 = "04" + }; + ["06"] = { + e1 = "16", + e2 = "07", + e4 = "05" + }; + ["07"] = { + e4 = "06" + }; + ["10"] = { + e1 = "20", + e3 = "00" + }; + ["11"] = { + e2 = "12" + }; + ["12"] = { + e3 = "02", + e4 = "11" + }; + ["13"] = { + e1 = "23", + e3 = "03" + }; + ["14"] = { + e1 = "24"; + e3 = "04"; + }; + ["15"] = { + e3 = "05"; + }; + ["16"] = { + e1 = "26"; + e3 = "06"; + }; + ["17"] = { + e1 = "27"; + }; + ["20"] = { + e1 = "30"; + e2 = "21"; + e3 = "10"; + }; + ["21"] = { + e2 = "22"; + e4 = "20"; + }; + ["22"] = { + e2 = "23"; + e4 = "21"; + }; + ["23"] = { + e3 = "13"; + e4 = "22"; + }; + ["24"] = { + e1 = "34"; + e3 = "14"; + }; + ["25"] = { + e1 = "35"; + e2 = "26"; + }; + ["26"] = { + e3 = "16"; + e4 = "25"; + }; + ["27"] = { + e1 = "37"; + e3 = "17"; + }; + ["30"] = { + e2 = "31"; + e3 = "20"; + }; + ["31"] = { + e1 = "41"; + e4 = "30"; + }; + ["32"] = { + e1 = "42"; + e2 = "33"; + }; + ["33"] = { + e2 = "34"; + e4 = "32"; + }; + ["34"] = { + e3 = "24"; + e4 = "33"; + }; + ["35"] = { + e1 = "45"; + e2 = "36"; + e3 = "25"; + }; + ["36"] = { + e2 = "37"; + e4 = "35"; + }; + ["37"] = { + e1 = "47"; + e3 = "27"; + e4 = "36"; + }; + ["40"] = { + e1 = "50"; + e2 = "41"; + }; + ["41"] = { + e3 = "31"; + e4 = "40"; + }; + ["42"] = { + e2 = "43"; + e3 = "32"; + }; + ["43"] = { + e1 = "53"; + e2 = "44"; + e4 = "42"; + }; + ["44"] = { + e2 = "45"; + e4 = "43"; + }; + ["45"] = { + e3 = "35"; + e4 = "44"; + }; + ["46"] = { + e1 = "56"; + }; + ["47"] = { + e1 = "57"; + e3 = "37"; + }; + ["50"] = { + e1 = "60"; + e3 = "40"; + }; + ["51"] = { + e1 = "61"; + e2 = "52"; + }; + ["52"] = { + e2 = "53"; + e4 = "51"; + }; + ["53"] = { + e1 = "63"; + e3 = "43"; + e4 = "52"; + }; + ["54"] = { + e1 = "64"; + e2 = "55"; + }; + ["55"] = { + e2 = "56"; + e4 = "54"; + }; + ["56"] = { + e1 = "66"; + e3 = "46"; + e4 = "55"; + }; + ["57"] = { + e1 = "67"; + e3 = "47"; + }; + ["60"] = { + e1 = "70"; + e2 = "61"; + e3 = "50"; + }; + ["61"] = { + e3 = "51"; + e4 = "60"; + }; + ["62"] = { + e1 = "72"; + e2 = "63"; + }; + ["63"] = { + e3 = "53"; + e4 = "62"; + }; + ["64"] = { + e1 = "74"; + e3 = "54"; + }; + ["65"] = { + e1 = "75"; + e2 = "66"; + }; + ["66"] = { + e3 = "56"; + e4 = "65"; + }; + ["67"] = { + e1 = "77"; + e3 = "57"; + }; + ["70"] = { + e2 = "71"; + e3 = "60"; + }; + ["71"] = { + e2 = "72"; + e4 = "70"; + }; + ["72"] = { + e3 = "62"; + e4 = "71"; + }; + ["73"] = { + e2 = "74"; + ex = "ven_temple_l2"; + }; + ["74"] = { + e3 = "64"; + e4 = "73"; + }; + ["75"] = { + e2 = "76"; + e3 = "65"; + }; + ["76"] = { + e2 = "77"; + e4 = "75"; + }; + ["77"] = { + e3 = "67"; + e4 = "76"; + }; + }; +}; + +ven_temple_l2 = room { + nam = "Венаэданотр, храм, второй этаж"; }; \ No newline at end of file diff --git a/main.lua b/main.lua --- a/main.lua +++ b/main.lua @@ -222,7 +222,7 @@ function init() move(submarine_leviathan, "atl_aqua_leviathan_dock"); submarine_leviathan:enable(); - pl.where = "ven_center"; + pl.where = "ven_temple_l1"; move(submarine_leviathan, "ven_center"); --put(item_suit, pl); diff --git a/utils.lua b/utils.lua --- a/utils.lua +++ b/utils.lua @@ -77,9 +77,16 @@ end; --[[ vroom with additional functionality ]] -function kh_vroom(disp, target, seen_level) +function kh_vroom(disp, target, nam, seen_level) + if (type(nam) == "number") then + seen_level = nam; + nam = disp; + end; + if (not nam) then + nam = disp; + end; return room { - nam = disp; + nam = nam; disp = disp; where = target; enter = _kh.vroom_enter; @@ -367,4 +374,81 @@ suit = function(tab) end; return obj(tab); +end; + +labyrinth = function(tab) + local position = "0"; + if (tab.position) then + position = tab.position; + end; + local lab; + lab = room { + var { + position = position; + }; + nam = tab.nam; + disp = tab.disp; + map = tab.map; + entered = function(s) + print(s.position); + path('e1'):disable(); + path('e2'):disable(); + path('e3'):disable(); + path('e4'):disable(); + path('ex'):disable(); + if (s.map[s.position].e1) then + path('e1'):enable(); + end; + if (s.map[s.position].e2) then + path('e2'):enable(); + end; + if (s.map[s.position].e3) then + path('e3'):enable(); + end; + if (s.map[s.position].e4) then + path('e4'):enable(); + end; + if (s.map[s.position].ex) then + path('ex'):enable(); + end; + if (type(tab.entered) == 'function') then + tab.entered(s); + end; + if (type(s.map[s.position].entered) == 'function') then + s.map[s.position].entered(s); + end; + end; + dsc = function(s) + if (type(tab.dsc) == "function") then + return tab.dsc(s); + else + return tab.dsc .. s.map[s.position].name; + end; + end; + way = { + kh_vroom(tab.dir1, function() + if (type(lab.position) == "function") then + lab.map[lab.position].left(lab); + end; + lab.position = lab.map[lab.position].e1; + return lab; + end, "e1"); + kh_vroom(tab.dir2, function() + lab.position = lab.map[lab.position].e2; + return lab; + end, "e2"); + kh_vroom(tab.dir3, function() + lab.position = lab.map[lab.position].e3; + return lab; + end, "e3"); + kh_vroom(tab.dir4, function() + lab.position = lab.map[lab.position].e4; + return lab; + end, "e4"); + kh_vroom(tab.exit, function() + return lab.map[lab.position].ex; + end, "ex"); + }; + }; + return lab; end; \ No newline at end of file