function is_attack_successful($who, $to, $re = 0)
{
    // re oznachaet chto udar otvetnyj.
    // a esli udar otvetnyj, mozhno ne smotretq mozhet li on atakovatq, i ne fiksirovatq
    // etoj funkciej budem sravnivatq shansy
    include_once 'modules/f_get_chanses.php';
    // proverjaem effekty
    // esli odin iz paralizujushih, to vsegda kto-to proigraet/vyjgraet
    include_once 'modules/f_get_affected.php';
    $aff = get_affected($who);
    if (is_in('oglushen', $aff)) {
        return 0;
    }
    if (is_in('zamerz', $aff)) {
        return 0;
    }
    if (is_in('okamenel', $aff)) {
        return 0;
    }
    if (is_in('odubel', $aff)) {
        return 0;
    }
    if (is_in('paralizovan', $aff)) {
        return 0;
    }
    $aff = get_affected($to);
    if (is_in('oglushen', $aff)) {
        return 1;
    }
    if (is_in('zamerz', $aff)) {
        return 1;
    }
    if (is_in('okamenel', $aff)) {
        return 1;
    }
    if (is_in('odubel', $aff)) {
        return 1;
    }
    if (is_in('paralizovan', $aff)) {
        return 1;
    }
    $wid;
    $who_ranged = 0;
    $pi = is_player($who);
    if ($pi) {
        $wid = $pi;
        // berem informaciju igroka
        // shansy nanesti udar
        include_once 'modules/f_get_pl_battle_har.php';
        $who_har = get_pl_battle_har($who);
        // kakoe oruzhie. toestq rasschityvatq li po sisteme dalqnego boja ili blizhnego
        // esli who_ranged == 1,, to togda schitajutsja formuly luchnikov
        $q = do_mysql("SELECT fullname FROM items WHERE belongs = '" . $who . "' AND is_in = 'wea'");
        if (!mysql_num_rows($q)) {
            $who_ranged = 0;
        } else {
            $who_ranged = mysql_result($q, 0);
        }
        if (substr($who_ranged, 4, 3) == 'bow' || substr($who_ranged, 4, 3) == 'arb') {
            $who_ranged = 1;
        } else {
            $who_ranged = 0;
        }
        // zhiznq igroka dlja shansov (massiv)
        $q = do_mysql("SELECT life FROM players WHERE id_player = '" . $wid . "';");
        $who_life = mysql_result($q, 0);
        $who_life = explode('|', $who_life);
        // proverka onlajn:
        do_mysql("SELECT active FROM players WHERE id_player = '" . $wid . "';");
        $active = mysql_result($q, 0);
        if (!$active) {
            include_once 'modules/f_end_battle.php';
            end_battle($who);
        }
    } else {
        $wid = is_npc($who);
        if (!$wid) {
            return -1;
        }
        // informacija npc :
        include_once 'modules/f_get_npc_battle_har.php';
        $who_har = get_npc_battle_har($who);
        // napadatq s dali nemozhet npc
        // zhiznq npc dlja shansov (massiv)
        $q = do_mysql("SELECT life FROM npc WHERE id_npc = '" . $wid . "';");
        $who_life = mysql_result($q, 0);
        $who_life = explode('|', $who_life);
    }
    // proverka vremeni ataki
    include_once 'modules/f_check_last_attack.php';
    if (!check_last_attack($who, $re)) {
        return -1;
    }
    // esli ataka ne vovremja (s uchetom otvetki)
    //  obnovim posledniju ataku, takzhe s uchetom otvetki
    if (!$re) {
        // ne proverjaem estq li patrony, lenq, proverim v do_dmg
        include_once 'modules/f_upd_last_attack.php';
        upd_last_attack($who);
    } else {
        $aff = get_affected($to);
        if (is_in('ispugan', $aff)) {
            return 0;
        }
        // pri ispuge otvetka nevozmozhna
    }
    // harakteristika zawiwajusjago
    $tid;
    $pi = is_player($to);
    if ($pi) {
        $tid = $pi;
        // berem informaciju igroka
        // shansy nanesti udar
        include_once 'modules/f_get_pl_battle_har.php';
        $to_har = get_pl_battle_har($to);
        // estq li shit (1, 0)
        $q = do_mysql("SELECT COUNT(*) FROM items WHERE belongs = '" . $to . "' AND is_in = 'shi' AND type = 'x'");
        $to_shield = mysql_result($q, 0);
        // zhiznq igroka dlja shansov (massiv)
        $q = do_mysql("SELECT life FROM players WHERE id_player = '" . $tid . "';");
        $to_life = mysql_result($q, 0);
        $to_life = explode('|', $to_life);
        // proverka onlajn:
        do_mysql("SELECT active FROM players WHERE id_player = '" . $tid . "';");
        $active = mysql_result($q, 0);
        if (!$active) {
            include_once 'modules/f_end_battle.php';
            end_battle($to);
        }
    } else {
        $tid = is_npc($to);
        if (!$tid) {
            return -1;
        }
        // informacija npc :
        include_once 'modules/f_get_npc_battle_har.php';
        $to_har = get_npc_battle_har($to);
        // napadatq s dali nemozhet npc
        // zhiznq npc dlja shansov (massiv)
        $q = do_mysql("SELECT life FROM npc WHERE id_npc = '" . $tid . "';");
        $to_life = mysql_result($q, 0);
        $to_life = explode('|', $to_life);
    }
    // proschityvaem shansy -
    $ch = get_chanses($who_har, $who_life, $to_har, $to_life);
    // sluchajnoe chislo
    $rnd = rand(0, 100);
    if ($rnd <= $ch[1][1]) {
        // udar blokirovan:
        if ($who_ranged) {
            include_once 'modules/f_promah.php';
            promah($who);
        } else {
            include_once 'modules/f_block.php';
            block($to);
        }
        $NO = 1;
    } else {
        $ntdl = rand(0, 1);
        if ($ntdl == 0) {
            if ($who_ranged) {
                if (rand(0, 100) <= $ch[1][8]) {
                    // uklonimsja
                    include_once 'modules/f_uklon.php';
                    uklon($to);
                    $NO = 1;
                }
            } else {
                if (rand(0, 100) <= $ch[1][2]) {
                    // uklonimsja
                    include_once 'modules/f_uklon.php';
                    uklon($to);
                    $NO = 1;
                }
            }
        } else {
            if ($who_ranged) {
                if (rand(0, 100) <= $ch[1][3]) {
                    // pariruem
                    return 1;
                }
            } else {
                if (rand(0, 100) <= $ch[1][9]) {
                    // pariruem
                    return 1;
                }
            }
        }
    }
    if (isset($NO)) {
        // esli streljaem, nado rashodovatq strely, esli promahnulisq ili uklon. inache rashoduem v do_dmg
        if ($who_ranged) {
            // rashoduem odnu strelu
            include_once 'modules/f_decr_abstr_misc.php';
            if (!decr_abstr_misc('i.m.arr.arr', $who, 1)) {
                add_journal('нехватает припасoв!', $who);
            }
        }
        return 0;
    }
    //esli vse horosho, vozvrashjaem 2:
    return 2;
}
}
if ($magic['poison']) {
    if ($magic['type'] == 'war') {
        $f .= 'добавляет ';
    } else {
        $f .= 'снимает ';
    }
    $f .= 'отравление<br/>';
}
$f .= 'слова: <b>' . $magic['words'] . '</b><br/>';
$f .= 'мана -' . $magic['mana'] . '<br/>';
$f .= 'минимальный навык магии: <b>' . $magic['minskill'] . '</b><br/>';
$f .= 'сложность: ' . $magic['difficulty'] . '<br/>';
////////////////// shans igroka v procentah ////////////////
include_once 'modules/f_get_pl_battle_har.php';
$har = get_pl_battle_har($LOGIN);
if ($magic['classof'] == 0) {
    $max = -1;
    $sk = 0;
    for ($i = 22; $i < 30; $i++) {
        if ($p['skills'][$i] > $max) {
            $sk = $i;
            $max = $p['skills'][$sk];
        }
    }
} else {
    $sk = 21 + $magic['classof'];
}
// nomer navyka
$har[4] += $p['skills'][$sk] * 9;
$h = $har[4];
     } else {
         continue;
     }
 }
 if (!$to) {
     continue;
 }
 if (substr($to, 0, 2) == 'n.') {
     include_once 'modules/f_get_npc_info.php';
     $op = get_npc_info($to, 'all');
     $npc_har = get_npc_battle_har($to);
     $lvl = round($op['exp'] / 20);
 } elseif (is_player($to)) {
     include_once 'modules/f_get_pl_info.php';
     $op = get_pl_info($to, 'all');
     $npc_har = get_pl_battle_har($to);
     $lvl = $op['stats'][0];
 }
 if ($op['location'] != $p['location']) {
     include 'modules/f_end_battle.php';
     end_battle($LOGIN);
     continue;
 }
 $md = $lvl - $p['stats'][0];
 if ($md < -1) {
     $clr = '#696969';
 } else {
     if ($md == -1) {
         $clr = '#31F3F5';
     } else {
         if ($md == 0) {
function mag_def($off, $skill, $location, $def)
{
    //$off = preg_replace ('/[^a-z0-9_\.]/i', '', $off);
    //$def = preg_replace ('/[^a-z0-9_\.]/i', '', $def);
    // berem shansy
    $id = is_player($off);
    if ($id) {
        include_once 'modules/f_get_pl_battle_har.php';
        $off_har = get_pl_battle_har($off);
        $off_har[5] += $skill * 3;
        $off_har[6] += $skill * 3;
        $off_har[7] += $skill * 3;
        $q = do_mysql("SELECT life FROM players WHERE id_player = '" . $id . "';");
        $off_life = mysql_result($q, 0);
        $off_life = explode('|', $off_life);
        $off_name = $off;
    } else {
        $id = is_npc($off);
        include_once 'modules/f_get_npc_battle_har.php';
        $off_har = get_npc_battle_har($off);
        $q = do_mysql("SELECT life, name FROM npc WHERE id_npc = '" . $id . "';");
        $off_a = mysql_fetch_assoc($q);
        $off_life = explode('|', $off_a['life']);
        $off_name = $off_a['name'];
    }
    $tid = is_player($def);
    if ($tid) {
        include_once 'modules/f_get_pl_battle_har.php';
        $def_har = get_pl_battle_har($def);
        $q = do_mysql("SELECT life FROM players WHERE id_player = '" . $tid . "';");
        $def_life = mysql_result($q, 0);
        $def_life = explode('|', $def_life);
        $def_name = $def;
    } else {
        $tid = is_npc($def);
        include_once 'modules/f_get_npc_battle_har.php';
        $def_har = get_npc_battle_har($def);
        $q = do_mysql("SELECT life, name FROM npc WHERE id_npc = '" . $tid . "';");
        $def_a = mysql_fetch_assoc($q);
        $def_life = explode('|', $def_a['life']);
        $def_name = $def_a['name'];
    }
    // teperq formiruem shansy proporcianalqno:
    include_once 'modules/f_get_chanses.php';
    $ch = get_chanses($off_har, $off_life, $def_har, $def_life);
    // ch[0] eto napadajushij, ch[1] eto zashishjajushijsja
    // 5 - blok, 6 - sopr, 7 - uklon
    // vyberem sluchaino:
    $do = rand(5, 7);
    // teperq shans eto sdelatq:
    $proc = rand(0, 100);
    // esli vyjdet to sdelaem i vozvratim znachenie:
    if ($proc <= $ch[1][$do]) {
        // znachit taki sdelali
        if ($do == 5) {
            // blok:
            add_journal($def_name . ' блокировал магию ' . $off_name . '!', 'l.' . $location);
            return 1;
        } elseif ($do == 6) {
            // soprotivlenie:
            add_journal($def_name . ' сопротивился магии ' . $off_name . '!', 'l.' . $location);
            return 2;
        } else {
            // uklon:
            add_journal($def_name . ' уклонился от магии ' . $off_name . '!', 'l.' . $location);
            return 3;
        }
    } else {
        return 0;
    }
}
function check_cast($spell, $login)
{
    //$spell = preg_replace ('/[^a-z0-9_]/i', '', $spell);
    //$login = preg_replace ('/[^a-z0-9_]/i', '', $login);
    $id = is_player($login);
    if (!$id) {
        put_error('only players can cast');
    }
    // berem infu zakla : shans vypolnenija
    $q = do_mysql("SELECT difficulty, classof, minskill FROM magic WHERE fullname = '" . $spell . "';");
    if (!mysql_num_rows($q)) {
        put_error('there is no such spell');
    }
    $diff = mysql_fetch_assoc($q);
    $q = do_mysql("SELECT skills FROM players WHERE id_player = '" . $id . "';");
    $skill = mysql_result($q, 0);
    $skill = explode('|', $skill);
    // teperq berem shans igroka boevoi (na sotvorenie magii):
    include_once 'modules/f_get_pl_battle_har.php';
    $har = get_pl_battle_har($login);
    // har[4] eto shans bez navyka magii. dobavim ego:
    if ($diff['classof'] == 0) {
        $max = -1;
        $sk = 0;
        for ($i = 22; $i < 30; $i++) {
            if ($skill[$i] > $max) {
                $sk = $i;
                $max = $skill[$sk];
            }
        }
    } else {
        $sk = 21 + $diff['classof'];
    }
    // nomer navyka
    if (!$skill[$sk]) {
        return 0;
    }
    $har[4] += $skill[$sk] * 9 + $skill[30] * 9;
    // teperq poluchenuju cyfru i diff - iz nih procenty delaem:
    $h = $har[4];
    $pr = $h / ($har[4] + $diff['difficulty']) * 100;
    $pr = round($pr);
    if ($diff['minskill'] > $skill[$sk] + $skill[30]) {
        $pr = 0;
    }
    //echo 'pr = '.$pr;
    // esli odet zhezl, to uluchshaetsja shans, proverim
    $q = do_mysql("SELECT fullname, on_use FROM items WHERE belongs = '" . $login . "' AND is_in = 'wea';");
    if (mysql_num_rows($q)) {
        $w = mysql_fetch_assoc($q);
        if (substr($w['fullname'], 4, 3) == 'tre') {
            // proverim:
            $pl = $w['on_use'];
            if ($pl) {
                $pl = explode(':', $pl);
                $c = count($pl);
                for ($i = 0; $i < $c; $i++) {
                    $pl[$i] = explode('~', $pl[$i]);
                    if ($pl[$i][0] == 0 || $pl[$i][0] == $diff['classof']) {
                        $pr += $pl[$i][1];
                    }
                }
            }
        }
    }
    // proverka na shans:
    if (rand(0, 100) <= $pr) {
        return 1;
    }
    return 0;
}