--$Author:Alexander Yakolev, 2017 --$Version:1.0 require "fmt" require "proxymenu" require "noinv" declare "isdebug" (true) if isdebug then require "dbg" require "dbg-ru" include("transcript") end include 'ui' include 'tools' include 'intro' fmt.dash = true fmt.quotes = true fmt.para = true -- https://www.google.ru/maps/place/%D0%9C%D0%B5%D0%BA%D1%81%D0%B8%D0%BA%D0%B0/@22.8355052,-105.0808555,16z/data=!4m5!3m4!1s0x84043a3b88685353:0xed64b4be6b099811!8m2!3d23.634501!4d-102.552784 -- Необходимые правки стиля перед релизом: -- 1. Убрать курсив от ответов на диалоги, чтобы они просто слились с основным текстом -- 2. Убрать вывод текста ответов на первый из диалогов (выбор обращения) room { nam = 'exit_west', disp = 'Дорога на запад', way = {'intersection', 'pavels', 'houseclosed'}, decor = [[ Вы стоите на окраине Жестианы. Прямая автодорога идёт на запад, где начинается лес. В лесу она тут же делает крутой поворот.^^ Отсюда видны два здания в стороне. ]] } room { nam = 'houseclosed', disp = 'Запертый дом', decor = [[Типовой одноэтажный дом. Окна занавешены, а вход заперт.]], way = {'exit_west'}, } room { nam = 'abandoned', disp = 'Одноэтажный дом', -- занят роботами way = {'exit_north'}, dsc = [[ Дорога к этому дому выложена камнями. Идти по булыжнику легко и просто. ]], decor = [[ Это высокий треугольный дом без окон. Его пирамидальная крыша блестит зеркальной чистотой, а стены отполированы в ровный цвет свежего дерева. На одной из стен углём нарисована стилизованная голова робота-летописца и надпись: "ДОБРО.". Внутрь ведёт единственный вход, который находится на три метра выше земли.^^ Перед домом работают механические боты. Ближе всего к вам стоят двое. {robofarmer|Один из них} копается в грядках, а {robobutler|второй} настраивает какой-то {mechanism|механизм.} ]], obj = { obj { nam = 'robofarmer', disp = function() return 'первый робот' end, act = [[Низкий хромированный фермер. Четырёхногая модель примерно десяти лет от роду. Он медленно неуклюже передвигает передние ноги, когда переходит к следующей грядке.]] }; obj { nam = 'robobutler', disp = function() if char.knows_kef then return 'Кеф' end return 'второй робот' end, act = [[ Он похож по строению на робота-дворецкого, но у него не хватает верхней части лица, а вместо левой ноги - импровизированный протез из строительного нанопластика. Его глаза очень маленькие для широкого лица; скорее всего, их вставили из какой-нибудь детской куклы. ]], talk = function() return walk('robobutler-dlg') end, }; obj { nam = 'mechanism', act = [[Какая-то параболическая антенна на широкой стальной трубе, вкопанной в землю. Видимо, труба служит защитным корпусом для деталей.]], take = function() pn ('Над ней работает робот, который заметит отсутствие механизма. Да и зачем вам эта антенна?'); return false end } } } room { nam = 'pavels', disp = 'Дом на окраине', way = {'exit_west'}, decor = [[ Вы стоите перед типовым напечатанным одноэтажным домом. С одной стороны к стене прислонилась маленькая пристройка для дров. С другой стороны — {suit|боевой механизированный костюм.} ]], obj = { obj { nam = 'suit', act = function() out = [[ Боевой механизированный костюм высотой 2,7 метров, марка РГ-22. Рассчитан на одного пилота. Вооружён автоматической пушкой калибра 5мм и огнемётом.^^]] if char.war == "earth" then out = out .. [[ Вы чинили эти двуногие танки день и ночь. Лунные мины становились всё изощрённее, и приходилось срочно отлаживать программы починки, а иногда и лезть вручную. Боты никогда не заботились о том, чтобы вычистить остатки пилота из кабины.^^ ]] end if char.war == "moon" then out = out .. [[ Где бы вы ни сражались, эти двуногие твари шли на вас тысячами. Вам приходилось еженедельно изобретать новые мины, чтобы получить хоть какой-то шанс отбиться. Сорок восемь смертельных чертежей против главной уязвимости этой модели — человека в кабине.^^ ]] end out = out..[[Такие штамповались на Земле сотнями тысяч, но после войны оказалось, что большая часть потеряна на поле боя. Конечно, по официальной версии. ]] end } } } room { nam = 'exit_north', disp = 'Дорога на север', way = {'town', 'abandoned'}, decor = [[ Вы стоите на окраине Жестианы. Прямая автодорога идёт на север. Здесь от неё на запад отходит небольшой заезд из булыжника. ]] } room { nam = 'chos', disp = 'Богатый дом', way = {'intersection'}, decor = [[ Вы стоите перед большим {chos_house|напечатанным домом.} Отсюда начинается большая пашня, по которой ходят фермерские роботы.^^ Возле дома в удобном гамаке спит {angelina|старушка.} ]], obj = { obj { nam = 'chos_house', disp = 'дом', take = function() pn('Вы не знаете, как можно '..fmt.em('взять')..' двухэтажный дом.') return false end, act = [[К типовому двухэтажному дому из нанотрубок со временем допечатывали несколько модулей. Часть второго этажа выглядит совсем новой — возможно, её недавно расширили.]], }; obj { nam = 'angelina', take = function() pn('Старушке это не понравится.') return false end, disp = function() if not visited('cho_dlg2') then return 'старушка' else return 'Ангелина' end end, act = 'Старушка мирно посапывает, раскачиваясь в гамаке.', talk = function() return walk('cho_dlg'); end, } } } room { nam = 'intersection', disp = 'Перекрёсток', decor = [[Просто три просёлочные дороги, которые соединяются вместе.]], way = {'exit_west', 'chos', 'town'}, exit = function() end } room { nam = 'town', disp = 'Жестиана', way = {'exit_north', 'intersection', 'factory'}, decor = [[ Жестиана - это маленькая деревня, которая отмечена одной табличкой: «ЖЕСТИА--» на кривом столбе возле дороги. На этом же столбе висит расписание автобусов. Если бы не он, здесь были бы просто два типовых дома, которые стоят рядом, и просёлочная дорога между ними. Но столб - это остановка, а остановка обозначает деревню.^^ Дом на западной стороне украшен надписью, которая была когда-то яркой: «Добро Пожаловать». Вход заперт.^^ Дом напротив повёрнут входом в сторону от дороги. Окна зашторены. Двери закрыты. ]] } room { nam = 'factory', disp = [[Здание на горе]], way = {'town', 'cathedral'}, dsc = [[ Вы забираетесь на склон горы. Отсюда хорошо видна вся Жестиана. Напротив вы видите ярко-розовый двухэтажный дом с высокой пристройкой. Вход в пристройку открыт, а над ним растянут длинный зелёный плакат с коротким сообщением:^^ «КАЖДЫЙ СТАНЕТ ХТОНИЧЕСКОЙ ПИЩЕЙ» ]] } room { nam = 'cathedral', disp = [[Внутри здания]], way = {'factory'}, enter = [[ Вы входите в чистый просторный зал. ]], decor = [[ Здесь тихо и пахнет можжевельником. Три ряда скамей стоят перед импровизированной трибуной.^^ В ряду справа сидит {lfactory-man|одинокий мужчина в комбинезоне.} Вокруг зала ходит {lfactory-servant|мужчина в кожаной куртке} и протирает мебель от пыли. ]], obj = { obj { nam = 'lfactory-man', disp = 'сидячий мужчина', act = [[ Он одет в спортивный костюм с двумя галстуками на шее. Рядом с ним лежит серый заплечный мешок. Он сидит на скамье, опустив голову, погружённый в свои мысли. ]], talk = function() walk('factory-man') end }, obj { nam = 'lfactory-servant', disp = 'мужчина за работой', act = '', talk = function() walk('factory-servant') end } } } -- пчёёёёёлы quest_factory_man_1 = function() return [[ Вы были на треугольной ферме за городом? Немного на север, вдали от дороги. Там жил старик Демидов, но он умер. А после него остались… эти. ]]; end dlg { nam = 'factory-man', disp = 'Одинокий мужчина', decor = [[ Он одет в спортивный костюм с двумя галстуками на шее. Рядом с ним лежит серый заплечный мешок. Он сидит на скамье, опустив голову, погружённый в свои мысли. ]], enter = function(s) if char.talked_abandoned then s:reset '#разговор' end end, obj = { {{ 'Что это за место?', function() return [[ -- Шшш. — он поднимает голову. — Говорите шёпотом. Это - наш клуб, здесь должно быть тихо. Мы называем его Клубом Памяти. А вы же ]]..that()..' '..engineer()..[[ из города, да? ]]; end, next = '#кто' }; }; { '#кто', { function() return 'Да, '..pronoun_1()..' — '..engineer(); end, [[-- Хорошо. Вы у нас — новость дня. Осторожнее, а то про вас случайно сочинят народную легенду или песню. Хотя в Жестиане не любят петь.]], next = '#разговор' }; { 'Откуда вы знаете?', function() local out = [[-- У нас маленькая деревня. Вы — новость этого дня. Я даже знаю, что вы вроде как отличились на войне. ]]; if char.war == "moon" then out = out .. 'Но не мне судить, по какую сторону. '; end; out = out .. [[Осторожнее, а то про вас случайно сочинят народную легенду или песню. Хотя в Жестиане не любят петь.^^ Кстати. Не можете помочь мне с одной проблемой? Это как раз по вашему профилю.]]; return out; end, next = '#квест' } }; { '#квест', { 'Что у вас за проблема?', function() return quest_factory_man_1(); end, next = '#квест2' }; { 'В моих краях любят невмешательство.', function() return [[И это очень хорошо вам послужило на войне. Давайте я просто расскажу, а вы уже решите.]]..quest_factory_man_1(); end, next = '#квест2' }; { 'Широкий профиль и длинный ценник.', function() return 'Значит, мы легко договоримся. Итак.'..quest_factory_man_1(); end, next = '#квест2' } }; { '#квест2', { 'Кто?', [[Роботы. Небольшой строй металлоголовых, у которых умер хозяин. Они ждут приказов, но приказов нет. Они не выполняют приказов незнакомого голоса. ]], next = '#квест3' }; { 'Да, там живут роботы.', cond = function() return visited('abandoned'); end, [[И вы видели, как они себя ведут? Кошмарно. Металлоголовые без хозяина. Они ждут приказов, но приказов нет. Они не выполняют приказов незнакомого голоса. ]], next = '#квест3' } }; { '#квест3', { 'И что с того?', [[ -- Приведите их ко мне. Настройте их на мой голос. Я буду хорошим хозяином. ]], next = "#квест4" }, { 'А что, разве роботы не могут быть свободными?', [[Мужчина закидывает колено на скамью и откидывается назад.^^ -- Роботы - не люди. У них нет желаний, есть только программы. Я думал, вы должны это понимать. Им не нужна свобода.^^ Приведите их ко мне. Настройте их на мой голос. Я буду хорошим хозяином.]], next = "#квест4" }, { '(с сарказмом) А вы добры, не хотите оставлять чужое без присмотра.', [[ -- У всех свой интерес. Это же программы, они не выживут без человека. У них нет цели, желаний, документов в конце концов.^^ Приведите их ко мне. Настройте их на мой голос. Я буду хорошим хозяином. ]] } }; { '#квест4', { function() return 'Хорошо. '..pronoun_1()..' '..plural('могу', 'можем')..' привести роботов.' end, function() char.quests.abandoned = 1 char.talked_abandoned = true return 'Вот запись с моим голосом. — он даёт вам микрочип. — Я буду ждать.' end, next = "#разговор" }; { function() return plural('Посмотрю', 'Посмотрим')..'. Но без обещаний.' end, function() char.quests.abandoned = 1 char.talked_abandoned = true return 'Вот запись с моим голосом. — он даёт вам микрочип. — Я надеюсь на вас.' end, next = "#разговор" }; { function() return 'Нет. '..pronoun_1()..' не '..plural('могу', 'можем')..' делать подобное. Ищите кого-нибудь другого для своих махинаций.' end, function() char.quests.abandoned = 0 char.talked_abandoned = true return 'Он пожимает плечами. — Я буду здесь, если вы передумаете.' end, next = "#разговор" } }; { '#разговор', { 'Что интересного в Жестиане?', 'Ничего.' }; { always = true, 'Чем занимается ваш клуб?', 'Как обычно - собираемся раз в неделю, делимся новостями.' }; { 'Что это за здание?', function() enable("#здание-нап") return 'Просто дом Джексонов. Надо же где-то собираться.' end, }; { always = true, 'Что означает надпись над входом?', [[Её меняют каждую неделю, но смысл всегда одинаков. Чтобы не расслаблялись.]] }; { hidden = true, always = true, cond = function() return char.talked_abandoned == true end, 'Насчёт тех роботов…', 'Что такое?', next = '#robots' }; { hidden = true, always = true, "#здание-нап", 'Напомните, а что это за здание?', function() enable("#здание-нап") return 'Всё ещё дом Джексонов, где мы собираемся.' end }; { always = true, 'До свидания. Приятно было поговорить.', function() walk('cathedral') return 'Все там будем, говори - не говори…' end, }; }; { '#robots', { always = true, cond = function() return char.quests.abandoned > 0 end, function() return plural('Я', 'Мы') .. ' ' .. plural('работаю','работаем') .. ' над этим.' end, function() return 'Хорошо, я подожду ещё.' end, next = '#разговор' }; { always = true, cond = function() return char.quests.abandoned > 0 end, function() return plural('Я', 'Мы')..' передумал'..endings()..'. Это гадко и бесчеловечно.' end, function() char.quests.abandoned = 0 return 'Жаль. Но если вы подумаете ещё немного, то предложение ещё в силе.' end, next = '#разговор' }; { always = true, cond = function() return (char.quests.abandoned == 0) end, function() return plural('Я', 'Мы')..' '..plural('возьмусь','возьмёмся')..' за это.' end, function() char.quests.abandoned = 1 return 'Прекрасно! Вот образец моего голоса. Я буду ждать.' end, next = '#разговор' }; } } } dlg { nam = 'factory-servant'; disp = 'Мужчина за работой'; decor = [[ Он одет в кожаную куртку, а на шее он носит длинный розовый плащ, который свисает до колен. ]] } -- Диалог с Анжелиной Чо dlg { nam = 'cho_dlg', disp = false, dsc = function(s) if not visited('cho_dlg2') then return [[ -- А? Что? Вы… вы ]]..engineer()..[[ из фирмы? Нет, я не сплю.^^ Она встаёт и протирает глаза. ]] end s:reset '#разговор' return [[-- А? Это вы? Извините, я задремала.]] end, decor = [[ Старушка внимательно смотрит на вас. ]], obj = { { { function() return 'Откуда вы поняли, что '..pronoun_1()..' — '..engineer() end, 'Я же вас и вызывала. У нас комбайн сломан. Вы чините комбайны?' }; { always = true, fmt.em('Как вас зовут?'), 'Ангелина. Я вызывала мастера по гарантии.', next = '#комбайн-начало' } }; { '#комбайн-начало', { 'Что случилось?', '-- Мы прогрели его весной, а он и не едет. Вы же '..engineer()..', вы сможете его починить?' }; { fmt.em('Можно посмотреть комбайн?'), function() return walk('cho_dlg2') end, }; }; { '#разговор', { always = true, 'Вы не могли бы показать мне комбайн ещё раз?', 'Она приводит вас к комбайну. Машина в том же сломанном состоянии. Вы возвращаетесь.' }; { 'Вы давно здесь живёте?', 'Она пожимает плечами:^^-- Лет тридцать. Начинали всего с одним роботом.' }; { fmt.em('Ничего. Доброе утро.'), function() pn('-- И вам того же.^^Она закрывает глаза и засыпает.') return walk('chos_house') end, }; } } } dlg { nam = 'cho_dlg2', disp = false, dsc = [[-- Да-да, конечно.^^ Она провела вас в большой сарай, где пылился высокий автоматический сельхозкомбайн. -- Вот и наш больной. Только вы, пожалуйста, можете его починить побыстрее, а то у нас урожай уже скоро. ]], decor = [[ Старушка Чо внимательно смотрела на вас. В её глазах вы видели, что от починки этого комбайна зависело несколько жизней. ]], obj = { { onempty = function() walk('start4') end, { 'Что точно случилось?', '-- Мы его заводим, а он замёрз! После зимы у мужа обычная машина не заводится, не то что роботы.' }, { 'У вас же столько роботов. Неужели вы не справитесь без комбайна?', [[-- Всего семеро, и они обычно упаковывают и складывают. Если они будут ещё и косить, мы не управимся до осени. Урожай сгниёт под дождями.]] }, { 'Да, '..pronoun_1()..' -- '..engineer()..[[. Но я могу только определить проблему, у вас же нет мастерской или инструментов.]], '-- Вы знаете, я могу попросить соседей. У Павла в подвале во время войны была мастерская.' }, { 'Давно он у вас?', [[-- Ну, лет двадцать уже, наверное. То есть, я хотела сказать, девятнадцать. Гарантия же ещё действует, правда?]] } } } } -- Починка комбайна dlg { nam = 'start4', disp = false, dsc = function() return [[ Комбайн оказался ещё довоенным. Вы копались не меньше часа, пока не нашли износившийся программаторный блок.^^ -- Ну что же, надо чинить. Случай гарантийный, всё за счёт фирмы. Но придётся забрать в город, в мастерскую.^^ -- Послушайте. У меня сестра работает в Берёзовке, я знаю что нужно. Вас устроит… десять тысяч? И вы почините всё здесь.^^ Вы задумались. На десять «кусков» можно было бы купить новый комбайн - конечно, не такой мощный, но если продать золото на Луну… Был один хитрый выход.^^ -- Давайте так: ]]..pronoun_1()..[[ здесь ещё ]]..plural('задерживаюсь', 'задерживаемся')..[[. Возможно, здесь, на месте, что-то получится. Но после урожая -- сразу в мастерскую, нужен основательный ремонт. У кого, вы говорили, здесь мастерская?^^ -- Спасибо! -- она улыбнулась. -- Я скажу внучке, чтобы вас проводила.^^ Вы вернулись к дому. Старушка исчезла за дверью, а затем быстро вернулась с чумазой девушкой лет семнадцати. -- Это Катя, она вас проводит. Катя, до Павла и обратно, хорошо?^^ Девушка хотела что-то возразить, но передумала, опустила голову и тихо ответила:^^ -- Хорошо, бабушка. ]] end, decor = [[ Вы стояли и смотрели на Катю. А Катя смотрела на вас.^^ Между вами - тишина. ]], obj = {{ onempty = function() char.quests.kathy = 0 p "Она отворачивается. Видимо, разговор закончен." walk('chos') end, {'Привет.', 'Привет.'} }} } dlg { nam = 'robobutler-dlg', disp = false, decor = function() return deref('robobutler').act end, obj = {{ { always = true, 'Кто вы?', function() char.knows_kef = true return 'Я — программируемый секретарь КЕ-2167Ф. Можно Кеф для краткости.' end, }; { always = true, 'Что такое «добро»?', function() char.asked_good = true return [[Понятие, которое ассоциировано с действиями на пользу или на защиту общества.]] end }; { cond = function() return (char.asked_good == true) end, 'Что означает надпись «добро»? Чем вы занимаетесь как группа?', function() char.knows_robots = true return [[Мы занимаемся добром. Мы действуем на пользу общества.]] end }; { always = true, cond = function() return (char.knows_robots == true) end, 'Напомни ещё раз, что означает надпись «добро»?', [[Мы занимаемся добром. Мы действуем на пользу общества.]] }; { always = true, 'Где ваш хозяин?', 'Отсутствует. Но не волнуйтесь, мы поддерживаем его владения в идеальном порядке.' }; -- TODO TODO TODO TODO TODO TODO { 'Один из ваших угнал машину. Где он? И где машина?', 'TODO - нет ответа' }; { 'Что это за механизм перед вами?', 'TODO - нет ответа' }; { cond = function() -- есть квест по починке комбайна end, 'У вас нет ремонтного бота?', 'TODO - нет ответа' }; }} }