------------боевая система-----------------

----мобы----
rat = obj {
	nam = 'крыс',
	dsc = 'Жудкий крыс смотрит на меня как на еду',
	var {
	_pos = 10;	--позиция врага
	_hp_b = 10; 
	_hp = 10;
	_stm_b = 10;
	_stm = 10;
	_enj_b = 50;
	_enj = 50;
	_str = 1;
	_agi = 2;
	_ac = 1;	--армор класс
	--падежи--
	};
};

zombie = obj {
	nam = 'зомби',
	dsc = 'Жудкий зомби смотрит на меня как на еду',
	var {
	_pos = 10;	--позиция врага
	_hp_b = 20; 
	_hp = 20;
	_stm_b = 10;
	_stm = 10;
	_enj_b = 50;
	_enj = 50;
	_str = 2;
	_agi = 1;
	_ac = 2;	--армор класс
	--падежи--
	};
};

skeleton = obj {
	nam = 'скелет',
	dsc = 'Жудкий скелет смотрит на меня как на еду',
	var {
	_pos = 10;	--позиция врага
	_hp_b = 20; 
	_hp = 20;
	_stm_b = 10;
	_stm = 10;
	_enj_b = 50;
	_enj = 50;
	_str = 2;
	_agi = 2;
	_ac = 2;	--армор класс
	--падежи--
	};
};

wolf = obj {
	nam = 'волк',
	dsc = 'Жудкий волк смотрит на меня как на еду',
	var {
	_pos = 10;	--позиция врага
	_hp_b = 20; 
	_hp = 20;
	_stm_b = 10;
	_stm = 10;
	_enj_b = 50;
	_enj = 50;
	_str = 2;
	_agi = 2;
	_ac = 2;	--армор класс
	--падежи--
	};
};

werewolf = obj {
	nam = 'оборотень',
	dsc = 'Жудкий оборотень смотрит на меня как на еду',
	var {
	_pos = 10;	--позиция врага
	_hp_b = 30; 
	_hp = 30;
	_stm_b = 10;
	_stm = 10;
	_enj_b = 50;
	_enj = 50;
	_str = 4;
	_agi = 4;
	_ac = 3;	--армор класс
	--падежи--
	};
};

vampire = obj {
	nam = 'вампир',
	dsc = 'Жудкий вампир смотрит на меня как на еду',
	var {
	_pos = 10;	--позиция врага
	_hp_b = 30; 
	_hp = 30;
	_stm_b = 10;
	_stm = 10;
	_enj_b = 50;
	_enj = 50;
	_str = 4;
	_agi = 4;
	_ac = 4;	--армор класс
	--падежи--
	};
};

redneck = obj {
	nam = 'деревенский житель',
	dsc = 'Деревенский житель тычет в меня вилами',
	var {
	_pos = 10;	--позиция врага
	_hp_b = 20; 
	_hp = 20;
	_stm_b = 10;
	_stm = 10;
	_enj_b = 50;
	_enj = 50;
	_str = 2;
	_agi = 2;
	_ac = 2;	--армор класс
	--падежи--
	};
};

cityman = obj {
	nam = 'горожанин',
	dsc = 'Горожанин тычет в меня шпагой',
	var {
	_pos = 10;	--позиция врага
	_hp_b = 20; 
	_hp = 20;
	_stm_b = 10;
	_stm = 10;
	_enj_b = 50;
	_enj = 50;
	_str = 3;
	_agi = 2;
	_ac = 2;	--армор класс
	--падежи--
	};
};

guard = obj {
	nam = 'стражник',
	dsc = 'Стражник тычет в меня аллебардой',
	var {
	_pos = 10;	--позиция врага
	_hp_b = 20; 
	_hp = 20;
	_stm_b = 10;
	_stm = 10;
	_enj_b = 50;
	_enj = 50;
	_str = 4;
	_agi = 2;
	_ac = 4;	--армор класс
	--падежи--
	};
};

hunter = obj {
	nam = 'охотник на нечисть',
	dsc = 'Охотни на нечисть тычет в меня осиновым колом',
	var {
	_pos = 10;	--позиция врага
	_hp_b = 30; 
	_hp = 30;
	_stm_b = 10;
	_stm = 10;
	_enj_b = 50;
	_enj = 50;
	_str = 5;
	_agi = 3;
	_ac = 3;	--армор класс
	--падежи--
	};
};

----диалог-бой----
fight = dlg {
	nam = 'бой',
	hideinv = true;
--	forcedsc = true;
	var {
		pl_agimod = 0;	--модификатор agi для "защитной стойки"
		mob = nil;
	};	
	entered = function(s)
		mob = mob1;
		mob._pos = 10;
		mob._hp = mob._hp_b;
		pl_pos = 0;
		pl_agimod = 0;
		pn ('На меня напали! Это ', mob.nam, '!');
		dismenu();
	end;
	dsc = function (s)
		local l = math.abs (mob._pos - pl_pos);
--		pn ('Ваша координата -- ', pl_pos)			--вспомогательный вывод
--		pn ('Координата монстра -- ', mob._pos)		--вспомогательный вывод
		p ('Передо мной ', mob.nam, ', до него ', l);
		if (l <= 4) and (l >= 2) then
			p 'метра.^';
		elseif (l == 1) then
			p 'метр.^';
		else
			p 'метров.^';
		end;
		p ('Его здоровье -- ', mob._hp, '.')			--вспомогательный вывод
	end;
	phr = {
		-- главное меню боя
			{tag = 'main_menu' },
			{always = true, 'Атаковать', 'Как атаковать?', [[ psub 'fight_menu' ]]},
--			{always = true, 'Применить способность', 'Какую способность применить?', [[ psub 'abil_menu' ]]},
			{always = true, 'Защищаться', 'Как защищаться?', [[ psub 'def_menu' ]]},
			{always = true, 'Бежать', nil, [[ runout() ]] },
		-- меню атаки
			{tag = 'fight_menu'},
			{always = true, 'Простая атака', nil, [[att1(mob); turn(mob)]]},
			{always = true, 'Отмена', nil, [[ pret() ]]},
		-- меню способностей
			{tag = 'abil_menu'},
			{always = true, 'Грозный взгляд', 'Я грозно смотрю на вражину.^ Вражина смущена и растеряна', [[ pret() ]]},
			{always = true, 'Отмена', nil, [[ pret() ]]},
		-- меню защиты
			{tag = 'def_menu'};
			{always = true, 'Отступить и встать в защитную стойку', nil, [[def1(); turn(mob)]]},
			{always = true, 'Отмена', nil, [[ pret() ]]},
		-- ход моба
			{tag = 'mob_menu'},
			{always = true, '>Далее', nil, [[mobatt1(mob); psub 'main_menu']]},		
		-- выход из боя
			{tag = 'exit_menu'},
			{always = true, '>Далее', nil, [[psub 'main_menu'; dismenu(); back()]]},
		};
};
--побег из боя--
function runout()
	local randomizer =(math.floor((-pl_agi)/2) + 4);
--		pn ('рэндомайзер',randomizer); 
	local dice = rnd(math.floor((-pl_agi)/2) + 4); --чем выше agi тем больше шанс спастись !!!надо сделать условие на случай, если agi больше 6
--	pn ('кубик', dice);
	if (dice <= 1) then 
		pn ('Я смог сбежать.');
		pl_turn = false;
		psub 'exit_menu';
	else
		pn ('Я попытался сбежать, но мой враг оказался быстрее.')
		psub 'mob_menu';
	end;	
end;

--переход хода от игрока--
function turn(mob)
	if (mob._hp <= 0) then			--моб сдох, выход из боя
		pn (mob.nam, ' упал замертво');
		expadd(mob);
		psub 'exit_menu';
	elseif pl_turn then
		pl_turn = false;
		psub 'mob_menu';
	else 
--		pn ('рэндомайзер',((-pl_agi) + 7)); 
		local dice = rnd((-pl_agi) + 7); --чем выше agi тем больше шанс спастись !!!надо сделать условие на случай, если agi больше 6
--		pn ('кубик', dice);
		if (dice <= 1) then 
			pn ('Дополнительный ход');
			pl_turn = true;
			psub 'main_menu';
		else
			psub 'mob_menu';
		end;
	end;
end;

--ответка моба:
function mobatt1(mob)
	local dice = rnd(3) + rnd(3);
	local l = (pl_pos - mob._pos);	--расстояние
--		pn ('на кубике ', dice);				--вспомогательный вывод
			if (math.abs(l) <= dice) then	--если на кубике больше, чем расстояние до 
				dice = (math.abs(l) - 1)	--игрока, то меням dice на (расстояние - 1)
			end;
			if (l < 0) then		--если игрок левее моба, инвертировать dice
				dice = (dice * -1);
			end;
			mob._pos = mob._pos + dice;			--двигаем моба
				l = (pl_pos - mob._pos);    --новое расстояние
			if (math.abs(l) == 1) then		--если стоим вплотную, то атакуем
					local pl_agidice = (pl_agi + rnd(10) + pl_agimod);	--броски на ловкость d10 с учетом модификатора agi
					local mob_agidice = (mob._agi + rnd(10));	
--					pn ('Ваш бросок на ловкость ', pl_agidice);		--вспомогательный вывод
--					pn ('Бросок на ловкость моба ', mob_agidice);	--вспомогательный вывод
					if (pl_agidice <= mob_agidice) then
						local dmg = ((mob._str - pl_ac) + rnd(3));	--расчет дамага d3, без отрицательных, 0 принимается как 1
--							pn ('dmg ', dmg);
						if (dmg < 0) then
							p (mob.nam, ' подскочил и ударил меня, но я даже не дрогнул.');
						elseif (dmg == 0) then
							pl_hp = (pl_hp - 1);
							p ( mob.nam, ' подскочил и ударил меня.');
						else
							pl_hp = (pl_hp - dmg);
							pn ( mob.nam, ' подскочил и ударил меня.');
							if (dmg > 3) then	--при очень сильном ударе врага отбрасывает
								pl_pos = (pl_pos + l);
								if (dmg > 6) then
									pl_pos = (pl_pos + l);
									if (dmg > 9) then
										pl_pos = (pl_pos + l);
										pn ('Сокрушительный удар отшвыривает меня.');
									else
										pn ('От мощного удара я отлетаю в сторону.');
									end;
								else
									pn ('От сильного удара я отступаю на шаг.');
								end;
							end;
						end;
					else
						pl_pos = (pl_pos + l);
						pn ( mob.nam, ' замахнулся, но я увернулся.');
					end;
			else
				pn (mob.nam, ' подбежал по ближе');
			end;
	if (pl_hp <= 0) then			--игрок сдох, выход из боя
--		pn ('Вы умерли');
		walk('deadscreen');
	else
		pl_agimod = 0;
		psub 'main_menu';	
	end;	
end;

-- отступить и защищаться
function def1()
	local dice = rnd(3) + rnd(3);
	local l = (mob._pos - pl_pos);
--	pn ('на кубике ', dice);	--вспомогательный вывод
	pn ('Я отскочил в сторону и встал в защитную стойку.');
	if (l < 0) then		--если моб левее игрока, инвертировать dice
		dice = (dice * -1);	
	end;
	pl_pos = pl_pos - dice;
	pl_agimod = 1;
end;

--обычная атака, вводная - идентификатор моба--
function att1(mob)	
--pn ('типа походил');
	local dice = rnd(3) + rnd(3);	--вариант без неудачи, бросок 2d3
	local l = (mob._pos - pl_pos);	--расстояние
--		pn ('на кубике ', dice);				--вспомогательный вывод
			if (math.abs(l) <= dice) then	--если на кубике больше, чем расстояние до 
				dice = (math.abs(l) - 1)	--моба, то меням dice на (расстояние - 1)
			end;
			if (l < 0) then		--если моб левее игрока, инвертировать dice
				dice = (dice * -1);
			end;
			pl_pos = pl_pos + dice;			--двигаем игрока
				l = (mob._pos - pl_pos);    --новое расстояние
			if (math.abs(l) == 1) then		--если стоим вплотную, то атакуем
					local pl_agidice = (pl_agi + rnd(10));	--броски на ловкость d10
					local mob_agidice = (mob._agi + rnd(10));	
--					pn ('Ваш бросок на ловкость ', pl_agidice);		--вспомогательный вывод
--					pn ('Бросок на ловкость моба ', mob_agidice);	--вспомогательный вывод
					if (pl_agidice >= mob_agidice) then
						local dmg = ((pl_str - mob._ac) + rnd(3));	--расчет дамага d3, без отрицательных, 0 принимается как 1
--							pn ('dmg ', dmg);
						if (dmg < 0) then
							p ('Я подскочил к ', mob.nam, ' и стукнул его кулаком, но он даже не дрогнул.');
						elseif (dmg == 0) then
							mob._hp = (mob._hp - 1);
							p ('Я подскочил к ', mob.nam, ' и больно стукнул его кулаком.');
						else
							mob._hp = (mob._hp - dmg);
							pn ('Я подскочил к ', mob.nam, ' и больно стукнул его кулаком.');
							if (dmg > 3) then	--при очень сильном ударе врага отбрасывает
								mob._pos = (mob._pos + l);
								if (dmg > 6) then
									mob._pos = (mob._pos + l);
									if (dmg > 9) then
										mob._pos = (mob._pos + l);
										pn ('Сокрушительный удар отшвыривает ', mob.nam, '.');
									else
										pn ('От мощного удара ', mob.nam, ' отлетает в сторону.');
									end;
								else
									pn ('От сильного удара ', mob.nam, ' отступает на шаг.');
								end;
							end;
						end;
					else
						mob._pos = (mob._pos + l);
						pn ('Я замахнулся на ', mob.nam, ', но эта зараза увернулась.');
					end;
			else
				pn ('Я подбежал по ближе к ', mob.nam);
			end; 
end;	


function expadd()
	local ex = ((mob._hp_b/10) + mob._str + mob._agi + mob._ac);
	pl_exp = pl_exp + ex;
	if (pl_exp >= (pl_lvl * 10)) then
		pl_exp = pl_exp - (pl_lvl * 10);
		pl_lvl = pl_lvl + 1;
		pl_points = pl_points + 1;
		pn ('^ ВЫ ПОЛУЧИЛИ НОВЫЙ УРОВЕНЬ^');
	end;
end;
