--[[ Дипатреанотр ]] global { dyp_quest_state = 0; -- 0 - не начат -- 1 - получено задание от вождя -- 2 - узнали, что карту унес Аэдиенрр в Дипатреанотр -- 3 - узнали, куда унес карту Аэдиенрр из Дипатреанотра -- 4 - Отдали оригинал КНО в Ираафаанотр -- 5 - Отдали жезл в Ираафаанотр dyp_stones_known = 0; dyp_lib_stone_state = 0; }; --[[ Дипатреанотр город ]] dyp_entry = lcutscene("dyp_entry", "Левиафан, рубка", [[Дипатреанотр расположен всего в нескольких часах пути от Атлантиды. Как только вы прибываете на место, вашим глазам открывается картина неприглядного поселения -- небольшой деревушки, состоящей из не более чем сотни домов, сгрудившихся вокруг центральной площади, посреди которой возвышается каменный обелиск. Вы не замечаете никаких улиц, кроме одной, соединящей дом вождя с центральной площадью. Вы направляете Левиафан к центру и субмарина, послушная вашим указаниям, замирает рядом с обелиском. ]], "Вы прибыли в Дипатреанотр. ", leviathan_wheelhouse); dyp_center = room { nam = "dyp_center"; disp = "Дипатреанотр, центр"; view = [[Левиафан находится над центром Дипатреанотра -- небольшого навьярского поселения. Вокруг небольшой центральной площади неровными кругами расположены небольшие каменные дома. Явно выраженные улицы отсутствуют, за исключением широкой, выложенной камнем дороги от площади до дома вождя. В другом конце площади расположено большое здание библиотеки. ]]; dsc = [[Вы находитесь на центральной площади Дипатреанотра -- небольшого навьярского поселения. Вокруг небольшой центральной площади неровными кругами расположены небольшие каменные дома. Явно выраженные улицы отсутствуют, за исключением широкой, выложенной камнем дороги от площади до дома вождя. В другом конце площади расположено большое здание библиотеки. ]]; obj = { "dyp_obelisk"; }; way = { kh_vroom("К библиотеке", "dyp_library_entrance"); kh_vroom("К дому вождя", "dyp_chief_house_entrance"); kh_vroom("В Левиафан", "leviathan_airlock"); kh_vroom("К окраине", "dyp_outskirts"); }; }; dyp_outskirts = room { nam = "dyp_outskirts"; disp = "Дипатреанотр, окраина"; dsc = [[Вы стоите на южной окраине Дипатреанотра. К северу от вас расположены неказистые каменные дома жителей города. Отсюда прекрасно виден зависший над центральной площадью Левиафан. ]]; obj = { "dyp_guardian"; }; }; dyp_guardian = npc { nam = "dyp_guardian"; dsc = [[Рядом с вами неспешно прогуливается {стражник}, вооруженный копьем. Кажется, ваш вид его нисколько не удивляет и не беспокоит. ]]; phr = { [[Стражник не обращает на вас внимания. ]]; [[По головным плавникам стражника бегут цветные полосы: "Ты говори с вождем, не со мной". ]]; }; dlg = function(s) if dyp_quest_state == 2 then return "dyp_guardian_dlg"; end; end; }; dyp_guardian_dlg = dlg { nam = "dyp_guardian_dlg"; entered = [[По головным плавникам стражника бегут цветные полосы: "Ты говори с вождем, не со мной". ]]; phr = { {"[Кодировщик] Я ищу навьяра по имени Аэдиенрр. Он проходил здесь недавно.", [[Стражник кивает: "Аэдиенрр из Ираафаанотра ушел на восток несколько дней назад. Кажется, он направлялся к обелискам". ]], code [[ dyp_quest_state = 3; ]]}; {"[Уйти]", code [[ back(); ]]}; }; }; dyp_obelisk = obj { nam = "dyp_obelisk"; dsc = [[В центре площади стоит большой каменный {обелиск}, с нанесенными на него символами. ]]; act = function(s) return [[На обелиске, традиционно для навьяров, начертано название города и вырезана карта, указывающая путь к храму. ]]; end; }; dyp_navjiarr = npc{ nam = "dyp_navjiarr"; dsc = [[Немногие {навьяры}, находящиеся сейчас на площади с интересом оглядываютс на Левиафан и вас. ]]; phr = { "Не стоит их беспокоить. ", "Вряд ли они смогут сказать вам что-то полезное. " }; }; dyp_library_entrance = room { nam = "dyp_library_entrance"; dsc = [[Двухэтажное каменное здание библиотеки разительно отличается от большинства строений Дипатреанотра. Выстроенное из массивных каменных плит, а не из булыжников, как остальные, оно хорошо сохранилось несмотря на достаточно большой возраст. Ровные стены тщательно очищаются навьярами от ила и водорослей, сохрнаяя здание в перозданном виде. ]]; way = { kh_vroom("К обелиску", "dyp_center"); kh_vroom("В библиотеку", "dyp_library_floor1"); }; }; dyp_library_floor1 = room { nam = "dyp_library_floor1"; dsc = [[Первый этаж здания библиотеки представляет собой огромный зал. Множество колонн, установленных ровными рядами, поддерживают потолок, между ними и вдоль стен установлены массивные стеллажи, заполненные различными записями. Большинство их сделаны на каменных табличках, но изредка встречаютс и древние металлические. Ваше внимание привлекает одна из полок, заполненная небольшими блестящими дисками из неизвестного материала. ]]; obj = { "dyp_library_statue" }; way = { kh_vroom("Наружу", "dyp_library_entrance"); kh_vroom("На второй этаж", "dyp_library_floor2"); }; }; dyp_library_floor2 = room { nam = "dyp_library_floor2"; dsc = [[Второй этаж библиотеки мало чем отличается от первого -- точно такие же колонны, точно такие же стеллажи. Здесь гораздо больше полок содержат блестящие диски вместо привычных вам записей. ]]; obj = { "dyp_librarian"; }; }; dyp_librarian = npc { var { state = 0; }; nam = "dyp_librarian"; dsc = [[]]; }; dyp_librarian_dlg = dlg { nam = "dyp_librarian_dlg"; disp = "Эйлехиарр"; entered = function(s) if (dyp_librarian_dlg.state == 0) then dyp_librarian_dlg.state = 1; return [[Перед вами, япрямо на полу сидит навьяр. Рядом с ним разложены какие-то записи, которые он внимательно рассматривает, иногда перекладывая с места на место. Заметив вас, он поднимается и приветствует вас: "Я, Eyle'hya'rr из Dyp'atre'anot'rrа, приветствую тебя he'vji'a'rr. Ты говори, зачем ты пришел". ]]; else return [[Эйлехиарр сидит на полу, перекладывая какие-то записи. Заметив вас он поднимается и приветствует вас: "Ты овори, зачем ты пришел". ]]; end; end; phr = { {"[Кодировщик] Что ты делаешь?", [[Эйлехиарр отвечает: "Эти записи сильно повреждены. К счастью у нас есть несколько копий этого текста. Но мои предшественники умудрились испортить все три!" ]]}; {"[Кодировщик] Я ищу карту пути в Лсэрианотр.", [[Эйлехиарр задумчиво оглядывает помещение. Делает несколько шагов в одну сторону, потом в другую. Садится рядом со своими записями, сова встает. Наконец, он берет с одной из полок металлическую табличку и сообщает: "Здесь говорится о пещере рядом с храмом. Три ключа закрывают вход". ]], code [[pon("three_keys");]]}; {tag="three_keys", false, "[Кодировщик] Где найти эти ключи?", [[Эйлехиарр отвечает: "Здесь, в Дипатреанотре. Один ты можешь забрать внизу, у статуи". ]], code [[ dyp_stones_known = true; dyp_lib_stone_state = 1; ]]}; {"[Кодировщик] Я пойду.", [[Эйлехиарр прощается: "Ты возвращайся". ]]}; }; }; dyp_item_stone_blue = obj { nam = "dyp_item_stone_blue"; disp = [[Синий камень]]; inv = [[Небольшой круглый камень, излучающий яркий синий свет. ]]; }; dyp_item_stone_green= obj { nam = "dyp_item_stone_green"; disp = [[Зеленый камень]]; inv = [[Небольшой круглый камень, излучающий яркий зеленый свет. ]]; }; dyp_item_stone_red = obj { nam = "dyp_item_stone_red"; disp = [[Красный камень]]; inv = [[Небольшой круглый камень, излучающий яркий красный свет. ]]; }; dyp_library_statue = obj { nam = "dyp_library_statue"; dsc =function(s) if dyp_lib_stone_state > 1 then return [[В центре зала стоит статуя навьяра. В правой руке он держит табличку, которую сосредоточенно рассматривает. Левая рука статуи выглядит так, словно в ней должен находиться какой-то небольшой предмет, однако он отсутствует. ]]; else return [[В центре зала стоит статуя навьяра. В правой руке он держит табличку, которую сосредоточенно рассматривает. В левой руке статуи лежит небольшой светящийся синий {камень}. ]]; end; end; act = function(s) if dyp_lib_stone_state == 0 then return [[Красивая старая статуя. Навьяр изображен пораительно подробно -- вы можете разглядеть каждую чешуйку. Небольшой камень лежит в руке статуи так, что его очень легко вынуть. ]]; elseif dyp_lib_stone_state == 1 then dyp_lib_stone_state = 2; take("dyp_item_stone_blue"); return [[Вы легко забираете из руки статуи камень. ]]; elseif dyp_lib_stone_state == 2 then return [[Красивая старая статуя. Навьяр изображен пораительно подробно -- вы можете разглядеть каждую чешуйку. ]]; end; end; }; dyp_chief_house_entrance = room { nam = "dyp_chief_house_entrance"; disp = "Дипатреанотр, перед домом вождя"; dsc = [[Дом вождя Дипатреанотра не уступает размерами библиотеке. Двухэтажное здание очневидно не раз расширялось и достраивалось. Часть его сложена из обработанных каменных плит, другая -- из булыжников, как большинство зданий города. Широкая выложенная камнем улица ведет отсюда к центральной площади города.]]; way = { kh_vroom("К обелиску", "dyp_center"); kh_vroom("В дом", "dyp_chief_house"); }; }; dyp_chief_house = room { nam = "dyp_chief_house"; disp = "Дипатреанотр, дом вождя"; dsc = [[Приемная дома вождя представляет собой огромный зал с ровными рядами стройных каменных колонн, удреживающих потолок. В дальнем конце зала установлен каменный трон, перед которым установлен массивный каменный стол. ]]; way = { kh_vroom("Наружу", "dyp_chief_house_entrance"); }; obj = { "dyp_chief"; }; }; dyp_chief = npc { nam = "dyp_chief"; dsc = [[{Вождь Дипатреанотра} сидит на троне с закрытыми глазами. Руки его сложены на груди. В правой он держит небольшой золотистый жезл, в навершии которого укреплен круглый камень, излучающий яркий зеленый свет. Светло-синяя чешуя покрыта узором из татуировок. Как и другие навьяры он одет в костюм из водорослей. На левой руке дремлюего вождя вы видите искусный браслет из блестящего металла. ]]; dlg = "dyp_chief_dlg"; }; dyp_chief_dlg = dlg { nam = "dyp_chief_dlg"; entered = function(s) if dyp_stones_known then pon("star_map"); end; return [[Как только вы приближаетесь к столу, глаза вождя открываются. Он поднимается с трона. Руки его остаются сложенными на груди, а взгляд его желтых глаз устремляется на вас. По его головным плавникам бегут цветные полосы: "Чем скромные навьяры из Дипатреанотра обязаны визиту почтенного хевьяра? Ты говори". ]]; end; phr = { {"[Кодировщик] Я ищу карту пути в Лсэрианотр.", [[Вождь отвечает: "Ты спроси в храме или в библиотеке. Я ничего такого не знаю". ]]}; {tag="star_map", false, "[Кодировщик] Мне нужен камень из твоего жезла. Что я могу предложить в обмен на него?", [[Глаза вождя загораются, он ухмыляется. По плавникам быстро, словно в нетерпении, бегут цветные полосы: "Я хочу карту небесных огней из Ираафаанотра. Принеси ее и забирай этот жезл вместе с камнем". ]], code [[ dyp_quest_state = 1; ]]}; {"[Кодировщик] Я пойду.", [[Вождь прощается с вами: "Ты возвращайся". Он садится обратно на трон и закрывает глаза. ]], code [[ back(); ]]}; }; }; --[[ Дипатреанотр храм ]] dyp_temple_entry = lcutscene("dyp_temple_entry", "Левиафан, рубка", [[Храм Дипатреанотра располагается в нескольких часах пути от Атлантиды на Левиафане. К массивным дверям храма, вырезанным в толще скалы, ведет широкая каменная лестница, некогда украшенная резными орнаментами, ныне осыпавшимися и раскрошившимися. Над входом вырезано изображение, состоящее из нескольких концентрических кругов и каких-то символов. ]], "Вы прибыли в Храм Дипатреанотра. ", leviathan_wheelhouse); dyp_temple_guard = room { nam = "ctt_dyp_temple_guard"; dsc = function(s) if (dyp_temple_guard_dlg.state == 0) then return [[У ворот стоят два навьяра, вооруженные копьями. При вашем приближении они начинают нервничать -- переглянувшись, они перехватывают копья, готовясь при необходимости прогнать вас. По плавникам одного из них бегут цветные полосы: темно-фиолетовая, зеленая, оранжевая -- шире чем остальные, серая, ярко-розовая, желтая -- снова широкая, салатовая, снова широкая желтая и, наконец, широкая бледно-оранжевая. После небольшой паузы, полосы появляются снова. ]]; else return [[У ворот стоят два навьяра, вооруженные копьями. Они никак не реагируют на вас. ]]; end; end; dlg = "dyp_temple_guard_dlg"; }; dyp_temple_guard_dlg = dlg { var { state = 0; }; nam = "Страж храма"; entered = function(s) if (s.state == 0) then return [[Стражники загораживают вам проход. По плавникам одного из них бегут цветные полосы. ]]; else back(); return [[Стражник не реагирует на вас. ]]; end; end; phr = { --TODO заменить название токена {tag="test", false, "[Передать <токен>]", [[Стражи, согласно ритуалу, молча открывают ворота, пропуская вас внутрь. ]], code [[ dyp_temple_guard_dlg.state = 1; back(); ]]}; {always=true, "[Кодировщик] I'rr Vee'nn"}; }; }; dyp_temple_carving_look = room { nam = "Храм Дипатреанотра, вход"; pic ="images/iyh_navjiarr_map.png"; dsc = [[Над входом в храм вырезана схема, состоящая из нескольких концентрических кругов. ]]; obj = { vway("continue", "{Продолжить}", "dyp_temple_entrance"); }; }; dyp_temple_carving = obj { nam = "dyp_temple_carving"; dsc = [[Над входом в храм вырезано {изображение} состоящее из нескольких кругов и еще каких-то символов. Часть изображения стерлась от времени, однако остальная часть все еще читаема. ]]; act = function(s) walkin("dyp_temple_carving_look"); end; }; dyp_temple_entrance = room { nam = "Храм Дипатреанотра, вход"; dsc = [[Перед вами находится вырезанный в скале вход в навьярский храм. Массивные каменные ступени ведут к громадным двустворчатым дверям, украшенным полустершимися орнаментами. Некогда яркие краски потускнели -- осторожные навьяры не решаются их обновить. ^Скала продолжается на восток и на юго-запад от храма. Вдалеке на севере видны длинные, вытянувшиеся на несколько метров вверх водоросли. К западу заметен обелиск из камней. ]]; underwater = true; entered = function(s) --char_learr:accompany(false); --char_radcliffe:accompany(false); --char_wright:accompany(false); --char_anna:accompany(false); --if ArrayUtils.indexOf(pl.party, 'learr') ~= 0 then -- return [[ -- Вы слышите по радио голос Леарр: "Ты-Дрейк один-пойдешь. Другим нельзя-в-храм-войти". -- ]]; --elseif ArrayUtils.indexOf(pl.party, 'anna') ~= 0 then -- return [[ -- Вы слышите по радио голос Анны: "Дрейк, тебе придется идти одному - испытание можно пройти лишь в одиночку. Удачи". -- ]]; --end; end; obj = { "dyp_temple_guard"; "dyp_temple_carving"; }; way = { kh_vroom("В храм", function(s) pr('Охранники не колеблясь убьют вас, если вы попытаетесь войти. '); return false; --ctt_dyp_temple_l1.px = 1; --ctt_dyp_temple_l1.py = 0; --return "ctt_dyp_temple_l1"; end):disable(); kh_vroom("В Левиафан", "leviathan_airlock"); }; }; dyp_temple_east = room { nam = "Океан"; view = [[Вы находитесь у подножья скалы, протянувшейся на многие километры на восток от вас. На западе она сворачивает к югу. В освещенной мощным прожектором Левиафана скале вы видите раверзшуюся пасть пещеры. ]]; dsc = [[Вы находитесь у подножья скалы, протянувшейся на многие километры на восток от вас. На западе она сворачивает к югу. Перед собой вы видите разверзшуюся пасть пещеры, освещенную мощным прожектором Левиафана. ]]; way = { kh_vroom("В пещеру", "dyp_temple_cave_entrance"); kh_vroom("В Левиафан", "leviathan_airlock"); }; }; dyp_temple_south_west = room { nam = "Океан"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Вы находитесь у подножья скалы. К юго востоку скала сворачивает на юг и тянется на многие километры. К северо-востоку вы видите храм Дипатреанотра. ]]; }; dyp_temple_south_far = room { nam = "Океан"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Вы находитесь у подножья скалы, протянувшейся на многие километры на юг. На севере скала сворачивает к востоку. ]]; }; dyp_temple_north_west = room { nam = "Океан"; no_exit = function(s) if dyp_quest_state == 3 then return nil; else return [[Нет смысла покидать Левиафан здесь. ]]; end; end; view = [[Перед вами возвышается массивный каменный обелиск. Некогда он был украшен резными орнаментами, но сейчас все они практически полностью стерлись. К юго-востоку от вас возвышается отвесная скала, протянувшаяся на многие километры с юга на восток. Вдалеке на западе вы видите каменные строения навьярского города -- Дипатреанотра. ]]; dsc = [[К юго-востоку от вас возвышается отвесная скала, протянувшаяся на многие километры с юга на восток. Вдалеке на западе вы видите каменные строения навьярского города -- Дипатреанотра. ]]; obj = { "dyp_temple_west_footprints"; "dyp_temple_north_west_obelisk"; }; way = { kh_vroom("В Левиафан", "leviathan_airlock"); }; }; dyp_temple_west_footprints = obj { nam = "dyp_temple_west_footprints"; dsc = [[На илистом дне вы видите {следы}. ]]; act = [[Следы навьяра ведут на север. ]]; }; dyp_temple_north_west_obelisk = obj { nam = "dyp_temple_north_west_obelisk"; dsc = [[Перед вами возвышается массивный каменный {обелиск}. Некогда он был украшен резными орнаментами, но сейчас все они практически полностью стерлись. ]]; act = [[Древняя каменная конструкция, с неизвестной целью помещенная в этом месте. ]]; }; dyp_temple_north = room { nam = "Океан"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Левиафан застыл над высокими стеблями водорослей, едва заметно колышущимися в спокойной воде. ]]; }; dyp_temple_crevice_middle = room { nam = "Океан"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Левиафан застыл над неглубоким ущельем, протянувшимся с востока на запад. ]]; }; dyp_temple_crevice_east = room { nam = "Океан"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Левиафан застыл над неглубоким ущельем, протянувшимся с востока на запад. ]]; }; dyp_temple_crevice_far_east = room { nam = "Океан"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Левиафан застыл над неглубоким ущельем, протянувшимся с востока на запад. ]]; }; dyp_temple_crevice_west = room { nam = "Океан"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Левиафан застыл над неглубоким ущельем, протянувшимся с востока на запад. ]]; }; dyp_temple_crevice_far_west = room { nam = "Океан"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Левиафан застыл над неглубоким ущельем, протянувшимся с востока на запад. ]]; }; dyp_temple_warning = room { nam = "Океан"; no_exit = function(s) if dyp_quest_state == 3 then return [[Нет смысла покидать Левиафан здесь. ]]; end; end; view = [[Перед вами возвышается массивный каменный обелиск. Большая часть изображенного на нем стерлась. ]]; dsc = [[Вы находитесь посреди бескрайней илистой равнины. К северу вы видитекалу, протянувшуюся с запада на восток. ]]; way = { kh_vroom("В Левиафан", "leviathan_airlock"); }; obj = { "dyp_temple_obelisk_footprints"; "dyp_temple_warning_obelisk"; }; }; dyp_temple_obelisk_footprints = obj { nam = "dyp_temple_obelisk_footprints"; dsc = [[На илистом дне вы видите {следы}. ]]; act = [[Следы навьяра ведут на север. ]]; }; dyp_temple_warning_obelisk = obj { nam = "dyp_temple_warning_obelisk"; dsc = [[Перед вами возвышается массивный каменный {обелиск}. Некогда он был украшен резными орнаментами, но сейчас все они практически полностью стерлись. ]]; act = [[Древняя каменная конструкция, с неизвестной целью помещенная в этом месте. ]]; }; dyp_temple_cliff_1 = room { nam = "Океан"; no_exit = function(s) return [[Нет смысла покидать Левиафан здесь. ]]; end; view = [[Вы находитесь к югу от высокой скалы, протянувшейся с востока на запад. Здесь в скале вы видите вход в глубокую темную пещеру. ]]; way = { kh_vroom("В Левиафан", "leviathan_airlock"); kh_vroom("В пещеру", "dyp_crab_cave"); }; obj = { "dyp_temple_cliff_1_footprints"; }; }; dyp_temple_cliff_1_footprints = obj { nam = "dyp_temple_cliff_1_footprints"; dsc = [[На илистом дне хорошо сохранились {следы} множества тонких ног. ]]; act = [[Следы множества тонких ног, тянущиеся с востока, ведут в пещеру. ]]; }; dyp_temple_cliff_2 = room { nam = "Океан"; no_exit = function(s) if dyp_quest_state == 3 then return [[Нет смысла покидать Левиафан здесь. ]]; end; end; view = [[Вы находитесь к югу от высокой скалы, протянувшейся с востока на запад. ]]; dsc = [[Вы стоите у подножя высокой скалы, протянувшейся с востока на запад к северу от вас. ]]; way = { kh_vroom("В Левиафан", "leviathan_airlock"); }; obj = { "dyp_temple_cliff_2_footprints"; }; }; dyp_temple_cliff_2_footprints = obj { nam = "dyp_temple_cliff_2_footprints"; dsc = [[Здесь {следы} навьяра обрываются. ]]; act = [[Следы обрываются, но не просто так. Здесь явно произошла драка, скорее всего с каким-то морским животным. Вы замечаете следы множества тонких ног, ведущие на запад. ]]; }; dyp_temple_cliff_3 = room { nam = "Океан"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Вы находитесь к югу от высокой скалы, протянувшейся с востока на запад. ]] }; dyp_temple_cliff_4 = room { nam = "Океан"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Вы находитесь к югу от высокой скалы, протянувшейся с востока на запад. ]] }; dyp_temple_cliff_5 = room { nam = "Океан"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Вы находитесь к югу от высокой скалы, протянувшейся с востока на запад. ]] }; dyp_temple_whale = room { nam = "Океан"; no_exit = [[Нет смысла покидать Левиафан здесь. ]]; view = [[Рядом с вами покоится скелет громадного кита. Древние кости занесены илом, однако все еще прекрасно видны с большого расстояния. ]]; }; dyp_temple_navigation = dlg { nam = "Штурвал Левиафана"; entered = function(s) end; phr = { {tag="dyp_temple_entrance"}; {always=true, "[На восток, вдоль скалы]", function() move(submarine_leviathan, "dyp_temple_east"); psub("dyp_temple_east"); end}; {always=true, "[На северо-восток, к зарослям]", function() move(submarine_leviathan, "dyp_temple_north"); psub("dyp_temple_north"); end}; {always=true, "[На северо-запад, к обелиску]", function() move(submarine_leviathan, "dyp_temple_north_west"); psub("dyp_temple_north_west"); end}; {always=true, "[На юго-запад, вдоль скалы]", function() move(submarine_leviathan, "dyp_temple_south_west"); psub("dyp_temple_south_west"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_east"}; {always=true, "[На запад, вдоль скалы]", function() move(submarine_leviathan, "dyp_temple_entrance"); psub("dyp_temple_entrance"); end}; {always=true, "[На север, к зарослям]", function() move(submarine_leviathan, "dyp_temple_north"); psub("dyp_temple_north"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_south_west"}; {always=true, "[На северо-восток, вдоль скалы]", function() move(submarine_leviathan, "dyp_temple_entrance"); psub("dyp_temple_entrance"); end}; {always=true, "[На юг, вдоль скалы]", function() move(submarine_leviathan, "dyp_temple_south_far"); psub("dyp_temple_south_far"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_south_far"}; {always=true, "[На север, вдоль скалы]", function() move(submarine_leviathan, "dyp_temple_south_west"); psub("dyp_temple_south_west"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_north_west"}; {always=true, "[На юго-восток, к храму]", function() move(submarine_leviathan, "dyp_temple_entrance"); psub("dyp_temple_entrance"); end}; {always=true, "[На запад, в Дипатреанотр]", function() move(submarine_leviathan, "dyp_city_east"); psub("dyp_city_east"); --TODO enter the city end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_north"}; {always=true, "[На юго-запад, к храму]", function() move(submarine_leviathan, "dyp_temple_entrance"); psub("dyp_temple_entrance"); end}; {always=true, "[На юг, к скале]", function() move(submarine_leviathan, "dyp_temple_east"); psub("dyp_temple_east"); end}; {always=true, "[На север, к ущелью]", function() move(submarine_leviathan, "dyp_temple_crevice_middle"); psub("dyp_temple_crevice_middle"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_crevice_middle"}; {always=true, "[На юг, к зарослям]", function() move(submarine_leviathan, "dyp_temple_north"); psub("dyp_temple_north"); end}; {always=true, "[На восток, вдоль ущелья]", function() move(submarine_leviathan, "dyp_temple_crevice_east"); psub("dyp_temple_crevice_east"); end}; {always=true, "[На север, к скале]", function() move(submarine_leviathan, "dyp_temple_cliff_4"); psub("dyp_temple_cliff_4"); end}; {always=true, "[На запад, вдоль ущелья]", function() move(submarine_leviathan, "dyp_temple_crevice_west"); psub("dyp_temple_crevice_west"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_crevice_east"}; {always=true, "[На юго-запад, к зарослям]", function() move(submarine_leviathan, "dyp_temple_north"); psub("dyp_temple_north"); end}; {always=true, "[На восток, вдоль ущелья]", function() move(submarine_leviathan, "dyp_temple_crevice_far_east"); psub("dyp_temple_crevice_far_east"); end}; {always=true, "[На северо-восток, к костям]", function() move(submarine_leviathan, "dyp_temple_whale"); psub("dyp_temple_whale"); end}; {always=true, "[На север, к скале]", function() move(submarine_leviathan, "dyp_temple_cliff_5"); psub("dyp_temple_cliff_5"); end}; {always=true, "[На запад, вдоль ущелья]", function() move(submarine_leviathan, "dyp_temple_crevice_middle"); psub("dyp_temple_crevice_middle"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_crevice_far_east"}; {always=true, "[На север, к костям]", function() move(submarine_leviathan, "dyp_temple_whale"); psub("dyp_temple_whale"); end}; {always=true, "[На запад, вдоль ущелья]", function() move(submarine_leviathan, "dyp_temple_crevice_east"); psub("dyp_temple_crevice_east"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_crevice_west"}; {always=true, "[На север, к скале]", function() move(submarine_leviathan, "dyp_temple_cliff_3"); psub("dyp_temple_cliff_3"); end}; {always=true, "[На восток, вдоль ущелья]", function() move(submarine_leviathan, "dyp_temple_crevice_middle"); psub("dyp_temple_crevice_middle"); end}; {always=true, "[На юго-восток, к зарослям]", function() move(submarine_leviathan, "dyp_temple_north"); psub("dyp_temple_north"); end}; {always=true, "[На запад, вдоль ущелья]", function() move(submarine_leviathan, "dyp_temple_crevice_far_west"); psub("dyp_temple_crevice_far_west"); end}; {always=true, "[На северо-запад, к обелиску]", function() move(submarine_leviathan, "dyp_temple_warning"); psub("dyp_temple_warning"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_crevice_far_west"}; {always=true, "[На север, к обелиску]", function() move(submarine_leviathan, "dyp_temple_warning"); psub("dyp_temple_warning"); end}; {always=true, "[На восток, вдоль ущелья]", function() move(submarine_leviathan, "dyp_temple_crevice_west"); psub("dyp_temple_crevice_west"); end}; {always=true, "[На юг, к обелиску]", function() move(submarine_leviathan, "dyp_temple_north_west"); psub("dyp_temple_north_west"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_warning"}; {always=true, "[На север, к скале]", function() move(submarine_leviathan, "dyp_temple_cliff_2"); psub("dyp_temple_cliff_2"); end}; {always=true, "[На юг, к ущелью]", function() move(submarine_leviathan, "dyp_temple_crevice_far_west"); psub("dyp_temple_crevice_far_west"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_cliff_1"}; {always=true, "[На восток, вдоль скалы]", function() move(submarine_leviathan, "dyp_temple_cliff_2"); psub("dyp_temple_cliff_2"); end}; {always=true, "[На юго-восток, к обелиску]", function() move(submarine_leviathan, "dyp_temple_warning"); psub("dyp_temple_warning"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_cliff_2"}; {always=true, "[На восток, вдоль скалы]", function() move(submarine_leviathan, "dyp_temple_cliff_3"); psub("dyp_temple_cliff_3"); end}; {always=true, "[На юг, к обелиску]", function() move(submarine_leviathan, "dyp_temple_warning"); psub("dyp_temple_warning"); end}; {always=true, "[На запад, вдоль скалы]", function() move(submarine_leviathan, "dyp_temple_cliff_1"); psub("dyp_temple_cliff_1"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_cliff_3"}; {always=true, "[На восток, вдоль скалы]", function() move(submarine_leviathan, "dyp_temple_cliff_4"); psub("dyp_temple_cliff_4"); end}; {always=true, "[На юг, к ущелью]", function() move(submarine_leviathan, "dyp_temple_crevice_west"); psub("dyp_temple_crevice_west"); end}; {always=true, "[На юго-запад, к обелиску]", function() move(submarine_leviathan, "dyp_temple_warning"); psub("dyp_temple_warning"); end}; {always=true, "[На запад, вдоль скалы]", function() move(submarine_leviathan, "dyp_temple_cliff_2"); psub("dyp_temple_cliff_2"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_cliff_4"}; {always=true, "[На восток, вдоль скалы]", function() move(submarine_leviathan, "dyp_temple_cliff_5"); psub("dyp_temple_cliff_5"); end}; {always=true, "[На юг, к ущелью]", function() move(submarine_leviathan, "dyp_temple_crevice_middle"); psub("dyp_temple_crevice_middle"); end}; {always=true, "[На запад, вдоль скалы]", function() move(submarine_leviathan, "dyp_temple_cliff_3"); psub("dyp_temple_cliff_3"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_cliff_5"}; {always=true, "[На восток, вдоль скалы]", function() temple_found = true; move(submarine_leviathan, "iyh_far_from_entrance_foot"); walk("iyh_far_from_entrance"); --TODO катсцена при первом прибытии end}; {always=true, "[На юго-восток, к костям]", function() move(submarine_leviathan, "dyp_temple_whale"); psub("dyp_temple_whale"); end}; {always=true, "[На юг, к ущелью]", function() move(submarine_leviathan, "dyp_temple_crevice_east"); psub("dyp_temple_crevice_east"); end}; {always=true, "[На запад, вдоль скалы]", function() move(submarine_leviathan, "dyp_temple_cliff_4"); psub("dyp_temple_cliff_4"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; {tag="dyp_temple_whale"}; {always=true, "[На север, к храму]", function() temple_found = true; move(submarine_leviathan, "iyh_far_from_entrance_foot"); walk("iyh_far_from_entrance"); --TODO катсцена при первом прибытии end}; {always=true, "[На юг, к ущелью]", function() move(submarine_leviathan, "dyp_temple_crevice_far_east"); psub("dyp_temple_crevice_far_east"); end}; {always=true, "[Отойти от штурвала]", code = [[ walk('leviathan_wheelhouse'); ]]}; {always=true, "[Отправиться в другое место]", code = [[ walk('leviathan_dlg'); ]]}; }; }; dyp_temple_cave_entrance = room { nam = "dyp_temple_cave_entrance"; disp = "Храм Дипатреанотра, пещера"; dsc = [[Вы стоите у выхода из глубокой пещеры, расположенной неподалеку от храма Дипатреанотра. Перед вами длинный коридор, ведущий куда-то вглубь скалы. Вдалеке, в коридоре вы видите слабое свечение. ]]; way = { kh_vroom("Выйти из пещеры", "dyp_temple_east"); kh_vroom("Вглубь пещеры", "dyp_temple_cave_deep"); }; }; dyp_temple_cave_deep = room { nam = "dyp_temple_cave_deep"; disp = "Храм Дипатреанотра, пещера"; dsc = [[Здесь коридор разветвляется на три. В конце каждого вы видите слабое свечение красного, зеленогои синего цветов. ]]; way = { kh_vroom("К выходу из пещеры", "dyp_temple_cave_entrance"); kh_vroom("В \"Красный\" коридор", "dyp_temple_cave_red"); kh_vroom("В \"Зеленый\" коридор", "dyp_temple_cave_green"); kh_vroom("В \"Синий\" коридор", "dyp_temple_cave_blue"); }; }; dyp_temple_cave_red = room { nam = "dyp_temple_cave_red"; disp = "Храм Дипатреанотра, пещера"; dsc = [[Проход заканчивается массивной металлической дверью, совершенно гладкой. Вы не видите никакого способа открыть ее. ]]; obj = { "dyp_temple_statue_red"; }; way = { kh_vroom("В главный коридор", "dyp_temple_cave_deep"); }; }; dyp_temple_statue_red = obj { nam = "dyp_temple_statue_red"; dsc = [[Рядом с дверью стоит древняя статуя навьяра. В правой руке статуя держит копье, в навершии которого ярко светится красный камень. На поясе статуи вы видите небольшое круглое {отверстие}. ]]; }; dyp_temple_cave_green = room { nam = "dyp_temple_cave_green"; disp = "Храм Дипатреанотра, пещера"; dsc = [[Проход заканчивается массивной металлической дверью, совершенно гладкой. Вы не видите никакого способа открыть ее. ]]; obj = { "dyp_temple_statue_green"; }; way = { kh_vroom("В главный коридор", "dyp_temple_cave_deep"); }; }; dyp_temple_statue_green = obj { nam = "dyp_temple_statue_green"; dsc = [[Рядом с дверью стоит древняя статуя навьяра. В правой руке статуя держит копье, в навершии которого ярко светится зеленый камень. На поясе статуи вы видите небольшое круглое {отверстие}. ]]; }; dyp_temple_cave_blue = room { nam = "dyp_temple_cave_blue"; disp = "Храм Дипатреанотра, пещера"; dsc = [[Проход заканчивается массивной металлической дверью, совершенно гладкой. Вы не видите никакого способа открыть ее. ]]; obj = { "dyp_temple_statue_blue"; }; way = { kh_vroom("В главный коридор", "dyp_temple_cave_deep"); }; }; dyp_temple_statue_blue = obj { nam = "dyp_temple_statue_blue"; dsc = [[Рядом с дверью стоит древняя статуя навьяра. В правой руке статуя держит копье, в навершии которого ярко светится синий камень. На поясе статуи вы видите небольшое круглое {отверстие}. ]]; }; dyp_crab_cave = labyrinth { var { position = "00"; fight = false; }; nam = "dyp_crab_cave"; disp = "Пещера"; dir1 = "На северо-запад"; dir2 = "На северо-восток"; dir3 = "На юго-запад"; dir4 = "На юго-восток"; ex = "Выйти"; map = { ["00"] = { name = [[Вы стоите у входа в глубокую пещеру. Стены здесь неровные и извилистые, образую причудливые переплетения длинный коридоров. Кто знает, куда они приведут? На каменистом полу едва ли можно заметить какие-либо следы. ]]; e1 = "10"; e2 = "11"; }; ["10"] = { e1 = "20"; e2 = "21"; e4 = "00"; }; ["11"] = { e1 = "21"; e2 = "22"; e3 = "00"; }; ["20"] = { e1 = "30"; e4 = "10"; }; ["21"] = { e1 = "31"; e2 = "32"; e3 = "10"; e4 = "11"; }; ["22"] = { e2 = "33"; e3 = "11"; }; ["30"] = { e1 = "40"; e2 = "41"; e4 = "20"; }; ["31"] = { e2 = "42"; e4 = "21"; }; ["32"] = { e2 = "43"; e3 = "21"; }; ["33"] = { e3 = "22"; }; ["40"] = { e2 = "50"; e4 = "30"; }; ["41"] = { e3 = "30"; }; ["42"] = { e1 = "51"; e3 = "31"; }; ["43"] = { e1 = "52"; e3 = "32"; enter = function(s) if not s.fight then s.fight = true; walk("dyp_crab_fight_intro"); end; end; }; ["50"] = { e3 = "40"; }; ["51"] = { e4 = "42"; }; ["52"] = { e4 = "43"; enter = function(s) if (not exist(dyp_, s)) then move(ven_skeleton, s); end; end; exit = function(s) end; }; }; }; dyp_crab_fight_intro = cutscene("dyp_crab_fight_intro", "Пещера", [[Впереди, вы замечаете какое-то движение. Луч прожетора выхватывает огромные острые клешни гигантского краба, устремившегося к вам. Следом за ним вы видите множество крабов поменьше, также ползущих к вам на своих тонких острых ногах. ]], "dyp_crab_fight"); dyp_crab_fight_win = cutscene("dyp_crab_fight_win", "Пещера", [[Отбившись от крабов, вы остаетесь одни в темном лабиринте пещер. ]], "dyp_crab_cave"); dyp_cmbt_learr = combatant { nam = "dyp_cmbt_learr"; disp2 = "Леарр"; disp3 = "Леарр"; x = 5; y = 7; pic = "images/learr.png"; ally = "Я не буду атаковать союзника."; nohit = "Я не буду атаковать союзника."; noshoot = "Я не буду атаковать союзника."; hp = 10; hasSpear = true; 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 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; return; 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; return; elseif (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 --100% enemy.hp = enemy.hp - 2; pn("Леарр бьет " .. enemy.disp2 .. " копьем и попадает. "); 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("Леарр бьет " .. 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; }; dyp_cmbt_wright = combatant { nam = "za_cmbt_wright"; disp2 = "Райта"; disp3 = "Райту"; x = 5; y = 7; pic = "images/jack.png"; ally = "Я не буду атаковать союзника."; nohit = "Я не буду атаковать союзника."; noshoot = "Я не буду атаковать союзника."; hp = 10; hasHarpoon = true; 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; if (s.x ~= 6 or s.y ~=3) then local ppath = here():getWalkDistance(s.x, s.y, 6, 3); if (ppath.l < path.l) then s.x = ppath.p[2][1]; s.y = ppath.p[2][2]; pn("Райт идет к укрытию"); end; end; -- 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) then 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; return; 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; return; elseif (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 --100% enemy.hp = enemy.hp - 2; pn("Райт бьет " .. enemy.disp2 .. " гарпуном и попадает. "); return; else local dist = math.sqrt((s.x - here().plX) * (s.x - here().plX) + (s.y - here().plY) * (s.y - here().plY));--here().getDistance(here().plX, here().plY, s.x, s.y); if (rnd(4) > dist - 2) then s.hasSpear = false; enemy.hp = enemy.hp - 2; pn("Райт стреляет в " .. enemy.disp2 .. " гарпуном и попадает. "); else pn("Райт стреляет в " .. enemy.disp2 .. " гарпуном, но промахивается. "); end; return; end; else s.hasHarpoon = true; pn("Райт перезаряжает ружье. "); 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; }; dyp_cmbt_radcliffe = combatant { nam = "dyp_cmbt_radcliffe"; disp2 = "Рэклиффа"; disp3 = "Рэдклиффу"; x = 5; y = 7; pic = "images/walter.png"; ally = "Я не буду атаковать союзника."; nohit = "Я не буду атаковать союзника."; noshoot = "Я не буду атаковать союзника."; hp = 10; hasHarpoon = true; 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; if (s.x ~= 6 or s.y ~=3) then local ppath = here():getWalkDistance(s.x, s.y, 6, 3); if (ppath.l < path.l) then s.x = ppath.p[2][1]; s.y = ppath.p[2][2]; pn("Рэдклифф идет к укрытию"); end; end; -- 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) then 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; return; 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; return; elseif (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 --100% enemy.hp = enemy.hp - 2; pn("Рэдклифф бьет " .. enemy.disp2 .. " гарпуном и попадает. "); return; else local dist = math.sqrt((s.x - here().plX) * (s.x - here().plX) + (s.y - here().plY) * (s.y - here().plY));--here().getDistance(here().plX, here().plY, s.x, s.y); if (rnd(4) > dist - 2) then s.hasSpear = false; enemy.hp = enemy.hp - 2; pn("Рэдклифф стреляет в " .. enemy.disp2 .. " гарпуном и попадает. "); else pn("Рэдклифф стреляет в " .. enemy.disp2 .. " гарпуном, но промахивается. "); end; return; end; else s.hasHarpoon = true; pn("Рэдклифф перезаряжает ружье. "); 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; }; dyp_cmbt_anna = combatant { nam = "dyp_cmbt_anna"; disp2 = "Анну"; disp3 = "Анне"; x = 5; y = 7; pic = "images/anna.png"; ally = "Я не буду атаковать союзника."; nohit = "Я не буду атаковать союзника."; noshoot = "Я не буду атаковать союзника."; hp = 10; hasHarpoon = true; 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; if (s.x ~= 6 or s.y ~=3) then local ppath = here():getWalkDistance(s.x, s.y, 6, 3); if (ppath.l < path.l) then s.x = ppath.p[2][1]; s.y = ppath.p[2][2]; pn("Анна идет к укрытию"); end; end; -- 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) then 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; return; 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; return; elseif (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 --100% enemy.hp = enemy.hp - 2; pn("Анна бьет " .. enemy.disp2 .. " гарпуном и попадает. "); return; else local dist = math.sqrt((s.x - here().plX) * (s.x - here().plX) + (s.y - here().plY) * (s.y - here().plY));--here().getDistance(here().plX, here().plY, s.x, s.y); if (rnd(4) > dist - 2) then s.hasSpear = false; enemy.hp = enemy.hp - 2; pn("Анна стреляет в " .. enemy.disp2 .. " гарпуном и попадает. "); else pn("Анна стреляет в " .. enemy.disp2 .. " гарпуном, но промахивается. "); end; return; end; else s.hasHarpoon = true; pn("Анна перезаряжает ружье. "); end; local plpath = here():getWalkDistance(s.x, s.y, pl.x, pl.y); if (plpath.l > 2) then s.x = plpath.p[2][1]; s.y = plpath.p[2][2]; pn("Анна идет к вам. "); end; end; dsc = function(s) if (s.hp > 0) then return [[ {Анна} готова к бою. ]]; else return [[ {Анна} без сознания. ]]; end; end; }; dyp_king_crab = combatant { nam = "dyp_king_crab"; disp2 = "краба"; disp3 = "крабу"; x = 4; y = 1; hp = 4; pic = "images/king_crab.png"; shootHit = "Вы стреляете в краба и попадаете в него. "; shootMiss = "Вы стреляете в краба, но не попадаете в него. "; shootKill = "Вы стреляете в краба и он умирает. "; handHit = "Вы ударяете краба. "; handKill = "Вы ударяет краба, убивая его. "; handFar = "Слишком далеко. "; enemy = true; dsc = function(s) if (s.hp > 0) then return "{Краб} готов к бою. "; 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("Краб ждет. "); 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 (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 - 2; pn("Краб бьет " .. enemy.disp2 .. " и попадает. "); return; end; print("fug2",path); s.x = path.p[2][1]; s.y = path.p[2][2]; pn("Краб идет к " .. enemy.disp3 .. ". "); end; }; dyp_little_crab = function(nam, index, x, y) return combatant { nam = nam; disp2 = "детеныша краба " .. tostring(index); disp3 = "детенышу краба " .. tostring(index); x = x; y = y; hp = 2; pic = "images/little_crab_".. index ..".png"; shootHit = "Вы стреляете в детеныша краба и попадаете в него. "; shootMiss = "Вы стреляете в детеныша краба, но не попадаете в него. "; shootKill = "Вы стреляете в детеныша краба и он умирает. "; handHit = "Вы ударяете детеныша краба. "; handKill = "Вы ударяет детеныша краба, убивая его. "; handFar = "Слишком далеко. "; enemy = true; dsc = function(s) if (s.hp > 0) then return "{Детеныш краба " .. tostring(index).. "} готов к бою. "; 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 (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; print("fug2",path); s.x = path.p[2][1]; s.y = path.p[2][2]; pn("Детеныш краба ".. tostring(index).. " идет к " .. enemy.disp3 .. ". "); end; }; end; dyp_crab_fight = battlefield { nam = "Пещера"; plX = 4; plY = 7; map = { {2,0,0,0,0,0,2}; {2,0,0,0,0,0,2}; {2,1,0,0,0,0,2}; {2,0,0,1,0,1,2}; {2,0,1,0,0,0,2}; {2,0,0,0,0,1,2}; {2,0,0,0,0,0,2}; }; win = "dyp_crab_cave_win"; lose = "game_over_crab_cave"; obstacle = "images/stones.png"; underwater = true; entered = function(s) --TODO prepend player associate - anna, learr, walter or jack if (char_learr.follow) then table.insert(s.obj, 1, dyp_cmbt_learr); s.plX = 3; elseif (char_anna.follow) then table.insert(s.obj, 1, dyp_cmbt_anna); s.plX = 3; elseif (char_wright.follow) then table.insert(s.obj, 1, dyp_cmbt_wright); s.plX = 3; elseif (char_radcliffe.follow) then table.insert(s.obj, 1, dyp_cmbt_radcliffe); s.plX = 3; end; end; obj = { "dyp_king_crab", dyp_little_crab("dyp_little_crab_1", 1, 2, 1); dyp_little_crab("dyp_little_crab_2", 2, 3, 1); dyp_little_crab("dyp_little_crab_3", 3, 5, 1); dyp_little_crab("dyp_little_crab_4", 4, 6, 1); dyp_little_crab("dyp_little_crab_5", 5, 3, 2); dyp_little_crab("dyp_little_crab_6", 6, 4, 2); dyp_little_crab("dyp_little_crab_7", 7, 5, 2); }; }; dyp_crab_cave_win = cutscene("dyp_crab_cave_win", "Пещера", [[Вы расправляетесь с выводком крабов, поселившихся в этой пещере. Чуть поодаль, вы видите тело навьяра, истерзанное этими монстрами. ]], "dyp_crab_cave");