|
new file 100644
|
|
|
fb_naethvjirr = obj {
|
|
|
nam = "fb_naethvjirr";
|
|
|
disp2 = "Наэтвьирра";
|
|
|
position = 4;
|
|
|
throw = 0; -- оставшиеся ходы до возможности применения (раз в 4 хода)
|
|
|
charge = 0; -- оставшиеся ходы до возможности применения (раз в 3 хода)
|
|
|
shield = true; -- активность щита
|
|
|
shieldRecharge = false; -- О, как я люблю эти маленькие костыли. Это нужно, чтобы щит не восстанавливался сразу после выстрела
|
|
|
canshoot = function(s)
|
|
|
return not s.shield;
|
|
|
end;
|
|
|
canhit = function(s)
|
|
|
return not s.shield;
|
|
|
end;
|
|
|
nohitmsg = "Это бессмыссленно, пока он закрыт щитом";
|
|
|
noshootmsg = "Это бессмыссленно, пока он закрыт щитом";
|
|
|
hitpoints = 3;
|
|
|
passturn = function(s)
|
|
|
if (s.hitpoints > 0) then
|
|
|
local gens = 0;
|
|
|
for i = 0, #final_battle.generators do
|
|
|
if (final_battle.generators[i] == 4) then
|
|
|
gens = gens + 1;
|
|
|
s.charge = s.charge - 1;
|
|
|
elseif (final_battle.generators[i] == 3) then
|
|
|
gens = gens + 1;
|
|
|
s.throw = s.throw - 1;
|
|
|
elseif (final_battle.generators[i] == 2) then
|
|
|
gens = gens + 1;
|
|
|
if (not s.shield) then
|
|
|
if (s.shieldRecharge) then
|
|
|
s.shield = true;
|
|
|
s.shieldRecharge = false;
|
|
|
p("Щит вокруг Наэтвьирра восстановлен и он снова защищен от ваших атак. ");
|
|
|
else
|
|
|
s.shieldRecharge = true;
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
if (gens == 0) then
|
|
|
p("Глаза Наэтвьирра гаснут, и конструкт бессильно падает на пол. ");
|
|
|
s.hitpoints = 0;
|
|
|
return true;
|
|
|
end;
|
|
|
|
|
|
if (s.charge <= 0) then
|
|
|
-- Пускаем разряд в игрока
|
|
|
s.charge = 3;
|
|
|
p("Наэтвьирр отправляет в вас электрический разряд. Вы не можете пошевелиться. ");
|
|
|
if (rnd(4) < 2) then
|
|
|
-- Отбросить игрока в сторону
|
|
|
p("Разряд отбрасывает вас в сторону. ");
|
|
|
fb_throwAway(pl);
|
|
|
end;
|
|
|
|
|
|
if (rnd(4) < 2) then -- 25%
|
|
|
p("Вы чувствуете, что атака не прошла для вас бесследно. ");
|
|
|
pl.hitpoints = pl.hitpoints - 1;
|
|
|
if (pl.hitpoints <= 0) then
|
|
|
walk(game_over_naethvjirr);
|
|
|
return;
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
final_battle.passturn(final_battle);
|
|
|
p("Вы оправились от атаки Наэтвьирра и снова можете действовать. ");
|
|
|
elseif (s.throw <= 0) then
|
|
|
-- Отбрасываем игрока
|
|
|
s.throw = 4;
|
|
|
fb_throwAway(pl);
|
|
|
p("Наэтвьирр отправляет в вас мощную волну воздуха, которая отбрасывает вас в сторону. ");
|
|
|
|
|
|
if (rnd(4) > 1) then -- 75%
|
|
|
pl.hitpoints = pl.hitpoints - 1;
|
|
|
p("Вы чувствуете, что атака не прошла для вас бесследно. ");
|
|
|
if (pl.hitpoints <= 0) then
|
|
|
walk(game_over_naethvjirr);
|
|
|
return;
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
|
onhit = function(s)
|
|
|
local result = "";
|
|
|
|
|
|
s.hitpoints = s.hitpoints - 1;
|
|
|
if (s.hitpoints == 2) then
|
|
|
result = "Сильный удар повреждает Наэтвьирра, но вы не замечаете, сказалось ли это на его работоспособности. ";
|
|
|
elseif (s.hitpoints == 1) then
|
|
|
result = "Наэтвьирр пошатнулся от вашего удара, давая понять, что попадание не прошло бесследно. ";
|
|
|
elseif (s.hitpoints == 0) then
|
|
|
result = "После вашего удара глаза Наэтвьирра гаснут и конструкт с грохотом падает рядом со своим троном. ";
|
|
|
end;
|
|
|
p(result);
|
|
|
final_battle.passturn(final_battle);
|
|
|
end;
|
|
|
onshoot = function(s)
|
|
|
local hit = false;
|
|
|
if (pl.position[1] == 1 and pl.position[2] == 1) then
|
|
|
hit = (rnd(4) > 1);
|
|
|
else
|
|
|
hit = (rnd(2) > 1);
|
|
|
end;
|
|
|
|
|
|
local result = "";
|
|
|
if (hit) then
|
|
|
s.hitpoints = s.hitpoints - 1;
|
|
|
if (s.hitpoints == 2) then
|
|
|
result = "Ваш выстрел повреждает Наэтвьирра, но вы не замечаете, сказалось ли это на его работоспособности. ";
|
|
|
elseif (s.hitpoints == 1) then
|
|
|
result = "Глаза Наэтвьирра на мгновение моргают, давая понять, что попадание не прошло бесследно. ";
|
|
|
elseif (s.hitpoints == 0) then
|
|
|
result = "Глаза Наэтвьирра гаснут и конструкт с грохотом падает рядом со своим троном. ";
|
|
|
end;
|
|
|
else
|
|
|
result = "Пуля пролетает мимо конструкта, не причинив ему никакого вреда. ";
|
|
|
end;
|
|
|
pn(result);
|
|
|
final_battle.passturn(final_battle);
|
|
|
end;
|
|
|
dsc = function(s)
|
|
|
if (s.hitpoints > 0) then
|
|
|
local shield = "";
|
|
|
if (s.shield) then
|
|
|
shield = "Вокруг него едва заметно силовое поле, защищающее его от физических повреждений. ";
|
|
|
end;
|
|
|
return "В центре зала перед массивной конструкцией, напоминающей трон, стоит {навьяр}. Конструкт выглядит совершенно как живой, сияющие красноватым светом глаза внимательно следят за вашими действиями. ".. shield .."^";
|
|
|
else
|
|
|
--return "В центре зала рядом с массивной конструкцией, напоминающей трон, лежит сильно поврежденный {навьяр-конструкт}. ^";
|
|
|
return "";
|
|
|
end;
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
fb_black = obj {
|
|
|
nam = "fb_black";
|
|
|
position = 4;
|
|
|
bullets = 6; -- потребуется перезарядка, если потратит все 6 патронов. Скорее всего до этого никогда не дойдет, но предусмотреть стоит
|
|
|
hitpoints = 1;
|
|
|
disp2 = "Блэка";
|
|
|
canshoot = function(s)
|
|
|
if (pl.position[1] == 1 and pl.position[2] == 1) then
|
|
|
return true;
|
|
|
else
|
|
|
return false;
|
|
|
end;
|
|
|
end;
|
|
|
noshootmsg = "Вы не попадете в него. ";
|
|
|
nohitmsg = "Для этого до него еще надо добраться. ";
|
|
|
dsc = function(s)
|
|
|
if (s.hitpoints > 0) then
|
|
|
return "{Адриан Блэк} укрылся от вас за троном. ^";
|
|
|
end;
|
|
|
end;
|
|
|
onshoot = function(s)
|
|
|
if (rnd(2) > 1) then--50%
|
|
|
s.hitpoints = 0;
|
|
|
p("Вы раните Блэка в плечо, он роняет пистолет и скрывается за троном. Более он не опасен. ");
|
|
|
else
|
|
|
p("Ваша пуля пролетает мимо, не причинив Блэку никакого вреда. ");
|
|
|
end;
|
|
|
final_battle.passturn(final_battle);
|
|
|
end;
|
|
|
passturn = function(s)
|
|
|
if (s.hitpoints > 0) then
|
|
|
if (s.bullets > 0) then
|
|
|
if (pl.position[1] == 1 and pl.position[2] == 1) then
|
|
|
-- Стреляем в игрока
|
|
|
p("Блэк стреляет в вас. ");
|
|
|
if (rnd(4) > 1) then--75%
|
|
|
pl.hitpoints = pl.hitpoints - 1;
|
|
|
if (pl.hitpoints > 0) then
|
|
|
p("Пуля лишь слегка задевает вас, практически не нанеся урона. ");
|
|
|
else
|
|
|
walk(game_over_shot_fb);
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
|
else
|
|
|
-- Перезаряжаем
|
|
|
s.bullets = 6;
|
|
|
p("Адриан Блэк перезаряжает револьвер. ");
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
fb_pylons = obj {
|
|
|
nam = "fb_pylons";
|
|
|
position = "с";
|
|
|
state = 2;--Количество активных пилонов
|
|
|
charging = 0;
|
|
|
canhit = true;
|
|
|
noshootmsg = "Вы не попадете в них";
|
|
|
onhit = function(s)
|
|
|
if (s.state > 0) then
|
|
|
if (pl.position[1] == 1 and pl.position[2] == 1) then
|
|
|
s.state = s.state - 1;
|
|
|
if (s.state == 0) then
|
|
|
-- Если оба пилона уничтожены, нет смысла передавать им энергию.
|
|
|
for i = 0, #final_battle.generators do
|
|
|
if (final_battle.generators[i] == 5) then
|
|
|
final_battle.generators[i] = 1;
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
|
p("Ударом по металлическому стержню, вы выводите из строя один из пилонов");
|
|
|
final_battle.passturn(final_battle);
|
|
|
else
|
|
|
return "Пилоны слишком далеко от вас";
|
|
|
end;
|
|
|
else
|
|
|
return "Оба пилона уже выведены из строя";
|
|
|
end;
|
|
|
end;
|
|
|
passturn = function(s)
|
|
|
for i = 1, #final_battle.generators do
|
|
|
if (final_battle.generators[i] == 5) then
|
|
|
s.charging = s.charging + 1;
|
|
|
end;
|
|
|
end;
|
|
|
if (s.charging >= 10) then
|
|
|
pl.hitpoints = 0;
|
|
|
walk(game_over_pylon);
|
|
|
end;
|
|
|
end;
|
|
|
dsc = function(s)
|
|
|
if (s.state == 2) then
|
|
|
return "В центральной части комнаты расположены два {пилона} высотой около метра. На вершине их установлены сверкающие металлические стержни.^";
|
|
|
elseif (s.state == 1) then
|
|
|
return "В центральной части комнаты расположены два {пилона} высотой около метра. На вершине одного из пилонов установлен сверкающий металлический стержень. Стержень на втором пилоне сильно погнут и выведен из строя.^";
|
|
|
elseif (s.state == 0) then
|
|
|
return "В центральной части комнаты расположены два пилона высотой около метра. Металлические стержни, установленные в их вершине сильно повреждены.^";
|
|
|
end;
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
fb_throwAway = function(target)
|
|
|
local positions = {};
|
|
|
if (target.position[1] - 1 >= 0) then
|
|
|
if (target.position[2] - 1 >= 0) then
|
|
|
positions[#positions + 1] = {target.position[1] - 1, target.position[2] - 1};
|
|
|
end;
|
|
|
positions[#positions + 1] = {target.position[1] - 1, target.position[2]};
|
|
|
if (target.position[2] + 1 <= 2) then
|
|
|
positions[#positions + 1] = {target.position[1] - 1, target.position[2] + 1};
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
if (target.position[2] - 1 >= 0) then
|
|
|
positions[#positions + 1] = {target.position[1], target.position[2] - 1};
|
|
|
end;
|
|
|
if (target.position[2] + 1 <= 2) then
|
|
|
positions[#positions + 1] = {target.position[1], target.position[2] + 1};
|
|
|
end;
|
|
|
|
|
|
if (target.position[1] + 1 <= 2) then
|
|
|
if (target.position[2] - 1 >= 0) then
|
|
|
positions[#positions + 1] = {target.position[1] + 1, target.position[2] - 1};
|
|
|
end;
|
|
|
positions[#positions + 1] = {target.position[1] + 1, target.position[2]};
|
|
|
if (target.position[2] + 1 <= 2) then
|
|
|
positions[#positions + 1] = {target.position[1] + 1, target.position[2] + 1};
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
target.position = positions[rnd(#positions)];
|
|
|
end;
|
|
|
|
|
|
fb_getGeneratorIcon = function(value)
|
|
|
if (value == 0) then
|
|
|
return "images/fb_inactive.png";
|
|
|
elseif (value == 1) then
|
|
|
return "images/fb_awake.png";
|
|
|
elseif (value == 2) then
|
|
|
return "images/fb_shield.png";
|
|
|
elseif (value == 3) then
|
|
|
return "images/fb_throw.png";
|
|
|
elseif (value == 4) then
|
|
|
return "images/fb_charge.png";
|
|
|
elseif (value == 5) then
|
|
|
return "images/fb_pylon.png";
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
final_battle = room {
|
|
|
nam = "final_battle";
|
|
|
pic = function(s)
|
|
|
local image = 'images/fb_bcg.png';
|
|
|
image = image .. ";" .. fb_getGeneratorIcon(s.generators[1]) .. "@48,0";
|
|
|
image = image .. ";" .. fb_getGeneratorIcon(s.generators[2]) .. "@96,0";
|
|
|
image = image .. ";" .. fb_getGeneratorIcon(s.generators[3]) .. "@96,48";
|
|
|
image = image .. ";" .. fb_getGeneratorIcon(s.generators[4]) .. "@96,96";
|
|
|
image = image .. ";" .. fb_getGeneratorIcon(s.generators[5]) .. "@48,96";
|
|
|
image = image .. ";" .. fb_getGeneratorIcon(s.generators[6]) .. "@0,96";
|
|
|
image = image .. ";" .. fb_getGeneratorIcon(s.generators[7]) .. "@0,48";
|
|
|
image = image .. ";" .. fb_getGeneratorIcon(s.generators[8]) .. "@0,0";
|
|
|
if (fb_naethvjirr.hitpoints > 0) then
|
|
|
image = image .. ";images/fb_naethvjirr.png@64,80";
|
|
|
end;
|
|
|
if (fb_black.hitpoints > 0) then
|
|
|
image = image .. ";images/fb_black.png@80,80";
|
|
|
end;
|
|
|
image = image .. ";images/fb_player.png@"..tostring(pl.position[1] * 48 + 16)..","..tostring((2 - pl.position[2]) * 48 + 16);
|
|
|
if (fb_pylons.state > 1) then
|
|
|
image = image .. ";images/fb_pylon.png@48,64";
|
|
|
else
|
|
|
image = image .. ";images/fb_inactive.png@48,64";
|
|
|
end;
|
|
|
if (fb_pylons.state > 0) then
|
|
|
image = image .. ";images/fb_pylon.png@80,64";
|
|
|
else
|
|
|
image = image .. ";images/fb_inactive.png@80,64";
|
|
|
end;
|
|
|
return image;
|
|
|
end;
|
|
|
disp = "Лсэрианотр, центральный зал";
|
|
|
awakening = 300;
|
|
|
dsc = function(s)
|
|
|
local temp = "";
|
|
|
if (pl.position[1] == 1 and pl.position[2] == 2) then
|
|
|
temp = "северной";
|
|
|
elseif (pl.position[1] == 2 and pl.position[2] == 2) then
|
|
|
temp = "северо-восточной";
|
|
|
elseif (pl.position[1] == 2 and pl.position[2] == 1) then
|
|
|
temp = "восточной";
|
|
|
elseif (pl.position[1] == 2 and pl.position[2] == 0) then
|
|
|
temp = "юго-восточной";
|
|
|
elseif (pl.position[1] == 1 and pl.position[2] == 0) then
|
|
|
temp = "южной";
|
|
|
elseif (pl.position[1] == 0 and pl.position[2] == 0) then
|
|
|
temp = "юго-западной";
|
|
|
elseif (pl.position[1] == 0 and pl.position[2] == 1) then
|
|
|
temp = "западной";
|
|
|
elseif (pl.position[1] == 0 and pl.position[2] == 2) then
|
|
|
temp = "северо-западной";
|
|
|
elseif (pl.position[1] == 1 and pl.position[2] == 1) then
|
|
|
temp = "центральной";
|
|
|
end;
|
|
|
|
|
|
local debug_str = tostring(s.awakening) .. " ";
|
|
|
debug_str = debug_str .. tostring(fb_pylons.charging) .. " ";
|
|
|
|
|
|
return "Вы находитесь в " .. temp .. " части главного зала древнего города Навьяр. На схеме приведено расположение важных объектов в комнате, включая символы, изображенные на генераторах" .. debug_str;
|
|
|
--Вдоль стен стоят огромные металлические шкафы, из которых тысячи проводом тянутся к громадной конструкции в центре зала. Мягкий свет льется сверху, практически ослепляя вас после полумрака остальной части мертвого города. "
|
|
|
--]];
|
|
|
end;
|
|
|
left = function(s)
|
|
|
lifeoff(s);
|
|
|
end;
|
|
|
entered = function(s)
|
|
|
-- Здесь будем собирать все необходимое для начала финальной битвы: сопартийцы отыграют свою роль, после чего начнется битва не на жизнь, а на смерть.
|
|
|
s.entered = nil; -- Должно отработать не более одного раза
|
|
|
pl.position = {1,2};
|
|
|
local throw = rnd(8);
|
|
|
while (s.generators[throw] ~= 1) do
|
|
|
throw = rnd(8);
|
|
|
end;
|
|
|
s.generators[throw] = 3;
|
|
|
|
|
|
local shield = rnd(8);
|
|
|
while (s.generators[shield] ~= 1) do
|
|
|
shield = rnd(8);
|
|
|
end;
|
|
|
s.generators[shield] = 2;
|
|
|
|
|
|
local charge = rnd(8);
|
|
|
while (s.generators[charge] ~= 1) do
|
|
|
charge = rnd(8);
|
|
|
end;
|
|
|
s.generators[charge] = 4;
|
|
|
|
|
|
local pylon = rnd(8);
|
|
|
while (s.generators[pylon] ~= 1) do
|
|
|
pylon = rnd(8);
|
|
|
end;
|
|
|
s.generators[pylon] = 5;
|
|
|
|
|
|
lifeon(s);
|
|
|
end;
|
|
|
life = function(s)
|
|
|
fb_north:enable();
|
|
|
fb_northeast:enable();
|
|
|
fb_east:enable();
|
|
|
fb_southeast:enable();
|
|
|
fb_south:enable();
|
|
|
fb_southwest:enable();
|
|
|
fb_west:enable();
|
|
|
fb_northwest:enable();
|
|
|
|
|
|
if (pl.position[2] == 2) then
|
|
|
fb_north:disable();
|
|
|
fb_northeast:disable();
|
|
|
fb_northwest:disable();
|
|
|
elseif (pl.position[2] == 0) then
|
|
|
fb_south:disable();
|
|
|
fb_southeast:disable();
|
|
|
fb_southwest:disable();
|
|
|
end;
|
|
|
|
|
|
if (pl.position[1] == 2) then
|
|
|
fb_east:disable();
|
|
|
fb_northeast:disable();
|
|
|
fb_southeast:disable();
|
|
|
elseif (pl.position[1] == 0) then
|
|
|
fb_west:disable();
|
|
|
fb_northwest:disable();
|
|
|
fb_southwest:disable();
|
|
|
end;
|
|
|
|
|
|
fb_generator:enable();
|
|
|
if (pl.position[1] == 1 and pl.position[2] == 2) then
|
|
|
fb_generator.index = 1;
|
|
|
elseif (pl.position[1] == 2 and pl.position[2] == 2) then
|
|
|
fb_generator.index = 2;
|
|
|
elseif (pl.position[1] == 2 and pl.position[2] == 1) then
|
|
|
fb_generator.index = 3;
|
|
|
elseif (pl.position[1] == 2 and pl.position[2] == 0) then
|
|
|
fb_generator.index = 4;
|
|
|
elseif (pl.position[1] == 1 and pl.position[2] == 0) then
|
|
|
fb_generator.index = 5;
|
|
|
elseif (pl.position[1] == 0 and pl.position[2] == 0) then
|
|
|
fb_generator.index = 6;
|
|
|
elseif (pl.position[1] == 0 and pl.position[2] == 1) then
|
|
|
fb_generator.index = 7;
|
|
|
elseif (pl.position[1] == 0 and pl.position[2] == 2) then
|
|
|
fb_generator.index = 8;
|
|
|
elseif (pl.position[1] == 1 and pl.position[2] == 1) then
|
|
|
fb_generator:disable();
|
|
|
end;
|
|
|
|
|
|
local activeGens = false;
|
|
|
for i = 1, #s.generators do
|
|
|
if (s.generators[i] ~= 0) then
|
|
|
activeGens = true;
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
if (not activeGens) then
|
|
|
walk(game_over_victory);
|
|
|
end;
|
|
|
end;
|
|
|
passturn = function(s)
|
|
|
-- реальный расчет боевых действий будет в этой функции
|
|
|
for i = 1,#s.generators do
|
|
|
if (s.generators[i] == 1) then
|
|
|
s.awakening = s.awakening - 10;
|
|
|
end;
|
|
|
end;
|
|
|
for i = 1,#s.obj do
|
|
|
if (s.obj[i].passturn) then
|
|
|
s.obj[i].passturn(s.obj[i]);
|
|
|
end;
|
|
|
end;
|
|
|
if (s.awakening <= 0) then
|
|
|
walk(game_over_awakening);
|
|
|
end;
|
|
|
end;
|
|
|
generators = {
|
|
|
1, 1, 1, 1, 1, 1, 1, 1
|
|
|
-- В этот массив заносятся состояния генераторов: a - active, i - inactive, t - throw, s - shield, c - charge, p - pylon
|
|
|
-- Состояния генераторов записываются цифрами по приоритету от минимального до максимального(чем больше цифра, тем больше приоритет)
|
|
|
-- 0 - inactive, 1 - active, 2 - shield, 3 - throw, 4 - charge, 5 - pylon
|
|
|
};
|
|
|
obj = {
|
|
|
'fb_pylons',
|
|
|
'fb_naethvjirr',
|
|
|
'fb_black',
|
|
|
'fb_generator',
|
|
|
|
|
|
'fb_north',
|
|
|
'fb_northeast',
|
|
|
'fb_east',
|
|
|
'fb_southeast',
|
|
|
'fb_south',
|
|
|
'fb_southwest',
|
|
|
'fb_west',
|
|
|
'fb_northwest'
|
|
|
};
|
|
|
};
|
|
|
|
|
|
fb_generator = obj {
|
|
|
nam = "fb_generator",
|
|
|
dsc = function(s)
|
|
|
if (final_battle.generators[s.index] == 0) then
|
|
|
return "Рядом с вами расположен огромный металлический {шкаф}, искореженный несколькими ударами тяжелого предмета. Судя по всему этот генератор выведен из строя. ^";
|
|
|
else
|
|
|
return "Рядом с вами расположен огромный металлический {шкаф}, расположенный рядом с вами издает негромкий гул. На его передней стенке виден светящийся символ. Конструкция соединена толстыми проводами с троном Наэтвьирра, в центре зала. ^";
|
|
|
end;
|
|
|
end;
|
|
|
index = 0;
|
|
|
act = "Вы ничего не сможете сделать с генератором без дополнительных приспособлений";
|
|
|
noshootmsg = "Это бесполезно";
|
|
|
canhit = true;
|
|
|
onhit = function(s)
|
|
|
--[[
|
|
|
Модули питания могут быть назначены на одну из нескольких подсистем.
|
|
|
Для питания каждой подсистемы требуется минимум один источник ее питания. Всего подсистемы следующие: пилоны, щит, разряд, разброс и пробуждение.
|
|
|
Приоритеты распределения таковы:
|
|
|
Всегда должна быть активна минимум одна атакующая подсистема, в порядке эффективности: пилоны, разряд, разброс.
|
|
|
Если для атакующих подсистем достаточно энергии, то активен и щит.
|
|
|
Наименьшим приоритетом обладает пробуждение.
|
|
|
Также учитывается возможность и целесообразность применения защитных и атакующих подсистем:
|
|
|
Если аватар уничтожен, нет смысла поддерживать щит, разброс и разряд.
|
|
|
]]
|
|
|
local gen = final_battle.generators[s.index];
|
|
|
final_battle.generators[s.index] = 0;
|
|
|
local moreInfo = "";
|
|
|
if (gen == 5) then
|
|
|
--Как самая эффективная система атаки, пилоны всегда заряжаются, независимо от обстоятельств
|
|
|
fb_pylons.charging = fb_pylons.charging - 4;
|
|
|
if (fb_pylons.charging < 0) then
|
|
|
fb_pylons.charging = 0;
|
|
|
end;
|
|
|
local priorityToReplace = 4;
|
|
|
local activeCount = 0;
|
|
|
for i = 1,#final_battle.generators do
|
|
|
if (final_battle.generators[i] ~= 0 and final_battle.generators[i] <= priorityToReplace) then
|
|
|
activeCount = activeCount + 1;
|
|
|
if (final_battle.generators[i] < priorityToReplace) then
|
|
|
priorityToReplace = final_battle.generators[i];
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
|
if (activeCount > 0) then
|
|
|
local replacementIndex = rnd(8);
|
|
|
while (final_battle.generators[replacementIndex] ~= priorityToReplace) do
|
|
|
replacementIndex = rnd(8);
|
|
|
end;
|
|
|
final_battle.generators[replacementIndex] = gen;
|
|
|
end;
|
|
|
elseif (gen == 4) then
|
|
|
fb_naethvjirr.charge = fb_naethvjirr.charge + 1;
|
|
|
local priorityToReplace = 3;
|
|
|
local activeCount = 0;
|
|
|
for i = 1,#final_battle.generators do
|
|
|
if (final_battle.generators[i] ~= 0 and final_battle.generators[i] <= priorityToReplace) then
|
|
|
activeCount = activeCount + 1;
|
|
|
if (final_battle.generators[i] < priorityToReplace) then
|
|
|
priorityToReplace = final_battle.generators[i];
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
|
if (activeCount > 0) then
|
|
|
local replacementIndex = rnd(8);
|
|
|
while (final_battle.generators[replacementIndex] ~= priorityToReplace) do
|
|
|
replacementIndex = rnd(8);
|
|
|
end;
|
|
|
final_battle.generators[replacementIndex] = gen;
|
|
|
end;
|
|
|
elseif (gen == 3) then
|
|
|
fb_naethvjirr.throw = fb_naethvjirr.throw + 1;
|
|
|
local priorityToReplace = 2;
|
|
|
local activeCount = 0;
|
|
|
for i = 1,#final_battle.generators do
|
|
|
if (final_battle.generators[i] ~= 0 and final_battle.generators[i] <= priorityToReplace) then
|
|
|
activeCount = activeCount + 1;
|
|
|
if (final_battle.generators[i] < priorityToReplace) then
|
|
|
priorityToReplace = final_battle.generators[i];
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
|
if (activeCount > 0) then
|
|
|
local replacementIndex = rnd(8);
|
|
|
while (final_battle.generators[replacementIndex] ~= priorityToReplace) do
|
|
|
replacementIndex = rnd(8);
|
|
|
end;
|
|
|
final_battle.generators[replacementIndex] = gen;
|
|
|
end;
|
|
|
elseif (gen == 2) then
|
|
|
fb_naethvjirr.shield = false;
|
|
|
moreInfo = "Щит вокруг Наэтвьирра растворяется, оставляя конструкта открытым для ваших атак. ";
|
|
|
local priorityToReplace = 1;
|
|
|
local activeCount = 0;
|
|
|
for i = 1,#final_battle.generators do
|
|
|
if (final_battle.generators[i] ~= 0 and final_battle.generators[i] <= priorityToReplace) then
|
|
|
activeCount = activeCount + 1;
|
|
|
if (final_battle.generators[i] < priorityToReplace) then
|
|
|
priorityToReplace = final_battle.generators[i];
|
|
|
end;
|
|
|
end;
|
|
|
end;
|
|
|
if (activeCount > 0) then
|
|
|
local replacementIndex = rnd(8);
|
|
|
while (final_battle.generators[replacementIndex] ~= priorityToReplace) do
|
|
|
replacementIndex = rnd(8);
|
|
|
end;
|
|
|
final_battle.generators[replacementIndex] = gen;
|
|
|
end;
|
|
|
elseif (gen == 0) then
|
|
|
return "Генератор итак выведен из строя, незачем его дальше колотить. ";
|
|
|
end;
|
|
|
p("После нескольких сильных ударов генератор затихает. ".. moreInfo);
|
|
|
final_battle.passturn(final_battle);
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
fb_north = obj {
|
|
|
nam = "north",
|
|
|
dsc = "{На север}",
|
|
|
act = function(s)
|
|
|
pl.position[2] = pl.position[2] + 1;
|
|
|
p("Вы идете на север");
|
|
|
final_battle.passturn(final_battle);
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
fb_northeast = obj {
|
|
|
nam = "northeast",
|
|
|
dsc = "{На северо-восток}",
|
|
|
act = function(s)
|
|
|
pl.position[1] = pl.position[1] + 1;
|
|
|
pl.position[2] = pl.position[2] + 1;
|
|
|
p("Вы идете на северо-восток.");
|
|
|
final_battle.passturn(final_battle);
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
fb_east = obj {
|
|
|
nam = "east",
|
|
|
dsc = "{На восток}",
|
|
|
act = function(s)
|
|
|
pl.position[1] = pl.position[1] + 1;
|
|
|
p("Вы идете на восток.");
|
|
|
final_battle.passturn(final_battle);
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
fb_southeast = obj {
|
|
|
nam = "southeast",
|
|
|
dsc = "{На юго-восток}",
|
|
|
act = function(s)
|
|
|
pl.position[1] = pl.position[1] + 1;
|
|
|
pl.position[2] = pl.position[2] - 1;
|
|
|
p("Вы идете на юго-восток.");
|
|
|
final_battle.passturn(final_battle);
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
fb_south = obj {
|
|
|
nam = "south",
|
|
|
dsc = "{На юг}",
|
|
|
act = function(s)
|
|
|
pl.position[2] = pl.position[2] - 1;
|
|
|
p("Вы идете на юг.");
|
|
|
final_battle.passturn(final_battle);
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
fb_southwest = obj {
|
|
|
nam = "southwest",
|
|
|
dsc = "{На юго-запад}",
|
|
|
act = function(s)
|
|
|
pl.position[1] = pl.position[1] - 1;
|
|
|
pl.position[2] = pl.position[2] - 1;
|
|
|
p("Вы идете на юго-запад.");
|
|
|
final_battle.passturn(final_battle);
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
fb_west = obj {
|
|
|
nam = "west",
|
|
|
dsc = "{На запад}",
|
|
|
act = function(s)
|
|
|
pl.position[1] = pl.position[1] - 1;
|
|
|
p("Вы идете на запад.");
|
|
|
final_battle.passturn(final_battle);
|
|
|
end;
|
|
|
};
|
|
|
|
|
|
fb_northwest = obj {
|
|
|
nam = "northwest",
|
|
|
dsc = "{На северо-запад}",
|
|
|
act = function(s)
|
|
|
pl.position[1] = pl.position[1] - 1;
|
|
|
pl.position[2] = pl.position[2] + 1;
|
|
|
p("Вы идете на северо-запад.");
|
|
|
final_battle.passturn(final_battle);
|
|
|
end;
|
|
|
};
|
|
\ No newline at end of file
|