global { dt_temple_done = false; } dt_intro = lcutscene('Левиафан, рубка', 'Левиафан, рубка', [[Следуя карте, найденной в светодиске, вы следуете к древнейшему из известных вам навьярских сооружений. Через две недели пути вы оказываетесь в глубоком лабиринте ущелий. Здесь вам предстоит найти искомое. ]], 'Вы прибыли в древний храм. ', 'dt_labyrinth'); dt_labyrinth_foot = room { nam = "dt_labyrinth_foot"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]]; handwheel_room = "dt_labyrinth"; }; dt_labyrinth_ravine_foot = room { nam = "dt_labyrinth_ravine_foot"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Вы находитесь в лабиринте ущелий и впадин. Под вами с северо-запада на юго-восток простирается глубокая расщелина. Где-то здесь скрыт древний навьярский храм. ]]; handwheel_room = "dt_labyrinth"; }; dt_labyrinth_bridge = room { nam = "dt_labyrinth_bridge"; no_exit = [[Вы не сможете высадиться здесь. ]]; view = [[Вы находитесь в лабиринте ущелий и впадин. Под вами с северо-запада на юго-восток простирается глубокая расщелина. Прямо под Левиафаном вы видите узкий каменный мостик, из отверстия в скале напротив которого исходит яркий свет. Мостик слишком узкий и вы не можете высадиться здесь. ]]; handwheel_room = "dt_labyrinth"; }; dt_labyrinth_ravine_bridge_nw_foot = room { nam = "dt_labyrinth_ravine_bridge_nw_foot"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Вы находитесь в лабиринте ущелий и впадин. Под вами с северо-запада на юго-восток простирается глубокая расщелина. На юго-востоке вы видите узкий каменный мостик, протянувшийся над бездной. Из отверстия в скале напротив моста исходит яркий свет.]]; handwheel_room = "dt_labyrinth"; }; dt_labyrinth_ravine_bridge_se_foot = room { nam = "dt_labyrinth_ravine_bridge_se_foot"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Вы находитесь в лабиринте ущелий и впадин. Под вами с северо-запада на юго-восток простирается глубокая расщелина. На северо-западе вы видите узкий каменный мостик, протянувшийся над бездной. Из отверстия в скале напротив моста исходит яркий свет.]]; handwheel_room = "dt_labyrinth"; }; --id, dsc, directions, where, leviathan_where dt_labyrinth_map = { ["01"] = { dsc = [[Вы находитесь у входа в сложный лабиринт ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], ne = "02", where = dt_labyrinth_foot }; ["02"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], sw = "01", e = "03", where = dt_labyrinth_foot }; ["03"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], w = "02", ne = "04", where = dt_labyrinth_foot }; ["04"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], sw = "03", nw = "05", e = "07", where = dt_labyrinth_foot }; ["05"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], se = "04", n = "06", where = dt_labyrinth_foot }; ["06"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], s = "05", where = dt_labyrinth_foot }; ["07"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], w = "04", n = "08", se = "09", where = dt_labyrinth_foot }; ["08"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], s = "07", where = dt_labyrinth_foot }; ["09"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], w = "33", ne = "10", nw = "07", where = dt_labyrinth_foot }; ["10"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], ne = "11", sw = "09", where = dt_labyrinth_foot }; ["11"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Под вами с северо-запада на юго-восток простирается глубокая расщелина. Где-то здесь скрыт древний навьярский храм. ]], ne = "13", se = "14", nw = "12", sw = "10", where = dt_labyrinth_ravine_foot }; ["12"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Под вами простирается глубокая расщелина. Она продолжается на северо-запад настолько далеко, насколько хватает мощности прожектора Левиафана, однако, судя по карте, вам нет смысла двигаться в том направлении. ]], se = "11", where = dt_labyrinth_ravine_foot }; ["13"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], sw = "11", where = dt_labyrinth_foot }; ["14"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Под вами с северо-запада на юго-восток простирается глубокая расщелина. На юго-востоке вы видите узкий каменный мостик, протянувшийся над бездной. Из отверстия в скале напротив моста исходит яркий свет. ]], nw = "11", se = "15", where = dt_labyrinth_ravine_bridge_nw_foot }; ["15"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Под вами с северо-запада на юго-восток простирается глубокая расщелина. Прямо под Левиафаном вы видите узкий каменный мостик, из отверстия в скале напротив которого исходит яркий свет. Мостик слишком узкий и вы не можете высадиться здесь. ]], nw = "14", se = "17", sw = "19", where = dt_labyrinth_bridge }; ["16"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], ne = "35", where = dt_labyrinth_foot }; ["17"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Под вами с северо-запада на юго-восток простирается глубокая расщелина. На северо-западе вы видите узкий каменный мостик, протянувшийся над бездной. Из отверстия в скале напротив моста исходит яркий свет. ]], nw = "15", where = dt_labyrinth_ravine_bridge_se_foot }; ["18"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], ne = "31", where = dt_labyrinth_foot }; ["19"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. на северо-востоке вы видите глубокую расщелину, простирающуюся с северо-запада на юго-восток. Над расщелиной висит узкий каменный мостик. Из отверстия в скале напротив него исходит яркий свет. Здесь вы сможете высадиться. ]], ne = "15", w = "20", where = "dt_temple_ravine" }; ["20"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], e = "19", s = "21", where = dt_labyrinth_foot }; ["21"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], n = "20", se = "22", where = dt_labyrinth_foot }; ["22"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], nw = "21", sw = "23", where = dt_labyrinth_foot }; ["23"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], ne = "22", w = "24", where = dt_labyrinth_foot }; ["24"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], e = "23", sw = "25", where = dt_labyrinth_foot }; ["25"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], ne = "24", nw = "26", where = dt_labyrinth_foot }; ["26"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], ne = "27", se = "25", where = dt_labyrinth_foot }; ["27"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], ne = "28", sw = "26", nw = "30", where = dt_labyrinth_foot }; ["28"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], sw = "27", nw = "29", where = dt_labyrinth_foot }; ["29"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], se = "28", where = dt_labyrinth_foot }; ["30"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], se = "27", w = "31", where = dt_labyrinth_foot }; ["31"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], e = "30", n = "32", w = "34", sw = "18", where = dt_labyrinth_foot }; ["32"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], ne = "33", s = "31", where = dt_labyrinth_foot }; ["33"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], e = "09", sw = "32", where = dt_labyrinth_foot }; ["34"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], e = "31", w = "35", where = dt_labyrinth_foot }; ["35"] = { dsc = [[Вы находитесь в лабиринте ущелий и впадин. Где-то здесь скрыт древний навьярский храм. ]], e = "34", sw = "16", where = dt_labyrinth_foot }; }; dt_labyrinth = room { var { location = "01"; }; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; nam = "Штурвал Левиафана"; not_follow = true; dsc = function(s) return dt_labyrinth_map[dt_labyrinth.location].dsc; end; entered = function(s) s:update(); end; update = function(s) dt_north:disable(); dt_north_east:disable(); dt_east:disable(); dt_south_east:disable(); dt_south:disable(); dt_south_west:disable(); dt_west:disable(); dt_north_west:disable(); if (dt_labyrinth_map[dt_labyrinth.location].n) then dt_north:enable(); end; if (dt_labyrinth_map[dt_labyrinth.location].ne) then dt_north_east:enable(); end; if (dt_labyrinth_map[dt_labyrinth.location].e) then dt_east:enable(); end; if (dt_labyrinth_map[dt_labyrinth.location].se) then dt_south_east:enable(); end; if (dt_labyrinth_map[dt_labyrinth.location].s) then dt_south:enable(); end; if (dt_labyrinth_map[dt_labyrinth.location].sw) then dt_south_west:enable(); end; if (dt_labyrinth_map[dt_labyrinth.location].w) then dt_west:enable(); end; if (dt_labyrinth_map[dt_labyrinth.location].nw) then dt_north_west:enable(); end; move(submarine_leviathan, dt_labyrinth_map[dt_labyrinth.location].where); end; way = { kh_vroom("Отойти от штурвала", "leviathan_wheelhouse"); }; obj = { "dt_north", "dt_north_east", "dt_east", "dt_south_east", "dt_south", "dt_south_west", "dt_west", "dt_north_west", "dt_elsewhere" }; }; dt_elsewhere = obj { nam = "dt_elsewhere"; dsc = "{В другое место}^"; act = function(s) walk(leviathan_dlg); end; }; dt_north = obj { nam = "dt_north"; dsc = "{На север}^"; act = function(s) pr [[Вы движетесь на север. ]]; dt_labyrinth.location = dt_labyrinth_map[dt_labyrinth.location].n; dt_labyrinth:update(); pr(dt_labyrinth_map[dt_labyrinth.location].dsc); end; }; dt_north_east = obj { nam = "dt_north_east"; dsc = "{На северо-восток}^"; act = function(s) pr [[ Вы движетесь на северо-восток. ]]; dt_labyrinth.location = dt_labyrinth_map[dt_labyrinth.location].ne; dt_labyrinth:update(); pr(dt_labyrinth_map[dt_labyrinth.location].dsc); end; }; dt_east = obj { nam = "dt_east"; dsc = "{На восток}^"; act = function(s) pr [[ Вы движетесь на восток. ]]; dt_labyrinth.location = dt_labyrinth_map[dt_labyrinth.location].e; dt_labyrinth:update(); pr(dt_labyrinth_map[dt_labyrinth.location].dsc); end; }; dt_south_east = obj { nam = "dt_south_east"; dsc = "{На юго-восток}^"; act = function(s) pr [[ Вы движетесь на юго-восток. ]]; dt_labyrinth.location = dt_labyrinth_map[dt_labyrinth.location].se; dt_labyrinth:update(); pr(dt_labyrinth_map[dt_labyrinth.location].dsc); end; }; dt_south = obj { nam = "dt_south"; dsc = "{На юг}^"; act = function(s) pr [[ Вы движетесь на юг. ]]; dt_labyrinth.location = dt_labyrinth_map[dt_labyrinth.location].s; dt_labyrinth:update(); pr(dt_labyrinth_map[dt_labyrinth.location].dsc); end; }; dt_south_west = obj { nam = "dt_south_west"; dsc = "{На юго-запад}^"; act = function(s) pr [[ Вы движетесь на юго-запад. ]]; dt_labyrinth.location = dt_labyrinth_map[dt_labyrinth.location].sw; dt_labyrinth:update(); pr(dt_labyrinth_map[dt_labyrinth.location].dsc); end; }; dt_west = obj { nam = "dt_west"; dsc = "{На запад}^"; act = function(s) pr [[ Вы движетесь на запад. ]]; dt_labyrinth.location = dt_labyrinth_map[dt_labyrinth.location].w; dt_labyrinth:update(); pr(dt_labyrinth_map[dt_labyrinth.location].dsc); end; }; dt_north_west = obj { nam = "dt_north_west"; dsc = "{На северо-запад}^"; act = function(s) pr [[Вы движетесь на северо-запад. ]]; dt_labyrinth.location = dt_labyrinth_map[dt_labyrinth.location].nw; dt_labyrinth:update(); pr(dt_labyrinth_map[dt_labyrinth.location].dsc); end; }; dt_temple_ravine = room { nam = "dt_temple_ravine"; handwheel_room = "dt_labyrinth"; no_exit = function(s) if have(item_naethvjirr_key) then return [[Мне здесь больше нечего делать. ]]; else return false; end; end; disp = "Ущелье"; dsc = function(s) if dt_temple_bridge1.state == 2 then return [[Вы стоите на дне расщелины. К северо-востоку от вас находится глубокое ущелье, из которого прямо сейчас поднимается громадное морское чудовище. ]]; else return [[Вы стоите на дне расщелины. К северо-востоку от вас находится глубокое ущелье. Через ущелье переброшен узкий каменный мостик, на другом конце которого вы видите в скале прямоугольное отверстие явно искусственного происхождения. Из отверстия исходит яркий свет. ]]; end; end; view = [[Вы находитесь в лабиринте ущелий и впадин. на северо-востоке вы видите глубокую расщелину, простирающуюся с северо-запада на юго-восток. над расщелиной висит узкий каменный мостик. Из отверстия в скале напротив него исходит яркий свет. ]]; way = { kh_vroom("В Левиафан", function(s) if dt_temple_bridge1.state == 2 and not dt_temple_done then dt_temple_done = true; return 'dt_fight_intro'; else return "leviathan_airlock"; end; end); kh_vroom("На мост", "dt_temple_bridge1"); }; }; dt_temple_bridge1 = room { var { state = 0; }; nam = "dt_temple_bridge1"; disp = "Мост над пропастью"; dsc = function(s) if s.state == 2 then return [[Часть моста, ведущая к храму разрушена, а из бездны поднимается громадное чудище из древних легенд -- кракен. ]]; else return [[Вы ступаете на хлипкий мостик. Камни ходят ходуном под вашими ногами, и кажется, что слабая конструкция вот вот рухнет, увлекая вас за собой в бездну. ]]; end; end; entered = function(s) char_radcliffe:accompany(false); char_wright:accompany(false); char_anna:accompany(false); if (s.state == 0) then s.state = 1; if (char_learr.follow) then pr [[Леарр с сомнением смотрит на шаткую постройку и по ее головным плавникам бегут цветные полосы: "Не думаю, что мост выдержит нас обоих, я поплыву сверху". ]]; end; if (char_phaetlarr.follow) then pr [[Фаэтларр осматривает мост и по его головным плавникам бегут цветные полосы: "Я бы не рискнул пойти по нему, но у тебя, хевьяр, кажется нет выбора", -- навьяр смотрит на вас со странной ухмылкой. ]]; end; if (char_radcliffe.follow) then pr [[В динамиках раздается голос Уолтера Рэдклиффа: "Я не думаю, что мост выдержит нас обоих. Если тебе нужен помощник, то навьяр здесь будет полезнее. К тому же это их святилище". ]]; end; if (char_wright.follow) then pr [[В динамиках раздается голос Джека Райта: "Нам точно стоит идти здесь? Мост не выглядит надежным. Думаю, тебе стоит взять навьяра, если тебе нужен спутник". ]]; end; if (char_anna.follow) then pr [[В динамиках раздается голос Анны Рэдклифф: "Думаю, мост без проблем выдержит одного из нас. Удачи. Мне кажется, тебе лучше было бы идти с навьяром". ]]; end; end; if have(item_naethvjirr_key) then s.state = 2; path('Дальше по мосту'):disable(); path('На мост', dt_temple_ravine): disable(); pr [[Мост позади вас рушится, а из глубины на поверхность поднимается громадная туша кракена. ]]; end; end; way = { kh_vroom("В ущелье", "dt_temple_ravine"); kh_vroom("Дальше по мосту", "dt_temple_bridge2"); }; }; dt_temple_bridge2 = room { var { state = 0; }; nam = "dt_temple_bridge2"; disp = "Мост над пропастью"; dsc = [[Вы почти дошли до проема в скале. Вам кажется, что внизу, в бездне движется что-то огромное. ]]; entered = function(s) if (s.state == 0) then s.state = 1; if (char_learr.follow) then pr [[По головным плавникам Леарр бегут цветные полосы: "Что это? Там, внизу". ]]; end; if (char_phaetlarr.follow) then pr [[По головным плавникам Фаэтларра бегут цветные полосы: "Ты видишь это, хевьяр?". ]]; end; end; if have(item_naethvjirr_key) then pr [[Мост под вами содрогается, глянув вниз, вы замечаете какое-то движение в глубине. Что бы это ни было, оно движется наверх. ]]; end; end; way = { kh_vroom("К ущелью", "dt_temple_bridge1"); kh_vroom("В проем", "dt_temple_entrance"); }; }; dt_temple_entrance = room { var { state = 0; open = false; }; nam = "dt_temple_entrance"; disp = "У входа в храм"; dsc = function(s) if (dt_temple_entrance.open) then return [[ Вы находитесь в небольшом помещении, ярко освещенном лампами в виде длинных трубок. Стены вокруг покрыты навьярскими письменами. Дверь во внутреннее помещение храма открыта. ]]; else return [[ Вы находитесь в небольшом помещении, ярко освещенном лампами в виде длинных трубок. Стены вокруг покрыты навьярскими письменами. Тяжелая дверь во внутреннее помещение храма заблокирована. ]]; end; end; entered = function(s) if (s.state == 0) then s.state = 1; if (char_learr.follow) then pr [[Леарр с интересом рассматривает древние письмена. По ее головным плавникам бегут цветные полосы: "Потрясающе! Это слова наших предков. Тех, кто видел Лсэрианотр собственными глазами, а может даже и самих создателей Спящего в Глубинах!". ]]; end; if (char_phaetlarr.follow) then pr [[Фаэтларр бегло осматривает письмена: "Кажется, Уильям Дрейк кое-что упустил. Хорошо, что мы здесь, хевьяр". ]]; end; end; end; obj = { "dt_terminal", "dt_wires", "item_dt_warning" }; way = { kh_vroom("К ущелью", "dt_temple_bridge2"); kh_vroom("В храм", function(s) if (dt_temple_entrance.open) then return "dt_temple"; else pr [[Дверь заперта. ]]; return false; end; end); }; }; item_dt_warning = obj { nam = "item_dt_warning"; disp = 'Табличка с предупреждением'; dsc = "Рядом с пультом лежит {каменная табличка}, покрытая многолетним илом."; tak = "Вы забираете каменную табличку себе. Она несомненно очень старая и лежит здесь с незапамятных времен. "; inv = function(s) atl_trevenveerr_warning = true; pr [[Цветные полосы на табличке заметно потускнели от времени, но все еще достаточно различимы. Текст гласит: "]]; pr(translate_now(trans_legends, 'naethvjirr_trevenveerr')); pr [[". ]]; remove(s, pl); end; }; dt_terminal = obj { nam = "dt_terminal"; dsc = [[Рядом с дверью расположен небольшой {пульт} с шестью кнопками и светящимся экраном. ]]; act = function(s) walkin("dt_terminal_room"); end; }; dt_wires = obj { nam = "dt_wires"; dsc = [[Под пультом вы видите открытую {панель} с какими-то проводами. ]]; act = function(s) walkin("dt_wires_room"); end; }; dt_terminal_room = room { var { code = {}; }; not_follow = true; nam = "dt_terminal_room"; disp = "У входа в храм, пульт"; forcedsc = true; dsc = function(s) local r = ""; if (#s.code == 0) then r = "Вы стоите перед небольшим пультом. На экране пусто. "; else r = "Вы стоите перед небольшим пультом. На экране вы видите следующую последовательность цветов: "; for i = 1, #s.code - 1 do r = r .. dt_wire_colors[s.code[i]] .. ", "; end; r = r .. dt_wire_colors[s.code[#s.code]] .. ". "; end; r = r .. "Под экраном расположены шесть кнопок. " return r; end; way = { kh_vroom("Отойти от терминала", "dt_temple_entrance"); }; obj = { "dt_term1", "dt_term2", "dt_term3", "dt_term4", "dt_term5", "dt_term6" }; check = function(s) if (#s.code == 4) then local test = true; for i = 1, #s.code do test = test and (s.code[i] == dt_code[i]); end; s.code = {}; if (test) then dt_temple_entrance.open = true; pr [[ Через несколько мгновений дисплей гаснет. Дверь открывается почти бесшумно, открывая вам доступ к внутреннему залу древнего святилища. ]]; else pr [[ Через несколько мгновений дисплей гаснет. ]]; end; end; end; }; dt_term1 = obj { nam = "dt_term1"; dsc = "{Нажать фиолетовую кнопку}^"; act = function(s) if (ArrayUtils.indexOf(dt_buttons, 1) ~= 0 or dt_wires_room.connections[1] == 0) then return "Вы нажимаете на кнопку, но ничего не происходит. "; else table.insert(dt_terminal_room.code, dt_wires_room.connections[1]); pr "Вы нажимаете на кнопку, и на экране зажигается соответствующая ей цветная полоса. "; dt_terminal_room:check(); end; end; }; dt_term2 = obj { nam = "dt_term2"; dsc = "{Нажать синюю кнопку}^"; act = function(s) if (ArrayUtils.indexOf(dt_buttons, 2) ~= 0 or dt_wires_room.connections[2] == 0) then return "Вы нажимаете на кнопку, но ничего не происходит. "; else table.insert(dt_terminal_room.code, dt_wires_room.connections[2]); pr "Вы нажимаете на кнопку, и на экране зажигается соответствующая ей цветная полоса. "; dt_terminal_room:check(); end; end; }; dt_term3 = obj { nam = "dt_term3"; dsc = "{Нажать зеленую кнопку}^"; act = function(s) if (ArrayUtils.indexOf(dt_buttons, 3) ~= 0 or dt_wires_room.connections[3] == 0) then return "Вы нажимаете на кнопку, но ничего не происходит. "; else table.insert(dt_terminal_room.code, dt_wires_room.connections[3]); pr "Вы нажимаете на кнопку, и на экране зажигается соответствующая ей цветная полоса. "; dt_terminal_room:check(); end; end; }; dt_term4 = obj { nam = "dt_term4"; dsc = "{Нажать желтую кнопку}^"; act = function(s) if (ArrayUtils.indexOf(dt_buttons, 4) ~= 0 or dt_wires_room.connections[4] == 0) then return "Вы нажимаете на кнопку, но ничего не происходит. "; else table.insert(dt_terminal_room.code, dt_wires_room.connections[4]); pr "Вы нажимаете на кнопку, и на экране зажигается соответствующая ей цветная полоса. "; dt_terminal_room:check(); end; end; }; dt_term5 = obj { nam = "dt_term5"; dsc = "{Нажать оранжевую кнопку}^"; act = function(s) if (ArrayUtils.indexOf(dt_buttons, 5) ~= 0 or dt_wires_room.connections[5] == 0) then return "Вы нажимаете на кнопку, но ничего не происходит. "; else table.insert(dt_terminal_room.code, dt_wires_room.connections[5]); pr "Вы нажимаете на кнопку, и на экране зажигается соответствующая ей цветная полоса. "; dt_terminal_room:check(); end; end; }; dt_term6 = obj { nam = "dt_term6"; dsc = "{Нажать красную кнопку}^"; act = function(s) if (ArrayUtils.indexOf(dt_buttons, 6) ~= 0 or dt_wires_room.connections[6] == 0) then return "Вы нажимаете на кнопку, но ничего не происходит. "; else table.insert(dt_terminal_room.code, dt_wires_room.connections[6]); pr "Вы нажимаете на кнопку, и на экране зажигается соответствующая ей цветная полоса. "; dt_terminal_room:check(); end; end; }; dt_wire_colors = { "фиолетовый", "синий", "зеленый", "желтый", "оранжевый", "красный" }; dt_wires_room = dlg { var { connections = { 1, 2, 3, 4, 5, 6 }; selected = false; }; not_follow = true; nam = "dt_wires_room"; disp = "У входа в храм, панель"; dsc = [[ Перед вами открытая панель, за которой находятся шесть проводов, подключенные к своим разъемам. Провода отличаются цветами. ]]; choose_socket = function(s) pon("s0", "s1", "s2", "s3", "s4", "s5"); for conn = 1, 6 do if (dt_wires_room.connections[conn] == 1) then poff("s0"); elseif (dt_wires_room.connections[conn] == 2) then poff("s1"); elseif (dt_wires_room.connections[conn] == 3) then poff("s2"); elseif (dt_wires_room.connections[conn] == 4) then poff("s3"); elseif (dt_wires_room.connections[conn] == 5) then poff("s4"); elseif (dt_wires_room.connections[conn] == 6) then poff("s5"); end; end; psub("socket"); end; phr = { {tag="wire"}; { tag = "w0", always = true, function(s) local connect = "не подключен"; if (dt_wires_room.connections[1] ~= 0) then connect = dt_wire_colors[dt_wires_room.connections[1]] .. " разъем"; return "Отсоединить фиолетовый провод (".. connect .. ")"; else return "Выбрать фиолетовый провод (".. connect .. ")"; end; end, function(s) if (dt_wires_room.connections[1] ~= 0) then dt_wires_room.connections[1] = 0; return "Вы отсоединяете провод"; else dt_wires_room.selected = 1; dt_wires_room:choose_socket(); return "Куда подключить?"; end; end }; { tag = "w1", always = true, function(s) local connect = "не подключен"; if (dt_wires_room.connections[2] ~= 0) then connect = dt_wire_colors[dt_wires_room.connections[2]] .. " разъем"; return "Отсоединить синий провод (".. connect .. ")"; else return "Выбрать синий провод (".. connect .. ")"; end; end, function(s) if (dt_wires_room.connections[2] ~= 0) then dt_wires_room.connections[2] = 0; return "Вы отсоединяете провод"; else dt_wires_room.selected = 2; dt_wires_room:choose_socket(); return "Куда подключить?"; end; end }; { tag = "w2", always = true, function(s) local connect = "не подключен"; if (dt_wires_room.connections[3] ~= 0) then connect = dt_wire_colors[dt_wires_room.connections[3]] .. " разъем"; return "Отсоединить зеленый провод (".. connect .. ")"; else return "Выбрать зеленый провод (".. connect .. ")"; end; end, function(s) if (dt_wires_room.connections[3] ~= 0) then dt_wires_room.connections[3] = 0; return "Вы отсоединяете провод"; else dt_wires_room.selected = 3; dt_wires_room:choose_socket(); return "Куда подключить?"; end; end }; { tag = "w3", always = true, function(s) local connect = "не подключен"; if (dt_wires_room.connections[4] ~= 0) then connect = dt_wire_colors[dt_wires_room.connections[4]] .. " разъем"; return "Отсоединить желтый провод (".. connect .. ")"; else return "Выбрать желтый провод (".. connect .. ")"; end; end, function(s) if (dt_wires_room.connections[4] ~= 0) then dt_wires_room.connections[4] = 0; return "Вы отсоединяете провод"; else dt_wires_room.selected = 4; dt_wires_room:choose_socket(); return "Куда подключить?"; end; end }; { tag = "w4", always = true, function(s) local connect = "не подключен"; if (dt_wires_room.connections[5] ~= 0) then connect = dt_wire_colors[dt_wires_room.connections[5]] .. " разъем"; return "Отсоединить оранжевый провод (".. connect .. ")"; else return "Выбрать оранжевый провод (".. connect .. ")"; end; end, function(s) if (dt_wires_room.connections[5] ~= 0) then dt_wires_room.connections[5] = 0; return "Вы отсоединяете провод"; else dt_wires_room.selected = 5; dt_wires_room:choose_socket(); return "Куда подключить?"; end; end }; { tag = "w5", always = true, function(s) local connect = "не подключен"; if (dt_wires_room.connections[6] ~= 0) then connect = dt_wire_colors[dt_wires_room.connections[6]] .. " разъем"; return "Отсоединить красный провод (".. connect .. ")"; else return "Выбрать красный провод (".. connect .. ")"; end; end, function(s) if (dt_wires_room.connections[6] ~= 0) then dt_wires_room.connections[6] = 0; return "Вы отсоединяете провод"; else dt_wires_room.selected = 6; dt_wires_room:choose_socket(); return "Куда подключить?"; end; end }; { tag = "leave", always = true, "Отойти от панели", code = [[ walk("dt_temple_entrance"); ]] }; {tag="socket"}; { tag = "s0", always = true, "В фиолетовый разъем", function(s) dt_wires_room.connections[dt_wires_room.selected] = 1; psub("wire"); return "Провод подключен"; end }; { tag = "s1", always = true, "В синий разъем", function(s) dt_wires_room.connections[dt_wires_room.selected] = 2; psub("wire"); return "Провод подключен"; end }; { tag = "s2", always = true, "В зеленый разъем", function(s) dt_wires_room.connections[dt_wires_room.selected] = 3; psub("wire"); return "Провод подключен"; end }; { tag = "s3", always = true, "В желтый разъем", function(s) dt_wires_room.connections[dt_wires_room.selected] = 4; psub("wire"); return "Провод подключен"; end }; { tag = "s4", always = true, "В оранжевый разъем", function(s) dt_wires_room.connections[dt_wires_room.selected] = 5; psub("wire"); return "Провод подключен"; end }; { tag = "s5", always = true, "В красный разъем", function(s) dt_wires_room.connections[dt_wires_room.selected] = 6; psub("wire"); return "Провод подключен"; end }; }; }; dt_temple = room { var { state = 0; }; nam = "dt_temple"; disp = "Древний храм"; dsc = [[Вы находитесь в огромном зале, высеченном в скале древними навьярами. ]]; obj = { "dt_walls", "dt_pedestal", "dt_screens", "item_naethvjirr_key" }; way = { kh_vroom("Выйти", "dt_temple_entrance"); }; }; dt_walls = obj { nam = "dt_walls"; dsc = [[Стены зала, освещенные такими же лампами, как и внешнее помещение, украшены множеством предостерегающих рисунков и символов. ]]; }; dt_pedestal = obj { nam = "dt_pedestal"; dsc = [[В центре зала установлен массивный металлический пьедестал. ]]; }; dt_screens = obj { nam = "dt_screens"; dsc = [[Вокруг пьедестала расположено множество экранов, на которых цветными полосами навьярского языка горят {надписи}, объясняющие назначение предмета, хранящегося в этом зале. ]]; act = function(s) atl_ancient_temple_text = true; pr [[Светящиеся полосы гласят: "Это место хранит ключ к навьярскому благополучию. Используй его с умом. ]]; pr(translate_now(trans_legends, 'naethvjirr_ancient_temple')); pr [[". ]]; end; } dt_fight_intro = cutscene('Левиафан', 'Левиафан', [[Оказавшись внутри Левиафана, вы со всех ног бросаетесь в рубку, чтобы увести корабль подальше от опасности, но не тут то было. Громадная туша нависла над Левиафаном, преграждая своими щупальцами пути отхода. ]], 'dt_fight', function(s) make_snapshot(); autosave(); end); dt_fight = room { var { state = 0; has_shot = false; rotation = 90; dir = 0; tentacles = { {hp=200, dir=0, away = 0 }; {hp=200, dir=1, away = 0 }; {hp=200, dir=2, away = 0 }; {hp=200, dir=3, away = 0 }; {hp=200, dir=4, away = 0 }; }; }; hideinv = true; positions = { {80, 0}, {160, 0}, {160, 80}, {160, 160}, {80, 160}, {0, 160}, {0, 80}, {0, 0} }; nam = "dt_fight"; pic = function(s) local pic = 'images/deep_temple_bg.png'; for i = 1, #s.tentacles do if s.tentacles[i].away == 0 then local pos = s.positions[s.tentacles[i].dir + 1]; local status; if (s.tentacles[i].hp <= 70) then status = 'heavy'; elseif (s.tentacles[i].hp <= 140) then status = 'medium'; elseif (s.tentacles[i].hp < 200) then status = 'light'; else status = 'healthy'; end; pic = pic .. ';images/dt_tentacle_' .. tostring(s.tentacles[i].dir + 1) .. '_' .. status .. '.png@' .. pos[1] .. ',' .. pos[2]; end; end; pic = pic .. ';images/dt_leviathan_' .. tostring(s.dir + 1) .. '.png@80,80' return pic; end; disp = "Левиафан, рубка"; not_follow = true; nosave = true; noautosave = true; forcedsc = true; entered = function(s) s:maketurn(); if (s.state == 0) then s.state = 1; local dirs = {0,1,2,3,4,5,6,7}; for i = 1, #s.tentacles do local cd = rnd(#dirs); s.tentacles[i].dir = dirs[cd]; table.remove(dirs, cd); end; end; end; eval_tentacle = function(s, tentacle) if (tentacle.hp <= 70) then return [[Серьезно раненое щупальце ]]; elseif (tentacle.hp <= 140) then return [[Раненое щупальце ]]; elseif (tentacle.hp < 200) then return [[Легко раненое щупальце ]]; else return [[Щупальце ]]; end; end; dsc = function(s) local fr = s.dir + 1; local r = s.dir + 2; local br = s.dir + 3; local b = s.dir + 4; local fl = s.dir - 1; local l = s.dir - 2; local bl = s.dir - 3; if (fr > 7) then fr = fr - 8; end; if (r > 7) then r = r - 8; end; if (br > 7) then br = br - 8; end; if (b > 7) then b = b - 8; end; if (fl < 0) then fl = fl + 8; end; if (l < 0) then l = l + 8; end; if (bl < 0) then bl = bl + 8; end; local cnt = 0; for i = 1, #s.tentacles do if (s.tentacles[i].hp > 0 and s.tentacles[i].away == 0) then cnt = cnt + 1; end; end; if cnt > 0 then pr [[Щупальца кракена тянутся к Левиафану. ]]; else pr [[Кракен выжидает момента для нападения. ]]; end; for i = 1, #s.tentacles do if (s.tentacles[i].hp > 0 and s.tentacles[i].dir == s.dir and s.tentacles[i].away == 0) then pr(s:eval_tentacle(s.tentacles[i]) .. [[ находится прямо перед субмариной. ]]); end; end; for i = 1, #s.tentacles do if (s.tentacles[i].hp > 0 and s.tentacles[i].dir == fr and s.tentacles[i].away == 0) then pr(s:eval_tentacle(s.tentacles[i]) .. [[ находится справа-спереди от субмарины. ]]); end; end; for i = 1, #s.tentacles do if (s.tentacles[i].hp > 0 and s.tentacles[i].dir == fl and s.tentacles[i].away == 0) then pr(s:eval_tentacle(s.tentacles[i]) .. [[ находится слева-спереди от субмарины. ]]); end; end; for i = 1, #s.tentacles do if (s.tentacles[i].hp > 0 and s.tentacles[i].dir == r and s.tentacles[i].away == 0) then pr(s:eval_tentacle(s.tentacles[i]) .. [[ находится справа по борту. ]]); end; end; for i = 1, #s.tentacles do if (s.tentacles[i].hp > 0 and s.tentacles[i].dir == l and s.tentacles[i].away == 0) then pr(s:eval_tentacle(s.tentacles[i]) .. [[ находится слева по борту. ]]); end; end; for i = 1, #s.tentacles do if (s.tentacles[i].hp > 0 and s.tentacles[i].dir == b and s.tentacles[i].away == 0) then pr(s:eval_tentacle(s.tentacles[i]) .. [[ находится сзади. ]]); end; end; for i = 1, #s.tentacles do if (s.tentacles[i].hp > 0 and s.tentacles[i].dir == bl and s.tentacles[i].away == 0) then pr(s:eval_tentacle(s.tentacles[i]) .. [[ находится слева-сзади. ]]); end; end; for i = 1, #s.tentacles do if (s.tentacles[i].hp > 0 and s.tentacles[i].dir == br and s.tentacles[i].away == 0) then pr(s:eval_tentacle(s.tentacles[i]) .. [[ находится справа-сзади. ]]); end; end; end; maketurn = function(s, anydir) local dcnt = 0; if (s.has_shot) then local f = s.dir; local fr = s.dir + 1; local r = s.dir + 2; local br = s.dir + 3; local b = s.dir + 4; local fl = s.dir - 1; local l = s.dir - 2; local bl = s.dir - 3; if (fr > 7) then fr = fr - 8; end; if (r > 7) then r = r - 8; end; if (br > 7) then br = br - 8; end; if (b > 7) then b = b - 8; end; if (fl < 0) then fl = fl + 8; end; if (l < 0) then l = l + 8; end; if (bl < 0) then bl = bl + 8; end; s.has_shot = false; s.rotation = 90; for i = 1, #s.tentacles do if (s.tentacles[i].hp > 0) then if (s.tentacles[i].away > 0) then s.tentacles[i].away = s.tentacles[i].away - 1; if (s.tentacles[i].away == 0) then local dirs = {fl, f, fr}; if anydir then dirs = {}; end; for j = 1, #s.tentacles do if (s.tentacles[j].hp > 0 and s.tentacles[j].away == 0 and j ~= i) then table.insert(dirs, s.tentacles[j].dir); end; end; local newdir; repeat newdir = rnd(8) - 1; until ArrayUtils.indexOf(dirs, newdir) == 0; s.tentacles[i].dir = newdir; if (s.tentacles[i].hp <= 70) then pr [[Серьезно раненое щупальце ]]; elseif (s.tentacles[i].hp <= 140) then pr [[Раненое щупальце ]]; elseif (s.tentacles[i].hp < 200) then pr [[Легко раненое щупальце ]]; else pr [[Щупальце ]]; end; if (newdir == f) then pr [[подтягивается спереди. ]]; elseif (newdir == fr) then pr [[подтягивается спереди справа. ]]; elseif (newdir == fl) then pr [[подтягивается спереди слева. ]]; elseif (newdir == r) then pr [[подтягивается справа. ]]; elseif (newdir == l) then pr [[подтягивается слева. ]]; elseif (newdir == br) then pr [[подтягивается сзади справа. ]]; elseif (newdir == bl) then pr [[подтягивается сзади слева. ]]; elseif (newdir == b) then pr [[подтягивается сзади. ]]; end; end; else --TODO hit leviathan or hide up if (rnd(8) > 1) then submarine_leviathan.hull_integrity = submarine_leviathan.hull_integrity - 4; pr [[Кракен ударяет Левиафан щупальцем. ]]; else s.tentacles[i].away = 1; pr [[Кракен отдергивает одно из щупалец. ]]; end; end; else dcnt = dcnt + 1; end; end; end; if submarine_leviathan.hull_integrity <= 0 then walk("game_over_kraken"); return; elseif (dcnt > 2) then walk("dt_kraken_victory"); return; end; dt_f_rotate_ccw45:enable(); dt_f_rotate_cw45:enable(); dt_f_sonic:enable(); if (submarine_leviathan.torpedoes == 0) then dt_f_torpedo:disable(); else dt_f_torpedo:enable(); end; if (submarine_leviathan.torpedoes == 2) then dt_f_recharge:disable(); else dt_f_recharge:enable(); end; if (s.rotation < 45) then dt_f_rotate_ccw45:disable(); dt_f_rotate_cw45:disable(); end; if (s.has_shot) then dt_f_torpedo:disable(); dt_f_sonic:disable(); end; if submarine_leviathan.hull_integrity <= 25 then pr [[Левиафан серьезно поврежден, целостность внешней обшивки нарушена. ]]; elseif submarine_leviathan.hull_integrity <= 50 then pr [[Левиафан серьезно поврежден. ]]; elseif submarine_leviathan.hull_integrity <= 75 then pr [[Левиафан получил незначительные повреждения. ]]; end; end; obj = { "dt_f_rotate_ccw45", "dt_f_rotate_cw45", "dt_f_torpedo", "dt_f_sonic", "dt_f_recharge", "dt_f_wait" }; }; dt_f_rotate_ccw45 = obj { nam = "dt_f_rotate_ccw45"; dsc = "{Повернуть на 45 градусов против часовой стрелки}^"; act = function(s) dt_fight.dir = dt_fight.dir - 1; if (dt_fight.dir < 0) then dt_fight.dir = dt_fight.dir + 8; end; dt_fight.rotation = dt_fight.rotation - 45; pr "Субмарина поворачивает против часовой стрелки. "; dt_fight:maketurn(); end; }; dt_f_rotate_cw45 = obj { nam = "dt_f_rotate_cw45"; dsc = "{Повернуть на 45 градусов по часовой стрелке}^"; act = function(s) dt_fight.dir = dt_fight.dir + 1; if (dt_fight.dir > 7) then dt_fight.dir = dt_fight.dir - 8; end; dt_fight.rotation = dt_fight.rotation - 45; pr "Субмарина поворачивает по часовой стрелке. "; dt_fight:maketurn(); end; }; dt_f_torpedo = obj { nam = "dt_f_torpedo"; dsc = "{Выстрелить торпедой}^"; act = function(s) pr "Вы выпускаете торпеду. "; dt_fight.has_shot = true; submarine_leviathan.torpedoes = submarine_leviathan.torpedoes - 1; for i=1, #dt_fight.tentacles do if dt_fight.tentacles[i].dir == dt_fight.dir and dt_fight.tentacles[i].hp > 0 and dt_fight.tentacles[i].away == 0 then dt_fight.tentacles[i].hp = dt_fight.tentacles[i].hp - 70; dt_fight.tentacles[i].away = 2; if (dt_fight.tentacles[i].hp > 0) then pr "Торпеда попадает в одно из щупалец, нанеся ему существенный урон. Кракен резко отдергивает его. "; else pr "Щупальце отрывает взрывом. Кракен бьется в конвульсиях. "; end; end; end; dt_fight:maketurn(); end; }; dt_f_sonic = obj { nam = "dt_f_sonic"; dsc = "{Выстрелить из звуковой пушки}^"; act = function(s) dt_fight.has_shot = true; pr [[Вы стреляете из звуковой пушки. ]]; local fr = dt_fight.dir + 1; local fl = dt_fight.dir - 1; if (fr > 7) then fr = fr - 8; end; if (fl < 0) then fl = fl + 8; end; local hit = false; for i=1, #dt_fight.tentacles do if (dt_fight.tentacles[i].dir == dt_fight.dir or dt_fight.tentacles[i].dir == fr or dt_fight.tentacles[i].dir == fl) and dt_fight.tentacles[i].hp > 0 and dt_fight.tentacles[i].away == 0 then hit = true; dt_fight.tentacles[i].hp = dt_fight.tentacles[i].hp - 20; dt_fight.tentacles[i].away = 3; if (dt_fight.tentacles[i].hp <= 0) then pr "Одно из щупалец выведено из строя. "; end; end; end; if (hit) then pr [[ Кракен резко отдергивает щупальца, попавшие в область действия звуковой пушки. ]]; end; dt_fight:maketurn(); end; }; dt_f_recharge = obj { nam = "dt_f_recharge"; dsc = "{Перезарядить торпедные аппараты}^"; act = function(s) submarine_leviathan.torpedoes = 2; if (ArrayUtils.indexOf(pl.party, 'wright') ~= 0 or ArrayUtils.indexOf(pl.party, 'radcliffe') ~= 0) then pr "Вы отдаете по телефону приказ перезарядить торпедные аппараты. "; dt_fight:maketurn(); else pr "Вы спускаетесь вниз, чтобы перезарядить торпедные аппараты. "; dt_fight.has_shot = true; dt_fight:maketurn(); dt_fight.has_shot = true; dt_fight:maketurn(); pr "Вы возвращаетесь в рубку, чтобы продолжить бой. " end; end; }; dt_f_wait = obj { nam = "dt_f_wait"; dsc = "{Ждать}^"; act = function(s) dt_fight.has_shot = true; dt_fight.rotation = 0; dt_fight:maketurn(true); return true; end; }; dt_kraken_victory = cutscene("dt_kraken_victory", "Левиафан, рубка", [[ После очередного выстрела Левиафана, кракен исчезает в глубинах, оставив вас в покое. ]], "leviathan_wheelhouse");