17rooms/room16.lua

1874 lines
76 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

room {
nam = "room16_mystical";
title = "Таинственная комната";
firsttime = 1;
state = 0;
dsc = function(s)
if s.state == 0 then
if s.firsttime == 1 then
p ("Комната выглядит таинственно: в углу стоит большой шкаф, в другом углу стоит пюпитр, в третьем углу находится небольшой постамент, а четвёртый угол вообще пустой! Из щели под потолком сочится тусклый свет, придающий комнате ещё больше таинственности.");
s.firsttime = 0;
else
p ("По углам стоят большой шкаф, пюпитр и постамент, а под потолком узкая щель, таинственный свет плавно ниспадает на паркет, постеленный на полу.");
end;
mp:content(_'room16_parquet')
if(_'room16_wardrobe':has "open") then mp:content(_'room16_wardrobe') end;
else
p ("Распахнутый шкаф стоит у стены напротив пюпитра. У ещё одной стены нервно прячется постамент, а у четвёртой стены стоишь ты.");
if(_'room16_wall'.state == 2) then p('В стене виднеется небольшая дыра.'); end;
if(_'room16_wall'.state == 3) then p('В стене просто огромная дыра!'); end;
mp:content(_'room16_parquet')
end;
end;
description = function(s)
if s.state == 0 then
if s.firsttime == 1 then
p ("Комната выглядит таинственно: в углу стоит большой шкаф, в другом углу стоит пюпитр, в третьем углу находится небольшой постамент, а четвёртый угол вообще пустой! Из щели под потолком сочится тусклый свет, придающий комнате ещё больше таинственности.");
s.firsttime = 0;
else
p ("По углам стоят большой шкаф, пюпитр и постамент, а под потолком узкая щель, таинственный свет плавно ниспадает на паркет, постеленный на полу.");
end;
mp:content(_'room16_parquet')
if(_'room16_wardrobe':has "open") then mp:content(_'room16_wardrobe') end;
else
p ("Распахнутый шкаф стоит у стены напротив пюпитра, на котором сидит тётушка Агата и точит когти. У ещё одной стены нервно прячется постамент, а у четвёртой стены стоишь ты.");
if(_'room16_wall'.state == 2) then p('В стене виднеется небольшая дыра.'); end;
if(_'room16_wall'.state == 3) then p('В стене просто огромная дыра!'); end;
end;
end;
e_to = 'room14_secondfloor';
before_Listen = function()
if(_'room16_wardrobe'.state >= 4) then
p "Тишина."
else
p "Что-то подозрительно поскрипывает в шкафу.";
end;
end;
before_Smell = function()
if(_'room16_wardrobe'.state >= 4) then
p "Пахнет вечностью."
else
p "Из шкафа идёт еле уловимый запах чего-то необычайного.";
end;
end;
before_Walk = function(s, w)
if (w^'@e_to' and s.state == 0) then
if(_'room16_wardrobe'.state == 1) then _'room16_wardrobe'.state = 0 end;
_'room16_wardrobe':attr '~open'
remove(_'room16_o',pl)
remove(_'room16_x',pl)
DaemonStop 'room16_AI'
return false;
elseif (s.state == 1 and (w^'@e_to' or w^'@out_to')) then
if (_'room16_wardrobe'.state >= 4) then
return false
end;
if w^'@out_to' and (_'room16_wall'.state == 3) then
_'room16_AI'.daemon_stage = 9
else
p('Выхода нет!')
end;
return true;
end;
return false;
end;
before_Exit = function(s)
if (s.state == 0) or (_'room16_wardrobe'.state >= 4) then
return false;
else
mp:xaction('Walk','@out_to')
end;
end;
after_Drop = function(s, w)
if(_'room16_wardrobe'.state < 4) then
move(w, 'room16_parquet')
else
move(w, 'room16_wardrobe')
end;
return false
end;
["before_PutOn,Insert"] = function(s, w, i)
if i == _'room16_witch' then
-- "положить в/на тетю что-то" вызывает "резать тетю чем-то"
mp:xaction('Cut', i, w)
else
return false
end
end;
obj = { 'room16_wardrobe','room16_parquet','room16_bookstand','room16_pedestal','room16_slit','room16_walls' };
-- obj = { 'statuetka','book','dagger','room16_wardrobe','room16_parquet','room16_bookstand','room16_pedestal','room16_slit' };
--obj = { 'room16_wardrobe','room16_parquet','room16_bookstand','room16_pedestal','room16_slit' };
}
obj {
-"статуэтка, стержень";
nam = "statuetka";
description = "Статуэтка в виде цилиндрического стержня, вокруг которого обвивается змея.";
score=false;
after_Take = function(s)
if not s.score then
mp.score=mp.score+1;
end;
_'statuetka'.score=true;
return false;
end;
}
obj {
-"таинственный кинжал, кинжал, рукоять";
nam = "dagger";
description = "Таинственный кинжал, на рукояти которого изображены глаза и язык змеи.";
}
obj {
-"толстая книга,книга, обложка";
nam = "book";
state = 0;
description = function(s)
if (_'room16_bookstand'.state == 0) then
p ("Толстая старая книга. Страницы как будто бы склеены: её невозможно открыть.")
end;
if (_'room16_bookstand'.state == 1) then
if(_'room16_bookstand'.stateA == 0) then
p ("Книга лежит на пюпитре. На её обложке изображена змея, обвивающая кинжал.")
end;
if(_'room16_bookstand'.stateA == 1) then
p ("Книга лежит на пюпитре. Она открыта. На развороте нарисован шкаф: одна половина на левой странице, одна половина на правой.")
s.state = 1;
end;
if(_'room16_bookstand'.stateA == 2) then
p ("Книга лежит на пюпитре. Она разрезана пополам между створок нарисованного шкафа.")
end;
end;
end;
before_Cut = function(s, w)
if w == _'dagger' then
if(_'room16_bookstand'.stateA == 1) then
if(_'book'.state == 1) then
p ("Ты вставляешь кинжал между створок нарисованного шкафа и режешь книгу пополам. Со стороны шкафа слышится треск.")
_'room16_bookstand'.stateA = 2;
mp.score=mp.score+1;
else
p ("Надо бы внимательно осмотреть книгу прежде, чем её испортить.")
end;
else
if(_'room16_bookstand'.stateA == 2) then
p ("Книга уже разрезана.")
else
p("Обложка книги слишком толстая: кинжал даже не может её поцарапать. Расковырять склеенные страницы книги тоже не удаётся.")
end;
end;
else
if w then
p ("Книга прочная, как дерево!")
else
p ("Не совсем понятно, чем.")
end;
end;
end;
score=false;
after_Take = function(s)
if not s.score then
mp.score=mp.score+1;
end;
_'book'.score=true;
return false;
end;
}
obj {
-"крестик, крест";
nam = "room16_x";
title = "Крестик";
before_Exam = function(s)
if(_'room16_a1'.state == 1 or _'room16_a2'.state == 1 or _'room16_a3'.state == 1 or _'room16_b1'.state == 1 or _'room16_b2'.state == 1 or _'room16_b3'.state == 1 or _'room16_c1'.state == 1 or _'room16_c2'.state == 1 or _'room16_c3'.state == 1) then
p 'Крестик как крестик.'
else
p 'Здесь нет крестиков.'
end;
end;
before_Insert = function(s, w)
if (w == _'room16_a1' or w == _'room16_a2' or w == _'room16_a3' or w == _'room16_b1' or w == _'room16_b2' or w == _'room16_b3' or w == _'room16_c1' or w == _'room16_c2' or w == _'room16_c3') then
if(_'room16_wardrobe'.state >= 4) then
if(_'room16_wardrobe'.turn == 0) then
return false;
else
p 'Сейчас не твой ход!'
end;
else
p('Ты играешь ноликами!')
end;
else
p("Что??")
end;
end;
before_Drop = function()
p ('Надо бросать пить, а не крестики бросать.')
end;
["before_Take,Remove,Enter"] = function()
p ('Что-что?')
end;
before_Cut = function(s, w)
mp:xaction('PutOn', s, w)
end;
before_PutOn = function(s, w)
if (w == _'room16_a1' or w == _'room16_a2' or w == _'room16_a3' or w == _'room16_b1' or w == _'room16_b2' or w == _'room16_b3' or w == _'room16_c1' or w == _'room16_c2' or w == _'room16_c3') then
if(_'room16_wardrobe'.state >= 4) then
if(_'room16_wardrobe'.turn == 0) then
return false;
else
p 'Сейчас не твой ход!'
end;
else
p('Ты играешь ноликами!')
end;
else
p("Что??")
end;
end;
}:attr 'concealed'
obj {
-"нолик, ноль";
nam = "room16_o";
title = "Нолик";
before_Exam = function(s)
if(_'room16_a1'.state == 2 or _'room16_a2'.state == 2 or _'room16_a3'.state == 2 or _'room16_b1'.state == 2 or _'room16_b2'.state == 2 or _'room16_b3'.state == 2 or _'room16_c1'.state == 2 or _'room16_c2'.state == 2 or _'room16_c3'.state == 2) then
p 'Нолик как нолик.'
else
p 'Здесь нет ноликов.'
end;
end;
before_Insert = function(s, w)
if (w == _'room16_a1' or w == _'room16_a2' or w == _'room16_a3' or w == _'room16_b1' or w == _'room16_b2' or w == _'room16_b3' or w == _'room16_c1' or w == _'room16_c2' or w == _'room16_c3') then
if(_'room16_wardrobe'.state < 4) then
return false;
else
p('Теперь ты играешь крестиками!')
end;
else
p("Что??")
end;
end;
before_Drop = function()
p ('Надо бросать пить, а не нолики бросать.')
end;
["before_Take,Remove,Enter"] = function()
p ('Что-что?')
end;
before_Cut = function(s, w)
mp:xaction('PutOn', s, w)
end;
before_PutOn = function(s, w)
if (w == _'room16_a1' or w == _'room16_a2' or w == _'room16_a3' or w == _'room16_b1' or w == _'room16_b2' or w == _'room16_b3' or w == _'room16_c1' or w == _'room16_c2' or w == _'room16_c3') then
if(_'room16_wardrobe'.state < 4) then
return false;
else
p('Теперь ты играешь крестиками!')
end;
else
p("Что??")
end;
end;
}:attr 'concealed'
obj {
-"паркет, пол";
nam = "room16_parquet";
title = "Паркет";
state = 0;
description = function(s)
if s.state == 0 then
p ("Паркет на полу выглядит мрачно и таинственно. Одна занятная деталь: на фоне остальной старой мебели он выглядит новым и даже глянцеватым.")
mp:content(s)
end;
end;
}:attr 'scenery, static, supporter'
obj {
--"шкаф, дверцы";
nam = "room16_wardrobe";
word = function(s)
if(s.state == 1 or s.state == 3) then
return -"шкаф, дверцы, строки, столбцы, таблиц*"
else
return -"шкаф, дверцы"
end;
end;
title = "Шкаф";
state = 0;
turn = 0;
firsttime = 0;
firsto = 0;
description = function(s)
if s.state == 0 then
if(_'room16_bookstand'.stateA == 2) then
p ("Большой и старый шкаф. Его дверцы неплотно закрыты.")
else
p ("Большой и старый шкаф. Его дверцы плотно закрыты.")
end;
end;
if s.state == 1 then
_'room16_AI':describe()
end;
if s.state == 2 then
p ("Большой и старый шкаф. Его дверцы неплотно закрыты.")
end;
if s.state == 3 then
p ("Большой и старый шкаф, в котором пряталась тётушка Агата. Его дверцы распахнуты.")
end;
if s.state >= 4 then
p 'Откуда-то в шкаф проникает свет. На стенке шкафа расчерчена таблица 3 на 3.'
_'room16_AI':describe()
end;
end;
before_Open = function(s)
if(_'room16_mystical'.state == 0) then
if(s.state == 1) then
p('Шкаф уже открыт.')
_'room16_AI':describe()
else
if(s.state == 2) then
walk 'room16_cutscene'
else
if(_'room16_bookstand'.stateA == 2) then
put(_'room16_o',pl)
put(_'room16_x',pl)
s.state = 1
s.turn = 0
s:attr 'open'
if(s.firsttime == 0) then
if(_'room16_AI'.game == 0) then
p ('Ты открываешь дверцы шкафа и видишь, что он пуст. На задней стенке шкафа расчерчена таинственная таблица 3 на 3, её строки подписаны буквами "А", "Б" и "В", а столбцы пронумерованы "1", "2" и "3". На центральном поле стоит крестик: кто-то выцарапал его прямо на стенке шкафа. "Похоже на игру," -- думаешь ты -- "Можно куда-нибудь поставить нолик."')
else
p ('Ты открываешь дверцы шкафа и видишь, что он пуст. Тем не менее, тебе кажется, что в нём кто-то есть, просто почему-то его (или её) пока не видно. Таинственно всё это. Кстати, на стенке шкафа всё ещё расчерчена таблица, и снова в ней только один крестик на поле Б2.')
end;
s.firsttime = 1
_'room16_b2'.state = 1
else
p ("Ты открываешь дверцы шкафа.")
_'room16_AI':describe()
end;
else
p ("На дверцах шкафа нет ручек, поэтому ты пытаешься просунуть пальцы в щель между дверок, но ничего не получается: дверцы наглухо закрыты.");
end;
end;
end;
else
if(s.state == 3) then
p('Шкаф уже открыт.')
_'room16_AI':describe()
else
p('Ты пытаешься открыть дверцы шкафа, но они как будто куда-то пропали! Похоже, ты в ловушке.')
end;
end;
end;
before_Close = function(s)
if(s.state ~= 3) then
if(_'room16_wardrobe'.turn == 1) then _'room16_AI':calculate() end;
s.state = 0
return false
else
p('Не стоит тратить на это время!')
end;
end;
after_Enter = function(s)
p('Как только ты прячешься в шкаф, его двери сами собой захлопываются.')
_'room16_AI'.daemon_stage = 10;
_'room16_wardrobe':attr '~open'
_'room16_wardrobe':attr '~openable'
_'room16_wardrobe':attr 'light'
_'room16_wardrobe'.state = 4
_'room16_AI'.state = 0
_'room16_AI'.win = 0
_'room16_wardrobe'.turn = 0
_'room16_a1'.state = 0
_'room16_a2'.state = 0
_'room16_a3'.state = 0
_'room16_b1'.state = 0
_'room16_b2'.state = 0
_'room16_b3'.state = 0
_'room16_c1'.state = 0
_'room16_c2'.state = 0
_'room16_c3'.state = 0
move(_'room16_a1',_'room16_wardrobe')
move(_'room16_a2',_'room16_wardrobe')
move(_'room16_a3',_'room16_wardrobe')
move(_'room16_b1',_'room16_wardrobe')
move(_'room16_b2',_'room16_wardrobe')
move(_'room16_b3',_'room16_wardrobe')
move(_'room16_c1',_'room16_wardrobe')
move(_'room16_c2',_'room16_wardrobe')
move(_'room16_c3',_'room16_wardrobe')
move(_'room16_x',pl)
move(_'room16_o',pl)
move(pl,'room16_wardrobe')
end;
inside_dsc = function(s)
p 'Ты в шкафу.'
_'room16_AI':describe()
end;
before_Exit = function(s)
p('Ты пытаешься открыть дверцы шкафа, но они как будто куда-то пропали! Похоже, ты в ловушке.')
end;
obj = { 'room16_a1','room16_a2','room16_a3','room16_b1','room16_b2','room16_b3','room16_c1','room16_c2','room16_c3' };
}:attr 'scenery, static, closed, openable, container'
obj {
-"постамент";
nam = "room16_pedestal";
title = "Постамент";
state = 0;
stateA = 0;
description = function(s)
if s.state == 0 then
p ("Это загадочный постамент. Он выглядит совершенно бесполезным, но придаёт комнате таинственности.")
mp:content(s)
end;
if s.state == 1 then
if s.stateA == 0 then
p ("Ты замечаешь, что на постаменте появился паз цилиндрической формы, в глубине которого нарисована змея, обвивающая кинжал.")
s.stateA = 1
else
p ("Это загадочный постамент. В нём виден паз цилиндрической формы, в глубине которого нарисована змея, обвивающая кинжал.")
end;
mp:content(s)
end;
if s.state == 2 then
p ("Это загадочный постамент. В пазу намертво сидит статуэтка в виде змеи, обвивающей кинжал.")
mp:content(s)
end;
end;
before_Receive = function(s, w)
if s.state == 1 then
if w == _'statuetka' then
p ("Ты ставишь статуэтку в паз на постаменте, и она намертво входит внутрь. Слышится загадочный треск со стороны пюпитра.")
move(w, s)
s.state = 2
_'room16_bookstand'.stateA = 1
_'statuetka':attr 'scenery'
mp.score=mp.score+1;
else
p ("Ты кладешь ", w:noun'вн', " на постамент, но таинственная сила отталкивает ", w:noun'вн', " обратно.")
end;
else
p ("Таинственная сила отталкивает ", w:noun'вн', " обратно.")
end;
end;
}:attr 'scenery, static, supporter'
obj {
-"пюпитр";
nam = "room16_bookstand";
title = "Пюпитр";
state = 0;
stateA = 0;
description = function(s)
if(_'room16_mystical'.state == 0) then
if s.state == 0 then
p ("Это пюпитр, он выглядит загадочно.")
mp:content(s)
end;
if s.state == 1 then
if s.stateA == 0 then
p ("Это пюпитр, нём лежит книга. На обложке книги изображена змея, обвивающая кинжал.")
end;
if s.stateA == 1 then
p ("Это пюпитр, на нём лежит книга. Ты замечаешь, что она сама собой открылась.")
end;
if s.stateA == 2 then
p ("Это пюпитр, на нём лежит разрезанная пополам книга.")
end;
mp:content(s)
end;
else
p('На пюпитре лежит книга, а ещё там сидит тётушка Агата и точит когти.')
end;
end;
before_Receive = function(s, w)
if(_'room16_mystical'.state == 0) then
if s.state == 0 then
if w == _'book' then
p ("Когда книга оказывается близко к поверхности пюпитра, неведомая сила вырывает её из твоих рук и присасывает к пюпитру. Кажется, книгу больше не получится взять. Пока ты обо всём этом думаешь, на обложке книги вырисовывается символ змеи, обвивающей кинжал. А ещё слышится какой-то скрип со стороны постамента.")
move(w, s)
s.state = 1
_'room16_pedestal'.state = 1
_'book':attr 'scenery'
mp.score=mp.score+1;
else
p ("Ты кладешь ", w:noun'вн', " на пюпитр, но таинственная сила отталкивает ", w:noun'вн', " обратно.")
end;
else
p ("На пюпитре уже лежит книга.")
end;
else
p('Не стоит приближаться к нему, пока там сидит тётушка!')
end;
end;
}:attr 'scenery, static, supporter'
obj {
-"щель";
nam = "room16_slit";
title = "Щель";
state = 0;
description = function(s)
if s.state == 0 then
p ("Узкая щель под потолком, сквозь которую проникает тусклый таинственный свет.")
end;
end;
}:attr 'scenery, static'
obj {
-"поле А1, А1, поле а1, а1";
nam = "room16_a1";
title = "Поле А1";
state = 0;
description = function(s)
if s.state == 0 then
if(_'room16_wardrobe'.state >= 4) then
p ("Поле А1 не заполнено. Сюда можно поставить крестик.")
else
p ("Поле А1 не заполнено. Сюда можно поставить нолик.")
end;
end;
if s.state == 1 then
p ("На поле А1 стоит крестик.")
end;
if s.state == 2 then
p ("На поле А1 стоит нолик.")
end;
end;
before_Receive = function(s, w)
if (w == _'room16_o') then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь нолик на поле А1.')
s.state = 2
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
_'room16_AI':continue()
else
p ('Чтобы поставить нолик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
else
p ('Ты уже поставила один нолик в этом ходу. Нельзя же играть не по правилам!')
end;
else
if (w == _'room16_x' and _'room16_wardrobe'.state >= 4) then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь крестик на поле А1.')
s.state = 1
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
else
p ('Чтобы поставить крестик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
end;
else
p ('Что??')
end;
end;
end;
}:attr 'scenery, static, supporter'
obj {
-"поле А2, А2, поле а2, а2";
nam = "room16_a2";
title = "Поле А2";
state = 0;
description = function(s)
if s.state == 0 then
p ("Поле А2 не заполнено. Сюда можно поставить нолик.")
end;
if s.state == 1 then
p ("На поле А2 стоит крестик.")
end;
if s.state == 2 then
p ("На поле А2 стоит нолик.")
end;
end;
before_Receive = function(s, w)
if (w == _'room16_o') then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь нолик на поле А2.')
s.state = 2
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
_'room16_AI':continue()
else
p ('Чтобы поставить нолик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
else
p ('Ты уже поставила один нолик в этом ходу. Нельзя же играть не по правилам!')
end;
else
if (w == _'room16_x' and _'room16_wardrobe'.state >= 4) then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь крестик на поле А2.')
s.state = 1
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
else
p ('Чтобы поставить крестик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
end;
else
p ('Что??')
end;
end;
end;
}:attr 'scenery, static, supporter'
obj {
-"поле А3, А3, поле а3, а3";
nam = "room16_a3";
title = "Поле А3";
state = 0;
description = function(s)
if s.state == 0 then
p ("Поле А3 не заполнено. Сюда можно поставить нолик.")
end;
if s.state == 1 then
p ("На поле А3 стоит крестик.")
end;
if s.state == 2 then
p ("На поле А3 стоит нолик.")
end;
end;
before_Receive = function(s, w)
if (w == _'room16_o') then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь нолик на поле А3.')
s.state = 2
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
_'room16_AI':continue()
else
p ('Чтобы поставить нолик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
else
p ('Ты уже поставила один нолик в этом ходу. Нельзя же играть не по правилам!')
end;
else
if (w == _'room16_x' and _'room16_wardrobe'.state >= 4) then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь крестик на поле А3.')
s.state = 1
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
else
p ('Чтобы поставить крестик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
end;
else
p ('Что??')
end;
end;
end;
}:attr 'scenery, static, supporter'
obj {
-"поле Б1, Б1, поле б1, б1";
nam = "room16_b1";
title = "Поле Б1";
state = 0;
description = function(s)
if s.state == 0 then
p ("Поле Б1 не заполнено. Сюда можно поставить нолик.")
end;
if s.state == 1 then
p ("На поле Б1 стоит крестик.")
end;
if s.state == 2 then
p ("На поле Б1 стоит нолик.")
end;
end;
before_Receive = function(s, w)
if (w == _'room16_o') then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь нолик на поле Б1.')
s.state = 2
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
_'room16_AI':continue()
else
p ('Чтобы поставить нолик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
else
p ('Ты уже поставила один нолик в этом ходу. Нельзя же играть не по правилам!')
end;
else
if (w == _'room16_x' and _'room16_wardrobe'.state >= 4) then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь крестик на поле Б1.')
s.state = 1
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
else
p ('Чтобы поставить крестик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
end;
else
p ('Что??')
end;
end;
end;
}:attr 'scenery, static, supporter'
obj {
-"поле Б2, Б2, поле б2, б2";
nam = "room16_b2";
title = "Поле Б2";
state = 0;
description = function(s)
if s.state == 0 then
p ("Поле Б2 не заполнено. Сюда можно поставить нолик.")
end;
if s.state == 1 then
p ("На поле Б2 стоит крестик.")
end;
if s.state == 2 then
p ("На поле Б2 стоит нолик.")
end;
end;
before_Receive = function(s, w)
if (w == _'room16_o') then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь нолик на поле Б2.')
s.state = 2
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
_'room16_AI':continue()
else
p ('Чтобы поставить нолик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
else
p ('Ты уже поставила один нолик в этом ходу. Нельзя же играть не по правилам!')
end;
else
if (w == _'room16_x' and _'room16_wardrobe'.state >= 4) then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь крестик на поле Б2.')
s.state = 1
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
else
p ('Чтобы поставить крестик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
end;
else
p ('Что??')
end;
end;
end;
}:attr 'scenery, static, supporter'
obj {
-"поле Б3, Б3, поле б3, б3";
nam = "room16_b3";
title = "Поле Б3";
state = 0;
description = function(s)
if s.state == 0 then
p ("Поле Б3 не заполнено. Сюда можно поставить нолик.")
end;
if s.state == 1 then
p ("На поле Б3 стоит крестик.")
end;
if s.state == 2 then
p ("На поле Б3 стоит нолик.")
end;
end;
before_Receive = function(s, w)
if (w == _'room16_o') then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь нолик на поле Б3.')
s.state = 2
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
_'room16_AI':continue()
else
p ('Чтобы поставить нолик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
else
p ('Ты уже поставила один нолик в этом ходу. Нельзя же играть не по правилам!')
end;
else
if (w == _'room16_x' and _'room16_wardrobe'.state >= 4) then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь крестик на поле Б3.')
s.state = 1
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
else
p ('Чтобы поставить крестик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
end;
else
p ('Что??')
end;
end;
end;
}:attr 'scenery, static, supporter'
obj {
-"поле В1, В1, поле в1, в1";
nam = "room16_c1";
title = "Поле В1";
state = 0;
description = function(s)
if s.state == 0 then
p ("Поле В1 не заполнено. Сюда можно поставить нолик.")
end;
if s.state == 1 then
p ("На поле В1 стоит крестик.")
end;
if s.state == 2 then
p ("На поле В1 стоит нолик.")
end;
end;
before_Receive = function(s, w)
if (w == _'room16_o') then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь нолик на поле В1.')
s.state = 2
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
_'room16_AI':continue()
else
p ('Чтобы поставить нолик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
else
p ('Ты уже поставила один нолик в этом ходу. Нельзя же играть не по правилам!')
end;
else
if (w == _'room16_x' and _'room16_wardrobe'.state >= 4) then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь крестик на поле В1.')
s.state = 1
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
else
p ('Чтобы поставить крестик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
end;
else
p ('Что??')
end;
end;
end;
}:attr 'scenery, static, supporter'
obj {
-"поле В2, В2, поле в2, в2";
nam = "room16_c2";
title = "Поле В2";
state = 0;
description = function(s)
if s.state == 0 then
p ("Поле В2 не заполнено. Сюда можно поставить нолик.")
end;
if s.state == 1 then
p ("На поле В2 стоит крестик.")
end;
if s.state == 2 then
p ("На поле В2 стоит нолик.")
end;
end;
before_Receive = function(s, w)
if (w == _'room16_o') then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь нолик на поле В2.')
s.state = 2
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
_'room16_AI':continue()
else
p ('Чтобы поставить нолик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
else
p ('Ты уже поставила один нолик в этом ходу. Нельзя же играть не по правилам!')
end;
else
if (w == _'room16_x' and _'room16_wardrobe'.state >= 4) then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь крестик на поле В2.')
s.state = 1
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
else
p ('Чтобы поставить крестик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
end;
else
p ('Что??')
end;
end;
end;
}:attr 'scenery, static, supporter'
obj {
-"поле В3, В3, поле в3, в3";
nam = "room16_c3";
title = "Поле В3";
state = 0;
description = function(s)
if s.state == 0 then
p ("Поле В3 не заполнено. Сюда можно поставить нолик.")
end;
if s.state == 1 then
p ("На поле В3 стоит крестик.")
end;
if s.state == 2 then
p ("На поле В3 стоит нолик.")
end;
end;
before_Receive = function(s, w)
if (w == _'room16_o') then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь нолик на поле В3.')
s.state = 2
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
_'room16_AI':continue()
else
p ('Чтобы поставить нолик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
else
p ('Ты уже поставила один нолик в этом ходу. Нельзя же играть не по правилам!')
end;
else
if (w == _'room16_x' and _'room16_wardrobe'.state >= 4) then
if (_'room16_wardrobe'.turn == 0) then
if (s.state == 0) then
if (pl:have(_'dagger')) then
p ('Остриём кинжала ты выцарапываешь крестик на поле В3.')
s.state = 1
_'room16_wardrobe'.turn = 1
_'room16_AI'.state = _'room16_AI'.state + 1
else
p ('Чтобы поставить крестик, нужен кинжал.')
end;
else
p ('Это поле уже заполнено. Нельзя же играть не по правилам!')
end;
end;
else
p ('Что??')
end;
end;
end;
}:attr 'scenery, static, supporter'
obj {
-"ИИ комнаты 16";
nam = "room16_AI";
title = "ИИ комнаты 16";
state = 0;
game = 0;
win = 0;
daemon_stage = 0;
describe = function()
if(_'room16_a1'.state == 1) then
p('На поле А1 стоит крестик.')
end;
if(_'room16_a1'.state == 2) then
p('На поле А1 стоит нолик.')
end;
if(_'room16_a2'.state == 1) then
p('На поле А2 стоит крестик.')
end;
if(_'room16_a2'.state == 2) then
p('На поле А2 стоит нолик.')
end;
if(_'room16_a3'.state == 1) then
p('На поле А3 стоит крестик.')
end;
if(_'room16_a3'.state == 2) then
p('На поле А3 стоит нолик.')
end;
if(_'room16_b1'.state == 1) then
p('На поле Б1 стоит крестик.')
end;
if(_'room16_b1'.state == 2) then
p('На поле Б1 стоит нолик.')
end;
if(_'room16_b2'.state == 1) then
p('На поле Б2 стоит крестик.')
end;
if(_'room16_b2'.state == 2) then
p('На поле Б2 стоит нолик.')
end;
if(_'room16_b3'.state == 1) then
p('На поле Б3 стоит крестик.')
end;
if(_'room16_b3'.state == 2) then
p('На поле Б3 стоит нолик.')
end;
if(_'room16_c1'.state == 1) then
p('На поле В1 стоит крестик.')
end;
if(_'room16_c1'.state == 2) then
p('На поле В1 стоит нолик.')
end;
if(_'room16_c2'.state == 1) then
p('На поле В2 стоит крестик.')
end;
if(_'room16_c2'.state == 2) then
p('На поле В2 стоит нолик.')
end;
if(_'room16_c3'.state == 1) then
p('На поле В3 стоит крестик.')
end;
if(_'room16_c3'.state == 2) then
p('На поле В3 стоит нолик.')
end;
if(_'room16_a1'.state == 1 and _'room16_a2'.state == 1 and _'room16_a3'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_a1'.state == 1 and _'room16_b1'.state == 1 and _'room16_c1'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_a3'.state == 1 and _'room16_b3'.state == 1 and _'room16_c3'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_c1'.state == 1 and _'room16_c2'.state == 1 and _'room16_c3'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_b1'.state == 1 and _'room16_b2'.state == 1 and _'room16_b3'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_a2'.state == 1 and _'room16_b2'.state == 1 and _'room16_c2'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_a1'.state == 1 and _'room16_b2'.state == 1 and _'room16_c3'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_a3'.state == 1 and _'room16_b2'.state == 1 and _'room16_c1'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_a1'.state == 2 and _'room16_a2'.state == 2 and _'room16_a3'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_a1'.state == 2 and _'room16_b1'.state == 2 and _'room16_c1'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_a3'.state == 2 and _'room16_b3'.state == 2 and _'room16_c3'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_c1'.state == 2 and _'room16_c2'.state == 2 and _'room16_c3'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_b1'.state == 2 and _'room16_b2'.state == 2 and _'room16_b3'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_a2'.state == 2 and _'room16_b2'.state == 2 and _'room16_c2'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_a1'.state == 2 and _'room16_b2'.state == 2 and _'room16_c3'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_a3'.state == 2 and _'room16_b2'.state == 2 and _'room16_c1'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_wardrobe'.state < 4) then
if(_'room16_AI'.win == 1) then
p('Три крестика соединены линией: кажется, ты проиграла. Вдруг таинственная сила отбрасывает тебя от шкафа, а его дверцы захлопываются.')
_'room16_wardrobe'.state = 0;
_'room16_AI'.state = 0;
_'room16_wardrobe':attr '~open';
_'room16_a1'.state = 0;
_'room16_a2'.state = 0;
_'room16_a3'.state = 0;
_'room16_b1'.state = 0;
_'room16_b2'.state = 1;
_'room16_b3'.state = 0;
_'room16_c1'.state = 0;
_'room16_c2'.state = 0;
_'room16_c3'.state = 0;
_'room16_AI'.win = 0;
end;
--if(_'room16_a1'.state ~= 0 and _'room16_a2'.state ~= 0 and _'room16_a3'.state ~= 0 and _'room16_b1'.state ~= 0 and _'room16_b2'.state ~= 0 and _'room16_b3'.state ~= 0 and _'room16_c1'.state ~= 0 and _'room16_c2'.state ~= 0 and _'room16_c3'.state ~= 0) then
if(_'room16_AI'.state == 4) then
p('Все поля исцарапаны, но никто не победил. Вдруг шкаф начинает трястись, и таинственная сила отбрасывает тебя в другой конец комнаты. Шкаф захлопывается.')
if(_'room16_AI'.game == 0) then _'room16_wardrobe'.firsttime = 0; end;
_'room16_AI'.game = 1;
_'room16_wardrobe'.state = 0;
_'room16_AI'.state = 0;
_'room16_wardrobe':attr '~open';
_'room16_a1'.state = 0;
_'room16_a2'.state = 0;
_'room16_a3'.state = 0;
_'room16_b1'.state = 0;
_'room16_b2'.state = 1;
_'room16_b3'.state = 0;
_'room16_c1'.state = 0;
_'room16_c2'.state = 0;
_'room16_c3'.state = 0;
end;
else
if(_'room16_AI'.win == 1) then
p('Три крестика соединены линией: ты выиграла. Не совсем, правда, понятно, у кого. Стоит тебе об этом подумать, как все крестики и нолики исчезают, оставляя таблицу пустой.')
_'room16_AI'.state = 0;
_'room16_a1'.state = 0;
_'room16_a2'.state = 0;
_'room16_a3'.state = 0;
_'room16_b1'.state = 0;
_'room16_b2'.state = 0;
_'room16_b3'.state = 0;
_'room16_c1'.state = 0;
_'room16_c2'.state = 0;
_'room16_c3'.state = 0;
_'room16_wardrobe'.turn = 0;
_'room16_AI'.win = 0;
end;
if(_'room16_AI'.win == 2) then
p('Три нолика соединены линией: кто бы ни был твоим воображаемым противником, ты проиграла. Стоит тебе об этом подумать, как все крестики и нолики исчезают, оставляя таблицу пустой.')
_'room16_AI'.state = 0;
_'room16_a1'.state = 0;
_'room16_a2'.state = 0;
_'room16_a3'.state = 0;
_'room16_b1'.state = 0;
_'room16_b2'.state = 0;
_'room16_b3'.state = 0;
_'room16_c1'.state = 0;
_'room16_c2'.state = 0;
_'room16_c3'.state = 0;
_'room16_wardrobe'.turn = 0;
_'room16_AI'.win = 0;
end;
if(_'room16_a1'.state ~= 0 and _'room16_a2'.state ~= 0 and _'room16_a3'.state ~= 0 and _'room16_b1'.state ~= 0 and _'room16_b2'.state ~= 0 and _'room16_b3'.state ~= 0 and _'room16_c1'.state ~= 0 and _'room16_c2'.state ~= 0 and _'room16_c3'.state ~= 0) then
p('Все поля заполнены, но никто не победил. Кто бы ни был твоим воображаемым противником, у вас ничья. Стоит тебе об этом подумать, как все крестики и нолики исчезают, оставляя таблицу пустой.')
_'room16_AI'.state = 0;
_'room16_a1'.state = 0;
_'room16_a2'.state = 0;
_'room16_a3'.state = 0;
_'room16_b1'.state = 0;
_'room16_b2'.state = 0;
_'room16_b3'.state = 0;
_'room16_c1'.state = 0;
_'room16_c2'.state = 0;
_'room16_c3'.state = 0;
_'room16_wardrobe'.turn = 0;
_'room16_AI'.win = 0;
end;
end;
end;
checkwin = function()
if(_'room16_a1'.state == 1 and _'room16_a2'.state == 1 and _'room16_a3'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_a1'.state == 1 and _'room16_b1'.state == 1 and _'room16_c1'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_a3'.state == 1 and _'room16_b3'.state == 1 and _'room16_c3'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_c1'.state == 1 and _'room16_c2'.state == 1 and _'room16_c3'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_b1'.state == 1 and _'room16_b2'.state == 1 and _'room16_b3'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_a2'.state == 1 and _'room16_b2'.state == 1 and _'room16_c2'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_a1'.state == 1 and _'room16_b2'.state == 1 and _'room16_c3'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_a3'.state == 1 and _'room16_b2'.state == 1 and _'room16_c1'.state == 1) then _'room16_AI'.win = 1; end;
if(_'room16_a1'.state == 2 and _'room16_a2'.state == 2 and _'room16_a3'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_a1'.state == 2 and _'room16_b1'.state == 2 and _'room16_c1'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_a3'.state == 2 and _'room16_b3'.state == 2 and _'room16_c3'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_c1'.state == 2 and _'room16_c2'.state == 2 and _'room16_c3'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_b1'.state == 2 and _'room16_b2'.state == 2 and _'room16_b3'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_a2'.state == 2 and _'room16_b2'.state == 2 and _'room16_c2'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_a1'.state == 2 and _'room16_b2'.state == 2 and _'room16_c3'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_a3'.state == 2 and _'room16_b2'.state == 2 and _'room16_c1'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_wardrobe'.state < 4) then
if(_'room16_AI'.win == 1) then
p('Три крестика соединены линией: кажется, ты проиграла. Вдруг таинственная сила отбрасывает тебя от шкафа, а его дверцы захлопываются.')
_'room16_wardrobe'.state = 0;
_'room16_AI'.state = 0;
_'room16_wardrobe':attr '~open';
_'room16_a1'.state = 0;
_'room16_a2'.state = 0;
_'room16_a3'.state = 0;
_'room16_b1'.state = 0;
_'room16_b2'.state = 1;
_'room16_b3'.state = 0;
_'room16_c1'.state = 0;
_'room16_c2'.state = 0;
_'room16_c3'.state = 0;
_'room16_AI'.win = 0;
end;
--if(_'room16_a1'.state ~= 0 and _'room16_a2'.state ~= 0 and _'room16_a3'.state ~= 0 and _'room16_b1'.state ~= 0 and _'room16_b2'.state ~= 0 and _'room16_b3'.state ~= 0 and _'room16_c1'.state ~= 0 and _'room16_c2'.state ~= 0 and _'room16_c3'.state ~= 0) then
if(_'room16_AI'.state == 4) then
p('Все поля исцарапаны, но никто не победил. Вдруг шкаф начинает трястись, и таинственная сила отбрасывает тебя в другой конец комнаты. Шкаф захлопывается.')
if(_'room16_AI'.game == 0) then _'room16_wardrobe'.firsttime = 0; end;
_'room16_AI'.game = 1;
_'room16_wardrobe'.state = 0;
_'room16_AI'.state = 0;
_'room16_wardrobe':attr '~open';
_'room16_a1'.state = 0;
_'room16_a2'.state = 0;
_'room16_a3'.state = 0;
_'room16_b1'.state = 0;
_'room16_b2'.state = 1;
_'room16_b3'.state = 0;
_'room16_c1'.state = 0;
_'room16_c2'.state = 0;
_'room16_c3'.state = 0;
end;
else
if(_'room16_AI'.win == 1) then
p('Три крестика соединены линией: ты выиграла. Не совсем, правда, понятно, у кого. Стоит тебе об этом подумать, как все крестики и нолики исчезают, оставляя таблицу пустой.')
_'room16_AI'.state = 0;
_'room16_a1'.state = 0;
_'room16_a2'.state = 0;
_'room16_a3'.state = 0;
_'room16_b1'.state = 0;
_'room16_b2'.state = 0;
_'room16_b3'.state = 0;
_'room16_c1'.state = 0;
_'room16_c2'.state = 0;
_'room16_c3'.state = 0;
_'room16_wardrobe'.turn = 0;
_'room16_AI'.win = 0;
end;
if(_'room16_AI'.win == 2) then
p('Три нолика соединены линией: кто бы ни был твоим воображаемым противником, ты проиграла. Стоит тебе об этом подумать, как все крестики и нолики исчезают, оставляя таблицу пустой.')
_'room16_AI'.state = 0;
_'room16_a1'.state = 0;
_'room16_a2'.state = 0;
_'room16_a3'.state = 0;
_'room16_b1'.state = 0;
_'room16_b2'.state = 0;
_'room16_b3'.state = 0;
_'room16_c1'.state = 0;
_'room16_c2'.state = 0;
_'room16_c3'.state = 0;
_'room16_wardrobe'.turn = 0;
_'room16_AI'.win = 0;
end;
if(_'room16_a1'.state ~= 0 and _'room16_a2'.state ~= 0 and _'room16_a3'.state ~= 0 and _'room16_b1'.state ~= 0 and _'room16_b2'.state ~= 0 and _'room16_b3'.state ~= 0 and _'room16_c1'.state ~= 0 and _'room16_c2'.state ~= 0 and _'room16_c3'.state ~= 0) then
p('Все поля заполнены, но никто не победил. Кто бы ни был твоим воображаемым противником, у вас ничья. Стоит тебе об этом подумать, как все крестики и нолики исчезают, оставляя таблицу пустой.')
_'room16_AI'.state = 0;
_'room16_a1'.state = 0;
_'room16_a2'.state = 0;
_'room16_a3'.state = 0;
_'room16_b1'.state = 0;
_'room16_b2'.state = 0;
_'room16_b3'.state = 0;
_'room16_c1'.state = 0;
_'room16_c2'.state = 0;
_'room16_c3'.state = 0;
_'room16_wardrobe'.turn = 0;
_'room16_AI'.win = 0;
end;
end;
end;
continue = function()
if(_'room16_a1'.state == 2 and _'room16_a2'.state == 2 and _'room16_a3'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_a1'.state == 2 and _'room16_b1'.state == 2 and _'room16_c1'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_a3'.state == 2 and _'room16_b3'.state == 2 and _'room16_c3'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_c1'.state == 2 and _'room16_c2'.state == 2 and _'room16_c3'.state == 2) then _'room16_AI'.win = 2; end;
if(_'room16_AI'.win == 2) then
p ('Ты победно соединяешь три нолика одной кривой линией (так уж получается, когда царапаешь кинжалами шкафы), и вдруг какая-то таинственная сила отталкивает тебя от шкафа с такой силой, что кинжал остаётся в шкафу. Дверцы шкафа захлопываются.')
move(_'dagger',_'room16_wardrobe')
_'room16_AI'.game = 2;
_'room16_wardrobe'.state = 2;
_'room16_AI'.state = 0;
_'room16_wardrobe':attr '~open';
remove(_'room16_o',pl)
remove(_'room16_x',pl)
remove(_'room16_a1',_'room16_wardrobe')
remove(_'room16_a2',_'room16_wardrobe')
remove(_'room16_a3',_'room16_wardrobe')
remove(_'room16_b1',_'room16_wardrobe')
remove(_'room16_b2',_'room16_wardrobe')
remove(_'room16_b3',_'room16_wardrobe')
remove(_'room16_c1',_'room16_wardrobe')
remove(_'room16_c2',_'room16_wardrobe')
remove(_'room16_c3',_'room16_wardrobe')
else
if(_'room16_wardrobe'.firsto == 1) then
p('Ты поняла принцип игры и скорее закрываешь шкаф.')
_'room16_wardrobe':before_Close(_'room16_wardrobe')
_'room16_wardrobe':attr '~open'
else
_'room16_wardrobe'.firsto = 1;
end;
end;
end;
calculate = function()
if(_'room16_AI'.state == 1) then
if(_'room16_a1'.state == 2) then _'room16_b3'.state = 1 end;
if(_'room16_a2'.state == 2) then _'room16_b3'.state = 1 end;
if(_'room16_a3'.state == 2) then _'room16_b1'.state = 1 end;
if(_'room16_b1'.state == 2) then _'room16_a2'.state = 1 end;
if(_'room16_b3'.state == 2) then _'room16_a2'.state = 1 end;
if(_'room16_c1'.state == 2) then _'room16_a2'.state = 1 end;
if(_'room16_c2'.state == 2) then _'room16_b3'.state = 1 end;
if(_'room16_c3'.state == 2) then _'room16_a2'.state = 1 end;
end;
if(_'room16_AI'.state == 2) then
if(_'room16_b3'.state == 1) then
if(_'room16_b1'.state == 2) then
if(_'room16_a1'.state == 2) then _'room16_c1'.state = 1 end;
if(_'room16_a2'.state == 2) then _'room16_a3'.state = 1 end;
if(_'room16_c2'.state == 2) then _'room16_a3'.state = 1 end;
else
_'room16_b1'.state = 1
end;
end;
if(_'room16_a2'.state == 1) then
if(_'room16_c2'.state == 2) then
if(_'room16_b1'.state == 2) then _'room16_a3'.state = 1 end;
if(_'room16_b3'.state == 2) then _'room16_a3'.state = 1 end;
if(_'room16_c1'.state == 2) then _'room16_c3'.state = 1 end;
if(_'room16_c3'.state == 2) then _'room16_c1'.state = 1 end;
else
_'room16_c2'.state = 1
end;
end;
if(_'room16_b1'.state == 1) then
if(_'room16_b3'.state == 2) then
_'room16_c3'.state = 1
else
_'room16_b3'.state = 1
end;
end;
end;
if(_'room16_AI'.state == 3) then
if(_'room16_a3'.state == 1) then
if(_'room16_a2'.state == 1) then
if(_'room16_a1'.state == 2) then
_'room16_c1'.state = 1
else
_'room16_a1'.state = 1
end;
end;
if(_'room16_b3'.state == 1) then
if(_'room16_c1'.state == 2) then
_'room16_c3'.state = 1
else
_'room16_c1'.state = 1
end;
end;
end;
if(_'room16_c3'.state == 1) then
if(_'room16_a1'.state == 2) then
if(_'room16_a2'.state == 1) then
if(_'room16_AI'.game == 0) then
_'room16_b1'.state = 1
else
_'room16_a3'.state = 1
end;
end;
if(_'room16_b1'.state == 1) then
if(_'room16_AI'.game == 0) then
_'room16_a2'.state = 1
else
_'room16_c1'.state = 1
end;
end;
else
_'room16_a1'.state = 1
end;
end;
if(_'room16_c1'.state == 1) then
if(_'room16_a3'.state == 2) then
if(_'room16_a2'.state == 1) then
if(_'room16_AI'.game == 0) then
_'room16_b3'.state = 1
else
_'room16_a1'.state = 1
end;
end;
if(_'room16_b3'.state == 1) then
if(_'room16_AI'.game == 0) then
_'room16_a2'.state = 1
else
_'room16_c3'.state = 1
end;
end;
else
_'room16_a3'.state = 1
end;
end;
end;
if(_'room16_AI'.state == 4) then
if(_'room16_a1'.state == 0) then _'room16_a1'.state = 1 end;
if(_'room16_a2'.state == 0) then _'room16_a2'.state = 1 end;
if(_'room16_a3'.state == 0) then _'room16_a3'.state = 1 end;
if(_'room16_b1'.state == 0) then _'room16_b1'.state = 1 end;
if(_'room16_b3'.state == 0) then _'room16_b3'.state = 1 end;
if(_'room16_c1'.state == 0) then _'room16_c1'.state = 1 end;
if(_'room16_c2'.state == 0) then _'room16_c2'.state = 1 end;
if(_'room16_c3'.state == 0) then _'room16_c3'.state = 1 end;
end;
end;
finish = function()
_'room16_mystical'.state = 1
_'room16_wardrobe'.state = 3
_'room16_wardrobe':attr 'open'
_'room16_wardrobe':attr 'enterable'
move(_'room16_witch',_'room16_mystical')
move(_'room16_wall',_'room16_mystical')
DaemonStart 'room16_AI'
end;
aiturn = function()
_'room16_AI':checkwin()
if(_'room16_wardrobe'.turn == 1) then
_'room16_wardrobe'.turn = 0
if(_'room16_b2'.state == 0) then
p 'Ты замечешь, что на поле Б2 появляется нацарапанный нолик.'
_'room16_b2'.state = 2;
else
if(_'room16_a3'.state == 0) then
p 'Ты замечешь, что на поле A3 появляется нацарапанный нолик.'
_'room16_a3'.state = 2;
else
if(_'room16_c3'.state == 0) then
p 'Ты замечешь, что на поле В3 появляется нацарапанный нолик.'
_'room16_c3'.state = 2;
else
if(_'room16_c1'.state == 0) then
p 'Ты замечешь, что на поле В2 появляется нацарапанный нолик.'
_'room16_c1'.state = 2;
else
if(_'room16_a1'.state == 0) then
p 'Ты замечешь, что на поле А1 появляется нацарапанный нолик.'
_'room16_a1'.state = 2;
else
if(_'room16_b3'.state == 0) then
p 'Ты замечешь, что на поле Б3 появляется нацарапанный нолик.'
_'room16_b3'.state = 2;
else
if(_'room16_c2'.state == 0) then
p 'Ты замечешь, что на поле В2 появляется нацарапанный нолик.'
_'room16_c2'.state = 2;
else
if(_'room16_b1'.state == 0) then
p 'Ты замечешь, что на поле Б1 появляется нацарапанный нолик.'
_'room16_b1'.state = 2;
else
if(_'room16_a2'.state == 0) then
p 'Ты замечешь, что на поле А2 появляется нацарапанный нолик.'
_'room16_a2'.state = 2;
end;
end;
end;
end;
end;
end;
end;
end;
end;
end;
_'room16_AI':checkwin()
end;
daemon = function(s)
if(_'room16_AI'.daemon_stage == 0) then
p (' -- Я вот думаю, на лоскутки тебя порезать или на кусочки разорвать. А, прислужница госмашины?')
end;
if(_'room16_AI'.daemon_stage == 1) then
p (' -- Сейчас, наточу когти, разберусь с тобой. Ты пока подумай, жизнь вспомни.')
end;
if(_'room16_AI'.daemon_stage == 2) then
p (' -- Тут, конечно, нужны кусачки.')
end;
if(_'room16_AI'.daemon_stage == 3) then
p (' -- Заусенец проклятый! Вот и ты, Настенька, как заусенец у меня в пальце сейчас: и жалко, и противно!')
end;
if(_'room16_AI'.daemon_stage == 4) then
p (' -- Ну ладно, готово.')
end;
if(_'room16_AI'.daemon_stage == 5) then
DaemonStop 'room16_AI';
walk 'room16_cutsceneB'
end;
if(_'room16_AI'.daemon_stage == 6) then
DaemonStop 'room16_AI';
walk 'room16_cutsceneC'
end;
if(_'room16_AI'.daemon_stage == 7) then
DaemonStop 'room16_AI';
walk 'room16_cutsceneD'
end;
if(_'room16_AI'.daemon_stage == 8) then
DaemonStop 'room16_AI';
walk 'room16_cutsceneE'
end;
if(_'room16_AI'.daemon_stage == 9) then
DaemonStop 'room16_AI';
walk 'room16_cutsceneF'
end;
if(_'room16_AI'.daemon_stage == 10) then
p (' -- Ха-ха-ха! Глупышка, ты попалась в ловушку! Теперь ты навеки будешь заточена в этом шкафу.')
end;
if(_'room16_AI'.daemon_stage == 11) then
p (' -- Там даже не ловит мобильник, детка!')
end;
if(_'room16_AI'.daemon_stage == 12) then
p (' -- Кстати, я заколдовала шкаф так, что в нём нельзя ни повеситься, ни зарезаться, вообще никак нельзя самоубиться! Ты даже со скуки умереть на сможешь!')
end;
if(_'room16_AI'.daemon_stage == 13) then
p (' -- А что: считай, я подарила тебе бессмертие.')
end;
if(_'room16_AI'.daemon_stage == 14) then
p (' -- Помолись там, что ли. А нет, забыла. Это тоже нельзя.')
end;
if(_'room16_AI'.daemon_stage == 15) then
p (' -- Ладно-ладно. Мне пора принять ванну. Пока-пока, племяшка!')
end;
if(_'room16_AI'.daemon_stage == 16) then
p ('Какое-то время ты слышишь звуки шагов, а потом они стихают. Похоже, ты здесь надолго.')
end;
if(_'room16_AI'.daemon_stage == 17) then
p ('Кто-то мог бы сказать, что ты нашла концовку №4/4. Но ты, конечно, можешь с этим не согласиться и играть дальше.')
end;
if(_'room16_AI'.daemon_stage == 20) then
--DaemonStop 'room16_AI'
end;
if(_'room16_AI'.daemon_stage > 20) then
_'room16_AI':aiturn()
end;
_'room16_AI'.daemon_stage = _'room16_AI'.daemon_stage + 1
end;
}:attr 'scenery, static'
cutscene {
nam = 'room16_cutscene';
text = {
"Ты открываешь шкаф -- а там вместо крестиков-ноликов сидит какая-то старуха.";
"Она поднимает на тебя глаза и пытается эффектно сдуть немытую прядь волос себе на лоб.";
"Не выходит: прилипло.";
" -- Не думала, что вы прознаете про мои тайные симпатии к крестикам-ноликам, буржуи недобитые! -- бормочет старуха.";
"Она медленно поднимается на кривые ноги, как в фильмах ужасов.";
" -- Я понаставила замков, вырубила вайфай, утопила телефон, провела оккультные ритуалы, исчезла в шкафу -- а государственная машина всё равно меня выцарапала, подумать только.";
"Старуха со скрипом распрямляет засохшую спину, и ты узнаёшь в её физиономии лицо тетушки Агаты, только какое-то немытое.";
};
next_to = 'room16_dialogue'
}
dlg {
nam = 'room16_dialogue';
phr = {
[[-- Настюха, ты что ли? -- прозревает тётя Агата.]];
{
'Ну конечно!',
function() walk 'room16_dialogueA'; end;
},
{
'Что с тобой, тётушка?',
function() walk 'room16_dialogueB'; end;
},
};
}
dlg {
nam = 'room16_dialogueA';
phr = {
[[-- Значит, приставы завербовали и тебя. Но знаешь, что я тебе скажу?]],
{
'Какие ещё приставы?',
function() p [[-- Не перебивай старших! Да, я не платила за коммуналку уже десять лет, и да, я принимала ванну два раза в день, и да, я майнила биткоины, ну и что!]]; walk 'room16_cutsceneA'; end;
},
{
'Меня никто не вербовал!',
function() p [[-- Не перебивай старших! Да, я не платила за коммуналку уже десять лет, и да, я принимала ванну два раза в день, и да, я майнила биткоины, ну и что!]]; walk 'room16_cutsceneA'; end;
},
};
}
dlg {
nam = 'room16_dialogueB';
phr = {
[[-- Значит, приставы завербовали и тебя. Но знаешь, что я тебе скажу?]],
{
'Какие ещё приставы?',
function() p [[-- Не перебивай старших! Да, я не платила за коммуналку уже десять лет, и да, я принимала ванну два раза в день, и да, я майнила биткоины, ну и что!]]; walk 'room16_cutsceneA'; end;
},
{
'Меня никто не вербовал!',
function() p [[-- Не перебивай старших! Да, я не платила за коммуналку уже десять лет, и да, я принимала ванну два раза в день, и да, я майнила биткоины, ну и что!]]; walk 'room16_cutsceneA'; end;
},
{
'Тётушка Агата! Это Настя, ты что?',
function() p [[-- Не перебивай старших! Да, я не платила за коммуналку уже десять лет, и да, я принимала ванну два раза в день, и да, я майнила биткоины, ну и что!]]; walk 'room16_cutsceneA'; end;
},
};
}
cutscene {
nam = 'room16_cutsceneA';
text = {
"В глазах тётушки нет ничего, кроме слепой ярости по отношению к судебным приставам, и эта ярость направлена на тебя.";
" -- Никто не должен был найти меня, девчонка! -- она выковыривается из шкафа, растопырив длинные когти.";
" -- Абракадабра! Фу ты, пх'нглуи, мглв'нафх, алохомора, пламя Удуна, мать его! -- она кричит что-то невразумительное, и выход из комнаты исчезает.";
"Тётка выпрыгивает из шкафа и, как птица, приземляется на пюпитр.";
"Надо что-то делать. У тебя мало времени.";
};
next_to = function() _'room16_AI':finish(); mp.score=mp.score+1; walk 'room16_mystical'; end;
}
cutscene {
nam = 'room16_cutsceneB';
text = {
"Одним махом тётя Агата прыгает на тебя, сбивая с ног.";
"Она вонзает свои когти тебе в живот, а клыками впивается в шею.";
"Ты даже не успеваешь пожалеть о том, что приехала в дом к своей тёте.";
};
next_to = 'room16_happyend';
}
cutscene {
nam = 'room16_cutsceneC';
text = {
"Ты подбегаешь к тёте и пытаешься сбить её с пюпитра, но она оказывается ловчее, и одним махом прыгает на тебя, сбивая с ног.";
"Она вонзает свои когти тебе в живот, а клыками впивается в шею.";
"Ты даже не успеваешь пожалеть о том, что приехала в дом к своей тёте.";
};
next_to = 'room16_happyend';
}
cutscene {
nam = 'room16_cutsceneD';
text = {
"Как сумасшедшая, ты бежишь на тётю с твёрдым намерением её зарезать.";
"Увы, она не дура, и одним махом прыгает на тебя, сбивая с ног.";
"Она вонзает свои когти тебе в живот, а клыками впивается в шею.";
"Ты даже не успеваешь пожалеть о том, что приехала в дом к своей тёте.";
};
next_to = 'room16_happyend';
}
cutscene {
nam = 'room16_cutsceneE';
text = {
"Ты берёшь кинжал за лезвие, как это делают циркачи.";
"Тётя всё ковыряет свои когти и даже не замечает, как ты прицеливаешься.";
"Один бросок -- и кинжал по самую рукоять уходит куда-то в тёткины лохмотья, а она падает на паркетный пол замертво.";
" -- Какой-то нелепый конец, -- думаешь ты вслух.";
"Теперь придётся выбираться из комнаты, у которой нет двери.";
"Твой взгляд падает на щель под потолком.";
"Закатный луч падает на тебя в ответ.";
};
next_to = 'room16_badend';
}
cutscene {
nam = 'room16_cutsceneF';
text = {
"Ты выходишь из комнаты, войдя в четвёртую стену, которую сама же и разрушила.";
"Тётя Агата осталась в своём особняке, приходить в себя.";
"Может быть, она даже продаст пару биткоинов и заплатит за коммунальные услуги.";
"А может, она спрячется ещё лучше, расставит ловушки и будет дожидаться судебных приставов при оружии.";
"Тебе понравилась игра?";
"Нет, не надо отвечать мне. Напиши на форуме ifiction.ru или на дискорд-сервере ifrus.";
"Ну всё, пока.";
};
next_to = 'room16_theend';
}
obj {
-"тётушка,тётушка,тётка,тётя,Агата,тётушка Агата*";
nam = 'room16_witch';
dsc = 'Тётушка сидит на пюпитре и точит когти.';
description = 'Тётушка Агата одета в какие-то лохмотья. Она точит когти, скалит зубы, хлюпает носом, сверкает глазами и время от времени шевелит ушами.';
before_ThrownAt = function(s,w)
if(w == _'dagger') then
_'room16_AI'.daemon_stage = 8
else
p 'Ты серьёзно?'
end;
end;
before_Attack = function(s)
if(pl:have(_'dagger')) then
_'room16_AI'.daemon_stage = 7
else
_'room16_AI'.daemon_stage = 6
end;
end;
before_Push = function(s)
_'room16_AI'.daemon_stage = 6
end;
before_Cut = function(s,w)
if(w == _'dagger') then
_'room16_AI'.daemon_stage = 7
else
p 'Ты серьёзно?'
end;
end;
before_Tear = function(s)
if(pl:have(_'dagger')) then
_'room16_AI'.daemon_stage = 7
else
_'room16_AI'.daemon_stage = 6
end;
end;
before_Talk = function(s)
p('Разговаривать с тётей, когда она в таком состоянии, бессмысленно.')
end;
before_Tell = function(s)
p('Разговаривать с тётей, когда она в таком состоянии, бессмысленно.')
end;
before_Ask = function(s)
p('Разговаривать с тётей, когда она в таком состоянии, бессмысленно.')
end;
before_AskFor = function(s)
p('Разговаривать с тётей, когда она в таком состоянии, бессмысленно.')
end;
before_AskTo = function(s)
p('Разговаривать с тётей, когда она в таком состоянии, бессмысленно.')
end;
before_Answer = function(s)
p('Разговаривать с тётей, когда она в таком состоянии, бессмысленно.')
end;
["before_Take,Remove,Enter,PutOn,Insert"] = function(s,w)
p 'Ты серьёзно?'
end;
obj = {
obj {
-"глаза,глаз*";
description = [[Глаза цвета моря!]];
};
obj {
-"нос";
description = [[Прелестный носик!]];
};
obj {
-"когти,коготь*";
description = [[Когти тётушки длинные и кривые, потому что их не стригли уже много лет.]];
};
obj {
-"зубы,зуб*";
description = [[Зубов у тётушки много, но они все жёлтые. Потому что она их не чистила уже очень давно.]];
};
obj {
-"уши,ухо*";
description = [[Почему у неё такие большие уши?]];
};
obj {
-"лохмотья*";
description = [[Когда-то это было что-то приличное, но теперь...]];
};
}
}:attr 'animate'
obj {
-"стены";
nam = 'room16_walls';
state = 0;
description = function(s)
if _'room16_mystical'.state == 0 then
return 'Стены как стены.';
else
return 'Стены как стены. Нельзя сказать, что какая-то стена выделяется относительно остальных. Или можно?';
end
end;
}:attr 'static, scenery'
obj {
-"четвёртая стена";
nam = 'room16_wall';
state = 0;
description = 'Ты стоишь как раз рядом с ней.';
before_Attack = function(s)
if(pl:have(_'dagger')) then
if(s.state == 3) then
p 'Тебе незачем тратить время: просто входи в стену!'
end;
if(s.state == 2) then
p 'Ты расковыриваешь огромную дыру: четвёртая стена разрушена!'
s:attr 'enterable'
s:attr 'open'
mp.score=mp.score+1;
s.state = 3
end;
if(s.state == 1) then
p 'Ты продолжаешь рушить стену, и в ней уже образовалась дырка размером с твою голову. Ты могла бы попробовать сбежать, но всё, кроме головы, будет торчать на виду у тёти Агаты.'
mp.score=mp.score+1;
s.state = 2
end;
if(s.state == 0) then
p 'Ты нервно ковыряешь стену кинжалом, пока тётка точит когти и не смотрит на тебя. Постепенно, стена начинает рушиться.'
mp.score=mp.score+1;
s.state = 1
end;
else
p 'Рушить четвёртую стену голыми руками не получится.'
end;
end;
before_Enter = function(s)
if(s.state == 3) then
_'room16_AI'.daemon_stage = 9
else
p 'Сначала надо разрушить четвёртую стену!'
end;
end;
}:attr 'static, scenery'
room {
-"конец";
nam = 'room16_happyend';
title = "Конец";
dsc = 'Вот и сказочке конец. Ты же сохранила игру, Настенька? (Концовка №3/4)';
noparser = true;
}
room {
-"конец";
nam = 'room16_badend';
title = "Конец";
dsc = 'Вот и сказочке конец. Может, надо было обойтись без крови? Ты же сохранила игру, Настенька? (Концовка №2/4)';
noparser = true;
}
room {
-"конец";
nam = 'room16_theend';
title = "Конец";
dsc = 'Вот и сказочке конец, а кто слушал -- молодец! (Концовка №1/4)';
noparser = true;
}