--$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', act = [[Низкий хромированный фермер. Четырёхногая модель примерно десяти лет от роду. Он медленно неуклюже передвигает передние ноги, когда переходит к следующей грядке.]] }; obj { nam = 'robobutler', act = [[ Он похож по строению на робота-дворецкого, но у него не хватает верхней части лица, а вместо левой ноги - импровизированный протез из строительного нанопластика. Его глаза очень маленькие для широкого лица; скорее всего, их вставили из какой-нибудь детской куклы. ]] }; obj { nam = 'mechanism', act = [[Какая-то параболическая антенна на широкой стальной трубе, вкопанной в землю. Видимо, труба служит защитным корпусом для деталей.]] } } } 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|напечатанным домом.} Отсюда начинается большая пашня, по которой ходят фермерские роботы. ]], obj = { obj { nam = 'chos_house', act = [[К типовому двухэтажному дому из нанотрубок со временем допечатывали несколько модулей. Часть второго этажа выглядит совсем новой — возможно, её недавно расширили.]], } } } 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 = 'сидячий мужчина', exam = [[ Он одет в спортивный костюм с двумя галстуками на шее. Рядом с ним лежит серый заплечный мешок. Он сидит на скамье, опустив голову, погружённый в свои мысли. ]], act = function(self) return self.exam end, talk = function() walk('factory-man') end }, obj { nam = 'lfactory-servant', disp = 'мужчина за работой', exam = '', act = function(self) return self.exam end, 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 = 'start3', disp = false, dsc = [[ (курсивом) Сюда, пожалуйста.^^ Она провела вас в большой сарай, где пылился высокий автоматический сельхозкомбайн. -- Вот и наш больной. Мы прогрели его весной, а он и не едет. Вы же ]]..engineer()..[[, вы сможете его починить? А то мы потеряем урожай. ]], decor = [[ Старушка Чо внимательно смотрит на вас. В её глазах вы читаете, что от починки этого комбайна зависит несколько жизней. ]], obj = {{ onempty = function() walk('start4') end, { 'Зачем вы заводили комбайн весной?', '-- Он замёрз! После зимы у мужа обычная машина не заводится, не то что роботы.' }, { 'У вас же столько роботов. Неужели вы не справитесь без комбайна?', [[-- Всего семеро, и они обычно упаковывают и складывают. Если они будут ещё и косить, мы не управимся до осени. Урожай сгниёт под дождями.]] }, { 'Да, '..pronoun_1()..' -- '..engineer()..[[. Но я могу только определить проблему, у вас же нет мастерской или инструментов.]], '-- Вы знаете, я могу попросить соседей. У Павла в подвале во время войны была мастерская.' }, { 'Давно он у вас?', [[-- Ну, лет двадцать уже, наверное. То есть, я хотела сказать, девятнадцать. Гарантия же ещё действует, правда?]] } }} } -- Починка комбайна dlg { nam = 'start4', disp = false, dsc = function() return [[ Комбайн оказался ещё довоенным. Вы копались не меньше часа, пока не нашли износившийся программаторный блок.^^ -- Ну что же, надо чинить. Случай гарантийный, всё за счёт фирмы. Но придётся забрать в город, в мастерскую.^^ -- А нельзя прямо здесь? У нас же урожай скоро!^^ -- Нет, это…^^ -- Послушайте. У меня сестра работает в Берёзовке, я знаю что нужно. Вас устроит… десять тысяч?^^ -- В смысле?^^ -- Подождите, не отказывайтесь. Десять новых кусков. Золотом. И вы почините это здесь.^^ Вы задумались. На десять кусков можно было бы купить новый комбайн - конечно, не такой мощный, но если продать золото на Луну… Был один хитрый выход.^^ -- Давайте так: ]]..pronoun_1()..[[ здесь на три дня. Если за эти три дня что-то получится… Но после урожая -- сразу в мастерскую, нужен основательный ремонт. У кого, вы говорили, здесь мастерская?^^ -- Спасибо! -- она улыбнулась. -- Я скажу внучке, чтобы вас проводила. Сейчас.^^ Вы вернулись к дому. Старушка исчезла за дверью, а затем быстро вернулась с чумазой девушкой лет семнадцати. -- Это Катя, она вас проводит. Катя, до Павла и обратно, хорошо?^^ Девушка хотела что-то возразить, но передумала, опустила голову и тихо ответила:^^ -- Хорошо, бабушка. ]] end, decor = [[ Вы стояли и смотрели на Катю. А Катя смотрела на вас.^^ Между вами - тишина. ]], obj = {{ onempty = function() char.quests.main = 1 char.quests.kathy = 0 p "Она отворачивается. Видимо, разговор закончен." walk('chos') end, {'Привет.', 'Привет.'} }} }