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 = 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} }; 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 = 7; 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 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; for i = 1,#enemies do print(enemies[i].p.l); 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 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 --50% if (rnd(2) > 1) then enemy.hp = enemy.hp - 2; pn("Леарр бьет " .. enemy.disp2 .. " копьем и попадает. "); else pn("Леарр бьет " .. enemy.disp2 .. " копьем, но промахивается. "); end; 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; else --100% enemy.hp = enemy.hp - 2; pn("Леарр бьет " .. enemy.disp2 .. " копьем и попадает. "); end; return; 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"; disp2 = "Фаэтларра"; disp3 = "Фаэтларру"; x = 4; y = 7; 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 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 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 --50% if (rnd(2) > 1) then enemy.hp = enemy.hp - 2; pn("Фаэтларр бьет " .. enemy.disp2 .. " копьем и попадает. "); else pn("Фаэтларр бьет " .. enemy.disp2 .. " копьем, но промахивается. "); end; 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; else --100% enemy.hp = enemy.hp - 2; pn("Фаэтларр бьет " .. enemy.disp2 .. " копьем и попадает. "); end; return; 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"; disp2 = "Джека"; disp3 = "Джеку"; x = 1; 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 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"; disp2 = "Уолтера"; disp3 = "Уолтеру"; x = 1; 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 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"; disp2 = "Анну"; disp3 = "Анне"; x = 7; 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 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; 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 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; 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; else --100% enemy.hp = enemy.hp - 2; pn("Стражник ".. tostring(index).. " бьет " .. enemy.disp2 .. " копьем и попадает. "); end; 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("Стражник ".. tostring(index).. " бьет " .. enemy.disp2 .. " и попадает. "); return; end; end; print("fug2",path); 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 = [[Вы избавляетесь от стражников. Теперь нужно принять решение, что делать дальше, Фаэтларр сообщает вам: "Последователи Блэка редко посещают среднее кольцо. Если нам удастся попасть туда, то у нас будет время обдумать дальнейшие действия. Последнее слово за тобой, Дрейк". С этими словами навьяр передает вам ваши револьвер и ящик с инструментами. ]]; phr = { {"Есть другие варианты?", [[Фаэтларр пожимает плечами: "Я предложил то, что считаю правильным. Но я последую за тобой. Остановить Блэка важнее всего. "]]}; {"Ты знаешь где сейчас блэк?", [[Фаэтларр утвердительно кивает: "Он не выходит из центрального зала. Там мы его и настигнем", - руки Фаэтларра сжались в кулаки, когти и зубы выразительно блестнули в свете электрических ламп. ]]}; {"Хорошо, пойдем", code = [[ walk('lse_hideout_intro_dlg');]]}; }; }; lse_hideout_intro_dlg = dlg { nam = "lse_hideout_intro_dlg"; disp = "Лсэрианотр, убежище"; entered = function(s) pr [[В комнате охранников вы находите ваши вещи. Фаэтларр проводит вас по сервисным тоннелям в среднее кольцо Лсэрианотра. Эта часть города мало чем отличается внешне от тех мест, что вы видели ранее. Точно такие же сплошные стены слева и справа. Точно такие же одинаковые металлические двери на равном расстоянии друг от друга. Как вы и ожидали, секция оказывается практически полностью пустой. Фаэтларр проводит вас в одну из дверей. "Попробуем здесь", - говорит он и с помощью нехитрых манипуляций открывает ее, впуская вас внутрь. ^Вы оказываетесь в небольшом узком коридоре. По его сторонам вы видите несколько проходов, ведущих в небольшие помещения, неизвестного вам назначения. За одним из проходов скрывается просторная комната с установленным в центре массивным металлическим столом и несколькими стульями вокруг. ]]; if (ArrayUtils.indexOf(pl.party, 'learr') ~= 0) then pr [[Леарр осматривает помещение: "Я поверить-не-могу, что наши это-все-построили. "]]; end; if (ArrayUtils.indexOf(pl.party, 'wright') ~= 0) then pr [[Джек Райт с сомнением пожимает плечами: "Неплохое местечко. И не думаю, что они будут нас здесь искать. "]]; end; if (ArrayUtils.indexOf(pl.party, 'radcliffe') ~= 0) then pr [[Уолтер Рэдклифф молча садится за стол. ]]; end; if (ArrayUtils.indexOf(pl.party, 'anna') ~= 0) then pr [[Анна садится рядом с братом. ]]; end; end; phr = { {"Фаэтларр, что ты можешь рассказать нам о городе?", [[Фаэтларр кивает и сразу предупреждает: "Я не-успел-разузнать почти-ничего", - сделав небольшую паузу, он продолжает: "Город кругами-выстроен. Они называют-это кольцами. Три кольца есть. Внешнее-кольцо склады и помещения для гостей содержит. В среднем кольце горожане-живут и служебные-здания-стоят. Внутреннее кольцо - дом ученых. Помимо врат, кольца соединены служебными проходами, часть которых находится под водой. "]]}; {"Фаэтларр, как мы можем попасть в центр города?", [[]]}; }; };