lse_pre_fb_learr = cutscene('Лсэрианотр, зал Наэтвьирра', 'Лсэрианотр, зал Наэтвьирра', [[Леарр втыкает копье в один из генераторов и тот затихает. Наэтвьирр испускает мощную волну, отбрасывая Леарр к стене. Она остается неподвижно лежать там, где упала. ]], function(s) lse_gen_05.broken = true; if ArrayUtils.indexOf(pl.party, 'wright') ~= 0 then return 'lse_pre_fb_jack'; elseif ArrayUtils.indexOf(pl.party, 'anna') ~= 0 then return 'lse_pre_fb_anna'; else return 'lse_pre_fb_walter'; end; end); lse_pre_fb_jack = cutscene('Лсэрианотр, зал Наэтвьирра', 'Лсэрианотр, зал Наэтвьирра', [[Джек Райт атакует Аэдхиарра, выводя его из боя. Мощный электрический разряд вырывается из руки Наэтвьирра и попадает в Райта. Джек падает на пол и остается неподвижно лежать. ]], function(s) lse_aedhyarr.hp = 0; if ArrayUtils.indexOf(pl.party, 'anna') ~= 0 then return 'lse_pre_fb_anna'; else return 'lse_pre_fb_walter'; end; end); lse_pre_fb_anna = cutscene('Лсэрианотр, зал Наэтвьирра', 'Лсэрианотр, зал Наэтвьирра', [[Анна Рэдклифф достает револьвер и стреляет в один из экранов. Экран разбивается в дребезги, глаза Наэтвьирра моргают. Мощная волна воздуха отбрасывает Анну к стене. Она остается неподвижно лежать там, где упала. ]], function(s) lse_generators_chAwake = 80; return 'lse_pre_fb_walter'; end); lse_pre_fb_walter = cutscene('Лсэрианотр, зал Наэтвьирра', 'Лсэрианотр, зал Наэтвьирра', [[Уолтер Рэдклифф подходит к ближайшему генератору и что-то делает с ним. Сияющий щит вокруг Наэтвьирра пропадает. Мощный электрический разряд вырывается из руки машины и попадает в Уолтера. Рэдклифф падает на пол и остается неподвижно лежать. ]], function() lse_generators_chShield = 2; return 'lse_final_battle'; end); lse_final_battle = battlefield { nam = "lse_final_battle"; disp = "Лсэрианотр, центральный зал"; lose = "game_over_final_battle"; win = "final_battle_over"; map = { {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, {0,0,0,0,0,0,0}, }; player_pic = 'images/player_no_outfit.png'; dsc = [[Стены древнего зала излучают яркий свет. Сверху над залом нависает прозрачный купол, сквозь который вы можете видеть океанскую толщу над вами. ]]; plX = 4; plY = 7; check_win = function(s) local cnt = 0; for i = 1, 10 do if (i < 10) then a = "lse_gen_0" .. tostring(i); else a = "lse_gen_" .. tostring(i); end; if not stead.ref(a).broken then cnt = cnt + 1; end; end; if cnt == 0 then walk(s.win); end; end; make_turn = function(s) lse_generator_update(); end; entered = function(s) local s = rnd(10); local t = rnd(10); while (t == s) do t = rnd(10); end; local c = rnd(10); while (c == t or c == s) do c = rnd(10); end; local p = rnd(10); while (p == c or p == t or p == s) do p = rnd(10); end; if (s < 10) then s = "0" .. tostring(s); else s = tostring(s); end; if (t < 10) then t = "0" .. tostring(t); else t = tostring(t); end; if (c < 10) then c = "0" .. tostring(c); else c = tostring(c); end; if (p < 10) then p = "0" .. tostring(p); else p = tostring(p); end; lse_generators_shield = "lse_gen_" .. s; lse_generators_throw = "lse_gen_" .. t; lse_generators_charge = "lse_gen_" .. c; lse_generators_pylon = "lse_gen_" .. p; stead.ref(lse_generators_shield).role = "s"; stead.ref(lse_generators_throw).role = "t"; stead.ref(lse_generators_charge).role = "c"; stead.ref(lse_generators_pylon).role = "p"; end; obj = { "lse_gen_01", "lse_gen_02", "lse_gen_03", "lse_gen_04", "lse_gen_05", "lse_gen_06", "lse_gen_07", "lse_gen_08", "lse_gen_09", "lse_gen_10", "lse_drake", "lse_aedhyarr", "lse_pylon1", "lse_pylon2", "lse_naethvjirr" }; }; global { lse_generators_shield = false; lse_generators_throw = false; lse_generators_charge = false; lse_generators_pylon = false; lse_generators_chPylon = 10; lse_generators_chThrow = 5; lse_generators_chCharge = 3; lse_generators_chShield = 0; lse_generators_chAwake = 60; } lse_generator_update = function() local cnt = 0; local c; for i = 1, 10 do local a; if (i < 10) then a = "lse_gen_0" .. tostring(i); else a = "lse_gen_" .. tostring(i); end; if not stead.ref(a).broken then cnt = cnt + 1; end; end; if (cnt == 0) then return; end; if (cnt < 4 or lse_naethvjirr.hp <= 0) then if (stead.ref(lse_generators_shield) and not stead.ref(lse_generators_shield).broken) then stead.ref(lse_generators_shield).role = false; end; lse_generators_shield = false; end; if (cnt < 3 or lse_naethvjirr.hp <= 0) then if (stead.ref(lse_generators_throw) and not stead.ref(lse_generators_throw).broken) then stead.ref(lse_generators_throw).role = false; end; lse_generators_throw = false; end; if (cnt < 2 or lse_naethvjirr.hp <= 0) then if (stead.ref(lse_generators_charge) and not stead.ref(lse_generators_charge).broken) then stead.ref(lse_generators_charge).role = false; end; lse_generators_charge = false; end; if (lse_pylon1.hp <= 0 and lse_pylon2.hp <= 0) then if (stead.ref(lse_generators_pylon) and not stead.ref(lse_generators_pylon).broken) then stead.ref(lse_generators_pylon).role = false; end; lse_generators_pylon = false; end; if (lse_generators_pylon and stead.ref(lse_generators_pylon).broken) then c = rnd(10); if (c < 10) then c = "lse_gen_0" .. tostring(c); else c = "lse_gen_" .. tostring(c); end; while (stead.ref(c).broken or stead.ref(c).role) do c = rnd(10); if (c < 10) then c = "lse_gen_0" .. tostring(c); else c = "lse_gen_" .. tostring(c); end; end; lse_generators_pylon = c; stead.ref(lse_generators_pylon).role = "p"; end; if (lse_generators_shield and stead.ref(lse_generators_shield).broken) then c = rnd(10); if (c < 10) then c = "lse_gen_0" .. tostring(c); else c = "lse_gen_" .. tostring(c); end; while (stead.ref(c).broken or stead.ref(c).role) do c = rnd(10); if (c < 10) then c = "lse_gen_0" .. tostring(c); else c = "lse_gen_" .. tostring(c); end; end; lse_generators_shield = c; stead.ref(lse_generators_shield).role = "s"; end; if (lse_generators_throw and stead.ref(lse_generators_throw).broken) then c = rnd(10); if (c < 10) then c = "lse_gen_0" .. tostring(c); else c = "lse_gen_" .. tostring(c); end; while (stead.ref(c).broken or stead.ref(c).role) do c = rnd(10); if (c < 10) then c = "lse_gen_0" .. tostring(c); else c = "lse_gen_" .. tostring(c); end; end; lse_generators_throw = c; stead.ref(lse_generators_throw).role = "t"; end; if (lse_generators_charge and stead.ref(lse_generators_charge).broken) then c = rnd(10); if (c < 10) then c = "lse_gen_0" .. tostring(c); else c = "lse_gen_" .. tostring(c); end; while (stead.ref(c).broken or stead.ref(c).role) do c = rnd(10); if (c < 10) then c = "lse_gen_0" .. tostring(c); else c = "lse_gen_" .. tostring(c); end; end; lse_generators_charge = c; stead.ref(lse_generators_charge).role = "c"; end; end; lse_generator = function(nam, x, y, index) return combatant { nam = nam; x = x; y = y; hp = 2; broken = false; state = function(s) if s.hp == 2 then return ""; elseif s.hp == 1 then return "Он поврежден, но работает. "; end; end; pic = function(s) layers = { 'images/fb_generator' .. tostring(index) .. '.png' } if not s.broken then if (s.role == "s") then layers[2] = 'images/fb_generator_shield.png'; elseif (s.role == "c") then layers[2] = 'images/fb_generator_charge.png'; elseif (s.role == "t") then layers[2] = 'images/fb_generator_throw.png'; elseif (s.role == "p") then layers[2] = 'images/fb_generator_pylon.png'; else layers[2] = 'images/fb_generator_awake.png'; end; end; return layers; end; enemy = true; disp = "генератор " .. tostring(index); disp2 = "генератор " .. tostring(index); disp3 = "генератор " .. tostring(index); dsc = function(s) if (not s.broken) then return [[{Генератор ]] .. tostring(index) .. [[} издает равномерный гул. ]]; else return [[{Генератор ]] .. tostring(index) .. [[} сломан. ]]; end; end; onshoot = function(s) local dist = math.sqrt((s.x - here().plX) * (s.x - here().plX) + (s.y - here().plY) * (s.y - here().plY)); if (rnd(4) > dist - 3) then s.broken = true; if (s.role == "s") then lse_generators_chShield = 2; elseif (s.role == "c") then lse_generators_chCharge = math.min(lse_generators_chCharge + 1, 4); elseif (s.role == "t") then lse_generators_chThrow = math.min(lse_generators_chThrow + 1, 5); elseif (s.role == "p") then lse_generators_chPylon = math.min(lse_generators_chPylon + 4, 10); end; p [[Вы попадаете в генератор и он затихает. ]]; else p [[Вы стреляете в генератор, но промахиваетесь. ]]; end; here():make_turn(); end; canthrust = function(s) return math.abs(s.x - here().plX) + math.abs(s.y - here().plY) <= 2 and not s.ally and not s.broken; end; onthrust = function(s) s.broken = true; if (s.role == "s") then lse_generators_chShield = 2; elseif (s.role == "c") then lse_generators_chCharge = math.min(lse_generators_chCharge + 1, 4); elseif (s.role == "t") then lse_generators_chThrow = math.min(lse_generators_chThrow + 1, 5); elseif (s.role == "p") then lse_generators_chPylon = math.min(lse_generators_chPylon + 4, 10); end; p [[После нескольких сильных ударов, генератор затихает. ]]; here():make_turn(); end; onhit = function(s) s.broken = true; p [[После нескольких сильных ударов, генератор затихает. ]]; here():make_turn(); end; act = function(s) return [[Так я не нанесу ему никакого вреда. ]]; end; make_turn = function(s) local shielded = false; if not s.broken then if (s.role == "s") then shielded = true; if (lse_generators_chShield ~= 0) then lse_generators_chShield = lse_generators_chShield - 1; end; elseif (s.role == "c") then if (lse_generators_chCharge ~= 0) then lse_generators_chCharge = lse_generators_chCharge - 1; end; elseif (s.role == "t") then if (lse_generators_chThrow ~= 0) then lse_generators_chThrow = lse_generators_chThrow - 1; end; elseif (s.role == "p") then if (lse_generators_chPylon ~= 0) then lse_generators_chPylon = lse_generators_chPylon - 1; end; else lse_generators_chAwake = lse_generators_chAwake - 1; end; end; if not shielded then lse_generators_chShield = 2; end; end; }; end; lse_gen_01 = lse_generator("lse_gen_01", 1, 7, 1); lse_gen_02 = lse_generator("lse_gen_02", 1, 5, 2); lse_gen_03 = lse_generator("lse_gen_03", 1, 3, 3); lse_gen_04 = lse_generator("lse_gen_04", 1, 1, 4); lse_gen_05 = lse_generator("lse_gen_05", 3, 1, 5); lse_gen_06 = lse_generator("lse_gen_06", 5, 1, 6); lse_gen_07 = lse_generator("lse_gen_07", 7, 1, 7); lse_gen_08 = lse_generator("lse_gen_08", 7, 3, 8); lse_gen_09 = lse_generator("lse_gen_09", 7, 5, 9); lse_gen_10 = lse_generator("lse_gen_10", 7, 7, 10); lse_pylon = function(nam, x, y, index) return combatant { nam = nam; disp = "пилон " .. tostring(index); disp2 = "пилон " .. tostring(index); disp3 = "пилон " .. tostring(index); pic = "images/fb_pylon.png"; hp = 1; x = x; y = y; shootHit = "Каким-то чудом, вы попадаете в пилон и выводите его из строя. "; shootMiss = "Вы промахиваетесь мимо пилона, являющегося достаточно сложной целью. "; shootKill = "Каким-то чудом, вы попадаете в пилон и выводите его из строя. "; enemy = true; state = ""; dsc = function(s) if (s.hp > 0) then return [[{Пилон ]] .. tostring(index) .. "} излучает слабое свечение. "; else return false; end; end; onshoot = function(s) local dist = math.sqrt((s.x - here().plX) * (s.x - here().plX) + (s.y - here().plY) * (s.y - here().plY)); if (rnd(4) > dist) then if (dist == 0) then s.hp = s.hp - 2; end; s.hp = s.hp - 1; if (s.hp > 0) then p(s.shootHit); else p(s.shootKill); end; else p(s.shootMiss); end; here():make_turn(); end; make_turn = function(s) if (lse_generators_chPylon <= 0 and pl.hp > 0) then walk("game_over_pylon"); end; end; }; end; lse_pylon1 = lse_pylon("lse_pylon1", 3, 5, 1); lse_pylon2 = lse_pylon("lse_pylon2", 5, 5, 2); lse_throne = combatant { nam = "lse_throne"; x = 4; y = 4; hp = 1; pic = "images/fb_naethvjirr.png"; obst = 1; disp = "трон"; enemy = false; ally = false; state = ""; dsc = [[В центре комнаты установлен металлический трон. Рядом с ним валяется выведенный из строя автоматон-навьяр. ]]; }; lse_naethvjirr = combatant { nam = "lse_naethvjirr"; disp = "Наэтвьирр"; disp2 = "Наэтвьирра"; disp3 = "Наэтвьирру"; x = 4; y = 4; hp = 3; pic = "images/fb_naethvjirr.png"; enemy = true; shootHit = "Вы попадаете в Наэтвьирра. "; shootMiss = "Вы промахиваетесь мимо Наэтвьирра. "; shootKill = "Вы попадаете в Наэтвьирра. Глаза автоматона гаснут и он с грохотом падает на пол. "; thrustHit = "Вы попадаете в Наэтвьирра. "; thrustMiss = "Вы промахиваетесь мимо Наэтвьирра. "; thrustKill = "Вы попадаете в Наэтвьирра. Глаза автоматона гаснут и он с грохотом падает на пол. "; wpnHit = "Вы попадаете в Наэтвьирра. "; wpnMiss = "Вы промахиваетесь мимо Наэтвьирра. "; wpnKill = "Вы попадаете в Наэтвьирра. Глаза автоматона гаснут и он с грохотом падает на пол. "; handHit = "Вы попадаете в Наэтвьирра. "; handMiss = "Вы промахиваетесь мимо Наэтвьирра. "; handKill = "Вы попадаете в Наэтвьирра. Глаза автоматона гаснут и он с грохотом падает на пол. "; state = function(s) if s.hp == 2 then return "Он поврежден. "; elseif s.hp == 1 then return "Он сильно поврежден. "; end; return ""; end; dsc = function(s) local p = [[В центре комнаты установлен металлический трон. Рядом с ним стоит {автоматон-навьяр}, готовый к бою. ]]; if (lse_generators_chShield <= 0) then p = p .. [[Вокруг него видно едва заметное сияние энергетического щита - сейчас никакая атака не повредит ему. ]]; end; return p; end; make_turn = function(s) if here() ~= lse_final_battle then return end; if (lse_generators_chCharge <= 0) then lse_generators_chCharge = 3; p("Наэтвьирр отправляет в вас электрический разряд. "); if (rnd(4) < 2) then local plX = here().plX; local plY = here().plY; if math.abs(here().plX - 4) > math.abs(here().plY - 4) then if here().plX > 4 then plX = here().plX + 1; else plX = here().plX - 1; end; elseif math.abs(here().plX - 4) < math.abs(here().plY - 4) then if here().plY > 4 then plY = here().plY + 1; else plY = here().plY - 1; end; else if rnd(2) > 1 then if here().plX > 4 then plX = here().plX + 1; else plX = here().plX - 1; end; else if here().plY > 4 then plY = here().plY + 1; else plY = here().plY - 1; end; end; end; if (here():isPassable(plX, plY)) then p("Разряд отбрасывает вас в сторону"); here().plX = plX; here().plY = plY; end; end; if (rnd(4) < 5) then p("Вы чувствуете, что атака не прошла для вас бесследно. "); pl.hp = pl.hp - 1; end; elseif (lse_generators_chThrow <= 0) then lse_generators_chThrow = 5; p("Наэтвьирр отправляет в вас мощную волну воздуха, которая отбрасывает вас в сторону. "); local plX = here().plX; local plY = here().plY; if math.abs(here().plX - 4) > math.abs(here().plY - 4) then if here().plX > 4 then plX = here().plX + 1; else plX = here().plX - 1; end; elseif math.abs(here().plX - 4) < math.abs(here().plY - 4) then if here().plY > 4 then plY = here().plY + 1; else plY = here().plY - 1; end; else if rnd(2) > 1 then if here().plX > 4 then plX = here().plX + 1; else plX = here().plX - 1; end; else if here().plY > 4 then plY = here().plY + 1; else plY = here().plY - 1; end; end; end; if (here():isPassable(plX, plY)) then p("Волна отбрасывает вас в сторону. "); here().plX = plX; here().plY = plY; if (rnd(4) > 1) then -- 75% pl.hp = pl.hp - 1; p("Вы чувствуете, что атака не прошла для вас бесследно. "); end; else pl.hp = pl.hp - 1; p("Вы больно ударяетесь. "); end; end; end; onkill = function(s) s:disable(); table.insert(lse_final_battle.obj, #lse_final_battle.obj - 4, lse_throne); end; canshoot = function(s) local dist = math.sqrt((s.x - here().plX) * (s.x - here().plX) + (s.y - here().plY) * (s.y - here().plY)); return dist < 6 and not s.ally and lse_generators_chShield > 0; end; canthrust = function(s) return math.abs(s.x - here().plX) + math.abs(s.y - here().plY) <= 2 and not s.ally and lse_generators_chShield > 0; end; canhit = function(s) return (math.abs(s.x - here().plX) == 1 and s.y == here().plY or s.x == here().plX and math.abs(s.y - here().plY) == 1) and not s.ally and lse_generators_chShield > 0; end; }; lse_drake = combatant { nam = "lse_drake"; disp = "Уильям Дрейк"; disp2 = "Уильяма Дрейка"; disp3 = "Уильяму Дрейку"; shootHit = "Вы стреляете в Уильяма и попадаете в него. "; shootMiss = "Вы стреляете в Уильяма, но не попадаете в него. "; shootKill = "Вы стреляете в Уильяма и он падает замертво. "; handHit = "Вы ударяете Уильяма. "; handKill = "После вашего удара Уильям падает. "; handFar = "Слишком далеко. "; x = 4; y = 3; hp = 1; pic = "images/fb_drake.png"; gun = 6; state = ""; dsc = function(s) if s.hp > 0 then return [[{Уильям Дрейк} готов к бою. ]]; else return false; end; end; make_turn = function(s) if here() ~= lse_final_battle then return end; local dist = math.sqrt((s.x - here().plX) * (s.x - here().plX) + (s.y - here().plY) * (s.y - here().plY)); if (dist < 6) then if (here():canShoot(s.x, s.y, here().plX, here().plY)) then -- shoot if (rnd(4) > dist - 2) then pl.hp = pl.hp - 1; p("Уильям Дрейк стреляет в вас и попадает. "); else p("Уильям Дрейк стреляет в вас, но промахивается. "); end; else if (dist < 4) then -- try to run away local x = s.x; local y = s.y; if (math.abs(x - pl.x) > math.abs(y - pl.y)) then if (x > pl.x) then x = x + 1; else x = x - 1; end; elseif (math.abs(x - pl.x) < math.abs(y - pl.y)) then if (y > pl.y) then y = y + 1; else y = y - 1; end; else if (rnd(2) > 1) then if (here():isPassable(x, y + 1)) then y = y + 1; else x = x + 1; end; else if (here():isPassable(x + 1, y)) then x = x + 1; else y = y + 1; end; end; end; if (here():isPassable(x, y)) then s.x = x; s.y = y; p("Уильям Дрейк отступает. "); else p("Уильям Дрейк ждет. "); end; else p("Уильям Дрейк ждет. "); end; end; else p("Уильям Дрейк ждет. "); end; end; }; lse_aedhyarr = combatant { nam = "lse_aedhyarr"; x = 5; y = 3; hp = 1; enemy = true; disp = "Аэдхиарр"; disp2 = "Аэдхиарра"; disp3 = "Аэдхиарру"; pic = "images/aedhyarr.png"; shootHit = "Вы стреляете в Аэдхиарра и попадаете в него. "; shootMiss = "Вы стреляете в Аэдхиарра, но не попадаете в него. "; shootKill = "Вы стреляете в Аэдхиарра и он падает замертво. "; handHit = "Вы ударяете Аэдхиарра. "; handKill = "После вашего удара Аэдхиарр падает. "; handFar = "Слишком далеко. "; gun = 6; state = ""; dsc = function(s) if s.hp > 0 then return [[{Аэдхиарр} готов к бою. ]]; else return false; end; end; make_turn = function(s) if here() ~= lse_final_battle then return end; -- Аэдхиарр будет пытаться всеми силами париблизиться к игроку на расстояние выстрела и не будет отступать. local dist = math.sqrt((s.x - here().plX) * (s.x - here().plX) + (s.y - here().plY) * (s.y - here().plY)); if (dist < 4 and here():canShoot(s.x, s.y, here().plX, here().plY)) then -- shoot if (rnd(2) > dist - 2) then pl.hp = pl.hp - 1; p("Аэдхиарр стреляет в вас и попадает. "); else p("Аэдхиарр стреляет в вас, но промахивается. "); end; else local path = here():getWalkDistance(s.x, s.y, pl.x, pl.y); if path then s.x = path.p[2][1]; s.y = path.p[2][2]; p("Аэдхиарр приближается к вам. "); else p("Аэдхиарр ждет. "); end; end; end; }; final_battle_over = room { nam = 'final_battle_over'; enter = function(s) if lse_aedhyarr.hp > 0 then walkin(prepare_ending(3)); else walkin(prepare_ending(4)); end; end; };