global { lse_powerplant_found = false }; lse_confront_drake = cutscene("Лсэрианотр", "Лсэрианотр", function(s) if (have("item_naethvjirr_key")) then remove("item_naethvjirr_key", pl); lse_key = true; end; return [[Уильям качает головой: "Очень жаль, но я не могу допустить этого. Аэдхиарр, взять их". В помещение входит группа вооруженных навьяров. Они обыскивают вас, забирая все ценное. Они уводят вас в тюремную камеру и запирают там. Ваших спутников схватили вместе с вами. ]]; end, "lse_phaetlarr_intro"); lse_phaetlarr_intro = cutscene("lse_phaetlarr_intro", "Левиафан", function(s) pr [[Фаэтларр сидел около иллюминатора в кают-компании, когда в док вошла группа навьяров. Хорошее зрение позволило ему разглядеть как они общаются друг с другом посредством цветовых сигналов: "Властитель сказал нам осмотреть корабль и взять все ценное". После чего группа направилась к Левиафану. Решение пришло в голову Фаэтларра мгновенно. Навьяр спрятался за одним из стеллажей в грузовом отсеке и, из своего укрытия, отлично видел, как один стражник из группы сообщил остальным: "Здесь никого нет. Все пришельцы схвачены". Дождавшись когда они покинули Левиафан, Фаэтларр покинул укрытие. ]]; end, function(s) char_learr:accompany(false); char_phaetlarr:accompany(false); char_radcliffe:accompany(false); char_wright:accompany(false); char_anna:accompany(false); player_phaetlarr.where = "lse_leviathan_cargo_hold"; change_pl(player_phaetlarr); return "lse_leviathan_cargo_hold"; end); player_phaetlarr = player { nam = "player_phaetlarr"; obj = {}; } lse_item_toolbox = obj { nam = "toolbox"; disp = "Ящик с инструментами"; dsc = [[У входа лежит {ящик с инструментами}, столь опрометчиво(или предусмотрительно?) оставленный Дэвидом. ]]; tak = [[Фаэтларр забирает ящик с собой. ]]; inv = [[Ящик со всевозможными инструментами. Большую часть из них Фаэтларр видит впервые. ]]; }; lse_leviathan_cargo_hold = room { nam = "lse_leviathan_cargo_hold"; disp = "Левиафан, грузовой отсек"; dsc = [[Фаэтларр находится в грузовом отсеке Левиафана, среди множества ящиков в котором так легко затеряться. ]]; obj = { "player_phaetlarr", "lse_item_toolbox", "item_spear" }; way = { kh_vroom("В коридор", "lse_leviathan_corridor"); }; }; lse_leviathan_corridor = room { nam = "lse_leviathan_corridor"; disp = "Левиафан, коридор"; dsc = [[Фаэтларр находится в основном коридоре Левиафана. Длинный металлический коридор освещен ярким светом электрических ламп. По левому борту расположены двери кают. Взгляд Фаэтларра ненаддолго останавливается на каюте с номером пять, выделенной ему. ]]; way = { kh_vroom("В каюту капитана", function(s) pr [["Не стоит тратить на это время", - мелькает мысль в голове Фаэтларра. ]]; return false; end); kh_vroom("В каюту №1", function(s) pr [["Не стоит тратить на это время", - мелькает мысль в голове Фаэтларра. ]]; return false; end); kh_vroom("В каюту №2", function(s) pr [["Не стоит тратить на это время", - мелькает мысль в голове Фаэтларра. ]]; return false; end); kh_vroom("В каюту №3", function(s) pr [["Не стоит тратить на это время", - мелькает мысль в голове Фаэтларра. ]]; return false; end); kh_vroom("В каюту №4", function(s) pr [["Не стоит тратить на это время", - мелькает мысль в голове Фаэтларра. ]]; return false; end); kh_vroom("В каюту №5", function(s) pr [["Не стоит тратить на это время", - мелькает мысль в голове Фаэтларра. ]]; return false; end); kh_vroom("В кают-компанию", "lse_leviathan_wardroom", 1); kh_vroom("В грузовой отсек", "lse_leviathan_cargo_hold", 1); kh_vroom("В машинный отсек", function(s) pr [["Не стоит тратить на это время", - мелькает мысль в голове Фаэтларра. ]]; return false; end); kh_vroom("На нижнюю палубу", function(s) pr [["Не стоит тратить на это время", - мелькает мысль в голове Фаэтларра. ]]; return false; end); }; }; lse_leviathan_wardroom = room { nam = "lse_leviathan_wardroom"; disp = "Левиафан, кают-компания"; dsc = [[Фаэтларр находится в кают-компании Левиафана. Это просторная комната, освещенная ярким светом электрических ламп. В центре кают-компании укреплен массивный металлический стол, вокруг которого стоят несколько стульев. ]]; way = { kh_vroom("В рубку", function(s) pr [["Там я ничего не смогу сделать", - мелькает мысль в голове Фаэтларра. ]]; return false; end); kh_vroom("В шлюз", "lse_leviathan_airlock"); kh_vroom("В коридор", "lse_leviathan_corridor"); }; obj = { "lse_phone_wardroom"; }; }; lse_phone_wardroom = obj { nam = "lse_phone_wardroom"; disp = "Телефон"; dsc = [[На столе, рядом с креслом Дрейка установлен {телефонный аппарат}. ^]]; act = [[Фаэтларр не умеет этим пользоваться. ]]; }; lse_leviathan_airlock = room { nam = "lse_leviathan_airlock"; disp = "Левиафан, шлюз"; dsc = [[Фаэтларр находится в шлюзовом отсеке Левиафана. Люк открыт. ]]; way = { kh_vroom("В кают-компанию", "lse_leviathan_wardroom"); kh_vroom("Наверх", "lse_leviathan_airlock_up"); }; }; lse_leviathan_airlock_up = room { nam = "lse_leviathan_airlock_up"; disp = "Левиафан, люк"; dsc = function(s) return [[Фаэтларр выглядывает из люка Левиафана. Субмарина находится в просторном доке Лсэрианотра. Док огорожен от остальной части города высокой металлической стеной. Здесь, на окраине города, прозрачный купол находится всего в нескольких метрах от Фаэтларра. ]]; end; obj = { "lse_lev_guard" }; way = { kh_vroom("Вниз", "lse_leviathan_airlock"); kh_vroom("Наружу", function(s) if (lse_lev_guard.state == 0) then return "game_over_phaetlarr_caught"; else return "lse_dock_pier"; end; end); }; }; lse_lev_guard = obj { var { state = 0; }; nam = "lse_lev_guard"; dsc = function(s) if (s.state == 0) then return "У пирса рядом с Левиафаном стоит {группа стражников}. Они смотрят в сторону входа в док, отвернушись от субмарины. "; else return "Стражники отошли в дальний конец дока. Фаэтларр сможет незаметно пробежать мимо. "; end; end; used = function(s,o) if (o == lse_item_toolbox) then s.state = 1; return [[Фаэтларр достает из ящика первый попавшийся предмет и кидает его в воду, подальше от Левиафана. Стражники, услышав всплеск, дружно направиляются туда. ]]; end; end; }; lse_dock_pier = room { nam = "lse_dock_pier"; disp = "Лсэрианотр, док, у Левиафана"; dsc = [[Фаэтларр стоит на пирсе рядом с Левиафаном. Несколько стражников что-то ищут в другом конце дока. ]]; way = { kh_vroom("К выходу", "lse_dock"); }; }; lse_dock = room { var { state = 0; }; nam = "lse_dock"; disp = "Лсэрианотр, док, у входа"; dsc = function(s) if (s.state == 0) then return [[Фаэтларр стоит у выхода из дока. Массивные металлические двери плотно закрыты и он не знает, как открыть их. ]]; else return [[Фаэтларр стоит у выхода из дока. Массивные металлические двери открыты. ]]; end; end; obj = { "lse_dock_panel" }; way = { kh_vroom("В дверь", function(s) if (lse_dock.state == 0) then pr [[Дверь заперта. ]]; return false; else return "lse_outer_intro"; end; end); }; }; lse_dock_panel = obj { var { state = 0; }; nam = "lse_dock_panel"; dsc = function(s) if (s.state == 0) then return [[Рядом с дверью расположена небольшая {панель}. ]]; else return [[Под открытой {панелью} находятся какие-то провода. Скорее всего, они используются для управления дверью. ]]; end; end; act = function(s) if (s.state == 0) then return [[Фаэтларр пытается открыть панель руками, но ничего не получается. ]]; elseif (s.state == 1) then s.state = 2; lse_dock.state = 1; return [[Фаэтларр хватает пучок проводов и резко вырывает их из панели. Свет в доке моргает, дверь открывается. ]]; else return [[Фаэтларр уже сделал все что нужно с этим. ]]; end; end; used = function(s, o) if o == lse_item_toolbox then s.state = 1; return [[Фаэтларр достает какой-то плоский предмет, которым без труда поддевает и снимает защитную панель, открывая взору навьяра переплетения проводов. ]]; end; end }; lse_outer_intro = cutscene('Лсэрианотр, внешнее кольцо', 'Лсэрианотр, внешнее кольцо', [[Во внешнем кольце Лсэрианотра нет никого, кто мог бы помешать планам Фаэтларра. К неудовольствию навьяра, "улица" полностью пуста - нет ни ящиков, ни скамеек, ни камней, ни даже какой-нибудь растительности, чтобы можно было хоть как-то укрыться. По левому и правому краю - сплошные металлические стены с закрытыми дверьми. Над городом виднеется громадный купол, ограждающий город от толщи океанской воды. Фаэтларр огляделся - справа вдалеке он заметил группу прогуливающихся навьяров. Отсюда, Фаэтларр хорошо видел их разговор. Яркие разноцветные вспышки легко читались: "Среднее кольцо? Что там делать, в нем никого нет". На что другой собеседник отвечал: "Там наверняка есть что-то интересное". "Как только Наэтвьирр будет пробужден, мы обследуем весь город", -- отвечает первый. На этом разговор прерывается.]], 'lse_outer_1') lse_outer_1 = room { nam = "lse_outer_1"; disp = "Лсэрианотр, внешнее кольцо"; dsc = [[Внешнее кольцо Лсэрианотра поражает своей пустотой и безжизненностью. Лишь одинаковые двери на равном расстоянии друг от друга во внешней и внутренней стороне привлекают внимание. Над городом виднеется громадный купол, ограждающий город от толщи океанской воды. ]]; way = { kh_vroom("Против часовой стрелки", function(s) pr [[Фаэтларр замечает группу навьяров в том направлении. "Я не хочу попадаться никому на глаза. Лучше туда не ходить", - подумал Фаэтларр. ]]; return false; end); kh_vroom("По часовой стрелке", "lse_outer_2"); }; }; lse_outer_2 = room { nam = "lse_outer_2"; disp = "Лсэрианотр, внешнее кольцо"; dsc = [[Внешнее кольцо Лсэрианотра поражает своей пустотой и безжизненностью. Лишь одинаковые двери на равном расстоянии друг от друга во внешней и внутренней стороне привлекают внимание. Над городом виднеется громадный купол, ограждающий город от толщи океанской воды. ]]; way = { kh_vroom("Против часовой стрелки", "lse_outer_1"); kh_vroom("По часовой стрелке", "lse_outer_3"); }; }; lse_outer_3 = room { nam = "lse_outer_3"; disp = "Лсэрианотр, внешнее кольцо"; dsc = [[Внешнее кольцо Лсэрианотра поражает своей пустотой и безжизненностью. Лишь одинаковые двери на равном расстоянии друг от друга во внешней и внутренней стороне привлекают внимание. Над городом виднелся громадный купол, ограждающий город от толщи океанской воды. ]]; obj = { 'lse_outer_service_entrance' }; way = { kh_vroom("Против часовой стрелки", "lse_outer_2"); kh_vroom("По часовой стрелке", "lse_outer_4"); kh_vroom("В сервисный тоннель", "service_tunnels_1"):disable(); }; }; lse_outer_service_entrance = obj { var { state = 0; }; nam = "lse_outer_service_entrance"; dsc = function(s) if (s.state == 0) then return [[Во внутренней стене Фаэтларр замечает отверстие закрытое {решеткой}. Через него вполне мог бы пролезть человек или навьяр. ]]; else return [[Решетка, закрывающая проход убрана, теперь Фаэтларр вполне может пролезть в него. ]]; end; end; used = function(s, o) if (o == lse_item_toolbox and s.state == 0) then s.state = 1; path('В сервисный тоннель'):enable(); return [[С помощью ломика Фаэтларр выковыривает решетку. ]]; end; end; }; lse_outer_4 = room { nam = "lse_outer_4"; disp = "Лсэрианотр, внешнее кольцо"; dsc = [[Внешнее кольцо Лсэрианотра поражает своей пустотой и безжизненностью. Лишь одинаковые двери на равном расстоянии друг от друга во внешней и внутренней стороне привлекают внимание. Над городом виднелся громадный купол, ограждающий город от толщи океанской воды. Дальше безжизненность города становится еще более полной - в той части города даже не горит свет. ]]; way = { kh_vroom("Против часовой стрелки", "lse_outer_3"); kh_vroom("По часовой стрелке", function(s) pr [["Нет смысла туда идти", - мелькнула мысль в голове Фаэтларра. ]]; return false; end); }; }; lse_prison_overseer_room = room { nam = "lse_prison_overseer_room"; disp = "Лсэрианотр, тюрьма"; dsc = "Фаэтларр находится в небольшой комнатке. "; obj = { 'lse_prison_table', 'lse_prison_guard' }; way = { kh_vroom("В тоннель", "service_tunnels_1"); kh_vroom("В дверь", function(s) if (lse_prison_guard.state == 1) then if (lse_prison_table.state == 1) then return "lse_prison_fight_intro"; else pr [[Дверь заперта. ]]; return false; end; else return "game_over_lse_prison"; end; end); }; }; lse_prison_table = obj { var { state = 0; }; nam = "lse_prison_table"; dsc = "В центре комнаты установлен {стол} с мигающими лампочками, кнопками и переключателями. "; act = function(s) if (lse_prison_guard.state == 1) then if (s.state == 1) then return [["Я уже все здесь сделал", - подумал Фаэтларр. ]]; else lse_prison_table.state = 1; return [[Фаэтларр бегло взглянул на подписи к переключателям и щелкнув пару из них, отошел от стола. ]]; end; else return "Стражник не позволит Фаэтларру сделать это. "; end; end; }; lse_prison_guard = obj { var { state = 0; }; nam = "lse_prison_guard"; dsc = function(s) if (s.state == 0) then return "За столом сидит {стражник} и внимательно наблюдает за происходящим на столе. " else return "На полу рядом со столом валяется стражник без сознания. "; end; end; act = [["Приложить бы его чем-нибудь, чтобы не мешался", - мелькнула мысль в голове Фаэтларра. ]]; used = function(s, o) if (s.state == 0 and o == lse_item_toolbox) then s.state = 1; return [[Фаэтларр бьет стражника ящиком по голове, от чего тот падает на пол без чувств. ]]; end; end; }; lse_prison_fight_intro = cutscene("lse_prison_fight_intro", "Лсэрианотр, тюрьма", function(s) pr [[Прошло не так много времени с того момента, как Уильям Дрейк запер вас здесь. Вы даже не успели как следует осмотреть камеру и обдумать возможные способы побега. Внезапно, двери камер открываются. Пользуясь моментом, вы выбегаете наружу. Да, вам придется в одиночку и без оружия противостоять отряду вооруженных копьями навьяров-охранников, однако это лучше, чем оставаться взаперти. ]] if (#player_drake.party > 1) then pr [[На помощь вам из других камер выходят ваши спутники. ]]; end; pr [[Дверь в конце коридора открывается и в нее вбегает Фаэтларр. К вашему удивлению, вы замечаете у него свой револьвер. Увидев вас, навьяр бросает его вам. ]]; end, function(s) if (have(item_spear)) then lse_cmbt_phaetlarr.hasSpear = true; end; move(player_drake, lse_prison_fight); change_pl(player_drake); remove(player_phaetlarr, where(player_phaetlarr)); if (ArrayUtils.indexOf(player_drake.party, 'learr') ~= 0) then table.insert(lse_prison_fight.obj, 2, lse_cmbt_learr); end; if (ArrayUtils.indexOf(player_drake.party, 'wright') ~= 0) then table.insert(lse_prison_fight.obj, 2, lse_cmbt_wright); end; if (ArrayUtils.indexOf(player_drake.party, 'radcliffe') ~= 0) then table.insert(lse_prison_fight.obj, 2, lse_cmbt_radcliffe); end; if (ArrayUtils.indexOf(player_drake.party, 'anna') ~= 0) then table.insert(lse_prison_fight.obj, 2, lse_cmbt_anna); end; return "lse_prison_fight"; end, function(s) for i=#pl.obj,1,-1 do table.remove(pl.obj, i); end; end); lse_prison_fight = battlefield { nam = "lse_prison_fight"; disp = "Лсэрианотр, тюрьма"; lose = "game_over_lse_prison_fight"; win = "lse_prison_fight_victory"; plX = 1; plY = 6; map = { {2,2,0,0,0,2,2}, {0,0,0,0,0,0,0}, {2,2,0,0,0,2,2}, {0,0,0,0,0,0,0}, {2,2,0,0,0,2,2}, {0,0,0,0,0,0,0}, {2,2,0,0,0,2,2} }; make_turn = function(s) if (not have(item_colt, pl) and here().plX == 2 and here().plY == 6) then p([[Вы подбираете револьвер, брошенный Фаэтларром. ]]); take(item_colt); end; end; obj = { 'lse_cmbt_phaetlarr', --'lse_cmbt_learr', --'lse_cmbt_wright', --'lse_cmbt_radcliffe', --'lse_cmbt_anna', 'lse_cmbt_guard1', 'lse_cmbt_guard2', 'lse_cmbt_guard3', 'lse_cmbt_guard4', 'lse_cmbt_guard5', 'lse_cmbt_guard6' }; }; lse_cmbt_learr = combatant { nam = "lse_cmbt_learr"; disp = "Леарр"; disp2 = "Леарр"; disp3 = "Леарр"; x = 7; y = 2; pic = "images/learr.png"; ally = "Я не буду атаковать союзника."; nohit = "Я не буду атаковать союзника."; noshoot = "Я не буду атаковать союзника."; hp = 10; hasSpear = false; state = function(s) if s.hp == 10 then return ""; elseif s.hp > 7 then return "Она легко ранена. "; elseif s.hp > 3 then return "Она ранена. "; else return "Она тяжело ранена. "; end; end; make_turn = function(s) local enemies = { }; for item=1,#here().obj do local obj = here().obj[item]; if (obj.enemy and obj.hp > 0) then local p = here():getWalkDistance(s.x, s.y, obj.x, obj.y); if (p) then table.insert(enemies, { o = obj, p = p }); end; end; end; if (#enemies == 0) then pn("Леарр ждет. "); return; end; table.sort(enemies, function(a, b) return (a.p.l < b.p.l); end); local enemy = enemies[1].o; local path = enemies[1].p; -- AI Order: -- If has spear and enemy is far - throw spear -- If has spear and enemy is close - hit with spear -- if spear is nearer than any enemy - walk towards spear -- walk towards nearest enemy -- If enemy close and enemy has spear - take spear from enemy -- If enemy close and enemy doesn't have spear - hit with claws if s.hasSpear then if (math.abs(s.x - enemy.x) + math.abs(s.y - enemy.y) <= 2 and here():canShoot(s.x,s.y, enemy.x, enemy.y)) then --50% if (rnd(2) > 1) then enemy.hp = enemy.hp - 2; pn("Леарр бьет " .. enemy.disp2 .. " копьем и попадает. "); else pn("Леарр бьет " .. enemy.disp2 .. " копьем, но промахивается. "); end; return; elseif (math.abs(s.x - enemy.x) == 1 and math.abs(s.y - enemy.y) == 1) then --75% if (rnd(4) > 1) then enemy.hp = enemy.hp - 2; pn("Леарр бьет " .. enemy.disp2 .. " копьем и попадает. "); else pn("Леарр бьет " .. enemy.disp2 .. " копьем, но промахивается. "); end; return; elseif (math.abs(s.x - enemy.x) == 1 and s.y == enemy.y or s.x == enemy.x and math.abs(s.y - enemy.y) == 1) then --100% enemy.hp = enemy.hp - 2; pn("Леарр бьет " .. enemy.disp2 .. " копьем и попадает. "); return; end; else if (math.abs(s.x - enemy.x) == 1 and s.y == enemy.y or s.x == enemy.x and math.abs(s.y - enemy.y) == 1) then enemy.hp = enemy.hp - 1; pn("Леарр бьет " .. enemy.disp2 .. " и попадает. "); return; end; end; s.x = path.p[2][1]; s.y = path.p[2][2]; pn("Леарр идет к " .. enemy.disp3 .. ". "); end; dsc = function(s) if (s.hp > 0) then return [[ {Леарр} готова к бою. ]]; else return [[ {Леарр} без сознания. ]]; end; end; }; lse_cmbt_phaetlarr = combatant { nam = "lse_cmbt_phaetlarr"; disp = "Фаэтларр"; disp2 = "Фаэтларра"; disp3 = "Фаэтларру"; x = 4; y = 7; pic = "images/phaetlarr.png"; ally = "Я не буду атаковать союзника."; nohit = "Я не буду атаковать союзника."; noshoot = "Я не буду атаковать союзника."; hp = 10; hasSpear = false; state = function(s) if s.hp == 10 then return ""; elseif s.hp > 7 then return "Он легко ранен. "; elseif s.hp > 3 then return "Он ранен. "; else return "Он тяжело ранен. "; end; end; make_turn = function(s) local enemies = { }; for item=1,#here().obj do local obj = here().obj[item]; if (obj.enemy and obj.hp > 0) then local p = here():getWalkDistance(s.x, s.y, obj.x, obj.y); if (p) then table.insert(enemies, { o = obj, p = p }); end; end; end; if (#enemies == 0) then pn("Фаэтларр ждет. "); return; end; table.sort(enemies, function(a, b) return (a.p.l < b.p.l); end); local enemy = enemies[1].o; local path = enemies[1].p; -- AI Order: -- If has spear and enemy is far - throw spear -- If has spear and enemy is close - hit with spear -- if spear is nearer than any enemy - walk towards spear -- walk towards nearest enemy -- If enemy close and enemy has spear - take spear from enemy -- If enemy close and enemy doesn't have spear - hit with claws if s.hasSpear then if (math.abs(s.x - enemy.x) + math.abs(s.y - enemy.y) <= 2 and here():canShoot(s.x,s.y, enemy.x, enemy.y)) then --50% if (rnd(2) > 1) then enemy.hp = enemy.hp - 2; pn("Фаэтларр бьет " .. enemy.disp2 .. " копьем и попадает. "); else pn("Фаэтларр бьет " .. enemy.disp2 .. " копьем, но промахивается. "); end; return; elseif (math.abs(s.x - enemy.x) == 1 and math.abs(s.y - enemy.y) == 1) then --75% if (rnd(4) > 1) then enemy.hp = enemy.hp - 2; pn("Фаэтларр бьет " .. enemy.disp2 .. " копьем и попадает. "); else pn("Фаэтларр бьет " .. enemy.disp2 .. " копьем, но промахивается. "); end; return; elseif (math.abs(s.x - enemy.x) == 1 and s.y == enemy.y or s.x == enemy.x and math.abs(s.y - enemy.y) == 1) then --100% enemy.hp = enemy.hp - 2; pn("Фаэтларр бьет " .. enemy.disp2 .. " копьем и попадает. "); return; end; else if (math.abs(s.x - enemy.x) == 1 and s.y == enemy.y or s.x == enemy.x and math.abs(s.y - enemy.y) == 1) then enemy.hp = enemy.hp - 1; pn("Фаэтларр бьет " .. enemy.disp2 .. " и попадает. "); return; end; end; s.x = path.p[2][1]; s.y = path.p[2][2]; pn("Фаэтларр идет к " .. enemy.disp3 .. ". "); end; dsc = function(s) if (s.hp > 0) then return [[ {Фаэтларр} готов к бою. ]]; else return [[ {Фаэтларр} без сознания. ]]; end; end; }; lse_cmbt_wright = combatant { nam = "lse_cmbt_wright"; disp = "Джек"; disp2 = "Джека"; disp3 = "Джеку"; x = 1; y = 2; pic = "images/jack.png"; ally = "Я не буду атаковать союзника."; nohit = "Я не буду атаковать союзника."; noshoot = "Я не буду атаковать союзника."; hp = 10; hasHarpoon = false; state = function(s) if s.hp == 10 then return ""; elseif s.hp > 7 then return "Он легко ранен. "; elseif s.hp > 3 then return "Он ранен. "; else return "Он тяжело ранен. "; end; end; make_turn = function(s) local enemies = { }; for item=1,#here().obj do local obj = here().obj[item]; if (obj.enemy and obj.hp > 0) then local p = here():getWalkDistance(s.x, s.y, obj.x, obj.y); if (p) then table.insert(enemies, { o = obj, p = p }); end; end; end; if (#enemies == 0) then pn("Райт ждет. "); return; end; table.sort(enemies, function(a, b) return (a.p.l < b.p.l); end); local enemy = enemies[1].o; local path = enemies[1].p; -- AI Order: -- If has harpoon and enemy is far - shoot -- If has harpoon and enemy is close - hit with harpoon -- walk towards nearest enemy if (math.abs(s.x - enemy.x) == 1 and s.y == enemy.y or s.x == enemy.x and math.abs(s.y - enemy.y) == 1) then enemy.hp = enemy.hp - 1; pn("Райт бьет " .. enemy.disp2 .. " и попадает. "); return; end; s.x = path.p[2][1]; s.y = path.p[2][2]; pn("Райт идет к " .. enemy.disp3 .. ". "); end; dsc = function(s) if (s.hp > 0) then return [[ {Райт} готов к бою. ]]; else return [[ {Райт} без сознания. ]]; end; end; }; lse_cmbt_radcliffe = combatant { nam = "lse_cmbt_radcliffe"; disp = "Уолтер"; disp2 = "Уолтера"; disp3 = "Уолтеру"; x = 1; y = 4; pic = "images/walter.png"; ally = "Я не буду атаковать союзника."; nohit = "Я не буду атаковать союзника."; noshoot = "Я не буду атаковать союзника."; hp = 10; hasHarpoon = false; state = function(s) if s.hp == 10 then return ""; elseif s.hp > 7 then return "Он легко ранен. "; elseif s.hp > 3 then return "Он ранен. "; else return "Он тяжело ранен. "; end; end; make_turn = function(s) local enemies = { }; for item=1,#here().obj do local obj = here().obj[item]; if (obj.enemy and obj.hp > 0) then local p = here():getWalkDistance(s.x, s.y, obj.x, obj.y); if (p) then table.insert(enemies, { o = obj, p = p }); end; end; end; if (#enemies == 0) then pn("Уолтер ждет. "); return; end; table.sort(enemies, function(a, b) return (a.p.l < b.p.l); end); local enemy = enemies[1].o; local path = enemies[1].p; -- AI Order: -- If has harpoon and enemy is far - shoot -- If has harpoon and enemy is close - hit with harpoon -- walk towards nearest enemy if (math.abs(s.x - enemy.x) == 1 and s.y == enemy.y or s.x == enemy.x and math.abs(s.y - enemy.y) == 1) then enemy.hp = enemy.hp - 1; pn("Уолтер бьет " .. enemy.disp2 .. " и попадает. "); return; end; s.x = path.p[2][1]; s.y = path.p[2][2]; pn("Уолтер идет к " .. enemy.disp3 .. ". "); end; dsc = function(s) if (s.hp > 0) then return [[ {Уолтер} готов к бою. ]]; else return [[ {Уолтер} без сознания. ]]; end; end; }; lse_cmbt_anna = combatant { nam = "lse_cmbt_anna"; disp = "Анна"; disp2 = "Анну"; disp3 = "Анне"; x = 7; y = 4; pic = "images/anna.png"; ally = "Я не буду атаковать союзника."; nohit = "Я не буду атаковать союзника."; noshoot = "Я не буду атаковать союзника."; hp = 10; hasHarpoon = false; state = function(s) if s.hp == 10 then return ""; elseif s.hp > 7 then return "Она легко ранена. "; elseif s.hp > 3 then return "Она ранена. "; else return "Она тяжело ранена. "; end; end; make_turn = function(s) local enemies = { }; for item=1,#here().obj do local obj = here().obj[item]; if (obj.enemy and obj.hp > 0) then local p = here():getWalkDistance(s.x, s.y, obj.x, obj.y); if (p) then table.insert(enemies, { o = obj, p = p }); end; end; end; if (#enemies == 0) then pn("Анна ждет. "); return; end; table.sort(enemies, function(a, b) return (a.p.l < b.p.l); end); local enemy = enemies[1].o; local path = enemies[1].p; -- AI Order: -- If has harpoon and enemy is far - shoot -- If has harpoon and enemy is close - hit with harpoon -- walk towards nearest enemy if (math.abs(s.x - enemy.x) == 1 and s.y == enemy.y or s.x == enemy.x and math.abs(s.y - enemy.y) == 1) then enemy.hp = enemy.hp - 1; pn("Анна бьет " .. enemy.disp2 .. " и попадает. "); return; end; s.x = path.p[2][1]; s.y = path.p[2][2]; pn("Анна идет к " .. enemy.disp3 .. ". "); end; dsc = function(s) if (s.hp > 0) then return [[ {Анна} готова к бою. ]]; else return [[ {Анна} без сознания. ]]; end; end; }; lse_cmbt_guard = function(nam, index, x, y, spear) return combatant { nam = nam; disp = "стражник " .. tostring(index); disp2 = "стражника " .. tostring(index); disp3 = "стражнику " .. tostring(index); x = x; y = y; hp = 4; pic = "images/navjiarr_guard".. index ..".png"; shootHit = "Вы стреляете в стражника и попадаете в него. "; shootMiss = "Вы стреляете в стражника, но не попадаете в него. "; shootKill = "Вы стреляете в стражника и он падает замертво. "; handHit = "Вы ударяете стражника. "; handKill = "После вашего удара стражник падает. "; handFar = "Слишком далеко. "; hasSpear = spear; enemy = true; state = function(s) if s.hp == 4 then return ""; elseif s.hp == 3 then return "Он легко ранен. "; elseif s.hp == 2 then return "Он ранен. "; else return "Он тяжело ранен. "; end; end; dsc = function(s) if (s.hp > 0) then if (s.hasSpear) then return "{Стражник " .. tostring(index).. "} вооружен копьем готов к бою. "; else return "{Стражник " .. tostring(index).. "} готов к бою. "; end; else return false; end; end; make_turn = function(s) local enemies = { }; for item=1,#here().obj do local obj = here().obj[item]; if (obj.ally and obj.hp > 0) then local p = here():getWalkDistance(s.x, s.y, obj.x, obj.y); if (p) then table.insert(enemies, { o = obj, p = p }); end; end; end; table.sort(enemies, function(a, b) return (a.p.l < b.p.l); end); local enemy = enemies[1]; local path = here():getWalkDistance(s.x, s.y, here().plX, here().plY); if (not enemy or path and enemy.p.l > path.l ) then enemy = pl; else path = enemy.p; enemy = enemy.o; end; if (not enemy or not path) then pn("Стражник ".. tostring(index).. " ждет. "); return; end; -- AI Order: -- If has spear and enemy is close - hit with spear -- walk towards nearest enemy -- If enemy close - hit with claws if (s.hasSpear) then here():canShoot(s.x,s.y, enemy.x, enemy.y); if (math.abs(s.x - enemy.x) + math.abs(s.y - enemy.y) <= 2 and here():canShoot(s.x,s.y, enemy.x, enemy.y)) then if (math.abs(s.x - enemy.x) == 2 or math.abs(s.y - enemy.y) == 2) then --50% if (rnd(2) > 1) then enemy.hp = enemy.hp - 2; pn("Стражник ".. tostring(index).. " бьет " .. enemy.disp2 .. " копьем и попадает. "); else pn("Стражник ".. tostring(index).. " бьет " .. enemy.disp2 .. " копьем, но промахивается. "); end; return; elseif (math.abs(s.x - enemy.x) == 1 and math.abs(s.y - enemy.y) == 1) then --75% if (rnd(4) > 1) then enemy.hp = enemy.hp - 2; pn("Стражник ".. tostring(index).. " бьет " .. enemy.disp2 .. " копьем и попадает. "); else pn("Стражник ".. tostring(index).. " бьет " .. enemy.disp2 .. " копьем, но промахивается. "); end; return; elseif (math.abs(s.x - enemy.x) == 1 and s.y == enemy.y or s.x == enemy.x and math.abs(s.y - enemy.y) == 1) then --100% enemy.hp = enemy.hp - 2; pn("Стражник ".. tostring(index).. " бьет " .. enemy.disp2 .. " копьем и попадает. "); return; end; end; else if (math.abs(s.x - enemy.x) == 1 and s.y == enemy.y or s.x == enemy.x and math.abs(s.y - enemy.y) == 1) then enemy.hp = enemy.hp - 1; pn("Стражник ".. tostring(index).. " бьет " .. enemy.disp2 .. " и попадает. "); return; end; end; s.x = path.p[2][1]; s.y = path.p[2][2]; pn("Стражник ".. tostring(index).. " идет к " .. enemy.disp3 .. ". "); end; }; end; lse_cmbt_guard1 = lse_cmbt_guard("lse_cmbt_guard1", 1, 3, 1, false); lse_cmbt_guard2 = lse_cmbt_guard("lse_cmbt_guard2", 2, 5, 1, false); lse_cmbt_guard3 = lse_cmbt_guard("lse_cmbt_guard3", 3, 3, 3, true); lse_cmbt_guard4 = lse_cmbt_guard("lse_cmbt_guard4", 4, 5, 3, true); lse_cmbt_guard5 = lse_cmbt_guard("lse_cmbt_guard5", 5, 3, 5, false); lse_cmbt_guard6 = lse_cmbt_guard("lse_cmbt_guard6", 6, 5, 5, false); lse_prison_fight_victory = dlg { nam = "lse_prison_fight_victory"; disp = "Лсэрианотр, тюрьма"; entered = function(s) take('item_toolbox'); return [[Вы избавляетесь от стражников. Фаэтларр передает вам ваш ящик с инструментами. Теперь нужно принять решение, что делать дальше, и навьяр сообщает вам: "Уильяма-Дрейка-последователи среднее-кольцо-редко-посещают. Если нам туда-попасть-удастся, то у нас дальнейшие-действия-время-обдумать-будет. Говори, Дрейк". ]]; end; phr = { {"Есть другие варианты?", [[Фаэтларр пожимает плечами: "Я то-что-считаю-правильным-предложил. Я за-тобой-последую. Дрейка-безумца остановить-необходимо. "]]}; {"Ты знаешь где сейчас Уильям?", [[Фаэтларр отрицательно качает головой: "Нет. Он в-центральном-зале-должен-быть, если Наэтвьирра-пробуждает". ]]}; {"Хорошо, пойдем.", code = [[ walk('lse_hideout_intro_dlg');]]}; }; }; lse_hideout_intro_dlg = dlg { nam = "lse_hideout_intro_dlg"; disp = "Лсэрианотр, убежище"; entered = function(s) take('item_harpoon'); return [[В комнате охранников вы находите ваши вещи. Фаэтларр проводит вас по сервисным тоннелям в среднее кольцо Лсэрианотра. Эта часть города мало чем отличается внешне от тех мест, что вы видели ранее. Точно такие же сплошные стены слева и справа. Точно такие же одинаковые металлические двери на равном расстоянии друг от друга. Как вы и ожидали, секция оказывается практически полностью пустой. Фаэтларр проводит вас в одну из дверей. "Попробуем здесь", - говорит он и с помощью нехитрых манипуляций открывает ее, впуская вас внутрь. ^Вы оказываетесь в небольшом узком коридоре. По его сторонам вы видите несколько проходов, ведущих в небольшие помещения неизвестного вам назначения. За одним из проходов скрывается просторная комната с установленным в центре массивным металлическим столом и несколькими стульями вокруг. ]]; end; phr = { {"Фаэтларр, что ты можешь рассказать нам о городе?", [[Фаэтларр кивает и сразу предупреждает: "Я не-успел-разузнать почти-ничего", -- сделав небольшую паузу, он продолжает: "Город кругами-выстроен. Они называют-это кольцами. Три-кольца есть. Кроме-обычных-дверей, они проходами-соединены, но часть-их под-водой-находится". ]]}; {"Фаэтларр, как мы можем попасть в центр города?", [[Фаэтларр пожимает плечами: "Тоннель должен-быть. Мы найдем". ]]}; {"Ждите меня здесь, я попробую разузнать побольше. ", function(s) if (ArrayUtils.indexOf(pl.party, 'learr') ~= 0) then if rel_learr >= 0 then pr [[Леарр говорит: "Ты возвращайся". ]]; else pr [[Леарр молча кивает. ]]; end; end; if (ArrayUtils.indexOf(pl.party, 'wright') ~= 0) then if rel_jack >= 0 then pr [[Джек прощается: "Удачи, Дэвид". ]]; else pr [[Джек молча кивает. ]]; end; end; if (ArrayUtils.indexOf(pl.party, 'radcliffe') ~= 0) then if rel_walter >= 0 then pr [[Уолтер отвечает: "Удачи, Дрейк". ]]; else pr [[Уолтер молча кивает. ]]; end; end; if (ArrayUtils.indexOf(pl.party, 'anna') ~= 0) then if rel_anna >= 0 then pr [[Анна кивает: "Хорошо". ]]; else pr [[Анна молча кивает. ]]; end; end; end, code [[ if (ArrayUtils.indexOf(pl.party, 'learr') ~= 0) then put('lse_char_learr', 'lse_hideout_main_room'); end; if (ArrayUtils.indexOf(pl.party, 'wright') ~= 0) then put('lse_char_jack', 'lse_hideout_main_room'); end; if (ArrayUtils.indexOf(pl.party, 'radcliffe') ~= 0) then put('lse_char_walter', 'lse_hideout_main_room'); end; if (ArrayUtils.indexOf(pl.party, 'anna') ~= 0) then put('lse_char_anna', 'lse_hideout_main_room'); end; walk("lse_hideout_main_room"); ]]} }; }; lse_char_phaetlarr = npc { nam = 'lse_char_phaetlarr'; dsc = [[{Фаэтларр} сидит за столом. ]]; phrases = function(s) if rel_phaetlarr >= 0 then return { [[Фаэтларр говорит: "Ты возвращайся". ]], [[Фаэтларр говорит: "Мы ждем-твоих-указаний". ]], }; else return { [[Фаэтларр молча смотрит на вас. ]] } end; end } lse_char_learr = npc { nam = 'lse_char_learr'; dsc = [[{Леарр} сидит за столом. ]]; phrases = function(s) if rel_phaetlarr >= 0 then return { [[Леарр говорит: "Ты возвращайся". ]], [[Леарр говорит: "Ты говори". ]], }; else return { [[Леарр молча смотрит на вас. ]] } end; end } lse_char_jack = npc { nam = 'lse_char_jack'; dsc = [[{Джек Райт} сидит за столом. ]]; phrases = function(s) if rel_phaetlarr >= 0 then return { [[Джек говорит: "Удачи, Дэвид". ]], [[Джек говорит: "Мы рассчитываем на тебя". ]], }; else return { [[Джек говорит: "Уильяма нужно остановить". ]] } end; end } lse_char_walter = npc { nam = 'lse_char_walter'; dsc = [[{Уолтер Рэдклифф} сидит за столом. ]]; phrases = function(s) if rel_phaetlarr >= 0 then return { [[Уолтер говорит: "Удачи, Дрейк. Нужно остановить безумца". ]], [[Уолтер говорит: "Мы рассчитываем на тебя". ]], }; else return { [[Уолтер говорит: "Уильяма нужно остановить". ]] } end; end } lse_char_anna = npc { nam = 'lse_char_anna'; dsc = [[{Анна Рэдклифф} сидит за столом. ]]; phrases = function(s) if rel_phaetlarr >= 0 then return { [[Анна говорит: "Удачи, Дэвид". ]], [[Анна говорит: "Мы будем ждать тебя". ]], }; else return { [[Анна говорит: "Уильяма нужно остановить". ]] } end; end } lse_hideout_main_room = room { nam = "lse_hideout_main_room"; disp = "Лсэрианотр, убежище"; dsc = [[Просторное помещение с металлическими стенами слабо освещено. В центре комнаты расположен стол с шестью стульями вокруг. ]]; obj = { "lse_hideout_cabinet", 'lse_char_phaetlarr' }; way = { kh_vroom("В коридор", "lse_hideout_corridor"); }; }; lse_hideout_cabinet = obj { nam = "lse_hideout_cabinet"; dsc = [[В углу комнаты стоит небольшая {тумбочка} из неизвестного материала. ]]; act = [[Вы пытаетесь открыть тумбочку, но не можете это сделать. ]]; }; lse_hideout_corridor = room { nam = "lse_hideout_corridor"; disp = "Лсэрианотр, убежище, коридор"; dsc = [[Узкий коридор. От стен исходит мягкое свечение, гораздо более слабое чем в городе. В полумраке вы видите пять проходов, ведущих в соседние помещения. Шестой проход, ведущий в город, закрывает металлическая дверь. ]]; way = { kh_vroom("В зал", "lse_hideout_main_room"), kh_vroom("В первую комнату", "lse_hideout_first_room"), kh_vroom("Во вторую комнату", "lse_hideout_second_room"), kh_vroom("В третью комнату", "lse_hideout_third_room"), kh_vroom("В четвертую комнату", "lse_hideout_fourth_room"), kh_vroom("В город", "lse_middle_2") }; }; lse_hideout_first_room = room { nam = "lse_hideout_first_room"; disp = "Лсэрианотр, убежище, комната"; dsc = [[Небольшая каморка, вдоль стен которой расположены пустые стеллажи. Освещения в комнате нет, за исключением света, проникающего из коридора. ]]; way = { kh_vroom("В коридор", "lse_hideout_corridor"); }; }; lse_hideout_second_room = room { nam = "lse_hideout_second_room"; disp = "Лсэрианотр, убежище, комната"; dsc = [[Небольшая каморка, вдоль стен которой расположены пустые стеллажи. Освещения в комнате нет, за исключением света, проникающего из коридора. ]]; way = { kh_vroom("В коридор", "lse_hideout_corridor"); }; }; lse_hideout_third_room = room { nam = "lse_hideout_third_room"; disp = "Лсэрианотр, убежище, комната"; dsc = [[Небольшая каморка, вдоль стен которой расположены пустые стеллажи. Освещения в комнате нет, за исключением света, проникающего из коридора. ]]; way = { kh_vroom("В коридор", "lse_hideout_corridor"); }; }; lse_hideout_fourth_room = room { nam = "lse_hideout_fourth_room"; disp = "Лсэрианотр, убежище, комната"; dsc = [[Небольшая каморка, вдоль стен которой расположены пустые стеллажи. Освещения в комнате нет, за исключением света, проникающего из коридора. ]]; way = { kh_vroom("В коридор", "lse_hideout_corridor"); }; }; lse_middle_1 = room { nam = "lse_middle_1"; disp = "Лсэрианотр, среднее кольцо"; dsc = [[Эта часть города отключена -- после яркого света убежища вы с трудом различаете очертания предметов. Во внутренней стене есть проход в сервисные тоннели. Решетка, закрывающая его искорежена и валяется рядом. ]]; entered = function(s) service_tunnels_2.position = "05"; end; way = { kh_vroom("Против часовой стрелки", function(s) pr [[Вам там нечего делать. ]]; return false; end); kh_vroom("По часовой стрелке", "lse_middle_2"); kh_vroom("В сервисный тоннель", function(s) if lse_powerplant_found then return "service_tunnels_2"; else pr [[Вам там нечего делать. ]]; return false; end; end); }; }; lse_middle_2 = room { nam = "lse_middle_2"; disp = "Лсэрианотр, среднее кольцо"; dsc = [[Среднее кольцо Лсэрианотра еще более пусто и безжизненно, чем внешнее. Большая часть кольца отключена -- лишь в отдельных секциях горит яркий свет. ]]; way = { kh_vroom("Против часовой стрелки", "lse_middle_1"); kh_vroom("По часовой стрелке", "lse_middle_3"); kh_vroom("В убежище", "lse_hideout_corridor"); }; }; lse_middle_3 = room { nam = "lse_middle_3"; disp = "Лсэрианотр, среднее кольцо"; dsc = [[Среднее кольцо Лсэрианотра мало чем отличается от внешнего - та же пустота и безжизненность. ]]; way = { kh_vroom("Против часовой стрелки", "lse_middle_2"); kh_vroom("По часовой стрелке", "lse_middle_4"); }; }; lse_middle_4 = room { nam = "lse_middle_4"; disp = "Лсэрианотр, среднее кольцо"; dsc = [[Среднее кольцо Лсэрианотра мало чем отличается от внешнего - та же пустота и безжизненность. Большая часть кольца еще не активирована - свет горит лишь в отдельных секциях. Одна из дверей в этой секции отличается от остальных - она заметно больше, а над ней на небольшой металлической табличке нанесены цветные полосы, складывающиеся в слово: "Библиотека". ]]; way = { kh_vroom("Против часовой стрелки", "lse_middle_3"); kh_vroom("В библиотеку", "lse_middle_library"); kh_vroom("По часовой стрелке", function(s) pr [["Мне нечего там делать. "]]; return false; end); }; }; lse_middle_library = room { var { indexa = nil; }; nam = "lse_middle_library"; disp = "Лсэрианотр, библиотека"; dsc = [[Вы находитесь в просторном зале. ]]; entered = function(s) if (not s.indexa) then s.indexa = tostring(rnd(6) - 1) .. tostring(rnd(6) - 1).. tostring(rnd(6) - 1); end; end; obj = { "lse_library_shelves" }; way = { kh_vroom("В город", "lse_middle_4"); }; }; lse_library_shelves = obj { nam = "lse_library_shelves"; dsc = "Зал уставлен высокими {стеллажами}, заполненными металлическими табличками, содержащими навьярские записи. "; act = function(s) walkin(lse_library_shelves_input); end; }; lse_library_shelves_input = input_number_nav { nam = "w32_shelf_input"; disp = "Стеллаж"; maxlen = 3; label = "Укажите номер записи:"; check = function(s, input) if (string.len(input) ~= 3) then pn[[Номер записи должен быть трехзначным. ]]; back(); end; if (input == "000") then pn([[Вы достаете табличку с номером 000 и обнаруживаете, что это каталог имеющихся материалов. Вы узнаете, что искомые вами сведения хранятся в записи номер ]] .. lse_middle_library.indexa .. ". "); elseif (input == lse_middle_library.indexa) then pn [[Бегло просмотрев найденную схему, вы узнаете, что через сервисные тоннели города вы можете попасть практически в любую его часть, в том числе и в центральный зал. Для того, чтобы попасть в центральный зал, вам придется сперва попасть во внутреннее кольцо. Кроме того, все проходы во внутреннее кольцо, кроме врат, ведут через нижний город, заполненный водой. ]]; lse_powerplant_found = true; else pn [[Эти записи не содержат ничего интересного для вас. ]]; end; back(); end; }; --[[ Power station ]] lse_power_station = room { nam = "Лсэрианотр, электростанция"; disp = "Лсэрианотр, электростанция"; dsc = [[Вы находитесь в комнате управления энергоснабжением Лсэрианотра. Вы ощущаете слабую вибрацию, исходяющую от работающих неподалеку генераторов. Входная дверь закрыта. ]]; entered = function(s) service_tunnels_2.position = "45"; end; obj = { "lse_powerplant_control" }; way = { kh_vroom("В сервиcный тоннель", "service_tunnels_2"); }; }; lse_powerplant_control = obj { nam = "lse_powerplant_control"; dsc = "У одной из стен расположен {огромный экран}, на котором, судя по всему, отмечены линии энергоснабжения и ключевые источники потребления энергии. ^"; act = function(s) walkin("lse_powerplant_control_dlg"); end; }; lse_powerplant_control_dlg = dlg { nam = "Лсэрианотр, терминал управления энергоснабжением"; states = {0, 1, 0, 1}; locked = 1; pic = function(s) local image = 'images/power_bcg.png'; if (s.locked == 1) then image = image .. ";images/power_lock.png@62,31"; elseif (s.locked == 2) then image = image .. ";images/power_lock.png@62,93"; elseif (s.locked == 3) then image = image .. ";images/power_lock.png@31,62"; elseif (s.locked == 4) then image = image .. ";images/power_lock.png@93,62"; end; image = image .. ";images/power_" .. tostring(s.states[1]) .. ".png@62,31"; image = image .. ";images/power_" .. tostring(s.states[2]) .. ".png@62,93"; image = image .. ";images/power_" .. tostring(s.states[3]) .. ".png@31,62"; image = image .. ";images/power_" .. tostring(s.states[4]) .. ".png@93,62"; return image; end; detect = function(s) return (s.states[1] == 1 and s.states[2] == 3 and s.states[3] == 0 and s.states[4] == 2) or (s.states[1] == 3 and s.states[2] == 1 and s.states[3] == 2 and s.states[4] == 0) end; dsc = "На экране видна схема питания города. Иконки внизу экрана подсказывают, что нажимать при отключении"; phr = { {1, always = true, "Блокировать верхний переключатель", "Изображение на экране изменилось.", function(s) powerplant_defence_control_dlg.locked = 1; end;}, {2, always = true, "Блокировать нижний переключатель", "Изображение на экране изменилось.", function(s) powerplant_defence_control_dlg.locked = 2; end;}, {3, always = true, "Блокировать левый переключатель", "Изображение на экране изменилось.", function(s) powerplant_defence_control_dlg.locked = 3; end;}, {4, always = true, "Блокировать правый переключатель", "Изображение на экране изменилось.", function(s) powerplant_defence_control_dlg.locked = 4; end;}, {5, 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] > 3) then powerplant_defence_control_dlg.states[i] = 0; end; end; end; if (powerplant_defence_control_dlg.detect(powerplant_defence_control_dlg)) then walk('lse_blackout'); 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 walk('lse_blackout'); end; end;}, {255, always = true, "выход", function(s) back(); end}, }; }; lse_blackout = cutscene('Лсэрианотр, электростанция', 'Лсэрианотр, электростанция', [[Город умирает мгновенно. Свет выключается, экраны гаснут, гул прекращается. Вы оказываетесь в полной тишине и темноте. Через некоторое время плавно открывается входная дверь, через которую проникает немного света. ]], 'lse_power_station_dark'); lse_power_station_dark = room { nam = 'Лсэрианотр, электростанция'; disp = 'Лсэрианотр, электростанция'; dsc = [[Вы находитесь в комнате управления энергоснабжением Лсэрианотра. Сейчас помещение погружено во мрак. Входная дверь открыта. ]]; way = { kh_vroom("В город", 'lse_inner_1'); kh_vroom("В сервиcный тоннель", function(s) pr [[Вы еще не закончили свои дела здесь. ]]; return false; end); }; } --[[ Inner circle ]] lse_timer = function(s) local loc = stead.deref(here()); if (lse_guard1.loc == "lse_inner_1") then lse_guard1.dir = 2; lse_guard1.loc = "lse_inner_2"; if (loc == "lse_inner_1" or here().out == "lse_inner_1") then pn("Стражник уходит. "); elseif (loc == "lse_inner_3" or here().out == "lse_inner_3" or loc == "lse_inner_4" or here().out == "lse_inner_4") then pn("Стражник приближается. "); elseif (here().out == "lse_inner_2") then pn("Снаружи маячит стражник. "); end; elseif (lse_guard1.loc == "lse_inner_2") then if (lse_guard1.dir == 2) then lse_guard1.loc = "lse_inner_3"; if (loc == "lse_inner_1") then pn("Стражник уходит. "); elseif (loc == "lse_inner_4") then pn("Стражник приближается. "); elseif (here().out == "lse_inner_3") then pn("Снаружи маячит стражник. "); end; else lse_guard1.loc = "lse_inner_1"; if (loc == "lse_inner_3") then pn("Стражник уходит. "); elseif (loc == "lse_inner_4") then pn("Стражник уходит. "); elseif (here().out == "lse_inner_1") then pn("Снаружи маячит стражник. "); end; end; if (here().out == "lse_inner_2") then pn("Стражник уходит. "); end; else lse_guard1.dir = 1; lse_guard1.loc = "lse_inner_2"; if (loc == "lse_inner_3" or here().out == "lse_inner_3") then pn("Стражник уходит. "); elseif (loc == "lse_inner_1" or here().out == "lse_inner_1") then pn("Стражник приближается. "); elseif (loc == "lse_inner_4" or here().out == "lse_inner_4") then pn("Стражник уходит. "); elseif (here().out == "lse_inner_2") then pn("Снаружи маячит стражник. "); end; end; if (lse_guard2.loc == "lse_inner_5") then lse_guard2.dir = 2; lse_guard2.loc = "lse_inner_6"; if (loc == "lse_inner_5" or here().out == "lse_inner_5") then pn("Стражник уходит. "); elseif (loc == "lse_inner_5") then pn("Стражник уходит. "); elseif (loc == "lse_inner_7" or here().out == "lse_inner_7") then pn("Стражник приближается. "); elseif (here().out == "lse_inner_6") then pn("Снаружи маячит стражник. "); end; elseif (lse_guard2.loc == "lse_inner_6") then if (lse_guard2.dir == 2) then lse_guard2.loc = "lse_inner_7"; if (loc == "lse_inner_5") then pn("Стражник уходит. "); elseif (loc == "lse_inner_4") then pn("Стражник уходит. "); elseif (here().out == "lse_inner_7") then pn("Снаружи маячит стражник. "); end; else lse_guard2.loc = "lse_inner_5"; if (loc == "lse_inner_7") then pn("Стражник уходит. "); elseif (loc == "lse_inner_4") then pn("Стражник приближается. "); elseif (here().out == "lse_inner_5") then pn("Снаружи маячит стражник. "); end; end; if (loc == "lse_inner_6" or here().out == "lse_inner_6") then pn("Стражник уходит. "); end; else lse_guard2.dir = 1; lse_guard2.loc = "lse_inner_6"; if (loc == "lse_inner_4") then pn("Стражник приближается. "); elseif (loc == "lse_inner_7" or here().out == "lse_inner_7") then pn("Стражник уходит. "); elseif (loc == "lse_inner_5" or here().out == "lse_inner_5") then pn("Стражник приближается. "); elseif (here().out == "lse_inner_6") then pn("Снаружи маячит стражник"); end; end; if (loc == lse_guard1.loc or loc == lse_guard2.loc) then timer:stop(); game.timer = nil; walk("game_over_lse_guards"); end; end; lse_guard1 = { dir = 1; loc = "lse_inner_3"; }; lse_guard2 = { dir = 1; loc = "lse_inner_7"; }; lse_inner_1 = room { nam = "lse_inner_1"; disp = "Лсэрианотр, внутреннее кольцо"; nosave = true; noautosave = true; dsc = function(s) local f = [[Внутреннее кольцо Лсэрианотра очень похоже на другие, однако эта часть разительно выделяется -- здесь нет такого безжизненного абсолютно порядка, как в остальных частях -- повсюду расставлены ящики и разбросаны обломки досок. Большинство навьяров сейчас поселилось в этой части города, но к счастью, на улицах сейчас почти никого нет. ]]; if (lse_guard1.loc == "lse_inner_2") then if (lse_guard1.dir == 1) then f = f .. [[^^Стражник приближается с направления против часовой стрелки. ]]; else f = f .. [[^^Стражник удаляется в направлении против часовой стрелки. ]]; end; elseif (lse_guard1.loc == "lse_inner_3") then f = f .. [[^^Вдалеке, в направлении против часовой стрелки, вы видите стражника. ]]; end; return f; end; enter = function(s) if (lse_guard1.loc == "lse_inner_1") then timer:stop(); game.timer = nil; walk("game_over_lse_guards"); end; end; entered = function(s) if (game.timer ~= lse_timer) then lse_guard1.loc = "lse_inner_3"; lse_guard1.dir = 1; game.timer = lse_timer; timer:set(6000); end; end; way = { kh_vroom("Против часовой стрелки", "lse_inner_2"); kh_vroom("В помещение", "lse_inner_1_inside"); kh_vroom("В энергостанцию", function(s) timer:stop(); game.timer = nil; return "lse_power_station_dark"; end); kh_vroom("По часовой стрелке", function(s) pn [[Вам там нечего делать. ]]; return false; end); }; }; lse_inner_1_inside = room { nam = "lse_inner_1_inside"; out = "lse_inner_1"; nosave = true; noautosave = true; disp = "Лсэрианотр, помещение"; dsc = function(s) local f = [[Узкий коридор с несколькими дверьми, ведущими в маленькие комнатки, по сторонам. ]]; if (lse_guard1.loc == "lse_inner_1") then f = f .. [[^^Снаружи маячит стражник. ]]; end; return f; end; way = { kh_vroom("В город", "lse_inner_1"); }; entered = function(s) if (game.timer ~= lse_timer) then game.timer = lse_timer; timer:set(6000); end; end; }; lse_inner_2 = room { nam = "lse_inner_2"; disp = "Лсэрианотр, внутреннее кольцо"; nosave = true; noautosave = true; dsc = function(s) local f = [[Внутреннее кольцо Лсэрианотра очень похоже на другие, однако эта часть разительно выделяется -- здесь нет такого безжизненного абсолютно порядка, как в остальных частях -- повсюду расставлены ящики и разбросаны обломки досок. Большинство навьяров сейчас поселилось в этой части города, но к счастью, на улицах сейчас почти никого нет. ]]; if (lse_guard1.loc == "lse_inner_1") then f = f .. [[Стражник приближается с направления по часовой стрелке]]; elseif (lse_guard1.loc == "lse_inner_3") then f = f .. [[Стражник приближается с направления против часовой стрелки]]; end; return f; end; enter = function(s) if (lse_guard1.loc == "lse_inner_2") then timer:stop(); game.timer = nil; walk("game_over_lse_guards"); end; end; way = { kh_vroom("Против часовой стрелки", "lse_inner_3"); kh_vroom("В помещение", "lse_inner_2_inside"); kh_vroom("По часовой стрелке", "lse_inner_1"); }; entered = function(s) if (game.timer ~= lse_timer) then game.timer = lse_timer; timer:set(6000); end; end; }; lse_inner_2_inside = room { nam = "lse_inner_2_inside"; out = "lse_inner_2"; nosave = true; noautosave = true; disp = "Лсэрианотр, помещение"; dsc = function(s) local f = [[Узкий коридор с несколькими дверьми, ведущими в маленькие комнатки, по сторонам. ]]; if (lse_guard1.loc == "lse_inner_2") then f = f .. [[^^Снаружи маячит стражник. ]]; end; return f; end; way = { kh_vroom("В город", "lse_inner_2"); }; entered = function(s) if (game.timer ~= lse_timer) then game.timer = lse_timer; timer:set(6000); end; end; }; lse_inner_3 = room { nam = "lse_inner_3"; disp = "Лсэрианотр, внутреннее кольцо"; nosave = true; noautosave = true; dsc = function(s) local f = [[Внутреннее кольцо Лсэрианотра очень похоже на другие, однако эта часть разительно выделяется -- здесь нет такого безжизненного абсолютно порядка, как в остальных частях -- повсюду расставлены ящики и разбросаны обломки досок. Большинство навьяров сейчас поселилось в этой части города, но к счастью, на улицах сейчас почти никого нет. ]]; if (lse_guard1.loc == "lse_inner_2") then if (lse_guard1.dir == 2) then f = f .. [[^^Стражник приближается с направления по часовой стрелке. ]]; else f = f .. [[^^Стражник удаляется в направлении по часовой стрелке. ]]; end; elseif (lse_guard1.loc == "lse_inner_1") then f = f .. [[^^Вдалеке, в направлении по часовой стрелке, вы видите стражника. ]]; end; return f; end; enter = function(s) if (lse_guard1.loc == "lse_inner_3") then timer:stop(); game.timer = nil; walk("game_over_lse_guards"); end; end; way = { kh_vroom("Против часовой стрелки", "lse_inner_4"); kh_vroom("В помещение", "lse_inner_3_inside"); kh_vroom("По часовой стрелке", "lse_inner_2"); }; entered = function(s) if (game.timer ~= lse_timer) then game.timer = lse_timer; timer:set(6000); end; end; }; lse_inner_3_inside = room { nam = "lse_inner_3_inside"; out = "lse_inner_3"; nosave = true; noautosave = true; disp = "Лсэрианотр, помещение"; dsc = function(s) local f = [[Узкий коридор с несколькими дверьми, ведущими в маленькие комнатки, по сторонам. ]]; if (lse_guard1.loc == "lse_inner_3") then f = f .. [[^^Снаружи маячит стражник. ]]; end; return f; end; way = { kh_vroom("В город", "lse_inner_3"); }; entered = function(s) if (game.timer ~= lse_timer) then game.timer = lse_timer; timer:set(6000); end; end; }; lse_inner_4 = room { nam = "lse_inner_4"; disp = "Лсэрианотр, внутреннее кольцо"; dsc = function(s) local f = [[Внутреннее кольцо Лсэрианотра очень похоже на другие, однако эта часть разительно выделяется -- здесь нет такого безжизненного абсолютно порядка, как в остальных частях -- повсюду расставлены ящики и разбросаны обломки досок. Большинство навьяров сейчас поселилось в этой части города, но к счастью, на улицах сейчас почти никого нет. ]]; if (lse_guard1.loc == "lse_inner_2") then f = f .. [[^^Вдалеке в направлении по часовой стрелке вы видите стражника. ]]; elseif (lse_guard1.loc == "lse_inner_3") then f = f .. [[^^В направлении по часовой стрелке вы видите стражника. ]]; end; if (lse_guard2.loc == "lse_inner_6") then f = f .. [[^^Вдалеке в направлении против часовой стрелки вы видите стражника. ]]; elseif (lse_guard2.loc == "lse_inner_5") then f = f .. [[^^В направлении против часовой стрелки вы видите стражника. ]]; end; return f; end; way = { kh_vroom("Против часовой стрелки", "lse_inner_5"); kh_vroom("В помещение", "lse_inner_4_inside"); kh_vroom("По часовой стрелке", "lse_inner_3"); }; entered = function(s) if (game.timer ~= lse_timer) then game.timer = lse_timer; timer:set(6000); end; end; }; lse_inner_4_inside = room { nam = "lse_inner_4_inside"; out = "lse_inner_4"; disp = "Лсэрианотр, помещение"; dsc = [[Узкий коридор с несколькими дверьми, ведущими в маленькие комнатки, по сторонам. ]]; way = { kh_vroom("В город", "lse_inner_4"); }; entered = function(s) if (game.timer ~= lse_timer) then game.timer = lse_timer; timer:set(6000); end; end; }; lse_inner_5 = room { nam = "lse_inner_5"; disp = "Лсэрианотр, внутреннее кольцо"; nosave = true; noautosave = true; dsc = function(s) local f = [[Внутреннее кольцо Лсэрианотра очень похоже на другие, однако эта часть разительно выделяется -- здесь нет такого безжизненного абсолютно порядка, как в остальных частях -- повсюду расставлены ящики и разбросаны обломки досок. Большинство навьяров сейчас поселилось в этой части города, но к счастью, на улицах сейчас почти никого нет. ]]; if (lse_guard2.loc == "lse_inner_6") then if (lse_guard2.dir == 1) then f = f .. [[^^Стражник приближается с направления против часовой стрелки. ]]; else f = f .. [[^^Стражник удаляется в направлении против часовой стрелки. ]]; end; elseif (lse_guard2.loc == "lse_inner_7") then f = f .. [[^^Вдалеке, в направлении против часовой стрелки, вы видите стражника. ]]; end; return f; end; enter = function(s) if (lse_guard2.loc == "lse_inner_5") then timer:stop(); game.timer = nil; walk("game_over_lse_guards"); end; end; entered = function(s) if (game.timer ~= lse_timer) then game.timer = lse_timer; timer:set(6000); end; end; way = { kh_vroom("Против часовой стрелки", "lse_inner_6"); kh_vroom("В помещение", "lse_inner_5_inside"); kh_vroom("По часовой стрелке", "lse_inner_4"); }; }; lse_inner_5_inside = room { nam = "lse_inner_5_inside"; out = "lse_inner_5"; disp = "Лсэрианотр, помещение"; dsc = function(s) local f = [[Узкий коридор с несколькими дверьми, ведущими в маленькие комнатки, по сторонам. ]]; if (lse_guard2.loc == "lse_inner_5") then f = f .. [[^^Снаружи маячит стражник. ]]; end; return f; end; entered = function(s) if (game.timer ~= lse_timer) then game.timer = lse_timer; timer:set(6000); end; end; way = { kh_vroom("В город", "lse_inner_5"); }; }; lse_inner_6 = room { nam = "lse_inner_6"; disp = "Лсэрианотр, внутреннее кольцо"; nosave = true; noautosave = true; dsc = function(s) local f = [[Внутреннее кольцо Лсэрианотра очень похоже на другие, однако эта часть разительно выделяется -- здесь нет такого безжизненного абсолютно порядка, как в остальных частях -- повсюду расставлены ящики и разбросаны обломки досок. Большинство навьяров сейчас поселилось в этой части города, но к счастью, на улицах сейчас почти никого нет. ]]; if (lse_guard2.loc == "lse_inner_5") then f = f .. [[Стражник приближается с направления по часовой стрелке]]; elseif (lse_guard2.loc == "lse_inner_7") then f = f .. [[Стражник приближается с направления против часовой стрелки]]; end; return f; end; enter = function(s) if (lse_guard2.loc == "lse_inner_6") then timer:stop(); game.timer = nil; walk("game_over_lse_guards"); end; end; entered = function(s) if (game.timer ~= lse_timer) then game.timer = lse_timer; timer:set(6000); end; end; way = { kh_vroom("Против часовой стрелки", "lse_inner_7"); kh_vroom("В помещение", "lse_inner_6_inside"); kh_vroom("По часовой стрелке", "lse_inner_5"); }; }; lse_inner_6_inside = room { nam = "lse_inner_6_inside"; out = "lse_inner_6"; nosave = true; noautosave = true; disp = "Лсэрианотр, помещение"; dsc = function(s) local f = [[Узкий коридор с несколькими дверьми, ведущими в маленькие комнатки, по сторонам. ]]; if (lse_guard2.loc == "lse_inner_6") then f = f .. [[^^Снаружи маячит стражник. ]]; end; return f; end; entered = function(s) if (game.timer ~= lse_timer) then game.timer = lse_timer; timer:set(6000); end; end; way = { kh_vroom("В город", "lse_inner_6"); }; }; lse_inner_7 = room { nam = "lse_inner_7"; disp = "Лсэрианотр, внутреннее кольцо"; nosave = true; noautosave = true; dsc = function(s) local f = [[Внутреннее кольцо Лсэрианотра очень похоже на другие, однако эта часть разительно выделяется -- здесь нет такого безжизненного абсолютно порядка, как в остальных частях -- повсюду расставлены ящики и разбросаны обломки досок. Большинство навьяров сейчас поселилось в этой части города, но к счастью, на улицах сейчас почти никого нет. ]]; if (lse_guard2.loc == "lse_inner_6") then if (lse_guard2.dir == 2) then f = f .. [[^^Стражник приближается с направления по часовой стрелке. ]]; else f = f .. [[^^Стражник удаляется в направлении по часовой стрелке. ]]; end; elseif (lse_guard2.loc == "lse_inner_5") then f = f .. [[^^Вдалеке, в направлении по часовой стрелке, вы видите стражника. ]]; end; return f; end; enter = function(s) if (lse_guard2.loc == "lse_inner_7") then timer:stop(); game.timer = nil; walk("game_over_lse_guards"); end; end; entered = function(s) service_tunnels_3.position = "10"; if (game.timer ~= lse_timer) then game.timer = lse_timer; timer:set(6000); end; end; way = { kh_vroom("Против часовой стрелки", function(s) pn [[Там вам нечего делать. ]]; return false; end); kh_vroom("В помещение", "lse_inner_7_inside"); kh_vroom("В сервисный тоннель", function(s) timer:stop(); game.timer = nil; return "service_tunnels_3" end); kh_vroom("По часовой стрелке", "lse_inner_6"); }; }; lse_inner_7_inside = room { nam = "lse_inner_7_inside"; out = "lse_inner_7"; nosave = true; noautosave = true; disp = "Лсэрианотр, помещение"; dsc = function(s) local f = [[Узкий коридор с несколькими дверьми, ведущими в маленькие комнатки, по сторонам. ]]; if (lse_guard2.loc == "lse_inner_7") then f = f .. [[^^Снаружи маячит стражник. ]]; end; return f; end; way = { kh_vroom("В город", "lse_inner_7"); }; }; lse_center = room { nam = 'Лсэрианотр, зал Наэтвьирра'; enter = function(s) lse_ending_state = 2; walkin('lse_conf_center_intro'); end; } lse_conf_center_intro = cutscene('Лсэрианотр, зал Наэтвьирра', 'Лсэрианотр, зал Наэтвьирра', [[Центральный зал ярко освещен исходящим из стен светом. По периметру зала установлены массивные металлические шкафы, издающие ровный низкий гул. По полу протянуты толстые провода, соединяющие их со статуей в центре зала. Металлическая статуя изображает навьяра, сидящего на троне. Рядом с троном стоят два пилона, высотой около метра. ^Уильям и Аэдхиарр завершают подготовку к запуску Наэтвьирра. При виде вас Уильям достает револьвер и стреляет в вас. В этот же момент в зал врываются ваши соратники. ]], 'lse_final_battle');