@@ -575,12 +575,13 @@ item_talk_device = obj {
inv = [[Небольшое устройство с клавиатурой и большим количеством цветных лампочек. Оно полностью герметично и может быть использовано под водой. ]];
};
item_suit = suit {
dlg = "call_leviathan";
nam = "Скафандр";
has_coder = true;
item_deep_key = obj {
nam = "item_deep_key";
disp = "Пирамидка";
dsc = [[На пьедестале вы видите небольшой блестящий {предмет}. ]];
@@ -437,12 +437,132 @@ function input_number_nav(tab)
"_kh_enter"
return room(tab);
end;
function input_alphabet_nav(tab)
if (not tab.maxlen) then
tab.maxlen = "16";
tab.forcedsc = true;
tab.noinv = true;
tab.input = "";
tab.dsc = function(s)
pr(tab.label .. tab.input .. "_");
return false;
tab.entered = function(s)
s.input = "";
hook_keys('0', '1', '2', '3', '4', '5',
'a', 'd', 'e', 'f', 'h', 'i', 'j', 'k', 'l', 'n', 'p', 'r', 's', 't', 'v', 'y', 'z',"'",'space',
'backspace', 'return', 'escape');
tab.left = function(s)
unhook_keys('0', '1', '2', '3', '4', '5',
tab.kbd = function(s, down, key)
if (not down) then
if (key == "escape") then
back();
elseif (key == "return") then
if (s.input) then
s:check(s.input);
elseif (key == "backspace") then
if (s.input:len() > 0) then
s.input = s.input:sub(1, s.input:len() - 1);
else
if (string.len(s.input) < s.maxlen) then
s.input = s.input .. key;
-- hide buttons :)
pr("");
tab.obj = {
"_kh_input1",
"_kh_input2",
"_kh_input3",
"_kh_input4",
"_kh_input5",
"_kh_inputa",
"_kh_inputd",
"_kh_inpute",
"_kh_inputf",
"_kh_inputh",
"_kh_inputi",
"_kh_inputj",
"_kh_inputk",
"_kh_inputl",
"_kh_inputn",
"_kh_inputp",
"_kh_inputr",
"_kh_inputs",
"_kh_inputt",
"_kh_inputv",
"_kh_inputy",
"_kh_inputz",
"_kh_inputhp",
"_kh_inputsp",
"_kh_backspace",
"_kh_cancel",
_kh_input_key = function(key, key_text)
if not key_text then
key_text = key;
return obj {
nam = "_kh_input" .. key;
dsc = "{" .. key_text .. "}";
act = function(s)
if (here().input:len() < here().maxlen) then
here().input = here().input .. key;
return "";
_kh_inputa = _kh_input_key("a");
_kh_inputb = _kh_input_key("b");
_kh_inputc = _kh_input_key("c");
_kh_inputd = _kh_input_key("d");
_kh_inpute = _kh_input_key("e");
_kh_inputf = _kh_input_key("f");
_kh_inputg = _kh_input_key("g");
_kh_inputh = _kh_input_key("h");
_kh_inputi = _kh_input_key("i");
_kh_inputj = _kh_input_key("j");
_kh_inputk = _kh_input_key("k");
_kh_inputl = _kh_input_key("l");
_kh_inputm = _kh_input_key("m");
_kh_inputn = _kh_input_key("n");
_kh_inputo = _kh_input_key("o");
_kh_inputp = _kh_input_key("p");
_kh_inputq = _kh_input_key("q");
_kh_inputr = _kh_input_key("r");
_kh_inputs = _kh_input_key("s");
_kh_inputt = _kh_input_key("t");
_kh_inputu = _kh_input_key("u");
_kh_inputv = _kh_input_key("v");
_kh_inputw = _kh_input_key("w");
_kh_inputx = _kh_input_key("x");
_kh_inputy = _kh_input_key("y");
_kh_inputz = _kh_input_key("z");
_kh_inputsp = _kh_input_key(" ", "Пробел");
_kh_inputhp = _kh_input_key("'", "'");
_kh_input1 = obj {
nam = "_kh_input1";
dsc = "{1}";
here().input = here().input .. "1";
@@ -613,49 +733,72 @@ function obscured_obj(nam, dsc_a, act_a,
return act_a;
_atlantis_coder = input_alphabet_nav {
nam = "Кодировщик";
maxlen = 32;
label = "Сообщение:";
check = function(s, input)
if type(_atlantis_suit_menu._here.checkCoder) == "function" then
pn(_atlantis_suit_menu._here:checkCoder());
pn [[Лампочки кодировщика зажигаются в заданной последовательности, но ничего не происходит. ]];
_atlantis_suit_menu = dlg {
_item = nil;
dsc = [[
Что вы хотите сделать?
]];
entered = function(s)
if (s._item.has_coder) then
pon(2);
poff(2);
phr = {
{1, always = "true", "Использовать рацию", function(s)
local val = EngineUtils.getValue(_atlantis.suit_menu._item.dlg, _atlantis.suit_menu._item);
if (val) then
walkin(val);
stead.ref(val).__from__ = _atlantis.suit_menu.__from__;
return "Никто не отвечает";
end};
{2, always = "true", "Снять скафандр", function(s)
{2, always = "true", "Использовать кодировщик", code [[ walkin("_atlantis_coder"); ]]};
{3, always = "true", "Снять скафандр", function(s)
if (EngineUtils.getValue(_atlantis_suit_menu._item.cantakeoff, _atlantis_suit_menu._item)) then
drop(_atlantis._uit_menu._item);
return "Вы снимаете скафандр";
return "Вы не можете снять скафандр сейчас";
{3, always = "true", "Отмена", function(s)
{4, always = "true", "Отмена", function(s)
_atlantis = {
suit_inv = function(s)
_atlantis_suit_menu._item = s;
_atlantis_suit_menu._here = here();
walkin(_atlantis_suit_menu);
suit = function(tab)
if (not tab.inv) then
Status change: