604 lines
17 KiB
Lua
604 lines
17 KiB
Lua
--$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: <u>"
|
||
pr ("{a0|", sf(" %x", a0._s), "}")
|
||
pr ("{a1|", sf("%x</u> ", a1._s), "}")
|
||
pr " Data: [<u>"
|
||
pr ("{a2|", sf(" %x", a2._s), "}")
|
||
pr ("{a3|", sf("%x</u> ", 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("^{КОНЕЦ?}")) }
|
||
}
|