lse_final_battle = battlefield { nam = "lse_final_battle"; disp = "Лсэрианотр, центральный зал"; lose = "game_over_final_battle"; win = "game_over_victory"; 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}, }; dsc = [[Стены и пол древнего зала излучают яркий свет. Сверху над залом нависает прозрачный купол, сквозь который вы можете видеть океанскую толщу над вами. ]]; plX = 4; plY = 7; 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_black", "lse_aedhyarr", "lse_pylon1", "lse_pylon2", "lse_naethvjirr" }; }; lse_generators = { shield = nil; throw = nil; charge = nil; pylon = nil; chPylon = 10; chThrow = 4; chCharge = 3; chShield = 0; chAwake = 60; }; lse_generator_update = function() local cnt = 0; local c = nil; for i = 1, 10 do local a = nil; 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; print(cnt); 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 = nil; end; lse_generators.shield = nil; 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 = nil; end; lse_generators.throw = nil; 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 = nil; end; lse_generators.charge = nil; 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 = nil; end; lse_generators.pylon = nil; 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 print("d", c); 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 print("a", c); 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 print("b", c); 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 print("c", c); 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; pic = function(s) if (s.broken) then return "images/fb_inactive.png"; else if (s.role == "s") then return "images/fb_shield.png"; elseif (s.role == "c") then return "images/fb_charge.png"; elseif (s.role == "t") then return "images/fb_throw.png"; elseif (s.role == "p") then return "images/fb_pylon.png"; else return "images/fb_awake.png"; end; end; end; enemy = true; disp2 = "генератор " .. tostring(index); disp3 = "генератор " .. tostring(index); dsc = function(s) if (not s.broken) then return [[{Генератор ]] .. tostring(index) .. [[} издает равномерный гул. ]]; else return [[{Генератор ]] .. tostring(index) .. [[} сломан. ]]; end; end; canshoot = false; noshootmsg = "Ваш выстрел не повредит ему. "; 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, 3); elseif (s.role == "t") then lse_generators.chThrow = math.min(lse_generators.chThrow + 1, 4); 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) if (s.role == "s") then 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; }; 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; disp2 = "пилон " .. tostring(index); disp3 = "пилон " .. tostring(index); pic = "images/fb_pylon.png"; hp = 1; x = x; y = y; shootHit = "Каким-то чудом, вы попадаете в пилон и выводите его из строя. "; shootMiss = "Вы промахиваетесь мимо пилона, являющегося достаточно сложной целью. "; shootKill = "Каким-то чудом, вы попадаете в пилон и выводите его из строя. "; enemy = true; 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; enemy = false; ally = false; dsc = [[В центре комнаты установлен металлический трон. Рядом с ним валяется выведенный из строя автоматон-навьяр. ]]; }; lse_naethvjirr = combatant { nam = "lse_naethvjirr"; 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 = "Вы попадаете в Наэтвьирра. Глаза автоматона гаснут и он с грохотом падает на пол. "; dsc =function(s) local p = [[В центре комнаты установлен металлический трон. Рядом с ним стоит {автоматон-навьяр}, готовый к бою. ]]; if (lse_generators.chShield <= 0) then p = p .. [[Вокруг него видно едва заметное сияние энергетического щита - сейчас никакая атака не повредит ему. ]]; end; return p; end; make_turn = function(s) if (lse_generators.chCharge <= 0) then lse_generators.chCharge = 3; p("Наэтвьирр отправляет в вас электрический разряд. Вы не можете пошевелиться. "); if (rnd(4) < 2) then local plX = here().plX; local plY = here().plY; p("Разряд отбрасывает вас в сторону"); 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; print("dark"); lse_final_battle:make_turn(); elseif (lse_generators.chThrow <= 0) then p("Наэтвьирр отправляет в вас мощную волну воздуха, которая отбрасывает вас в сторону. "); local plX = here().plX; local plY = here().plY; p("Разряд отбрасывает вас в сторону. "); 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_black = combatant { nam = "lse_black"; disp2 = "Адриана Блэка"; disp3 = "Адриану Блэку"; x = 4; y = 3; hp = 4; pic = "images/fb_black.png"; gun = 6; dsc = function(s) if s.hp > 0 then return [[{Адриан Блэк} готов к бою. ]]; else return false; end; end; make_turn = function(s) 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 - 2; 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 = 4; disp2 = "Аэдхиарра"; disp3 = "Аэдхиарру"; pic = "images/fb_black.png"; gun = 6; dsc = function(s) if s.hp > 0 then return [[{Аэдхиарр} готов к бою. ]]; else return false; end; end; make_turn = function(s) -- Аэдхиарр будет пытаться всеми силами париблизиться к игроку на расстояние выстрела и не будет отступать. local dist = math.sqrt((s.x - here().plX) * (s.x - here().plX) + (s.y - here().plY) * (s.y - here().plY)); print(dist, here():canShoot(s.x, s.y, here().plX, here().plY)); if (dist < 6 and here():canShoot(s.x, s.y, here().plX, here().plY)) then -- shoot if (rnd(4) > dist - 2) then pl.hp = pl.hp - 2; 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; };