<?
function tipud($th) {
$r=rand(0,100);
#0-10 10-20 20-30 30-40 40-50 50-60 60-70
# 1 колющ - ножи
# 2 руб - топор
# 3 дроб - дубины
# 4 реж - мечи
# 5 огн 6 земл 7 лед 8 электр 9 тьма 10 свет

#(0 нет,1 ничтожно редки,2 редки,3 малы,4 временами 5 регулярны,6 часты,7 всегда
#(0 нет,1 ничтожно редки,11 редки,25 малы,49 временами 69 регулярны,89 часты,100 всегда
# сначала все редки
$p=$p+znach($th->stats['atkol']);
if ($r<=$p) {return 1;}
$p=$p+znach($th->stats['atrub']);
if ($r<=$p) {return 2;}
$p=$p+znach($th->stats['atdrob']);
if ($r<=$p) {return 3;}
$p=$p+znach($th->stats['atrez']);
if ($r<=$p) {return 4;}
$p=$p+znach($th->stats['atogn']);
if ($r<=$p) {return 5;}
$p=$p+znach($th->stats['atzem']);
if ($r<=$p) {return 6;}
$p=$p+znach($th->stats['atled']);
if ($r<=$p) {return 7;}
$p=$p+znach($th->stats['atelec']);
if ($r<=$p) {return 8;}
$p=$p+znach($th->stats['atdark']);
if ($r<=$p) {return 9;}
$p=$p+znach($th->stats['atlight']);
if ($r<=$p) {return 10;}
}
function znach($n) {
if ($n==1) {return 1;}
elseif ($n==2) {return 10;}
elseif ($n==3) {return 25;}
elseif ($n==4) {return 50;}
elseif ($n==5) {return 70;}
elseif ($n==6) {return 90;}
elseif ($n==7) {return 100;}

}
function zashit($inf,$tip) {
	if ($tip==1) {	$z=$inf->sumall('defkol');
	}elseif ($tip==2) {	return $inf->sumall('defrub');
	}elseif ($tip==3) {	return $inf->sumall('defdrob');
	}elseif ($tip==4) {	return $inf->sumall('defrez');
	}elseif ($tip==5) {	return $inf->sumall('deforn')+$inf->sumall('defmagic');
	}elseif ($tip==6) {	return $inf->sumall('defzem')+$inf->sumall('defmagic');
	}elseif ($tip==7) {	return $inf->sumall('defvod')+$inf->sumall('defmagic');
	}elseif ($tip==8) {	return $inf->sumall('defvoz')+$inf->sumall('defmagic');
	}elseif ($tip==9) {	return $inf->sumall('defdark')+$inf->sumall('defmagic');
	}elseif ($tip==10) {	return $inf->sumall('defsvet')+$inf->sumall('defmagic');
	}
}
function mfudara($inf,$tip) {
	if ($tip==1) {	$z=$inf->sumall('mosh_kol');
	}elseif ($tip==2) {	return $inf->sumall('mosh_rub');
	}elseif ($tip==3) {	return $inf->sumall('mosh_drob');
	}elseif ($tip==4) {	return $inf->sumall('mosh_rez');
	}elseif ($tip==5) {	return $inf->sumall('mosh_ogn')+$inf->sumall('mms');
	}elseif ($tip==6) {	return $inf->sumall('mosh_zem')+$inf->sumall('mms');
	}elseif ($tip==7) {	return $inf->sumall('mosh_vod')+$inf->sumall('mms');
	}elseif ($tip==8) {	return $inf->sumall('mosh_voz')+$inf->sumall('mms');
	}
}
function usepriem($id_battle,$id_bstep,$priem,$myinfo,$myteam) {
	db_use('query',"update person_on set pr_active=0 where id_person='".$myinfo->id_person."' and type=3 and pr_name='".$priem."'");
	
			#прием
		#db_use('query',"INSERT INTO battle_step (id_battle,id_person1,id_person2,is_result) VALUES (".$id_battle.",".($myteam==1?$myinfo->id_person:0).",".($myteam==2?$myinfo->id_person:0).",1)");
		#$idbs=mysql_insert_id();
		$x=db_use('array',"select max(id_event) as max1 FROM battle_event WHERE id_battle='".$id_battle."'");
		db_use('query',"INSERT INTO battle_event (id_battle,id_event,id_bstep,timestamp,type1,udar,block,event_logtype,id) VALUES ('".$id_battle."','".($x['max1']+1)."','".$id_bstep."','".time()."','".$myteam."',0,0,8,(select id_priem from priem where priem='".$priem."'));");
		insert_event(45,$id_battle,($x['max1']+1)); # прием
		insert_event(46,$id_battle,($x['max1']+1)); # прием
	
}
function udar12($inf1, /* Я */
				$inf2, /* МОЙ ПРОТИВНИК */
				$att1, /* МОЯ АТАКА(1/2/3/4) */
				$block2, /* БЛОК ПРОТИВНИКА*/
				$id_event, /* что менять если записано */
				$block1, /* МОЙ БЛОК */
				$udaril, /* УДАРИЛ ЛИ (TRUE) */
				$is_krit, /* КРИТ ЛИ (TRUE) */
				$weap_order, /* КАКОЕ ОРУДИЕ (1/2) */
				$is_kulak, /* 1-кулаками */
				$id_battle, /* $id_battle */$id_bstep,$myteam,$myzones,$enzones) 
				{
global $debug;
 #-----------------------------------------------------------------------
# echo "удар ".$att1." блок противника ".$block2.'<BR>';
if (!$id_event) {
	$res=db_use('array',"select max(id_event) as max1 FROM battle_event WHERE id_battle='".$id_battle."'");
	$id_event=($res['max1']+1);
	#echo "NEWEV";
	newevent($id_battle,$id_bstep,$myteam,$att1,$block1,0);
	
	#db_use('query',"INSERT INTO battle_event (id_battle,id_event,id_bstep,timestamp,type1,udar,block) VALUES (".$id_battle.",".$id_event.",".$id_bstep.",".time().",".$myteam.",".$att1.",".$block1.");");
}

# приемы действующие того кого бьют
	if (isset($inf2->priems->priems)) {
	foreach ($inf2->priems->priems as $key => $value) {
		if ($value['active']==1 && $inf1->id_person<100000) {
			if ($key=='counter_winddance') {
				$udaril=false;
				usepriem($id_battle,$id_bstep,$key,$inf2,($myteam==1?2:1));
			}elseif ($key=='parry_prediction') {
				$parry_prediction=true;
				usepriem($id_battle,$id_bstep,$key,$inf2,($myteam==1?2:1));
			}elseif ($key=='block_activeshield') {
				$block_activeshield=true;
				#usepriem($id_battle,$id_bstep,$key,$inf2,($myteam==1?2:1));
			}
		}
		#$priem=new prieminfo(0,key($value));
		#echo "<IMG width=36 height=23 src='../i/misc/icons/".$priem->priem.".gif' onmouseout='hideshow();' onmouseover='fastshow(\"<B>".$priem->name."</B> (Прием)<BR><BR>".$priem->opisan."\")';>";
	}
	}
	if (isset($inf1->priems->priems)) {
	foreach ($inf1->priems->priems as $key => $value) {
		if ($value['active'] && $inf2->id_person<100000) {
			if ($key=='hit_strong') {
				$hit_strong=true;
				#usepriem($id_battle,$id_bstep,$key,$inf1,$myteam);
			}elseif ($key=='krit_wildluck') {
				$is_krit=true;
				usepriem($id_battle,$id_bstep,$key,$inf1,$myteam);
			}elseif ($key=='hit_luck') {
				$hit_luck=true;
				#usepriem($id_battle,$id_bstep,$key,$inf1,$myteam);
			}elseif ($key=='multi_hi3ddenpower') {
				$is_krit=true;
				usepriem($id_battle,$id_bstep,$key,$inf1,$myteam);
			}
		}
	}						
	}				
if ($udaril) { # ударил (не увернулся)
	# блок ли?
	$blocked=isblocked($att1,$block2); # блок блоком
	#echo "{inf1->name}->{inf2->name} ударяет {$att1} блок {$block2} ".($blocked?'- блок сработал':'- блок не сработал').'<br />';
	if ($parry_prediction) {$blocked=true;}
	#if ($blocked) {echo"блок<br>";}else{echo"попал<br>";}
	if (!$blocked OR ($blocked && $is_krit)) {
	#echo ($is_krit?'крит<br>':'не заблокирован <br>');
 # Получаем $damage1
# echo 'ударяет '.$inf1->name.'('.$inf1->id_person.')<br>';
 # 1) статовый урон + ВЫЧИСЛИТЬ МАСТЕРСТВО ВЛАДЕНИЯ ОРУЖИЕМ КОТОРЫМ БЬЕМ
  if ($weap_order==1) { #первый удар
	 $typewp=$inf1->puton['3']->type4;
	 if ($typewp && $inf1->puton['3']->type2==2) { # для первого оружия
	 	 $masw=$inf1->sumall('masw'.$typewp);
	 }
	 $dm1 = ($inf1->sumall('min') - $inf1->puton['10']->dmin); # учитываем только урон без щита
	 $dm1 = (($inf1->align==0.5 && !$inf1->puton['3']->dmax)?($dm1+$inf1->level):$dm1); # добавить нейтралам уровень к DMG MIN
	 $dmx1 = ($inf1->sumall('max') - $inf1->puton['10']->dmax);
	 $dmx1 = (($inf1->align==0.5 && !$inf1->puton['3']->dmax)?($dmx1+$inf1->level):$dmx1); # нейтралам уровень к DMG MAX
	 $tipudara=tipud($inf1->puton['3']);
	 #echo "min1=".$inf1->sumall('min').'-'.$inf1->puton['10']->dmin.'='.$dm1.'<br>';
	 #echo "max1=".$inf1->sumall('max').'-'.$inf1->puton['10']->dmax.'='.$dmx1.'<br>';
	 #echo "sumstat=".$inf1->sumstat('min')."<br />";
	 #echo "sumstatмх=".$inf1->sumstat('min')."<br />";
 }else{ # второй удар 
	 $typewp=$inf1->puton['10']->type4;
	 if ($typewp && $inf1->puton['10']->type2==2) { # для второго оружия
	 	 $masw=$inf1->sumall('masw'.$typewp);
	 }
	 $dm1 = ($inf1->sumstat('min') - $inf1->puton['3']->dmin); # учитываем урон без слота "оружие"
	 $dm1 = (($inf1->align==0.5 && !$inf1->puton['10']->dmax)?($dm1+$inf1->level):$dm1); # добавить нейтралам уровень к DMG MIN
	 $dmx1 = ($inf1->sumstat('max') - $inf1->puton['3']->dmax);
	 $dmx1 = (($inf1->align==0.5 && !$inf1->puton['10']->dmax)?($dmx1+$inf1->level):$dmx1); # нейтралам уровень к
	 $tipudara=tipud($inf1->puton['10']);
	 #echo "min2=".$inf1->sumall('min').'-'.$inf1->puton['3']->dmin.'='.$dm1.'<br>';
	 #echo "max2=".$inf1->sumall('max').'-'.$inf1->puton['3']->dmax.'='.$dmx1.'<br>'; 
	 }

 # 2) увеличение макс удара мастерством 
$dmx1 = rnd1($masw, $dmx1-$dm1);  # влияние мастерства на макс удар
 # мощность удара

 # [3) учеличение min/max из-за заточки]
 # [4) рассчет и учет заточки]

 # заточка учтена при создании предмета!!

#ПРО ЗАТОЧКУ
#заточка +1: к примеру, выходит около 4%-7% мф урона. Заточка+5 выходит для того же оружия 18%-33% мф урона. 
#Кстати, Красочный топор, если точить, выйдет +1 заточка 20%-33% мф урона, а +5 = 100%-167%. 

# для учета редактировать базу вещей


#



 # 5) рассчет общего damage (с учетом мастерства)
#$dmraz=($dmx1-$dm1)-($dmx1-$dm1)/10; # разница между макс и мин уроном
#	$dmraz=($dmraz<0?0:$dmraz); # не меньше нуля
$mur=$inf1->sumall('mur')-$inf2->sumall('antimur'); # мощность урона
	$mur=($mur<0?0:$mur); # не меньше нуля
#echo "Мощность урона {$mur}<br />";
#$x=$mur*$dmraz/300; # добавка к демейджу от мощ урона (макс - 300)
#$x=($x>$dmraz?$dmraz:$x); # не больше чем разница
#$dm1+=$x;

 #echo "damage=".$dm1.'+('.$dmmax1.')='.$damage1;
 # 6) рассчет вида удара
# типы ударов
#ВЕРОЯТНОСТИ ТИПОВ УДАРОВ
# "часты", "регулярны", "временами", "малы", "редки", "ничтожно редки",  если я не ошибаюсь. Далее, "временами" - означает немногим менее 50%, "Малы" около 25%, "редки", выходит около 10%, "регулярны" около 70%(75?), "часты" около 90%, ну а ничтожно редки судя по всему означает, что вероятность выпадения около 0.01
#$umn=((100+$mur)/100);

if ($is_krit) {

# дополнительно мощ крита
#$dmx1=$dmx1*2; # крит - двойной удар
#$dmraz=($dmx1-$dm1)-($dmx1-$dm1)/10; # разница между макс и мин уроном
#	$dmraz=($dmraz<0?0:$dmraz); # не меньше нуля
$mkr=$inf1->sumall('mkr')-$inf2->sumall('antimkr'); # мощность крита
	$mkr=($mkr<0?0:$mkr); # не меньше нуля
#$x=$mkr*$dmraz/300; # добавка к демейджу от мощ крита (макс - 300)
#$x=($x>$dmraz?$dmraz:$x); # не больше чем разница
#$dm1+=$x;

# 10) удар с учетом брони и крит ударов
#мф. мощности крита ПРИМЕРНО РАВЕН мф. мщ. урона для критовых ударов
}else{
}

#дамаг = ((дфмфг с оружия случ между макс и мин) + (дамаг с силы)) * (1 + суммарный мф урона с вещей и силы / 100) * [если крит](2 + мфмощкр / 100)
 $dmmax1 = (int)(rand($dm1,$dmx1)); $damage1 = $dm1 + $dmmax1; $damage1=($damage1>0?$damage1:0);


$damage1= (int) ($damage1) ;

 # 7) рассчет мф вида удара
 $mfudara=mfudara($inf1,$tipudara); #мф дробящего 
 # 8) учет мф мощность урона + мф мощность удара типом оружия

# 9) рассчет брони + защита от урона 
if ($att1==1) {$bronm=$inf2->sumall('br1min');$bron=$inf2->sumall('br1');}
if ($att1==2) {$bronm=$inf2->sumall('br2min');$bron=$inf2->sumall('br2');}
if ($att1==3) {$bronm=$inf2->sumall('br3min');$bron=$inf2->sumall('br3');}
if ($att1==4) {$bronm=$inf2->sumall('br3min');$bron=$inf2->sumall('br3');}
if ($att1==5) {$bronm=$inf2->sumall('br4min');$bron=$inf2->sumall('br4');}

	$damage1= (int)(($damage1)*($is_krit?(2+$mkr/100):1) * (1+$mur/100) * ((100+$mfudara)/100) );

if ($is_krit) { # броня при крите
	#КРИТ БРОНЯ
	# В случае крита, уровень брони считается от 0 до максимальной брони, а пробой брони судя по всему означает, что броня игнорируется в случае срабатывания вероятности, хотя вполне возможно, означает игнорирование брони на этот %, но не уверен. Ещё не понятно, в случае крита не сквозь блок, как считается удар и урон нанесёный. удар умножается в два раза и потом отнимается броня и защита от урона 
	$damage1=$damage1-rand($bronm,$bron)-$inf2->sumall('vyn')*0.2;
	$damage1+=	($hit_strong?21:0)+($hit_luck?42:0);
}else{# броня
	#БРОНЯ
	#урон= (удар-(случайное значение в интервале от минимального значения брони (сумма минимальных в "действует на" + в свойствах вещи, куда прошёл удар) до максимального значения)-защита от урона (сумма в "действует на" + в свойствах вещи).
	#Для некритового удара оружия без пробоя брони, выходит, броня 30-30 равнозначна защите от урона в 30. 
	$ran1=rand($bronm,$bron);
	$ran2=rand(0,$inf2->sumall('zur')/(rand(1,2.22)));
	$damage1=$damage1-$ran1-$ran2-$inf2->sumall('vyn')*0.2; 
	#1 стат выносливости = 6 НР и 0.2 брони на каждый участок тела
	$damage1+=	($hit_strong?21:0)+($hit_luck?42:0);
	if ($inf2->id_person>100000) {$damage1=$damage1*1.15;if ($debug)echo "Увеличен урон боту на 15%<br />";}
	if ($damage1<0) { $damage1=0;}
	if ($block_activeshield) {$damage1=(int)($damage1/2);}
	
}
$curlife=$inf2->life;
		if ($blocked && $is_krit) { # крит в блок
			# рассчет пробивания
			if ($probiv) { # пробит блок критом
#echo "LOG 00:00 Проклятье Глубин высморкался, как вдруг Daemon V провел рассекающий удар гардой, пробив блок, по <вырезано цензурой> врага. -53 [389/500]";
				$lifenew=logwrite1($id_battle,$id_event,$tipudara,$att1,-$damage1,$inf2,5);
				# обновить battle_units (крит+1 блок противника
				$n_krit=1;
				if ($hit_strong) {usepriem($id_battle,$id_bstep,'hit_strong',$inf1,$myteam);}
				if ($hit_luck) {usepriem($id_battle,$id_bstep,'hit_luck',$inf1,$myteam);}
				if ($block_activeshield) {usepriem($id_battle,$id_bstep,'block_activeshield',$inf2,($myteam==1?2:1));}
			}else{ # не пробит блок критом
#echo "ЛОГ КРИТ БЛОК 00:01 brener старалась провести удар, но непобедимый Пустынник Атаман поставил блок на секущий удар лезвием топора в нос.";
				$lifenew=logwrite1($id_battle,$id_event,$tipudara,$att1,0,$inf2,2);$damage1=0;
				# обновить battle_units (крит+1
				$n_block=1;
				# обновить battle_units (блок противника
			}
		}elseif (!$blocked) { # удар
			if ($is_krit) { # крит не в блок
#echo "LOG 00:01 Пустынник Атаман вспомнил что-то важное, и тут brener, приняв боевые 100 грамм, укусила за пятку соперника. -67 [158/375]";
				$lifenew=logwrite1($id_battle,$id_event,$tipudara,$att1,-$damage1,$inf2,4);
				# обновить battle_units (крит+1
				$n_krit=1;
				if ($hit_strong) {usepriem($id_battle,$id_bstep,'hit_strong',$inf1,$myteam);}
				if ($hit_luck) {usepriem($id_battle,$id_bstep,'hit_luck',$inf1,$myteam);}
				if ($block_activeshield) {usepriem($id_battle,$id_bstep,'block_activeshield',$inf2,($myteam==1?2:1));}
				if ($damage1>$inf2->life && rand(1,100)<=3) {
					if ($damage1>$inf2->maxlife()/2) {
						db_use('query',"update person set travma_id=1,travma_type=1,travma_time='".(time()+60*60)."' where id_person='".$inf2->id_person."'");
					}else{
						db_use('query',"update person set travma_id=1,travma_type=2,travma_time='".(time()+60*60)."' where id_person='".$inf2->id_person."'");
					}
				}
			}else{ # обычный удар не в блок
#echo "LOG 00:01 Ленусик В Тапках засмотрелась на <вырезано цензурой>, но вдруг, неожиданно Пустынник Атаман проснувшись рубанул ятаганом левую почку соперника. -7 [526/539]";
				$lifenew=logwrite1($id_battle,$id_event,$tipudara,$att1,-$damage1,$inf2,1);
				# обновить battle_units (удар+1
				$n_udar=1;
				if ($hit_strong) {usepriem($id_battle,$id_bstep,'hit_strong',$inf1,$myteam);}
				if ($hit_luck) {usepriem($id_battle,$id_bstep,'hit_luck',$inf1,$myteam);}
				if ($block_activeshield) {usepriem($id_battle,$id_bstep,'block_activeshield',$inf2,($myteam==1?2:1));}
			}
		}
	} #/if (!$blocked OR ($blocked && $is_krit)) {
	else{ # чистый блок удара
#echo "LOG 00:01 brener старалась провести удар, но непобедимый Пустынник Атаман поставил блок на секущий удар лезвием топора в нос.";
				$lifenew=logwrite1($id_battle,$id_event,$tipudara,$att1,0,$inf2,2);$damage1=0;
				# обновить battle_units (блок противника
				$n_block=1;
	}

}else{#/if udaril     увернулся
#echo "LOG 00:01 Пустынник Атаман поскользнулся и восхитительная brener ушла вправо от удара кривой саблей по крестцу.";
				$lifenew=logwrite1($id_battle,$id_event,$tipudara,$att1,0,$inf2,3);$damage1=0;
				# обновить battle_units (уворот противника
				$n_uv=1;
}#/if udaril
$damage1=($curlife-$lifenew);
if ($damage1<0) $damage1=0;
db_use('query',"update battle_units set counter=counter+1".($n_krit?", krit=krit+1":"").($n_udar?", hit=hit+1":"").", hp=hp+".(0+$damage1)." where id_battle='".$id_battle."' and id_person='".$inf1->id_person."' " );

db_use('query',"update battle_units set counter=counter+1".($n_block?", block=block+1":"").($n_uv?", parry=parry+1":"")." where id_battle='".$id_battle."' and id_person='".$inf2->id_person."' " );
return $lifenew;
} #-----------------------------------------------------------------------
?>