obj { level_1_visited = false; nam = 'solarscale_ally'; dsc = function(s) if here()^'above_forest' or here()^'above_near_village' or here()^'above_village' or here()^'above_crater' or here()^'above_west' then return '{Соларскейл} летит следом за мной. '; elseif here()^'forest_glade' then return '{Соларскейл} неспешно прогуливается по полянке, разглядывая и принюхиваясь к цветам. '; elseif here()^'crater_near_tower' then return '{Соларскейл} нетерпеливо машет крыльями у входа в башню. '; elseif here()^'tower_level_1' then return '{Соларскейл} медленно летает по залу, внимательно осматривая его. '; elseif here()^'tower_level_2' then return '{Соларскейл} внимательно рассматривает полки с реагентами. '; elseif here()^'tower_level_3' then return '{Соларскейл} задумчиво кружит над столом. '; elseif here()^'tower_level_4' then return '{Соларскейл} сидит на полу неподалеку от тумбочки со свечами. ' elseif here()^'tower_level_4_room_2' then return '{Соларскейл} сидит на столе рядом с компьютером. ' elseif here()^'tower_level_3_room_2' then if here().light then return '{Соларскейл} висит над стеллажами, почти под самым потолком помещения. '; else return 'Я с трудом различаю во мраке очертания {Соларскейл}. '; end; end; return 'За моей спиной машет крыльями {Соларскейл}. '; end; act = function(s) walkin('solarscale_ally_dlg'); end; life = function(s) if (not here().nofollow) then if (here() ~= where('solarscale_ally')) then if here()^'crater_near_tower' then p 'Едва заметив открывшийся проем, Соларскейл бросается к нему и, замерев перед самым входом, обращается ко мне: "Скорее, пока он не закрылся!" '; elseif here()^'tower_level_1' and not s.level_1_visited then s.level_1_visited = true; p 'Соларскейл оглядывает зал с нескрываемым восторгом. "Как здесь красиво!" -- Восклицает она. '; elseif here()^'above_forest' and where('solarscale_ally')^'forest_glade' then p 'Соларскейл бросает прощальный взгляд на поляну и взмывает в воздух следом за мной. '; else p 'Соларскейл следует за мной. '; end; remove('solarscale_ally', where('solarscale_ally')); put('solarscale_ally', where(pl)); end; elseif type(here().nofollow) == 'function' then local nofollow = here():nofollow(); if type(nofollow) == 'string' then return nofollow; end; elseif type(here().nofollow) == 'string' then return here().nofollow; end; end; } dlg { nam = 'solarscale_ally_dlg'; disp = 'Соларскейл'; enter = function(s) local from = here():from(); if from^'above_forest' then return 'Я оборачиваюсь к Соларскейл, мерно взмахивающей крыльями позади меня. Она спрашивает: "Куда мы летим?"'; elseif from^'tower_level_1' then return 'Мне пришлось окликнуть Соларскейл, чтобы она обратила на меня внимание. Она восклицает: "Это место... Потрясающе!"'; elseif from^'tower_level_2' then return 'Соларскейл тихо шепчет про себя: "Потрясающе! Если бы у меня была такая лаборатория!"'; elseif from^'tower_level_3' then return 'Соларскейл зависает в воздухе напротив меня и тихо спрашивает: "Могу я чем-то помочь?"'; elseif from^'tower_level_4' then return 'Соларскейл вопросительно смотрит на меня. '; elseif from^'tower_level_4_room_2' then if power_on then if pc_status == 'fail' then return 'Соларскейл рассматривает клавиатуру терминала. '; else return 'Соларскейл рассматривает клавиатуру терминала. Она спрашивает: "Попробуем включить?" '; end; else return 'Соларскейл рассматривает клавиатуру терминала. Она сообщает: "Похоже, электричества нет". '; end; elseif from^'tower_level_3_room_2' then if from.light then return 'Соларскейл удивленно восклицает: "Поражаюсь размеру этого склада! Кажется, эта башня внутри больше чем снаружи!"'; else return 'Соларскейл сетует: "В этой темени вообще ничего не видно! Надо бы принести свет". '; end; elseif from^'tower_level_2_room_2' then return 'Соларскейл восклицает: "Эта башня не перестает удивлять! Что еще мы здесь обнаружим?"'; elseif from^'crater_near_tower' then return 'Соларскейл повторяет, обращаясь ко мне: "Скорее, пока проход открыт!"'; elseif from^'forest_glade' then return 'Соларскейл неспешно прогуливается по полянке, разглядывая и принюхиваясь к цветам. Некоторые из них она бережно срывает и укладывает в свою сумку. Заметив мой взгляд, она произносит: "Очень красивое место. Мне здесь, правда, очень нравится". '; elseif from^'above_near_village' then return 'Я оборачиваюсь к Соларскейл, мерно взмахивающей крыльями позади меня. Она спрашивает: "Куда мы летим?" '; elseif from^'near_village' then return 'Соларскейл задумчиво смотрит вдаль, на деревню: "Приятное местечко. Не отказалась бы и я здесь пожить". '; elseif from^'above_village' then return 'Я оборачиваюсь к Соларскейл, мерно взмахивающей крыльями позади меня. Она сообщает: "Нам, драконам, лучше не показываться людям в истинном обличии. Давайте не будем здесь задерживаться". '; elseif from^'inside_crater_path' then return 'Соларскейл решительно восклицает: "Я готова! Вперед!"'; elseif from ^'inside_crater_glade' then return 'Соларскейл спрашивает: "Интересно, кто проложил эту тропу? Как будто специально для нас". '; elseif from^'above_crater' then return 'Соларскейл осматривается вокруг и произносит: "Вы выбрали лучшее место для приземления, если действительно хотите попасть в эту башню. Вернемся?" '; elseif from^'above_west' then return 'Соларскейл осматривается вокруг: "Отсюда потрясающий вид. Как вы узнали про этот кратер?" '; end; return [[Соларскейл с улыбкой смотрит на меня. ]]; end; phr = { {cond=function(s) return here():from()^'tower_level_1' and not have('tower_box') and not _('tower_level_1').keys_taken and not have('tower_level_2_key') and _('level_1_up'):disabled() end, 'У вас есть идеи, как открыть эту дверь?', 'Соларскейл задумчиво произносит: "Пока не знаю. Надо все внимательно осмотреть". '}; {cond=function(s) return here():from()^'tower_level_1' and have('tower_box') and not _('tower_level_1').keys_taken and _('level_1_up'):disabled() end, 'У вас есть идеи, что мы должны сделать?', 'Соларскейл подлетает ко мне: "Я могу взглянуть на шкатулку, что вы только что подняли?" ', only=true; {'[Протянуть шкатулку Соларскейл] Да, конечно. ', 'Соларскейл берет шкатулку и внимательно осматривает, прежде чем вернуть ее мне. Наконец, она изрекает: "Четыре замочные скважины... Наверное, и ключи должны быть где-то здесь". '}; {'Не сейчас. ', 'Соларскейл пожимает плечами: "Что же, тогда ничем не могу помочь". '}; }; {cond=function(s) return here():from()^'tower_level_1' and not have('tower_box') and _('tower_level_1').keys_taken and not have('tower_level_2_key') and _('level_1_up'):disabled() end, 'У вас есть идеи, что мы должны сделать?', 'Соларскейл спрашивает: "Вы уверены, что ни один из ключей не подходит к двери?" ', only=true; {'Нет, это ключи не от этой двери.', '"Они здесь явно не просто так. Надо поискать повнимательнее", -- задумчиво сообщает драконесса. '}; {'Предположим, не подходит.', '"Они здесь явно не просто так. Надо поискать повнимательнее", -- задумчиво сообщает драконесса. '}; {'Я не проверял.', 'Соларскейл задумчиво отвечает: "Надо бы проверить... Хотя это слишком просто..."'}; }; {cond=function(s) return here():from()^'tower_level_1' and have('tower_box') and _('tower_level_1').keys_taken and not have('tower_level_2_key') and _('level_1_up'):disabled() end, 'У вас есть идеи, что мы должны сделать?', 'Соларскейл подлетает ко мне и спрашивает: "Могу я взглянуть?" ', only=true; {'[Протянуть шкатулку, ключи и записку Соларскейл] Да, конечно. ', function(s) if solarscale_helps > 0 then open('#level1_agree'); open('#level1_disagree'); close('#level1_no_help'); return 'Соларскейл берет предметы у вас и раскладываеть их на столе. Немного подумав, она сообщает: "Кажется, у меня есть идея. Позволите попробовать?"'; else close('#level1_agree'); close('#level1_disagree'); open('#level1_no_help'); return 'Соларскейл берет предметы у вас и раскладываеть их на столе. Немного подумав, она делает вывод: "Боюсь, я не могу вам ничем помочь". '; end; end, only=true; {'#level1_agree', 'Да, конечно. ', function(s) remove('tower_box', pl); remove('tower_hint_1', pl); remove('tower_key_0', pl); remove('tower_key_1', pl); remove('tower_key_2', pl); remove('tower_key_3', pl); take('tower_level_2_key'); solarscale_helps = solarscale_helps - 1; return 'Драконесса еще некоторое время остается неподвижной, раздумывая, затем начинает перебирать ключи. Воскликнув: "Ага!" -- Она вставляет ключ за ключом в замочные скважины, и шкатулка разваливается в ее руках. Внутри шкатулки оказывается небольшой серебряный ключик. Соларскейл протягивает его мне со словами: "Попробуйте открыть им дверь". '; end}; {'#level1_disagree', 'Спасибо, но я лучше попробую сам. ', 'Соларскейл молча возвращает вам предметы. '}; {'#level1_no_help', 'Спасибо, тогда я попробую сам. ', 'Соларскейл молча возвращает вам предметы. '}; }; {'Не сейчас. ', 'Соларскейл пожимает плечами: "Что же, тогда ничем не могу помочь". '}; }; {cond=function(s) return here():from()^'tower_level_2' end, 'Вы увлекаетесь алхимией?', 'Соларскейл немного смущенно отвечает: "Мне всегда было это интересно, но... Как бы выразиться помягче... У меня не получилось ни одного сколь-либо сложного зелья. Мне очень хочется научиться этому". ', {"Жаль, мне не помешала бы ваша помощь.", 'Соларскейл опускает глаза: "Простите. Надеюсь смогу быть полезна в чем-нибудь другом". '}; }; {cond=function(s) return here():from()^'tower_level_3' and _('level_3_up'):disabled() end, 'У вас есть какие-то мысли по поводу этой загадки?', function(s) if solarscale_helps > 0 then open('#level3_agree'); open('#level3_disagree'); close('#level3_no_help'); return 'Соларскейл кивает: "Да, есть кое-что. Позволите попробовать?"' else close('#level3_agree'); close('#level3_disagree'); open('#level3_no_help'); return 'Соларскейл отрицательно мотает головой: "У меня нет никаких идей". ' end; end, only=true, {"#level3_agree", 'Да, конечно. ', function(s) remove('figure_wolf', pl); remove('figure_tiger', pl); remove('figure_lion', pl); remove('figure_knight', pl); remove('figure_tower', pl); _('tower_level_3_table').solved = true; _('level_3_up'):enable(); solarscale_helps = solarscale_helps - 1; return 'Соларскейл берет фигурки и неспешно, одну за другой, ставит их в отведенные углубления. Легкий щелчок дает нам понять, что дверь на следующий этаж башни открыта. '; end}; {"#level3_disagree", "Сначала я попробую сам. ", 'Соларскейл молча кивает. '}; {"#level3_no_help", "Что же, тогда я попробую сам. ", 'Соларскейл молча кивает. '}; }; {cond=function(s) return here():from()^'tower_level_4' and _('level_4_next_room'):disabled() end, 'Вы знаете, что мы должны сделать?', function(s) if solarscale_helps > 0 then open('#level4_agree'); open('#level4_disagree'); close('#level4_no_help'); return 'Соларскейл задумчиво произносит: "Да, думаю, я могу помочь". '; else close('#level4_agree'); close('#level4_disagree'); open('#level4_no_help'); return 'Соларскейл отрицательно мотает головой: "К сожалению, я не знаю, что здесь делать".'; end; end, only=true, {"#level4_agree", '[Позволить Соларскейл все сделать]', function(s) candles_solved = true; _('level_3_up'):enable(); solarscale_helps = solarscale_helps - 1; local c = _('tower_candelabra') if #c.notestack == 0 then local ns = {1,2,3,4,5,6,7}; for i = 1, 7 do local idx = rnd(#ns); table.insert(c.notestack, ns[idx]); table.insert(c.notesequence, c.notes[ns[idx]][2]); ns[idx] = ns[8 - i]; ns[8 - i] = nil; end; end; local ns = table.copy(c.notesequence); ns[#ns + 1] = gusts[rnd(#gusts)]; ns[#ns + 1] = 'open_door'; play_sound(ns, 600); _('level_4_next_room'):enable(); return 'Соларскейл последовательно зажигает свечи. В темноте одна за другой звучат ноты, а затем резкий порыв ветра распахивает дверцу в дальнем конце комнаты. '; end}; {"#level4_disagree", "Сначала я попробую сам. ", 'Соларскейл молча кивает. '}; {"#level4_no_help", "Что же, тогда я попробую сам. ", 'Соларскейл молча кивает. '}; }; {cond=function(s) return here():from()^'tower_level_4_room_2' and power_on and pc_status ~= 'fail' end, 'Включайте!', function(s) pr [[Соларскейл включает компьютер. ]]; local rval = _('system_unit'):check(true); close('#tl4r2a'); if rval == 'motherboard' then pr [[Пролистав руководство, драконесса констатирует: "Похоже, не работает материнская плата. Надо бы поискать замену". ]]; return; elseif rval == 'cpu' then pr [[Пролистав руководство, драконесса констатирует: "Похоже, не работает центральный процессор. Надо бы поискать замену". ]]; return; elseif rval == 'ram' then pr [[Пролистав руководство, драконесса констатирует: "Похоже, не работает оперативная память. Надо бы поискать замену". ]]; return; elseif rval == 'video' then pr [[Пролистав руководство, драконесса констатирует: "Похоже, не работает видеокарта. Надо бы поискать замену". ]]; return; elseif rval == 'keyboard' then pr [[Пролистав руководство, драконесса констатирует: "Похоже, не работает контроллер клавиатуры. Надо бы поискать замену". ]]; return; end; open('#tl4r2a'); pr [[Драконесса, посмотрев на экран, сообщает: "Кажется, заработал". ]]; end, { '#tl4r2a', "[Подойти к терминалу]Отлично, посмотрим.", function(s) walkin('terminal'); end; }, {'Вы сможете отремонтировать его?', function(s) if have('part_box') then if solarscale_helps > 0 then open('#tl4r2cfa'); open('#tl4r2cfb'); close('#tl4r2cfc'); close('#tl4r2cfd'); return 'Соларскейл заглядывает в коробку с запчастями и, немного покопавшись в ней, сообщает: "Думаю, справлюсь. Позволите?"'; else close('#tl4r2cfa'); close('#tl4r2cfb'); close('#tl4r2cfc'); open('#tl4r2cfd'); return 'Соларскейл с сожалением сообщает: "Не думаю, что смогу помочь. Я никогда не встречала компьютеров такого типа". '; end; else close('#tl4r2cfa'); close('#tl4r2cfb'); close('#tl4r2cfd'); open('#tl4r2cfc'); return 'Соларскейл задумчиво говорит: "Только если мы найдем запасные детали". ' end; end, only=true, {'#tl4r2cfa', 'Да, разумеется. ', function(s) walkout(); local motherboard = lookup('#motherboard', _'system_unit'); local cpu= lookup('#cpu', _'system_unit'); local ram = lookup('#ram', _'system_unit'); local slot1 = lookup('#slot1', _'system_unit'); local slot2 = lookup('#slot2', _'system_unit'); local slot3 = lookup('#slot3', _'system_unit'); motherboard.device = _'crx-rdt-i3sb'; cpu.device = _'rcpu200-crx-20mhz'; ram.device = _'rdt-m32-32mb'; slot1.device = _'gva-rx4'; slot2.device = _'fna-100-10mbs_2'; slot3.device = _'kbc-s'; solarscale_helps = solarscale_helps - 1; pc_status = 'ok'; return 'Соларскейл привычно разбирает компьютер и, заглянув в инструкцию, меняет сломанные детали на новые. Закончив, она собирает его обратно. "Посмотрите! Кажется, я даже смогла немного улучшить его!"'; end}, {'#tl4r2cfb', 'Спасибо, но я сам справлюсь. ', function(s) walkout(); return 'Соларскейл молча кивает. '; end}, {'#tl4r2cfc', 'Как думаете, где они могут быть?', function(s) return 'Соларскейл отвечает: "Этажом ниже был склад, кажется. Есть смысл начать поиск оттуда". '; end}, {'#tl4r2cfd', '[Закончить разговор]', function(s) walkout(); end} }; { '#tl4r2b', "[Закончить диалог]", function(s) walkout(); end; }}; {cond=function(s) return here():from()^'tower_level_4_room_2' and pc_status == 'fail'; end, 'Вы сможете отремонтировать его?', function(s) if have('part_box') then if solarscale_helps > 0 then open('#tl4r2fa'); open('#tl4r2fb'); close('#tl4r2fc'); close('#tl4r2fd'); return 'Соларскейл заглядывает в коробку с запчастями и, немного покопавшись в ней, сообщает: "Думаю, справлюсь. Позволите?"'; else close('#tl4r2fa'); close('#tl4r2fb'); close('#tl4r2fc'); open('#tl4r2fd'); return 'Соларскейл с сожалением сообщает: "Не думаю, что смогу помочь. Я никогда не встречала компьютеров такого типа". '; end; else close('#tl4r2fa'); close('#tl4r2fb'); close('#tl4r2fd'); open('#tl4r2fc'); return 'Соларскейл задумчиво говорит: "Только если мы найдем запасные детали". ' end; end, only=true, {'#tl4r2fa', 'Да, разумеется. ', function(s) walkout(); local motherboard = lookup('#motherboard', _'system_unit'); local cpu= lookup('#cpu', _'system_unit'); local ram = lookup('#ram', _'system_unit'); local slot1 = lookup('#slot1', _'system_unit'); local slot2 = lookup('#slot2', _'system_unit'); local slot3 = lookup('#slot3', _'system_unit'); motherboard.device = _'crx-rdt-i3sb'; cpu.device = _'rcpu200-crx-20mhz'; ram.device = _'rdt-m32-32mb'; slot1.device = _'gva-rx4'; slot2.device = _'fna-100-10mbs_2'; slot3.device = _'kbc-s'; solarscale_helps = solarscale_helps - 1; pc_status = 'ok'; return 'Соларскейл привычно разбирает компьютер и, заглянув в инструкцию, меняет сломанные детали на новые. Закончив, она собирает его обратно. "Посмотрите! Кажется, я даже смогла немного улучшить его!"'; end}, {'#tl4r2fb', 'Спасибо, но я сам справлюсь. ', function(s) walkout(); return 'Соларскейл молча кивает. '; end}, {'#tl4r2fc', 'Как думаете, где они могут быть?', function(s) return 'Соларскейл отвечает: "Этажом ниже был склад, кажется. Есть смысл начать поиск оттуда". '; end}, {'#tl4r2fd', '[Закончить разговор]', function(s) walkout(); end} }; {cond=function(s) return here():from()^'tower_level_4_room_2' and not power_on end, 'Что мы можем сделать?', 'Соларскейл пожимает плечами: "Отсюда, скорее всего, ничего. Давайте осмотрим другие помещения". '}; {'#cnt1', cond=function(s) return here():from()^'crater_near_tower' end, 'Что если дверь закроется как только мы войдем?', function(s) close('#cnt2'); return 'Соларскейл решительно отвечает: "Разберемся! Неужели вам не интересно?"'; end}; {'#cnt2', cond=function(s) return here():from()^'crater_near_tower' end, 'Если честно, я не думаю, что дверь закроется, пока мы не вошли. ', function(s) close('#cnt1'); return 'Соларскейл неуверенно произносит: "Откуда нам знать..."'; end}; {cond=function(s) return here():from()^'above_west' end, 'Я нашел карту, ведущую к нему, в деревне, что к востоку отсюда.', 'Соларскейл молча кивает, видимо ожидая, что я скажу что-то еще.', only = true, {'Я хочу посетить ее еще раз, прежде чем вернуться в кратер. ', 'Соларскейл согласно кивает: "Я подожду вас в лесу. Я не умею превращаться, как вы, и не хочу... -- Она на мгновение замолкает, подбирая нужное слово. -- Обескуражить местных жителей своим видом". '}; {'Вам знакомо это место?', 'Соларскейл отрицательно качает головой: "Я впервые в этих краях, как и вы". '}; }; {cond=function(s) return here():from()^'inside_crater_glade' end; 'Если лететь из деревни, то это самое разумное место для приземления... ', 'Соларскейл размышляет вслых: "Тогда нам точно стоит пройти этот путь до конца". '}; {cond=function(s) return not have('flower_solarscale', me) and here():from()^'forest_glade'; end; 'Полностью с вами согласен.', function(s) take('flower_solarscale'); return 'Соларскейл протягивает мне небольшой цветочек с полупрозрачными золотистыми лепестками: "Вот, возьмите, на память", -- тихо произносит она. Я принимаю цветок из ее рук. '; end}; {cond=function(s) return here():from()^'above_forest'; end; 'Решил еще раз облететь округу, на случай если я что-то упустил. ', function(s) if solarscale_glade_visited then return 'Соларскейл осторожно намекает: "Возможно, стоит вернуться к башне?" '; else return 'Соларскейл бегло осматриает окрестности. Ее взгляд задерживается на полянке внизу: "Я бы хотела приземлиться здесь, вы не против?" '; end; end}; {'#ac1', cond=function(s) return here():from()^'above_crater'; end; 'Да, но чуть позже, хочу осмотреть все еще раз. ', function(s) close('#ac2'); return 'Соларскейл кивает: "Хорошая идея". ' end}; {'#ac2', cond=function(s) return here():from()^'above_crater'; end; 'Да, я просто хотел еще раз осмотреть это место сверху. ', function(s) close('#ac1'); return 'Соларскейл кивает: "Хорошая идея". ' end}; {'#anv1', cond=function(s) return here():from()^'above_near_village'; end; 'Решил еще раз облететь округу, на случай если я что-то упустил. ', function(s) close('#anv2'); return 'Соларскейл молча кивает. ' end}; {'#anv2', cond=function(s) return here():from()^'above_near_village'; end; 'Вы не против, если я посещу деревню еще раз?', function(s) close('#anv1'); return 'Соларскейл отвечает: "Хорошо. Я подожду вас в лесу". ' end}; {'#nv2', cond=function(s) return here():from()^'near_village'; end; 'Вы еще не видели местную библиотеку -- я надеюсь вернуться в нее и прочесть хотя бы половину того, что здесь есть. ', 'Соларскейл оживляется: "Я бы тоже не отказалась, -- однако почти сразу же одергивает себя. -- Но я не могу менять форму".'}; {cond=function(s) return here():from()^'inside_crater_path'; end, "Куда ведет эта тропинка?", 'Соларскейл рассказывает: "К центру кратера. Там расположена странная башня из черного камня. Кажется, она очень старая -- вокруг все поросло травой, нет никаких следов строительства, однако выглядит так, будто время над ней не властно -- ни единой трешинки, ни единой царапинки на ее стенах! Жаль я не смогла попасть внутрь -- входная дверь сделана из того же камня что и сама башня, и ни мои когти, ни моя магия не помогли мне открыть ее". '}; {cond=function(s) return here():from()^'above_village'; end; 'Кажется, местные не знают ничего о кратере. ', 'Соларскейл задумчиво произносит: "Должно быть, карта была сделана очень давно и никто просто не помнит. Сколько же здесь стоит эта башня?!" '}; {cond=function(s) return here():from()^'above_village'; end; 'Вы не против, если я посещу деревню еще раз?', 'Соларскейл отвечает: "Нет, конечно. Я подожду вас в лесу". '}; {'[Закончить диалог]', function(s) walkout(); end}; }; }