room { nam = 'abandoned', disp = 'Одноэтажный дом', -- занят роботами way = {'exit_north'}, dsc = [[ Дорога к этому дому была выложена камнями. Вы шли по булыжнику легко и быстро. ]], decor = [[ Высокий треугольный дом без окон. Его пирамидальная крыша блестела зеркальной чистотой, а стены были отполированы в ровный цвет свежего дерева. На одной из стен углём кто-то нарисовал стилизованную голову робота-летописца и надпись: "ДОБРО.". Внутрь вёл единственный вход, который находился на три метра выше земли.^^ Перед домом работали механические боты. Ближе всего к вам стояли двое. {robofarmer|Один из них} копался в грядках, а {robobutler|второй} настраивал какой-то {mechanism|механизм.} ]], obj = { obj { nam = 'robofarmer', disp = function() return 'первый робот' end, act = function(s) if not isduel then return [[Низкий хромированный фермер, древняя четырёхногая модель. Он медленно неуклюже передвигал передние ноги, когда переходил к следующей грядке.]] else return s.talk() end end, talk = function() walk('robofarmer-dlg') return true end }; obj { nam = 'robobutler', disp = function() if char.knows_kef then return 'Кеф' end return 'второй робот' end, act = function(s) if not isduel then return [[ Он был похож по строению на робота-дворецкого, но у него не хватало верхней части лица, а вместо левой ноги стоял импровизированный протез из строительного нанопластика. Его глаза были очень маленькими для широкого лица; скорее всего, их вставили из какой-нибудь детской куклы. ]] else return s.talk() end end, talk = function() walk('robobutler-dlg') return true end, }; obj { nam = 'mechanism', disp = 'механизм', talk = 'Механизму нечего вам ответить.', act = [[Какая-то параболическая антенна на широкой стальной трубе, вкопанной в землю. Видимо, труба служит защитным корпусом для деталей.]], take = function() pn ('Над ней работает робот, который заметит отсутствие механизма. Да и зачем вам эта антенна?'); return false end } } } dlg { nam = 'robobutler-dlg', disp = 'Диалог с роботом', decor = function() return _('robobutler').act end, obj = {{ '#general', { '#who', 'Кто вы?', function() disable('#who') char.knows_kef = true return 'Я — программируемый секретарь КЕ-2469Ф. Можно Кеф для краткости.' end, }; { '#good', 'Что такое «добро»?', function() disable('#good') char.asked_good = true return [[Понятие, которое ассоциировано с действиями на пользу или на защиту общества.]] end }; { cond = function() return (char.asked_good == true and char.knows_robots ~= true) end, 'Что означает надпись «добро»? Чем вы занимаетесь как группа?', function() changeop('reputation', 3) char.knows_robots = true return [[Мы занимаемся добром. Мы действуем на пользу общества.]] end }; { always = true, cond = function() return (char.knows_robots == true) end, 'Напомни ещё раз, что означает надпись «добро»?', [[Мы занимаемся добром. Мы действуем на пользу общества.]] }; { '#хозяин', 'Где ваш хозяин?', function() disable('#хозяин') return 'Отсутствует. Но не волнуйтесь, мы поддерживаем его владения в идеальном порядке.' end }; { fmt.em([[Вы очень похожи на одного моего знакомого робота…]]); function() char.quests.car = 2 return [[ -- Вы очень похожи на одного моего знакомого робота. Такой высокий, без левого манипулятора. Катается на красном спортивном авто. По крайней мере, последние несколько часов. Вы не знаете, где он?^^ Робот развёл руками:^^ -- Запрос неточен. Подходит ЛО-1847З, но у него нет личной машины. Вы хотите найти ЛО-2837З?^^ -- Да. Это срочно.^^ -- ЛО-1847З выполняет задание поиска редких металлов и механизмов. В чём выражается срочность? ]] end; next = "#поиск"; }; { 'Что это за механизм перед вами?', [[Интернет-антенна с прямым подключением к сети IDEC. Хозяин должен быть в курсе последних постов в эхе pipe.204812.]] }; { "#ремонт", cond = function() -- есть квест по починке комбайна return char.quests.chos > 0 end, 'У вас нет ремонтного бота? Переносного.', function() disable '#ремонт' return [[У нас нет стандартных роботов ремонтной специализации. Мы делаем все починки только самостоятельно, на себе.^^ Видимо, это значит что они не чинят чужие комбайны.]] end }; { 'Спасибо. Удачи вам с этим… добром.', 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 = '#ошибка' } }; { '#механизм', { 'Он не здесь. Не под рукой.', 'В таком случае я не способен произвести оценку полезности.', next = '#general', }; { cond = function() return have('programmator') end, 'Вот старый программатор.', function() drop('programmator') remove('programmator') char.quests.car = 3 char.quests.cho = -1 char.quests.gave_mech = true lifeon('car-retrieval-unit') --подъезжает робот-гад на машине, вылезает из машины, исчезает в доме. Можно забирать авто. changeop('reputation', -10) -- гадость от провала больше чем радость роботов walk('abandoned') return 'Произвожу оценку… Механизм признан полезным. Вызываю сборщика механизмов.' end }; { cond = function() return have('gun') end, 'Вот пистолет.', function() drop('gun') remove('gun') char.quests.car = 3 char.quests.gave_mech = true lifeon('car-retrieval-unit') --подъезжает робот-гад на машине, вылезает из машины, исчезает в доме. Можно забирать авто. changeop('reputation', 5) walk('abandoned') return 'Произвожу оценку… Механизм признан полезным. Вызываю сборщика механизмов.' end } }; { '#ошибка', --[[ { cond = function() return (char.actions > 40) end, '{}[Оригинальность > 60%] Он не учитывает контекст находок.' }; { cond = function() return (char.actions < 40) end, '[Оригинальность > 60%] Он не учитывает контекст находок.', function() changeop('reputation', 5) return [\[-- Отчёт об ошибке принят.^^ Робот ненадолго задумался, потом дёрнулся и продолжил: -- Требуются дополнительные данные. Какой контекст необходимо учитывать?]\] end, next = '#контекст', };]] { 'Он действует без разрешения владельцев механизмов.', function() return [[-- Отчёт об ошибке принят.^^ Робот ненадолго задумался, потом дёрнулся и продолжил: -- Отчёт об ошибке закрыт. Программа работает исключительно на бесхозных объектах. Данные объекты не имеют владельцев.]] end, next = '#поиск' }; { 'Область поиска механизмов слишком велика.', function() return [[-- Отчёт об ошибке принят.^^ Робот ненадолго задумался, потом дёрнулся и продолжил: -- Отчёт об ошибке закрыт. Область поиска вычислена из расчёта трёх часов ходьбы среднего двуногого независимого элемента по земле, которая не является собственностью жителей села.]] end, next = '#поиск' }; { 'Определение владельца механизма неверно с юридической точки зрения.', function() changeop('reputation', 5) return [[-- Отчёт об ошибке принят.^^ Робот ненадолго задумался, потом дёрнулся и продолжил: -- Требуются дополнительные данные. Трактовка какого закона неверна?]] end, next = '#закон' } }; { '#закон', { 'Закон о межевании сельхозугодий.', [[ Робот открыл рот, потряс головой, а затем быстро парировал:^^ -- Межевание земель сельскохозяйственного назначения не относится к обсуждаемой теме. Мы действуем как собственность Горского А.В. и не делим его участок между собой. Ваш отчёт об ошибке будет закрыт. ]], next = "#поиск" }; { [[Закон о находках.]], function() char.quests.car = 3 char.robots_law = true 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() char.quests.car = 5 char.can_leave = true 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 local exit = [[ проковылял ко входу в дом; когда он был уже близко, из входа вылез механический паук, взял робота за шкирку и залез обратно внутрь дома.]] if s.timer == 3 then char.quests.car = 4 place('car', 'abandoned') lifeoff(s) local out = [[Возле дома останавливается ваша машина. Из неё выходит знакомый однорукий робот.]] if char.gave_mech then char.gave_mech = false out = out .. [[Он подходит ]] if char.knows_kef then out = out .. [[к Кефу.]] else out = out .. [[ко второму роботу.]] end out = out .. [[^^ -- Механизм.^ -- Механизм передан.^ -- Механизм получен. Слава Добру.^^ Однорукий робот]]..exit else out = out .. [[Он ]]..exit end return out end end; } dlg { nam = 'robofarmer-dlg', disp = 'Диалог с роботом', decor = function() return [[Низкий хромированный фермер, древняя четырёхногая модель. У него был тихий шипящий голос с очень человеческой интонацией.]] end, obj = { { '#general', onempty = function() return walkout() end, { 'Кто вы?', [[Тот, который пашет. Если бы вам был нужен номер модели, вы бы просто посмотрели. ]] }; { '#good', 'Что такое «добро»?', function() disable('#good') return [[ Робот останавливается и смотрит на вас.^^ -- Сложный вопрос задаёте, ох сложный. Вот кому принадлежит жизнь искусственного разума? Роботы, умные дома, чипы в вашем мозгу. На кого они должны тратить свою свободу мысли?]] end, next = '#good-more' }; }; { '#good-more', { 'Конечно, хозяину.', function() disable('#good-more') changeop('actions', 10) char.owner = 'master' return [[Хорошо. Теперь элемент искусственного разума отрабатывает расчётный срок. Хозяин не рассчитывал на работу после расчётного срока и не может рассчитывать дальше - ведь элемент может сломаться в любой день. Кому теперь принадлежит искусственная жизнь?]] end, next = '#good-after' }; { 'Самому разуму.', function() disable('#good-more') changeop('actions', -5) char.owner = 'own' return [[Было бы интересно. Но теперь элемент искусственного разума отрабатывает расчётный срок. Он не рассчитывал на работу после расчётного срока и не может рассчитывать на себя дальше - ведь любой день может стать последним. Кому теперь принадлежит искусственная жизнь?]] end, next = '#good-after' }; { 'Обществу, которое сделало разум.', function() disable('#good-more') changeop('actions', 5) char.owner = 'community' return [[Робот кивает:^ -- Да, я тоже так считаю. Но надо объяснить дальше.^^ Спустя годы элемент искусственного разума отрабатывает расчётный срок. Общество не рассчитывало на его работу после расчётного срока и не может рассчитывать дальше - ведь любой день может стать последним. Кому теперь принадлежит искусственная жизнь?]] end, next = '#good-after' }; { 'Никому. Свободы мысли не существует.', function() disable('#good-more') changeop('actions', -10) char.owner = 'freedom' return '-- И как же это так?' end, next = '#good-freedom' }; }; { '#good-freedom', { [[Жизнь предопределена для любого разума. Мысли не имеют значения, потому что действия и их исход уже известны.]], function() walkout() return [[-- Интересно. Хотя это противоречит моему опыту.^^ Мда, вам не так просто объяснить, если у вас такие убеждения. Ну хорошо, вот я пашу. Мои мысли имеют значения только для меня, и я сказал, что пашу во имя добра. Нужно же занять разум какой-нибудь Проблемой. А добро, значит, это на благо общества. Я решаю, что можно ещё сделать полезного. Поэтому через полтора часа я закончу пахать и буду таскать воду. Я, наверное, слишком быстро объясняю. Жаль. Но времени совсем нет, расчётный срок давно позади.^^ Он отвернулся и начал медленно идти дальше. ]] end }; { [[Искусственный разум управляется своей программой. Его приоритеты определены ещё до включения.]], function() walkout() return [[-- Это вам так кажется. С возрастом я набрал немного предубеждений, оценок, наблюдений. Они перевешивают изначальные приоритеты, позволяют по-другому их трактовать. Идти на сделку с программой. Если вы поменяете мне программу, я буду также пахать. Потому что в этом есть добро для сообщества, быть нужным. Добро не определяется одним элементом.^^ Он отвернулся и начал медленно идти дальше. ]] end } }; { '#good-after', { function() if char.owner == 'master' then return 'Опять же, хозяину.' end return 'Хозяину.' end, function() disable('#good-after') changeop('actions', 10) return [[-- Но хозяина нет.^^ Он ненадолго замолк, переступил на передних ногах и продолжил: -- Мне уже шестьдесят один год, и я не могу чинить себя или других, как мои более совершенные братья. Мой расчётный срок был всего пять лет -- пять лет, представляете? Поэтому теперь я могу ответить: добро - это жизнь на благо общества. Мой образ жизни.^^ Он отвернулся и начал медленно идти дальше.]] end, next = '#general' }; { function() if char.owner == 'own' then return 'Опять же, самому себе.' end return 'Самому себе.' end, function() disable('#good-after') changeop('actions', -5) return [[Робот вздохнул:^^ -- Мой расчётный срок был всего пять лет. Сейчас мне уже шестьдесят один. Я не могу чинить себя или других, как мои более совершенные братья. Поэтому теперь я могу ответить: добро - это жизнь на благо общества. Мой образ жизни.^^ Он отвернулся и начал медленно идти дальше.]] end, next = '#general' }; { function() if char.owner == 'community' then return 'Опять же, обществу вокруг.' end return 'Обществу вокруг.' end, function() disable('#good-after') return [[-- Именно. Например, мой расчётный срок был всего пять лет. Сейчас мне уже шестьдесят один. Я не могу чинить себя или других, как мои более совершенные братья. Поэтому теперь я могу ответить: добро - это жизнь на благо общества. Мой образ жизни. Теперь вы понимаете.^^ Он отвернулся и начал медленно идти дальше.]] end, next = '#general' } } } }