insteadose-3/repair.lua

401 lines
15 KiB
Lua
Raw Permalink Normal View History

2018-08-09 12:26:42 +03:00
-- $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("^{Продолжение...}")) }
}