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" }; way = { kh_vroom("В коридор", "lse_leviathan_corridor"); }; }; lse_leviathan_corridor = room { nam = "lse_leviathan_corridor"; disp = "Левиафан, коридор"; dsc = [[ Фаэтларр находится в основном коридоре Левиафана. Длинный металлический коридор освещен ярким светом электрических ламп. По левому борту расположены двери кают. Одна из них была выделена Фаэтларру и навьяр на некоторое время задержал взгляд на ней - дверь ничем не отличалась от соседних, за исключением цифры "5", нарисованной на ней белой краской. ]]; 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; use = 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_1"; 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 [[Фаэтларр пытается открыть панель руками, но ничего не получается. ]]; else walkin("lse_dock_in_panel"); end; end; }; lse_dock_in_panel = room { var { state = 0; index = 0; cut = nil; }; nam = "lse_dock_in_panel"; disp = "Лсэрианотр, док, панель управления дверью"; entered = function(s) if (s.state == 0) then s.state = 1; s.index = rnd(7) - 1; end; end; pic = function(s) local pic = "images/lse_door_bcg.gif;images/lse_door_marker.png@496," .. tostring(3 + 38 * s.index); return pic; end; dsc = [[За панелью скрывается множество проводов. Фаэтларр легко определяет, какой из них задействован в управлении дверью.]]; obj = { 'lse_dock_cut1', 'lse_dock_cut2', 'lse_dock_cut3', 'lse_dock_cut4', 'lse_dock_cut5', 'lse_dock_cut6', 'lse_dock_cut7', 'lse_dock_back' }; }; lse_dock_cut1 = obj { nam = "lse_dock_cut1"; dsc = "{Обрезать фиолетово-синий провод}^"; act = function(s) if (lse_dock_in_panel.index == 3) then lse_dock.state = 1; pr [[Фаэтларр перерезает провод и дверь открывается. ]]; walk("lse_dock"); elseif (lse_dock_in_panel.cut == nil) then lse_dock_in_panel.cut = 3; pr [[Фаэтларр перерезает провод. Свет в помещении моргает. Рядом с панелью начинает мигать красная лампочка. ]]; elseif (lse_dock_in_panel.cut == 3) then pr [[Этот провод уже перерезан. ]]; else walk("game_over_phaetlarr_wrong_wire"); end; end; }; lse_dock_cut2 = obj { nam = "lse_dock_cut2"; dsc = "{Обрезать фиолетово-зеленый провод}^"; act = function(s) if (lse_dock_in_panel.index == 0) then lse_dock.state = 1; pr [[Фаэтларр перерезает провод и дверь открывается. ]]; walk("lse_dock"); elseif (lse_dock_in_panel.cut == nil) then lse_dock_in_panel.cut = 0; pr [[Фаэтларр перерезает провод. Свет в помещении моргает. Рядом с панелью начинает мигать красная лампочка. ]]; elseif (lse_dock_in_panel.cut == 0) then pr [[Этот провод уже перерезан. ]]; else walk("game_over_phaetlarr_wrong_wire"); end; end; }; lse_dock_cut3 = obj { nam = "lse_dock_cut3"; dsc = "{Обрезать фиолетово-желтый провод}^"; act = function(s) if (lse_dock_in_panel.index == 4) then lse_dock.state = 1; pr [[Фаэтларр перерезает провод и дверь открывается. ]]; walk("lse_dock"); elseif (lse_dock_in_panel.cut == nil) then lse_dock_in_panel.cut = 4; pr [[Фаэтларр перерезает провод. Свет в помещении моргает. Рядом с панелью начинает мигать красная лампочка. ]]; elseif (lse_dock_in_panel.cut == 4) then pr [[Этот провод уже перерезан. ]]; else walk("game_over_phaetlarr_wrong_wire"); end; end; }; lse_dock_cut4 = obj { nam = "lse_dock_cut4"; dsc = "{Обрезать фиолетово-оранжевый провод}^"; act = function(s) if (lse_dock_in_panel.index == 1) then lse_dock.state = 1; pr [[Фаэтларр перерезает провод и дверь открывается. ]]; walk("lse_dock"); elseif (lse_dock_in_panel.cut == nil) then lse_dock_in_panel.cut = 1; pr [[Фаэтларр перерезает провод. Свет в помещении моргает. Рядом с панелью начинает мигать красная лампочка. ]]; elseif (lse_dock_in_panel.cut == 1) then pr [[Этот провод уже перерезан. ]]; else walk("game_over_phaetlarr_wrong_wire"); end; end; }; lse_dock_cut5 = obj { nam = "lse_dock_cut5"; dsc = "{Обрезать фиолетово-красный провод}^"; act = function(s) if (lse_dock_in_panel.index == 2) then lse_dock.state = 1; pr [[Фаэтларр перерезает провод и дверь открывается. ]]; walk("lse_dock"); elseif (lse_dock_in_panel.cut == nil) then lse_dock_in_panel.cut = 2; pr [[Фаэтларр перерезает провод. Свет в помещении моргает. Рядом с панелью начинает мигать красная лампочка. ]]; elseif (lse_dock_in_panel.cut == 2) then pr [[Этот провод уже перерезан. ]]; else walk("game_over_phaetlarr_wrong_wire"); end; end; }; lse_dock_cut6 = obj { nam = "lse_dock_cut6"; dsc = "{Обрезать сине-зеленый провод}^"; act = function(s) if (lse_dock_in_panel.index == 6) then lse_dock.state = 1; pr [[Фаэтларр перерезает провод и дверь открывается. ]]; walk("lse_dock"); elseif (lse_dock_in_panel.cut == nil) then lse_dock_in_panel.cut = 6; pr [[Фаэтларр перерезает провод. Свет в помещении моргает. Рядом с панелью начинает мигать красная лампочка. ]]; elseif (lse_dock_in_panel.cut == 6) then pr [[Этот провод уже перерезан. ]]; else walk("game_over_phaetlarr_wrong_wire"); end; end; }; lse_dock_cut7 = obj { nam = "lse_dock_cut7"; dsc = "{Обрезать сине-желтый провод}^"; act = function(s) if (lse_dock_in_panel.index == 5) then lse_dock.state = 1; pr [[Фаэтларр перерезает провод и дверь открывается. ]]; walk("lse_dock"); elseif (lse_dock_in_panel.cut == nil) then lse_dock_in_panel.cut = 5; pr [[Фаэтларр перерезает провод. Свет в помещении моргает. Рядом с панелью начинает мигать красная лампочка. ]]; elseif (lse_dock_in_panel.cut == 5) then pr [[Этот провод уже перерезан. ]]; else walk("game_over_phaetlarr_wrong_wire"); end; end; }; lse_dock_back = obj { nam = "lse_dock_back"; dsc = "{Отойти от панели}^"; act = function(s) walk("lse_dock"); end; }; 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("В сервисный тоннель", "lse_outer_service_entrance"):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; use = 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 == 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 = [["Приложить бы его чем-нибудь, чтобы не мешался", - мелькнула мысль в голове Фаэтларра. ]]; use = function(s, o) if (s.state == 0 and o == lse_item_toolbox) then s.state = 0; 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, "lse_prison_fight"); lse_prison_fight = battlefield { nam = "lse_prison_fight"; disp = "Лсэрианотр, тюрьма"; hideinv = true; lose = "game_over_lse_prison_fight"; win = "lse_prison_fight_victory"; plX = 3; plY = 1; entered = function(s) move(player_drake, here()); remove(player_phaetlarr); pl = player_drake; end; obj = { --'lse_cmbt_learr', 'lse_cmbt_phaetlarr', --'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"; disp2 = "Леарр"; disp3 = "Леарр"; x = 1; y = 2; pic = "images/learr.png"; ally = "Я не буду атаковать союзника."; nohit = "Я не буду атаковать союзника."; noshoot = "Я не буду атаковать союзника."; hp = 10; hasSpear = false; 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 table.insert(enemies, obj); end; end; if (#enemies == 0) then return; end; table.sort(enemies, function(a, b) return (here().getDistance(s.x, s.y, b.x, b.y) > here().getDistance(s.x, s.y, a.x, a.y)); end); local enemy = enemies[1]; local dist = here().getDistance(s.x, s.y, enemy.x, enemy.y); -- 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 and dist == 1) then if (rnd(4) > 1) then pn("Леарр бьет " .. enemy.disp2 .. " копьем и попадает. "); enemy.hp = enemy.hp - 2; else pn("Леарр бьет " .. enemy.disp2 .. " копьем, но промахивается. "); end; elseif (s.hasSpear and dist == 0) then enemy.hp = enemy.hp - 2; pn("Леарр бьет " .. enemy.disp2 .. " копьем и попадает. "); elseif dist == 0 then enemy.hp = enemy.hp - 1; pn("Леарр бьет " .. enemy.disp2 .. " и попадает. "); else if (enemy.x > s.x) then s.x = s.x + 1; elseif (enemy.x < s.x) then s.x = s.x - 1; end; if (enemy.y > s.y) then s.y = s.y + 1; elseif (enemy.y < s.y) then s.y = s.y - 1; end; pn("Леарр идет к " .. enemy.disp3 .. ". "); end; end; dsc = function(s) if (s.hp > 0) then return [[ {Леарр} готова к бою. ]]; else return [[ {Леарр} без сознания. ]]; end; end; }; lse_cmbt_phaetlarr = combatant { nam = "lse_cmbt_phaetlarr"; disp2 = "Фаэтларра"; disp3 = "Фаэтларру"; x = 3; y = 5; pic = "images/phaetlarr.png"; ally = "Я не буду атаковать союзника."; nohit = "Я не буду атаковать союзника."; noshoot = "Я не буду атаковать союзника."; hp = 10; hasSpear = false; 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 table.insert(enemies, obj); end; end; if (#enemies == 0) then return; end; table.sort(enemies, function(a, b) return (here().getDistance(s.x, s.y, b.x, b.y) > here().getDistance(s.x, s.y, a.x, a.y)); end); local enemy = enemies[1]; local dist = here().getDistance(s.x, s.y, enemy.x, enemy.y); -- 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 and dist == 1) then if (rnd(4) > 1) then pn("Фаэтларр бьет " .. enemy.disp2 .. " копьем и попадает. "); enemy.hp = enemy.hp - 2; else pn("Фаэтларр бьет " .. enemy.disp2 .. " копьем, но промахивается. "); end; elseif (s.hasSpear and dist == 0) then enemy.hp = enemy.hp - 2; pn("Фаэтларр бьет " .. enemy.disp2 .. " копьем и попадает. "); elseif (s.hasSpear and dist < 4) then s.hasSpear = false; if (rnd(4) > dist) then enemy.hp = enemy.hp - 2; pn("Фаэтларр бросает копье в " .. enemy.disp2 .. " и попадает. "); else pn("Фаэтларр бросает копье в " .. enemy.disp2 .. ", но промахивается. "); end; elseif dist == 0 then if (enemy.hasSpear) then enemy.hasSpear = false; s.hasSpear = true; pn("Фаэтларр забирает копье у " .. enemy.disp2 .. ". "); else enemy.hp = enemy.hp - 1; pn("Фаэтларр бьет " .. enemy.disp2 .. " и попадает. "); end; else if (enemy.x > s.x) then s.x = s.x + 1; elseif (enemy.x < s.x) then s.x = s.x - 1; end; if (enemy.y > s.y) then s.y = s.y + 1; elseif (enemy.y < s.y) then s.y = s.y - 1; end; pn("Фаэтларр идет к " .. enemy.disp3 .. ". "); end; end; dsc = function(s) if (s.hp > 0) then return [[ {Фаэтларр} готов к бою. ]]; else return [[ {Фаэтларр} без сознания. ]]; end; end; }; lse_cmbt_wright = combatant { nam = "lse_cmbt_wright"; disp2 = "Джека"; disp3 = "Джеку"; x = 5; y = 2; pic = "images/jack.png"; ally = "Я не буду атаковать союзника."; nohit = "Я не буду атаковать союзника."; noshoot = "Я не буду атаковать союзника."; hp = 10; hasHarpoon = false; 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 table.insert(enemies, obj); end; end; if (#enemies == 0) then return; end; table.sort(enemies, function(a, b) return (here().getDistance(s.x, s.y, b.x, b.y) > here().getDistance(s.x, s.y, a.x, a.y)); end); local enemy = enemies[1]; local dist = here().getDistance(s.x, s.y, enemy.x, enemy.y); -- 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 (s.hasHarpoon and dist == 1) then if (rnd(4) > 1) then pn("Райт бьет " .. enemy.disp2 .. " гарпуном и попадает. "); enemy.hp = enemy.hp - 2; else pn("Райт бьет " .. enemy.disp2 .. " гарпуном, но промахивается. "); end; elseif (s.hasHarpoon and dist == 0) then enemy.hp = enemy.hp - 2; pn("Райт бьет " .. enemy.disp2 .. " гарпуном и попадает. "); elseif (s.hasHarpoon and dist < 4) then s.hasHarpoon = false; if (rnd(4) > dist) then pn("Райт стреляет в " .. enemy.disp2 .. " гарпуном и попадает. "); enemy.hp = enemy.hp - 2; else pn("Райт стреляет в " .. enemy.disp2 .. " гарпуном, но промахивается. "); end; elseif (not s.hasHarpoon) then s.hasHarpoon = true; pn("Райт перезаряжает ружье. "); else if (enemy.x > s.x) then s.x = s.x + 1; elseif (enemy.x < s.x) then s.x = s.x - 1; end; if (enemy.y > s.y) then s.y = s.y + 1; elseif (enemy.y < s.y) then s.y = s.y - 1; end; pn("Райт идет к " .. enemy.disp3 .. ". "); end; end; dsc = function(s) if (s.hp > 0) then return [[ {Райт} готов к бою. ]]; else return [[ {Райт} без сознания. ]]; end; end; }; lse_cmbt_radcliffe = combatant { nam = "lse_cmbt_radcliffe"; disp2 = "Уолтера"; disp3 = "Уолтеру"; x = 5; y = 4; pic = "images/walter.png"; ally = "Я не буду атаковать союзника."; nohit = "Я не буду атаковать союзника."; noshoot = "Я не буду атаковать союзника."; hp = 10; hasHarpoon = false; 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 table.insert(enemies, obj); end; end; if (#enemies == 0) then return; end; table.sort(enemies, function(a, b) return (here().getDistance(s.x, s.y, b.x, b.y) > here().getDistance(s.x, s.y, a.x, a.y)); end); local enemy = enemies[1]; local dist = here().getDistance(s.x, s.y, enemy.x, enemy.y); -- 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 (s.hasHarpoon and dist == 1) then if (rnd(4) > 1) then pn("Рэдклифф бьет " .. enemy.disp2 .. " гарпуном и попадает. "); enemy.hp = enemy.hp - 2; else pn("Рэдклифф бьет " .. enemy.disp2 .. " гарпуном, но промахивается. "); end; elseif (s.hasHarpoon and dist == 0) then enemy.hp = enemy.hp - 2; pn("Рэдклифф бьет " .. enemy.disp2 .. " гарпуном и попадает. "); elseif (s.hasHarpoon and dist < 4) then s.hasHarpoon = false; if (rnd(4) > dist) then pn("Рэдклифф стреляет в " .. enemy.disp2 .. " гарпуном и попадает. "); enemy.hp = enemy.hp - 2; else pn("Рэдклифф стреляет в " .. enemy.disp2 .. " гарпуном, но промахивается. "); end; elseif (not s.hasHarpoon) then s.hasHarpoon = true; pn("Рэдклифф перезаряжает ружье. "); else if (enemy.x > s.x) then s.x = s.x + 1; elseif (enemy.x < s.x) then s.x = s.x - 1; end; if (enemy.y > s.y) then s.y = s.y + 1; elseif (enemy.y < s.y) then s.y = s.y - 1; end; pn("Рэдклифф идет к " .. enemy.disp3 .. ". "); end; end; dsc = function(s) if (s.hp > 0) then return [[ {Рэдклифф} готов к бою. ]]; else return [[ {Рэдклифф} без сознания. ]]; end; end; }; lse_cmbt_anna = combatant { nam = "lse_cmbt_anna"; disp2 = "Анну"; disp3 = "Анне"; x = 1; y = 4; pic = "images/anna.png"; ally = "Я не буду атаковать союзника."; nohit = "Я не буду атаковать союзника."; noshoot = "Я не буду атаковать союзника."; hp = 10; hasHarpoon = false; 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 table.insert(enemies, obj); end; end; if (#enemies == 0) then return; end; table.sort(enemies, function(a, b) return (here().getDistance(s.x, s.y, b.x, b.y) > here().getDistance(s.x, s.y, a.x, a.y)); end); local pldist = here().getDistance(s.x, s.y, pl.x, pl.y); local enemy = enemies[1]; local dist = here().getDistance(s.x, s.y, enemy.x, enemy.y); -- 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 (s.hasHarpoon and dist == 1) then if (rnd(4) > 1) then pn("Анна бьет " .. enemy.disp2 .. " гарпуном и попадает. "); enemy.hp = enemy.hp - 2; else pn("Анна бьет " .. enemy.disp2 .. " гарпуном, но промахивается. "); end; elseif (s.hasHarpoon and dist == 0) then enemy.hp = enemy.hp - 2; pn("Анна бьет " .. enemy.disp2 .. " гарпуном и попадает. "); elseif (s.hasHarpoon and dist < 4) then s.hasHarpoon = false; if (rnd(4) > dist) then pn("Анна стреляет в " .. enemy.disp2 .. " гарпуном и попадает. "); enemy.hp = enemy.hp - 2; else pn("Анна стреляет в " .. enemy.disp2 .. " гарпуном, но промахивается. "); end; elseif (not s.hasHarpoon) then s.hasHarpoon = true; pn("Анна перезаряжает ружье. "); elseif (pldist > 0) then if (pl.x > s.x) then s.x = s.x + 1; elseif (pl.x < s.x) then s.x = s.x - 1; end; if (pl.y > s.y) then s.y = s.y + 1; elseif (pl.y < s.y) then s.y = s.y - 1; end; pn("Анна идет к вам. "); else pn("Анна ждет ваших действий. "); end; 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; 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; 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 table.insert(enemies, obj); end; end; table.sort(enemies, function(a, b) return (here().getDistance(s.x, s.y, b.x, b.y) > here().getDistance(s.x, s.y, a.x, a.y)); end); local enemy = enemies[1]; local dist = 9000; if (not enemy) then enemy = pl; dist = here().getDistance(s.x, s.y, here().plX, here().plY); else dist = here().getDistance(s.x, s.y, enemy.x, enemy.y); end; if (dist > here().getDistance(s.x, s.y, here().plX, here().plY)) then enemy = pl; end; -- 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 and dist == 1) then if (rnd(4) > 1) then pn("Стражник ".. tostring(index).. " бьет " .. enemy.disp2 .. " копьем и попадает. "); enemy.hp = enemy.hp - 2; else pn("Стражник ".. tostring(index).. " бьет " .. enemy.disp2 .. " копьем, но промахивается. "); end; elseif (s.hasSpear and dist == 0) then enemy.hp = enemy.hp - 2; pn("Стражник ".. tostring(index).. " бьет " .. enemy.disp2 .. " копьем и попадает. "); elseif dist == 0 then enemy.hp = enemy.hp - 1; pn("Стражник ".. tostring(index).. " бьет " .. enemy.disp2 .. " и попадает. "); else if (enemy.x > s.x) then s.x = s.x + 1; elseif (enemy.x < s.x) then s.x = s.x - 1; end; if (enemy.y > s.y) then s.y = s.y + 1; elseif (enemy.y < s.y) then s.y = s.y - 1; end; pn("Стражник ".. tostring(index).. " идет к " .. enemy.disp3 .. ". "); end; end; }; end; lse_cmbt_guard1 = lse_cmbt_guard("lse_cmbt_guard1", 1, 2, 2, false); lse_cmbt_guard2 = lse_cmbt_guard("lse_cmbt_guard2", 2, 2, 3, true); lse_cmbt_guard3 = lse_cmbt_guard("lse_cmbt_guard3", 3, 2, 4, false); lse_cmbt_guard4 = lse_cmbt_guard("lse_cmbt_guard4", 4, 4, 2, false); lse_cmbt_guard5 = lse_cmbt_guard("lse_cmbt_guard5", 5, 4, 3, true); lse_cmbt_guard6 = lse_cmbt_guard("lse_cmbt_guard6", 6, 4, 4, false);