Changeset - 6e7519136e47
[Not reviewed]
default
2 10 3
Silverwing - 9 years ago 2015-10-03 06:56:41

Project state at 03.10.15
15 files changed with 2216 insertions and 496 deletions:
0 comments (0 inline, 0 general)
coachman.lua
Show inline comments
 
deleted file
dock2.lua
Show inline comments
 
@@ -3,84 +3,208 @@
 
Верфь заброшена, многие механизмы придется ремонтировать.
 
Здесь игрок найдет подводную лодку, которую нужно будет восстановить.
 
]]
 
shipyard_2 = room {
 
	nam = "shipyard_2";
 
	disp = "Верфь";
 
dock_2 = room {
 
	nam = "dock_2";
 
	disp = "Док 2, вход";
 
	dsc = [[
 
		Вы стоите у входа в огромное обветшалое здание. Полусодранная вывеска сообщает, что здание является собственностью компании Вест-Хэйвен Транс-Оушен. 
 
		Вы стоите перед старым железный забором. 
 
	]];
 
	enter = function(s)
 
		move(char_coachman, here());
 
	end;
 
	way = {
 
		vroom("Войти", "dock_inside"):disable();
 
	};
 
	obj = {
 
		vway("Вход", "Огромные ворота слегка приоткрыты. Вы можете {войти}^", "shipyard_inside")
 
		"dock_gate"
 
	};
 
};
 
 
shipyard_inside = room {
 
	nam = "shipyard_inside";
 
	disp = "Верфь";
 
dock_gate = obj {
 
	nam = "dock_gate";
 
	disp = "Ворота";
 
	dsc = function(s)
 
		if (s.open) then 
 
			return "Ржавые {ворота} слегка приоткрыты. ";
 
		else
 
			return "На проржавевших воротах висит {амбарный замок}. ";
 
		end;
 
	end;
 
	act = function (s)
 
		if (s.open) then
 
			return [[Ворота приоткрыты достаточно, чтобы вы могли войти внутрь. ]];
 
		else
 
			return [[
 
				Массивный старый замок уже изрядно проржавел. Даже если бы у вас был ключ, вы врядли смогли бы открыть его. 
 
			]];
 
		end;
 
	end;
 
	used = function(s,o)
 
		if (s.open) then
 
			return "Я больше ничего не могу здесь сделать. ";
 
		end;
 
		if (o == item_toolbox) then
 
			s.open = true;
 
			path("Войти"):enable();
 
			return "Пользуясь ломиком, найденным в ящике, вы снимаете замок с ворот. С жутким скрипом вам удается приоткрыть их. Теперь вы можете войти внутрь. ";
 
		else
 
			return "Врядли это поможет. ";
 
		end;
 
	end;
 
	
 
};
 
 
dock_inside = room {
 
	nam = "dock_inside";
 
	disp = "Док";
 
	dsc = [[
 
		Вы находитесь внутри верфи. Огромное полупустое здание. Под потолком расположены краны, некогда служившие для подъема и спуска кораблей. 
 
		Вдоль стен лежат сотни ящиков. Большинство из них уже успели прогнить, но некоторые сохранились весьма неплохо.
 
		Вы находитесь на территории дока, принадлежавшего компании Вестхейвен Транс Оушен, о чем свидетельствует обшарпанная табличка над входом. 
 
	]];
 
	view = [[
 
		Левиафан находится в доке
 
	]];
 
	way = {
 
		vroom("Выйти", "dock_2");
 
		vroom("К причалу", "dock_mooring");
 
	};
 
	obj = {
 
		vway("Ржавая лестница", "Старая проржавевшая лестница ведет {на второй этаж}^", "shipyard_2nd_floor"),
 
		vway("Выход", "Огромные ворота слегка приоткрыты. Вы можете {выйти}^", "shipyard_2")
 
		"dock_boxes"
 
	};
 
};
 
 
shipyard_2nd_floor = room {
 
	nam = "shipyard_2nd_floor";
 
	disp = "Верфь, второй этаж";
 
dock_boxes = obj {
 
	nam = "dock_boxes";
 
	disp = "Ящики";
 
	dsc = "Ровными рядами вокруг расположены грузовые {контейнеры}. ";
 
	act = "Старые контейнеры. Скорее всего, большинство из них пусты. ";
 
};
 
 
dock_mooring = room {
 
	nam = "dock_inside";
 
	disp = "Причал";
 
	dsc = [[
 
		Вы находитесь внутри верфи. Огромное полупустое здание. Под потолком расположены краны, некогда служившие для подъема и спуска кораблей. 
 
		Вы находитесь на металлических мостках на уровне второго этажа. 
 
		Вы находитесь у причала дока 2. Повсюду вокруг стоят грузовые контейнеры с логотипом Вестхейвен Транс Оушен. 
 
	]];
 
	way = {
 
		vroom("К пульту управления краном", "dock_crane_control");
 
		vroom("В люк", "leviathan_disabled_airlock"):disable();
 
	};
 
	obj = {
 
		vway("Ржавая лестница вниз", "Старая проржавевшая лестница ведет {на первый этаж}^", "shipyard_inside"),
 
		vway("Ржавая лестница вверх", "Старая проржавевшая лестница ведет {на третий этаж}^", "shipyard_3rd_floor"),
 
		"dock_leviathan",
 
		"dock_crane"
 
	};
 
};
 
 
shipyard_3rd_floor = room {
 
	nam = "shipyard_3rd_floor";
 
	disp = "Верфь, третий этаж";
 
dock_leviathan = obj {
 
	nam = "dock_leviathan";
 
	disp = "Левиафан";
 
	submerged = true;
 
	dsc = function(s)
 
		if (s.submerged) then
 
			return "Под поверхностью воды виден какой-то большой металлический {предмет}. ";
 
		else
 
			return "На тросах подвешена странная машина. Торпедообразный корпус, в верхней части которого виден наглухо задраенный {люк}, а в задней видно несколько гребных винтов. Иллюминаторы, частично показавшиеся на поверхности покрыты грязью, не позволяя заглянуть внутрь. В передней части на борту прикреплена слегка поржавевшая табличка \"А04 - Левиафан\". "
 
		end;
 
	end;
 
	act = function(s)
 
		if (s.submerged) then
 
			return "В мутной воде вы не можете понять, что это. ";
 
		elseif (s.open) then
 
			--TODO
 
			s.open = false;
 
			path("В люк"):disable();
 
			return "Вы задраиваете люк";
 
		else
 
			--TODO
 
			s.open = true;
 
			path("В люк"):enable();
 
			return "Вы отдраиваете люк";
 
		end;	
 
	end;
 
};
 
 
dock_crane = obj {
 
	nam = "dock_crane";
 
	disp = "Подъемник";
 
	state = 0;
 
	dsc = function(s)
 
		if (s.state == 0) then
 
			return "Огромный металлический кран нависает над водой. {Тросы} сейчас подняты. ";
 
		elseif (s.state == 1) then
 
			return "Огромный металлический кран нависает над водой. {Тросы} опущены насколько это возможно - они почти полностью погружены в грязную воду. ";
 
		elseif (s.state == 2) then
 
			return "Огромный металлический кран нависает над водой. {Тросы} подцеплены к предмету, скрывающемуся под водой. ";
 
		else
 
			return "Огромный металлический кран нависает над водой. " -- На крюках подвешена странная машина. Торпедообразный корпус, в верхней части которого виден наглухо задраенный люк, а в задней видно несколько гребных винтов. Иллюминаторы, частично показавшиеся на поверхности покрыты грязью, не позволяя заглянуть внутрь. В передней части на борту прикреплена слегка поржавевшая табличка "А04 - Левиафан". 
 
		end;
 
	end;
 
	act = function(s)
 
		if (s.state == 0) then
 
			return "Нужно опустить тросы";
 
		elseif (s.state == 1) then
 
			s.state = 2;
 
			return "Вы подцепляете тросы к скрывающемуся под водой предмету. ";
 
		elseif (s.state == 2) then
 
			s.state = 1;
 
			return "Вы отцепляете тросы от скрывающегося под водой предмета. ";
 
		elseif (s.state == 3) then
 
			return "Вы больше ничего не можете сделать здесь";
 
		end;
 
	end;
 
};
 
 
dock_crane_control = room {
 
	nam = "dock_crane_control";
 
	disp = "Панель управления краном";
 
	dsc = [[
 
		Вы находитесь внутри верфи. Огромное полупустое здание. Под потолком расположены краны, некогда служившие для подъема и спуска кораблей. 
 
		Вы находитесь на металлических мостках на уровне третьего этажа. 
 
		Вы стоите на небольшой огороженной площадке перед панелью управления подъемником. На ней расположено два рычага.
 
	]];
 
	obj = {
 
		vway("Ржавая лестница вниз", "Старая проржавевшая лестница ведет {на второй этаж}^", "shipyard_2nd_floor"),
 
		vway("Ржавая лестница вверх", "Старая проржавевшая лестница ведет {на четвертый этаж}^", "shipyard_4th_floor"),
 
		"crane_lever_vertical",
 
		"crane_lever_rail",
 
		"crane_service_access_panel"
 
	};
 
	way = {
 
		vroom("Назад", "dock_mooring");
 
	};
 
};
 
 
shipyard_4th_floor = room {
 
	nam = "shipyard_4th_floor";
 
	disp = "Верфь, четвертый этаж";
 
	dsc = [[
 
		Вы находитесь внутри верфи. Огромное полупустое здание. Под потолком расположены краны, некогда служившие для подъема и спуска кораблей. 
 
		Вы находитесь на металлических мостках на уровне четвертого этажа. 
 
	]];
 
	obj = {
 
		vway("Ржавая лестница вниз", "Старая проржавевшая лестница ведет {на третий этаж}^", "shipyard_3rd_floor"),
 
		vway("Ржавая лестница вверх", "Старая проржавевшая лестница ведет {на пятый этаж}^", "shipyard_5th_floor"),
 
	};
 
crane_lever_vertical = obj {
 
	nam = "crane_lever_vertical";
 
	dsc = "{Один из них} установлен вертикально и имеет несколько промежуточных положений. Сбоку от него нарисованы стрелки вверх и вниз. ";
 
	act = function(s)
 
		print "fuck";
 
		if (dock_crane.broken) then
 
			return "Как ни дергаете вы рычаг, ничего не происходит";
 
		else
 
			-- TODO refactor
 
			-- TODO texts!
 
			if (dock_crane.state == 0) then
 
				dock_crane.state = 1;
 
				return [[Вы сдвигаете рычаг в крайнее нижнее положение. С громким скрежетом тросы опускаются. ]];
 
			elseif (dock_crane.state == 3) then
 
				dock_crane.state = 2;
 
				dock_leviathan.submerged = true;
 
				return [[Вы сдвигаете рычаг в крайнее нижнее положение. С громким скрежетом тросы опускаются и поднятый предмет скрывается под водой. ]];
 
			elseif (dock_crane.state == 2) then
 
				dock_crane.state = 3
 
				dock_leviathan.submerged = false;
 
				return [[Вы сдвигаете рычаг в крайнее верхнее положение. С громким скрежетом тросы поднимаются вместе с подцепленным к ним предметом. ]];
 
			elseif (dock_crane.state == 1) then
 
				dock_crane.state = 0;
 
				return [[Вы сдвигаете рычаг в крайнее верхнее положение. С громким скрежетом тросы поднимаются. ]];
 
			end;
 
		end;
 
	end;
 
};
 
 
shipyard_5th_floor = room {
 
	nam = "shipyard_5th_floor";
 
	disp = "Верфь, пятый этаж";
 
	disp = "Верфь, третий этаж";
 
	dsc = [[
 
		Вы находитесь внутри верфи. Огромное полупустое здание. Под потолком расположены краны, некогда служившие для подъема и спуска кораблей. 
 
		Вы находитесь на металлических мостках под самым потолком. 
 
	]];
 
	obj = {
 
		vway("Ржавая лестница вниз", "Старая проржавевшая лестница ведет {на четвертый этаж}^", "shipyard_4th_floor")
 
	};
 
};
 
\ No newline at end of file
 
crane_lever_rail = obj {
 
	nam = "crane_level_rail";
 
	dsc = "{Второй рычаг} установлен горизотельно и имеет три положения. Над ним нарисованы стрелки влево и вправо.";
 
	act = "Рычаг не поддается. ";
 
};
 
 
crane_service_access_panel = obj {
 
	nam = "crane_service_access_panel";
 
};
 
items.lua
Show inline comments
 
item_bankbook = obj {
 
	nam = "Банковская книжка";
 
	inv = [[
 
		Ваша банковская книжка. 
 
	]];
 
};
 
 
item_coin = obj {
 
	nam = "coin";
 
	disp = "1 шиллинг";
 
	inv = [[Монета достоинством в 1 шиллинг]];
 
};
 
 
item_money = obj {
 
	nam = "money";
 
	disp = "Деньги";
 
	inv = [[Кошелек с монетами различного достоинства]];
 
};
 
 
item_note_1 = obj {
 
	nam = "note1";
 
	disp = "Записка";
 
	inv = [[Клочок бумаги с адресом: [Адрес Майкла Райта], Майкл Райт]];
 
};
 
 
item_charts = obj {
 
	nam = "charts";
 
	disp = "Документы отца";
 
	dsc = [[
 
		На столе лежат {схемы складов и верфей} Вест-Хэйвен Транс-Оушен
 
	]];
 
	inv = [[
 
		Схемы нескольких строений, принадлежавших компании отца. На некоторых схемах есть места отмечены жирными крестиками.
 
		Схемы с крестиками обозначены как склад 18, док 2, склад 32
 
	]];
 
	use = function(s, o)
 
		if (o == char_michael) then
 
			remove(s, pl);
 
			put(s, item_michael_table);
 
			char_michael.documents = true;
 
			return [[
 
				Вы отдаете бумаги Майклу. Он кладет их на стол и принимается изучать.
 
			]];
 
		end;
 
	end;
 
	tak = function()
 
		char_michael.documents = false;
 
		return "Вы забираете бумаги";
 
	end;
 
};
 
 
item_toolbox = obj {
 
	nam = "toolbox";
 
	disp = "Ящик с инструментами";
 
	dsc = [[
 
		Вы видите {ящик} со всевозможными полезными и не очень инструментами - отвертками, ключами, молотками и т.д.^
 
	]];
 
	tak = [[
 
		Вы оглядываетесь, но не видите никого, кому мог бы принадлежать этот ящик. Пожав плечами, вы забираете его.
 
	]];
 
};
 
 
item_pickaxe = obj {
 
	nam = "pickaxe";
 
	disp = "Кирка";
 
@@ -177,4 +115,130 @@ item_umbrella = obj {
 
	nam = "umbrella";
 
	disp = "Зонт";
 
	inv = [[Совершенно новый зонт производства "Винсент и сыновья". ]];
 
};
 
 
--[[
 
	Chapter 1
 
]]
 
item_lamp = obj {
 
	nam = "lamp";
 
	disp = "Лампа";
 
	inv = function(s)
 
		if (pl.has_light) then
 
			pl.has_light = false;
 
			return "Вы гасите свет";
 
		else
 
			pl.has_light = true;
 
			return "Вы зажигаете лампу";
 
		end;
 
	end;
 
};
 
 
item_toolbox = obj {
 
	nam = "toolbox";
 
	disp = "Ящик с инструментами";
 
	dsc = [[
 
		Вы видите {ящик} со всевозможными полезными и не очень инструментами - отвертками, ключами, молотками и т.д.^
 
	]];
 
	tak = function(s)
 
		if (not char_worker.bought) then
 
			return [[ Рабочий огрызается на вас:"Руки прочь!" ]], false;
 
		else
 
			return [[Вы забираете ящик с собой]], true;
 
		end;
 
	end;
 
	inv = [[
 
		Ящик со всевозможными полезными и не очень инструментами - отвертками, ключами, молотками и т.д.
 
	]];
 
};
 
 
item_money = obj {
 
	nam = "money";
 
	disp = function(s)
 
		if (pl.money == 0) then
 
			return "Пустой кошелек";
 
		else
 
			return s.money_format();
 
		end;
 
	end;
 
	inv = function(s)
 
		if (pl.money == 0) then
 
			return "Кошелек пуст";
 
		else
 
			return [[Кошелек с монетами различного достоинства на сумму ]] .. s.money_format();
 
		end;
 
	end;
 
	money_format = function()
 
		if (pl.money % 100 / 10 ~= 1 and pl.money % 10 == 1) then
 
			return tostring(pl.money) .. " шиллинг";
 
		elseif (pl.money % 100 / 10 ~= 1 and (pl.money % 10 == 2 or pl.money % 10 == 3 or pl.money % 10 == 4)) then
 
			return tostring(pl.money) .. " шиллинга";
 
		else 
 
			return tostring(pl.money) .. " шиллингов";
 
		end;
 
	end;
 
};
 
 
item_note_1 = obj {
 
	nam = "note1";
 
	disp = "Записка";
 
	inv = [[Клочок бумаги с адресом: [Адрес Майкла Райта], Майкл Райт]];
 
};
 
 
item_charts = obj {
 
	nam = "charts";
 
	disp = "Документы отца";
 
	dsc = [[
 
		На столе лежат {схемы складов и верфей} Вест-Хэйвен Транс-Оушен
 
	]];
 
	inv = [[
 
		Схемы нескольких строений, принадлежавших компании отца. На некоторых схемах есть места отмечены жирными крестиками.
 
		Схемы с крестиками обозначены как склад 18, док 2, склад 32
 
	]];
 
	use = function(s, o)
 
		if (o == char_wright_home) then
 
			remove(s, pl);
 
			put(s, item_wright_table);
 
			char_wright_home.documents = true;
 
			return [[
 
				Вы отдаете бумаги Джеку. Он кладет их на стол и принимается изучать.
 
			]];
 
		end;
 
	end;
 
	tak = function()
 
		pn("Лучше оставить бумаги Джеку. Возможно он что-нибудь найдет. ");
 
		return false;
 
	end;
 
};
 
 
item_electrodes = obj {
 
	nam = "item_electrodes";
 
	disp = "Электроды";
 
	inv = [[
 
		Несколько электродов - плоских свинцовых решеток. 
 
	]];
 
};
 
 
item_ducttape = obj {
 
	nam = "item_ducttape";
 
	disp = "Изолента";
 
	inv = [[
 
		Изолента
 
	]];
 
};
 
 
item_map = obj {
 
	nam = "item_map";
 
	disp = "Карта";
 
	inv = [[
 
		Карта Атлантического океана, судя по маркировке, принадлежащая компании "Вестхейвен Трансоушен". Ваше внимание привлекает отметка "Атлантида"
 
	]];
 
};
 
 
item_leviathan_schematics = obj {
 
	nam = "item_leviathan_schematics";
 
	disp = "Чертежи \"Левиафана\"";
 
	inv = [[
 
		Чертежи "Левиафана" - последней и самой совершенной субмарины Вестхейвен Трансоушен. 
 
	]];
 
};
 
\ No newline at end of file
jack.lua
Show inline comments
 
deleted file
leviathan.lua
Show inline comments
 
--[[
 
Ваша подводная лодка - Левиафан
 
Для начала вам придется починить ее
 
Имеет два двигателя - электрический и паровой
 
Для запуска машины потребуется починить и обеспечить энергией хотя бы один из них(уголь или батареи)
 
Имеет электрический двигатель
 
Для запуска машины потребуется его починить и обеспечить энергией
 
Левиафан - достаточно большая подводная лодка. Хотя она может управляться одним человеком, рассчитана она на много большее.
 
 
Имеется три доступных уровня освещения: 
 
@@ -10,27 +10,38 @@
 
Плохо освещено - Описания минимальны, большинство действий недостпны
 
Хорошо освещено - полные описания, все действия доступны
 
 
Можно включить или выключить внешнее освещение
 
 
Скафандры придется зарабатывать на Атлантиде
 
]]
 
 
-- TODO добавить описание перемещений между локациями в виде нескольких локаций-кат-сцен, из которых случайным образом выбирается одна
 
-- TODO персонажи не должны обсуждать личные темы по телефону, только при встрече
 
 
submarine_leviathan = obj {
 
	nam = "submarine_leviathan";
 
	disp = "Левиафан";
 
	suits = 0;
 
	
 
	-- dsc = [[
 
	--	Вы видите огромную металлическую конструкцию, напоминающую рыбу. Большие стеклянные иллюминаторы по бортам еще больше усиливают впечатление. На бортах крупными буквами выведено "А04 Левиафан". В верхней части машины вы видите {люк}.^ 
 
	--]];
 
	dsc = [[
 
		Вы видите "{Левиафан}" - вашу субмарину. ^
 
	]];
 
	act = [[ Несмотря на проведенные в бездействии годы, субмарина сейчас в отличном состоянии. Из иллюминаторов льется яркий свет. На борту виднреется слегка пошарпанная, но читаемая надпись "А04 - Левиафан" ]];
 
	-- TODO описание составлять из реального состояния подводной лодки.
 
	act = [[ Несмотря на проведенные в бездействии годы, субмарина сейчас в отличном состоянии. Из иллюминаторов льется яркий свет. На борту виднеется слегка пошарпанная, но читаемая надпись "А04 - Левиафан" ]];
 
	-- function()
 
		-- walk "leviathan_airlock";
 
		-- return "Оказавшись внутри, вы закрываете за собой люк";
 
	--end;
 
	-- user data
 
	suits = 0; -- Количество водолазных костюмов. К демо-версии неприменимо
 
	battery = false; -- Состояние батареи 
 
	battery_charge = 100; -- Уровень заряда батареи
 
	circuit_breaks = 2; -- Разрывы цепи
 
	valves_to_replace = 2; -- Количество клапанов, которые нужно заменить для полноценной работы
 
	power_on = false; -- включена ли энергия
 
	air_level = 0; -- запас воздуха. Максимум - 5 дней(5 * 24 * 60 * 60 = 432000)
 
	airpump = false;
 
};
 
 
--leviathan_exit = obj {
 
@@ -44,143 +55,404 @@ submarine_leviathan = obj {
 
--	end;
 
--};
 
 
leviathan_airlock = room {
 
--leviathan_airlock = room {
 
--	nam = "leviathan_airlock";
 
--	disp = "Левиафан, шлюз";
 
--	leviathan = true;
 
--	dsc = [[
 
--		Вы находитесь в шлюзовом отсеке Левиафана. Яркий свет электрических ламп освещает помещение. 
 
--	]];
 
--	way = {
 
--		vroom("Кают-компания", "leviathan_wardroom");
 
--		vroom("Наружу", function()
 
--			return where(submarine_leviathan);
 
--		end);
 
--	};
 
--};
 
 
leviathan_airlock = darkroom {
 
	nam = "leviathan_airlock";
 
	disp = "Левиафан, шлюз";
 
	leviathan = true;
 
	dsc = [[
 
		Вы находитесь в шлюзовом отсеке Левиафана. Яркий свет электрических ламп освещает помещение. 
 
	]];
 
	dsc_lit = "Вы находитесь в шлюзовом отсеке Левиафана. Яркий свет электрических ламп освещает помещение. ";
 
	dsc_halflit = "Вы находитесь в шлюзовом отсеке Левиафана. В слабом свете лампы вы с трудом различаете очертания дверей и предметов. ";
 
	dsc_dark = "Вы находитесь в шлюзовом отсеке Левиафана. В темноте вы не можете ничего различить. ";
 
	way = {
 
		vroom("Кают-компания", "leviathan_wardroom");
 
		vroom("Наружу", function()
 
		kh_vroom("Кают-компания", "leviathan_wardroom", 1);
 
		kh_vroom("Наружу", function()
 
			return where(submarine_leviathan);
 
		end);
 
		end, 2);
 
	};
 
};
 
 
leviathan_captains_cabin = room {
 
leviathan_captains_cabin = darkroom {
 
	nam = "leviathan_captains_cabin";
 
	disp = "Левиафан, каюта капитана";
 
	leviathan = true;
 
	dsc = [[
 
	dsc_lit = [[
 
		Вы находитесь в каюте, очевидно, предназначенной для капитана. Эта каюта немного больше остальных, в ней размещен стол и стул. 
 
		В столе несколько ящичков, хитроумно закрытых, чтобы при качке они не открывались.
 
	]];
 
	dsc_halflit = [[
 
		Вы находитесь в каюте, очевидно, предназначенной для капитана. Эта каюта немного больше остальных. В слабом свете лампы вы с трудом различаете очертания дверей и предметов. 
 
	]];
 
	dsc_dark = [[Вы находитесь в одной из кают. В темноте вы не можете ничего различить. ]];
 
	way = {
 
		vroom("Каюты", "leviathan_cabins");
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
	obj = {
 
		"phone_cabin";
 
	};
 
};
 
 
leviathan_cabins = room {
 
	nam = "leviathan_cabins";
 
	disp = "Левиафан, каюты";
 
	leviathan = true;
 
	dsc  =[[
 
		Вы находитесь в длинном коридоре с множеством дверей, ведущих в каюты, расположенные по левому борту.
 
leviathan_cabin_1 = darkroom {
 
	nam = "leviathan_cabin_1";
 
	disp = "Левиафан, каюта №1";
 
	dsc = [[
 
		Вы находитесь в одной из кают Левиафана
 
	]];
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
};
 
 
leviathan_cabin_2 = darkroom {
 
	nam = "leviathan_cabin_2";
 
	disp = "Левиафан, каюта №2";
 
	dsc = [[
 
		Вы находитесь в одной из кают Левиафана
 
	]];
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
};
 
 
leviathan_cabin_3 = darkroom {
 
	nam = "leviathan_cabin_3";
 
	disp = "Левиафан, каюта №3";
 
	dsc = [[
 
		Вы находитесь в одной из кают Левиафана
 
	]];
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
};
 
 
leviathan_cabin_4 = darkroom {
 
	nam = "leviathan_cabin_4";
 
	disp = "Левиафан, каюта №4";
 
	dsc = [[
 
		Вы находитесь в одной из кают Левиафана
 
	]];
 
	way = {
 
		vroom("Каюта капитана", "leviathan_captains_cabin");
 
		vroom("Кают-компания", "leviathan_wardroom");
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
	
 
};
 
 
leviathan_cabin_5 = darkroom {
 
	nam = "leviathan_cabin_5";
 
	disp = "Левиафан, каюта №5";
 
	dsc = [[
 
		Вы находитесь в одной из кают Левиафана
 
	]];
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
};
 
 
leviathan_cargo_hold = room {
 
leviathan_corridor = darkroom {
 
	nam = "leviathan_corridor";
 
	disp = "Левиафан, коридор";
 
	leviathan = true;
 
	dsc_lit = [[
 
		Вы находитесь в длинном коридоре с множеством дверей, ведущих в каюты, расположенные по левому борту.
 
	]];
 
	dsc_halflit = [[
 
		Вы находитесь в длинном коридоре с множеством дверей, ведущих в каюты, расположенные по левому борту.
 
	]];
 
	dsc_dark = [[
 
		Вы находитесь в темном коридоре. В темноте ничего не видно. 
 
	]];
 
	way = {
 
		kh_vroom("В каюту капитана", "leviathan_captains_cabin", 1);
 
		kh_vroom("В каюту №1", "leviathan_cabin_1", 1);
 
		kh_vroom("В каюту №2", "leviathan_cabin_2", 1);
 
		kh_vroom("В каюту №3", "leviathan_cabin_3", 1);
 
		kh_vroom("В каюту №4", "leviathan_cabin_4", 1);
 
		kh_vroom("В каюту №5", "leviathan_cabin_5", 1);
 
		kh_vroom("Кают-компания", "leviathan_wardroom", 1);
 
		kh_vroom("В грузовой отсек", "leviathan_cargo_hold", 1);
 
		kh_vroom("В машинный отсек", "leviathan_engines", 1);
 
		kh_vroom("На нижнюю палубу", "leviathan_lower_deck", 1);
 
	};
 
	obj = {
 
		'leviathan_corridor_wiring';
 
	};
 
};
 
 
leviathan_cargo_hold = darkroom {
 
	nam = "leviathan_cargo_hold";
 
	disp = "Левиафан, грузовой отсек";
 
	leviathan = true;
 
	dsc = [[
 
	dsc_lit = [[
 
		Вы находитесь в грузовом отсеке Левиафана
 
	]];
 
	dsc_halflit = [[
 
		Вы находитесь в грузовом отсеке Левиафана
 
	]];
 
	dsc_dark = [[
 
		Вы находитесь в грузовом отсеке Левиафана
 
	]];
 
	way = {
 
		vroom("Кают-компания", "leviathan_wardroom");
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
	obj = {
 
		"leviathan_cargo_wiring";
 
	};
 
};
 
 
leviathan_wardroom = room {
 
leviathan_wardroom = darkroom {
 
	nam = "leviathan_wardroom";
 
	disp = "Левиафан, кают-компания";
 
	leviathan = true;
 
	dsc = [[
 
	dsc_lit = [[
 
		Вы находитесь в кают-компании Левиафана. Просторная комната, в центре которой укреплен массивный металлический стол. 
 
		Из машинного отсека доносится гул двигателей. Яркий свет электрических ламп освещает помещение. 
 
	]];
 
	dsc_halflit = [[
 
		Вы находитесь в кают-компании Левиафана. Просторная комната, в центре которой укреплен массивный металлический стол. 
 
	]];
 
	dsc_dark = [[
 
		Вы находитесь в кают-компании Левиафана. В темноте вы ничего не моежет разглядеть
 
	]];
 
	way = {
 
		vroom("Рубка", "leviathan_wheelhouse");
 
		vroom("Шлюз", "leviathan_airlock");
 
		vroom("Каюты", "leviathan_cabins");
 
		vroom("Грузовой отсек", "leviathan_cargo_hold");
 
		vroom("Машинный отсек", "leviathan_engines");
 
		kh_vroom("В рубку", "leviathan_wheelhouse", 1);
 
		kh_vroom("В шлюз", "leviathan_airlock", 1);
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
		kh_vroom("В грузовой отсек", "leviathan_cargo_hold", 1):disable();
 
		kh_vroom("В машинный отсек", "leviathan_engines", 1):disable();
 
	};
 
	obj = {
 
		"phone_wardroom";
 
		"leviathan_wardroom_wiring";
 
	};
 
};
 
 
leviathan_engines = room {
 
leviathan_engines = darkroom {
 
	nam = "leviathan_engines";
 
	disp = "Левиафан, машинное отделение";
 
	leviathan = true;
 
	dsc = [[
 
		Вы находитесь в машинном отделении Левиафана. Равномерный гул электрических двигателей сообщает о полной готовности субмарины. 
 
	dsc_lit = [[
 
		Вы находитесь в машинном отделении Левиафана. 
 
	]];
 
	dsc_halflit = [[
 
		Вы находитесь в машинном отделении Левиафана. 
 
	]];
 
	dsc_dark = [[
 
		Вы находитесь в машинном отделении Левиафана. В темноте вы ничего не можете разглядеть
 
	]];
 
	-- Равномерный гул электрических двигателей сообщает о полной готовности субмарины. 
 
	way = {
 
		vroom("Кают-компания", "leviathan_wardroom");
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
	obj = {
 
		'leviathan_battery';
 
		'leviathan_breaker';
 
		'leviathan_engineering_sensors';
 
		'leviathan_engineering_wiring';
 
	};
 
};
 
 
phone_cabin = obj {
 
	nam = "phone_cabin";
 
	disp = "Телефон";
 
leviathan_engineering_sensors = obj {
 
	nam = "leviathan_engineering_sensors";
 
	dsc = [[
 
		На столе установлен {телефонный аппарат} для связи в пределах субмарины. ^
 
		На стене над батареей расположена {панель} со множеством лампочек.
 
	]];
 
	act = function(s)
 
		walkin(phone_dlg);
 
		if (submarine_leviathan.battery) then
 
			pr("На панели горят следующие лампочки: ");
 
			pr("батарея работает");
 
			if (submarine_leviathan.power_on) then
 
				pr(", питание включено");
 
			end;
 
			if (submarine_leviathan.airpump) then
 
				pr(", воздушные насосы включены");
 
			end;
 
			if (submarine_leviathan.circuit_breaks > 0) then
 
				pr(", разорвана цепь освещения");
 
			end;
 
			pr(". ");
 
		else
 
			p("На панели не горит ни одна лампочка. ");
 
		end;
 
	end;
 
	seen_level = 1;
 
};
 
 
phone_wardroom = obj {
 
	nam = "phone_wardroom";
 
	disp = "Телефон";
 
	dsc = [[
 
		На столе, рядом с креслом командира установлен {телефонный аппарат} для связи в пределах субмарины. ^
 
	]];
 
leviathan_battery = obj {
 
	nam = "leviathan_battery";
 
	dsc = function(s)
 
		if (s.opened) then
 
			return [[
 
				Значительную часть помещения занимает {блок аккумуляторных батарей}. Крышка блока открыта и вы видите, что электроды подверглись сильной коррозии за долгое время неиспользования.
 
			]];
 
		else
 
			return [[
 
				Значительную часть помещения занимает {блок аккумуляторных батарей}. Крышка блока закрыта.
 
			]];
 
		end;
 
	end;
 
	act = function(s)
 
		walkin(phone_dlg);
 
		if (s.opened) then
 
			s.opened = false;
 
			return [[
 
				Вы возвращаете металлический лист, закрывающий батарею, на место.
 
			]];
 
		else
 
			if (not submarine_leviathan.battery) then
 
				s.opened = true;
 
				return [[
 
					Вы сдвигаете металлический лист, закрывающий батарею в сторону, получая доступ к ней.
 
				]];
 
			else
 
				return [[
 
					Незачем это трогать. 
 
				]];
 
			end;
 
		end;
 
	end;
 
	used = function(s, o)
 
		if (o == item_electrodes) then
 
			remove(item_electrodes, pl);
 
			submarine_leviathan.battery = true;
 
			s.opened = false;
 
			return [[
 
				Вы заменяете электроды. Теперь аккумулятор готов к работе. Вы возвращаете металлический лист, закрывающий батарею, на место.
 
			]];
 
		else
 
			return false;
 
		end;
 
	end;
 
	seen_level = 1;
 
	opened = false;
 
};
 
 
phone_dlg = dlg {
 
	nam = "phone_dlg";
 
	disp = "Телефон";
 
	hideinv = true;
 
	dsc = [[
 
		Вы снимаете трубку и можете вызвать кого-нибудь
 
	]];
 
	entered = function(s)
 
		poff("phaetlarr", "learr", "radcliffe", "wright");
 
		for i = 1, #pl.party do
 
			pon(pl.party[i]);
 
leviathan_breaker = obj {
 
	nam = "leviathan_breaker";
 
	dsc = function(s)
 
		if (submarine_leviathan.power_on) then
 
			return [[
 
				Рядом с батареей укреплен {рубильник}. Сейчас он включен.
 
			]];
 
		else
 
			return [[
 
				Рядом с батареей укреплен {рубильник}. Сейчас он выключен.
 
			]];
 
		end;
 
	end;
 
	act = function(s)
 
		if (submarine_leviathan.power_on) then
 
			submarine_leviathan.power_on = false;
 
			-- TODO включать свет по всему Левиафану, если восстановлены разрывы цепи и установлена батарея
 
			-- TODO включать двигатель если установлена батарея
 
			pr([[Вы выключаете рубильник]]);
 
		else
 
			submarine_leviathan.power_on = true;
 
			-- TODO включать двигатель если установлена батарея
 
			pr([[Вы включаете рубильник]]);
 
			if (submarine_leviathan.battery and submarine_leviathan.circuit_breaks == 0) then
 
				leviathan_airlock.has_light = true;
 
				leviathan_wardroom.has_light = true;
 
				leviathan_wheelhouse.has_light = true;
 
				leviathan_corridor.has_light = true;
 
				leviathan_cabin_1.has_light = true;
 
				leviathan_cabin_2.has_light = true;
 
				leviathan_cabin_3.has_light = true;
 
				leviathan_cabin_4.has_light = true;
 
				leviathan_cabin_5.has_light = true;
 
				leviathan_captains_cabin.has_light = true;
 
				leviathan_cargo_hold.has_light = true;
 
				leviathan_engines.has_light = true;
 
				leviathan_lower_deck.has_light = true;
 
				leviathan_life_support.has_light = true;
 
				pr([[Повсюда зажигается яркий свет, на мгновение ослепляя вас. ]]);
 
			end;
 
		end;
 
	end;
 
	phr = {
 
		{ tag = "phaetlarr", always = true, "Фаэтларр", code = [[walkin(phaetlarr_dlg)]]},
 
		{ tag = "learr", always = true, "Леарр", code = [[walkin(learr_dlg)]]},
 
		{ tag = "radcliffe", always = true, "Рэдклифф", code = [[walkin(radcliffe_dlg)]]},
 
		{ tag = "wright", always = true, "Райт", code = [[walkin(wright_dlg)]]},
 
		{ tag = "exit", always = true, "Положить трубку", code = [[back()]]}
 
	}
 
	seen_level = 1;
 
};
 
 
leviathan_lower_deck = darkroom {
 
	nam = "leviathan_lower_deck";
 
	disp = "Левиафан, нижняя палуба";
 
	dsc_lit = [[
 
		Вы находитесь на нижней палубе Левиафана. Здесь нет иллюминаторов. Повсюду раскиданы обломки металла, неизвестно откуда взявшиеся. В передней части помещения вы видите несколько отверстий для зарядки торпедных аппаратов.
 
	]];
 
	dsc_halflit = [[
 
		Вы находитесь на нижней палубе Левиафана. Здесь нет иллюминаторов. Повсюду раскиданы обломки металла, неизвестно откуда взявшиеся. В передней части помещения вы видите несколько отверстий для зарядки торпедных аппаратов.
 
	]];
 
	dsc_dark = [[
 
		Вы находитесь на нижней палубе Левиафана. Здесь нет иллюминаторов. В темноте вы ничего не можете разглядеть. 
 
	]];
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
		kh_vroom("К системе жизнеобеспечения", "leviathan_life_support", 1);
 
	};
 
	obj = {
 
		"leviathan_lower_wiring";
 
	};
 
};
 
 
leviathan_wheelhouse = room {
 
leviathan_life_support = darkroom {
 
	nam = "leviathan_life_support";
 
	disp = "Левиафан, система жизнеобеспечения";
 
	--TODO прочитать, разобраться как подобный отсек мог бы выглядеть и описать его как подобает
 
	dsc_lit = [[
 
		Вы находитесь в отсеке систем жизнеобеспечения "Левиафана". Это важнейший отсек корабля, в котором расположено все необходимое для обеспечения команды воздухом для дыхания в течение нескольких месяцев.
 
	]];
 
	dsc_halflit = [[
 
		Вы находитесь в отсеке систем жизнеобеспечения "Левиафана". Это важнейший отсек корабля, в котором расположено все необходимое для обеспечения команды воздухом для дыхания в течение нескольких месяцев.
 
	]];
 
	dsc_dark = [[
 
		Вы находитесь в отсеке систем жизнеобеспечения "Левиафана". В темноте вы ничего не можете разглядеть. 
 
	]];
 
	way = {
 
		kh_vroom("Назад", "leviathan_lower_deck", 1);
 
	};
 
	obj = {
 
		'leviathan_airtanks';
 
		'leviathan_airregen';
 
		"leviathan_life_wiring";
 
	};
 
};
 
 
leviathan_airtanks = obj {
 
	nam = "leviathan_airtanks";
 
	dsc = function(s)
 
		local percent = submarine_leviathan.air_level / 432000 * 100;
 
		if (percent < 1) then
 
			return [[
 
				Большую часть помещения занимают огромные {кислородные баллоны}. Толстые стенки из прочного сплава способны выдержать огромное давление. Судя по показаниям приборов, баллоны пусты. ]]
 
		else
 
			return [[
 
				Большую часть помещения занимают огромные {кислородные баллоны}. Толстые стенки из прочного сплава способны выдержать огромное давление. Судя по показаниям приборов, баллоны заполнены на ]] .. tostring(math.floor(percent + 0.5)) .. "%. ";
 
		end;
 
	end;
 
	seen_level = 1;
 
};
 
 
leviathan_airregen = obj {
 
	nam = "leviathan_airregen";
 
	dsc = [[ 
 
		{Установка регенерации воздуха} сейчас находится в плачевном состоянии - часть деталей отсутствуют, еще некоторые поломаны. 
 
	]];
 
	seen_level = 1;
 
};
 
 
leviathan_wheelhouse = darkroom {
 
	nam = "leviathan_wheelhouse";
 
	disp = "Левиафан, Рубка";
 
	dsc = function (s)
 
	--[[dsc_lit = function (s)
 
		local view = "";
 
		if (type(where(submarine_leviathan).view) == "function") then
 
			view = where(submarine_leviathan).view(where(submarine_leviathan));
 
@@ -188,18 +460,255 @@ leviathan_wheelhouse = room {
 
			view = where(submarine_leviathan).view;
 
		end;
 
	
 
		return [[
 
			Вы находитесь в рулевой рубке Левиафана. Три огромных иллюминатора дают превосходный обзор. Яркий свет электрических ламп освещает помещение.  
 
		]] .. (view);
 
		return [
 
			Вы находитесь в рулевой рубке Левиафана. Три огромных иллюминатора дают превосходный обзор. 
 
		] .. (view);
 
	end;
 
	dsc_halflit = function (s)
 
		
 
	end;]]
 
	dsc_lit = [[
 
		Вы находитесь в рулевой рубке Левиафана. Три огромных иллюминатора дают превосходный обзор. 
 
	]];
 
	dsc_halflit = [[
 
		Вы находитесь в рулевой рубке Левиафана. Три огромных иллюминатора дают превосходный обзор. 
 
	]];
 
	dsc_dark = [[
 
		Вы находитесь в рулевой рубке Левиафана. Три огромных иллюминатора дают превосходный обзор. В темноте вы ничего не можете разглядеть. 
 
	]];
 
	way = {
 
		vroom("Кают-компания", "leviathan_wardroom");
 
		kh_vroom("В коридор", "leviathan_corridor", 2);
 
	};
 
	obj = {
 
		vway("handwheel", "Перед вами расположен {штурвал}. ^", 'leviathan_dlg') 
 
		'leviathan_handwheel';
 
		--kh_vway("handwheel", "Перед вами расположен {штурвал}. Рядом с ним расположено несколько рычагов. ", 'leviathan_dlg', 1);
 
		'leviathan_airpump_control';
 
		'leviathan_controls';
 
		'leviathan_wheelhouse_sensors';
 
		"leviathan_wheelhouse_wiring";
 
	};
 
};
 
 
leviathan_handwheel = obj {
 
	nam = "leviathan_handwheel";
 
	dsc = [[
 
		Перед вами расположен {штурвал}. Рядом с ним расположено несколько рычагов. 
 
	]];
 
	act = function(s)
 
		if (atlantis_found and submarine_control_learned) then
 
			walkin("demo_end");
 
			--walkin('leviathan_dlg');
 
		elseif (atlantis_found) then
 
			return [[
 
				Вы не знаете, как управлять субмариной. 
 
			]];
 
		else
 
			return [[
 
				Вы не знаете, куда плыть. 
 
			]];
 
		end;
 
	end;
 
};
 
 
leviathan_airpump_control = obj {
 
	nam = "leviathan_airpump_control";
 
	dsc = function(s)
 
		if (submarine_leviathan.airpump) then
 
			return [[
 
				Один из них отвечает за управление {воздушными насосами} и находится сейчас во включенном состоянии. 
 
			]];
 
		else
 
			return [[
 
				Один из них отвечает за управление {воздушными насосами} и находится сейчас в выключенном состоянии. 
 
			]];
 
		end;
 
	end;
 
	act = function(s)
 
		if (submarine_leviathan.airpump) then
 
			submarine_leviathan.airpump = false;
 
			return [[
 
				Вы выключаете воздушные насосы. 
 
			]];
 
		else
 
			lifeon(submarine_leviathan);
 
			submarine_leviathan.airpump = true;
 
			return [[
 
				Вы включаете воздушные насосы. 
 
			]];
 
		end;
 
	end;
 
	life = function(s)
 
		if (submarine_leviathan.power_on) then
 
			if (submarine_leviathan.airpump and submarine_leviathan.battery) then
 
				submarine_leviathan.air_level = submarine_leviathan.air_level + 250;
 
				if (submarine_leviathan.air_level > 432000) then submarine_leviathan.air_level = 432000;
 
				pr([[
 
					Вы слышите гул работающих насосов. 
 
				]]);
 
				end;
 
			end;
 
		end;
 
	end;
 
	seen_level = 1;
 
};
 
 
leviathan_controls = obj {
 
	nam = "leviathan_controls";
 
	dsc = [[
 
		Остальные {рычаги} используются для управления движением субмарины. 
 
	]];
 
	seen_level = 1;
 
};
 
 
leviathan_wheelhouse_sensors = obj {
 
	nam = "leviathan_wheelhouse_sensors";
 
	dsc = [[
 
		Чуть ниже рычагов находится небольшая {панель} с лампочками и стрелками каких-то приборов. 
 
	]];
 
	act = function(s)
 
		if (submarine_leviathan.battery) then
 
			pr("На панели горят следующие лампочки: ");
 
			pr("батарея работает");
 
			if (submarine_leviathan.power_on) then
 
				pr(", питание включено");
 
			end;
 
			if (submarine_leviathan.airpump) then
 
				pr(", воздушные насосы включены");
 
			end;
 
			if (submarine_leviathan.circuit_breaks > 0) then
 
				pr(", разорвана цепь освещения");
 
			end;
 
			pr(". ");
 
		else
 
			pr("На панели не горит ни одна лампочка. ");
 
		end;
 
		local percent = submarine_leviathan.air_level / 432000 * 100;
 
		pr ([[
 
			Кислородные баллоны заполнены на 
 
		]] .. tostring(math.floor(percent + 0.5)) .. "%. ");
 
	end;
 
	seen_level = 1;
 
};
 
 
leviathan_wiring_dsc = [[
 
	Под потолком висят какие-то {провода}. 
 
]];
 
 
leviathan_wiring_act = function(s)
 
	if (submarine_leviathan.power_on and submarine_leviathan.battery) then
 
		return [[
 
			Возможно, лучше отключить электричество, прежде чем копаться в проводах. 
 
		]];
 
	end;
 
	if (s.state == 0) then
 
		return [[
 
			Некоторые провода разорваны.
 
		]];
 
	elseif (s.state == 1) then
 
		return [[
 
			Некоторые провода перемотаны изолентой.
 
		]];
 
	else
 
		return [[
 
			Провода в порядке. 
 
		]];
 
	end;
 
end;
 
 
leviathan_wiring_used = function(s, o)
 
	if (submarine_leviathan.power_on and submarine_leviathan.battery) then
 
		return [[
 
			Возможно, лучше отключить электричество, прежде чем копаться в проводах. 
 
		]];
 
	end;
 
	if (o == item_ducttape and s.state == 0) then
 
		s.state = 1;
 
		submarine_leviathan.circuit_breaks = submarine_leviathan.circuit_breaks - 1;
 
		if (submarine_leviathan.circuit_breaks == 0) then
 
			for i = 1, #leviathan_wiring do
 
				leviathan_wiring[i]:disable();
 
			end;
 
			remove(item_ducttape, pl);
 
		end;
 
		return [[
 
			Вы соединяете провода и заматываете их изолентой. 
 
		]];
 
	end;
 
end;
 
 
leviathan_wheelhouse_wiring = obj {
 
	nam = "leviathan_wheelhouse_wiring";
 
	dsc = leviathan_wiring_dsc;
 
	act = leviathan_wiring_act;
 
	used = leviathan_wiring_used;
 
	state = 2;
 
	seen_level = 1;
 
};
 
 
leviathan_wardroom_wiring = obj {
 
	nam = "leviathan_wardroom_wiring";
 
	dsc = leviathan_wiring_dsc;
 
	act = leviathan_wiring_act;
 
	used = leviathan_wiring_used;
 
	state = 2;
 
	seen_level = 1;
 
};
 
 
leviathan_engineering_wiring = obj {
 
	nam = "leviathan_engineering_wiring";
 
	dsc = leviathan_wiring_dsc;
 
	act = leviathan_wiring_act;
 
	used = leviathan_wiring_used;
 
	state = 2;
 
	seen_level = 1;
 
};
 
 
leviathan_cargo_wiring = obj {
 
	nam = "leviathan_cargo_wiring";
 
	dsc = leviathan_wiring_dsc;
 
	act = leviathan_wiring_act;
 
	used = leviathan_wiring_used;
 
	state = 2;
 
	seen_level = 1;
 
};
 
 
leviathan_corridor_wiring = obj {
 
	nam = "leviathan_corridor_wiring";
 
	dsc = leviathan_wiring_dsc;
 
	act = leviathan_wiring_act;
 
	used = leviathan_wiring_used;
 
	state = 2;
 
	seen_level = 1;
 
};
 
 
leviathan_lower_wiring = obj {
 
	nam = "leviathan_lower_wiring";
 
	dsc = leviathan_wiring_dsc;
 
	act = leviathan_wiring_act;
 
	used = leviathan_wiring_used;
 
	state = 2;
 
	seen_level = 1;
 
};
 
 
leviathan_life_wiring = obj {
 
	nam = "leviathan_life_wiring";
 
	dsc = leviathan_wiring_dsc;
 
	act = leviathan_wiring_act;
 
	used = leviathan_wiring_used;
 
	state = 2;
 
	seen_level = 1;
 
};
 
 
leviathan_wiring = {
 
	leviathan_wheelhouse_wiring;
 
	leviathan_wardroom_wiring;
 
	leviathan_engineering_wiring;
 
	leviathan_cargo_wiring;
 
	leviathan_corridor_wiring;
 
	leviathan_lower_wiring;
 
	leviathan_life_wiring;
 
};
 
 
leviathan_dlg = dlg {
 
	nam = "leviathan_dlg";
 
	disp = "Штурвал Левиафана";
 
@@ -237,7 +746,10 @@ leviathan_dlg = dlg {
 
				pon(14);
 
			end;
 
		else
 
			leviathan_dlg:pon(1, 2, 3, 4);
 
			if (atlantis_found) then
 
				leviathan_dlg:pon(1);
 
			end;
 
			--leviathan_dlg:pon(1, 2, 3, 4);
 
			leviathan_dlg:poff(5);
 
			if (where(submarine_leviathan) == atlantis_dock) then	
 
				leviathan_dlg:poff(1);
 
@@ -329,4 +841,61 @@ leviathan_dlg = dlg {
 
			back();
 
		end}
 
	};
 
};
 
\ No newline at end of file
 
};
 
 
phone_cabin = obj {
 
	nam = "phone_cabin";
 
	disp = "Телефон";
 
	dsc = [[
 
		На столе установлен {телефонный аппарат} для связи в пределах субмарины. ^
 
	]];
 
	act = function(s)
 
		walkin(phone_dlg);
 
	end;
 
	seen_level = 1;
 
};
 
 
phone_wardroom = obj {
 
	nam = "phone_wardroom";
 
	disp = "Телефон";
 
	dsc = [[
 
		На столе, рядом с креслом командира установлен {телефонный аппарат} для связи в пределах субмарины. ^
 
	]];
 
	act = function(s)
 
		walkin(phone_dlg);
 
	end;
 
	seen_level = 1;
 
};
 
 
phone_dlg = dlg {
 
	nam = "phone_dlg";
 
	disp = "Телефон";
 
	hideinv = true;
 
	dsc = [[
 
		Вы снимаете трубку и можете вызвать кого-нибудь
 
	]];
 
	entered = function(s)
 
		poff("phaetlarr", "learr", "radcliffe", "wright");
 
		for i = 1, #pl.party do
 
			pon(pl.party[i]);
 
		end;
 
	end;
 
	phr = {
 
		{ tag = "phaetlarr", always = true, "Фаэтларр", code = [[walkin(phaetlarr_dlg)]]},
 
		{ tag = "learr", always = true, "Леарр", code = [[walkin(learr_dlg)]]},
 
		{ tag = "radcliffe", always = true, "Рэдклифф", code = [[walkin(radcliffe_dlg)]]},
 
		{ tag = "wright", always = true, "Райт", code = [[walkin(wright_dlg)]]},
 
		{ tag = "exit", always = true, "Положить трубку", code = [[back()]]}
 
	}
 
};
 
 
function leviathan_init()
 
	local i = 0;
 
	while i < submarine_leviathan.circuit_breaks do
 
		local t = rnd(#leviathan_wiring);
 
		if (leviathan_wiring[t].state == 2) then
 
			leviathan_wiring[t].state = 0;
 
			i = i + 1;
 
		end;
 
	end;
 
end;
 
\ No newline at end of file
leviathan_disabled.lua
Show inline comments
 
new file 100644
 
leviathan_disabled_airlock = room {
 
	nam = leviathan_disabled_airlock;
 
	disp = "Левиафан, шлюз";
 
	entered = function(s)
 
		lifeon(s);
 
	end;
 
	left = function(s)
 
		lifeoff(s);
 
	end;
 
	life = function(s)
 
		if (pl.has_light) then
 
			path("В дверь", s):enable();
 
		else
 
			path("В дверь", s):disable();
 
		end;
 
	end;
 
	dsc = function(s)
 
		if (pl.has_light) then
 
			return "Вы находитесь в шлюзовой камере \"Левиафана\". Вы с трудом различаете проход в соседнюю комнату. ";
 
		else
 
			return "Вы находитесь в шлюзовой камере \"Левиафана\". Сейчас здесь слишком темно и вы ничего не видите. ";
 
		end;
 
	end;
 
	
 
	way = {
 
		vroom("Выход", "dock_mooring");
 
		vroom("В дверь", "leviathan_disabled_wardroom"):disable();
 
	};
 
};
 
\ No newline at end of file
london.lua
Show inline comments
 
--[[
 
	Порт
 
]]
 
 
char_captain = character {
 
	nam = "char_captain";
 
	disp = "Капитан";
 
	dsc = [[
 
		{Капитан} стоит на носу и задумчиво смотрит на происходящее на палубе.
 
	]];
 
	phrases = {
 
		"Завтра мы отправляемся обратно в Америку. ",
 
		"\"Северное сияние\" - лучший из кораблей, которыми я управлял. ",
 
		"Кажется, дождь собирается. ",
 
		"Как вам путешествие?",
 
		"Этот пароход - гордость компании. ",
 
		"Иногда я вспоминаю свою молодость на \"Чайке\" и \"Нефритовой королеве\". "
 
	};
 
};
 
 
char_first_mate = character {
 
	nam = "char_first_mate";
 
	disp = "Первый помощник";
 
	dsc = [[
 
		{Первый помощник} наблюдает за покидающими корабль людьми.
 
	]];
 
	phrases = {
 
		"Скорей бы обратно в море. ",
 
		"Как вам путешествие?",
 
		"Надо бы осмотреть машину... ",
 
		"Капитан раньше командовал \"Чайкой\". Я не знаю, что стало с ней сейчас. ",
 
		"\"Северное сияние\" - гордость компании. ",
 
		"Это был мой первый трансатлантический рейс в качестве первого помощника. "
 
	};
 
};
 
 
aurora_borealis = room {
 
	nam = "aurora_borealis";
 
	disp = "\"Северное сияние\", палуба";
 
	dsc = [[
 
		На палубе парохода людно. Пассажиры один за другим сходят на берег. Небо покрыто тяжелыми тучами. Со всех сторон доносятся гудки пароходов.
 
	]];
 
	obj = {'char_captain', 'char_first_mate'};
 
	way = {
 
		vroom("Сойти на берег", "london_mooring");
 
	};
 
};
 
 
london_mooring = room {
 
	nam = "london_mooring";
 
	disp = "Причал";
 
	dsc = [[
 
		У причала не протолкнуться. У вас не остается выбора, кроме как отойти к порту вместе с толпой. 
 
	]];
 
	way = {
 
		vroom("Отойти от причала", "port");
 
	};
 
};
 
 
port = room {
 
	nam = "port";
 
	disp = "Порт";
 
@@ -11,12 +67,55 @@ port = room {
 
		Вы находитесь в порту. Небо покрыто тяжелыми тучами - вот-вот начнется дождь. 
 
		Вокруг кипит жизнь: снуют толпы народу, то и дело раздаются гудки пароходов, слышно ржание лошадей, запряженных в многочисленные экипажи, привозящие и увозящие людей.
 
	]];
 
	obj = {'item_toolbox'};
 
	obj = {'item_toolbox', 'char_worker'};
 
};
 
 
char_worker = character {
 
	nam = "char_worker";
 
	disp = "Портовый рабочий";
 
	dsc = [[ Рядом с ящиком стоит {портовый рабочий} и курит трубку.^ ]];
 
	dlg = "char_worker_dlg";
 
};
 
 
char_worker_dlg = dlg {
 
	nam = "char_worker_dlg";
 
	disp = "Портовый рабочий";
 
	dsc = [[
 
		Чего надо?
 
	]];
 
	phr = {
 
		{always=true, "Могу я воспользоваться вашими инструментами?", "Нет. ", [[ psub 'bribe_try' ]]};
 
		{always=true, "Нет, ничего", "Вали отсюда. ", [[ back(); ]]};
 
		{tag='bribe_try'};
 
		{always=true, "Поменяю на бутылку"};
 
		{always=true, "Могу я купить их у вас?", "Сколько?", [[ psub 'bribing_20' ]]};
 
		{always=true, "Нет, ничего", "Вали отсюда. ", [[ back(); ]]};
 
		{tag='bribing_20'};
 
		{"5 шиллингов?", "Смеешься?"};
 
		{always=true, "10 шиллингов?", "15", [[psub 'bribing_15']]};
 
		{always=true, "20 шиллингов?", "Идет", [[ char_worker.bought = true; back();]]};
 
		{always=true, "30 шиллингов?", "Идет", [[ char_worker.bought = true; back();]]};
 
		{tag='bribing_15'};
 
		{always=true, "10", "14", [[psub 'bribing_14']]};
 
		{always=true, "11", "14", [[psub 'bribing_14']]};
 
		{always=true, "12", "14", [[psub 'bribing_14']]};
 
		{always=true, "13", "14", [[psub 'bribing_14']]};
 
		{always=true, "14", "14", [[ char_worker.bought = true; back(); ]]};
 
		{tag='bribing_14'};
 
		{always=true, "10", "13", [[psub 'bribing_13']]};
 
		{always=true, "11", "13", [[psub 'bribing_13']]};
 
		{always=true, "12", "13", [[psub 'bribing_13']]};
 
		{always=true, "13", "13", [[ char_worker.bought = true; back(); ]]};
 
		{tag='bribing_13'};
 
		{always=true, "10", "Вали отсюда, надоел. ", [[ back(); ]]};
 
		{always=true, "11", "Вали отсюда, надоел. ", [[ back(); ]]};
 
		{always=true, "12", "Идет", [[ char_worker.bought = true; back(); ]]};
 
	};
 
};
 
 
--[[
 
	Банк
 
]]
 
]
 
bank_street = room {
 
	nam = "bank_street";
 
	disp = "У входа в банк";
 
@@ -24,9 +123,9 @@ bank_street = room {
 
		move(char_coachman, here());
 
	--	lifeon(s);
 
	end;
 
	dsc = [[
 
	dsc = [
 
		Вы находитесь на улице у входа в банк - двухэтажное здание с большой украшенной вывеской "Банк Джонсона" над входом. 
 
	]];
 
	];
 
	way = {
 
		vroom("В банк", "bank_inside");
 
	};
 
@@ -38,9 +137,9 @@ bank_street = room {
 
bank_inside = room {
 
	nam = "bank_inside";
 
	disp = "В банке";
 
	dsc = [[
 
	dsc = [
 
		Вы находитесь в банке. Высокие окна закрыты плотными занавесками, однако в зале светло благодаря многочисленным газовым лампам, укрепленным на стенах и колоннах по всему залу. Мраморный пол идеально чист, несмотря на снующих посетителей. 
 
	]];
 
	];
 
	way = {
 
		vroom("На улицу", "bank_street");
 
	};
 
@@ -51,23 +150,58 @@ bank_inside = room {
 
 
clerk = obj {
 
	nam = "clerk";
 
	dsc = [[
 
	dsc = [
 
		За  мраморной стойкой вы видите скучающего {клерка}.
 
	]];
 
	act = [[ Без банковской книжки вам здесь денег не выдадут. ]];
 
	];
 
	act = [ Без банковской книжки вам здесь денег не выдадут. ];
 
	used = function(s, o)
 
		if (o == item_bankbook) then
 
			global.has_money = true;
 
			remove(item_bankbook, pl);
 
			take(item_money);
 
			return "Вы протягиваете клерку вашу банковскую книжку и снимаете некоторое количество денег со счета";
 
		end;
 
	end;
 
};
 
};]]
 
 
--[[
 
	Гостиница
 
]]
 
 
ginshop = room {
 
	nam = "ginshop";
 
	disp = "Пивная лавка";
 
	dsc = [[
 
		Вы находитесь в небольшой комнатушке. 
 
	]];
 
	obj = {'ginshop_trader'};
 
};
 
 
ginshop_trader = character {
 
	nam = "ginshop_trader";
 
	disp = "Торговец";
 
	dsc = [[
 
		За грязным прилавком, не раз залитым пивом и другими напитками стоит подслеповатый {торговец}. 
 
	]];
 
	dlg = "ginshop_trader_dlg";
 
};
 
 
ginshop_trader_dlg = dlg {
 
	nam = "ginshop_trader_dlg";
 
	disp = "Торговец";
 
	dsc = [[
 
		Добро пожаловать, чем могу вам помочь?
 
	]];
 
	phr = {
 
		{1, "Бутылочку чего-нибудь покрепче, пожалуйста", "Ага, щас"};
 
		{2, always = true, "Это все, спасибо", "До свидания", 
 
			function() 
 
				back();
 
			end;
 
		};
 
	};
 
};
 
 
hotel_street = room {
 
	nam = "hotel_street";
 
	disp = "У входа в гостиницу";
 
@@ -75,8 +209,13 @@ hotel_street = room {
 
		move(char_coachman, here());
 
	end;
 
	dsc = [[
 
		Вы стоите на улице у входа в гостиницу. Гостиница представляет собой трехэтажное кирпичное здание. 
 
		Вы стоите на улице у входа в гостиницу. Гостиница представляет собой трехэтажное кирпичное здание. Ниже по улице вы видите здание, на котором висит вывеска пивной лавки.
 
	]];
 
	way = {
 
		vroom("В гостиницу", "hotel_hall");
 
		vroom("В переулок", "hotel_alley");
 
		vroom("В пивную лавку", "ginshop");
 
	};
 
};
 
 
hotel_hall = room {
 
@@ -85,16 +224,154 @@ hotel_hall = room {
 
	dsc = [[
 
		Вы находитесь в холле гостиницы. Просторный зал, по высоте составляющий два этажа. В задней части вы видите широкую лестницу, застеленную красной дорожкой. Занавески на окнах аккуратно собраны в стороны, позволяя свету проникнуть в помещение. Несмотря на это, под потолком горит огромная люстра, украшенная золотом и серебром. 
 
	]];
 
	obj = {
 
		'hotel_concierge'
 
	};
 
	way = {
 
		vroom("На улицу", "hotel_street");
 
		vroom("В номер", "hotel_room");
 
		vroom("К номерам на первом этаже", "hotel_corridor_1");
 
		vroom("на второй этаж", "hotel_corridor_2");
 
	};
 
};
 
 
hotel_corridor_1 = room {
 
	nam = "hotel_corridor_1";
 
	disp = "Отель, первый этаж";
 
	dsc = "Вы находитесь в коридоре гостиницы. ";
 
	way = {
 
		vroom("В холл", "hotel_hall");
 
		vroom("В комнату №2", "hotel_room_2"):disable();
 
	};
 
};
 
 
hotel_corridor_2 = room {
 
	nam = "hotel_corridor_2";
 
	disp = "Отель, второй этаж";
 
	dsc = "Вы находитесь в коридоре гостиницы. ";
 
	way = {
 
		vroom("В холл", "hotel_hall");
 
		vroom("В комнату №7", "hotel_room_7"):disable();
 
	};
 
};
 
 
hotel_room_2 = room {
 
	nam = "hotel_room_2";
 
	disp = "Комната №2";
 
	dsc = [[
 
		Вы находитесь в комнате Джозефа Старлайта.
 
	]];
 
};
 
 
hotel_room_7 = room {
 
	nam = "hotel_room_7";
 
	disp = "Комната №7";
 
	dsc = [[
 
		Вы находитесь в вашей комнате в отеле.
 
	]];
 
	way = {
 
		vroom("Спуститься вниз", "hotel_hall");
 
	};
 
};
 
 
hotel_alley = room {
 
	nam = "hotel_alley";
 
	disp = "Переулок";
 
	entered = function(s)
 
		lifeon(alley_trader);
 
	end;
 
	left = function(s)
 
		lifeoff(alley_trader);
 
	end;
 
	dsc = [[
 
		Узкий, грязный проулок. 
 
	]];
 
	obj = {
 
		'alley_trader'
 
	};
 
	way = {
 
		vroom("Ко входу в гостиницу", "hotel_street");
 
	}
 
};
 
 
alley_trader = obj {
 
	nam = "alley_trader";
 
	disp = "Торговец редкостями";
 
	dsc = "Немолодой {человек} в старом пальто и очках стоит, опершись на стену одного из домов.";
 
	life = function(s)
 
		if(math.random(5) > 3 and where(pl) ~= alley_trader_dlg) then
 
			pn("Повернувшись к вам, человек спрашивает: \"Могу я чем-нибудь помочь?\"");
 
		end;
 
	end;
 
	act = function(s)
 
		walkin "alley_trader_dlg";
 
	end;
 
};
 
 
hotel_room = room {
 
	nam = "hotel_room";
 
	disp = "Ваш номер";
 
	
 
alley_trader_dlg = dlg {
 
	nam = "alley_trader_dlg";
 
	disp = "Торговец";
 
	hideinv = true;
 
	entered = function(s)
 
		if (global.light_needed) then
 
			pon(1);
 
		else
 
			poff(1);
 
		end;
 
		if (global.lockpick_needed) then
 
			pon(2);
 
		else
 
			poff(2);
 
		end;
 
		return [["У меня есть все, что вам нужно"]];
 
	end;
 
	phr = {
 
		{1, "Мне нужна лампа", function()
 
			take(item_lamp);
 
			return "Без проблем";
 
		end};
 
		{2, "Мне нужна отмычка", function()
 
			global.lockpick_needed = false;
 
			take(item_lockpick);
 
			return "Без проблем";
 
		end};
 
		{255, always = true, "Это все", function()
 
			back();
 
			return "До встречи";
 
		end};
 
	};
 
};
 
 
hotel_concierge = obj {
 
	nam = "hotel_concierge";
 
	disp = "Консьерж";
 
	dsc = [[
 
		За стойкой скучает {консьерж}.
 
	]];
 
	act = function(s)
 
		if (hotel_concierge.paid) then
 
			pn("Я уже снял номер");
 
		else
 
			walkin(hotel_concierge_dlg);
 
		end;
 
	end;
 
};
 
 
hotel_concierge_dlg = dlg {
 
	nam = "hotel_concierge_dlg";
 
	disp = "Консьерж";
 
	entered = [[
 
		Консьерж оживился, как только вы подошли: "Здравствуйте! Желаете снять номер?"
 
	]];
 
	phr = {
 
		{1, "Да, мне нужна комната на неделю. ", function()
 
			hotel_concierge.paid = true;
 
			path("В номер", hotel_hall):enable();
 
			back();
 
			return "Вы оплачиваете проживание и консьерж дает вам ключ от вашего номера.";
 
		end;};
 
		{255, always = true, "не сейчас", function()
 
			back();
 
			return "Когда соберетесь тогда и приходите.";
 
		end};
 
	};
 
};
 
\ No newline at end of file
main.lua
Show inline comments
 
@@ -2,7 +2,6 @@
 
-- $Version: 1.0$
 
-- $Author: Khaelenmore Thaal$
 
 
--TODO представить все дисплеи картинками
 
instead_version "1.9.1"
 
require "para"
 
require "dash"
 
@@ -17,8 +16,8 @@ dofile "party.lua"
 
dofile "game_over.lua";
 
-- Часть 1
 
dofile "london.lua"
 
dofile "jack.lua"
 
dofile "coachman.lua"
 
dofile "wright.lua"
 
dofile "travel.lua"
 
dofile "dock2.lua"
 
dofile "warehouse18.lua"
 
dofile "warehouse32.lua"
 
@@ -34,26 +33,97 @@ dofile "first_city_inner_rim.lua"
 
dofile "first_city_middle_rim.lua"
 
dofile "first_city_outer_rim.lua"
 
 
--TODO представить все дисплеи картинками
 
--TODO описания локаций должны изменяться в зависимости от посещения их днем или ночью
 
--TODO больше Flavour-textа
 
 
DAYTIME_DAY = "day";
 
DAYTIME_NIGHT = "night";
 
--DAYTIME_MORNING = "morning";	--6-10
 
--DAYTIME_DAY = "day";			--10-18
 
--DAYTIME_EVENING = "evening";	--18-22
 
--DAYTIME_NIGHT = "night";		--22-6
 
 
global = {
 
global {
 
	warehouse_found = false,
 
	dock_found = false,
 
	daytime = "day"
 
	--daytime = "morning",
 
	--hours = 7,
 
	--minutes = 0,
 
	--seconds = 0,
 
	atlantis_found = false
 
};
 
 
--item_clock = obj {
 
--	nam = "item_clock";
 
--	disp = "Часы";
 
--	inv = function(s)
 
--		return "Время " .. s.formatTime();
 
--	end;
 
--	formatTime = function()
 
--		local rval = tostring(hours);
 
--		if (hours == 1) then
 
--			rval = rval .. [[ час]];
 
--		elseif (hours == 2 or hours == 3 or hours == 4) then
 
--			rval = rval .. [[ часа]];
 
--		else
 
--			rval = rval .. [[ часов]];
 
--		end;
 
--		if (minutes > 0) then
 
--			if (minutes ~= 11 and minutes % 10 == 1) then
 
--				rval = rval .. " " .. tostring(minutes) .. " минута";
 
--			elseif (minutes / 10 ~= 1 and (minutes % 10 == 2 or minutes % 10 == 3 or minutes % 10 == 4)) then
 
--				rval = rval .. " " .. tostring(minutes) .. " минуты";
 
--			else 
 
--				rval = rval .. " " .. tostring(minutes) .. " минут";
 
--			end;
 
--		else
 
--			rval = rval .. " ровно";
 
--		end;
 
--		return rval;
 
--	end;
 
--	life = function()
 
--		seconds = seconds + 10;
 
--		if (seconds > 59) then
 
--			minutes = minutes + 1;
 
--			seconds = 0;
 
--		end;
 
--		if (minutes > 59) then
 
--			hours = hours + 1;
 
--			minutes = 0;
 
--		end;
 
--		if (hours > 12) then
 
--			hours = 1;
 
--		end;
 
--		if (hours > 5 and hours < 10) then
 
--			if (daytime == DAYTIME_NIGHT) then
 
--				daytime = DAYTIME_MORNING;
 
--			elseif (daytime == DAYTIME_DAY) then
 
--				daytime = DAYTIME_EVENING;
 
--			end;
 
--		end;
 
--		if (hours > 10) then
 
--			if (daytime == DAYTIME_MORNING) then
 
--				daytime = DAYTIME_DAY;
 
--			elseif (daytime == DAYTIME_EVENING) then
 
--				daytime = DAYTIME_NIGHT;
 
--			end;
 
--		end;
 
--	end;
 
--};
 
 
pl = player {
 
	nam = "player";
 
	disp = "Дэвид Дрейк";
 
	where = 'port';
 
	hitpoints = 10;
 
	obj = {'item_bankbook', 'item_umbrella', "item_charts", "item_note_1", "item_first_city_key", "item_colt", "item_coin"};
 
	-- obj = {'item_umbrella', "item_charts", "item_note_1", "item_first_city_key", "item_colt", "item_money"};
 
	obj = {'item_umbrella', 'item_charts', 'item_note_1', 'item_money', 
 
	--debug
 
	--'item_lamp', 'item_electrodes', 'item_ducttape', 'item_map'
 
	};
 
	-- party array. Should be empty on start
 
	party = {--[["learr", "radcliffe", "phaetlarr", "wright"]]};
 
	companion = nil;
 
	money = 200;
 
};
 
 
intro = room {
 
@@ -61,33 +131,69 @@ intro = room {
 
	hideinv = true;
 
	disp = "Вступление";
 
	dsc = [[
 
		Вы играете за Дэвида Дрейка - единственного сына богатого и уважаемого владельца транспортной компании "Вест-Хэйвен Транс-Оушен".^
 
		Более 10 лет назад, когда Дэвиду было 10 лет, Уильям таинственным образом пропал, не оставив практически никаких следов. Полицейское расследование вскоре зашло в тупик и было прекращено.^
 
		Через несколько месяцев компания, оставшаяся без своего владельца обанкротилась, ее имущество было продано.^
 
		После исчезновения отца Дэвид жил в Вашингтоне с бабушкой. Он пошел по стопам отца и выучился на инженера-кораблестроителя. 
 
		Несколько дней назад в доме, где он жил, был обнаружен тайник, хранящий секретные документы отца - карты, указывающие по-видимому на какие-то тайники Уильяма и записка с адресом и именем.^
 
		Одержимый идеей узнать больше, молодой Дрейк отправляется в Лондон...
 
		ВНИМАНИЕ: Это специальная предварительная демонстрационная версия игры. Ни один фрагмент игры не является финальным и может быть изменен, если это будет сочтено необходимым. ^^
 
		ВНИМАНИЕ: Данная версия игры не предназначена для какого-либо распространения, исключая прямую передачу файлов автором. Вышеуказанное ограничение на распространение данной версии игры автоматически аннулируется в момент выхода полной версии. ^^
 
		Действие игры происходит в конце 19-го века. Вы играете за Дэвида Дрейка - единственного сына богатого и уважаемого владельца транспортной компании "Вестхейвен Трансоушен". ^
 
		Более 10 лет назад, когда Дэвиду было 10 лет, Уильям таинственным образом бесследно пропал. Полицейское расследование вскоре зашло в тупик и было прекращено. Через несколько месяцев компания, оставшаяся без своего владельца, обанкротилась, ее имущество распродается. ^
 
		После исчезновения отца Дэвид жил в Вашингтоне с бабушкой. Он пошел по стопам отца и выучился на инженера-кораблестроителя. Несколько дней назад в доме, где он жил, был обнаружен тайник, хранящий секретные документы отца - карты, указывающие по-видимому на какие-то тайники Уильяма и записка с адресом и именем.^
 
		Одержимый идеей узнать больше, Дэвид отправляется в Лондон...
 
	]];
 
	obj = {
 
		vway("Начать игру", "{Начать игру}", 'port')
 
		vway("Начать игру", "{Начать игру}", 'port');
 
	}
 
};
 
 
demo_end = room {
 
	nam = "demo_end";
 
	hideinv = true;
 
	dsc = [[
 
		Вы встаете за штурвал "Левиафана". Уверенным движением руки вы включаете насосы. Резервуары заполняются водой и субмарина опускается вниз. Еще одним движением вы включаете двигатели. "Левиафан" плавно сдвигается с места. Через несколько часов вы выходите в открытое море. Еще раз сверившись с картой вы направляетесь к месту, отмеченному на ней. 
 
		
 
		*** Конец предварительной демонстрации ***
 
	]];
 
};
 
 
game.nam = "Пробуждение";
 
game.dsc = [[
 
		Мой первый текстовый квест
 
	Действие игры происходит в конце 19-го века. Вы играете за Дэвида Дрейка, сына владельца крупной транспортной компании "Вестхейвен Трансоушен". Несколько лет назад Уильям Дрейк, отец главного героя бесследно пропадает. Компания вскоре разваливается. Поиски ни к чему не приводят. Когда казалось бы уже все потеряно, в доме Дрейков находят тайник с документами Уильяма. Несколько схем строений, принадлежащих компании и клочок бумаги с адресом некоего Майкла Райта в Лондоне. Естественно, Дэвид как можно скорее отправляется в Великобританию...
 
	Вам предстоит отыскать подводную лодку, посетить подводную станцию, построенную Уильямом, встретить древнюю расу подводных жителей, поучаствовать в событиях, описанных древними легендами этой расы и узнать, что стало с Уильямом Дрейком.
 
]];
 
game.act = "Это не мое";
 
game.use = "Каким образом?";
 
game.inv = "Мне это не нужно";
 
 
game_act_phrases = {
 
	"Я не знаю, что с этим делать. ";
 
	"Я не буду это трогать... Пока. ";
 
	"Мне это ничем не поможет. ";
 
	"Это бессмыссленно. ";
 
	"Незачем это трогать. ";
 
};
 
 
game_use_phrases = {
 
	"Мне это ничем не поможет. ";
 
	"Это бессмыссленно. ";
 
	"Каким образом? "
 
};
 
 
game.act = function(s)
 
	return game_act_phrases[rnd(#game_act_phrases)];
 
end;
 
 
game.use = function(s)
 
	return game_use_phrases[rnd(#game_use_phrases)];
 
end;
 
game.inv = "INV: Если вы видите это сообщение - это баг. ";
 
 
require "dbg"
 
 
function init()
 
	---modules init
 
	leviathan_init();
 
	warehouse18_init();
 
	---game init
 
	put(char_coachman, port);
 
	put(submarine_leviathan, shipyard_inside);
 
	pl.where = intro;
 
	put(submarine_leviathan:disable(), dock_mooring);
 
	---debug
 
	--pl.where = submarine_leviathan;
 
	--pl.where = aurora_borealis;
 
	--move(submarine_leviathan, first_city_entrance);
 
	--move(submarine_leviathan, first_city_outer_east);
 
	--walk(final_scene);
 
@@ -97,4 +203,7 @@ function init()
 
	--put("char_phaetlarr", "leviathan_engines");
 
	--put("char_radcliffe", "leviathan_engines");
 
	--put("char_wright", "leviathan_wardroom");
 
	--pl.where = leviathan_airlock;
 
	pl.where = warehouse_18_entry;
 
	--dock_found = true;
 
end
 
\ No newline at end of file
party.lua
Show inline comments
 
@@ -131,7 +131,7 @@ char_wright = obj {
 
	dsc = function(s)
 
		if (stead.nameof(where(s)) == s.home) then
 
			return [[
 
				{Джек Райт} читает какую-то книгу, сидя в кресле командира. ^
 
				{Джек Райт} читает какую-то книгу. ^
 
			]];
 
		else
 
			return [[
service_tunnels.lua
Show inline comments
 
@@ -47,7 +47,6 @@ service_tunnels = room {
 
	nam = "service_tunnels";
 
	disp = "Сервисные тоннели";
 
	position = "0";
 
	position = "0";
 
	definitions = service_tunnels_definitions;
 
	entered = function(s)
 
		path('e1'):disable();
travel.lua
Show inline comments
 
new file 100644
 
--[[
 
	Меню города. Скорее всего будет переработано
 
 
london = dlg {
 
	nam = "london";
 
	disp = "Лондон";
 
	dsc = [
 
		Вы находитесь на одной из улиц Лондона. Куда вы хотите отправиться?
 
	];
 
	phr = {
 
		--Здесь должны быть перечислены все те же локации
 
		{1, always = true, "В гостиницу", "Садитесь!", [ walk 'hotel_street'; ]};
 
		{2, always = true, "К дому Райтов", "Садитесь!", [ walk 'wright_house'; ]};
 
		{3, always = true, "На склад 18", "Садитесь!", [ walk 'warehouse_18_entry'; ]};
 
		{4, always = true, "На склад 32", "Садитесь!", [ walk 'warehouse_32_entry'; ]};
 
		{5, always = true, "К доку 2", "Садитесь!", [ walk 'dock_2'; ]};
 
		{6, always = true, "В порт", "Садитесь!", [ walk 'port'; ]};
 
	};
 
};]]
 
 
--[[
 
Кучер, который будет за деньги возить вас по локациям первой части
 
]]
 
--TODO случайный ответ кучера из нескольких вариантов
 
char_coachman = obj {
 
	nam = "coachman";
 
	disp = "экипаж";
 
	dsc = [[Вы видите небольшую двухколесную повозку, с впряженными в нее двумя лошадьми. Его {владелец} стоит рядом и, судя по всему, ждет пассажиров^ ]];
 
	act = function(s)
 
		walkin "coachman_dlg";
 
	end;
 
	used = function(s, o)
 
		walkin "coachman_dlg";
 
	end;
 
};
 
 
coachman_dlg = dlg {
 
	nam = "coachman_dlg";
 
	disp = "Извозчик";
 
	dsc = "Куда едем?";
 
	hideinv = true;
 
	entered = function(s)
 
		poff(1, 2, 3, 4, 5, 6, 7);
 
		if (where(char_coachman) ~= port) then
 
			pon(6);
 
		end;
 
		if (where(char_coachman) ~= hotel_street) then
 
			pon(1);
 
		end;
 
		if (where(char_coachman) ~= wright_house) then
 
			pon(2);
 
		end;
 
		if (where(char_coachman) ~= dock_2 and global.dock_found) then
 
			pon(5);
 
		end;
 
		if (where(char_coachman) ~= warehouse_18_entry and global.warehouse_found) then
 
			pon(3);
 
		end;
 
		if (where(char_coachman) ~= warehouse_32_entry and global.warehouse_found) then
 
			pon(4);
 
		end;
 
	end;
 
	phr = {
 
		{1, always = true, "В гостиницу",
 
			function (s)
 
				walk 'hotel_street';
 
				return "Садитесь! Здесь совсем близко. Гостиница называется \"У старого Фрэнки\"";
 
			end
 
		},
 
		{2, always = true, "К Райту", 
 
			function (s)
 
				walk 'wright_house';
 
				return "Садитесь!";
 
			end
 
		},
 
		{3, always = true, "На склад 18", 
 
			function (s)
 
				walk 'warehouse_18_entry';
 
				return "Садитесь!";
 
			end
 
		},
 
		{4,	always = true, "На склад 32", 
 
			function (s)
 
				walk 'warehouse_32_entry';
 
				return "Садитесь!";
 
			end
 
			
 
		},
 
		{5, always = true, "К доку 2", 
 
			function (s)
 
				walk 'dock_2';
 
				return "Садитесь!";
 
			end
 
		},
 
		{6, always = true, "В порт",
 
			function (s)
 
				walk 'port';
 
				return "Садитесь!";
 
			end
 
		},
 
		{255, always = true, "Я передумал", function(s) 
 
			back()
 
		end}
 
	};
 
};
 
\ No newline at end of file
utils.lua
Show inline comments
 
@@ -63,19 +63,164 @@ EngineUtils = {
 
	end;
 
};
 
 
function kh_vway(disp, dsc, target, seen_level)
 
	local temp = vway(disp, dsc, target);
 
	temp.seen_level = seen_level;
 
	return temp;
 
end;
 
 
--[[
 
	vroom with additional functionality
 
]]
 
function kh_vroom(disp, target, nam)
 
	if (not nam) then
 
function kh_vroom(disp, target, seen_level)
 
	return room {
 
		nam = disp;
 
	end;
 
	return room {
 
		nam = nam;
 
		disp = disp;
 
		where = target;
 
		enter = _kh.vroom_enter;
 
		seen_level = seen_level;
 
		--enter = _kh.vroom_enter;
 
		--save = _kh.vroom_save;
 
	};
 
end;
 
 
obj = inherit(obj, function(v)
 
	v.disable_implicit = hook(v.disable, function(f, s, ...)
 
		s._disabled_implicit = true;
 
		return f(s, unpack(arg));
 
	end);
 
 
	v.disable = hook(v.disable, function(f, s, ...)
 
		s._disabled_explicit = true;
 
		return f(s, unpack(arg));
 
	end);
 
	
 
	v.enable_implicit = hook(v.enable, function(f, s, ...)
 
		s._disabled_implicit = false;
 
		if (s._disabled_explicit) then
 
			return s; --mimic original enable() behavior
 
		else
 
			return f(s, unpack(arg));
 
		end;
 
	end);
 
	
 
	v.enable = hook(v.enable, function(f, s, ...)
 
		s._disabled_explicit = false;
 
		if (s._disabled_implicit) then
 
			return s; --mimic original enable() behavior
 
		else
 
			return f(s, unpack(arg));
 
		end;
 
	end);
 
	
 
	return v;
 
end);
 
 
--[[
 
	character object
 
	represents character, with whom you can interact
 
]]
 
function character(tab)
 
	if (not tab.act) then
 
		tab.act = function(s)
 
			if (s.dlg) then
 
				walkin(s.dlg);
 
			else
 
				return s.phrases[rnd(#s.phrases)];
 
			end;
 
		end;
 
	end;
 
	
 
	return obj(tab);
 
end;
 
 
function darkroom(tab)
 
	local life;
 
	local entered;
 
	local left;
 
	if (not tab.has_light) then
 
		tab.has_light = false;
 
	end;
 
	if (tab.life) then
 
		life = tab.life;
 
	end;
 
	if (tab.entered) then
 
		entered = tab.entered;
 
	end;
 
	if (tab.left) then
 
		left = tab.left;
 
	end;
 
	tab.entered = function(s)
 
		lifeon(s);
 
		if (entered) then
 
			entered(s);
 
		end;
 
	end;
 
	tab.left = function(s)
 
		lifeoff(s);
 
		if (left) then
 
			left(s);
 
		end;
 
	end;
 
	tab.life = function(s)
 
		if (s.has_light) then
 
			-- show all objects that were not explicitly disabled(any seen_level)
 
			for i = 1, #objs(s) do
 
				objs(s)[i]:enable_implicit();
 
			end;
 
			for i = 1, #ways(s) do
 
				ways(s)[i]:enable_implicit();
 
			end;
 
		elseif (pl.has_light) then
 
			-- show all objects that were not explicitly disabled and marked as seen in halflight (seen_level = 1 or higher)
 
			for i = 1, #objs(s) do
 
				if (type(objs(s)[i].seen_level) == "number" and objs(s)[i].seen_level >= 1) then
 
					objs(s)[i]:enable_implicit();
 
				else
 
					objs(s)[i]:disable_implicit();
 
				end;
 
			end;
 
			for i = 1, #ways(s) do
 
				if (type(ways(s)[i].seen_level) == "number" and ways(s)[i].seen_level >= 1) then
 
					ways(s)[i]:enable_implicit();
 
				else
 
					ways(s)[i]:disable_implicit();
 
				end;
 
			end;
 
		else
 
			-- show all objects that were not explicitly disabled and marked as seen in darkness (seen_level = 2 or higher)
 
			for i = 1, #objs(s) do
 
				if (type(objs(s)[i].seen_level) == "number" and objs(s)[i].seen_level >= 2) then
 
					objs(s)[i]:enable_implicit();
 
				else
 
					objs(s)[i]:disable_implicit();
 
				end;
 
			end;
 
			for i = 1, #ways(s) do
 
				if (type(ways(s)[i].seen_level) == "number" and ways(s)[i].seen_level >= 2) then
 
					ways(s)[i]:enable_implicit();
 
				else
 
					ways(s)[i]:disable_implicit();
 
				end;
 
			end;
 
		end;
 
		
 
		
 
		if (life) then
 
			life(s);
 
		end;
 
	end;
 
	if (not tab.dsc) then
 
		tab.dsc = function(s)
 
			if (s.has_light) then
 
				return s.dsc_lit;
 
			elseif (pl.has_light) then
 
				return s.dsc_halflit;
 
			else
 
				return s.dsc_dark;
 
			end;
 
		end;
 
	end;
 
	
 
	return room(tab);
 
end;
 
\ No newline at end of file
warehouse18.lua
Show inline comments
 
--[[
 
Игрок может попасть сюда только после диалога с Майклом.
 
Эта локация имеет владельца, которому не понравится, что здесь шляются посторонние.
 
Эта локация имеет владельца, который будет готов сотрудничать.
 
Здесь игрок найдет чертеж подводной лодки.
 
]]
 
\ No newline at end of file
 
]]
 
 
warehouse_18_entry = room {
 
	nam = "warehouse_18_entry";
 
	disp = "Вход на склад 18";
 
	dsc = [[
 
		Вы находитесь на улице у входа на склад 18.
 
	]];
 
	way = {
 
		'to_warehouse_18'
 
	};
 
	obj = {
 
		'char_w18_sec'
 
	};
 
};
 
 
to_warehouse_18 = room {
 
	nam = "warehouse_18_entry";
 
	disp = "На склад";
 
	enter = function(s)
 
		pr("Охранник не пропустит вас. ");
 
		return false;
 
	end;
 
};
 
 
char_w18_sec = character {
 
	nam = 'char_w18_sec';
 
	disp = "Охранник";
 
	dsc = function(s)
 
		if (s.aware) then
 
			return [[
 
				{Охранник} внимательно наблюдает за вами. 
 
			]];
 
		else
 
			return [[
 
				Рядом со входом стоит скучающий {охранник}. 
 
			]];
 
		end;
 
	end;
 
	act = function(s)
 
		if (s.first_time) then
 
			walkin('dlg_w18_sec_out_first');
 
		else
 
			walkin('dlg_w18_sec_out');
 
		end;
 
	end;
 
	first_time = true;
 
};
 
 
dlg_w18_sec_out_first = dlg {
 
	nam = 'dlg_w18_sec_out_first';
 
	disp = "Охранник";
 
	entered = [[
 
		Слушаю
 
	]];
 
	phr = {
 
		{1, "Вы можете пропустить меня внутрь?", "На склад допускаются только сотрудники. "};
 
		{2, "Я Дэвид Дрейк. ", "Мне это ни о чем не говорит. ", [[ pon(4); ]]};
 
		{3, "Могу я поговорить с управляющим?", "Управляющий занят. "};
 
		{4, false, always = true, "У меня срочное дело к управляющему. ", "Следуйте за мной. ", [[ walkin('warehouse_18_manager'); ]] };
 
		{255, always = true, "Нет, ничего. ", "До свидания. ", [[ back(); ]]};
 
	};
 
};
 
 
dlg_w18_sec_out = dlg {
 
	nam = 'dlg_w18_sec_out';
 
	disp = "Охранник";
 
	entered = [[
 
		Слушаю
 
	]];
 
	phr = {
 
		{1, always = true, "Проводите меня к управляющему", "Следуйте за мной. ", [[ walkin('warehouse_18_manager'); ]]};
 
		{2, always = true, "Проводите меня на склад", "Следуйте за мной. ", [[ walkin('warehouse_18_inside'); ]]};
 
		{255, always = true, "Нет, ничего", "До свидания", [[ back(); ]]};
 
	};
 
};
 
 
dlg_w18_sec_in = dlg {
 
	nam = 'dlg_w18_sec_in';
 
	disp = "Охранник";
 
	entered = [[
 
		Слушаю
 
	]];
 
	phr = {
 
		{1, always = true, "Я закончил. Проводите меня ко входу. ", "Следуйте за мной. ", [[ walkin('warehouse_18_entry'); ]]};
 
		{255, always = true, "Нет, ничего", "До свидания", [[ back(); ]]};
 
	};
 
};
 
 
warehouse_18_manager = room {
 
	nam = "warehouse_18_manager";
 
	disp = "Склад 18, кабинет управляющего";
 
	dsc = [[
 
		Вы находитесь в кабинете управляющего складом 18. 
 
	]];
 
	obj = {
 
		'char_w18_sec_mgr',
 
		'char_w18_mgr'
 
	};
 
};
 
 
char_w18_sec_mgr = character {
 
	nam = 'char_w18_sec';
 
	disp = "Охранник";
 
	dsc = [[
 
		{Охранник} внимательно наблюдает за вами. 
 
	]];
 
	phrases = {
 
		"Говорите с управляющим, не со мной"
 
	};
 
};
 
 
char_w18_mgr = character {
 
	nam = "char_w18_mgr";
 
	disp = "Управляющий складом";
 
	dsc = [[
 
		{Управляющий}
 
	]];
 
	dlg = "dlg_w18_mgr"
 
};
 
 
dlg_w18_mgr = dlg {
 
	nam = "dlg_w18_mgr";
 
	disp = "Управляющий складом";
 
	entered = [[
 
		Добрый день, что вы хотели?
 
	]];
 
	phr = {
 
		{1, 'Мое имя Дэвид Дрейк, я сын владельца "Вестхейвен Трансоушен"', code = [[
 
			if (punseen(2, 3)) then
 
				char_w18_sec.first_time = false;
 
				pr("Все принадлежащее старой компании мы перенесли в отдельное помещение. Вы можете пройти туда. ");
 
				walkin("warehouse_18_inside");
 
			else
 
				pr("И?");
 
			end;
 
		]]};
 
		{2, 'Этот склад ранее принадлежал "Вестхейвен Трансоушен"', code = [[
 
			if (punseen(1, 3)) then
 
				pr("Все принадлежащее старой компании мы перенесли в отдельное помещение. Вы можете пройти туда. ");
 
				walkin("warehouse_18_inside");
 
			else
 
				pr("И?");
 
			end;
 
		]]};
 
		{3, 'Меня интересуют некоторые вещи, которые остались здесь от предыдущего владельца', code = [[
 
			if (punseen(1, 2)) then
 
				pr("Все принадлежащее старой компании мы перенесли в отдельное помещение. Вы можете пройти туда. ");
 
				walkin("warehouse_18_inside");
 
			else
 
				pr("И?");
 
			end;
 
		]]};
 
		{255, always = true, 'Нет, ничего', "До свидания"};
 
	};
 
};
 
 
warehouse_18_inside = room {
 
	nam = "warehouse_18_inside";
 
	disp = "Склад 18";
 
	dsc = [[
 
		Вы находитесь в небольшой комнате, куда, по словам управляющего, было перенесено все оставшееся от "Вестхейвен Трансоушен". 
 
	]];
 
	obj = {
 
		'char_w18_sec_in';
 
		'w18_box1';
 
		'w18_box2';
 
		'w18_box3';
 
		'w18_box4';
 
	};
 
};
 
 
char_w18_sec_in = character {
 
	nam = "char_w18_sec_in";
 
	disp = "Охранник";
 
	dsc = [[
 
		Рядом со входом стоит скучающий {охранник}. 
 
	]];
 
	dlg = 'dlg_w18_sec_in';
 
};
 
 
w18_box_act = function(s)
 
	if (s.item) then
 
		local item = s.item;
 
		s.item = nil;
 
		take(item);
 
		return "Вы находите " .. stead.ref(item).disp;
 
	else
 
		return "Здесь ничего нет";
 
	end;
 
end;
 
 
w18_box1 = obj {
 
	nam = "w18_box1";
 
	disp = "Ящик";
 
	dsc = [[
 
		{Ящик 1}
 
	]];
 
	act = w18_box_act;
 
};
 
 
w18_box2 = obj {
 
	nam = "w18_box2";
 
	disp = "Ящик";
 
	dsc = [[
 
		{Ящик 2}
 
	]];
 
	act = w18_box_act;
 
};
 
 
w18_box3 = obj {
 
	nam = "w18_box3";
 
	disp = "Ящик";
 
	dsc = [[
 
		{Ящик 3}
 
	]];
 
	act = w18_box_act;
 
};
 
 
w18_box4 = obj {
 
	nam = "w18_box4";
 
	disp = "Ящик";
 
	dsc = [[
 
		{Ящик 4}
 
	]];
 
	act = w18_box_act;
 
};
 
 
w18_boxes = {
 
	w18_box1;
 
	w18_box2;
 
	w18_box3;
 
	w18_box4;
 
};
 
 
function warehouse18_init()
 
	local item1 = "item_ducttape";
 
	local item2 = "item_leviathan_schematics";
 
	local item3 = "item_map";
 
	while item1 do
 
		local t = rnd(#w18_boxes);
 
		if (not w18_boxes[t].item) then
 
			w18_boxes[t].item = item1;
 
			item1 = nil;
 
		end;
 
	end;
 
	while item2 do
 
		local t = rnd(#w18_boxes);
 
		if (not w18_boxes[t].item) then
 
			w18_boxes[t].item = item2;
 
			item2 = nil;
 
		end;
 
	end;
 
	while item3 do
 
		local t = rnd(#w18_boxes);
 
		if (not w18_boxes[t].item) then
 
			w18_boxes[t].item = item3;
 
			item3 = nil;
 
		end;
 
	end;
 
end;
 
\ No newline at end of file
warehouse32.lua
Show inline comments
 
--[[
 
Игрок может попасть сюда только после диалога с Майклом.
 
Эта локация имеет владельца, который будет готов сотрудничать.
 
Эта локация имеет владельца, которому не понравится, что здесь шляются посторонние.
 
Здесь игрок найдет карту.
 
]]
 
\ No newline at end of file
 
]]
 
 
warehouse_32_entry = room {
 
	nam = "warehouse_32";
 
	disp = "Вход на склад 32";
 
	dsc = [[
 
		
 
	]];
 
	
 
};
 
 
warehouse_32_entry_night = room {
 
	
 
};
 
 
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="", dsc=[[
 
		
 
	]], e1 = "21", e2="12", e3="01", e4="10"};
 
	["12"] = { name="", dsc=[[
 
		
 
	]], e1 = "22", e2="13", e3="02", e4="11"};
 
	["13"] = { name="", dsc=[[
 
		
 
	]], e1 = "23", e2="14", e3="03", e4="12"};
 
	["14"] = { name="", dsc=[[
 
		
 
	]], e1 = "24", e2="15", e3="04", e4="13"};
 
	["15"] = { name="тупик", dsc=[[
 
		
 
	]], e4 = "14", corner = true};
 
	---line CD
 
	["20"] = { name="тупик", dsc=[[
 
		
 
	]], e2 = "21", corner = true};
 
	["21"] = { name="", dsc=[[
 
		
 
	]], e1 = "31", e2="22", e3="11", e4="20"};
 
	["22"] = { name="", dsc=[[
 
		
 
	]], e1 = "32", e2="23", e3="12", e4="21"};
 
	["23"] = { name="", dsc=[[
 
		
 
	]], e1 = "33", e2="24", e3="13", e4="22"};
 
	["24"] = { name="", dsc=[[
 
		
 
	]], e1 = "34", e2="25", e3="14", e4="23"};
 
	["25"] = { name="тупик", dsc=[[
 
		
 
	]], e4 = "24", corner = true};
 
	---line BC
 
	["30"] = { name="тупик", dsc=[[
 
		
 
	]], e2 = "31", corner = true};
 
	["31"] = { name="", dsc=[[
 
		
 
	]], e1 = "41", e2="32", e3="21", e4="30"};
 
	["32"] = { name="", dsc=[[
 
		
 
	]], e1 = "42", e2="33", e3="22", e4="31"};
 
	["33"] = { name="", dsc=[[
 
		
 
	]], e1 = "43", e2="34", e3="23", e4="32"};
 
	["34"] = { name="", dsc=[[
 
		
 
	]], e1 = "44", e2="35", e3="24", e4="33"};
 
	["35"] = { name="тупик", dsc=[[
 
		
 
	]], e4 = "34", corner = true};
 
	---line AB
 
	["40"] = { name="тупик", dsc=[[
 
		
 
	]], e2 = "41", corner = true};
 
	["41"] = { name="", dsc=[[
 
		
 
	]], e1 = "51", e2="42", e3="31", e4="40"};
 
	["42"] = { name="", dsc=[[
 
		
 
	]], e1 = "52", e2="43", e3="32", e4="41"};
 
	["43"] = { name="", dsc=[[
 
		
 
	]], e1 = "53", e2="44", e3="33", e4="42"};
 
	["44"] = { name="", dsc=[[
 
		
 
	]], e1 = "54", e2="45", e3="34", e4="43"};
 
	["45"] = { name="тупик", dsc=[[
 
		
 
	]], e4 = "34", corner = true};
 
	---line A
 
	["51"] = { name="тупик", dsc=[[
 
		
 
	]], e3 = "41", corner = true};
 
	["52"] = { name="у входа", dsc=[[
 
		
 
	]], e3 = "42", ex1 = "w32_frontdoor"};
 
	["53"] = { name="тупик", dsc=[[
 
		
 
	]], e3 = "43", corner = true};
 
	["54"] = { name="у входа в кабинет управляющего", dsc=[[
 
		
 
	]], e3 = "44", ex1="w32_mgr"};
 
};
 
 
warehouse_32 = room {
 
	nam = "warehouse_32";
 
	disp = function(s)
 
		return "Склад 32, " .. s.definitions[position].name;
 
	end;
 
	dsc = function(s)
 
		local dir_name;
 
		if (s.dir == 1) then
 
			dir_name = "север";
 
		elseif (s.dir == 2) then
 
			dir_name = "восток";
 
		elseif (s.dir == 3) then
 
			dir_name = "юг";
 
		elseif
 
			dir_name = "запад";
 
		end;
 
		return s.definitions[position].dsc .. "^ Вы смотрите на " .. dir_name;
 
	end;
 
	pos = "01";
 
	dir = 1;
 
	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
 
	end;
 
	guardTurn = function(s)
 
		--Каждый стражник делает ход, игрок получает сообщения, о том, слышит ли он шаги, откуда и как они движутся
 
	end;
 
	makeTurn = function(s)
 
		s:checkGuardSight();
 
		s:guardTurn();
 
		s:checkGuardSight();
 
	end;
 
	way = {
 
		kh_vroom("Повернуть налево", function(s)
 
		end);
 
		kh_vroom("Вперед", function(s)
 
		end);
 
		kh_vroom("Повернуть направо", function(s)
 
		end);
 
	};
 
};
 
\ No newline at end of file
wright.lua
Show inline comments
 
new file 100644
 
--[[
 
Здесь игрок получает адреса всех ключевых локаций первой части
 
]]
 
door_wright = obj {
 
	nam = "door_wright";
 
	disp = "Дверь";
 
	locked = true;
 
	act = function(s)
 
		if (s.locked) then
 
			walkin "wright_entry_dlg";
 
		else
 
			walk "wright_house_inside";
 
		end;
 
		return true;
 
	end;
 
	dsc = function(s)
 
		if (s.locked) then
 
			return [[ Дверь в дом заперта. Можно попробовать {постучаться}^ ]];
 
		else
 
			return [[ Дверь открыта, вы можете {войти}^ ]];
 
		end;
 
	end;
 
};
 
 
item_wright_table = obj {
 
	nam = "wright_table";
 
	disp = "Стол";
 
	dsc =[[
 
		Вы видите массивный старый стол. 
 
	]];
 
	obj = {
 
		vobj("Газеты", [[На столе лежит стопка {газет}]])
 
	};
 
};
 
 
char_wright_home = obj {
 
	nam = "char_wright_home";
 
	disp = "Джек Райт";
 
	dsc = function(s)
 
		if (s.documents) then
 
			return [[ ^{Джек Райт} с интересом рассматривает схемы, которые вы ему отдали^ ]];
 
		else
 
			return [[ ^Вы видите {молодого человека} одетого в недорогой, но опрятный костюм. ^ ]];
 
		end;
 
	end;
 
	act = function(s)
 
		if (s.documents) then
 
			walkin "wright_main_dlg";
 
		else
 
			walkin "wright_pre_dlg";
 
		end;
 
	end;
 
};
 
 
wright_entry_dlg = dlg {
 
	nam = "wright_entry_dlg";
 
	disp = "Голос за дверью";
 
	dsc = "Кто здесь?";
 
	hideinv = true;
 
	phr = {
 
		{"Могу я увидеть Майкла Райта?", "Кто спрашивает?", [[ psub 'who' ]]},
 
		{always = true, "Извините, я ошибся адресом", function(s) 
 
			back()
 
		end},
 
		{tag = 'who'},
 
		{"Это сын Уильяма Дрейка", "Заходи, нам есть о чем поговорить", function ()
 
			door_wright.locked = false;
 
			walk 'wright_house_inside';
 
		end},
 
		{"Майкл Райт здесь живет?", "Кто спрашивает?"},
 
		{"У меня важное сообщение для него", "Здесь таких нет, до свидания", function(s) 
 
			back()
 
		end}
 
		
 
	};
 
};
 
 
wright_main_dlg = dlg {
 
	nam = "wright_main_dlg";
 
	disp = "Джек Райт";
 
	dsc = [[
 
		Джек просматривает одну за другой схемы, которые вы ему передали: "Я знаю, где находится док 2, остальные места мне незнакомы. Если ты оставишь мне эти схемы, я подниму старые записи. Возможно что-то удастся найти. "
 
	]];
 
	hideinv = true;
 
	phr = {
 
		{"Отправь мне письмо в отель старого Фрэнки, комната 7, как узнаешь что-то. Я пока посмотрю док. ", function(s)
 
			global.dock_found = true;
 
			return [[
 
				Хорошо
 
			]]
 
		end;}
 
	};
 
};
 
 
wright_pre_dlg = dlg {
 
	nam = "wright_pre_dlg";
 
	disp = "Джек Райт";
 
	dsc = [[
 
		Человек внимательно смотрит на вас и начинает говорить: 
 
		"Дэвид, верно? Я Джек. Мой отец пропал вместе с твоим тогда же. Десять лет назад. Но ты же не просто так пришел? У тебя есть что-то, что поможет пролить свет на тайну?"
 
	]];
 
	hideinv = true;
 
	phr = {
 
		{
 
			"Да, я нашел кое-какие документы. Это схемы некоторых зданий, принадлежащих Вест Хейвен. К сожалению, на них не указаны адреса. ",
 
			"Если покажешь их мне, я постараюсь помочь"
 
		}
 
	};
 
};
 
 
wright_house_inside = room {
 
	nam = "wright_house_inside";
 
	disp = "Дом Райта";
 
	dsc = [[
 
		Вы находитесь в небольшом уютном домике. Окна закрыты плотными занавесками. В комнате светло за счет нескольких электрических ламп. 
 
	]];
 
	obj = {
 
		'item_wright_table',
 
		'char_wright_home',
 
		vway("Выйти", "{Выйти из дома}", "wright_house")
 
	};
 
};
 
 
wright_house = room {
 
	nam = "wright_house";
 
	disp = "Дом Райта";
 
	enter = function(s)
 
		put(char_coachman, here());
 
	end;
 
	dsc = [[
 
		Вы стоите у входа в дом, указанный в записке.
 
	]];
 
	obj = {'door_wright'};
 
};
 
\ No newline at end of file
0 comments (0 inline, 0 general)