commit 1383290603b4615a62d1e7906cca80d30fd9f4ba Author: maxchen32 Date: Sun Dec 10 19:28:07 2023 +0800 previous work diff --git a/cn.png b/cn.png new file mode 100644 index 0000000..fe514ad Binary files /dev/null and b/cn.png differ diff --git a/default_wide/SourceHanSansCN-Regular.ttf b/default_wide/SourceHanSansCN-Regular.ttf new file mode 100644 index 0000000..5c6a238 Binary files /dev/null and b/default_wide/SourceHanSansCN-Regular.ttf differ diff --git a/default_wide/adown.png b/default_wide/adown.png new file mode 100644 index 0000000..d28faad Binary files /dev/null and b/default_wide/adown.png differ diff --git a/default_wide/aup.png b/default_wide/aup.png new file mode 100644 index 0000000..c17d37a Binary files /dev/null and b/default_wide/aup.png differ diff --git a/default_wide/bg.png b/default_wide/bg.png new file mode 100644 index 0000000..a2d6864 Binary files /dev/null and b/default_wide/bg.png differ diff --git a/default_wide/click.ogg b/default_wide/click.ogg new file mode 100644 index 0000000..e87eb91 Binary files /dev/null and b/default_wide/click.ogg differ diff --git a/default_wide/click.wav b/default_wide/click.wav new file mode 100644 index 0000000..af3e8d4 Binary files /dev/null and b/default_wide/click.wav differ diff --git a/default_wide/cursor-use.png b/default_wide/cursor-use.png new file mode 100644 index 0000000..ab58453 Binary files /dev/null and b/default_wide/cursor-use.png differ diff --git a/default_wide/cursor.png b/default_wide/cursor.png new file mode 100644 index 0000000..d22b915 Binary files /dev/null and b/default_wide/cursor.png differ diff --git a/default_wide/menu.png b/default_wide/menu.png new file mode 100644 index 0000000..a8eb7e3 Binary files /dev/null and b/default_wide/menu.png differ diff --git a/default_wide/sans-b.ttf b/default_wide/sans-b.ttf new file mode 100644 index 0000000..b29a564 Binary files /dev/null and b/default_wide/sans-b.ttf differ diff --git a/default_wide/sans-bi.ttf b/default_wide/sans-bi.ttf new file mode 100644 index 0000000..0b0bf94 Binary files /dev/null and b/default_wide/sans-bi.ttf differ diff --git a/default_wide/sans-i.ttf b/default_wide/sans-i.ttf new file mode 100644 index 0000000..4a430cd Binary files /dev/null and b/default_wide/sans-i.ttf differ diff --git a/default_wide/sans.ttf b/default_wide/sans.ttf new file mode 100644 index 0000000..2de1063 Binary files /dev/null and b/default_wide/sans.ttf differ diff --git a/default_wide/use.png b/default_wide/use.png new file mode 100644 index 0000000..6a7bf57 Binary files /dev/null and b/default_wide/use.png differ diff --git a/ep1-en.lua b/ep1-en.lua new file mode 100644 index 0000000..13c457d --- /dev/null +++ b/ep1-en.lua @@ -0,0 +1,911 @@ +mywear = obj { + nam = 'quilted jacket', + dsc = function(s) + if here() == stolcorridor then + local st='.'; + if not have('gun') then + st = ', under which my shotgun is hidden.'; + end + return 'Also there\'s my {quilted jacket} on the rack'..st; + else + return 'On the nail in the pine door there\'s my {quilted jacket}.'; + end + end, + inv = 'It\'s winter. But I\'m wearing a warm quilted jacket.', + tak = function(s) + if here() == stolcorridor then + if have('alienwear') then + return 'I\'m already dressed... If I take my quilted jacket too, I\'ll look suspicious...', false; + end + if me()._walked then + me()._walked = false; + inv():add('gun'); + return 'But my quilted jacket is the best!'; + end + return 'That would be too conspicuous... ', false; + else + return 'I took my coat off the nail.'; + end + end, + use = function(s, o) + if o == 'guy' then + return 'After a short delay you exchanged coats...'; + end + end +}; + +money = obj { + nam = 'money', + inv = 'Big money are a great evil... Good thing I don\'t have much money...', + use = function(s, w) + if w == 'shopman' then + if shopman._wantmoney then + shopman._wantmoney = false; + return 'I pay to Vladimir.'; + end + return 'I don\'t want to pay without reason...'; + end + end +}; + +mybed = obj { + nam = 'bed', + dsc = 'There\'s a {bed} by the window.', + act = 'No time to sleep.', +}; + +mytable = obj { + nam = 'table', + dsc = 'There\'s an oaken {table} with drawers in the left corner.', + act = function() + if not have(money) then + take('money'); + return 'After rummaging in the drawers I found money.'; + end + return 'Table... I made it myself.'; + end, +}; + +foto = obj { + nam = 'photo', + dsc = 'On the table there\'s a framed {photo}.', + tak = 'I took the photo.', + inv = 'The photo shows me and my Barsik.', +}; + +gun = obj { + nam = 'shotgun', + dsc = 'There\'s a {shotgun} in the right corner of the cabin.', + tak = 'I took the shotgun and hung it behind my back.', + inv = function(s) + local st = ''; + if s._obrez then + st = ' By the way, now it\'s a sawed-off shotgun.'; + if s._hidden then + st = st..' It\'s hidden inside my clothes.'; + end + end + if s._loaded then + return 'The shotgun is loaded...'..st; + else + return 'The shotgun isn\'t loaded... I rarely used it in the forest...'..st; + end + end, + use = function(s, w) + if not s._hidden then + if w == 'mywear' or w == 'alienwear' then + if not s._obrez then + return 'I tried to hide the shotgun in the clothes, but it was too long.' + else + s._hidden = true; + return 'Now I can hide the sawed-off shotgun in the clothes!'; + end + end + end + if not s._loaded then + return 'Not loaded...', false; + end + if w == 'guard' then + return 'Yes, they are scoundrels, but firstly they are humans too, and secondly it wouldn\'t help...', false; + end + if w == 'wire' then + return 'Too close... I need something like wire cutters...', false; + end + if w == 'cam' and not cam._broken then + cam._broken = true; + s._loaded = false; + return 'I aimed at the camera and fired both barrels... The dull gunshot was drowned by gusts of the snowstorm...'; + end + if w == 'mycat' or w == 'shopman' or w == 'guy' then + return 'This isn\'t my thought...', false; + end + end +}; + +fireplace = obj { + nam = 'fireplace', + dsc = 'There\'s a {fireplace} by the wall. The flames illuminate the cabin irregularly.', + act = 'I like to spend long winter evenings by the fireplace.', +}; + +mycat = obj { + nam = 'Barsik', + _lflast = 0, + lf = { + [1] = 'Barsik is moving in my bosom.', + [2] = 'Barsik peers out of my bosom.', + [3] = 'Barsik purrs in my bosom.', + [4] = 'Barsik shivers in my bosom.', + [5] = 'I feel Barsik\'s warmth in my bosom.', + [6] = 'Barsik leans out of my bosom and looks around.', + }, + life = function(s) + local r = rnd(6); + if r > 2 then + return; + end + r = rnd(6); + while (s._lflast == r) do + r = rnd(6); + end + s._lflast = r; + return s.lf[r]; + end, + desc = { [1] = 'My cat {Barsik} (“little snow leopard”) is sleeping by the fireplace cosily curled in a ball.', + [2] = '{Barsik} scans the terrain around the cabin.', + [3] = '{Barsik} is sitting on the front passenger seat.', + [4] = '{Barsik} is studying something by the trash bins...', + [5] = '{Barsik} snuggles up at my feet.', + }, + inv = 'Barsik is in my bosom... My poor tomkitty... I\'ll save you!!! And the whole world...', + dsc = function(s) + local state + if here() == home then + state = 1; + elseif here() == forest then + state = 2; + elseif here() == inmycar then + state = 3; + elseif here() == village then + state = 4; + elseif here() == escape3 then + state = 5; + end + return s.desc[state]; + end, + act = function(s) + if here() == escape3 then + take('mycat'); + lifeon('mycat'); + return 'I put Barsik in my bosom.'; + end + return 'I scratched Barsik behind the ears...'; + end, +}; + +inmycar = room { + nam = 'in the car', + dsc = 'I\'m in my car... My workhorse...', + pic = 'gfx/incar.png', + way = {'forest', 'village'}, + enter = function(s, f) + local s = 'I open the car door.'; + if have('mybox') then + return 'I can\'t get into the car with this box...', false; + end + if seen('mycat') then + s = s..' Barsik jumps into the car.' + move('mycat','inmycar'); + elseif not me()._know_where then + return 'No... First I have to find Barsik!', false + end + if f == 'guarddlg' then + return 'Hmm... I\'ll have to come up with something...'; + end + return cat(s, ' Well, time to go...'); + end, + exit = function(s, t) + local s='' + if seen('mycat') then + s = ' Barsik is the first to jump out of the car.'; + move('mycat',t); + end + if ref(t) ~= from() then + from().obj:del('mycar'); + move('mycar', t); + return [[ +The car starts reluctantly... After a long road I finally kill the engine and open the door...]]..s; + end + return 'No... I think, I forgot something...'..s; + end +}; + +mycar = obj { + nam = 'my car', + desc = { + [1] = 'In front of the cabin there is my old Toyota {pickup}.', + [2] = 'In the parking lot there is my old {pickup}.', + [3] = 'Near the checkpoint stands my {pickup}.', + [4] = 'Behind the corner stands my {pickup}.', + }, + dsc = function(s) + local state + if here() == forest then + state = 1; + elseif here() == village then + state = 2; + elseif here() == inst then + state = 3; + elseif here() == backwall then + state = 4; + end + return s.desc[state]; + end, + act = function(s) + return walk('inmycar'); + end +}; + +iso = obj { + nam = 'insulating tape', + inv = 'A roll of insulating tape. Blue...', + use = function(s, o) + if o == 'trap' and not trap._iso then + trap._iso = true; + return 'I insulated the trap with the tape.'; + end + if o == 'wire' then + return 'What for? I wouldn\'t go through the barbed wire. Besides, I can\'t insulate it — I\'d be struck by electricity!'; + end + end +}; + +trap = obj { + nam = 'trap', + dsc = 'There\'s a {steel trap} in the snow.', -- !!!! + tak = 'Damned poachers! I\'m taking the trap with me.', + inv = function(s) + if s._salo then + return 'Big mousetrap! Insulated too.'; + end + if s._iso then + return 'Steel. Very sharp. Insulated with the tape.'; + else + return 'Steel. Very sharp.'; + end + end, + use = function(s, o) + if o == 'wire' and not wire._broken then + if not s._iso then + return 'The trap is metallic... I\'d be knocked by electricity and that\'s all...'; + end + wire._broken = true; + onwall.way:add('eside'); + return 'I bring the primed trap to the wire... As I thought the trap breaks the wire!'; + end + end +}; + +deepforest = room { + i = 0, + nam = 'deep forest', + pic = 'gfx/deepforest.png', + dsc = function(s) + local st = 'I\'m deep in the woods... '; + if s._i == 1 then + return st..'Pines and firs... Nothing else...'; + elseif s._i == 2 then + return st..'Beautiful birches — trying not to get lost...'; + elseif s._i == 3 then + return st..'Impassable thicket... I don\'t understand — am I lost?..'; + elseif s._i == 4 then + return st..'Beautiful lake... Yes... Should I go back?'; + elseif s._i == 5 then + s._trap = true; + return st..'Some bushes... Bushes... Bushes...'; + else + return st..'Stump... What a beautiful stump...'; + end + end, + enter = function(s,f) + if f == 'forest' then + s._trap = false; + end + s._lasti = s._i; + while (s._i == s._lasti) do + s._i = rnd(6); + end + s.obj:del('trap'); + s.way:del('forest'); + if s._i == 5 and not inv():srch('trap') then + s.obj:add('trap'); + end + if s._i == 3 and s._trap then + s.way:add('forest'); + end + if f == 'forest' and inv():srch('trap') then + return [[Thanks, i\'ve already went for a walk in the forest...]], false; + end + if f == 'deepforest' then + return 'Hmm... Let\'s see...'; + end + return [[Into the wild woods, afoot? +Hm... Why not — that's my job after all... Would drive away some poachers...]], true; +--Я пол часа бродил по лесу, когда наткнулся на капкан... +--Проклятые браконьеры! Я взял капкан с собой.]], false; + end, + way = {'deepforest'}, +}; + +road = room { + nam = 'road', + enter = function() + return 'Afoot? Naah...', false; + end +}; + +forest = room { + nam = 'in front of the cabin', + pic = 'gfx/forest.png', + dsc = [[ +In front of the cabin everything is covered with drifting snow. Wild wood surrounds the cabin. The road to town is covered with snow.]], + way = { 'home', 'deepforest', 'road' }, + obj = { 'mycar' }, +}; + +home = room { + nam = 'cabin', + pic = function(s) + if not seen('mycat') then + return "gfx/house-empty.png" + end + return "gfx/house.png"; + end, + dsc = [[ +I spent 10 years in this hut. 10 years ago I built it myself. Somewhat cramped, but cozy.]], + obj = { 'fireplace', 'mytable', 'foto', 'mycat', 'gun', + vobj(1,'window', 'The cabin has a single {window}.'), + 'mybed', 'mywear' }, + way = { 'forest' }, + act = function(s,o) + if o == 1 then + return 'Outside everything\'s white...'; + end + end, + exit = function() + if not have('mywear') then + return 'It\'s cold outside... I won\'t go there without my quilted jacket.', false + end + if seen(mycat) then + move('mycat','forest'); + return [[ +When I was walking out, Barsik suddenly woke and dashed after me. I petted him behind the ears. “Coming with me?” +]] + end + end +}; +---------------- here village begins +truck = obj { + nam = 'black car', + dsc = 'There\'s a black {car} with tinted windows sy the shop.', + act = 'Hm... It\'s a van... Armored body, it\'s evident by the wheel load...', +}; + +guydlg = dlg { + pic = 'gfx/guy.png', + nam = 'conversation with a bum', + dsc = 'I walked to him... He turned back and glanced at me — a shortish man in a worn cap and tattered quilted jacket.', + obj = { + [1] = phr('Hi! Cold, isn\'t it?', 'Yes... Somewhat...'), + [2] = phr('How come you\'ve got to be out in the street?', +[[I used to work toward getting a Ph.D... I was writing a thesis about the structure of matter... But... Overstrained my brain... I tried to calm down and... Now I'm here...]]), + [3] = phr('What\'s your name?', 'Eduard...'), + [4] = _phr('When I left, there was a cat next to you... Where is it?', 'Hm...', 'pon(5)'), + [5] = _phr('Yes... A tomcat. Ordinary tomcat roaming the snow around the dumpster.', 'So, that was your cat? Emmm...', 'pon(6)'); + [6] = _phr('Yes... That was my Barsik! Tell me!', +'... Mmm... I think that man took it... Mmm... — a chill ran down my spine...', 'pon(7)'), + [7] = _phr('Where, where did he go?', 'Sorry, brother, I haven\'t seen...', 'shopdlg:pon(4); pon(8);'), + [8] = phr('Ok... Doesn\'t matter...', '...', 'pon(8); back()'), + }, + exit = function() + pon(1); + return 'He turned back and continued rummaging in the dumpster bins...'; + end +}; + +guy = obj { + nam = 'bum', + dsc = 'A {bum} is rummaging in the dumpster bins.', + act = function() + return walk('guydlg'); + end, + used = function(s, w) + if w == 'money' then + return [[ +I approached him and offered some money... “I don't need other people's money...” he said.]]; + else + return 'What would he need this for?'; + end + end, +}; + +nomoney = function() + pon(1,2,3,4,5); + shopdlg:pon(2); + return cat('This is when I remember, that I\'ve got no money... None at all...^',back()); +end + +ifmoney ='if not have("money") then return nomoney(); end; shopman._wantmoney = true; '; + +dshells = obj { + nam = 'shells', + dsc = function(s) + -- Note for translators: + -- this block picks the appropriate plural form + -- for “shells” for a given numeral. Since English has + -- only 1 form, I commented it out. + -- Uncomment and use form-number combinations + -- appropriate for your language + -- if here()._dshells > 4 then + return 'Under my feet there are '..here()._dshells..' empty shotgun {shells}...'; + -- else + -- return 'Under my feet there are '..here()._dshells..' empty shotgun {shells}...'; + -- end + end, + act = 'Those are my shells... I don\'t need them anymore...'; +}; + +function dropshells() + if here() == deepforest then + return; + end + if not here()._dshells then + here()._dshells = 2; + else + here()._dshells = here()._dshells + 2; + end + here().obj:add('dshells'); +end + +shells = obj { + nam = 'cartridges', + inv = 'Shotgun cartridges. I rarely use those, mostly against poachers.', + use = function(s, on) + if on == 'gun' then + if gun._loaded then + return 'Already loaded...'; + end + if gun._loaded == false then + gun._loaded = true; + dropshells(); + return 'I open the shotgun, drop two shells and reload the shotgun.'; + end + gun._loaded = true; + return 'I take two cartridges and load them into the twin barrels of the shotgun...'; + end + end +}; + +news = obj { + nam = 'newspaper', + inv = [[ +Fresh newspaper... <>.. Hm...]], + used = function(s, w) + if w == 'poroh' then + if have('trut') then + return 'I\'ve already got a tinder.'; + end + inv():add('trut'); + inv():del('poroh'); + return 'I pour gunpowder on the piece of the newspaper, I\'ve torn off...'; + end + end, +}; + +hamb = obj { + nam = 'hamburger', + inv = function() + inv():del('hamb'); + return 'I\'ve had a snack. Junk food...'; + end +}; + +zerno = obj { + nam = 'groats', + inv = 'Just a buckwheat. Buckwheat groats...', +}; + +shop2 = dlg { + nam = 'buy', + pic = 'gfx/shopbuy.png', + obj = { + [1] = phr('Shotgun cartridges... I need ammunition...', 'All right... Price as usual', ifmoney..'inv():add("shells")'), + [2] = phr('Groats...', 'Good... ', ifmoney..'inv():add("zerno")'), + [3] = phr('And a hamburger...', 'Ok..', ifmoney..'inv():add("hamb")'), + [4] = phr('Fresh press...', 'Of course...', ifmoney..'inv():add("news")'), + [5] = phr('A roll of insulating tape...', 'Yes. Here.', ifmoney..'inv():add("iso")'), + [6] = phr('Nothing else...', 'As you wish.', 'pon(6); back()'), + [7] = _phr('Also I need a ladder and wire cutters...', 'Sorry, I don\'t have those — Vladimir shakes his head'), + }, + exit = function(s) + if have('news') then + s.obj[4]:disable(); + end + end +}; + +shopdlg = dlg { + nam = 'conversation with the salesman', + pic = 'gfx/shopman.png', + dsc = 'Little eyes drill me with an oily stare.', + obj = { + [1] = phr('Hello, Vladimir! How\'s it going?', 'Hello, '..me().nam..'... So-so... - Vladimir smiles slyly.', 'pon(2)'), + [2] = _phr('I want to make a few purchases.', 'Ok... Let\'s see, what do you need?', 'pon(2); return walk("shop2")'), + [3] = phr('Bye then!...', 'Yeah... Good luck!', 'pon(3); return back();'), + [4] = _phr('A man just was here — who is he?', 'Hm? — Vladimir\'s thin eyebrows rise a bit...','pon(5)'), + [5] = _phr('For some reason he took my cat... Probably thought he\'s homeless... Who\'s that man in a gray coat?', +[[ +Actually, he's some boss... - Vladimir scratches his unshaved chin. — In that new institute, which has been built in our backwoods a year ago... + — Vladimir's pince-nez twitched as he spoke — he often comes to our shop, +doesn't like crowds — those physicists — you know... Odd bunch, — Vladimir shrugged...]],'pon(6)'), + [6] = _phr('Where is this institute located?', +'Kilometer marker 127... But well, you know — Vladimir lowered his voice — there are rumours about his institute...', 'me()._know_where = true; inmycar.way:add("inst");pon(7)'), + [7] = _phr('I\'m just going to get back my cat...', 'Take care... If I was in you shoes... — Vladimir shakes his head. — By the way, I think his name is Belin. I\'ve seen his credit card... Even though, as you know, I don\'t accept them — Vladimir moved his lips, his monocle stirred slyly'), + }, +}; + +shopman = obj { + nam = 'salesman', + dsc = 'There\'s a {salesman} behind the counter. His wide face with stubble is complemented by a monocle.', + act = function() + return walk('shopdlg'); + end +}; + +shop = room { + nam = 'shop', + pic = 'gfx/inshop.png', + enter = function(s, f) + if village.obj:look('truck') then + village.obj:del('truck'); + village.obj:del('mycat'); + return [[ +When I entered the shop, I almost ran into an unpleasant man in a grey coat and broad-brimmed hat... He apologized in a sort of hissing voice and feighned raising his hat... White teeth flashed from under the brim... When I reached the counter, I heard the engine starting.]]; + end + end, + act = function(s,w) + if w == 1 then + return 'There\'s only my car left in the parking lot.'; + end + end, + dsc = [[ +The store is somewhat unusual... Here you can find ironware, food, even ammunition... No wonder, since it's the only store in a 100 km area...]], + way = { 'village' }, + obj = {'shopman',vobj(1, 'окно', 'Through the {window} the parking lot is visible.') }, + exit = function(s, t) + if t ~= 'village' then + return; + end + if shopman._wantmoney then + return 'I was going to step outside, when I was stopped by Vlsdimir\'s quiet semicough... Of course, I forgot to pay...', false; + end + if not have('news') then + shop2.obj[4]:disable(); + inv():add('news'); + return 'I was going to leave, when Vladimir\'s voice stopped me. — Take the fresh newspaper — it\'s free for you. I walk back, take the paper and leave.'; + end + end +}; + +carbox = obj { + _num = 0, + nam = function(s) + if s._num > 1 then + return 'boxes in the car'; + else + return 'a box in the car'; + end + end, + act = function(s) + if inv():srch('mybox') then + return 'I\'ve already got a box in my hands...'; + end + s._num = s._num - 1; + if s._num == 0 then + mycar.obj:del('carbox'); + end + take('mybox'); + return 'I took a box from the car.'; + end, + dsc = function(s) + if s._num == 0 then + return; + elseif s._num == 1 then + return 'There is one {box} in the cargo body of my car.'; + -- Again not needed, since "boxes" stays the same for all numerals + -- elseif s._num < 5 then + -- return 'There are '..tostring(s._num)..' {boxes} in the cargo body of my car.'; + else + return 'There are '..tostring(s._num)..' {boxes} in the cargo body of my car..'; + end + end, +}; + +mybox = obj { + nam = 'a box', + inv = 'I am holding a wooden box... A soundly built thing! Might come in handy.', + use = function(s, o) + if o == 'boxes' then + inv():del('mybox'); + return 'I put the box back...'; + end + if o == 'mycar' then + inv():del('mybox'); + mycar.obj:add('carbox'); + carbox._num = carbox._num + 1; + return 'I put the box in the cargo body of my car...'; + end + if o == 'ewall' or o == 'wboxes' then + if not cam._broken then + return 'The camera won\'t let me...'; + end + if wboxes._num > 7 then + return "It's enough I think..." + end + inv():del('mybox'); + ewall.obj:add('wboxes'); + wboxes._num = wboxes._num + 1; + if wboxes._num > 1 then + return 'I put another box on top of the previous one...'; + end + return 'I put the box next to the wall...'; + end + end +}; + +boxes = obj { + nam = 'ящики', + desc = { + [1] = 'Near the parking lot there are many empty wooden {boxes} that once held tins.', + }, + dsc = function(s) + local state = 1; + return s.desc[state]; + end, + act = function(s, t) + if carbox._num >= 5 then + return 'Maybe I\'ve got enough boxes already?...'; + end + if inv():srch('mybox') then + return 'I\'m holding one box already...'; + end + take('mybox'); + return 'I took a box.'; + end, +}; + +village = room { + nam = 'parking lot in front of the store', + dsc = 'A familiar place in front of the store. The parking lot. All covered with snow...', + pic = 'gfx/shop.png', + act = function(s, w) + if w == 1 then + return 'Ordinary bins... White snow covers the garbage...'; + end + end, + exit = function(s, t) + if t == 'shop' and seen('mycat') then + return 'I called Barsik, but he was too busy with the dumpster... OK, it won\'t take long...'; + end + end, + enter = function(s, f) + if ewall:srch('wboxes') and wboxes._num == 1 then + ewall.obj:del('wboxes'); + ewall._stolen = true; + wboxes._num = 0; + end + if f == 'shop' and not s._ogh then + s._ogh = true; + set_music("mus/revel.s3m"); + guydlg:pon(4); + guydlg:poff(8); + return 'I glanced over the parking lot and called — Barsik! Barsik! — Where did my cat disappear?'; + end + end, + way = { 'road', 'shop' }, + obj = { 'truck', vobj(1,'bins', 'Rusty dumpster {bins} are covered with snow.'), 'guy','boxes' }, +}; +----------- trying to go over wall +function guardreact() + pon(7); + if inst:srch('mycar') then + inst.obj:del('mycar'); + inmycar.way:add('backwall'); + inst.way:add('backwall'); + return cat([[Four people with submachine guns escorted me to my car. I had to start the engine and drive away from the institute. I drove a dozen kilometers before the military jeep with the seeing-off guards disappeared from the rear-view mirror... ]], walk('inmycar')); + end + return cat([[Four armed people throw me out of the check-point.^^]], walk('inst')); +end + +guarddlg = dlg { + nam = 'guard', + pic = 'gfx/guard.png', + dsc = [[I can see the angular face of the guard. His eyes look archly, but corners of his mouth are turned down, discouraging any conversation...]], + obj = { + [1] = phr('One of the institute staff took my cat by mistake — I need to get in.','— Show the pass...', 'poff(2); pon(3);'), + [2] = phr('I forgot my pass — may I come in?','— No...', 'poff(1); pon(3);'), + [3] = _phr('Do you know Belin? He\'s got my cat — I need to take it...', '— No pass?', 'pon(4)'), + [4] = _phr('I just came to get back my cat! Give me Belin\'s number.', +[[The guard's eyes change their color. The corners of his lips move up. — Mister, as I understand you have no pass. Walk out of here while you still can...]], 'pon(5, 6)'), + [5] = _phr('I\'m gonna hit your face...', 'The guard\'s hand moves to his submachine gun. ', 'poff(6); return guardreact();'), + [6] = _phr('OK, I\'m leaving...', '— Don\'t hurry, — the guard no longer hides his smile — I don\'t like you...','poff(5); return guardreact()'), + [7] = _phr('Now I\'m gonna shotgun you all...', 'This time the guard doesn\'t even answer. His bloodshot eyes speak louder than any words.','return guardreact()'), + }, +}; +guard = obj { + nam = 'guards', + dsc = [[ +There are {guards} in the kiosk. Looks like they are armed with Kalashnikov submachine guns. +]], + act = function(s) + return walk('guarddlg'); + end, +}; +kpp = room { + nam = 'checkpoint', + pic = 'gfx/kpp.png', + dsc = [[The checkpoint leaves no doubt that strangers are not welcome in the institute. Lift gate. Latticed kiosk. And silence. +]], + obj = { 'guard' }, + way = { 'inst' } +}; +inst = room { + nam = 'institute', + pic = 'gfx/inst.png', + dsc = [[ +The building rises over the empty field of snow. Its sinister outline looks more like a jail rather than a research institute. There are railways behind the building. ]], + act = function(s, w) + if w == 1 then + return 'The wall is 5 meters high. Moreover, there is barbed wire on its top, and I suppose it\'s alive...'; + end + if w == 2 then + return 'Yes, Vladimir was right... It\'s some sort of a military headquaters...'; + end + if w == 3 then + return 'Yes — this looks like the van in which the man in gray coat took away my Barsik.'; + end + end, + used = function(s, w, b) + if b == 'mybox' and w == 1 then + return 'I think the guards will notice me at once.'; + end + if w == 2 and b == 'gun' and gun._loaded then + return 'I\'d get canned for that... Or just beaten... The guards are quite near.'; + end + if w == 3 and b == 'gun' and gun._loaded then + return 'I need the cat, not destruction...'; + end + end, + obj = {vobj(1, 'wall', 'The institute building is surrounded by a heavy concrete {wall}. There\'s a checkpoint at the centre.'), + vobj(2, 'cameras', 'Survelliance {cameras} watch the area from the towers.'), + vobj(3, 'van', 'Behind the gate I can see the black {van}.')}, + way = { 'road', 'kpp' }, + exit = function(s, t) + if have('mybox') and t ~= 'inmycar' then + return 'I won\'t walk around with the box...', false; + end + end, +}; + +cam = obj { + nam = 'surveillance camera', + dsc = function(s) + if not s._broken then + return 'One of the surveillance {cameras} isn\'t far from here. I press myself to the wall to stay unnoticed.'; + end + return 'The shards of the surveillance {camera} are lying around. They\'re already dusted by snow.'; + end, + act = function(s) + if not s._broken then + return 'Damned camera...'; + end + return 'Ha... You\'ve had it coming, damned mechanism, hadn\'t you? I wonder when will the guards come...'; + end, +}; + +wire = obj { + nam = 'barbed wire', + dsc = function(s) + if s._broken then + return 'I can see the shreds of barbed {wire}.'; + end + return 'I can see barbed {wire}.'; + end, + act = function(s) + if s._broken then + return 'Now it\'s safe! I can get inside...'; + end + return 'What if it\'s alive?'; + end, +}; + +onwall = room { + pic = 'gfx/onwall.png', + nam = 'on the wall', + dsc = 'I am standing atop the boxes, my head is on the wall top level. It\'s cold.', + enter = function(s) + if have('mybox') then + return 'I cannot climb the wall with a box in my hands.', false; + end + if wboxes._num < 5 then + return 'I try to climb the wall... But it\'s still to high...',false; + end + return 'I climb the wall over the boxes.'; + end, + obj = { 'wire' }, + way = { 'backwall' } +}; + +wboxes = obj { + _num = 0, + nam = function(s) + if (s._num > 1) then + return 'boxes by the wall'; + end + return 'a box by the wall'; + end, + act = function(s) + return walk('onwall'); + end, + dsc = function(s) + if s._num == 0 then + return; + elseif s._num == 1 then + return 'There is one {box} by the wall.'; + -- And again only one plural form + -- elseif s._num < 5 then + -- return 'There are '..tostring(s._num)..' {boxes}, stacked by the wall.'; + else + return 'There are '..tostring(s._num)..' {boxes}, stacked by the wall.'; + end + end, +}; + +ewall = obj { + nam = 'wall', + dsc = 'Here {the wall} is 4 meters high. The howling snowdrift tosses snowflakes to its bottom.', + act = function(s) + if not s._ladder then + s._ladder = true; + shop2:pon(7); + end + return 'Too high... I\'ll need a ladder.'; + end +}; + +backwall = room { + pic = 'gfx/instback.png', + enter = function(s, f) + local st = ''; + if ewall._stolen then + ewall._stolen = false; + st = 'Oho!!! Somebody has stolen my box!!!'; + end + if f == 'inmycar' then + return 'Great... Looks like I managed to get here unnoticed...'..' '..st; + end + if f == 'onwall' then + return + end + return 'Rambling through the snowfield I got to the back wall.'..' '..st; + end, + nam = 'eastern wall of the institute', + dsc = 'I am at the back side of the institute.', + obj = { 'ewall', 'cam' }, + way = { 'inst', }, + exit = function(s, t) + if have('mybox') and t ~= 'inmycar' then + return 'I won\'t walk around with the box in my hands...', false; + end + end, +}; diff --git a/ep1-ru.lua b/ep1-ru.lua new file mode 100644 index 0000000..693d037 --- /dev/null +++ b/ep1-ru.lua @@ -0,0 +1,914 @@ +mywear = obj { + nam = 'ватник', + dsc = function(s) + if here() == stolcorridor then + local st='.'; + if not have('gun') then + st = ', под которым спрятан дробовик.'; + end + return 'А еще на вешалке висит мой {ватник}'..st; + else + return 'На гвоздике, вбитом в сосновую дверь, висит {ватник}.'; + end + end, + inv = 'Зима. Но я одет в теплый ватник.', + tak = function(s) + if here() == stolcorridor then + if have('alienwear') then + return 'Я уже одет... Если я еще схвачу свой ватник, то буду выглядеть подозрительно...', false; + end + if me()._walked then + me()._walked = false; + inv():add('gun'); + return 'Все же мой ватник самый лучший!'; + end + return 'Это слишком заметно... ', false; + else + return 'Я снял с гвоздика свой ватник.'; + end + end, + use = function(s, o) + if o == 'guy' then + return 'Немного помешкав, вы поменялись ватниками...'; + end + end +}; + +money = obj { + nam = 'деньги', + inv = 'Большие деньги — большое зло... Хорошо что у меня немного денег...', + use = function(s, w) + if w == 'shopman' then + if shopman._wantmoney then + shopman._wantmoney = false; + return 'Я расплачиваюсь с Владимиром.'; + end + return 'Я не хочу платить просто так...'; + end + end +}; + +mybed = obj { + nam = 'кровать', + dsc = 'У окна стоит {кровать}.', + act = 'Сейчас не время спать.', +}; + +mytable = obj { + nam = 'стол', + dsc = 'В левом углу стоит дубовый {стол} с ящиками.', + act = function() + if not have(money) then + take('money'); + return 'Порывшись в ящиках я достал деньги.'; + end + return 'Стол... Этот стол я сделал своими руками.'; + end, +}; + +foto = obj { + nam = 'фото', + dsc = 'На столе стоит {фотокарточка} в рамке.', + tak = 'Я взял фотографию.', + inv = 'На этой фотографии изображены я и мой Барсик.', +}; + +gun = obj { + nam = 'дробовик', + dsc = 'В правом углу хижины стоит {дробовик}.', + tak = 'Я взял дробовик и повесил его за спину.', + inv = function(s) + local st = ''; + if s._obrez then + st = ' Кстати, теперь это обрез.'; + if s._hidden then + st = st..' Он спрятан в моей одежде.'; + end + end + if s._loaded then + return 'Дробовик заряжен...'..st; + else + return 'Разряженный дробовик... Я редко пользовался им в лесу...'..st; + end + end, + use = function(s, w) + if not s._hidden then + if w == 'mywear' or w == 'alienwear' then + if not s._obrez then + return 'Я попытался спрятать дробовик в одежду, но он слишком длинный.' + else + s._hidden = true; + return 'Теперь я могу спрятать обрез в одежде!'; + end + end + end + if not s._loaded then + return 'Не заряжен...', false; + end + if w == 'guard' then + return 'Да, они негодяи, но во-первых они люди, а во-вторых все-равно не поможет...', false; + end + if w == 'wire' then + return 'Слишком близко... Тут нужно что-то вроде кусачек...', false; + end + if w == 'cam' and not cam._broken then + cam._broken = true; + s._loaded = false; + return 'Я прицелился в камеру и выстрелил из обоих стволов... Глухой выстрел потонул в порывах вьюги...'; + end + if w == 'mycat' or w == 'shopman' or w == 'guy' then + return 'Это не моя мысль...', false; + end + end +}; + +fireplace = obj { + nam = 'камин', + dsc = 'У стены стоит {камин}. Огоньки пламени неравномерно освещают хижину.', + act = 'Мне нравится сидеть у камина долгими зимними вечерами.', +}; + +mycat = obj { + nam = 'Барсик', + _lflast = 0, + lf = { + [1] = 'Барсик шевелится у меня за пазухой.', + [2] = 'Барсик выглядывает из-за пазухи.', + [3] = 'Барсик мурлычет у меня за пазухой.', + [4] = 'Барсик дрожит у меня за пазухой.', + [5] = 'Я чувствую тепло Барсика у себя за пазухой.', + [6] = 'Барсик высовывает голову из за пазухи и осматривает местность.', + }, + life = function(s) + local r = rnd(6); + if r > 2 then + return; + end + r = rnd(6); + while (s._lflast == r) do + r = rnd(6); + end + s._lflast = r; + return s.lf[r]; + end, + desc = { [1] = 'Возле камина уютно свернувшись в клубок спит мой кот {Барсик}.', + [2] = '{Барсик} изучает местность вокруг хижины.', + [3] = '{Барсик} сидит на соседнем сидении.', + [4] = '{Барсик} что-то изучает у мусорных баков...', + [5] = '{Барсик} трется у моих ног.', + }, + inv = 'Барсик у меня за пазухой... Бедный мой котик... Я спасу тебя!!! И весь мир...', + dsc = function(s) + local state + if here() == home then + state = 1; + elseif here() == forest then + state = 2; + elseif here() == inmycar then + state = 3; + elseif here() == village then + state = 4; + elseif here() == escape3 then + state = 5; + end + return s.desc[state]; + end, + act = function(s) + if here() == escape3 then + take('mycat'); + lifeon('mycat'); + return 'Я забираю Барсика к себе за пазуху.'; + end + return 'Я почесал Барсика за ушами...'; + end, +}; + +inmycar = room { + nam = 'в машине', + dsc = 'Я в своей машине... Моя рабочая лошадка...', + pic = 'gfx/incar.png', + way = {'forest', 'village'}, + enter = function(s, f) + local s = 'Я открываю дверь машины.'; + if have('mybox') then + return 'Я не могу залезть в кабину вместе с этим ящиком...', false; + end + if seen('mycat') then + s = s..' Барсик запрыгивает в кабину.' + move('mycat','inmycar'); + elseif not me()._know_where then + return 'Нет... Сначала я должен найти Барсика!', false + end + if f == 'guarddlg' then + return 'Хмм... Нужно что-то придумать...'; + end + return cat(s, ' Ну что же, пора ехать...'); + end, + exit = function(s, t) + local s='' + if seen('mycat') then + s = ' Барсик выпрыгивает из машины первым.'; + move('mycat',t); + end + if ref(t) ~= from() then + from().obj:del('mycar'); + move('mycar', t); + return [[ +Машина неохотно заводится... После длинного пути я, наконец, выключаю мотор и открываю дверь...]]..s; + end + return 'Нет... Кажется, я что-то забыл...'..s; + end +}; + +mycar = obj { + nam = 'моя машина', + desc = { + [1] = 'Перед хижиной стоит мой старенький {пикап} Toyota.', + [2] = 'На стоянке машин стоит мой старенький {пикап}.', + [3] = 'Возле КПП стоит мой {пикап}.', + [4] = 'За углом стены стоит мой {пикап}.', + }, + dsc = function(s) + local state + if here() == forest then + state = 1; + elseif here() == village then + state = 2; + elseif here() == inst then + state = 3; + elseif here() == backwall then + state = 4; + end + return s.desc[state]; + end, + act = function(s) + return walk('inmycar'); + end +}; + +iso = obj { + nam = 'изолента', + inv = 'Моток изоленты. Синего цвета...', + use = function(s, o) + if o == 'trap' and not trap._iso then + trap._iso = true; + return 'Я изолировал капкан изолентой.'; + end + if o == 'wire' then + return 'Зачем мне это? Я все-равно не пролезу по колючей проволоке. К тому же я не могу ее изолировать — меня долбанет током!'; + end + end +}; + +trap = obj { + nam = 'капкан', + dsc = 'В снегу лежит стальной {капкан}.', + tak = 'Проклятые браконьеры! Я беру капкан себе.', + inv = function(s) + if s._salo then + return 'Большая мышеловка! К тому же изолированная изолентой.'; + end + if s._iso then + return 'Стальной. Очень острый. К тому же изолированный изолентой.'; + else + return 'Стальной. Очень острый.'; + end + end, + use = function(s, o) + if o == 'wire' and not wire._broken then + if not s._iso then + return 'Капкан железный... Тряхонет током и будь здоров...'; + end + wire._broken = true; + onwall.way:add('eside'); + return 'Я подношу взведенный капкан к проволоке... Как я и думал — капкан перебил проволоку!'; + end + end +}; + +deepforest = room { + i = 0, + nam = 'чаща', + pic = 'gfx/deepforest.png', + dsc = function(s) + local st = 'Я в чаще... '; + if s._i == 1 then + return st..'Сосны и ели... Больше ничего...'; + elseif s._i == 2 then + return st..'Красивая березы — только бы не заблудиться...'; + elseif s._i == 3 then + return st..'Непроходимая чаща... Ничего не пойму — я что — заблудился?...'; + elseif s._i == 4 then + return st..'Красивое озеро... Да... Может пора возвращаться?'; + elseif s._i == 5 then + s._trap = true; + return st..'Какие-то кусты... Кусты.. Кусты...'; + else + return st..'Пенек... Какой красивый пенек...'; + end + end, + enter = function(s,f) + if f == 'forest' then + s._trap = false; + end + s._lasti = s._i; + while (s._i == s._lasti) do + s._i = rnd(6); + end + s.obj:del('trap'); + s.way:del('forest'); + if s._i == 5 and not inv():srch('trap') then + s.obj:add('trap'); + end + if s._i == 3 and s._trap then + s.way:add('forest'); + end + if f == 'forest' and inv():srch('trap') then + return [[Спасибо, я уже погулял по лесу...]], false; + end + if f == 'deepforest' then + return 'Хмм... Посмотрим...'; + end + return [[В дикую чащу, пешком? +Хм... Почему бы и нет — это же моя работа... Браконьеров погоняю...]], true; +--Я пол часа бродил по лесу, когда наткнулся на капкан... +--Проклятые браконьеры! Я взял капкан с собой.]], false; + end, + way = {'deepforest'}, +}; + +road = room { + nam = 'дорога', + enter = function() + return 'Пешком? Нееет...', false; + end +}; + +forest = room { + nam = 'перед хижиной', + pic = 'gfx/forest.png', + dsc = [[ +На улице перед хижиной все занесено снегом. Дикий лес окружает хижину со всех сторон. Дорога, ведущая в поселок, занесена снегом.]], + way = { 'home', 'deepforest', 'road' }, + obj = { 'mycar' }, +}; + +home = room { + nam = 'хижина', + pic = function(s) + if not seen('mycat') then + return "gfx/house-empty.png" + end + return "gfx/house.png"; + end, + dsc = [[ +В этой хижине я провел 10 лет. 10 лет назад я своими руками построил ее. Довольно тесно, но уютно.]], + obj = { 'fireplace', 'mytable', 'foto', 'mycat', 'gun', + vobj(1,'окно', 'В хижине есть единственное {окно}.'), + 'mybed', 'mywear' }, + way = { 'forest' }, + act = function(s,o) + if o == 1 then + return 'За окном белым-бело...'; + end + end, + exit = function() + if not have('mywear') then + return 'На улице холодно... Я не пойду туда без моего ватника.', false + end + if seen(mycat) then + move('mycat','forest'); + return [[ +Когда я выходил из хижины, Барсик внезапно проснулся и бросился мне под ноги. +Я погладил его за ушами — Значит едем вместе? +]] + end + end +}; +---------------- here village begins +truck = obj { + nam = 'черная машина', + dsc = 'Черная {машина} с тонированными стеклами стоит возле магазина.', + act = 'Гм... Это фургон... Кузов бронирован, это видно по нагрузке на колеса...', +}; + +guydlg = dlg { + pic = 'gfx/guy.png', + nam = 'разговор с бездомным', + dsc = 'Я подошел к нему... Он оглянулся и посмотрел на меня беглым взглядом - невысокий человек в потертой кепке и драном ватнике.', + obj = { + [1] = phr('Привет! Холодно, наверное?', 'Да... Немного...'), + [2] = phr('Как случилось, что ты оказался на улице?', +[[Когда-то я хотел стать кандидатом наук... Писал диссертацию на тему строения материи.. Но... Мой мозг +переутомился... Я пытался успокоиться и вот... Теперь я здесь...]]), + [3] = phr('Как тебя зовут?', 'Эдуард...'), + [4] = _phr('Когда я уходил, тут возле тебя был кот... Где он?', 'Гм...', 'pon(5)'), + [5] = _phr('Да... Кот. Обычный кот, бродящий по снегу возле мусорных баков.', 'Так это был твой кот? Эммм...', 'pon(6)'); + [6] = _phr('Да... Это мой Барсик! Говори же!', +'... Ммм... Кажется его взял этот человек... Ммм... — холодок пробежал у меня по спине...', 'pon(7)'), + [7] = _phr('Куда, куда он поехал?', 'Извини, братишка, я не видел...', 'shopdlg:pon(4); pon(8);'), + [8] = phr('Ладно... Не важно...', '...', 'pon(8); back()'), + }, + exit = function() + pon(1); + return 'Он отвернулся от меня и снова стал шарить по бакам...'; + end +}; + +guy = obj { + nam = 'бездомный', + dsc = 'В мусорных баках копается {бездомный}.', + act = function() + return walk('guydlg'); + end, + used = function(s, w) + if w == 'money' then + return [[ +Я подошел и попытался дать немного денег... — Мне не нужны чужие деньги... — ответил он.]]; + else + return 'Зачем это ему?'; + end + end, +}; + +nomoney = function() + pon(1,2,3,4,5); + shopdlg:pon(2); + return cat('Тут я вспоминаю, что у меня нет денег... Совсем...^',back()); +end + +ifmoney ='if not have("money") then return nomoney(); end; shopman._wantmoney = true; '; + +dshells = obj { + nam = 'гильзы', + dsc = function(s) + if here()._dshells > 4 then + return 'Под ногами валяется '..here()._dshells..' {гильз} от моего дробовика...'; + else + return 'Под ногами валяются '..here()._dshells..' {гильзы} от моего дробовика...'; + end + end, + act = 'Это мои гильзы... Мне они больше не нужны...'; +}; + +function dropshells() + if here() == deepforest then + return; + end + if not here()._dshells then + here()._dshells = 2; + else + here()._dshells = here()._dshells + 2; + end + here().obj:add('dshells'); +end + +shells = obj { + nam = 'патроны', + inv = 'Патроны для моего дробовика. Я очень редко их использую в лесу, в основном — против браконьеров.', + use = function(s, on) + if on == 'gun' then + if gun._loaded then + return 'Уже заряжен...'; + end + if gun._loaded == false then + gun._loaded = true; + dropshells(); + return 'Открыв дробовик я выбрасываю две гильзы и перезаряжаю дробовик.'; + end + gun._loaded = true; + return 'Я беру два патрона и отправляю их в оба ствола дробовика...'; + end + end +}; + +news = obj { + nam = 'газета', + inv = [[ +Свежая газета... <<недавно построенный в тайге институт квантовой механики категорически опровергает +причастность к аномальным явлениям>>.. Гм...]], + used = function(s, w) + if w == 'poroh' then + if have('trut') then + return 'У меня уже есть трут.'; + end + inv():add('trut'); + inv():del('poroh'); + return 'Я высыпаю порох на клочок бумаги, которую я оторвал от газеты...'; + end + end, +}; + +hamb = obj { + nam = 'гамбургер', + inv = function() + inv():del('hamb'); + return 'Я перекусил. Вредная пища...'; + end +}; + +zerno = obj { + nam = 'крупа', + inv = 'Просто гречка. Гречневая крупа...', +}; + +shop2 = dlg { + nam = 'купить', + pic = 'gfx/shopbuy.png', + obj = { + [1] = phr('Патронов... Мне нужны патроны...', 'Хорошо... Цена как обычно', ifmoney..'inv():add("shells")'), + [2] = phr('Зерна..', 'Хорошо... ', ifmoney..'inv():add("zerno")'), + [3] = phr('И еще гамбургер...', 'Ок..', ifmoney..'inv():add("hamb")'), + [4] = phr('Свежую прессу...', 'Конечно...', ifmoney..'inv():add("news")'), + [5] = phr('Моток изоленты...', 'Да. Держи.', ifmoney..'inv():add("iso")'), + [6] = phr('Ничего не надо...', 'Как пожелаешь.', 'pon(6); back()'), + [7] = _phr('Еще мне нужна лестница и кусачки...', 'Извини, этого у меня нет — качает головой Владимир'), + }, + exit = function(s) + if have('news') then + s.obj[4]:disable(); + end + end +}; + +shopdlg = dlg { + nam = 'разговор с продавцом', + pic = 'gfx/shopman.png', + dsc = 'Маленькие глазки буравят меня маслянистым взглядом.', + obj = { + [1] = phr('Здравствуй, Владимир! Ну как оно?', 'Здравствуй, '..me().nam..'... Да потихоньку... - Владимир хитро улыбается.', 'pon(2)'), + [2] = _phr('Хочу сделать покупки.', 'Хорошо... Давай посмотрим, что тебе нужно?', 'pon(2); return walk("shop2")'), + [3] = phr('Ну пока!...', 'Ага... Удачи!', 'pon(3); return back();'), + [4] = _phr('Здесь только что был человек — кто он?', 'Гм? — тонкие брови Володи приподнимаются..','pon(5)'), + [5] = _phr('Он почему-то взял моего кота... Наверное подумал, что он бездомный... Кто этот человек в сером пальто?', +[[ +Вообще-то он какая-то шишка... - поскреб Владимир свой небритый подбородок. — В этом новом институте, что построили в +нашей глуши год назад... — пенсне Владимира задергалось в такт его речи — он часто заходит в наш магазин, +не любит толпы — эти физики — ну ты понимаешь... Странный народ — Владимир пожал плечами...]],'pon(6)'), + [6] = _phr('А где этот институт находится?', +'Да на 127-ом.. Только это, знаешь чего — Владимир понизил голос — об этом институте всякое говорят...', 'me()._know_where = true; inmycar.way:add("inst");pon(7)'), + [7] = _phr('Я только заберу своего кота назад...', 'Ну смотри, как знаешь.. Я бы на твоем месте... - качает головой Владимир. - Да, кажется его фамилия Белин. Я видел его кредитку... Хотя ты знаешь — я их не принимаю — Владимир зашамкал губами, пенсне хитро зашевелилось.'), + }, +}; + +shopman = obj { + nam = 'продавец', + dsc = 'За прилавком стоит {продавец}. Довольно полное его лицо с небритой щетиной дополняет монокль.', + act = function() + return walk('shopdlg'); + end +}; + +shop = room { + nam = 'магазин', + pic = 'gfx/inshop.png', + enter = function(s, f) + if village.obj:look('truck') then + village.obj:del('truck'); + village.obj:del('mycat'); + return [[ +Когда я заходил в магазин, я чуть не столкнулся с неприятным типом в сером пальто и +шляпе с длинными полями... Он извинился каким-то шипящим голосом и сделал вид, что приподнимает шляпу... Из под +ее полей блеснули белые зубы... Дойдя до прилавка, я услышал звук запускающегося двигателя.]]; + end + end, + act = function(s,w) + if w == 1 then + return 'Теперь на стоянке стоит только моя машина.'; + end + end, + dsc = [[ +Это довольно странный магазин... Здесь вы найдете и скобяные изделия, и продукты, и +даже патроны... Не удивительно, ведь это единственный магазин на 100км...]], + way = { 'village' }, + obj = {'shopman',vobj(1, 'окно', 'Сквозь {окно} видно стоянку машин.') }, + exit = function(s, t) + if t ~= 'village' then + return; + end + if shopman._wantmoney then + return 'Я собираюсь выйти, когда меня останавливает деликатное покашливание Владимира... Конечно, я забыл заплатить...', false; + end + if not have('news') then + shop2.obj[4]:disable(); + inv():add('news'); + return 'Я собираюсь уходить, когда меня останавливает голос Владимира — Возьми свежую прессу, для тебя — бесплатно. Я возвращаюсь, беру газету и выхожу из магазина.'; + end + end +}; + +carbox = obj { + _num = 0, + nam = function(s) + if s._num > 1 then + return 'ящики в машине'; + else + return 'ящик в машине'; + end + end, + act = function(s) + if inv():srch('mybox') then + return 'У меня уже есть ящик в руках...'; + end + s._num = s._num - 1; + if s._num == 0 then + mycar.obj:del('carbox'); + end + take('mybox'); + return 'Я взял ящик из машины.'; + end, + dsc = function(s) + if s._num == 0 then + return; + elseif s._num == 1 then + return 'В кузове моей машины лежит один {ящик}.'; + elseif s._num < 5 then + return 'В кузове моей машины лежат '..tostring(s._num)..' {ящика}.'; + else + return 'В кузове моей машины лежит '..tostring(s._num)..' {ящиков}.'; + end + end, +}; + +mybox = obj { + nam = 'ящик', + inv = 'Я держу в руках ящик.... Добротно сделанная вещь! Пригодится в хозяйстве.', + use = function(s, o) + if o == 'boxes' then + inv():del('mybox'); + return 'Я положил ящик обратно...'; + end + if o == 'mycar' then + inv():del('mybox'); + mycar.obj:add('carbox'); + carbox._num = carbox._num + 1; + return 'Я положил ящик в кузов своей машины...'; + end + if o == 'ewall' or o == 'wboxes' then + if not cam._broken then + return 'Мне мешает камера...'; + end + if wboxes._num > 7 then + return 'Думаю, уже достаточно...' + end + inv():del('mybox'); + ewall.obj:add('wboxes'); + wboxes._num = wboxes._num + 1; + if wboxes._num > 1 then + return 'Я поставил следующий ящик на предыдущий...'; + end + return 'Я поставил ящик у стены...'; + end + end +}; + +boxes = obj { + nam = 'ящики', + desc = { + [1] = 'Около стоянки валяются пустые деревянные {ящики} из-под тушенки.', + }, + dsc = function(s) + local state = 1; + return s.desc[state]; + end, + act = function(s, t) + if carbox._num >= 5 then + return 'А может хватит уже брать ящики?...'; + end + if inv():srch('mybox') then + return 'У меня уже есть один ящик...'; + end + take('mybox'); + return 'Я взял ящик в руки.'; + end, +}; + +village = room { + nam = 'стоянка перед магазином', + dsc = 'Привычное место перед магазином. Стоянка машин. Все в снегу...', + pic = 'gfx/shop.png', + act = function(s, w) + if w == 1 then + return 'Баки как баки... Белый снег прикрывает мусор...'; + end + end, + exit = function(s, t) + if t == 'shop' and seen('mycat') then + return 'Я позвал Барсика, но он был сильно увлечен мусорными баками... Ладно — я не надолго...'; + end + end, + enter = function(s, f) + if ewall:srch('wboxes') and wboxes._num == 1 then + ewall.obj:del('wboxes'); + ewall._stolen = true; + wboxes._num = 0; + end + if f == 'shop' and not s._ogh then + s._ogh = true; + set_music("mus/revel.s3m"); + guydlg:pon(4); + guydlg:poff(8); + return 'Окинув стоянку беглым взглядом я позвал — Барсик! Барсик! — Куда запропастился мой кот?'; + end + end, + way = { 'road', 'shop' }, + obj = { 'truck', vobj(1,'баки', 'Ржавые мусорные {баки} покрыты снегом.'), 'guy','boxes' }, +}; +----------- trying to go over wall +function guardreact() + pon(7); + if inst:srch('mycar') then + inst.obj:del('mycar'); + inmycar.way:add('backwall'); + inst.way:add('backwall'); + return cat([[Четверо людей с автоматами провожают меня до моей машины. +Мне пришлось завести двигатель и отъехать от института. Я проехал с дюжину километров, прежде чем в зеркале заднего вида +исчез военный джип, с моими провожающими... ]], walk('inmycar')); + end + return cat([[Четверо вооруженных людей вышвыривают меня из КПП.^^]], walk('inst')); +end + +guarddlg = dlg { + nam = 'охранник', + pic = 'gfx/guard.png', + dsc = [[Передо мной угловатое лицо охранника. Его глаза глядят насмешливо, но уголки рта загнуты +вниз, что не располагает к беседе...]], + obj = { + [1] = phr('Моего кота по ошибке забрал сотрудник вашего института — мне нужно войти.','— Пропуск...', 'poff(2); pon(3);'), + [2] = phr('Я забыл свой пропуск — можно мне зайти?','— Нет...', 'poff(1); pon(3);'), + [3] = _phr('Вы знаете Белина? У него мой кот — мне нужно его забрать...', '— Нет пропуска?', 'pon(4)'), + [4] = _phr('Я просто пришел забрать своего кота! Дайте телефон Белина.', +[[Глаза охранника меняют свой цвет. Уголки губ поднимаются наверх — вот что, господин хороший, — я так понял, +пропуска у вас нет, идите-ка отсюда, пока можете...]], 'pon(5, 6)'), + [5] = _phr('Ну все, щас я дам по твоей роже...', 'Рука охранника тянется к автомату. ', 'poff(6); return guardreact();'), + [6] = _phr('Ладно, я пошел...', '— Не спеши - охранник уже не скрывает свою ухмылку - ты мне не нравишься...','poff(5); return guardreact()'), + [7] = _phr('Щас я вас всех перестреляю из своего дробовика...', 'На этот раз охранник даже не отвечает. Его налитые кровью глаза красноречивей всяких слов.','return guardreact()'), + }, +}; +guard = obj { + nam = 'охрана', + dsc = [[ +В будке сидит {охрана}. Кажется, она вооружена автоматами Калашникова. +]], + act = function(s) + return walk('guarddlg'); + end, +}; +kpp = room { + nam = 'КПП', + pic = 'gfx/kpp.png', + dsc = [[КПП — контрольно пропускной пункт не оставляет никаких сомнений в том, что в институте не жалуют посторонних. Шлагбаум. Решетчатая будка. И тишина. +]], + obj = { 'guard' }, + way = { 'inst' } +}; +inst = room { + nam = 'институт', + pic = 'gfx/inst.png', + dsc = [[ +Институт возвышается посреди пустынного снежного поля. Его зловещие контуры напоминают скорее тюрьму, чем научное +учреждение. Позади территории института находятся железнодорожные пути. ]], + act = function(s, w) + if w == 1 then + return 'Высота стены около 5 метров. Но этого мало — сверху проходит колючая проволока — думаю, она под напряжением...'; + end + if w == 2 then + return 'Нет, Владимир был прав... Это какой-то военный штаб...'; + end + if w == 3 then + return 'Да — это, похоже, тот самый фургон, в котором человек в сером пальто увез моего Барсика.'; + end + end, + used = function(s, w, b) + if b == 'mybox' and w == 1 then + return 'Я думаю, меня сразу заметит охрана.'; + end + if w == 2 and b == 'gun' and gun._loaded then + return 'Меня посадят... Или просто побьют... Охранники совсем недалеко.'; + end + if w == 3 and b == 'gun' and gun._loaded then + return 'Мне нужен мой кот, а не разрушения...'; + end + end, + obj = {vobj(1, 'стена', 'Здание института окружено массивной бетонной {стеной}. В центре находится КПП.'), + vobj(2, 'камеры', 'На вышках установлены {камеры} слежения.'), + vobj(3, 'фургон', 'За шлагбаумом виднеется черный {фургон}.')}, + way = { 'road', 'kpp' }, + exit = function(s, t) + if have('mybox') and t ~= 'inmycar' then + return 'Я не буду ходить с ящиком в руках...', false; + end + end, +}; + +cam = obj { + nam = 'камера слежения', + dsc = function(s) + if not s._broken then + return 'Неподалеку от меня — одна из {камер} слежения. Я прижимаюсь к стене, чтобы меня не заметили.'; + end + return 'Неподалеку валяются осколки {камеры} слежения. Их уже запорошило снегом.'; + end, + act = function(s) + if not s._broken then + return 'Проклятая камера...'; + end + return 'Ха... Получил, проклятый механизм? Интересно, когда придет охрана...'; + end, +}; + +wire = obj { + nam = 'колючая проволока', + dsc = function(s) + if s._broken then + return 'Перед моими глазами обрывки колючей {проволоки}.'; + end + return 'Перед моими глазами колючая {проволока}.'; + end, + act = function(s) + if s._broken then + return 'Теперь она безопасна! Можно пробраться внутрь...'; + end + return 'А вдруг она под напряжением?'; + end, +}; + +onwall = room { + pic = 'gfx/onwall.png', + nam = 'на стене', + dsc = 'Я стою на ящиках, моя голова находится на уровне вершины стены. Холодно.', + enter = function(s) + if have('mybox') then + return 'Я не могу взобраться на стену с ящиком в руках.', false; + end + if wboxes._num < 5 then + return 'Я пытаюсь взобраться на стену... Но все еще слишком высоко...',false; + end + return 'Я взбираюсь на стену по ящикам.'; + end, + obj = { 'wire' }, + way = { 'backwall' } +}; + +wboxes = obj { + _num = 0, + nam = function(s) + if (s._num > 1) then + return 'ящики у стены'; + end + return 'ящик у стены'; + end, + act = function(s) + return walk('onwall'); + end, + dsc = function(s) + if s._num == 0 then + return; + elseif s._num == 1 then + return 'У стены лежит один {ящик}.'; + elseif s._num < 5 then + return 'У стены стоит '..tostring(s._num)..' {ящика}, поставленные один на другой.'; + else + return 'У стены стоят '..tostring(s._num)..' {ящиков}, поставленные один на другой.'; + end + end, +}; + +ewall = obj { + nam = 'стена', + dsc = '{Стена} здесь возвышается на 4 метра. Снежная метель с воем бросает ледяные снежинки к ее подножию.', + act = function(s) + if not s._ladder then + s._ladder = true; + shop2:pon(7); + end + return 'Слишком высокая... Нужна лестница.'; + end +}; + +backwall = room { + pic = 'gfx/instback.png', + enter = function(s, f) + local st = ''; + if ewall._stolen then + ewall._stolen = false; + st = 'Ого!!! Кто-то украл мой ящик!!!'; + end + if f == 'inmycar' then + return 'Отлично... Кажется, удалось добраться незамеченным...'..' '..st; + end + if f == 'onwall' then + return + end + return 'Плутая по снежному полю, я добрался до задней стены.'..' '..st; + end, + nam = 'восточная стена института', + dsc = 'Я нахожусь у задней стороны института.', + obj = { 'ewall', 'cam' }, + way = { 'inst', }, + exit = function(s, t) + if have('mybox') and t ~= 'inmycar' then + return 'Я не буду ходить с ящиком в руках...', false; + end + end, +}; diff --git a/ep1-zh.lua b/ep1-zh.lua new file mode 100644 index 0000000..b58fc76 --- /dev/null +++ b/ep1-zh.lua @@ -0,0 +1,911 @@ +mywear = obj { + nam = '棉袄', + dsc = function(s) + if here() == stolcorridor then + local st='.'; + if not have('gun') then + st = ',我的猎枪就藏在它里面。'; + end + return '架子上还有我的棉袄'..st; + else + return '松木门的钉子上挂着我的{棉袄}。'; + end + end, + inv = '现在是冬天,但我穿着暖和的棉袄。', + tak = function(s) + if here() == stolcorridor then + if have('alienwear') then + return '我已经穿好衣服了……如果我把棉袄也带上,会显得很可疑……', false; + end + if me()._walked then + me()._walked = false; + inv():add('gun'); + return '但我的棉袄是最棒的!'; + end + return '那就太显眼了……', false; + else + return '我从钉子上取下外套。'; + end + end, + use = function(s, o) + if o == 'guy' then + return '在短暂的耽搁之后,你们交换了外套……'; + end + end +}; + +money = obj { + nam = '钱', + inv = '大钱就是大祸……幸好我没什么钱……', + use = function(s, w) + if w == 'shopman' then + if shopman._wantmoney then + shopman._wantmoney = false; + return '我付钱给弗拉基米尔。'; + end + return '我不想无缘无故付钱……'; + end + end +}; + +mybed = obj { + nam = '床', + dsc = '窗边有一张{床}。', + act = '现在没功夫睡觉。', +}; + +mytable = obj { + nam = '桌子', + dsc = '左边角落里有一张带抽屉的橡木{桌子}。', + act = function() + if not have(money) then + take('money'); + return '我在抽屉里翻了翻,找到了些钱。'; + end + return '桌子……我自己做的。'; + end, +}; + +foto = obj { + nam = '照片', + dsc = '桌子上有一张镶框{照片}。', + tak = '我拿起照片。', + inv = '照片里是我和我的 Barsik。', +}; + +gun = obj { + nam = '猎枪', + dsc = '小屋右边的角落里有一把{猎枪}。', + tak = '我拿起猎枪,把它挂在背后。', + inv = function(s) + local st = ''; + if s._obrez then + st = ' 顺便一提,现在是锉短的猎枪了。'; + if s._hidden then + st = st..' 它藏在我衣服里。'; + end + end + if s._loaded then + return '猎枪上膛了……'..st; + else + return '猎枪没有子弹…… 我很少在森林里用到它……'..st; + end + end, + use = function(s, w) + if not s._hidden then + if w == 'mywear' or w == 'alienwear' then + if not s._obrez then + return '我想把猎枪藏在衣服里,但它太长了。' + else + s._hidden = true; + return '现在我可以把锉短的猎枪藏在衣服里了!'; + end + end + end + if not s._loaded then + return '没装子弹……', false; + end + if w == 'guard' then + return '是的,他们是无赖,但首先他们也是人;其次这样做也无济于事……', false; + end + if w == 'wire' then + return '太近了…… 我需要像剪线钳这样的东西……', false; + end + if w == 'cam' and not cam._broken then + cam._broken = true; + s._loaded = false; + return '我瞄准摄像头,双管开火…… 沉闷的枪声被阵阵风雪淹没……'; + end + if w == 'mycat' or w == 'shopman' or w == 'guy' then + return '我不想这样……', false; + end + end +}; + +fireplace = obj { + nam = '壁炉', + dsc = '墙边有一个{壁炉},火焰不均匀地映照着小屋。', + act = '我喜欢在壁炉旁度过漫长的冬夜。', +}; + +mycat = obj { + nam = 'Barsik', + _lflast = 0, + lf = { + [1] = 'Barsik 在我怀里动来动去。', + [2] = 'Barsik 从我怀里探出头。', + [3] = 'Barsik 在我怀里打呼噜。', + [4] = 'Barsik 在我怀里发抖。.', + [5] = '我感受到 Barsik 在我怀里的温暖。', + [6] = 'Barsik 从我怀里探出头来,四处张望。', + }, + life = function(s) + local r = rnd(6); + if r > 2 then + return; + end + r = rnd(6); + while (s._lflast == r) do + r = rnd(6); + end + s._lflast = r; + return s.lf[r]; + end, + desc = { [1] = '我的猫{Barsik}正舒适地蜷缩成一团睡在壁炉边。', + [2] = '{Barsik}机敏地扫视着小屋周围。', + [3] = '{Barsik}就坐在我旁边的座位上。', + [4] = '{Barsik}正在垃圾桶旁研究着什么……', + [5] = '{Barsik}在我脚边蹭来蹭去。', + }, + inv = 'Barsik在我的怀里……可怜的小猫咪……我会救你的,还有整个世界!!!', + dsc = function(s) + local state + if here() == home then + state = 1; + elseif here() == forest then + state = 2; + elseif here() == inmycar then + state = 3; + elseif here() == village then + state = 4; + elseif here() == escape3 then + state = 5; + end + return s.desc[state]; + end, + act = function(s) + if here() == escape3 then + take('mycat'); + lifeon('mycat'); + return '我把{Barsik}放进了我的怀里。'; + end + return '我挠了挠Barsik的耳后……'; + end, +}; + +inmycar = room { + nam = '在车里', + dsc = '我坐在我的皮卡车里,这辆车像匹任劳任怨的老马一样……', + pic = 'gfx/incar.png', + way = {'forest', 'village'}, + enter = function(s, f) + local s = '我打开车门'; + if have('mybox') then + return '我不能带着这个箱子一起进驾驶舱……', false; + end + if seen('mycat') then + s = s..',Barsik跳进车里。' + move('mycat','inmycar'); + elseif not me()._know_where then + return '不……我必须先找到Barsik!', false + end + if f == 'guarddlg' then + return ' 嗯……我得想个办法……'; + end + return cat(s, ' 好,是时候出发了……'); + end, + exit = function(s, t) + local s='' + if seen('mycat') then + s = 'Barsik第一个跳出车外。'; + move('mycat',t); + end + if ref(t) ~= from() then + from().obj:del('mycar'); + move('mycar', t); + return [[ +车子勉勉强强地发动起来……经过漫长的车程,我终于得以关掉引擎并打开车门……]]..s; + end + return '不……我觉得好像忘了什么……'..s; + end +}; + +mycar = obj { + nam = '我的车', + desc = { + [1] = '在小屋前停着我的老旧丰田{皮卡}。', + [2] = '停车场上有我的老旧{皮卡}。', + [3] = '在检查站旁边停着我的{皮卡}。', + [4] = '在墙角后面停着我的{皮卡}。', + }, + dsc = function(s) + local state + if here() == forest then + state = 1; + elseif here() == village then + state = 2; + elseif here() == inst then + state = 3; + elseif here() == backwall then + state = 4; + end + return s.desc[state]; + end, + act = function(s) + return walk('inmycar'); + end +}; + +iso = obj { + nam = '绝缘胶带', + inv = '一卷蓝色的绝缘胶带……', + use = function(s, o) + if o == 'trap' and not trap._iso then + trap._iso = true; + return '我用胶带将陷阱绝缘。'; + end + if o == 'wire' then + return '我为什么要这么做?反正我也穿不过铁丝网。何况我也没法把它绝缘——我会触电的!'; + end + end +}; + +trap = obj { + nam = '陷阱', + dsc = '雪地里埋伏着一个铁{陷阱}。', -- !!!! + tak = '该死的偷猎者!我要把陷阱拆走。', + inv = function(s) + if s._salo then + return '大捕鼠夹,还是绝缘的!'; + end + if s._iso then + return '铁的,非常锋利,还用胶带绝缘了。'; + else + return '铁的,非常锋利。'; + end + end, + use = function(s, o) + if o == 'wire' and not wire._broken then + if not s._iso then + return '陷阱是金属的,我会被电击,然后……就没有然后了……'; + end + wire._broken = true; + onwall.way:add('eside'); + return '我用陷阱夹住并切割铁丝网,如我所料,铁丝网被夹断了!'; + end + end +}; + +deepforest = room { + i = 0, + nam = '森林深处', + pic = 'gfx/deepforest.png', + dsc = function(s) + local st = '我到了森林深处……'; + if s._i == 1 then + return st..'松树和云杉……没什么别的……'; + elseif s._i == 2 then + return st..'美丽的白桦树——小心别迷了路……'; + elseif s._i == 3 then + return st..'茂密的丛林……完全搞不清我是不是迷路了……'; + elseif s._i == 4 then + return st..'美丽的湖泊……我是不是该回去了?'; + elseif s._i == 5 then + s._trap = true; + return st..'一些灌木丛……灌木丛……还是灌木丛……'; + else + return st..'树桩……一根多么漂亮的树桩……'; + end + end, + enter = function(s,f) + if f == 'forest' then + s._trap = false; + end + s._lasti = s._i; + while (s._i == s._lasti) do + s._i = rnd(6); + end + s.obj:del('trap'); + s.way:del('forest'); + if s._i == 5 and not inv():srch('trap') then + s.obj:add('trap'); + end + if s._i == 3 and s._trap then + s.way:add('forest'); + end + if f == 'forest' and inv():srch('trap') then + return [[我已经在森林里散过步了谢谢。]], false; + end + if f == 'deepforest' then + return '嗯……我们来瞧瞧……'; + end + return [[走进这片茂密的森林,步行? +嗯……为什么不呢——毕竟这是我的工作……我得赶走偷猎者……]], true; +--Я пол часа бродил по лесу, когда наткнулся на капкан... +--Проклятые браконьеры! Я взял капкан с собой.]], false; + end, + way = {'deepforest'}, +}; + +road = room { + nam = '马路', + enter = function() + return '步行?还事饶了我罢……', false; + end +}; + +forest = room { + nam = '小屋前', + pic = 'gfx/forest.png', + dsc = [[ +小屋前的一切被积雪覆盖着。野树林环绕着小屋。通往小镇的道路上也残存着积雪。]], + way = { 'home', 'deepforest', 'road' }, + obj = { 'mycar' }, +}; + +home = room { + nam = '小屋', + pic = function(s) + if not seen('mycat') then + return "gfx/house-empty.png" + end + return "gfx/house.png"; + end, + dsc = [[ +我在这间小屋里度过了10年。10年前我亲手盖的这座房子。屋内有些狭窄,但很舒适。]], + obj = { 'fireplace', 'mytable', 'foto', 'mycat', 'gun', + vobj(1,'window', '小屋只有一扇{窗户}。'), + 'mybed', 'mywear' }, + way = { 'forest' }, + act = function(s,o) + if o == 1 then + return '外面的一切都披上了一层雪白的颜色……'; + end + end, + exit = function() + if not have('mywear') then + return '外面很冷……不穿棉袄我可不出去。', false + end + if seen(mycat) then + move('mycat','forest'); + return [[ +当我离开小屋时,Barsik突然醒了,扑到我脚边。我抚摸着他的耳朵。“要跟我一起走吗?” +]] + end + end +}; +---------------- here village begins +truck = obj { + nam = '黑色高级车', + dsc = '有辆茶色玻璃的{黑色高级车}停在商店旁边。', + act = '嗯……其实是辆小货车……车体还装了甲,从车轮负载可以看出来……', +}; + +guydlg = dlg { + pic = 'gfx/guy.png', + nam = '和流浪汉的对话', + dsc = '我朝他走去……他是一个戴着破帽子穿着破棉袄的矮个子——用匆忙的眼神回头看了看我。', + obj = { + [1] = phr('嗨!今儿真冷,是吧?', '确实……有点……'), + [2] = phr('你为什么流落街头?', +[[我在为博士学位而努力……写一篇物质结构方面的论文……但是……我的大脑累坏了……我试图平静下来,然后……我就在这儿了……]]), + [3] = phr('你叫什么名字?', '爱德华……'), + [4] = _phr('我刚才离开的时候,你身边有只猫……它去哪了?', '嗯……', 'pon(5)'), + [5] = _phr('是的……一只小猫,一只普通的、在垃圾桶旁边闲逛的猫。', '所以那是你的猫么?嗯……', 'pon(6)'); + [6] = _phr('对……那是我的Barsik!快告诉我!', +'……嗯……好像有个人把它带走了…… \n —— 我的背后传来一阵寒意……', 'pon(7)'), + [7] = _phr('哪儿,他去哪了?', '抱歉,老兄,我没注意……', 'shopdlg:pon(4); pon(8);'), + [8] = phr('好吧……没关系……', '……', 'pon(8); back()'), + }, + exit = function() + pon(1); + return '他转身离开我,又开始在垃圾桶中翻找……'; + end +}; + +guy = obj { + nam = '流浪汉', + dsc = '一个{流浪汉}正在垃圾桶里翻找着什么。', + act = function() + return walk('guydlg'); + end, + used = function(s, w) + if w == 'money' then + return [[ +我走近他,拿出来一些钱给他……“我不需要其他人的钱……”他说。]]; + else + return '他要这个干什么呢?'; + end + end, +}; + +nomoney = function() + pon(1,2,3,4,5); + shopdlg:pon(2); + return cat('这时我突然想起来,我身上压根没带钱,一点都没带……^',back()); +end + +ifmoney ='if not have("money") then return nomoney(); end; shopman._wantmoney = true; '; + +dshells = obj { + nam = '弹壳', + dsc = function(s) + -- Note for translators: + -- this block picks the appropriate plural form + -- for “shells” for a given numeral. Since English has + -- only 1 form, I commented it out. + -- Uncomment and use form-number combinations + -- appropriate for your language + -- if here()._dshells > 4 then + return '我脚下有'..here()._dshells..'枚猎枪{弹壳}……'; + -- else + -- return 'Under my feet there are '..here()._dshells..' empty shotgun {shells}...'; + -- end + end, + act = '这是我射击留下的弹壳……我不再需要它们了……'; +}; + +function dropshells() + if here() == deepforest then + return; + end + if not here()._dshells then + here()._dshells = 2; + else + here()._dshells = here()._dshells + 2; + end + here().obj:add('dshells'); +end + +shells = obj { + nam = '子弹', + inv = '猎枪子弹。我很少用到,通常是用来对付偷猎者的。', + use = function(s, on) + if on == 'gun' then + if gun._loaded then + return '已经装过弹了……'; + end + if gun._loaded == false then + gun._loaded = true; + dropshells(); + return '我打开弹匣,抛出两枚弹壳,重新装入子弹。'; + end + gun._loaded = true; + return '我拿出两枚子弹,装入猎枪的双管……'; + end + end +}; + +news = obj { + nam = '报纸', + inv = [[ +最新报纸……“位于泰加林中新近建立的量子力学研究所强烈否认其与任何异常事件的联系”……嗯……]], + used = function(s, w) + if w == 'poroh' then + if have('trut') then + return '我已经有一个引信了。'; + end + inv():add('trut'); + inv():del('poroh'); + return '我撕下一片报纸,倒上了火药……'; + end + end, +}; + +hamb = obj { + nam = '汉堡包', + inv = function() + inv():del('hamb'); + return '我吃了点零食。垃圾食品……'; + end +}; + +zerno = obj { + nam = '谷物', + inv = '就是一些荞麦,荞麦粒……', +}; + +shop2 = dlg { + nam = 'buy', + pic = 'gfx/shopbuy.png', + obj = { + [1] = phr('猎枪子弹……我需要弹药……', '没问题……价格照旧', ifmoney..'inv():add("shells")'), + [2] = phr('谷物……', '好……', ifmoney..'inv():add("zerno")'), + [3] = phr('和一个汉堡包……', '行……', ifmoney..'inv():add("hamb")'), + [4] = phr('新报纸……', '当然……', ifmoney..'inv():add("news")'), + [5] = phr('一卷绝缘胶带……', '好的,这儿呢。', ifmoney..'inv():add("iso")'), + [6] = phr('没别的了……', '如你所愿……', 'pon(6); back()'), + [7] = _phr('我还需要梯子和一把钢丝钳……', '抱歉,我这儿没这些东西——弗拉基米尔摇了摇头'), + }, + exit = function(s) + if have('news') then + s.obj[4]:disable(); + end + end +}; + +shopdlg = dlg { + nam = '与售货员交谈', + pic = 'gfx/shopman.png', + dsc = '小眼睛用油腻的目光盯着我。', + obj = { + [1] = phr('你好,弗拉基米尔!近来可好?', '你好,'..me().nam..'……我这儿一般般……弗拉基米尔狡猾地笑了笑。', 'pon(2)'), + [2] = _phr('我想买点东西……', '好的……我们来瞧瞧——您需要什么?', 'pon(2); return walk("shop2")'), + [3] = phr('拜拜……', '耶……祝你好运!', 'pon(3); return back();'), + [4] = _phr('刚才有一个人在这儿——他是谁?', '嗯?——弗拉基米尔的细眉毛微微扬起……','pon(5)'), + [5] = _phr('由于某些缘故,他带走了我的猫……也许以为它是流浪猫……那个穿灰色外套的男人是谁?', +[[ +Actually, he's some boss... - Vladimir scratches his unshaved chin. — In that new institute, which has been built in our backwoods a year ago... + — Vladimir's pince-nez twitched as he spoke — he often comes to our shop, +doesn't like crowds — those physicists — you know... Odd bunch, — Vladimir shrugged...]],'pon(6)'), + [6] = _phr('Where is this institute located?', +'Kilometer marker 127... But well, you know — Vladimir lowered his voice — there are rumours about his institute...', 'me()._know_where = true; inmycar.way:add("inst");pon(7)'), + [7] = _phr('I\'m just going to get back my cat...', 'Take care... If I was in you shoes... — Vladimir shakes his head. — By the way, I think his name is Belin. I\'ve seen his credit card... Even though, as you know, I don\'t accept them — Vladimir moved his lips, his monocle stirred slyly'), + }, +}; + +shopman = obj { + nam = 'salesman', + dsc = 'There\'s a {salesman} behind the counter. His wide face with stubble is complemented by a monocle.', + act = function() + return walk('shopdlg'); + end +}; + +shop = room { + nam = 'shop', + pic = 'gfx/inshop.png', + enter = function(s, f) + if village.obj:look('truck') then + village.obj:del('truck'); + village.obj:del('mycat'); + return [[ +When I entered the shop, I almost ran into an unpleasant man in a grey coat and broad-brimmed hat... He apologized in a sort of hissing voice and feighned raising his hat... White teeth flashed from under the brim... When I reached the counter, I heard the engine starting.]]; + end + end, + act = function(s,w) + if w == 1 then + return 'There\'s only my car left in the parking lot.'; + end + end, + dsc = [[ +The store is somewhat unusual... Here you can find ironware, food, even ammunition... No wonder, since it's the only store in a 100 km area...]], + way = { 'village' }, + obj = {'shopman',vobj(1, 'окно', 'Through the {window} the parking lot is visible.') }, + exit = function(s, t) + if t ~= 'village' then + return; + end + if shopman._wantmoney then + return 'I was going to step outside, when I was stopped by Vlsdimir\'s quiet semicough... Of course, I forgot to pay...', false; + end + if not have('news') then + shop2.obj[4]:disable(); + inv():add('news'); + return 'I was going to leave, when Vladimir\'s voice stopped me. — Take the fresh newspaper — it\'s free for you. I walk back, take the paper and leave.'; + end + end +}; + +carbox = obj { + _num = 0, + nam = function(s) + if s._num > 1 then + return 'boxes in the car'; + else + return 'a box in the car'; + end + end, + act = function(s) + if inv():srch('mybox') then + return 'I\'ve already got a box in my hands...'; + end + s._num = s._num - 1; + if s._num == 0 then + mycar.obj:del('carbox'); + end + take('mybox'); + return 'I took a box from the car.'; + end, + dsc = function(s) + if s._num == 0 then + return; + elseif s._num == 1 then + return 'There is one {box} in the cargo body of my car.'; + -- Again not needed, since "boxes" stays the same for all numerals + -- elseif s._num < 5 then + -- return 'There are '..tostring(s._num)..' {boxes} in the cargo body of my car.'; + else + return 'There are '..tostring(s._num)..' {boxes} in the cargo body of my car..'; + end + end, +}; + +mybox = obj { + nam = 'a box', + inv = 'I am holding a wooden box... A soundly built thing! Might come in handy.', + use = function(s, o) + if o == 'boxes' then + inv():del('mybox'); + return 'I put the box back...'; + end + if o == 'mycar' then + inv():del('mybox'); + mycar.obj:add('carbox'); + carbox._num = carbox._num + 1; + return 'I put the box in the cargo body of my car...'; + end + if o == 'ewall' or o == 'wboxes' then + if not cam._broken then + return 'The camera won\'t let me...'; + end + if wboxes._num > 7 then + return "It's enough I think..." + end + inv():del('mybox'); + ewall.obj:add('wboxes'); + wboxes._num = wboxes._num + 1; + if wboxes._num > 1 then + return 'I put another box on top of the previous one...'; + end + return 'I put the box next to the wall...'; + end + end +}; + +boxes = obj { + nam = 'ящики', + desc = { + [1] = 'Near the parking lot there are many empty wooden {boxes} that once held tins.', + }, + dsc = function(s) + local state = 1; + return s.desc[state]; + end, + act = function(s, t) + if carbox._num >= 5 then + return 'Maybe I\'ve got enough boxes already?...'; + end + if inv():srch('mybox') then + return 'I\'m holding one box already...'; + end + take('mybox'); + return 'I took a box.'; + end, +}; + +village = room { + nam = 'parking lot in front of the store', + dsc = 'A familiar place in front of the store. The parking lot. All covered with snow...', + pic = 'gfx/shop.png', + act = function(s, w) + if w == 1 then + return 'Ordinary bins... White snow covers the garbage...'; + end + end, + exit = function(s, t) + if t == 'shop' and seen('mycat') then + return 'I called Barsik, but he was too busy with the dumpster... OK, it won\'t take long...'; + end + end, + enter = function(s, f) + if ewall:srch('wboxes') and wboxes._num == 1 then + ewall.obj:del('wboxes'); + ewall._stolen = true; + wboxes._num = 0; + end + if f == 'shop' and not s._ogh then + s._ogh = true; + set_music("mus/revel.s3m"); + guydlg:pon(4); + guydlg:poff(8); + return 'I glanced over the parking lot and called — Barsik! Barsik! — Where did my cat disappear?'; + end + end, + way = { 'road', 'shop' }, + obj = { 'truck', vobj(1,'bins', 'Rusty dumpster {bins} are covered with snow.'), 'guy','boxes' }, +}; +----------- trying to go over wall +function guardreact() + pon(7); + if inst:srch('mycar') then + inst.obj:del('mycar'); + inmycar.way:add('backwall'); + inst.way:add('backwall'); + return cat([[Four people with submachine guns escorted me to my car. I had to start the engine and drive away from the institute. I drove a dozen kilometers before the military jeep with the seeing-off guards disappeared from the rear-view mirror... ]], walk('inmycar')); + end + return cat([[Four armed people throw me out of the check-point.^^]], walk('inst')); +end + +guarddlg = dlg { + nam = 'guard', + pic = 'gfx/guard.png', + dsc = [[I can see the angular face of the guard. His eyes look archly, but corners of his mouth are turned down, discouraging any conversation...]], + obj = { + [1] = phr('One of the institute staff took my cat by mistake — I need to get in.','— Show the pass...', 'poff(2); pon(3);'), + [2] = phr('I forgot my pass — may I come in?','— No...', 'poff(1); pon(3);'), + [3] = _phr('Do you know Belin? He\'s got my cat — I need to take it...', '— No pass?', 'pon(4)'), + [4] = _phr('I just came to get back my cat! Give me Belin\'s number.', +[[The guard's eyes change their color. The corners of his lips move up. — Mister, as I understand you have no pass. Walk out of here while you still can...]], 'pon(5, 6)'), + [5] = _phr('I\'m gonna hit your face...', 'The guard\'s hand moves to his submachine gun. ', 'poff(6); return guardreact();'), + [6] = _phr('OK, I\'m leaving...', '— Don\'t hurry, — the guard no longer hides his smile — I don\'t like you...','poff(5); return guardreact()'), + [7] = _phr('Now I\'m gonna shotgun you all...', 'This time the guard doesn\'t even answer. His bloodshot eyes speak louder than any words.','return guardreact()'), + }, +}; +guard = obj { + nam = 'guards', + dsc = [[ +There are {guards} in the kiosk. Looks like they are armed with Kalashnikov submachine guns. +]], + act = function(s) + return walk('guarddlg'); + end, +}; +kpp = room { + nam = 'checkpoint', + pic = 'gfx/kpp.png', + dsc = [[The checkpoint leaves no doubt that strangers are not welcome in the institute. Lift gate. Latticed kiosk. And silence. +]], + obj = { 'guard' }, + way = { 'inst' } +}; +inst = room { + nam = 'institute', + pic = 'gfx/inst.png', + dsc = [[ +The building rises over the empty field of snow. Its sinister outline looks more like a jail rather than a research institute. There are railways behind the building. ]], + act = function(s, w) + if w == 1 then + return 'The wall is 5 meters high. Moreover, there is barbed wire on its top, and I suppose it\'s alive...'; + end + if w == 2 then + return 'Yes, Vladimir was right... It\'s some sort of a military headquaters...'; + end + if w == 3 then + return 'Yes — this looks like the van in which the man in gray coat took away my Barsik.'; + end + end, + used = function(s, w, b) + if b == 'mybox' and w == 1 then + return 'I think the guards will notice me at once.'; + end + if w == 2 and b == 'gun' and gun._loaded then + return 'I\'d get canned for that... Or just beaten... The guards are quite near.'; + end + if w == 3 and b == 'gun' and gun._loaded then + return 'I need the cat, not destruction...'; + end + end, + obj = {vobj(1, 'wall', 'The institute building is surrounded by a heavy concrete {wall}. There\'s a checkpoint at the centre.'), + vobj(2, 'cameras', 'Survelliance {cameras} watch the area from the towers.'), + vobj(3, 'van', 'Behind the gate I can see the black {van}.')}, + way = { 'road', 'kpp' }, + exit = function(s, t) + if have('mybox') and t ~= 'inmycar' then + return 'I won\'t walk around with the box...', false; + end + end, +}; + +cam = obj { + nam = 'surveillance camera', + dsc = function(s) + if not s._broken then + return 'One of the surveillance {cameras} isn\'t far from here. I press myself to the wall to stay unnoticed.'; + end + return 'The shards of the surveillance {camera} are lying around. They\'re already dusted by snow.'; + end, + act = function(s) + if not s._broken then + return 'Damned camera...'; + end + return 'Ha... You\'ve had it coming, damned mechanism, hadn\'t you? I wonder when will the guards come...'; + end, +}; + +wire = obj { + nam = 'barbed wire', + dsc = function(s) + if s._broken then + return 'I can see the shreds of barbed {wire}.'; + end + return 'I can see barbed {wire}.'; + end, + act = function(s) + if s._broken then + return 'Now it\'s safe! I can get inside...'; + end + return 'What if it\'s alive?'; + end, +}; + +onwall = room { + pic = 'gfx/onwall.png', + nam = 'on the wall', + dsc = 'I am standing atop the boxes, my head is on the wall top level. It\'s cold.', + enter = function(s) + if have('mybox') then + return 'I cannot climb the wall with a box in my hands.', false; + end + if wboxes._num < 5 then + return 'I try to climb the wall... But it\'s still to high...',false; + end + return 'I climb the wall over the boxes.'; + end, + obj = { 'wire' }, + way = { 'backwall' } +}; + +wboxes = obj { + _num = 0, + nam = function(s) + if (s._num > 1) then + return 'boxes by the wall'; + end + return 'a box by the wall'; + end, + act = function(s) + return walk('onwall'); + end, + dsc = function(s) + if s._num == 0 then + return; + elseif s._num == 1 then + return 'There is one {box} by the wall.'; + -- And again only one plural form + -- elseif s._num < 5 then + -- return 'There are '..tostring(s._num)..' {boxes}, stacked by the wall.'; + else + return 'There are '..tostring(s._num)..' {boxes}, stacked by the wall.'; + end + end, +}; + +ewall = obj { + nam = 'wall', + dsc = 'Here {the wall} is 4 meters high. The howling snowdrift tosses snowflakes to its bottom.', + act = function(s) + if not s._ladder then + s._ladder = true; + shop2:pon(7); + end + return 'Too high... I\'ll need a ladder.'; + end +}; + +backwall = room { + pic = 'gfx/instback.png', + enter = function(s, f) + local st = ''; + if ewall._stolen then + ewall._stolen = false; + st = 'Oho!!! Somebody has stolen my box!!!'; + end + if f == 'inmycar' then + return 'Great... Looks like I managed to get here unnoticed...'..' '..st; + end + if f == 'onwall' then + return + end + return 'Rambling through the snowfield I got to the back wall.'..' '..st; + end, + nam = 'eastern wall of the institute', + dsc = 'I am at the back side of the institute.', + obj = { 'ewall', 'cam' }, + way = { 'inst', }, + exit = function(s, t) + if have('mybox') and t ~= 'inmycar' then + return 'I won\'t walk around with the box in my hands...', false; + end + end, +}; diff --git a/ep2-en.lua b/ep2-en.lua new file mode 100644 index 0000000..a129d58 --- /dev/null +++ b/ep2-en.lua @@ -0,0 +1,1544 @@ +------------- now got inside!!! ----------------------- +napil = obj { + nam = 'rasp', + dsc = 'There\'s a {rasp} lying under the gates.', + inv = 'A rusty thing...', + tak = 'I took the rasp.', + use = function(s, w) + if w == 'knife' and not knife._oster then + knife._oster = true; + return 'I\'m sharpening the knife... Now it\'s sharp!'; + elseif w == 'gun' and not gun._obrez then + if here() == wside or here() == sside then + return 'There are people around here!'; + end + gun._obrez = true; + return 'I took a seat and sawed off the shotgun barells.'; + else + return 'No, sawing is useless here...'; + end + end +}; + +eside = room { + pic = 'gfx/eside.png', + nam = 'behind the institute', + dsc = [[ I am at the back wall of the institute building. There's a railway here.]], + act = function(s,w) + if w == 1 then + return 'The machine guns are turned to the south side of the institute perimeter. It\'s better to stay far from them.'; + end + if w == 2 then + return 'The gates are iron made. And they are locked from the inside.'; + end + end, + obj = { + vobj(1,'gun towers', 'The railway entrance is guarded by the {towers} with machine guns...'), + vobj(2,'the gates', 'The rails flow near the big iron {gates}. It seems they are used for supply.'), + 'napil', + }, + exit = function(s, t) + if t == 'sside' then + return 'The machine guns on the south side make me nervous. Too risky.' + , false + end + end, + enter = function(s, f) + if f == 'onwall' then + -- end of episode 1 + inmycar = nil; + deepforest = nil; + road = nil; + forest = nil; + home = nil; + shop = nil; + village = nil; + kpp = nil; + inst = nil; + onwall = nil; + backwall = nil; + guydlg = nil; + shop2 = nil; + shopdlg = nil; + guarddlg = nil; + set_music("mus/ice.s3m"); + end + end, + way = {'nside','sside'}, +}; + +card = obj { + nam = 'pass', + inv = [[It's a someone's pass - an electronic smartcard with a photo of some heavy-metal guy. The label says: Alexey Podkovin — Level: 3, Category: The Matter. Hmmm...]], +}; + +alienwear = obj { + xnam = {'denim jacket', 'red jacket', 'overcoat', 'jacket', 'white jacket', + 'coat', 'black leather jacket', 'sport jacket',}, + xinv = { + 'A cold clothes for this season, but has a certain style!', + 'Nice look on snowy background.', + 'A long coat - some kind of retro!', + 'I\'m the Terminator!', + 'Make peace, not war!', + 'It suits me', + '"And nothing else matters!.."', + 'There were days I liked mountaineering!', + }, + nam = function(s) + return s.xnam[s._num]; + end, + inv = function(s) + if s._num == 7 and not have('card') then + inv():add('card'); + return 'I\'ve examined the pockets of the leather jacket and found some card.'; + end + return s.xinv[s._num]; + end, +}; + +garderob = obj { + nam = 'wardrobe', + dsc = 'There is a {wardrobe} with visitors outerwear on the right.', + act = function(s, w) + if have('mywear') or have('alienwear') then + return 'There are too much people here. I don\'t think I can change clothes without being noticed.'; + elseif tonumber(w) and tonumber(w) > 0 and tonumber(w) <= 8 then + if not me()._walked then + return 'It will be too noticeable if I do it now...'; + end + alienwear._num = w; + inv():add('alienwear'); + ref(s.obj[w]):disable(); + me()._walked = false; + inv():add('gun'); + return 'Feeling confidently I take someone else\'s clothes and put it on... I take my shotgun with me.'; + else + return 'I should make a decision...'; + end + end, + used = function(s, w) + if w == 'mywear' then + garderob.obj:add('mywear'); + inv():del('mywear'); + inv():del('gun'); + return 'I take off my quilted jacket. I need to leave my shotgun in it.'; + end + if w == 'alienwear' then + local v = alienwear._num; + ref(s.obj[v]):enable(); + inv():del('alienwear'); + inv():del('gun'); + return 'I put someone else\'s clothes back to wardrobe. I hide the shotgun in my quilted jacket.'; + end + end, + obj = { + vobj(1,'denim jacket','{A denim jacket}.'), + vobj(2,'red jacket','{A red-coloured jacket}.'), + vobj(3,'overcoat','{An overcoat}.'), + vobj(4,'terminator jacket', "{A jacket} with \"I\'ll be back\"."), + vobj(5,'jacket with daisies', "{A white jacket} with daisies."), + vobj(6,'coat', "{A wool jacket}."), + vobj(7,'leather jacket','{A cool black leather jacket}.'), + vobj(8,'sport jacket', "{An orange sport jacket}."), + } +}; +portrait = obj { + nam = 'portraits', + dsc = 'There are big {portraits} in wooden frames on the walls.', + act = 'Hmm... There is the same face on all portraits! The cold-smiled face of a fourty-aged man with an empty chilling sight.', +}; + +salo = obj { + nam = 'lard', + inv = 'This piece of lard is too hard to eat...', + use = function(s, w) + if w == 'trap' and not trap._salo then + inv():del('salo'); + trap._salo = true; + return 'Hmm... I think I\'ve made a mousetrap!'; + end + end +}; + +food = obj { + nam = 'food', + inv = function (s) + inv():del('food'); + return 'I\'m so hungry, so I eat all this yummy food just right now without even taking a seat. Wow... Then I take the tray with empty plates to the washers.'; + end +}; + +knife = obj { + nam = 'knife', + dsc = 'I observe {a knife} on the tray.', + inv = function(s) + if s._oster then + return 'A steel knife. Very sharp.'; + end + return 'A steel knife. Too blunt.'; + end, + use = function(s, w) + if w == 'shells' then + if not s._oster then + return 'The knife is not sharp enough to be used.'; + end + if have('poroh') then + return 'I have the gunpowder already.'; + end + inv():add('poroh'); + return 'I crack one of the shells and take the gunpowder out.'; + end + end, + tak = function(s) + if have('knife') then + return 'I\'ve already got one...', false + end + return 'I think I\'ll take it with me.'; + end +}; + +ostatki = obj { + nam = 'food leftovers', + dsc = '{The leftovers of food} are evenly distributed on the plates.', + tak = function(s) + if food._num ~= 2 or have('salo') then + return 'Nothing useful...', false; + else + take('salo'); + return 'A piece of lard!', false; + end + end +}; + +podnos = obj { + nam = 'tray', + dsc = 'There is my {tray} on the table.', + act = function(s, w) + if w == 1 then + return 'A fork like a fork... Not ideally clean.'; + end + if w == 2 then + return 'The design of this spoon has no remarkable features.'; + end + return 'Blue plastic. A little oily by touch.'; + end, + obj = { 'ostatki', + vobj(1, 'fork', 'A {fork} and'), + vobj(2, 'spoon', 'a {spoon} lie beside.') + }, +}; + +moika = room { + nam = 'dish washing', + enter = function() + return cat('I take the tray to the dish washing area.^^', walk('kitchen')), false; + end +}; + +eating = room { + pic = 'gfx/podnos.png', + enter = function(s, f) + podnos.obj:add('knife'); + inv():del('food'); + if not me()._kitchendlg then + me()._kitchendlg = true; + return walk('kitchendlg'), false; + end + if f ~= 'kitchendlg' then + return 'I take a seat at a free table and have some meal.'; + end + end, + nam = 'at the table', + dsc = 'I feel a plain surface of the table under my hands.', + obj = { 'podnos' }, + way = { 'moika' }, + exit = function(s) + end +}; + +gotfood = function(w) + inv():add('food'); + food._num = w; + return back(); +end + +invite = obj { + nam = 'invitation', + inv = 'The invitation to the lecture of Belin: Level:4, Hall:2... Hmmm... I need to get there... He has my Barsik.', +} + +povardlg = dlg { + nam = 'in the kitchen', + pic = 'gfx/povar.png', + dsc = 'I see the tired fat face of the service woman in a white cap...', + obj = { + [1] = phr('Please, give me these green... Yeah - and beans!', 'Here you are!', [[pon(1); return gotfood(1);]]), + [2] = phr('Potatoes with bacon, please!', 'Bon appetite!', [[pon(2); return gotfood(2);]]), + [3] = phr('Two garlic soups!!!', 'Nice choice!', [[pon(3);return gotfood(3);]]), + [4] = phr('Please, something not hard. I have an ulcer...', 'Oatmeal!', [[pon(4); return gotfood(4);]]), + }, +}; +kitchendlg = dlg { + nam = 'talking to employee', + pic = 'gfx/ilya.png', + dsc = 'I took my tray and sat at a free table. A minute later some guy tried to join my table with a question: "Occupied?"', + obj = { + [1] = phr('No, not occupied...', '— Thanks. How\'s it going? What unit are you from?', [[pon(3,4,5); poff(2);]]), + [2] = phr('Occupied...', '— Ha-ha! Nice joke! What unit are you from?', [[pon(3,4,5); poff(1);]]), + [3] = _phr('Hmm... Space Curvatures...', '— Oh, that\'s an old stuff!', [[pon(6);poff(4,5)]]), + [4] = _phr('E-er... Quantum Jumps...', '- Hmm? Haven\'t heard about it.', [[pon(6);poff(3,5)]]), + [5] = _phr('Oh... The Department of Quasispace Research!', '— Wow! Cool!', [[pon(6);poff(3,4)]]), + [6] = _phr('Hmm... ', '— And what is your security level?', [[pon(7,8)]]), + [7] = _phr('Super-secret!', '— Wow! ... ', [[poff(8); pon(9)]]), + [8] = _phr('Anonymous.', '— Really? Haven\'t heard about it. Maybe it\'s even more classified than mine...', +[[poff(7); pon(9)]]), + [9] = _phr('Mmm...', '— I\'m Ilya... — the guy reaches his thin hand — And what\'s your name?', [[pon(10, 11, 12)]]), + [10] = _phr('Pp.. Pk... Pupkin... Vasily Pupkin.', '— Oh, a rare last name!', [[poff(11,12); pon(13)]]), + [11] = _phr('Sergey.', '— Give me five, man!', [[poff(10,12); pon(13)]]), + [12] = _phr('George...', '— Ok, nice to meet you, Gosha!', [[poff(10,11); pon(13)]]), + [13] = _phr('Hmm...', +[[— You're some kind weird... But it doesn't matter. We are all here... — Ilya made an expressive face -... I'm distributing invitations to the classified lecture of Belin... Only for friends... I think I like you. And your security level is high enough... So...]], [[pon(14)]]), + + [14] = _phr('Where is he?... Hmm.. Where the lecture will take place?', + +[[— Security level 4. Hall 2. So, be there! It's a good opportunity to get close to... — Ilya gave a look at one of the portraits on the wall. — Oh, I almost forgot! — he gave me a piece of white plastic — Well, see ya!... — Uhhh...]],[[inv():add('invite');return walk('eating');]]), + } +}; +kitchen = room { + nam = 'canteen', + pic = 'gfx/kitchen.png', + dsc = 'A small canteen.', + act = function(s, w) + if w == 4 then + return 'I see someone\'s hands taking trays with used plates to somewhere inside...'; + end + if w == 1 then + if not have('food') then + return 'I took a seat at a free table. Ok, got some rest - now it\'s time to go!'; + end + return walk('eating'); + end + if w == 2 then + return 'They sound like a hive of bees...'; + end + if w == 3 and not have('food') then + return cat([[I joined the queue... I took a tray, cutlery and wipes. Time flows painfully slowly. At last I make an order...^^]], walk('povardlg')); + end + end, + used = function(s, w, ww) + if w == 1 and ww == 'food' then + return s:act(1); + end + end, + enter = function(s) + if not have('mywear') and not have('alienwear') then + me()._walked = true; + end + set_music('mus/foot.mod'); + end, + exit = function(s, t) + if have('food') and t ~= 'eating' then + return 'Just leave with a tray in my hands? No.', false; + end + if t == 'stolcorridor' then + set_music('mus/ice.s3m'); + end + end, + obj = { 'portrait', + vobj(1, 'tables', '{Tables} for 4 and 8 persons are placed evenly in the hall.'), + vobj(2, 'people', 'The canteen is full of {people}.'), + vobj(3, 'queue', 'The {queue} of hungry people waiting for their food moves fast enough.'), + vobj(4, 'dish washing', 'In the corner there\'s a {slot} for disposal of used trays and washing-up.'), + }, + way = { 'stolcorridor' }, +}; + +stolcorridor = room { + nam = 'canteen entrance', + pic = 'gfx/kitchencor.png', + dsc = 'The long and narrow corridor is illuminated by fluorescent light.', + act = function(s, w) + if w == 1 then + return 'Yeah, these people came here to eat...'; + end + end, + obj = {'garderob', vobj(1,'люди', '{People} walk back and forth along the corridor.')}, + way = {'sside', 'kitchen'}, + exit = function(s, t) + if t == 'sside' and not have('mywear') and not have('alienwear') then + + return 'It\'s cold outside... I won\'t go there without a coat... No...', + false; + end + end, + enter = function(s) + -- generate garderob + if have('gun') and not gun._hidden then + return 'I\'m afraid there will be some questions to me if I go inside with a shotgun...', false; + end + local i + for i=1, 8 do + local o = garderob.obj[i]; + ref(o):disable(); + end + local k = 7; + for i=1, 5 do + if not have('alienwear') or k ~= alienwear._num then + local o = garderob.obj[k]; + ref(o):enable(); + end + k = rnd(8); + end + end +}; + +sside = room { + nam = 'south side', + pic = 'gfx/sside.png', + dsc = [[I am at the south wall of the institute building. ]], + act = function(s, w) + if w == 1 then + ways():add('stolcorridor'); + return "I came across the entrance and saw a label - 'Canteen'. Hmm... Maybe go inside?"; + end + if w == 2 then + return 'The ones who walk out seem to be more pleased than others...'; + end + end, + way = {'eside','wside'}, + obj = { vobj(1, "entrance", "There's an {entrance} near the east corner."), + vobj(2, "people", "The entrance door opens from time to time letting {people} in and out.")}, + exit = function(s, t) + if t == 'eside' then + return 'If I go there I will be a good target for machine guns.', false + end + end +}; + +nside = room { + nam = 'north side', + pic = 'gfx/nside.png', + dsc = 'I am at the north wall of the institute building.', + way = {'eside','wside' }, + act = function(s, w) + if w == 1 then + return 'Yeah — a drainpipe... Seems strong enough. But I doubt I can climb it up.'; + end + end, + obj = { vobj(1, 'tube', 'A {drainpipe} flows along the east corner.')}, +}; + + +wside = room { + nam = 'front side', + pic = 'gfx/wside.png', + dsc = 'The front side of the institute.', + way = {'entrance', 'nside','sside' }, + act = function(s, w) + if w == 1 then + return 'The van my story began with...'; + end + if w == 5 then + return 'It starts too high to reach. Also it\'s locked. Maybe it may be of some use during fire, but I really doubt about it...' + end + if w == 2 then + return 'The guards will recognize me for sure. I\'d better save my Barsik first.'; + end + if w == 3 then + return 'Nice entrance... But I can\'t get rid of an idea that the institute eats people.'; + end + if w == 4 then + return 'It\'s almost dark outside, but people still keep going inside...'; + end + end, + obj = { vobj(3, 'entrance', 'The main {entrance} has a big rotating door'), + vobj(4, 'people', ' letting {people} in and out.'), + vobj(1, 'van', 'There\'s a black {van} in front of the door.'), + vobj(2, 'checkpoint', 'Sixty meters further I can hardly distinguish a {checkpoint}.'), + vobj(5, 'ladder', 'I see a fire-escape {ladder} on the south part of the wall. The ladder stretches from the second to the fifth floor.' ), + } +}; + +turn1 = obj { + nam = 'tourniquet', + dsc = 'Shiny steel {tourniquets} block the passage to the elevators. The green indicators show the message: <>.', + act = function(s, w) + if s._inside then + s._inside = false; + here().way:del('lift'); + return 'I approach the tourniquets, use the card and go out from the restricted area.'; + end + if s._unlocked then + s._inside = true; + here().way:add('lift'); + return 'I approach the tourniquets, use the card and and in a moment I\'m at the elevators.'; + end + return 'I approach a tourniquet, but I see a red X sign shining. Bad idea to go further.'; + end, + used = function(s,w) + if w == 'card' then + s._unlocked = true; + s._inside = true; + here().way:add('lift'); + return 'I apply the card to a tourniquet and see a green light. The passage is clear. I go to the elevators.'; + end + end +}; + +lustra = obj { + nam = 'chandeliers', + dsc = 'Big shiny {chandeliers} hang over my head.', + act = 'I can\'t help watching them... I think they are made of crystal.'; + +}; + +divan = obj { + nam = 'sofa', + dsc = 'In the corner there\'s a {sofa} for guests placed opposite to the guard table.', + act = function(s) + return 'Black-leathered, very soft sofa.'; + end, +}; + +entrance = room { + nam = 'main entrance', + pic = 'gfx/entrance.png', + dsc = 'The first floor of the institute is shocking by its magnificence.', + act = function(s, w) + if w == 2 then + return 'A big padlock hangs on the gates.'; + end + if w == 3 then + if not turn1._inside then + return 'The tourniquets block my way to the elevators.'; + + end + return 'Four elevators seem not enough for all institute employees.'; + end + if w == 4 then + return 'A table made from glass or crystal. There\'s a terminal beyond the table.'; + end + if w == 5 then + return 'It would be better for me if he doesn\'t see me once again.'; + end + if w == 6 then + return 'People... It\'s very unusual for me to see so many people.'; + end + end, + obj = { + 'lustra', + vobj(2, 'gates', 'Iron {gates} to railways occupy all space of east wall.'), + vobj(3, 'elevators', 'In the middle of the hall there are {elevators}.'), + 'turn1', + vobj(4, 'table', 'There\'s a {table} before tourniquets.'), + vobj(5, 'guard', 'The {guard} sits at the table.'), + vobj(6, 'people', '{People} come and go in and out making a queue near the elevators.'), + 'divan', + }, + way = { 'wside' }, + enter = function(s, f) + if have('gun') and f == 'wside' and not gun._hidden then + return 'I think there will be many questions about my shotgun if I take it inside with me... I should hide it somewhere', false; + end + end, + exit = function(s, t) + if t == 'wside' then + turn1._inside = false; + s.way:del('lift'); + end + end, +}; + +pinlift = obj { + nam = function(s) + if s._num == 3 then + return ''; + end + return 'people'; + end, + act = function(s) + return 'Empty and depressed sights... Painful silence.'; + end, + dsc = function(s) + if s._num == 1 then + return 'The elevator is full of {people}.'; + end + if s._num == 2 then + return 'There are several {men} in the elevator.'; + end + if s._num == 3 then + return 'The elevator is empty.' + end + end +}; + +lift = room { + nam = 'elevator', + pic = 'gfx/lift.png', + dsc = 'It must be bright and comfortably in the elevator. But I am tormented by claustrophobia. I see buttons on the panel:', + enter = function(s, t) + if here() == entrance then + s._from = 1; + pinlift._num = 1; + return 'I wait for one of the elevators and go inside.'; + end + pinlift._num = rnd(3); + if here() == floor2 then + s._from = 2; + elseif here() == floor3 then + s._from = 3; + elseif here() == floor4 then + s._from = 4; + elseif here() == floor5 then + s._from = 5; + end + return 'I press an elevator call button and wait. After some time I go inside an elevator.'; + end, + act = function(s, w) + local to,st + if not tonumber(w) then + return + end + if w == s._from then + return cat('No!!! The claustrophobia forces me out of the elevator.^^', + back()); + end + if w == 8 then + st = ''; + if galstuk._wear then + st = ' By the way, I have a tie.'; + end + if me()._brit then + return 'I look in the mirror and see the tired but smoothly shaved face. This is me.' .. st; + end + return 'I look in the mirror and see tired and bearded face. This is me.'..st; + end + if w == 6 or w == 7 then + return 'I\'m nervous... But I should not take nervous decisions.'; + end + if w == 1 then + to = 'entrance'; + else + to = 'floor'..w; + end + return cat('I press the button and wait. Claustrophobia almost knocks me down, but I\'m waiting... Ukhh... Trip done at last!^^', + walk(to)); + end, + exit = function() + return 'Elevator doors close behind me.'; + end, + obj = { + vobj(1,'1', '{1},'), + vobj(2,'2', '{2},'), + vobj(3,'3', '{3},'), + vobj(4,'4', '{4},'), + vobj(5,'5', '{5},'), + vobj(6,'stop','{stop}'), + vobj(7,'go','и {go}.'), + vobj(8,'mirror', 'The elevator back wall is a {mirror}.'), + 'pinlift', + }, +}; + +floor2 = room { + nam = '2nd floor site', + pic = 'gfx/floor2.png', + dsc = "There are no windows on the second floor. Low ceiling and grey-green walls. It's cold and silent here.", + act = function(s, w) + if w == 1 then + return 'The door seems to be made of lead... I do not see any possibility to get in there. And it\'s for good. There\'s a label under the sign which says: <>.'; + end + if w == 2 then + return 'Yeah, one of these elevators brought me to this damned place...'; + end + end, + obj = { + vobj(1, 'door', 'I see a massive {door} with the sign <>'), + vobj(2, 'elevators', 'It seems the four elevator slots are watching for me gloomily.'), + }, + way = { 'lift' }, +}; + +resh = obj { + nam = 'bars', + dsc = function(s) + if not s._unscrew then + return 'The hole is protected by the iron-bar {lattice}.'; + end + if vent._off then + return 'In the hole I can distinguish blades of a big airing fan. The {lattice} lies on the floor.'; + end + return 'The blades of the big airing fan are rotating. The {lattice} lies on the floor.'; + end, + act = function(s) + if s._unscrew then + return 'This is what can be done with a blunt knife if you have enough patience and skill!'; + end + if not stoly._moved then + return 'Cannot reach...'; + end + return 'The lattice is screwed tightly with 12 screws...'; + end, + used = function(s, w) + if w == 'knife' and not s._unscrew and stoly._moved then + s._unscrew = true; + return 'I climb the table and try to unscrew the screws with a knife. This takes me much time. But at last I make it. The lattice falls down on the floor. I get down from the table.'; + end + if w ~= 'stol' then + return 'No way...'; + end + end, +}; + +vent = obj { + nam = 'airing hole', + dsc = 'In the middle of the ceiling there is a big square {hole} for airing.', + act = function(s) + if not stoly._moved then + return 'I cannot reach it...'; + end + if not resh._unscrew then + return 'I step on the table and examine the hole. It is covered by the lattice... Being disappointed I get down.'; + end + if not s._off then + return 'I climb the table and watch the sharp blades of the fan. I\'m afraid it is too dangerous...'; + end + if not s._trap then + return 'I climb the table. Holding the edges of the hole I\'m trying to get in... It\'s dark and wet there. I\'m almost in when I see red eyes and teeth of a big rat... No!!! I fall back on the table and then hit the floor.'; + end +-- here we go! + return walk('toilet'); + end, + + used = function(s, w) + if w == 'stol' then + return + end + if not stoly._moved then + return 'I can\'t reach the hole...'; + end + if not resh._unscrew then + return 'The hole is covered by the lattice...'; + end + if not s._off then + return 'I can\'t because of the fan blades...'; + end + if w == 'gun' and not s._trap then + gun._loaded = false; + return 'I climb the table and point the shotgun to the hole. Both barells shot simultaneously with deep sound. I listen. The hole is silent... I get down. I think it\'s useless...'; + end + if w == 'trap' then + if not trap._salo then + return 'I set the trap on the edge of the hole. Waiting. But the rat is not a fool. I take the trap back. I need some bait.'; + end + inv():del('trap'); + vent._trap = true; + return 'I climb the table and set the baited trap on the edge of the hole... I need not wait for too long... The clash sound and the last scream of the rat make me know that the work is done!'; + end + end, + obj = { + 'resh' + } +}; + +stol = obj { + nam = 'table', + inv = 'I hold the corner of one of the tables. Seems made from oak.', + use = function(s, w) + if w == 'vent' or w == 'resh' then + inv():del('stol'); + stoly._moved = true; + return 'I strained myself and moved one of the tables to the center of the room.'; + end + end +}; + +stoly = obj { + nam = 'tables', + dsc = function(s, w) + if not s._moved then + return 'Four oak {tables} take their places in the four room corners respectively.'; + end + return 'Three oak {tables} reside in the room corners. One table is moved to the center.'; + end, + act = function(s, w) + if s._moved then + return 'Put one table on another? No - I won\'t make it...'; + end + inv():add('stol'); + + return [[Good furniture... But the table in my house is better - I've made it with my own hands. I hold the corner of a table.]]; + end +}; + +eroom = room { + nam = 'STR department', + pic = function() + if not stoly._moved then + return 'gfx/sto.png'; + end + if not resh._unscrew then + return 'gfx/sto2.png'; + end + return 'gfx/sto3.png'; + + end, + dsc = [[I am in the small room with beige walls.]], + enter = function(s, f) + if f == 'cor3' then + return [[I opened the door and looked inside. Whew... Empty! I think I may look around...]]; + end + if f == 'toilet' then + return 'Well... I lift the iron lattice from the toilet floor and go into darkness... In some minutes I jump from the airing hole to the table and go to the floor.'; + end + end, + act = function(s, w) + if w == 1 then + return 'I move the louvers and look into outside darkness. I face my dim reflection in the window. Looking down I see the machine gun towers and the railways.'; + end + if w == 2 then + return 'It is just terminals. The client machines which connect to the institute servers. However, I\'m not interested in them. I have not used a computer for 10 years.'; + end + end, + obj = { + vobj(1, 'window', 'A big {window} looks to the east.'), + 'stoly', + vobj(2, 'terminals', 'On each table there is a {terminal} with a 17-inch display.'), + 'vent', + 'portrait', + }, + way = { 'cor3' }, + exit = function() + inv():del('stol'); + end +}; + +key = obj { + nam = 'key', + dsc = 'Someone has left the {key} in the door lock.', + tak = 'I carefully take out the key and put it in my pocket.', + inv = 'To my surprise - ordinary door locks are used in the institute along with complex electronic security!', +}; + +room33 = room { + nam = 'room', + pic = 'gfx/bholes.png', + dsc = [[I stand for some seconds near the door. Then I open it and go inside.]], + act = function(s, w) + if w == 1 then + return cat('A grey-haired man in thick glassed turns to me and for watches me for a second. - Who are you? Go outside immediately!!^^',back()); + end + end, + obj = { + vobj(1, 'people', [[I see a group of {people} in white technical coats standing at the board in the middle of the room and having a great debate among theirselves.]]), + 'portrait', + 'key' + }; + way = { 'cor3' }, + exit = [[ I carefully leave the room.]]; +}; + +room3x = room { + nam = 'room', + enter = function(s, f) + if s._num == 2 then + return [[I open the door a little and look inside. + A square room with two windows. + A lot of people are sitting at terminals along the walls. + I close the door in a hurry.]], false; + end + if s._num == 4 then + return [[I touch the cold metal handle and open the door carefully... - Simulation in progress!!! - I hear someone's angry voice from inside. I release the handle and the door closes...]], + false; + end + if s._num == 5 then + ref(f).way:add('eroom'); + return walk('eroom'), false; + end + if s._num == 6 then + return [[I start opening the door, but I begin to hear some strange sound which is becoming louder and louder. - What idiot hasn't closed the door?! - someone inside is very angry. I close the door in a hurry.]], + false; + end + end, +}; + +switch = obj { + nam = 'switch', + dsc = function(s) + local t + if vent._off then + t = ' in <> state.'; + else + t = ' in <> state.'; + end + return 'In the corner near the entrance there\'s a {switch}'..t; + end, + act = function(s) + if vent._off then + vent._off = false; + return 'Switching ON!' + end + if not cor3._locked then + return [[I turn the switch OFF and walk away. But suddenly one of the doors opens and some old voice screams to the corridor: What the...!!! This is impossible!!! No way to work!!! Turn it on back!!! - I need to return to the switch and to turn it ON.]]; + end + vent._off = true; + return 'Switching OFF!'; + end +}; + +cor3 = room { + nam = '3rd floor corridor', + pic = 'gfx/cor3.png', + enter = function(s, f) + if f == 'floor3' then + return 'I apply the card to a card reader... Red indicator blinks and then becomes green... The way is free!'; + end + end, + dsc = 'The long corridor stretches to the end of the building. Fluorescent lamps bring some dim light from the ceiling. There\'s a green carpet walkway on the floor.', + act = function(s, w) + if w == 1 then + return 'I walk to one of the doors and look in the door porthole... People in white are moving around some weird devices. Just like bees... I think these rooms are labs.'; + end + if not tonumber(w) then + return nil, false + end + if w == 3 then + if s._locked then + return 'This room is locked... I hear some not loud but intense sounds. I do not want to open it.'; + end + return walk('room33'); + end + if tonumber(w) >=2 and tonumber(w) <=6 then + room3x._num = w; + return walk('room3x'); + end + if w == 7 then + return 'The window looks to the south side... It\'s dark outside. Nothing to watch but snowflakes bumping the glass...'; + end + if w == 8 then + return 'Visit?'; + end + end, + used = function(s, w, ww) + if w == 1 or w == 2 or w == 4 or w == 5 or w == 6 then + return 'No way...'; + end + if w == 3 and ww == 'key' then + if s._locked then + return 'Already closed...'; + end + s._locked = true; + return 'I insert the key in the key hole and lock the door making two turns. I take out the key and put it back to the pocket.'; + end + end, + obj = { + vobj(1, 'white doors', 'On the right side there are white metal {doors} with windows.'), + vobj(2, 'gravity', 'On the left side there are several doors with labels: {gravity},'), + vobj(4, 'simulation', '{simulation}'), + vobj(5, 'STR effects','{STR effects},'), + vobj(3, 'black holes', '{black holes},'), + vobj(6, 'quasispace', '{quasispace}.'), + vobj(7, 'window', 'I see the {window} in the end of the corridor.'), + vobj(8, 'toilet', '{Toilets} are near the window.'), + 'switch', + 'portrait', + }, + way = {'floor3', 'toilet3', 'toiletw'}, +}; + +mylo = obj { + nam = 'soap', + inv = function(s) + if s._pena then + return 'A piece of soap with foam.'; + end + return 'A piece of soap.'; + end, + dsc = 'A piece of {soap} lies on the basin.', + tak = 'I took the slippy soap... It fell down back to the basin, but I caught it up again and put it in the pocket...'; +}; + +sushka = obj { + nam = 'dryer', + dsc = 'A hand {dryer} hangs nearby.', + act = function(s,w) + return 'I bring my hands to the dryer and it starts working... Deja vu...'; + end, +}; + +umyvalnik = obj { + nam = 'basin', + dsc = 'The {basin} is located near the entrance.', + act = function(s) + if me()._mylo then + me()._mylo = false; + return 'I wash away soap foam from my face...'; + end + return 'I drink chlorinated water greedily... Yeah - this water is not the same as in my creek...'; + end, + used = function(s, w) + if w == 'mylo' then + mylo._pena = true; + return 'I put the soap into warm water...'; + end + end +}; + +toilet3 = room { + nam = 'toilet', + pic = 'gfx/toil3.png', + dsc = 'I am in a toilet. A standard architecture. No windows. White tile.', + act = function(s, w) + if w == 2 then + return 'All are in use!'; + end + if w == 3 then + return 'People are evenly distributed over the toilet. All closets are occupied. A couple of men are waiting for their turn.'; + end + end, + obj = { + 'umyvalnik', + 'mylo', + 'tzerkalo', + 'sushka', + vobj(2, 'closets', 'There are 4 {closets} in this toilet.'), + vobj(3, 'people', 'Some {people} are present...'), + }, + way = { 'cor3' }, + exit = function() + if me()._mylo then + return 'With soap on the face? No...', false + end + objs():del('face'); + end +}; + +floor3 = room { + nam = '3rd floor site', + pic = 'gfx/floor3.png', + dsc = [[The site of the third floor is large enough. Beige walls. High ceilings.]], + act = function(s, w) + if w == 1 then + return 'I gaze at the window for a minute... A white desert flowing to the darkness... At this moment I realize what an alien place I am in...'; + end + if w == 2 then + if not s._unlocked then + return 'Metal upholstered with leather. The door has a card reader. The door label says: <>'; + end + return walk('cor3'); + end + if w == 3 then + return 'Strong doors I must admit... Much stronger than the door of my hut... The door has a card reader. The door label says: <>'; + end + end, + used = function(s,w,ww) + if ww ~= 'card' then + return 'It won\'t help...'; + end + if w == 2 then + s._unlocked = true; + s.way:add('cor3'); + return walk('cor3'); + end + if w == 3 then + return 'I apply the card to the card reader. I hear an annoying beep - access denied.'; + end + end, + obj = { + vobj(1, 'window', 'A wide {window} looks to the west.'), + vobj(2, 'brown door', 'There\'s a brown {door} to the right of the window.'), + vobj(3, 'white door', 'A white {door} - to the left.'), + }, + way = { 'lift' }, +}; + +britva = obj { + nam = 'razor', + dsc = 'A {razor} lies on the basin.', + tak = 'I put the razor in pocket hoping no one notices it.', + inv = 'A razor, little bit rusty...', +}; + +face = obj { + nam = 'face', + dsc = 'The mirror reflects my {face}.', + act = function(s) + local st = ''; + if me()._brit then + st = ' Well shaved.'; + elseif me()._mylo then + st = ' With soap foam on it.'; + end + if galstuk._wear then + st = st..' With a tie, by the way.'; + end + return 'This is a reflection of my face.'..st; + end, + used = function(s, w) + if w == 'mylo' then + if me()._brit then + return 'I\'ve shaved already...'; + end + if not mylo._pena then + return 'The soap is quite dry...'; + end + if not have('britva') then + return 'I put soap on the face and wash away the dirt... Ooh...'; + end + me()._mylo = true; + return 'I put soap foam on the face...'; + end + if w == 'britva' then + if me()._brit then + return 'I\'ve shaved already...'; + end + if not me()._mylo then + return 'I need foam on my face...'; + end + me()._brit = true; + me()._mylo = false; + return 'I\'m shaving... Then I wash my face...'; + end + end +}; + +tzerkalo = obj { + nam = 'mirror', + dsc = 'A {mirror} is placed where it should be - above the basin.', + act = function(s) + local st = ''; + objs():add('face'); + if galstuk._wear then + st = ' With a tie, besides...'; + end + if me()._brit then + return 'Sad, but well shaved face.' .. st; + end + return 'Wild bearded face looks at me from the mirror.' .. st; + end, +}; + +toilet = room { + nam = 'toilet', + + pic = 'gfx/toil4.png', + dsc = 'Quite large toilet, I should say. White tile. Yellow stains. Humidity and sounds of flowing water. A wooden door leads to the corridor.', + enter = function(s, f) + if f == 'eroom' then + return 'I climb to the airing hole. It\'s dusty and quiet inside. I wander the airing system maze until at last I see the light over my head. A moment later I push the iron lattice in the toilet floor...'; + end + end, + act = function(s, w) + if w == 2 then + return 'Yeah... I\'m lucky. I guess it\'s a men\'s toilet...'; + end + if w == 3 then + return 'They have strange airing system. But thanks to it I am here!...'; + end + end, + obj = { + vobj(2, 'closets', 'There are only 2 {closets} in this toilet.'), + 'umyvalnik', + 'britva', + 'tzerkalo', + 'sushka', + vobj(3, 'lattice', 'There is an iron {lattice} on the floor.'); + }, + way = { 'eroom', 'cor4'}, + exit = function(s, t) + if me()._mylo then + return 'With foam on the face? No...', false + end + objs():del('face'); + if t ~= 'eroom' then + return 'I come outside the toilet carefully.'; + end + end +}; + +toiletw = room { + nam = 'women closet', + enter = function(s, w) + return 'Whew... I was about making a mistake...', false; + end +}; + +function room4x_hear() + local ph = { + [1] = '...According to the uncertainty principle it is impossible to know both the position and the momentum of a quantum particle...', + [2] = '...According to the theory of quantum mechanics, measurement causes an instantaneous collapse of the wave function describing the quantum system into an eigenstate of the observable state that was measured...', + [3] = '...The reduction of the wave packet is the phenomenon in which a wave function appears to reduce to a single one of those states after interaction with an observer...', + [4] = '...The theory predicts that both values cannot be known for a particle, and yet the EPR experiment shows that they can...', + [5] = '...The principle of locality states that physical processes occurring at one place should have no immediate effect on the elements of reality at another location...'; + [6] = '...They claim that given a specific experiment, in which the outcome of a measurement is known before the measurement takes place, there must exist something in the real world, an "element of reality", which determines the measurement outcome...', + [7] = '...The many-worlds interpretation is a postulate of quantum mechanics that asserts the objective reality of the universal wavefunction, but denies the actuality of wavefunction collapse, which implies that all possible alternative histories and futures are real—each representing an actual "world" (or "universe")...', + [8] = '...Everett\'s original work contains one key idea: the equations of physics that model the time evolution of systems without embedded observers are sufficient for modelling systems which do contain observers; in particular there is no observation-triggered wave function collapse which the Copenhagen interpretation proposes...', + [9] = '...The particles are thus said to be entangled. This can be viewed as a quantum superposition of two states, which we call state I and state II...', + [10] = '...Alice now measures the spin along the z-axis. She can obtain one of two possible outcomes: +z or -z. Suppose she gets +z. According to quantum mechanics, the quantum state of the system collapses into state I. The quantum state determines the probable outcomes of any measurement performed on the system. In this case, if Bob subsequently measures spin along the z-axis, there is 100% probability that he will obtain -z. Similarly, if Alice gets -z, Bob will get +z...', + }; + return ph[rnd(10)]; +end + +room4x = room { + nam = 'room', + enter = function(s, f) + if s._num == 1 then + return 'I carefully touch the handle and try to open the door. Closed...' + , false; + elseif s._num == 2 then + return 'I come close to the door and listen... - '..room4x_hear().. + ' — Ooh... I\'d better keep going...', + false; + elseif s._num == 3 then + return 'I come close to the door and listen... - I hear someone argue fiercly... - I\'d better go...', false; + elseif s._num == 4 then + return 'I open the door and come inside. 12 pairs of eyes of guys sitting at desks look at me attentively. Another eye pair belongs to a man standing at a board. - Sorry, I must have missed the door... - this is all I can say in such situation. I quickly get outside...', false; + elseif s._num == 5 then + return 'Closed...', false; + end + end, +}; + +galstuk = obj { + nam = function(s) + if s._gal then + return 'tie'; + end + return 'rag'; + end, + inv = function(s, w) + if not s._gal then + s._gal = true; + return 'I examine the rag and I figure out that it used to be a tie some time ago.' + end + if s._hot then + if not s._wear then + s._wear = true; + return 'I put the tie on with dignity...'; + end + return 'I wear the tie...'; + end + if s._mylo then + return 'It is all in soap!'; + end + if not s._water then + return 'It is dirty! I won\'t put it on!'; + end + if not s._hot then + return 'It is wet! I won\'t wear it!'; + end + end, + used = function(s, w) + if s._wear then + return 'I wear the tie...'; + end + if w == 'mylo' then + if not mylo._pena then + return 'The soap is dry...'; + end + s._mylo = true; + if not s._gal then + s._gal = true; + return 'While putting soap to the rag, I understand that this rag use to be a tie once.'; + end + return 'I put some soap on the tie...'; + end + end, + use = function(s, w) + if s._wear and w ~= 'hand' then + return 'I wear the tie...', false; + end + if w == 'umyvalnik' then + if not s._mylo then + return 'Using just water? I doubt it washes chalk away...'; + end + s._water = true; + s._mylo = false; + return 'I washed the tie in warm water...'; + end + if w == 'sushka' then + if not s._water then + return 'Why should I dry this?'; + end + s._hot = true; + s._water = false; + return 'In 5 minutes I dried the tie well...'; + end + end +}; + +room46 = room { + nam = 'lecture room 6', + pic = 'gfx/room4.png', + enter = 'I open the door and come inside... The room is empty...', + dsc = 'I am inside the lecture room... Several tables are placed in two rows towards the board.', + act = function(s, w) + if w == 1 then + if not have('galstuk') then + inv():add('galstuk'); + return 'I see a rag on the board. I take the rag.'; + end + return 'Hmm... I do not understand a thing in this stuff...'; + end + if w == 2 then + return 'I see how spotlights are searching the snowy field down there...'; + end + if w == 3 then + return 'I sit by the keyboard, but I recall that I\'m done with the past... I am not a hacker anymore - I am a forester.'; + end + end, + obj = { + vobj(3,'terminal', 'Every table has a {terminal} placed on it.'); + vobj(1,'board', 'Some weird formulas are written on the lecture {board}...'), + vobj(2,'window', 'The {window} looks to the east.'), + 'portrait', + }, + way = { 'cor4' }, +}; + +facectrl = dlg { + nam = 'face control', + pic = 'gfx/guard4.png', + dsc = 'I see the unpleasant and unfriendly face of the fat security guy.', + obj = { + [1] = phr('I\'ve come to listen to the lecture of Belin...', + '— I don\'t know who you are, — the guard grins — but I was told to let only decent people in here.', + [[pon(2);]]), + + [2] = _phr('I have the invitation!', + '— I do not damn care! Look at yourself! Used a mirror recently?! You\'ve come to listen to Belin himself! Be-lin! The right hand of ... - the guard paused for a second in respect - So... Get out of here!', + [[pon(3,4)]]), + + [3] = _phr('I\'m gonna kick you fat face!', '— Well, that\'s enough... - Powerful hands push me out to the corridor... I feel lucky to stay in one piece...', + [[poff(4)]]), + + [4] = _phr('You boar! I\'ve told you I have the invitation!', + '— Whaaat? - The guard\'s eyes are going red... The powerful kick sendsme to the corridor... It could be worse...', + [[poff(3)]]), + + [5] = _phr('I want to listen to the lecture of Belin...', + '— First — Doctor Belin, and second — no way if no tie...', + [[pon(2)]]), + + [6] = _phr('I want to listen to the lecture of Dr. Belin very much!!!', + 'The guard examines me with his suspicious eyes and says unwillingly: Your invitation...', + [[pon(7)]]), + + [7] = _phr('Here... you b... please...', 'Ok... Come in, hurry... The lecture has already begun...', + [[inv():del('invite'); return walk('hall42')]]); + }, + exit = function(s,w) + s:pon(1); + end +}; + +hall42 = room { + nam = 'Hall 2', + pic = 'gfx/hall2.png', + dsc = 'A lot of people. Silent. I guess the lecture is going on.', + obj = { + vobj(1, 'Belin', 'A man stands at the board - it\'s {Belin}! The man who has stolen my cat.'), + vobj(2, 'seats', 'I see some free {seats} at the third row.'), + vobj(3, 'window', 'Three wide {windows} look to the west.'), + vobj(4, 'lamps', 'The hall is illuminated by fluorescent {lamps}.'), + }, + act = function(s, w) + if w == 1 then + return 'Now he is without a coat and a hat, and I can see him in details... Quite fat but tall... A tricky smile but opened face... He runs the lecture. I\'ll wait till he finishes and try to have a talk with him...'; + end + if w == 2 then + return walk('lection'); + end + if w == 3 then + return 'It\'s dark outside... Only white snowflakes reveal theirselves in the fluorescent light from time to time.'; + end + if w == 4 then + return 'Six lamps... I hate this blinking light...'; + end + end, + exit = function(s, t) + if t == 'cor4' then + return 'I do not want to lose Belin again...', false; + end + end, + enter = function(s, f) + if f == 'facectrl' then + return 'I enter the lecture hall...'; + end + if not galstuk._wear then + facectrl:pon(5); + facectrl:poff(1); + end + if not me()._brit or not galstuk._wear then + return cat( +'I try to enter the hall, but a man in a uniform stops me. I read <> on his label. He holds a shotgun.^^', walk('facectrl')), false; + end + facectrl:poff(1, 5); + facectrl:pon(6); + return walk('facectrl'), false; + end, + way = { 'cor4' }, +}; + +hall41 = room { + nam = 'Hall 1', + dsc = [[I enter the empty hall. It seems to be one of lecture halls. Many rows of seats get higher and higher one after another till the ceiling.]], + pic = 'gfx/hall1.png', + act = function(s, w) + if w == 1 then + return +'Watching the night darkness I remember Barsik with melancholy...'; + end + if w == 2 then + return 'We had just like these in our institute when I... Nevermind...'; + end + if w == 3 then + return 'Everything I could remember - I\'ve forgotten.'; + end + end, + obj = { + vobj(1, 'windows', 'Three big {windows} look to the west side.'), + vobj(2, 'table', 'A long {table} takes place near the lecture board.'), + vobj(3, 'board', 'Some formulas of a previous lecture remain on the {board}.'), + 'portrait', + }, + way = { + 'cor4', + }, +}; + +cor4 = room { + nam = '4th floor corridor', + pic = 'gfx/cor4.png', + dsc = 'I am in the corridor. Very high ceilings. I see toilets in the end of the corridor. There\'s a green carpet walkway on the floor.', + act = function(s, w) + if not tonumber(w) then + return; + end + if w == 11 then + return 'Some of them are going to the hall 2.'; + end + if w == 1 then + return 'I am melancholically looking in the night darkness... I realize how much I am tired... But I must keep going...'; + end + if w == 12 then + return 'This door like many others is provided with a smart-card reader. The red indicator is on.'; + end + if tonumber(w) >=5 and tonumber(w) <=9 then + room4x._num = w - 4; + return walk('room4x'); + end + if w == 10 then + ways():add('room46'); + return walk('room46'); + end + if w == 2 then + ways():add('hall41'); + return walk('hall41'); + end + if w == 3 then + ways():add('hall42'); + return walk('hall42'); + end + end, + used = function(s, w, ww) + if w == 12 and ww == 'card' then + return + 'I apply the card to the card reader... Beep... Access denied...'; + end + end, + obj = { + vobj(1, 'window', 'A {window} looks to the south.'), + vobj(2, 'hall 1','On the west side I see two wide doorways: {hall 1},'), + vobj(3, 'hall 2', '{hall 2}.'), + vobj(5, 'lecture room 1', 'On the east side there are less wide doors. The door labels: {lecture room 1},'), + vobj(6, 'lecture room 2', '{lecture room 2},'), + vobj(7, 'lecture room 3', '{lecture room 3},'), + vobj(8, 'lecture room 4', '{lecture room 4},'), + vobj(9, 'lecture room 5', '{lecture room 5},'), + vobj(10, 'lecture room 6', '{lecture room 6}.'), + vobj(11, 'people', 'From time to time {people} appear in the corridor.'), + vobj(12, 'front door', 'The front {door} is located at the north end of the corridor.'), + 'portrait', + }, + way = { + 'toilet', + 'toiletw', + } +}; +floor4 = room { + nam = '4th floor site', + pic = 'gfx/floor4.png', + dsc = 'The fourth floor has high ceilings.', + act = function(s, w) + if w == 1 then + return 'Darkness... Not a single light... I can\'t even see the stars. Dim and heavy fluorescent light prevents me to see them...'; + end + if w == 2 then + return 'I hate elevators...'; + end + if w == 3 or w == 4 then + return 'An ordinary door. One of many in this building. An electronic lock. I can\'t get in without a card.'; + end + end, + used = function(s, w, ww) + if ww == 'card' then + if w == 3 or w == 4 then + return [[I apply the card to a card reader... Beep. Access denied...]]; + end + end + end, + obj = { + vobj(1, 'window','A wide {window} looks to the west.'), + vobj(2, 'elevators', 'The site with four {elevators} is dimly lit.'), + vobj(3, 'south door', 'Two doors lead to the north and south corridors. The south {door} label: <>'), + vobj(4, 'north door', 'The north {door} label: <>'), + }, + way = { 'lift' }, +}; + +floor5 = room { + nam = '5th floor site', + pic = 'gfx/floor5.png', + dsc = [[The ceilings on the fifth floor are very high.]], + act = function(s, w) + if w == 1 then + return 'My legs are drowning in red velvet... I should be careful not to leave my footprints here...'; + end + if w == 2 then + return 'Yeah, made from crystal. Surely not glass.'; + end + if w == 3 then + return 'I approach the window... Interesting. I see that the window looks at quite wide area of the roof, which streches through the front part of the building...'; + end + if w == 4 or w == 5 then + return 'I can\'t examine the doors because of the guard... My ID card is not valid here...'; + end + if w == 6 then + return 'Though he does not pay any attention to me, still it is better not to bother him...'; + end + end, + used = function(s, w) + if not tonumber(w) then + return + end + if w == 6 then + return 'It\'s better not to bother him...'; + end + if w >=1 and w <=5 then + return 'I won\'t do it while the guard is here,'; + end + end, + obj = { + vobj(1, 'carpet', 'The floor is covered by the red {carpet}.'), + vobj(2, 'chandelier', 'A crystal {chandelier} hangs over my head.'), + vobj(3, 'window', 'A wide {window} looks to the west.'), + vobj(4, 'information', 'I see two doors leading to the south and north corridors. The south {door} label: <>.'), + vobj(5, 'red door', 'The north {door} does not have any labels. This is a massive door upholstered with red leather.'), + vobj(6, 'guard', + 'The passage to the doors are blocked by a checkpoint with a {guard}.'); + }, + way = { 'lift' }, +}; + diff --git a/ep2-ru.lua b/ep2-ru.lua new file mode 100644 index 0000000..aae3dfe --- /dev/null +++ b/ep2-ru.lua @@ -0,0 +1,1524 @@ +------------- now got inside!!! ----------------------- +napil = obj { + nam = 'напильник', + dsc = 'Под воротами валяется {напильник}.', + inv = 'Уже начал ржаветь...', + tak = 'Я взял напильник.', + use = function(s, w) + if w == 'knife' and not knife._oster then + knife._oster = true; + return 'Я затачиваю напильником нож... Теперь он острый!'; + elseif w == 'gun' and not gun._obrez then + if here() == wside or here() == sside then + return 'Тут много людей вокруг!'; + end + gun._obrez = true; + return 'Я присел, взял покрепче дробовик и укоротил напильником оба ствола.'; + else + return 'Нет, это бесполезно пилить...'; + end + end +}; +eside = room { + pic = 'gfx/eside.png', + nam = 'сзади института', + dsc = [[ Я нахожусь у задней стены здания института. Здесь проходят рельсы.]], + act = function(s,w) + if w == 1 then + return 'Пулеметы направлены на внешнюю - южную сторону периметра, надо держаться от них подальше.'; + end + if w == 2 then + return 'Ворота железные. И заперты изнутри.'; + end + end, + obj = { + vobj(1,'пулеметные вышки', 'Въезд поезда охраняется пулеметными {вышками}..'), + vobj(2,'ворота', 'Железнодорожные пути проходят мимо больших железных {ворот} — видимо, через них обеспечивается снабжение.'), + 'napil', + }, + exit = function(s, t) + if t == 'sside' then + return 'На южной стороне меня смущают пулеметы. Лучше не рисковать.', false + end + end, + enter = function(s, f) + if f == 'onwall' then + -- end of episode 1 + inmycar = nil; + deepforest = nil; + road = nil; + forest = nil; + home = nil; + shop = nil; + village = nil; + kpp = nil; + inst = nil; + onwall = nil; + backwall = nil; + guydlg = nil; + shop2 = nil; + shopdlg = nil; + guarddlg = nil; + set_music("mus/ice.s3m"); + end + end, + way = {'nside','sside'}, +}; + +card = obj { + nam = 'пропуск', + inv = [[Это пропуск. +Электронная смарткарта с фотографией какого-то металлюги. Написано: Алексей Подковин — 3-й уровень, категория: материя. Гммм...]], +}; +alienwear = obj { + xnam = {'джинсовка', 'красная куртка', 'пальто','куртка', 'белая куртка', 'пиджак', 'косуха', 'спортивная куртка',}, + xinv = { + 'Холодновато, но стильно!', + 'Очень красиво смотрится на фоне снега!', + 'Длиннополое пальто — это ретро!', + 'Я — терминатор!', + 'Я — пацифист!', + 'Пиджачок сидит на мне как влитой!', + 'Рок-н-ролл мертв, а я еще нет!', + 'Когда-то я занимался альпинизмом!', + }, + nam = function(s) + return s.xnam[s._num]; + end, + inv = function(s) + if s._num == 7 and not have('card') then + inv():add('card'); + return 'Немного покопавшись в карманах косухи, я нашел карточку.'; + end + return s.xinv[s._num]; + end, +}; + +garderob = obj { + nam = 'гардероб', + dsc = 'На правой стороне коридора висят {вешалки} с одеждой.', + act = function(s, w) + if have('mywear') or have('alienwear') then + return 'Здесь много людей, я не думаю, что я смогу сделать это незаметно.'; + elseif tonumber(w) and tonumber(w) > 0 and tonumber(w) <= 8 then + if not me()._walked then + return 'Это будет слишком заметно...'; + end + alienwear._num = w; + inv():add('alienwear'); + ref(s.obj[w]):disable(); + me()._walked = false; + inv():add('gun'); + return 'Я спокойно беру чужую одежду и также спокойно одеваю ее... Дробовик я снимаю из-под своего ватника.'; + else + return 'Надо определиться...'; + end + end, + used = function(s, w) + if w == 'mywear' then + garderob.obj:add('mywear'); + inv():del('mywear'); + inv():del('gun'); + return 'Я вешаю ватник на вешалку. Дробовик придется спрятать под ватником.'; + end + if w == 'alienwear' then + local v = alienwear._num; + ref(s.obj[v]):enable(); + inv():del('alienwear'); + inv():del('gun'); + return 'Я вешаю чужую одежду на вешалку. Дробовик я вешаю под свой ватник на вешалке.'; + end + end, + obj = { + vobj(1,'джинсовка','{Джинсовка}.'), + vobj(2,'красная куртка','{Куртка} ало-красного цвета.'), + vobj(3,'пальто','{Пальто}.'), + vobj(4,'куртка терминатора', "{Куртка} с надписью I\'ll back."), + vobj(5,'куртка с ромашками', "Белая {куртка} с изображением ромашек."), + vobj(6,'пиджак', "Шерстяной {пиджак}."), + vobj(7,'косуха','Клевая {косуха}.'), + vobj(8,'спортивная куртка', "Оранжевая альпинистская {куртка}."), + } +}; +portrait = obj { + nam = 'портреты', + dsc = 'По стенам развешены большие {портреты} в деревянных рамах.', + act = 'Гм... На портретах одно и то же лицо! Улыбающееся холодной улыбкой лицо человека, лет сорока, с пустым, ничего не выражающим взглядом.', +}; + +salo = obj { + nam = 'сало', + inv = 'Это кусочек сала. Я не могу его доесть, он очень жесткий...', + use = function(s, w) + if w == 'trap' and not trap._salo then + inv():del('salo'); + trap._salo = true; + return 'Гм... По-моему у меня получилась мышеловка!'; + end + end +}; + +food = obj { + nam = 'еда', + inv = function (s) + inv():del('food'); + return 'Я не выдерживаю и съедаю все это великолепие стоя, держа поднос в левой руке. Ухх... Затем я отношу поднос в мойку.'; + end +}; + +knife = obj { + nam = 'нож', + dsc = 'На подносе лежит {нож}.', + inv = function(s) + if s._oster then + return 'Железный и очень острый ножик.'; + end + return 'Железный и тупой ножик.'; + end, + use = function(s, w) + if w == 'shells' then + if not s._oster then + return 'Нож тупой.'; + end + if have('poroh') then + return 'У меня уже есть порох.'; + end + inv():add('poroh'); + return 'Я расковыриваю один из патронов и высыпаю на ладонь порох.'; + end + end, + tak = function(s) + if have('knife') then + return 'У меня уже есть один...', false + end + return 'Возьму его пока с собой.'; + end +}; + +ostatki = obj { + nam = 'остатки еды', + dsc = '{Объедки} равномерно распределены по тарелкам.', + tak = function(s) + if food._num ~= 2 or have('salo') then + return 'Ничего полезного...', false; + else + take('salo'); + return 'Кусочек сала!', false; + end + end +}; + +podnos = obj { + nam = 'поднос', + dsc = 'На столе стоит {поднос}.', + act = function(s, w) + if w == 1 then + return 'Вилка как вилка... Не очень чистая.'; + end + if w == 2 then + return 'Ложка не отличается оригинальностью своей конструкции.'; + end + return 'Синий пластик. Немного жирный на ощупь.'; + end, + obj = { 'ostatki', + vobj(1, 'вилка', 'Рядом лежат {вилка} и'), + vobj(2, 'ложка', '{ложка}.') + }, +}; + +moika = room { + nam = 'мойка', + enter = function() + return cat('Я отношу грязную посуду в мойку.^^', walk('kitchen')), false; + end +}; + +eating = room { + pic = 'gfx/podnos.png', + enter = function(s, f) + podnos.obj:add('knife'); + inv():del('food'); + if not me()._kitchendlg then + me()._kitchendlg = true; + return walk('kitchendlg'), false; + end + if f ~= 'kitchendlg' then + return 'Я сажусь за пустой столик и слегка перекусываю.'; + end + end, + nam = 'за столом', + dsc = 'Под моими руками гладкая поверхность стола.', + obj = { 'podnos' }, + way = { 'moika' }, + exit = function(s) + end +}; + +gotfood = function(w) + inv():add('food'); + food._num = w; + return back(); +end + +invite = obj { + nam = 'приглашение', + inv = 'Приглашение на лекцию Белина: 4-й уровень, зал 2... Гммм.... Мне нужно туда попасть... У него мой Барсик.', +} + +povardlg = dlg { + nam = 'на кухне', + pic = 'gfx/povar.png', + dsc = 'Передо мной полное лицо женщины - повара в белом колпаке и усталым взглядом...', + obj = { + [1] = phr('Мне вот этих зелененьких... Ага — и бобов!', 'На здоровье!', [[pon(1); return gotfood(1);]]), + [2] = phr('Картошку с салом, пожалуйста!', 'Приятного аппетита!', [[pon(2); return gotfood(2);]]), + [3] = phr('Две порции чесночного супа!!!', 'Прекрасный выбор!', [[pon(3);return gotfood(3);]]), + [4] = phr('Мне что-нибудь легонькое, у меня язва...', 'Овсянка!', [[pon(4); return gotfood(4);]]), + }, +}; +kitchendlg = dlg { + nam = 'разговор с сотрудником института', + pic = 'gfx/ilya.png', + dsc = 'Я взял свой поднос и присел за свободный столик. Через минуту со словами "Не занято?" ко мне подсел молодой парень.', + obj = { + [1] = phr('Нет, не занято...', '— Спасибо. Как дела? Ты из какого отдела?', [[pon(3,4,5); poff(2);]]), + [2] = phr('Занято...', '— Ха ха ха! Хорошая шутка! Ты из какого отдела?', [[pon(3,4,5); poff(1);]]), + [3] = _phr('Хм... Из отдела искривления пространства...', '— Старье!', [[pon(6);poff(4,5)]]), + [4] = _phr('Ааа... Отдел квантовых скачков..', '— Хм? Не слышал о таком.', [[pon(6);poff(3,5)]]), + + [5] = _phr('Эээ... Отдел изучения квазипространства!', '— Ого! Прикольно!', [[pon(6);poff(3,4)]]), + [6] = _phr('Хм... ', '— А у тебя какой уровень секретности?', [[pon(7,8)]]), + [7] = _phr('Супер секретно!', '— Ух ты! ... ', [[poff(8); pon(9)]]), + [8] = _phr('Анонимный.', '— Да? Не слышал о таком, наверное это более секретный уровень, чем мой...', +[[poff(7); pon(9)]]), + [9] = _phr('Мэээ...', '— Меня зовут Илья... Просто Илья — тянет худую руку парень — а тебя как?', [[pon(10, 11, 12)]]), + [10] = _phr('Пп.. Пк... Пупкин... Василий Пупкин.', '— Редкая фамилия!', [[poff(11,12); pon(13)]]), + [11] = _phr('Сережка.', '— Дай пятерню, братан!', [[poff(10,12); pon(13)]]), + [12] = _phr('Гоша...', '— Ну, будем знакомы, Гошка!', [[poff(10,11); pon(13)]]), + [13] = _phr('Кхмм...', +[[— Какой ты странный... Но это не важно. Мы все здесь — Илья сделал выразительное лицо -... Мне тут поручили +распространить приглашения на закрытую лекцию Белина... Только для друзей... Ты мне нравишься, да и по уровню +доступа проходишь... Так что...]], [[pon(14)]]), + [14] = _phr('Где он?... Гм.. Где лекция?', +[[— Четвертый уровень секретности. Зал 2. Ну, приходи! Хороший шанс приблизиться к... — Илья посмотрел на один из портретов на стене. — Да, чуть не забыл — протягивает он своей гибкой рукой кусок белого +пластика — Ну, до встречи!... — Уххх...]],[[inv():add('invite');return walk('eating');]]), + } +}; +kitchen = room { + nam = 'столовая', + pic = 'gfx/kitchen.png', + dsc = 'Небольшой зал столовой.', + act = function(s, w) + if w == 4 then + return 'Я вижу, как чьи-то руки берут подносы с грязной посудой и уносят их вглубь...'; + end + if w == 1 then + if not have('food') then + return 'Я присел за свободный столик. Ну — отдохнул, теперь пора за работу!'; + end + return walk('eating'); + end + if w == 2 then + return 'Гудят как пчелы...'; + end + if w == 3 and not have('food') then + return cat([[Я встал в очередь... Взял в руки поднос, столовые приборы и салфетки. Время тянется мучительно долго, но вот, наконец, я заказываю +еду...^^]], walk('povardlg')); + end + end, + used = function(s, w, ww) + if w == 1 and ww == 'food' then + return s:act(1); + end + end, + enter = function(s) + if not have('mywear') and not have('alienwear') then + me()._walked = true; + end + set_music('mus/foot.mod'); + end, + exit = function(s, t) + if have('food') and t ~= 'eating' then + return 'Уйти с подносом в руках? Не могу.', false; + end + if t == 'stolcorridor' then + set_music('mus/ice.s3m'); + end + end, + obj = { 'portrait', vobj(1, 'столики', 'По залу размещены {столы} на 4 или 8 человек.'), + vobj(2, 'люди', 'Столовая полна {людей}.'), + vobj(3, 'очередь', '{Очередь} за раздачей еды движется довольно быстро.'), + vobj(4, 'мойка', 'В углу расположено {окно} для сдачи грязной посуды.'), + }, + way = { 'stolcorridor' }, +}; + +stolcorridor = room { + nam = 'вход в столовую', + pic = 'gfx/kitchencor.png', + dsc = 'Длинный и узкий коридор тускло освещен флоуресцентным светом.', + act = function(s, w) + if w == 1 then + return 'Да, эти люди пришли затем, чтобы поесть...'; + end + end, + obj = {'garderob', vobj(1,'люди', 'По коридору ходят {люди}.')}, + way = {'sside', 'kitchen'}, + exit = function(s, t) + if t == 'sside' and not have('mywear') and not have('alienwear') then + return 'На улице холодно... Я не пойду без одежды.. Нет...', false; + end + end, + enter = function(s) + -- generate garderob + if have('gun') and not gun._hidden then + return 'Я боюсь, что мой дробовик там внутри будет вызывать лишние вопросы...', false; + end + local i + for i=1, 8 do + local o = garderob.obj[i]; + ref(o):disable(); + end + local k = 7; + for i=1, 5 do + if not have('alienwear') or k ~= alienwear._num then + local o = garderob.obj[k]; + ref(o):enable(); + end + k = rnd(8); + end + end +}; + +sside = room { + nam = 'южная сторона', + pic = 'gfx/sside.png', + dsc = [[Я нахожусь у южной стены здания института. ]], + act = function(s, w) + if w == 1 then + ways():add('stolcorridor'); + return "Я подошел к подъезду. На двери подъезда надпись — 'Столовая'. Хм — зайти внутрь?"; + end + if w == 2 then + return 'Те, кто выходят, выглядят более довольными...'; + end + end, + way = {'eside','wside'}, + obj = { vobj(1, "подъезд", "У восточного угла находится небольшой {подъезд}."), + vobj(2, "люди", "Время от времени дверь подъезда хлопает, впуская и выпуская {людей}.")}, + exit = function(s, t) + if t == 'eside' then + return 'Если я пойду туда, я попаду в зону видимости пулеметных вышек.', false + end + end +}; + +nside = room { + nam = 'северная сторона', + pic = 'gfx/nside.png', + dsc = 'Я нахожусь у северной стены здания института.', + way = {'eside','wside' }, + act = function(s, w) + if w == 1 then + return 'Да — водосточная труба... Довольно крепкая. Но вряд ли я смогу взобраться по ней наверх.'; + end + end, + obj = { vobj(1, 'труба', 'Водосточная {труба} проходит по восточному углу здания.')}, +}; + + +wside = room { + nam = 'фронтальная сторона', + pic = 'gfx/wside.png', + dsc = 'Фронтальная часть института.', + way = {'entrance', 'nside','sside' }, + act = function(s, w) + if w == 1 then + return 'Тот самый фургон, с которого все началось...'; + end + if w == 5 then + return 'Она начинается слишком высоко, к тому-же снизу она закрыта на замок. Возможно, это будет кому-то полезно при пожаре, хотя я лично сомневаюсь...' + end + if w == 2 then + return 'Наверняка охранники в КПП узнают меня. Лучше я сначала спасу своего Барсика.'; + end + if w == 3 then + return 'Красиво сделано, нечего сказать... Но я не могу избавиться от мысли, что институт пожирает входящих в него людей.'; + end + if w == 4 then + return 'Уже почти стемнело, но в институт все еще заходят сотрудники...'; + end + end, + obj = { vobj(3, 'вход', 'Главный {вход} представляет собой крутящуюся стеклянную дверь,'), + vobj(4, 'люди', ' впускающую и выпускающую {людей}.'), + vobj(1, 'фургон', 'Перед входом стоит черный {фургон}.'), + vobj(2, 'КПП', 'Дальше, в метрах 60 от меня, во все сгущающейся темноте я едва различаю {КПП}.'), + vobj(5, 'лестница', 'В южной части стены я вижу пожарную {лестницу}, поднимающуюся со второго до пятого этажа.' ), + } +}; + +turn1 = obj { + nam = 'турникеты', + dsc = 'Проход к лифтам с улицы заграждают блестящие стальные {турникеты}. <<Для всех уровней и категорий>> - светится зеленым надпись на турникетах.', + act = function(s, w) + if s._inside then + s._inside = false; + here().way:del('lift'); + return 'Я подхожу к турникетам, подношу карточку и выхожу к двери главного входа.'; + end + if s._unlocked then + s._inside = true; + here().way:add('lift'); + return 'Я подхожу к турникетам, подношу карточку и через пару секунд я у лифтов.'; + end + return 'Я подхожу к одному из аппаратов. Турникеты функционируют автономно. Проход закрыт — на торце горит красная лампочка.'; + end, + used = function(s,w) + if w == 'card' then + s._unlocked = true; + s._inside = true; + here().way:add('lift'); + return 'Я подношу карточку к турникету. Загорается зеленый сигнал. Проход открыт! Я прохожу к лифтам.'; + end + end +}; + +lustra = obj { + nam = 'люстры', + dsc = 'Над головой висят прекрасные сверкающие {люстры}.', + act = 'Не могу на них наглядеться... Наверное, это хрусталь?'; + +}; + +divan = obj { + nam = 'диван', + dsc = 'На противоположной стороне от охранника, в углу стоит {диван}.', + act = function(s) + return 'Черный кожаный, очень мягкий диван.'; + end, +}; + +entrance = room { + nam = 'главный вход', + pic = 'gfx/entrance.png', + dsc = 'Первый этаж института поражает своим великолепием.', + act = function(s, w) + if w == 2 then + return 'Ворота заперты. На них висит замок.'; + end + if w == 3 then + if not turn1._inside then + return 'К лифтам мне мешают пройти турникеты.'; + end + return 'Четыре лифта явно не справляются с количеством сотрудников института.'; + end + if w == 4 then + return 'Стеклянный или хрустальный стол, за которым стоит терминал...'; + end + if w == 5 then + return 'Лучше я не буду лишний раз попадаться ему на глаза. Вряд ли он мне поможет.'; + end + if w == 6 then + return 'Люди.. Я отвык от такого количества людей.'; + end + end, + obj = { + 'lustra', + vobj(2, 'ворота', 'Железные {ворота}, ведущие к путям, занимают всю восточную стену.'), + vobj(3, 'лифты', 'Среднюю часть этажа занимают четыре {лифта}.'), + 'turn1', + vobj(4, 'стол', 'Перед турникетами находится {стол},'), + vobj(5, 'охранник', 'за которым сидит {охранник}.'), + vobj(6, 'люди', 'В институт входят и выходят {люди}, образовывая очереди у лифтов.'), + 'divan', + }, + way = { 'wside' }, + enter = function(s, f) + if have('gun') and f == 'wside' and not gun._hidden then + return 'Мне кажется, там внутри возникнет множество вопросов по-поводу моего дробовика... Я должен его как-то спрятать.', false + end + end, + exit = function(s, t) + if t == 'wside' then + turn1._inside = false; + s.way:del('lift'); + end + end, +}; + +pinlift = obj { + nam = function(s) + if s._num == 3 then + return ''; + end + return 'люди'; + end, + act = function(s) + return 'Подавленные и пустые взгляды... Тягостное молчание.'; + end, + dsc = function(s) + if s._num == 1 then + return 'В лифте полно {людей}.'; + end + if s._num == 2 then + return 'В лифте несколько {человек}.'; + end + if s._num == 3 then + return 'Лифт пуст.' + end + end +}; + +lift = room { + nam = 'лифт', + pic = 'gfx/lift.png', + dsc = 'В лифте должно быть светло и уютно, но меня мучает клаустрофобия. На панели я вижу кнопки:', + enter = function(s, t) + if here() == entrance then + s._from = 1; + pinlift._num = 1; + return 'Я дожидаюсь, когда подойдет один из лифтов и захожу внутрь.'; + end + pinlift._num = rnd(3); + if here() == floor2 then + s._from = 2; + elseif here() == floor3 then + s._from = 3; + elseif here() == floor4 then + s._from = 4; + elseif here() == floor5 then + s._from = 5; + end + return 'Я нажимаю кнопку вызова лифта и жду. Проходит некоторое время и я захожу внутрь.'; + end, + act = function(s, w) + local to,st + if not tonumber(w) then + return + end + if w == s._from then + return cat('Нет!!! Клаустрофобия выгоняет меня из лифта.^^', back()); + end + if w == 8 then + st = ''; + if galstuk._wear then + st = ' К тому же, я в галстуке.'; + end + if me()._brit then + return 'Я смотрю в зеркало и вижу усталое, но гладко-выбритое лицо. Это я.'..st; + end + return 'Я смотрю в зеркало и вижу усталое, заросшее щетиной лицо. Это я.'..st; + end + if w == 6 or w == 7 then + return 'Я нервничаю... Не надо нервов.'; + end + if w == 1 then + to = 'entrance'; + else + to = 'floor'..w; + end + return cat('Я нажимаю кнопку и жду. Меня мучает клаустрофобия, но я жду.. Уххх... Приехали!^^', + walk(to)); + end, + exit = function() + return 'За моей спиной закрываются двери лифта.'; + end, + obj = { + vobj(1,'1', '{1},'), + vobj(2,'2', '{2},'), + vobj(3,'3', '{3},'), + vobj(4,'4', '{4},'), + vobj(5,'5', '{5},'), + vobj(6,'стоп','{стоп}'), + vobj(7,'ход','и {ход}.'), + vobj(8,'зеркало', '{Зеркало} занимает всю заднюю часть.'), + 'pinlift', + }, +}; + +floor2 = room { + nam = 'площадка 2-го этажа', + pic = 'gfx/floor2.png', + dsc = "На площадке второго этажа нет окон. Невысокий потолок и серо-зеленые стены. Тихо и холодно.", + act = function(s, w) + if w == 1 then + return 'Дверь, похоже, сделана из свинца... Я не вижу возможности попасть внутрь. И хорошо. На двери, кроме знака надпись — <<Уровень:2 Категория:Ядерная энергия>>.'; + end + if w == 2 then + return 'Да, на одном из этих лифтов я приехал на этот проклятый этаж...'; + end + end, + obj = { + vobj(1, 'дверь', 'Я вижу массивную {дверь} с знаком <<осторожно - радиация!!!>>'), + vobj(2, 'лифты', 'Кажется, что четыре проема дверей {лифтов} мрачно следят за мной.'), + }, + way = { 'lift' }, +}; + +resh = obj { + nam = 'решетка', + dsc = function(s) + if not s._unscrew then + return 'Отверстие закрыто железной {решеткой}.'; + end + if vent._off then + return 'В отверстии видны лопасти большого вентилятора. На полу валяется {решетка}.'; + end + return 'В отверстии вращаются лопасти большого вентилятора. На полу валяется {решетка}.'; + end, + act = function(s) + if s._unscrew then + return 'Вот что можно сделать обычным тупым ножом при наличии сноровки и терпения!'; + end + if not stoly._moved then + return 'Не достать...'; + end + return 'Решетка крепко привинчена 12 шурупами...'; + end, + used = function(s, w) + if w == 'knife' and not s._unscrew and stoly._moved then + s._unscrew = true; + return 'Я встаю на стол и долго пытаюсь открутить шурупы ножом. Наконец, мне это удается. Решетка падает на пол. Я спускаюсь со стола.'; + end + if w ~= 'stol' then + return 'Не получится...'; + end + end, +}; + +vent = obj { + nam = 'вентиляция', + dsc = 'В центре потолка находится большое квадратное вентиляционное {отверстие}.', + act = function(s) + if not stoly._moved then + return 'До него не достать...'; + end + if not resh._unscrew then + return 'Я встаю на стол и изучаю отверстие. Оно закрыто решеткой... Я разочарованно спускаюсь на пол.'; + end + if not s._off then + return 'Я встаю на стол и смотрю на острые лопасти вентилятора. Боюсь, это слишком опасно...'; + end + if not s._trap then + return 'Я встаю на стол, хватаюсь руками за края отверстия и подтягиваюсь... Темно и сыро. Я пытаюсь забраться внутрь вентиляции, когда вдруг перед моими глазами я вижу красные глазки и зубы жирной крысы... Нет!!! Я падаю обратно на стол и скатываюсь на пол.'; + end +-- here we go! + return walk('toilet'); + end, + + used = function(s, w) + if w == 'stol' then + return + end + if not stoly._moved then + return 'Я не могу добраться до отверстия...'; + end + if not resh._unscrew then + return 'Отверстие закрыто решеткой...'; + end + if not s._off then + return 'Мне мешают лопасти вентилятора...'; + end + if w == 'gun' and not s._trap then + gun._loaded = false; + return 'Я встаю на стол и просовываю руку с дробовиком в отверстие. Оба ствола выстреливают одновременно с глухим звуком. Я прислушиваюсь. В отверстии тихо... Я спускаюсь со стола на пол. Я думаю, это бесполезно...'; + end + if w == 'trap' then + if not trap._salo then + return 'Я устанавливаю капкан на край отверстия. Жду. Но крыса не дура — я забираю капкан обратно. Нужна приманка.'; + end + inv():del('trap'); + vent._trap = true; + return 'Я встаю на стол и устанавливаю капкан-мышеловку на край отверстия... Мне не приходится долго ждать... Лязг железа и визг крысы красноречиво говорят о том, что дело сделано!'; + end + end, + obj = { + 'resh' + } +}; + +stol = obj { + nam = 'стол', + inv = 'Я держу один из столов за угол. Дуб.', + use = function(s, w) + if w == 'vent' or w == 'resh' then + inv():del('stol'); + stoly._moved = true; + return 'Напрягая свои силы, я сдвигаю один из столов в центр комнаты.'; + end + end +}; + +stoly = obj { + nam = 'столы', + dsc = function(s, w) + if not s._moved then + return 'Четыре дубовых {стола} занимают все углы комнаты.'; + end + return 'Три дубовых {стола} стоят в углах комнаты. Один стол передвинут в центр комнаты.'; + end, + act = function(s, w) + if s._moved then + return 'Поставить один стол на другой? Нет — я не смогу...'; + end + inv():add('stol'); + return [[Добротная мебель... Но стол в моей хижине лучше — я сделал его своими руками. Я держу +руками угол стола.]]; + end +}; + +eroom = room { + nam = 'отдел СТО', + pic = function() + if not stoly._moved then + return 'gfx/sto.png'; + end + if not resh._unscrew then + return 'gfx/sto2.png'; + end + return 'gfx/sto3.png'; + + end, + dsc = [[Я нахожусь в небольшой комнате с бежевыми стенами.]], + enter = function(s, f) + if f == 'cor3' then + return [[Открыв дверь, я заглядываю внутрь комнаты. Ухх... Пусто! Можно осмотреться...]]; + end + if f == 'toilet' then + return 'Ну что же... Я поднимаю железную решетку в полу туалета и лезу в темноту... Через несколько минут я уже спрыгиваю из вентиляционного отверстия на стол, и спускаюсь на пол.'; + end + end, + act = function(s, w) + if w == 1 then + return 'Отодвинув жалюзи я смотрю в уже черную даль, но наталкиваюсь на свое тусклое отражение. Опустив глаза вниз я вижу пулеметные вышки и железнодорожные пути.'; + end + if w == 2 then + return 'Это всего лишь терминалы. Клиенты, которые подсоединяются к серверам института. Впрочем, меня это не интересует — я 10 лет не видел компьютеров.'; + end + end, + obj = { + vobj(1, 'окно', 'Большое {окно} выходит на восток.'), + 'stoly', + vobj(2, 'терминалы', 'На каждом столе стоит 17 дюймовый {терминал}.'), + 'vent', + 'portrait', + }, + way = { 'cor3' }, + exit = function() + inv():del('stol'); + end +}; + +key = obj { + nam = 'ключ', + dsc = 'В двери торчит {ключ}.', + tak = 'Я осторожно вытаскиваю ключ и кладу его в карман.', + inv = 'Удивительно, но в институте вместе с электроникой используется такой простой и понятный механизм, как обычный дверной замок!', +}; + +room33 = room { + nam = 'комната', + pic = 'gfx/bholes.png', + dsc = [[Постояв несколько секунд у двери я открываю ее и вхожу внутрь.]], + act = function(s, w) + if w == 1 then + return cat('Седой человек в толстых очках оборачивается и с секунду смотрит на меня. — Кто это? Выйдите немедленно!!^^',back()); + end + end, + obj = { + vobj(1, 'люди', [[Я вижу как группа {людей} в белых халатах расположилась перед доской в центре комнаты и о чем-то ожесточенно спорит.]]), + 'portrait', + 'key' + }; + way = { 'cor3' }, + exit = [[ Я осторожно выхожу из комнаты.]]; +}; +room3x = room { + nam = 'комната', + enter = function(s, f) + if s._num == 2 then + return [[Я приоткрываю дверь и заглядываю внутрь. Квадратная комната с двумя окнами. +Множество людей сидят за терминалами, расставленными вдоль стен. Я поскорее прикрываю дверь.]], false; + end + if s._num == 4 then + return [[Я берусь за холодный металл ручки и осторожно открываю дверь... — Идет моделирование!!! +— слышу я из-за двери. Я быстро отпускаю ручку — дверь закрывается...]],false; + end + if s._num == 5 then + ref(f).way:add('eroom'); + return walk('eroom'), false; + end + if s._num == 6 then + return [[Я начинаю открывать дверь, когда вдруг начинаю слышать странное все нарастающее гудение. — Какой идиот не закрыл дверь? — слышу я изнутри. Я поспешно отхожу от двери.]], false; + end + end, +}; +switch = obj { + nam = 'выключатель', + dsc = function(s) + local t + if vent._off then + t = ' в позиции <<выключено>>.'; + else + t = ' в позиции <<включено>>.'; + end + return 'В углу, перед входной дверью находится {выключатель}'..t; + end, + act = function(s) + if vent._off then + vent._off = false; + return 'Включаю!' + end + if not cor3._locked then + return [[Я перевожу выключатель в позицию <<выключено>> и иду вдоль стен, когда +одна из дверей за мной вдруг открывается и старческий голос звучит на весь коридор — Безобразие!!! Включите обратно!!! — +мне приходится вернуться к выключателю и перевести его в позицию <<включено>>.]]; + end + vent._off = true; + return 'Выключаю!'; + end +}; + +cor3 = room { + nam = 'коридор 3-го этажа', + pic = 'gfx/cor3.png', + enter = function(s, f) + if f == 'floor3' then + return 'Я подношу карточку к считывателю... Красная лампочка сначала моргает, а затем меняет свой цвет на зеленый... Проход открыт!'; + end + end, + dsc = 'Длинный коридор идет до самой стены здания. На потолке тускло горят лампы дневного света. На полу постелена зеленая ковровая дорожка.', + act = function(s, w) + if w == 1 then + return 'Я подхожу к одной из дверей и заглядываю в окошко-иллюминатор... Люди в белых костюмах, словно пчелы, снуют у причудливых аппаратов. — Наверное, это лаборатории — догадываюсь я.'; + end + if not tonumber(w) then + return nil, false + end + if w == 3 then + if s._locked then + return 'Эта комната закрыта... И слыша приглушенные, но настойчивые звуки изнутри, мне не хочется ее открывать.'; + end + return walk('room33'); + end + if tonumber(w) >=2 and tonumber(w) <=6 then + room3x._num = w; + return walk('room3x'); + end + if w == 7 then + return 'Окно выходит на южную сторону... Темно — ничего не видно, кроме снежинок, ударяющихся о стекло...'; + end + if w == 8 then + return 'Зайти?'; + end + end, + used = function(s, w, ww) + if w == 1 or w == 2 or w == 4 or w == 5 or w == 6 then + return 'Не подходит...'; + end + if w == 3 and ww == 'key' then + if s._locked then + return 'Уже закрыто...'; + end + s._locked = true; + return 'Я вставляю ключ в замочную скважину и закрываю замок на два оборота. Вынимаю ключ и кладу обратно в карман.'; + end + end, + obj = { + vobj(1, 'белые двери', 'По правой стороне коридора находятся белые металлические {двери} с стеклянными окошками.'), + vobj(2, 'гравитация', 'По левой стороне коридора я вижу несколько дверных проемов с надписями: {гравитация},'), + vobj(4, 'моделирование','{моделирование},'), + vobj(5, 'эффекты СТО','{эффекты СТО},'), + vobj(3, 'черные дыры', '{черные дыры},'), + vobj(6, 'квазипространство', '{квазипространство}.'), + vobj(7, 'окно', 'В конце коридора виднеется {окно}.'), + vobj(8, 'туалет', 'Возле окна находятся {туалеты}.'), + 'switch', + 'portrait', + }, + way = {'floor3', 'toilet3', 'toiletw'}, +}; + +mylo = obj { + nam = 'мыло', + inv = function(s) + if s._pena then + return 'Кусочек мыла в пене.'; + end + return 'Кусочек мыла.'; + end, + dsc = 'На умывальнике лежит кусочек {мыла}.', + tak = 'Я взял в руки скользкий кусочек мыла... Он выпал в умывальник, но я поймал его снова и сунул в карман...'; +}; + +sushka = obj { + nam = 'сушка', + dsc = 'Рядом с умывальником находится {сушка}.', + act = function(s,w) + return 'Я подношу руки к сушке, сушка включается... Наваждение...'; + end, +}; + +umyvalnik = obj { + nam = 'умывальник', + dsc = 'У входа находится {умывальник}.', + act = function(s) + if me()._mylo then + me()._mylo = false; + return 'Я смываю мыло со своего лица...'; + end + return 'Я пью хлорированную воду жадными глотками... Да — это не та вода из ручья, которую я пью в лесу...'; + end, + used = function(s, w) + if w == 'mylo' then + mylo._pena = true; + return 'Я опускаю мыло в теплую воду...'; + end + end +}; + +toilet3 = room { + nam = 'туалет', + pic = 'gfx/toil3.png', + dsc = 'Я в туалете. Стандартная архитектура. Без окон. Белый кафель.', + act = function(s, w) + if w == 2 then + return 'Все заняты!'; + end + if w == 3 then + return 'Люди равномерно распределены по туалету. Все унитазы заняты. Еще пару человек ждут своей очереди.'; + end + end, + obj = { + 'umyvalnik', + 'mylo', + 'tzerkalo', + 'sushka', + vobj(2, 'унитазы', 'В этом туалете установлено 4 {унитаза}.'), + vobj(3, 'люди', 'В туалете несколько {человек}...'), + }, + way = { 'cor3' }, + exit = function() + if me()._mylo then + return 'В мыле? Нет...', false + end + objs():del('face'); + end +}; +floor3 = room { + nam = 'площадка 3-го этажа', + pic = 'gfx/floor3.png', + dsc = [[На +площадке третьего этажа довольно просторно. Бежевые стены. Высокие потолки.]], + act = function(s, w) + if w == 1 then + return 'С минуту я зачарованно смотрю в окно... Белая пустыня, погруженная в темноту... В эту минуту я понимаю, в какое чужое место я попал...'; + end + if w == 2 then + if not s._unlocked then + return 'Металл обитый кожей. Дверь снабжена считывателем электронных карт. Надпись на двери: <<Уровень:3 Категория: Прикладная физика>>'; + end + return walk('cor3'); + end + if w == 3 then + return 'Крепкие тут двери, не то что в моей хижине... Считыватель карточек возле замка. Надпись на двери: <<Уровень:3 Категория:Нанотехнологии>>'; + end + end, + used = function(s,w,ww) + if ww ~= 'card' then + return 'Это не поможет...'; + end + if w == 2 then + s._unlocked = true; + s.way:add('cor3'); + return walk('cor3'); + end + if w == 3 then + return 'Я подношу карточку к считывателю... Раздается раздражающий писк — доступ не разрешен.'; + end + end, + obj = { + vobj(1, 'окно', 'Широкое {окно} выходит на запад.'), + vobj(2, 'коричневая дверь', 'Справа от окна находится коричневая {дверь}.'), + vobj(3, 'белая дверь', 'Слева — белая {дверь}.'), + }, + way = { 'lift' }, +}; + +britva = obj { + nam = 'бритва', + dsc = 'На умывальнике лежит безопасная {бритва}.', + tak = 'Я незаметно кладу бритву в карман.', + inv = 'Бритва, немного ржавое лезвие...', +}; + +face = obj { + nam = 'лицо', + dsc = 'В зеркале отражается мое {лицо}.', + act = function(s) + local st = ''; + if me()._brit then + st = ' Гладко выбритое.'; + elseif me()._mylo then + st = ' Все в мыле.'; + end + if galstuk._wear then + st = st..' К тому же — в галстуке.'; + end + return 'Это мое лицо, отраженное в зеркале.'..st; + end, + used = function(s, w) + if w == 'mylo' then + if me()._brit then + return 'Я уже брился...'; + end + if not mylo._pena then + return 'Мыло совсем сухое...'; + end + if not have('britva') then + return 'Я намыливаю лицо и смываю грязь... Фуххх....'; + end + me()._mylo = true; + return 'Я намыливаю лицо...'; + end + if w == 'britva' then + if me()._brit then + return 'Я уже брился...'; + end + if not me()._mylo then + return 'Я не намылил лицо...'; + end + me()._brit = true; + me()._mylo = false; + return 'Я бреюсь... Через несколько минут я смываю мыло...'; + end + end +}; + +tzerkalo = obj { + nam = 'зеркало', + dsc = 'Над умывальником установлено {зеркало}.', + act = function(s) + local st = ''; + objs():add('face'); + if galstuk._wear then + st = ' К тому же, в галстуке...'; + end + if me()._brit then + return 'Грустное, но гладко выбритое лицо.'..st; + end + return 'Дикое, заросшее щетиной лицо смотрит из зеркала.'..st; + end, +}; + +toilet = room { + nam = 'туалет', + pic = 'gfx/toil4.png', + dsc = 'Довольно просторный туалет. Белый кафель. Желтые разводы. Сырость и звуки журчащей воды. Деревянная дверь ведет в коридор.', + enter = function(s, f) + if f == 'eroom' then + return 'Я лезу в вентиляционное отверстие. Внутри пыльно и тихо. Я блуждаю по причудливым переплетениям вентиляции — пока, наконец, не вижу над головой свет. Еще мгновение и я выталкиваю железную решетку в полу туалета...'; + end + end, + act = function(s, w) + if w == 2 then + return 'Да... Мне повезло, я чувствую, что туалет мужской...'; + end + if w == 3 then + return 'Странная у них система вентиляции, но благодаря ей я здесь!...'; + end + end, + obj = { + vobj(2, 'унитазы', 'В этом туалете установлено всего 2 {унитаза}.'), + 'umyvalnik', + 'britva', + 'tzerkalo', + 'sushka', + vobj(3, 'решетка', 'На полу находится железная {решетка}.'), + }, + way = { 'eroom', 'cor4'}, + exit = function(s, t) + if me()._mylo then + return 'В мыле? Нет...', false + end + objs():del('face'); + if t ~= 'eroom' then + return 'Я осторожно выхожу из туалета.'; + end + end +}; + +toiletw = room { + nam = 'женский туалет', + enter = function(s, w) + return 'Фууххх... Чуть не ошибся...', false; + end +}; + +function room4x_hear() + local ph = { + [1] = '...Согласно соотношению неопределенностей мы не можем одновременно измерить координату частицы и ее импульс...', + [2] = '...Мгновенная передача возмущения волновой функции не есть передача сигнала, ибо здесь нет физических объектов, движущихся быстрее света...', + [3] = '...Редукция фон Неймана — мгновенное изменение описания квантового состояния (волновой функции) объекта, происходящее при измерении...', + [4] = '...Допустим, две одинаковые частицы A и B образовались в результате распада третьей частицы C. В этом случае, по закону сохранения импульса, их суммарный импульс p_A + p_B должен быть равен исходному импульсу третьей частицы p_C...', + [5] = '...представим себе, что на двух планетах в разных концах Галактики есть две монетки, выпадающие всегда одинаково. Если запротоколировать результаты всех подбрасываний, а потом сравнить их, то они совпадут. Сами же выпадания случайны, на них никак нельзя повлиять. Нельзя, например, договориться, что орёл — это единица, а решка — это ноль, и передавать таким образом двоичный код. Ведь последовательность нулей и единиц будет случайной и на том и на другом <<конце провода>> и не будет нести никакого смысла...'; + [6] = '...Впервые ЭПР-парадокс был сформулирован Альбертом Эйнштейном в 1928 году на 5-ом Сольвеевском конгрессе, в дискуссии с Нильсом Бором. Эйнштейн не признавал вероятностного характера квантовой механики и считал вероятностное описание микромира неполным...', + [7] = '...это интерпретация квантовой механики, которая предполагает существование <<параллельных вселенных>>, в каждой из которых действуют одни и те же законы природы и которым свойственны одни и те же мировые постоянные, но которые находятся в различных состояниях...', + [8] = 'Докторская работа Эверетта как раз и предлагала подобную альтернативу. Эверетт предложил считать, что для составной системы (каковой является частица, взаимодействующая с измерительным прибором) утверждение о том, что какая-либо подсистема находится в определённом состоянии, является бессмысленным. Это привело Эверетта к заключению об относительном характере состояния одной системы по отношению к другой...', + [9] = '...Этот шестимерный объект можно представить в виде суперпозиции двух <<альтернативных историй>> системы S, в одной из которых наблюдался результат измерения <<вверх>>, а в другой — <<вниз>>...', + [10] = '...Например, можно приготовить две частицы, находящиеся в едином квантовом состоянии так, что когда одна частица наблюдается в состоянии со спином, направленным вверх, то спин другой оказывается направленным вниз, и наоборот, и это несмотря на то, что согласно квантовой механике, предсказать, какие фактически каждый раз получатся направления, невозможно...', + }; + return ph[rnd(10)]; +end + +room4x = room { + nam = 'комната', + enter = function(s, f) + if s._num == 1 then + return 'Я осторожно берусь за ручку и пытаюсь открыть дверь. Закрыто...', false; + elseif s._num == 2 then + return 'Я подхожу к двери и прислушиваюсь... — '..room4x_hear()..' — Ухх... Я отхожу от двери..', false; + elseif s._num == 3 then + return 'Я подхожу к двери и прислушиваюсь... — Внутри я слышу, как кто-то ожесточенно спорит... — я отхожу от двери...', false; + elseif s._num == 4 then + return 'Открыв дверь, я захожу внутрь. На меня пристально смотрят 12 пар глаз сидящих за столами. . Еще одна пара глаз принадлежит человеку у доски. — Простите, ошибся — бормочу я и выхожу из комнаты...', false; + elseif s._num == 5 then + return 'Закрыто... ', false; + end + end, +}; + +galstuk = obj { + nam = function(s) + if s._gal then + return 'галстук'; + end + return 'тряпка'; + end, + inv = function(s, w) + if not s._gal then + s._gal = true; + return 'Я рассматриваю тряпку и понимаю, что когда-то это было галстуком.'; + end + if s._hot then + if not s._wear then + s._wear = true; + return 'Я с достоинством надеваю галстук...'; + end + return 'Галстук надет...'; + end + if s._mylo then + return 'Он весь в мыле!'; + end + if not s._water then + return 'Он грязный! Я не надену это!'; + end + if not s._hot then + return 'Он мокрый! Я не надену это!'; + end + end, + used = function(s, w) + if s._wear then + return 'Галстук надет...'; + end + if w == 'mylo' then + if not mylo._pena then + return 'Мыло сухое...'; + end + s._mylo = true; + if not s._gal then + s._gal = true; + return 'Намыливая тряпку, я понимаю, что когда-то это было галстуком.'; + end + return 'Я намылил галстук...'; + end + end, + use = function(s, w) + if s._wear and w ~= 'hand' then + return 'Галстук надет...', false; + end + if w == 'umyvalnik' then + if not s._mylo then + return 'Просто водой? Вряд ли это отмоет мел...'; + end + s._water = true; + s._mylo = false; + return 'Я помыл галстук в теплой воде...'; + end + if w == 'sushka' then + if not s._water then + return 'Зачем мне сушить это?'; + end + s._hot = true; + s._water = false; + return 'Через 5 минут я полностью высушил галстук...'; + end + end +}; + +room46 = room { + nam = 'аудитория 6', + pic = 'gfx/room4.png', + enter = 'Я открываю дверь и вхожу внутрь... Комната пуста...', + dsc = 'Я нахожусь внутри аудитории... Несколько столов стоят в два ряда по направлению к доске.', + act = function(s, w) + if w == 1 then + if not have('galstuk') then + inv():add('galstuk'); + return 'На доске лежит тряпка. Я беру ее в руки.'; + end + return 'Гм... Ничего не понимаю...'; + end + if w == 2 then + return 'Внизу я вижу, как следы прожекторов шарят по снежному полю...'; + end + if w == 3 then + return 'Я сажусь за клавиатуру, но вовремя вспоминаю, что я завязал с прошлым... Я больше не хакер - я лесник.'; + end + end, + obj = { + vobj(3,'терминал', 'На каждом столе стоит {терминал}.'), + vobj(1,'доска', 'На {доске} написаны какие-то формулы...'), + vobj(2,'окно', '{Окно} выходит на восток.'), + 'portrait', + }, + way = { 'cor4' }, +}; + +facectrl = dlg { + nam = 'фэйсконтроль', + pic = 'gfx/guard4.png', + dsc = 'Я вижу перед собой неприятное лицо полного охранника.', + obj = { + [1] = phr('Я пришел послушать лекцию Белина...', + '— Я не знаю кто вы — ухмыляется охранник — но мне велели пускать сюда только приличных людей.', + [[pon(2);]]), + [2] = _phr('У меня есть приглашение!', + '— А мне плевать! Посмотри на себя в зеркало!!! Ты пришел слушать самого Белина — правую руку самого... — охранник почтительно помолчал — Так что пошел вон..', [[pon(3,4)]]), + [3] = _phr('Сейчас я дам тебе по роже!', '— Ну все... Мощные руки выталкивают меня в коридор...', + [[poff(4)]]), + [4] = _phr('Ты, кабан! Я же тебе сказал — у меня есть приглашение!', + '— Чтоооооо? Глаза охранника наливаются кровью... Мощный пинок отправляет меня в коридор...', + [[poff(3)]]), + [5] = _phr('Я хочу послушать лекцию Белина...', + '— Во-первых — доктора Белина, а во-вторых — без галстука нельзя...', + [[pon(2)]]), + [6] = _phr('Я очень хочу послушать лекцию доктора Белина!!!', + 'Охранник смотрит на меня пристальным взглядом и нехотя произносит. — Ваше приглашение...', + [[pon(7)]]), + [7] = _phr('Держи... св... пожалуйста...', 'Ладно... Проходите, не задерживайтесь... Лекция уже началась...', + [[inv():del('invite'); return walk('hall42')]]); + }, + exit = function(s,w) + s:pon(1); + end +}; + +hall42 = room { + nam = 'Зал 2', + pic = 'gfx/hall2.png', + dsc = 'Множество людей. Судя по тишине — лекция уже идет.', + obj = { + vobj(1, 'Белин', 'Перед доской стоит {Белин} — тот самый человек, который забрал моего кота.'), + vobj(2, 'места', 'В третьем ряду с краю я вижу несколько свободных {мест}.'), + vobj(3, 'окно', 'Три широких {окна} выходят на запад.'), + vobj(4, 'лампы', 'Зал освещают флоуресцентные {лампы}.'), + }, + act = function(s, w) + if w == 1 then + return 'Сейчас он без пальто и шляпы и я могу его рассмотреть... Довольно полный, но высокий... Хитрая улыбка, но лицо открытое... Он ведет лекцию — подожду пока она закончится и поговорю с ним...'; + end + if w == 2 then + return walk('lection'); + end + if w == 3 then + return 'За окнами тьма... Только белые снежинки изредка попадают в зону освещения флоуресцентных ламп.'; + end + if w == 4 then + return 'Шесть ламп... Ненавижу этот мерцающий свет...'; + end + end, + exit = function(s, t) + if t == 'cor4' then + return 'Не хочу терять Белина из виду...', false; + end + end, + enter = function(s, f) + if f == 'facectrl' then + return 'Я прохожу в лекционный зал...'; + end + if not galstuk._wear then + facectrl:pon(5); + facectrl:poff(1); + end + if not me()._brit or not galstuk._wear then + return cat( +'Я захожу в зал, когда меня останавливает человек в форме с надписью <<ОХРАНА>>. В его руках помповое ружье.^^', walk('facectrl')), false; + end + facectrl:poff(1, 5); + facectrl:pon(6); + return walk('facectrl'), false; + end, + way = { 'cor4' }, +}; + +hall41 = room { + nam = 'Зал 1', + dsc = [[Я захожу в пустой зал. Похоже — это один из залов для проведения лекций. Множество мест уходят +под небольшим уклоном к потолку.]], + pic = 'gfx/hall1.png', + act = function(s, w) + if w == 1 then + return 'Глядя в ночную темноту, я с тоской вспоминаю Барсика...'; + end + if w == 2 then + return 'Примерно такие были у нас в институте, когда я... Ладно...'; + end + if w == 3 then + return 'Все, что я мог бы вспомнить, я благополучно забыл.'; + end + end, + obj = { + vobj(1, 'окна', 'Три больших {окна} выходят на западную сторону.'), + vobj(2, 'стол', 'Длинный {стол} стоит перед доской.'), + vobj(3, 'доска', 'На {доске} видны следы формул прошлой лекции.'), + 'portrait', + }, + way = { + 'cor4', + }, +}; + +cor4 = room { + nam = 'коридор 4-го этажа', + pic = 'gfx/cor4.png', + dsc = 'Я нахожусь в коридоре. Потолки на этом этаже очень высокие. В конце коридора находятся туалеты. Под ногами — ковровая дорожка зеленого цвета.', + act = function(s, w) + if not tonumber(w) then + return; + end + if w == 11 then + return 'Некоторые из них заходят в зал 2.'; + end + if w == 1 then + return 'Я тоскливо гляжу в ночную тьму... Я понимаю — что очень устал... Но я должен идти...'; + end + if w == 12 then + return 'Эта дверь, как и многие здесь, снабжена считывателем смарт-карт. На нем горит красная лампочка.'; + end + if tonumber(w) >=5 and tonumber(w) <=9 then + room4x._num = w - 4; + return walk('room4x'); + end + if w == 10 then + ways():add('room46'); + return walk('room46'); + end + if w == 2 then + ways():add('hall41'); + return walk('hall41'); + end + if w == 3 then + ways():add('hall42'); + return walk('hall42'); + end + end, + used = function(s, w, ww) + if w == 12 and ww == 'card' then + return 'Я подношу карточку к считывателю... Биип... Доступ не разрешен...'; + end + end, + obj = { + vobj(1, 'окно', '{Окно} выходит на юг.'), + vobj(2, 'зал 1','На западной стороне я вижу два широких дверных проема: {зал 1},'), + vobj(3, 'зал 2', '{зал 2}.'), + vobj(5, 'аудитория 1', 'На восточной стороне расположены двери поменьше. Надписи на дверях: {аудитория 1},'), + vobj(6, 'аудитория 2', '{аудитория 2},'), + vobj(7, 'аудитория 3', '{аудитория 3},'), + vobj(8, 'аудитория 4', '{аудитория 4},'), + vobj(9, 'аудитория 5', '{аудитория 5},'), + vobj(10, 'аудитория 6', '{аудитория 6}.'), + vobj(11, 'люди', 'Время от времени в коридоре появляются {люди}.'), + vobj(12, 'входная дверь', 'Входная {дверь} находится на северном конце коридора.'), + 'portrait', + }, + way = { + 'toilet', + 'toiletw', + } +}; +floor4 = room { + nam = 'площадка 4-го этажа', + pic = 'gfx/floor4.png', + dsc = 'На четвертом этаже высокие потолки.', + act = function(s, w) + if w == 1 then + return 'Тьма... Нет ни одного огонька... Я даже не вижу звезд, тусклый, но тягостный свет ламп дневного освещения мешает их увидеть...'; + end + if w == 2 then + return 'Я ненавижу лифты...'; + end + if w == 3 or w == 4 then + return 'Обычная дверь для этого здания. Электронный замок. Без карточки я не пройду.'; + end + end, + used = function(s, w, ww) + if ww == 'card' then + if w == 3 or w == 4 then + return [[Я подношу карточку к считывателю. Бииип... В доступе отказано...]]; + end + end + end, + obj = { + vobj(1, 'окно','{Широкое} окно смотрит на запад.'), + vobj(2, 'лифты', 'Площадка с четырьмя {лифтами} тускло освещена лампами.'), + vobj(3, 'южная дверь', 'Две двери ведут в северный и южный коридоры. Надпись на южной {двери}: <<уровень:4 категория:теоретическая физика>>'), + vobj(4, 'северная дверь', 'На северной {двери}: <<уровень:4 категория: биология>>'), + }, + way = { 'lift' }, +}; + +floor5 = room { + nam = 'площадка 5-го этажа', + pic = 'gfx/floor5.png', + dsc = [[Потолки на пятом этаже очень высокие.]], + act = function(s, w) + if w == 1 then + return 'Мои ноги утопают в красном бархате... Не наследить бы...'; + end + if w == 2 then + return 'Нет, все-таки это хрусталь...'; + end + if w == 3 then + return 'Я подхожу к окну... Любопытно, я вижу, что окно выходит на довольно широкий участок крыши, который проходит через фронтальную часть здания...'; + end + if w == 4 or w == 5 then + return 'Изучить двери мне мешает охранник... А мой пропуск здесь не подойдет...'; + end + if w == 6 then + return 'Пока он не обращает на меня внимания, но все-равно не стоит нарываться...'; + end + end, + used = function(s, w) + if not tonumber(w) then + return + end + if w == 6 then + return 'Не надо его раздражать...'; + end + if w >=1 and w <=5 then + return 'Я не буду делать это при охраннике.'; + end + end, + obj = { + vobj(1, 'ковер', 'Лифтовую площадку покрывает красный {ковер}.'), + vobj(2, 'люстра', 'Хрустальная {люстра} висит на высоком потолке.'), + vobj(3, 'окно', 'Широкое {окно} выходит на запад.'), + vobj(4, 'информация', 'Я вижу две двери, ведущие в южный и северный коридоры. На южной {двери} написано: <<уровень 5, категория: информация>>.'), + vobj(5, 'красная дверь', 'На северной {двери} нет надписей. Это массивная дверь, обитая красной кожей.'), + + vobj(6, 'охранник', 'Между проходами в коридоры установлен стол, за которым сидит {охранник},'); + }, + way = { 'lift' }, +}; + diff --git a/ep3-en.lua b/ep3-en.lua new file mode 100644 index 0000000..3fd888f --- /dev/null +++ b/ep3-en.lua @@ -0,0 +1,1680 @@ +lection = room { + nam = 'Belin\'s Lecture', + pic = 'gfx/lection.png', + dsc = [[I take my seat... I can hear everything clearly from this place. Let's listen to the famous physicist... + ^^- So, in November 1935 Schrödinger published his paper in which the following experiment was described. So, what's the point of the experiment? - Belin paused for a second and put some strange box on the table. +- I like experiments! - Belin's white smile gave a shiny flash. - +- So, as you can see, this is a box... - Belin tapped its plain surface by his hand. +- This box has a built-in container with the poison gas. Besides, the box contains the radiation counter, the radioactive element and the timer. +The parameters of the experiment are set up so, that the probability of the radioactive element decay during 1 hour - equals to 50%.^^ +- If the decay occurs, the mechanism starts working and the poison gas is released from its container to the inner space of the box. So, gentlemen, I guess it's simple so far, isn't it? - Belin smiles again. +- But the point is that in his experiment Schrödinger puts a cat inside the box - an alive being.^^ + +- According to the quantum theory, if we are observing the nucleus - the state of the nucleus is described as a superposition (mixing) of two states - the state of decayed nucleus and the state of non-decayed nucleus. Therefore, the cat in the box is alive and dead simultaneously. +- Belin raises his voice. +- So we can say that it is just a mind game, but I will show and proove that it's not quite so...^^ + +- So, if the experimenter opens the box - he will observe only one of the two states - <> or <>. Schrödinger thought that this paradox proves the inconsistence of the quantum mechanics theory. But we all know that the quantum mechanics really IS the TRUE picture of our world! +- Belin raises his voice again. +- And so, independently of each other (and this partly proves the truth of the theory) - Hans Moravec in 1987 and Bruno Marchal in 1988 cosidered the situation from the cat's point of view!^^ + +- If Everett's multi-world interpretation is true, every time when the cat experiment takes place - the Universe splits into two universes. In the first universe - the cat is alive, and in the second - dead. The cat stops existing in the worlds where it dies. On the other hand, from the alive cat's point of view - the experiment will be continued and will not lead to the cat's death. This is true because in any branch the cat is capable to observe the experiment only in that world where it stays alive. And if the multi-world interpretation is true, then the cat can only observes that it never dies... +- Belin pauses and looks to the audience...^^ + +- And so what does this mean, gentlemen? I ask you, what does this mean? Let us imagine that the observer of the experiment explodes an atomic bomb near himself. According to the multi-world interpretation, the observer will destroy himself almost in all parallel universes. But despite of this fact, some small set of alternative universes should exist where the observer somehow survives. And we come to the idea... - Belin raised his voice again. - The Idea of Quantum Immortality!!! ^^ + +- The Idea of Quantum Immortality is that the observer stays alive and stays capable to observe the reality, at least in one of all set of universes, even if there are very few of these (happy) universes. Thus, eventually the observer will find out that he can live forever!!! ^^ + +- We all have been working very hard for all this year, guided by the great leadership of... +- at that moment Belin gave a glance to the portraits, +- And I must tell you, gentlemen, that we have enough information in our media center... +- Belin looked at the ceiling, +- Enough information to prove, I say it again, to prove scientifically by theory and by experiment - to prove the validity of the multi-world interpretation...^^ + +- But what does it mean for us? You can't see it, but... - Belin looked at his watch +- But in several minutes the train loaded with uranium arrives to the back gates of the institue... It will be enough uranium to provide everyone of you with a nuclear bomb. Since you will assure soon that the Quantum Immortality is the true reality, anyone of you may become an invincible terrorist!!! The Universe will split to many worlds where YOU - Belin points his finger to the audience, - YOU become its dictator and master!!! - Belin almost screamed...^^ + +The audience could not resist to this speech. Everybody stood up and applauded... Their eyes were burning with some evil fire... O God! This is a kind of delusion! - I thought... My legs didn't obey me. I was sitting at my place and could not move...^^ + +- But let's get back to the point. - Belin said. - Let's continue our experiment. - with these words he took out some alive object from under the table... It was my Barsik... +- Ok, now I'll put this cat to the box and we all will see how she... - I feel red mist blurring my eyes... + ]], + enter = function(s) + -- end of episode 2 + eside = nil; + moika = nil; + eating = nil; + kitchen = nil; + stolcorridor = nil; + entrance = nil; + floor2 = nil; + eroom = nil; + room33 = nil; + room3x = nil; + cor3 = nil; + toilet3 = nil; + floor3 = nil; + toilet = nil; + toiletw = nil; + room4x = nil; + room46 = nil; + hall42 = nil; + hall41 = nil; + floor4 = nil; + floor5 = nil; + povardlg = nil; + kitchendlg = nil; + facectrl = nil; + end, + act = function(s, w) + if w == 1 then + set_music("mus/under.s3m"); + return walk('escape1'); + end + end, + obj = { + vobj(1, 'next', '{Next}.'), + }; +}; + +profdlg = dlg { + nam = '!!!', + pic = 'gfx/me.png', + dsc = 'I grip my strength, stand up and scream as loud as I can...', + obj = { + [1] = phr('It\'s not SHE, it\'s HE!', + 'Belin stops his hand. His sight focuses on me. He recognizes me!! - Security! Unauthorized in the hall!!! Ge.. Get him out of here!!! - he screams.', + [[poff(2);escape1.obj:add('guardian')]]), + [2] = phr('Don\'t touch my cat!', + 'Belin stops and looks me in the eyes. His face expresses a surprise. - Guards!!! Guards!!! Unauthorized in the hall!!!', + [[poff(1);escape1.obj:add('guardian')]]), + }, +}; + +profdlg2 = dlg { + nam = 'Belin', + pic = 'gfx/prof2.png', + dsc = 'Belin came white. He stares at the shotgun with a lost sight.', + obj = { + [1] = phr('I have come for my cat!', + 'I grab Barsik from Belin\'s hand and put him to my bosom.', + [[inv():add('mycat'); lifeon('mycat')]]), + [2] = phr('Tell them to get out!!!', + 'Belin is white faced. He does not seem to understand me...', + [[pon(3)]]), + [3] = _phr('Come on!!! Tell them to get out of here...', + 'I shake him. Belin does not feel anything. He just stares at the black barrels of the shotgun.', + [[pon(3); back();]]); + }, +}; +gdlg1 = dlg { + nam = 'guard', + pic = 'gfx/guard42.png', + dsc = 'I scream at the guard and find my voice unnatural...', + obj = { + [1] = phr('Put your weapon upside down on the table and push it to me..', + 'The guard stares on me with uncertainty..', + [[pon(2)]]), + [2] = _phr('I said the gun on the table!!! — I push the barrels more hard to Belin\'s chest. He is very close to fainting.', + 'The guard carefully puts the shotgun on the table and pushes it to me... I take it quickly. Now I\'ve got two guns in both hands.', + [[pon(3); inv():add('shotgun')]]), + [3] = phr('You didn\'t like my face? Right???', + 'The guard keeps silence. The sweat comes out on his forehead...', + [[pon(3); back();]]), + }; +}; + +shotgun = obj { + nam = 'guard\'s shotgun', + inv = 'A pump-action shotgun... For 6 shells. Interesting, how much shells is left?', + dsc = 'The pump-action {shotgun} lies on the floor.', + tak = function(s) + if s._unloaded then + return 'I don\'t need it. It has no ammo.', false + end + return 'I take my shotgun back.'; + end, +}; + +guardian = obj { + nam = 'guard', + dsc = function(s, w) + if not professor._gun then + return 'I see how the {guard} with a shotgun slowly but surely moves towards me.'; + end + if have('shotgun') then + return 'I see the {guard} with no weapon. He watches me attentively.'; + end + return 'I see the {guard} holding his gun not confidently.'; + end, + act = function(s, w) + if not professor._gun then + return 'He will get me soon...'; + end + return walk('gdlg1'); + end, + used = function(s, w) + if w == 'shotgun' then + return 'No, I can\'t make me do it...'; + end + if w == 'gun' then + if not professor._gun then + return 'My shortened shotgun is not for a distant battle...'; + end + return 'I should point my gun on Belin in my situation. Besides, I will need to reload the gun if I fire...'; + end + end +}; + +professor = obj { + nam = 'Belin', + dsc = function(s, w) + if not s._gun then + return '{Belin} is standing at the board and holding my Barsik in his hand.'; + end + return 'I point both shotgun barrels to the chest of {Belin}.'; + end, + act = function(s) + if not s._gun then + return walk('profdlg'); + end + return walk('profdlg2'); + end, + used = function(s, w) + if w == 'gun' then + if s._gun then + return 'I push the Belin\'s chest with the shotgun even more hard.'; + end + s._gun = true; + objs():add('guardian'); + gun._hidden = false; + return 'I take my shortened shotgun out of my coat, jump over the table and run to Belin.'; + end + end, +}; + +pdlg = dlg { + nam = 'people', + pic = 'gfx/me.png', + dsc = 'I look at the audience and scream...', + obj = { + [1] = phr('It\'s a lie!!! There\'s no scientific proof at all!!!', + '— no reaction...',[[pon(2)]]), + [2] = _phr('The World is unique!!! Everyone of you knows it since childhood!!! Get out of here!! Run from these sectarians!!!', + ' - the silence was the answer...'), + [3] = phr('A herd of stupid sheep!!! You can be deceived so easy???', + '- they keep silence, and I don\'t like their sights...', + [[pon(3); back();]]), + }, +}; + +narod = obj { + nam = 'people', + dsc = function(s) + if not professor._gun then + if seen('guardian') then + return '{People} in the hall are looking at me questionably. They are in hesitation.'; + end + return '{People} in the hall are watching for Belin.'; + end + return '{People} in the hall froze. Their sights are all on me. If I make a mistake - I\'m dead... And the whole world... is dead...'; + end, + act = function(s) + if professor._gun then + return walk('pdlg'); + end + if seen('guardian') then + return 'They haven\'t assaulted me so far... So far so good...'; + end + return 'Fanatics! They all are fanatics...'; + end, + used = function(s, w) + if w == 'gun' or w =='shotgun' then + return 'I think I have not enough shells.'; + end + return 'Alas...'; + end +}; + +win = obj { + nam = 'window', + dsc = function(s) + local st = ''; + if s._broken then + st = ' One window is broken.'; + end + return 'Three wide {windows} look to the west.'..st; + end, + act = 'It\'s dark outside. Nothing to watch but snowflakes bumping the glass.'; + used = function(s, w) + if w ~= 'gun' and w ~= 'shotgun' then + return 'Won\'t help...'; + end + if s._broken then + return 'Broken already...'; + end + if not have('shotgun') then + return 'The guard will shoot me.'; + end + s._broken = true; + ways():add('window'); + return 'I break the nearest window by the shotgun butt...'; + end +}; + +escape1 = room { + nam = 'Hall 2', + dsc = 'I am in the hall. The people here are waiting for the experiment to continue.', + pic = function() + if professor._gun then + return 'gfx/meandgun.png'; + end + return 'gfx/lection2.png'; + end, + obj = { + 'win', + vobj(4, 'lamps', 'The hall is lit by fluorescent {lamps}.'), + 'professor', + 'narod', + vobj(5, 'box', 'The {box} is placed on the table.'), + 'portrait', + }, + act = function(s, w) + if w == 5 then + return 'Damned box...'; + end + if w == 4 then + return 'Six lamps... I hate this blinking light...'; + end + end, + used = function(s, w, ww) + if ww == 'gun' or ww == 'shotgun' then + if not professor._gun then + return 'I\'d better not...'; + end + if w == 4 then + return 'The darkness will help not only me, but them too... And they are in a greater number.'; + end + if w == 5 then + return 'The poison is still there. I don\'t want to hurt my Barsik.'; + end + end + end, + exit = function(s, t) + if t == 'window' and not have('mycat') then + return 'And what about Barsik?', false + end + if t == 'cor4' then + return 'I must do something immediately!', false; + end + end, + way = { 'cor4' }, +}; +lest = obj { + nam = function(s, w) + if s._seen then + return 'ladder'; + else + return 'some thing'; + end + end, + dsc = function(s, w) + if s._seen then + return 'Looking through the snowstorm I hardly can distinguish the fire-escape {ladder}!'; + end + return 'Looking through the snowstorm I see outlines of some {construction}.'; + end, + act = function(s, w) + if not s._seen then + ways():add('ladder'); + s._seen = true; + return 'It is the fire-escape ladder!!!'; + end + return 'Jump or not? This is the question...'; + end, +}; + +window = room { + nam = function(s) + if here() == window then + return 'on the window sill'; + end + return 'to the window'; + end, + pic = 'gfx/fromwin1.png', + enter = "I know I am mad, but I run to the window... I hear the roar of the crowd behind..."; + dsc = 'I stand on the window sill and look inside the night darkness.', + + obj = { + 'lest', + }, + exit = function(s, t) + if t == 'escape1' then + return 'I can\'t get back... There are fanatics there...', false; + end + end, + way = { 'escape1',}, +}; + + +down = room { + nam = 'down'; +}; + +window5 = obj { + nam = 'window', + dsc = function(s, w) + if s._broken then + return 'A broken {window} is to the left of me.'; + end + return 'There is a yellow light coming from a {window} to the left of me.'; + end, + act = function(s) + if not s._broken then + return 'The window is closed...'; + end + return walk('room5'); + end, + used = function(s, w) + if w == 'gun' or w == 'shotgun' then + if s._broken then + return 'Already broken...'; + end + s._broken = true; + return 'I break out the glass with the shotgun butt... Pieces of the broken glass fall into the night...'; + end + end +}; + + +up = room { + _num = 0; + nam = 'up', + enter = function(s, w) + s._num = s._num + 1; + if s._num == 2 then + lifeon('ladder'); + return 'Suddenly the night darkness is cut by a ray of spotlight and the silence is broken by a howl of a siren... It seems I was noticed from down there...', false; + end + if s._num > 4 then + ladder.way:del('up'); + ladder.obj:add('window5'); + end + return 'I am slowly climbing up...', false; + end +}; + +ladder = room { + nam = 'ladder', + pic = 'gfx/ladder.png', + dsc = [[I am on the cold ladder. Sharp icy snowflakes hurt my face.]], + + act = function(s, w) + if w == 1 then + return 'I will get frozen soon if I don\'t start moving...'; + end + end, + obj = { + vobj(1, 'ladder rails', 'I hold iron ladder {rails}.'), + }; + enter = function(s) + inv():del('gun'); + return [[I make a run and jump... My heart collapses for some seconds, but I feel the warmth of Barsik in my bosom and in the next moment my hands catch the black steel... The shotgun falls from my shoulder and flies down...]]; + end, + way = { 'up', 'down' }, + life = function(s) + if rnd(2) == 1 then + return 'I hear rattle of machine guns fire - several bullets hit very close...'; + end + end, + exit = function(s, t) + if t == 'down' then + if s._shoot then + return 'They will kill me... And they will kill Barsik too... And they will destroy the whole world...', false; + end + lifeon('ladder'); + s._shoot = true; + return 'I start to come down when suddenly the night darkness is cut by a ray of a spotlight and the silence is broken by a howl of a siren... It seems I was noticed from down there...', false; + end + if t ~= 'up' then + lifeoff('ladder'); + end + end +}; + +hand = obj { + nam = 'bloody hand', + inv = 'My hand is bleeding... I think I will lose my conscience...', + life = 'Blood drops are falling on the floor from my hand...', + used = function(s, w) + if w == 'galstuk' then + inv():del('galstuk'); + inv():del('hand'); + lifeoff('hand'); + return 'I bandage my hand with the tie... It\'s ok so far...'; + end + end +}; + +computers = obj { + nam = 'computers', + dsc = 'The most space is occupied by the tall racks with computer {hardware}. Quiet hum of fans. The network indicators blink nervously.'; + act = function(s) + if kover._fire then + return 'So... Burn, evil machines!!! Burn!!! It\'s time to get out of here.'; + end + return 'This hardware stores evil... I need to destroy it all, but how? I know from the past that the most reliable way to destroy information on magnetic storage - is to bring it through the Curie point. In other words - I should BURN all these damned things!!! But where can I get the fire?'; + end, + used = function(s, w) + if w == 'shotgun' then + return 'Shoot the servers? Not reliable... I must burn this evil...'; + end + end +}; + +poroh = obj { + nam = 'gun powder', + inv = 'This gun powder should help me.', +}; + +trut = obj { + nam = 'tinder', + inv = 'A piece of paper with gun powder. I think I\'ve got a tinder!!!', + use = function(s, w) + if w == 'ibp' and ibp._knife and not ibp._trut then + ibp._trut = true; + inv():del('trut'); + return 'I put the tinder on the UPS.'; + end + end +}; + +fire = obj { + nam = 'fire', + inv = 'The paper burns fast... I must do something right now!!!', + + use = function(s, w) + if w == 'poroh' then + return 'It will explode in my hand.'; + end + if w == 'news' then + return 'I tear another piece from the newspaper. The flame starts burning it.'; + end + inv():del('fire'); + if w ~= 'kover' then + return 'The paper burns out and disappears...'; + end + if kover._fire then + return 'I throw the paper on the burning carpet...'; + end + kover._fire = true; + return 'I put the paper on the carpet... The nap of the carpet starts burning... I guess the fire is starting...'; + end +}; + +ibp = obj { + nam = 'UPS', + dsc = 'One disassembled {UPS} lies on the floor.', + inv = function(s) + if not s._knife then + return 'This is uninterruptible power supply unit. What should I do with it?'; + end + local st = ''; + if s._trut then + st = ' There\'s the paper with gunpowder on the battery.'; + end + return 'Disassembled UPS. I see contacts leading to the battery...'..st; + end, + act = function(s) + if not have('ibp') then + if not have('fire') and not kover._fire then + take('ibp'); + return 'I take UPS again.'; + end + return 'I don\'t need it anymore.'; + end + return s:inv(); + end, + used = function(s, w) + if not have('ibp') then + return 'It will not do...'; + end + if w == 'knife' then + s._knife = true; + return 'I unscrew the screws and disassemble UPS. Now I see the contacts leading to the battery...'; + end + if w == 'provodki' and s._knife then + if not provodki._knife then + return 'The wires are not bare.'; + end + if not s._trut then + return 'I connect the wires to the contacts and make a short circuit. The spark comes out. I need a tinder...'; + end + drop('ibp'); + ibp._trut = false; + inv():add('fire'); + return 'I connect the wires to the contacts and make a short circuit. The spark comes out. The tinder begins to burn! I\'ve got a fire!!!'; + end + if w == 'provod' then + return 'I inserted the wire to the UPS and took it back... Hmm...'; + end + end, +}; + +provodki = obj { + nam = 'thin wires', + inv = function(s) + if s._knife then + return 'A pair of thin wires with bared edges.' + end + return 'A pair of thin wires.' + end, + used = function(s, w) + if w == 'knife' and not s._knife then + s._knife = true; + return 'I cut the insulation of wire edges and releasing the bare wires.'; + else + return 'It won\'t work...'; + end + end +}; + +provod = obj { + nam = 'wire from UPS', + inv = 'This is the wire from UPS.', + used = function(s, w) + if w == 'knife' then + if not knife._oster then + return 'The knife blade is too blunt...'; + end + inv():del('provod'); + inv():add('provodki'); + return 'I cut the main insulation and take out two wires.' + end + end +}; + +ups = obj { + nam = 'ups', + dsc = '{Uninterruptible power supply units} are placed near every rack.', + act = function(s) + if have('hand') then + return 'My hand is wounded. Bleeding much. I can\'t take an UPS.'; + end + if not have('ibp') and not seen('ibp') then + inv():add('ibp'); + inv():add('provod'); + return 'After some work I disconnect one of the UPSes and take it...'; + end + return 'I have one already.'; + end, +}; + +kover = obj { + nam = 'carpet', + dsc = function(s) + if s._fire then + return 'The {carpet} on the floor is burning more and more.'; + end + return 'The floor is covered with the red {carpet}.'; + end, + act = 'Useless luxury.', +}; + +room5 = room { + nam = 'information center'; + pic = 'gfx/servers.png', + dsc = [[I am in the big room which occupies all of the south part of the institute.]], + enter = function(s, f) + if f == 'ladder' then + set_music('mus/hybrid.xm'); + lifeon('hand'); + inv():add('hand'); + return 'I jump and catch the window frame. My right hand is in blood. Despite of the pain I jump to the room floor...'; + end + end, + exit = function(s, f) + set_music("mus/under.s3m"); + end, + act = function(s, w) + if w == 1 then + return 'I will not go back... It is cold and too much shooting outside...'; + end + end, + + obj = { 'computers', 'ups', + vobj(1, 'window', 'Cold winter wind blows through the broken {window}.'), + 'kover', + 'dout', + 'portrait', + }, +}; + +dout = obj { + nam = 'door', + dsc = function(s) + return 'Far ahead I can see the exit {door}.'; + end, + act = function(s) + if not kover._fire then + return 'This is the information processing center. I must destroy it to save the world from this infection which resides inside its storages...'; + end + return 'I run to the door. It leads to elevators. But it has electronic lock!!! This means I need a card with appropriate access level to open the door. Will I burn in fire?'; + end, + used = function(s, w) + if not kover._fire then + return s:act(); + end + if w == 'card' then + return 'I bring the card to the door. Beep. Access denied! I\'ll die here!!!'; + end + if w == 'shotgun' then + return walk('escape2'); + end + return 'Won\'t help...'; + end +}; + +handgdlg = dlg { + nam = 'guard', + pic = 'gfx/handhoh.png', + dsc = 'The guard - a young guy of age 30 - looks at me. He is confused.', + + obj = { + [1] = phr('Give me your weapon!', + '- I have no weapon... - the guard shakes his head... I don\'t know if I can trust him, but I don\'t want to search him...'), + + [2] = phr('I need the key for the red door.', + 'The guard goes white. - No one has the key for THIS door. - he says. - What a nonsense... - I think.'), + + [3] = phr('Okay! Just stand still and do not move.', 'The guard watches me silently.', + [[pon(3);back();]]), + }, +}; + +win5 = obj { + nam = 'window', + dsc = function (s) + if s._broken then + return 'The winter wind is howling through the broken {window}. Snowflakes whirl on the floor.'; + end + return 'The wide {window} looks to the west.'; + end, + act = function(s) + if not s._broken then + return 'I come to the window... Interesting. I see that the window looks at quite wide area of the roof, which streches through the front part of the building...'; + end + return 'The window is broken... The third one for today.'; + end, + used = function(s, w) + if s._broken then + return s:act(); + end + if w == 'shotgun' then + s._broken = true; + ways():add('krysha'); + return 'Oohh.... The third window for today... I swing with all my strength and pieces of the broken glass fly to the roof...'; + end + end, +}; + +escape2 = room { + _timer = 0, + nam = '5th floor site', + pic = 'gfx/floor5e.png', + dsc = [[The ceilings are very high on the fifth floor.]], + enter = function(s, f) + if f == 'room5' then + lifeon('escape2'); + return 'With no strength left I hit the hated door with the shotgun butt. But suddenly, in a second I hear someone comes to the door from outside... It is a guard!!! The card reader beeps and the door opens. The guard steps back - his chest is pushed by the pump-action gun of mine. We exit to the elevators site.'; + end + if f == 'krysha' then + lifeon('escape2'); + end + end, + life = function(s) + s._timer = s._timer + 1; + if s._timer == 3 then + return 'Suddenly a siren sound rang out. - Attention!!! Zero access level individual on the fifth floor! I repeat... - the voice flows from the radio.'; + end + if s._timer > 3 then + return '— Zero access level individual on the fifth floor!!! - I\'m getting sick of the siren howling.'; + end + end, + act = function(s, w) + if w == 1 then + return 'My legs are drowning in the red velvet... Damned luxury!'; + + end + if w == 2 then + return 'Still, it is made of crystal...'; + end + if w == 4 then + return 'The fire is going on...'; + end + if w == 5 then + return 'I don\'t think my pass works here.'; + end + if w == 6 then + return walk('handgdlg'); + end + end, + used = function(s, w, ww) + if w == 6 then + return 'I keep targeting the guard.'; + end + if w == 5 then + return 'Won\'t help.'; + end + end, + obj = { + vobj(1, 'carpet', 'The elevator site is covered with a red {carpet}.'), + vobj(2, 'chandelier', 'A crystal {chandelier} hangs on the high ceiling.'), + 'win5', + vobj(4, 'information', 'The {door} to the information processing center is wide opened. The smoke starts to come out from there.'); + vobj(5, 'red door', 'The opposite {door} has no label. This is a massive door upholstered with red leather.'), + vobj(6, 'guard', 'The {guard} stands in the center of the site with hands up.'); + }, + way = { 'lift','room5' }, + exit = function(s, t) + if t == 'room5' then + return 'There\'s the flame!', false + end + if t == 'lift' then + return 'I notice that all elevator indicators are on. I\'m quite sure that this means the guard troops are coming up here... I should hurry!', false; + end + if t == 'krysha' then + lifeoff('escape2'); + end + end +}; + +swin = obj { + nam = 'south window', + dsc = 'Smoke is coming out from the south {window}.', + act = 'Yes, it is one of the windows of the information center. I look at the window and see the flame.', +}; + +nwin = obj { + nam = 'north window', + dsc = function(s) + local st = ''; + if s._broken then + st = ' The window is broken.'; + end + return 'The north {window} shines to the darkness with yellow light.'..st; + end, + act = function(s) + if s._broken then + return walk('hall5'); + end + return 'Hmm... I look at the window and see a nice hall.'; + end, + used = function(s, w) + if w == 'shotgun' then + s._broken = true; + ways():add('hall5'); + return 'Oohh... I hope it\'s the last one??? I swing with my shotgun and break the glass.'; + end + end, +}; + +hall5 = room { + nam = 'hall', + pic = 'gfx/hall5.png', + enter = function(s, f) + if f == 'krysha' then + return 'I jump to the hall and look around...'; + end + end, + act = function(s, w) + if w == 1 then + return 'Useless luxury.'; + end + if w == 2 then + return 'I run my hand across the surface of one of the columns... Marble!'; + end + if w == 3 then + return 'I guess this chandelier made of mountain crystal.'; + end + if w == 4 then + return 'Dark... But... What is it? It seems that some train arrived to the back side of the institute.'; + end + if w == 5 then + return 'Snowflakes wirl through the broken window.'; + end + if w == 6 then + if s.way:srch('escape3') then + return walk('escape3'); + end + return walk('gudlg'); + end + if w == 7 then + return 'This door is closed. I don\'t think I can open it with my key.'; + end + if w == 8 then + return 'Hmmm... Picasso?'; + end + if w == 9 then + return 'Terrible weakness posesses all me... No! I must not sleep...'; + end + end, + used = function(s, w, ww) + return 'What for?'; + end, + dsc = 'The huge and magnificent hall occupies almost all north part of the building!', + obj = { + vobj(1,'carpet', 'My feet feel the depth of the red velvet {carpet}.'), + vobj(2,'columns', 'Eight marble {columns} form a corridor.'), + vobj(3,'chandelier', 'The great {chandelier} hangs from the ceiling.'), + vobj(4,'east windows', 'Four {windows} look to the east.'), + vobj(5,'west windows', 'A broken {window} is to the left of me.'), + vobj(6,'small door', 'At the north end of the hall I see a small wooden {door}.'), + vobj(7,'entry door', 'There is the entry {door} behind me.'), + vobj(8,'paintings', 'Nice framed {paintings} hang on the walls.'), + vobj(9,'sofas', 'Soft {sofas} are placed along the perimeter.'), + }, + way = { 'krysha' }, +}; + +krysha = room { + nam = 'roof', + pic = 'gfx/krysha.png', + enter = function(s, f) + return 'I quickly approach the broken window and a moment later I am on the roof...'; + end, + dsc = 'It seems that the fifth floor was built after the rest four. Walking on the roof I can reach the first windows of the south and north building parts.', + obj = {'nwin', 'swin'}, + way = {'escape2'}, +}; + +gudlg2 = dlg { + nam = 'portrait man', + pic = 'gfx/pmanb.png', + dsc = 'I watch his drooping face. It is calm as already.', + obj = { + [1] = phr('You got it, freak?', + 'The answer is a hardly heard groan.', + [[pon(1); back();]]), + [2] = phr('But why? Why all this?', + 'He raised his head and looked at me. - I just did my job...', + [[pon(3);poff(1);]]), + [3] = _phr('What a bullshit?', + '- And then I became of no use... So - I thought... - The world will pay for this mistake...', + [[pon(4)]]), + [4] = _phr('What\'re you saying?', + '- I worked as a professor... But I was of no use.. I... I could not stand this...', + [[pon(5)]]), + [5] = _phr('What a scoundrel...', + '— But I will make them... Make them... I, I, I - I will live forever... Myself... Alone.', + [[pon(6)]]), + [6] = _phr('I think you got crazy...', + 'His body shakes in the corner like in chill.', + [[pon(1); back()]]), + } +}; + +gudlg = dlg { + nam = 'portrait man', + pic = 'gfx/pman.png', + enter = function(s) + lifeoff('mycat'); + inv():del('shotgun'); + return [[Strange... The door is not closed... I carefully open the door and enter the room. +^^Suddenly I find that a revolver barrel looks me in the face. - Bravo, bravo! Well done - says a man in an armchair - the owner of the revolver. - I was waiting for you for too long. You are that forester? Well, let's wait for guards. And now - throw your shotgun on the floor. - I cannot do anything, but obey him.]]; + end, + dsc = [[I see that face - the face from the portraits which hang almost in all rooms of this building. The face is calm and expressing nothing. A slight smile. I need to extend the time... And I ask him:]], + + obj = { + [1] = phr('Have a talk?', + 'Hmm... So what can we have a talk about? What a talk may be there between me and a... a forester?', + [[pon(2)]]), + [2] = _phr('For example, is the Everett interpretation really true?', + '- Hah hah hah!!! - the man from the portrait laughs unexpressively, - It is not, of course... This is a tale for idiots to make them believe in their own immortality... And maybe...', + [[pon(3)]] ), + [3] = _phr('...So, there is no scientific proof at all?', + 'The man stops laughing - ...And maybe... Maybe still it is true? - says the man mysteriously. - So what is true? What do YOU think?', + [[pon(4)]]), + [4] = _phr('I know it\'s a lie!', + 'Do you really know? - the empty eyes look at me - Yes or now? - Suddenly the panic knocks me down.' + ,[[pon(5,9)]]), + [5] = _phr('IT\'S A LIE!', + 'And what if? Imagine, what if?... You\'re a hacker, right? You like to predict and to think ahead...', +[[pon(6);poff(9)]]), + + [6] = _phr('No! This cannot be the truth! If it is the truth - then the world is doomed! Sooner or later! Then...', + '— Yes, you understand correct... Then there is only YOU!!! Listen to yourself. Who gave you this answer? Don\'t you crave it? Doesn\'t your YOU crave it? - I am falling in his abysmal sight.', + [[pon(7)]]), + [7] = _phr('If... If... Then why?', + '— Right... Right... — says the portrait man suavely... A new wave of fear knocks me down, I fall down on the knees... The heart beats madly and tries to jump out from the chest...', + + [[pon(8)]]), + [8] = _phr('I can\'t... No...', + '- And if it is all true, then you have nothing to be afraid of. - he purrs. My heart beats faster. And at last, my chest blows and the soft ball of fur repels by his paws and flies just in the face of the portrait man. A shot rings out. Sharp pain in the left shoulder sobers me and I jump on my feet and rush forward...', + [[return walk('escape3')]]), + [9] = _phr('Let\'s assume it is true.', + '— Well... Right... Think, think... You\'re a hacker, right? — whispers the portrait man to me.', + [[pon(6);poff(5)]]) + }, +}; + +--shkf = obj { +-- nam = 'край шкафа', +-- inv = 'Я держу в руках край шкафа.', +--}; + +shkaf = obj { + nam = 'bookcase', + inv = 'I hold the corner of the bookcase with my hands.', + dsc = function(s) + if s._fall then + return 'The door is blocked by the {bookcase}.'; + end + return 'One {bookcase} stands beside the door.'; + end, + act = function(s) + if not escape3._guards or s._fall then + return 'Some books on philosophy... And physics.'; + end + inv():add('shkaf'); + return 'I gripped the bookcase corner tightly.'; + end, +}; + +fromw5 = room { + nam = 'on window sill', + dsc = 'I stand on the window sill. Icy wind blocks my breathing.', + pic = 'gfx/fromwin2.png', + enter = 'Well, I hope it\'s the last time...', + act = function(s, w) + if w == 1 then + return walk('nwall'); + end + end, + obj = { + vobj(1, 'drainpipe', 'I hardly can distinguish a {drainpipe} to the right of me.'), + }, + way = { 'escape3' }, + exit = function(s, t) + if t == 'escape3' then + return 'I must hurry up!', false; + end + end +}; + +winr5 = obj { + nam = 'window', + dsc = function(s) + if s._broken then + return 'Winter wind breathes through the broken {window}.'; + else + return 'A {window} looks to the north side.'; + end + end, + act = function(s, w) + if escape3._guards then + if not shkaf._fall then + return 'No time to enjoy landscapes... I need to delay the guards.'; + end + if not have('mycat') then + return 'Without Barsik? It\'s better to die together!'; + end +-- if not have('revol') then +-- return 'Лучше поднять с пола пистолет, на всякий случай.'; +-- end + if s._broken then + ways():add('fromw5'); + return walk('fromw5'); + else + return 'The window is closed.'; + end + end + escape3._guards = true; + lifeon('escape3'); + return 'There is a pure darkness outside the window. I look in the dark, but then I hear the muted noise of someone\'s steps behind... The noise is coming from the hall. I guess the guards are already here! I must do something!'; + end, + used = function(s, w) + if escape3._guards and not shkaf._fall then + return 'No time... The guards will break in here soon...'; + end + if w == 'shotgun' then + if not s._broken then + s._broken = true; + return 'Again? Well... I swing my shotgun and break the glass. The pieces fly to the dark.'; + end + return 'This window is already broken.'; + end + end, +}; + +revol = obj { + nam = 'revolver', + dsc = 'The {revolver} lies on the floor.', + inv = 'Six bullets.', + tak = 'I take the revolver from the floor.', +}; + +escape3 = room { + nam = 'in the room', + pic = 'gfx/manroom.png', + enter = function(s, f) + if f == 'gudlg' then + inv():del('mycat'); + hall5.way:add('escape3'); + return 'I hear the noise of a falling gun... Then I hit someone\'s face with all my power. Again and again. Barsik runs around back and forth and anxiously meows.'; + end + end, + act = function(s, w) + if w == 1 then + return walk('gudlg2'); + end + if w == 2 then + return 'Abstract art is not to my taste.'; + end + if w == 3 then + local st = ''; + if shkaf._fall then + st = ' It is blocked by the bookcase.'; + end + return 'The door to the hall.'..st; + end + end, + used = function(s, w, ww) + if w == 1 and ww == 'shotgun' or ww == 'revol' then + return 'Yes - this is evil. But I can\'t shoot a helpless human.'; + end + if w == 3 and ww == 'shkaf' then + shkaf._fall = true; + inv():del('shkaf'); + return 'I push the bookcase and it falls down blocking the door.'; + end + end, + dsc = [[I am in a small, but cozy room. A table is placed to the center. A fallen armchair lies near. A small chandelier brings some soft light. Two small bookcases stand along the walls.]], + obj = { + vobj(1, 'man', 'The {man} from the portraits sits on the floor leaning against the table. A trickle of blood comes down from his lips. He groans.'), + vobj(2, 'paintings', 'The walls carry some {paintings}.'), + vobj(3, 'door', 'The {door} is behind me.'), + 'revol', + 'shkaf', + 'shotgun', + 'mycat', + 'winr5', + }, + life = function(s) + if rnd(3) == 1 then + return 'I hear shots... Bullets break through the door... I must do something...'; + end + end, + exit = function(s,t) + if t == 'hall5' then + if shkaf._fall then + return 'The passage is blocked by the bookcase.', false; + end + if s._guards then + return 'I\'ll be shot there...', false; + end + s._guards = true; + lifeon('escape3'); + return 'I\'m going to go to the hall when suddenly the door on the opposite side opens and the guards run in. I quickly shut the door.', false; + end + lifeoff('escape3'); + end, + way = { + 'hall5' + }, +}; + +nwall = room { + nam = 'north side', + dsc = 'I am at the north wall of the institute building.', + pic = 'gfx/nside.png', + way = {'eside2','wside' }, + act = function(s, w) + if w == 1 then + return 'Yes - a drainpipe... Strong enough. But I doubt I can climb it up.'; + end + end, + enter = function(s, f) + if f == 'fromw5' then + return 'Overcoming the pain in the left shoulder I jump of the sill and catch the drainpipe... My heart beats madly in my chest while Barsik and I fall into the winter darkness. But in the next moment I slide the drainpipe hurting my palms...'; + end + end, + obj = { vobj(1, 'drainpipe', + 'The {drainpipe} stretches along the east corner of the building.')}, + exit = function(s, t) + if t == 'wside' then + if not s._guards then + s._guards = true; + return 'I look around the corner and see the crowd of guards running out of the checkpoint and moving towards me. - There he is! - I hear them screaming... The rattle of shots makes me to step backward.', + false; + end + return 'They will get me there...', false; + end + end +}; + +eside2 = room { + nam = 'behind the institute', + pic = 'gfx/esidee.png', + dsc = [[ I am at the back wall of the institute building. There's the railway here.]], + act = function(s,w) + if w == 1 then + return 'The machine guns are turned to the south side of the institute perimeter. It\'s better to stay far from them.'; + end + if w == 2 then + return 'Hmm... It seems it is that train I\'ve heard about... The unloading haven\'t begun yet. But the gates are already opened.'; + end + if w == 3 then + return 'Four railroad vehicles. The type of locomotive - ChME3. The whole train fits to the institute area.'; + end + end, + obj = { + vobj(1,'gun towers', 'The railway entrance is guarded by the gun {towers}.'), + vobj(3,'train', 'I distinguish a black outline of some {train}.'), + vobj(2,'gates', 'The big iron {gates} in the institute wall are opened. I see the light pouring out from the doorway.'), + }, + exit = function(s, t) + if t == 'sside' then + return 'The machine guns on the south side make me nervous. Too risky.', + false + end + if t == 'nwall' and nwall._guards then + return 'No way back...', false; + end + end, + way = {'nwall','train','sside'}, +}; +function checkloc() + if p1._off or p2._off then -- battary or switch off off + p3._off = true; + p4._off = true; + p5._off = true; +-- p51._off = true; +-- p6._off = true; + end + if p3._off or p4._off then +-- p7._off = true; +-- p71._off = true; + end + if p5._off then + p7._off = true; + end + if p51._off then + p71._off = true; + end + if p6._off then +-- p7._off = true; +-- p71._off = true; + end + if p7._off then +-- p71._off = true; + end +end + +p1 = obj { + _off = false, + nam = 'disconnector', + dsc = function(s) + local st = 'on.'; + if s._off then + st = 'off.'; + end + return 'The VB battery {disconnector} is: ' .. st; + end, + act = function(s) + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Switching...'; + end +}; + +p2 = obj { + _off = true; + nam = 'key', + dsc = function(s) + local st = 'turned down.'; + if s._off then + st = 'turned up.'; + end + return 'The button switches {key} is: '..st; + end, + act = function(s) + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'I turn the key.'; + end +}; +p3 = obj { + _off = true, + nam = 'electro-manometer', + dsc = function(s) + local st = 'on.'; + if s._off then + st = 'off.'; + end + return '{Electro-manometer}: '..st; + end, + act = function(s) + if p1._off or p2._off then + return 'Strange... Not working.' + end + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Switching...' + end +}; + +p4 = obj { + _off = false, + nam = 'electro-thermometer', + dsc = function(s) + local st = 'on.'; + if s._off then + st = 'off.'; + end + return '{Electro-thermometer}: '..st; + end, + act = function(s) + if p1._off or p2._off then + return 'Strange... Not working.' + end + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Switching...' + end +}; + +p5 = obj { + _off = true, + nam = '2nd section pump', + dsc = function(s) + local st = 'on.'; + if s._off then + st = 'off.'; + end + return 'The 2nd section fuel {pump}: '..st; + end, + act = function(s) + if p1._off or p2._off then + return 'Strange... Not working.' + end + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Switching...' + end +}; + +p6 = obj { + _off = true, + nam = 'control', + dsc = function(s) + local st = 'on.'; + if s._off then + st = 'off.'; + end + return 'The {control}: '..st; + end, + act = function(s) + if p1._off or p2._off then + return 'Strange... Not working.' + end + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Switching...' + end +}; + +p7 = obj { + _off = true, + nam = '2nd section diesel engine start', + dsc = function(s) + local st = 'on.'; + if s._off then + st = 'off.'; + end + return 'The 2nd section diesel engine {start}: '..st; + end, + act = function(s) + if p3._off or p4._off or p5._off or p6._off then + return 'Strange... Not working.' + end + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Switching...' + end +}; + +p51 = obj { + _off = true, + nam = '1st section pump', + dsc = function(s) + local st = 'on.'; + if s._off then + st = 'off.'; + end + return 'The 1st section fuel {pump}: '..st; + end, + act = function(s) + if p1._off or p2._off then + return 'Strange... Not working.' + end + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Switching...' + end +}; + +p71 = obj { + _off = true, + nam = '1st section diesel start', + dsc = function(s) + local st = 'on.'; + if s._off then + st = 'off.'; + end + return 'The 1st section diesel engine {start}: '..st; + end, + act = function(s) + if p3._off or p4._off or p5._off or p6._off or p7._off then + return 'Strange... Not working.' + end + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Switching...' + end +}; + +p8 = obj { + _num = 1, + nam = 'reverser', + dsc = function(s) + local st; + if s._num == 1 then + st = 'neutral.'; + elseif s._num == 2 then + st = 'backword.'; + elseif s._num == 3 then + st = 'forward.'; + end + return 'The {reverser} handle: ' .. st; + end, + act = function(s) + s._num = s._num + 1; + if s._num == 4 then + s._num = 1; + end + return 'Switching...' + end +}; + +p9 = obj { + _num = 1, + nam = 'controller', + dsc = function(s) + local st; + if s._num == 1 then + st = '0.'; + elseif s._num == 2 then + st = '1.'; + elseif s._num == 3 then + st = '2.'; + end + return 'The {controller} handle: '..st; + end, + act = function(s) + s._num = s._num + 1; + if s._num == 4 then + s._num = 1; + end + if s._num == 1 then + return 'Switching...' + end + if not p71._off and not p7._off then + if p8._num == 2 then + s._num = 1; + return 'The locomotive trembles and starts moving backwards. I switch the controller to 0.'; + elseif p8._num == 3 then + lifeoff('mycat'); + set_music('mus/liberty.s3m'); + return walk('theend'); + end + end + s._num = 1; + return 'Nothing happens... I switch the controller to 0.'; + end +}; + +train = room { + nam = function(s) + if here() == train then + return 'in the locomotive'; + end + return 'to the train'; + end, + pic = 'gfx/cab.png', + dsc = 'So, I am in the locomotive. The thick iron reliably saves me from bullets. The engineer cabin seems to be abandoned. I see lots of devices and controls.', + act = function(s, w) + if w == 2 then + if p1._off or p2._off then + return 'I pressed the horn button, but I heard nothing.'; + end + return 'I hear a dull whistle. I am a railroad engineer!'; + end + if w == 1 then + return 'I really need to start this thing... And no gates will stop me.'; + end + end, + life = function(s) + local st = ''; + if not p7._off or not p71._off then + st = 'I feel how the locomotive trembles. The diesel engine is working. '; + end + if rnd(10) < 5 then + st = st..'I hear bullets hitting the metal.'; + end + return st; + end, + exit = function(s,t) + if t == 'eside2' then + return 'No... It\'s better to stay here! We will resist to the last.', + false; + end + lifeoff('train'); + end, + enter = function(s, f) + if f == 'eside2' and not guards1._broken then + return cat('Hunched over I run to the train.^^', + walk('vorota')), false; + end + lifeon('train'); + set_music('mus/hispeed.s3m'); + return 'Hunched over I run to the train... Running past the vehicles I manage to notice the signs <>. A little bit more running and I get to the locomotive. I hear the shot sounds behind. The machine guns on the towers are turning to my direction. I open the heavy door and... I am inside!' + + end, + obj = { + 'p2', 'p1', 'p4', 'p3', 'p71','p51', 'p7', 'p5', 'p9', 'p8', 'p6', + vobj(2, 'horn', 'The locomotive {horn}.'); + vobj(1, 'window', 'I see the closed gates through the {windows}.'), + }, + way = { 'eside2' }, +}; + +guards1 = obj { + nam = 'guards', + dsc = function(s, w) + if s._broken then + return 'The {guards} at the tourniquets are trying to get out from under the fallen chandelier.'; + end + if s._shoot then + return 'I see the {guards} hiding from my fire behind the tourniquets.'; + end + return 'I see the {guards} with machine guns moving towards me through the first floor hall.'; + end, + act = function(s, w) + if s._broken then + return 'It seems they are stunned...'; + end + if s._shoot then + return 'What a bastards!'; + end + return 'It\'s amazing I am still alive...'; + end, + used = function(s, w) + if w == 'shotgun' or w == 'revol' then + if s._shoot then + return 'It\'s useless. The guards are protected by the metal tourniquets.'; + end + s._shoot = true; + return 'I look out from the wall and shoot several times by guess.'; + end + end, +}; + +lustra1 = obj { + nam = 'chandeliers', + dsc = function(s, w) + if s._broken then + return 'The ceiling carries one {chandelier}.'; + end + return 'Two shiny {chandeliers} hang on the ceiling.'; + end, + act = function(s, w) + if guards1._shoot then + return 'One of the chandeliers hang just above the tourniquets.'; + end + return 'I can\'t help watching them... Perhaps, they are made of crystal?'; + end, + used = function(s, w) + if w == 'revol' then + return 'I doubt this revolver brings any significant damage to the chandeliers.'; + end + if w == 'shotgun' then + shotgun._unloaded = true; + s._broken = true; + guards1._broken = true; + lifeoff('vorota'); + drop('shotgun'); + return 'I look out from the wall and fire the shotgun. The shot sound and a loud crash hit my ears. I see one of the chandeliers breaks away the ceiling and slowly starts falling down on the screaming guards. I throw away the useless and unloaded shotgun.'; + end + end, + +}; + +vorota = room { + nam = 'near the gates', + pic = 'gfx/shooting.png', + enter = function(s, f) + if f == 'eside2' and not guards1._broken then + lifeon('vorota'); + return 'Reaching the gates I hear the rattle of shots and push myself to the wall.'; + end + end, + life = function(s) + if rnd(6) < 4 then + return 'Shots ring out. I push myself to the wall.'; + end + end, + act = function(s, w) + if w == 1 then + return 'Those tourniquets which had let me inside today. Now I see them from the other side.'; + end + end, + dsc = 'I am at the opened gates. They open the way to the first floor of the institute.', + obj = { + vobj(1, 'tourniquets', 'I see the row of the {tourniquets}.'), + 'lustra1', + 'guards1', + }, + exit = function(s, t) + if not guards1._broken and t == 'train' then + return 'I rush ahead, but the machine gun shots make me return back.', + false; + end + end, + way = { 'train', 'eside2' }, +}; + +theend = room { + nam = 'the epilogue', + pic = 'gfx/chme3.png', + dsc = [[I moved the controller handle to the most forward position and the locomotive shaked and started moving ahead. I heard screams and machine gun shots started bumping the cabin walls with new power... But the train moved faster and faster. And soon there was a great clash! It was the gates which could not stand 1350 horsepowers of my train! They broke out of their hinges and were pulled several tens of meters along the railroad...^^ + +Barsik showed his face out and looked around. I petted his ears as I always did. +When the bullet sound had disappeared I looked out from the window and watched the institute for the last time. It was burning like a torch. The fire had already captured the whole fifth floor. I looked in the sky... And now - almost in complete darkness - I could see millons of stars shining like dimonds.^^ + +Very soon, the fields outside were followed by taiga and I could see the friendly outlines of pines and firs changing one another in the rhythm of wheel sound. The wound in the shoulder hurted much and I felt how hard I was tired... I sat on the floor and leaned against the cold iron of the cabin. I was listening the hum of the locomotive and petting my Barsik...^^ + +Barsik looked at me with his clever eyes and purred like asking me a question. - Back home... - I answered him - We are going back home...^^ + +THE END^^ + + ---^^ + +The Story and the INSTEAD Engine: ^ +Peter Kosyh a.k.a. gl00my // 2009^^ + +Graphics: ^ +Peter Kosyh, some photos are taken from open sources.^^ + +Music: ^ +One fine day // Elwood^ +Revelation // necros^ +New beginning // Purple Motion^ +Ice frontier // Skaven^ +Planete football // Frank Amoros^ +Underwater world II // Slightly Magic^ +Hybrid song // Quazar^ +Hispeed - track whatever // Purple Motion^ +Liberty // Zapper^^ + +Testers:^ +Sergey Kalichev a.k.a. Pkun^ +Vladimir Podobaev a.k.a. zloyvov^^ + +English Translation:^ +Episode 1: tkzv^ +Episodes 2 and 3: Vladimir Podobaev^^ + +If you like the game, the best what you can do - is to write your own history on the INSTEAD engine. :)^^ + +Acknowledgments:^ +To all who haven't been bothering me. :)^^ +]], +}; + diff --git a/ep3-ru.lua b/ep3-ru.lua new file mode 100644 index 0000000..a6a7df5 --- /dev/null +++ b/ep3-ru.lua @@ -0,0 +1,1639 @@ +lection = room { + nam = 'Лекция Белина', + pic = 'gfx/lection.png', + dsc = [[Я пробираюсь к месту и сажусь... Отсюда хорошо слышно — послушаем именитого физика... — Думаю я... ^^Итак, в ноябре 1935г. Шредингер опубликовал статью, +в которой проводился следующий мысленный эксперимент — продолжал Белин — +в чем суть эксперимента? — С этими словами Белин вытащил и поставил на стол +ящик странного вида — Люблю опыты — белоснежная улыбка тускло блеснула в свете ламп — +Как вы можете видеть, это — ящик — Белин похлопал ладонью +по гладкой поверхности. — В ящик встроена капсула с ядовитым газом +Кроме того, в статико-динамическом поле ящика находятся счетчик радиации, +изотопный элемент и таймер. Параметры эксперимента подобраны так, что вероятность того, что ядро распадётся за 1 час, составляет 50%.^^ + + +Если ядро распадается, оно приводит механизм в действие, он открывает ёмкость с газом. — +Пока все просто — не так ли, господа? — Улыбается Белин — но дело в том, +что Шредингер в своем эксперименте помещает в ящик кота — живое существо. ^^ + +Согласно квантовой механике, если над ядром не производится наблюдения, то его состояние описывается суперпозицией (смешением) двух состояний — распавшегося ядра и нераспавшегося ядра, следовательно, кот, сидящий в ящике, и жив, и мёртв одновременно. — Белин повышает голос. — можно сказать, что это просто игры разума, отвлеченная лирика, но я покажу и докажу, что это не совсем так... ^^ + +— Итак, если ящик открыть, то экспериментатор обязан увидеть только какое-нибудь одно конкретное состояние — <<ядро распалось, кот мёртв>> или <<ядро не распалось, кот жив>>. Сам Шредингер думал, что его парадокс доказывает несостоятельность квантовой механики, но мы-то с вами знаем, что квантовая механика и есть истинное представление о нашем мире — снова повышает тон голоса Белин — и вот, независимо друг от друга, что доказывает отчасти истинность предположения — Ганс Моравек в 1987 и Бруно Маршал в 1988 рассмотрели ситуацию с точки зрения самого кота!^^ + +— Если верна многомировая интерпретация Эверетта, то в результате каждого проведенного эксперимента с котом вселенная расщепляется на две вселенных, в одной из которых кот остается жив, а в другой погибает. В мирах, где кот умирает, он перестает существовать. Напротив, с точки зрения неумершего кота, эксперимент будет продолжаться, не приводя к исчезновению кота. Это происходит потому, что в любом ответвлении кот способен наблюдать результат эксперимента лишь в том мире, в котором он выживает. И если многомировая интерпретация верна, то кот может заметить, что он никогда не погибнет в ходе эксперимента... — Белин замолкает и осматривает зал... ^^ + +— Но что вытекает из этого, господа? Я спрашиваю, что из этого вытекает? — Представим, что участник эксперимента взрывает ядерную бомбу вблизи себя. С точки зрения многомировой интерпретации, практически во всех параллельных вселенных ядерный взрыв уничтожит участника. Но, несмотря на это, должно существовать небольшое множество альтернативных вселенных, в которых участник каким-либо образом выживает. И мы переходим к идее — Белин снова поднял голос — идее квантового бессмертия!!! ^^ + +— Идея квантового бессмертия состоит в том, что участник остаётся в живых, и тем самым способен воспринимать окружающую реальность, по меньшей мере в одной из вселенных в множестве, пусть даже количество таких вселенных пренебрежимо мало в сравнении с количеством всех возможных вселенных. Таким образом, со временем участник обнаружит, что он может жить вечно!!! ^^ + +Мы все с вами тяжело работали этот год, под четким руководством... — тут Белин бросил взгляд в сторону портретов — и должен вам сказать, что информации в нашем информационном центре — Белин посмотрел в потолок — достаточно, чтобы доказать, я повторяю, научно доказать теоретически и экспериментально истинность многомировой интерпретации... — Но что это значит для нас? — Вы не можете этого видеть, но — Белин смотрит на часы — уже через несколько минут состав с ураном прибывает к задним воротам института... Урана хватит для того, чтобы обеспечить каждого из вас ядерной бомбой. Так как вы скоро убедитесь в том, что квантовое бессмертие это реальность, то каждый из нас сможет стать непобедимым террористом!!! Вселенная расщепится на множество миров, в каждом из которых Вы — палец Белина указывает в зал — будете его диктатором и господином!!! — Белин почти кричал...^^ + +Зал не выдержал и взревел. Люди вставали и хлопали... Их глаза горели каким-то бешеным огнем... О Боже, — подумал я — это какое-то наваждение... Мои ноги не слушались меня — я сидел на своем месте и не мог пошевелиться...^^ + +Но я отвлекся — говорит Белин — продолжим наш опыт. С этими словами он достал из-под стола живой комочек... Это был мой Барсик... — Сейчас я помещу эту кошку в ящик и мы с вами... — красная пелена застилает мои глаза... + ]], + enter = function(s) + -- end of episode 2 + eside = nil; + moika = nil; + eating = nil; + kitchen = nil; + stolcorridor = nil; + entrance = nil; + floor2 = nil; + eroom = nil; + room33 = nil; + room3x = nil; + cor3 = nil; + toilet3 = nil; + floor3 = nil; + toilet = nil; + toiletw = nil; + room4x = nil; + room46 = nil; + hall42 = nil; + hall41 = nil; + floor4 = nil; + floor5 = nil; + povardlg = nil; + kitchendlg = nil; + facectrl = nil; + end, + act = function(s, w) + if w == 1 then + set_music("mus/under.s3m"); + return walk('escape1'); + end + end, + obj = { + vobj(1, 'дальше', '{Дальше}.'), + }; +}; + +profdlg = dlg { + nam = '!!!', + pic = 'gfx/me.png', + dsc = 'Я собираюсь с силами, встаю и во всю глотку кричу...', + obj = { + [1] = phr('Это кот, а не кошка!', + '— Рука Белина останавливается — его взгляд фокусируется на мне — он узнает меня!! — Охрана — в зале посторонний!!! Убе... Уберите его!!! — кричит он..', + [[poff(2);escape1.obj:add('guardian')]]), + [2] = phr('Не трогай моего кота!', + '— Белин замирает, затем смотрит мне прямо в глаза — его лицо выражает удивление — Охрана!!! Охрана!!! В зале посторонний!!!', + [[poff(1);escape1.obj:add('guardian')]]), + }, +}; + +profdlg2 = dlg { + nam = 'Белин', + pic = 'gfx/prof2.png', + dsc = 'Белин бледен. Он смотрит на дробовик рассеянным взглядом.', + obj = { + [1] = phr('Я пришел за своим котом.', + 'Я выхватываю Барсика из руки Белина и засовываю себе за пазуху.', + [[inv():add('mycat'); lifeon('mycat')]]), + [2] = phr('Скажи им, чтобы расходились!!!', + '— Белин бледен, похоже он не понимает меня...', + [[pon(3)]]), + [3] = _phr('Ну же!!! Скажи им, чтобы расходились...', 'Я трясу его. Белин не чувствует, он лишь смотрит на черные стволы дробовика.',[[pon(3); back();]]); + }, +}; +gdlg1 = dlg { + nam = 'охранник', + pic = 'gfx/guard42.png', + dsc = 'Я кричу охраннику и не узнаю свой голос...', + obj = { + [1] = phr('Положи свое ружье прикладом вперед на стол и толкни его сюда..', + 'Охранник неуверенно смотрит на меня..', + [[pon(2)]]), + [2] = _phr('Я сказал на стол ружье!!! — я посильнее надавливаю стволами на Белина — он близок к обмороку.', 'Охранник осторожно кладет помповое ружье на стол и толкает его ко мне... — я быстро забираю ружье. Теперь в левой руке у меня обрез, в правом — помповое ружье.', + [[pon(3); inv():add('shotgun')]]), + [3] = phr('Не нравилось тебе мое лицо да?? Дааа???', + 'Охранник молчит, на его лбу выступает пот...', + [[pon(3); back();]]), + }; +}; + +shotgun = obj { + nam = 'ружье', + inv = 'Помповое ружье... На 6 зарядов. Интересно, сколько там осталось?', + dsc = 'На полу валяется помповое {ружье}.', + tak = function(s) + if s._unloaded then + return 'Оно мне больше не нужно. Полностью разряжено.', false + end + return 'Я беру свое ружье обратно.'; + end, +}; + +guardian = obj { + nam = 'охранник', + dsc = function(s, w) + if not professor._gun then + return 'Я вижу как {охранник} с помповым ружьем медленно, но верно пробирается к моему месту.'; + end + if have('shotgun') then + return 'Я вижу обезоруженного {охранника}, внимательно смотрящего на меня.'; + end + return 'Я вижу {охранника}, неуверенно держащего в руках помповое ружье.'; + end, + act = function(s, w) + if not professor._gun then + return 'Скоро он доберется до меня...'; + end + return walk('gdlg1'); + end, + used = function(s, w) + if w == 'shotgun' then + return 'Нет, я не могу пойти на это...'; + end + if w == 'gun' then + if not professor._gun then + return 'Мой обрез не для дальнего боя...'; + end + return 'Я опасаюсь отводить обрез от Белина, к тому же, потом мне придется его перезаряжать...'; + end + end +}; + +professor = obj { + nam = 'Белин', + dsc = function(s, w) + if not s._gun then + return 'Перед доской стоит {Белин} и держит в руке моего Барсика.'; + end + return 'Я упираюсь обоими стволами дробовика в грудь {Белина}.'; + end, + act = function(s) + if not s._gun then + return walk('profdlg'); + end + return walk('profdlg2'); + end, + used = function(s, w) + if w == 'gun' then + if s._gun then + return 'Я еще сильнее надавливаю обоими стволами на грудь Белина.'; + end + s._gun = true; + objs():add('guardian'); + gun._hidden = false; + return 'Я достаю обрез из-под одежды и, перепрыгивая через стол, бросаюсь к Белину.'; + end + end, +}; +pdlg = dlg { + nam = 'люди', + pic = 'gfx/me.png', + dsc = 'Я смотрю в зал и кричу...', + obj = { + [1] = phr('Вас обманывают!!! Никакого доказательства нет!!!', + '— никакой реакции...',[[pon(2)]]), + [2] = _phr('Мир един!!! Каждый из вас знает об это с детства!!! Уходите отсюда!! Бегите от этих сектантов!!!', ' — ответом мне было молчание...'), + [3] = phr('Стадо баранов!!! Неужели вас так легко обмануть???', + '— они молчат — и мне не нравится их взгляды...', + [[pon(3); back();]]), + }, +}; +narod = obj { + nam = 'люди', + dsc = function(s) + if not professor._gun then + if seen('guardian') then + return '{Люди} в зале смотрят на меня с недоумением. Они в замешательстве.'; + end + return '{Люди} в зале следят за Белиным.'; + end + return '{Люди} в зале замерли. Они не спускают с меня взгляд. Если я ошибусь — мне конец... И всему миру...'; + end, + act = function(s) + if professor._gun then + return walk('pdlg'); + end + if seen('guardian') then + return 'Пока они на меня не бросились и это хорошо...'; + end + return 'Фанатики, они фанатики...'; + end, + used = function(s, w) + if w == 'gun' or w =='shotgun' then + return 'Я думаю, что патронов не хватит.'; + end + return 'Увы...'; + end +}; + +win = obj { + nam = 'окно', + dsc = function(s) + local st = ''; + if s._broken then + st = ' Одно из окон разбито.'; + end + return 'Три широких {окна} выходят на запад.'..st; + end, + act = 'За окнами тьма... Только белые снежинки изредка попадают в зону освещения флоуресцентных ламп.'; + used = function(s, w) + if w ~= 'gun' and w ~= 'shotgun' then + return 'Не поможет...'; + end + if s._broken then + return 'Уже разбито...'; + end + if not have('shotgun') then + return 'Охранник подстрелит меня..'; + end + s._broken = true; + ways():add('window'); + return 'Я разбиваю прикладом ближайшее окно...'; + end +}; + +escape1 = room { + nam = 'Зал 2', + dsc = 'Я нахожусь в зале. Люди в зале ждут продолжения эксперимента.', + pic = function() + if professor._gun then + return 'gfx/meandgun.png'; + end + return 'gfx/lection2.png'; + end, + obj = { + 'win', + vobj(4, 'лампы', 'Зал освещают флоуресцентные {лампы}.'), + 'professor', + 'narod', + vobj(5, 'ящик', 'На столе стоит {ящик}.'), + 'portrait', + }, + act = function(s, w) + if w == 5 then + return 'Проклятая коробка...'; + end + if w == 4 then + return 'Шесть ламп... Ненавижу этот мерцающий свет...'; + end + end, + used = function(s, w, ww) + if ww == 'gun' or ww == 'shotgun' then + if not professor._gun then + return 'Не стоит...'; + end + if w == 4 then + return 'Темнота поможет не только мне, но и им... А их больше...'; + end + if w == 5 then + return 'Там яд. Я боюсь навредить моему Барсику.'; + end + end + end, + exit = function(s, t) + if t == 'window' and not have('mycat') then + return 'А как же Барсик?', false + end + if t == 'cor4' then + return 'Я должен что-то сделать сейчас же!', false; + end + end, + way = { 'cor4' }, +}; +lest = obj { + nam = function(s, w) + if s._seen then + return 'лестница'; + else + return 'нечто'; + end + end, + dsc = function(s, w) + if s._seen then + return 'За метелью я едва различаю пожарную {лестницу}!'; + end + return 'За метелью я едва различаю контуры какой-то {конструкции}.'; + end, + act = function(s, w) + if not s._seen then + ways():add('ladder'); + s._seen = true; + return 'Это же пожарная лестница!!!'; + end + return 'Прыгать или нет? Вот в чем вопрос...'; + end, +}; + +window = room { + nam = function(s) + if here() == window then + return 'на подоконнике'; + end + return 'в окно'; + end, + pic = 'gfx/fromwin1.png', + enter = "Это безумие, но все же я бросаюсь к окну... За спиной я слышу рев толпы..."; + dsc = 'Я стою на подоконнике и всматриваюсь в ночную пустоту.', + obj = { + 'lest', + }, + exit = function(s, t) + if t == 'escape1' then + return 'Мне нельзя назад... Там толпа фанатиков...', false; + end + end, + way = { 'escape1',}, +}; + +down = room { + nam = 'вниз'; +}; + +window5 = obj { + nam = 'окно', + dsc = function(s, w) + if s._broken then + return 'Слева от меня, разбитое {окно}.'; + end + return 'Слева от меня желтый огонек {окна}.'; + end, + act = function(s) + if not s._broken then + return 'Окно закрыто...'; + end + return walk('room5'); + end, + used = function(s, w) + if w == 'gun' or w == 'shotgun' then + if s._broken then + return 'Уже разбито...'; + end + s._broken = true; + return 'Я выбиваю стекло прикладом... Осколки стекла падают в темноту...'; + end + end +}; + + +up = room { + _num = 0; + nam = 'наверх', + enter = function(s, w) + s._num = s._num + 1; + if s._num == 2 then + lifeon('ladder'); + return 'Внезапно, ночную тьму разрезает луч прожектора и тишину нарушает вой сирены... Похоже, внизу меня заметили...', false; + end + if s._num > 4 then + ladder.way:del('up'); + ladder.obj:add('window5'); + end + return 'Я медленно ползу вверх...', false; + end +}; + +ladder = room { + nam = 'лестница', + pic = 'gfx/ladder.png', + dsc = [[Я стою на холодной лестнице. Ледяные иголки снежинок больно ударяются о мое лицо.]], + act = function(s, w) + if w == 1 then + return 'Я скоро окоченею... Надо двигаться..'; + end + end, + obj = { + vobj(1, 'поручни', 'В моих руках железные {поручни}.'), + }; + enter = function(s) + inv():del('gun'); + return [[Я разбегаюсь и прыгаю... Несколько секунд мое сердце сжимается, но я чувствую тепло Барсика за пазухой и уже в следующий миг мои руки хватаются за черную сталь... Дробовик срывается с моего плеча и летит вниз...]]; + end, + way = { 'up', 'down' }, + life = function(s) + if rnd(2) == 1 then + return 'Я слышу треск автоматных очередей — несколько пуль проходят совсем рядом...'; + end + end, + exit = function(s, t) + if t == 'down' then + if s._shoot then + return 'Меня убьют... И Барсика... И разрушат весь мир...', false; + end + lifeon('ladder'); + s._shoot = true; + return 'Я начинаю спускаться вниз, когда ночную тьму вдруг разрезает луч прожектора и тишину нарушает вой сирены... Похоже, внизу меня заметили...', false; + end + if t ~= 'up' then + lifeoff('ladder'); + end + end +}; + +hand = obj { + nam = 'кровавая рука', + inv = 'Моя рука кровоточит... Мне кажется, что скоро я потеряю сознание...', + life = 'Капли крови падают с моей правой руки на пол...', + used = function(s, w) + if w == 'galstuk' then + inv():del('galstuk'); + inv():del('hand'); + lifeoff('hand'); + return 'Я перевязываю руку галстуком... Пока сойдет...'; + end + end +}; + +computers = obj { + nam = 'компьютеры', + dsc = 'Большую площадь занимают высокие стойки с компьютерным {оборудованием}. Тихое жужжание вентиляторов едва слышно. Нервно подмигивают лампочки сетевого оборудования.'; + act = function(s) + if kover._fire then + return 'Ну что же... Гори, зло, гори!!! Пора выбираться отсюда.'; + end + return 'Это оборудование хранит зло... Мне нужно уничтожить все это, но как? Из своего прошлого я знаю, что самый надежный способ уничтожить информацию на магнитных носителях — провести ее через точку Кюри, другими словами — сжечь это все к чертям собачьим... Но где мне взять огонь?'; + end, + used = function(s, w) + if w == 'shotgun' then + return 'Расстрелять серверы? Ненадежно... Я должен сжечь это зло...'; + end + end +}; + +poroh = obj { + nam = 'порох', + inv = 'Этот порох должен мне помочь.', +}; + +trut = obj { + nam = 'трут', + inv = 'Кусок газеты с порохом. Да это же трут!!!', + use = function(s, w) + if w == 'ibp' and ibp._knife and not ibp._trut then + ibp._trut = true; + inv():del('trut'); + return 'Я кладу трут на ИБП.'; + end + end +}; +fire = obj { + nam = 'огонь', + inv = 'Бумажка быстро горит... Надо что-то делать!!!', + use = function(s, w) + if w == 'poroh' then + return 'Рванет прямо в руке.'; + end + if w == 'news' then + return 'Я отрываю еще кусок от газеты. Пламя перекидывается на него.'; + end + inv():del('fire'); + if w ~= 'kover' then + return 'Бумага догорает и гаснет...'; + end + if kover._fire then + return 'Я кидаю бумажку на горящий ковер...'; + end + kover._fire = true; + return 'Я кладу бумагу на ковер... Волоски ковра вспыхивают... Похоже, начинается пожар..'; + end +}; + +ibp = obj { + nam = 'ИБП', + dsc = 'Один разобранный {ИБП} валяется на полу.', + inv = function(s) + if not s._knife then + return 'Это источник бесперебойного питания. Что мне с ним делать?'; + end + local st = ''; + if s._trut then + st = ' На батарее лежит бумага с порохом.'; + end + return 'Разобранный ИБП. Я вижу клеммы, ведущие к батарее...'..st; + end, + act = function(s) + if not have('ibp') then + if not have('fire') and not kover._fire then + take('ibp'); + return 'Я снова беру ИБП в руки.'; + end + return 'Мне он больше не нужен.'; + end + return s:inv(); + end, + used = function(s, w) + if not have('ibp') then + return 'Не сработает...'; + end + if w == 'knife' then + s._knife = true; + return 'Я раскручиваю винты и разбираю ИБП. Теперь я вижу клеммы, ведущие к батарее...'; + end + if w == 'provodki' and s._knife then + if not provodki._knife then + return 'Проводки не оголены.'; + end + if not s._trut then + return 'Я подсоединяю проводки к клеммам и замыкаю усики проводов — от замыкания проскакивает искра. Нужен трут...'; + end + drop('ibp'); + ibp._trut = false; + inv():add('fire'); + return 'Я подсоединяю проводки к клеммам и замыкаю усики проводов. Проскакивает искра и перекидывается на трут. Трут вспыхивает!!! Огонь!!!'; + end + if w == 'provod' then + return 'Я вставил, а затем снова вытащил провод из ИБП... Хммм...'; + end + end, +}; + +provodki = obj { + nam = 'тонкие проводки', + inv = function(s) + if s._knife then + return 'Пара тонких проводков с усиками на конце.' + end + return 'Пара тонких проводков.' + end, + used = function(s, w) + if w == 'knife' and not s._knife then + s._knife = true; + return 'Я отрезаю изоляцию с концов проводка и достаю тоненькие усики.'; + else + return 'Не сработает...'; + end + end +}; + +provod = obj { + nam = 'провод от ИБП', + inv = 'Это провод от ИБП.', + used = function(s, w) + if w == 'knife' then + if not knife._oster then + return 'Лезвие ножа слишком тупое...'; + end + inv():del('provod'); + inv():add('provodki'); + return 'Я разрезаю оплетку и достаю две жилы провода.' + end + end +}; + +ups = obj { + nam = 'ибп', + dsc = 'Множество {источников бесперебойного питания} стоят у каждой стойки.', + act = function(s) + if have('hand') then + return 'У меня поранена рука. Кровь так и хлещет, я не могу таскать ИБП.'; + + end + if not have('ibp') and not seen('ibp') then + inv():add('ibp'); + inv():add('provod'); + return 'Немного порывшись я отсоединяю один из источников и держу его в руках...'; + end + return 'Я уже брал один UPS.'; + end, +}; + +kover = obj { + nam = 'ковер', + dsc = function(s) + if s._fire then + return '{Ковер} на полу занимается пламенем.'; + end + return 'На полу постелен красный {ковер}.'; + end, + act = 'Ненужная роскошь.', +}; + +room5 = room { + nam = 'центр информации'; + pic = 'gfx/servers.png', + dsc = [[Я в огромном помещении, занимающем всю южную часть института.]], + enter = function(s, f) + if f == 'ladder' then + set_music('mus/hybrid.xm'); + lifeon('hand'); + inv():add('hand'); + return 'Я прыгаю и хватаюсь за раму окна. Моя правая рука в крови. Не обращая внимания на боль, я спрыгиваю на пол комнаты...'; + end + end, + exit = function(s, f) + set_music("mus/under.s3m"); + end, + act = function(s, w) + if w == 1 then + return 'Я не полезу назад... Там холодно и стреляют...'; + end + end, + obj = { 'computers', 'ups', + vobj(1, 'окно', 'В разбитое {окно} дует холодный зимний ветер.'), + 'kover', + 'dout', + 'portrait', + }, +}; +dout = obj { + nam = 'дверь', + dsc = function(s) + return 'Далеко впереди я могу видеть выходную {дверь}.' + end, + act = function(s) + if not kover._fire then + return 'Это центр обработки информации. Я должен уничтожить его, чтобы спасти мир от заразы, что хранится в недрах его накопителей...'; + end + return 'Я подбегаю к двери. Дверь ведет на площадку пятого этажа и она электронная!!! Это значит, что открыть я ее могу только с помощью карточки с требуемым уровнем доступа. Я сгорю?'; + end, + used = function(s, w) + if not kover._fire then + return s:act(); + end + if w == 'card' then + return 'Я подношу карточку к двери. Биип — в доступе отказано! Я сгорю здесь!!!'; + end + if w == 'shotgun' then + return walk('escape2'); + end + return 'Не поможет...'; + end +}; + +handgdlg = dlg { + nam = 'охранник', + pic = 'gfx/handhoh.png', + dsc = 'Охранник — еще молодой парень лет 30 — смотрит на меня. Он растерян.', + obj = { + [1] = phr('Отдай мне свое оружие!', '— Я без оружия — качает охранник головой... Не знаю верить ему или нет, но обыскивать его мне не хочется...'), + [2] = phr('Мне нужен ключ от красной двери.', 'Охранник бледнеет. — Ни у кого нет ключа от ЭТОЙ двери. — произносит он. — Что за чушь? — Думаю я.'), + [3] = phr('Ок! Просто стой и не дергайся.', 'Охранник молча смотрит на меня.', + [[pon(3);back();]]), + }, +}; + +win5 = obj { + nam = 'окно', + dsc = function (s) + if s._broken then + return 'В разбитое {окно} завывает зимний ветер. Снежинки вихрем залетают на этаж.'; + end + return 'Широкое {окно} выходит на запад.'; + end, + act = function(s) + if not s._broken then + return 'Я подхожу к окну... Любопытно, я вижу, что окно выходит на довольно широкий участок крыши, который проходит через фронтальную часть здания...'; + end + return 'Окно разбито... Третье за сегодня.'; + end, + used = function(s, w) + if s._broken then + return s:act(); + end + if w == 'shotgun' then + s._broken = true; + ways():add('krysha'); + return 'Уххх.... Третье окно за сегодня... Я размахиваюсь и осколки стекла вылетают на крышу...'; + end + end, +}; + +escape2 = room { + _timer = 0, + nam = 'площадка 5-го этажа', + pic = 'gfx/floor5e.png', + dsc = [[Потолки на пятом этаже очень высокие.]], + enter = function(s, f) + if f == 'room5' then + lifeon('escape2'); + return 'В бессилии я бью прикладом в ненавистную дверь. И вдруг, через несколько секунд слышу, как кто-то подходит к двери с внешней стороны... Это охранник!!! Писк срабатывания считывателя — и вот, дверь открывается. Охранник пятится — ему в грудь упирается ствол помпового ружья. Мы выходим на площадку пятого этажа.'; + end + if f == 'krysha' then + lifeon('escape2'); + end + end, + life = function(s) + s._timer = s._timer + 1; + if s._timer == 3 then + return 'Внезапно, на этаже раздается звук сирены. — Внимание!!! На пятом этаже лицо с нулевым уровнем допуска. Повторяю... — льется голос из невидимых динамиков.'; + end + if s._timer > 3 then + return '— На пятом этаже лицо с нулевым уровнем доступа!!! — от воя сирены меня начинает мутить.'; + end + end, + act = function(s, w) + if w == 1 then + return 'Мои ноги утопают в красном бархате... Проклятая роскошь!'; + end + if w == 2 then + return 'Нет, все-таки это хрусталь...'; + end + if w == 4 then + return 'Пожар уже начался...'; + end + if w == 5 then + return 'Не думаю, что мой пропуск здесь подойдет.'; + end + if w == 6 then + return walk('handgdlg'); + end + end, + used = function(s, w, ww) + if w == 6 then + return 'Я держу охранника на мушке.'; + end + if w == 5 then + return 'Не поможет.'; + end + end, + obj = { + vobj(1, 'ковер', 'Лифтовую площадку покрывает красный {ковер}.'), + vobj(2, 'люстра', 'Хрустальная {люстра} висит на высоком потолке.'), + 'win5', + vobj(4, 'информация', '{Дверь} в центр обработки информации распахнута. Из нее начинает валить дым.'), + vobj(5, 'красная дверь', 'Напротив нее находится {дверь} без надписей. Это массивная дверь, обитая красной кожей.'), + + vobj(6, 'охранник', 'В центре площадки, подняв руки, стоит {охранник}.'); + }, + way = { 'lift','room5' }, + exit = function(s, t) + if t == 'room5' then + return 'Там пламя!', false + end + if t == 'lift' then + return 'Я вижу, что лампочки вызова всех лифтов горят. Скорее всего это означает, что сюда поднимается охрана... Надо спешить!', false; + end + if t == 'krysha' then + lifeoff('escape2'); + end + end +}; + +swin = obj { + nam = 'южное окно', + dsc = 'Из южного {окна} валит дым.', + act = 'Да, это одно из окон информационного центра. Я заглядываю в окно и вижу пламя.', +}; +nwin = obj { + nam = 'северное окно', + dsc = function(s) + local st = ''; + if s._broken then + st = ' Оно разбито.'; + end + return 'Северное {окно} светит в темноту желтым светом.'..st; + end, + act = function(s) + if s._broken then + return walk('hall5'); + end + return 'Гм... Я заглядываю в окно и вижу прекрасный зал.'; + end, + used = function(s, w) + if w == 'shotgun' then + s._broken = true; + ways():add('hall5'); + return 'Уххх... Надеюсь, это последнее??? Я размахиваюсь и разбиваю стекло прикладом помпового ружья.'; + end + end, +}; + +hall5 = room { + nam = 'зал', + pic = 'gfx/hall5.png', + enter = function(s, f) + if f == 'krysha' then + return 'Я спрыгиваю в зал и оглядываюсь...'; + end + end, + act = function(s, w) + if w == 1 then + return 'Ненужная роскошь.'; + end + if w == 2 then + return 'Я провожу ладонью по скользкой поверхности одной из колонн... Мрамор!'; + end + if w == 3 then + return 'Но уж эта-то люстра точно из горного хрусталя.'; + end + if w == 4 then + return 'Темно... Хотя... Что это? Мне кажется, что у задней стороны института стоит поезд.'; + end + if w == 5 then + return 'У разбитого окна кружатся снежинки.'; + end + if w == 6 then + if s.way:srch('escape3') then + return walk('escape3'); + end + return walk('gudlg'); + end + if w == 7 then + return 'Эта дверь закрыта. Вряд ли ее можно открыть моим ключом.'; + end + if w == 8 then + return 'Гммм... Пикассо?'; + end + if w == 9 then + return 'Страшная слабость охватывает меня... Нет — мне нельзя спать...'; + end + end, + used = function(s, w, ww) + return 'Зачем?'; + end, + dsc = 'Прекрасный и огромный зал занимает почти всю северную часть здания!', + obj = { + vobj(1,'ковер', 'Под ногами бархат красного {ковра}.'), + vobj(2,'колонны', 'Восемь мраморных {колонн} образуют коридор.'), + vobj(3,'люстра', 'Великолепная {люстра} свисает с потолка.'), + vobj(4,'восточные окна', 'На восток выходит четыре {окна}.'), + vobj(5,'западные окна', 'Разбитое {окно} находится слева от меня.'), + vobj(6,'небольшая дверь', 'В конце зала, в его северной части, я вижу небольшую деревянную {дверь}.'), + vobj(7,'входная дверь', 'За моей спиной входная {дверь}.'), + vobj(8,'картины', 'По стенам развешаны {картины} в красивых рамах.'), + vobj(9,'диваны', 'У стен расставлены мягкие {диваны}.'), + }, + way = { 'krysha' }, +}; + +krysha = room { + nam = 'крыша', + pic = 'gfx/krysha.png', + enter = function(s, f) + return 'Я быстро подхожу к разбитому окну и вот, я на крыше...'; + end, + dsc = 'Видимо, пятый этаж был достроен позже остальных четырех. По участку крыши я могу добраться до первых окон южного и северного крыла.', + obj = {'nwin', 'swin'}, + way = {'escape2'}, +}; + +gudlg2 = dlg { + nam = 'человек с портрета', + pic = 'gfx/pmanb.png', + dsc = 'Я смотрю на его поникшее лицо. Оно по-прежнему спокойно.', + obj = { + [1] = phr('Получил, гад?', + 'В ответ я слышу едва различимый стон.', + [[pon(1); back();]]), + [2] = phr('Но зачем, зачем это все?', + 'Он поднял на меня свои глаза. — Я просто делал свою работу...', + [[pon(3);poff(1);]]), + [3] = _phr('Что за ерунда?', + '— А потом, потом стал не нужен... Ну что же — подумал я... — Мир заплатит за эту ошибку...',[[pon(4)]]), + [4] = _phr('Что ты несешь?', + '— Я работал профессором... Но я был не нужен.. Я ... Я не мог это вынести...', + [[pon(5)]]), + [5] = _phr('Какой мерзавец...', + '— Но я заставлю их... Заставлю... Я, я, я - я буду жить вечно... Сам... Один.', + [[pon(6)]]), + [6] = _phr('Мне кажется, что ты спятил...', + 'Его тело дергается в углу — это озноб.', + [[pon(1); back()]]), + } +}; + +gudlg = dlg { + nam = 'человек с портрета', + pic = 'gfx/pman.png', + enter = function(s) + lifeoff('mycat'); + inv():del('shotgun'); + return [[Странно... Дверь не закрыта... Я осторожно открываю дверь и вхожу в комнату.^^Внезапно я обнаруживаю, что на меня смотрит дуло револьвера. — Браво, браво, браво — говорит мне человек в кресле, владелец револьвера. — Я уже заждался. Тот самый лесник? Ну что же, подождем охрану. А пока — брось ружье на пол. Мне ничего не остается, как сделать то, что он сказал.]]; + end, + dsc = [[Передо мной то самое лицо. Лицо с портретов, которыми увешаны почти все комнаты этого здания. Лицо спокойное, ничего не выражающее. Слабая улыбка на губах. Надо тянуть время... И я спрашиваю у него:]], + obj = { + [1] = phr('Может, поговорим?', + 'Гм... Ну о чем нам говорить? О чем мне говорить с лесником?', [[pon(2)]]), + [2] = _phr('Например, правда ли то, что многомировая интерпретация Эверетта верна?', + '— Ха ха ха ха!!! — невыразительно смеется человек с портрета — Конечно, это фокус... Чтобы заставить этих идиотов верить в собственное бессмертие... А может...',[[pon(3)]] ), + [3] = _phr('...То-есть никакого доказательства нет?', + 'Человек перестает смеяться — ...А может — это все-таки правда? — загадочно произносит он — Какой ответ истина? Как ТЫ думаешь?', [[pon(4)]]), + [4] = _phr('Я знаю, что это ложь!', + 'Знаешь ли? — пустые глаза смотрят на меня — Да или нет? - Вдруг паника оглушает меня.' + ,[[pon(5,9)]]), + [5] = _phr('Ложь!', + 'А что если? Представь, что если?... Ты же хакер, да? Любишь продумывать все заранее...', +[[pon(6);poff(9)]]), + [6] = _phr('Нет! Это не может быть правдой! Если это правда — рано или поздно мир будет обречен! Тогда...', + '— Да, ты правильно понял... Тогда есть только ТЫ!!! Послушай себя — кто дал тебе этот ответ? Не его ли ты жаждешь? Не его ли жаждет твое Я? — Я проваливаюсь в его бездонный взгляд.', [[pon(7)]]), + [7] = _phr('Если... Если... То зачем?', + '— Правильно... Правильно — вкрадчиво говорит мне человек с портрета... Новая волна страха оглушает меня, я падаю на колени... Сердце бешено стучит и вылетает из груди...', + [[pon(8)]]), + [8] = _phr('Не могу... Нет...', + '— И если все так, то тебе нечего бояться — мурлычет он. — Сердце бьется еще сильнее. И наконец, моя грудь взрывается, мягкий комочек шерсти отталкивается от нее лапами и летит в лицо человеку с портрета. Раздается выстрел, резкая боль в левом плече отрезвляет меня, я вскакиваю на ноги и бросаюсь вперед...',[[return walk('escape3')]]), + [9] = _phr('Допустим, это правда.', + '— Так... Правильно... Думай, думай...Ты же хакер, да? — шепчет человек с портрета.', + [[pon(6);poff(5)]]) + }, +}; + +--shkf = obj { +-- nam = 'край шкафа', +-- inv = 'Я держу в руках край шкафа.', +--}; + +shkaf = obj { + nam = 'шкаф', + inv = 'Я держу в руках край шкафа.', + dsc = function(s) + if s._fall then + return 'Дверь завалена {шкафом}.'; + end + return 'Один из книжных {шкафов} стоит возле двери.'; + end, + act = function(s) + if not escape3._guards or s._fall then + return 'Какая-то философия... И еще физика.'; + end + inv():add('shkaf'); + return 'Я крепко схватился за край шкафа.'; + end, +}; + +fromw5 = room { + nam = 'на подоконнике', + dsc = 'Я стою на подоконнике, ледяной ветер мешает дышать.', + pic = 'gfx/fromwin2.png', + enter = 'Ну что-же, надеюсь это в последний раз...', + act = function(s, w) + if w == 1 then + return walk('nwall'); + end + end, + obj = { + vobj(1, 'труба', 'Справа от себя я едва различаю водосточную {трубу}.'), + }, + way = { 'escape3' }, + exit = function(s, t) + if t == 'escape3' then + return 'Надо спешить!', false; + end + end +}; + +winr5 = obj { + nam = 'окно', + dsc = function(s) + if s._broken then + return 'Сквозь разбитое {окно} в комнату дышит зимний ветер.'; + else + return '{Окно} выходит на северную сторону.'; + end + end, + act = function(s, w) + if escape3._guards then + if not shkaf._fall then + return 'Некогда любоваться видами... Надо задержать охранников.'; + end + if not have('mycat') then + return 'Без Барсика? Лучше погибнуть вместе!'; + end +-- if not have('revol') then +-- return 'Лучше поднять с пола пистолет, на всякий случай.'; +-- end + if s._broken then + ways():add('fromw5'); + return walk('fromw5'); + else + return 'Окно закрыто.'; + end + end + escape3._guards = true; + lifeon('escape3'); + return 'За окном полная темнота. Я смотрю в темноту, когда вдруг слышу за спиной приглушенный шум шагов... Звуки идут из зала, наверное охрана добралась сюда! Нужно действовать!'; + end, + used = function(s, w) + if escape3._guards and not shkaf._fall then + return 'Некогда... Скоро охрана ворвется сюда...'; + end + if w == 'shotgun' then + if not s._broken then + s._broken = true; + return 'Опять? Ну что же... Я размахиваюсь и разбиваю стекло прикладом. Осколки улетает в темноту.'; + end + return 'Это окно уже разбито.'; + end + end, +}; + +revol = obj { + nam = 'револьвер', + dsc = 'На полу валяется {револьвер}.', + inv = 'Шесть зарядов.', + tak = 'Я поднимаю с пола револьвер.', +}; + +escape3 = room { + nam = 'в комнате', + pic = 'gfx/manroom.png', + enter = function(s, f) + if f == 'gudlg' then + inv():del('mycat'); + hall5.way:add('escape3'); + return 'Я слышу звук падающего пистолета... Потом я бью в чье-то лицо изо всех сил. Снова и снова. Барсик носится вокруг и жалобно мяукает. Через несколько секунд я встаю с пола.'; + end + end, + act = function(s, w) + if w == 1 then + return walk('gudlg2'); + end + if w == 2 then + return 'Абстракционисты не в моем вкусе.'; + end + if w == 3 then + local st = ''; + if shkaf._fall then + st = ' Завалена шкафом.'; + end + return 'Дверь ведущая в зал.'..st; + end + end, + used = function(s, w, ww) + if w == 1 and ww == 'shotgun' or ww == 'revol' then + return 'Да — это зло. Но я не могу стрелять в беспомощного человека.'; + end + if w == 3 and ww == 'shkaf' then + shkaf._fall = true; + inv():del('shkaf'); + return 'Я толкаю шкаф и он падает, заграждая собой дверь.'; + end + end, + dsc = [[Я нахожусь в небольшой, но уютной комнате. Посреди стоит стол. Рядом опрокинуто кресло. Из небольшой люстры равномерно льется свет. Два небольших книжных шкафа стоят у стен.]], + obj = { + vobj(1, 'человек', 'На полу, прислонившись к столу, сидит {человек} с портретов. Струйка крови стекает с его губ — он стонет.'), + vobj(2, 'картины', 'По стенам развешаны {картины}.'), + vobj(3, 'дверь', 'За моей спиной {дверь}.'), + 'revol', + 'shkaf', + 'shotgun', + 'mycat', + 'winr5', + }, + life = function(s) + if rnd(3) == 1 then + return 'Я слышу выстрелы... Пули прошивают дверь... Надо что-то делать...'; + end + end, + exit = function(s,t) + if t == 'hall5' then + if shkaf._fall then + return 'Проход завален шкафом.', false; + end + if s._guards then + return 'Меня там подстрелят...', false; + end + s._guards = true; + lifeon('escape3'); + return 'Я собираюсь выйти в зал, когда вдруг на другом конце открывается дверь и в зал вбегают охранники. Я быстро захлопываю дверь.',false; + end + lifeoff('escape3'); + end, + way = { + 'hall5' + }, +}; + +nwall = room { + nam = 'северная сторона', + dsc = 'Я нахожусь у северной стены здания института.', + pic = 'gfx/nside.png', + way = {'eside2','wside' }, + act = function(s, w) + if w == 1 then + return 'Да — водосточная труба... Довольно крепкая. Но вряд ли я смогу взобраться по ней наверх.'; + end + end, + enter = function(s, f) + if f == 'fromw5' then + return 'Превозмогая боль в левом плече я прыгаю с подоконника на трубу... Мое сердце бешено стучит в груди, пока мы падаем с Барсиком в зимнюю темноту. Но вот, в следующее мгновение я уже соскальзываю, обдирая кожу с ладоней, по водосточной трубе...'; + end + end, + obj = { vobj(1, 'труба', 'Водосточная {труба} проходит по восточному углу здания.')}, + exit = function(s, t) + if t == 'wside' then + if not s._guards then + s._guards = true; + return 'Я высовываюсь из-за угла и вижу, как толпа охранников приближается ко мне из КПП. — Вон он — слышу я крик... Треск выстрелов отгоняет меня обратно.', false; + end + return 'Там меня ждут...', false; + end + end +}; + +eside2 = room { + nam = 'сзади института', + pic = 'gfx/esidee.png', + dsc = [[ Я нахожусь у задней стены здания института. Здесь проходят рельсы.]], + act = function(s,w) + if w == 1 then + return 'Пулеметы направлены на внешнюю - южную сторону периметра, надо держаться от них подальше.'; + end + if w == 2 then + return 'Гм... Похоже это тот самый поезд... Разгрузка еще не началась, но ворота уже открыты.'; + end + if w == 3 then + return 'Четыре вагона. Тип тепловоза - ЧМЭ3. Поезд полностью помещается на территории института.'; + end + end, + obj = { + vobj(1,'пулеметные вышки', 'Въезд поезда охраняется пулеметными {вышками}..'), + vobj(3,'поезд', 'Перед институтом стоит темная громада {поезда}.'), + vobj(2,'ворота', 'Большие железные {ворота} в стене института открыты — я вижу свет, который льется из дверного проема.'), + }, + exit = function(s, t) + if t == 'sside' then + return 'На южной стороне меня смущают пулеметы. Лучше не рисковать.', false + end + if t == 'nwall' and nwall._guards then + return 'Назад пути нет...', false; + end + end, + way = {'nwall','train','sside'}, +}; +function checkloc() + if p1._off or p2._off then -- battary or switch off off + p3._off = true; + p4._off = true; + p5._off = true; +-- p51._off = true; +-- p6._off = true; + end + if p3._off or p4._off then +-- p7._off = true; +-- p71._off = true; + end + if p5._off then + p7._off = true; + end + if p51._off then + p71._off = true; + end + if p6._off then +-- p7._off = true; +-- p71._off = true; + end + if p7._off then +-- p71._off = true; + end +end +p1 = obj { + _off = false, + nam = 'разъединитель', + dsc = function(s) + local st = 'включено.'; + if s._off then + st = 'выключено.'; + end + return '{Разъеденитель} батареи ВБ: '..st; + end, + act = function(s) + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Переключаю...'; + end +}; + +p2 = obj { + _off = true; + nam = 'ключ', + dsc = function(s) + local st = 'повернут вниз.'; + if s._off then + st = 'повернут вверх.'; + end + return '{Ключ} кнопочных выключателей: '..st; + end, + act = function(s) + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Я поворачиваю ключ.'; + end +}; +p3 = obj { + _off = true, + nam = 'электроманометр', + dsc = function(s) + local st = 'включено.'; + if s._off then + st = 'выключено.'; + end + return '{Электроманометр}: '..st; + end, + act = function(s) + if p1._off or p2._off then + return 'Странно... Не получается.' + end + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Переключаю...' + end +}; +p4 = obj { + _off = false, + nam = 'электротермометр', + dsc = function(s) + local st = 'включено.'; + if s._off then + st = 'выключено.'; + end + return '{Электротермометр}: '..st; + end, + act = function(s) + if p1._off or p2._off then + return 'Странно... Не получается.' + end + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Переключаю...' + end +}; +p5 = obj { + _off = true, + nam = 'насос 2-й секции', + dsc = function(s) + local st = 'включено.'; + if s._off then + st = 'выключено.'; + end + return 'Топливный {насос} 2-й секции: '..st; + end, + act = function(s) + if p1._off or p2._off then + return 'Странно... Не получается.' + end + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Переключаю...' + end +}; + +p6 = obj { + _off = true, + nam = 'управление', + dsc = function(s) + local st = 'включено.'; + if s._off then + st = 'выключено.'; + end + return '{Управление}: '..st; + end, + act = function(s) + if p1._off or p2._off then + return 'Странно... Не получается.' + end + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Переключаю...' + end +}; + +p7 = obj { + _off = true, + nam = 'пуск дизеля 2-й секции', + dsc = function(s) + local st = 'включено.'; + if s._off then + st = 'выключено.'; + end + return '{Пуск} дизеля 2-й секции: '..st; + end, + act = function(s) + if p3._off or p4._off or p5._off or p6._off then + return 'Странно... Не получается.' + end + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Переключаю...' + end +}; + +p51 = obj { + _off = true, + nam = 'насос 1-й секции', + dsc = function(s) + local st = 'включено.'; + if s._off then + st = 'выключено.'; + end + return 'Топливный {насос} 1-й секции: '..st; + end, + act = function(s) + if p1._off or p2._off then + return 'Странно... Не получается.' + end + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Переключаю.'; + end +}; + +p71 = obj { + _off = true, + nam = 'пуск дизеля 1-й секции', + dsc = function(s) + local st = 'включено.'; + if s._off then + st = 'выключено.'; + end + return '{Пуск} дизеля 1-й секции: '..st; + end, + act = function(s) + if p3._off or p4._off or p5._off or p6._off or p7._off then + return 'Странно... Не получается.' + end + if s._off then + s._off = false; + else + s._off = true; + end + checkloc(); + return 'Переключаю...'; + end +}; + +p8 = obj { + _num = 1, + nam = 'реверсор', + dsc = function(s) + local st; + if s._num == 1 then + st = 'нейтрально.'; + elseif s._num == 2 then + st = 'назад.'; + elseif s._num == 3 then + st = 'вперед.'; + end + return 'Рукоятка {реверсора}: '..st; + end, + act = function(s) + s._num = s._num + 1; + if s._num == 4 then + s._num = 1; + end + return 'Переключаю...'; + end +}; + +p9 = obj { + _num = 1, + nam = 'контроллер', + dsc = function(s) + local st; + if s._num == 1 then + st = '0.'; + elseif s._num == 2 then + st = '1.'; + elseif s._num == 3 then + st = '2.'; + end + return 'Рукоятка {контроллера}: '..st; + end, + act = function(s) + s._num = s._num + 1; + if s._num == 4 then + s._num = 1; + end + if s._num == 1 then + return 'Переключаю.'; + end + if not p71._off and not p7._off then + if p8._num == 2 then + s._num = 1; + return 'Локомотив вздрагивает и начинает ехать назад. Я перевожу контроллер на 0.'; + elseif p8._num == 3 then + lifeoff('mycat'); + set_music('mus/liberty.s3m'); + return walk('theend'); + end + end + s._num = 1; + return 'Ничего не происходит... Я перевожу контроллер в положение 0.'; + end +}; + +train = room { + nam = function(s) + if here() == train then + return 'в локомотиве'; + end + return 'к поезду'; + end, + pic = 'gfx/cab.png', + dsc = 'Итак, я в локомотиве. Толстая сталь надежно укрывает меня от пуль. Кабина машиниста оказалась пуста. Я вижу перед собой множество приборов.', + act = function(s, w) + if w == 2 then + if p1._off or p2._off then + return 'Я нажал кнопку гудка, но ничего не услышал.'; + end + return 'Раздается унылый звук сигнала. — Я машинист!'; + end + if w == 1 then + return 'Только бы успеть завести эту штуку... И никакие ворота меня не остановят.'; + end + end, + life = function(s) + local st = ''; + if not p7._off or not p71._off then + st = 'Я чувствую как дрожит локомотив. Работает дизель. '; + end + if rnd(10) < 5 then + st = st..'В кабине раздаются звуки ударов пуль о металл.'; + end + return st; + end, + exit = function(s,t) + if t == 'eside2' then + return 'Нет... Лучше остаться здесь, мы будем сопротивляться до последнего.', false; + end + lifeoff('train'); + end, + enter = function(s, f) + if f == 'eside2' and not guards1._broken then + return cat('Пригнувшись, я бегу к поезду.^^', walk('vorota')), false; + end + lifeon('train'); + set_music('mus/hispeed.s3m'); + return 'Пригнувшись, я бегу к поезду... Пробегая мимо вагонов я успеваю заметить знаки <<осторожно — радиация!!>>. Еще немного — и я добираюсь до локомотива. Сзади я слышу звуки выстрелов. Впереди охрана разворачивает пулеметы. Я открываю тяжелую дверь и вот — я внутри.' + end, + obj = { + 'p2', 'p1', 'p4', 'p3', 'p71','p51', 'p7', 'p5', 'p9', 'p8', 'p6', + vobj(2, 'гудок', '{Гудок}.'); + vobj(1, 'окно', 'В {окнах} я вижу закрытые ворота.'), + }, + way = { 'eside2' }, +}; + +guards1 = obj { + nam = 'охрана', + dsc = function(s, w) + if s._broken then + return '{Охранники} за турникетами завалены обломками люстры.'; + end + if s._shoot then + return 'Я вижу {охранников}, которые укрываются от моего огня за турникетами.'; + end + return 'Я вижу {охранников} с автоматами, которые пробираются ко мне через зал первого этажа.'; + end, + act = function(s, w) + if s._broken then + return 'Похоже, они в замешательстве...'; + end + if s._shoot then + return 'Вот негодяи!'; + end + return 'Удивительно, что я еще жив...'; + end, + used = function(s, w) + if w == 'shotgun' or w == 'revol' then + if s._shoot then + return 'Бесполезно, охранники защищены металлом турникетов.'; + end + s._shoot = true; + return 'Я высовываюсь из-за стены и стреляю несколько раз наугад.'; + end + end, +}; + +lustra1 = obj { + nam = 'люстры', + dsc = function(s, w) + if s._broken then + return 'На потолке висит одна {люстра}.'; + end + return 'Две ослепительные {люстры} свисают с потолка.'; + end, + act = function(s, w) + if guards1._shoot then + return 'Одна из люстр находится прямо над турникетами.'; + end + return 'Не могу на них наглядеться... Наверное, это хрусталь?'; + end, + used = function(s, w) + if w == 'revol' then + return 'Вряд ли этот пистолет принесет сильный ущерб люстрам.'; + end + if w == 'shotgun' then + shotgun._unloaded = true; + s._broken = true; + guards1._broken = true; + lifeoff('vorota'); + drop('shotgun'); + return 'Я высовываюсь из-за стены и разряжаю помповое ружье. Сильный грохот и звуки щелкающего затвора оглушают меня. Я вижу, как одна из люстр, сопровождаемая криками охранников, медленно оторвавшись летит вниз. Я выбрасываю бесполезное ружье на пол.'; + end + end, + +}; + +vorota = room { + nam = 'у ворот', + pic = 'gfx/shooting.png', + enter = function(s, f) + if f == 'eside2' and not guards1._broken then + lifeon('vorota'); + return 'Поравнявшись с открытыми воротами я слышу треск выстрелов и прижимаюсь к стене.'; + end + end, + life = function(s) + if rnd(6) < 4 then + return 'Раздается треск выстрелов. Я вжимаюсь в стену.'; + end + end, + act = function(s, w) + if w == 1 then + return 'Те самые турникеты, через которые я попал внутрь. Теперь я нахожусь с другой стороны.'; + end + end, + dsc = 'Я нахожусь у открытых ворот. Ворота ведут на первый этаж института.', + obj = { + vobj(1, 'турникеты', 'Я вижу ряд {турникетов}.'), + 'lustra1', + 'guards1', + }, + exit = function(s, t) + if not guards1._broken and t == 'train' then + return 'Я бросаюсь вперед, но автоматные очереди заставляют меня вернуться.', false; + end + end, + way = { 'train', 'eside2' }, +}; + +theend = room { + nam = 'эпилог', + pic = 'gfx/chme3.png', + dsc = [[Я передвинул ручку контроллера в самое переднее положение, и локомотив, +вздрогнув, двинулся вперед. Я услышал крики, и пулеметные очереди с новой силой застучали +по стенкам кабины... Но локомотив набирал ход, и скоро послышался сильный лязг — это ворота, +не выдержав натиска 1350 лошадиных сил, вылетели из своих петель и протащились несколько +десятков метров вдоль путей...^^ + +Барсик высунул морду из-за пазухи и осмотрелся вокруг. Я привычно погладил его за ушами. +Когда лязг раздавленных ворот и стук пуль утихли, я выглянул из окна и последний раз посмотрел в сторону института. Он полыхал словно факел — пожар уже захватил весь пятый этаж. +Я посмотрел на небо и теперь, уже в полной темноте, смог разглядеть россыпи звезд. ^^ + +Совсем скоро поле уступило место тайге, и привычные очертания сосен и елей замелькали под +ровный стук колес. Рана в плече ныла, и я почувствовал сильную усталость... Присев на пол +и прислонившись к холодному железу кабины, я слушал гудение локомотива и гладил Барсика за +ушами...^^ + +Барсик посмотрел на меня своими умными глазами и вопросительно замурлыкал — Домой, +ответил я ему — Мы едем домой...^^ +КОНЕЦ^^ + + ---^^ + +История и движок: ^ +Косых Петр a.k.a. gl00my // 2009^^ + +Графика: ^ +Косых Петр, несколько фотографий из открытых источников.^^ + +Музыка: ^ +One fine day // Elwood^ +Revelation // necros^ +New beginning // Purple Motion^ +Ice frontier // Skaven^ +Planete football // Frank Amoros^ +Underwater world II // Slightly Magic^ +Hybrid song // Quazar^ +Hispeed - track whatever // Purple Motion^ +Liberty // Zapper^^ + +Тестеры:^ +Каличев Сергей a.k.a. Pkun^ +Подобаев Владимир a.k.a. zloyvov^^ + + +Если вам понравилась игра, самое лучшее, что вы можете сделать, это написать свою историю на движке instead. :)^^ + +Благодарности:^ +Всем тем, кто не мешал. :)^^ +]], +}; + diff --git a/gb.png b/gb.png new file mode 100644 index 0000000..ff701e1 Binary files /dev/null and b/gb.png differ diff --git a/gfx/bholes.png b/gfx/bholes.png new file mode 100644 index 0000000..1cb9030 Binary files /dev/null and b/gfx/bholes.png differ diff --git a/gfx/cab.png b/gfx/cab.png new file mode 100644 index 0000000..2ba9348 Binary files /dev/null and b/gfx/cab.png differ diff --git a/gfx/chme3.png b/gfx/chme3.png new file mode 100644 index 0000000..c97c00f Binary files /dev/null and b/gfx/chme3.png differ diff --git a/gfx/cor3.png b/gfx/cor3.png new file mode 100644 index 0000000..4c05629 Binary files /dev/null and b/gfx/cor3.png differ diff --git a/gfx/cor4.png b/gfx/cor4.png new file mode 100644 index 0000000..82de013 Binary files /dev/null and b/gfx/cor4.png differ diff --git a/gfx/deepforest.png b/gfx/deepforest.png new file mode 100644 index 0000000..477f59b Binary files /dev/null and b/gfx/deepforest.png differ diff --git a/gfx/entrance.png b/gfx/entrance.png new file mode 100644 index 0000000..7b4094f Binary files /dev/null and b/gfx/entrance.png differ diff --git a/gfx/eside.png b/gfx/eside.png new file mode 100644 index 0000000..2a2a329 Binary files /dev/null and b/gfx/eside.png differ diff --git a/gfx/esidee.png b/gfx/esidee.png new file mode 100644 index 0000000..074e8a6 Binary files /dev/null and b/gfx/esidee.png differ diff --git a/gfx/floor2.png b/gfx/floor2.png new file mode 100644 index 0000000..d0cd5c5 Binary files /dev/null and b/gfx/floor2.png differ diff --git a/gfx/floor3.png b/gfx/floor3.png new file mode 100644 index 0000000..910c49b Binary files /dev/null and b/gfx/floor3.png differ diff --git a/gfx/floor4.png b/gfx/floor4.png new file mode 100644 index 0000000..db4eddc Binary files /dev/null and b/gfx/floor4.png differ diff --git a/gfx/floor5.png b/gfx/floor5.png new file mode 100644 index 0000000..530fcae Binary files /dev/null and b/gfx/floor5.png differ diff --git a/gfx/floor5e.png b/gfx/floor5e.png new file mode 100644 index 0000000..fb5addf Binary files /dev/null and b/gfx/floor5e.png differ diff --git a/gfx/forest.png b/gfx/forest.png new file mode 100644 index 0000000..80451ae Binary files /dev/null and b/gfx/forest.png differ diff --git a/gfx/fromwin1.png b/gfx/fromwin1.png new file mode 100644 index 0000000..62b7b75 Binary files /dev/null and b/gfx/fromwin1.png differ diff --git a/gfx/fromwin2.png b/gfx/fromwin2.png new file mode 100644 index 0000000..e5d8468 Binary files /dev/null and b/gfx/fromwin2.png differ diff --git a/gfx/guard.png b/gfx/guard.png new file mode 100644 index 0000000..02b3f64 Binary files /dev/null and b/gfx/guard.png differ diff --git a/gfx/guard4.png b/gfx/guard4.png new file mode 100644 index 0000000..dbc3fdb Binary files /dev/null and b/gfx/guard4.png differ diff --git a/gfx/guard42.png b/gfx/guard42.png new file mode 100644 index 0000000..e108e3f Binary files /dev/null and b/gfx/guard42.png differ diff --git a/gfx/guy.png b/gfx/guy.png new file mode 100644 index 0000000..946b8a6 Binary files /dev/null and b/gfx/guy.png differ diff --git a/gfx/hall1.png b/gfx/hall1.png new file mode 100644 index 0000000..dc1745f Binary files /dev/null and b/gfx/hall1.png differ diff --git a/gfx/hall2.png b/gfx/hall2.png new file mode 100644 index 0000000..2783721 Binary files /dev/null and b/gfx/hall2.png differ diff --git a/gfx/hall5.png b/gfx/hall5.png new file mode 100644 index 0000000..9145411 Binary files /dev/null and b/gfx/hall5.png differ diff --git a/gfx/handhoh.png b/gfx/handhoh.png new file mode 100644 index 0000000..2f67833 Binary files /dev/null and b/gfx/handhoh.png differ diff --git a/gfx/house-empty.png b/gfx/house-empty.png new file mode 100644 index 0000000..7061fee Binary files /dev/null and b/gfx/house-empty.png differ diff --git a/gfx/house.png b/gfx/house.png new file mode 100644 index 0000000..a6ee54c Binary files /dev/null and b/gfx/house.png differ diff --git a/gfx/ilya.png b/gfx/ilya.png new file mode 100644 index 0000000..69f67fa Binary files /dev/null and b/gfx/ilya.png differ diff --git a/gfx/incar.png b/gfx/incar.png new file mode 100644 index 0000000..c57ac1a Binary files /dev/null and b/gfx/incar.png differ diff --git a/gfx/inshop.png b/gfx/inshop.png new file mode 100644 index 0000000..7b0bf11 Binary files /dev/null and b/gfx/inshop.png differ diff --git a/gfx/inst.png b/gfx/inst.png new file mode 100644 index 0000000..f82c276 Binary files /dev/null and b/gfx/inst.png differ diff --git a/gfx/instback.png b/gfx/instback.png new file mode 100644 index 0000000..52915f2 Binary files /dev/null and b/gfx/instback.png differ diff --git a/gfx/kitchen.png b/gfx/kitchen.png new file mode 100644 index 0000000..71a0612 Binary files /dev/null and b/gfx/kitchen.png differ diff --git a/gfx/kitchencor.png b/gfx/kitchencor.png new file mode 100644 index 0000000..796fd32 Binary files /dev/null and b/gfx/kitchencor.png differ diff --git a/gfx/kpp.png b/gfx/kpp.png new file mode 100644 index 0000000..c220ba5 Binary files /dev/null and b/gfx/kpp.png differ diff --git a/gfx/krysha.png b/gfx/krysha.png new file mode 100644 index 0000000..abc96a4 Binary files /dev/null and b/gfx/krysha.png differ diff --git a/gfx/ladder.png b/gfx/ladder.png new file mode 100644 index 0000000..07b329e Binary files /dev/null and b/gfx/ladder.png differ diff --git a/gfx/lection.png b/gfx/lection.png new file mode 100644 index 0000000..3194597 Binary files /dev/null and b/gfx/lection.png differ diff --git a/gfx/lection2.png b/gfx/lection2.png new file mode 100644 index 0000000..4894c10 Binary files /dev/null and b/gfx/lection2.png differ diff --git a/gfx/lift.png b/gfx/lift.png new file mode 100644 index 0000000..e8474ff Binary files /dev/null and b/gfx/lift.png differ diff --git a/gfx/manroom.png b/gfx/manroom.png new file mode 100644 index 0000000..e2cb2a2 Binary files /dev/null and b/gfx/manroom.png differ diff --git a/gfx/me.png b/gfx/me.png new file mode 100644 index 0000000..a0a6adf Binary files /dev/null and b/gfx/me.png differ diff --git a/gfx/meandgun.png b/gfx/meandgun.png new file mode 100644 index 0000000..b792f21 Binary files /dev/null and b/gfx/meandgun.png differ diff --git a/gfx/nside.png b/gfx/nside.png new file mode 100644 index 0000000..b20a13a Binary files /dev/null and b/gfx/nside.png differ diff --git a/gfx/onwall.png b/gfx/onwall.png new file mode 100644 index 0000000..ac80ab4 Binary files /dev/null and b/gfx/onwall.png differ diff --git a/gfx/pman.png b/gfx/pman.png new file mode 100644 index 0000000..724bae7 Binary files /dev/null and b/gfx/pman.png differ diff --git a/gfx/pmanb.png b/gfx/pmanb.png new file mode 100644 index 0000000..767e080 Binary files /dev/null and b/gfx/pmanb.png differ diff --git a/gfx/podnos.png b/gfx/podnos.png new file mode 100644 index 0000000..7daa489 Binary files /dev/null and b/gfx/podnos.png differ diff --git a/gfx/povar.png b/gfx/povar.png new file mode 100644 index 0000000..0ae7373 Binary files /dev/null and b/gfx/povar.png differ diff --git a/gfx/prof2.png b/gfx/prof2.png new file mode 100644 index 0000000..3c2f856 Binary files /dev/null and b/gfx/prof2.png differ diff --git a/gfx/room4.png b/gfx/room4.png new file mode 100644 index 0000000..7719109 Binary files /dev/null and b/gfx/room4.png differ diff --git a/gfx/servers.png b/gfx/servers.png new file mode 100644 index 0000000..e8acc0f Binary files /dev/null and b/gfx/servers.png differ diff --git a/gfx/shooting.png b/gfx/shooting.png new file mode 100644 index 0000000..5d9f771 Binary files /dev/null and b/gfx/shooting.png differ diff --git a/gfx/shop.png b/gfx/shop.png new file mode 100644 index 0000000..e92353a Binary files /dev/null and b/gfx/shop.png differ diff --git a/gfx/shopbuy.png b/gfx/shopbuy.png new file mode 100644 index 0000000..38df602 Binary files /dev/null and b/gfx/shopbuy.png differ diff --git a/gfx/shopman.png b/gfx/shopman.png new file mode 100644 index 0000000..451f549 Binary files /dev/null and b/gfx/shopman.png differ diff --git a/gfx/sside.png b/gfx/sside.png new file mode 100644 index 0000000..884364c Binary files /dev/null and b/gfx/sside.png differ diff --git a/gfx/sto.png b/gfx/sto.png new file mode 100644 index 0000000..7e9e359 Binary files /dev/null and b/gfx/sto.png differ diff --git a/gfx/sto2.png b/gfx/sto2.png new file mode 100644 index 0000000..a65794e Binary files /dev/null and b/gfx/sto2.png differ diff --git a/gfx/sto3.png b/gfx/sto3.png new file mode 100644 index 0000000..01d44b9 Binary files /dev/null and b/gfx/sto3.png differ diff --git a/gfx/thecat.png b/gfx/thecat.png new file mode 100644 index 0000000..6dbbaa8 Binary files /dev/null and b/gfx/thecat.png differ diff --git a/gfx/toil3.png b/gfx/toil3.png new file mode 100644 index 0000000..e36de63 Binary files /dev/null and b/gfx/toil3.png differ diff --git a/gfx/toil4.png b/gfx/toil4.png new file mode 100644 index 0000000..b08c682 Binary files /dev/null and b/gfx/toil4.png differ diff --git a/gfx/wside.png b/gfx/wside.png new file mode 100644 index 0000000..266313b Binary files /dev/null and b/gfx/wside.png differ diff --git a/main-en.lua b/main-en.lua new file mode 100644 index 0000000..4fde2bd --- /dev/null +++ b/main-en.lua @@ -0,0 +1,47 @@ +game.codepage="UTF-8"; +game.act = 'Can\'t do that.'; +game.inv = 'Hmm... Wrong...'; +game.use = 'Won\'t work...'; +game.dsc = [[Commands:^ + look (or just Enter), act (or just on what), use [on what], go ,^ + back, inv, way, obj, quit, save , load . Tab to autocomplete.^^ +Oleg G., Vladimir P., Ilia R., et al. in the science-fiction and dramatic text adventure by Pyotr K.^^ +THE RETURNING OF THE QUANTUM CAT^^ +Former hacker. He left to live in the forest. But he's back. Back for his cat.^^ +“I JUST CAME TO GET BACK MY CAT...” ^^]]; + +--require "dbg"; + +me().nam = 'Oleg'; +main = room { + nam = 'THE RETURNING OF THE QUANTUM CAT', + pic = 'gfx/thecat.png', + dsc = [[ +Outside my cabin the snow is white again. The wood crackles in the fireplace just like that day... It's the third winter already. +Two winters have passed, but the events I want to tell about are in front of my eyes as if it was yesterday...^^ + +I've been working as a forest warden over ten years. Over ten years I lived in my cabin in the woods, gathering poachers' traps and going to a nearby town once in a week or two... After a Sunday service in the local church I went to a shop to buy the stuff I needed: shotgun ammunition, groats, bread, medicaments...^^ + +I used to be a quite good IT specialist... But that doesn't matter anymore... I hadn't seen a computer screen for a decade and didn't regret it.^^ + +Now I understand that the root of those events lies as far as the early thirties... But I'd better tell everything step by step...^^ + +It was a cold February day, and I was preparing to go to the town as usual...]], +obj = { vobj(1,'Next','{Next}.') }, +act = function() + return walk('home'); +end, +exit = function() + set_music("mus/ofd.xm"); +end, +}; +set_music("mus/new.s3m"); +dofile("ep1-en.lua"); +dofile("ep2-en.lua"); +dofile("ep3-en.lua"); + +me().where = 'eroom'; +--inv():add('mywear'); +--inv():add('gun'); +--inv():add('trap'); + diff --git a/main-ru.lua b/main-ru.lua new file mode 100644 index 0000000..556909e --- /dev/null +++ b/main-ru.lua @@ -0,0 +1,49 @@ +game.codepage="UTF-8"; +game.act = 'Не получается.'; +game.inv = 'Гм.. Странная штука..'; +game.use = 'Не сработает...'; +game.dsc = [[Команды:^ + look(или просто ввод), act <на что> (или просто на что), use <что> [на что], go <куда>,^ + back, inv, way, obj, quit, save , load . Работает автодополнение по табуляции.^^ +Олег Г., Владимир П., Илья.Р., и другие в фантастической и драматической text-adventure Петра К.^^ +ВОЗВРАЩЕНИЕ КВАНТОВОГО КОТА^^ +В прошлом хакер. Он ушел жить в лес. Но он вернулся. Вернулся чтобы забрать своего кота.^^ +- Я ПРОСТО ПРИШЕЛ ЗАБРАТЬ СВОЕГО КОТА... ^^]]; +me().nam = 'Олег'; +main = room { + nam = 'ВОЗВРАЩЕНИЕ КВАНТОВОГО КОТА', + pic = 'gfx/thecat.png', + dsc = [[ +За окном моей хижины снова белеет снег, а в камине так же, как и тогда, потрескивают дрова... Третья зима. +Прошло уже две зимы, но те события, о которых я хочу рассказать, встают перед моими глазами так, +словно это было вчера...^^ + +Я работал лесником уже больше десяти лет. Больше десяти лет я жил в своей хижине, окруженной лесом, собирая +капканы браконьеров и выезжая раз в одну или две недели в близлежащий поселок... После воскресной +службы в местной церкви я заходил в магазинчик и покупал необходимые мне вещи: патроны к дробовику, +крупу, хлеб, лекарства...^^ + +Когда-то я был неплохим компьютерным специалистом... Впрочем, это уже не важно... Десять лет я не видел экрана +монитора, и не жалею об этом.^^ + +Теперь я понимаю, что корни того, что тогда произошло, лежат давно — во второй половине 30-х... Хотя лучше +начать все по-порядку...^^ + +В тот холодный февральский день я, как всегда, собрался ехать в поселок...]], +obj = { vobj(1,'Дальше','{Дальше}.') }, +act = function() + return walk('home'); +end, +exit = function() + set_music("mus/ofd.xm"); +end, +}; +set_music("mus/new.s3m"); +dofile("ep1-ru.lua"); +dofile("ep2-ru.lua"); +dofile("ep3-ru.lua"); + +--me().where = 'eside'; +--inv():add('mywear'); +--inv():add('gun'); +--inv():add('trap'); diff --git a/main-zh.lua b/main-zh.lua new file mode 100644 index 0000000..96431f1 --- /dev/null +++ b/main-zh.lua @@ -0,0 +1,48 @@ +game.codepage="UTF-8"; +game.act = 'Can\'t do that.'; +game.inv = 'Hmm... Wrong...'; +game.use = '不起作用……'; +game.dsc = [[Commands:^ + look (or just Enter), act (or just on what), use [on what], go ,^ + back, inv, way, obj, quit, save , load . Tab to autocomplete.^^ +Oleg G., Vladimir P., Ilia R., et al. in the science-fiction and dramatic text adventure by Pyotr K.^^ +THE RETURNING OF THE QUANTUM CAT^^ +Former hacker. He left to live in the forest. But he's back. Back for his cat.^^ +“I JUST CAME TO GET BACK MY CAT...” ^^]]; + +--require "dbg"; + +me().nam = 'Oleg'; +main = room { + nam = '夺回量子猫', + pic = 'gfx/thecat.png', + dsc = [[ +我的小屋外又是白雪皑皑,壁炉里的木柴噼啪作响,就像那天一样……已经是第三个冬天了。 +虽然已经过去了两个冬天,但我想讲述的事情却历历在目,仿佛就在昨天……^^ + +我当森林管理员已经十多年了。十年来,我一直住在森林里的小木屋里,收集偷猎者的陷阱,一两个星期去一次附近的小镇…… 在当地教堂做完周日礼拜后,我就去商店买我需要的东西:猎枪子弹、燕麦、面包、药品……^^ + +我曾经是个相当不错的 IT 专家…… 但这已经不重要了…… 我有十年没见过电脑屏幕了,但并不后悔。 + +现在我明白了,这些事件的根源远在三十出头的时候…… 不过,我还是一步一步地把事情讲清楚吧……^^ + +那是一个寒冷的二月天,我像往常一样准备去镇上…… +]], + obj = { vobj(1,'Next','{继续}.') }, + act = function() + return walk('home'); + end, + exit = function() + set_music("mus/ofd.xm"); + end, +}; +set_music("mus/new.s3m"); +dofile("ep1-zh.lua"); +dofile("ep2-en.lua"); +dofile("ep3-en.lua"); + +me().where = 'eroom'; +--inv():add('mywear'); +--inv():add('gun'); +--inv():add('trap'); + diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..0861d18 --- /dev/null +++ b/main.lua @@ -0,0 +1,47 @@ +-- $Name:Returning the Quantum Cat$ +-- $Name(ru):Возвращение квантового кота$ +-- $Name(zh):夺回量子猫$ +-- $Version: 1.6.1$ + +if stead.version < "1.5.3" then + walk = _G["goto"] + walkin = goin + walkout = goout + walkback = goback +end + +require "xact" + +gam_lang = { + ru = 'Язык', + en = 'Language', + zh = '语言', +} + +gam_title = { + ru = 'Возвращение квантового кота', + en = 'Returning the Quantum Cat', + zh = '夺回量子猫', +} + +if not LANG or not gam_lang[LANG] then + LANG = "en" +end + +gam_lang = gam_lang[LANG] +gam_title = gam_title[LANG] + +main = room { + nam = gam_title; + forcedsc = true; + dsc = txtc ( + txtb(gam_lang)..'^^'.. + img('gb.png')..' '..[[{en:English}^]].. + img('ru.png')..' '..[[{ru:Русский}^]].. + img('cn.png')..' '..[[{zh:中文(简体)}^]]); + obj = { + xact("ru", code [[ gamefile('main-ru.lua', true); return walk 'main' ]]); + xact("en", code [[ gamefile('main-en.lua', true); return walk 'main' ]]); + xact("zh", code [[ gamefile('main-zh.lua', true); return walk 'main' ]]); + } +} diff --git a/mus/foot.mod b/mus/foot.mod new file mode 100644 index 0000000..2ded75e Binary files /dev/null and b/mus/foot.mod differ diff --git a/mus/hispeed.s3m b/mus/hispeed.s3m new file mode 100644 index 0000000..98f8fea Binary files /dev/null and b/mus/hispeed.s3m differ diff --git a/mus/hybrid.xm b/mus/hybrid.xm new file mode 100644 index 0000000..2f8d2eb Binary files /dev/null and b/mus/hybrid.xm differ diff --git a/mus/ice.s3m b/mus/ice.s3m new file mode 100644 index 0000000..d7ac6ef Binary files /dev/null and b/mus/ice.s3m differ diff --git a/mus/liberty.s3m b/mus/liberty.s3m new file mode 100644 index 0000000..a36f05c Binary files /dev/null and b/mus/liberty.s3m differ diff --git a/mus/new.s3m b/mus/new.s3m new file mode 100644 index 0000000..e39b131 Binary files /dev/null and b/mus/new.s3m differ diff --git a/mus/ofd.xm b/mus/ofd.xm new file mode 100644 index 0000000..7d0a831 Binary files /dev/null and b/mus/ofd.xm differ diff --git a/mus/revel.s3m b/mus/revel.s3m new file mode 100644 index 0000000..ca166bd Binary files /dev/null and b/mus/revel.s3m differ diff --git a/mus/under.s3m b/mus/under.s3m new file mode 100644 index 0000000..8b34df0 Binary files /dev/null and b/mus/under.s3m differ diff --git a/readme-unix.txt b/readme-unix.txt new file mode 100644 index 0000000..c78d246 --- /dev/null +++ b/readme-unix.txt @@ -0,0 +1 @@ +Unzip this archive into ~/.instead/games/ diff --git a/readme-windows.txt b/readme-windows.txt new file mode 100644 index 0000000..5d976ce --- /dev/null +++ b/readme-windows.txt @@ -0,0 +1 @@ + instead games. diff --git a/ru.png b/ru.png new file mode 100644 index 0000000..47da421 Binary files /dev/null and b/ru.png differ diff --git a/theme.ini b/theme.ini new file mode 100644 index 0000000..35010aa --- /dev/null +++ b/theme.ini @@ -0,0 +1,91 @@ +; $Name: Default_wide$ +; $Name(ru): Default_wide$ +; $Name(uk): Default_wide$ +; $Name(es): Default_wide$ +; $Name(it): Default_wide$ + +scr.w = 800 +scr.h = 600 +scr.dpi = 96 +scr.gfx.scalable = 1 +scr.scale_aware = 0 +scr.gfx.scale = 1.0 +scr.gfx.h = -1 + +scr.gfx.bg = default_wide/bg.png +scr.col.bg = white +scr.col.brd = black +scr.gfx.cursor.x = 2 +scr.gfx.cursor.y = 2 +scr.gfx.cursor.normal = default_wide/cursor.png +scr.gfx.cursor.use = default_wide/cursor-use.png +scr.gfx.pad = 16 +scr.gfx.mode = embedded + +win.align = justify +win.x = 48 +win.y = 8 +win.w = 500 +win.h = 568 + +;win.fnt.name = {default_wide/SourceHanSansCN-Regular,default_wide/sans,default_wide/sans-b,default_wide/sans-i,default_wide/sans-bi}.ttf +win.fnt.name = {default_wide/SourceHanSansCN-Regular}.ttf +win.fnt.size = 16 +win.fnt.height = 1.0 +win.gfx.up = default_wide/aup.png +win.gfx.down = default_wide/adown.png +win.col.fg = black +win.col.link = #b02c00 +win.col.alink = #606060 +win.up.x = -1 +win.up.y = -1 +win.down.x = -1 +win.down.y = -1 +win.scroll.mode = 2 +win.ways.mode = top + +inv.x = 620 +inv.y = 8 +inv.w = 144 +inv.h = 564 + +;inv.fnt.name = {default_wide/SourceHanSansCN-Regular,default_wide/sans,default_wide/sans-b,default_wide/sans-i,default_wide/sans-bi}.ttf +inv.fnt.name = {default_wide/SourceHanSansCN-Regular}.ttf +inv.fnt.size = 16 +inv.fnt.height = 1.0 +inv.gfx.up = default_wide/aup.png +inv.gfx.down = default_wide/adown.png +inv.col.fg = #CCCCCC +inv.col.link = #CCCCCC +inv.col.alink = goldenrod +inv.mode = vertical-left +inv.up.x = -1 +inv.up.y = -1 +inv.down.x = -1 +inv.down.y = -1 + +menu.col.bg = white +menu.col.fg = black +menu.col.link = blue +menu.col.alink = red +menu.col.alpha = 220 +menu.col.border = black +menu.bw = 1 +;menu.fnt.name = {default_wide/SourceHanSansCN-Regular,default_wide/sans,default_wide/sans-i}.ttf +menu.fnt.name = {default_wide/SourceHanSansCN-Regular}.ttf +menu.fnt.size = 16 +menu.fnt.height = 1.0 +menu.gfx.button = default_wide/menu.png +menu.button.x = 776 +menu.button.y = 576 + + +snd.click = default_wide/click.wav ; default_wide/click.ogg + +; 800x480 version +;scr.w = 800 +;scr.h = 480 +;win.h = 448 +;inv.h = 448 +;menu.button.y = 456 +