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