Changeset - 320aac2d01fa
[Not reviewed]
default
0 3 0
Silverwing - 8 years ago 2016-06-28 12:48:35

iyh2 fight
3 files changed with 391 insertions and 51 deletions:
0 comments (0 inline, 0 general)
atlantis_iyhehevjiarr.lua
Show inline comments
 
@@ -37,15 +37,11 @@ char_aikerjarr_lev = obj {
 
		end;
 
	end;
 
	life = function(s)
 
		print("wright");
 
		if (where(pl).leviathan) then
 
			print("wright:leviathan");
 
			if (stead.nameof(where(s)) ~= s.home) then
 
				print("wright:goinghome");
 
				move(s, s.home, where(s));
 
			end;
 
		else
 
			print("wright:following");
 
			move(s, where(pl), where(s));
 
		end;
 
	end;
 
@@ -57,3 +53,324 @@ char_aikerjarr_lev = obj {
 
		end;
 
	end;
 
};
 
 
iyh_far_from_entrance = dlg {
 
	var {
 
		visited = false;
 
	};
 
	nam = "Заброшенный храм";
 
	entered = function(s)
 
		pr [[
 
			Вы прибываете на место. Через иллюминаторы вы видите вдалеке высокую скалу, простирающуюся на многие километры в обе стороны. Прямо перед вами, в скале вы видите массивные каменные двери храма, застывшие в открытом состоянии. Над дверьми вы видите небольшой козырек, поддерживаемый массивными колоннами. 
 
		]];
 
		
 
		if (not s.visited) then
 
			s.visited = true;
 
			if (ArrayUtils.indexOf(pl.party, 'aikerjarr') ~= 0) then
 
				return [[
 
					Аиверьярр молча рассматривает храм через иллюминаторы.
 
				]];
 
			elseif (ArrayUtils.indexOf(pl.party, 'learr') ~= 0) then
 
				return [[
 
					Леарр поднимается в рубку. При виде храма, она восклицает: "Мы должны-попасть туда!"
 
				]];
 
			end;
 
		end;
 
	end;
 
	phr = {
 
		{tag="crew", always=true, "[Использовать телефон]Просьба экипажу собраться в кают-компании", [[
 
			Вы спускаетесь в кают-компанию. 
 
		]], code [[ walk('iyh_wardroom_meeting'); ]]};
 
		{tag="advance", always=true, "[Подойти ближе]", [[
 
			Послушные вашей воле, двигатели Левиафана приводят субмарину в движение и вы плавно приближаетесь ко входу в храм. 
 
		]], code [[ walk('iyh_near_entrance'); ]]};
 
		{tag="light_temple", always=true, "[Осветить вход в храм]", [[
 
			Мощный луч света падает на вход в храм. Вы видите внутри какое-то движение и изнутри выплывает огромный скат. 
 
		]], code [[ iyh_fight.distance = 1000; walk('iyh_fight'); ]]};
 
		{tag="light_wall_r", "[Осветить скалы справа от храма]", [[ 
 
			Мощный луч света освещает скалы по правую сторону от храма. Он плавно скользит по поверхности скалы, пока вы не натыкаетесь на то, что отсюда кажется вам каким-то ущельем. Возможно следует изучить его?
 
		]], code [[ pon('ravine'); ]]};
 
		{tag="light_wall_l", "[Осветить скалы слева от храма]", [[
 
			Мощный луч света освещает скалы по левую сторону от храма. Он плавно скользит по поверхности скалы, однако так и не натыкается ни на что интересное. 
 
		]]};
 
		{tag="ravine", false, always=true, "[Подойти ко входу в ущелье]", [[
 
			Вы поворачиваете штурвал и включаете двигатели Левиафана. Через несколько минут вы оказываетесь у входа в ущелье.
 
		]], code [[ walk('iyh_ravine_entry'); ]]};
 
	};	
 
};
 
 
iyh_fight = room {
 
	var {
 
		temple_distance = 0;
 
		distance = 0;
 
		shockfish_health = 100;
 
		timing = 0;
 
	};
 
	entered = function(s)
 
		s.temple_distance = distance;
 
		s.shockfish_health = 100;
 
	end;
 
	hideinv = true;
 
	forcedsc = true;
 
	dsc = function(s)
 
		pr "Вы находитесь от ската на расстоярии около " .. tostring(s.distance) .. " метров";
 
		pr "Храм находится примерно на расстоянии " .. tostring(s.temple_distance) .. " метров";
 
		pr "На приборной панели вы видите, что ";
 
		iyh_fight_torpedo:enable();
 
		iyh_fight_recharge:disable();
 
		if (submarine_leviathan.torpedoes == 2) then
 
			pr "оба торпедных аппапата заряжены и готовы к бою. ";
 
		elseif (submarine_leviathan.torpedoes == 1) then
 
			pr "только один из торпедных аппаратов заряжен. ";
 
		else
 
			iyh_fight_recharge:enable();
 
			iyh_fight_torpedo:disable();
 
			pr "у вас не осталось заряженных торпед. ";
 
		end;
 
	end;
 
	maketurn = function(s)
 
		if (s.distance <= 75) then
 
			if (s.distance > 0) then
 
				s.distance = 0;
 
				pr "Скат приближается к вам. ";
 
			end;
 
			
 
			if (s.timing <= 0) then
 
				s.timing = 5;
 
				pr "Скат атакует Левиафан электрическим разрядом. ";
 
				submarine_leviathan.electric_integrity = submarine_leviathan.electric_integrity - 10;
 
				if (submarine_leviathan.electric_integrity > 50) then
 
					pr "Атака не оказывает видимого эффекта на субмарину. ";
 
				elseif (submarine_leviathan.electric_integrity > 0) then
 
					pr "Свет моргает, проводка искрит. ";
 
					if (ArrayUtils.indexOf(pl.party, 'wright') ~= 0) then
 
						pr "По телефону вы слышите встревоженный голос Райта: \"Мы так долго не протянем\".";
 
					elseif (ArrayUtils.indexOf(pl.party, 'radcliffe') ~= 0) then
 
						pr "По телефону вы слышите встревоженный голос Рэдклиффа: \"Мы так долго не протянем\".";
 
					end;
 
				else
 
					walk('game_over_powerless');
 
				end;
 
			else
 
				s.timing = s.timing - 1;
 
				pr "Скат пытается пробить обшивку Левиафана хвостовым шипом";
 
				submarine_leviathan.hull_integrity = submarine_leviathan.hull_integrity - 5;
 
				if (submarine_leviathan.hull_integrity > 50) then
 
					pr ", но не наосит ощитимого ущерба. ";
 
				elseif (submarine_leviathan.hull_integrity > 0) then
 
					pr ". Сильный удар повреждает внешнюю обшивку, в резервуары проникает вода. ";
 
				else
 
					walk('game_over_sunk');
 
				end;
 
			end;
 
		else
 
			pr "Скат приближается к вам. ";
 
		end;
 
	end;
 
	obj = {
 
		"iyh_fight_torpedo",
 
		"iyh_fight_sonic",
 
		"iyh_fight_recharge",
 
		"iyh_advance_full",
 
		"iyh_advance_half",
 
		"iyh_advance_quarter",
 
		"iyh_retreat_full",
 
		"iyh_retreat_half",
 
		"iyh_retreat_quarter"
 
	};
 
};
 
 
iyh_fight_torpedo = obj {
 
	nam = "iyh_fight_torpedo";
 
	dsc = "{Выстрелить торпедой}^";
 
	act = function(s)
 
		if (math.abs(iyh_fight.distance) > 200) then
 
			return [[
 
				Цель слишком далеко
 
			]];
 
		else
 
			if (iyh_fight.shockfish_health > 70) then
 
				local meters = 25 * rnd(3) + 25;
 
				iyh_fight.shockfish_health = iyh_fight.shockfish_health - 70;
 
				if (iyh_fight.distance >= 0) then
 
					iyh_fight.distance = iyh_fight.distance + meters;
 
				else
 
					iyh_fight.distance = iyh_fight.distance - meters;
 
				end;
 
				pr "Вы стреляете торпедой в ската. Торпеда достигает цели. Ската отбрасывает назад на ".. tostring(meters) .. " метров. "
 
			else
 
				iyh_fight.shockfish_health = 0;
 
				pr "Вы стреляете торпедой в ската. Торпеда взрывается достигнув цели и разрывает ската. Вода краснеет от крови, а вы теперь можете безопасно приблизиться к храму. ";
 
			end;
 
			return iyh_fight.maketurn();
 
		end;
 
	end;
 
};
 
 
iyh_fight_sonic = obj {
 
	nam = "iyh_fight_sonic";
 
	dsc = "{Выстрелить из звуковой пушки}^";
 
	act = function(s)
 
		if (math.abs(iyh_fight.distance) > 200) then
 
			return [[
 
				Цель слишком далеко
 
			]];
 
		else
 
			if (iyh_fight.shockfish_health > 50) then
 
				iyh_fight.shockfish_health = iyh_fight.shockfish_health - 10;
 
				pr "Вы стреляете в ската из звуковой пушки. Это лишь слегка ранит его. ";
 
			else
 
				pr "Вы стреляете в ската из звуковой пушки. Это не наносит ему серьезного ущерба. ";
 
			end;
 
			return iyh_fight.maketurn();
 
		end;
 
	end;
 
};
 
 
iyh_fight_recharge = obj {
 
	nam = "iyh_fight_torpedo";
 
	dsc = "{Перезарядить торпеды}^";
 
	act = function(s)
 
		--Если в партии нет никого кроме Леарр/Аикерьярра, то игрок перезаряжает торопеды сам, иначе - отдает преказ
 
		if (ArrayUtils.indexOf(pl.party, 'wright') ~= 0 or ArrayUtils.indexOf(pl.party, 'radcliffe') ~= 0) then
 
			pr "Вы отдаете по телефону приказ перезарядить торпедные аппараты. ";
 
		else
 
			pr "Вы спускаетесь вниз, чтобы перезарядить торпедные аппараты. ";
 
			iyh_fight.maketurn();
 
			iyh_fight.maketurn();
 
			pr "Вы возвращаетесь в рубку, чтобы продолжить бой. "
 
		end;
 
	end;
 
};
 
 
iyh_advance_full = obj {
 
	nam = "iyh_advance_full";
 
	dsc = "{Полный вперед}^";
 
	act = function(s)
 
		pr "Вы включаете двигатели на полную мощность";
 
		if (iyh_fight.distance >= 0) then
 
			iyh_fight.distance = iyh_fight.distance - 100;
 
			iyh_fight.temple_distance = iyh_fight.temple_distance - 100;
 
			if (iyh_fight.distance < 0) then
 
				pr "Вы пропылваете мимо противника и разворачиваете субмарину".
 
			end;
 
		else
 
			iyh_fight.distance = iyh_fight.distance + 100;
 
			iyh_fight.temple_distance = iyh_fight.temple_distance + 100;
 
			if (iyh_fight.distance >= 0) then
 
				pr "Вы пропылваете мимо противника и разворачиваете субмарину".
 
			end;
 
		end;
 
		iyh_fight.maketurn();
 
	end;
 
};
 
 
iyh_advance_half = obj {
 
	nam = "iyh_advance_half";
 
	dsc = "{1/2 вперед}^";
 
	act = function(s)
 
		pr "Вы включаете двигатели на половину мощности";
 
		if (iyh_fight.distance >= 0) then
 
			iyh_fight.distance = iyh_fight.distance - 50;
 
			iyh_fight.temple_distance = iyh_fight.temple_distance - 50;
 
			if (iyh_fight.distance < 0) then
 
				pr "Вы пропылваете мимо противника и разворачиваете субмарину".
 
			end;
 
		else
 
			iyh_fight.distance = iyh_fight.distance + 50;
 
			iyh_fight.temple_distance = iyh_fight.temple_distance + 50;
 
			if (iyh_fight.distance >= 0) then
 
				pr "Вы пропылваете мимо противника и разворачиваете субмарину".
 
			end;
 
		end;
 
		iyh_fight.maketurn();
 
	end;
 
};
 
 
iyh_advance_quarter = obj {
 
	nam = "iyh_advance_quarter";
 
	dsc = "{1/4 вперед}^";
 
	act = function(s)
 
		pr "Вы включаете двигатели на четверть мощности";
 
		if (iyh_fight.distance >= 0) then
 
			iyh_fight.distance = iyh_fight.distance - 25;
 
			iyh_fight.temple_distance = iyh_fight.temple_distance - 25;
 
			if (iyh_fight.distance < 0) then
 
				pr "Вы пропылваете мимо противника и разворачиваете субмарину".
 
			end;
 
		else
 
			iyh_fight.distance = iyh_fight.distance + 25;
 
			iyh_fight.temple_distance = iyh_fight.temple_distance + 25;
 
			if (iyh_fight.distance >= 0) then
 
				pr "Вы пропылваете мимо противника и разворачиваете субмарину".
 
			end;
 
		end;
 
		iyh_fight.maketurn();
 
	end;
 
};
 
 
iyh_retreat_full = obj {
 
	nam = "iyh_retreat_full";
 
	dsc = "{Полный назад}^";
 
	act = function(s)
 
		pr "Вы включаете двигатели на полную мощность";
 
		if (iyh_fight.distance >= 0) then
 
			iyh_fight.distance = iyh_fight.distance + 100;
 
			iyh_fight.temple_distance = iyh_fight.temple_distance + 100;
 
			if (iyh_fight.distance < 0) then
 
				pr "Вы пропылваете мимо противника и разворачиваете субмарину".
 
			end;
 
		else
 
			iyh_fight.distance = iyh_fight.distance - 100;
 
			iyh_fight.temple_distance = iyh_fight.temple_distance - 100;
 
			if (iyh_fight.distance >= 0) then
 
				pr "Вы пропылваете мимо противника и разворачиваете субмарину".
 
			end;
 
		end;
 
		iyh_fight.maketurn();
 
	end;
 
};
 
 
iyh_retreat_half = obj {
 
	nam = "iyh_retreat_half";
 
	dsc = "{1/2 назад}^";
 
	act = function(s)
 
		pr "Вы включаете двигатели на половину мощности";
 
		if (iyh_fight.distance >= 0) then
 
			iyh_fight.distance = iyh_fight.distance + 50;
 
			iyh_fight.temple_distance = iyh_fight.temple_distance + 50;
 
			if (iyh_fight.distance < 0) then
 
				pr "Вы пропылваете мимо противника и разворачиваете субмарину".
 
			end;
 
		else
 
			iyh_fight.distance = iyh_fight.distance - 50;
 
			iyh_fight.temple_distance = iyh_fight.temple_distance - 50;
 
			if (iyh_fight.distance >= 0) then
 
				pr "Вы пропылваете мимо противника и разворачиваете субмарину".
 
			end;
 
		end;
 
		iyh_fight.maketurn();
 
	end;
 
};
 
 
iyh_retreat_quarter = obj {
 
	nam = "iyh_retreat_quarter";
 
	dsc = "{1/4 назад}^";
 
	act = function(s)
 
		pr "Вы включаете двигатели на четверть мощности";
 
		if (iyh_fight.distance >= 0) then
 
			iyh_fight.distance = iyh_fight.distance + 25;
 
			iyh_fight.temple_distance = iyh_fight.temple_distance + 25;
 
			if (iyh_fight.distance < 0) then
 
				pr "Вы пропылваете мимо противника и разворачиваете субмарину".
 
			end;
 
		else
 
			iyh_fight.distance = iyh_fight.distance - 25;
 
			iyh_fight.temple_distance = iyh_fight.temple_distance - 25;
 
			if (iyh_fight.distance >= 0) then
 
				pr "Вы пропылваете мимо противника и разворачиваете субмарину".
 
			end;
 
		end;
 
		iyh_fight.maketurn();
 
	end;
 
};
 
\ No newline at end of file
game_over.lua
Show inline comments
 
@@ -16,6 +16,24 @@ game_over_banished = room {
 
	]];
 
};
 
 
game_over_powerless = room {
 
	nam = "game_over_powerless";
 
	disp = "Игра окончена";
 
	hideinv = true;
 
	dsc = [[
 
		Электрооборудование Левиафана выходит из строя и вы теряете всякую возможность управлять субмариной. Разъяренный скат продолжает атаковать субмарину, то испуская электрические разряды, то нанося удары хвостовым шипом. Через некоторое время обшивка не выдерживает и рубка Левиафана заполняется водой. 
 
	]];
 
};
 
 
game_over_sunk = room {
 
	nam = "game_over_sunk";
 
	disp = "Игра окончена";
 
	hideinv = true;
 
	dsc = [[
 
		Мощный удар хвостового шипа пробивает обшивку Левиафана насквозь. Вода быстро заполняет отсеки субмарины и у вас не остается никаких шансов спастись. 
 
	]];
 
};
 
 
game_over_shot = room {
 
	nam = "game_over_shot";
 
	disp = "Игра окончена";
leviathan.lua
Show inline comments
 
@@ -18,6 +18,19 @@
 
-- TODO персонажи не должны обсуждать личные темы по телефону, только при встрече
 
 
submarine_leviathan = obj {
 
	var {
 
		hull_integrity = 100; -- Целостность корпуса
 
		electric_integrity = 100; -- Целостность электросистем
 
		torpedoes = 2; -- Количество заряженных торпед
 
		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;
 
	};
 
	nam = "submarine_leviathan";
 
	disp = "Левиафан";
 
	
 
@@ -29,43 +42,8 @@ submarine_leviathan = obj {
 
	]];
 
	-- TODO описание составлять из реального состояния подводной лодки.
 
	act = [[ Несмотря на проведенные в бездействии годы, субмарина сейчас в отличном состоянии. Из иллюминаторов льется яркий свет. На борту виднеется слегка пошарпанная, но читаемая надпись "А04 - Левиафан" ]];
 
	-- 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 {
 
--	nam = "leviathan_exit";
 
--	dsc  = [[
 
--		{Люк} в потолке закрыт.
 
--	]];
 
--	act = function(s)
 
--		walk(where(submarine_leviathan));
 
--		return "Оказавшись снаружи, вы закрываете за собой люк";
 
--	end;
 
--};
 
 
--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 = "Левиафан, шлюз";
 
@@ -448,15 +426,42 @@ leviathan_airregen = obj {
 
leviathan_wheelhouse = darkroom {
 
	nam = "leviathan_wheelhouse";
 
	disp = "Левиафан, Рубка";
 
	dsc_lit = [[
 
		Вы находитесь в рулевой рубке Левиафана. Три огромных иллюминатора дают превосходный обзор. 
 
	]];
 
	dsc_halflit = [[
 
		Вы находитесь в рулевой рубке Левиафана. Три огромных иллюминатора дают превосходный обзор. 
 
	]];
 
	dsc_dark = [[
 
		Вы находитесь в рулевой рубке Левиафана. В темноте вы ничего не можете разглядеть, кроме трех огромных иллюминаторов. 
 
	]];
 
	dsc_lit = function(s)
 
		local view = "";
 
		if (type(where(submarine_leviathan).view) == "function") then
 
			view = where(submarine_leviathan):view();
 
		else
 
			view = where(submarine_leviathan).view;
 
		end;
 
		
 
		return [[
 
			Вы находитесь в рулевой рубке Левиафана. Три огромных иллюминатора дают превосходный обзор. 
 
		]] .. (view);
 
	end;
 
	dsc_halflit = function(s)
 
		local view = "";
 
		if (type(where(submarine_leviathan).view) == "function") then
 
			view = where(submarine_leviathan):view();
 
		else
 
			view = where(submarine_leviathan).view;
 
		end;
 
		
 
		return [[
 
			Вы находитесь в рулевой рубке Левиафана. Три огромных иллюминатора дают превосходный обзор. 
 
		]] .. (view);
 
	end;
 
	dsc_dark = function(s)
 
		local view = "";
 
		if (type(where(submarine_leviathan).view) == "function") then
 
			view = where(submarine_leviathan):view();
 
		else
 
			view = where(submarine_leviathan).view;
 
		end;
 
		
 
		return [[
 
			Вы находитесь в рулевой рубке Левиафана. В темноте вы ничего не можете разглядеть, кроме трех огромных иллюминаторов. 
 
		]] .. (view);
 
	end;
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 2);
 
	};
 
@@ -476,8 +481,8 @@ leviathan_handwheel = obj {
 
	]];
 
	act = function(s)
 
		if (atlantis_found and submarine_leviathan.air_level > 400000 and submarine_leviathan.circuit_breaks == 0 and submarine_leviathan.power_on) then
 
			walkin("demo_end");
 
			--walkin('leviathan_dlg');
 
			--walkin("demo_end");
 
			walkin('leviathan_dlg');
 
		elseif (not submarine_leviathan.power_on) then
 
			return [[
 
				Без электричества _"Левиафан"_ не сдвинется с места. 
 
@@ -703,7 +708,7 @@ leviathan_dlg = dlg {
 
	dsc = function()
 
		local view = "";
 
		if (type(where(submarine_leviathan).view) == "function") then
 
			view = where(submarine_leviathan).view(where(submarine_leviathan));
 
			view = where(submarine_leviathan):view();
 
		else
 
			view = where(submarine_leviathan).view;
 
		end;
0 comments (0 inline, 0 general)