Changeset - c4b207ce4252
[Not reviewed]
default
0 0 30
Silverwing - 9 years ago 2015-05-17 07:37:06

Initial Commit
30 files changed with 2100 insertions and 0 deletions:
0 comments (0 inline, 0 general)
.hgignore
Show inline comments
 
new file 100644
atlantis.lua
Show inline comments
 
new file 100644
coachman.lua
Show inline comments
 
new file 100644
 
--[[
 
Кучер, который будет за деньги возить вас по локациям первой части
 
]]
 
char_coachman = obj {
 
	nam = "coachman";
 
	disp = "экипаж";
 
	dsc = [[Вы видите небольшую двухколесную повозку, с впряженными в нее двумя лошадьми. Его {владелец} стоит рядом и, судя по всему, ждет пассажиров^ ]];
 
	act = function()
 
		walkin "coachman_dlg";
 
	end;
 
};
 
 
coachman_dlg = dlg {
 
	nam = "coachman_dlg";
 
	disp = "Кучер";
 
	dsc = "Куда едем?";
 
	hideinv = true;
 
	enter = function(s)
 
		pon(1, 2, 3, 4, 5, 6);
 
		if (where(char_coachman) == hotel) then
 
			poff(1);
 
		end;
 
		if (where(char_coachman) == michael_house) then
 
			poff(2);
 
		end;
 
		if (where(char_coachman) == warehouse_18) then
 
			poff(3);
 
		end;
 
		if (where(char_coachman) == warehouse_32) then
 
			poff(4);
 
		end;
 
		if (where(char_coachman) == shipyard_2) then
 
			poff(5);
 
		end;
 
		if (where(char_coachman) == port) then
 
			poff(6);
 
		end;
 
	end;
 
	phr = {
 
		{1, always = true, "В гостиницу (0 монет)", "Садитесь! Здесь совсем близко. Гостиница называется \"У старого Фрэнки\"",
 
			function (s)
 
				walk 'hotel';
 
			end
 
		},
 
		{2, always = true, "[Майкл Райт] (0 монет)", "Садитесь!",
 
			function (s)
 
				walk 'michael_house';
 
			end
 
		},
 
		{3, always = true, "[Склад 18] (0 монет)", "Садитесь!",
 
			function (s)
 
				walk 'warehouse_18';
 
			end
 
		},
 
		{4,	always = true, "[Склад 32] (0 монет)", "Садитесь!",
 
			function (s)
 
				walk 'warehouse_32';
 
			end
 
		},
 
		{5, always = true, "[Верфь 2] (0 монет)", "Садитесь!",
 
			function (s)
 
				walk 'shipyard_2';
 
			end
 
		},
 
		{6, always = true, "В порт (0 монет)", "Садитесь!",
 
			function (s)
 
				walk 'port';
 
			end
 
		},
 
		{255, always = true, "Я передумал", function(s) 
 
			back()
 
		end}
 
	};
 
};
 
\ No newline at end of file
final_battle.lua
Show inline comments
 
new file 100644
 
fb_naethvjirr = obj {
 
	nam = "fb_naethvjirr";
 
	disp2 = "Наэтвьирра";
 
	position = 4;
 
	throw = 0; -- оставшиеся ходы до возможности применения (раз в 4 хода)
 
	charge = 0; -- оставшиеся ходы до возможности применения (раз в 3 хода)
 
	shield = true; -- активность щита
 
	shieldRecharge = false; -- О, как я люблю эти маленькие костыли. Это нужно, чтобы щит не восстанавливался сразу после выстрела
 
	canshoot = function(s)
 
		return not s.shield;
 
	end;
 
	canhit = function(s)
 
		return not s.shield;
 
	end;
 
	nohitmsg = "Это бессмыссленно, пока он закрыт щитом";
 
	noshootmsg = "Это бессмыссленно, пока он закрыт щитом";
 
	hitpoints = 3;
 
	passturn = function(s)
 
		if (s.hitpoints > 0) then
 
			local gens = 0;
 
			for i = 0, #final_battle.generators do
 
				if (final_battle.generators[i] == 4) then
 
					gens = gens + 1;
 
					s.charge = s.charge - 1;
 
				elseif (final_battle.generators[i] == 3) then
 
					gens = gens + 1;
 
					s.throw = s.throw - 1;
 
				elseif (final_battle.generators[i] == 2) then
 
					gens = gens + 1;
 
					if (not s.shield) then
 
						if (s.shieldRecharge) then
 
							s.shield = true;
 
							s.shieldRecharge = false;
 
							p("Щит вокруг Наэтвьирра восстановлен и он снова защищен от ваших атак. ");
 
						else
 
							s.shieldRecharge = true;
 
						end;
 
					end;
 
				end;
 
			end;
 
			
 
			if (gens == 0) then
 
				p("Глаза Наэтвьирра гаснут, и конструкт бессильно падает на пол. ");
 
				s.hitpoints = 0;
 
				return true;
 
			end;
 
			
 
			if (s.charge <= 0) then
 
				-- Пускаем разряд в игрока
 
				s.charge = 3;
 
				p("Наэтвьирр отправляет в вас электрический разряд. Вы не можете пошевелиться. ");
 
				if (rnd(4) < 2) then
 
					-- Отбросить игрока в сторону
 
					p("Разряд отбрасывает вас в сторону. ");
 
					fb_throwAway(pl);
 
				end;
 
				
 
				if (rnd(4) < 2) then -- 25%
 
					p("Вы чувствуете, что атака не прошла для вас бесследно. ");
 
					pl.hitpoints = pl.hitpoints - 1;
 
					if (pl.hitpoints <= 0) then
 
						walk(game_over_naethvjirr);
 
						return;
 
					end;
 
				end;
 
				
 
				final_battle.passturn(final_battle);
 
				p("Вы оправились от атаки Наэтвьирра и снова можете действовать. ");
 
			elseif (s.throw <= 0) then
 
				-- Отбрасываем игрока
 
				s.throw = 4;
 
				fb_throwAway(pl);
 
				p("Наэтвьирр отправляет в вас мощную волну воздуха, которая отбрасывает вас в сторону. ");
 
				
 
				if (rnd(4) > 1) then -- 75%
 
					pl.hitpoints = pl.hitpoints - 1;
 
					p("Вы чувствуете, что атака не прошла для вас бесследно. ");
 
					if (pl.hitpoints <= 0) then
 
						walk(game_over_naethvjirr);
 
						return;
 
					end;
 
				end;
 
			end;
 
		end;
 
	end;
 
	onhit = function(s)
 
		local result = "";
 
		
 
		s.hitpoints = s.hitpoints - 1;
 
		if (s.hitpoints == 2) then
 
			result = "Сильный удар повреждает Наэтвьирра, но вы не замечаете, сказалось ли это на его работоспособности. ";
 
		elseif (s.hitpoints == 1) then
 
			result = "Наэтвьирр пошатнулся от вашего удара, давая понять, что попадание не прошло бесследно. ";
 
		elseif (s.hitpoints == 0) then
 
			result = "После вашего удара глаза Наэтвьирра гаснут и конструкт с грохотом падает рядом со своим троном. ";
 
		end;
 
		p(result);
 
		final_battle.passturn(final_battle);
 
	end;
 
	onshoot = function(s)
 
		local hit = false;
 
		if (pl.position[1] == 1 and pl.position[2] == 1) then
 
			hit = (rnd(4) > 1);
 
		else
 
			hit = (rnd(2) > 1);
 
		end;
 
		
 
		local result = "";
 
		if (hit) then
 
			s.hitpoints = s.hitpoints - 1;
 
			if (s.hitpoints == 2) then
 
				result = "Ваш выстрел повреждает Наэтвьирра, но вы не замечаете, сказалось ли это на его работоспособности. ";
 
			elseif (s.hitpoints == 1) then
 
				result = "Глаза Наэтвьирра на мгновение моргают, давая понять, что попадание не прошло бесследно. ";
 
			elseif (s.hitpoints == 0) then
 
				result = "Глаза Наэтвьирра гаснут и конструкт с грохотом падает рядом со своим троном. ";
 
			end;
 
		else
 
			result = "Пуля пролетает мимо конструкта, не причинив ему никакого вреда. ";
 
		end;
 
		pn(result);
 
		final_battle.passturn(final_battle);
 
	end;
 
	dsc = function(s)
 
		if (s.hitpoints > 0) then
 
			local shield = "";
 
			if (s.shield) then
 
				shield = "Вокруг него едва заметно силовое поле, защищающее его от физических повреждений. ";
 
			end;
 
			return "В центре зала перед массивной конструкцией, напоминающей трон, стоит {навьяр}. Конструкт выглядит совершенно как живой, сияющие красноватым светом глаза внимательно следят за вашими действиями. ".. shield .."^";
 
		else
 
			--return "В центре зала рядом с массивной конструкцией, напоминающей трон, лежит сильно поврежденный {навьяр-конструкт}. ^";
 
			return "";
 
		end;
 
	end;
 
};
 
 
fb_black = obj {
 
	nam = "fb_black";
 
	position = 4;
 
	bullets = 6; -- потребуется перезарядка, если потратит все 6 патронов. Скорее всего до этого никогда не дойдет, но предусмотреть стоит
 
	hitpoints = 1;
 
	disp2 = "Блэка";
 
	canshoot = function(s)
 
		if (pl.position[1] == 1 and pl.position[2] == 1) then
 
			return true;
 
		else 
 
			return false;
 
		end;
 
	end;
 
	noshootmsg = "Вы не попадете в него. ";
 
	nohitmsg = "Для этого до него еще надо добраться. ";
 
	dsc = function(s)
 
		if (s.hitpoints > 0) then
 
			return "{Адриан Блэк} укрылся от вас за троном. ^";
 
		end;
 
	end;
 
	onshoot = function(s)
 
		if (rnd(2) > 1) then--50%
 
			s.hitpoints = 0;
 
			p("Вы раните Блэка в плечо, он роняет пистолет и скрывается за троном. Более он не опасен. ");
 
		else
 
			p("Ваша пуля пролетает мимо, не причинив Блэку никакого вреда. ");
 
		end;
 
		final_battle.passturn(final_battle);
 
	end;
 
	passturn = function(s)
 
		if (s.hitpoints > 0) then
 
			if (s.bullets > 0) then
 
				if (pl.position[1] == 1 and pl.position[2] == 1) then
 
					-- Стреляем в игрока
 
					p("Блэк стреляет в вас. ");
 
					if (rnd(4) > 1) then--75%
 
						pl.hitpoints = pl.hitpoints - 1;
 
						if (pl.hitpoints > 0) then
 
							p("Пуля лишь слегка задевает вас, практически не нанеся урона. ");
 
						else
 
							walk(game_over_shot_fb);
 
						end;
 
					end;
 
				end;
 
			else
 
				-- Перезаряжаем
 
				s.bullets = 6;
 
				p("Адриан Блэк перезаряжает револьвер. ");
 
			end;
 
		end;
 
	end;
 
};
 
 
fb_pylons = obj {
 
	nam = "fb_pylons";
 
	position = "с";
 
	state = 2;--Количество активных пилонов
 
	charging = 0;
 
	canhit = true;
 
	noshootmsg = "Вы не попадете в них";
 
	onhit = function(s)
 
		if (s.state > 0) then
 
			if (pl.position[1] == 1 and pl.position[2] == 1) then
 
				s.state = s.state - 1;
 
				if (s.state == 0) then
 
					-- Если оба пилона уничтожены, нет смысла передавать им энергию.
 
					for i = 0, #final_battle.generators do
 
						if (final_battle.generators[i] == 5) then
 
							final_battle.generators[i] = 1;
 
						end;
 
					end;
 
				end;
 
				p("Ударом по металлическому стержню, вы выводите из строя один из пилонов");
 
				final_battle.passturn(final_battle);
 
			else
 
				return "Пилоны слишком далеко от вас";
 
			end;
 
		else
 
			return "Оба пилона уже выведены из строя";
 
		end;
 
	end;
 
	passturn = function(s)
 
		for i = 1, #final_battle.generators do
 
			if (final_battle.generators[i] == 5) then
 
				s.charging = s.charging + 1;
 
			end;
 
		end;
 
		if (s.charging >= 10) then
 
			pl.hitpoints = 0;
 
			walk(game_over_pylon);
 
		end;
 
	end;
 
	dsc = function(s)
 
		if (s.state == 2) then
 
			return "В центральной части комнаты расположены два {пилона} высотой около метра. На вершине их установлены сверкающие металлические стержни.^";
 
		elseif (s.state == 1) then
 
			return "В центральной части комнаты расположены два {пилона} высотой около метра. На вершине одного из пилонов установлен сверкающий металлический стержень. Стержень на втором пилоне сильно погнут и выведен из строя.^";
 
		elseif (s.state == 0) then
 
			return "В центральной части комнаты расположены два пилона высотой около метра. Металлические стержни, установленные в их вершине сильно повреждены.^";
 
		end;
 
	end;
 
};
 
 
fb_throwAway = function(target)
 
	local positions = {};
 
	if (target.position[1] - 1 >= 0) then
 
		if (target.position[2] - 1 >= 0) then
 
			positions[#positions + 1] = {target.position[1] - 1, target.position[2] - 1};
 
		end;
 
		positions[#positions + 1] = {target.position[1] - 1, target.position[2]};
 
		if (target.position[2] + 1 <= 2) then
 
			positions[#positions + 1] = {target.position[1] - 1, target.position[2] + 1};
 
		end;
 
	end;
 
	
 
	if (target.position[2] - 1 >= 0) then
 
		positions[#positions + 1] = {target.position[1], target.position[2] - 1};
 
	end;
 
	if (target.position[2] + 1 <= 2) then
 
		positions[#positions + 1] = {target.position[1], target.position[2] + 1};
 
	end;
 
	
 
	if (target.position[1] + 1 <= 2) then
 
		if (target.position[2] - 1 >= 0) then
 
			positions[#positions + 1] = {target.position[1] + 1, target.position[2] - 1};
 
		end;
 
		positions[#positions + 1] = {target.position[1] + 1, target.position[2]};
 
		if (target.position[2] + 1 <= 2) then
 
			positions[#positions + 1] = {target.position[1] + 1, target.position[2] + 1};
 
		end;
 
	end;
 
	
 
	target.position = positions[rnd(#positions)];
 
end;
 
 
fb_getGeneratorIcon = function(value)
 
	if (value == 0) then
 
		return "images/fb_inactive.png";
 
	elseif (value == 1) then
 
		return "images/fb_awake.png";
 
	elseif (value == 2) then
 
		return "images/fb_shield.png";
 
	elseif (value == 3) then
 
		return "images/fb_throw.png";
 
	elseif (value == 4) then
 
		return "images/fb_charge.png";
 
	elseif (value == 5) then
 
		return "images/fb_pylon.png";
 
	end;
 
end;
 
 
final_battle = room {
 
	nam = "final_battle";
 
	pic = function(s)
 
		local image = 'images/fb_bcg.png';
 
		image = image .. ";" .. fb_getGeneratorIcon(s.generators[1]) .. "@48,0";
 
		image = image .. ";" .. fb_getGeneratorIcon(s.generators[2]) .. "@96,0";
 
		image = image .. ";" .. fb_getGeneratorIcon(s.generators[3]) .. "@96,48";
 
		image = image .. ";" .. fb_getGeneratorIcon(s.generators[4]) .. "@96,96";
 
		image = image .. ";" .. fb_getGeneratorIcon(s.generators[5]) .. "@48,96";
 
		image = image .. ";" .. fb_getGeneratorIcon(s.generators[6]) .. "@0,96";
 
		image = image .. ";" .. fb_getGeneratorIcon(s.generators[7]) .. "@0,48";
 
		image = image .. ";" .. fb_getGeneratorIcon(s.generators[8]) .. "@0,0";
 
		if (fb_naethvjirr.hitpoints > 0) then
 
			image = image .. ";images/fb_naethvjirr.png@64,80";
 
		end;
 
		if (fb_black.hitpoints > 0) then
 
			image = image .. ";images/fb_black.png@80,80";
 
		end;
 
		image = image .. ";images/fb_player.png@"..tostring(pl.position[1] * 48 + 16)..","..tostring((2 - pl.position[2]) * 48 + 16);
 
		if (fb_pylons.state > 1) then
 
			image = image .. ";images/fb_pylon.png@48,64";
 
		else
 
			image = image .. ";images/fb_inactive.png@48,64";
 
		end;
 
		if (fb_pylons.state > 0) then
 
			image = image .. ";images/fb_pylon.png@80,64";
 
		else
 
			image = image .. ";images/fb_inactive.png@80,64";
 
		end;
 
		return image;
 
	end;
 
	disp = "Лсэрианотр, центральный зал";
 
	awakening = 300;
 
	dsc = function(s)
 
		local temp = "";
 
		if (pl.position[1] == 1 and pl.position[2] == 2) then
 
			temp = "северной";
 
		elseif (pl.position[1] == 2 and pl.position[2] == 2) then
 
			temp = "северо-восточной";
 
		elseif (pl.position[1] == 2 and pl.position[2] == 1) then
 
			temp = "восточной";
 
		elseif (pl.position[1] == 2 and pl.position[2] == 0) then
 
			temp = "юго-восточной";
 
		elseif (pl.position[1] == 1 and pl.position[2] == 0) then
 
			temp = "южной";
 
		elseif (pl.position[1] == 0 and pl.position[2] == 0) then
 
			temp = "юго-западной";
 
		elseif (pl.position[1] == 0 and pl.position[2] == 1) then
 
			temp = "западной";
 
		elseif (pl.position[1] == 0 and pl.position[2] == 2) then
 
			temp = "северо-западной";
 
		elseif (pl.position[1] == 1 and pl.position[2] == 1) then
 
			temp = "центральной";
 
		end;
 
		
 
		local debug_str = tostring(s.awakening) .. " ";
 
		debug_str = debug_str .. tostring(fb_pylons.charging) .. " ";
 
		
 
		return "Вы находитесь в " .. temp .. " части главного зала древнего города Навьяр. На схеме приведено расположение важных объектов в комнате, включая символы, изображенные на генераторах" .. debug_str;
 
		--Вдоль стен стоят огромные металлические шкафы, из которых тысячи проводом тянутся к громадной конструкции в центре зала. Мягкий свет льется сверху, практически ослепляя вас после полумрака остальной части мертвого города. "
 
		--]];
 
	end;
 
	left = function(s)
 
		lifeoff(s);
 
	end;
 
	entered = function(s)
 
		-- Здесь будем собирать все необходимое для начала финальной битвы: сопартийцы отыграют свою роль, после чего начнется битва не на жизнь, а на смерть.
 
		s.entered = nil; -- Должно отработать не более одного раза
 
		pl.position = {1,2};
 
		local throw = rnd(8);
 
		while (s.generators[throw] ~= 1) do
 
			throw = rnd(8);
 
		end;
 
		s.generators[throw] = 3;
 
		
 
		local shield = rnd(8);
 
		while (s.generators[shield] ~= 1) do
 
			shield = rnd(8);
 
		end;
 
		s.generators[shield] = 2;
 
		
 
		local charge = rnd(8);
 
		while (s.generators[charge] ~= 1) do
 
			charge = rnd(8);
 
		end;
 
		s.generators[charge] = 4;
 
		
 
		local pylon = rnd(8);
 
		while (s.generators[pylon] ~= 1) do
 
			pylon = rnd(8);
 
		end;
 
		s.generators[pylon] = 5;
 
		
 
		lifeon(s);
 
	end;
 
	life = function(s)
 
		fb_north:enable();
 
		fb_northeast:enable();
 
		fb_east:enable();
 
		fb_southeast:enable();
 
		fb_south:enable();
 
		fb_southwest:enable();
 
		fb_west:enable();
 
		fb_northwest:enable();
 
	
 
		if (pl.position[2] == 2) then
 
			fb_north:disable();
 
			fb_northeast:disable();
 
			fb_northwest:disable();
 
		elseif (pl.position[2] == 0) then
 
			fb_south:disable();
 
			fb_southeast:disable();
 
			fb_southwest:disable();
 
		end;
 
		
 
		if (pl.position[1] == 2) then
 
			fb_east:disable();
 
			fb_northeast:disable();
 
			fb_southeast:disable();
 
		elseif (pl.position[1] == 0) then
 
			fb_west:disable();
 
			fb_northwest:disable();
 
			fb_southwest:disable();
 
		end;
 
		
 
		fb_generator:enable();
 
		if (pl.position[1] == 1 and pl.position[2] == 2) then
 
			fb_generator.index = 1;
 
		elseif (pl.position[1] == 2 and pl.position[2] == 2) then
 
			fb_generator.index = 2;
 
		elseif (pl.position[1] == 2 and pl.position[2] == 1) then
 
			fb_generator.index = 3;
 
		elseif (pl.position[1] == 2 and pl.position[2] == 0) then
 
			fb_generator.index = 4;
 
		elseif (pl.position[1] == 1 and pl.position[2] == 0) then
 
			fb_generator.index = 5;
 
		elseif (pl.position[1] == 0 and pl.position[2] == 0) then
 
			fb_generator.index = 6;
 
		elseif (pl.position[1] == 0 and pl.position[2] == 1) then
 
			fb_generator.index = 7;
 
		elseif (pl.position[1] == 0 and pl.position[2] == 2) then
 
			fb_generator.index = 8;
 
		elseif (pl.position[1] == 1 and pl.position[2] == 1) then
 
			fb_generator:disable();
 
		end;
 
		
 
		local activeGens = false;
 
		for i = 1, #s.generators do
 
			if (s.generators[i] ~= 0) then
 
				activeGens = true;
 
			end;
 
		end;
 
		
 
		if (not activeGens) then
 
			walk(game_over_victory);
 
		end;
 
	end;
 
	passturn = function(s)
 
		-- реальный расчет боевых действий будет в этой функции
 
		for i = 1,#s.generators do
 
			if (s.generators[i] == 1) then
 
				s.awakening = s.awakening - 10;
 
			end;
 
		end;
 
		for i = 1,#s.obj do
 
			if (s.obj[i].passturn) then
 
				s.obj[i].passturn(s.obj[i]);
 
			end;
 
		end;
 
		if (s.awakening <= 0) then
 
			walk(game_over_awakening);
 
		end;
 
	end;
 
	generators = {
 
		1, 1, 1, 1, 1, 1, 1, 1
 
		-- В этот массив заносятся состояния генераторов: a - active, i - inactive, t - throw, s - shield, c - charge, p - pylon
 
		-- Состояния генераторов записываются цифрами по приоритету от минимального до максимального(чем больше цифра, тем больше приоритет)
 
		-- 0 - inactive, 1 - active, 2 - shield, 3 - throw, 4 - charge, 5 - pylon
 
	};
 
	obj = {
 
		'fb_pylons',
 
		'fb_naethvjirr',
 
		'fb_black',
 
		'fb_generator',
 
		
 
		'fb_north',
 
		'fb_northeast',
 
		'fb_east',
 
		'fb_southeast',
 
		'fb_south',
 
		'fb_southwest',
 
		'fb_west',
 
		'fb_northwest'
 
	};
 
};
 
 
fb_generator = obj {
 
	nam = "fb_generator",
 
	dsc = function(s)
 
		if (final_battle.generators[s.index] == 0) then
 
			return "Рядом с вами расположен огромный металлический {шкаф}, искореженный несколькими ударами тяжелого предмета. Судя по всему этот генератор выведен из строя. ^";
 
		else
 
			return "Рядом с вами расположен огромный металлический {шкаф}, расположенный рядом с вами издает негромкий гул. На его передней стенке виден светящийся символ. Конструкция соединена толстыми проводами с троном Наэтвьирра, в центре зала. ^";
 
		end;
 
	end;
 
	index = 0;
 
	act = "Вы ничего не сможете сделать с генератором без дополнительных приспособлений";
 
	noshootmsg = "Это бесполезно";
 
	canhit = true;
 
	onhit = function(s)
 
		--[[
 
			Модули питания могут быть назначены на одну из нескольких подсистем.
 
			Для питания каждой подсистемы требуется минимум один источник ее питания. Всего подсистемы следующие: пилоны, щит, разряд, разброс и пробуждение. 
 
			Приоритеты распределения таковы: 
 
			Всегда должна быть активна минимум одна атакующая подсистема, в порядке эффективности: пилоны, разряд, разброс.
 
			Если для атакующих подсистем достаточно энергии, то активен и щит.
 
			Наименьшим приоритетом обладает пробуждение.
 
			Также учитывается возможность и целесообразность применения защитных и атакующих подсистем:
 
			Если аватар уничтожен, нет смысла поддерживать щит, разброс и разряд.
 
		]]
 
		local gen = final_battle.generators[s.index];
 
		final_battle.generators[s.index] = 0;
 
		local moreInfo = "";
 
		if (gen == 5) then
 
			--Как самая эффективная система атаки, пилоны всегда заряжаются, независимо от обстоятельств
 
			fb_pylons.charging = fb_pylons.charging - 4;
 
			if (fb_pylons.charging < 0) then
 
				fb_pylons.charging = 0;
 
			end;
 
			local priorityToReplace = 4;
 
			local activeCount = 0;
 
			for i = 1,#final_battle.generators do
 
				if (final_battle.generators[i] ~= 0 and final_battle.generators[i] <= priorityToReplace) then
 
					activeCount = activeCount + 1;
 
					if (final_battle.generators[i] < priorityToReplace) then
 
						priorityToReplace = final_battle.generators[i];
 
					end;
 
				end;
 
			end;
 
			if (activeCount > 0) then
 
				local replacementIndex = rnd(8);
 
				while (final_battle.generators[replacementIndex] ~= priorityToReplace) do
 
					replacementIndex = rnd(8);
 
				end;
 
				final_battle.generators[replacementIndex] = gen;
 
			end;
 
		elseif (gen == 4) then
 
			fb_naethvjirr.charge = fb_naethvjirr.charge + 1;
 
			local priorityToReplace = 3;
 
			local activeCount = 0;
 
			for i = 1,#final_battle.generators do
 
				if (final_battle.generators[i] ~= 0 and final_battle.generators[i] <= priorityToReplace) then
 
					activeCount = activeCount + 1;
 
					if (final_battle.generators[i] < priorityToReplace) then
 
						priorityToReplace = final_battle.generators[i];
 
					end;
 
				end;
 
			end;
 
			if (activeCount > 0) then
 
				local replacementIndex = rnd(8);
 
				while (final_battle.generators[replacementIndex] ~= priorityToReplace) do
 
					replacementIndex = rnd(8);
 
				end;
 
				final_battle.generators[replacementIndex] = gen;
 
			end;			
 
		elseif (gen == 3) then
 
			fb_naethvjirr.throw = fb_naethvjirr.throw + 1;
 
			local priorityToReplace = 2;
 
			local activeCount = 0;
 
			for i = 1,#final_battle.generators do
 
				if (final_battle.generators[i] ~= 0 and final_battle.generators[i] <= priorityToReplace) then
 
					activeCount = activeCount + 1;
 
					if (final_battle.generators[i] < priorityToReplace) then
 
						priorityToReplace = final_battle.generators[i];
 
					end;
 
				end;
 
			end;
 
			if (activeCount > 0) then
 
				local replacementIndex = rnd(8);
 
				while (final_battle.generators[replacementIndex] ~= priorityToReplace) do
 
					replacementIndex = rnd(8);
 
				end;
 
				final_battle.generators[replacementIndex] = gen;
 
			end;
 
		elseif (gen == 2) then
 
			fb_naethvjirr.shield = false;
 
			moreInfo = "Щит вокруг Наэтвьирра растворяется, оставляя конструкта открытым для ваших атак. ";
 
			local priorityToReplace = 1;
 
			local activeCount = 0;
 
			for i = 1,#final_battle.generators do
 
				if (final_battle.generators[i] ~= 0 and final_battle.generators[i] <= priorityToReplace) then
 
					activeCount = activeCount + 1;
 
					if (final_battle.generators[i] < priorityToReplace) then
 
						priorityToReplace = final_battle.generators[i];
 
					end;
 
				end;
 
			end;
 
			if (activeCount > 0) then
 
				local replacementIndex = rnd(8);
 
				while (final_battle.generators[replacementIndex] ~= priorityToReplace) do
 
					replacementIndex = rnd(8);
 
				end;
 
				final_battle.generators[replacementIndex] = gen;
 
			end;
 
		elseif (gen == 0) then
 
			return "Генератор итак выведен из строя, незачем его дальше колотить. ";
 
		end;
 
		p("После нескольких сильных ударов генератор затихает. ".. moreInfo);
 
		final_battle.passturn(final_battle);
 
	end;
 
};
 
 
fb_north = obj {
 
	nam = "north",
 
	dsc = "{На север}",
 
	act = function(s)
 
		pl.position[2] = pl.position[2] + 1;
 
		p("Вы идете на север");
 
		final_battle.passturn(final_battle);
 
	end;
 
};
 
 
fb_northeast = obj {
 
	nam = "northeast",
 
	dsc = "{На северо-восток}",
 
	act = function(s)
 
		pl.position[1] = pl.position[1] + 1;
 
		pl.position[2] = pl.position[2] + 1;
 
		p("Вы идете на северо-восток.");
 
		final_battle.passturn(final_battle);
 
	end;
 
};
 
 
fb_east = obj {
 
	nam = "east",
 
	dsc = "{На восток}",
 
	act = function(s)
 
		pl.position[1] = pl.position[1] + 1;
 
		p("Вы идете на восток.");
 
		final_battle.passturn(final_battle);
 
	end;
 
};
 
 
fb_southeast = obj {
 
	nam = "southeast",
 
	dsc = "{На юго-восток}",
 
	act = function(s)
 
		pl.position[1] = pl.position[1] + 1;
 
		pl.position[2] = pl.position[2] - 1;
 
		p("Вы идете на юго-восток.");
 
		final_battle.passturn(final_battle);
 
	end;
 
};
 
 
fb_south = obj {
 
	nam = "south",
 
	dsc = "{На юг}",
 
	act = function(s)
 
		pl.position[2] = pl.position[2] - 1;
 
		p("Вы идете на юг.");
 
		final_battle.passturn(final_battle);
 
	end;
 
};
 
 
fb_southwest = obj {
 
	nam = "southwest",
 
	dsc = "{На юго-запад}",
 
	act = function(s)
 
		pl.position[1] = pl.position[1] - 1;
 
		pl.position[2] = pl.position[2] - 1;
 
		p("Вы идете на юго-запад.");
 
		final_battle.passturn(final_battle);
 
	end;
 
};
 
 
fb_west = obj {
 
	nam = "west",
 
	dsc = "{На запад}",
 
	act = function(s)
 
		pl.position[1] = pl.position[1] - 1;
 
		p("Вы идете на запад.");
 
		final_battle.passturn(final_battle);
 
	end;
 
};
 
 
fb_northwest = obj {
 
	nam = "northwest",
 
	dsc = "{На северо-запад}",
 
	act = function(s)
 
		pl.position[1] = pl.position[1] - 1;
 
		pl.position[2] = pl.position[2] + 1;
 
		p("Вы идете на северо-запад.");
 
		final_battle.passturn(final_battle);
 
	end;
 
};
 
\ No newline at end of file
final_scene.lua
Show inline comments
 
new file 100644
 
adrian_helper = obj {
 
	nam = "adrian_helper";
 
	life = function(s)
 
		if (char_adrian.state > 1 and char_adrian.state < 5) then 
 
			char_adrian.state = char_adrian.state + 1;
 
		elseif (char_adrian.state == 5) then
 
			char_naethvjirr.active = true;
 
			return [[
 
				Адриан что-то делает с пультом управления и Наэтвьирр оживает
 
			]], true;
 
		end;
 
	end;
 
};
 
 
char_adrian = obj {
 
	nam = "adrian";
 
	disp = "Adrian";
 
	state = 1;
 
	dsc = function(s)
 
		if (char_naethvjirr.active) then
 
			return [[
 
				Вы видите {Адриана Блэка}, стоящего рядом с автоматоном. ^
 
			]];
 
		else
 
			if (s.state == 1) then
 
				return [[
 
					Вы видите {Адриана Блэка}, стоящего рядом с автоматоном. Он что-то делает с ним. ^
 
				]];
 
			elseif (s.state < 6) then
 
				return [[
 
					{Блэк} собирается включить Наэтвьирра. ^
 
				]];
 
			end;
 
		end;
 
	end;
 
	life = function(s)
 
		if (s.state < 5) then 
 
			s.state = s.state + 1;
 
		elseif (s.state == 5) then
 
			char_naethvjirr.active = true;
 
			return [[
 
				Адриан что-то делает с пультом управления и Наэтвьирр оживает
 
			]], true;
 
		end;
 
	end;
 
	act = function(s)
 
		if (s.state == 1) then 
 
			walkin "adrian_dlg";
 
		elseif (s.state < 5) then
 
			return "Надо как-то остановить его, но как?";
 
		else 
 
			-- TODO: Вы сбиваете Уильяма с ног
 
		end;
 
	end;
 
};
 
 
adrian_dlg = dlg {
 
	nam = "adrian_dlg";
 
	disp = "Уильям Дрейк";
 
	hideinv = true;
 
	entered = [[
 
		Уильям поворачивается к вам. Кажется, он узнал вас. Его лицо выражает крайнюю степень удивления: 
 
		"Дэвид?! Что ты здесь делаешь?". Он отвлекся от работы с Наэтвьирром. Кажется, он рад вас видеть.
 
	]];
 
	phr = {
 
		-- TODO:Low Priority Эта фраза должна открывать ветку личных вопросов к Уильяму
 
		{"Где ты был все эти годы?", [[
 
			"Более пятнадцати лет назад я впервые спустился под воду. Впервые встретил Навьяров. Тогда я, мы, весь Вест Хейвен, начал усиленно работать над повышением длительности подводных экспедиций. Навьяры были неиссякаемым источником ценностей, редких на поверхности. Через два года мы построили Атлантиду. Тогда это был просто склад и небольшая станция, позволяющая нам в более свободных условиях общаться с Навьярами. За три года Атлантида превратилась в полноценный город, полностью автономно существующий под водой. Тогда я принял решение - я ушел сюда, вниз. Исследовать этот новый, неизведанный мир."
 
		]]},
 
		{"Что здесь происходит?", [[
 
			"Делаю то, что должен. То, что принесет всем нам новый мир, в котором будут процветать и люди и навьяры. Мир, в котором древние знания будут доступны всем и будут приумножаться всеми. Эта машина - ключ ко всему. Навьяры называют его Наэтвьирр - спящий разум глубин, хотя его настоящее имя - Эйлеслвьихенарр - вечный разум глубин и поверхности. "
 
		]]},
 
		{"Расскажи мне больше о Наэтвьирре", [[
 
			"Согласно легендам, собранным мной в разных поселениях навьяров, Наэтвьирр был построен в глубокой древности навьярами, которые тогда господствовали как под водой, так и на суше. Единственной целью существования Наэтвьирра было стать "вечным мудрецом" - "эйлеслэйлайхевьирр", как его называют до сих пор в некоторых местах. Имена менялись, как всегда было у навьяров, но всегда отражали суть - частично или полностью. Из всего, что я услышал, я понял, что лишь в результате чудовищной ошибки Наэтвьирр не был включен. Сейчас я собираюсь сделать то, что должно было быть сделано тогда."     
 
		]]},
 
		{"Ты не должен включать Наэтвьирра! Он - не то, что ты думаешь", [[
 
			"Я пять лет потратил на его изучение, почти досконально изучив историю его создания, назначение и возможности. Я считаю, что изучил достаточно, чтобы смочь контроллировать его."
 
		]], [[ pstart 'halt_naethvjirr' ]]},
 
		{
 
			tag="halt_naethvjirr", 
 
			empty = function()
 
				char_adrian.state = 2;
 
				p("^^С этими словами, Уильям подходит к рубильнику. У вас есть несколько мгновений, чтобы отреагировать");
 
				walk("final_scene_before_battle");
 
				char_naethvjirr.canshoot = true;
 
				lifeon(adrian_helper);
 
			end
 
		},
 
		{"Посмотри на эту табличку. *Вы показываете Уильяму табличку со схемой работы Наэтвьирра* Проблема в том, что \"ключ\" утерян", [[
 
			"Я видел это. Есть еще один способ. Смотри" - Уильям показывает вам серебристую пластинку небольшого размера(около 20х15см), на которой отсвечивают красноватые круги и линии. - "Я извлек этот фрагмент из машины. Без него Наэтвьирр не сможет выйти из под контроля - это тот самый компонент, который должен блокироваться или разблокироваться ключом. Я предполагаю, что при запуске Наэтвьирра без этого устройства, он должен работать так, будто ключ активен и Наэтвьирр находится в полном подчинении правителя Лсэрианотра."
 
		]]},
 
		{"И что ты будешь делать с ним?",[[
 
			"То, что должно было быть сделано тысячелетия назад - мы построим огромные города для миллионов людей и Навьяров в океане и на суше. Мы объединим народы навьяров и людей, как предписано легендами. Машины под управлением Наэтвьирра обеспечат население планеты всем необходимым, позволив нам обеспечить дальнейшее улучшение и совершенстование нашего мира. Мы оживим Лсэрианотр - мировой центр науки и искусства. Вернем ему славу былых времен. "
 
		]]},
 
		{"А если ты ошибаешься?", [[
 
			"Повторюсь. Я пять лет потратил на его изучение, почти досконально изучив историю его создания, назначение и возможности. Я считаю, что изучил достаточно."
 
		]]},
 
	};
 
};
 
 
char_naethvjirr = obj {
 
	nam = "naethvjirr";
 
	disp = "Наэтвьирр";
 
	disp2 = "Наэтвьирра";
 
	canshoot = false;	
 
	dsc = function(s)
 
		if (s.active) then
 
			return [[
 
				В центре зала перед массивной конструкцией, напоминающей трон, стоит {автоматон навьяр}. Конструкт выглядит совершенно как живой, сияющие белым светом глаза оглядывают помещение и вас в ожидании ваших действий. Тысячи проводов тянутся от "трона" к стенам, подобно щупальцам. ^
 
			]];
 
		else
 
			return [[
 
				В центре зала на массивной конструкции, напоминающей трон, сидит {навьяр}. Конструкт выглядит совершенно как живой, однако он абсолютно неподвижен. Покрытые серебристой чешуей, его руки покоятся на коленях. Тысячи проводов тянутся от "трона" и фигуры к стенам, подобно щупальцам. Глаза навьяра закрыты. ^
 
			]];
 
		end;
 
	end;
 
	act = [[
 
		Я пока не знаю, что с этим делать
 
	]];
 
	noshootmsg = "Я не знаю, к чему это приведет, пока лучше этого не делать";
 
	nohitmsg = "Я не знаю, к чему это приведет, пока лучше этого не делать";
 
	onshoot = function(s)
 
		p("^^Ваш выстрел повреждает Наэтвьирра, но вы не замечаете, сказалось ли это на его работоспособности");
 
		fb_naethvjirr.hitpoints = 2;
 
		char_adrian.state = 6;
 
		-- TODO Уильям стреляет в одного из членов партии
 
		if (#pl.party ~= 0) then
 
			chosen_one_name = pl.party[rnd(#pl.party)];
 
			if (chosen_one_name == "learr") then
 
				chosen_one = char_learr_fb;
 
			elseif (chosen_one_name == "phaetlarr") then
 
				chosen_one = char_phaetlarr_fb;
 
			elseif (chosen_one_name == "radcliffe") then
 
				chosen_one = char_radcliffe_fb;
 
			else
 
				chosen_one = char_wright_fb;
 
			end;
 
			p("^^Уильям вскидывает пистолет и стреляет в вашу сторону. " .. chosen_one.disp .. " падает замертво");
 
			walk(final_battle);
 
		else
 
			-- TODO Уильям стреляет в вас
 
			walk("game_over_shot");
 
		end;
 
	end;
 
};
 
 
char_learr_fb = obj {
 
	nam = "learr_fb";
 
	disp = "Леарр";
 
	dsc = function()
 
		return [[
 
			{Леарр} смотрит попеременно то на вас, то на Уильяма ^
 
		]];
 
	end;
 
};
 
 
char_phaetlarr_fb = obj {
 
	nam = "phaetlarr_fb";
 
	disp = "Фаэтларр";
 
	dsc = function()
 
		return [[
 
			{Фаэтларр} оглядывает зал ^
 
		]];
 
	end;
 
};
 
 
char_radcliffe_fb = obj {
 
	nam = "radcliffe_fb";
 
	disp = "Уолтер Рэдклифф";
 
	dsc = function()
 
		return [[
 
			{Уолтер Рэдклифф} с интересом разглядывает Наэтвьирра ^
 
		]];
 
	end;
 
};
 
 
char_wright_fb = obj {
 
	nam = "wright_fb";
 
	disp = "Джек Райт";
 
	dsc = function()
 
		return [[
 
			{Джек Райт} ждет ваших действий ^
 
		]];
 
	end;
 
};
 
 
final_scene_before_battle = room {
 
	nam = "final_scene_before_battle";
 
	disp = "Лсэрианотр, центральный зал";
 
	dsc = [[
 
		Вы находитесь в центральном зале древнего города Навьяр. Вдоль стен стоят огромные металлические шкафы, из которых тысячи проводом тянутся к громадной конструкции в центре зала. Мягкий свет льется сверху, практически ослепляя вас после полумрака остальной части мертвого города. 
 
	]];
 
	obj = {
 
		"char_naethvjirr",
 
		"char_adrian",
 
		"adrian_helper",
 
		"char_learr_fb",
 
		"char_phaetlarr_fb",
 
		"char_radcliffe_fb",
 
		"char_wright_fb"
 
	};
 
};
 
 
--final_scene_before_battle_interrupt = room {
 
--	nam = "final_scene_before_battle_interrupt";
 
--	disp = "Лсэрианотр, центральный зал";
 
--	dsc = "";
 
--	obj = {
 
--	};
 
--};
 
\ No newline at end of file
first_city_inner_rim.lua
Show inline comments
 
new file 100644
 
first_city_inner_south = room {
 
	nam = "first_city_inner_south";
 
	disp = "Лсэрианотр, внутреннее кольцо, юг";
 
	gate = "first_city_middle_south";
 
	east = "first_city_inner_east";
 
	west = "first_city_inner_west";
 
	navigatable = true;
 
	dsc = [[
 
		Вы находитесь в южной части внутреннего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	view = [[
 
		Вы находитесь в южной части внутреннего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	obj = {
 
		"first_city_east",
 
		"first_city_west",
 
		obj { nam = "first_city_third_gate_out", dsc = "{Войти в среднее кольцо}", act = "Без Левиафана перемещение по городу займет слишком много времени"};--:disabled();
 
	};
 
};
 
 
first_city_inner_east = room {
 
	nam = "first_city_inner_east";
 
	disp = "Лсэрианотр, внутреннее кольцо, восток";
 
	south = "first_city_inner_south";
 
	north = "first_city_inner_north";
 
	navigatable = true;
 
	dsc = [[
 
		Вы находитесь в восточной части внутреннего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	view = [[
 
		Вы находитесь в восточной части внутреннего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	obj = {
 
		"first_city_south",
 
		"first_city_north"
 
	};
 
};
 
 
first_city_inner_west = room {
 
	nam = "first_city_inner_west";
 
	disp = "Лсэрианотр, внутреннее кольцо, запад";
 
	south = "first_city_inner_south";
 
	north = "first_city_inner_north";
 
	navigatable = true;
 
	dsc = [[
 
		Вы находитесь в западной части внутреннего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	view = [[
 
		Вы находитесь в западной части внутреннего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	obj = {
 
		"first_city_south",
 
		"first_city_north"
 
	};
 
};
 
 
first_city_inner_north = room {
 
	nam = "first_city_inner_north";
 
	disp = "Лсэрианотр, внутреннее кольцо, север";
 
	east = "first_city_inner_east";
 
	west = "first_city_inner_west";
 
	navigatable = true;
 
	dsc = [[
 
		Вы находитесь в северной части внутреннего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	view = [[
 
		Вы находитесь в северной части внутреннего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	way = {
 
		vroom("Центр города", "first_city_central_room_entrance");
 
		vroom("Левиафан", "leviathan_airlock");
 
	};
 
};
 
 
first_city_central_room_entrance = room {
 
	nam = "first_city_central_room_entrance";
 
	disp = "Лсэрианотр, Вход в центральный зал";
 
	dsc = [[
 
		Вы находитесь у входа в центральный зал Лсэрианотра. Входная дверь закрывается и вода быстро откачивается из помещения. Вы снимаете скафандр и готовитесь к встрече с Уильямом.
 
		Отсюда пути назад уже нет.
 
	]];
 
	obj = {
 
		vway("Центральный зал", "{Вперед}", "final_scene_before_battle");
 
	};
 
};
 
\ No newline at end of file
first_city_middle_rim.lua
Show inline comments
 
new file 100644
 
first_city_middle_south = room {
 
	nam = "first_city_middle_south";
 
	disp = "Лсэрианотр, среднее кольцо, юг";
 
	gate = "first_city_inner_south";
 
	east = "first_city_middle_east";
 
	west = "first_city_middle_west";
 
	navigatable = true;
 
	dsc = [[
 
		Вы находитесь в южной части среднего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	view = [[
 
		Вы находитесь в южной части среднего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	obj = {
 
		"first_city_east",
 
		"first_city_west",
 
		obj { nam = "first_city_third_gate", dsc = "{Войти во внутреннее кольцо}", act = "Без Левиафана перемещение по городу займет слишком много времени"};--:disabled();
 
	};
 
};
 
 
first_city_middle_east = room {
 
	nam = "first_city_middle_east";
 
	disp = "Лсэрианотр, среднее кольцо, восток";
 
	south = "first_city_middle_south";
 
	north = "first_city_middle_north";
 
	navigatable = true;
 
	dsc = [[
 
		Вы находитесь в восточной части среднего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	view = [[
 
		Вы находитесь в восточной части среднего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	obj = {
 
		"first_city_south",
 
		"first_city_north"
 
	};
 
};
 
 
first_city_middle_west = room {
 
	nam = "first_city_middle_west";
 
	disp = "Лсэрианотр, среднее кольцо, запад";
 
	south = "first_city_middle_south";
 
	north = "first_city_middle_north";
 
	navigatable = true;
 
	dsc = [[
 
		Вы находитесь в западной части среднего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	view = [[
 
		Вы находитесь в западной части среднего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	obj = {
 
		"first_city_south",
 
		"first_city_north"
 
	};
 
};
 
 
first_city_middle_north = room {
 
	nam = "first_city_middle_north";
 
	disp = "Лсэрианотр, среднее кольцо, север";
 
	gate = "first_city_outer_north";
 
	east = "first_city_middle_east";
 
	west = "first_city_middle_west";
 
	navigatable = true;
 
	dsc = [[
 
		Вы находитесь в северной части среднего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	view = [[
 
		Вы находитесь в северной части среднего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	obj = {
 
		"first_city_east",
 
		"first_city_west",
 
		obj { nam = "first_city_second_gate_exit", dsc = "{Войти во внешнее кольцо}", act = "Без Левиафана перемещение по городу займет слишком много времени"};
 
	};
 
};
 
\ No newline at end of file
first_city_outer_rim.lua
Show inline comments
 
new file 100644
 
char_first_city_guardian = obj {
 
	nam = "first_city_guardian";
 
	disp = "Страж";
 
	dsc = [[
 
		Вы видите фигуру {Навьяра}, стоящего около ворот. Приглядевшись внимательнее, вы понимаете, что это автоматон.^
 
	]];
 
	act = function()
 
		return [[
 
			Автоматон выглядит намного совершеннее тех, что вам доводилось видеть на Атлантиде. Его тело покрыто чешуей, как и тело живых Навьяр. Его выдают лишь стеклянные немигающие глаза и полная неподвижность.
 
			Головные плавники автоматона плавно меняют цвета, но даже если бы вы понимали, что это значит, вы не смогли бы ему ответить.
 
		]];
 
	end
 
};
 
 
item_first_city_key = obj {
 
	nam = "first_city_key";
 
	disp = "Ключ от города";
 
	inv = [[
 
		Небольшой светящийся кубик со стороной около 2-х сантиметров. Он плавно меняет цвета: синий, зеленый, желтый, белый, красный, черный.
 
	]];
 
	use = function(s, o)
 
		if (o == char_first_city_guardian) then 
 
			objs("first_city_entrance"):enable("first_city_first_gate");
 
			first_city_entrance.open = true;
 
			return [[
 
				Как только кубик попадает в поле зрения стража, его плавник гаснет и ворота начинают медленно открываться. 
 
				Через несколько минут они застывают в открытом состоянии. Теперь ничто не мешает вашему проходу.
 
			]];
 
		end;
 
	end
 
}
 
 
first_city_entrance = room {
 
	nam = "first_city_entrance";
 
	disp = "Лсэрианотр, врата";
 
	dsc = function(s)
 
		if (not s.open) then
 
			return [[
 
				Вы находитесь на глубине нескольких километров под водой. Прожектор вашего скафандра с трудом пробивает непроглядную толщу воды. 
 
				Почти вплотную перед вами расположены огромные ворота из неизвестного материала. 
 
			]];
 
		else
 
			return [[
 
				Вы находитесь на глубине нескольких километров под водой. Прожектор вашего скафандра с трудом пробивает непроглядную толщу воды. 
 
				Огромные ворота открыты и Левиафан легко пройдет в них.
 
			]];
 
		end;
 
	end;
 
	view = function(s)
 
		if (not s.open) then
 
			return [[
 
				Левиафан находится на глубине нескольких километров под водой. Мощный прожектор субмарины с трудом пробивает непроглядную толщу воды. 
 
				Огромные ворота из неизвестного материала преграждают вам путь внутрь. 
 
			]];
 
		else
 
			return [[
 
				Левиафан находится на глубине нескольких километров под водой. Мощный прожектор субмарины с трудом пробивает непроглядную толщу воды. 
 
				Огромные ворота открыты и Левиафан легко пройдет в них.
 
			]];
 
		end;
 
	end;
 
	obj = {
 
		"char_first_city_guardian";
 
		obj { nam = "first_city_first_gate", dsc = "{Войти в Лсэрианотр}", act = "Без Левиафана перемещение по городу займет слишком много времени"}:disable();
 
	};
 
};
 
 
first_city_north = obj { nam = "first_city_north", dsc = "{На восток}", act = "Без Левиафана перемещение по городу займет слишком много времени"};
 
first_city_south = obj { nam = "first_city_south", dsc = "{На восток}", act = "Без Левиафана перемещение по городу займет слишком много времени"};
 
first_city_west = obj { nam = "first_city_west", dsc = "{На восток}", act = "Без Левиафана перемещение по городу займет слишком много времени"};
 
first_city_east = obj { nam = "first_city_east", dsc = "{На запад}", act = "Без Левиафана перемещение по городу займет слишком много времени"};
 
 
first_city_outer_south = room {
 
	nam = "first_city_outer_south";
 
	disp = "Лсэрианотр, внешнее кольцо, юг";
 
	gate = "first_city_entrance";
 
	east = "first_city_outer_east";
 
	west = "first_city_outer_west";
 
	navigatable = true;
 
	dsc = [[
 
		Вы находитесь в южной части внешнего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	view = [[
 
		Вы находитесь в южной части внешнего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	obj = {
 
		obj { nam = "first_city_gate_out", dsc = "{Покинуть Лсэрианотр}", act = "Без Левиафана никуда добраться не получится. Нет смысла покидать город"}:disable();
 
		"first_city_east",
 
		"first_city_west",
 
	};
 
};
 
 
first_city_outer_east = room {
 
	nam = "first_city_outer_east";
 
	disp = "Лсэрианотр, внешнее кольцо, восток";
 
	south = "first_city_outer_south";
 
	north = "first_city_outer_north";
 
	navigatable = true;
 
	dsc = [[
 
		Вы находитесь в восточной части внешнего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	view = [[
 
		Вы находитесь в восточной части внешнего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	obj = {
 
		"first_city_south",
 
		"first_city_north"
 
	};
 
};
 
 
first_city_outer_west = room {
 
	nam = "first_city_outer_west";
 
	disp = "Лсэрианотр, внешнее кольцо, запад";
 
	south = "first_city_outer_south";
 
	north = "first_city_outer_north";
 
	navigatable = true;
 
	dsc = [[
 
		Вы находитесь в западной части внешнего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	view = [[
 
		Вы находитесь в западной части внешнего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	obj = {
 
		"first_city_south",
 
		"first_city_north"
 
	};
 
};
 
 
first_city_outer_north = room {
 
	nam = "first_city_outer_north";
 
	disp = "Лсэрианотр, внешнее кольцо, север";
 
	gate = "first_city_middle_north";
 
	east = "first_city_outer_east";
 
	west = "first_city_outer_west";
 
	navigatable = true;
 
	dsc = [[
 
		Вы находитесь в северной части внешнего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	view = [[
 
		Вы находитесь в северной части внешнего кольца Лсэрианотр. Это огромный коридор, опоясывающий город по периметру. 
 
	]];
 
	obj = {
 
		"first_city_east",
 
		"first_city_west",
 
		obj { nam = "first_city_second_gate", dsc = "{Войти в среднее кольцо}", act = "Без Левиафана перемещение по городу займет слишком много времени"};--:disable();
 
	};
 
};
 
\ No newline at end of file
game_over.lua
Show inline comments
 
new file 100644
 
game_over_shot = room {
 
	nam = "game_over_shot";
 
	disp = "Игра окончена";
 
	hideinv = true;
 
	dsc = [[
 
		Блэк вскидывает пистолет и стреляет в вашу сторону. Вы чувствуете боль в груди и видите, как красное пятно разливается по рубашке. В глазах мутнеет и вы бессильно падаете на пол. Вскоре Наэтвьирр пробудится окончательно, но вас это уже не волнует. 
 
	]];
 
};
 
 
game_over_awakening = room {
 
	nam = "game_over_awakening";
 
	disp = "Игра окончена";
 
	hideinv = true;
 
	dsc = [[
 
		Пробуждение Наэтвьирра завершено. Вы зря старались. 
 
	]];
 
};
 
 
game_over_pylon = room {
 
	nam = "game_over_pylon";
 
	disp = "Игра окончена";
 
	hideinv = true;
 
	dsc = [[
 
		Мощный луч света, исходящий из пилона, испепеляет вас. Вскоре Наэтвьирр пробудится окончательно, но вас это уже не волнует. 
 
	]];
 
};
 
 
game_over_naethvjirr = room {
 
	nam = "game_over_naethvjirr";
 
	disp = "Игра окончена";
 
	hideinv = true;
 
	dsc = [[
 
		Очередная атака Наэтвьирра оказывается для вас фатальной. Вы бессильно падаете на пол. Вскоре Наэтвьирр пробудится окончательно, но вас это уже не волнует. 
 
	]];
 
};
 
 
game_over_shot_fb = room {
 
	nam = "game_over_shot_fb";
 
	disp = "Игра окончена";
 
	hideinv = true;
 
	dsc = [[
 
		Застреленный Адрианом Блэком, вы бессильно падаете на пол. Вскоре Наэтвьирр пробудится окончательно, но вас это уже не волнует. 
 
	]];
 
};
 
 
game_over_victory =room {
 
	nam = "game_over_victory";
 
	disp = "Вы победили";
 
	hideinv = true;
 
	dsc = [[
 
		Как только последний генератор затихает, свет начинает медленно тускнеть. Вы слышите, как по всему городу экстренно открываются двери и понимаете, что у вас есть всего несколько минут прежде чем вода хлынет и в этот зал. Вы в спешке приводите в сознание ваших напарников и одеваете скафандр.
 
	]];
 
};
 
\ No newline at end of file
hotel.lua
Show inline comments
 
new file 100644
 
--[[
 
Локация, которую игрок посещает первой. 
 
Здесь игрок регистрируется, оставляет чемодан и получает переводом деньги.
 
]]
 
\ No newline at end of file
images/fb_awake.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
images/fb_bcg.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
images/fb_black.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
images/fb_charge.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
images/fb_inactive.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
images/fb_naethvjirr.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
images/fb_player.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
images/fb_pylon.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
images/fb_shield.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
images/fb_throw.png
Show inline comments
 
new file 100644
 
binary diff not shown
Show images
items.lua
Show inline comments
 
new file 100644
 
item_pipe = obj {
 
	nam = "pipe";
 
	disp = "Кусок трубы";
 
	inv = "Прочный, толстый кусок металлической трубы. Вполне может пригодиться";
 
	use = function(s, o)
 
		local canhit = false;
 
		if (type(o.canhit) == "function") then
 
			canhit = o.canhit(o);
 
		else
 
			canhit = o.canhit;
 
		end;
 
		
 
		if (canhit) then
 
			if (o.onhit) then
 
				return(o.onhit(o));
 
			else
 
				return "";
 
			end;
 
		elseif (o.nohitmsg) then
 
			return o.nohitmsg;
 
		else
 
			return "Я не буду этого делать!";
 
		end;
 
	end;
 
};
 
 
item_colt = obj {
 
	nam = "colt";
 
	bullets = 6;
 
	disp = function(s)
 
		return "Кольт (" .. tostring(s.bullets) .. " зарядов)";
 
	end;
 
	dsc = [[
 
		Ваш револьвер. Надежное оружие в хорошем состоянии. Оно еще не раз спасет вашу жизнь. У вас также есть небольшой запас патронов к нему.
 
	]];
 
	use = function(s, o)
 
		if (s.bullets == 0) then
 
			return "Нужно перезарядиться, патроны кончились";
 
		end;
 
		
 
		local canshoot = false;
 
		if (type(o.canshoot) == "function") then
 
			canshoot = o.canshoot(o);
 
		else
 
			canshoot = o.canshoot;
 
		end;
 
		
 
		if (canshoot) then
 
			s.bullets = s.bullets - 1;
 
			p("Вы стреляете в "..o.disp2 .. ". ");
 
			if (o.onshoot) then
 
				return(o.onshoot(o));
 
			else
 
				return "";
 
			end		
 
		elseif (o.noshootmsg) then
 
			return o.noshootmsg;
 
		else
 
			return "Я не буду этого делать!";
 
		end;
 
	end;
 
	inv = function(s)
 
		if (s.bullets > 0) then
 
			return [[
 
				Ваш револьвер. Надежное оружие в хорошем состоянии. Оно еще не раз спасет вашу жизнь. У вас также есть небольшой запас патронов к нему.
 
			]];
 
		else
 
			s.bullets = 6;
 
			return [[
 
				Вы перезаряжаете ваш револьвер и оружие снова готово к бою
 
			]];
 
		end;
 
	end;
 
};
 
\ No newline at end of file
leviathan.lua
Show inline comments
 
new file 100644
 
--[[
 
Ваша подводная лодка - Левиафан
 
Для начала вам придется починить ее
 
Имеет два двигателя - электрический и паровой
 
Для запуска машины потребуется починить и обеспечить энергией хотя бы один из них(уголь или батареи)
 
Левиафан - достаточно большая подводная лодка. Хотя она может управляться одним человеком, рассчитана она на много большее.
 
 
Имеется три доступных уровня освещения: 
 
Не освещено - ничего не видно, передвигаться по кораблю невозможно
 
Плохо освещено - Описания минимальны, большинство действий недостпны
 
Хорошо освещено - полные описания, все действия доступны
 
 
На складе имеется три скафандра в хорошем состоянии. Без них невозможно покинуть корабль в подводных локациях. Скафандр может быть испорчен и потребует ремонта. Если оба скафандра выведены из строя их потребуется отремонтировать.
 
]]
 
submarine_leviathan = obj {
 
	nam = "submarine_leviathan";
 
	disp = "Левиафан";
 
	-- dsc = [[
 
	--	Вы видите огромную металлическую конструкцию, напоминающую рыбу. Большие стеклянные иллюминаторы по бортам еще больше усиливают впечатление. На бортах крупными буквами выведено "А12 Левиафан". В верхней части машины вы видите {люк}.^ 
 
	--]];
 
	dsc = [[
 
		Вы видите "{Левиафан}" - вашу субмарину
 
	]];
 
	act = [[ Несмотря на проведенные в бездействии годы, субмарина сейчас в отличном состоянии. Из иллюминаторов льется яркий свет. На борту виднреется слегка пошарпанная, но читаемая надпись "А04 - Левиафан" ]];
 
	-- function()
 
		-- walk "leviathan_airlock";
 
		-- return "Оказавшись внутри, вы закрываете за собой люк";
 
	--end;
 
};
 
 
--leviathan_exit = obj {
 
--	nam = "leviathan_exit";
 
--	dsc  = [[
 
--		{Люк} в потолке закрыт.
 
--	]];
 
--	act = function(s)
 
--		walk(where(submarine_leviathan));
 
--		return "Оказавшись снаружи, вы закрываете за собой люк";
 
--	end;
 
--};
 
 
leviathan_airlock = room {
 
	nam = "leviathan_airlock";
 
	disp = "Левиафан, шлюз";
 
	dsc = [[
 
		Вы находитесь в шлюзовом отсеке Левиафана. Яркий свет электрических ламп освещает помещение. 
 
	]];
 
	way = {
 
		vroom("Кают-компания", "leviathan_wardroom");
 
		vroom("Наружу", function()
 
			return where(submarine_leviathan);
 
		end);
 
	};
 
};
 
 
leviathan_captains_cabin = room {
 
	nam = "leviathan_captains_cabin";
 
	disp = "Левиафан, каюта капитана";
 
	dsc = [[
 
		Вы находитесь в каюте, очевидно, предназначенной для капитана. Эта каюта немного больше остальных, в ней размещен стол и стул. 
 
		В столе несколько ящичков, хитроумно закрытых, чтобы при качке они не открывались.
 
	]];
 
	way = {
 
		vroom("Каюты", "leviathan_cabins");
 
	};
 
};
 
 
leviathan_cabins = room {
 
	nam = "leviathan_cabins";
 
	disp = "Левиафан, каюты";
 
	dsc  =[[
 
		Вы находитесь в длинном коридоре с множеством дверей, ведущих в каюты, расположенные по левому борту.
 
	]];
 
	way = {
 
		vroom("Каюта капитана", "leviathan_captains_cabin");
 
		vroom("Кают-компания", "leviathan_wardroom");
 
	};
 
	
 
};
 
 
leviathan_cargo_hold = room {
 
	nam = "leviathan_cargo_hold";
 
	disp = "Левиафан, грузовой отсек";
 
	dsc = [[
 
		Вы находитесь в грузовом отсеке Левиафана
 
	]];
 
	way = {
 
		vroom("Кают-компания", "leviathan_wardroom");
 
	};
 
};
 
 
leviathan_wardroom = room {
 
	nam = "leviathan_wardroom";
 
	disp = "Левиафан, кают-компания";
 
	dsc = [[
 
		Вы находитесь в кают-компании Левиафана. Просторная комната, в центре которой укреплен массивный металлический стол. 
 
		Из машинного отсека доносится гул двигателей. Яркий свет электрических ламп освещает помещение. 
 
	]];
 
	way = {
 
		vroom("Машинный отсек", "leviathan_engines");
 
		vroom("Рубка", "leviathan_dlg");
 
		vroom("Шлюз", "leviathan_airlock");
 
		vroom("Каюты", "leviathan_cabins");
 
		vroom("Грузовой отсек", "leviathan_cargo_hold");
 
	};
 
	obj = {
 
		--vway("Машинный отсек", "Из {машинного отсека} доносится легкий гул.^", "leviathan_engines");
 
		--vway("Рубка", "{В рубку}^", "leviathan_dlg");
 
		--vway("Шлюз", "{В шлюз}^", "leviathan_airlock");
 
		--vway("Каюты", "{В каюты экипажа}^", "leviathan_cabins");
 
		--vway("Грузовой отсек", "{В грузовой отсек}^", "leviathan_cargo_hold");
 
		"char_learr";
 
		"char_phaetlarr";
 
		"char_radcliffe";
 
		"char_wright";
 
	};
 
};
 
 
leviathan_engines = room {
 
	nam = "leviathan_engines";
 
	disp = "Левиафан, машинное отделение";
 
	dsc = [[
 
		Вы находитесь в машинном отделении Левиафана. Равномерный гул электрических двигателей сообщает о полной готовности субмарины. 
 
	]];
 
	way = {
 
		vroom("Кают-компания", "leviathan_wardroom");
 
	};
 
};
 
 
leviathan_dlg = dlg {
 
	nam = "leviathan_dlg";
 
	disp = "Штурвал Левиафана";
 
	dsc = function()
 
		local view = "";
 
		if (type(where(submarine_leviathan).view) == "function") then
 
			view = where(submarine_leviathan).view(where(submarine_leviathan));
 
		else
 
			view = where(submarine_leviathan).view;
 
		end;
 
		
 
		return [[
 
			Вы находитесь в рубке Левиафана перед штурвалом. 
 
			Отсюда вы можете направиться куда-нибудь. 
 
			Яркий свет электрических ламп освещает помещение. ^
 
		]] .. (view);
 
	end;
 
	update_options = function()
 
		leviathan_dlg:poff(10,11,12,13,14);
 
		if (where(submarine_leviathan).navigatable) then 
 
			leviathan_dlg:poff(1,2,3,4,5);
 
			if (where(submarine_leviathan).south) then 
 
				pon(10);
 
			end;
 
			if (where(submarine_leviathan).north) then 
 
				pon(11);
 
			end;
 
			if (where(submarine_leviathan).east) then 
 
				pon(12);
 
			end;
 
			if (where(submarine_leviathan).west) then 
 
				pon(13);
 
			end;
 
			if (where(submarine_leviathan).gate) then 
 
				pon(14);
 
			end;
 
		else
 
			leviathan_dlg:pon(1, 2, 3, 4);
 
			leviathan_dlg:poff(5);
 
			if (where(submarine_leviathan) == atlantis_dock) then	
 
				leviathan_dlg:poff(1);
 
			end;
 
			if (where(submarine_leviathan) == navjiarr_settlement) then
 
				leviathan_dlg:poff(2);
 
			end;
 
			if (where(submarine_leviathan) == navjiarr_hostile_settlement) then
 
				leviathan_dlg:poff(3);
 
			end;
 
			if (where(submarine_leviathan) == first_city_entrance) then
 
				leviathan_dlg:poff(4);
 
				leviathan_dlg:pon(5);
 
			end;
 
		end;
 
	end;
 
	enter = function(s)
 
		leviathan_dlg.update_options();
 
	end;
 
	phr = {
 
		{1, always = "true", "Атлантида", function()
 
			return "Вы прибыли в Атлантиду";
 
		end, function()
 
			move(submarine_leviathan, "atlantis_dock");
 
			leviathan_dlg:update_options();
 
		end},
 
		{2, always = "true", "Поселение Навьяр", function()
 
			return "Вы прибыли в Атлантиду";
 
		end, function()
 
			move(submarine_leviathan, "navjiarr_settlement");
 
			leviathan_dlg:update_options();
 
		end},
 
		{3, always = "true", "Враждебное поселение Навьяр", function()
 
			return "Вы прибыли в Атлантиду";
 
		end, function()
 
			move(submarine_leviathan, "navjiarr_hostile_settlement");
 
			leviathan_dlg:update_options();
 
		end},
 
		{4, always = "true", "Лсэрианотр, древний город Навьяр", function()
 
			return "Вы прибыли в Лсэрианотр";
 
		end, function()
 
			move(submarine_leviathan, "first_city_entrance");
 
			leviathan_dlg:update_options();
 
		end},
 
		{5, always = "true", "Вперед, в город", function()
 
			if (first_city_entrance.open) then
 
				return [[
 
					Движимый вашей умелой рукой, Левиафан вплывает в ворота. Оказавшись среди светящихся стен древнего города, вы отключаете прожектор.
 
				]];
 
			else
 
				return [[
 
					Вы не рискуете протаранить ворота, простоявшие не одно тысячелетие.
 
				]];
 
			end;
 
		end,
 
		function()
 
			if (first_city_entrance.open) then
 
				move(submarine_leviathan, "first_city_outer_south");
 
				leviathan_dlg:update_options();
 
			end;
 
		end;
 
		},
 
		{10, always = "true", "На юг", "", function()
 
			move(submarine_leviathan, where(submarine_leviathan).south);
 
			leviathan_dlg:update_options();
 
		end;};
 
		{11, always = "true", "На север", "", function()
 
			move(submarine_leviathan, where(submarine_leviathan).north);
 
			leviathan_dlg:update_options();
 
		end;};
 
		{12, always = "true", "На восток", "", function()
 
			move(submarine_leviathan, where(submarine_leviathan).east);
 
			leviathan_dlg:update_options();
 
		end;};
 
		{13, always = "true", "На запад", "", function()
 
			move(submarine_leviathan, where(submarine_leviathan).west);
 
			leviathan_dlg:update_options();
 
		end;};
 
		{14, always = "true", "В ворота", "", function()
 
			move(submarine_leviathan, where(submarine_leviathan).gate);
 
			leviathan_dlg:update_options();
 
		end;};
 
		{255, always = "true", "Назад, в кают-компанию", "", function()
 
			back();
 
		end}
 
	};
 
};
 
\ No newline at end of file
main.lua
Show inline comments
 
new file 100644
 
-- $Name: Пробуждение$
 
-- $Version: 1.0$
 
-- $Author: Khaelenmore Thaal$
 
 
instead_version "1.9.1"
 
require "para"
 
require "dash"
 
require "quotes"
 
require "hideinv"
 
-- Общее
 
dofile "items.lua"
 
dofile "party.lua"
 
dofile "game_over.lua";
 
-- Часть 1
 
dofile "michael.lua"
 
dofile "coachman.lua"
 
dofile "shipyard2.lua"
 
dofile "warehouse18.lua"
 
dofile "warehouse32.lua"
 
-- Часть 2
 
dofile "leviathan.lua"
 
dofile "atlantis.lua"
 
dofile "navjiarr_settlement.lua"
 
dofile "navjiarr_hostile_settlement.lua"
 
-- Часть 3
 
dofile "final_scene.lua";
 
dofile "final_battle.lua";
 
dofile "first_city_inner_rim.lua"
 
dofile "first_city_middle_rim.lua"
 
dofile "first_city_outer_rim.lua"
 
 
item_note_1 = obj {
 
	nam = "note1";
 
	disp = "Записка";
 
	inv = [[Клочок бумаги с адресом: [Адрес Майкла Райта], Майкл Райт]];
 
};
 
 
item_documents = obj {
 
	nam = "documents";
 
	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_umbrella = obj {
 
	nam = "umbrella";
 
	disp = "Зонт";
 
	inv = [[Совершенно новый зонт производства "Винсент и сыновья". ]];
 
};
 
 
item_toolbox = obj {
 
	nam = "toolbox";
 
	disp = "Ящик с инструментами";
 
	dsc = [[
 
		Вы видите {ящик} со всевозможными полезными и не очень инструментами - отвертками, ключами, молотками и т.д.^
 
	]];
 
};
 
 
pl = player {
 
	nam = "player";
 
	disp = "Дэвид Дрейк";
 
	where = 'port';
 
	hitpoints = 10;
 
	obj = {'item_umbrella', "item_documents", "item_note_1", "item_first_city_key", "item_colt", "item_pipe"};
 
	-- party flags. Should be false on start
 
	party = {"learr", "radcliffe", "phaetlarr", "wright"};
 
};
 
 
hotel = room {
 
	nam = "hotel";
 
	disp = "Гостиница";
 
	enter = function(s)
 
		move(char_coachman, here());
 
	end;
 
	dsc = [[
 
		Вы находитесь в холле гостиницы
 
	]];
 
};
 
 
port = room {
 
	nam = "port";
 
	disp = "Порт";
 
	enter = function(s)
 
		move(char_coachman, here());
 
	end;
 
	dsc = [[
 
		Вы находитесь в порту. Небо покрыто тяжелыми тучами - вот-вот начнется дождь. 
 
		Вокруг кипит жизнь: снуют толпы народу, то и дело раздаются гудки пароходов, слышно ржание лошадей, запряженных в многочисленные экипажи, привозящие и увозящие людей.
 
	]];
 
	obj = {'item_toolbox'};
 
};
 
 
intro = room {
 
	nam = "intro";
 
	hideinv = true;
 
	disp = "Вступление";
 
	dsc = [[
 
		Вы играете за Дэвида Дрейка - единственного сына богатого и уважаемого владельца транспортной компании "Вест-Хэйвен Транс-Оушен".^
 
		Более 10 лет назад, когда Дэвиду было 10 лет, Уильям таинственным образом пропал, не оставив практически никаких следов. Полицейское расследование вскоре зашло в тупик и было прекращено.^
 
		Через несколько месяцев компания, оставшаяся без своего владельца обанкротилась, ее имущество было продано.^
 
		После исчезновения отца Дэвид жил в Вашингтоне с бабушкой. Он пошел по стопам отца и выучился на инженера-кораблестроителя. 
 
		Несколько дней назад в доме, где он жил, был обнаружен тайник, хранящий секретные документы отца - карты, указывающие по-видимому на какие-то тайники Уильяма и записка с адресом и именем.^
 
		Одержимый идеей узнать больше, молодой Дрейк отправляется в Лондон...
 
	]];
 
	obj = {
 
		vway("Начать игру", "{Начать игру}", 'port')
 
	}
 
};
 
 
game.nam = "Пробуждение";
 
game.dsc = [[
 
		Мой первый текстовый квест
 
]];
 
game.act = "Это не мое";
 
game.use = "Каким образом?";
 
game.inv = "Мне это не нужно";
 
 
require "dbg"
 
 
function init()
 
	put(char_coachman, port);
 
	put(submarine_leviathan, shipyard_inside);
 
	---debug
 
	--pl.where = submarine_leviathan;
 
	walk(final_battle);
 
	move(submarine_leviathan, first_city_inner_north);
 
	--walk(leviathan_wardroom);
 
end
 
\ No newline at end of file
michael.lua
Show inline comments
 
new file 100644
 
--[[
 
Здесь игрок получает адреса всех ключевых локаций первой части
 
]]
 
door_michael = obj {
 
	nam = "door_michael";
 
	disp = "Дверь";
 
	locked = true;
 
	act = function(s)
 
		if (s.locked) then
 
			walkin "michael_entry_dlg";
 
		else
 
			walk "michael_house_inside";
 
		end;
 
		return true;
 
	end;
 
	dsc = function(s)
 
		if (s.locked) then
 
			return [[ Дверь в дом заперта. Можно попробовать {постучаться}^ ]];
 
		else
 
			return [[ Дверь открыта, вы можете {войти}^ ]];
 
		end;
 
	end;
 
};
 
 
item_michael_table = obj {
 
	nam = "michael_table";
 
	disp = "Стол";
 
	dsc =[[
 
		Вы видите массивный старый стол. 
 
	]];
 
	obj = {
 
		vobj("Газеты", [[На столе лежит стопка {газет}]])
 
	};
 
};
 
 
char_michael = obj {
 
	nam = "michael";
 
	disp = "Майкл Райт";
 
	dsc = function(s)
 
		if (s.documents) then
 
			return [[ ^{Майкл Райт} с интересом рассматривает схемы, которые вы ему отдали^ ]];
 
		else
 
			return [[ ^Вы видите {пожилого человека} одетого в изрядно поношенный костюм^ ]];
 
		end;
 
	end;
 
	act = function(s)
 
		if (s.documents) then
 
			walkin "michael_main_dlg";
 
		else
 
			walkin "michael_pre_dlg";
 
		end;
 
	end;
 
};
 
 
michael_entry_dlg = dlg {
 
	nam = "michael_entry_dlg";
 
	disp = "Голос за дверью";
 
	dsc = "Кто здесь?";
 
	hideinv = true;
 
	phr = {
 
		{"Могу я увидеть Майкла Райта?", "Кто спрашивает?", [[ psub 'who' ]]},
 
		{always = true, "Извините, я ошибся адресом", function(s) 
 
			back()
 
		end},
 
		{tag = 'who'},
 
		{"Это сын Уильяма Дрейка", "Заходи, нам есть о чем поговорить", function ()
 
			door_michael.locked = false;
 
			walk 'michael_house_inside';
 
		end},
 
		{"Майкл Райт здесь живет?", "Кто спрашивает?"},
 
		{"У меня важное сообщение для него", "Здесь таких нет, до свидания", function(s) 
 
			back()
 
		end}
 
		
 
	};
 
};
 
 
michael_main_dlg = dlg {
 
	nam = "michael_main_dlg";
 
	disp = "Майкл Райт";
 
	dsc = [[
 
		Майкл неспешно просматривает одну за другой схемы, которые вы ему передали. Часть из них, очевидно, знакомы ему.
 
	]];
 
	hideinv = true;
 
	phr = {
 
		{"Вы можете что-то мне подсказать с этим?", [[
 
			Не знаю. Это схемы зданий, принадлежащих компании Уильяма. Часть из них заброшена, многие разрушены, остальные перекуплены и сейчас используются. Я могу сказать тебе адреса. [Майкл сообщает вам адреса интересующих вас зданий]
 
		]]},
 
		{"Что могут означать места отмеченные крестами?", [[
 
			Понятия не имею. Я работал на Верфи 2, Уильям часто бывал там, но я не замечал ничего необычного в месте, которое здесь отмечено. Сейчас она заброшена, так что можешь попробовать погулять там. Если что-то выяснишь - сообщи мне.
 
		]]},
 
		{"До свидания", "До встречи"}
 
	};
 
};
 
 
michael_pre_dlg = dlg {
 
	nam = "michael_pre_dlg";
 
	disp = "Майкл Райт";
 
	dsc = [[
 
		Пожилой человек внимательно смотрит на вас и начинает говорить: 
 
		Как ты уже, наверное, догадался, я и есть Майкл. Да, я работал на твоего отца. 
 
		Вероятно, ты удивлен, что до этого момента никто не смог выйти на меня. 
 
		Это связано лишь с одним - то, чем я и твой отец занимались было, да и остается, крайне секретным.		
 
	]];
 
	hideinv = true;
 
	phr = {
 
		{"Расскажите больше об Уильяме", [[
 
			Я мало что о нем знаю. Уильям был отличным руководителем - Вест-Хэйвен Транс-Оушен процветала под его руководством. 
 
			Мы были впереди всех по современности используемых технологий. У нас всегда были самые быстрые и надежные корабли.
 
			Однако, в последние годы, твой отец как будто стал уделять компании меньше внимания - он стал намного реже выходить из своего кабинета, общаясь только с ограниченным кругом лиц.
 
			Дела пошли на спад. Конкуренты медленно, но верно нагоняли нас. А потом он просто исчез.
 
		]]},
 
		{"Расскажите о себе", [[
 
			Да мне нечего рассказывать. Более 20 лет я работал на Вест-Хэйвен Транс-Оушен ведущим инженером. Занимался разработкой новых двигателей. 
 
			Уильям создал все условия для моей работы - у меня не было недостатка ни в материалах, ни в рабочих руках. Когда компания развалилась я решил отойти от дел. 
 
			Моих сбережений вполне хватало на спокойную жизнь. Чертежи я сберечь не сумел, а то непременно бы продал их кому-нибудь. Впрочем я не сильно об этом жалею.
 
		]]},
 
		{"Чем же таким секретным вы занимались?", [[
 
			Учитывая, что Вест-Хэйвен Транс-Оушен уже давно нет, я думаю, что могу рассказать тебе это. Вобщем я был начальником инженерного отделения. 
 
			Конкретно, я занимался увеличением скорости движения наших кораблей. Должен признать, я достиг больших результатов. 
 
			Последние мои корабли были вдвое быстрее чем лучшие из кораблей конкурентов. А потом Уильям исчез. Через полгода компания развалилась. 
 
			Корабли были разобраны на металлолом, а мои чертежи пропали. 
 
		]]},
 
		{"Вы знаете, где мой отец сейчас?", [[
 
			Нет, я потерял связь с ним около 10 лет назад. Меня, конечно, удивило, что он оставил свою компанию, семью, все свое благосостояние. 
 
			Он как под воду ушел - еще утром сидел в своем кабинете, а вечером полмира его искало.
 
		]]},
 
		{always = true, "Спасибо, я узнал все", [[
 
			До встречи
 
		]], function(s)
 
			back();
 
		end}
 
	};
 
};
 
 
michael_house_inside = room {
 
	nam = "michael_house_inside";
 
	disp = "Дом Майкла Райта";
 
	dsc = [[
 
		Вы находитесь в небольшом уютном домике. Окна закрыты плотными занавесками. В комнате светло за счет нескольких электрических ламп. 
 
	]];
 
	obj = {
 
		'item_michael_table',
 
		'char_michael',
 
		vway("Выйти", "{Выйти из дома}", "michael_house")
 
	};
 
};
 
 
michael_house = room {
 
	nam = "michael_house";
 
	disp = "Дом Майкла Райта";
 
	enter = function(s)
 
		put(char_coachman, here());
 
	end;
 
	dsc = [[
 
		Вы стоите у входа в дом, указанный в записке.
 
	]];
 
	obj = {'door_michael'};
 
};
 
\ No newline at end of file
navjiarr_hostile_settlement.lua
Show inline comments
 
new file 100644
navjiarr_settlement.lua
Show inline comments
 
new file 100644
party.lua
Show inline comments
 
new file 100644
 
char_learr = obj {
 
	nam = "learr";
 
	disp = "Леарр";
 
	dsc = function()
 
		return [[
 
			{Леарр} ждет ваших указаний ^
 
		]];
 
	end;
 
};
 
 
char_phaetlarr = obj {
 
	nam = "phaetlarr";
 
	disp = "Фаэтларр";
 
	dsc = function()
 
		return [[
 
			{Фаэтларр} ждет ваших указаний ^
 
		]];
 
	end;
 
};
 
 
char_radcliffe = obj {
 
	nam = "radcliffe";
 
	disp = "Уолтер Рэдклифф";
 
	dsc = function()
 
		return [[
 
			{Уолтер Рэдклифф} ждет ваших указаний ^
 
		]];
 
	end;
 
};
 
 
char_wright = obj {
 
	nam = "wright";
 
	disp = "Джек Райт";
 
	dsc = function()
 
		return [[
 
			{Джек Райт} ждет ваших указаний ^
 
		]];
 
	end;
 
};
 
\ No newline at end of file
shipyard2.lua
Show inline comments
 
new file 100644
 
--[[
 
Игрок может попасть сюда только после диалога с Майклом.
 
Верфь заброшена, многие механизмы придется ремонтировать.
 
Здесь игрок найдет подводную лодку, которую нужно будет восстановить.
 
]]
 
shipyard_2 = room {
 
	nam = "shipyard_2";
 
	disp = "Верфь";
 
	dsc = [[
 
		Вы стоите у входа в огромное обветшалое здание. Полусодранная вывеска сообщает, что здание является собственностью компании Вест-Хэйвен Транс-Оушен. 
 
	]];
 
	enter = function(s)
 
		move(char_coachman, here());
 
	end;
 
	obj = {
 
		vway("Вход", "Огромные ворота слегка приоткрыты. Вы можете {войти}^", "shipyard_inside")
 
	};
 
};
 
 
shipyard_inside = room {
 
	nam = "shipyard_inside";
 
	disp = "Верфь";
 
	dsc = [[
 
		Вы находитесь внутри верфи. Огромное полупустое здание. Под потолком расположены краны, некогда служившие для подъема и спуска кораблей. 
 
		Вдоль стен лежат сотни ящиков. Большинство из них уже успели прогнить, но некоторые сохранились весьма неплохо.
 
	]];
 
	view = [[
 
		Левиафан находится в доке
 
	]];
 
	obj = {
 
		vway("Ржавая лестница", "Старая проржавевшая лестница ведет {на второй этаж}^", "shipyard_2nd_floor"),
 
		vway("Выход", "Огромные ворота слегка приоткрыты. Вы можете {выйти}^", "shipyard_2")
 
	};
 
};
 
 
shipyard_2nd_floor = room {
 
	nam = "shipyard_2nd_floor";
 
	disp = "Верфь, второй этаж";
 
	dsc = [[
 
		Вы находитесь внутри верфи. Огромное полупустое здание. Под потолком расположены краны, некогда служившие для подъема и спуска кораблей. 
 
		Вы находитесь на металлических мостках на уровне второго этажа. 
 
	]];
 
	obj = {
 
		vway("Ржавая лестница вниз", "Старая проржавевшая лестница ведет {на первый этаж}^", "shipyard_inside"),
 
		vway("Ржавая лестница вверх", "Старая проржавевшая лестница ведет {на третий этаж}^", "shipyard_3rd_floor"),
 
	};
 
};
 
 
shipyard_3rd_floor = room {
 
	nam = "shipyard_3rd_floor";
 
	disp = "Верфь, третий этаж";
 
	dsc = [[
 
		Вы находитесь внутри верфи. Огромное полупустое здание. Под потолком расположены краны, некогда служившие для подъема и спуска кораблей. 
 
		Вы находитесь на металлических мостках на уровне третьего этажа. 
 
	]];
 
	obj = {
 
		vway("Ржавая лестница вниз", "Старая проржавевшая лестница ведет {на второй этаж}^", "shipyard_2nd_floor"),
 
		vway("Ржавая лестница вверх", "Старая проржавевшая лестница ведет {на четвертый этаж}^", "shipyard_4th_floor"),
 
	};
 
};
 
 
shipyard_4th_floor = room {
 
	nam = "shipyard_4th_floor";
 
	disp = "Верфь, четвертый этаж";
 
	dsc = [[
 
		Вы находитесь внутри верфи. Огромное полупустое здание. Под потолком расположены краны, некогда служившие для подъема и спуска кораблей. 
 
		Вы находитесь на металлических мостках на уровне четвертого этажа. 
 
	]];
 
	obj = {
 
		vway("Ржавая лестница вниз", "Старая проржавевшая лестница ведет {на третий этаж}^", "shipyard_3rd_floor"),
 
		vway("Ржавая лестница вверх", "Старая проржавевшая лестница ведет {на пятый этаж}^", "shipyard_5th_floor"),
 
	};
 
};
 
 
shipyard_5th_floor = room {
 
	nam = "shipyard_5th_floor";
 
	disp = "Верфь, пятый этаж";
 
	disp = "Верфь, третий этаж";
 
	dsc = [[
 
		Вы находитесь внутри верфи. Огромное полупустое здание. Под потолком расположены краны, некогда служившие для подъема и спуска кораблей. 
 
		Вы находитесь на металлических мостках под самым потолком. 
 
	]];
 
	obj = {
 
		vway("Ржавая лестница вниз", "Старая проржавевшая лестница ведет {на четвертый этаж}^", "shipyard_4th_floor")
 
	};
 
};
 
\ No newline at end of file
warehouse18.lua
Show inline comments
 
new file 100644
 
--[[
 
Игрок может попасть сюда только после диалога с Майклом.
 
Эта локация имеет владельца, которому не понравится, что здесь шляются посторонние.
 
Здесь игрок найдет чертеж подводной лодки.
 
]]
 
\ No newline at end of file
warehouse32.lua
Show inline comments
 
new file 100644
 
--[[
 
Игрок может попасть сюда только после диалога с Майклом.
 
Эта локация имеет владельца, который будет готов сотрудничать.
 
Здесь игрок найдет карту.
 
]]
 
\ No newline at end of file
0 comments (0 inline, 0 general)