diff --git a/items.lua b/items.lua --- a/items.lua +++ b/items.lua @@ -500,7 +500,7 @@ item_navjiarr_chart_1 = obj { item_navjiarr_chart_iraa = obj { nam = "item_navjiarr_chart_iraa"; - disp = "Навьярская карта из Ираафаанотра"; + disp = "Карта из Ираафаанотра"; dsc = [[ На полу в углу валяется какой-то {предмет}. ]]; @@ -514,7 +514,7 @@ item_navjiarr_chart_iraa = obj { item_navjiarr_chart_dyp = obj { nam = "item_navjiarr_chart_dyp"; - disp = "Навьярская карта из Дипатреанотра"; + disp = "Карта из Дипатреанотра"; dsc = [[ На пьедестале лежит металлическая табличка. ]]; @@ -543,6 +543,14 @@ item_navjiarr_chart_2 = obj { ]]; }; +item_navjiarr_chart_ven = obj { + nam = "item_navjiarr_chart_ven"; + disp = "Карта из Венаэданотра"; + inv = [[ + Металлическая табличка с нанесенными обозначениями. + ]]; +} + item_navjiarr_chart_3 = obj { nam = "item_navjiarr_chart_3"; disp = "Навьярская табличка"; diff --git a/journey_venaedanotrr.lua b/journey_venaedanotrr.lua --- a/journey_venaedanotrr.lua +++ b/journey_venaedanotrr.lua @@ -398,7 +398,7 @@ ven_tower_l1 = room { way = { kh_vroom("Выйти", "ven_east"); kh_vroom("На второй этаж", function(s) - if (s.state == 1) then + if (ven_tower_l1.state == 1) then return "ven_tower_l2"; else pr("Дверь не открывается."); @@ -422,7 +422,7 @@ ven_tower_l2 = room { way = { kh_vroom("На первый этаж", "ven_tower_l1"); kh_vroom("На третий этаж", function(s) - if (s.state == 1) then + if (ven_tower_l2.state == 1) then return "ven_tower_l3"; else pr("Дверь не открывается."); @@ -433,6 +433,9 @@ ven_tower_l2 = room { } ven_tower_l3 = room { + var { + state = 0; + }; nam = "Венаэданотр, башня, третий этаж"; dsc = [[ Третий этаж ничем не отличается от первых двух - это большой пустой зал с двумя дверьми в противоположных его концах. @@ -440,7 +443,7 @@ ven_tower_l3 = room { way = { kh_vroom("На второй этаж", "ven_tower_l2"); kh_vroom("На четвертый этаж", function(s) - if (s.state == 1) then + if (ven_tower_l3.state == 1) then return "ven_tower_l4"; else pr("Дверь не открывается."); @@ -592,6 +595,202 @@ ven_l2_navjiarr = obj { end; }; +ven_towers_machine = obj { + nam = "ven_towers_machine"; + dsc = "В центре зала вы видите странную {машину} - три вращающихся оси, на которых установлено 4 шестеренки. Внизу вы видите какие-то рычаги"; + act = function(s) + if (not ven_towers_machine_look.solved) then + walkin(ven_towers_machine_look); + end; + end; +}; + +ven_towers_machine_look = room { + var { + gears = {1,1,1,1}; + from = 0; + solved = false; + }; + nam = "Венаэданотр, башня, третий этаж"; + pic = function(s) + local p = "box:96x48,white,255;box:1x48,black,255@16,0;box:1x48,black,255@48,0;box:1x48,black,255@80,0"; + for g = 1,#s.gears do + p = p .. ";box:" .. tostring(g * 8) .. "x11,green,255@" .. tostring((s.gears[g] - 1) * 32 + 16 - g * 4) .. "," .. tostring((g - 1) * 12 + 1); + end; + + return p; + end; + move = function(s, target) + local rv = ""; + local nums, numt; + for g = 1, #s.gears do + if (s.gears[g] == s.from) then + nums = g; + break; + end; + end; + for g = 1, #s.gears do + if (s.gears[g] == target) then + numt = g; + break; + end; + end; + + print("f"); + print(nums); + print(numt); + print("/f"); + + if (not nums or numt and numt < nums) then + rv = "Механизм издает легкий щелчок и ничего не происходит. "; + else + s.gears[nums] = target; + rv = "Механизм издает легкий щелчок и одна из шестеренок перемещается на соседнюю ось. "; + end; + print(s.gears[1]); + print(s.gears[2]); + print(s.gears[3]); + print(s.gears[4]); + + s.solved = true; + for g = 1, #s.gears do + if (s.gears[g] ~= 3) then + s.solved = false; + end; + end; + + if (s.solved) then + ven_tower_l3.state = 1; + ven_towers_lever1:disable(); + ven_towers_lever2:disable(); + ven_towers_lever3:disable(); + rv = rv .. "Дверь наверх открывается. "; + end; + + ven_towers_lever1.state = 0; + ven_towers_lever2.state = 0; + ven_towers_lever3.state = 0; + ven_towers_machine_look.from = 0; + return rv; + end; + dsc = [[ + Странная машина состоит из четырех шестеренок и трех вращающихся осей. Внизу вы видите три рычага. + ]]; + obj = { + 'ven_towers_lever1', + 'ven_towers_lever2', + 'ven_towers_lever3' + }; + way = { + kh_vroom("Отойти", "ven_tower_l3"); + }; +}; + +ven_towers_lever1 = obj { + var { + state = 0; + }; + nam = "ven_towers_lever1"; + dsc = function(s) + if (s.state == 0) then + return [[ + {Первый рычаг(выключен).}^ + ]]; + else + return [[ + {Первый рычаг(включен).}^ + ]]; + end; + end; + act = function(s) + local rv = [[ + Вы переключаете рычаг. + ]]; + if (s.state == 0) then + s.state = 1; + if (ven_towers_machine_look.from == 0) then + ven_towers_machine_look.from = 1; + else + rv = rv .. ven_towers_machine_look:move(1); + end; + else + s.state = 0; + ven_towers_machine_look.from = 0; + end; + return rv; + end; +}; + +ven_towers_lever2 = obj { + var { + state = 0; + }; + nam = "ven_towers_lever2"; + dsc = function(s) + if (s.state == 0) then + return [[ + {Второй рычаг(выключен).}^ + ]]; + else + return [[ + {Второй рычаг(включен).}^ + ]]; + end; + end; + act = function(s) + local rv = [[ + Вы переключаете рычаг. + ]]; + if (s.state == 0) then + s.state = 1; + if (ven_towers_machine_look.from == 0) then + ven_towers_machine_look.from = 2; + else + rv = rv .. ven_towers_machine_look:move(2); + end; + else + s.state = 0; + ven_towers_machine_look.from = 0; + end; + return rv; + end; +}; + +ven_towers_lever3 = obj { + var { + state = 0; + }; + nam = "ven_towers_lever3"; + dsc = function(s) + if (s.state == 0) then + return [[ + {Третий рычаг(выключен).}^ + ]]; + else + return [[ + {Третий рычаг(включен).}^ + ]]; + end; + end; + act = function(s) + local rv = [[ + Вы переключаете рычаг. + ]]; + if (s.state == 0) then + s.state = 1; + if (ven_towers_machine_look.from == 0) then + ven_towers_machine_look.from = 3; + else + rv = rv .. ven_towers_machine_look:move(3); + end; + else + s.state = 0; + ven_towers_machine_look.from = 0; + end; + return rv; + end; +}; + ven_wiseman = npc { nam = "ven_wiseman"; dsc = [[ @@ -794,9 +993,9 @@ ven_temple_l1 = labyrinth { nam = "ven_temple_l1"; disp = "Венаэданотр, храм"; dsc = function(s) - if true then - return tostring(s.position); - end; + --if true then + -- return tostring(s.position); + --end; if (s.map[s.position].name) then return s.map[s.position].name; else @@ -811,7 +1010,7 @@ ven_temple_l1 = labyrinth { local ea = s.map[ven_shark.position].e2; local so = s.map[ven_shark.position].e3; local we = s.map[ven_shark.position].e4; - if (no and s.oldposition == no) then + if (no and s.oldposition == no or no and s.position == no) then walk(game_over_eaten_by_shark); end; if (no and s.oldposition == s.map[no].e1) then @@ -872,6 +1071,14 @@ ven_temple_l1 = labyrinth { }; ["01"] = { e4 = "00"; + enter = function(s) + if (not exist(ven_chest, s)) then + move(ven_chest, s); + end; + end; + exit = function(s) + remove(ven_chest, s); + end; }; ["02"] = { e1 = "12"; @@ -879,7 +1086,7 @@ ven_temple_l1 = labyrinth { }; ["03"] = { name = [[ - Вы стоите у входа в храм + Вы стоите у входа в храм. ]]; e1 = "13"; e2 = "04"; @@ -949,6 +1156,14 @@ ven_temple_l1 = labyrinth { }; ["17"] = { e1 = "27"; + enter = function(s) + if (not exist(ven_cache, s)) then + move(ven_cache, s); + end; + end; + exit = function(s) + remove(ven_cache, s); + end; }; ["20"] = { e1 = "30"; @@ -1050,7 +1265,9 @@ ven_temple_l1 = labyrinth { e4 = "43"; }; ["45"] = { - dsc = "На юге вы видите закрытую дверь. "; + name = [[ + Вы стоите посреди запутанного лабиринта. Металлические стены по сторонам здесь ничем не отличаются от стен в других коридорах этого лабиринта, за исключением двери на юге. + ]]; e3 = "35"; e4 = "44"; e3lock = function(s) @@ -1106,6 +1323,9 @@ ven_temple_l1 = labyrinth { e4 = "54"; }; ["56"] = { + name = [[ + Вы стоите посреди запутанного лабиринта. Металлические стены по сторонам здесь ничем не отличаются от стен в других коридорах этого лабиринта, за исключением двери на западе. + ]]; e1 = "66"; e3 = "46"; e4 = "55"; @@ -1440,10 +1660,12 @@ end); ven_first_lock = obj { nam = "ven_first_lock"; dsc = "В двери вы видите {замочную скважину}. "; - use = function(s, o) + used = function(s, o) + print "fuckersaurus" if (o == item_ven_temple_key_1) then - remove(item_ven_temple_key_1); + remove(item_ven_temple_key_1, pl); ven_temple_l1.lock1 = false; + path('e3'):enable(); return "Вы открываете дверь. "; end; return "Это сюда не подходит. "; @@ -1462,15 +1684,52 @@ ven_lever = obj { ven_second_lock = obj { nam = "ven_second_lock"; dsc = "В двери вы видите {замочную скважину}. "; - use = function(s, o) + used = function(s, o) if (o == item_ven_temple_key_2) then - remove(item_ven_temple_key_2); + remove(item_ven_temple_key_2, pl); ven_temple_l1.lock3 = false; + path('e4'):enable(); return "Вы открываете дверь. "; end; return "Это сюда не подходит. "; end; }; + +ven_cache = obj { + var { + state = 0 + }; + nam = "ven_cache"; + dsc = function(s) + if (s.state >= 1) then + return [[ + В южной стене открыта {выемка}. + ]]; + else + return [[ + В южной стене имеется небольшую {прорезь}. + ]]; + end; + end; + act = function(s) + if (s.state == 1) then + s.state = 2; + move(item_ven_temple_key_2, pl); + return [[ + В выемке вы находите ключ. + ]]; + end; + end; + used = function(s, o) + if (s.state == 0) then + if (o == item_ven_tablet) then + s.state = 1; + remove(item_ven_tablet, pl); + return "Пластинка легко уходит вглубь прорези. Вы слышите щелчок и в стене открывается выемка, в которой лежит ключ. "; + end; + end; + end; +}; ven_skeleton = obj { nam = "ven_skeleton"; @@ -1539,4 +1798,41 @@ ven_octopus = obj { ven_temple_l2 = room { nam = "Венаэданотр, храм, второй этаж"; + dsc = [[ + Второй этаж храма представляет собой небольшой зал с металлическими стенами. В западной стене вы видите несколько окон, через которые открывается вид на ущелье. В северной части вы видите едва заметный проход. + ]]; + obj = { + 'ven_pedestal' + }; + way = { + kh_vroom("На первый этаж", "ven_temple_l1"); + kh_vroom("В проход на севере", "ven_near_temple"); + }; +}; + +ven_pedestal = obj { + var { + taken = false; + }; + nam = "ven_pedestal"; + dsc = function(s) + if (s.taken) then + return [[ + Пьедестал в центре зала пуст. + ]]; + else + return [[ + На пьедестале в центре зала вы видите небольшую металлическую пластину - судя по обозначениям это {фрагмент карты}. + ]]; + end; + end; + act = function(s) + if (not s.taken) then + s.taken = true; + put(item_navjiarr_chart_ven); + return [[ + Вы забираете фрагмент карты себе. + ]]; + end; + end; }; \ No newline at end of file diff --git a/main.lua b/main.lua --- a/main.lua +++ b/main.lua @@ -223,8 +223,9 @@ function init() submarine_leviathan:enable(); --ven_temple_l1.position = "66"; + put(item_ven_tablet, pl); --ven_shark.position = "55"; - pl.where = "ven_temple_l1"; + pl.where = "ven_towers_machine_look"; move(submarine_leviathan, "ven_center"); --pl.where = "ven_chest_look"; --move(ven_shark, "ven_temple_l1");