ven_towers_machine = obj { nam = "ven_towers_machine"; dsc = "У одной из стен помещения вы видите странную {машину} - на небольшом экране светятся несколько прямоугольников разных цветов. Ниже расположены три кнопки. "; act = function(s) if (not ven_towers_machine_look.solved) then walkin(ven_towers_machine_look); end; end; }; ven_towers_machine_look = room { var { gears = {1,1,1,1}; from = 0; solved = false; }; colors = { 'red'; 'red'; 'green'; }; nam = "Ущелье, тайное хранилище"; underwater = true; pic = function(s) -- local p = "box:96x48,white,255;box:1x48,black,255@16,0;box:1x48,black,255@48,0;box:1x48,black,255@80,0"; -- for g = 1,#s.gears do -- p = p .. ";box:" .. tostring(g * 8) .. "x11,green,255@" .. tostring((s.gears[g] - 1) * 32 + 16 - g * 4) .. "," .. tostring((g - 1) * 12 + 1); -- end; local p = 'images/ven_ravine_towers.png'; local f = false; for g = 1, #s.gears do local color = s.colors[s.gears[g]]; if s.from == s.gears[g] and not f then f = true; color = 'yellow'; end; p = p ..';images/ven_ravine_towers_' .. color .. '_' .. tostring(5 - g) .. '.png@' .. tostring((s.gears[g] - 1) * 103 + 6) .. ',' .. tostring((g - 1) * 47 + 6); end; return p; end; move = function(s, target) local rv = ""; local nums, numt; for g = 1, #s.gears do if (s.gears[g] == s.from) then nums = g; break; end; end; for g = 1, #s.gears do if (s.gears[g] == target) then numt = g; break; end; end; if (not nums or numt and numt < nums) then rv = "Машина издает легкий щелчок и ничего не происходит. "; else s.gears[nums] = target; rv = "Машина издает легкий щелчок и изображение на экране меняется. "; end; s.solved = true; for g = 1, #s.gears do if (s.gears[g] ~= 3) then s.solved = false; end; end; if (s.solved) then ven_towers_lever1:disable(); ven_towers_lever2:disable(); ven_towers_lever3:disable(); rv = rv .. "Дверь внутрь открывается. "; end; ven_towers_lever1.state = 0; ven_towers_lever2.state = 0; ven_towers_lever3.state = 0; ven_towers_machine_look.from = 0; return rv; end; dsc = [[На небольшом экране светятся несколько прямоугольников разных цветов. Ниже расположены три кнопки. ]]; obj = { 'ven_towers_lever1', 'ven_towers_lever2', 'ven_towers_lever3' }; way = { kh_vroom("Назад", "ven_ravine_crypt_entrance"); }; }; ven_towers_lever1 = obj { var { state = 0; }; nam = "ven_towers_lever1"; dsc = "{Нажать кнопку 1}^"; act = function(s) local rv = [[Вы нажимаете кнопку. ]]; if (s.state == 0) then s.state = 1; if (ven_towers_machine_look.from == 0) then ven_towers_machine_look.from = 1; else rv = rv .. ven_towers_machine_look:move(1); end; else s.state = 0; ven_towers_machine_look.from = 0; end; return rv; end; }; ven_towers_lever2 = obj { var { state = 0; }; nam = "ven_towers_lever2"; dsc = "{Нажать кнопку 2}^"; act = function(s) local rv = [[Вы нажимаете кнопку. ]]; if (s.state == 0) then s.state = 1; if (ven_towers_machine_look.from == 0) then ven_towers_machine_look.from = 2; else rv = rv .. ven_towers_machine_look:move(2); end; else s.state = 0; ven_towers_machine_look.from = 0; end; return rv; end; }; ven_towers_lever3 = obj { var { state = 0; }; nam = "ven_towers_lever3"; dsc = "{Нажать кнопку 3}^"; act = function(s) local rv = [[Вы нажимаете кнопку. ]]; if (s.state == 0) then s.state = 1; if (ven_towers_machine_look.from == 0) then ven_towers_machine_look.from = 3; else rv = rv .. ven_towers_machine_look:move(3); end; else s.state = 0; ven_towers_machine_look.from = 0; end; return rv; end; }; ven_temple_labyrinth_l1 = labyrinth { var { position = "03"; lock1 = true; lock2 = true; lock3 = true; }; dir = { "На север"; "На восток"; "На юг"; "На запад"; "Выйти"; }; nam = "Венаэданотр, храм, лабиринт"; dsc = function(s) if (s.map[s.position].name) then return s.map[s.position].name; else return [[Вы стоите посреди запутанного лабиринта. Металлические стены по сторонам здесь ничем не отличаются от стен в других коридорах этого лабиринта. Пол и потолок излучают мягкий белый свет. ]]; end; end; enter = function(s) if (exist(ven_shark, s) and ven_shark.active) then local no = s.map[ven_shark.position].e1; local ea = s.map[ven_shark.position].e2; local so = s.map[ven_shark.position].e3; local we = s.map[ven_shark.position].e4; if (no and s.oldposition == no or no and s.position == no) then walk(game_over_eaten_by_shark); end; if (no and s.oldposition == s.map[no].e1) then ven_shark.position = no; end; if (ea and s.oldposition == ea) then walk(game_over_eaten_by_shark); end; if (ea and s.oldposition == s.map[ea].e2) then ven_shark.position = ea; end; if (so and s.oldposition == so) then walk(game_over_eaten_by_shark); end; if (so and s.oldposition == s.map[so].e3) then ven_shark.position = so; end; if (we and s.oldposition == we) then walk(game_over_eateon_by_shark); end; if (we and s.oldposition == s.map[we].e4) then ven_shark.position = we; end; if (no and s.oldposition == s.map[no].e2) then ven_shark.position = no; end; if (ea and s.oldposition == s.map[ea].e1) then ven_shark.position = ea; end; if (no and s.oldposition == s.map[no].e4) then ven_shark.position = no; end; if (we and s.oldposition == s.map[we].e1) then ven_shark.position = we; end; if (so and s.oldposition == s.map[so].e2) then ven_shark.position = so; end; if (ea and s.oldposition == s.map[ea].e3) then ven_shark.position = ea; end; if (so and s.oldposition == s.map[so].e4) then ven_shark.position = so; end; if (we and s.oldposition == s.map[we].e3) then ven_shark.position = we; end; end; end; obj = { "ven_octopus"; }; map = { ["00"] = { e1 = "10"; e2 = "01"; }; ["01"] = { e4 = "00"; enter = function(s) if (not exist(ven_chest, s)) then move(ven_chest, s); end; end; exit = function(s) remove(ven_chest, s); end; }; ["02"] = { e1 = "12"; e2 = "03"; }; ["03"] = { name = [[Вы стоите у лестницы, ведущей вниз, к главному помещению храма. Со всех сторон вас окружают металлические стены. Пол и потолок сделаны из странного светящегося материала, твердого на ощупь. ]]; e1 = "13"; e2 = "04"; e4 = "02"; ex5 = "ven_temple_qhall"; e1lock = function(s) return lock03; end; }; ["04"] = { e1 = "14", e2 = "05", e4 = "03" }; ["05"] = { e1 = "15", e2 = "06", e4 = "04" }; ["06"] = { e1 = "16"; e2 = "07"; e4 = "05"; }; ["07"] = { e4 = "06" }; ["10"] = { e1 = "20", e3 = "00" }; ["11"] = { e2 = "12", enter = function(s) if (not exist(ven_skeleton, s)) then move(ven_skeleton, s); end; if (not item_ven_spear.taken and not exist(item_ven_spear, s)) then move(item_ven_spear, s); end; end; exit = function(s) remove(ven_skeleton, s); if (not item_ven_spear.taken) then remove(item_ven_spear, s); end; end; }; ["12"] = { e3 = "02", e4 = "11" }; ["13"] = { e1 = "23", e3 = "03" }; ["14"] = { e1 = "24"; e3 = "04"; }; ["15"] = { e3 = "05"; }; ["16"] = { e1 = "26"; e3 = "06"; }; ["17"] = { e1 = "27"; enter = function(s) if (not exist(ven_cache, s)) then move(ven_cache, s); end; end; exit = function(s) remove(ven_cache, s); end; }; ["20"] = { e1 = "30"; e2 = "21"; e3 = "10"; enter = function(s) if (not exist(ven_shark, s)) then move(ven_shark, s); end; end; }; ["21"] = { e2 = "22"; e4 = "20"; }; ["22"] = { e2 = "23"; e4 = "21"; }; ["23"] = { e3 = "13"; e4 = "22"; }; ["24"] = { e1 = "34"; e3 = "14"; }; ["25"] = { e1 = "35"; e2 = "26"; }; ["26"] = { e3 = "16"; e4 = "25"; enter = function(s) walk(game_over_eaten_by_octopus); end; }; ["27"] = { e1 = "37"; e3 = "17"; }; ["30"] = { e2 = "31"; e3 = "20"; }; ["31"] = { e1 = "41"; e4 = "30"; }; ["32"] = { e1 = "42"; e2 = "33"; }; ["33"] = { e2 = "34"; e4 = "32"; }; ["34"] = { e3 = "24"; e4 = "33"; }; ["35"] = { e1 = "45"; e2 = "36"; e3 = "25"; }; ["36"] = { e2 = "37"; e4 = "35"; }; ["37"] = { e1 = "47"; e3 = "27"; e4 = "36"; e3lock = function(s) return s.lock2; end; }; ["40"] = { e1 = "50"; e2 = "41"; }; ["41"] = { e3 = "31"; e4 = "40"; }; ["42"] = { e2 = "43"; e3 = "32"; }; ["43"] = { e1 = "53"; e2 = "44"; e4 = "42"; }; ["44"] = { e2 = "45"; e4 = "43"; }; ["45"] = { name = [[ Вы стоите посреди запутанного лабиринта. Металлические стены по сторонам здесь ничем не отличаются от стен в других коридорах этого лабиринта, за исключением двери на юге. ]]; e3 = "35"; e4 = "44"; e3lock = function(s) return s.lock1; end; enter = function(s) if (not exist(ven_first_lock, s)) then move(ven_first_lock, s); end; end; exit = function(s) remove(ven_first_lock, s); end; }; ["46"] = { e1 = "56"; enter = function(s) if (not exist(ven_lever, s)) then move(ven_lever, s); end; end; exit = function(s) remove(ven_lever, s); end; }; ["47"] = { e1 = "57"; e3 = "37"; }; ["50"] = { e1 = "60"; e3 = "40"; }; ["51"] = { e1 = "61"; e2 = "52"; }; ["52"] = { e2 = "53"; e4 = "51"; }; ["53"] = { e1 = "63"; e3 = "43"; e4 = "52"; }; ["54"] = { e1 = "64"; e2 = "55"; }; ["55"] = { e2 = "56"; e4 = "54"; }; ["56"] = { name = [[ Вы стоите посреди запутанного лабиринта. Металлические стены по сторонам здесь ничем не отличаются от стен в других коридорах этого лабиринта, за исключением двери на западе. ]]; e1 = "66"; e3 = "46"; e4 = "55"; e4lock = function(s) return s.lock3; end; enter = function(s) if (not exist(ven_second_lock, s)) then move(ven_second_lock, s); end; end; exit = function(s) remove(ven_second_lock, s); end; }; ["57"] = { e1 = "67"; e3 = "47"; }; ["60"] = { e1 = "70"; e2 = "61"; e3 = "50"; }; ["61"] = { e3 = "51"; e4 = "60"; }; ["62"] = { e1 = "72"; e2 = "63"; }; ["63"] = { e3 = "53"; e4 = "62"; }; ["64"] = { e1 = "74"; e3 = "54"; }; ["65"] = { e1 = "75"; e2 = "66"; }; ["66"] = { e3 = "56"; e4 = "65"; }; ["67"] = { e1 = "77"; e3 = "57"; }; ["70"] = { e2 = "71"; e3 = "60"; }; ["71"] = { e2 = "72"; e4 = "70"; }; ["72"] = { e3 = "62"; e4 = "71"; }; ["73"] = { e2 = "74"; ex5 = "ven_temple_labyrinth_l2"; }; ["74"] = { e3 = "64"; e4 = "73"; }; ["75"] = { e2 = "76"; e3 = "65"; }; ["76"] = { e2 = "77"; e4 = "75"; }; ["77"] = { e3 = "67"; e4 = "76"; }; }; }; ven_shark = obj { var { position = "00", active = true; }; nam = "ven_shark"; dsc = function(s) --local d = 0; local seen = false; local no = ven_temple_labyrinth_l1.map[ven_temple_labyrinth_l1.position].e1; local ea = ven_temple_labyrinth_l1.map[ven_temple_labyrinth_l1.position].e2; local so = ven_temple_labyrinth_l1.map[ven_temple_labyrinth_l1.position].e3; local we = ven_temple_labyrinth_l1.map[ven_temple_labyrinth_l1.position].e4; if (s.position == ven_temple_labyrinth_l1.position) then seen = true; p [[Рядом с собой ]]; end; if (no and s.position == no) then seen = true; p [[На севере ]]; end; if (no and s.position == ven_temple_labyrinth_l1.map[no].e1) then seen = true; p [[Вдалеке на севере ]]; end; if (ea and s.position == ea) then seen = true; p [[На востоке ]]; end; if (ea and s.position == ven_temple_labyrinth_l1.map[ea].e2) then seen = true; p [[Вдалеке на востоке ]]; end; if (so and s.position == so) then seen = true; p [[На юге ]]; end; if (so and s.position == ven_temple_labyrinth_l1.map[so].e3) then seen = true; p [[Вдалеке на юге ]]; end; if (we and s.position == we) then seen = true; p [[На западе ]]; end; if (we and s.position == ven_temple_labyrinth_l1.map[we].e4) then seen = true; p [[Вдалеке на западе ]]; end; if (no and s.position == ven_temple_labyrinth_l1.map[no].e2 or ea and s.position == ven_temple_labyrinth_l1.map[ea].e1) then seen = true; p [[На северо-востоке ]]; end; if (no and s.position == ven_temple_labyrinth_l1.map[no].e4 or we and s.position == ven_temple_labyrinth_l1.map[we].e1) then seen = true; p [[На северо-западе ]]; end; if (so and s.position == ven_temple_labyrinth_l1.map[so].e2 or ea and s.position == ven_temple_labyrinth_l1.map[ea].e3) then seen = true; p [[На юго-востоке ]]; end; if (so and s.position == ven_temple_labyrinth_l1.map[so].e4 or we and s.position == ven_temple_labyrinth_l1.map[we].e3) then seen = true; p [[На юго-западе ]]; end; if (seen) then if (s.active) then p "вы видите мчащуюся к вам навстречу {акулу}. "; else p "вы видите мертвую акулу, пронзенную коралловым копьем. "; end; else if (s.active) then p [[Где-то в лабиринте вас поджидает кровожадная акула. ]]; else return false; end; end; end; used = function(s, o) if (o == item_ven_spear) then local no = ven_temple_labyrinth_l1.map[ven_temple_labyrinth_l1.position].e1; local ea = ven_temple_labyrinth_l1.map[ven_temple_labyrinth_l1.position].e2; local so = ven_temple_labyrinth_l1.map[ven_temple_labyrinth_l1.position].e3; local we = ven_temple_labyrinth_l1.map[ven_temple_labyrinth_l1.position].e4; if (s.position == no or s.position == ea or s.position == so or s.position == we) then remove(item_ven_spear, pl); s.active = false; return [[Вы протыкаете акулу копьем. Она несколько раз дергается и затихает. Копье застревает в теле рыбы и вы не можете вытащить его. ]]; else return [[Акула слишком далеко. ]]; end; end; end; }; ven_chest = obj { var { state = 0; }; nam = "ven_chest"; dsc = [[ В конце коридора стоит запертый {сундук}. ]]; act = function(s) walkin("ven_chest_look"); end; }; ven_chest_look = room { var { state = {0,0,0,0}; taken = false; }; nam = "ven_chest_look"; underwater = true; disp = "Венаэданотр, храм"; not_follow = true; pic = function(s) local p = "images/ven_chest.png"; for i = 1, #s.state do p = p .. ";images/ven_chest_" .. tostring(s.state[i]) .. ".png@" .. tostring(85 + (i - 1) * 38) .. ",150"; end; return p; end; click = function(s, x, y) if y > 150 and y <= 199 then if x > 85 and x < 121 then return ven_chest_ring1:act(); elseif x >= 123 and x < 159 then return ven_chest_ring2:act(); elseif x >= 161 and x < 197 then return ven_chest_ring3:act(); elseif x >= 199 and x < 235 then return ven_chest_ring4:act(); end; end; end; dsc = function(s) return [[ На поверхности сундука вы видите обозначения из цветных полос - очевидно это какое-то сообщение. На крышке вы видите четыре вращающихся кольца, на которые нанесены метки шести цветов: фиолетовый, синий, зеленый, желтый, оранжевый, красный. ]]; end; checkLock = function(s) if (s.state[1] == 5 and s.state[2] == 3 and s.state[3] == 3 and s.state[4] == 2) then stead.ref("ven_chest_open"):enable(); return true; else stead.ref("ven_chest_open"):disable(); return false; end; end; obj = { 'ven_chest_ring1'; 'ven_chest_ring2'; 'ven_chest_ring3'; 'ven_chest_ring4'; 'ven_chest_open'; 'ven_chest_away'; }; }; ven_chest_ring1 = kh_vobj("ven_chest_ring1", "{Повернуть первое кольцо.}^", function(s) here().state[1] = here().state[1] + 1; if (here().state[1] > 5) then here().state[1] = 0; end; local t = "Вы поворачиваете кольцо на одно деление. "; if (here():checkLock()) then t = t .. "Вы слышите легкий щелчок. "; end; return t; end); ven_chest_ring2 = kh_vobj("ven_chest_ring2", "{Повернуть второе кольцо.}^", function(s) here().state[2] = here().state[2] + 1; if (here().state[2] > 5) then here().state[2] = 0; end; local t = "Вы поворачиваете кольцо на одно деление. "; if (here():checkLock()) then t = t .. "Вы слышите легкий щелчок. "; end; return t; end); ven_chest_ring3 = kh_vobj("ven_chest_ring3", "{Повернуть третье кольцо.}^", function(s) here().state[3] = here().state[3] + 1; if (here().state[3] > 5) then here().state[3] = 0; end; local t = "Вы поворачиваете кольцо на одно деление. "; if (here():checkLock()) then t = t .. "Вы слышите легкий щелчок. "; end; return t; end); ven_chest_ring4 = kh_vobj("ven_chest_ring4", "{Повернуть четвертое кольцо.}^", function(s) here().state[4] = here().state[4] + 1; if (here().state[4] > 5) then here().state[4] = 0; end; local t = "Вы поворачиваете кольцо на одно деление. "; if (here():checkLock()) then t = t .. "Вы слышите легкий щелчок. "; end; return t; end); ven_chest_open = kh_vobj("ven_chest_open", "{Открыть сундук.}^", function(s) if (not here().taken) then here().taken = true; take(ven_item_temple_key_1); return "В сундуке вы находите металлический ключ. "; else return "Сундук пуст"; end; end):disable(); ven_chest_away = kh_vobj("ven_chest_away", "{Отойти от сундука.}^", function(s) back(); end); ven_first_lock = obj { nam = "ven_first_lock"; dsc = "В двери вы видите {замочную скважину}. "; used = function(s, o) if (o == ven_item_temple_key_1) then remove(ven_item_temple_key_1, pl); ven_temple_labyrinth_l1.lock1 = false; path('e3'):enable(); return "Вы открываете дверь. "; end; return "Это сюда не подходит. "; end; }; ven_lever = obj { nam = "ven_lever"; dsc = "В южной стене расположен небольшой {рычаг}. "; act = function(s) ven_temple_labyrinth_l1.lock2 = not ven_temple_labyrinth_l1.lock2; return "Вдалеке вы слышите скрежет металла. "; end; } ven_second_lock = obj { nam = "ven_second_lock"; dsc = "В двери вы видите {замочную скважину}. "; used = function(s, o) if (o == ven_item_temple_key_2) then remove(ven_item_temple_key_2, pl); ven_temple_labyrinth_l1.lock3 = false; path('e4'):enable(); return "Вы открываете дверь. "; end; return "Это сюда не подходит. "; end; }; ven_cache = obj { var { state = 0 }; nam = "ven_cache"; dsc = function(s) if (s.state >= 1) then return [[В южной стене открыта {выемка}. ]]; else return [[В южной стене имеется небольшая {прорезь}. ]]; end; end; act = function(s) if (s.state == 1) then s.state = 2; move(ven_item_temple_key_2, pl); return [[В выемке вы находите ключ. ]]; end; end; used = function(s, o) if (s.state == 0) then if (o == ven_item_tablet) then s.state = 1; remove(ven_item_tablet, pl); return "Пластинка легко уходит в глубь прорези. Вы слышите щелчок и в стене открывается выемка, в которой лежит ключ. "; end; end; end; }; ven_skeleton = obj { nam = "ven_skeleton"; dsc = [[ У одной из стен вы видите {скелет навьяра}. ]]; act = [[ Этот скелет очень старый. ]]; }; ven_item_temple_key_1 = obj { nam = "ven_item_temple_key_1"; disp = "Ключ из храма"; inv = [[Небольшой ключик из неизвестного вам металла. Вы нашли его в храме Венаэданотра. ]]; }; ven_item_temple_key_2 = obj { nam = "ven_item_temple_key_2"; disp = "Ключ из тайника"; inv = [[Небольшой ключик из неизвестного вам металла. Вы нашли его в тайнике в храме Венаэданотра. ]]; } item_ven_spear = obj { var { taken = false; }; nam = "item_ven_spear"; disp = "Копье"; dsc = [[ В правой руке скелета вы видите {коралловое копье}. ]]; inv = [[ Коралловое копье, найденное вами в лабиринте храма Венаэданотра. ]]; tak = function(s) s.taken = true; return [[ Вы забираете копье себе. ]]; end; }; ven_octopus = obj { nam = "ven_octopus"; dsc = function(s) if (ven_temple_labyrinth_l1.position == "06") then return "Вдалеке к северу вы видите гигантского спрута. Чудовище, кажется, совершенно не заинтересовано вами, однако оно полностью закрывает проход. "; elseif (ven_temple_labyrinth_l1.position == "16") then return "К северу вы видите гигантского спрута. Чудовище, кажется, совершенно не заинтересовано вами, однако оно полностью закрывает проход. "; elseif (ven_temple_labyrinth_l1.position == "25") then return "К востоку вы видите гигантского спрута. Чудовище, кажется, совершенно не заинтересовано вами, однако оно полностью закрывает проход. "; end; return false; end; act = [[ "Лучше к нему не приближаться". ]]; }; ven_temple_labyrinth_l2 = room { nam = "Венаэданотр, храм, второй этаж"; underwater = true; dsc = [[Второй этаж храма представляет собой небольшой зал с металлическими стенами. В западной стене вы видите несколько окон, через которые открывается вид на ущелье. В северной части вы видите еле заметную дверцу. ]]; obj = { 'ven_pedestal' }; way = { kh_vroom("На первый этаж", "ven_temple_labyrinth_l1"); kh_vroom("В дверь", function(s) pr("Длинный извилистый коридор выводит вас почти к самому входу в храм. Дверь закрывается за вами столь плотно, что даже зная ее местоположение, вы не сможете ее найти. "); return "ven_temple_entrance"; end); }; }; ven_pedestal = obj { var { taken = false; }; nam = "ven_pedestal"; dsc = function(s) if (s.taken) then return [[Пьедестал в центре зала пуст. ]]; else return [[На пьедестале в центре зала вы видите небольшую металлическую пластину - судя по обозначениям это {фрагмент карты}. ]]; end; end; act = function(s) if (not s.taken) then s.taken = true; nleyyslanotrr_found = true; item_lse_map.state = item_lse_map.state + 1; return [[Вы забираете фрагмент карты себе. ]]; end; end; };