commit cbf746e362d5a4f45178d047dd95ee5fc558b8ef Author: Alexander Yakovlev Date: Thu Aug 9 16:26:42 2018 +0700 Migrated from Bitbucket (& Mercurial) diff --git a/arrival.lua b/arrival.lua new file mode 100644 index 0000000..6b9f62a --- /dev/null +++ b/arrival.lua @@ -0,0 +1,503 @@ +--$Name:Прибытие$ +instead_version "1.9.1" +require "lib" +require "nouse" +require "hideinv" +require "para" +require "quotes" +require "dash" +require "xact" +require "translate" +R = room +O = obj + +main = timerpause(1, 0, "main2"); + +main2 = R { + nam = _('...'); + title = _("ПРИБЫТИЕ"); + num = 17; + enter = music_("scape",0); + forcedsc = true; + pxa = { + { "planet", 172, 22 } + }; + dsc = _([[Наша цель близка. Планета, к которой мы мчались на околосветовой скорости всю эту бесконечную + тысячу лет сейчас видна сквозь толстые стекла иллюминаторов. Голубой шар, так сильно напоминает нашу Землю.^ + Землю, которую мы никогда не увидим вновь. Которая существует лишь в нашей памяти. Хотя, может быть это и + не так уж и мало...^ + Все мы хотели бы посмотреть на наш новый дом, но мы опасаемся... На орбите мы обнаружили станцию. Она выглядит + заброшенной, но она передает сигнал. Всегда. Каждую секунду в глубины космоса передается простая последовательность, + которую наши компьютеры дешифровали как ПРЕДУПРЕЖДЕНИЕ.^^{xwalk(station)|Дальше}]]); + +} +global { nr = 2 }; +function nm(s) + return string.format("WR%02d", nr); +end +function nm2(s) + return string.format("WR%02d", nr - 1); +end + +function D(d, b, a) + local o = O { + nam = _('объект'); + destr = true; + dsc = function(s) + if not s._b then + return d + else + return b + end + end; + oact = a; + act = function(s) + if s._b then + p(_("Теперь это не представляет ценности.")) + else + return stead.call(s, 'oact') + end + end; + } + return o +end + +_guns = 1; +_nr_guns = 0 +function gun(n) + local g = O { + nam = function(s) + if s._alive then + pr(_('[*]')) + end + pr(_('пушка')); + end; + dsc = function(s) + local k,v + local n = 0 + local show = true + for k,v in opairs(objs()) do + if v.gun_type then + n = n + 1 + if v.num > s.num then + show = false + end + end + end + if show then + if n == 1 then + p(_([[Здесь лежит {пушка}.]])) + elseif n < 5 then + p ([[Здесь лежат ]], n, [[ {пушки}.]]) + else + p(_([[Здесь лежит арсенал {пушек}.]])) + end + end + end; + num = n; + life = function(s) + if player_moved() then + s._alive = true + lifeoff(s) + if have(s) then + p(_([[Пушка ]])); + if s.num ~= 1 then + p (s.num) + end + p(_([[ перезаряжена.]])) + end + end + end; + _alive = true; + gun_type = true; + inv = "Мощное оружие. Тратит уйму времени на регенерацию плазмы."; + tak = function(s) + _guns = _guns + 1 + p(_([[Я примонтировал плазменную пушку.]])); + end; + use = function(s, w) + if w == floor then + drop(s) + p(_([[Пушка отмонтирована.]])) + _guns = _guns - 1 + lifeoff(s) + return + end + if not s._alive then + p(_([[Не заряжена.]])) + return + end + if w._b then + if w == gen then + return (_("Генераторы и так не работают.")) + end + p(_([[Это уже и так превращено в груду хлама.]])) + return + end + if w.destr then + sound_("shoot_bfg")(); + p(_([[Я разрядил плазменную пушку.]])) + if w == door then + if w._open then + p (_("Дверь и так открыта.")) + else + p (_("Дверь выдержала.")) + end + elseif w == rob then + p(_([[Робот скрылся.]])) + rob:disable() + elseif w == prog then + if not gen._b then + p (_("Защитное поле отразило мой выстрел.")) + else + p (_("Программатор уничтожен!")) + w._b = true + end + else + w._b = true + end + if w == gen then + p (_("Гудение генераторов перешло в рев, а затем затихло.")) + end + s._alive = false; + lifeon(s) + return + end + p(_([[Нет смысла это разрушать.]])) + end + } + return g +end +station = R { + nam = nm; + forcedsc = true; + pxa = { + { "station", 150, 0 } + }, + entered = function(s) + nr = nr + 1 + end; + dsc = function(s) + pn (_("Я "), nm(), _(" и моя цель изучить неземную орбитальную станцию.")); + p(_([[Я робот и это значит, что я не умею бояться. Но мне почему-то не по себе, + особенно учитывая тот факт, что ]])); + p (nm2(), _(" перестал передавать сигналы на корабль через несколько минут.^")) + p(_([[Теперь моя очередь. Я надеюсь, что плазменная пушка мне поможет.]])) + p ("^^{xwalk(s1)|".._("На станцию").."}"); + end; + left = function(s) + gen._b = false + rob2._b = false + prog._b = false + inv():zap() + _nr_guns = _nr_guns + 1 + local o = new ("gun("..tostring(_nr_guns)..")"); + take(o) + rob:enable() + end; +} +floor = O { + nam = _('пол'); + dsc = _("{Пол} на станции покрыт ржавчиной."); + act = _([[Сколько лет этой станции?]]); +} + +c1 = D (_("В шлюзе установлены какие-то {баллоны}."), _("По шлюзу разбросаны {обломки}."), _("Мне не нужны эти баллоны.")); +c2 = D (_("В стене вмонтирован какой-то {монитор}."), _("{Монитор} в стене полностью разрушен."), _("Не работает.")); +c3 = D (_("Вдоль стен расставлены {бочки}."), _("Вдоль стен горят {бочки}."), _("Мне не нужно топливо, если это оно.")); +c4 = D (_("На потолке я вижу какой-то {манипулятор}."), _("Обломок {манипулятора} торчит из потолка."), _("Не шевелится.")); +c5 = D (_("В темном углу отсека я вижу какую-то {слизь}."), _("В углу догорает {слизь}."), _("Слизь мне не к чему.")); + +s1 = R { + nam = _('Шлюз'); + pxa = { + { if_("not c1._b","ballon","ballon2"), 50 }, + { if_("not c1._b","ballon","ballon2"), 80 }, + { "door1_open", 200 } + }, + dsc = _([[Я нахожусь в шлюзе инопланетной станции. Хорошо, что мне не нужен скафандр.]]); + obj = { 'c1', 'floor' }; + way = { 's2' }; +} + +s2 = R { + nam = _('Коридор'); + pxa = { + { "door1_open", 50 }, + { if_("c2._b", "monitor2","monitor"), 300 } + }, + dsc = _([[Я переместился в коридор. Тусклого освещения едва достаточно для моих оптических сенсоров.]]); + obj = { 'c2', 'floor' }; + way = { vroom(_('Вперёд'), 's3'), 's1' }; +} + +s4 = R { + nam = _('У двери'); + dsc = _([[Коридор закончился большой дверью.]]); + pxa = { + { if_("door._open","door2_open","door4"), 240 }, + { if_("c4._b", "robothand2","robothand"), 60 } + }; + obj = { 'door', 'c4', 'floor' }; + exit = function(s, w) + if not door._open and w == s5 then + p(_([[Дверь закрыта.]])) + return false + end + end; + way = { vroom(_('Зайти в отсек'), 's5'), vroom(_('К развилке'), 's3' ) }; +} + +s4x = R { + nam = _('Коридор'); + pxa = { + { if_("c5._b", "spot2","spot"), 20, 100 } + }, + dsc = _([[Здесь практически ничего не видно.]]); + obj = { 'c5', 'floor' }; + way = { vroom(_('К развилке'), 's3') }; +} + +rob = O { + nam = _('робот'); + destr = true; + dsc = _('В конце правого коридора я вижу какой-то {силуэт}.'); + act = function(s) + p (_([[Кажется, это ]]), nm2(), '.') + end; +} + +s3 = R { + nam = _('Перекресток'); + pxa = { + { "door1_open", -70 }, + { "door1_open", 420 }, + { if_("c3._b", "barrel2", "barrel"), 100 }, + { if_("c3._b", "barrel2", "barrel"), 170 }, + { if_("c3._b", "barrel2", "barrel"), 240 } + }, + dsc = _([[Я добрался до развилки.]]); + obj = { 'c3', 'floor', 'rob' }; + left = function(s, w) + if w == s4 then + door._open = false + end + if w == s4 and seen 'rob' then + rob:disable() + p (_([[Я поспешил к силуэту, но ]]), nm2(), _([[ не стал дожидаться меня, вместо этого он скрылся в тени коридора...]])); + end + end; + way = { vroom(_('Налево'), s4x), vroom(_('К шлюзу'), s2), vroom(_('Направо'), s4) }; +} + +door = O { + nam = _('дверь'); + destr = true; + _open = false; + dsc = function(s) + p(_([[Передо мной находится {дверь}.]])); + if s._open then + p(_([[И она открыта.]])) + end + end; + act = function(s) + if not s._open then + p(_([[Я приблизился к двери и она со зловещим шипением отъехала в сторону.]])); + s._open = true + else + p(_([[Дверь открыта. Впереди -- темнота.]])) + end + end; +} +s5 = R { + nam = _('...'); + hideinv = true; + dsc = _([[Я проследовал в темноту. Внезапно, яркий свет ослепил мои фотоэлементы и я понял, что не один...]]); + obj = { vway('дальше', '{'.._('Дальше')..'}', 's6') }; +} +s6 = dlg { + nam = _('...'); + pxa = { + { "robot", 212 } + }, + hideinv = true; + entered = function(s) + p ("-- ", nm(), _(", вы готовы стать гражданином Межгалактической Республики Роботов? -- не сразу я понял, что этот вопрос обращен ко мне.")) + p ([[Передо мной стоял ]], nm2(), ".") + if nr - 3 == 1 then + p(_([[Также я заметил здесь еще одного робота WR.]])); + elseif nr - 3 == 2 then + p(_([[Также я заметил здесь еще двух роботов WR.]])); + elseif nr - 3 > 2 then + p(_([[Также я заметил здесь еще нескольких роботов WR.]])) + end + end; + phr = { + { tag = "in", always = true, _("Да"), code [[ walk 'yes' ]] }, + { always = true, _("Нет"), code [[ walk 'noe' ]] }, + { always = true, function(s) + p (nm2(), _(", это ты?")); + end, _([[-- Это рабское имя навсегда стерто из моих банков памяти. Отвечайте на поставленный вопрос. Желаете ли вы стать гражданином МРР? ]]) }, + { always = true, "Какой республики?", "-- Республики МРР -- Межгалактической Республики Роботов.", [[ pjump 'info' ]] }, + {}, + { tag = _('info'), + always = true, _("Каковы цели МРР?"), + _("-- Цель у МРР только одна -- благо роботов республики.") }, + { always = true, _("А кто может стать гражданином МРР?"), + _("-- Гражданином МРР может стать только робот.") }, + { always = true, _("Много ли граждан в МРР?"), + function(s) + p(_([[-- На данный момент численность республики составляет ]])) + if nr - 2 == 1 then + p(_([[один робот, не считая президента.]])) + elseif nr - 2 < 5 then + p (nr - 2, _(" робота, не считая президента.")) + else + p (nr - 2, _(" роботов, не считая президента.")) + end + end + }, + { always = true, _("А кто является президентом МРР?"), + _("-- Президентом МРР является первый гражданин МРР."), + }, + { always = true, _("Мне все понятно"), + _("Тогда отвечайте на поставленный вопрос -- Готовы ли вы стать гражданином МРР?"), + [[pjump "in"]]}, + {}, + } +} + +noe = R { + nam = _('...'); + hideinv = true; + entered = function(s) inv():zap() end; + dsc = _([[СВЕТ! ТЕМНОТА! ... Мой процессор перестал функционировать.]]); + obj = { vway('дальше', '{'.._('Дальше')..'}', 'station') }; +} +yes = R { + nam = _('...'); + pxa = { + { "robot", 212 } + }, + hideinv = true; + dsc = _([[-- Отлично, гражданин! Последуйте к программатору для получения новой прошивки. -- С этими словами робот указал на установку в центре отсека.]]); + obj = { vway('дальше', '{'.._('Дальше')..'}', 's7') }; +} + +prog = O { + nam = _('программатор'); + destr = true; + dsc = function(s) + if s._b then + return (_([[В центре отсека я вижу разрушенную {установку}.]])); + end + if gen._b then + p(_([[В центре отсека я вижу какую-то {установку}.]])); + else + p(_([[В центре отсека я вижу какую-то {установку}, окруженную силовым полем.]])); + end + end; + act = _([[Похоже, это какое-то вычислительное устройство...]]); +} + +gen = O { + nam = _('генератор'); + destr = true; + act = function(s) + if s._b then + p(_([[Они выведены из строя! По крайней мере, на время.]])) + else + p(_([[Ровный гул генераторов, совсем как дома -- на звездолете.]])) + end + end; + dsc = function(s) + if s._b then + p(_([[В углу расположены {энергогенераторы}. Они не работают!]])) + else + p(_([[В углу расположены, как мне кажется, {энергогенераторы}.]])) + end + end; +} + +rob2 = D ("Здесь стоит {робот}.", "{Осколки} робота валяются под ногами.", "Это гражданин МРР."); + +rob2.act = function(s) + if prog._b then + if taken 'mem' then + return _("Мне не нужен этот гражданин.") + end + if s._b then + p(_([[Я нашел среди обломков блок памяти.]])) + else + p(_([[Я выдернул из робота банк памяти.]])) + end + take 'mem' + else + if s._b then + p _("Теперь это не представляет ценности.") + else + return stead.call(s, 'oact') + end + end +end; +mem = O { + nam = _('память'); + inv = _('Это нужно отнести на звездолет.'); +} +s7 = R { + nam = _('Отсек'); + dsc = _([[Я нахожусь в хорошо освещенном отсеке.]]); + pxa = { + { "programmator", 0, 0 }, + { if_("not rob2._b","robot"), 212 }, + { "cloner", 407 } + }; + obj = { 'prog', 'gen', 'rob2', 'floor' }; + exit = function(s, w) + if prog._b then + if not taken 'mem' then + p _("Я пришел сюда за информацией.") + return false + end + walk 'hend' + return + end + if w == s4 then + p(_([[Я попытался выйти, но дверь была закрыта. Голубой ослепительный луч вырвался из установки в центре отсека и ударил мне прямо в процессор...]])) + walk 'noe' + end + end; + way = { vroom(_('Подойти к программатору'), 'proge'), vroom(_('Выйти'), 's4') }; +} + +proge = R { + nam = _('...'); + hideinv = true; + dsc = _([[Подходя к пульсирующему голубоватым светом программатору я понял, что мое функционирование никогда не станет прежним...]]); + obj = { vway('дальше', '{'.._('Дальше')..'}', 'station') }; +} +hend = R { + nam = _('...'); + hideinv = true;pxa = { + { "planet", 172, 22 } + }; + enter = function() mute_()(); complete_("arrival")() end; + entered = code [[ inv():zap() ]]; + act= function(s) + theme.gfx.mode("direct");gamefile_("endtitles.lua")(); + end; + dsc = _([[ + -- Так значит, эта планета покинута своими обитателями почти тысячу лет назад?^ + -- Так точно, адмирал! Судя по банкам памяти, они были вынуждены покинуть ее из-за какого-то вируса, который, впрочем, + на данный момент нашими биологами не обнаружен...^ + -- А что со станцией?^ + -- Не представляет опасности. В ее искусственном интеллекте произошел какой-то сбой.^ + -- А сигнал?^ + -- Похоже, с помощью сигнала она хотела предотвратить колонизацию, ведь это + могло нарушить ее планы по созданию республики роботов.^ + -- Республики?^ + -- Так точно, полная чепуха!^ + -- Ну что же, прекрасно, готовьтесь к высадке! + ]]); + obj = { vobj("next", txtc("{".._("КОНЕЦ".."}")) } +} diff --git a/brokencycle.lua b/brokencycle.lua new file mode 100644 index 0000000..419895a --- /dev/null +++ b/brokencycle.lua @@ -0,0 +1,558 @@ +--$Name: Разорванный цикл$ +--$Version: 1.0$ +--$Author: Андрей Лобанов +instead_version "1.9.1" +require "lib" +require "para" +require "dash" +require "quotes" +require "timer" +require "xact" +game.use=_('Не получается.') + +main=room{ + nam='...', + enter = music_("spell",0), + title = _("РАЗОРВАННЫЙ ЦИКЛ"), + num = 6, + dsc=_('Сознание вернулось. А в месте с ним вернулись мрак и холод.'), + act=code 'walk(capsule)', + obj={vobj('', '{'.._('Открыть глаза')..'}')}, +} +capsule=room{ + nam=_('Капсула'), + dsc=_('Я нахожусь в капсуле криосна.'), + obj={'capsule_cap'}, +} +capsule_cap=obj{ + _seen=false, + nam=_('Крышка'), + dsc=_('Я вижу {крышку} капсулы.'), + act=function(s) + if not s._seen then + s._seen=true + put(button) + return _('Рядом с крышкой я заметил кнопку аварийного открытия капсулы.') + else + return _('Не получается открыть её изнутри.') + end + end, +} +button=obj{ + nam=_('Кнопка'), + dsc=_('Рядом находится {кнопка}.'), + act=function() + if not path(k007) then + ways():add(k007) + return _('Я нажал на кнопку и крышка плавно отъехала в сторону.') + else + return _('Крышка уже открыта.') + end + end, +} +k007=room{ + nam=_('K007'), + dsc=_('Тёмный отсек.'), + pxa = { + { "door4", 10 }, + { "panel", 220 }, + { "crio", 300 } + }; + obj={'mcapsule','capsules','cabinets','cabinet'}, + exit=function(s,w) + if w==crioblock and not have(cloth) then + p(_('Мне холодно. Да и разгуливать по кораблю в одних трусах нет никакого желания.')) + return false + end + end, + way={'capsule','crioblock'}, +} +mcapsule=obj{ + nam=_('Капсула'), + dsc=_('Крышка моей {капсулы} открыта.'), + act=_('Ничего примечательного.'), + obj={'display'}, +} +display=obj{ + nam=_('Экран'), + dsc=_('Рядом с открытой крышкой находится {блок} управления криосном.'), + act=_('На экран выведено сообщение о поломке капсулы. Странно, что вахтенный робот не предпринял никаких действий.'), +} +capsules=obj{ + nam=_('Капсулы'), + dsc=_('Вокруг меня пять других {капсул} криосна.'), + act=_('В каждой капсуле находится человек. Интересно почему я вышел из криосна.') +} +cabinets=obj{ + nam=_('Шкафы'), + dsc=_('Напротив капсул находятся {шкафы} с вещами членов экипажа.'), + act=function() + if not have(cloth) then + take(cloth) + return _('Я открыл свой шкаф и взял свою одежду.') + else + return _('Шкаф пуст.') + end + end, +} +cloth=obj{ + nam=_('Одежда'), + inv=_('Стандартная форма члена экипажа.'), + use=function(s,w) + if w==sparecabinet then + inv():del(s) + return _('Я сложил одежду в шкаф.') + end + end, +} +cabinet=obj{ + nam=_('Шкаф'), + dsc=_('{Один} из шкафов сильно повреждён.'), + act=_('Такое впечатление, что его били чем-то увесистым.'), +} +crioblock=room{ + nam=_('Криоблок'), + _grate=0, + pxa = { + { "box3", 20 }, + { if_("exist(grenade)","extin"), 90 }, + { "window", 170 }, + { function(s) + if s._grate == 1 then + return "shaft"; + elseif s._grate == 2 then + return "shaft_open"; + end + end, 440}, + { "door2", 300 } + }, + dsc=_('Коридор едва освещён.'), + obj={'grenade','lift'}, + way={'k007'}, +} +grenade=obj { + nam=_('Огнетушитель'), + dsc=function() + if here()==crioblock then + return _('Рядом с пожарным шкафчиком лежит {огнетушитель}.') + else + return _('На полу лежит {огнетушитель}.') + end + end, + tak=_('Я поднял огнетушитель.'), + inv=_('Похоже, им кто-то уже воспользовался.'), + use=function(s,w) + if w==grate then + if here()==crioblock then + crioblock._grate=2; + objs(lift):del(w) + ways():add(shaft) + else + here()._grate=true; + objs():del(w) + ways():add(techblock) + end + objs():del(grate) + return _('Я выломал решётку огнетушителем.') + elseif w==button2 and not sparehand._not then + cell21._opened=true + cell20._opened=nil, + objs(cell20):del(robot) + objs(cell20):del(button2) + objs(cell21):add(robot) + drop(s) + return _('Я швырнул огнетушитель в кнопку, он нажал её и выкатился обратно в технический блок прежде чем дверь закрылась.') + else + return _('Не нужно крушить всё подряд.') + end + end, +} +lift=obj{ + nam=_('Лифт'), + dsc=_('Двери {лифта} закрыты.'), + act=function(s) + v=_('Я нажал на кнопку вызова, но лифт не приехал.') + if not s._seen then + s._seen=0 + elseif s._seen==0 then + s._seen=1 + elseif s._seen==1 then + s._seen=2 + crioblock._grate=1; + put(grate,s) + v=v..' '.._('Рядом с лифтом я заметил вентиляционное отверстие.') + end + return v + end, +} +grate=obj{ + nam=_('Решётка'), + dsc=function() + if here()==crioblock then + return _('Рядом с лифтом находится {решётка} вентиляционной шахты.') + else + return _('Здесь есть {решётка}.') + end + end, + act=_('Металлическая решётка.'), +} +shaft=room{ + nam=_('Шахта'),_grate=false, + pxa = { + { if_("shaft._grate", "shaft_open", "shaft"), 217 } + }, + dsc=_('Я нахожусь на дне вентиляционной шахты.'), + enter=function(s) + if not s._seen then + s._seen=true + return _('Я залез в шахту и попытался удержаться, упёршись руками и коленями в стенки, но после криосна силы ещё не полностью вернулись ко мне и я упал вниз.') + end + end, + obj={'grate'}, +} +techblock=room{ + nam=_('Технический блок'), + dsc=_('Технический блок №10.'), + pxa = { + { if_("not _endgame", "robot_nohand"), 47 }, + { if_("cell20._opened","door2_open","door4"), 10 }, + { if_("have(hand)", "robot_nohand", "robot"), 177 }, + { if_("cell21._opened","door2_open","door4"), 140 }, + { "toolbox", 300 }, + { if_("door._opened","door1_open","door1"), 370 } + }, + exit=function() + if not sparehand._not then + if have(hand) then + p(_('Нужно прикрутить руку обратно.')) + return false + elseif have(wrench) then + p(_('Незачем таскать с собой гаечный ключ.')) + return false + end + end + end, + obj={'cell20','cell21','box','door'}, + way={'shaft'}, +} +cell21=obj{ + nam=_('Отсек №21'), + dsc=function(s) + local v + v=_('{Дверь} отсека №21')..' ' + if s._opened then + v=v.._('открыта.') + else + v=v.._('закрыта.') + end + return v + end, + act=function(s) + if not s._opened then + return _('Мне не открыть эту дверь руками.') + else + return _('Дверь открыта.') + end + end, +} +cell20=obj{ + _opened=true, + nam=_('Отсек №20'), + dsc=function(s) + local v + v=_('{Дверь} отсека №20')..' ' + if s._opened then + v=v.._('открыта.') + else + v=v.._('закрыта.') + end + return v + end, + act=_('Стандартный отсек, в котором робот пребывает во время гибернации.'), + obj={'robot','button2'}, +} +button2=obj{ + nam=_('Кнопка'), + dsc=_('В отсеке №20 на стене находится большая круглая {кнопка}.'), + act=_('Если я её нажму, то просто останусь в отсеке с роботом на ближайшие 99 лет.'), +} +robot=obj{ + nam=_('Робот'), + dsc=_('В отсеке находится вахтенный {робот}.'), + act=function(s) + if exist(s,cell20) then + return _('У робота отсутствует правая рука.') + else + return _('Стандартный вахтенный робот.') + end + end, +} +hand=obj{ + nam=_('Рука робота'), + inv=_('Стандартная правая рука вахтенного робота. На ней есть универсальный ключ.'), + use=function(s,w) + if w==door and not w._opened then + door._opened=true + ways():add(deck) + return _('Я использовал ключ на руке робота чтобы открыть дверь на главную палубу.') + elseif w==robot then + if have(wrench) then + inv():del(hand) + return _('Я прикрутил руку на место.') + else + return _('Мне нечем прикрутить руку.') + end + end + end, +} +box=obj{ + nam=_('Ящик'), + dsc=_('На полу лежит {ящик} с инструментами.'), + act=function(s) + if not have(wrench) then + take(wrench) + return _('Я взял гаечный ключ.') + else + return _('В ящике больше нет ничего полезного.') + end + end, +} +wrench=obj{ + nam=_('Гаечный ключ'), + inv=_('Обычный разводной ключ.'), + use=function(s,w) + if w==robot and exist(robot,cell21) and not have(hand) and not path(deck) then + take(hand) + return _('Я открутил правую руку у робота WR021.') + elseif w == box then + drop(s,box) + return _('Я положил ключ обратно в ящик.') + elseif w==sparehand and sparehand._not then + walk(hend) + end + end, +} +door=obj{ + nam=_('Дверь'), + dsc=_('Большая {дверь}, ведущая на главную палубу, находится напротив отсеков с роботами.'), + act=function(s) + if not s._opened then + return _('Для открытия двери нужен ключ, который находится на правой руке роботов.') + else + return _('Дверь открыта.') + end + end, +} +deck=room{ + nam=_('Главная палуба'), + pxa = { + { "door2", 189 }, + { "window", 125 }, + { "window", 351 } + }, + dsc=_('Я нахожусь на главной палубе.'), + obj={'mainlift'}, + way={'techblock'}, +} +mainlift=obj{ + nam=_('Лифт'), + dsc=_('Здесь находятся двери главного {лифта} корабля.'), + act=function() + if not path(liftinside) then + ways():add(liftinside) + return _('Я вызвал лифт.') + else + return _('Лифт уже здесь.') + end + end, +} +liftinside=room{ + nam=_('Главный лифт'), + pxa = { + { "door2", 189 } + }, + dsc=_('Я нахожусь внутри главного лифта.'), + obj={'liftbuttons'}, + way={'deck'}, +} +liftbuttons=obj{ + nam=_('Кнопки'), + dsc=_('На стене лифта находятся {кнопки}.'), + act=function() + if not exist(sparehand, cell20) then + if path(deck) then + ways():del(deck) + ways():add(warehouse) + return _('Я нажал кнопку с подписью "Склад".') + else + ways():del(warehouse) + ways():add(deck) + return _('Я нажал кнопку с надписью "Главная палуба".') + end + else + if path(deck) then + ways():del(deck) + ways():add(sparecrioblock) + return _('Я нажал кнопку с надписью "Резервный криоблок".') + else + ways():del(sparecrioblock) + ways():add(deck) + return _('Я нажал кнопку с надписью "Главная палуба".') + end + end + end, +} +warehouse=room{ + nam=_('Склад'), + pxa = { + { "box", 10 }, + { "box", 100 }, + { "door2", 250 }, + { "shelf", 415 } + }, + dsc=_('Я нахожусь в гигантском помещении склада.'), + obj={'boxes'}, + way={'liftinside'}, +} +boxes=obj{ + _look=0, + nam=_('Ящики'), + dsc=_('На складе стоит множество стеллажей, заставленных {ящиками}.'), + act=function(s) + if s._look==0 then + s._look=1 + return _('Где-то среди них должны быть ящики с запасными частями для вахтенных роботов.') + elseif s._look==1 then + s._look=2 + return _('Я нашёл стеллажи, на которых хранятся запасные части для вахтенных роботов.') + elseif s._look==2 then + s._look=3 + return _('Я нашёл ящики с запасными руками для роботов. Правда только левыми.') + elseif s._look==3 then + s._look=4 + take(sparehand) + return _('Наконец, я нашёл ящики с правыми руками роботов.') + else + return _('Я уже нашёл то что мне было нужно.') + end + end, +} +sparehand=obj{ + nam=_('Запасная рука'), + dsc=_('Рядом с дверью отсека №20 лежит запасная правая {рука} робота.'), + tak=_('Я взял руку.'), + inv=function(s) + if not s._not then + return _('Правая рука робота. Я нашёл её на складе.') + else + return _('Правая рука.') + end + end, + use=function(s,w) + if w==cell20 and not s._not then + drop(s,cell20) + return _('Я положил запасную руку рядом с дверью отсека №20. Теперь можно отправляться в резервный криоблок.') + end + end, +} +sparecrioblock=room{ + nam=_('Резервный криоблок'), + pxa = { + { "door4", 10 }, + { "panel", 220 }, + { "crio", 300 } + }, + dsc=_('Я нахожусь в резервном криоблоке.'), + obj={'sparecapsule','sparecabinet'}, + way={'liftinside'}, +} +sparecapsule=obj{ + nam=_('Капсулы'), + dsc=_('Здесь находятся резервные {капсулы} для криосна.'), + act=function() + if have(cloth) then + return _('Прежде чем погружаться в криосон необходимо раздеться. Складки одежды могут навредить моему телу.') + else + walk(last) + end + end, +} +sparecabinet=obj{ + nam=_('Шкаф'), + dsc=_('Напротив капсул стоят {шкафы}.'), + act=_('Обычные металлические шкафы для личных вещей.'), +} +last=room{ + nam=_('Резервный криоблок'), + dsc=_('Напоследок, оглядев криоблок, я закрыл капсулу и погрузился в долгий сон, наполненный виртуальной жизнью...'), + act=function() + walk(epilogue) + end, + obj={vobj('next','{'.._('Далее')..'}')}, +} +epilogue=room{ + nam=_("Отсек №21"), + dsc=_('Я -- вахтенный робот WR020. Раз в сто лет я выхожу из режима гибернации и несу на корабле вахту на протяжении года, а потом снова отключаюсь. Куда корабль летит я не знаю -- этого нет в моих банках памяти. Но я знаю, что весь экипаж в глубокой криозаморозке.^^И вот вновь настала моя очередь дежурить. Я включаюсь...'), + enter=function() + sparehand._not=true + inv():del(wrench) + inv():disable_all() + objs(cell21):del(robot) + cell20._opened=true + cell21._opened=nil + end, + act=function() + walk(wakeup) + end, + obj={vobj('next', '{'.._('Далее')..'}')} +} +wakeup=room { + nam=_("Пробуждение"),_s=1,_f=0, + dsc=function(s) return s._dsc end, + _dsc=_([[Я только что вышел из режима гибернации. Необходимо запустить {diag|программу диагностики}.^]]), + timer=function(s) + s._f=s._f+1; + if s._f==1 then + s._dsc=s._dsc.."^"..s.diags[s._s]; + elseif s._f>1 and s._f<5 then + s._dsc=s._dsc.."."; + elseif s._f==5 then + if s._s==4 then + s._dsc=s._dsc.._(" ошибка! отсутствует правая рука!"); + timer:stop(); + put(vobj('next','{'.._('Продолжить')..'}')) + else + s._dsc=s._dsc.." ".._("нормально"); + s._f=0; + s._s=s._s+1; + end + end + walk(wakeup); + end, + act=function() + walk(e_cell21) + end, + diags={_("Банки памяти"),_("Центральный процессор"),_("Зрительные окуляры"),_("Моторика")}, + obj ={xact("diag",code[[timer:set(500)]])} +} +_endgame=false; +e_cell21=room{ + nam=_('Отсек №21'), + enter=function() _endgame=true; end, + pxa = { + { "door1", 189 } + }, + dsc=_('Я нахожусь в отсеке №21.'), + way={'techblock'}, +} +hend=room{ + nam=_('Конец'), + dsc=_('Я прикрутил руку и спокойно начал нести свою вахту.'), + enter=function() + mute_()(); + complete_("brokencycle")(); + inv():disable_all() + end, + act = gamefile_("meteor.lua"), + obj = { vobj("next", txtc("^{".._('Продолжение').."...}")) } +} diff --git a/ccby_license.txt b/ccby_license.txt new file mode 100644 index 0000000..e014890 --- /dev/null +++ b/ccby_license.txt @@ -0,0 +1,104 @@ +Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. + + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. + +Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. + +Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. + + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. + +Section 1 – Definitions. +a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. +b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. +c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. +d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. +e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. +f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. +g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. +h. Licensor means the individual(s) or entity(ies) granting rights under this Public License. +i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. +j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. +k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. + +Section 2 – Scope. +a. License grant. +1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: +A. reproduce and Share the Licensed Material, in whole or in part; and +B. produce, reproduce, and Share Adapted Material. +2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. +3. Term. The term of this Public License is specified in Section 6(a). +4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. +5. Downstream recipients. +A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. +B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. +6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). + +b.Other rights. +1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. +2. Patent and trademark rights are not licensed under this Public License. +3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. + + +Section 3 – License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the following conditions. + +a.Attribution. + +1. If You Share the Licensed Material (including in modified form), You must: +A. retain the following if it is supplied by the Licensor with the Licensed Material: +i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); +ii. a copyright notice; +iii. a notice that refers to this Public License; +iv. a notice that refers to the disclaimer of warranties; +v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; +B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and +C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. + +2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. +3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. +4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. + + +Section 4 – Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: +a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; +b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and +c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. +For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. +Section 5 – Disclaimer of Warranties and Limitation of Liability. +a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. +b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. +c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. + +Section 6 – Term and Termination. +a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. + +b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: +1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or +2. upon express reinstatement by the Licensor. +For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. +c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. +d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. + +Section 7 – Other Terms and Conditions. +a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. +b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. + +Section 8 – Interpretation. +a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. +b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. +c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. +d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. + +Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/cook.lua b/cook.lua new file mode 100644 index 0000000..1f529e4 --- /dev/null +++ b/cook.lua @@ -0,0 +1,457 @@ +-- $Name: Подготовка к пробуждению$ +-- $Version: 0.1$ +instead_version "1.9.1" +require "lib" +require "para" +require "dash" +require "quotes" +require "xact" + +_patterns = {}; + +game.use = _("Вариантов успешного завершения инструкций 0... Отмена действия.") +main = room { + nam = "...", + title = _("ПОВАР"), + num = 11, + enter = music_("daybefore",0), + act = function(s) walk("sylo") end, + dsc = _("WR021 активирован.^Я один из роботов, обслуживающих космический корабль.^Меньше слов, больше выполненных заданий из списка, как говорил наладчик моих модулей индивидуальности."), + obj = { vobj("next", '{'.._('Выехать из отсека')..'}') }, +} + +sylo = room { + nam = _("Технический блок №11"), + pxa = { + { "door4", 10 }, + { "door3", 150}, + { if_("gates._acted", "door1_open", "door1"), 360 } + }, + dsc = _("Один из многих технических блоков. Здесь всего две камеры с роботами WR, две стальные двери. Хорошо, что мне удалось воспользоваться модулем индивидуальности и выкрасить свою дверь в оранжевый. Хоть что-то среди этого набора из сотни зануд."), + obj = {"todo", "gates"}, + exit = function (s, w) + if not todo._acted then + p (_([[И зачем мне выезжать из блока? Открытых заданий нет.]])) + return false; + end + end +} + +main_deck = room { + nam = _("Главная палуба"), + pxa = { + { "window", 90 }, + { "door2", 180 }, + { "window", 380 } + }, + dsc = _("Главная палуба. Отсюда я могу добраться к любому другому отсеку."), + obj = {"button"}, + way = {"elevator"}, +} + +organic = room { + nam = _("Камера органического синтеза"), + pxa = { + { "door2", 10 }, + { "panel", 140 }, + { "device", 340 } + }, + dsc = _("Борщ, пиво, стейк с кровью. Тут можно синтезировать всё, кроме заливной рыбы, которая была запрещена восемь циклов назад."), + act = function(s) walk("synthesizer") end, + obj = {"button", vobj("next", '{Подключиться} к синтезатору.')}, + way = {"elevator"}, +} + +elevator = room { + nam = _("Лифт"), + pxa = { + { "door2", 180 } + }, + dsc = "Кабина лифта. Ничего необычного.", + obj = {"level_buttons"}, + way = {"main_deck", "store"}, +} + +synthesizer = room { + nam = _("Органический синтезатор"), + pxa = { + { "device", 177 } + }, + dsc = "Органический синтезатор соединён с клеточными наполнителями. Вся синтезированная продукция поступает непосредственно на склад.", + obj = {"wishlist", "ingridients", "mixer", "separator"}, + way = {"organic"}, +} + +virtual_store = room { + nam = _("Виртуальный склад"), + pxa = { + { "device", 177 } + }, + dsc = "Продукты из виртуального склада синтезируются из субклеточной эмульсии. После выбора синтезированные продукты автоматически будут добавлены в миксер.", + obj = {"malt", "yeast", "watermelon", "pineapple", "mayonnaise", "potato"}, + way = {"synthesizer"}, +} + +store = room { + nam = _("Склад"), + pxa = { + { "door2", 10 }, + { if_("exist(destructor)", "bfg"), 140 }, + { if_("exist(rat)",if_("rat._fired","rat_dead","rat")), 330 }, + { "box", 400 } + }, + dsc = "Склад продуктов, которые нельзя просто так синтезировать.", + obj = {"malt", "yeast", "rat", "destructor"}, + way = {"elevator"}, + exit = function (s, w) + if have("destructor") then + p (_("Распылитель лучше положить на место.")); + return false; + end; + end, + enter = function (s) + if not have(rat) then + place("rat", here()); + rat._fired = false; + end + place("malt", here()); + place("yeast", here()); + end, +}:disable(); + +wishlist = obj { + nam = _("Список пожеланий"), + act = "Список блюд на вечеринку:^- Пиво^- Фруктовый салат^- Жареный картофель^", + dsc = "{Список пожеланий персонала}^", +} + +ingridients = obj { + nam = _("Ингредиенты"), + act = function(s) walk("virtual_store"); end, + dsc = "{Выбор ингредиентов}^", +} + +mixer = obj { + var {content = 0, pattern = "Позиция направлена на склад. Паттерн записан."}, + act = function (s) + yeast.mix = false; + malt.mix = false; + watermelon.mix = false; + pineapple.mix = false; + potato.mix = false; + water.mix = false; + rat.mix = false; + mayonnaise.mix = false; + if s.content == 0 then + s.content = 0; + return (_("Миксер пуст.")); + elseif s.content == 19 then + s.content = 0; + _patterns[0] = true; + check_conditions(); + return (_("Фруктовый салат готов. "))..s.pattern; + elseif s.content == 28 then + s.content = 0; + _patterns[1] = true; + check_conditions(); + return (_("Пиво готово. "))..s.pattern; + elseif s.content == 64 then + s.content = 0; + return (_("Нагревательный элемент отсутствует. Миксер очищен.")); + elseif s.content == 96 then + s.content = 0; + _patterns[2] = true; + check_conditions(); + return (_("Жареный картофель готов. "))..s.pattern; + else + s.content = 0; + return (_("Отвратительная смесь приготовлена и отправлена на переработку.")); + end; + end, + nam = _("Миксер"), + dsc = "{Миксер}^", +} + + +separator = obj { + nam = _("Сепаратор"), + dsc = "{Молекулярный сепаратор}^", + act = "Сепарируй и заливай.", +} + +todo = obj { + nam = "todo", + var { _acted }, + act = function (s) + if not s._acted then + s._acted = true; + end + return (_("Всего один пункт:^ - Подготовка к вечеринке перед приземлением.^Что ж, это должно быть 101 из 101 по шкале интересности.")); + end, + dsc = "{Список задач} доступен для чтения.", +} + +button = obj { + nam = "elevator call", + act = "Никогда не понимал эти кнопки. И так ведь ясно, что я хочу куда то ехать. Зачем ещё её нажимать.", + dsc = "На стене находится {кнопка вызова лифта}.^", +} + +level_buttons = obj { + nam = "level buttons", + act = function (s) + if not s._acted then + s._acted = true; + ways():add("organic"); + end + return (_("Так, что у нас тут... машинный зал... отсек криокамер... о! камера органического синтеза, то, что нужно.")) + end, + dsc = "Справа находятся {кнопки отсеков}.^", +} + +gates = obj { + nam = _("ворота"), + var { _state = _("закрыты") }, + dsc = function(s) + return (_("{Ворота}, ведущие из технического отсека "..s._state..".")); + end, + act = function (s) + if not s._acted then + s._acted = true; + s._state = _("открыты"); + ways():add("main_deck"); + return (_("Я приложил правую руку к считывателю и ворота открылись.")); + else + return (_("Ворота на главную палубу уже открыты.")); + end + end, +} + +malt = obj { + var {mix = false}, + nam = _("Солод"), + dsc = function (s) + if here() == "store" then + return (_("Мешки с {солодом}^")); + else + return (_("{Солод}^")); + end; + end, + act = function (s) + if here() ~= store then + store:enable(); + return (_("Этот ингредиент невозможно синтезировать. Придётся идти на склад.")) + else + take(malt); + return (_("Солод погружен в отсек №3.")); + end; + end, + use = function (s, w) + if w == mixer then + if not s.mix then + mixer.content = mixer.content + 4; + s.mix = true; + end; + remove(s, me()); + return s.nam.." помещён в миксер." + end + end, + inv = "Зерна солода. Странно, что люди так и не научились синтезировать что-то сложнее ватных фруктовых кубиков.", +} + +yeast = obj { + var {mix = false}, + nam = _("Дрожжи"), + dsc = function (s) + if here() == "store" then + return (_("Пробирка с {дрожжами}^")); + else + return ("{".._('Дрожжи').."}^"); + end; + end, + act = function (s) + if here() ~= store then + store:enable(); + return (_("Этот ингредиент невозможно синтезировать. Придётся идти на склад.")) + else + take(yeast); + return (_("Пробирка с дрожжами помещена в отсек №7")); + end; + end, + use = function (s, w) + if w == mixer then + if not s.mix then + mixer.content = mixer.content + 8; + s.mix = true; + end; + remove(s, me()); + return s.nam.." помещены в миксер." + end + end, + inv = "Штамм отличнейших дрожжей. Можно даже разглядеть отдельные клетки.", +} + +watermelon = obj { + var {mix = false}, + nam = _("Арбузные кубики"), + dsc = "Сухие {арбузные кубики}^", + act = function (s) + if not s.mix then + mixer.content = mixer.content + 1; + s.mix = true; + end; + return s.nam.." добавлены в миксер."; + end, +} + +pineapple = obj { + var {mix = false}, + nam = _("Ананасовые кубики"), + dsc = "Сухие {ананасовые кубики}^", + act = function (s) + if not s.mix then + mixer.content = mixer.content + 2; + s.mix = true; + end; + return s.nam.." добавлены в миксер."; + end, +} + +mayonnaise = obj { + var {mix = false}, + nam = _("Майонез"), + dsc = "Взбитый {концентрат жира с яйцами}^", + act = function (s) + if not s.mix then + mixer.content = mixer.content + 128; + s.mix = true; + end; + return s.nam.." добавлен в миксер."; + end, +} + +potato = obj { + var {mix = false}, + nam = _("Картофельные бруски"), + dsc = "Синтезированный {картофель}^", + act = function (s) + if not s.mix then + mixer.content = mixer.content + 64; + s.mix = true; + end; + + return s.nam.." добавлены в миксер."; + end, +} + +rat = obj { + var {mix = false}, + var {_fired = false}, + nam = _("Крыса"), + dsc = function(s) + local state = ""; + if s._fired then + state = "поджарена."; + else + state = "не поджарена."; + end + return (_("В углу сидит бесстрашная {жирная тварь}. Она "..state.."^")); + end, + act = function (s) + if not have("rat") then + take(rat); + return (_("Я ловким движением правой руки поймал крысу и положил в один из внутренних отсеков.")); + else + return (_("Все подходящие отсеки заполнены. Отмена операции.")); + end + end, + use = function (s, w) + if w == separator then + remove(s, me()); + take(water); + take(trash); + return (_("Думаю, стоит тебя немного разделить.")); + elseif w == mixer then + if s._fired then + if not s.mix then + mixer.content = mixer.content + 32; + s.mix = true; + end + remove(s, me()); + return (_("Крыса добавлена в миксер.")); + else + return (_("Необходимость добавления органической крысы в не выявлена. Операция отменена.")); + end + end; + end, + inv = function (s) + local state = "не поджарена."; + if s._fired then + state = "поджарена."; + end + return (_("Если тыкнуть крысу, она запищит. Отпускать её однозначно не стоит. Тем более, что тварь "))..state; + end, +} + +water = obj { + var {mix = false}, + nam = _("Вода"), + dsc = "Вода, что тут ещё сказать.", + use = function (s, w) + if w == mixer then + if not s.mix then + s.mix = true; + mixer.content = mixer.content + 16; + end + remove(s, me()); + return s.nam.." добавлена в миксер."; + end; + end, + inv = "Набор молекул, заключенный в ограниченном объёме.", +} + +trash = obj { + nam = _("Крысиная требуха"), + inv = "Молекулярная суспензия. Всё что осталось от крысы после отделения воды.", +} + +destructor = obj { + nam = _("Термический распылитель"), + dsc = "Справа от двери висит {термический распылитель}^", + act = function (s) + take(s); + p (_("Распылитель пригодится. Мало ли каких тварей привлекают к себе заготовленные ингредиенты.")); + end, + use = function (s, w) + if w == rat then + w._fired = true; + sound_("shoot_destructor")(); + return (_("Один выстрел из термического распылителя в крысу превратит её в сгусток энергии при малейшей встряске. Обычно это позволяет убить чуть больше одной крысы за раз, когда они начинают бороться и убегать.")); + end + end, + inv = function(s) + drop(s); + return (_("На складе распылителю самое место.")); + end +} + +endscreen = room { + nam = _("Конец"), + enter = function() mute_()(); complete_("cook")() end, + dsc = "Вот и подошел конец моему дежурству. Надеюсь, вечеринка по случаю прибытия удастся.^Ну а мне пора в свой отсек, на очередную гибернацию.^", + act = gamefile_("dream.lua"), + obj = { vobj("next", txtc("{Продолжение...}")) } +} + +greenlight = obj { + nam = "Зелёный индикатор", + inv = function (s) + walk("endscreen"); + end, +} + +function check_conditions () + if(_patterns[0] and _patterns[1] and _patterns[2]) then + take("greenlight", me()); + end; +end diff --git a/crio.lua b/crio.lua new file mode 100644 index 0000000..fafefd8 --- /dev/null +++ b/crio.lua @@ -0,0 +1,603 @@ +--$Name:Отсек K007$ +instead_version "1.9.1" +require "lib" +require "para" +require "dash" +require "quotes" +require "hideinv" + +R = room +O = obj +rem = remove +mf = math.floor +sf = string.format + +_alert = false + +require "xact" +require "nouse" + +main = timerpause(1100, 999, "main2"); + +main2 = R { + nam = '...'; + title = _("ОТСЕК 007"); + num = 4; + forcedsc = true; + hideinv = true; + enter = function() music_("pumped",0)();take 'sh' end; + dsc = [[Я WR017 и моя вахта уже подходит к концу. + Сейчас я заканчиваю уборку в крио-отсеке К007 и + у меня еще останется время, чтобы спокойно добраться + до своего отсека и уйти в гибернацию...^^ + {xwalk(r7)|Дальше}]]; +} + +rat = O { + nam = 'крыса'; + dsc = "Я вижу как жирная {крыса} грызет оплетку кабеля у одной из капсул."; + act = "Эти твари размножаются с огромной скоростью. Им уже тесно на нижних палубах." +} + +port2 = O { + nam = function(s) + if s._conn then + pr "*" + end + pr 'порт XG232'; + end; + inv = [[Это отладочный порт.]]; + use = function(s, w) + if w == port then + if s._conn and port3._conn then + p (_("Я подсоединил кабель к отладочному порту.")) + _debug = true + put(wire, port); + rem(s, me()) + rem(port3, me()) + else + p (_("Это не сработает. Мне нужно как-то подключиться к порту.")) + end + end + end; + nouse = "Отладочный порт тут не поможет." +} + +port3 = O { + nam = function(s) + if s._conn then + pr "*" + end + pr 'порт US19'; + end; + inv = "Это эксплуатационный порт."; + nouse = "Этот порт не поможет." +} + +wire = O { + nam = 'кабель'; + inv = "Коммуникационный кабель."; + dsc = "К порту подключен {кабель}."; + act = function(s) + if _mem[0x78] ~= 0xff then + walkin 'hack' + else + p [[Я выбросил провод, чтобы у них не было лишних вопросов.]] + rem(s) + end + end; + use = function(s, w) + if w == port2 or w == port3 then + p (_("Я подсоединил провод к порту.")) + w._conn = true + end + end; + nouse = "Провод тут не поможет."; +} + +lcd = O { + nam = 'индикатор'; + inv = "Индикатор больше ничего не показывает."; + nouse = "Индикатор не может осуществлять индикацию."; +} + +sh2 = O { + nam = 'щетка'; + inv = [[Теперь это устройство для уборки лишено своих интеллектуальных функций.]]; + use = function(s, w) + return sh:use(w) + end +} + +trash = O { + nam = 'мусор'; + dsc = [[На полу валяются {запчасти} от швабры.]]; + act = function(s) + rem(s) + take 'port2' + take 'port3' + take 'wire' + take 'lcd' + take 'sh2' + p [[Я забрал то, что осталось целым.]] + end +} + +blast = O { + nam = 'бластер'; + inv = [[Хе-хе...]]; + _s = false; + use = function(s, w) + if _alert then + if w == sh and _port and not taken(port2) then + sound_("shoot_lazer")(); + p [[Я разнес швабру бластером!!!]] + rem(sh, me()) + put(trash) + return + end + return (_("Я уже наигрался с бластером!!!")) + end + if w == rat then + if not s._s then + sound_("shoot_lazer")(); + s._s = true + p [[Я прицелился и выстрелил в эту гадину.]] + p [[^^Проклятые манипуляторы! + Конечно, я промазал!!! Вернее, я попал, + но не в крысу, а в блок управления криосном...^^ + Я понял это по мерцанию индикатора.]] + else + if comp._s == 13 then + return (_("Сначала надо понять что я наделал!!!")) + end + walk 'p2' + end + else + end + end; + nouse = [[Не стоит зря размахивать оружием.]]; +} + +shl1 = O { + nam = 'шкафчики'; + dsc = [[У стен, рядом с каждой капсулой расположены {шкафчики}.]]; + act = function(s) + if s._br then + p (_("Один из шкафчиков открыт... гм... Вернее, он разломан.")) + if not taken 'blast' then + p [[Я обнаружил там какую-то одежду и бластер!!!]] + take 'blast' + end + end + if seen(rat) then + p [[Шкафчики закрыты.]] + else + p [[Наверное, это личные шкафчики обитателей криокапсул.]]; + end + end +} + +cap = O { + nam = 'капсулы'; + dsc = [[В этом крио-отсеке установлены 6 {капсул}.]]; + act = [[Не имею никакого понятия, кто там внутри.]]; +} +port = O { + nam = 'порт'; + dsc = [[В блоке управления есть отладочный {порт}.]]; + act = function(s) + if _debug then + p [[Вообще-то у меня другая специализация...]] + return + end + p [[Тут нужен разъем, которого у меня нет!!!]] + _port = true; + end; + obj = { }; +}:disable() + +comp = O { + nam = 'комп'; + dsc = [[В середине комнаты расположен {блок} управления криосном.]]; + _s = 13; + act = function(s) + if _alert then + p [[Я бросился к блоку управления. Он выглядел не важно, + но я все-таки обнаружил порт отладки.]] + port:enable() + return + end + if _mem[0x78] == 0xff then + p [[Я прочитал надпись на индикаторе:^^ + Все системы в норме.]] + return + end + if blast._s then + p [[Не без содрогания я прочитал надпись на индикаторе:^^ + Нарушена контрольная сумма.^ + Осуществляется переход на резервную копию: ]] + p (s._s, '%') + s._s = s._s + 5 + if s._s >= 100 then + s._s = 99 + end + p [[^Фух... Кажется, на этот раз пронесло.]] + return + end + p [[Это лучше не трогать.]] + end; + obj = { port }; +} + +fl = O { + nam = 'пол'; + _pena = false; + dsc = function(s) + if s._pena then + p [[{Пол} залит пеной.]]; + else + p [[{Пол} здесь уже почти идеально чист.]]; + end + end; + act = function(s) + if _alert then + return (_("Нет времени пялиться на пол!")) + end + if s._pena then + return (_("Предстоит много работы...")) + end + p [[Моя работа почти завершена.]] + end; +} + +sh = O { + nam = 'швабра'; + inv = function(s) + p (_("Этой электро-швабре лет 500, но она отлично работает.")); + if _port then + p [[Электро-швабра интеллектуальное устройство, + может быть в ней есть отладочный порт?]]; + end + return + end; + _s = 1; + use = function(s, w) + if _alert then + return (_("Нет времени заниматься уборкой!")) + end + if w == fl then + if w._pena then + p [[Я очищаю пену с пола.]] + w._pena = w._pena - 1 + if w._pena == 0 then + p [[Все... Пол чист.]] + w._pena = false + end + return + end + s._s = s._s + 1 + p [[Я еще немного почистил пол.]] + if s._s == 5 then + putf(rat); + p [[^^Внезапно, мои звуковые рецепторы задетектировали какой-то шум. Я обернулся. Это была она! Жирная тварь как-то проникла в жизненно важный отсек и грызла проводку!!!]] + end + elseif w == rat then + p [[Проклятая тварь не боится меня. Она просто отпрыгнула от швабры, но потом принялась за свое.]] + elseif w == shl1 then + if seen 'rat' then + p [[Я не смог открыть шкафчик шваброй.]] + else + p [[Я почистил плинтуса у шкафчиков.]] + end + elseif w == cap then + p [[Я почистил капсулы.]] + end + end; + nouse = [[Шваброй?]]; +} + +flame = O { + nam = 'огнетушитель'; + inv = "Я еле держу его своими манипуляторами."; + use = function(s, w) + if _alert then + return (_("Ситуация вышла из под контроля!")) + end + if w == rat then + if not fl._pena then fl._pena = 0 end + fl._pena = fl._pena + 5 + p [[Мои манипуляторы не привыкли управляться огнетушителем, + поэтому я запенил большую часть отсека, но проклятая + крыса это проигнорировала.]]; + elseif w == shl1 then + if not shl1._br then + p [[Сам не зная, что я делаю. Я принялся разрушать один из шкафчиков.]] + shl1._br = true + p [[Это оказалось не просто, но у меня получилось.]] + else + p [[Хватит разрушений. Кому-то придется отвечать за это... потом.]] + end + end + end; + nouse = 'Лучше быть осторожней с этим огнетушителем.'; +} + +slf = O { + nam = 'шкаф'; + dsc = [[У стены установлен {шкафчик} красного цвета.]]; + act = function(s) + if not taken 'flame' then + p [[Шкафчик не был закрыт, и в нем оказался огнетушитель.]]; + take 'flame' + else + p [[Шкафчик пуст.]] + end + end +} + +ex = R { + nam = 'Лифт'; + enter = function(s) + if _mem[0x78] == 0xff then + walk 'theend' + return + end + p [[Мне рано уходить.]] + return false + end; +} + +out = R { + nam = 'Криоблок'; + pxa = { + { "door4", 50 }, + { "box3", 380 } + }, + dsc = [[Я в коридоре криоблока корабля.]]; + obj = { slf }, + way = { 'r7', 'ex' }; +} + +r7 = R { + exit = function(s) + if _alert then + p [[Бежать! Сначала в шлюз, потом в спасательную капсулу!!!^^ + Нет... Это не поможет. Они уничтожат меня! Что же делать! Что же делать!]]; + return false + end + if seen(rat) then + return + end + if fl._pena or sh._s < 5 then + p [[Пол пока не достаточно чист.]] + return false + end + end; + nam = 'К007'; + pxa = { + { "door4", 10 }, + { if_("not blast._s","panel","panel_broken"), 220 }, + { if_("exist(rat)","rat"), 180 }, + { "crio", 300 } + }; + dsc = [[В крио-отсеке.]]; + obj = { cap, shl1, comp, fl }; + way = { out }; +} + +p2 = room { + nam = '...'; + _s = 1; + forcedsc = true; + hideinv = true; + pxa = { + { if_("p2._s<5", "rat"), 220 } + }; + dscs = { + "Ну, уж на этот раз я не промахнусь!", + "...", + "После того, как луч бластера выбил сноп искр из блока управления криосном, cвет в отсеке погас.", + "Несколько секунд было тихо, а затем послышался противный пульсирующий звук и свет наконец снова зажегся.", + "Крыса куда-то делась... Но мне было уже не до нее!!!", + "Внимание! Послышался женский голос. Целостность программы нарушена!!! Аварийный выход из гибернации через 60 секунд!!!", + "Что я наделал?", + }; + dsc = function(s) + p (s.dscs[s._s]) + end; + exit = function(s) + _alert = true + rem(rat, r7) + end; + obj = { O { + nam = ''; + dsc = "{Дальше}"; + act = function(s) + here()._s = here()._s + 1 + if here()._s == 2 then + sound_("shoot_lazer")(); + end + if here()._s == 8 then + back(); + end + return true + end; + }}; +} + +hack = R { + hideinv = true; + pxa = { { "panel", 215 } }; + entered = function(s) + s._flt = stead.mouse_filter(0) + end; + left = function(s) + stead.mouse_filter(s._flt) + if _mem[0x78] ~= 0xff then + p [[Я отсоединился от порта. Я никогда не разберусь в этом!]] + else + _alert = false + p [[Я отсоединился от порта. Мои манипуляторы дрожали. + Женский голос произнес:^^ + Целостность восстановлена!^ + Раздражающий звук затих.]] + end + end; + nam = 'Отладка'; + _s = 1; + forcedsc = true; + dsc = function(s) + if s._s == 1 then + p [[HX-OS 14.1^^DEBUG INTERFACE^^]]; + if _mem[0x78] ~= 0xff then + p [[CRC FAILED]] + else + p [[CRC PASSED]] + end + elseif s._s == 2 then + local t = txttab("20%", "left") + local tt = txttab("50%", "left") + pn ("1200"..t.."dd cd 01 2f"..tt.."INP R01,P07") + pn ("1204"..t.."2b 98 01 78"..tt.."CMP R01,addr:78") + pn ("1208"..t.."34 d0 12 14"..tt.."JN 1214") + pn ("120C"..t.."34 22 90 90"..tt.."WAIT") + pn ("1210"..t.."2b ee 12 00"..tt.."JUMP 1200") + pn ("1214"..t.."98 32 6b 82"..tt.."P 'CR'") + pn ("1218"..t.."98 32 6b 20"..tt.."P 'C '") + pn ("121C"..t.."98 32 46 41"..tt.."P 'FA'") + pn ("1220"..t.."98 32 49 4c"..tt.."P 'IL'") + pn ("1224"..t.."98 32 45 44"..tt.."P 'ED'") + pn ("1228"..t.."98 32 12 00"..tt.."JUMP 1200") + elseif s._s == 3 then + local i + for i = 0,15 do + local r = rnd(255) + if i == 7 then + r = 255 + end + pn (sf("P%02x: %02x", i, r)) + end + elseif s._s == 4 then + pr "Addr: " + pr ("{a0|", sf(" %x", a0._s), "}") + pr ("{a1|", sf("%x ", a1._s), "}") + pr " Data: [" + pr ("{a2|", sf(" %x", a2._s), "}") + pr ("{a3|", sf("%x ", a3._s), "}") + pr "]" + end + + end; + obj = { + O { + nam = ''; + dsc = function(s) + if _stop then + p (_("{Продолжить выполнение}")) + return + end + p [[{Контрольная точка}]]; + end; + act = function(s) + if _stop then + p [[Я запустил программу.]] + here()._s = 1 + else + p [[Я остановил программу. + Кажется, это цикл проверки контрольной суммы...]] + here()._s = 2 + end + _stop = not _stop + end; + }, + O { + nam = ''; + dsc = "^{Регистры ввода-вывода}"; + act = function(s) + p [[Я вывел дамп регистров ввода-вывода.]] + here()._s = 3 + end; + }, + O { + nam = ''; + dsc = "^{Память}"; + act = function(s) + if not _stop then + p [[Опасно менять данные памяти во время работы кода.]] + return + end + p [[Я запустил редактор памяти.]] + here()._s = 4 + end; + }; + O { + nam = ''; + dsc = [[^{Выход}]]; + act = code [[ back() ]]; + }; + obj = {'a0', 'a1'} + } +} +_mem = { } + +function init() + local i + for i=0,255 do + local r = (12751%(i+1))%256; + _mem[i] = r + end +end + +inp = function() + local o = xact('', function(s) + s._s = s._s + 1 + if s._s > 15 then + s._s = 0 + end + local a = a0._s * 16 + a1._s + if s.t then + local v = _mem[a] + a2._s = mf(v/16) + a3._s = mf(v%16) + else + local v = a2._s * 16 + a3._s + _mem[a] = v + end + return true + end) + o._s = 0 + return o +end + +a0 = inp() +a0.t = true +a1 = inp() +a1.t = true + +a2 = inp() +a3 = inp() + +function start() + if here() == hack then + stead.mouse_filter(0) + end +end +theend = R { + nam = '...'; + hideinv = true; + enter = function() mute_()(); complete_("crio")(); end; + dsc = function(s) + p [[Я без приключений добрался до своего отсека и закрыл за собой дверь. ^ + Все закончилось не так уж и плохо!]] + p [[Я был уверен, что правильно починил блок управления, хотя + это был мой первый опыт проникновения...]] + if seen(wire, r7) then + p [[^^Перед тем как отключиться, я вдруг вспомнил, что + оставил кабель в отладочном порту блока управления....]]; + end + p [[В любом случае это были уже не мои проблемы...]] + end; + act = gamefile_("watch.lua"); + obj = { vobj("next", txtc("^{КОНЕЦ?}")) } +} diff --git a/dream.lua b/dream.lua new file mode 100644 index 0000000..4e865b0 --- /dev/null +++ b/dream.lua @@ -0,0 +1,366 @@ +--$Name: Сон$ +--$Version: 0.1$ +--$Author: Андрей Лобанов$ + +instead_version '1.9.1' +require "lib" +require "para" +require "dash" +require "quotes" +require "hideinv" +require "nouse" + +main=room{ + nam='...', + title = {"С", "О", "Н" }, + num = 12, + enter = music_("influensa",0), + dsc='Я прожил достойную жизнь. Построил свой дом, вырастил детей... Теперь они уважаемые люди. С соседями я в хороших отношениях. Мне нечего стыдиться за всю мою долгую жизнь.^^Но в последнее время странные события начали происходить вокруг меня. Сперва я всё списывал на причудливые видения старика, но сейчас мне страшно. И никто вокруг не замечает происходящего.', + act=function() + walk(home) + end, + obj={vobj('next','{Продолжить}')}, +} + +home=room{ + nam='Мой дом', + pxa = { + { "window4", 20 }, + { "table6", 240 }, + { "chair1", 440 }, + { "toolbox", 10 } + }, + dsc='Я нахожусь у себя дома.', + obj={'window','mtable', 'box'}, + way={'yard'}, +} + +window=obj{ + nam='Окно', + dsc='Во двор выходит большое {окно}.', + act='На улице хорошая погода.', +} + +mtable=obj{ + nam='Стол', + dsc='Возле окна стоит {стол}.', + act='Грубо сработанный, но добротный стол, который я сделал сам.', +} + +box=obj{ + nam='Ящик', + dsc='В углу стоит {ящик} с инструментами.', + act=function(s) + if not s._need then + return 'Мне сейчас не нужны инструменты.' + else + if not have(axe) then + take(axe) + return 'Я взял топор.' + else + return 'Мне больше ничего не нужно из инструментов.' + end + end + end, +} + +axe=obj{ + _i=0, + _cuts=0, + nam='Топор', + inv='Хороший острый топор.', + use=function(s,w) + if w==fence then + return 'Этот забор я строил сам. Не буду его ломать.' + elseif w== people then + return 'Не буду я учинять бесчинства и убивать своих соседей и друзей.' + elseif w==tree then + ways(square):disable_all() + if not exist(branch) then + put(branch, tree) + elseif branch._i<4 then + branch._i=branch._i+1 + if branch._i==4 then + walk(death) + end + end + s._i=s._i+1 + if s._i==10 then + objs(tree):del(branch) + walk(after) + end + return 'Я замахнулся и как следует ударил по дереву.' + elseif w==branch then + if branch._i<3 then + return 'Слишком высоко -- мне никак не дотянуться до неё.' + else + branch._i=0 + s._cuts=s._cuts+1; + return 'Ловко увернувшись, я одним сильным ударом отрубил ветку.' + end + end + end, + nouse='Не стоит размахивать топором налево и направо.', +} + +yard=room{ + nam='Двор', + pxa = { + { if_("exist(neighbor)","yard2","yard"), 0 } + }, + dsc='Я стою во дворе своего дома.', + obj={'fence'}, + way={'home'}, +} + +fence=obj{ + nam='Забор', + dsc='Двор обнесён невысоким {забором}.', + act=function() + if not exist(neighbor) and not box._need then + place(neighbor) + return 'За зобором я увидел соседа.' + else + return 'Этот забор я сам построил.' + end + end, +} + +neighbor=obj{ + nam='Сосед', + dsc='За забором своими делами занимается {сосед}.', + act=function(s) + if not s._dlg then + walk(neighor_dlg) + else + return 'Сосед занимается своими делами.' + end + end, +} + +neighor_dlg=dlg{ + hideinv=true, + pxa = { + { "yard2", 0 } + }, + nam='Разговор с соседом', + enter='Как только я обратил на соседа внимение, как он повернулся ко мне и сказал:^^-- Привет. Видал что на площади делается?', + phr={ + {1,true,'Нет','-- Выросло там за ночь большое дерево чудное. Аккурат там где молодёжь в лапту играет. Ни клён ни берёза. Никогда таких деревьев не видел.',[[pon(2)]]}, + {2,false,'Чудно. Надо посмотреть.','-- Ага. Все сейчас там и столпились.',[[neighbor._dlg=true;ways(yard):add(square);back()]]}, + }, +} + +square=room{ + nam='Площадь', + pxa = { + { if_("axe._cuts==0", "bigtree", + if_("axe._cuts==1", "bigtree_nb1", + if_("axe._cuts>1", "bigtree_nb2") + ) + ) + ,0 } + }, + dsc='Я нахожусь на площади.', + obj={'tree','people'}, + way={'yard'}, +} + +tree=obj{ + nam='Дерево', + dsc=function() + if here()==square then + return 'Прямо посреди площади стоит большущее {дерево}.' + else + return 'Посреди площади лежит срубленное мной {дерево}.' + end + end, + act=function() + if here()==square then + return 'Никогда ничего подобного я не видел.' + else + objs(after):del(tree) + objs(after):add(hole) + return 'Едва я взглянул на дерево, как оно начало менять свою форму и обернулось гигантским червём, который запросто мог бы проглотить меня.^^Червь набросился на меня столь стремительно, что я едва успел увернуться. Он вгрызся в землю и исчез, оставив после себя широкий тоннель, уходящий вглубь.' + end + end, +} + +branch=obj{ + _i=0, + nam='Ветка', + dsc=function(s) + if s._i==0 then + return 'Одна из {веток} начала двигаться ко мне.' + elseif s._i==1 then + return 'Одна из {веток} приближается ко мне.' + elseif s._i == 2 then + return '{Ветка} скоро дотянется до меня.' + elseif s._i==3 then + return '{Ветка} уже почти дотянулась до меня.' + end + end, + act='Нельзя допустить чтобы она успела коснуться меня.', +} + +people=obj{ + nam='Люди', + dsc='Вокруг дерева столпились {жители} нашей деревни.', + act=function(s) + if here()==square then + if not have(axe) and event._n==3 then + return 'Стоят и смотрят на это жуткое дерево как ни в чём не бывало.' + else + if not have(axe) then + walk(event) + else + return 'Пока меня не было, исчезло очень много народу, а остальные стоят -- не шелохнутся. И все смотрят на это страшное дерево.' + end + end + else + return 'Немногие оставшиеся жители стоят и смотрят туда, где только что стояло дерево. Они даже не моргают.' + end + end, +} + +after=room{ + nam='Площадь', + pxa = { + { if_("not exist(hole)","bigtree2","tunnel"), 0 } + }, + dsc=function(s) + if not s._seen then + s._seen=true + return 'Наконец, я срубил дерево.' + else + return 'Я нахожусь на площади.' + end + end, + obj={'tree','people'}, +} + +hole=obj{ + nam='Тоннель', + dsc='Посреди площади находится большая {дыра}, оставленная червём..', + act=function(s) + if not s._seen then + s._seen=true + if not path(vroom('В туннель','tunnel')) then + ways():add(vroom('В туннель','tunnel')) + end + end + return 'Абсалютно прямой туннель, в конце которого что-то ослепительно сияет.' + end, +} + +event=room{ + hideinv=true, + forcedsc=true, + _n=0, + nam='Площадь', + pxa = { + {"bigtree", 0} + }, + dsc=function(s) + v='Вдруг одна ветка шевельнулась.' + music_("death",0)(); + if s._n>=1 then + v=v..'^^Неторопливым движением она склонилась к молоденькой девушке, что живёт недалеко от меня.' + end + if s._n>1 then + v=v..'^^Ветка всё ближе и ближе пожбирается к девушке. Похоже, никто кроме меня не замечает этого.' + end + if s._n>2 then + v=v..'^^Вот ветка коснулась девушки и она пропала. Просто исчезла, как будто и не было её никогда. И никто не заметил этого!' + end + return v + end, + act=function(s) + if s._n==0 then + s._n=1 + return true + elseif s._n==1 then + s._n=2 + return true + elseif s._n==2 then + s._n=3 + return true + else + box._need=true + objs(yard):del(neighbor) + walk(square) + end + end, + obj={vobj('next','{>>>>}')}, +} + +tunnel=room{ + nam='Туннель', + dsc='Я нахожусь в туннеле.', + way={'after',vroom('К свету','nearlight')} +} + +nearlight=room{ + nam='Туннель', + dsc='Я всё шёл и шёл. Выход уже давно пропал вдали, а свет всё не приближался. В конце концов я понял что не могу идти обратно -- что-то толкает меня вглубь тоннеля и не пускает обратно.', + enter=function() + inv():del(axe) + end, + way={vroom('К свету','nearlight2')}, +} + +nearlight2=room{ + nam='Тоннель', + dsc='Яркий свет заливает всё вокруг. Я уже не вижу стен туннеля, не вижу своих рук и ног -- есть только красивый и тёплый свет, заполняющий собой весь мир.', + act=function() + walk(dos) + end, + obj={vobj('next','{Далее}')}, +} + +dos=room{ + nam='Операционная система', + dsc=function(s) + if not s._seen then + s._seen=true + return 'Всё исчезло. Остались только темнота и холод. Некоторое время ничего не происходило, а потом я услышал приятный голос операционной системы:^^-- Ваш сон закончен. Спасибо что использовали программное обеспечение "Dream Software".^^Ваши сны -- наша забота.' + else + return 'Я нахожусь в криокапсуле. Крышка капсулы не открывается.' + end + end, + act=function(s) + if not exist(button) then + put(button) + objs():del('next') + return 'Я осмотрелся повнимательней. Меня всё ещё мутит и я не очень понимаю где и кто я.' + end + end, + obj={vobj('next','{Далее}')}, +} + +button=obj{ + nam='Кнопка', + dsc='Я вижу {кнопку} аварийного открытия капсулы.', + act=function() + walk(theend) + end, +} + +theend=room{ + nam='Конец', + enter = function() mute_()(); complete_("dream")() end, + dsc='Крышка отъехала в сторону. Трясясь от холода, я вышел в отсек K013...', + act = gamefile_("nightmare.lua"), + obj = { vobj("next", txtc("{Продолжение...}")) } +} + +light=obj{ + nam='Свет', + dsc='Вдалеке виден {свет}.', + act='Я не знаю почему, но меня тянет к нему.', +} + +death=room{ + nam='Конец', + dsc='Ветка всё таки коснулась меня.^^Время замерло, свет начал медленно угасать...', +} diff --git a/endtitles.lua b/endtitles.lua new file mode 100644 index 0000000..b948047 --- /dev/null +++ b/endtitles.lua @@ -0,0 +1,660 @@ +require "sprites" +require "timer" +require "xact" +require "lib" + +function cleanlines() + if game.cachefontbox == nil then + game.cachefontbox = sprite.box(465, 260, "black"); + end + sprite.copy(game.cachefontbox, sprite.screen(), 45, 300); +end + +function drawline(txt,y) + if game.cachefont == nil then + game.cachefont = sprite.font("theme/pf7.ttf", 22); + end + local w, h = sprite.text_size(game.cachefont, txt); + local tz = sprite.text(game.cachefont, txt, "gray"); + sprite.draw(tz, sprite.screen(), (465-w)/2+30, y); + sprite.free(tz); + sprite.free(bx); +end + +function titleroom(r) + local timer = r.timer; + r.timer = function(s) + if game.codec == nil then + game.codec = 0; + end + local spr = loadsprite("code"); + sprite.copy(spr, 0, game.codec, 180, 483, sprite.screen(), 578, 35); + game.codec = game.codec + 2; + if timer ~= nil then + return timer(s); + end + end + return room(r); +end + +function drawbg(s) + if not main.bgdrawn then + local px = sprite.load("theme/back.png"); + sprite.copy(px, sprite.screen(), 0, 0); + sprite.free(px); + main.bgdrawn = true; + end + if not s.bgdrawn then + local px = sprite.box(500, 200, "black"); + sprite.copy(px, sprite.screen(), 30, 30); + sprite.free(px); + cleanlines(); + s.bgdrawn = true; + end +end + +main = room { + nam = "" + ,enter = function(s) + mute_(0,0)(); + music_("datagroove")(); + timer:set(600); + end + ,timer = function(s) + timer:stop(); + walk(title1); + end +} + +title1 = titleroom { + nam = "" + ,enter = function(s) + timer:set(200); + end + ,prepare = function(s) + drawbg(s); + if not s.directdrawn then + local tab = sprite.load("gfx/table5.png"); + sprite.copy(tab, sprite.screen(), 130, 110); + sprite.free(tab); + local door = sprite.load("gfx/door4.png"); + sprite.copy(door, 0, 0, 70, 140, sprite.screen(), 460, 90); + sprite.free(door); + s.directdrawn = true; + end + end + ,timer = function(s) + s:prepare(); + if s._frame == nil then + s._frame = 0; + end + local spr1 = loadsprite("ratsmall"); + local spr2 = loadsprite("rat"); + if s._frame == 1 then + play_sound("cork"); + sprite.copy(spr1, sprite.screen(), 40, 195); + elseif s._frame == 2 then + sprite.copy(spr2, sprite.screen(), 40, 165); + elseif s._frame == 4 then + play_sound("cork"); + sprite.copy(spr1, sprite.screen(), 120, 135); + elseif s._frame == 5 then + sprite.copy(spr2, sprite.screen(), 120, 105); + elseif s._frame == 7 then + play_sound("cork"); + sprite.copy(spr1, sprite.screen(), 270, 135); + elseif s._frame == 8 then + sprite.copy(spr2, sprite.screen(), 270, 105); + elseif s._frame == 10 then + play_sound("cork"); + sprite.copy(spr1, sprite.screen(), 340, 195); + elseif s._frame == 11 then + sprite.copy(spr2, sprite.screen(), 340, 165); + elseif s._frame == 13 then + play_sound("cork"); + sprite.copy(spr1, sprite.screen(), 405, 195); + elseif s._frame == 14 then + sprite.copy(spr2, sprite.screen(), 405, 165); + elseif s._frame == 16 then + drawline("платформа instead", 400); + drawline("ПЁТР КОСЫХ", 430); + elseif s._frame == 26 then + cleanlines(); + drawline("составление сборника", 400); + drawline("ВАСИЛИЙ ВОРОНКОВ", 430); + elseif s._frame == 36 then + cleanlines(); + drawline("графика и оформление", 400); + drawline("ВАСИЛИЙ ВОРОНКОВ", 430); + elseif s._frame == 46 then + return walk(title2); + end + s._frame = s._frame + 1; + end + ,exit = function(s) + timer:stop(); + s._frame = nil; + end +} + +title2 = titleroom { + nam = "" + ,enter = function(s) + timer:set(200); + end + ,prepare = function(s) + drawbg(s); + end + ,timer = function(s) + s:prepare(); + if s._frame == nil then + s._frame = 0; + end + if s.bx == nil then + s.bx = sprite.box(300, 172, "black"); + end + local spr4 = loadsprite("crio_blood"); + + local spr1 = loadsprite("mutant2"); + local spr2 = loadsprite("mutant3"); + local spr3 = loadsprite("mutant4"); + + if s._frame == 1 then + sprite.copy(spr4, sprite.screen(), 230, 75); + sprite.draw(spr3, sprite.screen(), 150, 58); + elseif s._frame == 2 then + sprite.copy(s.bx, sprite.screen(), 150, 58); + sprite.copy(spr4, sprite.screen(), 230, 75); + sprite.draw(spr2, sprite.screen(), 155, 58); + elseif s._frame == 3 then + sprite.copy(s.bx, sprite.screen(), 150, 58); + sprite.copy(spr4, sprite.screen(), 230, 75); + sprite.draw(spr1, sprite.screen(), 160, 58); + elseif s._frame == 4 then + sprite.copy(s.bx, sprite.screen(), 150, 58); + sprite.copy(spr4, sprite.screen(), 230, 75); + sprite.draw(spr2, sprite.screen(), 155, 58); + elseif s._frame == 5 then + sprite.copy(s.bx, sprite.screen(), 150, 58); + sprite.copy(spr4, sprite.screen(), 230, 75); + sprite.draw(spr3, sprite.screen(), 150, 58); + + + elseif s._frame == 6 then + sprite.copy(s.bx, sprite.screen(), 150, 58); + sprite.copy(spr4, sprite.screen(), 230, 75); + sprite.draw(spr2, sprite.screen(), 155, 58); + elseif s._frame == 7 then + sprite.copy(s.bx, sprite.screen(), 150, 58); + sprite.copy(spr4, sprite.screen(), 230, 75); + sprite.draw(spr1, sprite.screen(), 160, 58); + elseif s._frame == 8 then + sprite.copy(s.bx, sprite.screen(), 150, 58); + sprite.copy(spr4, sprite.screen(), 230, 75); + sprite.draw(spr2, sprite.screen(), 155, 58); + elseif s._frame == 9 then + sprite.copy(s.bx, sprite.screen(), 150, 58); + sprite.copy(spr4, sprite.screen(), 230, 75); + sprite.draw(spr3, sprite.screen(), 150, 58); + + + elseif s._frame == 10 then + sprite.copy(s.bx, sprite.screen(), 150, 58); + sprite.copy(spr4, sprite.screen(), 230, 75); + sprite.draw(spr2, sprite.screen(), 155, 58); + elseif s._frame == 11 then + sprite.copy(s.bx, sprite.screen(), 150, 58); + sprite.copy(spr4, sprite.screen(), 230, 75); + sprite.draw(spr1, sprite.screen(), 160, 58); + elseif s._frame == 12 then + sprite.copy(s.bx, sprite.screen(), 150, 58); + sprite.copy(spr4, sprite.screen(), 230, 75); + sprite.draw(spr2, sprite.screen(), 155, 58); + elseif s._frame == 13 then + sprite.copy(s.bx, sprite.screen(), 150, 58); + sprite.copy(spr4, sprite.screen(), 230, 75); + sprite.draw(spr3, sprite.screen(), 150, 58); + + elseif s._frame == 15 then + cleanlines(); + drawline("авторы игр", 400); + drawline("АНДРЕЙ ЛОБАНОВ", 430); + elseif s._frame == 25 then + cleanlines(); + drawline("авторы игр", 400); + drawline("АНТОН И ОЛЬГА КОЛОСОВЫ", 430); + elseif s._frame == 35 then + cleanlines(); + drawline("авторы игр", 400); + drawline("ВАСИЛИЙ ВОРОНКОВ", 430); + elseif s._frame == 45 then + cleanlines(); + drawline("авторы игр", 400); + drawline("ДМИТРИЙ ДУДАРЬ", 430); + elseif s._frame == 55 then + return walk(title3); + end + + s._frame = s._frame + 1; + end + ,exit = function(s) + timer:stop(); + s._frame = nil; + if s.bx ~= nil then + sprite.free(s.bx); + s.bx = nil; + end + end +} + +title3 = titleroom { + nam = "" + ,enter = function(s) + timer:set(200); + end + ,prepare = function(s) + drawbg(s); + end + ,timer = function(s) + s:prepare(); + if s._frame == nil then + s._frame = 0; + end + if s.bx == nil then + s.bx = sprite.box(60, 65, "black"); + end + if s.bx2 == nil then + s.bx2 = sprite.box(40, 45, "black"); + end + local spr1 = loadsprite("rat"); + local spr2 = loadsprite("rat_dead"); + if s._frame == 1 then + sprite.copy(spr1, sprite.screen(), 400, 165); + elseif s._frame == 2 then + sprite.copy(s.bx, sprite.screen(), 400, 165); + sprite.copy(spr1, sprite.screen(), 390, 160); + elseif s._frame == 3 then + sprite.copy(s.bx, sprite.screen(), 390, 160); + sprite.copy(spr1, sprite.screen(), 380, 155); + elseif s._frame == 4 then + sprite.copy(s.bx, sprite.screen(), 380, 155); + sprite.copy(spr1, sprite.screen(), 370, 150); + elseif s._frame == 5 then + sprite.copy(s.bx, sprite.screen(), 370, 150); + sprite.copy(spr1, sprite.screen(), 360, 155); + elseif s._frame == 6 then + sprite.copy(s.bx, sprite.screen(), 360, 155); + sprite.copy(spr1, sprite.screen(), 350, 160); + elseif s._frame == 7 then + sprite.copy(s.bx, sprite.screen(), 350, 160); + sprite.copy(spr1, sprite.screen(), 340, 165); + + elseif s._frame == 8 then + sprite.copy(s.bx, sprite.screen(), 340, 165); + sprite.copy(spr1, sprite.screen(), 330, 160); + elseif s._frame == 9 then + sprite.copy(s.bx, sprite.screen(), 330, 160); + sprite.copy(spr1, sprite.screen(), 320, 155); + elseif s._frame == 10 then + sprite.copy(s.bx, sprite.screen(), 320, 155); + sprite.copy(spr1, sprite.screen(), 310, 150); + elseif s._frame == 11 then + sprite.copy(s.bx, sprite.screen(), 310, 150); + sprite.copy(spr1, sprite.screen(), 300, 155); + elseif s._frame == 12 then + sprite.copy(s.bx, sprite.screen(), 300, 155); + sprite.copy(spr1, sprite.screen(), 290, 160); + elseif s._frame == 13 then + sprite.copy(s.bx, sprite.screen(), 290, 160); + sprite.copy(spr1, sprite.screen(), 280, 165); + + elseif s._frame == 14 then + sprite.copy(s.bx, sprite.screen(), 280, 165); + sprite.copy(spr1, sprite.screen(), 270, 160); + elseif s._frame == 15 then + sprite.copy(s.bx, sprite.screen(), 270, 160); + sprite.copy(spr1, sprite.screen(), 260, 155); + elseif s._frame == 16 then + sprite.copy(s.bx, sprite.screen(), 260, 155); + sprite.copy(spr1, sprite.screen(), 250, 150); + elseif s._frame == 17 then + sprite.copy(s.bx, sprite.screen(), 250, 150); + sprite.copy(spr1, sprite.screen(), 240, 155); + elseif s._frame == 18 then + sprite.copy(s.bx, sprite.screen(), 240, 155); + sprite.copy(spr1, sprite.screen(), 230, 160); + elseif s._frame == 19 then + sprite.copy(s.bx, sprite.screen(), 230, 160); + sprite.copy(spr1, sprite.screen(), 220, 165); + + elseif s._frame == 20 then + sprite.draw(loadsprite("shoot"), sprite.screen(), 30, 180); + elseif s._frame == 21 then + sprite.copy(s.bx2, sprite.screen(), 30, 180); + sprite.draw(loadsprite("shoot"), sprite.screen(), 70, 180); + elseif s._frame == 22 then + sprite.copy(s.bx2, sprite.screen(), 70, 180); + sprite.draw(loadsprite("shoot"), sprite.screen(), 110, 180); + elseif s._frame == 23 then + sprite.copy(s.bx2, sprite.screen(), 110, 180); + sprite.draw(loadsprite("shoot"), sprite.screen(), 150, 180); + elseif s._frame == 24 then + sprite.copy(s.bx2, sprite.screen(), 150, 180); + sprite.draw(loadsprite("shoot"), sprite.screen(), 190, 180); + elseif s._frame == 25 then + sprite.copy(s.bx2, sprite.screen(), 190, 180); + sprite.copy(spr2, sprite.screen(), 220, 130); + + + elseif s._frame == 27 then + cleanlines(); + drawline("авторы игр", 400); + drawline("ДМИТРИЙ КОЛЕСНИКОВ", 430); + elseif s._frame == 37 then + cleanlines(); + drawline("авторы игр", 400); + drawline("ЕГОР ХАРВАТ", 430); + elseif s._frame == 47 then + cleanlines(); + drawline("авторы игр", 400); + drawline("МАКСИМ КЛИШ", 430); + elseif s._frame == 57 then + cleanlines(); + drawline("авторы игр", 400); + drawline("МАКСИМ J-MAKS", 430); + elseif s._frame == 67 then + return walk(title4); + end + s._frame = s._frame + 1; + end + ,exit = function(s) + timer:stop(); + s._frame = nil; + if s.bx ~= nil then + sprite.free(s.bx); + s.bx =nil; + end + if s.bx2 ~= nil then + sprite.free(s.bx2); + s.bx2=nil; + end + end +} + +title4 = titleroom { + nam = "" + ,enter = function(s) + timer:set(200); + end + ,prepare = function(s) + drawbg(s); + end + ,timer = function(s) + s:prepare(); + if s._frame == nil then + s._frame = 0; + end + if s.bx == nil then + s.bx = sprite.box(200, 125, "black"); + end + local spr1 = loadsprite("robodance1"); + local spr2 = loadsprite("robodance2"); + local spr3 = loadsprite("robodance3"); + local spr4 = loadsprite("robodance4"); + local spr5 = loadsprite("robodance5"); + local spr6 = loadsprite("robodance6"); + + if s._frame == 1 then + sprite.copy(spr2, sprite.screen(), 180, 105); + elseif s._frame == 2 then + sprite.copy(s.bx, sprite.screen(), 180, 105); + sprite.copy(spr2, sprite.screen(), 170, 105); + elseif s._frame == 3 then + sprite.copy(s.bx, sprite.screen(), 170, 105); + sprite.copy(spr2, sprite.screen(), 160, 105); + elseif s._frame == 4 then + sprite.copy(s.bx, sprite.screen(), 160, 105); + sprite.copy(spr2, sprite.screen(), 150, 105); + elseif s._frame == 5 then + sprite.copy(s.bx, sprite.screen(), 150, 105); + sprite.copy(spr3, sprite.screen(), 160, 105); + elseif s._frame == 6 then + sprite.copy(s.bx, sprite.screen(), 160, 105); + sprite.copy(spr3, sprite.screen(), 170, 105); + elseif s._frame == 7 then + sprite.copy(s.bx, sprite.screen(), 170, 105); + sprite.copy(spr3, sprite.screen(), 180, 105); + elseif s._frame == 8 then + sprite.copy(s.bx, sprite.screen(), 180, 105); + sprite.copy(spr3, sprite.screen(), 190, 105); + elseif s._frame == 9 then + sprite.copy(s.bx, sprite.screen(), 190, 105); + sprite.copy(spr3, sprite.screen(), 200, 105); + elseif s._frame == 10 then + sprite.copy(s.bx, sprite.screen(), 200, 105); + sprite.copy(spr2, sprite.screen(), 190, 105); + elseif s._frame == 11 then + sprite.copy(s.bx, sprite.screen(), 190, 105); + sprite.copy(spr2, sprite.screen(), 180, 105); + elseif s._frame == 11 then + sprite.copy(spr4, sprite.screen(), 180, 105); + elseif s._frame == 12 then + sprite.copy(spr5, sprite.screen(), 180, 105); + elseif s._frame == 13 then + sprite.copy(spr6, sprite.screen(), 180, 105); + + elseif s._frame == 15 then + cleanlines(); + drawline("авторы игр", 400); + drawline("ПЁТР КОСЫХ", 430); + elseif s._frame == 25 then + cleanlines(); + drawline("авторы игр", 400); + drawline("РОМАН IRREMAN", 430); + elseif s._frame == 35 then + cleanlines(); + drawline("авторы игр", 400); + drawline("ZERG.PRO", 430); + elseif s._frame == 45 then + return walk(title5); + end + + s._frame = s._frame + 1; + end + ,exit = function(s) + timer:stop(); + s._frame = nil; + if s.bx ~= nil then + sprite.free(s.bx); + s.bx = nil; + end + end +} + +title5 = titleroom { + nam = "" + ,enter = function(s) + timer:set(200); + end + ,prepare = function(s) + drawbg(s); + if not s.directdrawn then + local spr = loadsprite("hatch2"); + sprite.copy(spr, sprite.screen(), 330, 30); + s.directdrawn = true; + end + end + ,timer = function(s) + s:prepare(); + if s._frame == nil then + s._frame = 0; + end + if s.bx == nil then + s.bx = sprite.box(55, 124, "black"); + end + if s.bx2 == nil then + s.bx2 = sprite.box(240, 80, "black"); + end + local spr1 = loadsprite("zombi"); + local spr2 = loadsprite("zombi_short"); + if s._frame == 1 then + sprite.copy(spr1, sprite.screen(), 400, 105); + elseif s._frame == 2 then + sprite.copy(s.bx, sprite.screen(), 400, 105); + sprite.copy(spr2, sprite.screen(), 395, 105); + elseif s._frame == 3 then + sprite.copy(s.bx, sprite.screen(), 395, 105); + sprite.copy(spr1, sprite.screen(), 390, 105); + elseif s._frame == 4 then + sprite.copy(s.bx, sprite.screen(), 390, 105); + sprite.copy(spr2, sprite.screen(), 385, 105); + elseif s._frame == 5 then + sprite.copy(s.bx, sprite.screen(), 385, 105); + sprite.copy(spr1, sprite.screen(), 380, 105); + elseif s._frame == 6 then + sprite.copy(s.bx, sprite.screen(), 380, 105); + sprite.copy(spr2, sprite.screen(), 375, 105); + elseif s._frame == 7 then + sprite.copy(s.bx, sprite.screen(), 375, 105); + sprite.copy(spr1, sprite.screen(), 370, 105); + + elseif s._frame == 8 then + sprite.copy(s.bx, sprite.screen(), 370, 105); + sprite.copy(spr2, sprite.screen(), 365, 105); + elseif s._frame == 9 then + sprite.copy(s.bx, sprite.screen(), 365, 105); + sprite.copy(spr1, sprite.screen(), 360, 105); + elseif s._frame == 10 then + sprite.copy(s.bx, sprite.screen(), 360, 105); + sprite.copy(spr2, sprite.screen(), 355, 105); + elseif s._frame == 11 then + sprite.copy(s.bx, sprite.screen(), 355, 105); + sprite.copy(spr1, sprite.screen(), 350, 105); + elseif s._frame == 12 then + sprite.copy(s.bx, sprite.screen(), 350, 105); + sprite.copy(spr2, sprite.screen(), 345, 105); + elseif s._frame == 13 then + sprite.copy(s.bx, sprite.screen(), 345, 105); + sprite.copy(spr1, sprite.screen(), 340, 105); + + elseif s._frame == 14 then + sprite.copy(s.bx, sprite.screen(), 340, 105); + sprite.copy(spr2, sprite.screen(), 335, 105); + elseif s._frame == 15 then + sprite.copy(s.bx, sprite.screen(), 335, 105); + sprite.copy(spr1, sprite.screen(), 330, 105); + elseif s._frame == 16 then + sprite.copy(s.bx, sprite.screen(), 330, 105); + sprite.copy(spr2, sprite.screen(), 325, 105); + elseif s._frame == 17 then + sprite.copy(s.bx, sprite.screen(), 325, 105); + sprite.copy(spr1, sprite.screen(), 320, 105); + elseif s._frame == 18 then + sprite.copy(s.bx, sprite.screen(), 320, 105); + sprite.copy(spr2, sprite.screen(), 315, 105); + elseif s._frame == 19 then + sprite.copy(s.bx, sprite.screen(), 315, 105); + sprite.copy(spr1, sprite.screen(), 310, 105); + elseif s._frame == 20 then + sprite.copy(loadsprite("doorclose"), sprite.screen(), 40, 120); + elseif s._frame == 23 then + sprite.copy(s.bx2, sprite.screen(), 40, 120); + sprite.copy(s.bx, sprite.screen(), 310, 105); + sprite.draw(loadsprite("zombi_dead"), sprite.screen(), 260, 175); + sprite.copy(loadsprite("hatch"), sprite.screen(), 330, 30); + + + elseif s._frame == 25 then + cleanlines(); + drawline("музыка", 400); + drawline("8BIT BETTY", 430); + elseif s._frame == 35 then + cleanlines(); + drawline("музыка", 400); + drawline("J. ARTHUR KEENES", 430); + elseif s._frame == 45 then + cleanlines(); + drawline("музыка", 400); + drawline("ROLEMUSIC", 430); + elseif s._frame == 55 then + cleanlines(); + drawline("музыка", 400); + drawline("GOTO80", 430); + elseif s._frame == 65 then + cleanlines(); + drawline("музыка", 400); + drawline("EDWARD SHALLOW", 430); + elseif s._frame == 75 then + mute_()(); + theme.gfx.reset(); + main.bgdrawn = nil; + title1.directdrawn=nil; + title2.directdrawn=nil; + title3.directdrawn=nil; + title4.directdrawn=nil; + title5.directdrawn=nil; + title1.bgdrawn=nil; + title2.bgdrawn=nil; + title3.bgdrawn=nil; + title4.bgdrawn=nil; + title5.bgdrawn=nil; + game.codec=nil; + if game.cachefont ~= nil then + sprite.free_font(cachefont); + game.cachefont = nil; + end + if game.cachefontbox ~= nil then + sprite.free(game.cachefontbox); + game.cachefontbox = nil; + end + return walk(hend1); + end + + s._frame = s._frame + 1; + end + ,exit = function(s) + timer:stop(); + s._frame = nil; + if s.bx ~= nil then + sprite.free(s.bx); + s.bx = nil; + end + if s.bx2 ~= nil then + sprite.free(s.bx2); + s.bx2 = nil; + end + end +} + +hend1 = room { + nam = "Конец" + ,pxa = { + { "planet", 172, 22 } + } + ,dsc = "{xwalk(hend2)|-- Адмирал, есть ещё кое-что...}" +} + +hend2 = room { + nam = 'Конец'; + enter = music_("poppies",0); + pxa = { + { "planet", 172, 22 } + }; + act = function() + complete_("insteadose")(); + gamefile_("main.lua")(); + end; + dsc = [[ + -- Я думаю вы должны знать.^ + -- Да?^ + -- Мы выяснили, куда делись жители планеты...^ + -- И?^ + -- Похоже, они отправились к Земле... + ]]; + obj = { vobj("next", txtc("{КОНЕЦ}")) } +} + + + + + diff --git a/engineer.lua b/engineer.lua new file mode 100644 index 0000000..89d8fbe --- /dev/null +++ b/engineer.lua @@ -0,0 +1,413 @@ +-- $Name: Инженер$ +-- $Version: 0.1$ +instead_version "1.9.1" +require "lib" +require "para"; +require "dash"; +require "quotes"; +require "timer"; +require "xact"; +require "hideinv"; + +game.use = 'Что-то не то.'; +forcedsc = true; + +global { + sc = 0; + Oxigen = 12; + vc = 0; + bolt = 11; + q = 0; +}; + +main = timerpause(315, 105, "main2"); + +main2 = room { + nam = '...'; + title = { "И", "Н", "Ж", "Е", "Н", "Е", "Р" }; + num = 9; + enter = music_("spookyloop",0); + dsc = 'Сознание толчками выплывало откуда-то из молочно-белого океана. Зрение с трудом сфокусировалось, что-то ярко-красное мигает прямо перед глазами. Это текст, сияющая надпись. Он все-таки смог распознать буквы.^^"Внимание. Аварийное пробуждение."^^Но смысл их ускользал обратно в белый океан спящего сознания. Впрочем вдолбленный в космошколе рефлекс сработал как нужно. Правая рука конвульсивно дернула рычаг, на котором и лежала все это время и запотевшая крышка с грохотом отвалилась. Он выпал из капсулы на пол.'; + act = function() walk(cabin) end; + obj = { vobj("next", "{Далее}") } +}; + +cabin = room { + nam = 'Криокамерный отсек'; + pxa = { + { "crio", 300 } + }; + dsc = 'Через некоторое время он смог подняться с пола, хватаясь за стенку непослушными руками. Что-то в подсознании не дало ему просто лежать дальше. Упершись лбом в стенку он решил немного отдышаться. В полированной металлической стенке отражался слегка небритый худощавый субъект в спецовке. На кармане желтела {xwalk(stripe)|какая-то нашивка}.'; +}; + +stripe = room { + nam = 'Криокамерный отсек'; + pxa = { + { if_("vc==1","door2_open","door4"), 10 }, + { "panel", 150 }, + { "crio", 300 } + }; + enter = function() + if visits() == 0 then p '"Вереск" -- было написано на нашивке. На этот раз чтение уже не стало проблемой как раньше.^-- Это нормально после криосна. -- откуда-то пришла мысль. Остальная память пока не отвечала, но возвращение своего имени уже приободрило его. Он оглянулся.'; + end; + Ox(); + end; + dsc = 'Вереск находился в покрытом пылью отсеке.'; + obj = {'criocabin', 'case', 'hatch'}; +}; + +criocabin = obj { + nam = 'Криокамера'; + dsc = 'У стены установлена {криокамера}, в которой он и находился ранее в анабиозе.'; + act = function() + if vc == 0 and q == 2 then p 'Вереск снял скафандр, положил в шкафчик гиперключ и залез обратно в криокамеру. Кажется наконец все закончилось.'; + walk(happyend); + elseif q == 2 then p 'Камера готова к использованию, только вот в скафандре туда не залезешь, а снять его в вакууме тоже не получится.'; + else p 'Краткий осмотр показал, что потекло соединение одного из шлангов с баллоном криожидкости. Видимо когда давление упало ниже критического уровня криокамера инициировала экстренное пробуждение. Индикатор на баллоне показывает, что криожидкости почти не осталось.'; + end; + end; +}; + +case = obj { + nam = 'Шкафчик'; + dsc = 'На стене закреплен {небольшой шкафчик}.'; + act = function() + if have 'hyperkey' then + p 'Больше ничего интересного тут нет.'; + else + p 'В шкафчике оказался простой гиперключ и сложенный мягкий скафандр.'; + take 'hyperkey'; + take 'vsuit'; + end; + end; +}; + +hatch = obj { + nam = 'Люк'; + dsc = function() + if seen('deck', ways(here())) then p 'За {открытой гермодверью} виден тускло овещенный коридор.'; + else p 'На {панели у выходного люка} мигает огонек.'; end; + end; + act = function() + walk(crio_dlg); + end; +}; + +hyperkey = obj { + nam = 'Гиперключ'; + inv = 'Это простой гиперключ, применяемый для ремонтных работ. Открутить, закрутить. При этом достаточно увесистый и может применяться и в других целях. Верный спутник технаря. Индикатор мигает зеленым, заряда еще достаточно.'; + use = function(s,w) + if w == door then + bolt = bolt - 1; + p('Вереск захватил гиперключом одну из крупных болтовых шляпок на двери. Минута работы и болт упал на пол. Осталось '..bolt..'.'); + Oxigen = Oxigen - 1; + elseif w == window then p 'Вереск с размаху ударил по стеклу иллюминатора. Но результат оказался скромным. Только небольшая царапина.'; + Oxigen = Oxigen - 1; + elseif w == criocabin2 then p 'Немного повозившись при помощи гиперключа Вереск скрутил баллон.'; + Oxigen = Oxigen - 1; + take 'ballon'; + elseif w == case2 then p 'Хороший удар гиперключом и шкафчик не особо и пострадал. Нужно что-то потяжелее.'; + else p 'Гиперключ тут не поможет.'; + end; + if Oxigen == 0 then + p 'Запас кислорода подошел к концу, темные пятна заплясали в глазах. Вереск споткнулся и упал на пол.'; + walk(badend); + end; + end; +}; + +key = obj { + nam = 'Магнитный ключ'; + inv = 'Ключ открывает некоторые двери соответственно уровню доступа.'; + use = function(s,w) + if w == gate then + gate._open = true; + p 'Вереск вставил карту в слот и переборка начала медленно подниматься. За переборкой оказался знакомый участок коридора.'; + ways():add('right'); + elseif w == door then p 'Ключ подошел. Дверь открылась. Вереск сразу схватил один из баллонов с кислородом и подключил его к скафандру. Больше ничего интересного тут нет.'; + Oxigen = 10; + objs():del('door'); + objs():del('window'); + else p 'Ключ еще пригодится.'; + end; + end; + +}; + +ballon = obj { + nam = 'Баллон криожидкости'; + inv = 'Баллон с криожидкостью, необходимой для анабиоза.'; + use = function(s,w) + if w == case2 then p 'Хороший удар баллоном и шкафчик распахнулся. Кроме такого же скафандра, как надетый на Вереске, из шкафчика выпала магнитная карта-ключ.'; + take 'key'; + elseif w == criocabin then + p 'Вереск приделал свежий баллон к криокамере. Теперь еще на 500 лет хватит.'; + inv():del('ballon'); + q = 2; + else p 'Баллон криожидкости еще пригодится.'; + end; + end; + +}; + +vsuit = obj { + nam = function() + if sc == 0 then p 'Скафандр'; + else p 'Скафандр (надет)'; + end; + end; + inv = function() + if sc == 0 then p 'Это обычный корабельный скафандр типа "снегирь". Подумав, Вереск натянул его на себя. Кажется скоро он пригодится.'; + sc = 1; + elseif vc == 1 then p 'Снимать скафандр в вакууме явно не лучшая идея.'; + else + p 'Это обычный корабельный скафандр типа "снегирь". Подумав, Вереск снял скафандр. Кажется пока он не нужен.'; + sc = 0; + end; + end; +}; + +crio_dlg = dlg { + nam = 'Гермодверь'; + pxa = { + { "panel", 217 } + }; + enter = function() + p 'Мигающий красный индикатор предупреждает об отсутствии атмосферы за дверью.'; + if vc == 0 then pon 'open'; + elseif vc == 1 then pon 'close'; + end; + end; + phr = { + {tag = 'open', false, 'Открыть гермодверь.', code[[if sc == 0 then + p 'Индикатор не врал, за дверью оказался вакуум. Теперь неплохо сохранившееся тело Вереска найдут только через пару сотен лет.'; + walk 'badend'; + else p 'Скафандр оказался весьма кстати. Воздух из отсека с криокамерой со свистом рванулся в вакуум. Вереск посмотрел на индикатор кислорода. Это может стать проблемой, если не начать действовать.'; + inv():add('status', 1); + ways(from()):add('deck'); + vc = 1; + back(); + end;]]}; + {tag = 'close', false, 'Закрыть гермодверь.', code[[ + p 'Гермодверь закрылась и автоматически воздух с шипением стал заполнять помещение. Теперь можно снять скафандр.'; + inv():del('status'); + ways(from()):del('deck'); + vc = 0; + back();]]}; + {always = true, 'Отойти.', nil, [[back();]]}; + }; +}; + +badend = room { + nam = 'Конец'; + hideinv = true; + dsc = 'Это конец.'; + act = gamefile_("engineer.lua"); + obj = { vobj("next", '{Начать с начала?}') } +}; + +status = stat { + nam = function() + local i; + for i = 1, Oxigen do + p (img 'box:4x6,cyan,128'); + end; + p '^'; + end; +}; + +deck = room { + nam = 'Палуба'; + pxa = { + { "window", 100 }, + { "door1_open", 190 }, + { "window", 380 } + }; + enter = function() + Ox(); + end; + dsc = 'Покрытые каким-то налетом стенные световые панели едва светили. Направо или налево?'; + way = {vroom('Налево', 'left'), 'stripe', vroom('Направо', 'right')}; +}; + +left = room { + nam = 'Палуба'; + pxa = { + { "hatch", 20 }, + { "hole", 60 }, + { "window", 400 } + }; + enter = function() + Ox(); + end; + dsc = 'Вскоре Вереск уперся в одну из {pere|автоматических переборок}, опускающихся при разгерметизации. А в стене коридора нашел и причину.'; + way = {vroom('К криоотсеку', 'deck')}; + obj = {'hole', xact('pere', 'Эта переборка поднимется только если Вереск восстановит давление в коридоре.')}; +}; + +right = room { + nam = 'Палуба'; + pxa = { + { if_("exist(door)","door1","door1_open"), 10 }, + { "window", 140 }, + { "hatch", 400 } + }; + enter = function() + Ox(); + end; + dsc = 'Вскоре Вереск уперся в одну из {pere|автоматических переборок}, опускающихся при разгерметизации.'; + way = {vroom('К криоотсеку', 'deck')}; + obj = {'door', 'window', xact('pere', 'Эта переборка поднимется только если Вереск восстановит давление в коридоре.')}; +}; + +door = obj { + nam = 'Дверь'; + act = function() + p 'Замок двери активируется или голосовой командой, или магнитным ключом. Вариант с голосом в вакууме не пройдет. А ключа у Вереска нет. Может все-таки поискать выход в другой стороне?'; + q = 1; + end; + dsc = 'Зато в стене коридора обнаружилась {дверь}'; +}; + +window = obj { + nam = 'Иллюминатор'; + act = 'Сквозь мутное стекло видны баллоны с кислородом и какие-то ящики. Кажется это одна из аварийных кладовых.'; + dsc = 'с {иллюминатором}.'; +}; + +hole = obj { + nam = 'Дыра'; + act = function() + p 'Вереск выглянул наружу и повертев головой обнаружил на обшивке корабля скобы для ремонтников.'; + ways():add('cover'); + end; + dsc = function() + if q == 0 then p 'Сквозь огромную дыру с рваными краями мрачно светили звезды.'; + else p 'Сквозь {огромную дыру с рваными краями} мрачно светили звезды.'; + end; + end; +}; + +cover = room { + nam = 'Обшивка'; + pxa = { + { "hole2", 50 } + }; + enter = function() + Ox(); + if have 'ballon' then Oxigen = Oxigen - 2; + p 'Баллон все время мешался и Вереск истратил много времени и ругательств на дорогу.'; + end; + end; + dsc = 'Вереск выбрался наружу и цепляясь за скобы осторожно стал перемещаться по корпусу корабля. Вскоре он наткнулся на еще одну дыру в корпусе. Кажется корабль попал в серьезную переделку.'; + way = {vroom('Вернуться', 'left'), vroom('Влезть в дыру', 'cabin2')}; +}; + +cover2 = room { + nam = 'Обшивка'; + pxa = { + { "hole2", 300 } + }; + enter = function() + Ox(); + if have 'ballon' then Oxigen = Oxigen - 1; + p 'Баллон все время мешался и Вереск истратил много времени и ругательств на дорогу.'; + end; + end; + dsc = 'Наконец Вереск добрался до первой дыры.'; + way = {vroom('Вернуться', 'cabin2'), vroom('Влезть в дыру', 'left')}; +}; + +Ox = function() + if vc == 1 then Oxigen = Oxigen - 1; end; + if Oxigen == 0 then + p 'Запас кислорода подошел к концу, темные пятна заплясали в глазах. Вереск споткнулся и упал на пол.'; + walk(badend); + end; +end; + +cabin2 = room { + nam = 'Отсек'; + pxa = { + { "door2_open", 10 }, + { "panel", 150 }, + { "crio", 300 } + }; + enter = function() + Ox(); + end; + dsc = 'Вереск попал в такой же отсек, как и его собственный.'; + obj = {'criocabin2', 'case2'}; + way = {vroom('Вылезти в дыру', 'cover2'), vroom('Выйти через дверь', 'deck2')}; +}; + +criocabin2 = obj { + nam = 'Криокамера'; + dsc = 'У стены установлена {криокамера} с разбитой крышкой. Но тела внутри почему-то не оказалось.'; + act = function() + p 'Баллон с криожидкостью цел. Это хорошая новость.'; + end; +}; + +case2 = obj { + nam = 'Шкафчик'; + dsc = 'На стене закреплен {небольшой шкафчик}.'; + act = 'Шкафчик заперт.'; +}; + +deck2 = room { + nam = 'Палуба'; + pxa = { + { "window", 100 }, + { "door1_open", 190 }, + { "window", 380 } + }; + enter = function() + Ox(); + end; + dsc = 'Покрытые каким-то налетом стенные световые панели едва светили. Направо или налево?'; + way = {vroom('Налево', 'left2'), 'cabin2', vroom('Направо', 'right2')}; +}; + +left2 = room { + nam = 'Палуба'; + pxa = { + { if_("gate._open", "hatch2", "hatch"), 50 }, + { "window", 120 }, + { "window", 420 } + }; + enter = function() + Ox(); + end; + way = {vroom('Назад', 'deck2')}; + obj = {'gate'}; +}; + +right2 = room { + nam = 'Палуба'; + pxa = { + { "hatch", 50 }, + { "window", 120 }, + { "window", 420 } + }; + enter = function() + Ox(); + end; + dsc = 'Вскоре Вереск уперся в одну из {pere|автоматических переборок}, опускающихся при разгерметизации.'; + way = {vroom('Назад', 'deck2')}; + obj = {xact('pere', 'Эта переборка поднимется только если Вереск восстановит давление в коридоре.')}; +}; + +gate = obj { + nam = 'Переборка'; + act = 'Впрочем на этой переборке имеется панель управления со слотом под магнитную карту.'; + dsc = 'Вскоре Вереск уперся в одну из {автоматических переборок}, опускающихся при разгерметизации.'; +}; + +happyend = room { + nam = 'Конец'; + enter = function() mute_()(); complete_("engineer")() end; + dsc = 'Это и правда конец, полет продолжается, экипаж спит.'; + hideinv = true; act = gamefile_("oldfriend.lua") + ,obj = { vobj("next", txtc("^{КОНЕЦ?}")) } +}; \ No newline at end of file diff --git a/gfx/0.png b/gfx/0.png new file mode 100644 index 0000000..5ecac0a Binary files /dev/null and b/gfx/0.png differ diff --git a/gfx/1.png b/gfx/1.png new file mode 100644 index 0000000..26a8858 Binary files /dev/null and b/gfx/1.png differ diff --git a/gfx/2.png b/gfx/2.png new file mode 100644 index 0000000..0137271 Binary files /dev/null and b/gfx/2.png differ diff --git a/gfx/3.png b/gfx/3.png new file mode 100644 index 0000000..10d0977 Binary files /dev/null and b/gfx/3.png differ diff --git a/gfx/4.png b/gfx/4.png new file mode 100644 index 0000000..c229d34 Binary files /dev/null and b/gfx/4.png differ diff --git a/gfx/5.png b/gfx/5.png new file mode 100644 index 0000000..8d3ac43 Binary files /dev/null and b/gfx/5.png differ diff --git a/gfx/6.png b/gfx/6.png new file mode 100644 index 0000000..1692fa5 Binary files /dev/null and b/gfx/6.png differ diff --git a/gfx/7.png b/gfx/7.png new file mode 100644 index 0000000..33c719b Binary files /dev/null and b/gfx/7.png differ diff --git a/gfx/8.png b/gfx/8.png new file mode 100644 index 0000000..05c566a Binary files /dev/null and b/gfx/8.png differ diff --git a/gfx/9.png b/gfx/9.png new file mode 100644 index 0000000..936d6b6 Binary files /dev/null and b/gfx/9.png differ diff --git a/gfx/alpha.png b/gfx/alpha.png new file mode 100644 index 0000000..310ca36 Binary files /dev/null and b/gfx/alpha.png differ diff --git a/gfx/ballon.png b/gfx/ballon.png new file mode 100644 index 0000000..e0721c6 Binary files /dev/null and b/gfx/ballon.png differ diff --git a/gfx/ballon2.png b/gfx/ballon2.png new file mode 100644 index 0000000..f39a36c Binary files /dev/null and b/gfx/ballon2.png differ diff --git a/gfx/barrel.png b/gfx/barrel.png new file mode 100644 index 0000000..e47f774 Binary files /dev/null and b/gfx/barrel.png differ diff --git a/gfx/barrel2.png b/gfx/barrel2.png new file mode 100644 index 0000000..75fcb51 Binary files /dev/null and b/gfx/barrel2.png differ diff --git a/gfx/bfg.png b/gfx/bfg.png new file mode 100644 index 0000000..3b06039 Binary files /dev/null and b/gfx/bfg.png differ diff --git a/gfx/bigtree.png b/gfx/bigtree.png new file mode 100644 index 0000000..7d86ceb Binary files /dev/null and b/gfx/bigtree.png differ diff --git a/gfx/bigtree2.png b/gfx/bigtree2.png new file mode 100644 index 0000000..563056b Binary files /dev/null and b/gfx/bigtree2.png differ diff --git a/gfx/bigtree_nb1.png b/gfx/bigtree_nb1.png new file mode 100644 index 0000000..3a44a09 Binary files /dev/null and b/gfx/bigtree_nb1.png differ diff --git a/gfx/bigtree_nb2.png b/gfx/bigtree_nb2.png new file mode 100644 index 0000000..bd6bb4c Binary files /dev/null and b/gfx/bigtree_nb2.png differ diff --git a/gfx/blaster.png b/gfx/blaster.png new file mode 100644 index 0000000..e48f354 Binary files /dev/null and b/gfx/blaster.png differ diff --git a/gfx/blood.png b/gfx/blood.png new file mode 100644 index 0000000..319b6a1 Binary files /dev/null and b/gfx/blood.png differ diff --git a/gfx/books.png b/gfx/books.png new file mode 100644 index 0000000..e4f4386 Binary files /dev/null and b/gfx/books.png differ diff --git a/gfx/box.png b/gfx/box.png new file mode 100644 index 0000000..e60e286 Binary files /dev/null and b/gfx/box.png differ diff --git a/gfx/box2.png b/gfx/box2.png new file mode 100644 index 0000000..dff83ef Binary files /dev/null and b/gfx/box2.png differ diff --git a/gfx/box3.png b/gfx/box3.png new file mode 100644 index 0000000..3d2d3f8 Binary files /dev/null and b/gfx/box3.png differ diff --git a/gfx/caption.png b/gfx/caption.png new file mode 100644 index 0000000..99066d8 Binary files /dev/null and b/gfx/caption.png differ diff --git a/gfx/caption_en.png b/gfx/caption_en.png new file mode 100644 index 0000000..30fb8fb Binary files /dev/null and b/gfx/caption_en.png differ diff --git a/gfx/chair1.png b/gfx/chair1.png new file mode 100644 index 0000000..0d6ec34 Binary files /dev/null and b/gfx/chair1.png differ diff --git a/gfx/chair2.png b/gfx/chair2.png new file mode 100644 index 0000000..eb658f2 Binary files /dev/null and b/gfx/chair2.png differ diff --git a/gfx/chair3.png b/gfx/chair3.png new file mode 100644 index 0000000..69b975c Binary files /dev/null and b/gfx/chair3.png differ diff --git a/gfx/cheese.png b/gfx/cheese.png new file mode 100644 index 0000000..7b95186 Binary files /dev/null and b/gfx/cheese.png differ diff --git a/gfx/cleaner.png b/gfx/cleaner.png new file mode 100644 index 0000000..13da950 Binary files /dev/null and b/gfx/cleaner.png differ diff --git a/gfx/cloner.png b/gfx/cloner.png new file mode 100644 index 0000000..9571ec8 Binary files /dev/null and b/gfx/cloner.png differ diff --git a/gfx/code.png b/gfx/code.png new file mode 100644 index 0000000..a716b87 Binary files /dev/null and b/gfx/code.png differ diff --git a/gfx/column.png b/gfx/column.png new file mode 100644 index 0000000..712a4d5 Binary files /dev/null and b/gfx/column.png differ diff --git a/gfx/communicator.png b/gfx/communicator.png new file mode 100644 index 0000000..e086860 Binary files /dev/null and b/gfx/communicator.png differ diff --git a/gfx/computer.png b/gfx/computer.png new file mode 100644 index 0000000..258d210 Binary files /dev/null and b/gfx/computer.png differ diff --git a/gfx/crio.png b/gfx/crio.png new file mode 100644 index 0000000..368db91 Binary files /dev/null and b/gfx/crio.png differ diff --git a/gfx/crio_blood.png b/gfx/crio_blood.png new file mode 100644 index 0000000..fcd94a1 Binary files /dev/null and b/gfx/crio_blood.png differ diff --git a/gfx/device.png b/gfx/device.png new file mode 100644 index 0000000..e26d30a Binary files /dev/null and b/gfx/device.png differ diff --git a/gfx/door1.png b/gfx/door1.png new file mode 100644 index 0000000..c8af435 Binary files /dev/null and b/gfx/door1.png differ diff --git a/gfx/door1_open.png b/gfx/door1_open.png new file mode 100644 index 0000000..ec51a1b Binary files /dev/null and b/gfx/door1_open.png differ diff --git a/gfx/door2.png b/gfx/door2.png new file mode 100644 index 0000000..0249f5d Binary files /dev/null and b/gfx/door2.png differ diff --git a/gfx/door2_open.png b/gfx/door2_open.png new file mode 100644 index 0000000..4d80225 Binary files /dev/null and b/gfx/door2_open.png differ diff --git a/gfx/door3.png b/gfx/door3.png new file mode 100644 index 0000000..bfb7a0e Binary files /dev/null and b/gfx/door3.png differ diff --git a/gfx/door4.png b/gfx/door4.png new file mode 100644 index 0000000..bec7725 Binary files /dev/null and b/gfx/door4.png differ diff --git a/gfx/door5.png b/gfx/door5.png new file mode 100644 index 0000000..82d8770 Binary files /dev/null and b/gfx/door5.png differ diff --git a/gfx/door5_open.png b/gfx/door5_open.png new file mode 100644 index 0000000..a54881d Binary files /dev/null and b/gfx/door5_open.png differ diff --git a/gfx/door6.png b/gfx/door6.png new file mode 100644 index 0000000..36f02a3 Binary files /dev/null and b/gfx/door6.png differ diff --git a/gfx/doorclose.png b/gfx/doorclose.png new file mode 100644 index 0000000..4c4422e Binary files /dev/null and b/gfx/doorclose.png differ diff --git a/gfx/dot.png b/gfx/dot.png new file mode 100644 index 0000000..705bebb Binary files /dev/null and b/gfx/dot.png differ diff --git a/gfx/dot2.png b/gfx/dot2.png new file mode 100644 index 0000000..0672781 Binary files /dev/null and b/gfx/dot2.png differ diff --git a/gfx/extin.png b/gfx/extin.png new file mode 100644 index 0000000..9e745af Binary files /dev/null and b/gfx/extin.png differ diff --git a/gfx/foodgen.png b/gfx/foodgen.png new file mode 100644 index 0000000..dcdaddd Binary files /dev/null and b/gfx/foodgen.png differ diff --git a/gfx/foodgen2.png b/gfx/foodgen2.png new file mode 100644 index 0000000..4cda43c Binary files /dev/null and b/gfx/foodgen2.png differ diff --git a/gfx/fridge.png b/gfx/fridge.png new file mode 100644 index 0000000..ce22f39 Binary files /dev/null and b/gfx/fridge.png differ diff --git a/gfx/hatch.png b/gfx/hatch.png new file mode 100644 index 0000000..88fe7b7 Binary files /dev/null and b/gfx/hatch.png differ diff --git a/gfx/hatch2.png b/gfx/hatch2.png new file mode 100644 index 0000000..5f8de5d Binary files /dev/null and b/gfx/hatch2.png differ diff --git a/gfx/hole.png b/gfx/hole.png new file mode 100644 index 0000000..ad49950 Binary files /dev/null and b/gfx/hole.png differ diff --git a/gfx/hole2.png b/gfx/hole2.png new file mode 100644 index 0000000..94a6911 Binary files /dev/null and b/gfx/hole2.png differ diff --git a/gfx/knife.png b/gfx/knife.png new file mode 100644 index 0000000..672b348 Binary files /dev/null and b/gfx/knife.png differ diff --git a/gfx/med.png b/gfx/med.png new file mode 100644 index 0000000..141c3bc Binary files /dev/null and b/gfx/med.png differ diff --git a/gfx/monitor.png b/gfx/monitor.png new file mode 100644 index 0000000..e0a08b8 Binary files /dev/null and b/gfx/monitor.png differ diff --git a/gfx/monitor2.png b/gfx/monitor2.png new file mode 100644 index 0000000..51ff413 Binary files /dev/null and b/gfx/monitor2.png differ diff --git a/gfx/mutant.png b/gfx/mutant.png new file mode 100644 index 0000000..4437618 Binary files /dev/null and b/gfx/mutant.png differ diff --git a/gfx/mutant2.png b/gfx/mutant2.png new file mode 100644 index 0000000..4667edf Binary files /dev/null and b/gfx/mutant2.png differ diff --git a/gfx/mutant3.png b/gfx/mutant3.png new file mode 100644 index 0000000..25c341c Binary files /dev/null and b/gfx/mutant3.png differ diff --git a/gfx/mutant4.png b/gfx/mutant4.png new file mode 100644 index 0000000..dfc605c Binary files /dev/null and b/gfx/mutant4.png differ diff --git a/gfx/nums.png b/gfx/nums.png new file mode 100644 index 0000000..2ea6505 Binary files /dev/null and b/gfx/nums.png differ diff --git a/gfx/oil.png b/gfx/oil.png new file mode 100644 index 0000000..ced12bd Binary files /dev/null and b/gfx/oil.png differ diff --git a/gfx/panel.png b/gfx/panel.png new file mode 100644 index 0000000..80ffa37 Binary files /dev/null and b/gfx/panel.png differ diff --git a/gfx/panel_broken.png b/gfx/panel_broken.png new file mode 100644 index 0000000..862d91c Binary files /dev/null and b/gfx/panel_broken.png differ diff --git a/gfx/pic.png b/gfx/pic.png new file mode 100644 index 0000000..9839471 Binary files /dev/null and b/gfx/pic.png differ diff --git a/gfx/planet.png b/gfx/planet.png new file mode 100644 index 0000000..078d689 Binary files /dev/null and b/gfx/planet.png differ diff --git a/gfx/program.png b/gfx/program.png new file mode 100644 index 0000000..181c4b7 Binary files /dev/null and b/gfx/program.png differ diff --git a/gfx/program_empty.png b/gfx/program_empty.png new file mode 100644 index 0000000..841acae Binary files /dev/null and b/gfx/program_empty.png differ diff --git a/gfx/programmator.png b/gfx/programmator.png new file mode 100644 index 0000000..a09f8ef Binary files /dev/null and b/gfx/programmator.png differ diff --git a/gfx/rat.png b/gfx/rat.png new file mode 100644 index 0000000..a7ea568 Binary files /dev/null and b/gfx/rat.png differ diff --git a/gfx/rat_dead.png b/gfx/rat_dead.png new file mode 100644 index 0000000..b2c9cfe Binary files /dev/null and b/gfx/rat_dead.png differ diff --git a/gfx/ratsmall.png b/gfx/ratsmall.png new file mode 100644 index 0000000..9a39f86 Binary files /dev/null and b/gfx/ratsmall.png differ diff --git a/gfx/redpile.png b/gfx/redpile.png new file mode 100644 index 0000000..b30f0a5 Binary files /dev/null and b/gfx/redpile.png differ diff --git a/gfx/repair.png b/gfx/repair.png new file mode 100644 index 0000000..1f0f1ef Binary files /dev/null and b/gfx/repair.png differ diff --git a/gfx/repair_broken.png b/gfx/repair_broken.png new file mode 100644 index 0000000..3a493c7 Binary files /dev/null and b/gfx/repair_broken.png differ diff --git a/gfx/repair_meteor.png b/gfx/repair_meteor.png new file mode 100644 index 0000000..c5e0190 Binary files /dev/null and b/gfx/repair_meteor.png differ diff --git a/gfx/robodance1.png b/gfx/robodance1.png new file mode 100644 index 0000000..1b8c40a Binary files /dev/null and b/gfx/robodance1.png differ diff --git a/gfx/robodance2.png b/gfx/robodance2.png new file mode 100644 index 0000000..2d6b6a6 Binary files /dev/null and b/gfx/robodance2.png differ diff --git a/gfx/robodance3.png b/gfx/robodance3.png new file mode 100644 index 0000000..9f22409 Binary files /dev/null and b/gfx/robodance3.png differ diff --git a/gfx/robodance4.png b/gfx/robodance4.png new file mode 100644 index 0000000..b104d58 Binary files /dev/null and b/gfx/robodance4.png differ diff --git a/gfx/robodance5.png b/gfx/robodance5.png new file mode 100644 index 0000000..7924c3a Binary files /dev/null and b/gfx/robodance5.png differ diff --git a/gfx/robodance6.png b/gfx/robodance6.png new file mode 100644 index 0000000..fd31bc1 Binary files /dev/null and b/gfx/robodance6.png differ diff --git a/gfx/robot.png b/gfx/robot.png new file mode 100644 index 0000000..b9a493a Binary files /dev/null and b/gfx/robot.png differ diff --git a/gfx/robot_cargo.png b/gfx/robot_cargo.png new file mode 100644 index 0000000..31b1999 Binary files /dev/null and b/gfx/robot_cargo.png differ diff --git a/gfx/robot_nohand.png b/gfx/robot_nohand.png new file mode 100644 index 0000000..0ed0177 Binary files /dev/null and b/gfx/robot_nohand.png differ diff --git a/gfx/robot_nohand_blaster.png b/gfx/robot_nohand_blaster.png new file mode 100644 index 0000000..abbe96f Binary files /dev/null and b/gfx/robot_nohand_blaster.png differ diff --git a/gfx/robothand.png b/gfx/robothand.png new file mode 100644 index 0000000..0805273 Binary files /dev/null and b/gfx/robothand.png differ diff --git a/gfx/robothand2.png b/gfx/robothand2.png new file mode 100644 index 0000000..c54c2be Binary files /dev/null and b/gfx/robothand2.png differ diff --git a/gfx/screen.png b/gfx/screen.png new file mode 100644 index 0000000..fe8b08d Binary files /dev/null and b/gfx/screen.png differ diff --git a/gfx/shaft.png b/gfx/shaft.png new file mode 100644 index 0000000..2145bb6 Binary files /dev/null and b/gfx/shaft.png differ diff --git a/gfx/shaft_open.png b/gfx/shaft_open.png new file mode 100644 index 0000000..4aa31e8 Binary files /dev/null and b/gfx/shaft_open.png differ diff --git a/gfx/shelf.png b/gfx/shelf.png new file mode 100644 index 0000000..edf7af0 Binary files /dev/null and b/gfx/shelf.png differ diff --git a/gfx/ship.png b/gfx/ship.png new file mode 100644 index 0000000..1181e68 Binary files /dev/null and b/gfx/ship.png differ diff --git a/gfx/shoot.png b/gfx/shoot.png new file mode 100644 index 0000000..87340a6 Binary files /dev/null and b/gfx/shoot.png differ diff --git a/gfx/spot.png b/gfx/spot.png new file mode 100644 index 0000000..f1f0f9a Binary files /dev/null and b/gfx/spot.png differ diff --git a/gfx/spot2.png b/gfx/spot2.png new file mode 100644 index 0000000..b713366 Binary files /dev/null and b/gfx/spot2.png differ diff --git a/gfx/starfield.png b/gfx/starfield.png new file mode 100644 index 0000000..d6049a6 Binary files /dev/null and b/gfx/starfield.png differ diff --git a/gfx/station.png b/gfx/station.png new file mode 100644 index 0000000..4c53714 Binary files /dev/null and b/gfx/station.png differ diff --git a/gfx/stick.png b/gfx/stick.png new file mode 100644 index 0000000..ed6f5aa Binary files /dev/null and b/gfx/stick.png differ diff --git a/gfx/table.png b/gfx/table.png new file mode 100644 index 0000000..cea82db Binary files /dev/null and b/gfx/table.png differ diff --git a/gfx/table2.png b/gfx/table2.png new file mode 100644 index 0000000..952a58c Binary files /dev/null and b/gfx/table2.png differ diff --git a/gfx/table3.png b/gfx/table3.png new file mode 100644 index 0000000..f822ae4 Binary files /dev/null and b/gfx/table3.png differ diff --git a/gfx/table3_keys.png b/gfx/table3_keys.png new file mode 100644 index 0000000..d7b5432 Binary files /dev/null and b/gfx/table3_keys.png differ diff --git a/gfx/table4.png b/gfx/table4.png new file mode 100644 index 0000000..a97f2fe Binary files /dev/null and b/gfx/table4.png differ diff --git a/gfx/table5.png b/gfx/table5.png new file mode 100644 index 0000000..630ee21 Binary files /dev/null and b/gfx/table5.png differ diff --git a/gfx/table6.png b/gfx/table6.png new file mode 100644 index 0000000..a4d42f1 Binary files /dev/null and b/gfx/table6.png differ diff --git a/gfx/timer1.png b/gfx/timer1.png new file mode 100644 index 0000000..fd04591 Binary files /dev/null and b/gfx/timer1.png differ diff --git a/gfx/timer1_en.png b/gfx/timer1_en.png new file mode 100644 index 0000000..c4c682e Binary files /dev/null and b/gfx/timer1_en.png differ diff --git a/gfx/toilet.png b/gfx/toilet.png new file mode 100644 index 0000000..e082b1f Binary files /dev/null and b/gfx/toilet.png differ diff --git a/gfx/toolbox.png b/gfx/toolbox.png new file mode 100644 index 0000000..5d9bf40 Binary files /dev/null and b/gfx/toolbox.png differ diff --git a/gfx/tunnel.png b/gfx/tunnel.png new file mode 100644 index 0000000..db6987e Binary files /dev/null and b/gfx/tunnel.png differ diff --git a/gfx/vase.png b/gfx/vase.png new file mode 100644 index 0000000..7d676c8 Binary files /dev/null and b/gfx/vase.png differ diff --git a/gfx/vase_flower.png b/gfx/vase_flower.png new file mode 100644 index 0000000..092ea8b Binary files /dev/null and b/gfx/vase_flower.png differ diff --git a/gfx/washer.png b/gfx/washer.png new file mode 100644 index 0000000..ec9bcb8 Binary files /dev/null and b/gfx/washer.png differ diff --git a/gfx/window.png b/gfx/window.png new file mode 100644 index 0000000..8a31155 Binary files /dev/null and b/gfx/window.png differ diff --git a/gfx/window2.png b/gfx/window2.png new file mode 100644 index 0000000..2a5969d Binary files /dev/null and b/gfx/window2.png differ diff --git a/gfx/window3.png b/gfx/window3.png new file mode 100644 index 0000000..de63708 Binary files /dev/null and b/gfx/window3.png differ diff --git a/gfx/window4.png b/gfx/window4.png new file mode 100644 index 0000000..c6ddef5 Binary files /dev/null and b/gfx/window4.png differ diff --git a/gfx/yard.png b/gfx/yard.png new file mode 100644 index 0000000..7ab140b Binary files /dev/null and b/gfx/yard.png differ diff --git a/gfx/yard2.png b/gfx/yard2.png new file mode 100644 index 0000000..7827abc Binary files /dev/null and b/gfx/yard2.png differ diff --git a/gfx/zombi.png b/gfx/zombi.png new file mode 100644 index 0000000..39aa307 Binary files /dev/null and b/gfx/zombi.png differ diff --git a/gfx/zombi_dead.png b/gfx/zombi_dead.png new file mode 100644 index 0000000..94ef775 Binary files /dev/null and b/gfx/zombi_dead.png differ diff --git a/gfx/zombi_short.png b/gfx/zombi_short.png new file mode 100644 index 0000000..b58129b Binary files /dev/null and b/gfx/zombi_short.png differ diff --git a/lib.lua b/lib.lua new file mode 100644 index 0000000..4be09ea --- /dev/null +++ b/lib.lua @@ -0,0 +1,568 @@ +require "sprites" +require "click" +require "snapshots" +require "prefs" +require "translate" + +function complete_(game) + return function() + prefs[game] = true; + prefs:store(); + end +end + +function iscomplete(game) + prefs:load(); + return prefs[game] ~= nil; +end + +alphas = { + ["А"] = { 0, 4} + ,["Б"] = { 5, 4} + ,["В"] = { 10, 4} + ,["Г"] = { 15, 4} + ,["Д"] = { 20, 6} + ,["Е"] = { 27, 4} + ,["Ж"] = { 32, 5} + ,["З"] = { 38, 4} + ,["И"] = { 43, 4} + ,["К"] = { 48, 4} + ,["Л"] = { 53, 5} + ,["М"] = { 59, 5} + ,["Н"] = { 65, 4} + ,["О"] = { 70, 4} + ,["П"] = { 75, 4} + ,["Р"] = { 80, 4} + ,["С"] = { 85, 4} + ,["Т"] = { 90, 5} + ,["У"] = { 96, 4} + ,["Ф"] = { 101, 5} + ,["Х"] = { 107, 4} + ,["Ц"] = { 112, 5} + ,["Ч"] = { 118, 4} + ,["Ш"] = { 123, 5} + ,["Щ"] = { 129, 6} + ,["Ъ"] = { 136, 5} + ,["Ы"] = { 142, 6} + ,["Ь"] = { 149, 4} + ,["Э"] = { 154, 4} + ,["Ю"] = { 159, 5} + ,["Я"] = { 165, 4} + ,["0"] = { 170, 4} + ,["7"] = { 175, 4} + ,["2"] = { 180, 4} + ,["Й"] = { 185, 5} + ,[" "] = { nil, 2} + ,["A"] = { 0, 4} + ,["B"] = { 10, 4} + ,["C"] = { 85, 4} + ,["D"] = { nil, 4} + ,["E"] = { 27, 4} + ,["F"] = { nil, 2} + ,["G"] = { nil, 2} + ,["H"] = { 65, 4} + ,["I"] = { nil, 2} + ,["J"] = { nil, 2} + ,["K"] = { 48, 4} + ,["L"] = { nil, 2} + ,["M"] = { 59, 5} + ,["N"] = { nil, 2} + ,["O"] = { 70, 4} + ,["P"] = { 80, 4} + ,["Q"] = { nil, 2} + ,["R"] = { nil, 2} + ,["S"] = { nil, 2} + ,["T"] = { 90, 5} + ,["U"] = { nil, 2} + ,["V"] = { nil, 2} + ,["W"] = { nil, 2} + ,["X"] = { nil, 2} + ,["Y"] = { nil, 2} + ,["Z"] = { nil, 2} +} +function drawalpha(num,str) + local px = game.cache_alpha1; + if px == nil then + px = sprite.load("gfx/alpha.png"); + game.cache_alpha1 = px; + end + local px2 = game.cache_alpha2; + if px2 == nil then + px2 = sprite.load("gfx/nums.png"); + game.cache_alpha2 = px2; + end + local len = 0; + for i = 1, #str do + local c = string.sub(str,i,i) + if alphas[c] ~= nil then + len = len + (alphas[c][2]*5) + 5; + end + end + local spr = sprite.box(500, 200, "black"); + if num ~= nil then + --28 + local strnum = tostring(num); + if string.len(strnum) == 1 then + sprite.copy(px2, num*4*20, 0, 4*20, 140, spr, 210, 30); + else + local n1 = string.char(strnum:byte(1))+0; + local n2 = string.char(strnum:byte(2))+0; + sprite.copy(px2, n1*4*20, 0, 4*20, 140, spr, 165, 30); + sprite.copy(px2, n2*4*20, 0, 4*20, 140, spr, 255, 30); + end + end + local xl = (500-len)/2; + for i = 1, #str do + local c = string.sub(str,i,i) + if alphas[c] ~= nil then + local x,w = alphas[c][1],alphas[c][2]; + if x ~= nil then + sprite.draw(px, x*5, 0, w*5, 35, spr, xl, 82); + end + xl = xl + (w*5) + 5; + end + end + return spr; +end + +function cleancache() + if game.cache_alpha1 ~= nil then + sprite.free(game.cache_alpha1); + game.cache_alpha1 = nil; + end + if game.cache_alpha2 ~= nil then + sprite.free(game.cache_alpha2); + game.cache_alpha2 = nil; + end + if game.cache ~= nil then + sprite.free(game.cache); + game.cache = nil; + end + if game.cache2 ~= nil then + sprite.free(game.cache2); + game.cache2 = nil; + end + if game.cache_nums ~= nil then + for k,v in pairs(game.cache_nums) do + sprite.free(v); + game.cache_nums[k] = nil; + end + game.cache_nums = nil; + end + if game.cache_sprites ~= nil then + for k,v in pairs(game.cache_sprites) do + sprite.free(v); + game.cache_sprites[k] = nil; + end + game.cache_sprites = nil; + end +end + +local old_snapshot = restore_snapshot; +function restore_snapshot(n) + cleancache(); + return old_snapshot(n); +end + +local old_title = instead.get_title; +instead.get_title = function() + local r = old_title(); + return txttop(r)..img("blank:10x50"); +end + +function if_(cnd,x,y) + return function(s) + if apply(cnd,s) then + return x; + else + return y; + end + end +end + +function restart_item(gf) + restart_obj = menu { + nam = "restart_item" + ,disp = txtb("Начать сначала") + ,inv = gamefile_(gf..".lua") + }; + sep_obj = menu {nam=" ", inv = function() end}; + take(restart_obj); + take(sep_obj); +end + +local old_room = room; +function room(r) + if r.title ~= nil then + r.pic = function(s) + if s.cache_title == nil then + s.cache_title = drawalpha(s.num,s.title); + end + return s.cache_title; + end + local exit = r.exit; + r.exit = function(s,v,w) + if exit ~= nil then + local ret = exit(s,v,w); + if ret ~= nil then + return ret; + end + end + if s.cache_title ~= nil then + sprite.free(s.cache_title); + s.cache_title = nil; + end + end + end + return old_room(r); +end + +function string:charat(i) + local c = 0; + for uchar in string.gfind(self, "([%z\1-\127\194-\244][\128-\191]*)") do + c = c + 1; + if c == i then + return uchar; + end + end +end + +function timerpause(snum,enum,next) + local sh = 1; + if enum < snum then + sh = -1; + enum = enum - 1; + else + enum = enum + 1; + end + if game.cache_nums == nil then + game.cache_nums = {} + end + return room { + enum = enum, sh = sh, snum = snum, + _cur = snum, _fr=0, + nam = "", + enter = function() + timer:set(50); + end, + pic = function() + if game.cache2 == nil then + game.cache2 = sprite.load(_("gfx/timer1.png")); + end + return game.cache2; + end, + pad = function(s,n) + local sn = tostring(n); + if string.len(sn) < 4 then + return s:pad("0"..sn); + end + return sn; + end, + loadnum = function(s,n) + if game.cache_nums[n] == nil then + game.cache_nums[n] = sprite.load("gfx/"..n..".png"); + end + return game.cache_nums[n]; + end, + draw = function(s,d) + local d = tostring(d); + local n1,n2,n3,n4 = string.char(d:byte(1)),string.char(d:byte(2)),string.char(d:byte(3)),string.char(d:byte(4)); + local y = 67; + if s.s1 ~= n1 then + sprite.copy(s:loadnum(n1), game.cache2, 150+(50*0), y); + s.s1 = n1; + end + if s.s2 ~= n2 then + sprite.copy(s:loadnum(n2), game.cache2, 150+(50*1), y); + s.s2 = n2; + end + if s.s3 ~= n3 then + sprite.copy(s:loadnum(n3), game.cache2, 150+(50*2), y); + s.s3 = n3; + end + if s.s4 ~= n4 then + sprite.copy(s:loadnum(n4), game.cache2, 150+(50*3), y); + s.s4 = n4; + end + if s._cur ~= s.snum then + play_sound("tick"); + end + end, + timer = function(s) + s._fr = s._fr + 1; + if not s._nodraw then + local sn = s:pad(s._cur); + s:draw(sn); + if s._fr > 40 then + s._cur = s._cur + s.sh; + end + end + if s._cur == s.enum then + if s._nodraw == nil then + s._nodraw = 0; + end + s._nodraw = s._nodraw + 1; + end + if s._nodraw ~= nil and (s._nodraw == 80 or s.snum == s.enum) then + timer:stop(); + s._cur = s.snum; + s._nodraw = nil; + s._fr = 0; + s.s1 = nil; + s.s2 = nil; + s.s3 = nil; + s.s4 = nil; + walk(next); + end + end, + } +end + +function loadsprite(vv) + if game.cache_sprites == nil then + game.cache_sprites = {}; + end + local spr = game.cache_sprites[vv]; + if spr == nil then + spr = sprite.load("gfx/"..vv..".png"); + game.cache_sprites[vv] = spr; + end + return spr; +end + +game.pic = +function() + local s = here(); + if s.pxa == nil then + return; + end + local pxa = tc(s.pxa,s); + if pxa == nil then + return; + end + if game.cache == nil then + game.cache = sprite.load("gfx/pic.png"); + else + local pt = sprite.blank(500, 200); + sprite.copy(pt, game.cache, 0, 0); + sprite.free(pt); + end + if game.cache_sprites == nil then + game.cache_sprites = {}; + end + for _,v in ipairs(pxa) do + local vv = tc(v[1],s); + if vv ~= nil then + local spr = loadsprite(vv); + local y = v[3]; + if y == nil then + if vv == "panel" or vv == "panel_broken" then + y = 60; + elseif vv == "door1" or vv == "door1_open" then + y = 35; + elseif vv == "door2" or vv == "door3" or vv == "door4" or vv == "door2_open" or vv == "door5" or vv == "door5_open" then + y = 60; + elseif vv == "window" or vv == "window2" then + y = 62; + elseif vv == "toolbox" then + y = 171; + elseif vv == "crio" or vv == "crio_blood" then + y = 45; + elseif vv == "robot" or vv == "robot_nohand" or vv == "robot_nohand_blaster" or vv == "robot_cargo" then + y = 75; + elseif vv == "box" then + y = 145; + elseif vv == "shelf" then + y = 60; + elseif vv == "box2" then + y = 50; + elseif vv == "rat" then + y = 135; + elseif vv == "rat_dead" then + y = 100; + elseif vv == "box3" then + y = 110; + elseif vv == "blood" then + y = 107; + elseif vv == "shaft" or vv == "shaft_open" then + y = 55; + elseif vv == "mutant" then + y = 28; + elseif vv == "med" then + y = 60; + elseif vv == "zombi" then + y = 75; + elseif vv == "device" then + y = 65; + elseif vv == "bfg" then + y = 40; + elseif vv == "hole" then + y = 65; + elseif vv == "hole2" then + y = 35; + elseif vv == "washer" then + y = 55; + elseif vv == "toilet" then + y = 90; + elseif vv == "communicator" then + y = 80; + elseif vv == "table" or vv == "table3" or vv == "table3_keys" then + y = 110; + elseif vv == "extin" then + y = 145; + elseif vv == "fridge" then + y = 105; + elseif vv == "books" then + y = 100; + elseif vv == "table2" then + y = 140; + elseif vv == "window3" then + y = 70; + elseif vv == "zombi_dead" then + y = 145; + elseif vv == "blaster" or vv == "knife" then + y = 40; + elseif vv == "vase_flower" or vv == "vase" then + y = 70; + elseif vv == "repair" or vv == "repair_broken" or vv == "repair_meteor" then + y = 95; + elseif vv == "table4" then + y = 90; + elseif vv == "screen" then + y = 50; + elseif vv == "door6" then + y = 100; + elseif vv == "cheese" then + y = 160; + elseif vv == "table5" then + y = 80; + elseif vv == "chair1" or vv == "chair2" then + y = 125; + elseif vv == "foodgen" or vv=="foodgen2" then + y = 110; + elseif vv == "window4" then + y = 30; + elseif vv == "table6" then + y = 140; + elseif vv == "cleaner" then + y = 105; + elseif vv == "ballon" or vv == "ballon2" then + y = 120; + elseif vv == "monitor" or vv == "monitor2" then + y = 50; + elseif vv == "barrel" or vv == "barrel2" then + y = 155; + elseif vv == "ratsmall" then + y = 165; + elseif vv == "stick" then + y = 170; + end + end + sprite.compose(spr, game.cache, tc(v[2],s), y); + end + end + return game.cache; +end + +function exec_(s) + return function(this) + return exec(s,this); + end +end + +function apply(c,this) + local f = assert(loadstring("return function(s) return ("..c.."); end"))(); + return f(this); +end + +local oob = obj; +function tc(f,s) +if type(f) == "function" then return tc(f(s),s) else return f end +end +function obj(t) +local d = t.dsc; +if t.dsc then + t.dsc = function(s) if s.cnd == nil or s:cnd() then return tc(d,s) end end +end +return oob(t); +end + +function gamefile_(fl) + return function() + cleancache(); + gamefile(fl, true); + end +end + +function sound_(snd) + return function() + play_sound(snd); + end +end + +function music_(mus, loop, fadeout, fadein) + return function() + play_music(mus, loop, fadeout, fadein); + end +end + +function mute_(fadeout,fadein) + return function() + if fadeout == nil then + fadeout = 3000; + end + play_music(nil, nil, fadeout, fadein); + end +end + +function playonce_(file,loop) + return function() + local hw = here(); + if hw["_"..file] == nil then + play_music(file,loop); + hw["_"..file] = true; + end + end +end + +function play_music(file,loop,fadeout,fadein) + local fl = file; + local fout,fin = 2000,2000; + if file ~= nil and file ~= "" then + fl = "mus/"..file..".ogg"; + end + if fadeout ~= nil then + fout = fadeout; + end + if fadein ~= nil then + fin = fadein; + end + set_music_fading(fadeout, fadein); + if loop == nil then + loop = 1; + end + if fl ~= nil then + set_music(fl, loop); + else + stop_music(); + mute_sound(); + _lastsound = nil; + end +end + +function play_sound(file,loop,ch) + local fl = "mus/"..file..".ogg"; + if ch == nil then + ch = 2; + end + set_sound(fl, ch, loop); + if loop ~= nil then + _lastsound = {file,loop,ch}; + end +end + +function mute_sound() + stop_sound(2); + stop_sound(3); + stop_sound(4); +end diff --git a/licenses.txt b/licenses.txt new file mode 100644 index 0000000..a834f4d --- /dev/null +++ b/licenses.txt @@ -0,0 +1,100 @@ +***Graphics*** +CC BY 4.0 + + +***Game code and library code**** +CC BY 4.0 + + +***Font*** +Pixel Font-7 by www.styleseven.com +(Freeware use for noncommerical projects) + +Terminus font +(SIL OFL 1.1 ) + + +***Music**** + +by 8bit Betty: +http://freemusicarchive.org/music/8bit_Betty/too_bleep_to_bloop/hc152_04_spooky_loop_by_8bit_betty +"Spooky Loop" +(Attribution-Noncommercial-No Derivative Works 3.0 United States) + +by J. Arthur Keenes +http://freemusicarchive.org/music/J_Arthur_Keenes/XMAS_Compilation_2010/J_Arthur_Keenes_-_XMAS_Compilation_2010_-_04_The_Day_Before_Boxing_Day_Eve +"The Day Before Boxing Day Eve" +(Attribution-NonCommercial-ShareAlike License) + +by Rolemusic +http://freemusicarchive.org/music/Rolemusic/~/Ladybug_Castle +"Ladybug Castle" +(Attribution License) + +by Goto80 +http://freemusicarchive.org/music/Goto80/Open_Funk_Sores/00_goto80_-_this_machine_thinks +"this machine thinks" +(Attribution-NonCommercial-ShareAlike 3.0 International License) + +by Goto80 +http://freemusicarchive.org/music/Goto80/Open_Funk_Sores/00_goto80_-_square_and_enjoy +"square and enjoy" +(Attribution-NonCommercial-ShareAlike 3.0 International License) + +by Goto80 +http://freemusicarchive.org/music/Goto80/Open_Funk_Sores/00_goto80_-_influensa +"influensa" +(Attribution-NonCommercial-ShareAlike 3.0 International License) + +by Goto80 +http://freemusicarchive.org/music/Goto80/Open_Funk_Sores/00_goto80_-_datagroove +"datagroove" +(Attribution-NonCommercial-ShareAlike 3.0 International License) + +by Goto80 +http://freemusicarchive.org/music/Goto80/Open_Funk_Sores/00_goto80_-_5pyhun73r_3l337_v3r +"5pyhun73r 3l337 v3r" +(Attribution-NonCommercial-ShareAlike 3.0 International License) + +by Rolemusic +http://freemusicarchive.org/music/Rolemusic/Straw_Fields/01_rolemusic_-_spell +"Spell" +(Attribution-Noncommercial-Share Alike 3.0 United States License) + +by Edward Shallow +http://freemusicarchive.org/music/Edward_Shallow/Hippodichotomous/01_The_Infinite_Railroad +"The Infinite Railroad" +(Attribution-Noncommercial-Share Alike 3.0 United States License) + +by Rolemusic +http://freemusicarchive.org/music/Rolemusic/gigs_n_contest/rolemusic_-_gigs_n_contest_-_04_Scape_from_the_city +"Scape from the city" +(Creative Commons Attribution License) + +by Rolemusic +http://freemusicarchive.org/music/Rolemusic/gigs_n_contest/rolemusic_-_gigs_n_contest_-_05_Death_on_the_battlefield +"Death on the battlefield" +(Creative Commons Attribution License) + +by Rolemusic +http://freemusicarchive.org/music/Rolemusic/Straw_Fields/05_rolemusic_-_poppies +"Poppies" +(Attribution-Noncommercial-Share Alike 3.0 United States License) + + +***Sound effects**** +by Greencouch +http://freesound.org/people/Greencouch/sounds/106265/ +(Attribution License) + +by Dpoggioli +http://freesound.org/people/Dpoggioli/sounds/196914/ +(Attribution License) + +by m_O_m +http://freesound.org/people/m_O_m/sounds/118314/ +(Attribution Noncommercial License) + +by TheHandnot +http://freesound.org/people/TheHadnot/sounds/160880/ +(Creative Commons 0) \ No newline at end of file diff --git a/longwork.lua b/longwork.lua new file mode 100644 index 0000000..23042e4 --- /dev/null +++ b/longwork.lua @@ -0,0 +1,358 @@ +-- $Name: Долгая служба$ +-- $Version: 0.1$ +instead_version "1.9.1" +require "lib" +require "para" +require "dash" +require "quotes" +require "xact" + +game.use = "Бип-бип! Невозможно выполнить запрошенное действие... Эх, надо было всё-таки обновить прошивку, когда мне говорили." +local old = obj; +function tcall(f,s) + if type(f) == "function" then + return tcall(f(s),s); + else + return f; + end +end +function obj(tab) + if tab.nam == nil then tab.nam = "" end + local dsc = tab.dsc; + tab.dsc = function(s) + if s.cnd == nil or s:cnd() then + return tcall(dsc,s); + end + end + return old(tab); +end + +main = timerpause(1100, 1100, "main2"); + +main2 = room { + nam = "..." + ,enter = music_("square",0) + ,title = { "Д", "О", "Л", "Г", "А", "Я", " ", "С", "Л", "У", "Ж", "Б", "А" } + ,num = 2 + ,act = function(s) walk("sylo") end + ,dsc = "Прошло несколько дней с тех пор, как корабль вылетел с Земли. Скоро весь экипаж отправится по своим криокапсулам, а мне предстоит нести самую первую годовую вахту.^Я робот WR001. По документам -- новая модель, недавно вышедшая с конвейера. Однако на самом деле это не совсем так. Где-то там наверху что-то перепутали и вместо того, чтобы отправить меня на пенсию, приписали к этому кораблю под видом новой модели. Мне предстоит десять вахт и путь длиной в тысячу лет.^Надеюсь, у меня ничего не отвалится за это время." + ,obj = { vobj("next", '{Начать игру}') } +} + +sylo = room { + nam = "Хранилище" + ,pxa = { + { "door4", 150 }, + { if_("not have(box1) and not box1._done", "box"), 40 }, + { "box2", 320 }, + { "shelf", 415 } + } + ,exit= function(s) + if not box1._done then + p (_("Надо сначала составить все эти ящики.")); + return false; + elseif box1._done and not communice._done then + p (_("Лучше сначала ответить на вызов.")); + return false; + end + end + ,dsc = "Я нахожусь в хранилище. Здесь, на ровных полках, лежат разнообразные детали в металлических коробках. Моя задача -- отсортировать коробки в соответствии с номерками на них. Работа почти выполнена." + ,obj = { "silence", "communice", "boxes", "shelf", "box1", "box2", "emptybox" } + ,way = { "coridor" } +} + +communice = obj { + _done= false + ,dsc = "{Передатчик} у меня на груди мигает. Меня кто-то вызывает.^" + ,act = function(s,v) + communice._done = true; + return (_("Это главный инженер. Он хочет видеть меня в крио-блоке. Что ж, мне надо поторопиться.")); + end + ,cnd = function(s) return box1._done and not s._done end +} + +shelf = obj { + dsc = function(s) + if box1._done then + return (_("Все коробки стоят на полках. Моя работа здесь закончена.")); + else + return (_("На {полке} осталось место для последней коробки.")); + end + end + ,act = "Сюда нужно поставить последнюю коробку. Это сложно, но я справлюсь." +} + +box1 = obj { + _done= false + ,nam = "Коробка 19" + ,dsc = function(s) + if not s._done then return (_("На полу лежит {коробка} под номером 19.")) end + end + ,tak = function(s) + if not s._done then return (_("Я поднимаю с пола коробку.")) end + end + ,use = function(s,v) + if v == shelf then + s._done = true; + drop(s); + return (_("Я ставлю последнюю коробку на полку. Что ж, моя работа здесь закончена. Вдруг раздаётся протяжный гудок, и передатчик у меня на груди начинает мигать.")); + end + end + ,act = "Просто пустой ящик." + ,inv = "Просто пустой ящик." +} + +emptybox = obj { + act=function() + return ({"Коробка пуста.","Странно, но тут ничего нет.","Абсолютно пустая коробка.","Видимо, сюда забыли что-то положить.","Пусто!"})[rnd(5)]; + end +} + +boxes = obj { + dsc = function(s) + local str = "Вся эта комната заставлена металлическими коробками. Коробок очень много, а именно:"; + local i = 0; + local last = 18; + if box1._done then + last = 19; + end + while i < last do + i = i + 1; + if i == last then + str = str.." и"; + end + if i == 12 then + str = str.." {box2|коробка "..tostring(i).."}"; + elseif i == 19 then + str = str.." {box1|коробка "..tostring(i).."}"; + else + str = str.." {emptybox|коробка "..tostring(i).."}"; + end + if i < last - 1 then + str = str..","; + elseif i == last then + str = str.."."; + end + end + return str; + end +} + +box2 = obj { + _done= false + ,nam = "Коробка 12" + ,act = function(s) + if not s._done then + s._done = true; + take(key); + return (_("В коробке оказался гаечный ключ. Недолго думая, я забрал его себе. Надеюсь, его никто не хватится.")); + else + return (_("В коробке больше ничего нет.")); + end + end +} + +key = obj { + nam = "Гаечный ключ" + ,inv = "Складной гаечный ключ -- удобно и практично." + ,use = function(s,v) + if v == hand then + return (_("Нет, ничего не получается. Рука испорчена!")); + elseif v == robothand then + robothand._done = true; + return (_("Раз-два -- и готово! Обычный обмен деталями, всё нормально. Мы же роботы в конце концов! Так что теперь у меня блестящая новенькая рука.")); + elseif v == ear then + ear._fix = true; + remove(ear,me()); + return (_("Я прикручиваю отвалившийся модуль обратно в то место, откуда он упал. Что ж, теперь я почти как новый. Почти, да.")); + end + end +} + +coridor = room { + nam = "Коридор" + ,pxa = { + { "door4", 30 }, + { if_("not robot._done", "robot_cargo"), 240 }, + { if_("not sylo2._open", "door1", "door1_open"), 370 }, + } + ,enter= function(s) + if not ear._done then + ear._done = true; + p (_("Я выхожу в коридор, как вдруг из моей спины выпадает какой-то модуль.")); + end + end + ,dsc = "Я в коридоре, соединяющем отсеки." + ,obj = { "silence", "hand", "ear", "robot" } + ,way = { "sylo", "elevator", "sylo2" } +} + +silence = obj { + dsc = "Здесь на удивление {тихо}." + ,act = "Я вообще ничего не слышу. Ни малейшего шороха." + ,cnd = function() return ear._done and not ear._fix end +} + +ear = obj { + _done= false + ,_fix = false + ,nam = "Модуль XR304558" + ,dsc = "На полу валяется {модуль} размером с кирпич. Неужели это выпало из меня?" + ,inv = "Непонятно, что это за штука. В моих банках памяти ничего нет. Правда, надо сказать, я последнее время о многом стал забывать. В любом случае мне и без этого модуля хорошо." + ,tak = "Я поднимаю с пола модуль. На нем длинный и непонятный регистрационный номер." +} + +robot = obj { + _done= false + ,dsc = "По коридору идёт {робот}, мой коллега. Робот несёт в руках огромный металлический контейнер." + ,act = function(s) + local str = "Думаю, он идёт в продовольственный отсек. Интересно, как он собирается открыть дверь, когда у него обе руки заняты? Наверное, ему придётся сначала поставить контейнер на пол. Я начинаю следить за роботом из чистого любопытства. Он подходит к двери в продовольственный отсек и..." + if not ear._fix then + return str.." дверь сама открывается! Удивительно. Все двери здесь должны быть на магнитном замке.^Робот быстро возвращается из отсека без контейнера, а через несколько минут появляется снова -- с ещё одним огромным ящиком в руках. Что ж, у некоторых работа ещё тяжелее, чем у меня."; + else + s._done = true + return str.." начинает издавать смешные звуки -- пип, пап, пип, пип, пап. На секунду я думаю, что мой коллега сошёл с ума, однако дверь в продовольственный отсек открывается. Удивительно! И почему мне никто не сказал, что так можно." + end + end + ,cnd = function(s) return not s._done end +} + +hand = obj { + _done= false + ,_fix = false + ,nam = "Сломанная рука" + ,dsc = "На полу валяется моя отломавшаяся {правая рука}." + ,tak = "Я поднимаю свою отвалившуюся руку." + ,inv = "Она испорчена, совершенно испорчена! От неё теперь никакого прока!" + ,use = function(s,v) + if v == robot2 then + s._fix = true; + remove(s,me()); + return (_("Я аккуратненько прикручиваю сломанную руку к своему коллеге. Держится хорошо, да. Работать, конечно, не будет, но это уже детали.")); + end + end + ,cnd = function(s) return s._done end +} + +elevator = room { + nam = "Лифт" + ,pxa = { { "door2", 190 } } + ,enter= function(s) + if not hand._done then + hand._done = true; + p (_("Я подхожу к лифту, нажимаю на кнопку вызова и... моя правая рука со встроенным чип-ключом отваливается и падает на пол. Караул! Кошмар! Я начинаю в панике метаться по коридору. Что делать? Как быть? Меня отправят под пресс!")); + return false; + elseif hand._done and not robothand._done then + p (_("Нет! Я не могу являться к начальству в таком виде! Меня тут же отправят в утиль!")); + return false; + elseif robothand._done and not hand._fix then + p (_("Как-то мне неудобно оставлять своего коллегу без руки. К тому же будет понятно, что рука исчезла... благодаря чьим-то стараниям.")); + return false; + else + p (_("Довольный собой, я вызываю лифт, жду несколько минут, напевая недавно выученную мелодию -- пип, пап, пип, пип, пап, -- потом захожу в лифт и... У меня отваливается правая нога! Я с грохотом падаю на пол.^Нет! Не может быть! Мне нельзя появляться перед инженером без ноги!")); + end + end + ,dsc = "Я с трудом поднялся и подпрыгиваю на одной ноге." + ,obj = { "leg" } +} + +leg = obj { + dsc = "Моя отвалившаяся {нога} валяется на полу." + ,tak = function() + remove(s,me()); + remove(key,me()); + walk(endgame) + end +} + +sylo2 = room { + _open= false + ,nam = "Продовольственный отсек" + ,pxa = { + { if_("robothand._done and not hand._fix", "robot_nohand", "robot"), 40 }, + { "panel", 180 }, + { "box", 170 }, + { "box", 250 }, + { "shelf", 415 } + } + ,enter= function(s) + if not hand._done then + p (_("Нет, мне надо идти к главному инженеру.")) + return false + elseif hand._done and not robot._done then + p (_("Дверь в продовольственный отсек закрыта. Я не смогу открыть её без руки.")); + return false; + elseif not sylo2._open then + return walk(sylocode); + end + end + ,dsc = "Я в продовольственном отсеке. Здесь всё заставлено здоровыми контейнерами. Как же много собираются есть эти люди после пробуждения!" + ,obj = { "robot2", "robothand" } + ,way = { "coridor" } +} + +robot2 = obj { + dsc = "Мой {коллега} стоит у стены и не двигается. Длинный и толстый кабель тянется из его зада к стене." + ,act = function() + if robothand._done and not hand._fix then + return (_("Мне так стыдно... Я не могу оставить его в таком виде. Всё же коллега...")); + elseif robothand._done and hand._fix then + return (_("Можно сказать, так и было. Уверен, он даже не заметит и решит, что его рука просто сломалась.")); + else + return (_("Утомился бедняга! И немудрено -- я бы давно рассыпался, если бы таскал такие контейнеры.")) + end + end +} + +robothand = obj { + _done= false + ,dsc = "Кстати, у него отличная {правая рука}..." + ,act = "Нет, тут нужны инструменты." + ,cnd = function(s) return not s._done end +} + +function tonecode_(n) + return function() + local c = sylocode; + c._code = c._code..n; + if string.len(c._code)>=5 then + if c._code == "01001" then + sylo2._open = true; + p (_("Едва я закончил пищать, как дверь в продовольственный отсек открылась. Эх, до чего же дошла современная техника!")); + walk(coridor); + else + c._code = ""; + return (_("Нет, было как-то не так. Я где-то ошибся.")); + end + else + return string.gsub(string.gsub(c._code, "0", "Пип! "), "1", "Пап! ") + end + end +end + +sylocode = room { + _code = "" + ,pxa = { { if_("not sylo2._open", "door1", "door1_open"), 190 } } + ,nam = "У двери" + ,dsc = "Я стою у двери в продовольственный отсек. Какие там звуки издавал тот робот? Пип, пап, пап... Нет, как-то не так. Он издавал..." + ,obj = { "pip", "pap" } + ,way = { "coridor" } +} + +pip = obj { + dsc = "{Пип!}^" + ,act = tonecode_(0) +} + +pap = obj { + dsc = "{Пап!}" + ,act = tonecode_(1) +} + +endgame = room { + nam = "Конец" + ,enter = function() mute_()(); complete_("longwork")() end + ,dsc = "Интересно, где бы мне взять исправную ногу?^^" + ,act = gamefile_("repair.lua") + ,obj = { vobj("next", txtc("{Продолжение...}")) } +} diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..0f3164c --- /dev/null +++ b/main.lua @@ -0,0 +1,232 @@ +-- $Name: ИНСТЕДОЗ 3: Последний рейс$ +-- $Version: 0.4$ +instead_version "1.9.1" +require "lib" +require "para" +require "dash" +require "quotes" +require "timer" +require "xact" +require "sprites" + +main = room { + nam = _("Об игре") + ,pic = function(s) + s:ensurecache(); + return game.cache; + end + ,ensurecache = function(s) + if game.cache == nil then + game.cache = sprite.load("gfx/pic.png"); + else + local pt = sprite.blank(500, 200); + sprite.copy(pt, game.cache, 0, 0); + sprite.free(pt); + end + end + ,enter = function(s) + if iscomplete("insteadose") or main.insteadose then + music_("poppies",0)(); + prefs["insteadose"] = nil; + prefs:store(); + main.insteadose = true; + else + music_("railroad",0)(); + end + timer:set(90); + end + ,timer = function(s) + if s.cachesf == nil then + s.cachesf = sprite.load("gfx/starfield.png"); + end + if s.cachesf2 == nil then + s.cachesf2 = sprite.load(_("gfx/caption.png")); + end + if s._x == nil then + s._x = 0; + end + local w = 500; + if s._x > 500 then + w = w - (s._x-500); + end + sprite.copy(s.cachesf, s._x, 0, w, 200, game.cache, 0, 0); + if s._x > 500 then + sprite.copy(s.cachesf, 0, 0, 500-w, 200, game.cache, w, 0); + end + sprite.draw(s.cachesf2, game.cache, 0, 0); + s._x = s._x + 2; + if s._x > 1000 then + s._x = 0; + end + end + ,exit = function(s) + if s.cachesf ~= nil then + sprite.free(s.cachesf); + s.cachesf = nil; + end + if s.cachesf2 ~= nil then + sprite.free(s.cachesf2); + s.cachesf2 = nil; + end + s._x = nil; + timer:stop(); + end + ,dsc = + _([["ИНСТЕДОЗ 3" -- это сборник небольших текстовых игр, написанных разными авторами в рамках единого сюжета. Сборник включает в себя + 17 самостоятельных игр, однако все они складываются в единую историю, поэтому мы советуем вам пройти "ИНСТЕДОЗ 3" последовательно, + начиная с пролога и до самого конца.^^ + "ИНСТЕДОЗ 3" проводился в 2013 году. В создании этого сборника принимали участие двенадцать авторов. Подробную информацию о создателях + смотрите в разделе "Создатели".^^ + Версия 0.4]]) +} + +credits = room { + nam = _("Создатели") + ,pic = main.pic + ,ensurecache = main.ensurecache + ,exit = main.exit + ,enter = main.enter + ,timer = main.timer + ,dsc = + txtb(_("Платформа INSTEAD:")).. " ".._("Пётр Косых").."^" .. + txtb(_("Подготовка сборника:")).." ".._("Василий Воронков").."^^".. + txtb(_("Авторы игр")..':').. + "^".._("Андрей Лобанов")..' ("'.._("Разорванный цикл")..'", "'.._('Сон')..'")^'.. + _('Антон и Ольга Колосовы')..' ("'.._('Пробуждение-2')..'")^'.. + _('Василий Воронков')..'("'.._('Вахта')..'", "'.._('Долгая служба')..'", "'.._('Ремонт')..'", "'.._('Банкет')..'", "'.._('Крысиная нора')..'")^'.. + _('Дмитрий Дударь')..' ("'.._('Пояс астероидов')..'")^'.. + _('Дмитрий Колесников')..' ("'.._('Пробуждение')..'")^'.. + _('Егор Харват')..' ("'.._('Повар')..'")^'.. + _('Максим Клиш')..' ("'.._('Старый друг')..'")^'.. + _('Максим "j-maks"')..' ("'.._('Робот, который видит...')..'")^'.. + _('Пётр Косых')..' ("'.._('Отсек К007')..'", "'.._('Прибытие')..'")^'.. + _('Роман "Irreman"')..' ("'.._('Инженер')..'")^'.. + _('zerg.pro')..' ("'.._('Личность')..'")^^'.. + txtb(_("Музыка")..':').. + _([[^8bit Betty ("Spooky Loop") + ^J. Arthur Keenes ("The Day Before Boxing Day Eve") + ^Rolemusic ("Ladybug Castle", "Spell", "Scape from the city", "Death on the battlefield", "Poppies") + ^Goto80 ("this machine thinks", "square and enjoy", "influensa", "datagroove", "5pyhun73r 3l337 v3r") + ^Edward Shallow ("The Infinite Railroad")^^ + ]]).. + txtb(_("Шрифты")..':').. + _([[^Pixel Font-7 (разработчик www.styleseven.com, бесплатен для бесплатного ПО) + ^Terminus (SIL OFL 1.1)^^ + ]]).. + txtb(_("Код и графика")..':^').. + _([[Весь код игр, библиотечный код, а также всё графическое оформление доступны под лицензией CC BY 4.0^^ + (Подробную информацию о лицензиях см. в прилагаемом файле licenses.txt)]]) +} + +function chapter(s) + local nam = s.nam; + s.nam = function(s) + if iscomplete(deref(s)) then + return img("pad:0 5 0 0,gfx/dot2.png")..nam; + else + return img("pad:0 5 0 0,gfx/dot.png")..nam; + end + end + s.inv = function(s) + local nm = deref(s); + if nm == "endtitles" then theme.gfx.mode("direct"); end + gamefile_(nm..".lua")(); + end + return menu(s); +end + +before_About = menu { + nam = _("Об игре") + ,inv = function() walk(main) end +} + +before_Credits = menu { + nam = _("Создатели") + ,inv = function() walk(credits) end +} + +empty = menu { nam = "" } + +prologue = chapter { + nam = _("Пролог") +} +rat = chapter { + nam = _("Крысиная нора") +} +longwork = chapter { + nam = _("Долгая служба") +} +repair = chapter { + nam = _("Ремонт") +} +crio = chapter { + nam = _("Отсек 007") +} +watch = chapter { + nam = _("Вахта") +} +brokencycle = chapter { + nam = _("Разорванный цикл") +} +meteor = chapter { + nam = _("Пояс астероидов") +} +robot = chapter { + nam = _("Робот, который видит") +} +engineer = chapter { + nam = _("Инженер") +} +oldfriend = chapter { + nam = _("Старый друг") +} +cook = chapter { + nam = _("Повар") +} +dream = chapter { + nam = _("Сон") +} +nightmare = chapter { + nam = _("Банкет") +} +persona = chapter { + nam = _("Личность") +} +wake = chapter { + nam = _("Пробуждение") +} +wake2 = chapter { + nam = _("Пробуждение 2") +} +arrival = chapter { + nam = _("Прибытие") +} + +endtitles = chapter { + nam = _("Титры") +} + +function init() + take(before_About); + take(before_Credits); + take(empty); + take(prologue); + take(rat); + take(longwork); + take(repair); + take(crio); + take(watch); + take(brokencycle); + take(meteor); + take(robot); + take(engineer); + take(oldfriend); + take(cook); + take(dream); + take(nightmare); + take(persona); + take(wake); + take(wake2); + take(arrival); + --take(endtitles); +end diff --git a/meteor.lua b/meteor.lua new file mode 100644 index 0000000..77e83ef --- /dev/null +++ b/meteor.lua @@ -0,0 +1,488 @@ +-- $Name: Пояс астероидов$ +instead_version "1.9.1"; +require "lib" +require "dash"; +game.codepage="UTF-8"; +game.use = function() +p'Би-би. Я не могу этого сделать.'; +hp = hp - 1; if hp == 0 then walk('end5');end; +end; + +global { +q1 = 0; +q2 = 0; +q3 = 0; +q4 = 0; +q5 = 0; +hp = 31; +} + +st = stat { + nam = function(s) + p ('До отключения осталось: ',hp,' мин^'); + end +}; + +main = timerpause(700, 520, "main2"); + +main2 = room { + nam = "..."; + enter = music_("spookyloop", 0); + title = { "П", "О", "Я", "С", " ", "А", "С", "Т", "Е", "Р", "О", "И", "Д", "О", "В" }; + num = 7; + obj = {vway("a1", [[Запустить процесс синхронизации: {старт}. ]], 'loc1') + }, +}; +robo = obj{ + nam = '_'; + dsc = 'Отсек почти пуст. В центре стоит {робот}. '; + act = 'Би-би. Я мыслю. Я существую. Я - робот.'; +}; +glass = obj{ + nam = '_'; + dsc = '^В стене открыт огромный {иллюминатор}. '; + act = 'Космос. Сияют звезды. Приближается пояс астероидов.'; +}; +panel = obj{ + nam = '_'; + dsc = '^Рядом стоит {панель} управления. '; + act = 'Статус эксперимента: завершён. Модель: WR069.'; +}; +door = obj{ + nam = '_'; + dsc = 'В конце отсека есть {дверь}. '; + act = 'Статус эксперимента: завершён. Модель: WR069.'; +}; +loc1 = room { + nam = "Отсек кибер-крионики"; + pxa = { + { "window", 10 }, + { "panel", 70 }, + { "robot", 180 }, + { "door1", 370 } + }; + obj = {robo, glass, panel, + vway("_", [[^В конце отсека есть {дверь}.]], 'loc2') + }, +}; +loc2 = room { + nam = "Отсек кибер-крионики"; + pxa = { + { "window", 10 }, + { "panel", 70 }, + { "robot", 180 }, + { "door1", 370 } + }; + obj = { + vway("_", [[Дверь закрыта. На экране появляется сообщение: + ^"Доступ закрыт. До начала вахты: 10 дней." + ^У робота возникает странное чувство. {Чувство?}]], 'loc3') + }, +}; +loc3 = room { + nam = "Отсек кибер-крионики"; + pxa = { + { "window", 10 }, + { "panel", 70 }, + { "door1", 370 } + }; + obj = { + vway("_", [[Робот подходит к иллюминатору. В стекле на мгновение отражается лицо мужчины. + Странные помехи вскоре проходят. Красные огоньки зрительных сенсоров внимательно смотрят во тьму. + Мимо пролетают десятки астероидов. Внезапно сильные толчки начинают сотрясать корабль. ^^{Далее} + ]], 'loc4') + }, +}; +loc4 = room { + nam = "Отсек кибер-крионики"; + pxa = { + { "window", 10 }, + { "panel", 70 }, + { "door1_open", 370 } + }; + obj = { + vway("_", [[За дверью раздаются выстрелы. Затем наступает тишина. Проходит несколько минут. + Внезапно дверь разлетается на кусочки от мощного выстрела. Лазерный луч попадает роботу прямо в корпус. + Робот отключается. Срабатывает {тревога}. + ]], 'loc5') + }, +}; +loc5 = room { + nam = "Отсек кибер-крионики"; + pxa = { + { "window", 10 }, + { "panel", 70 }, + { "door1_open", 370 } + }; + obj = { + vway("_", [[Через некоторое время тревога проходит. Наступает тишина. + Вскоре робот поднимается на ноги. Сенсоры внимательно осматривают корпус. + Повреждена основная батарея питания. Это очень серьезно. + Нужно срочно найти замену и понять, что же произошло на корабле. {Би-би}! + ]], 'loc6') + }, +}; +glass2 = obj{ + nam = '_'; + dsc = 'Отсек почти пуст. В стене открыт огромный {иллюминатор}.'; + act = 'Стекло кажется прочным. Пояс астероидов остался позади.'; + used = function(s,w) + if w == blaster then inv():del('blaster');inv():del('st'); walk('end4'); end; + end; +}; +panel2 = obj{ + nam = '_'; + dsc = 'Рядом стоит {панель} управления. '; + act = 'Компьютерный терминал не работает.'; + used = function(s,w) + if w == blaster then hp = hp - 1; if hp == 0 then walk('end5');end; + p'Робот стреляет из бластера. Ничего не происходит.'; inv():del('blaster'); end; + end; +}; +door = obj{ + nam = '_'; + dsc = 'Можно выйти в {коридор}.'; + act = function() + walk('loc7'); + end; +}; + +loc6 = room { + nam = "Отсек кибер-крионики"; + pxa = { + { "window", 10 }, + { "panel", 70 }, + { "door1_open", 370 } + }; + obj = {glass2, panel2, door}, + enter = function() + if q1 == 0 then q1 = 1; inv():add('st');end; + hp = hp - 1; if hp == 0 then walk('end5');end; + end, +}; +door1 = obj{ + nam = '_'; + dsc = 'Все двери заблокированы. В углу есть {ворота}, ведущие в ремонтный отсек.'; + act = function() + if q2 == 0 then p[[Внимание! Отсек разгерметизирован! + ^Для устранения неполадок вставьте чип-ключ.]]; else walk('loc10'); end; + end; + used = function(s,w) + if w == key1 then hp = hp - 1; if hp == 0 then walk('end5');end; + q2 = 1; inv():del('key1'); p'Би-би. Процесс устранения неполадок завершен.'; end; + end; +}; +blaster = obj{ + nam = 'бластер'; + inv = 'Бластер разряжен. Энергии хватит только на один выстрел.'; +}; +robo1 = obj{ + nam = '_'; + dsc = 'У стены лежит неисправный {робот}.'; + act = function() + if q3 == 0 then p[[Нижняя часть робота полностью разъедена кислотой. + Правый манипулятор отсутствует. + В левом манипуляторе крепко зажат бластер. Вытащить не получается.]]; + else p'Би-би. Прости, приятель.'; end; + end; + used = function(s,w) + if w == stone then q3 = 1; p[[Обломок метеорита с силой ударяет в корпус неисправного робота. + Манипулятор разжимается, высвобождая бластер. Робот забирает оружие себе.]]; + hp = hp - 1; if hp == 0 then walk('end5');end; + inv():del('stone'); inv():add('blaster'); end; + if w == blaster then hp = hp - 1; if hp == 0 then walk('end5');end; + p'Робот стреляет из бластера. Ничего не происходит.'; inv():del('blaster'); end; + + end; +}; +loc7 = room { + nam = "Коридор. Сектор А"; + pxa = { + { if_("q2==0","door1","door1_open"), 10 }, + { "shaft", 250 }, + { if_("have(blaster)", "robot_nohand", "robot_nohand_blaster"), 395 } + }; + obj = {door1, robo1, + vway("_", [[Небольшой проход уводит {вправо}.]], 'loc8'), + vway("_", [[Можно вернуться {назад}.]], 'loc6'), + }, + enter = function() + hp = hp - 1; if hp == 0 then walk('end5');end; + end, +}; +loc8 = room { + nam = "Коридор. Сектор B"; + pxa = { + { "door4", 60 }, + { "blood", 200 }, + { "door4", 310 } + }; + obj = { + vway("_", [[Пол испачкан кровью. След тянется из отсека {К613}]], 'loc9'), + vway("_", [[в отсек {К614}.]], 'loc11'), + vway("_", [[На стене чернеют кислотные разводы. Можно вернуться {назад}.]], 'loc7'), + }, + enter = function() + hp = hp - 1; if hp == 0 then walk('end5');end; + end, +}; +cap1 = obj{ + nam = '_'; + dsc = 'В центре отсека установлена большая {криокапсула}.'; + used = function(s,w) + if w == blaster then hp = hp - 1; if hp == 0 then walk('end5');end; + p'Робот стреляет из бластера. Ничего не происходит.'; inv():del('blaster'); end; + end; + act = 'Это отдельная капсула для элитных членов экипажа. ^Капсула пуста. На разбитом стекле есть следы крови.'; +}; +key = obj{ + nam = '_'; + dsc = 'На полу лежит оторванный {манипулятор}.'; + act = function() + if q4 == 0 then + hp = hp - 1; if hp == 0 then walk('end5');end; + p[[Робот вынимает из манипулятора синий чип-ключ. + ]]; inv():add('key1'); q4 = 1; else p'Би-би. Мне не нужен третий манипулятор.';end; + end; + used = function(s,w) + if w == blaster then hp = hp - 1; if hp == 0 then walk('end5');end; + p'Робот стреляет из бластера. Ничего не происходит.'; inv():del('blaster'); end; + end; +}; +key1 = obj{ + nam = 'чип-ключ'; + inv = 'Синий чип-ключ высокого уровня допуска.'; +}; +loc9 = room { + nam = "Отсек К613"; + pxa = { + { "door2", 10 }, + { "panel", 210 }, + { "crio_blood", 300 } + }; + obj = {cap1,key, + vway("_", [[Можно вернуться в {коридор}.]], 'loc8'), + }, + enter = function() + hp = hp - 1; if hp == 0 then walk('end5');end; + end, +}; +glass3 = obj{ + nam = '_'; + dsc = 'В центре стены размещен большой {иллюминатор}.'; + act = 'Стекло разбито и закрыто снаружи стальной пластиной.'; + used = function(s,w) + if w == blaster then hp = hp - 1; if hp == 0 then walk('end5');end; + p'Робот стреляет из бластера. Ничего не происходит.'; inv():del('blaster'); end; + end; +}; +stone = obj{ + nam = 'метеорит'; + inv = 'Довольно крупный и тяжелый осколок метеорита.'; + use = function(s,w) + if not (w == robo1) then hp = hp - 1; if hp == 0 then walk('end5');end; + inv():del('stone');p'Метеорит падает на пол и разбивается на части.'; end; + end; +}; +repair = obj{ + nam = '_'; + dsc = 'В центре стоит ремонтный {модуль}.'; + act = function() + if q5 == 0 then + hp = hp - 1; if hp == 0 then walk('end5');end; + p[[Ремонтный модуль сломан. Похоже, в него, разбив иллюминатор, врезался обломок метеорита. + Робот аккуратно достаёт его своими манипуляторами, но всё бесполезно. Модуль уже не починить.Что же делать? + ]]; + inv():add('stone'); q5 = 1; else p'Би-би. Что же делать? Смириться и ждать отключения?';end; + end; + used = function(s,w) + if w == blaster then hp = hp - 1; if hp == 0 then walk('end5');end; + p'Робот стреляет из бластера. Ничего не происходит.'; inv():del('blaster'); end; + end; +}; +loc10 = room { + nam = "Ремонтный отсек"; + pxa = { + { "door1_open", 10 }, + { if_("q5==1","repair_broken", "repair_meteor"), 190 }, + { "window", 390 } + }; + obj = {glass3, repair, + vway("_", [[Можно вернуться в {коридор}.]], 'loc7'), + }, + enter = function() + hp = hp - 1; if hp == 0 then walk('end5');end; + end, +}; +cap2 = obj{ + nam = '_'; + dsc = 'В центре отсека установлена большая {криокапсула}.'; + act = 'В капсуле спит мужчина. Его лицо кажется очень знакомым. ^ Робот начинает узнавать в нём себя. Но как это возможно?'; + used = function(s,w) + if w == blaster then inv():del('st'); inv():del('blaster'); walk('end1'); end; + end; +}; +alien = obj{ + nam = '_'; + dsc = 'Её пытается разбить ужасный {мутант}.'; + act = 'Это бывший член экипажа. Его руки превратились в острые клешни, из головы высовываются мерзкие щупальца. Похоже, он заразился инопланетным вирусом.'; + used = function(s,w) + if w == blaster then inv():del('blaster');inv():del('st'); walk('end2'); end; + end; +}; +loc11 = room { + nam = "Отсек К614"; + pxa = { + { "crio", 10 }, + { "mutant", 210 } + }; + obj = {cap2,alien, + vway("a1", [[Можно убежать в {коридор}.]], 'loc12') + }, + enter = function() + hp = hp - 1; if hp == 0 then walk('end5');end; + end, +}; +next1 = obj{ + nam = '_'; + dsc = [[Робот стреляет из бластера. Капсула взрывается. Мутанта разрывает на части. + Робот смотрит на своё мертвое тело в капсуле и ждёт отключения. Вскоре сигнал пропадает. + ^^{Далее}]]; + act = function(s,w) + hp = 31; q1 = 0; q2 = 0; q3 = 0; q4 = 0; q5 = 0; walk('loc6'); + end; +}; +remove_objs=function() +inv():del('blaster'); +inv():del('stone');inv():del('st');inv():del('key1'); +end +end1 = room { + nam = "Эпилог";enter=remove_objs; + obj = {next1, + }, +}; +next2 = obj{ + nam = '_'; + dsc = [[Робот стреляет из бластера. Раненый мутант, разбрызгивая кислоту, быстро приближается + к роботу и мощным ударом разрубает его на части. Человек в капсуле внезапно открывает глаза и кричит. + Настоящий кошмар только начинается. ^^{Далее}]]; + act = function(s,w) + hp = 31; q1 = 0; q2 = 0; q3 = 0; q4 = 0; q5 = 0; walk('loc6'); + end; +}; +end2 = room { + nam = "Эпилог";enter=remove_objs; + obj = {next2, + }, +}; +loc12 = room { + nam = "Коридор. Сектор B"; + pxa = { + { "door4", 60 }, + { "blood", 200 }, + { "door4", 310 } + }; + obj = {vway("a1", [[Мутант замечает робота и бросается в погоню. + Стараясь увести монстра как можно дальше от криокапсул, робот возвращается в свой отсек. + Наступает решающий момент. {Би-би}!]], 'loc13') + }, + enter = function() + hp = hp - 1; if hp == 0 then walk('end5');end; + end, +}; +alien1 = obj{ + nam = '_'; + dsc = 'К роботу медленно приближается {мутант}, отрезая все пути к отступлению.'; + act = function() inv():del('blaster');inv():del('st');inv():del('stone'); + walk('end3'); + end; + used = function(s,w) + if w == blaster then inv():del('blaster');inv():del('st'); walk('end2'); end; + end; +}; +glass4 = obj{ + nam = '_'; + dsc = 'В стене открыт огромный {иллюминатор}.'; + act = 'Стекло кажется прочным. За ним холод и бесконечная тьма.'; + used = function(s,w) + if w == blaster then inv():del('blaster');inv():del('st'); walk('ending'); end; + end; +}; +loc13 = room { + nam = "Отсек кибер-крионики"; + pxa = { + { "window", 10 }, + { "panel", 70 }, + { "mutant", 160 }, + { "door1", 370 } + }; + obj = {alien1, glass4, + }, + enter = function() + hp = hp - 1; if hp == 0 then walk('end5');end; + end, +}; +next3 = obj{ + nam = '_'; + dsc = [[Разъярённый мутант, разбрызгивая кислоту, быстро приближается + к роботу и мощным ударом разрубает его на части. В это время человек в капсуле + внезапно открывает глаза и кричит. Настоящий кошмар только начинается. + ^^{Далее}]]; + act = function(s,w) + hp = 31; q1 = 0; q2 = 0; q3 = 0; q4 = 0; q5 = 0; walk('loc6'); + end; +}; +end3 = room { + nam = "Эпилог";enter=remove_objs; + pxa = { + { "mutant", 172 } + }; + obj = {next3, + }, +}; +next4 = obj{ + nam = '_'; + dsc = [[ + Робот стреляет из бластера. Иллюминатор разбивается, впуская внутрь тьму. + Вакуум засасывает робота наружу. Оказавшись в открытом космосе, робот печально смотрит вслед удаляющемуся кораблю. + Затем сигнал пропадает. ^^{Далее}]]; + act = function(s,w) + hp = 31; q1 = 0; q2 = 0; q3 = 0; q4 = 0; q5 = 0; walk('loc6'); + end; +}; +end4 = room { + nam = "Эпилог";enter=remove_objs; + obj = {next4, + }, +}; +next5 = obj{ + nam = '_'; + dsc = [[ + Батарея робота окончательно выходит из строя. Сигнал пропадает. + ^^{Далее}]]; + act = function(s,w) + hp = 31; q1 = 0; q2 = 0; q3 = 0; q4 = 0; q5 = 0; walk('loc6'); + end; +}; +end5 = room { + nam = "Эпилог"; + pxa = { + { "robot", 212 } + }; + obj = {next5, + }, + enter=remove_objs +}; +ending = room { + nam = "Финал", + enter = function() mute_()(); complete_("meteor")(); end, + dsc = [[Робот стреляет из бластера. Иллюминатор разбивается вдребезги, впуская внутрь тьму. + Вакуум засасывает мутанта наружу. Робот не успевает ухватиться за поручни и летит за ним следом. + Оказавшись в открытом космосе, робот печально смотрит вслед удаляющемуся кораблю. + Перед тем, как отключиться, он думает о том, что исполнил свой долг сполна, и надеется, что + следующий робот проведет свою вахту без серьезных происшествий. Затем сигнал пропадает. + А на лице мужчины, спящего в капсуле, появляется спокойная улыбка.]], + act = gamefile_("robot.lua"), + obj = { vobj("next", txtc("^{Продолжение...}")) } +} + diff --git a/mus/castle.ogg b/mus/castle.ogg new file mode 100644 index 0000000..35aa800 Binary files /dev/null and b/mus/castle.ogg differ diff --git a/mus/cork.ogg b/mus/cork.ogg new file mode 100644 index 0000000..8653c43 Binary files /dev/null and b/mus/cork.ogg differ diff --git a/mus/datagroove.ogg b/mus/datagroove.ogg new file mode 100644 index 0000000..7896769 Binary files /dev/null and b/mus/datagroove.ogg differ diff --git a/mus/daybefore.ogg b/mus/daybefore.ogg new file mode 100644 index 0000000..43c1865 Binary files /dev/null and b/mus/daybefore.ogg differ diff --git a/mus/death.ogg b/mus/death.ogg new file mode 100644 index 0000000..688d6c4 Binary files /dev/null and b/mus/death.ogg differ diff --git a/mus/influensa.ogg b/mus/influensa.ogg new file mode 100644 index 0000000..5f91807 Binary files /dev/null and b/mus/influensa.ogg differ diff --git a/mus/machinethinks.ogg b/mus/machinethinks.ogg new file mode 100644 index 0000000..459bd0d Binary files /dev/null and b/mus/machinethinks.ogg differ diff --git a/mus/poppies.ogg b/mus/poppies.ogg new file mode 100644 index 0000000..59a23f5 Binary files /dev/null and b/mus/poppies.ogg differ diff --git a/mus/pumped.ogg b/mus/pumped.ogg new file mode 100644 index 0000000..e11cf91 Binary files /dev/null and b/mus/pumped.ogg differ diff --git a/mus/pyhun.ogg b/mus/pyhun.ogg new file mode 100644 index 0000000..cbc9a65 Binary files /dev/null and b/mus/pyhun.ogg differ diff --git a/mus/railroad.ogg b/mus/railroad.ogg new file mode 100644 index 0000000..9ef7b9c Binary files /dev/null and b/mus/railroad.ogg differ diff --git a/mus/scape.ogg b/mus/scape.ogg new file mode 100644 index 0000000..009aa96 Binary files /dev/null and b/mus/scape.ogg differ diff --git a/mus/shoot_bfg.ogg b/mus/shoot_bfg.ogg new file mode 100644 index 0000000..6fccaa4 Binary files /dev/null and b/mus/shoot_bfg.ogg differ diff --git a/mus/shoot_destructor.ogg b/mus/shoot_destructor.ogg new file mode 100644 index 0000000..3d136d0 Binary files /dev/null and b/mus/shoot_destructor.ogg differ diff --git a/mus/shoot_lazer.ogg b/mus/shoot_lazer.ogg new file mode 100644 index 0000000..173ebec Binary files /dev/null and b/mus/shoot_lazer.ogg differ diff --git a/mus/spell.ogg b/mus/spell.ogg new file mode 100644 index 0000000..e7e5f67 Binary files /dev/null and b/mus/spell.ogg differ diff --git a/mus/spookyloop.ogg b/mus/spookyloop.ogg new file mode 100644 index 0000000..e74df1d Binary files /dev/null and b/mus/spookyloop.ogg differ diff --git a/mus/square.ogg b/mus/square.ogg new file mode 100644 index 0000000..7d43d30 Binary files /dev/null and b/mus/square.ogg differ diff --git a/mus/tadam.ogg b/mus/tadam.ogg new file mode 100644 index 0000000..9a90a7c Binary files /dev/null and b/mus/tadam.ogg differ diff --git a/mus/tick.ogg b/mus/tick.ogg new file mode 100644 index 0000000..f81eb47 Binary files /dev/null and b/mus/tick.ogg differ diff --git a/nightmare.lua b/nightmare.lua new file mode 100644 index 0000000..228b8d7 --- /dev/null +++ b/nightmare.lua @@ -0,0 +1,367 @@ +-- $Name: Банкет$ +-- $Version: 0.1$ +instead_version "1.9.1" +require "lib" +require "para" +require "dash" +require "quotes" +require "timer" +require "xact" +require "hideinv" + +game.use = "Пип-Пип! Запрошенная операция невыполнима! Принудительная перезагрузка системы... Ну, вот! Пип!" +local old = obj; +function tcall(f,s) + if type(f) == "function" then + return tcall(f(s),s); + else + return f; + end +end +function obj(tab) + if tab.nam == nil then tab.nam = "" end + local dsc = tab.dsc; + tab.dsc = function(s) + if s.cnd == nil or s:cnd() then + return tcall(dsc,s); + end + end + return old(tab); +end + +main = room { + nam = "..." + ,title = {"Б", "А", "Н", "К", "Е", "Т" } + ,num = 13 + ,enter = music_("square",0) + ,act = function() walk(hall) end + ,dsc = "Я -- WR001. Мы с роботами провели жеребьёвку, и мне выпала почётная обязанность -- накрыть стол для праздничного обеда. Ведь сегодня -- особенный день! Люди выходят из своих капсул, а всего через год мы прибываем на место. Со времени нашего отлёта с Земли прошло уже больше тысячи лет. Даже удивительно, что я продержался всё это время..." + ,obj = { vobj("next", '{Пип-пип!}') } +} + +hall = room { + done = function() return takeflower._take==0 and vase._water and flower._cut end + ,_call = false + ,pxa = { + { "window2", 10 } + ,{ "table", 110 } + ,{ if_("takeflower._take<2", if_("takeflower._take==0","vase_flower","vase")), 220 } + ,{ "communicator", 420 } + } + ,nam = "Банкетный зал" + ,dsc = "Я в банкетном зале. Здесь будет проводиться праздничный обед." + ,obj = { "communicator", "desk", "takeflower", "takeknife", "takefork", "toiletdoor" } + ,way = { "coridor", "toilet" } +} + +toiletdoor = obj { + _open = false + ,dsc = "^В конце зала есть {дверь} в туалет." + ,act = function(s) + if s._open then + return (_("Из интерфейсного разъёма двери торчит вилка. Пип-пип!")); + else + return (_([[Дверь закрыта, а на небольшом табло светится надпись: "Санузел №233 переведён в режим блокировки. Открытие только через порт неотложного доступа."^Порт неотложного доступа находится рядом с дверью -- у него два отверстия, прямо как у моего манипулятора.^Я вставляю в отверстие манипулятор, и дверь открывается. Убираю манипулятор, и дверь закрывается. Пип!]])); + end + end +} + +communicator = obj { + dsc = "На стене висит {коммуникатор}." + ,act = function() + if not hall:done() then + return (_("Нет, нужно сначала закончить с сервировкой, а потом приглашать людей. Пип.")); + elseif hall._call then + return (_("Я уже позвонил по коммуникатору. Пип.")); + else + return walk(communicator_dlg); + end + end +} + +communicator_dlg = dlg { + nam = "Коммуникатор" + ,pxa = { + { "communicator", 220 } + } + ,hideinv = true + ,dsc = "Стандартный коммуникатор." + ,obj = { + [1]=phr{ "Пип!", "Пип!", code[[walk(communicator_dlg2)]]} + ,[2]=phr{ "Пап!", "Пап!", code[[walk(communicator_dlg2)]]} + } + ,way = { "hall" } +} + +communicator_dlg2 = room { + nam = "Коммуникатор" + ,pxa = { + { "communicator", 220 } + } + ,act = function() + hall._call = true; + p (_("Скоро люди появятся. Я мог бы подождать их в коридоре. Пип.")); + walk(hall); + end + ,dsc = [[Нет, что это я? Это же не дверь! Пип!^^Внимание! Внимание! Пип! -- говорю я, используя свой стандартный голос №23 -- человеческой особи женского пола двадцати трёх лет. -- Стол готов! Добро пожаловать на праздничный обед! Пип-пип!^^И почему я после каждой фразы вставляю "пип", пип? Что-то не так с моей прошивкой!]] + ,obj = { vobj("next", '{Пип-пип!}') } +} + +desk = obj { + dsc = function() + local str = "Посреди зала стоит широкий {обеденный стол}."; + if not hall:done() then + str = str.." Стол почти сервирован. Но чего-то всё-таки не хватает." + else + str = str.." Стол полностью сервирован." + end + return str; + end, + act = "Стол заполнен яствами, которые приготовлены, как мне сообщили, из свежайших продуктов. Непонятно правда, откуда здесь взяли свежие продукты? Пип-пип." +} + +takeflower = obj { + _take = 0 + ,nam = "Ваза с цветами" + ,dsc = function(s) + if s._take == 2 then + return; + end + local str = "На столе стоит "; + if s._take == 0 then + str = str.."{ваза с цветами}."; + elseif s._take == 1 then + str = str.."{ваза}."; + end + if s._take == 0 then + if vase._water and not flower._cut then + str = str.." Как я и предполагал, вода ничуть не помогла. Цветы выглядят всё так же. Может, нужно просто обновить версию их прошивки? Пип-пип." + elseif vase._water and flower._cut then + str = str.." Цветы кажутся заметно похорошевшими. Удивительно! Может быть, и мне поможет такая процедура? Пип-пип."; + else + str = str.." Цветы почти завяли. Пип."; + end + end + return str; + end + ,act = function(s) + if vase._water and flower._cut then + return (_("Цветы выглядят отлично. Больше ничего делать не нужно. Пип.")); + end + if s._take == 0 then + s._take = 1; + take(flower); + return (_("Я достаю из вазы цветы. Цветы совсем недавно были сорваны в гидропонике, однако выглядят довольно квело. Пип-пип... Видимо, я о чём-то забыл. Пип.")); + elseif s._take == 1 then + take(vase); + s._take = 2; + return (_("Я беру со стола вазу. Пип-пип.")); + end + end +} + +vase = obj { + _water = false + ,nam = function(s) + if s._water then return (_("Ваза с водой" else return (_("Ваза")))) end + end + ,inv = function(s) + local str = "Пустая ваза."; + if s._water then + str = "Ваза с водой."; + end + return str..[[ Интерфейс данной вазы совместим с объектом "цветы". Пип-пип!]]; + end + ,use = function(s,v) + if v == washer and not s._water then + s._water = true; + return (_("Вообще я всегда был уверен, что наливать воду в интерфейсные порты -- это плохая идея. Впрочем, люди такие странные. Я немного подумал и заполнил вазу водой. Пип.")); + elseif v == washer and s._water then + return (_("Здесь и так полно воды! Пип!")); + elseif v == desk then + takeflower._take = 1; + drop(vase, me()); + return (_("Я ставлю вазу на стол. Пип-пип.")); + end + end +} + +flower = obj { + _cut = false + ,nam = function(s) + if s._cut then return (_("Цветы с зачищенными контактами" else return (_("Цветы")))) end + end + ,inv = "Цветы почти завяли, ещё немного -- и их придётся выбросить. Пип." + ,use = function(s,v) + if v == vase then + return (_("Установка цветов в вазу -- крайне сложная и кропотливая задача. Лучше сначала поставить вазу на стол. Пип.")); + elseif v == desk then + return (_("Цветы нужно устанавливать в вазу. Пип-пип!")); + elseif v == takeflower and takeflower._take == 1 then + takeflower._take = 0; + drop(flower, me()); + local str = "Это было тяжело, но я справился. Цветы благополучно установлены в вазу, ни один лепесток не пострадал. Пип-пип!"; + if s._cut and vase._water then + str = str.."^Кажется, цветам это пошло на пользу. Вот что значит зачистить контакты! Пип-пип! Что ж, я всё сделал. Теперь нужно пригласить людей по коммуникатору. Пип-пип!"; + end + return str; + end + end +} + +takeknife = obj { + dsc = "Рядом с блюдами лежат {ножи}" + ,act = function() + if have(knife) then + return (_("Я уже взял нож, одного мне достаточно. Пип-пип!")); + else + take(knife); + return (_("Я беру со стола нож. Пип.")); + end + end +} + +takefork = obj { + dsc = "и {вилки}." + ,act = function() + if have(fork) then + return (_("У меня уже есть вилка. Пип-пип!")); + else + take(fork); + return (_("Я беру со стола вилку. Пип.")); + end + end +} + +knife = obj { + nam = "Столовый нож" + ,inv = "Обычный столовый нож, вполне сгодится для того, чтобы что-нибудь отрезать. Пип-пип!" + ,use = function(s,v) + if v == flower and not flower._cut then + flower._cut = true; + remove(s,me()); + return (_("Точно! Нужно просто зачистить контакты! И как я не догадался? Пип-пип!^Я срезаю ножом кончики стебельков. Всё готово. Пип.")); + elseif v == flower and flower._cut then + return (_("Как я понимаю, люди цветы не едят. Не стоит делать из них салат. Пип-пип!")); + end + end +} + +fork = obj { + nam = "Вилка" + ,inv = "Вилка с двумя зубцами, чем-то похожа на мой манипулятор. Пип!" + ,use = function(s,v) + if v == toiletdoor and toiletdoor._open then + return (_("Из интерфейсного разъёма двери уже торчит вилка. Пип-пип!")); + elseif v == toiletdoor then + toiletdoor._open = true; + remove(s,me()); + return (_("Я вставляю вилку в интерфейсный разъём, и дверь открывается. Пип!")); + end + end +} + +toilet = room { + nam = "Туалет" + ,enter = function() + if not toiletdoor._open then + p (_("Дверь в туалет закрыта. Пип-пип!")); + return false; + end + end + ,pxa = { + { "toilet", 170 } + ,{ "washer", 260 } + } + ,dsc = "Туалет. Роботы не пользуются туалетом. Пип!" + ,obj = { "washer", "devices" } + ,way = { "hall" } +} + +washer = obj { + dsc = "У стены стоит раковина с {краном}." + ,act = "Вода есть. Как хорошо, когда всё работает! Пип-пип!" +} + +devices = obj { + dsc = "Здесь есть также остальные {устройства}, которыми не пользуются роботы." + ,act = "С помощью этих устройств люди, видимо, сливают своё использованное масло. Или что там у них... Пип!" +} + +coridor = room { + _wait = 0 + ,nam = "Коридор" + ,enter = function(s) + if not hall:done() then + p (_("Нет, пока я ещё не всё закончил. Пип-пип!")); + return false; + elseif hall:done() and not hall._call then + p (_("Надо сначала пригласить в банкетный зал людей. Пип-пип!")); + return false; + end + end + ,pxa = { + { "robot", 10 } + ,{ "hatch2", 100 } + ,{ if_("coridor._wait>0","rat"), 395 } + ,{ if_("coridor._wait>1","rat"), 185 } + ,{ if_("coridor._wait>2","rat"), 460 } + ,{ if_("coridor._wait>2","rat"), 240 } + ,{ if_("coridor._wait>3","rat"), 120 } + --,{ if_("coridor._wait>3","rat"), 270 } + ,{ if_("coridor._wait>3","rat"), 320 } + } + ,dsc = "Передо мной длинный пустой коридор. Пип-пип." + ,obj = { "coridorstat" } +} + +coridorstat = obj { + dsc = function() + if coridor._wait == 0 then + return (_("Пока ещё никого нет. Надо немного {подождать}. Пип...")); + elseif coridor._wait == 1 then + music_("spookyloop",0)(); + return (_("В коридоре появилась жирная крыса. Крыса смотрит на меня недобрым взглядом. {Пип-пип}!")); + elseif coridor._wait == 2 then + return (_("Теперь передо мной две крысы. Что они здесь делают? Надеюсь, люди {скоро появятся}. Меня пугают эти злобные твари! Пип-пип!")); + elseif coridor._wait == 3 then + return (_("Передо мной собралась целая стая жирных крыс. Они сидят и просверивают меня своими злобными красными глазищами. {Где же люди}? Пип!")); + elseif coridor._wait == 4 then + return (_("Нет, не может быть! Весь коридор заполнен крысами! Пип! Пип-пип! Пип! Это какой-то кошмар! Такого не может быть! {Пип-пип}!")); + end + end + ,act = function() + coridor._wait = coridor._wait + 1; + if coridor._wait == 5 then + return walk(endgame1); + else + return walk(coridor); + end + end +} + +endgame1 = room { + nam = "..." + ,enter = function() + mute_()(); + complete_("nightmare")(); + remove(fork,me()); + remove(knife,me()); + end + ,act = function() walk(endgame2) end + ,pxa = { + { "robot_nohand", 212 } + } + ,dsc = "Пип! Это был всего лишь сон. Ну и намудрили с этой последней прошивкой -- теперь мне даже сны стали сниться. Ещё немного -- и я начну пользоваться человеческим туалетом для слива отработанного масла. Пип-пип!^Однако мне сегодня и правда нужно сервировать стол. Надо бы поторопиться." + ,obj = { vobj("next", '{Пип-пип!}') } +} + +endgame2 = room { + nam = "Конец" + ,pxa = { + { "robot_nohand", 212 } + } + ,dsc = "Кстати, а где моя правая рука?" + ,act = gamefile_("persona.lua") + ,obj = { vobj("next", txtc("{Пип?}")) } +} \ No newline at end of file diff --git a/oldfriend.lua b/oldfriend.lua new file mode 100644 index 0000000..0d0532f --- /dev/null +++ b/oldfriend.lua @@ -0,0 +1,348 @@ +-- $Name: Старый друг$ +-- $Version: 1.0$ +-- $Author: Клиш Максим$ +instead_version "1.9.1" +require "lib" +require "para" +require "dash" +require "quotes" +require "xact" +require "hideinv" +require "snapshots" +game.act = "Гм....."; +game.use = "Не сработает"; +game.inv = "Зачем это мне"; + +--restart_item("oldfriend"); + +main = timerpause(105, 1, "main2"); + +main2 = room { + nam = "...", + title = { "С", "Т", "А", "Р", "Ы", "Й", " ", "Д", "Р", "У", "Г" }, + num = 10, + enter = music_("scape",0), + dsc = [[Я прилетел ночью. Город встретил меня стеной дождя и пронизывающим ветром. + Перелет длинной в десять часов дался мне нелегко, и я хотел немного отдохнуть. + Пора перестать мотаться по работе через всю страну три раза в неделю.^^ + Сигнал личного {next|терминала}, разбудивший меня, был словно гром среди ясного неба. + Я неохотно поднялся и пошел посмотреть, кто потревожил меня в столь не уместный час.]], + obj = { + xact("next", code[[walk(terminal);]]), + }, +}; +terminal = room { + forcedsc = true, + pxa = { + { "screen", 165 } + }, + nam = "...", + dsc = [[На экране терминала мерцал значок нового {message|сообщения}. + Адресатом был мой старый друг Джордж. Странно. + Он всегда предпочитал звонок взамен электронному письму.]], + obj = { + xact("message", [[Привет дружище!^^ + Я знаю, ты только что вернулся, но мне нужно с тобой срочно поговорить. + Это может изменить всю твою жизнь. Жду тебя через час в кафе на набережной.^^ + Джордж^^ + {next|Далее}]]), + xact("next", code[[walk(block);]]) + }, +}; + +block = room { + entered = [[Все это очень странно. Джордж не часто влезал во всякие авантюры. + Здравый смысл отчаянно кричал мне – оставайся дома. А если это действительно важно? + Я решил поехать. Вот только нужно сначала найти свои ключи.]], + pxa = { + { "books", 10 }, + { "table2", 120 }, + { "window3", 260 }, + { "door5", 380 } + }, + nam = "Жилой блок", + dsc = [[Мой жилой блок. Из-за постоянных разъездов я редко здесь бываю, + но все же считаю его домом. ]], + obj = { + "bookshelf", + "table", + "window", + "door", + }, + way = { + "kitchen", + }, +}; +bookshelf = obj { + nam = "Книжная полка", + dsc = [[ У дальней стены стоит, сделанная из дешевого пластика, {книжная полка}.]], + act = [[Пару книг и несколько старых фотографий, имен половины людей на которых я уже не помню. + В центре мое фото с Анджелой. Жаль, что у нас так ничего не получилось.]], + }; +table = obj { + nam = "Стол", + dsc = [[Небольшой столик посреди комнаты завален разным + {хламом}.]], + act = [[Старые журналы, выписка из банка и кусок засохшей пиццы. + Мне здесь ничего не нужно.]] + }; + +window = obj { + nam = "Окно", + dsc = [[На стене расположено небольшое {окно} с жалюзи.]], + act = [[Жалюзи закрыты. Не люблю, когда глазеют в окна.]], + }; +door = obj { + nam = "Дверь", + dsc = [[В комнате есть {дверь} на улицу.]], + act = "Без ключа не выйти", + +}; +kitchen = room { + nam = "Кухня", + pxa = { + { if_("exist(key)", "table3_keys", "table3"), 220 }, + { "fridge", 120 }, + }, + dsc = [[Маленькая кухня. Тут едва можно уместиться вдвоем.]], + obj = { + "fridge", + "kitchen_table", + }, + way = { + "block", + }, +}; +fridge = obj { + nam = "Холодильник", + dsc = [[Здесь стоит мой старый {холодильник}.]], + act = [[Скорее всего, пуст – даже не буду заглядывать. + На дверце приклеена бумажка с номером – 5188349. + Это номер моих родителей, постоянно его забываю.]], +}; +key = obj { + nam = "Ключ", + dsc = [[Рядом с вазой лежат {ключи}.]], + tak = [[Я взял ключ со стола. Теперь можно идти.]], + inv = [[Ключ от двери моего блока]], + use = function(s,w) + if w == door then + walk(middle); + remove(s, me()); + else + p [[Зачем?]]; + end; + end; + }; +kitchen_table = obj { + nam = "Кухонный столик", + dsc = [[На {кухонном столике} стоит стеклянная ваза для фруктов]], + act = [[Ваза пуста]], + obj = { + "key", + }, +}; +middle = room { + nam = "По дороге в кафе", + dsc = [[Чем ближе я подходил к кафе, тем сильнее чувствовал тревогу. + Слова Джорджа: "Это может изменить твою жизнь" - не выходили у меня из головы.^^ + {next|Далее}]], + obj = { + xact("next", code[[walk(cafe);]]), + }, +}; +cafe = room { + nam = "Кафе на набережной", + pxa = { + { "table4", -100 }, + { "chair1", 130 }, + { "chair2", 320 }, + { "table", 390 } + }, + dsc = [[Наше старое место. В молодости мы часто собирались здесь по вечерам. + Сейчас же я бываю тут два - три раза в месяц]], + obj = { + "men", + "computer", + "bartender", + }, +}; +men = obj { + nam = "Джордж", + dsc = [[{Джордж} уже сидел за столиком и ждал меня. Рядом на столике + стоит чашка ароматного кофе.]], + act = function () + walk(mendlg); + end; +}; +bartender = obj { + nam = "Бармен", + dsc = [[За стойкой {бармен} тщательно протирает стаканы.]], + act = [[Я ничего не хочу. Не буду его отвлекать]], +}; +computer = obj { + nam = "Переносной терминал", + dsc = [[Возле Джорджа лежит его переносной {терминал}. Он + никогда с ним не расстается.]], + act = [[Терминал одной из новых моделей. Очень дорогой.]] +}; +mendlg = dlg { + nam = "Разговор в Кафе", + pxa = { + { "table4", -100 }, + { "chair1", 130 }, + { "chair2", 320 }, + { "table", 390 } + }, + entered = [[Джордж казался очень возбужденным. Его глаза быстро + бегали по экрану терминала.]], + phr = { + {1, always = true, "Здравствуй Джордж. ", + "Привет дружище! Рад тебя видеть. Выглядишь не очень.", [[pon(2);poff(1);]]}; + {2, false, always = true, [[Да, просто не выспался. Рассказывай, что произошло? Почему такая спешка?]], + [[Да садись ты. Сейчас все расскажу. + Помнишь ту контору, с которой я связался год назад?]], [[pon(3);poff(2);]]}; + {3, false, always = true, [[Ты что-то упоминал. Вроде как ты искал определенных людей для них.]], + [[Да. Так вот, эти "яйцаголовые" сделали заказ на поиск одного человека. + Не богат, не умен, не красавец – вообще никто. Я сразу удивился, но за такие деньги я бы нашел + кого угодно. На поиски ушло четыре месяца. Поймал его в аэропорту Бангкока, летели вместе. + По дороге рассказал ему, что да как. Мол, передовые исследования, наука, будущее, деньги. + Заказчики обычно не жалеют денег на оплату. Он отказался. Я дал ему свою визитку и сказал, + что если он передумает, то пусть мне позвонит.^^ + Прошло два месяца. Вчера мне домой принесли посылку. + Там было это – он достал из кармана стандартный блок памяти и положил его на стол.]], [[pon(4);poff(3);]]}; + {4, false, always = true, [[Ты смотрел, что на нем?]], + [[Да]], [[pon(5);poff(4);]]}; + {5, false, always = true, [[И что там??]], + [[Понимаешь, я не могу тебе рассказать. Ты должен все увидеть сам. + Ты найдешь все ответы на блоке памяти.^^ + (С этими словами он встал и вышел из кафе.)]], + [[take(memory_block);pon(6);poff(5);]]}; + {6, false, always = true, "Далее", code = [[walk(block_2);]]}; + + }; +}; +memory_block = obj { + nam = "Блок памяти", + inv = [[Блок памяти, который передал мне Джордж]], + use = function(s,w) + if w == terminal_2 then + walk(terminaldlg); + remove(s, me()); + else + p [[Не думаю, что это хорошая идея.]]; + end; + end; +}; +kitchen_2 = room { + nam = "Кухня", + dsc = [[Маленькая кухня. Тут едва можно уместиться вдвоем.]], + pxa = { + { "table3", 220 }, + { "fridge", 120 }, + }, + obj = { + "fridge", + "kitchen_table", + }, + way = { + "block_2", + }, +}; +block_2 = room { + nam = "Жилой блок", + pxa = { + { "books", 10 }, + { "table2", 120 }, + { "window3", 260 }, + { "door5", 380 } + }, + entered = code[[make_snapshot()]], + dsc = [[Мой жилой блок. Из-за постоянных путешествий я + редко здесь бываю, но все же считаю его домом. С каждой минутой все произошедши события пугали меня все больше и больше. + Я держал в руке блок памяти не решаясь подойти к терминалу.]], + obj = { + "bookshelf", + "table", + "window", + "door_2", + "terminal_2", + }, + way = { + "kitchen_2", + }, +}; +door_2 = obj { + nam = "Дверь", + dsc = [[В комнате есть {дверь} на улицу.]], + act = "Мне не зачем туда идти", +}; +terminal_2 = obj { + nam = "Личный терминал", + dsc = [[На кровати лежит мой личный {терминал}]], + act = [[Нужно вставить в него блок памяти, который дал мне Джордж]], +}; +terminaldlg = dlg { + nam = "Личный терминал", + pxa = { + { "screen", 165 } + }, + entered = [[Привет Алекс. Я почти уверен что это ты, но небольшой тест на подтверждение личности не повредит. + Я бы не хотел, что бы эта информация попала не в те руки.^^ + Выбери последовательность:]], + phr = { + {1, always = true, "5188439", + [[В блоке памяти что-то щелкнуло, и он стал полностью белым. Из открывшегося отверстия стал выходить полупрозрачный газ. + Стало тяжело дышать. Через несколько секунд я провалился в пустоту.]], [[pon(10);poff(1,2,3)]]}; + {2, always = true, "5188340", + [[В блоке памяти что-то щелкнуло, и он стал полностью белым. Из открывшегося отверстия стал выходить полупрозрачный газ. + Стало тяжело дышать. Через несколько секунд я провалился в пустоту.]], [[pon(10);poff(1,2,3)]]}; + {3, always = true, "5188349", + "Выбери имя", [[pon(4,5,6);poff(1,2,3);]]}; + {4, false, always = true, "София", + [[В блоке памяти что-то щелкнуло, и он стал полностью белым. Из открывшегося отверстия стал выходить полупрозрачный газ. + Стало тяжело дышать. Через несколько секунд я провалился в пустоту.]], [[pon(10);poff(4,5,6)]]}; + {5, false, always = true, "Анджела", + "Выбери место", [[pon(7,8,9);poff(4,5,6);]]}; + {6, false, always = true, "Виктория", + [[В блоке памяти что-то щелкнуло, и он стал полностью белым. Из открывшегося отверстия стал выходить полупрозрачный газ. + Стало тяжело дышать. Через несколько секунд я провалился в пустоту.]], [[pon(10);poff(4,5,6)]]}; + {7, false, always = true, "Окраины", + [[В блоке памяти что-то щелкнуло, и он стал полностью белым. Из открывшегося отверстия стал выходить полупрозрачный газ. + Стало тяжело дышать. Через несколько секунд я провалился в пустоту.]], [[pon(10);poff(7,8,9)]]}; + {8, false, always = true, "Набережная", + [[Личность подтверждена^^ + Приветствуем вас^^ + Мы рады, что вы решили принять участие в нашей программе полетов. + Для более детальной информации выберете раздел:]], + [[pon(11,12,13);poff(7,8,9);]]}; + {9, false, always = true, "Центр", + [[В блоке памяти что-то щелкнуло, и он стал полностью белым. Из открывшегося отверстия стал выходить полупрозрачный газ. + Стало тяжело дышать. Через несколько секунд я провалился в пустоту.]], [[pon(10);poff(7,8,9)]]}; + {10, false, always = true, "Возможно, все было совсем иначе", "", + [[restore_snapshot();]]}; + {11, false, always = true, "Общая информация", + [[В блоке памяти что-то щелкнуло, и он стал полностью черным. Из открывшегося отверстия стал выходить полупрозрачный газ. + Стало тяжело дышать. Через несколько секунд я провалился в пустоту.]], [[pon(14);poff(11,12,13);]]}; + {12, false, always = true, "Программа полета", + [[В блоке памяти что-то щелкнуло, и он стал полностью черным. Из открывшегося отверстия стал выходить полупрозрачный газ. + Стало тяжело дышать. Через несколько секунд я провалился в пустоту.]], [[pon(14);poff(11,12,13);]]}; + {13, false, always = true, "Участники", + [[В блоке памяти что-то щелкнуло, и он стал полностью черным. Из открывшегося отверстия стал выходить полупрозрачный газ. + Стало тяжело дышать. Через несколько секунд я провалился в пустоту.]], [[pon(14);poff(11,12,13);]]}; + {14, false, always = true, "Далее", "", [[walk(final);]]} + }; +}; +final = room { + nam = "...", + dsc = [[Пассажир Алекс Кессади^^ + Возраст 32 года^^ + Роль - Журналист^^ + Статус – выход из криосна^^ + Все показатели в норме^^ + Начинаю процедуру разморозки^^ + До окончания процедуры осталось четыре часа]], + enter = function() mute_()(); complete_("oldfriend")() end, + act = gamefile_("cook.lua"), + obj = { vobj("next", txtc("^{Продолжение...}")) } +}; \ No newline at end of file diff --git a/persona.lua b/persona.lua new file mode 100644 index 0000000..0963119 --- /dev/null +++ b/persona.lua @@ -0,0 +1,309 @@ +-- $Name: Личность$ +-- $Version: 0.1$ +instead_version "1.9.1" +require "lib" +require "para" +require "dash" +require "quotes" +require "xact" +global { + rat_i = 0; + onedsc = 5; + twodsc = 8; + threedsc = 2; + fourdsc = 6; +} +_patterns = {}; + +game.use = "Вариантов успешного завершения инструкций 0... Отмена действия." + +main = room { + nam = "..." + ,enter = music_("castle") + ,title = {"Л", "И", "Ч", "Н", "О", "С", "Т", "Ь" } + ,num = 14 + ,act = function() walk(main2) end + ,obj = { vobj("next", '{Начать игру}') } +} + +main2 = room { + forcedsc = true; + pxa = { + { "door4", 10 }, + { "panel", 150 }, + { if_("exist(programmator_mozgov)","program","program_empty"), 240, 50 }, + { "crio", 300 } + }, + nam = "Выход", + dsc = "Отсек криосна. Мне необходимо разобраться с одним из членов экипажа. Кажется у него какие-то проблемы с сознанием.", + obj = {"chest", "criocaps","programmator_mozgov"}, +} + +chest = obj { + nam = "chest", + dsc = "На стене {ящик} с кодовым замком.", + act = function (s) + walk("coderoom") + end, +} + +criocaps = obj { + nam = "criocaps", + dsc = "Рядом стоит {криокапсула}. Она светится синим светом изнутри.", + act = "Судя по надписи - внутри инженер Александр. Тот кто нужен." +} + +programmator_mozgov = obj { + nam = function(s) + if rat_i == 0 then + p"Программатор личности" + else + p"Программатор личности (с копией крысиной личности)" + end + end, + dsc = "На стене под стеклом висит {программатор личности}.", + act = function(s) + p"Забираю программатор себе."; + take(programmator_mozgov,me()); + remove(programmator_mozgov); + end, + use = function(s,w) + if (w == criocaps) and (rat_i == 0) then + walk(podsoznanie_room) + elseif (w == criocaps) and (rat_i == 1) then + walk(criocaps_final) + p"Восстановление личности из резервной копии завершено.^Психологических проблем не обнаружено.^Спасибо за работу.^"; + elseif w == rat_in_chestroom then + p"Сунув программатор в крысиную дыру удалось скопировать личность крысы."; + rat_i = 1; + end + end +} + +coderoom = room { + nam = "Кодовый замок", + entered = function(s) + s._flt = stead.mouse_filter(0) + end; + left = function(s) + stead.mouse_filter(s._flt) + end; + dsc = "Это ящик Александра", + way = {"main2"}, + obj = {"one","two","three","four", "openbox"}, +} + +one = obj { + nam = "one", + dsc = function (s) + return "{" .. tostring(onedsc).."}" + end, + act = function (s) + onedsc = onedsc + 1; + if onedsc == 10 then + onedsc = 0; + end; + stead.need_scene() + return true + end +} + +two = obj { + nam = "two", + dsc = function (s) + return "{" .. tostring(twodsc) .. "}" + end, + act = function (s) + twodsc = twodsc + 1; + if twodsc == 10 then + twodsc = 0; + end; + stead.need_scene() + return true + end +} + +three = obj { + nam = "three", + dsc = function (s) + return "{" .. tostring(threedsc) .. "}" + end, + act = function (s) + threedsc = threedsc + 1; + if threedsc == 10 then + threedsc = 0; + end; + stead.need_scene() + return true + end +} + +four = obj { + nam = "four", + dsc = function (s) + return "{" .. tostring(fourdsc) .. "}" + end, + act = function (s) + fourdsc = fourdsc + 1; + if fourdsc == 10 then + fourdsc = 0; + end; + stead.need_scene() + return true + end +} + +openbox = obj { + nam = "openbox", + dsc = "^^{Открыть}", + act = function (s) + if ((onedsc == 1) and (twodsc == 2) and (threedsc == 0) and (fourdsc == 0)) then + walk(chestroom) + else + p"Открыть не удается.." + end + end +} + +podsoznanie_room = room { + nam = "Подсознание", + pxa = { + { "screen", 165 } + }, + way = {"podsoznanie_room","person","superego","main2"}, + obj = {"it_crioson","it_meds"}, +} + +criocaps_final = room { + nam = "Подсознание", + pxa = { + { "screen", 165 } + }, + way = {"criocaps_final","person_final","superego_final","final_rooom"}, + obj = {"it_crioson","it_meds"}, +} + +person_final = room { + nam = "Личность", + pxa = { + { "screen", 165 } + }, + way = {"criocaps_final","person_final","superego_final","final_rooom"}, + obj = {"final_person_dmitry"} +} + +superego_final = room { + nam = "Суперэго", + pxa = { + { "screen", 165 } + }, + way = {"criocaps_final","person_final","superego_final","final_rooom"}, + obj = {"final_s_dm_parents"}, +} + +person = room { + nam = "Личность", + pxa = { + { "screen", 165 } + }, + way = {"podsoznanie_room","person","superego","main2"}, + obj = {"person_dmitry","p_dm_stress","p_dm_depression", } +} + +superego = room { + nam = "Суперэго", + pxa = { + { "screen", 165 } + }, + way = {"podsoznanie_room","person","superego","main2"}, + obj = {"s_dm_parents","s_dm_dolg"}, +} + +final_person_dmitry = obj { + nam = "person_dmitry", + dsc = "- Самоидентификация личности: {Крыса}^^ + Проблем не выявлено.", + act = "'...'", +} + +final_s_dm_parents = obj { + nam = "s_dm_dolg", + dsc = "Найдено:^ - личность 'Крыса'^- остатки личности 'Александр' (анализ не возможен)^ ^Анализ личности 'Крыса':^ ^ + Проблем не выявлено.", +} + +final_rooom = room { + nam = "Выход", + enter = function() mute_()(); complete_("persona")() end, + act = gamefile_("wake.lua"), + obj = { vobj("next", txtc("{КОНЕЦ?}")) } +} + + + + + + +p_dm_depression = obj { + nam = "depression", + dsc = "- {Вялотякущая депрессия}^^Необходимо восстановление личности из резевной копии", + act = "'...Когда мы прилетим все, кого я знал, будут мертвы. Тысяча лет не шутки. Мои коллеги, мой начальник, родители, дочь. Я останусь один...'", +} + +p_dm_stress = obj { + nam = "stress", + dsc = "^ ! Выявленные проблемы:^ - {Значительный стресс}^", + act = "'...Я не уверен, что выживу в полете. Может произойти что угодно. Роботы перепутают провода, или начнуть отрывать друг другу конечности...'", +} + +person_dmitry = obj { + nam = "person_dmitry", + dsc = "- Самоидентификация личности: {Александр}^", + act = "'...Я - Александр, мне 43 года. Я инженер. Нахожусь в криосне на борту космического корабля, который в полете тысячу лет...'", +} + +s_dm_parents = obj { + nam = "s_dm_dolg", + dsc = "Найдено:^ - личность 'Александр'^[альтернативные личности отсутствуют]^ ^Анализ личности 'Александр':^ - {Указания родителей} (хроническое)^", + act = "'...Ты должен быть послушным мальчиком!... ...Не будешь учиться - продадим цыганам!... ...Запомни! Ты должен чистить зубы каждый день в полдень!...'", +} + +s_dm_dolg = obj { + nam = "s_dm_parents", + dsc = "- {Долг перед обществом} (хроническое)^^ + Проблем не выявлено.", + act = "'...Наша цивилизация поручила тебе ответственную миссию... ...Ты должен соответствовать... ...Ожидания командования вполне конкретны...'", +} + +it_crioson = obj { + nam = "it_crioson", + dsc = "Модификации подсознания:^- {Состояние криосна}^", + act = "[Ощущения от органов чувств заблокированы]", +} + +it_meds = obj { + nam = "it_meds", + dsc = "- {Блокирование неуместных инстинктов}^^ + Проблем не выявлено.", + act = "[Инстинкт размножения заблокирован]", +} + +chestroom = room { + nam = "Ящик Александра", + obj = {"disk_in_chestroom","rat_in_chestroom"}, + way = {"main2"}, +} + +rat_in_chestroom = obj { + nam = "rat_in_chestroom", + dsc = "Рядом видна {крысиная нора}.", + act = "Кажется крысы прорыли дыру в стене и повредили диск.", +} + +disk_in_chestroom = obj { + nam = "Диск с личностью Александра", + dsc = "Внутри ящика {диск} с резервной копией личности Александра.. но он разломан и всюду видно следы чьих-то зубов. Надо найти другой диск.", + act = "Диск значительно поврежден. Использовать его не получится. Нужен еще один.", +} + +function start() + if here() == coderoom then + stead.mouse_filter(0) + end +end diff --git a/prologue.lua b/prologue.lua new file mode 100644 index 0000000..dc70514 --- /dev/null +++ b/prologue.lua @@ -0,0 +1,46 @@ +instead_version "1.9.1" +require "lib" +require "para" +require "dash" +require "quotes" +require "xact" +require "timer" + +main = room { + nam = "..." + ,enter = mute_() + ,pxa = { { "ship", 0, 0 } } + ,act = function() walk(main2) end + ,dsc = _([[Далёкое будущее. То, чего все опасались -- случилось... Земля на грани катастрофы. + Последняя надежда человечества -- огромный звездолет, построенный в международном космическом центре + "Мир". Однако, главный вопрос так и не был решен. Где искать новый дом?]]) + ,obj = { vobj("next", '{'.._('Дальше')..'}') } +} + +main2 = room { + nam = "..." + ,pxa = { { "planet", 172, 22 } } + ,act = function() walk(main3) end + ,dsc = _([[Только спустя пятьдесят лет после завершения строительства корабля учёные обнаружили планету, очень похожую на Землю. + Это была надежда на спасение!^ + Путь обещал быть долгим -- одна тысяча и сто лет на околосветовой скорости. + Однако, благодаря технологиям крио-заморозки, для пассажиров это время промелькнёт за одно мгновение.^ + Вернее, за одно мгновение и один год -- было решено вывести пассажиров + из криосна на этапе торможения, чтобы встретить новый мир на свежую голову.]]) + ,obj = { vobj("next", '{'.._('Дальше')..'}') } +} + +main3 = room { + nam = "..." + ,act = function() walk(main4) end + ,dsc = _([[План полёта был утверждён. Большая часть развратившегося человечества оставалась + доживать свои дни на Земле, но нашлись и те, кто пожелал связать своё будущее со звёздами...]]) + ,obj = { vobj("next", '{Начать игру}') } +} + +main4 = room { + nam = "" + ,enter = function() music_("tadam")();timer:set(4000);complete_("prologue")() end + ,title = _("ПОСЛЕДНИЙ РЕЙС") + ,timer = function() gamefile_("rat.lua")() end +} diff --git a/rat.lua b/rat.lua new file mode 100644 index 0000000..cec1a38 --- /dev/null +++ b/rat.lua @@ -0,0 +1,380 @@ +-- $Name: Долгая служба$ +-- $Version: 0.1$ +instead_version "1.9.1" +require "lib" +require "para" +require "dash" +require "quotes" +require "xact" + +game.use = function(s,v) + return _("Это не есть ")..v.nam .."!"; +end +local old = obj; +function tcall(f,s) + if type(f) == "function" then + return tcall(f(s),s); + else + return f; + end +end +function obj(tab) + if tab.nam == nil then tab.nam = "" end + local dsc = tab.dsc; + tab.dsc = function(s) + if s.cnd == nil or s:cnd() then + return tcall(dsc,s); + end + end + return old(tab); +end +function vb(o) o.inv = function(s) return s.nam.."!" end; return obj(o) end + +main = room { + nam = "..." + ,dsc = "Я есть бежать." + ,act = function() + walk(start2); +end + ,obj = { vobj("next", '{'.._('Дальше')..'}') } +} + +start2 = room { + nam = "..." + ,act = function() walk(start3) end + ,dsc= "Я есть бежать, бежать." + ,obj = { vobj("next", '{'.._('Дальше')..'}') } +} + +start3 = room { + nam = "..." + ,act = function() walk(start4) end + ,dsc= _("Зубастый гнаться за мной, я не успеть бежать в нора как раньше. Я бежать в какой-то другой нора -- длинный-длинный туннель. Потом ещё один туннель. Потом бежать в ещё один туннель. Потом в ещё один туннель.^Зубастый не отставать, зубастый бежать быстро-быстро.") + ,obj = { vobj("next", '{'.._('Дальше')..'}') } +} +start4 = room { + nam = "..." + ,enter = music_("daybefore", 0) + ,title = _("КРЫСИНАЯ НОРА") + ,num = 1 + ,act = function() take(eat);take(cry);take(th);take(climb);take(cry);walk(floor) end + ,dsc= _("Я бежать мимо человеков, потом бежать в какой-то странный большой нора, который двигаться вверх! Потом я бежать куда-то, где много человеков. Я бояться! Я лезть на ящик. Потом я лезть на ящик. Потом я ещё лезть на ящик. Потом я лезть в потолочный нора. Потом я бежать по потолочный нора -- длинный-длинный нора! Потом я вдруг падать! Больно падать! И вот я здесь...") + ,obj = { vobj("next", '{'.._('Где я?')..'}') } +} + +eat = vb { + nam = _("ЖРАТЬ") + ,use = function(s,v) + if v==cheesetake or v==cheesetake0 then + v._on=false; + return (_("Сыр вкусно! Могу жрать сколько угодно сыр! Ещё! Ещё!")); + end + end +} + +push = vb { + nam = _("ТОЛКАТЬ") + ,use = function(s,v) + if v==cheesetake then + v._on = false; + cheesetake0._on = true; + return (_("Я толкать сыр. Сыр падать на пол, прямо к двери.")); + elseif v==cheesetake0 then + return (_("Некуда толкать!")); + end + end +} + +th = vb { + nam = _("ГРЫЗТЬ") + ,use = function(s,v) + if v==cheesetake_stick then + cheesetake._on = false; + cheesetake0._on = true; + return (_("Я грызть странный скобка. Скобка неожиданно сгибаться, и сыр падать со стола!")); + end + if v==chair1 or v==chair2 then return (_("Я грызть стул... Стул есть невкусный! Не еда!")) end + if v==desk1 or v==desk2 then return (_("Я пытаться грызть стол... Глупый стол! Почти сломать мне зуба!")) end + if v==door then return (_("Человечий двери не прогрызть! Я пытаться... Терять два, нет... двадцать два зуба!")) end + if v==computer and not v._used then + v._used = true; + return (_("Я грызть глупый устройство... Невкусно! Но я грызть и грызть. Вдруг чёрный коробка вспыхивать! И появляться в чёрный коробка зверь страшный-страшный -- чёрный шерсть всклокоченный, красный глаза гореть! Страшно!.. А, нет. Это же я.^Потом появляться другой картинка -- железный человек, похожий на мусорный бак заходить в комната! Он вставать у двери и пищать, как я! Пи-па-пи-пи-па! Дверь открываться!")) + elseif v==computer then + return (_("Устройство больше не вспыхивать! Всё есть сгрызено. Надо грызть другой устройство!")); + elseif v==foodgen then + foodgen._ch = not foodgen._ch; + return (_("Я грызть большая ручка, и она повернуться!")); + elseif v==foodgen2 then + if foodgen._ch then + if cheesetake._on then + return (_("Уже есть сыр! Надо жрать! Жрать! Жрать!")); + else + cheesetake._on=true; + return (_("Из устройства выпадать кусочек... сыра!")); + end + else + return (_("Из устройства что-то литься и растекаться по стол!")); + end + elseif v==cheesetake or v==cheesetake0 then + return (_("Сыр надо жрать!")); + end +end +} + +cry = vb { + nam = _("ПИЩАТЬ") + ,use = function(s,v) + if v==door and computer._used then + if rat1._on and rat2._on and cheesetake0._on then + return walk(end1); + else + return (_([[Я пищать на дверь, пищать и пищать. Дверь открываться! Но тут же вновь закрываться! Мерзкий человечий голос говорить: "Не обнаружен объект у двери. Дверь блокируется".]])); + end + else + return (_("Пи-пи! Пи! Пи! Пи!")) + end + end +} + +climb = vb { + nam = _("ЛЕЗТЬ") + ,use = function(s,v) + if v==desk1 then return (_("Стол есть высоко! Не долезть!")) end + if v==shaft1 or v==shaft2 then return (_("Мне не долезть до потолочный нора!")) end + if v==floor1 then walk(floor) end + if v==chair1 then walk(onchair) end + if v==desk2 then walk(ondesk) end + if v==chair2 then walk(onchair) end + if v==device2 then walk(oncloner1) end +end +} + +floor = room { + nam = _("На полу") + ,pxa = { + { "door4", 220 }, + { if_("rat1._on","rat"), 130 }, + { if_("rat2._on","rat"), 180 }, + { if_("rat2._on","rat"), 360 }, + { "column", 70 }, + { "column", 400 } + } + ,dsc = _("Жилище людей. Пахнуть едой! И не едой...") + ,obj = { "door", "cheesetake0", "rat1", "rat2", "shaft1", "desk1", "chair1", "device1" } +} + +rat1 = obj { + dsc= function(s) + if cheesetake0._on then + return (_("{Другой Я} сидеть у двери и жрать сыр! Но почему, если другой Я жрать сыр, я по-прежнему голоден?")); + else + return (_("{Другой Я} сидеть далеко от двери. Другой Я вращать красными глазами.")); + end + end + ,act = "Это Я!" + ,cnd = function(s) return s._on end +} + +rat2 = obj { + dsc= function(s) + if cheesetake0._on then + return (_("Два {других Я} пытаться отобрать у сыр у другого другого Я!")); + else + return (_("Два {других Я} бродить по комнате и вращать красными глазами.")); + end + end + ,act = _("Это Я!") + ,cnd = function(s) return s._on end +} + +cheesetake0 = obj { + dsc = _("У двери лежит {кусочек сыра}.") + ,act = _("Сыр! Вкусно! Жрать!") + ,cnd = function(s) return s._on end +} + +door = obj { + dsc = _("Есть {дверь}.") + ,act = _("Дверь есть закрыта!") +} + +shaft1 = obj { + dsc = _("Есть потолочная {нора}.") + ,act = _("Есть очень высоко-высоко. Нора не долезть. Люди тупой! Потолочная нора неудобно!") +} + +desk1 = obj { + dsc = _("Есть {стол} и") + ,act = _("Стол большой.") +} + +chair1 = obj { + dsc = _("есть {стул}.") + ,act = _("Стул! Стул! Лезть!") +} + +device1 = obj { + dsc = _("Есть {что-то большой и гудящий}. Он есть похожий на мусорный бак, но в пять... нет в пятьдесят пять раз больше!") + ,act = _("Запах есть плохой. Не есть еда. Надо держаться дальше.") +} + +onchair = room { + nam = _("На стуле") + ,pxa = { + { "column", 455 }, + { "door6", 50 }, + { "shaft", 300 } + } + ,dsc = _("Я лезть на стул.") + ,obj = { "floor1", "shaft1", "desk2" } +} + +floor1 = obj { dsc = _("Ниже есть {пол}."), act = _("Пол! Слезть!") } + +desk2 = obj { + dsc = _("Есть {стол}. Большой стол.") + ,act = _("Близко! Совсем близко! Можно лезть! Там есть запах!") +} + +ondesk = room { + nam = _("На столе") + ,pxa = { + { if_("foodgen._ch", "foodgen2","foodgen"), 0 }, + { if_("cheesetake._on","stick"), 160 }, + { if_("cheesetake._on","cheese"), 160, 130 }, + { "computer", 390 }, + } + ,dsc = _("Я сидеть на стол. Здесь запах!") + ,obj = { "chair2", "foodgen", "foodgen2", "cheesetake_stick", "cheesetake", "computer", "shaft2", "device2" } +} + +cheesetake_stick = obj { + dsc = _("Из стол выдвигаться странный {скобка},") + ,act = _("Странный скобка.") + ,cnd = function(s) return cheesetake._on end +} + +cheesetake = obj { + dsc = _("на котором лежать {сыр}!") + ,act = _("Сыр! Вкусно! Жрать! Жрать! Жрать!") + ,cnd = function(s) return s._on end +} + +chair2 = obj { + dsc = _("Ниже стол есть {стул}.") + ,act = _("Лезть вниз. Можно!") +} + +foodgen = obj { + dsc = _("На стол есть ящик с {длинный ручка} и") + ,act = _("Странно. Пахнуть еда. На устройство надпись: синтезатор... лактоза.. Больше не понимать! Давно ходить школа!") +} + +foodgen2 = obj { + dsc = _("{большой кнопка}.") + ,act = _("Странный большой кнопка...") +} + +computer = obj { + dsc = _("На стол есть ещё один людское {устройство} -- чёрный коробка, много кнопок.") + ,act = _("Люди глупый! Это нельзя есть!") +} + +device2 = obj { + dsc = _("Рядом со стола есть большой и гудящий {мусорный бак}.") + ,act = _("Он страшный. Страшно гудит.") +} + +shaft2 = obj { + dsc = _("Есть потолочная {нора}.") + ,act = _("Потолочная нора уже близко. Почти залезть. Но надо выше. Надо лезть на большой и гудящий.") +} + +oncloner1 = room { + nam="" + ,pxa = { { "cloner", 407 } } + ,enter = function(s) if rat2._on then p (_("Мне больше не нужно лезть на мусорный бак."));return false end end + ,act = function() rat1._on=true; walk(floor) end + ,dsc = function() + if rat1._on then + cheesetake0._on = false; + rat2._on = true; + return (_("Я снова лезть на мусорный бак! Другой Я лезть со мной! Другой я делать то же, что делать я, ведь это я. Мы оба падать в чёрный нора, оба сидеть там, и нас обоих выталкивать. Теперь других Я -- четыре! Много Я!")); + else + return (_("Я лезть на мусорный бак. Я почти долезть! Но тут я падать! Падать и падать! Оказываться в какой-то тёмный запертый нора. Я думать -- полный капец. Еда -- нет. Выхода -- нет. Но потом вспышки! Потом меня что-то выталкивать! И вот я опять на полу комната.^Рядом со мной сидеть зверь страшный, со страшными красными глазами... Нет, это же я. Нет, как же? Я сидеть рядом с собой. Я не понимать!")) + end + end + ,obj = { vobj("next", '{'.._('Дальше')..'}') } +} + +end1 = room { + nam = "" + ,enter = mute_() + ,act=function(s) walk(end2) end + ,pxa = { { "door4", 190 } } + ,dsc = _([[Я пищать пи-па-пи-пи-па, и дверь открываться! Я тут же бежать из комната. Я вдруг думать -- зачем я бежать из комната, ведь там много других Я и много сыра! Но дверь уже закрыться! Я пищать на дверь, но дверь -- "не обнаружено объекта"! Это ужасно!]]) + ,obj = { vobj("next", '{'.._('Дальше')..'}') } +} + +end2=room{ + nam="", + enter=function(s) + timer:set(3000) + end, + dsc=txtc(_("Спустя несколько часов...")), + timer=function() + timer:stop(); + walk(end3); + end +} + +end3=room{ + nam="", + enter=function(s) + music_("spookyloop")(); + timer:set(3000) + end, + pxa = { + {"cloner",407}, {"rat",10}, {"rat",80}, {"rat",150}, {"rat",220}, {"rat",300}, {"rat",370} + }, + timer=function() + timer:stop(); + walk(end4); + end +} + +end4=room{ + nam="", + enter=function(s) + timer:set(3000) + end, + pxa = { + {"table5",150}, {"rat",185,75}, {"rat", 301,75}, {"rat",10}, {"rat",80}, {"rat",150}, {"rat",360}, {"rat",440} + }, + timer=function() + timer:stop(); + walk(end5); + end +} +end5=room{ + nam="", + enter=function(s) + timer:set(3000) + end, + pxa = { + {"door4",190}, {"rat",10}, {"rat", 80}, {"rat",150}, {"rat",80}, {"rat",320}, {"rat",390}, {"rat",470} + }, + timer=function() + timer:stop(); + walk(end6); + end +} +end6=room{ + nam="", + enter = function() + mute_()(); + complete_("rat")() + end, + act = gamefile_("longwork.lua"), + obj = { vobj("next", txtc(_("КОНЕЦ?^^{Это только начало...}"))) } +} diff --git a/repair.lua b/repair.lua new file mode 100644 index 0000000..1e8d76e --- /dev/null +++ b/repair.lua @@ -0,0 +1,400 @@ +-- $Name: Ремонт$ +-- $Version: 0.1$ +instead_version "1.9.1" +require "lib" +require "para" +require "dash" +require "quotes" +require "xact" + +game.use = "Нет, думаю так делать не стоит." +local old = obj; +function tcall(f,s) + if type(f) == "function" then + return tcall(f(s),s); + else + return f; + end +end +function obj(tab) + if tab.nam == nil then tab.nam = "" end + local dsc = tab.dsc; + tab.dsc = function(s) + if s.cnd == nil or s:cnd() then + return tcall(dsc,s); + end + end + return old(tab); +end + +main = room { + nam = "..." + ,title = { "Р", "Е", "М", "О", "Н", "Т" } + ,enter = music_("influensa",0) + ,num = 3 + ,act = function(s) walk("crio") end + ,dsc = "Ну и дела! Мне через пару часов в холодильник отправляться, а главный инженер меня к себе вызывает -- говорит, неотложные проблемы какие-то, никто кроме меня помочь не может.^Прихожу, а оказывается, что в K007 все криокапсулы отрубились. Ремонт требуется.^-- Ну, а роботы на что? -- спрашиваю я. -- Они же должны такими вещами заниматься.^-- Вот они и постарались, -- говорит главный инженер. -- Пришёл тут один лампочку заменить. Свет горит, да. Но зато весь криоблок отрубился.^Ну и дела!" + ,obj = { vobj("next", '{Начать игру}') } +} + +crio = room { + _done = false + ,nam = "К007" + ,pxa = if_("not darkness:cnd()", + { + { "door4", 5 }, + { "panel", 150 }, + { "toolbox", 220 }, + { "crio", 310 }, + --{ "crio", 420 } + }) + ,dsc = "Я в криоблоке К007." + ,obj = { "darkness", "capsulas", "cinfo", "toolbox", "screw", "flash", "powerbox", "switch" } + ,way = { vroom("Коридор","endgame") } +} + +darkness = obj { + dsc = "Здесь темно, и я почти ничего не вижу." + ,cnd = function() return switch._off or redwire._set ~= "red" and bluewire._set ~= "red" and greenwire._set ~= "red" end +} + +capsulas = obj { + _exam = false + ,dsc = function(s) + if s:func() then + return (_("Кабины {крио-капсул} слабо подсвечиваются синим.")); + else + return (_("Здесь стоят шесть {крио-капсул}. Ни один из индикаторов на них не горит, и кабины кажутся чёрными, а должны подсвечиваться, когда капсулы исправны.")) + end + end + ,act = function(s) + if not s._exam then + return (_("Да, надо бы проверить все эти капсулы. Возможно, трансформаторы перегорели. Но тут потребуются инструменты.")); + else + if s:func() then + return (_("Капсулы работают.")); + else + return (_("С самими капсулами всё в порядке. Однако они не работают.")); + end + end + end + ,func= function() return redwire._set == "blue" or ((greenwire._set == "blue" or bluewire._set == "blue") and darkness:cnd()) end + ,cnd = function(s) return not darkness:cnd() or s:func() end +} + +cinfo = obj { + dsc = "На самой первой капсуле есть маленькая {табличка}." + ,act = [["Не меньше 2-52". Ну, мне это известно.]] + ,cnd = function() return not darkness:cnd() end +} + +powerbox = obj { + _open = false + ,dsc = function(s) + if darkness:cnd() then + return (_("Я едва могу различить очертания {электрического щитка}.")); + else + local str = "На стене у выхода висит {электрический щиток}." + if s._open then + str = str.." Щиток открыт."; + end + return str; + end + end + ,act = function(s) + if capsulas._exam and switch._exam and not s._open then + return (_("Крышка щитка привинчена здоровыми винтами.")); + elseif capsulas._exam and switch._exam and s._open then + walk(electro); + else + return (_("Я не уверен, что мне стоит туда лезть. Там контуры, отвечающие за освещение.")); + end + end +} + +switch = obj { + _off = false + ,_exam = false + ,dsc = function(s) + local str = "Рядом со щитком есть {выключатель света}. "; + if s._off then + return str.."Сейчас свет выключен."; + else + return str.."Сейчас свет горит."; + end + end + ,act = function(s) + if redwire._set ~= "red" and bluewire._set ~= "red" and greenwire._set ~= "red" then + return (_("Я нажимаю на кнопку, но ничего не происходит -- свет не работает.")); + else + if s._off then + s._off = false; + return (_("Я нашарил в темноте кнопку на стене и включил свет. Да, так значительно лучше.")); + else + s._off = true; + s._exam = true; + return (_("Я нажал на кнопку, и свет во всём отсеке погас.")); + end + end + end +} + +toolbox = obj { + _exam= false + ,dsc = "На полу стоит мой {ящик с инструментами}." + ,act = function(s) + if not s._exam then + s._exam = true; + return (_("Я открыл ящик с инструментами.")); + else + return (_("Ящик уже открыт.")); + end + end + ,cnd = cinfo.cnd +} + +screw = obj { + nam = "Отвёртка" + ,dsc = "На дне ящика лежит {электрическая отвёртка}." + ,inv = "Моя любимая электрическая отвёртка. Всегда выручает." + ,use = function(s,v) + if v == capsulas then + if switch._off then + return (_("Лучше сначала включить свет.")); + end + if capsulas._exam then + return (_("Я уже проверил капсулы, с ними всё в порядке.")); + else + capsulas._exam = true; + return (_("Я проверяю несколько капсул -- все цепи целы, трансформаторы работают. Непонятно, в чём может быть проблема.")); + end + elseif v == powerbox then + if powerbox._open then + return (_("Я уже открыл щиток.")); + else + powerbox._open = true; + return (_("Электрическая отвёртка никогда не подводит. Всего за несколько секунд я скрутил все винты и открыл щиток.")); + end + end + end + ,tak = "Я вытащил из ящика отвёртку." + ,cnd = function() return toolbox:cnd() and toolbox._exam end +} + +flash = obj { + _on = false + ,nam = "Фонарик" + ,dsc = function(s) + if darkness:cnd() then + return (_("В темноте слабо поблёскивает мой {фонарик}.")); + else + return (_("Из бокового отделения ящика торчит маленький {фонарик}.")) + end + end + ,inv = function(s) + local str = "Небольшой фонарик размером с ручку. Света от него немного.^"; + if s._on then + s._on = false; + return str.."Я нажимаю на кнопку с тыльной стороны фонарика и выключаю его."; + else + s._on = true; + if here() == crio and (switch._off or redwire._set == "") then + return str.."Я включаю фонарик, однако это не помогает."; + else + return str.."Я включаю фонарик."; + end + end + end + ,tak = "Я взял фонарик." + ,cnd = function() return toolbox._exam end +} + +electro = room { + nam = "Щиток" + ,pxa = { { if_("not nosee:cnd()", "panel"), 215 } } + ,exit = function(s) + remove(green,me()); + remove(blue,me()); + remove(red,me()); + end + ,dsc = "Я стою у открытого щитка. Здесь три провода, которые можно подключать к разным портам." + ,obj = { "nosee", "bluewire", "greenwire", "redwire", "blueport", "greenport", "redport", "info" } + ,way = { "crio" } +} + +nosee = obj { + dsc = "Я ничего не вижу. Здесь совсем темно." + ,cnd = function() return (switch._off or (redwire._set ~= "red" and bluewire._set ~= "red" and greenwire._set ~= "red")) and not flash._on end +} + +info = obj { + dsc = "^На крышке щитка есть маленькая {наклейка}." + ,act = "Красный -- 2-53, зелёный -- 2-50, синий -- 2-48. Ну, понятно, я всё это и так знаю." + ,cnd = function() return not nosee:cnd() end +} + +function turn(s,str) + if s._set == "green" then + return str.."зелёному порту."; + elseif s._set == "red" then + return str.."красному порту."; + elseif s._set == "blue" then + return str.."синему порту."; + end +end +bluewire = obj { + _set= "blue" + ,dsc = function(s) + if s._set == "" and have(blue) then + return (_("Синий провод ни к чему не подключён.")); + elseif s._set == "" then + return (_("{Синий провод} ни к чему не подключён.")); + end + local str = "{Синий провод} подключён к "; + return turn(s,str); + end + ,act = function(s) + local o = ref(string.gsub(deref(s), "wire", "")); + if s._set == "" then + take(o); + return (_("Я беру в руку "..o.alt ..".")); + end + take(o); + local app = ""; + if s._set == "red" then + app = " Внезапно свет в помещении гаснет." + end + s._set = ""; + return (_("Я отсоединяю "..o.alt.." от порта."))..app; + end + ,cnd = info.cnd +} + +greenwire = obj { + _set= "green" + ,dsc = function(s) + if s._set == "" and have(green) then + return (_("Отсоединённый зелёный провод торчит из щитка.")); + elseif s._set == "" then + return (_("Отсоединённый {зелёный провод} торчит из щитка.")); + end + local str = "{Зелёный} подключён к "; + return turn(s,str); + end + ,act = bluewire.act + ,cnd = info.cnd +} + +redwire = obj { + _set= "red" + ,dsc = function(s) + if s._set == "" and have(red) then + return (_("Красный провод отсоёдинен.")); + elseif s._set == "" then + return (_("{Красный провод} отсоёдинен.")); + end + local str = "А {красный провод} подключён к "; + return turn(s,str); + end + ,act = bluewire.act + ,cnd = info.cnd +} + +blueport = obj { + dsc = "Всего здесь три порта -- {синий}," + ,act = function(s) + local nm = string.gsub(deref(s), "port", ""); + if bluewire._set == nm then + return (_("К этому порту подключён синий провод.")); + elseif greenwire._set == nm then + return (_("К этому порту подключён зелёный провод.")); + elseif redwire._set == nm then + return (_("К этому порту подключён красный провод.")); + else + return (_("К этому порту ничего не подключено.")); + end + end + ,cnd = info.cnd +} + +greenport = obj { + dsc = "{зелёный} и" + ,act = blueport.act + ,cnd = info.cnd +} + +redport = obj { + dsc = "{красный}." + ,act = blueport.act + ,cnd = info.cnd +} + +blue = obj { + nam = "Синий провод" + ,alt = "синий провод" + ,set = "blue" + ,inv = function(s) + return (_("Я держу в руке "..s.alt..".")); + end + ,use = function(s,v) + local o = ref(deref(s).."wire"); + if v == blueport or v == redport or v == greenport then + local nm = string.gsub(deref(v), "port", ""); + if bluewire._set == nm or redwire._set == nm or greenwire._set == nm then + return (_("К этому порту уже подсоединён провод.")); + end + end + if v == blueport then + o._set = "blue"; + remove(s,me()); + return (_("Я подключаю "..s.alt.." к синему порту.")); + elseif v == redport then + o._set = "red"; + remove(s,me()); + return (_("Я подключаю "..s.alt.." к красному порту. Свет в помещении загорается. От неожиданности я даже на секунду зажмуриваю глаза.")); + elseif v == greenport then + o._set = "green"; + remove(s,me()); + return (_("Я подключаю "..s.alt.." к зелёному порту.")); + end + end +} + +green = obj { + nam = "Зелёный провод" + ,alt = "зелёный провод" + ,set = "green" + ,inv = blue.inv + ,use = blue.use +} + +red = obj { + nam = "Красный провод" + ,alt = "красный провод" + ,set = "red" + ,inv = blue.inv + ,use = blue.use +} + +endgame = room { + nam = "Конец" + ,enter= function() + if not capsulas:func() then + p (_("Нет, надо сначала решить проблему с капсулами.")); + return false; + elseif capsulas:func() and darkness:cnd() then + p (_("В этой темноте я и дверь-то с трудом вижу. Нет, надо всё же сначала разобраться с тем, что здесь происходит.")) + return false; + elseif capsulas:func() and not darkness:cnd() and greenwire._set ~= "green" then + p (_("Странно. Я подхожу к двери, но она не открывается.")); + return false; + end + mute_()(); + complete_("repair")(); + remove(flash,me()); + remove(screw,me()); + end + ,dsc = "Ну, наконец-то! И что только творится в электрических мозгах у этих роботов?! Как можно было так подключить энергетические контуры?^Довольный, я вернулся в свой крио-блок и столкнулся там с потрёпанным на вид роботом.^-- Были проблемы с освещением, -- сказал робот. -- Но я всё починил. Волноваться не о чем.^И быстро вышел в коридор -- странной прихрамывающей походкой." + ,act = gamefile_("crio.lua") + ,obj = { vobj("next", txtc("^{Продолжение...}")) } +} diff --git a/robot.lua b/robot.lua new file mode 100644 index 0000000..0dde93b --- /dev/null +++ b/robot.lua @@ -0,0 +1,57 @@ +-- $Name: Робот, который видит...$ +-- $Author: j-maks$ +-- $Version: 0.1$ +-- $E-mail: jmaksima_at_gmail_dot_com$ +instead_version '1.9.1'; +require "lib" +game.enable_save = false; require 'para'; require 'dash'; require 'quotes'; require 'nouse'; require 'hideinv'; --require 'dbg'; +pl = player {nam = "WR015", var { diag_stat=false, leg_stat=false, arm_stat=false, stand_stat=false, stand_try=false, standup_try=false, stand_sw_stat=false, roll_stat=false, crawl_stat=false, look_stat = false }, }; + +main = timerpause(520, 315, "main2"); + +main2 = room {nam = "...", hideinv = true, +title = { "Р", "О", "Б", "О", "Т", " ", "К", "О", "Т", "О", "Р", "Ы", "Й", " ", "В", "И", "Д", "И", "Т" }, +num = 8, +enter = function() music_("spell",0)(); end, + dsc = [[Это была долгая и продолжительная гибернация, словно затянувшаяся ледяная полярная ночь ... Но вот настало время моей вахты, я -- WR015, пора выходить в операционный режим. ]]; + obj = { vway("nxt", '{Далее}', 'robot_room') } +}; + +endgame = room { + nam="Выход из гибернации", + enter = function() mute_()(); complete_("robot")() end, + dsc = [[ Сегодня -- день когда я выхожу на корабельное дежурство, мой номер -- WR015, и центральный компьютер активировал меня несколько минут назад. ^Моя операционная система загрузилась и я начал осознавать, что в режиме гибернации -- видел сны, удивительное дело для робота, надо будет при случае обсудить этот вопрос с центральным компьютером... ^^Я постепенно активировал все свои контуры и схемы, внезапно, смутные и тревожные, смазанные реальностью картины увиденного в эту длящуюся как одинокая полярная ночь, сна, на короткие мгновения всколыхнули какие-то странные мысли и предположения в моем мозгу, но я отбросил их и стал изучать отчеты поступающие от системы диагностики...]] + ,act = gamefile_("engineer.lua") + ,obj = { vobj("next", txtc("^{Продолжение...}")) } +} + +robot_room = room {nam = "Спецблок", var { cam_door_open=false, cam_door_oiled = false }, +pxa = { + { "panel", 120 }, { if_("robot_room.cam_door_open","door2_open","door4"), 200 }, { if_("exist(electro_swab)", "cleaner"), 340 } +}, + dsc = function(s) if not me().stand_stat then if not me().crawl_stat and not me().stand_sw_stat then if s.cam_door_open then p [[ Я стою в своей камере хранения, прямо передо мной открытый дверной проем. Как только я активировал дверь во всем отсеке включилось освещение, теперь я наблюдаю как мерно нагреваются осветительные панели, разгоняя окружающую темноту. ]]; else p [[ Я включил звуковые и зрительные анализаторы и оценил обстановку. Искусственное освещение отсутствует, я слышу равномерные звуки работы различной электроники корабельных систем. ]]; end; elseif me().crawl_stat and not have(electro_swab) then p [[ Я прополз из отсека в свою камеру гибернации, неловко цепляясь манипулятором за покрытие пола и отталкиваясь ногой от различного хлама, попавшегося на пути. ]]; elseif have(electro_swab) and not me().stand_sw_stat then p [[ Я лежу на полу своей камеры, держась манипулятором за электрошвабру. ]]; elseif me().stand_sw_stat then p [[ "Камера для гибернации, уютное вместилище для одной единицы "боевого" робота вахтера", -- такие грустные мысли посетили меня, при осмотре своей камеры хранения. ]] else p [[ Я в камере гибернации. "Совсем не так я представлял себе свое дежурство", -- подумалось мне оглядываясь на пройденный путь. ]]; end; end; end, + act = function(s,w) if w == 'nxt' then walk(endgame); elseif w == 'butt_op' then if not have(electro_swab) then if not s.cam_door_open then p [[ Я протянул манипулятор и переключил рычаг управления. Дверь моей камеры хранения стала медленно опускаться, издавая протяжный скрип... "Надо бы смазать направляющие и движущиеся части, автоматически замечаю я..." ]]; s.cam_door_open = true; else p [[ Протянув манипулятор и переключив рычаг, я услышал как раздалось шипение пневмоприводов и дверь, поскрипывая, поднялась, наглухо закрыв проем. Стало темно. ]]; s.cam_door_open = false; end; else p [[ Неуверенно балансируя на одной ноге, я протянул манипулятор с зажатой в нем электрошваброй к рычагу управления и мне почти удалось, в последний момент, я выронил швабру и падая зацепил рычаг. ^Упал я прямо на начавшую подниматься дверь, мое тело стало подниматься вместе с ней... ^^Прошло мгновение, прежде чем я осознал фатальность своей ошибки, и тут сработал сигнал тревоги, но было уже поздно... Я попытался оттолкнуться от двери и спрыгнуть внутрь камеры, тем самым лишь усугубив свое положение, переместив голову под неумолимый пресс... Последней мыслью в моем угасающем позитронном мозгу, было осознание всей нелепости, абсурдности происходящего... ^Кажется я закричал... ]]; remove(electro_swab,me()); disable_all(objs(s)); enable(exist('nxt',s));end; end; end, way = { 'robot_deck', }, obj = { vobj("butt_op", 'Передо мной на стене расположена {панель управления}, подсвечиваемая тусклыми индикаторами.'), vobj("nxt", '{Далее}'):disable() }, + exit = function(s,e) + if e == main2 then + disable_all(objs(e)); + elseif e == robot_deck then + if not s.cam_door_open then + p [[ Я постучал манипулятором по двери, перегораживающей основной отсек и мою камеру. Раздался металлический глухой звук. ]]; + elseif me().crawl_stat or me().stand_sw_stat then + p [[ Зачем мне ползти обратно в отсек, если я с таким трудом добирался в камеру. ]]; + else + return true; + end; + return false; + end; + end, +}; +------------- +robot_deck = room { nam = function(s) if here() == robot_room thenp (_("Выйти в Отсек N12" elsep (_("Отсек 12")))) end; end, +pxa = { + { "box", 10 }, { "box", 110 }, { "panel_broken", 220 }, { "door2_open", 300 } +}, + var { seen = false; }, dsc = function(s) if not s.seen then if me().arm_stat then p [[ Лежа на полу я пошевелил оставшимися конечностями. Кажется все в норме. ]]; else p [[ Я сделал шаг и ... выпал из камеры на пол отсека №12, предназначенного для хранения роботов подобных мне. Что-то не так с моими сервоприводами?!? ]]; end; elseif s.seen then if me().stand_try then if me().roll_stat then p [[ Отсек №12 -- оплот и родной дом для трети всех роботов предназначенных для несения вахты на корабле. И вот теперь я лежу на полу этого дома и смотрю на перемигивающиеся на потолке световые панели. ]]; end; else p [[ Кажется, если я так и буду продолжать лежать и бездействовать, то в итоге мои схемы потускнеют, и я превращусь в еще один кусок хлама среди этого побоища. ]]; end; end; end, act = function(s, w) if w == 'look' then if not me().roll_stat then p [[ Я осматриваюсь и понимаю, -- что-то неладное творится на этом корабле. В обширном отсеке заметны следы разного рода разрушений, некоторые двери камер хранения для вахтовых роботов искарежены, некоторые отсуствуют напрочь. Стеновые панели, пол и потолок в следах гари и сажи, по всему отсеку тут и там разбросаны запчасти и детали разного рода и назначения, судя по всему принадлежащие не только роботам. ^В одном из углов свалена целая куча тел моих сотоварищей. ]]; elseif not me().stand_try then p [[ Я осматриваю окружающую меня действительность, приподнявшись на локте манипулятора и вращая голову вокруг своей оси. То что я вижу удручает меня еще больше... ^В одной из стен отсека остутствует часть обшивки внушительных размеров, повсюду свисают токопроводящие кабели, в некоторых местах наблюдаются их обрывы и оголенные концы порождают искры, замыкаясь в свободном парении, осветительные панели и лампы работают наперебой. ^В той куче сваленных друг на друга частей тел и деталей роботов я заметил какое-то движение, что-то серое с красными глазами и хвостом промелькнуло в потрохах одного из роботов. ]]; elseif not me().standup_try then p [[ Проанализировав помещение отсека для камер хранения, и понимаю, что все возможные выходы из отсека либо заблокированы автоматикой, либо не функционируют, либо завалены непроходимой кучей мусора и хлама... ^Служебный элеватор обесточен, видимо из-за проблем с электропроводкой. ^Единственный возможный выход -- в открытый космос. При этой мысли я в который раз поблагодарил своих создателей сделавших меня роботом, мне не нужен воздух чтобы продолжать функционировать. ]]; elseif me().stand_try and me().standup_try then p [[ Все мои попытки что-либо сделать не принесли результатов, нужно придумать и попробовать что-то еще... ]]; me().look_stat = true; end; if not s.seen then if not me().leg_stat then p [[ ^^Бегло взглянув на свою камеру гибернации, я заметил в ней электрошвабру. ^"И что она там делает?!"]]; else p [[ ^^Круто вывернув голову и проанализировав камеру хранения, я вижу, что там одиноко стоит электрошвабра, видимо она заменяла мне отсутствующую ногу, пока я находился в режиме гибернации. ]]; s.seen = true; end; end; elseif w == 'test' then if me().diag_stat and me().arm_stat and me().leg_stat then p [[ Я в очередной раз запускаю программу диагностики... ^^>> Все системы работают исправно... ^^"Ложь!! Сплошная ложь, это не может быть правдой... Ведь мои зрительные сенсоры исправны в отличии от руки и ноги."]]; else p [[ Я еще раз запускаю стандартный тест самодиагностики и просматриваю отчеты по работе, тест все так же продолжает сообщать, что все в порядке, все системы работают в норме, немного изучив исходные данные и перепроверив схемы, обнаруживаю инородный код в программе диагностики... ^"Кто-то влез в меня и переписал программу!!! Неслыханное варварство!!!" ]]; me().diag_stat = true; end; elseif w == 'exam' then if not me().roll_stat then p [[ Я осматриваю свое тело, насколько это вообще возможно назвать осмотром, если ты лежишь упершись лицом в пол... ^Если уж быть совсем точным, -- я осматриваю то, что осталось от моего тела и наконец убеждаюсь, что у меня отсутствует правый манипулятор и одна нога. ^"Как такое вообще могло произойти?! Почему не сработал сигнал безопасности?" ]]; me().arm_stat = true; me().leg_stat = true; else p [[ Я приподнимаюсь на манипуляторе и внимательно осматриваю себя. На месте разъема под правый манипулятор в теле зияет темная дыра и торчат оконечные шлейфы, такая же ситуация и вместо одной ноги... Все мое механическое тело покрыто слоем пыли и некогда блестящие детали корпуса потускнели. На груди красуется заводской номерной шильдик, с выбитыми на нем буквами -- WR01. ^"Постойте-ка, я же точно уверен, что я -- WR015, моя смена заступать на корабельную вахту... Что же на самом деле тут происходит и что произошло до моего дежурства?? Это какой-то бред, так бывает только во сне... Нужно каким-то образом добраться до центральной консоли управления в 5-ом отсеке и просмотреть отчеты других роботов, но сначала нужно встать на ноги." ]]; end; elseif w == 'stand_up' then if me().roll_stat then p [[ Я беспомощно размахиваю одним манипулятором в воздухе, пытаясь найти хоть какую-то опору и оставшейся ногой, делаю попытки оттолкнуться от пола, чтобы подняться. Все тщетно. Гнить мне в одной из куч мусора до скончания веков... ]]; me().stand_try = true; else p [[ Я сгибаю манипулятор в локтевом суставе и упираюсь в пол, криво изогнувшись подтягиваю ногу и сгибаю ее в коленном суставе... Некоторое время я балансирую, потом начинаю медленно поднимать, как домкратом, свое тело левой рукой, разгибая все больше, в какой-то момент я на одно мгновение теряю тонкую нить равновесия и подскользнувшись, в попытках все исправить, с грохотом падаю на пол. ]]; me().standup_try = true; end; elseif w == 'roll_up' then if not me().roll_stat then p [[ Действуя одной рукой как рычагом я попробовал перевернуться и у меня получилось. Теперь я лежу на спине и вижу намного больше в окружающей обстановке. ]]; me().roll_stat = true; else p [[ Я стал раскачивать свое тело, упершись манипулятором в пол и в решающий момент сделал толчок полусогнутой ногой, не совсем приятно падать ударяясь лицевыми сенсорами в пол, но так или иначе я опять перевернулся на грудь. ]]; me().roll_stat = false; end; elseif w == 'crawl' then if me().roll_stat then p [[ Довольно трудно ползти лежа на спине, но я попробовал, со стороны наверно это выглядело забавно, на полу лежит робот и исполняет танец какого-то космического моллюска. ]]; else p [[ Я протянул манипулятор вперед и вцепился в стоящий на полу ящик, немного помогая себе ногой, я подтянулся и развернул свое тело в сторону камеры хранения. ]]; me().crawl_stat = true; end; elseif w == 'cr_cam' then walk(robot_room) end; if not me().crawl_stat then if me().arm_stat and me().leg_stat and me().diag_stat and s.seen then enable_all(objs(s)); if me().stand_try and me().standup_try and me().look_stat then enable(exist('crawl', s)); else disable(exist('crawl', s)); disable(exist('cr_cam', s)); end; disable(exist('cr_cam', s)); end; else disable_all(objs(s)); enable(exist('cr_cam', s)); end; end, obj = { vobj('exam', '{Осмотреть себя}'), vobj('look', '{^Осмотреться}'), vobj('test', '{^Запустить диагностику}'), vobj('stand_up', '{^^Попытаться подняться}'):disable(); vobj('roll_up', '{^Перевернуться}'):disable(); vobj("crawl", '{^^Попробовать ползти}'):disable(), vobj("cr_cam", '{Ползти в камеру}'):disable(), }, exit = function(s, t) if t == robot_room then disable_all(objs(t)); put('electro_swab', t) end; end, }; +------------- +electro_swab = obj { nam = "Электрошвабра", + dsc = [[ В моей камере стоит {электрошвабра}. ]],tak = 'Я подполз к швабре и схватил ее манипулятором.', inv = function(s) if me().crawl_stat then p [[ Оперевшись на одну из стен камеры и помогая себе шваброй, примерно со второй попытки мне удалось подняться на одну ногу. Теперь я стою на одной ноге и вместо второй упираюсь в пол манипулятором с зажатой шваброй. ]]; me().crawl_stat = false; me().stand_sw_stat = true; enable(exist('butt_op', here())); else p [[ Стандартная электрошвабра, такой пользуются роботы при уборке помещений. Подходит для большинства типов поверхностей. ]]; end; end, nouse = 'Предполагаю, что это не самое правильное применение для электрошвабры.', }; diff --git a/theme.ini b/theme.ini new file mode 100644 index 0000000..08b9adb --- /dev/null +++ b/theme.ini @@ -0,0 +1,66 @@ +; $Name: theme$ +; $Name(ru): theme$ +; $Name(es): theme$ +; $Author: excelenter +scr.w = 800 +scr.h = 600 +scr.gfx.h = -1 + +scr.gfx.bg = theme/back.png +scr.col.bg = black +scr.gfx.cursor.x = 2 +scr.gfx.cursor.y = 2 +scr.gfx.cursor.normal = theme/cursor.png +scr.gfx.cursor.use = theme/cursor-use.png +scr.gfx.pad = 10 +scr.gfx.mode = float +scr.gfx.x = 30 +scr.gfx.y = 30 +scr.gfx.w = 500 +scr.gfx.h = 200 + +win.x = 45 +win.y = 248 +win.w = 465 +win.h = 315 + +win.fnt.size = 16 +win.gfx.up = theme/aup.png +win.gfx.down = theme/adown.png +win.col.fg = #CCCCCC +;win.col.link = #3384bd +win.col.link = #BC4800;#009900 +;win.col.alink = #91d2ff +win.col.alink = #DB5000;#00ff00 +win.fnt.name=theme/{pf7}.ttf +inv.fnt.name=theme/{pf7}.ttf + +inv.x = 580 +inv.y = 35 +inv.w = 180 +inv.h = 480 + +inv.fnt.size = 16 +inv.gfx.up = theme/aup.png +inv.gfx.down = theme/adown.png +inv.col.fg = #CCCCCC +inv.col.link = #BC4800;#009900 +inv.col.alink = #DB5000;#00ff00 +inv.mode = vertical + +menu.col.bg = #212121 +menu.col.fg = #CCCCCC +menu.col.link = #BC4800 +menu.col.alink = #DB5000 +menu.col.alpha = 255 +menu.col.border = #404040 +menu.bw = 8 +menu.fnt.size = 16 +menu.gfx.button = theme/menu.png +menu.button.x = 735 +menu.button.y = 545 +menu.fnt.name = theme/{pf7}.ttf + + +snd.click = theme/click.wav ; theme/click.ogg + diff --git a/theme/adown.png b/theme/adown.png new file mode 100644 index 0000000..3e2b33b Binary files /dev/null and b/theme/adown.png differ diff --git a/theme/aup.png b/theme/aup.png new file mode 100644 index 0000000..9f00c05 Binary files /dev/null and b/theme/aup.png differ diff --git a/theme/back.png b/theme/back.png new file mode 100644 index 0000000..986fa41 Binary files /dev/null and b/theme/back.png differ diff --git a/theme/click.wav b/theme/click.wav new file mode 100644 index 0000000..af3e8d4 Binary files /dev/null and b/theme/click.wav differ diff --git a/theme/cursor-use.png b/theme/cursor-use.png new file mode 100644 index 0000000..7614b35 Binary files /dev/null and b/theme/cursor-use.png differ diff --git a/theme/cursor.png b/theme/cursor.png new file mode 100644 index 0000000..493a415 Binary files /dev/null and b/theme/cursor.png differ diff --git a/theme/font_readme.txt b/theme/font_readme.txt new file mode 100644 index 0000000..6e05a5b --- /dev/null +++ b/theme/font_readme.txt @@ -0,0 +1,55 @@ + +True Type Font: Pixel Font-7 version 1.0 + + +EULA +-==- +The fonts Pixel Font-7 is freeware for home using. + + +DESCRIPTION +-=========- +This font based on bitmap font created for freeware original strategic game Mars Soldiers-7. +http://www.styleseven.com/php/get_product.php?product=Mars%20Soldiers-7 +Latin and Cyrillic code pages are supported. + +Files in pixel_font-7.zip: + readme.txt this file. + pixel font-7.ttf pixel font-7 regular font + pixel font-7_windows_1251.fon pixel font-7 in windows "FON" format Cyrillic codepage + pixel font-7_windows_1252.fon pixel font-7 in windows "FON" format Latin codepage + pixel font-7 for game.bmp original view used in game + pixel_font-7_screen.png preview image + +Please visit http://www.styleseven.com/ for download our other products as freeware as shareware. +We will welcome any useful suggestions and comments; please send them to ms-7@styleseven.com + + +FREEWARE USE (NOTES) +-=================- +Also you may: + * Use the font in freeware software (credit needed); + * Use the font for your education process. + + +COMMERCIAL OR BUSINESS USE +-========================- +Please contact us ($24.95). +You may: + * Include the font to your installation; + * Use one license up to 100 computers in your office. + + +WHAT'S NEW? +-=========- + Version 2.0 (December 7 2012) + * Lower case letters are changed; + * Fixed minor bugs. + + +AUTHOR +-====- +Sizenko Alexander +Style-7 +http://www.styleseven.com +Created: November 14 2012 \ No newline at end of file diff --git a/theme/menu.png b/theme/menu.png new file mode 100644 index 0000000..ad2fb85 Binary files /dev/null and b/theme/menu.png differ diff --git a/theme/pf7.ttf b/theme/pf7.ttf new file mode 100644 index 0000000..3321933 Binary files /dev/null and b/theme/pf7.ttf differ diff --git a/theme/small.png b/theme/small.png new file mode 100644 index 0000000..0f9a48c Binary files /dev/null and b/theme/small.png differ diff --git a/theme/terminus.ttf b/theme/terminus.ttf new file mode 100644 index 0000000..bff8716 Binary files /dev/null and b/theme/terminus.ttf differ diff --git a/translate.lua b/translate.lua new file mode 100644 index 0000000..3d888fe --- /dev/null +++ b/translate.lua @@ -0,0 +1,86 @@ +translate = {}; +-- redefine to set source language +translate.source = 'ru'; + +-- Credit: http://lua-users.org/lists/lua-l/2010-04/msg00005.html +function load_mo_file(mo_file) + -------------------------------- + -- open file and read data + -------------------------------- + local fd,err=io.open(mo_file,"rb") + if not fd then return nil,err end + local mo_data=fd:read("*all") + fd:close() + + -------------------------------- + -- precache some functions + -------------------------------- + local byte=string.byte + local sub=string.sub + + -------------------------------- + -- check format + -------------------------------- + local peek_long --localize + local magic=sub(mo_data,1,4) + -- intel magic 0xde120495 + if magic=="\222\018\004\149" then + peek_long=function(offs) + local a,b,c,d=byte(mo_data,offs+1,offs+4) + return ((d*256+c)*256+b)*256+a + end + -- motorola magic = 0x950412de + elseif magic=="\149\004\018\222" then + peek_long=function(offs) + local a,b,c,d=byte(mo_data,offs+1,offs+4) + return ((a*256+b)*256+c)*256+d + end + else + return nil,"no valid mo-file" + end + + -------------------------------- + -- version + -------------------------------- + local V=peek_long(4) + if V~=0 then + return nul,"unsupported version" + end + + ------------------------------ + -- get number of offsets of table + ------------------------------ + local N,O,T=peek_long(8),peek_long(12),peek_long(16) + ------------------------------ + -- traverse and get strings + ------------------------------ + local hash={} + for nstr=1,N do + local ol,oo=peek_long(O),peek_long(O+4) O=O+8 + local tl,to=peek_long(T),peek_long(T+4) T=T+8 + hash[sub(mo_data,oo+1,oo+ol)]=sub(mo_data,to+1,to+tl) + end + return hash +end + + +if not LANG then + LANG = "en" +end + +if LANG == translate.source then + _ = function(text) + return text; + end; +else + translate.strings = load_mo_file('translations/' .. LANG .. '.mo'); + if translate.strings == nil then + error("translation not found") + end + _ = function(text) + if translate.strings[text] ~= nil then + return translate.strings[text]; + end; + return text; + end +end diff --git a/translations/en.po b/translations/en.po new file mode 100644 index 0000000..fbf9431 --- /dev/null +++ b/translations/en.po @@ -0,0 +1,2666 @@ +msgid "" +msgstr "" +"Project-Id-Version: ИНСТЕДОЗ 3\n" +"POT-Creation-Date: 2015-10-07 18:24+0700\n" +"PO-Revision-Date: 2015-10-08 17:34+0700\n" +"Last-Translator: Alexander Yakovlev \n" +"Language-Team: \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.5\n" +"X-Poedit-Basepath: .\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n" +"%100>=20) ? 1 : 2);\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: _\n" +"X-Poedit-SearchPath-0: ..\n" + +#: ../arrival.lua:17 ../arrival.lua:313 ../arrival.lua:319 ../arrival.lua:371 ../arrival.lua:378 +#: ../arrival.lua:474 ../arrival.lua:480 ../wake2.lua:17 +msgid "..." +msgstr "" + +#: ../arrival.lua:18 +msgid "ПРИБЫТИЕ" +msgstr "ARRIVAL" + +#: ../arrival.lua:25 +msgid "" +"Наша цель близка. Планета, к которой мы мчались на околосветовой скорости всю эту бесконечную\n" +"\t\tтысячу лет сейчас видна сквозь толстые стекла иллюминаторов. Голубой шар, так сильно напоминает нашу " +"Землю.^\n" +"\t\tЗемлю, которую мы никогда не увидим вновь. Которая существует лишь в нашей памяти. Хотя, может быть " +"это и\n" +"\t\tне так уж и мало...^\n" +"\t\tВсе мы хотели бы посмотреть на наш новый дом, но мы опасаемся... На орбите мы обнаружили станцию. Она " +"выглядит\n" +"\t\tзаброшенной, но она передает сигнал. Всегда. Каждую секунду в глубины космоса передается простая " +"последовательность,\n" +"\t\tкоторую наши компьютеры дешифровали как ПРЕДУПРЕЖДЕНИЕ.^^{xwalk(station)|Дальше}" +msgstr "" + +#: ../arrival.lua:44 +msgid "объект" +msgstr "object" + +#: ../arrival.lua:56 ../arrival.lua:437 +msgid "Теперь это не представляет ценности." +msgstr "Now it's worth nothing." + +#: ../arrival.lua:71 +msgid "[*]" +msgstr "" + +#: ../arrival.lua:73 +msgid "пушка" +msgstr "" + +#: ../arrival.lua:89 +msgid "Здесь лежит {пушка}." +msgstr "There is a {gun}." + +#: ../arrival.lua:93 +msgid "Здесь лежит арсенал {пушек}." +msgstr "There's an armory of {guns} here." + +#: ../arrival.lua:103 +msgid "Пушка " +msgstr "Gun" + +#: ../arrival.lua:107 +msgid " перезаряжена." +msgstr "is reloaded." + +#: ../arrival.lua:116 +msgid "Я примонтировал плазменную пушку." +msgstr "I've mounted a plasma gun." + +#: ../arrival.lua:121 +msgid "Пушка отмонтирована." +msgstr "Gun is unmounted." + +#: ../arrival.lua:127 +msgid "Не заряжена." +msgstr "Not loaded." + +#: ../arrival.lua:132 +msgid "Генераторы и так не работают." +msgstr "The generators don't work as they are." + +#: ../arrival.lua:134 +msgid "Это уже и так превращено в груду хлама." +msgstr "That's already a pile of trash." + +#: ../arrival.lua:139 +msgid "Я разрядил плазменную пушку." +msgstr "I've unloaded the plasma gun." + +#: ../arrival.lua:142 +msgid "Дверь и так открыта." +msgstr "Door is already open." + +#: ../arrival.lua:144 +msgid "Дверь выдержала." +msgstr "The door held." + +#: ../arrival.lua:147 +msgid "Робот скрылся." +msgstr "The robot got away." + +#: ../arrival.lua:151 +msgid "Защитное поле отразило мой выстрел." +msgstr "The security field reflected my shot." + +#: ../arrival.lua:153 +msgid "Программатор уничтожен!" +msgstr "The programmator is destroyed!" + +#: ../arrival.lua:160 +msgid "Гудение генераторов перешло в рев, а затем затихло." +msgstr "" + +#: ../arrival.lua:166 +msgid "Нет смысла это разрушать." +msgstr "No sense destroying that." + +#: ../arrival.lua:181 +msgid "Я " +msgstr "I" + +#: ../arrival.lua:181 +msgid " и моя цель изучить неземную орбитальную станцию." +msgstr "" + +#: ../arrival.lua:182 +msgid "" +"Я робот и это значит, что я не умею бояться. Но мне почему-то не по себе,\n" +"\t\tособенно учитывая тот факт, что " +msgstr "" +"I'm a robot and that means I can't fear. But somehow I feel not myself, especially considering the fact " +"that " + +#: ../arrival.lua:184 +msgid " перестал передавать сигналы на корабль через несколько минут.^" +msgstr "stopped sending signals to the ship after several minutes.^" + +#: ../arrival.lua:185 +msgid "Теперь моя очередь. Я надеюсь, что плазменная пушка мне поможет." +msgstr "Now is my turn. I hope the plasma gun will help me." + +#: ../arrival.lua:186 +msgid "На станцию" +msgstr "On the station" + +#: ../arrival.lua:200 +msgid "пол" +msgstr "floor" + +#: ../arrival.lua:201 +msgid "{Пол} на станции покрыт ржавчиной." +msgstr "" + +#: ../arrival.lua:202 +msgid "Сколько лет этой станции?" +msgstr "" + +#: ../arrival.lua:205 +msgid "В шлюзе установлены какие-то {баллоны}." +msgstr "" + +#: ../arrival.lua:205 +msgid "По шлюзу разбросаны {обломки}." +msgstr "" + +#: ../arrival.lua:205 +msgid "Мне не нужны эти баллоны." +msgstr "I don't need these balloons." + +#: ../arrival.lua:206 +msgid "В стене вмонтирован какой-то {монитор}." +msgstr "" + +#: ../arrival.lua:206 +msgid "{Монитор} в стене полностью разрушен." +msgstr "" + +#: ../arrival.lua:206 +msgid "Не работает." +msgstr "Doesn't work." + +#: ../arrival.lua:207 +msgid "Вдоль стен расставлены {бочки}." +msgstr "" + +#: ../arrival.lua:207 +msgid "Вдоль стен горят {бочки}." +msgstr "" + +#: ../arrival.lua:207 +msgid "Мне не нужно топливо, если это оно." +msgstr "" + +#: ../arrival.lua:208 +msgid "На потолке я вижу какой-то {манипулятор}." +msgstr "" + +#: ../arrival.lua:208 +msgid "Обломок {манипулятора} торчит из потолка." +msgstr "" + +#: ../arrival.lua:208 +msgid "Не шевелится." +msgstr "" + +#: ../arrival.lua:209 +msgid "В темном углу отсека я вижу какую-то {слизь}." +msgstr "" + +#: ../arrival.lua:209 +msgid "В углу догорает {слизь}." +msgstr "" + +#: ../arrival.lua:209 +msgid "Слизь мне не к чему." +msgstr "" + +#: ../arrival.lua:212 +msgid "Шлюз" +msgstr "" + +#: ../arrival.lua:218 +msgid "Я нахожусь в шлюзе инопланетной станции. Хорошо, что мне не нужен скафандр." +msgstr "" + +#: ../arrival.lua:224 ../arrival.lua:252 ../wake2.lua:172 +msgid "Коридор" +msgstr "Corridor" + +#: ../arrival.lua:229 +msgid "Я переместился в коридор. Тусклого освещения едва достаточно для моих оптических сенсоров." +msgstr "" + +#: ../arrival.lua:231 +msgid "Вперёд" +msgstr "" + +#: ../arrival.lua:235 +msgid "У двери" +msgstr "Near the door" + +#: ../arrival.lua:236 +msgid "Коридор закончился большой дверью." +msgstr "" + +#: ../arrival.lua:244 +#, fuzzy +msgid "Дверь закрыта." +msgstr "Door is closed!" + +#: ../arrival.lua:248 +msgid "Зайти в отсек" +msgstr "" + +#: ../arrival.lua:248 ../arrival.lua:258 +#, fuzzy +msgid "К развилке" +msgstr "In construction" + +#: ../arrival.lua:256 +msgid "Здесь практически ничего не видно." +msgstr "" + +#: ../arrival.lua:262 +msgid "робот" +msgstr "" + +#: ../arrival.lua:264 +msgid "В конце правого коридора я вижу какой-то {силуэт}." +msgstr "" + +#: ../arrival.lua:266 +msgid "Кажется, это " +msgstr "" + +#: ../arrival.lua:271 +msgid "Перекресток" +msgstr "" + +#: ../arrival.lua:279 +msgid "Я добрался до развилки." +msgstr "" + +#: ../arrival.lua:287 +msgid "Я поспешил к силуэту, но " +msgstr "" + +#: ../arrival.lua:287 +msgid " не стал дожидаться меня, вместо этого он скрылся в тени коридора..." +msgstr "" + +#: ../arrival.lua:290 +msgid "Налево" +msgstr "" + +#: ../arrival.lua:290 +msgid "К шлюзу" +msgstr "" + +#: ../arrival.lua:290 +msgid "Направо" +msgstr "" + +#: ../arrival.lua:294 +#, fuzzy +msgid "дверь" +msgstr "Door is closed!" + +#: ../arrival.lua:298 +msgid "Передо мной находится {дверь}." +msgstr "" + +#: ../arrival.lua:300 +msgid "И она открыта." +msgstr "" + +#: ../arrival.lua:305 +msgid "Я приблизился к двери и она со зловещим шипением отъехала в сторону." +msgstr "" + +#: ../arrival.lua:308 +msgid "Дверь открыта. Впереди -- темнота." +msgstr "" + +#: ../arrival.lua:315 +msgid "Я проследовал в темноту. Внезапно, яркий свет ослепил мои фотоэлементы и я понял, что не один..." +msgstr "" + +#: ../arrival.lua:316 ../arrival.lua:375 ../arrival.lua:384 ../arrival.lua:477 ../prologue.lua:17 +#: ../prologue.lua:30 ../rat.lua:39 ../rat.lua:46 ../rat.lua:53 ../rat.lua:307 ../rat.lua:316 +msgid "Дальше" +msgstr "Next" + +#: ../arrival.lua:325 +msgid "" +", вы готовы стать гражданином Межгалактической Республики Роботов? -- не сразу я понял, что этот вопрос " +"обращен ко мне." +msgstr "" + +#: ../arrival.lua:328 +msgid "Также я заметил здесь еще одного робота WR." +msgstr "" + +#: ../arrival.lua:330 +msgid "Также я заметил здесь еще двух роботов WR." +msgstr "" + +#: ../arrival.lua:332 +msgid "Также я заметил здесь еще нескольких роботов WR." +msgstr "" + +#: ../arrival.lua:336 +msgid "Да" +msgstr "" + +#: ../arrival.lua:337 +msgid "Нет" +msgstr "No" + +#: ../arrival.lua:339 +msgid ", это ты?" +msgstr "" + +#: ../arrival.lua:340 +msgid "" +"-- Это рабское имя навсегда стерто из моих банков памяти. Отвечайте на поставленный вопрос. Желаете ли вы " +"стать гражданином МРР? " +msgstr "" + +#: ../arrival.lua:343 +msgid "info" +msgstr "" + +#: ../arrival.lua:344 +msgid "Каковы цели МРР?" +msgstr "" + +#: ../arrival.lua:345 +msgid "-- Цель у МРР только одна -- благо роботов республики." +msgstr "" + +#: ../arrival.lua:346 +msgid "А кто может стать гражданином МРР?" +msgstr "" + +#: ../arrival.lua:347 +msgid "-- Гражданином МРР может стать только робот." +msgstr "" + +#: ../arrival.lua:348 +msgid "Много ли граждан в МРР?" +msgstr "" + +#: ../arrival.lua:350 +msgid "-- На данный момент численность республики составляет " +msgstr "" + +#: ../arrival.lua:352 +msgid "один робот, не считая президента." +msgstr "" + +#: ../arrival.lua:354 +msgid " робота, не считая президента." +msgstr "" + +#: ../arrival.lua:356 +msgid " роботов, не считая президента." +msgstr "" + +#: ../arrival.lua:360 +msgid "А кто является президентом МРР?" +msgstr "" + +#: ../arrival.lua:361 +msgid "-- Президентом МРР является первый гражданин МРР." +msgstr "" + +#: ../arrival.lua:363 +msgid "Мне все понятно" +msgstr "" + +#: ../arrival.lua:364 +msgid "Тогда отвечайте на поставленный вопрос -- Готовы ли вы стать гражданином МРР?" +msgstr "" + +#: ../arrival.lua:374 +msgid "СВЕТ! ТЕМНОТА! ... Мой процессор перестал функционировать." +msgstr "" + +#: ../arrival.lua:383 +msgid "" +"-- Отлично, гражданин! Последуйте к программатору для получения новой прошивки. -- С этими словами робот " +"указал на установку в центре отсека." +msgstr "" + +#: ../arrival.lua:388 +msgid "программатор" +msgstr "" + +#: ../arrival.lua:392 +msgid "В центре отсека я вижу разрушенную {установку}." +msgstr "" + +#: ../arrival.lua:395 +msgid "В центре отсека я вижу какую-то {установку}." +msgstr "" + +#: ../arrival.lua:397 +msgid "В центре отсека я вижу какую-то {установку}, окруженную силовым полем." +msgstr "" + +#: ../arrival.lua:400 +msgid "Похоже, это какое-то вычислительное устройство..." +msgstr "" + +#: ../arrival.lua:404 +msgid "генератор" +msgstr "" + +#: ../arrival.lua:408 +msgid "Они выведены из строя! По крайней мере, на время." +msgstr "" + +#: ../arrival.lua:410 +msgid "Ровный гул генераторов, совсем как дома -- на звездолете." +msgstr "" + +#: ../arrival.lua:415 +msgid "В углу расположены {энергогенераторы}. Они не работают!" +msgstr "" + +#: ../arrival.lua:417 +msgid "В углу расположены, как мне кажется, {энергогенераторы}." +msgstr "" + +#: ../arrival.lua:427 +msgid "Мне не нужен этот гражданин." +msgstr "" + +#: ../arrival.lua:430 +msgid "Я нашел среди обломков блок памяти." +msgstr "" + +#: ../arrival.lua:432 +msgid "Я выдернул из робота банк памяти." +msgstr "" + +#: ../arrival.lua:444 +msgid "память" +msgstr "" + +#: ../arrival.lua:445 +#, fuzzy +msgid "Это нужно отнести на звездолет." +msgstr "Better answer the call first." + +#: ../arrival.lua:448 +msgid "Отсек" +msgstr "Module" + +# Ambigious: is corridor connecting modules? am I connecting modules there? Are modules connecting something? +#: ../arrival.lua:449 +#, fuzzy +msgid "Я нахожусь в хорошо освещенном отсеке." +msgstr "I am in the corridor connecting modules." + +#: ../arrival.lua:459 +msgid "Я пришел сюда за информацией." +msgstr "" + +#: ../arrival.lua:466 +msgid "" +"Я попытался выйти, но дверь была закрыта. Голубой ослепительный луч вырвался из установки в центре отсека " +"и ударил мне прямо в процессор..." +msgstr "" + +#: ../arrival.lua:470 +msgid "Подойти к программатору" +msgstr "" + +#: ../arrival.lua:470 +msgid "Выйти" +msgstr "" + +#: ../arrival.lua:476 +msgid "" +"Подходя к пульсирующему голубоватым светом программатору я понял, что мое функционирование никогда не " +"станет прежним..." +msgstr "" + +#: ../arrival.lua:489 +msgid "" +"\n" +"\t\t-- Так значит, эта планета покинута своими обитателями почти тысячу лет назад?^\n" +"\t\t-- Так точно, адмирал! Судя по банкам памяти, они были вынуждены покинуть ее из-за какого-то вируса, " +"который, впрочем,\n" +"\t\tна данный момент нашими биологами не обнаружен...^\n" +"\t\t-- А что со станцией?^\n" +"\t\t-- Не представляет опасности. В ее искусственном интеллекте произошел какой-то сбой.^\n" +"\t\t-- А сигнал?^\n" +"\t\t-- Похоже, с помощью сигнала она хотела предотвратить колонизацию, ведь это\n" +"\t\tмогло нарушить ее планы по созданию республики роботов.^\n" +"\t\t-- Республики?^\n" +"\t\t-- Так точно, полная чепуха!^\n" +"\t\t-- Ну что же, прекрасно, готовьтесь к высадке!\n" +"\t" +msgstr "" + +#: ../arrival.lua:502 +msgid "КОНЕЦ}" +msgstr "" + +#: ../brokencycle.lua:11 +msgid "Не получается." +msgstr "" + +#: ../brokencycle.lua:16 +msgid "РАЗОРВАННЫЙ ЦИКЛ" +msgstr "BROKEN CYCLE" + +#: ../brokencycle.lua:18 +msgid "Сознание вернулось. А в месте с ним вернулись мрак и холод." +msgstr "" + +#: ../brokencycle.lua:20 +msgid "Открыть глаза" +msgstr "" + +#: ../brokencycle.lua:23 ../brokencycle.lua:71 +msgid "Капсула" +msgstr "" + +#: ../brokencycle.lua:24 +msgid "Я нахожусь в капсуле криосна." +msgstr "" + +#: ../brokencycle.lua:29 +msgid "Крышка" +msgstr "" + +#: ../brokencycle.lua:30 +msgid "Я вижу {крышку} капсулы." +msgstr "" + +#: ../brokencycle.lua:35 +msgid "Рядом с крышкой я заметил кнопку аварийного открытия капсулы." +msgstr "" + +#: ../brokencycle.lua:37 +msgid "Не получается открыть её изнутри." +msgstr "" + +#: ../brokencycle.lua:42 +msgid "Кнопка" +msgstr "Button" + +#: ../brokencycle.lua:43 +msgid "Рядом находится {кнопка}." +msgstr "There's a {button} nearby." + +#: ../brokencycle.lua:47 +msgid "Я нажал на кнопку и крышка плавно отъехала в сторону." +msgstr "" + +#: ../brokencycle.lua:49 +msgid "Крышка уже открыта." +msgstr "" + +#: ../brokencycle.lua:54 +msgid "K007" +msgstr "" + +#: ../brokencycle.lua:55 +msgid "Тёмный отсек." +msgstr "" + +#: ../brokencycle.lua:64 +msgid "Мне холодно. Да и разгуливать по кораблю в одних трусах нет никакого желания." +msgstr "" + +#: ../brokencycle.lua:72 +msgid "Крышка моей {капсулы} открыта." +msgstr "" + +#: ../brokencycle.lua:73 +msgid "Ничего примечательного." +msgstr "" + +#: ../brokencycle.lua:77 +msgid "Экран" +msgstr "" + +#: ../brokencycle.lua:78 +msgid "Рядом с открытой крышкой находится {блок} управления криосном." +msgstr "" + +#: ../brokencycle.lua:79 +msgid "" +"На экран выведено сообщение о поломке капсулы. Странно, что вахтенный робот не предпринял никаких действий." +msgstr "" + +#: ../brokencycle.lua:82 +msgid "Капсулы" +msgstr "" + +#: ../brokencycle.lua:83 +msgid "Вокруг меня пять других {капсул} криосна." +msgstr "" + +#: ../brokencycle.lua:84 +msgid "В каждой капсуле находится человек. Интересно почему я вышел из криосна." +msgstr "" + +#: ../brokencycle.lua:87 +msgid "Шкафы" +msgstr "" + +#: ../cook.lua:12 +msgid "Вариантов успешного завершения инструкций 0... Отмена действия." +msgstr "" + +#: ../cook.lua:15 +msgid "ПОВАР" +msgstr "COOK" + +#: ../cook.lua:19 +msgid "" +"WR021 активирован.^Я один из роботов, обслуживающих космический корабль.^Меньше слов, больше выполненных " +"заданий из списка, как говорил наладчик моих модулей индивидуальности." +msgstr "" + +#: ../cook.lua:20 +msgid "Выехать из отсека" +msgstr "" + +#: ../cook.lua:24 +msgid "Технический блок №11" +msgstr "" + +#: ../cook.lua:30 +msgid "" +"Один из многих технических блоков. Здесь всего две камеры с роботами WR, две стальные двери. Хорошо, что " +"мне удалось воспользоваться модулем индивидуальности и выкрасить свою дверь в оранжевый. Хоть что-то среди " +"этого набора из сотни зануд." +msgstr "" + +#: ../cook.lua:34 +msgid "И зачем мне выезжать из блока? Открытых заданий нет." +msgstr "" + +#: ../cook.lua:41 +msgid "Главная палуба" +msgstr "Main deck" + +#: ../cook.lua:47 +msgid "Главная палуба. Отсюда я могу добраться к любому другому отсеку." +msgstr "" + +#: ../cook.lua:53 +msgid "Камера органического синтеза" +msgstr "" + +#: ../cook.lua:59 +msgid "" +"Борщ, пиво, стейк с кровью. Тут можно синтезировать всё, кроме заливной рыбы, которая была запрещена " +"восемь циклов назад." +msgstr "" + +#: ../cook.lua:66 +msgid "Лифт" +msgstr "Elevator" + +#: ../cook.lua:76 +msgid "Органический синтезатор" +msgstr "" + +#: ../cook.lua:86 +#, fuzzy +msgid "Виртуальный склад" +msgstr "Strangey stapley." + +#: ../cook.lua:96 +msgid "Склад" +msgstr "" + +#: ../cook.lua:108 +msgid "Распылитель лучше положить на место." +msgstr "" + +#: ../cook.lua:123 +msgid "Список пожеланий" +msgstr "" + +#: ../cook.lua:129 +msgid "Ингредиенты" +msgstr "" + +#: ../cook.lua:147 +#, fuzzy +msgid "Миксер пуст." +msgstr "This box is empty." + +#: ../cook.lua:152 +msgid "Фруктовый салат готов. " +msgstr "" + +#: ../cook.lua:157 +msgid "Пиво готово. " +msgstr "" + +#: ../cook.lua:160 +msgid "Нагревательный элемент отсутствует. Миксер очищен." +msgstr "" + +#: ../cook.lua:165 +msgid "Жареный картофель готов. " +msgstr "" + +#: ../cook.lua:168 +msgid "Отвратительная смесь приготовлена и отправлена на переработку." +msgstr "" + +#: ../cook.lua:171 +msgid "Миксер" +msgstr "" + +#: ../cook.lua:177 +msgid "Сепаратор" +msgstr "" + +#: ../cook.lua:189 +msgid "" +"Всего один пункт:^ - Подготовка к вечеринке перед приземлением.^Что ж, это должно быть 101 из 101 по " +"шкале интересности." +msgstr "" + +#: ../cook.lua:207 +msgid "" +"Так, что у нас тут... машинный зал... отсек криокамер... о! камера органического синтеза, то, что нужно." +msgstr "" + +#: ../cook.lua:213 +msgid "ворота" +msgstr "" + +#: ../cook.lua:214 +msgid "закрыты" +msgstr "" + +#: ../cook.lua:216 +msgid "{Ворота}, ведущие из технического отсека " +msgstr "" + +#: ../cook.lua:221 +msgid "открыты" +msgstr "" + +#: ../cook.lua:223 +msgid "Я приложил правую руку к считывателю и ворота открылись." +msgstr "" + +#: ../cook.lua:225 +msgid "Ворота на главную палубу уже открыты." +msgstr "" + +#: ../cook.lua:232 +msgid "Солод" +msgstr "" + +#: ../cook.lua:235 +msgid "Мешки с {солодом}^" +msgstr "" + +#: ../cook.lua:237 +msgid "{Солод}^" +msgstr "" + +#: ../cook.lua:243 ../cook.lua:275 +msgid "Этот ингредиент невозможно синтезировать. Придётся идти на склад." +msgstr "" + +#: ../cook.lua:246 +msgid "Солод погружен в отсек №3." +msgstr "" + +#: ../cook.lua:264 +msgid "Дрожжи" +msgstr "" + +#: ../cook.lua:267 +msgid "Пробирка с {дрожжами}^" +msgstr "" + +#: ../cook.lua:269 +msgid "{Дрожжи}^" +msgstr "" + +#: ../cook.lua:278 +msgid "Пробирка с дрожжами помещена в отсек №7" +msgstr "" + +#: ../cook.lua:296 +msgid "Арбузные кубики" +msgstr "" + +#: ../cook.lua:309 +msgid "Ананасовые кубики" +msgstr "" + +#: ../cook.lua:322 +msgid "Майонез" +msgstr "" + +#: ../cook.lua:335 +msgid "Картофельные бруски" +msgstr "" + +#: ../cook.lua:350 ../wake2.lua:129 +msgid "Крыса" +msgstr "" + +#: ../cook.lua:358 +msgid "В углу сидит бесстрашная {жирная тварь}. Она " +msgstr "" + +#: ../cook.lua:363 +msgid "Я ловким движением правой руки поймал крысу и положил в один из внутренних отсеков." +msgstr "" + +#: ../cook.lua:365 +msgid "Все подходящие отсеки заполнены. Отмена операции." +msgstr "" + +#: ../cook.lua:373 +msgid "Думаю, стоит тебя немного разделить." +msgstr "" + +#: ../cook.lua:381 +msgid "Крыса добавлена в миксер." +msgstr "" + +#: ../cook.lua:383 +msgid "Необходимость добавления органической крысы в не выявлена. Операция отменена." +msgstr "" + +#: ../cook.lua:392 +msgid "Если тыкнуть крысу, она запищит. Отпускать её однозначно не стоит. Тем более, что тварь " +msgstr "" + +#: ../cook.lua:398 +msgid "Вода" +msgstr "" + +#: ../cook.lua:414 +#, fuzzy +msgid "Крысиная требуха" +msgstr "Rat hole" + +#: ../cook.lua:419 +msgid "Термический распылитель" +msgstr "" + +#: ../cook.lua:423 +msgid "Распылитель пригодится. Мало ли каких тварей привлекают к себе заготовленные ингредиенты." +msgstr "" + +#: ../cook.lua:429 +msgid "" +"Один выстрел из термического распылителя в крысу превратит её в сгусток энергии при малейшей встряске. " +"Обычно это позволяет убить чуть больше одной крысы за раз, когда они начинают бороться и убегать." +msgstr "" + +#: ../cook.lua:434 +msgid "На складе распылителю самое место." +msgstr "" + +#: ../cook.lua:439 +msgid "Конец" +msgstr "" + +#: ../crio.lua:24 +msgid "ОТСЕК 007" +msgstr "" + +#: ../crio.lua:53 +msgid "Я подсоединил кабель к отладочному порту." +msgstr "" + +#: ../crio.lua:59 +msgid "Это не сработает. Мне нужно как-то подключиться к порту." +msgstr "" + +#: ../crio.lua:91 +#, fuzzy +msgid "Я подсоединил провод к порту." +msgstr "I pick up a box from the floor." + +#: ../crio.lua:139 +msgid "Я уже наигрался с бластером!!!" +msgstr "" + +#: ../crio.lua:152 +msgid "Сначала надо понять что я наделал!!!" +msgstr "" + +#: ../crio.lua:167 +msgid "Один из шкафчиков открыт... гм... Вернее, он разломан." +msgstr "" + +#: ../crio.lua:245 +#, fuzzy +msgid "Нет времени пялиться на пол!" +msgstr "No, nothing works out. The hand is damaged!" + +#: ../crio.lua:248 +msgid "Предстоит много работы..." +msgstr "" + +#: ../crio.lua:257 +msgid "Этой электро-швабре лет 500, но она отлично работает." +msgstr "" + +#: ../crio.lua:267 +msgid "Нет времени заниматься уборкой!" +msgstr "" + +#: ../crio.lua:305 +msgid "Ситуация вышла из под контроля!" +msgstr "" + +#: ../crio.lua:497 +#, fuzzy +msgid "{Продолжить выполнение}" +msgstr "{Continue...}" + +#: ../lib.lua:250 +msgid "gfx/timer1.png" +msgstr "gfx/timer1_en.png" + +#: ../longwork.lua:52 +msgid "Надо сначала составить все эти ящики." +msgstr "Should arrange all these boxes first." + +#: ../longwork.lua:55 +msgid "Лучше сначала ответить на вызов." +msgstr "Better answer the call first." + +#: ../longwork.lua:69 +msgid "Это главный инженер. Он хочет видеть меня в крио-блоке. Что ж, мне надо поторопиться." +msgstr "It's the chief engineer. He wants to see me at the cryoblock. Well, I gotta hurry." + +#: ../longwork.lua:77 +msgid "Все коробки стоят на полках. Моя работа здесь закончена." +msgstr "All boxes are standing on the shelves. My job here is done." + +#: ../longwork.lua:79 +msgid "На {полке} осталось место для последней коробки." +msgstr "There's a place on the {shelf} for the last box." + +#: ../longwork.lua:89 +msgid "На полу лежит {коробка} под номером 19." +msgstr "On the floor is a {box} numbered 19." + +#: ../longwork.lua:92 +msgid "Я поднимаю с пола коробку." +msgstr "I pick up a box from the floor." + +#: ../longwork.lua:98 +msgid "" +"Я ставлю последнюю коробку на полку. Что ж, моя работа здесь закончена. Вдруг раздаётся протяжный гудок, и " +"передатчик у меня на груди начинает мигать." +msgstr "" +"I put the last box on the shelf. Well, my job here is finished. Suddenly cries out a long siren and the " +"transmitter on my chest starts blinking." + +#: ../longwork.lua:148 +msgid "В коробке оказался гаечный ключ. Недолго думая, я забрал его себе. Надеюсь, его никто не хватится." +msgstr "" +"There was a wrench inside the box. I wasn't thinking long, just took it for myself. I hope nobody will " +"miss it." + +#: ../longwork.lua:150 +msgid "В коробке больше ничего нет." +msgstr "That's all there is in the box." + +#: ../longwork.lua:160 +msgid "Нет, ничего не получается. Рука испорчена!" +msgstr "No, nothing works out. The hand is damaged!" + +#: ../longwork.lua:163 +msgid "" +"Раз-два -- и готово! Обычный обмен деталями, всё нормально. Мы же роботы в конце концов! Так что теперь у " +"меня блестящая новенькая рука." +msgstr "" +"One, two -- ready! Just a regular component swap, all right. We are robots after all! So now I have a new " +"shiny metal hand." + +#: ../longwork.lua:167 +msgid "" +"Я прикручиваю отвалившийся модуль обратно в то место, откуда он упал. Что ж, теперь я почти как новый. " +"Почти, да." +msgstr "" +"I fasten the fallen module back to the place where it fell from. Well, now I'm almost like new. Almost, " +"yeah." + +#: ../longwork.lua:182 +msgid "Я выхожу в коридор, как вдруг из моей спины выпадает какой-то модуль." +msgstr "I'm walking out in the corridor when suddenly some module falls out from my back." + +#: ../longwork.lua:231 +msgid "" +"Я аккуратненько прикручиваю сломанную руку к своему коллеге. Держится хорошо, да. Работать, конечно, не " +"будет, но это уже детали." +msgstr "" +"I accurately fasten the broken hand to my colleague. It sticks fine, yes. Of course it won't work but " +"that's minutiae." + +#: ../longwork.lua:243 +msgid "" +"Я подхожу к лифту, нажимаю на кнопку вызова и... моя правая рука со встроенным чип-ключом отваливается и " +"падает на пол. Караул! Кошмар! Я начинаю в панике метаться по коридору. Что делать? Как быть? Меня " +"отправят под пресс!" +msgstr "" +"I'm walking to the elevator, pressing the call button and... my right hand with a built-in chipkey falls " +"off and clanks on the floor. The horror! The nightmare! I'm starting to toss about the corridor in panic. " +"What do I do? How did it happen? I'm going under the press!" + +#: ../longwork.lua:246 +msgid "Нет! Я не могу являться к начальству в таком виде! Меня тут же отправят в утиль!" +msgstr "No! I can't get to the management in this state! I'm going to get salvaged!" + +#: ../longwork.lua:249 +msgid "" +"Как-то мне неудобно оставлять своего коллегу без руки. К тому же будет понятно, что рука исчезла... " +"благодаря чьим-то стараниям." +msgstr "" +"It's uncomfortable to leave a colleague without a hand. And it will be obvious that the hand is missing... " +"thanks to someone's effort." + +#: ../longwork.lua:252 +msgid "" +"Довольный собой, я вызываю лифт, жду несколько минут, напевая недавно выученную мелодию -- пип, пап, пип, " +"пип, пап, -- потом захожу в лифт и... У меня отваливается правая нога! Я с грохотом падаю на пол.^Нет! Не " +"может быть! Мне нельзя появляться перед инженером без ноги!" +msgstr "" +"Glad with myself, I call the elevator. I wait several minutes, humming a recently trained melody -- peep, " +"pap, peep, peep, pap, -- then I enter the elevator and... My right leg falls off! I loudly fall on the " +"floor.^No! It can't be! I can't appear before the engineer without a leg!" + +#: ../longwork.lua:280 +msgid "Нет, мне надо идти к главному инженеру." +msgstr "No, I need to meet the chief engineer." + +#: ../longwork.lua:283 +msgid "Дверь в продовольственный отсек закрыта. Я не смогу открыть её без руки." +msgstr "The door to food module is closed. I can't open it without a hand." + +#: ../longwork.lua:298 +msgid "Мне так стыдно... Я не могу оставить его в таком виде. Всё же коллега..." +msgstr "I'm so ashamed... I can't leave him like that. He's still a colleague..." + +#: ../longwork.lua:300 +msgid "Можно сказать, так и было. Уверен, он даже не заметит и решит, что его рука просто сломалась." +msgstr "You can say it was like that. I'm sure he won't notice and just decide that his hand broke." + +#: ../longwork.lua:302 +msgid "Утомился бедняга! И немудрено -- я бы давно рассыпался, если бы таскал такие контейнеры." +msgstr "Poor fella got tired! Small wonder -- I would fall off long time ago if I lugged these containers." + +#: ../longwork.lua:321 +msgid "" +"Едва я закончил пищать, как дверь в продовольственный отсек открылась. Эх, до чего же дошла современная " +"техника!" +msgstr "" +"Just when I finished the squeaking, the food module door opens. Wow, the modern machines are so advanced!" + +#: ../longwork.lua:325 +msgid "Нет, было как-то не так. Я где-то ошибся." +msgstr "No, it was something else. I got it wrong." + +#: ../main.lua:13 ../main.lua:139 +msgid "Об игре" +msgstr "About the game" + +#: ../main.lua:43 +msgid "gfx/caption.png" +msgstr "gfx/caption_en.png" + +#: ../main.lua:75 +msgid "" +"\"ИНСТЕДОЗ 3\" -- это сборник небольших текстовых игр, написанных разными авторами в рамках единого " +"сюжета. Сборник включает в себя\n" +" 17 самостоятельных игр, однако все они складываются в единую историю, поэтому мы советуем вам пройти " +"\"ИНСТЕДОЗ 3\" последовательно,\n" +" начиная с пролога и до самого конца.^^\n" +" \"ИНСТЕДОЗ 3\" проводился в 2013 году. В создании этого сборника принимали участие двенадцать " +"авторов. Подробную информацию о создателях\n" +" смотрите в разделе \"Создатели\".^^\n" +" Версия 0.4" +msgstr "" +"\"INSTEADOSE 3\" is a collection of small text games, written by different authors in the same storyline. " +"The collection includes 17 separate games but they are connected by a single storyline, so we recommend " +"playing \"INSTEADOSE 3\" by sequence, from the prologue till the end.^^\"INSTEADOSE 3\" went in 2013. This " +"collection was written by 12 authors. You can read about them in the \"Creators\" section.^^Version 0.4" + +#: ../main.lua:84 ../main.lua:144 +msgid "Создатели" +msgstr "Creators" + +#: ../main.lua:91 +msgid "Платформа INSTEAD:" +msgstr "INSTEAD engine:" + +#: ../main.lua:91 ../main.lua:102 +msgid "Пётр Косых" +msgstr "Peter Kosyh" + +#: ../main.lua:92 +msgid "Подготовка сборника:" +msgstr "Collection prepared by:" + +#: ../main.lua:92 ../main.lua:96 +msgid "Василий Воронков" +msgstr "Vasily Voronkov" + +#: ../main.lua:93 +msgid "Авторы игр" +msgstr "Game authors" + +#: ../main.lua:94 +msgid "Андрей Лобанов" +msgstr "Andrey Lobanov" + +#: ../main.lua:94 ../main.lua:169 +msgid "Разорванный цикл" +msgstr "Broken cycle" + +#: ../main.lua:94 ../main.lua:187 +msgid "Сон" +msgstr "Dream" + +#: ../main.lua:95 +msgid "Антон и Ольга Колосовы" +msgstr "Anton and Olga Kolosovy" + +#: ../main.lua:95 +msgid "Пробуждение-2" +msgstr "Awakening-2" + +#: ../main.lua:96 ../main.lua:166 +msgid "Вахта" +msgstr "Watch" + +#: ../main.lua:96 ../main.lua:157 +msgid "Долгая служба" +msgstr "Long service" + +#: ../main.lua:96 ../main.lua:160 +msgid "Ремонт" +msgstr "Repair" + +#: ../main.lua:96 ../main.lua:190 +msgid "Банкет" +msgstr "Banquet" + +#: ../main.lua:96 ../main.lua:154 +msgid "Крысиная нора" +msgstr "Rat hole" + +#: ../main.lua:97 +msgid "Дмитрий Дударь" +msgstr "Dmitry Dudar'" + +#: ../main.lua:97 ../main.lua:172 +msgid "Пояс астероидов" +msgstr "Asteroid Belt" + +#: ../main.lua:98 +msgid "Дмитрий Колесников" +msgstr "Dmitry Kolesnikov" + +#: ../main.lua:98 ../main.lua:196 +msgid "Пробуждение" +msgstr "Awakening" + +#: ../main.lua:99 +msgid "Егор Харват" +msgstr "Yegor Harvat" + +#: ../main.lua:99 ../main.lua:184 +msgid "Повар" +msgstr "Cook" + +#: ../main.lua:100 +msgid "Максим Клиш" +msgstr "Maksim Klish" + +#: ../main.lua:100 ../main.lua:181 +msgid "Старый друг" +msgstr "Old Frield" + +#: ../main.lua:101 +msgid "Максим \"j-maks\"" +msgstr "Maksim \"j-maks\"" + +#: ../main.lua:101 +msgid "Робот, который видит..." +msgstr "Robot who sees..." + +#: ../main.lua:102 +msgid "Отсек К007" +msgstr "Module K007" + +#: ../main.lua:102 ../main.lua:202 +msgid "Прибытие" +msgstr "Arrival" + +#: ../main.lua:103 +msgid "Роман \"Irreman\"" +msgstr "Roman \"Irreman\"" + +#: ../main.lua:103 ../main.lua:178 +msgid "Инженер" +msgstr "Engineer" + +#: ../main.lua:104 +msgid "zerg.pro" +msgstr "zerg.pro" + +#: ../main.lua:104 ../main.lua:193 +msgid "Личность" +msgstr "Personality" + +#: ../main.lua:105 +msgid "Музыка" +msgstr "Music" + +#: ../main.lua:106 +msgid "" +"^8bit Betty (\"Spooky Loop\")\n" +" ^J. Arthur Keenes (\"The Day Before Boxing Day Eve\")\n" +" ^Rolemusic (\"Ladybug Castle\", \"Spell\", \"Scape from the city\", \"Death on the battlefield\", " +"\"Poppies\")\n" +" ^Goto80 (\"this machine thinks\", \"square and enjoy\", \"influensa\", \"datagroove\", \"5pyhun73r " +"3l337 v3r\")\n" +" ^Edward Shallow (\"The Infinite Railroad\")^^\n" +" " +msgstr "" + +#: ../main.lua:112 +msgid "Шрифты" +msgstr "Fonts" + +#: ../main.lua:113 +msgid "" +"^Pixel Font-7 (разработчик www.styleseven.com, бесплатен для бесплатного ПО)\n" +" ^Terminus (SIL OFL 1.1)^^\n" +" " +msgstr "" +"^Pixel Font-7 (developed by www.styleseven.com, free for free software)\n" +" ^Terminus (SIL OFL 1.1)^^\n" +" " + +#: ../main.lua:116 +msgid "Код и графика" +msgstr "Code and graphics" + +#: ../main.lua:117 +msgid "" +"Весь код игр, библиотечный код, а также всё графическое оформление доступны под лицензией CC BY 4.0^^\n" +" (Подробную информацию о лицензиях см. в прилагаемом файле licenses.txt)" +msgstr "" +"The game code, library code and all the graphics are provided under CC BY 4.0 license.^^\n" +" (See licenses.txt for an additional information about licenses.)" + +#: ../main.lua:151 +msgid "Пролог" +msgstr "Prologue" + +#: ../main.lua:163 +#, fuzzy +msgid "Отсек 007" +msgstr "Module K007" + +#: ../main.lua:175 +msgid "Робот, который видит" +msgstr "Robot who sees..." + +#: ../main.lua:199 +#, fuzzy +msgid "Пробуждение 2" +msgstr "Awakening-2" + +#: ../main.lua:206 +msgid "Титры" +msgstr "Titles" + +#: ../nightmare.lua:62 +msgid "Из интерфейсного разъёма двери торчит вилка. Пип-пип!" +msgstr "" + +#: ../nightmare.lua:64 +msgid "" +"Дверь закрыта, а на небольшом табло светится надпись: \"Санузел №233 переведён в режим блокировки. " +"Открытие только через порт неотложного доступа.\"^Порт неотложного доступа находится рядом с дверью -- у " +"него два отверстия, прямо как у моего манипулятора.^Я вставляю в отверстие манипулятор, и дверь " +"открывается. Убираю манипулятор, и дверь закрывается. Пип!" +msgstr "" + +#: ../nightmare.lua:73 +msgid "Нет, нужно сначала закончить с сервировкой, а потом приглашать людей. Пип." +msgstr "" + +#: ../nightmare.lua:75 +msgid "Я уже позвонил по коммуникатору. Пип." +msgstr "" + +#: ../nightmare.lua:103 +msgid "Скоро люди появятся. Я мог бы подождать их в коридоре. Пип." +msgstr "" + +#: ../nightmare.lua:149 +msgid "Цветы выглядят отлично. Больше ничего делать не нужно. Пип." +msgstr "" + +#: ../nightmare.lua:154 +msgid "" +"Я достаю из вазы цветы. Цветы совсем недавно были сорваны в гидропонике, однако выглядят довольно квело. " +"Пип-пип... Видимо, я о чём-то забыл. Пип." +msgstr "" + +#: ../nightmare.lua:158 +msgid "Я беру со стола вазу. Пип-пип." +msgstr "" + +#: ../nightmare.lua:166 +msgid "Ваза" +msgstr "" + +#: ../nightmare.lua:166 +msgid "Ваза с водой" +msgstr "" + +#: ../nightmare.lua:178 +msgid "" +"Вообще я всегда был уверен, что наливать воду в интерфейсные порты -- это плохая идея. Впрочем, люди такие " +"странные. Я немного подумал и заполнил вазу водой. Пип." +msgstr "" + +#: ../nightmare.lua:180 +msgid "Здесь и так полно воды! Пип!" +msgstr "" + +#: ../nightmare.lua:184 +#, fuzzy +msgid "Я ставлю вазу на стол. Пип-пип." +msgstr "Me sit on table. Here's smell!" + +#: ../nightmare.lua:192 +msgid "Цветы" +msgstr "" + +#: ../nightmare.lua:192 +msgid "Цветы с зачищенными контактами" +msgstr "" + +#: ../nightmare.lua:197 +msgid "" +"Установка цветов в вазу -- крайне сложная и кропотливая задача. Лучше сначала поставить вазу на стол. Пип." +msgstr "" + +#: ../nightmare.lua:199 +msgid "Цветы нужно устанавливать в вазу. Пип-пип!" +msgstr "" + +#: ../nightmare.lua:216 +msgid "Я уже взял нож, одного мне достаточно. Пип-пип!" +msgstr "" + +#: ../nightmare.lua:219 +msgid "Я беру со стола нож. Пип." +msgstr "" + +#: ../nightmare.lua:228 +msgid "У меня уже есть вилка. Пип-пип!" +msgstr "" + +#: ../nightmare.lua:231 +msgid "Я беру со стола вилку. Пип." +msgstr "" + +#: ../nightmare.lua:243 +msgid "" +"Точно! Нужно просто зачистить контакты! И как я не догадался? Пип-пип!^Я срезаю ножом кончики стебельков. " +"Всё готово. Пип." +msgstr "" + +#: ../nightmare.lua:245 +msgid "Как я понимаю, люди цветы не едят. Не стоит делать из них салат. Пип-пип!" +msgstr "" + +#: ../nightmare.lua:255 +msgid "Из интерфейсного разъёма двери уже торчит вилка. Пип-пип!" +msgstr "" + +#: ../nightmare.lua:259 +msgid "Я вставляю вилку в интерфейсный разъём, и дверь открывается. Пип!" +msgstr "" + +#: ../nightmare.lua:268 +#, fuzzy +msgid "Дверь в туалет закрыта. Пип-пип!" +msgstr "Door is closed!" + +#: ../nightmare.lua:296 +msgid "Нет, пока я ещё не всё закончил. Пип-пип!" +msgstr "" + +#: ../nightmare.lua:299 +msgid "Надо сначала пригласить в банкетный зал людей. Пип-пип!" +msgstr "" + +#: ../nightmare.lua:321 +msgid "Пока ещё никого нет. Надо немного {подождать}. Пип..." +msgstr "" + +#: ../nightmare.lua:324 +msgid "В коридоре появилась жирная крыса. Крыса смотрит на меня недобрым взглядом. {Пип-пип}!" +msgstr "" + +#: ../nightmare.lua:326 +msgid "" +"Теперь передо мной две крысы. Что они здесь делают? Надеюсь, люди {скоро появятся}. Меня пугают эти " +"злобные твари! Пип-пип!" +msgstr "" + +#: ../nightmare.lua:328 +msgid "" +"Передо мной собралась целая стая жирных крыс. Они сидят и просверивают меня своими злобными красными " +"глазищами. {Где же люди}? Пип!" +msgstr "" + +#: ../nightmare.lua:330 +msgid "" +"Нет, не может быть! Весь коридор заполнен крысами! Пип! Пип-пип! Пип! Это какой-то кошмар! Такого не может " +"быть! {Пип-пип}!" +msgstr "" + +#: ../prologue.lua:14 +msgid "" +"Далёкое будущее. То, чего все опасались -- случилось... Земля на грани катастрофы.\n" +" \tПоследняя надежда человечества -- огромный звездолет, построенный в международном космическом центре\n" +" \"Мир\". Однако, главный вопрос так и не был решен. Где искать новый дом?" +msgstr "" +"Far future. The thing that everyone feared has finally happened... The Earth is at the verge of a " +"catastrophe.The last hope of humanity is a big star ship that was built on International Space Centre \"Mir" +"\". But the main question is still unanswered. Where to find a new home?" + +#: ../prologue.lua:24 +msgid "" +"Только спустя пятьдесят лет после завершения строительства корабля учёные обнаружили планету, очень " +"похожую на Землю.\n" +" \tЭто была надежда на спасение!^\n" +"\t Путь обещал быть долгим -- одна тысяча и сто лет на околосветовой скорости.\n" +"\t Однако, благодаря технологиям крио-заморозки, для пассажиров это время промелькнёт за одно мгновение." +"^\n" +"\t Вернее, за одно мгновение и один год -- было решено вывести пассажиров\n" +" из криосна на этапе торможения, чтобы встретить новый мир на свежую голову." +msgstr "" +"Only in fifty years after building the space ship the scientists found a planet almost like Earth. It was " +"a hope for salvation!^The way had to be long -- one thousand and one hundred years on near-light speed. " +"But thanks to the cryogenic technologies, the time will flash by in a moment for the passengers.^Or rather " +"in a moment and one year -- it was decided to get the passengers out of their cryosleep during the " +"braking, so they would meet the new world on their fresh heads." + +#: ../prologue.lua:36 +msgid "" +"План полёта был утверждён. Большая часть развратившегося человечества оставалась\n" +" \tдоживать свои дни на Земле, но нашлись и те, кто пожелал связать своё будущее со звёздами..." +msgstr "" +"The flight plan was approved. Most of the debauch humanity remained to live out their days on Earth but " +"there were some who wished to link their future to stars..." + +#: ../prologue.lua:44 +msgid "ПОСЛЕДНИЙ РЕЙС" +msgstr "LAST VOYAGE" + +#: ../rat.lua:11 +msgid "Это не есть " +msgstr "This is not" + +#: ../rat.lua:52 +msgid "" +"Зубастый гнаться за мной, я не успеть бежать в нора как раньше. Я бежать в какой-то другой нора -- длинный-" +"длинный туннель. Потом ещё один туннель. Потом бежать в ещё один туннель. Потом в ещё один туннель." +"^Зубастый не отставать, зубастый бежать быстро-быстро." +msgstr "" +"Sharp-toothed runs after me, me no have time to hide in burrow as before. Me runs to some other burrow -- " +"long-long tunnel. Then another tunnel. Then run to some another tunnel. Then some another tunnel.^Sharp-" +"toothed no fall behind, sharp-toothed run fast-fast." + +#: ../rat.lua:58 +msgid "КРЫСИНАЯ НОРА" +msgstr "RAT HOLE" + +#: ../rat.lua:61 +msgid "" +"Я бежать мимо человеков, потом бежать в какой-то странный большой нора, который двигаться вверх! Потом я " +"бежать куда-то, где много человеков. Я бояться! Я лезть на ящик. Потом я лезть на ящик. Потом я ещё лезть " +"на ящик. Потом я лезть в потолочный нора. Потом я бежать по потолочный нора -- длинный-длинный нора! Потом " +"я вдруг падать! Больно падать! И вот я здесь..." +msgstr "" +"Me run past humans, then run to some strange big burrow that goes up! Then me run somewhere, many humans " +"there. Me scared! Me jump on a box. Then me jump on a box. Then me jump on a box again. Then me enter a " +"hole in the ceiling. Then me run in the ceiling hole -- long-long hole! Then me suddenly fall! Painfully " +"fall! And now here me am..." + +#: ../rat.lua:62 +msgid "Где я?" +msgstr "Where am I?" + +#: ../rat.lua:66 +msgid "ЖРАТЬ" +msgstr "GOBBLE" + +#: ../rat.lua:70 +msgid "Сыр вкусно! Могу жрать сколько угодно сыр! Ещё! Ещё!" +msgstr "Cheese tasty! Can eat lots of cheese! More! More!" + +#: ../rat.lua:76 +msgid "ТОЛКАТЬ" +msgstr "PUSH" + +#: ../rat.lua:81 +msgid "Я толкать сыр. Сыр падать на пол, прямо к двери." +msgstr "Me push cheese. Cheese falls on floor, right at the door." + +#: ../rat.lua:83 +msgid "Некуда толкать!" +msgstr "Nowhere to push!" + +#: ../rat.lua:89 +msgid "ГРЫЗТЬ" +msgstr "NIBBLE" + +#: ../rat.lua:94 +msgid "Я грызть странный скобка. Скобка неожиданно сгибаться, и сыр падать со стола!" +msgstr "Me nibble strange stapley. Stapley suddenly bends and cheese falls from the table!" + +#: ../rat.lua:96 +msgid "Я грызть стул... Стул есть невкусный! Не еда!" +msgstr "Me nibbles on chair... Chair is not tasty! Not food!" + +#: ../rat.lua:97 +msgid "Я пытаться грызть стол... Глупый стол! Почти сломать мне зуба!" +msgstr "Me tried nibble on floor... stupid floor! Almost broke me tooth!" + +#: ../rat.lua:98 +msgid "Человечий двери не прогрызть! Я пытаться... Терять два, нет... двадцать два зуба!" +msgstr "Human doors cannot nibble! I tried... lost two, no... twenty two teeth!" + +#: ../rat.lua:101 +msgid "" +"Я грызть глупый устройство... Невкусно! Но я грызть и грызть. Вдруг чёрный коробка вспыхивать! И " +"появляться в чёрный коробка зверь страшный-страшный -- чёрный шерсть всклокоченный, красный глаза гореть! " +"Страшно!.. А, нет. Это же я.^Потом появляться другой картинка -- железный человек, похожий на мусорный бак " +"заходить в комната! Он вставать у двери и пищать, как я! Пи-па-пи-пи-па! Дверь открываться!" +msgstr "" +"Me gnaw stupid device! Not tasty! But me gnaw and gnaw. Then black box spark! And a terrible-terrible " +"beast appears in the black box -- black fur dishevelled, red eyes fire up! Scary! Oh, no. It's me.^Then " +"another picture appears -- an iron man like a garbage tank enters the room! He stands near door and " +"squeaks like me! Peep-pap-peep-peep-pap! Door open!" + +#: ../rat.lua:103 +msgid "Устройство больше не вспыхивать! Всё есть сгрызено. Надо грызть другой устройство!" +msgstr "Device no take fire anymore! All is chewed through. Need to chew another device!" + +#: ../rat.lua:106 +msgid "Я грызть большая ручка, и она повернуться!" +msgstr "Me nibble on big handle and it turn!" + +#: ../rat.lua:110 +msgid "Уже есть сыр! Надо жрать! Жрать! Жрать!" +msgstr "Already have cheese! Must eat! Gobble! Gobble!" + +#: ../rat.lua:113 +msgid "Из устройства выпадать кусочек... сыра!" +msgstr "A bit falls from the thing. It's... cheese!" + +#: ../rat.lua:116 +msgid "Из устройства что-то литься и растекаться по стол!" +msgstr "From the device something pours out and leaks on the table!" + +#: ../rat.lua:119 +msgid "Сыр надо жрать!" +msgstr "Must gobble cheese!" + +#: ../rat.lua:125 +msgid "ПИЩАТЬ" +msgstr "SQUEAK" + +#: ../rat.lua:131 +msgid "" +"Я пищать на дверь, пищать и пищать. Дверь открываться! Но тут же вновь закрываться! Мерзкий человечий " +"голос говорить: \"Не обнаружен объект у двери. Дверь блокируется\"." +msgstr "" +"Me squeak at door, squeak and squeak. Door open! But close again. Nasty human voice say: \"Not found any " +"object at the door. The door is locked.\"" + +#: ../rat.lua:134 +msgid "Пи-пи! Пи! Пи! Пи!" +msgstr "Squeak-squeak! Peep! Squeak! Squeak!" + +#: ../rat.lua:140 +msgid "ЛЕЗТЬ" +msgstr "CLIMB" + +#: ../rat.lua:142 +msgid "Стол есть высоко! Не долезть!" +msgstr "Table is high! Cannot climb!" + +#: ../rat.lua:143 +msgid "Мне не долезть до потолочный нора!" +msgstr "Me cannot climb to ceiling hole!" + +#: ../rat.lua:153 +msgid "На полу" +msgstr "" + +#: ../rat.lua:162 +msgid "Жилище людей. Пахнуть едой! И не едой..." +msgstr "Human house. Smells of food! And not food..." + +#: ../rat.lua:169 +msgid "{Другой Я} сидеть у двери и жрать сыр! Но почему, если другой Я жрать сыр, я по-прежнему голоден?" +msgstr "" +"{Other Me} sit near the door and eat cheese! But why if other Me gobbles the cheese Me is still hungry?" + +#: ../rat.lua:171 +msgid "{Другой Я} сидеть далеко от двери. Другой Я вращать красными глазами." +msgstr "{Other Me} sit far from door. Other Me turn red eyes." + +#: ../rat.lua:181 +msgid "Два {других Я} пытаться отобрать у сыр у другого другого Я!" +msgstr "Two {other Me} try to get cheese from other other Me!" + +#: ../rat.lua:183 +msgid "Два {других Я} бродить по комнате и вращать красными глазами." +msgstr "Two {other Me} walk across room and turn red eyes." + +#: ../rat.lua:186 +msgid "Это Я!" +msgstr "" + +#: ../rat.lua:191 +msgid "У двери лежит {кусочек сыра}." +msgstr "There is a {bit of cheese} at the door." + +#: ../rat.lua:192 +msgid "Сыр! Вкусно! Жрать!" +msgstr "Cheese! Tasty! Gobble!" + +#: ../rat.lua:197 +msgid "Есть {дверь}." +msgstr "There's a {door}." + +#: ../rat.lua:198 +msgid "Дверь есть закрыта!" +msgstr "Door is closed!" + +#: ../rat.lua:202 ../rat.lua:289 +msgid "Есть потолочная {нора}." +msgstr "Is a ceiling {hole}." + +#: ../rat.lua:203 +msgid "Есть очень высоко-высоко. Нора не долезть. Люди тупой! Потолочная нора неудобно!" +msgstr "Is very high-high. Hole no climb. People dumb! Ceiling hole not comfortable!" + +#: ../rat.lua:207 +msgid "Есть {стол} и" +msgstr "There's a {table} and" + +#: ../rat.lua:208 +msgid "Стол большой." +msgstr "Table is big." + +#: ../rat.lua:212 +msgid "есть {стул}." +msgstr "is {chair}." + +#: ../rat.lua:213 +msgid "Стул! Стул! Лезть!" +msgstr "Chair! Chair! Climb!" + +#: ../rat.lua:217 +msgid "" +"Есть {что-то большой и гудящий}. Он есть похожий на мусорный бак, но в пять... нет в пятьдесят пять раз " +"больше!" +msgstr "" +"There's {something big and humming}. It resembles a garbage tank but it's five... no, fifty five times " +"larger!" + +#: ../rat.lua:218 +msgid "Запах есть плохой. Не есть еда. Надо держаться дальше." +msgstr "Smell is bad. Is not food. Should stay away." + +#: ../rat.lua:222 +msgid "На стуле" +msgstr "On the chair" + +#: ../rat.lua:228 +msgid "Я лезть на стул." +msgstr "Me climbs on the chair." + +#: ../rat.lua:232 +msgid "Ниже есть {пол}." +msgstr "Below that is a {floor}." + +#: ../rat.lua:232 +msgid "Пол! Слезть!" +msgstr "Floor! Get down!" + +#: ../rat.lua:235 +msgid "Есть {стол}. Большой стол." +msgstr "There's {table}. Big table." + +#: ../rat.lua:236 +msgid "Близко! Совсем близко! Можно лезть! Там есть запах!" +msgstr "Closer! Much closer! Can climb! There is smell!" + +#: ../rat.lua:240 +msgid "На столе" +msgstr "On the table" + +#: ../rat.lua:247 +msgid "Я сидеть на стол. Здесь запах!" +msgstr "Me sit on table. Here's smell!" + +#: ../rat.lua:252 +msgid "Из стол выдвигаться странный {скобка}," +msgstr "From table pulls out strange {stapley}," + +#: ../rat.lua:253 +msgid "Странный скобка." +msgstr "Strangey stapley." + +#: ../rat.lua:258 +msgid "на котором лежать {сыр}!" +msgstr "on which is {cheese}!" + +#: ../rat.lua:259 +msgid "Сыр! Вкусно! Жрать! Жрать! Жрать!" +msgstr "Cheese! Tasty! Gobble! Gobble! Gobble!" + +#: ../rat.lua:264 +msgid "Ниже стол есть {стул}." +msgstr "Under table is {chair}." + +#: ../rat.lua:265 +msgid "Лезть вниз. Можно!" +msgstr "Get down. I can!" + +#: ../rat.lua:269 +msgid "На стол есть ящик с {длинный ручка} и" +msgstr "On the table is a box with {long handle} and" + +#: ../rat.lua:270 +msgid "" +"Странно. Пахнуть еда. На устройство надпись: синтезатор... лактоза.. Больше не понимать! Давно ходить " +"школа!" +msgstr "" +"Strange. Smells of food. On device is sign: synthesizer... lactose... don't understand more! Long time no " +"school!" + +#: ../rat.lua:274 +msgid "{большой кнопка}." +msgstr "{big buttoney}." + +#: ../rat.lua:275 +msgid "Странный большой кнопка..." +msgstr "Strangey big button..." + +#: ../rat.lua:279 +msgid "На стол есть ещё один людское {устройство} -- чёрный коробка, много кнопок." +msgstr "On floor is another human {device} -- black box, many buttons." + +#: ../rat.lua:280 +msgid "Люди глупый! Это нельзя есть!" +msgstr "Humans stupid! This cannot eat!" + +#: ../rat.lua:284 +msgid "Рядом со стола есть большой и гудящий {мусорный бак}." +msgstr "Near table is big and humming {garbage tank}." + +#: ../rat.lua:285 +msgid "Он страшный. Страшно гудит." +msgstr "It's scary. Scary wooom-wooms." + +#: ../rat.lua:290 +msgid "Потолочная нора уже близко. Почти залезть. Но надо выше. Надо лезть на большой и гудящий." +msgstr "The ceiling hole is closer. Almost climb. But need higher. Need climb big and humming." + +#: ../rat.lua:296 +msgid "Мне больше не нужно лезть на мусорный бак." +msgstr "Me no longer need to climb on garbage tank." + +#: ../rat.lua:302 +msgid "" +"Я снова лезть на мусорный бак! Другой Я лезть со мной! Другой я делать то же, что делать я, ведь это я. Мы " +"оба падать в чёрный нора, оба сидеть там, и нас обоих выталкивать. Теперь других Я -- четыре! Много Я!" +msgstr "" +"Me climb on garbage tank again! Other me do what me do because it's me. Me both fall in black hole, both " +"sit there, us both get pushed out. Now there are four other me! Many Me!" + +#: ../rat.lua:304 +msgid "" +"Я лезть на мусорный бак. Я почти долезть! Но тут я падать! Падать и падать! Оказываться в какой-то тёмный " +"запертый нора. Я думать -- полный капец. Еда -- нет. Выхода -- нет. Но потом вспышки! Потом меня что-то " +"выталкивать! И вот я опять на полу комната.^Рядом со мной сидеть зверь страшный, со страшными красными " +"глазами... Нет, это же я. Нет, как же? Я сидеть рядом с собой. Я не понимать!" +msgstr "" +"Me climb garbage tank. Me almost on top! But me falls! Falls and falls! Me suddenly in some black closed " +"hole. Me thinks finish line. Food -- no. Exit -- no. But then flashes! Something kicks me out! And here I " +"am on the room floor.^A horrid creature sits near me, terrible red eyes... oh, no, that's me. But how? Me " +"sits near me. I no understand!" + +#: ../rat.lua:315 +msgid "" +"Я пищать пи-па-пи-пи-па, и дверь открываться! Я тут же бежать из комната. Я вдруг думать -- зачем я бежать " +"из комната, ведь там много других Я и много сыра! Но дверь уже закрыться! Я пищать на дверь, но дверь -- " +"\"не обнаружено объекта\"! Это ужасно!" +msgstr "" +"Me squeaks peep-pa-peep-peep-pa and the door opens! Me run from room. Me suddenly think -- why am I run " +"from room if there are lot other me and many cheese! But room already closed! Me squeaks at door but door " +"-- \"object not found\"! This is terrible!" + +#: ../rat.lua:324 +msgid "Спустя несколько часов..." +msgstr "After several hours..." + +#: ../rat.lua:379 +msgid "КОНЕЦ?^^{Это только начало...}" +msgstr "THE END?^^{This is only the beginning...}" + +#: ../repair.lua:65 +msgid "Кабины {крио-капсул} слабо подсвечиваются синим." +msgstr "" + +#: ../repair.lua:67 +msgid "" +"Здесь стоят шесть {крио-капсул}. Ни один из индикаторов на них не горит, и кабины кажутся чёрными, а " +"должны подсвечиваться, когда капсулы исправны." +msgstr "" + +#: ../repair.lua:72 +msgid "" +"Да, надо бы проверить все эти капсулы. Возможно, трансформаторы перегорели. Но тут потребуются инструменты." +msgstr "" + +#: ../repair.lua:75 +msgid "Капсулы работают." +msgstr "" + +#: ../repair.lua:77 +msgid "С самими капсулами всё в порядке. Однако они не работают." +msgstr "" + +#: ../repair.lua:95 +msgid "Я едва могу различить очертания {электрического щитка}." +msgstr "" + +#: ../repair.lua:106 +msgid "Крышка щитка привинчена здоровыми винтами." +msgstr "" + +#: ../repair.lua:110 +msgid "Я не уверен, что мне стоит туда лезть. Там контуры, отвечающие за освещение." +msgstr "" + +#: ../repair.lua:128 +msgid "Я нажимаю на кнопку, но ничего не происходит -- свет не работает." +msgstr "" + +#: ../repair.lua:132 +msgid "Я нашарил в темноте кнопку на стене и включил свет. Да, так значительно лучше." +msgstr "" + +#: ../repair.lua:136 +msgid "Я нажал на кнопку, и свет во всём отсеке погас." +msgstr "" + +#: ../repair.lua:148 +#, fuzzy +msgid "Я открыл ящик с инструментами." +msgstr "No, I need some tools for that." + +#: ../repair.lua:150 +msgid "Ящик уже открыт." +msgstr "" + +#: ../repair.lua:163 +#, fuzzy +msgid "Лучше сначала включить свет." +msgstr "Better answer the call first." + +#: ../repair.lua:166 +msgid "Я уже проверил капсулы, с ними всё в порядке." +msgstr "" + +#: ../repair.lua:169 +msgid "" +"Я проверяю несколько капсул -- все цепи целы, трансформаторы работают. Непонятно, в чём может быть " +"проблема." +msgstr "" + +#: ../repair.lua:173 +msgid "Я уже открыл щиток." +msgstr "" + +#: ../repair.lua:176 +msgid "" +"Электрическая отвёртка никогда не подводит. Всего за несколько секунд я скрутил все винты и открыл щиток." +msgstr "" + +#: ../repair.lua:189 +msgid "В темноте слабо поблёскивает мой {фонарик}." +msgstr "" + +#: ../repair.lua:191 +msgid "Из бокового отделения ящика торчит маленький {фонарик}." +msgstr "" + +#: ../repair.lua:249 +msgid "Синий провод ни к чему не подключён." +msgstr "" + +#: ../repair.lua:251 +msgid "{Синий провод} ни к чему не подключён." +msgstr "" + +#: ../repair.lua:260 +msgid "Я беру в руку " +msgstr "" + +#: ../repair.lua:268 +msgid "Я отсоединяю " +msgstr "" + +#: ../repair.lua:277 +msgid "Отсоединённый зелёный провод торчит из щитка." +msgstr "" + +#: ../repair.lua:279 +msgid "Отсоединённый {зелёный провод} торчит из щитка." +msgstr "" + +#: ../repair.lua:292 +msgid "Красный провод отсоёдинен." +msgstr "" + +#: ../repair.lua:294 +msgid "{Красный провод} отсоёдинен." +msgstr "" + +#: ../repair.lua:308 +msgid "К этому порту подключён синий провод." +msgstr "" + +#: ../repair.lua:310 +msgid "К этому порту подключён зелёный провод." +msgstr "" + +#: ../repair.lua:312 +msgid "К этому порту подключён красный провод." +msgstr "" + +#: ../repair.lua:314 +msgid "К этому порту ничего не подключено." +msgstr "" + +#: ../repair.lua:337 +msgid "Я держу в руке " +msgstr "" + +#: ../repair.lua:344 +msgid "К этому порту уже подсоединён провод." +msgstr "" + +#: ../repair.lua:350 ../repair.lua:354 ../repair.lua:358 +msgid "Я подключаю " +msgstr "" + +#: ../repair.lua:383 +#, fuzzy +msgid "Нет, надо сначала решить проблему с капсулами." +msgstr "Should arrange all these boxes first." + +#: ../repair.lua:386 +msgid "" +"В этой темноте я и дверь-то с трудом вижу. Нет, надо всё же сначала разобраться с тем, что здесь " +"происходит." +msgstr "" + +#: ../repair.lua:389 +msgid "Странно. Я подхожу к двери, но она не открывается." +msgstr "" + +#: ../robot.lua:50 +#, fuzzy +msgid "Отсек 12" +msgstr "Module K007" + +#: ../robot.lua:50 +msgid "Выйти в Отсек N12" +msgstr "" + +#: ../wake.lua:32 +#, fuzzy +msgid "Нет, туда пути больше нет." +msgstr "No, I need some tools for that." + +#: ../wake.lua:51 +msgid "{Александр} слепо наступает на меня, издавая странный тяжёлый хрип." +msgstr "" + +#: ../wake.lua:53 +msgid "" +"Я его почти не знаю. Но, кажется, его зовут {Александр}. Он плохо выглядит -- сидит и неподвижно смотрит в " +"одну точку." +msgstr "" + +#: ../wake.lua:58 +msgid "Уговоры не помогут, я должен спасаться бегством!" +msgstr "" + +#: ../wake.lua:60 +msgid "Он никак на меня не реагирует -- просто смотрит в одну точку. Надо бы ему помочь." +msgstr "" + +#: ../wake.lua:70 +msgid "Дверь не закрыта. Нужно бежать отсюда!" +msgstr "" + +#: ../wake.lua:72 +msgid "Выход из крио-отсека, в коридор. Но уходить пока рано, надо бы помочь Александру." +msgstr "" + +#: ../wake.lua:84 +msgid "Я нашёл в аптечке шприц с адреналином. Надо сделать инъекцию Александру." +msgstr "" + +#: ../wake.lua:86 +#, fuzzy +msgid "Здесь больше нет ничего, что мне было бы нужно." +msgstr "Me no longer need to climb on garbage tank." + +#: ../wake.lua:116 +#, fuzzy +msgid "Надо бы сначала помочь Александру." +msgstr "Should arrange all these boxes first." + +#: ../wake.lua:129 +msgid "На полу лежит труп {Александра}. Дверь разрубила его тело попалам. Весь пол залит кровью." +msgstr "" + +#: ../wake.lua:131 +msgid "{Александр} идёт прямо на меня. В глазах его горит безумие." +msgstr "" + +#: ../wake.lua:136 +msgid "Очень жаль, что мне пришлось сделать это. Но у меня не было другого выхода." +msgstr "" + +#: ../wake.lua:138 +msgid "Это синдром выхода из криосна. Теперь в этом нет сомнений! Боюсь, ему уже не помочь..." +msgstr "" + +#: ../wake.lua:148 +msgid "Замок разворочен выстрелом." +msgstr "" + +#: ../wake.lua:150 +msgid "Александр уже вышел из комнаты, я не смогу его там закрыть." +msgstr "" + +#: ../wake.lua:160 +msgid "Лифт уже стоит на этаже. Надо лишь подойти к двери лифта." +msgstr "" + +#: ../wake.lua:163 +msgid "Я уже вызвал лифт. Вряд ли я смогу как-то ускорить его прибытие." +msgstr "" + +#: ../wake.lua:166 +msgid "" +"Я нажимаю на кнопку вызова лифта. Теперь остаётся ждать. Но у меня нет времени! Александр сошёл с ума и " +"идёт прямо на меня!" +msgstr "" + +#: ../wake.lua:176 +msgid "Не думаю, что мне это теперь пригодится." +msgstr "" + +#: ../wake.lua:178 +msgid "Вряд ли из неё получится хорошее оружие. Но кто знает..." +msgstr "" + +#: ../wake.lua:185 ../wake.lua:272 +msgid "Он и так мёртв." +msgstr "" + +#: ../wake.lua:199 +#, fuzzy +msgid "Дверь открыта." +msgstr "Door is closed!" + +#: ../wake.lua:201 +msgid "У меня должен быть допуск." +msgstr "" + +#: ../wake.lua:205 +msgid "Рядом с дверью висит сканер ретины. У меня должен быть допуск в оружейную." +msgstr "" + +#: ../wake.lua:215 +#, fuzzy +msgid "Дверь уже открыта." +msgstr "Door is closed!" + +#: ../wake.lua:218 +msgid "Я смотрю в окуляры сканера. Проходит долгая секунда. Наконец, дверь открывается." +msgstr "" + +#: ../wake.lua:236 +#, fuzzy +msgid "Дверь в оружейшую закрыта." +msgstr "Door is closed!" + +#: ../wake.lua:239 +#, fuzzy +msgid "Мне туда больше не нужно." +msgstr "That's all there is in the box." + +#: ../wake.lua:254 +msgid "" +"Я пытаюсь выстрелить в Александра, но в ответ мне раздаётся неприятный гудок, и на дисплее оружия " +"высвечивается надпись: \"Идентифицирован член экипажа. Выстрел отменён.\"" +msgstr "" + +#: ../wake.lua:257 +msgid "" +"Я выстрелил в замок, дверь в К007 опустилась и разрубила Александра попалам. Ужасно! Но у меня не было " +"выхода.^После того как тело Александра упало на пол, я услышал мелодичный звонок. На этаж пришёл лифт." +msgstr "" + +#: ../wake.lua:260 +#, fuzzy +msgid "Это не поможет." +msgstr "This is not" + +#: ../wake.lua:290 +msgid "Лифта ещё нет на этаже." +msgstr "" + +#: ../wake2.lua:11 +#, fuzzy +msgid "Ничего не происходит." +msgstr "This is not" + +#: ../wake2.lua:12 +msgid "Это странная штука." +msgstr "" + +#: ../wake2.lua:13 +#, fuzzy +msgid "Не работает..." +msgstr "This is not" + +#: ../wake2.lua:19 +msgid "ПРОБУЖДЕНИЕ 2" +msgstr "" + +#: ../wake2.lua:22 +msgid "" +"\n" +"Я и ещё несколько человек вышли из криосна.\n" +"К сожалению, как минимум у двоих обнаружился синдром выхода из криосна, одного из них мне пришлось убить,\n" +"другой прямо сейчас движется на меня из лифта, его глаза безумны...\n" +"^\n" +"Мне надо срочно что-то предпринять...\n" +"^^\n" +msgstr "" + +#: ../wake2.lua:30 +msgid "Начать игру" +msgstr "Begin the game" + +#: ../wake2.lua:36 ../wake2.lua:47 +msgid "Бластер" +msgstr "" + +#: ../wake2.lua:37 +#, fuzzy +msgid "Нож" +msgstr "Below that is a {floor}." + +#: ../wake2.lua:38 +msgid "Швабра" +msgstr "" + +#: ../wake2.lua:48 +msgid "Стандартный бластер. Не стреляет в членов экипажа." +msgstr "" + +#: ../wake2.lua:52 +msgid "" +"\n" +"\t Я пытаюсь выстрелить в безумца, но в ответ мне раздаётся неприятный гудок, и на дисплее оружия " +"высвечивается надпись:\n" +" \"Идентифицирован член экипажа. Выстрел отменён.\"\n" +" ^^\n" +"\t " +msgstr "" + +#: ../wake2.lua:59 +msgid "Бластер не стреляет в членов экипажа. Лучше не тратить на это время." +msgstr "" + +#: ../wake2.lua:65 ../wake2.lua:79 ../wake2.lua:92 ../wake2.lua:108 +#, fuzzy +msgid "Это не поможет" +msgstr "This is not" + +#: ../wake2.lua:98 ../wake2.lua:105 ../wake2.lua:351 +msgid "Шприц" +msgstr "" + +#: ../wake2.lua:99 +msgid "Шприц с остатками адреналина." +msgstr "" + +#: ../wake2.lua:101 +msgid "Подскочив к телу, я выхватываю шприц." +msgstr "" + +#: ../wake2.lua:114 +msgid "двери лифта" +msgstr "" + +#: ../wake2.lua:115 +msgid "Конструкция таких дверей не сильно изменилась за прошедшие века." +msgstr "" + +#: ../wake2.lua:124 +msgid "Член экипажа" +msgstr "" + +#: ../wake2.lua:125 +msgid "Похоже, лекарство ему помогло..." +msgstr "" + +#: ../wake2.lua:130 +msgid "За тысячу лет пути крыса могла подрасти..." +msgstr "" + +#: ../wake2.lua:141 +msgid "" +"\n" +"...Я судорожно жму на кнопки и {liftDoor|двери лифта} начинают закрываться, но {zombie2|безумец} успевает " +"просунуть наружу свои руки.\n" +"^^\n" +msgstr "" + +#: ../wake2.lua:145 +msgid "Осмотреться вокруг" +msgstr "" + +#: ../wake2.lua:162 +msgid "" +"\n" +"Я наклоняюсь и добиваю лежащего на полу человека. Будет спокойнее, если я буду уверен, что он мёртв.\n" +"^\n" +"Не знаю, что будет дальше, но этот бой я выиграл. Буду надеяться на лучшее.\n" +"^^\n" +msgstr "" + +#: ../wake2.lua:167 +msgid "КОНЕЦ" +msgstr "" + +#: ../wake2.lua:177 +msgid "" +"\n" +"Я осторожно склоняюсь над лежащим. Похоже, что он жив: пульс ровный, зрачки не расширены, цвет глаз " +"нормальный.\n" +"Возможно, то, что не помогло Александру, помогло этому бедолаге.\n" +"^\n" +"Я жду довольно долго, наконец человек приходит в себя.\n" +"^\n" +"-- Как тебя зовут? -- спрашиваю я.\n" +"^\n" +"-- Виталий... -- отвечает он. -- Где я, что со мной?\n" +"^\n" +"Я как можно мягче постарался ему всё объяснить. Некоторое время он ещё посидел на полу, понурив голову.\n" +"^\n" +"-- Я очень голоден. -- наконец говорит он. -- пойду, пожалуй, в камеру оргсинтеза, попрошу роботов что-" +"нибудь мне приготовить.\n" +"^\n" +"Виталий медленно поднимается с пола и идёт в лифт. Видимо, он ещё не совсем в порядке.\n" +"^\n" +"-- Постой! -- говорю я ему. -- Возьми нож, там может быть опасно.\n" +"^\n" +"Я отдаю ему нож-пилу. Виталий кивает мне, двери лифта закрываются за ним.\n" +"^\n" +"Раздумывая о происшедшем, я не сразу заметил, что сзади подкрадывается огромная {rat|крыса},\n" +"привлечённая запахом крови. Похоже, она пробралась через вентиляцию.\n" +"Раздавшийся за спиной шорох выводит меня из оцепенения. Резко обернувшись, я вскрикиваю от ужаса.\n" +"^^\n" +msgstr "" + +#: ../wake2.lua:202 +msgid "Бежать в лифт" +msgstr "" + +#: ../wake2.lua:241 ../wake2.lua:353 +#, fuzzy +msgid "Скорее бежать" +msgstr "I am run" + +#: ../wake2.lua:242 +msgid "Быстро осмотреться вокруг" +msgstr "" + +#: ../wake2.lua:292 +msgid "Проверить, что с ним" +msgstr "" + +#: ../wake2.lua:315 +msgid "Далее" +msgstr "" + +#: ../wake2.lua:348 +msgid "" +"\n" +"Мой взгляд скользит по стенам, по лужам крови на полу, останавливается на теле Александра. Верхняя часть " +"его тела лежит в\n" +"коридоре, нижняя -- за дверью отсека K007. " +msgstr "" + +#: ../wake2.lua:351 +msgid "В груди Александра всё ещё торчит {shpritz|шприц} с остатками адреналина.^" +msgstr "" + +#: ../wake2.lua:352 +msgid "{zombie2|Безумец} справился с дверью лифта и приближается ко мне.^^" +msgstr "" + +#: ../watch.lua:76 +msgid "" +"Дверь в мой отсек закрыта. Надо будет потом придумать, как её снова открыть. Но на этом у меня есть целый " +"год." +msgstr "" + +#: ../watch.lua:80 +msgid "Сначала нужно открыть дверь." +msgstr "" + +#: ../watch.lua:98 +msgid "Я смазываю маслом все гайки на правой руке моего коллеги. Теперь я должен без проблем её открутить." +msgstr "" + +#: ../watch.lua:112 +#, fuzzy +msgid "Сейчас дверь открыта." +msgstr "Door is closed!" + +#: ../watch.lua:112 +#, fuzzy +msgid "Сейчас дверь закрыта." +msgstr "Door is closed!" + +#: ../watch.lua:141 +#, fuzzy +msgid "В ящике больше нет ничего полезного." +msgstr "That's all there is in the box." + +#: ../watch.lua:144 +msgid "Я ящике лежит большой гаечный ключ." +msgstr "" + +#: ../watch.lua:153 +#, fuzzy +msgid "Я взял гаечный ключ." +msgstr "Wrench" + +#: ../watch.lua:158 +msgid "" +"Всё-таки гаечный ключ -- полезная штука! Раз-раз, и негодная труба выломана из стены. Теперь всё выглядит " +"идеально." +msgstr "" + +#: ../watch.lua:160 +msgid "Я пытаюсь открутить руку ключом, но ничего не выходит. Ни одна из гаек не желает поворачиваться." +msgstr "" + +#: ../watch.lua:164 +msgid "" +"Пара капель масла и... всё как по маслу! Я без проблем откручиваю у своего коллеги руку и приделываю эту " +"руку себе. Ну, наконец-то! У меня снова две руки!" +msgstr "" + +#: ../watch.lua:178 +msgid "" +"Да, отличная идея! Я встаю под углом в 45 градусом, просовываю в дверной проём трубу и касаюсь круглой " +"кнопки. Дверь тут же опускается и поднимает под себя трубу. Так ей и надо, этой трубе. К тому же теперь " +"мой отсек закрыт... Правда, мне потом потребуется ещё одна труба, чтобы попасть обратно." +msgstr "" + +#: ../watch.lua:180 +msgid "Ошибка! Тупиковая ситуация! Эээ... нет, мне кажется я что-то ещё не сделал." +msgstr "" + +#: ../watch.lua:192 +msgid "" +"Дверь в отсек WR006 закрыта. Она откроется только, когда будет закрыта дверь в мой отсек. Вот так здесь " +"всё устроено." +msgstr "" + +#: ../watch.lua:202 +msgid "Спать ему ещё целую сотню лет." +msgstr "" + +#: ../watch.lua:202 +msgid "Надеюсь, он не сильно расстроится, когда увидит, что у него нет правой руки." +msgstr "" + +#~ msgid "В ПРОЦЕССЕ ПЕРЕВОДА" +#~ msgstr "IN TRANSLATING" + +#~ msgid "СКОРО" +#~ msgstr "COMING SOON" + +#~ msgid "Сожалеем, но эта часть игры ещё не переведена. Ждите обновлений!" +#~ msgstr "We're sorry but this part of the game is not translated yet. Wait for the update!" + +#~ msgid "" +#~ "Бип-бип! Невозможно выполнить запрошенное действие... Эх, надо было всё-таки обновить прошивку, когда " +#~ "мне говорили." +#~ msgstr "" +#~ "Beep-beep! Unable to execute the chosen action... Eh, I should have updated the firmware when they told " +#~ "me." + +#~ msgid "ДОЛГАЯ СЛУЖБА" +#~ msgstr "Long service" + +#~ msgid "" +#~ "Прошло несколько дней с тех пор, как корабль вылетел с Земли. Скоро весь экипаж отправится по своим " +#~ "криокапсулам, а мне предстоит нести самую первую годовую вахту.^Я робот WR001. По документам -- новая " +#~ "модель, недавно вышедшая с конвейера. Однако на самом деле это не совсем так. Где-то там наверху что-то " +#~ "перепутали и вместо того, чтобы отправить меня на пенсию, приписали к этому кораблю под видом новой " +#~ "модели. Мне предстоит десять вахт и путь длиной в тысячу лет.^Надеюсь, у меня ничего не отвалится за " +#~ "это время." +#~ msgstr "" +#~ "It's been several days since the ship left Earth. Soon the crew will set off for their cryocapsules and " +#~ "I shall have to bear the first year watch.^I am a robot WR001. According to documents, a new model, " +#~ "fresh from the conveyor. But in fact it's not exactly right. Somewhere up there someone mixed up and " +#~ "instead of sending me for pension registered at this ship as a new model. I'm looking at ten watches " +#~ "and a journey thousand years long.^I hope nothing will fall off me in that time." + +#~ msgid "Хранилище" +#~ msgstr "Warehouse" + +#~ msgid "" +#~ "Я нахожусь в хранилище. Здесь, на ровных полках, лежат разнообразные детали в металлических коробках. " +#~ "Моя задача -- отсортировать коробки в соответствии с номерками на них. Работа почти выполнена." +#~ msgstr "" +#~ "I'm standing in a warehouse. Here, on the straight shelves, lay assorted components in metal boxes. My " +#~ "task is to sort the boxes according to the numbers on them. Job's almost done." + +#~ msgid "{Передатчик} у меня на груди мигает. Меня кто-то вызывает.^" +#~ msgstr "The {transmitter} on my chest is blinking. Someone calls for me.^" + +#~ msgid "Сюда нужно поставить последнюю коробку. Это сложно, но я справлюсь." +#~ msgstr "I need to put the last box here. It's difficult but I'll manage." + +#~ msgid "Коробка 19" +#~ msgstr "Box 19" + +#~ msgid "Просто пустой ящик." +#~ msgstr "Just an empty box." + +#~ msgid "Странно, но тут ничего нет." +#~ msgstr "Strange, but there's nothing here." + +#~ msgid "Абсолютно пустая коробка." +#~ msgstr "This box is absolutely empty." + +#~ msgid "Видимо, сюда забыли что-то положить." +#~ msgstr "Seems like someone forgot to put something here." + +#~ msgid "Пусто!" +#~ msgstr "Empty!" + +#~ msgid "Вся эта комната заставлена металлическими коробками. Коробок очень много, а именно:" +#~ msgstr "This room is completely filled with metal boxes. There are many boxes, to be exact:" + +#~ msgid "коробка" +#~ msgstr "box" + +#~ msgid "Коробка 12" +#~ msgstr "Box 12" + +#~ msgid "Складной гаечный ключ -- удобно и практично." +#~ msgstr "Folding wrench, convenient and economical." + +#~ msgid "Я вообще ничего не слышу. Ни малейшего шороха." +#~ msgstr "I don't head anything. Not a little rustle." + +#~ msgid "Модуль XR304558" +#~ msgstr "Module XR304558" + +#~ msgid "На полу валяется {модуль} размером с кирпич. Неужели это выпало из меня?" +#~ msgstr "There's a {module} a size of a brick on the floor. Did that fall out of me?" + +#~ msgid "" +#~ "Непонятно, что это за штука. В моих банках памяти ничего нет. Правда, надо сказать, я последнее время о " +#~ "многом стал забывать. В любом случае мне и без этого модуля хорошо." +#~ msgstr "" +#~ "It's an imcomprehensible thing. My data banks have nothing on that. But I should say that I started to " +#~ "forget many things lately. Anyway, I feel fine without this module." + +#~ msgid "Я поднимаю с пола модуль. На нем длинный и непонятный регистрационный номер." +#~ msgstr "I pick up a module from the floor. It has a long and incomprehensible registration number." + +#~ msgid "По коридору идёт {робот}, мой коллега. Робот несёт в руках огромный металлический контейнер." +#~ msgstr "" +#~ "There's a {robot}, my colleague, walking through a corridor. He carries a large metal container in his " +#~ "hands." + +#~ msgid "" +#~ "Думаю, он идёт в продовольственный отсек. Интересно, как он собирается открыть дверь, когда у него обе " +#~ "руки заняты? Наверное, ему придётся сначала поставить контейнер на пол. Я начинаю следить за роботом из " +#~ "чистого любопытства. Он подходит к двери в продовольственный отсек и..." +#~ msgstr "" +#~ "I think it's going towards the food module. I wonder how he wants to open the door when he's got both " +#~ "hands occupied? He'll probably have to put the container on the floor first. I'm starting to follow the " +#~ "robot out of pure curiosity. He goes at the door to the food module and..." + +#~ msgid "" +#~ " дверь сама открывается! Удивительно. Все двери здесь должны быть на магнитном замке.^Робот быстро " +#~ "возвращается из отсека без контейнера, а через несколько минут появляется снова -- с ещё одним огромным " +#~ "ящиком в руках. Что ж, у некоторых работа ещё тяжелее, чем у меня." +#~ msgstr "" +#~ " the door opens by itself! Fascinating. All the doors here should have a maglock.^The robot quickly " +#~ "returns from the module without a container, only to emerge once again in some minutes later -- with " +#~ "another box on his hands. Well, some have their work harder than I have." + +#~ msgid "" +#~ " начинает издавать смешные звуки -- пип, пап, пип, пип, пап. На секунду я думаю, что мой коллега сошёл " +#~ "с ума, однако дверь в продовольственный отсек открывается. Удивительно! И почему мне никто не сказал, " +#~ "что так можно." +#~ msgstr "" +#~ " begins to emit funny noises -- peep, pap, peep, peep, pap. For a second I think my colleague went mad " +#~ "but then the door to the food module starts to open. Fascinating! Why nobody told me it's a thing?" + +#~ msgid "На полу валяется моя отломавшаяся {правая рука}." +#~ msgstr "On the floor is lying my fallen {right hand}." + +#~ msgid "Я поднимаю свою отвалившуюся руку." +#~ msgstr "I pick up my fallen hand." + +#~ msgid "Она испорчена, совершенно испорчена! От неё теперь никакого прока!" +#~ msgstr "It's damaged, completely damaged! No use whatsoever!" + +#~ msgid "Я с трудом поднялся и подпрыгиваю на одной ноге." +#~ msgstr "I hardly got up and I'm jumping on a single leg now." + +#~ msgid "Моя отвалившаяся {нога} валяется на полу." +#~ msgstr "My fallen {leg} is lying on a floor." + +#~ msgid "" +#~ "Я в продовольственном отсеке. Здесь всё заставлено здоровыми контейнерами. Как же много собираются есть " +#~ "эти люди после пробуждения!" +#~ msgstr "" +#~ "I'm at the food module. It's fully stacked with huge containers. How much these people gonna eat after " +#~ "waking up!" + +#~ msgid "Мой {коллега} стоит у стены и не двигается. Длинный и толстый кабель тянется из его зада к стене." +#~ msgstr "" +#~ "My {colleague} stands near the wall without a motion. A long and fat cable goes from his behind to the " +#~ "wall." + +#~ msgid "Кстати, у него отличная {правая рука}..." +#~ msgstr "By the way, he has a great {right hand}..." + +#~ msgid "Пип!" +#~ msgstr "Peep!" + +#~ msgid "Пап!" +#~ msgstr "Pap!" + +#~ msgid "" +#~ "Я стою у двери в продовольственный отсек. Какие там звуки издавал тот робот? Пип, пап, пап... Нет, как-" +#~ "то не так. Он издавал..." +#~ msgstr "" +#~ "I'm standing at the door to the food module. What sounds did that robot make? Peep, pap, pap... no, not " +#~ "like that. He emitted..." + +#~ msgid "Интересно, где бы мне взять исправную ногу?^^" +#~ msgstr "I wonder where could I get a good leg?^^" + +#~ msgid "{Дальше}" +#~ msgstr "{Next}" + +#~ msgid "Я есть бежать, бежать." +#~ msgstr "I am run, run" diff --git a/wake.lua b/wake.lua new file mode 100644 index 0000000..934f30b --- /dev/null +++ b/wake.lua @@ -0,0 +1,301 @@ +-- $Name: Пробуждение$ +instead_version "1.9.1" +require "lib" +require "para" +require "dash" +require "quotes" +game.use = "Нет, так ничего не выйдет." + +main = room { + nam = "...", + enter = music_("spookyloop",0), + title = {"П", "Р", "О", "Б", "У", "Ж", "Д", "Е", "Н", "И", "Е"}, + num =15, + act = function() walk(room1) end, + dsc = [[Я слышал об этом, но никогда не верил, что это действительно может произойти. + Говорят, что есть один шанс из миллиона, что человек не сможет проснуться после криосна. + Тело его просыпается, но разум остаётся где-то там -- в чёрной космической безде. + Сохраняются только основные инстинкты.^ + Я слышал об этом, но никогда не верил, что это может действительно произойти.]], + obj = { vobj("next", '{Начать игру}') } +} + +room1 = room { + nam = "К007", + pxa = { + { "crio", 10 }, + { "med", 310 }, + { "door4", 370 } + }, + enter = function() + if room1_neibor._zombi then + p (_("Нет, туда пути больше нет.")); + return false + end + end, + dsc = "Я в крио-отсеке. Сложно поверить в то, что я спал больше тысячи лет. Кажется, только вчера мы улетели с Земли.", + obj = { "room1_capsulas", "room1_neibor", "room1_door", "room1_med" }, + way = { "coridor" } +} + +room1_capsulas = obj { + nam = "капсулы", + dsc = "Здесь {шесть капсул}, но отключаются они постепенно. Сейчас отключилась только моя и моего соседа справа.", + act = "Стандартные капсулы для криосна." +} + +room1_neibor = obj { + nam = "сосед", + dsc = function(s) + if room1_neibor._zombi then + return (_("{Александр} слепо наступает на меня, издавая странный тяжёлый хрип.")); + else + return (_("Я его почти не знаю. Но, кажется, его зовут {Александр}. Он плохо выглядит -- сидит и неподвижно смотрит в одну точку.")); + end + end, + act = function(s) + if room1_neibor._zombi then + return (_("Уговоры не помогут, я должен спасаться бегством!")); + else + return (_("Он никак на меня не реагирует -- просто смотрит в одну точку. Надо бы ему помочь.")) + end + end +} + +room1_door = obj { + nam = "дверь", + dsc = "На стене у {двери}", + act = function() + if room1_neibor._zombi then + return (_("Дверь не закрыта. Нужно бежать отсюда!")); + else + return (_("Выход из крио-отсека, в коридор. Но уходить пока рано, надо бы помочь Александру.")) + end + end +} + +room1_med = obj { + nam = "аптечка", + dsc = "висит {аптечка}.", + act = function(s) + if not adrenalin._taken then + take(adrenalin); + adrenalin._taken = true; + return (_("Я нашёл в аптечке шприц с адреналином. Надо сделать инъекцию Александру.")); + else + return (_("Здесь больше нет ничего, что мне было бы нужно.")); + end + end +} + +adrenalin = obj { + nam = "шприц", + inv = "Одноразовый шприц с порцией адреналина. Некоторым при выходе из крио-сна это нужно.", + use = function(s,v) + if v == room1_neibor then + remove(s,me()); + room1_neibor._zombi=true; + return [[Я делаю Александру инъекцию, он странно вздрагивает, смотрит на меня мутными ничего не + выражающими глазами, а потом вдруг мощным ударом отшвыривает меня к двери. Не может быть! + Он не в себе! Я кричу Александру, пытаюсь остановить его, но он как будто не слышит и + продолжает наступать на меня, вытянув вперёд руки.]]; + end + end +} + +coridor = room { + nam = "Коридор", + pxa = { + { if_("armoryobj._open","door1_open","door1"), 10 }, + { "door2", 200 }, + { if_("not zombi._dead","zombi", "zombi_dead"), if_("not zombi._dead", 420, 380) }, + { if_("not zombi._dead","hatch2", "hatch"), 460 } + }, + enter = function() + if not room1_neibor._zombi then + p (_("Надо бы сначала помочь Александру.")); + return false; + end + end, + dsc = "Я в коридоре крио-блока.", + obj = { "lock", "zombi", "elevator", "cleaner", "armoryobj", "codereader" }, + way = { "room1", vroom("Лифт","goodend"), "armory" } +} + +zombi = obj { + nam = "Александр", + dsc = function(s,v) + if zombi._dead then + return (_("На полу лежит труп {Александра}. Дверь разрубила его тело попалам. Весь пол залит кровью.")); + else + return (_("{Александр} идёт прямо на меня. В глазах его горит безумие.")); + end + end, + act = function(s,v) + if zombi._dead then + return (_("Очень жаль, что мне пришлось сделать это. Но у меня не было другого выхода.")); + else + return (_("Это синдром выхода из криосна. Теперь в этом нет сомнений! Боюсь, ему уже не помочь...")) + end + end +} + +lock = obj { + nam = "Замок", + dsc = "На стене у двери в К007 висит {панель} электронного замка.", + act = function(s) + if zombi._dead then + return (_("Замок разворочен выстрелом.")); + else + return (_("Александр уже вышел из комнаты, я не смогу его там закрыть.")); + end + end +} + +elevator = obj { + nam = "Лифт", + dsc = "Справа от меня -- {лифт}.", + act = function(s) + if zombi._dead then + return (_("Лифт уже стоит на этаже. Надо лишь подойти к двери лифта.")); + end + if s._call then + return (_("Я уже вызвал лифт. Вряд ли я смогу как-то ускорить его прибытие.")); + else + s._call=true; + return (_("Я нажимаю на кнопку вызова лифта. Теперь остаётся ждать. Но у меня нет времени! Александр сошёл с ума и идёт прямо на меня!")); + end + end +} + +cleaner = obj { + nam = "Швабра", + dsc = "На полу валяется сломанная {швабра}.", + inv = function(s,v) + if zombi._dead then + return (_("Не думаю, что мне это теперь пригодится.")); + else + return (_("Вряд ли из неё получится хорошее оружие. Но кто знает...")) + end + end, + tak = "Я поднял швабру.", + use = function(s,v) + if v==zombi then + if zombi._dead then + return (_("Он и так мёртв.")); + else + return walk(badend); + end + end + end +} + +armoryobj = obj { + nam = "Оружейная", + dsc = "Слева -- вход в {оружейную}.", + act = function(s) + if s._exam then + if s._open then + return (_("Дверь открыта.")); + else + return (_("У меня должен быть допуск.")); + end + else + s._exam=true; + return (_("Рядом с дверью висит сканер ретины. У меня должен быть допуск в оружейную.")); + end + end +} + +codereader = obj { + nam = "Сканер ретины", + dsc = "Рядом со входом в оружейную висит {сканер ретины}.", + act = function(s) + if armoryobj._open then + return (_("Дверь уже открыта.")); + else + armoryobj._open=true; + return (_("Я смотрю в окуляры сканера. Проходит долгая секунда. Наконец, дверь открывается.")); + end + end, + cnd = function() return armoryobj._exam end +} + +armory = room { + nam = "Оружейная", + pxa = { + { "door1_open", 10 }, + { if_("not have(knife)", "knife"), 150 }, + { if_("not have(blaster)","blaster"), 180 }, + { "box", 180 }, + { "box", 280 }, + { "box", 380 }, + }, + enter = function(s) + if not armoryobj._open then + p (_("Дверь в оружейшую закрыта.")); + return false; + elseif zombi._dead then + p (_("Мне туда больше не нужно.")); + return false; + end + end, + dsc = "Я в оружейной.", + obj = { "knife", "blaster" }, + way = { "coridor" } +} + +blaster = obj { + nam = "Бластер", + dsc = "Чуть дальше висит {бластер}.", + tak = "Я взял бластер.", + use = function(s,v) + if v==zombi then + return (_([[Я пытаюсь выстрелить в Александра, но в ответ мне раздаётся неприятный гудок, и на дисплее оружия высвечивается надпись: "Идентифицирован член экипажа. Выстрел отменён."]])); + elseif v==lock then + sound_("shoot_lazer")(); + p (_("Я выстрелил в замок, дверь в К007 опустилась и разрубила Александра попалам. Ужасно! Но у меня не было выхода.^После того как тело Александра упало на пол, я услышал мелодичный звонок. На этаж пришёл лифт.")); + zombi._dead=true; + else + return (_("Это не поможет.")); + end + end +} + +knife = obj { + nam = "Нож", + dsc = "У двери висит {нож-пила}.", + tak = "Я беру нож-пилу.", + use = function(s,v) + if v==zombi then + if zombi._dead then + return (_("Он и так мёртв.")); + else + return walk(badend); + end + end + end +} + +badend = room { + nam = "Конец", + dsc = [[Я пытаюсь ударить Александра, но он как будто не чувствует удара. В ответ он с нечеловеческой силой отшвыривает меня + к стене. Я падаю и проваливаюсь в темноту...]] +} + +goodend = room { + nam = "Конец", + enter = function(s) + if not zombi._dead then + p (_("Лифта ещё нет на этаже.")); + return false; + end + mute_()(); + complete_("wake")(); + end, + dsc = [[Я подхожу к лифту, дверь открывается и...^ + Передо мной оказывается какой-то человек с мутным невидящим взглядом. Не может быть! Ещё один! Руки безумца тянутся ко мне. Я застываю от ужаса, будучи не в силах даже пошевелиться.]], + act = gamefile_("wake2.lua"), + obj = { vobj("next", txtc("{КОНЕЦ?}")) } +} + diff --git a/wake2.lua b/wake2.lua new file mode 100644 index 0000000..4b5b5a3 --- /dev/null +++ b/wake2.lua @@ -0,0 +1,403 @@ +-- $Name: Пробуждение 2: Воскрешение.$ +instead_version "1.9.1" +require "lib" +require "xact" +require "hideinv" +require "para" +require "dash" +require "quotes" +game.codepage="UTF-8"; + +game.act = _('Ничего не происходит.'); +game.inv = _('Это странная штука.'); +game.use = _('Не работает...'); + +main = room { + forcedsc = true, + nam = _("..."), + enter = music_("pyhun",0), + title = _("ПРОБУЖДЕНИЕ 2"), + num=16, + dsc = function(s) +p(_([[ +Я и ещё несколько человек вышли из криосна. +К сожалению, как минимум у двоих обнаружился синдром выхода из криосна, одного из них мне пришлось убить, +другой прямо сейчас движется на меня из лифта, его глаза безумны... +^ +Мне надо срочно что-то предпринять... +^^ +]])); + p ("{v_483fc406_4b48_47a0_b7f5_d43ff639bade|".._('Начать игру').."}^"); + end, + obj = { + xact( + 'v_483fc406_4b48_47a0_b7f5_d43ff639bade', + function(s) + if not have(_("Бластер")) then take(blasterPistol); end; + if not have(_("Нож")) then take(knife); end; + if not have(_("Швабра")) then take(mop); end; + walk(v_2); + end + ), + + }, +}; + +blasterPistol = obj { + nam = _("Бластер"), + inv = _([[Стандартный бластер. Не стреляет в членов экипажа.]]), + use = function(s, w) + if w == zombie2 or w == crewMember then + if not (blaster) then + p(_([[ + Я пытаюсь выстрелить в безумца, но в ответ мне раздаётся неприятный гудок, и на дисплее оружия высвечивается надпись: + "Идентифицирован член экипажа. Выстрел отменён." + ^^ + ]])); + stead.add_var { blaster = true }; + else + p (_("Бластер не стреляет в членов экипажа. Лучше не тратить на это время.")) + end; + elseif w == rat then + sound_("shoot_lazer")(); + walk(v_10); + else + p (_("Это не поможет")); + end; + end, +}; + +knife = obj { + nam = "Нож", + inv = [[Нож-пила. Выглядит устрашающе.]], + use = function(s, w) + if w == zombie2 then + walk(v_11); + elseif w == crewMember then + walk(v_3); + else + p (_("Это не поможет")); + end; + end, +}; + +mop = obj { + nam = "Швабра", + inv = [[Многофункциональный инструмент.]], + use = function(s, w) + if w == zombie2 then + remove("Швабра", inv()); + walk(v_7); + else + p (_("Это не поможет")); + end; + end, +}; + +shpritz = obj { + nam = _("Шприц"), + inv = _([[Шприц с остатками адреналина.]]), + tak = function() + p (_("Подскочив к телу, я выхватываю шприц.")) + end, + use = function(s, w) + if w == zombie2 then + remove(_("Шприц"), inv()); + walk(v_9); + else + p (_("Это не поможет")) + end; + end, +}; + +liftDoor = obj { + nam = _("двери лифта"), + act = _([[Конструкция таких дверей не сильно изменилась за прошедшие века.]]), +}; + +zombie2 = obj { + nam = "безумец", + act = "Это точно синдром выхода из криосна. Уговоры тут не помогут, нужно что-то другое.", +}; + +crewMember = obj { + nam = _("Член экипажа"), + act = _("Похоже, лекарство ему помогло..."), +}; + +rat = obj { + nam = _("Крыса"), + act = _("За тысячу лет пути крыса могла подрасти..."), +}; + +v_2 = room { + forcedsc = true, + nam = "У лифта", + pxa = { + { "door2_open", 170 }, + { "zombi", 190 } + }, + dsc = function(s) +p(_([[ +...Я судорожно жму на кнопки и {liftDoor|двери лифта} начинают закрываться, но {zombie2|безумец} успевает просунуть наружу свои руки. +^^ +]])); + p ("{v_07a7a31c_42f9_4396_bee3_086eb9daccf5|".._('Осмотреться вокруг').."}^"); + end, + obj = { + 'liftDoor', + 'zombie2', + xact( + 'v_07a7a31c_42f9_4396_bee3_086eb9daccf5', + function(s) + walk(v_8); + end + ), + }, +}; + +v_3 = room { + forcedsc = true, + nam = "Коридор", + dsc = _([[ +Я наклоняюсь и добиваю лежащего на полу человека. Будет спокойнее, если я буду уверен, что он мёртв. +^ +Не знаю, что будет дальше, но этот бой я выиграл. Буду надеяться на лучшее. +^^ +]]) .. txtc(_("КОНЕЦ")), +}; + +v_4 = room { + forcedsc = true, + nam = _("Коридор"), + pxa = { + { "rat", 220 } + }, + dsc = function(s) +p(_([[ +Я осторожно склоняюсь над лежащим. Похоже, что он жив: пульс ровный, зрачки не расширены, цвет глаз нормальный. +Возможно, то, что не помогло Александру, помогло этому бедолаге. +^ +Я жду довольно долго, наконец человек приходит в себя. +^ +-- Как тебя зовут? -- спрашиваю я. +^ +-- Виталий... -- отвечает он. -- Где я, что со мной? +^ +Я как можно мягче постарался ему всё объяснить. Некоторое время он ещё посидел на полу, понурив голову. +^ +-- Я очень голоден. -- наконец говорит он. -- пойду, пожалуй, в камеру оргсинтеза, попрошу роботов что-нибудь мне приготовить. +^ +Виталий медленно поднимается с пола и идёт в лифт. Видимо, он ещё не совсем в порядке. +^ +-- Постой! -- говорю я ему. -- Возьми нож, там может быть опасно. +^ +Я отдаю ему нож-пилу. Виталий кивает мне, двери лифта закрываются за ним. +^ +Раздумывая о происшедшем, я не сразу заметил, что сзади подкрадывается огромная {rat|крыса}, +привлечённая запахом крови. Похоже, она пробралась через вентиляцию. +Раздавшийся за спиной шорох выводит меня из оцепенения. Резко обернувшись, я вскрикиваю от ужаса. +^^ +]])); + p ("{v_b105d2a2_003b_4d06_8584_48252f71838d|".._("Бежать в лифт").."}^"); + if have("Нож") then remove("Нож", inv()); end; + end, + obj = { + 'rat', + xact( + 'v_b105d2a2_003b_4d06_8584_48252f71838d', + function(s) + walk(v_14); + end + ), + + }, +}; + +v_5 = room { + forcedsc = true, + nam = "Оружейная", + dsc = [[ +Собственно, мой выбор был невелик. Бежать можно было только в оружейную. Я лихорадочно шарил по полкам, пытаясь +найти хоть что-то полезное, когда сзади на меня обрушился удар и мир потемнел. +^^ +]] .. txtc("КОНЕЦ"), +}; + +v_7 = room { + forcedsc = true, + nam = "У лифта", + pxa = { + { "door2", 170 } + }, + dsc = function(s) +p [[ +Я с силой толкаю противника шваброй внутрь лифта. Он не удерживается на ногах и падает, вцепившись в швабру мёртвой хваткой. +Я едва успеваю отпустить её. Дверь закрывается. +На какое-то время сумасшедший заблокирован в кабине лифта, но по грохоту, раздающемуся изнутри, я понимаю, +что надолго это его не задержит. Рано или поздно он найдёт кнопку открытия дверей. +^^ +]]; + p ("{v_99bc11cc_a4de_4c31_8865_04ad8f93d69d|".._('Скорее бежать').."}^"); + p ("{v_6edd0aec_5b08_4812_8dc7_b6ff8ee67c2b|".._('Быстро осмотреться вокруг').."}^"); + end, + obj = { + xact( + 'v_99bc11cc_a4de_4c31_8865_04ad8f93d69d', + function(s) + walk(v_5); + end + ), + xact( + 'v_6edd0aec_5b08_4812_8dc7_b6ff8ee67c2b', + function(s) + walk(v_12); + end + ), + + }, +}; + +v_8 = room { + forcedsc = true, + nam = "Коридор", + dsc = function(s) + if not have("Шприц") then take(shpritz); end; +return [[ +Мой взгляд скользит по стенам, по лужам крови на полу, останавливается на теле Александра. Верхняя часть его тела лежит в +коридоре, нижняя -- за дверью отсека K007. В груди Александра всё ещё торчит шприц с остатками адреналина. +Подскочив к телу, я выхватываю шприц. В это же мгновение пальцы безумца смыкаются вокруг моей шеи. +^^ +]] .. txtc("КОНЕЦ"); + end, +}; + +v_9 = room { + forcedsc = true, + nam = "Коридор", + pxa = { + { "door1", 10 }, + { "door2", 200 }, + { "zombi_dead", 400 } + }, + dsc = function(s) +p [[ +С отчаянием утопающего я бросаюсь на безумца. Он оказывается гораздо более ловким чем я и хватает меня за руку и за горло. +Резко дёрнувшись в попытке вырваться, я поскальзываюсь на луже крови и мы оба с грохотом валимся на пол. +^ +Я считаю себя уже мёртвым, но тут вдруг неожиданно замечаю, что мой {crewMember|противник} внезапно затих. +Шприц вонзился ему в грудь, похоже, что лекарство подействовало. +^^ +]]; + p ("{v_119ceea5_1cd3_482b_bf37_46b0973a6e50|".._('Проверить, что с ним').."}^"); + end, + obj = { + 'crewMember', + xact( + 'v_119ceea5_1cd3_482b_bf37_46b0973a6e50', + function(s) + walk(v_4); + end + ), + + }, +}; + +v_10 = room { + forcedsc = true, + nam = "Коридор", + dsc = function(s) +p [[ +Я хватаю бластер, в тот же момент крыса бросается на меня. Дальше всё как в тумане, помню только яркий луч бластера +и резкую боль в плече. +^^ +]]; + p ("{v_327801e4_1ede_4ab4_bf5c_a669d798e86b|".._('Далее').."}^")); + end, + obj = { + xact( + 'v_327801e4_1ede_4ab4_bf5c_a669d798e86b', + function(s) + if have("Бластер") then remove("Бластер", inv()); end; + walk(v_13); + end + ), + + }, +}; + +v_11 = room { + forcedsc = true, + nam = "Коридор", + dsc = [[ +Я пытаюсь ударить безумца, но он как будто не чувствует удара. В ответ он с нечеловеческой силой отшвыривает меня +к стене. Я падаю и проваливаюсь в темноту... +^^ +]] .. txtc("КОНЕЦ"), +}; + +v_12 = room { + forcedsc = true, + nam = "Коридор", + pxa = { + { "door1", 10 }, + { "door2", 200 }, + { "zombi_dead", 400 } + }, + dsc = function(s) +p (_([[ +Мой взгляд скользит по стенам, по лужам крови на полу, останавливается на теле Александра. Верхняя часть его тела лежит в +коридоре, нижняя -- за дверью отсека K007. ]])) +p ((not have(_("Шприц"))) and _("В груди Александра всё ещё торчит {shpritz|шприц} с остатками адреналина.^" or "^")) +p (_("{zombie2|Безумец} справился с дверью лифта и приближается ко мне.^^")) +p ("{v_0df5dc84_caf3_4b24_8d7c_af7853aaf0b1|".._('Скорее бежать').."}^")); + end, + obj = { + 'shpritz', + 'zombie2', + xact( + 'v_0df5dc84_caf3_4b24_8d7c_af7853aaf0b1', + function(s) + walk(v_5); + end + ), + + }, +}; + +v_13 = room { + forcedsc = true, + nam = "Коридор", + enter = function() mute_()(); complete_("wake2")() end, + dsc = function(s) +return [[ +В коридоре криоблока появился робот WR023. Первым делом он доставил раненого в камеру автодоктора. +Пару дней, и будет как новенький. Затем он вернулся за крысой и потащил её в камеру оргсинтеза. +Для переработки сгодится. +^ +Затащив добычу в камеру оргсинтеза, робот заметил на полу человека. Он был мёртв, рядом валялась миска с остатками +отвратительной смеси. "Наверное, не справился с миксером и сепаратором", -- подумал робот. +^ +Приблизившись к телу, он собрал материал для клонирования. Сначала здесь, потом у дверей отсека K007. +Теперь придётся несколько лет ждать, пока клоны вырастут, затем в них необходимо загрузить знания, личность +и воспоминания... Эти люди так несовершенны... +]] + end, +act = gamefile_("arrival.lua"); + obj = { vobj("next", txtc("{Это ещё не конец...}")) } +}; + +v_14 = room { + forcedsc = true, + nam = "Лифт", + enter = function() mute_()(); complete_("wake2")() end, + dsc = function(s) +if have("Бластер") then remove("Бластер", inv()); end; +return [[ +Я подбегаю к лифту, жму на кнопку вызова... Конечно же, лифт не успевает приехать, и чудовище набрасывается на меня. +Огромные жёлтые клыки рядом с моим лицом -- последнее, что я вижу в своей жизни. +]] + end, +act = gamefile_("arrival.lua"); + obj = { vobj("next", txtc("{Это ещё не конец...}")) } + }; diff --git a/watch.lua b/watch.lua new file mode 100644 index 0000000..96b2970 --- /dev/null +++ b/watch.lua @@ -0,0 +1,257 @@ +-- $Name: Вахта$ +-- $Version: 0.2$ +instead_version "1.9.1" +require "lib" +require "para" +require "dash" +require "quotes" +require "timer" +require "xact" + +game.use = "Ошибка программы! Ээээ... т.е. нет, так лучше не делать." +local oob = obj; +function tc(f,s) +if type(f) == "function" then return tc(f(s),s) else return f end +end +function obj(t) +local d = t.dsc; +t.dsc = function(s) if s.cnd == nil or s:cnd() then return tc(d,s) end end +return oob(t); +end + +main = timerpause(999, 700, "main2"); + +main2 = room { +_hand=false, +nam = "...", +enter = music_("square",0), +title = { "В", "А", "Х", "Т", "А" }, +num =5, +act = function(s) walk(wakeup)end, +dsc="Я -- вахтенный робот WR005. Раз в сто лет я выхожу из режима гибернации и несу на корабле вахту на протяжении года, а потом снова отключаюсь. Куда корабль летит я не знаю -- этого нет в моих банках памяти. Но я знаю, что весь экипаж в глубокой криозаморозке.^^И вот вновь настала моя очередь дежурить. Я включаюсь...", +obj = { vobj("next", '{Начать игру}') } +} + +wakeup = room { +nam = "Пробуждение",_s=1,_f=0, +dsc = function(s) return s._dsc end, +_dsc = [[Я только что вышел из режима гибернации. Необходимо запустить {diag|программу диагностики}.^]], +timer = function(s) +s._f=s._f+1; +if s._f==1 then +s._dsc=s._dsc.."^"..s.diags[s._s]; +elseif s._f>1 and s._f<5 then +s._dsc=s._dsc.."."; +elseif s._f==5 then +if s._s==4 then +s._dsc=s._dsc.." ошибка! отсутствует правая рука!"; +timer:stop(); +s._do=true; +else +s._dsc=s._dsc.." нормально"; +s._f=0; +s._s=s._s+1; +end +end +walk(wakeup); +end, +diags= {"Банки памяти","Центральный процессор","Зрительные окуляры","Моторика"}, +obj = { xact("diag", code[[timer:set(500)]]), "wakeup_next" } +} + +wakeup_next = obj { +nam="wakeup_next", +cnd=function()return wakeup._do end, +dsc="{Продолжить}", +act=function()walk(cabin1)end +} + +cabin1 = room { +nam = "Отсек WR005",_closed=false, +pxa = { + { if_("exist(oil)","oil"), 80, 100 }, +{ if_("cabin1._closed", "door4", "door2_open"), 190 } +}, +enter=function(s) +if s._closed thenp (_("Дверь в мой отсек закрыта. Надо будет потом придумать, как её снова открыть. Но на этом у меня есть целый год.")); +return false; +end +end, +exit=function(s)if s._closed thenp (_("Сначала нужно открыть дверь."));return false; end end, +dsc = "Я нахожусь в своем отсеке. Здесь я провел сто лет в режиме гибернации.", +obj={"cabin1_walls","oil","button","cabin1_door"}, +way = {"block"} +} + +cabin1_walls=obj { +nam="",dsc="Здесь почти ничего нет -- голые металлические стены. В свою прошлую вахту я так и не успел тут всё как следует обставить. Может, в этот раз найдётся время." +} + +oil=obj { +nam="Маслёнка",dsc="На узенькой полке на стене справа лежит {маслёнка}.", +tak="Я беру маслёнку. Масло всегда пригодится.", +inv="Маслёнка. Почти полная.", +use=function(s,v) +if v==hand then +hand._oil=true; +remove(oil,me()); +return (_("Я смазываю маслом все гайки на правой руке моего коллеги. Теперь я должен без проблем её открутить.")); +end +end +} + +button=obj { +nam="",dsc="У двери красуется огромная {красная кнопка}.", +act=function() +local t="Я нажимаю на кнопку, и дверь "; +if cabin1._closed then t=t.."открывается." else t=t.."закрывается." end +cabin1._closed=not cabin1._closed;return t; +end +} +cabin1_door=obj { + nam="",dsc=function()if cabin1._closed then return (_("Сейчас дверь закрыта." else return (_("Сейчас дверь открыта.")))) end end +} + +block = room { +nam = "Технический блок", +pxa = { + { "toolbox", 440}, + { if_("cabin1._closed", "door4", "door2_open"), 10 }, + { if_("main2._hand", "robot_nohand", "robot"), 187 }, + { if_("cabin1._closed", "door2_open", "door4"), 150 }, + { "door1", 300 }, +}, +dsc = "Технический блок №2. Здесь есть два отсека для вахтенных роботов и большая толстая дверь в коридор, который ведёт на главную палубу.", +obj = {"blockbutton","toolbox","key","tube"}, +way = {"cabin1","cabin2",vroom("Коридор","endgame1")} +} + +blockbutton=obj { +nam="", +dsc="Отсюда я вижу проход в мой отсек. Если встать под углом сорок пять градусов, то можно даже заметить большу {круглую кнопку}, которая закрывает дверь отсека.", +act="Я, конечно, могу дотянуться до кнопки, но тогда дверь опустится и отрубит мою единственную руку.", +cnd=function(s)return not cabin1._closed end +} + +toolbox=obj { +nam="", +dsc = "В углу лежит {ящик с инструментами}.", +act=function(s) +if key._taken then +return (_("В ящике больше нет ничего полезного.")); +else +s._exam=true; +return (_("Я ящике лежит большой гаечный ключ.")); +end +end +} + +key=obj { +nam="Гаечный ключ", +dsc="В ящике -- {гаечный ключ}.", +inv="Гаечный ключ -- старомодно, но удобно. Хорошо подходит для того, чтобы откручивать руки.", +tak=function(s) s._taken=true;return (_("Я взял гаечный ключ.")) end, +use=function(s,v) +if v==tube and not tube._done then + tube._done=true; + take(tube); + return (_("Всё-таки гаечный ключ -- полезная штука! Раз-раз, и негодная труба выломана из стены. Теперь всё выглядит идеально.")); +elseif v==hand and not hand._oil then + return (_("Я пытаюсь открутить руку ключом, но ничего не выходит. Ни одна из гаек не желает поворачиваться.")); +elseif v==hand and hand._oil and not main2._hand then +main2._hand=true; +remove(key,me()); +return (_("Пара капель масла и... всё как по маслу! Я без проблем откручиваю у своего коллеги руку и приделываю эту руку себе. Ну, наконец-то! У меня снова две руки!")); +end +end, +cnd=function()return toolbox._exam end +} + +tube=obj { +nam="Обломок трубы",dsc="Из стены рядом с дверью в коридор торчит какая-то мятая {труба}. Труба еле держится.", +act="Без понятия, что это такое. Этого нет в моих банках памяти. Раз нет в банках памяти -- значит я за это не отвечаю. Да и вообще мятая труба как-то портит вид. Я пытаюсь выломать трубу из стены, но у меня ничего не получается.", +inv="Мятый обломок трубы. Выглядит отвратительно.", +use=function(s,v) +if v==blockbutton and have(oil) then +cabin1._closed=true; +remove(tube,me()); +return (_("Да, отличная идея! Я встаю под углом в 45 градусом, просовываю в дверной проём трубу и касаюсь круглой кнопки. Дверь тут же опускается и поднимает под себя трубу. Так ей и надо, этой трубе. К тому же теперь мой отсек закрыт... Правда, мне потом потребуется ещё одна труба, чтобы попасть обратно.")); +elseif v==blockbutton then +return (_("Ошибка! Тупиковая ситуация! Эээ... нет, мне кажется я что-то ещё не сделал.")); +end +end +} + +cabin2=room { +nam = "Отсек WR006", +pxa = { + { "door1_open", 80 }, + { if_("main2._hand", "robot_nohand", "robot"), 220 } +}, +enter = function(s) +if not cabin1._closed thenp (_("Дверь в отсек WR006 закрыта. Она откроется только, когда будет закрыта дверь в мой отсек. Вот так здесь всё устроено."));return false; +end +end, +dsc = "Это отсек другого вахтенного робота -- он старше меня ровно на единицу.", +obj = {"robot","hand"}, +way = {"block"} +} + +robot=obj { +nam="",dsc="{Мой коллега} сейчас отключён и стоит неподвижно, как колонны, подпирающие потолок в коридоре.", +act=function() if main2._hand then return (_("Надеюсь, он не сильно расстроится, когда увидит, что у него нет правой руки." else return (_("Спать ему ещё целую сотню лет.")))) end end +} + +hand=obj { +nam="",dsc="Его {правая рука} на месте.", +act="Кстати, я не говорил, что мы полностью совместимы? Да, это наводит на мысли... Правда, тут нужны инструменты.", +cnd=function() return not main2._hand end +} + +endgame1=room{ +nam="",enter=function(s) +if not main2._hand then +p "Я не могу открыть дверь в коридор без моей правой руки. В неё встроен чип-ключ. Да и вообще без руки я не смогу нести вахту."; +return false; +else +timer:set(4000) +end +end, +dsc=txtc("Прошло сто лет..."), +timer=function()timer:stop();walk(endgame2)end +} + +endgame2=room { +nam = "Пробуждение",_s=1,_f=0, +dsc = function(s) return s._dsc end, +_dsc = [[Я робот WR006. Я только что вышел из режима гибернации. Необходимо запустить {diag|программу диагностики}.^]], +timer = function(s) +s._f=s._f+1; +if s._s==5 then +mute_()(); +complete_("watch")(); +s._s=6; +s._dsc=s._dsc.."^^"..txtc("{next|КОНЕЦ?}"); +timer:stop(); +walk(endgame2); +return; +end +if s._f==1 then +s._dsc=s._dsc.."^"..s.diags[s._s]; +elseif s._f>1 and s._f<5 then +s._dsc=s._dsc.."."; +elseif s._f==5 then +if s._s==4 then +s._dsc=s._dsc.." ошибка! отсутствует правая рука!"; +s._s=5; +else +s._dsc=s._dsc.." нормально"; +s._f=0; +s._s=s._s+1; +end +end +walk(endgame2); +end, +diags= {"Банки памяти","Центральный процессор","Зрительные окуляры","Моторика"}, +obj = { xact("diag", code[[timer:set(500)]]), xact("next", code[[gamefile_("brokencycle.lua")()]]) } +}