mirror of
https://gitlab.com/Oreolek/duel.git
synced 2024-06-30 22:05:07 +03:00
601 lines
26 KiB
Lua
601 lines
26 KiB
Lua
--$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,
|
||
{'Привет.', 'Привет.'}
|
||
}}
|
||
}
|