insteadose-3/repair.lua

401 lines
15 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- $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("^{Продолжение...}")) }
}