diff --git a/atlantis_dyp.lua b/atlantis_dyp.lua --- a/atlantis_dyp.lua +++ b/atlantis_dyp.lua @@ -5,11 +5,13 @@ global { dyp_quest_state = 0; -- 0 - не начат - -- 1 - получено задание от вождя - -- 2 - узнали, что карту унес Аэдиенрр в Дипатреанотр - -- 3 - узнали, куда унес карту Аэдиенрр из Дипатреанотра - -- 4 - Отдали оригинал КНО в Ираафаанотр - -- 5 - Отдали жезл в Ираафаанотр + -- 1 - вождь попросил светящуюся капсулу с Атлантиды + -- 2 - вождь попросил зуб акулы + -- 3(1) - вождь попросил карту + -- 4(2) - узнали, что карту унес Аэдиенрр в Дипатреанотр + -- 5(3) - узнали, куда унес карту Аэдиенрр из Дипатреанотра + -- 6(4) - Отдали оригинал КНО в Ираафаанотр + -- 7(5) - Отдали жезл в Ираафаанотр dyp_stones_known = false; dyp_lib_stone_state = 0; }; @@ -65,7 +67,7 @@ dyp_guardian = npc { end; end; dlg = function(s) - if dyp_quest_state == 2 then + if dyp_quest_state == 4 then return "dyp_guardian_dlg"; end; end; @@ -86,7 +88,7 @@ dyp_guardian_dlg = dlg { {tag="no_speak"}; {always = true; "[Уйти]", code [[ back(); ]]}; {tag="speak"}; - {"[Кодировщик] Я ищу навьяра по имени Аэдиенрр. Он проходил здесь недавно.", [[Стражник кивает: "Аэдиенрр из Ираафаанотра ушел на восток несколько дней назад. Кажется, он направлялся к обелискам". ]], code [[ dyp_quest_state = 3; ]]}; + {"[Кодировщик] Я ищу навьяра по имени Аэдиенрр. Он проходил здесь недавно.", [[Стражник кивает: "Аэдиенрр из Ираафаанотра ушел на восток несколько дней назад. Кажется, он направлялся к обелискам". ]], code [[ dyp_quest_state = 5; ]]}; {always = true; "[Уйти]", code [[ back(); ]]}; }; }; @@ -99,6 +101,106 @@ dyp_obelisk = obj { end; }; +dyp_obelisk_puzzle = room { + var { + state = { + 0, 1, 2, 3, + 4, 5, 6, 7, + 8, 9,10,11, + 12,13,14,15 + }; + set = false; + }; + win = ""; + nam = "Дипатреанотр, центр"; + entered = function(s) + if not s.set then + s.set = true; + local details = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; + local matches = 3; + for i = 1, 16 do + local item; + local index; + repeat + index = rnd(#details); + item = details[index]; + until matches > 0 or item ~= s.state[i] or i == 16; + table.remove(details, index); + s.state[i] = item; + end; + local k = 1; + for i = 1, 16 do + if s.state[i] == 1 then + for j = i + 1, 16 do + if s.state[i] > s.state[j] and s.state[j] ~= 12 then + k = k + 1; + end; + end; + else + k = k + math.floor(i / 4); + end; + end; + if k % 2 == 0 then + for i = 1, 16 do + if s.state[i] == 14 then + s.state[i] = 15; + elseif s.state[i] == 15 then + s.state[i] = 14; + end; + end; + end; + end; + end; + pic = function(s) + local p = 'images/dyp15.png'; + for i = 1, #s.state do + local f = s.state[i]; + p = p .. ';images/dyp15_' .. tostring(f) .. '.png@' .. tostring(((i - 1) % 4) * 40) .. ',' .. tostring(math.floor((i - 1) / 4) * 40); + end; + print(p); + return p; + end; + click = function(s, x, y) + local tx = math.floor(x / 40); + local ty = math.floor(y / 40); + local tile = tx + ty * 4 + 1; + if (s.state[tile] ~= 12) then + if (tile - 4 > 0) and s.state[tile - 4] == 12 then + tx = s.state[tile]; + s.state[tile] = s.state[tile - 4]; + s.state[tile - 4] = tx; + elseif tx > 0 and s.state[tile - 1] == 12 then + tx = s.state[tile]; + s.state[tile] = s.state[tile - 1]; + s.state[tile - 1] = tx; + elseif tx < 3 and s.state[tile + 1] == 12 then + tx = s.state[tile]; + s.state[tile] = s.state[tile + 1]; + s.state[tile + 1] = tx; + elseif (tile + 4) <= 16 and s.state[tile + 4] == 12 then + tx = s.state[tile]; + s.state[tile] = s.state[tile + 4]; + s.state[tile + 4] = tx; + end; + end; + if not s:check_win() then + walkin(here()); + else + p = [[Одна из каменных плит рядом с обелиском отодвигается. В образовавшейся выемке вы видите небольшой светящийся красным светом камень. Вы забираете камень себе. ]]; + put(dyp_item_stone_red, pl); + walk(dyp_center); + end; + end; + check_win = function(s) + for i = 1, #s.state do + if s.state[i] ~= i - 1 then + return false; + end; + end; + return true; + end; +}; + dyp_navjiarr = npc{ nam = "dyp_navjiarr"; dsc = [[Немногие {навьяры}, находящиеся сейчас на площади с интересом оглядываютс на Левиафан и вас. ]]; @@ -268,10 +370,11 @@ dyp_chief_dlg = dlg { s.lse = true; pon("lseryanotrr"); end; - if dyp_stones_known then + if dyp_stones_known and dup_quest_state == 0 then + pon("quest"); pon("star_map"); end; - if dyp_quest_state == 2 and not s.aed then + if dyp_quest_state == 4 and not s.aed then s.aed = true; pon("aedienrr"); end; @@ -283,9 +386,29 @@ dyp_chief_dlg = dlg { {always=true, "[Уйти]", code [[ back(); ]]}; {tag="speak"}; {tag="lseryanotrr", false, "[Кодировщик] Я ищу карту пути в Лсэрианотр.", [[Вождь отвечает: "Ты спроси в храме или в библиотеке. Я ничего такого не знаю". ]]}; - {tag="star_map", false, "[Кодировщик] Мне нужен камень из твоего жезла. Что я могу предложить в обмен на него?", [[Глаза вождя загораются, он ухмыляется. По плавникам быстро, словно в нетерпении, бегут цветные полосы: "Я хочу карту небесных огней из Ираафаанотра. Принеси ее и забирай этот жезл вместе с камнем". ]], code [[ dyp_quest_state = 1; ]]}; + --[[{tag="star_map", false, "[Кодировщик] Мне нужен камень из твоего жезла. Что я могу предложить в обмен на него?", [ [Глаза вождя загораются, он ухмыляется. По плавникам быстро, словно в нетерпении, бегут цветные полосы: "Я хочу карту небесных огней из Ираафаанотра. Принеси ее и забирай этот жезл вместе с камнем". ] ], code [ [ dyp_quest_state = 1; ] ]};]] + {tag="quest", false, "[Кодировщик] Мне нужен камень из твоего жезла. Что я могу предложить в обмен на него?", [[Глаза вождя загораются, он ухмыляется. По плавникам быстро, словно в нетерпении бегут цветные полосы: "Принеси мне три вещи, что я попрошу и получишь жезл вместе с камнем". ]], code [[psub("agree_quest");]]}; + {tag="quest1", false, "[Отдать светильник] [Кодировщик] Вот то, что ты просил. Что тебе еще нужно?", [[Вождь с интересом рассматривает принесенный вами прибор, после чего ставит его на стол перед собой и говорит: "Еще мне нужен акулий зуб". ]], code [[ remove("item_dyp_lamp", pl); dyp_quest_state = 2; ]]}; + {tag="quest2", false, "[Отдать зуб акулы] [Кодировщик] Вот то, что ты просил. Что тебе еще нужно?", [[Вождь кладет зуб на стол рядом со светильником и говорит: "Я хочу карту небесных огней из Ираафаанотра. Принеси ее и забирай этот жезл вместе с камнем". ]], code [[ remove("item_dyp_shark_tooth", pl); dyp_quest_state = 3; psub("agree_quest2"); ]]}; + {tag="quest3", false, "[Отдать карту небесных огней] Вот то, что ты просил. Я могу забрать камень?", function(s) + if have(item_dyp_star_map_copy) then + -- отдаем копию + return ""; + elseif have(item_dyp_star_map) then + --[[Вождь отдает вам жезл, как и обещал. ]] + -- отдаем оригинал, но жезл из тайника отдали в Ираафаанотр + -- отдаем оригинал, жезл из тайника не отдали в Ираафаанотр + return ""; + end; + end}; {tag="aedienrr", "[Кодировщик] Ваш город посещал Аэдиенрр из Ираафаанотра недавно?", [[Вождь отвечает: "Не мое дело следить за этим. Спроси у стражников". ]]}; {always=true, "[Кодировщик] Я пойду.", [[Вождь прощается с вами: "Ты возвращайся". Он садится обратно на трон и закрывает глаза. ]], code [[ back(); ]]}; + {tag="agree_quest"}; + {always=true,"[Кодировщик] Что ты хочешь, чтобы я принес?", [[Вождь отвечает: "Первая вещь, что мне нужна -- это светящаяся капсула из вашего города". ]], code [[ dyp_quest_state = 1; pret(); ]]}; + {always=true,"[Кодировщик] Я передумал. ", [[Вождь пожимает плечами. ]], code [[ pon("quest"); pret(); ]]}; + {tag="agree_quest2"}; + {always=true,"[Кодировщик] Как к этому отнесутся в Ираафаанотре?", [[Вождь отвечает: "Они могут быть против. Уговори их". ]], code [[ pret(); ]]}; + {always=true,"[Кодировщик] Я не буду этого делать.", [[Вождь отвечает: "Я отдам посох только за карту небесных огней". ]], code [[ pret(); ]]}; }; }; @@ -369,7 +492,7 @@ dyp_temple_south_far = room { dyp_temple_north_west = room { nam = "Океан"; no_exit = function(s) - if dyp_quest_state ~= 3 then + if dyp_quest_state ~= 5 then return [[Нет смысла покидать Левиафан здесь. ]]; end; end; @@ -443,7 +566,7 @@ dyp_temple_crevice_far_west = room { dyp_temple_warning = room { nam = "Океан"; no_exit = function(s) - if dyp_quest_state ~= 3 then + if dyp_quest_state ~= 5 then return [[Нет смысла покидать Левиафан здесь. ]]; end; end; @@ -498,7 +621,7 @@ dyp_temple_cliff_1_footprints = obj { dyp_temple_cliff_2 = room { nam = "Океан"; no_exit = function(s) - if dyp_quest_state ~= 3 then + if dyp_quest_state ~= 5 then return [[Нет смысла покидать Левиафан здесь. ]]; end; end;