diff --git a/intro.lua b/intro.lua index 5850c06..cfd92ed 100644 --- a/intro.lua +++ b/intro.lua @@ -116,6 +116,10 @@ dlg { function() return 'Где '..pronoun_1()..'?'; end, '-- Добро посаловать в Зжсестиану. Деревня Малогхо раийона, население дефхятнадтцат\' человек.' }; + { + 'Кто твой хозяин?', + 'Этот элемент — собственность Горского А.В.' + }; { function() return fmt.em('Как проехать до Жестианы? '..plural('У меня', 'У нас')..' в машине навигатор отключился.'); end, function() diff --git a/locations/abandoned.lua b/locations/abandoned.lua index 63c597c..1ecef0d 100644 --- a/locations/abandoned.lua +++ b/locations/abandoned.lua @@ -37,11 +37,14 @@ room { Его глаза очень маленькие для широкого лица; скорее всего, их вставили из какой-нибудь детской куклы. ]], talk = function() - return walk('robobutler-dlg') + walk('robobutler-dlg') + return true end, }; obj { nam = 'mechanism', + disp = 'механизм', + talk = 'Механизму нечего вам ответить.', act = [[Какая-то параболическая антенна на широкой стальной трубе, вкопанной в землю. Видимо, труба служит защитным корпусом для деталей.]], take = function() @@ -53,34 +56,36 @@ room { } dlg { nam = 'robobutler-dlg', - disp = false, + disp = 'Диалог с роботом', decor = function() - return deref('robobutler').act + return _('robobutler').act end, obj = {{ { - always = true, + '#who', 'Кто вы?', function() + disable('#who') char.knows_kef = true return 'Я — программируемый секретарь КЕ-2469Ф. Можно Кеф для краткости.' end, }; { - always = true, + '#good', 'Что такое «добро»?', function() + disable('#good') char.asked_good = true return [[Понятие, которое ассоциировано с действиями на пользу или на защиту общества.]] end }; { cond = function() - return (char.asked_good == true) + return (char.asked_good == true and char.knows_robots ~= true) end, 'Что означает надпись «добро»? Чем вы занимаетесь как группа?', function() - changeop('reputation', 1) + changeop('reputation', 3) char.knows_robots = true return [[Мы занимаемся добром. Мы действуем на пользу общества.]] end @@ -94,14 +99,22 @@ dlg { [[Мы занимаемся добром. Мы действуем на пользу общества.]] }; { - always = true, + '#хозяин', 'Где ваш хозяин?', - 'Отсутствует. Но не волнуйтесь, мы поддерживаем его владения в идеальном порядке.' + function() + disable('#хозяин') + return 'Отсутствует. Но не волнуйтесь, мы поддерживаем его владения в идеальном порядке.' + end }; - -- TODO TODO TODO TODO TODO TODO { - 'Один из ваших угнал машину. Где он? И где машина?', - 'TODO - нет ответа' + [[Вы очень похожи на одного моего знакомого робота…]]; + [[ + -- Вы очень похожи на одного моего знакомого робота. Такой высокий, без левого манипулятора. Катается на красном спортивном авто. По крайней мере, последние несколько часов. Вы не знаете, где он?^^ + -- Запрос неточен. Подходит ЛО-1847З, но у него нет личной машины. Вы хотите найти ЛО-2837З?^^ + -- Да. Это срочно.^^ + -- ЛО-1847З выполняет задание поиска редких металлов и механизмов. В чём выражается срочность? + ]]; + next = "#поиск"; }; { 'Что это за механизм перед вами?', @@ -113,5 +126,186 @@ dlg { 'У вас нет ремонтного бота?', 'TODO - нет ответа' }; - }} + { + always = true, + 'Спасибо. Удачи вам с этим… добром.', + function() + walkout() + return 'Робот кивнул вам и вернулся к починке механизма.' + end + }; + }; + { + "#поиск", + { + '#украл', + "Он украл чужую машину. Его нужно остановить.", + function() + disable('#украл') + changeop('actions', 10) + return 'ЛО-1847З не мог украсть чужой механизм. Это напрямую противоречит его задаче сбора '..fmt.em('потерянных')..' механизмов.' + end + }; + { + function() + return "У "..plural('меня', 'нас')..' есть механизм для него.' + end, + 'Предъявите механизм для того, чтобы я произвёл оценку полезности.', + next = '#механизм' + }; + { + '#багрепорт', + function() + return plural('Я знаю', 'Мы знаем')..', что в его программе сбора механизмов есть ошибка.' + end, + function() + changeop('actions', -5) + disable('#багрепорт') + return [[Глаза робота совершили оборот вокруг своих осей.^^ + -- У вас есть отчёт об ошибке? Замечательно! + Если ошибка будет принята, мы немедленно отзовём бракованный элемент + со всеми механизмами!]] + end, + next = '#ошибка' + } + }; + { + '#механизм', + { + 'Он не здесь. Не под рукой.', + 'В таком случае я не способен произвести оценку полезности.' + } + }; + { + '#ошибка', + --[[ + { + cond = function() + return (char.actions > 40) + end, + '{}[Оригинальность < 40] Он не учитывает контекст находок.' + }; + { + cond = function() + return (char.actions < 40) + end, + '[Оригинальность < 40] Он не учитывает контекст находок.', + function() + changeop('reputation', 5) + return [\[-- Отчёт об ошибке принят.^^ + Робот ненадолго задумался, потом дёрнулся и продолжил: + -- Требуются дополнительные данные. Какой контекст необходимо учитывать?]\] + end, + next = '#контекст', + };]] + { + 'Он действует без разрешения владельцев механизмов.', + function() + return [[-- Отчёт об ошибке принят.^^ + Робот ненадолго задумался, потом дёрнулся и продолжил: + -- Отчёт об ошибке закрыт. Программа работает исключительно на бесхозных объектах. Данные объекты не имеют владельцев.]] + end, + next = '#поиск' + }; + { + 'Область поиска механизмов слишком велика.', + function() + return [[-- Отчёт об ошибке принят.^^ + Робот ненадолго задумался, потом дёрнулся и продолжил: + -- Отчёт об ошибке закрыт. Область поиска вычислена из расчёта трёх + часов ходьбы среднего двуногого независимого элемента по земле, которая + не является собственностью жителей села.]] + end, + next = '#поиск' + }; + { + 'Определение владельца механизма неверно с юридической точки зрения.', + function() + changeop('reputation', 5) + return [[-- Отчёт об ошибке принят.^^ + Робот ненадолго задумался, потом дёрнулся и продолжил: + -- Требуются дополнительные данные. Трактовка какого закона неверна?]] + end, + next = '#закон' + } + }; + { + '#закон', + { + 'Закон о межевании сельхозугодий.', + [[ + Робот открыл рот, потряс головой, а затем быстро парировал:^^ + -- Межевание земель сельскохозяйственного назначения не относится к обсуждаемой теме. + Мы действуем как собственность Горского А.В. и не делим его участок между собой. + Ваш отчёт об ошибке будет закрыт. + ]], + next = "#поиск" + }; + { + [[Закон о находках.]], + function() + lifeon('car-retrieval-unit') --подъезжает робот-гад на машине, вылезает из машины, исчезает в доме. Можно забирать авто. + walk('abandoned') + changeop('reputation', 10) + return [[Робот задумался:^^ + -- «Если лицо, имеющее право потребовать возврата найденной вещи, или место его пребывания неизвестны, нашедший вещь обязан заявить о находке в полицию или в орган местного самоуправления.» + Мы признаём, что были вынуждены упростить программу. + Благодарим вас за отчёт об ошибке. + Требуется немедленный отзыв элемента для обновления программы.]] + end, + }; + { + [[Налог с доходов и кладов.]], + function() + return [[Робот задумался:^^ + -- Вы считаете, что мы должны отсылать налог на найденные механизмы неустановленной ценности?^^ + Вы не успели ничего ответить, как он продолжил:^^ + -- Отчёт об ошибке закрыт. + Мы являемся собственностью Горского А.В. и не рассматриваем себя как физические лица. + Найденные механизмы не относятся к доходам Горского А.В.]] + end, + next = "#поиск" + }; + { + [[Определение частной собственности. Если человек купил механизм, то механизм может быть потерянным, но не может быть бесхозным.]], + [[ + Робот быстро парировал:^^ + -- Определение частной собственности не противоречит программе. + Она занимается поиском ]]..fmt.em('бесхозных')..[[ механизмов, а не потерянных. + По определению купленные механизмы не могут быть бесхозными. + Ваш отчёт об ошибке будет закрыт. + ]], + next = "#поиск" + } + }; + } +} + +obj { + nam = 'car'; + disp = 'автомобиль'; + dsc = 'Недалеко от вас припаркован ваш {автомобиль.}'; + tak = function() + enable('end-game') + p 'Вы вынимаете ключи из замка зажигания. Больше никто не угонит авто просто так.' + return true + end +} +obj { + nam = 'car-retrieval-unit'; + timer = 0; + disp = false; + life = function(s) + s.timer = s.timer + 1 + if s.timer == 2 then + return [[По дороге сюда едет машина. Похоже, это ваша машина.]] + end + if s.timer == 3 then + place('car', here()) + lifeoff(s) + return [[Возле дома останавливается ваша машина. + Из неё выходит знакомый однорукий робот. + Он ковыляет ко входу в дом; когда он уже близко, из входа вылезает механический паук, берёт робота за шкирку и залезает обратно внутрь дома.]] + end + end; } diff --git a/tools.lua b/tools.lua index 5512a90..573cc45 100644 --- a/tools.lua +++ b/tools.lua @@ -35,6 +35,13 @@ init = function () walk('inventory') end }, me()) + place(menu { + nam = "end-game", + disp = fmt.b("Уехать"), + menu = function() + walk('ending') + end + }:disable(), me()) char.act = nil place( proxy_menu { disp = 'ОСМОТРЕТЬ'; @@ -171,5 +178,5 @@ changeop = function(name, delta) rawset(char, name, fairadd(rawget(char, name), delta)) end fairadd = function(value, add) - return Math.floor(value + (100-value)*(add/100)) + return math.floor(value + (100-value)*(add/100)) end diff --git a/ui.lua b/ui.lua index dce17e8..198f375 100644 --- a/ui.lua +++ b/ui.lua @@ -140,3 +140,24 @@ room { end, obj = {'back'} } + +room { + nam = 'ending', + disp = 'Уехать из Жестианы', + hideinv = true, + decor = 'Вы уверены, что хотите немедленно уехать из Жестианы?^^'..fmt.c('{yes|Да}'), + obj = { + 'back', + obj { + nam = 'yes', + act = function() walk('theend') end, + } + } +} + +room { + nam = 'theend', + disp = 'КОНЕЦ', + hideinv = true, + decor = fmt.c(fmt.b('КОНЕЦ')) +}