--[[ Игрок может попасть сюда только после диалога с Майклом. Эта локация имеет владельца, которому не понравится, что здесь шляются посторонние. Здесь игрок найдет карту. ]] warehouse_32_guard = npc { nam = "warehouse_32_guard"; dsc = "Рядом со входом, опершись на стену, стоит {охранник}. Он не обращает на вас никакого внимания. "; dlg = 'warehouse_32_guard_dlg'; phrases = { 'Мне больше не о чем с ним говорить. '; 'Он меня не пропустит. '; }; }; warehouse_32_guard_dlg = dlg { nam = "warehouse_32_guard_dlg"; entered = function(s) warehouse_32_guard.dlg = nil; wright_dlg.state = 6; return [[ Вы подходите к охраннику, но он не обращает на вас никакого внимания. ]]; end; phr = { {"Могу я пройти внутрь?", [[ Охранник медленно поворачивает голову в вашу сторону и отрывисто произносит: "Нет". ]]}; {"Мне нужно поговорить с управляющим. ", [[ Охранник медленно поворачивает голову в вашу сторону и отрывисто произносит: "Управляющий велел никого не пускать". ]]}; {"У меня есть дело к управляющему. ", [[ Охранник медленно поворачивает голову в вашу сторону и отрывисто произносит: "Значит у вас есть пропуск. Покажите мне его". ]]}; }; }; warehouse_32_entry = room { nam = "warehouse_32_entry"; disp = "Вход на склад 32"; dsc = [[ Вы стоите у входа на склад 32. ]]; entered = function(s) move(char_coachman, here()); end; way = { vroom("В переулок", "warehouse_32_alley"); }; obj = { 'warehouse_32_guard' }; }; warehouse_32_alley = room { nam = "warehouse_32_alley"; disp = "Переулок у склада 32"; dsc = [[ Вы стоите в небольшом грязном переулке неподалеку от склада 32. ]]; way = { vroom("К главному входу", "warehouse_32_entry"); vroom("Пройти дальше", "warehouse_32_behind"); }; }; warehouse_32_behind = room { nam = "warehouse_32_behind"; disp = "За складом 32"; dsc = [[ Вы стоите в проулке за складом 32. От главного здания вас отделяет высокий забор из металлической решетки. За забором, почти напротив вас, вы видите заднюю дверь склада. ]]; way = { vroom("Назад", "warehouse_32_alley"); }; }; warehouse_32_guard_night = npc { nam = "warehouse_32_guard"; dsc = "Рядом со входом, опершись на стену, дремлет {охранник}. "; phrases = { 'Сейчас мне точно не стоит будить его. '; }; }; warehouse_32_night = room { nam = "warehouse_32_night"; disp = "Вход на склад 32"; dsc = [[ Вы стоите у входа на склад 32. Сейчас темная ночь и лишь одинокий фонарь, висящий над входом склада, слабо освещает улицу. ]]; obj = { 'warehouse_32_guard_night', 'char_wright_travel' }; way = { vroom("В переулок", "warehouse_32_alley_night"); }; }; warehouse_32_alley_night = darkroom { nam = "warehouse_32_alley_night"; disp = "Переулок у склада 32"; dsc_halflit = [[ Вы стоите в небольшом грязном переулке неподалеку от склада 32. ]]; dsc_dark = [[ Вы стоите в небольшом грязном переулке неподалеку от склада 32. Здесь совсем темно и вы ничего не видите. ]]; way = { kh_vroom("К главному входу", "warehouse_32_night", 2); kh_vroom("Пройти дальше", "warehouse_32_behind_night", 1); }; }; warehouse_32_behind_night = room { nam = "warehouse_32_behind_night"; disp = "За складом 32"; dsc = [[ Вы стоите в проулке за складом 32. От главного здания вас отделяет высокий забор из металлической решетки. За забором, почти напротив вас, вы видите приоткрытую заднюю дверь склада. ]]; way = { vroom("Назад", "warehouse_32_alley"); vroom("Перелезть через забор", "w32_backdoor"); }; }; char_wright_travel = npc { nam = "char_wright_travel"; disp = "Джек Райт"; dsc = [[ На другой стороне улицы стоит небольшая крытая {повозка}, запряженная двумя лошадьми. ]]; dlg = "wright_travel_dlg"; }; wright_travel_dlg = dlg { nam = "wright_travel_dlg"; disp = "Джек Райт"; entered = [[ Джек приоткрывает дверь повозки и спрашивает вас: "Все готово? Уезжаем?" ]]; phr = { {1, always=true, "Да, поехали", [[ "Вперед". ]], code [[ walk('wright_house_cabinet'); ]]}; {2, always=true, "Нет еще", [[ "Жду". ]], code [[ back(); ]]}; }; }; w32_backdoor = room { nam = "w32_backdoor"; disp = "Склад 32, задняя дверь"; entered = function(s) warehouse_32.pos = "01"; end; way = { kh_vroom("Войти", function(s) if (pl.has_light) then pn("Мне стоит погасить лампу, прежде чем заходить внутрь. "); return false; else return "warehouse_32"; end; end); kh_vroom("Перелезть через забор", "warehouse_32_behind_night"); }; }; w32_mgr = darkroom { nam = "w32_mgr"; disp = "Склад 32, кабинет управляющего"; dsc_dark = [[ Вы находитесь в кабинете управляющего. В темноте вы можете лишь смутно различить очертания предметов. ]]; dsc_halflit = [[ Вы находитесь в кабинете управляющего. ]]; entered = function(s) warehouse_32.pos = "54"; end; key_inplace = true; book_inplace = true; way = { kh_vroom("Выйти", function(s) print(w32_mgr.key_inplace); print(w32_mgr.book_inplace); if (not w32_mgr.key_inplace or not w32_mgr.book_inplace) then pr("Стоит вернуть все как было. "); return false; elseif (pl.has_light) then pr("Если я не погашу лампу, меня заметят. "); return false; else return "warehouse_32" end; end, 2); }; obj = { 'w32_mgr_table', 'w32_mgr_bookcase' }; }; w32_journal = obj { nam = 'w32_journal'; dsc = [[ В ящике стола лежит {учетная книга}, в которую занесено все содержимое склада. ]]; act = function(s) local list = [[ среди сотен записей вы натыкаетесь на несколько, отмеченных как "WestHaven": ]]; for i = 1, #w32_shelf_input.items do list = list .. "^".. stead.ref(w32_shelf_input.items[i].n).disp .. " " .. w32_shelf_input.items[i].shelf .. "-" .. w32_shelf_input.items[i].position; end; return list; end; }; w32_mgr_table = obj { seen_level = 1; nam = 'w32_mgr_table'; dsc = function(s) if (s.open) then return [[ В центре комнаты расположен большой письменный стол. {Ящик} стола выдвинут. ]]; else return [[ В центре комнаты расположен большой письменный стол. В столе имеется {ящик}. ]]; end; end; open = false; locked = true; act = function(s) if (not s.locked) then if (s.open) then s.open = false; w32_journal:disable(); return [[ Вы задвигаете ящик. ]]; else s.open = true; w32_journal:enable(); return [[ Вы выдвигаете ящик. ]]; end; else return [[ Ящик заперт. Вам придется найти ключ. ]]; end; end; used = function(s, o) if (o == item_w32_key) then if (s.locked) then w32_mgr.book_inplace = false; s.locked = false; return "Вы отпираете ящик. "; else w32_journal:disable(); w32_mgr.book_inplace = true; s.open = false; s.locked = true; return "Вы запираете ящик. "; end; end; end; obj = { w32_journal:disable(); item_ducttape; }; }; w32_mgr_bookcase = obj { seen_level = 1; nam = 'w32_mgr_bookcase'; dsc = [[ Одну из стен практически целиком занимает {шкаф}, заполненный книгами и записями. ]]; act = function(s) item_w32_key:enable(); return "Вы замечаете спрятанный за книгами ключ. "; end; used = function(s, o) if (o == item_w32_key) then w32_mgr.key_inplace = true; remove(item_w32_key, pl); put(item_w32_key, s); return "Вы возвращает ключик на место"; end; end; obj = { item_w32_key:disable(); }; }; warehouse_32_definitions = { ---line E ["01"] = { name="у задней двери", dsc=[[ К югу от вас расположена задняя дверь склада. ]], e1 = "11", ex3 = "w32_backdoor"}; ["02"] = { name="тупик", dsc=[[ ]], e1 = "12", corner = true}; ["03"] = { name="тупик", dsc=[[ ]], e1 = "13", corner = true}; ["04"] = { name="тупик", dsc=[[ ]], e1 = "14", corner = true}; ---line DE ["10"] = { name="тупик", dsc=[[ ]], e2 = "11", corner = true}; ["11"] = { name="секция D1", dsc=[[ ]], e1 = "21", e2="12", e3="01", e4="10", sector = "D1"}; ["12"] = { name="секция D2", dsc=[[ ]], e1 = "22", e2="13", e3="02", e4="11", sector = "D2"}; ["13"] = { name="секция D3", dsc=[[ ]], e1 = "23", e2="14", e3="03", e4="12", sector = "D3"}; ["14"] = { name="секция D4", dsc=[[ ]], e1 = "24", e2="15", e3="04", e4="13", sector = "D4"}; ["15"] = { name="тупик", dsc=[[ ]], e4 = "14", corner = true}; ---line CD ["20"] = { name="тупик", dsc=[[ ]], e2 = "21", corner = true}; ["21"] = { name="секция C1", dsc=[[ ]], e1 = "31", e2="22", e3="11", e4="20", sector = "C1"}; ["22"] = { name="секция C2", dsc=[[ ]], e1 = "32", e2="23", e3="12", e4="21", sector = "C2"}; ["23"] = { name="секция C3", dsc=[[ ]], e1 = "33", e2="24", e3="13", e4="22", sector = "C3"}; ["24"] = { name="секция C4", dsc=[[ ]], e1 = "34", e2="25", e3="14", e4="23", sector = "C4"}; ["25"] = { name="тупик", dsc=[[ ]], e4 = "24", corner = true}; ---line BC ["30"] = { name="тупик", dsc=[[ ]], e2 = "31", corner = true}; ["31"] = { name="секция B1", dsc=[[ ]], e1 = "41", e2="32", e3="21", e4="30", sector = "B1"}; ["32"] = { name="секция B2", dsc=[[ ]], e1 = "42", e2="33", e3="22", e4="31", sector = "B2"}; ["33"] = { name="секция B3", dsc=[[ ]], e1 = "43", e2="34", e3="23", e4="32", sector = "B3"}; ["34"] = { name="секция B4", dsc=[[ ]], e1 = "44", e2="35", e3="24", e4="33", sector = "B4"}; ["35"] = { name="тупик", dsc=[[ ]], e4 = "34", corner = true}; ---line AB ["40"] = { name="тупик", dsc=[[ ]], e2 = "41", corner = true}; ["41"] = { name="секция A1", dsc=[[ ]], e1 = "51", e2="42", e3="31", e4="40", sector = "A1"}; ["42"] = { name="секция A2", dsc=[[ ]], e1 = "52", e2="43", e3="32", e4="41", sector = "A2"}; ["43"] = { name="секция A3", dsc=[[ ]], e1 = "53", e2="44", e3="33", e4="42", sector = "A3"}; ["44"] = { name="секция A4", dsc=[[ ]], e1 = "54", e2="45", e3="34", e4="43", sector = "A4"}; ["45"] = { name="тупик", dsc=[[ ]], e4 = "34", corner = true}; ---line A ["51"] = { name="тупик", dsc=[[ ]], e3 = "41", corner = true}; ["52"] = { name="у входа", dsc=[[ К северу от вас расположен главный вход склада, но он заперт. ]], e3 = "42"}; ["53"] = { name="тупик", dsc=[[ ]], e3 = "43", corner = true}; ["54"] = { name="у входа в кабинет управляющего", dsc=[[ К северу от вас расположена дверь, ведущая, судя по табличке на ней, в кабинет управляющего. ]], e3 = "44", ex1="w32_mgr"}; }; function getDirName(dir) if (dir == 1) then return "север"; elseif (dir == 2) then return "восток"; elseif (dir == 3) then return "юг"; elseif (dir == 4) then return "запад"; end; end; warehouse_32 = room { nam = "warehouse_32"; nolamp = true; disp = function(s) return "Склад 32, " .. s.definitions[s.pos].name; end; dsc = function(s) --return s.definitions[s.pos].dsc .. "^ Вы смотрите на " .. getDirName(s.dir); return 'Вы стоите где-то между стеллажами склада 32. В помещении темно, за исключением фонарей охранников. ' .. s.definitions[s.pos].dsc; end; definitions = warehouse_32_definitions; pos = "01"; hidden = false; guards = { { pos = "21", dir=1, s = 1 }; --s=1 - должен повернуть направо, s=2 - должен пройти прямо { pos = "31", dir=4, s = 1 }; --s=1 - должен повернуть направо, s=2 - должен пройти прямо { pos = "24", dir=2, s = 1 }; --s=1 - должен повернуть направо, s=2 - должен пройти прямо { pos = "34", dir=3, s = 1 }; --s=1 - должен повернуть направо, s=2 - должен пройти прямо }; checkGuardSight = function(s) --Проверить область зрения каждого стражника, если игрок находится в области зрения - FAIL for i = 1, #s.guards do if (s.guards[i].pos == s.pos) then --detected walk("game_over_caught"); return false; end; if (s.guards[i].dir == 1) then if (s.definitions[s.guards[i].pos].e1 and s.pos == s.definitions[s.guards[i].pos].e1) then --detected walk("game_over_caught"); return false; end; elseif (s.guards[i].dir == 2) then if (s.definitions[s.guards[i].pos].e2 and s.pos == s.definitions[s.guards[i].pos].e2) then --detected walk("game_over_caught"); return false; end; elseif (s.guards[i].dir == 3) then if (s.definitions[s.guards[i].pos].e3 and s.pos == s.definitions[s.guards[i].pos].e3) then --detected walk("game_over_caught"); return false; end; elseif (s.guards[i].dir == 4) then if (s.definitions[s.guards[i].pos].e4 and s.pos == s.definitions[s.guards[i].pos].e4) then --detected walk("game_over_caught"); return false; end; end; end; return true; end; guardTurn = function(s) local pl_y = math.floor(tonumber(s.pos) / 10); local pl_x = tonumber(s.pos) % 10; --print("player:", pl_x, pl_y); --Каждый стражник делает ход, игрок получает сообщения, о том, слышит ли он шаги, откуда и как они движутся for i = 1, #s.guards do --TODO play with this random number to assume good gameplay: predictable enough, yet somewhat random if (rnd(10) < 9) then if (s.guards[i].s == 1) then s.guards[i].s = 2; s.guards[i].dir = s.guards[i].dir + 1; if (s.guards[i].dir > 4) then s.guards[i].dir = 1; end; elseif (s.guards[i].s == 2) then s.guards[i].s = 1; if (s.guards[i].dir == 1) then if (s.definitions[s.guards[i].pos].e1) then s.guards[i].pos = s.definitions[s.guards[i].pos].e1; end; elseif (s.guards[i].dir == 2) then if (s.definitions[s.guards[i].pos].e2) then s.guards[i].pos = s.definitions[s.guards[i].pos].e2; end; elseif (s.guards[i].dir == 3) then if (s.definitions[s.guards[i].pos].e3) then s.guards[i].pos = s.definitions[s.guards[i].pos].e3; end; elseif (s.guards[i].dir == 4) then if (s.definitions[s.guards[i].pos].e4) then s.guards[i].pos = s.definitions[s.guards[i].pos].e4; end; end; end; end; local g_y = math.floor(tonumber(s.guards[i].pos) / 10); local g_x = tonumber(s.guards[i].pos) % 10; --print("guard:", g_x, g_y) --Видимость при разнице не более двух. В прямой видимости - видно, иначе - слышно --TODO может стоит сделать, чтобы шаги были слышны только при движении стражнека? if (g_x == pl_x) then --North-south line if (g_y - pl_y == 2) then pr("На севере вы видите охранника. Он смотрит на " .. getDirName(s.guards[i].dir) .. ". "); elseif (g_y - pl_y == 1) then pr("На севере, совсем рядом, вы видите охранника. Он смотрит на " .. getDirName(s.guards[i].dir) .. ". "); elseif (pl_y - g_y == 1) then pr("На юге, совсем рядом, вы видите охранника. Он смотрит на " .. getDirName(s.guards[i].dir) .. ". "); elseif (pl_y - g_y == 2) then pr("На юге вы видите охранника. Он смотрит на " .. getDirName(s.guards[i].dir) .. ". "); end; elseif (g_y == pl_y) then --east-west line if (g_x - pl_x == 2) then pr("На востоке вы видите охранника. Он смотрит на " .. getDirName(s.guards[i].dir) .. ". "); elseif (g_x - pl_x == 1) then pr("На востоке, совсем рядом, вы видите охранника. Он смотрит на " .. getDirName(s.guards[i].dir) .. ". "); elseif (pl_x - g_x == 1) then pr("На западе, совсем рядом, вы видите охранника. Он смотрит на " .. getDirName(s.guards[i].dir) .. ". "); elseif (pl_x - g_x == 2) then pr("На западе вы видите охранника. Он смотрит на " .. getDirName(s.guards[i].dir) .. ". "); end; else if (g_x - pl_x == 1 and g_y - pl_y == 1) then pr("К северовостоку от вас вы слышите шаги охранника. "); elseif (g_x - pl_x == 1 and pl_y - g_y == 1) then pr("К юговостоку от вас вы слышите шаги охранника. "); elseif (pl_x - g_x == 1 and g_y - pl_y == 1) then pr("К северозападу от вас вы слышите шаги охранника. "); elseif (pl_x - g_x == 1 and pl_y - g_y == 1) then pr("К югозападу от вас вы слышите шаги охранника. "); end; end; end; end; makeTurn = function(s) --print("turn"); --print(s.guards[1].pos, s.guards[1].dir); --print(s.guards[2].pos, s.guards[2].dir); --print(s.guards[3].pos, s.guards[3].dir); --print(s.guards[4].pos, s.guards[4].dir); -- TODO debug if (s:checkGuardSight()) then s:guardTurn(); if (s:checkGuardSight()) then if (warehouse_32_definitions[warehouse_32.pos].e1 or warehouse_32_definitions[warehouse_32.pos].ex1) then path("На север"):enable(); else path("На север"):disable(); end; if (warehouse_32_definitions[warehouse_32.pos].e2 or warehouse_32_definitions[warehouse_32.pos].ex2) then path("На восток"):enable(); else path("На восток"):disable(); end; if (warehouse_32_definitions[warehouse_32.pos].e3 or warehouse_32_definitions[warehouse_32.pos].ex3) then path("На юг"):enable(); else path("На юг"):disable(); end; if (warehouse_32_definitions[warehouse_32.pos].e4 or warehouse_32_definitions[warehouse_32.pos].ex4) then path("На запад"):enable(); else path("На запад"):disable(); end; if (warehouse_32_definitions[warehouse_32.pos].corner) then path("Спрятаться"):enable(); else path("Спрятаться"):disable(); end; if (warehouse_32.hidden) then path("Спрятаться"):disable(); path("Выбраться из укрытия"):enable(); path("На запад"):disable(); path("На восток"):disable(); path("На север"):disable(); path("На юг"):disable(); else path("Выбраться из укрытия"):disable(); end; if (warehouse_32_definitions[warehouse_32.pos].sector) then warehouse_32_shelves.current = warehouse_32_definitions[warehouse_32.pos].sector; warehouse_32_shelves:enable(); else warehouse_32_shelves:disable(); end; end; end; end; enter = function(s) s:makeTurn(); end; way = { kh_vroom("На север", function(s) if (warehouse_32_definitions[warehouse_32.pos].ex1) then return warehouse_32_definitions[warehouse_32.pos].ex1; else warehouse_32.pos = warehouse_32_definitions[warehouse_32.pos].e1; end; return "warehouse_32"; end); kh_vroom("На юг", function(s) if (warehouse_32_definitions[warehouse_32.pos].ex3) then return warehouse_32_definitions[warehouse_32.pos].ex3; else warehouse_32.pos = warehouse_32_definitions[warehouse_32.pos].e3; end; return "warehouse_32"; end); kh_vroom("На запад", function(s) if (warehouse_32_definitions[warehouse_32.pos].ex4) then return warehouse_32_definitions[warehouse_32.pos].ex4; else warehouse_32.pos = warehouse_32_definitions[warehouse_32.pos].e4; end; return "warehouse_32"; end); kh_vroom("На восток", function(s) if (warehouse_32_definitions[warehouse_32.pos].ex2) then return warehouse_32_definitions[warehouse_32.pos].ex2; else warehouse_32.pos = warehouse_32_definitions[warehouse_32.pos].e2; end; return "warehouse_32"; end); kh_vroom("Ждать", function(s) return "warehouse_32"; end); kh_vroom("Спрятаться", function(s) warehouse_32.hidden = true; return "warehouse_32"; end); kh_vroom("Выбраться из укрытия", function(s) warehouse_32.hidden = false; return "warehouse_32"; end); }; obj = { 'warehouse_32_shelves' }; }; warehouse_32_shelves = obj { nam = "warehouse_32_shelves"; current = "E1"; dsc = function (s) return "Стеллажи, расположенные в этой секции отмечены табличкой {" .. s.current .. "}"; end; act = function(s) w32_shelf_input.sector = s.current; walkin("w32_shelf_input"); end; }; w32_shelf_input = input_number { nam = "w32_shelf_input"; disp = function(s) return "Стеллаж с отметкой " .. s.sector; end; check = function(s, input) for i = 1, #s.items do if (s.items[i].shelf == s.sector and w32_shelf_input.items[i].position == input and not w32_shelf_input.items[i].taken) then w32_shelf_input.items[i].taken = true; pn(stead.ref(s.items[i].n).disp); put(s.items[i].n, pl); end; end; back(); end; label = "Укажите номер позиции:"; items = { { n = "item_electrodes"; }; { n = "item_pump_details"; }; }; }; function warehouse32_init() print("init w32"); for i = 1, #w32_shelf_input.items do local ok = false; while not ok do local index1 = rnd(4); local index2 = rnd(4); local shelf_name; if (index1 == 1) then shelf_name = 'A'; elseif (index1 == 2) then shelf_name = 'B'; elseif (index1 == 3) then shelf_name = 'C'; elseif (index1 == 4) then shelf_name = 'D'; end; shelf_name = shelf_name .. tostring(index2); w32_shelf_input.items[i].shelf = shelf_name; w32_shelf_input.items[i].position = tostring(rnd(100)); ok = true; for j = 1, i - 1 do if (w32_shelf_input.items[i].shelf == w32_shelf_input.items[j].shelf and w32_shelf_input.items[i].position == w32_shelf_input.items[j].position) then ok = false; end; end; end; end; end;