if ((substr($fromid,0,5)!='user.' && substr($fromid,0,4)!='npc.') || (substr($toid,0,5)!='user.' && substr($toid,0,4)!='npc.')) return; // только игроки и нпс
$from=&$game["loc"][$loc][$fromid];
if (!$from || $from["ghost"]) return;
//проверим время отдыха (кроме когда отвечаем)
if (!$answer && time()<=$from["time_speed"]) return;
if ($magic) $fromwar=split("\|",$magic); else $fromwar=split("\|",$from["war"]);
if ($answer) $from["time_speed"]=time()+$fromwar[3]; // время для отдыха
$hit=$fromwar[0];
$b=0;
$loc1=split("\|",$locations[$loc]);
if (!isset($game["loc"][$loc][$toid]) && $fromwar[4]) { // если ranged и не магией, то ищем в соседних локациях
for ($i=3;$i<count($loc1);$i+=2) if (isset($game["loc"][$loc1[$i]][$toid])) {$b=1; $to=&$game["loc"][$loc1[$i]][$toid]; $hit-=10; if ($hit<0) $hit=0; break;} //нашли, штраф к меткости
}
if (!$b && !isset($game["loc"][$loc][$toid])) {addjournal($fromid,"Цель недоступна"); return;}
$to=&$game["loc"][$loc][$toid];
if ($to["ghost"]) return;
$towar=split("\|",$to["war"]);
if ($magic) {
$uklon = $towar[9]; // вероятность уклониться 0..100%
$parring = $towar[10]; // вероятность уменьшить урон на $shield
$shield = $towar[11];
} else {
$uklon = $towar[6];
$parring = $towar[7];
$shield = $towar[8];
}
// если напали на хорошего (не крим и не атакует вас), кроме животных вне охраняемой зоны (для охоты), то становимся кримами
$crim=$to["crim"] || substr($toid,0,9)=='npc.crim.' || (substr($toid,0,11)=='npc.animal.' && !$loc1[1]);
if (!$crim && $to["attack"]!=$fromid) docrim($fromid);
// проверим, а есть ли стрелы или что там нужно...
$needok=1;
if ($fromwar[14]) {
if (isset($from["items"][$fromwar[14]])) {
// тратим 1 патрон
$item=split("\|",$from["items"][$fromwar[14]]);
$item[1]=$item[1]-1;
if ($item[1]>=1) {
$from["items"][$fromwar[14]]=implode("|",$item);
}else { // патроны кончились, заново расчет параметров
unset($from["items"][$fromwar[14]]);
unset($from["equip"]["arm"]); // убираем с рук
calcparam($fromid);
}
} else $needok=0;
}
if ($needok) {
// проверим, попали ли
if (rand(0,100)<=$hit) {
// урон
$damage=rand($fromwar[1],$fromwar[2]);
// уклон
if (rand(0,100)>$uklon) {
// щит
if ($parring && $shield) if (rand(0,100)<=$parring) {if (!$magic) {$damage-=$shield; addjournalall($loc,$to["title"]." парировал щитом");} else {$damage-=$damage*$shield/100; addjournalall($loc,$to["title"]." сопротивляется магии");}}
// броня
if (!$magic && $towar[5]) $damage-=$towar[5]; // есть броня, гасим на armor, но не для магии
if ($damage<0) $damage=0;
if ($to["god"]) $damage=0; // режим БОГА
// наносим урон
$to["life"]-=$damage;
if ($to["life"]<0) $to["life"]=0;
addjournal($fromid,"Вы нанесли ".$to["title"]." урон ".$fromwar[12]." ".$damage);addjournal($toid,$from["title"]." нанес вам урон ".$fromwar[12]." ".$damage);addjournalall($loc,$from["title"]." нанес ".$to["title"]." урон ".$fromwar[12]." ".$damage,$fromid,$toid);
// если убили, добавим труп
if ($to["life"]<1) {
eval(implode('',file("f_kill.dat")));
}
} else {addjournal($toid,"Вы уклонились"); addjournalall($loc,$to["title"]." уклонился",$toid);}
} else {addjournal($fromid,"Вы промахнулись");addjournalall($loc,$from["title"]." промахнулся",$fromid);}
} else addjournal($fromid,"Нет патронов: ".$fromwar[15]);
// если оба живы, то обороняющийся отвечает (кроме магии)
if(isset($game["loc"][$loc][$fromid]) && isset($game["loc"][$loc][$toid]) && $fromid!=$toid) {
if (!isset($to["attack"])) $to["attack"]=$fromid;
if ($answer && !$magic) attack($loc,$toid,$fromid,0,0);
}