<?php
extract($HTTP_GET_VARS);
extract($HTTP_POST_VARS);
extract($HTTP_COOKIE_VARS);
extract($HTTP_SERVER_VARS);
//extract($HTTP_SESSION_VARS);

session_name('sid');
	//получяем ip
	$ip = ("$REMOTE_ADDR");
	$ip=htmlspecialchars($ip);
	//получяем браузер
	$brouzer=$_SERVER["HTTP_USER_AGENT"];
	$brouzer=htmlspecialchars($brouzer);

include "gzip.php";
include "header.php";
if (file_exists("flag_usesession")) $usesession=1;

include "include/admin.php";
include "include/settings.php";
// обнуляем переменные
$page_main = "";
$page_desc = "";

$tmp=$QUERY_STRING; if($tmp=='')$tmp=$_SERVER['QUERY_STRING'];
$tmp=urldecode($tmp);
$tmp=preg_replace("/[^ -}А-я]/e","",$tmp);
parse_str($tmp);
$g_tmp=$tmp;
$PHP_SELF='index.php';


if (file_exists("flag_update"))  require"update.php";

require"locations.php";

// игнорируем нефатальные ошибки
error_reporting (E_ERROR | E_WARNING);
function myErrorHandler ($errno, $errstr, $errfile, $errline) {}
set_error_handler("myErrorHandler");



if ($usesession) {
ini_set('session.use_trans_sid','0');
ini_set('url_rewriter.tags','');
if ($sid) {session_id($sid);session_start(); $login = $_SESSION["login"];}// надо вызывать перед стартом
if (!$login && !$site) $tmp='';// откроется основная страница, если не явно страница сайта
} else {
if (!$login) $login=$sid; else {if (substr($login,0,5)!='user.') $login='user.'.$login; $sid=$login;}// FIX: временно
$sid=$login."&p=$p";
$sid=htmlspecialchars($sid);
}
$login=str_replace('$','',$login);// чтобы PHP не принимал за переменные
$login=htmlspecialchars($login);
if ($sid) $sid.="&r=".rand(1,99);// это чтобы каждая страница загружалась заново, а не бралась из кэша
$game_file=htmlspecialchars($game_file);
if (file_exists($game_file)) {
$file_save = fopen($game_file,"r+");
if ($file_save===FALSE) {usleep(100000); $file_save = fopen($game_file,"r+");} // ждем по 100 миллисекунд, пока скрипт не прикроют по таймауту
flock($file_save,2);// пока не закроем файл при сохранении или скрипт не завершится
$game="";
while (!feof ($file_save)) $game.= fgets($file_save, filesize($game_file));
$game = unserialize($game);
} else {$file_save = fopen($game_file,"w+");require"blank.php";}

if ($site || $tmp=='') require"site.php"; // все что касается сайта
if (!$login || !isset($game["players"][$login])) {$site="";require"site.php";}

if (!$usesession) {
$info=split("\|",$game["loc"][$game["players"][$login]][$login]["info"]);
if ($info[0]!=$p) msg("Неправильный пароль<br/><a href=\"$PHP_SELF\">На главную</a><br/>",$game_title,0,'none');
}
$player=&$game["loc"][$game["players"][$login]][$login];
$player["time"]=time();
ai();
if ($spus) require"spus.php";
if ($gild) require"gild.php";
if ($smiles) require"smiles.php";
if ($chat) require"chat.php";
if ($adm) require"admin.php";
if ($look) require"look.php";
if ($speak) require"speak.php";
if ($menu) require"menu.php";
if ($inventar) require"inventar.php";
if ($say) require"say.php";
if ($tos) require "peredacha.php";
if ($avt) require"avtoritet.php";
if ($vote) require "vote.php";
if ($delete) require"delete.dat";
if ($vinokl) require"predmet/vinokl2.php";
if ($save) require"save.php";
if ($where) require"where.php";
if ($infor) require"infor.php";
if ($bed) require"predmet/bed.php";
if ($build) require"predmet/build.dat";
if ($msg) require"msg.php";
if ($trade) require"trade.php";
if ($servis) require"servis.php";
if ($attack) require"attack.php";
if ($help) require"help.php";
if ($how) require"how.php";
if ($all) require"all.php";
if ($new) require"new.php";
if ($take) require"take.php";
if ($drop) require"drop.php";
if ($new) require"new.php";
if ($forum) require"forum/forum.dat";
if ($port) require"port.php";
if ($stm) require "stand_magic.dat";
if ($use) require"use.php";
if ($list) {
if ($list=='skill') require"listskill.php";
if ($list=='magic') require"listmagic.php";
 if ($list=='inv') require"listinv.php";
if ($list=='par') require"listpar.php";
if ($list=='all') require"listall.php";
if ($list=='kvest') require"listkvest.php";
}
if ($go) require"go.php";
if ($new3) require"news.php";
if ($onl) require"online.php";
if ($rating) require"rating.php";
if ($exit) require"exit.php";

$url = $_SERVER['REQUEST_URL'];
if (preg_match("<", $url )) die("Error");
// собственно игра
$page_main.="";
//linkИгра
$ip_file=file_get_contents("agent/$login");
if ($ip!=$ip_file) msg("
Вы сменили устроиство персонажа, потвердите что Вы хозяин
<br/><a href=\"$PHP_SELF?site=chn&login=$login&p=$p\">Потвердить</a>
",ВНИМАНИЕ,0,'none');
if ($player["ghost"]){
$war=explode("|",$player["war"]);
$war[5]=0;
$war[8]=0;
$player["war"]=implode("|",$war);

}

// новые сообщения
$count = 0;
if ( isset($player["msg"]) && count($player["msg"]) ) foreach (array_keys($player["msg"]) as $i) if ( $player["msg"][$i] && isset($game["players"][$i]) ) $count++;
if ($count) $page_main.= "<a href=\"$PHP_SELF?sid=$sid&msg=1\">сообщение: $count</a>";
echo "<div class='ramka'>";
// MAIN PAGE
if ($count) $page_main.= "<br/>"; else $page_main.= "";
$page_main.="".$player["life"]."* ".$player["mana"]."";
if ($player["ghost"]) $page_main.= "<br/>Призрак";
if ($player["crim"]) $page_main.= "<br/>прест. ".date("i м:s сек",$player["time_crim"]-time())."";
$banned = implode("",file("data/banned.dat"));
$banned = unserialize($banned);
if ($banned["play"]) $page_main.="<br/>Блокированы, еще ".date("h:i:s",$banned["time"]-time())." мин";

if ($player['loc']=='loc.new.1') $page_main.='<br/><a href=\''.$PHP_SELF.'?sid='.$sid.'&new=a\'>[описания мира]</a>';
if ($player['loc']=='loc.new.2') $page_main.='<br/><a href=\''.$PHP_SELF.'?sid='.$sid.'&new=b\'>[как начать]</a>';
if ($player['loc']=='loc.new.3') $page_main.='<br/><a href=\''.$PHP_SELF.'?sid='.$sid.'&new=c\'>[напутствие]</a>';
if ($player['loc']=='loc.new.14') $page_main.='<br/><a href=\''.$PHP_SELF.'?sid='.$sid.'&new=d\'>[источник жизни]</a>';
if ($player['loc']=='loc.new.7') $page_main.='<br/><a href=\''.$PHP_SELF.'?sid='.$sid.'&new=e\'>[лекарь]</a>';
// SOUNDS
$stmp="";
$loc=split("\|",$locations[$player["loc"]]);
for ($i=3;$i<count($loc);$i++) {
if (substr($loc[$i],0,4)=='loc.') if (count($game["loc"][$loc[$i]])>0) foreach(array_keys($game["loc"][$loc[$i]]) as $j) if ((substr($j,0,5)=='user.') || substr($j,0,4)=='npc.') {if ($stmp=='') $stmp="<u>Звуки:</u> ".$loc[$i-1]; else $stmp.=", ".$loc[$i-1]; break;}
};
$zv=array();
for ($i=3;$i<count($loc);$i++) {
if (substr($loc[$i],0,4)=='loc.') if (count($game["loc"][$loc[$i]])>0) foreach(array_keys($game["loc"][$loc[$i]]) as $j) if ((substr($j,0,5)=='user.') || substr($j,0,4)=='npc.') { if ( !isset( $zv[$loc[$i]] ) ) $zv[ $loc[$i] ]=''; $zv[ $loc[$i] ].="!";}
};
$stmp=$stmp;

// FIX: тут надо сортировать: нападающие, нпс, игроки, предметы
// Объекты
$stmp="";
$stmp.="<br/><span style=\"color:green\">--рядом--</span>";
$ind=0; $count=0; if(!$start) $start=0;
if ($game["loc"][$player["loc"]]) foreach (array_keys($game["loc"][$player["loc"]]) as $i) if ($i!=$login) {
if ($ind>=$start && $ind<$start+$count_show) {//FIX: может +1?
// определим видимое название предметов и игроков/npc (включая кол-во и статус)
if (substr($i,0,5)=='item.') {
$k=split("\|",$game["loc"][$player["loc"]][$i]);
if (substr($i,0,11)!='item.stand.' && $k[1]>1) $k=$k[0]." (".$k[1].")"; else $k=$k[0];
} else {
$k=$game["loc"][$player["loc"]][$i]["title"];
if ($game["loc"][$player["loc"]][$i]["life_max"]>0) $ltmp=round($game["loc"][$player["loc"]][$i]["life"]*100/$game["loc"][$player["loc"]][$i]["life_max"]);
$st='';
if ($ltmp<100) $zizn.="(".$ltmp."%)";
if ($game["loc"][$player["loc"]][$i]["gild"]) {
$gild=split("\|",$game["loc"][$player["loc"]][$i]["gild"]);
$gildy.="[".$gild[1]."]".$gild[0]."";
}
if (substr($i,0,5)=="user."){
// статусы
$us=$game["loc"][$player["loc"]][$i]; 
$sk=split("\|",$us["skills"]);
if ($sk[28]<5) $sta="_";
if ($sk[28]>=5 && $sk[28]<20) $sta="-";
if ($sk[28]>=20 && $sk[28]<30) $sta="-";
if ($sk[28]>=30 && $sk[28]<45) $sta=".";
if ($sk[28]>=45 && $sk[28]<60) $sta="=";
if ($sk[28]>=60 && $sk[28]<75) $sta="=";
if ($sk[28]>=75 && $sk[28]<90) $sta="=";
if ($sk[28]>=90 && $sk[28]<105) $sta="~";
if ($sk[28]>=105 && $sk[28]<125) $sta="~";
if ($sk[28]>=125 && $sk[28]<200) $sta="+";
if ($sk[28]>200)$sta="^";
}


if ($game["loc"][$player["loc"]][$i]["ghost"]) $prizrak.="0";
    if (substr($i,0,5)=='user.' && $game["loc"][$player["loc"]][$i]["crim"]) $prest.=" #";
$att=$game["loc"][$player["loc"]][$i]["attack"];
if ($att && isset($game["loc"][$player["loc"]][$att]) && !$game["loc"][$player["loc"]][$att]["ghost"] && !$game["loc"][$player["loc"]][$i]["ghost"]) $ataka.="(атак. ".$game["loc"][$player["loc"]][$att]["title"].")";
if ($st) {if ($st{0}==' ') $st=substr($st,1); $k.=" [".$st."]";}
$not=0;
}

$stmp.= "<br/>".$prest."".$prizrak."".$sta."<a href=\"$PHP_SELF?sid=$sid&menu=to&to=$i\">".$k."</a>".$zizn."".$gildy."".$ataka."";
unset($prizrak);
unset($prest);
unset($gildy);
unset($zizn);
unset($sta);
unset($ataka);
}
$ind++;
}
if ($start) {$stmp.= "\n<br/><a href=\"$PHP_SELF?sid=$sid\">^ </a>";}
if ($start+$count_show<count($game["loc"][$player["loc"]])-1) {if (!$start) $stmp.="\n<br/>"; $stmp.= "<a href=\"$PHP_SELF?sid=$sid&start=".($start+$count_show)."\">+ (".(count($game["loc"][$player["loc"]])-1-$start-$count_show).")</a>";}
$page_main.=$stmp;

// EXITS
$page_main.="<br/><span style=\"color:green\">--идти--</span>";
$loc=split("\|",$locations[$player["loc"]]);
for ($i=3;$i<count($loc);$i++) {
if (substr($loc[$i],0,4)=='loc.') {
if ( !isset($zv[$loc[$i]]) ) $zv[$loc[$i]]='';
$zv[$loc[$i]]=substr($zv[$loc[$i]],0,3);
$rs=split("\|",$locations[$loc[$i]]);
if (!$rs[1] && $loc[1]) $rsg="%";
if ($rs[1] && !$loc[1]) $rsg="%";
$page_main.= "\n<br/>$rsg.<a href=\"$PHP_SELF?sid=$sid&go=".$loc[$i]."\" title=\"^\" accesskey=\"".$loc[$i+1]."\">".$loc[$i-1]."</a>".$zv[$loc[$i]]."";
unset($rsg);
}
};
if ($player["bk"]) {
$page_main.="<br/><span style=\"color:green\">- кнопки -</span><br/>";
if ($player["bk1"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&list=inv\">[О]</a>*";
}
if ($player["bk2"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&magic=1\">[М]</a>*";
}
if ($player["bk3"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&msg=1\">[К]</a>*";
}
if ($player["bk4"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&servis=1\">[С]</a>*";
}
if ($player["bk5"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&gild=1\">[Г]</a>*";
}
if ($player["bk6"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&chat=1\">[Ч]</a>*";
}
if ($player["bk7"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&forum=exit\">[Ф]</a>*";
}
if ($player["nvm"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&use=item.bottle.mana.great\">[нвм]</a>*";
}
if ($player["nm"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&use=item.bottle.mana\">[нм]</a>*";
}
if ($player["nvz"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&use=item.bottle.life.great\">[нвж]</a>*";
}
if ($player["nz"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&use=item.bottle.life\">[нж]</a>*";
}
if ($player["sm"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&use=skill.meditation&u=skill.meditation\">{М}</a>*";
}
if ($player["ss"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&use=skill.steal&u=skill.steal\">{К}</a>*";
}
if ($player["sa"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&use=skill.animaltaming&u=skill.animaltaming\">{П}</a>*";
}
if ($player["si"]) {
$page_main.="<a href=\"$PHP_SELF?sid=$sid&use=skill.ingen&u=skill.ingen\">{И}</a>*";
}
}
$page_main.="<br/><span style=\"color:green\">- другое -</span>";
$page_main.="<br/><a href=\"$PHP_SELF?sid=$login&p=$p&r=$r\" title=\"обновить\">обновить</a>
\n<br/><a href=\"$PHP_SELF?sid=$sid&look=1\" title=\"описание\">описание</a>
\n<br/><a href=\"$PHP_SELF?sid=$sid&save=$login\" title=\"Сохранить\">Сохранить</a>";
if ($player["vremya"]) {$page_main.="<br/><span style=\"color:green\">- время -</span>";
$dat=date("H:i:s");
$page_main.="<br/>$dat";
}

$udir = opendir ("data/profil");
while ($ufile = readdir ($udir)) 
{if (($ufile !="index.php"))
{$ufa[]=$ufile;}}
closedir ($udir);
$utotal = count($ufa);




$dat = date("Y m d");
$vremya = date("H:i");



if ($login==$admin || $login==$admin2) $page_main.="<br/><span style=\"color:green\">--админ меню--</span><br/><a href=\"$PHP_SELF?sid=$sid&adm=res\">[Восстановить все]</a>\n<br/><a href=\"$PHP_SELF?sid=$sid&adm=1\">[Админ-Панель]</a>";
// карта меню
msg($page_main,$loc[0],1,'main');

// служебные функции
function savegame() {// сохранение игры
global $file_save,$game;
rewind($file_save);// в начало файла
fputs($file_save,serialize($game));
fflush($file_save);
fclose($file_save);
}


function getrandname() {// генерирует случайное имя
require"getrandname.php";
return $stmp;
}

function addjournal($to,$msg) {// добавляет в журнал и следит, чтоб не переполнился
global $game,$journal_count;
if (isset($game["players"][$to])) {
$j=&$game["loc"][$game["players"][$to]][$to]["journal"];
$j[]=$msg;
if (count($j)>$journal_count) array_splice($j,0,count($j)-$journal_count);// оставляем только n последних записей
}
}
function addjournalall($loc,$msg,$no1="",$no2="") {// добавляет запись всем в журнал, кроме $no1 и $no2
global $game;
if ($game["loc"][$loc]) foreach (array_keys($game["loc"][$loc]) as $i) if ($i!=$no1 && $i!=$no2) if (isset($game["players"][$i])) addjournal($i,$msg);
}

function msg($msg,$title='Жизнь Дракона',$journal=1,$menu='') {//linkMsg// вывод текста и выход
// journal==1, то выведем карту с алертами
// menu=='', кнопка "В игру" и "Назад"
// menu=='none', без кнопок
// menu=='main', основное меню
global $game,$login,$page_size,$page_desc,$page_main,$debug,$PHP_SELF,$sid,$player,$page_size;

if (!$debug) ob_start("translate");
$wml = "\n<html>";
$wml.="\n<head>\n<meta forua=\"true\" http-equiv=\"Cache-Control\" content=\"must-revalidate\"/>\n<meta forua=\"true\" http-equiv=\"Cache-Control\" content=\"no-cache\"/>\n<meta forua=\"true\" http-equiv=\"Cache-Control\" content=\"no-store\"/>\n</head>";
// ЖУРНАЛ
if ($journal==1 && $player["journal"] && count($player["journal"])>0) {// FIX: почему-то даже пустой массив имеет count=1
$page_journal=implode("<br/>",$player["journal"]);
$wml.= "<title>Журнал</title><body>\n";
if ($page_desc) $wml.= "desc";else $wml.= "";
$wml.= "\n".$page_journal."\n\n</body>";
$player["journal"]=array();
}

$sizeok=1;
if ($player["look"]==$player["loc"]) {unset($player["look"]);$page_desc=0;}// FIX: чтобы большое описание не вешало игрока
if ($page_desc) {
$player["look"]=$player["loc"];
require"desc.php";
if (strlen($wml.$msg.$desc[$player["loc"]])>$page_size) $sizeok=0;
$wml.= "\n\n";
if ($sizeok) $wml.= ""; else $wml.= "$PHP_SELF?sid=$sid";
msg("<strong>- Описания -</strong><br/>".$desc[$player["loc"]]."<br/><br/><a href=\"$PHP_SELF?sid=$sid\">[^]</a>");
}

// ОСНОВНОЙ ЭКРАН
if ($sizeok) {// только если размер меньше или равен
$wml.= "\n ";
if ($menu=='main') $wml.= "";
$wml.= "";
if ($menu=='') {
$wml.= "<div style=\"background-color:lime\"><a href=\"$PHP_SELF?sid=$sid\">В игру</a><hr/></div>";
}
if ($menu=='main') {
$wml.="<br>0.<a href=\"$PHP_SELF?sid=$sid&menu=my_list\" accesskey=\"0\">меню</a>";
}
                  $j=0;
if (substr($msg,strlen($msg)-4)!="</p>") $msg.="\n</p>";
if (substr($msg,0,2)!="<p") $msg="<p>\n".$msg;
$wml.= "\n".$msg."\n</body>";
};// if sizeok

   $wml.= "</html>";
$wml=str_replace("&","&",$wml);// чтобы привести к одному виду
$wml=str_replace("&","&",$wml);
savegame();// чтобы пока выводится клиенту, другие могли играть

echo $wml;
	$traff=strlen($simvol)/3;
$Contents = ob_get_contents();
$gzib_file = strlen($Contents);
$support_gzip ='header("Content-Encoding: gzip")' ;
$support_deflate = 'header("Content-Encoding: deflate")' ;
$support_x_gzip = 'header("Content-Encoding: x_gzip")' ;

if ($support_deflate) {
$gzib_file_out = strlen(gzdeflate($Contents,9));
} else{
if($support_gzip){
$gzib_file_out = strlen(gzencode($Contents,9));
} else {
if($support_x_gzip){
$gzib_file_out = strlen(gzcompress($Contents,9));
}else {
$gzib_file_out = strlen($Contents);
}}}
if(!$_SESSION[traffic]){
		session_register("traffic");
}
$traff=$gzib_file_out;
$traff=strlen(gzencode($Contents,9));
$_SESSION['traffic']=$_SESSION[traffic]+$traff;
die("");
exit;

if ($debug) echo "\n<html><title>".$player["loc"]." : ".$title." : ".strlen($wml)."</title>";
echo $wml;
if ($debug) {
echo "<p>Локация:<br>";
if ($game["loc"][$player["loc"]]) foreach(array_keys($game["loc"][$player["loc"]]) as $i) if ($i!=$login) echo "<br/>".$i;
echo "<p><a href=\"$PHP_SELF?sid=$sid&list=inv\">Инвентори:</a><br>";
if ($player["items"]) foreach(array_keys($player["items"]) as $i) echo "<br/>".$i;
echo "<p><a href=\"$PHP_SELF?sid=$sid&list=magic\">Магия</a>";
}
if (!$debug) ob_end_flush();
die("");// работа скрипта завершена
}

 $save=$login;
 require"save.php";  //сохраним игрока
 $_zpl=&$game["loc"][$game["players"][$j]][$j];
 
  function savepl($gtemp, $j)
{
    if ($gtemp['info'])
    {
        $f = fopen('./users/'.$j.'.dat', 'w+');
        fwrite($f, serialize($gtemp));
        fclose($f);
    }
}
 
 
function ai() {// новый AI//linkAI
global $game,$locations,$login,$player,$time_logout;

// раз в 12 часов обслуживание



if (time()>$game["lastai"]+60) {
foreach(array_keys($game["players"]) as $j) if ($j!=$login) { // раз в минуту
if (time()>$game["loc"][$game["players"][$j]][$j]["time"]+$time_logout) {
if (isset($game["loc"][$game["players"][$j]][$j])) {
// в оффлайн
$gtemp=$game["loc"][$game["players"][$j]][$j];
$gtemp["journal"]=array();
$gtemp["loc"]=$game["players"][$j];
savepl ($gtemp, $j);
unset($game["loc"][$game["players"][$j]][$j]);
if ($info[2]=='f') addjournalall($game["players"][$j],$gtemp["title"]." исчезла",$j); 
else addjournalall($game["players"][$j],$gtemp["title"]." исчез",$j);
unset($game["players"][$j]);
}  else unset($game["players"][$j]);
}
}
$game["lastai"]=time();
}


if (!$login || !$player) return;// это когда только смотрят список онлайн

// проверяем только текущую и соседние локации
doai($player["loc"]);
$ok=array($player["loc"]=>1);// эту проверили
$loc=split("\|",$locations[$player["loc"]]);
for ($i=3;$i<count($loc);$i++) if (substr($loc[$i],0,4)=='loc.') {
doai($loc[$i]);
$ok[$loc[$i]]=1;
$loc1=split("\|",$locations[$loc[$i]]);
for ($j=3;$j<count($loc1);$j++) if (substr($loc1[$j],0,4)=='loc.') if (!isset($ok[$loc1[$j]])) {doai($loc1[$j]); $ok[$loc1[$j]]=1;}
}
}

function doai($i) {// искусственный интеллект, проверяем локацию с именем $i
global $game,$locations,$time_logout,$time_regenerate,$time_objects_destroy,$time_crim;

$loc=split("\|",$locations[$i]);

// таймеры локации
if (isset($game["loc_del"][$i])) foreach (array_keys($game["loc_del"][$i]) as $j) {
if (time()>$game["loc_del"][$i][$j]) {// удаление предмета/npc
if (substr($j,0,4)=='npc.') addjournalall($i,$game["loc"][$i][$j]["title"]." исчез");
unset($game["loc"][$i][$j]);
unset($game["loc_del"][$i][$j]);
if (count($game["loc_del"][$i])==0) unset($game["loc_del"][$i]);
}
}
if (isset($game["loc_add"][$i])) foreach (array_keys($game["loc_add"][$i]) as $j) {
if (time()>$game["loc_add"][$i][$j]["time"]) {// добавление предмета/npc
if ($game["loc_add"][$i][$j]["respawn"]) {
$respawn=split("\|",$game["loc_add"][$i][$j]["respawn"]);
$game["loc_add"][$i][$j]["time"]=time()+rand($respawn[0],$respawn[1]);
if ($respawn[2] && $respawn[3] && substr($j,0,5)=='item.') {// обновим кол-во
$item=split("\|",$game["loc_add"][$i][$j]["item"]);
$item[1]=rand($respawn[2],$respawn[3]);
$game["loc_add"][$i][$j]["item"]=implode("|",$item);
}
}
$game["loc"][$i][$j]=$game["loc_add"][$i][$j]["item"];
if (substr($j,0,4)=='npc.') {
$info=split("\|",$player["info"]);
if ($info[2]=="f"){
addjournalall($i,"Появилася ".$game["loc_add"][$i][$j]["item"]["title"]);
}else{
addjournalall($i,"Появился ".$game["loc_add"][$i][$j]["item"]["title"]);
}
unset($game["loc_add"][$i][$j]);// npc удаляем, для предметов только обновляем время
if (count($game["loc_add"][$i])==0) unset($game["loc_add"][$i]);
}
}
}

// удалим стражу, если вышло время
if ($game["loc"][$i]) foreach (array_keys($game["loc"][$i]) as $j) if (substr($j,0,9)=='npc.guard') if (time()>$game["loc"][$i][$j]["delete"]) {unset($game["loc"][$i][$j]); addjournalall($i,$game["loc"][$i][$j]["title"]." исчез");}

// есть ли лекарь, есть ли гарды, список кримов (монстры и крим игроки) и список игроков
$crim=array();
$users=array();
if ($game["loc"][$i]) foreach (array_keys($game["loc"][$i]) as $j) if (substr($j,0,5)=='user.' || substr($j,0,4)=='npc.') {
if ($game["loc"][$i][$j]["healer"]) $healer=$game["loc"][$i][$j]["title"];
if (substr($j,0,9)=='npc.crim.' || $game["loc"][$i][$j]["crim"]) if (!$game["loc"][$i][$j]["ghost"]) $crim[]=$j;// криme["loc"][$i]) foreach (array_keys($game["loc"][$i]) as $j) if (substr($j,0,5)=='user.' || substr($j,0,4)=='npc.') {
if ($game["loc"][$i][$j]["healer"]) $healer=$game["loc"][$i][$j]["title"];
if (substr($j,0,9)=='npc.crim.' || $game["loc"][$i][$j]["crim"]) if (!$game["loc"][$i][$j]["ghost"]) $crim[]=$j;// криимов-призраков не добавляем
if (substr($j,0,9)=="npc.guard") $guard=1;
if (substr($j,0,5)=="user." && !$game["loc"][$i][$j]["ghost"]) $users[]=$j;
}
// добавляем стражу от 1 до 3 гардов
if ($loc[1] && count($crim)>0 && !$guard) for ($k=0;$k<rand(1,3);$k++) {
srand ((float) microtime() * 10000000);
$id = "npc.guard.".rand(5,9999);
$title = getrandname()." [стража]";
  $game["loc"][$i][$id]=array("title"=>$title,"life"=>"1000","life_max"=>"1000","speak"=>"npc.guard","war"=>"100|180|420|2|0|60|50|30|20|60|60|90|гневом небес|0||","delete"=>time()+$time_logout);
//$game["loc_del"][$i][$id]=time()+$time_logout;// когда удалить стражу
addjournalall($i,"Прилитела ".$title);
}

// теперь обработаем игроков и npc
if ($game["loc"][$i]) foreach (array_keys($game["loc"][$i]) as $j) if (isset($game["loc"][$i][$j]) && (substr($j,0,5)=='user.' || substr($j,0,4)=='npc.')) {
// восстановим жизнь и ману согласно прошедшему времени
$tm=time()-$game["loc"][$i][$j]["time_regenerate"];
if ($tm>$time_regenerate && !$game["loc"][$i][$j]["ghost"]) {
$life=0; $mana=0;
if (substr($j,0,5)=='user.') {// проверим скиллы регенерация и медитация
$skills=split("\|",$game["loc"][$i][$j]["skills"]);
$life=$skills[16];
$mana=$skills[5];
}
$game["loc"][$i][$j]["life"]+=round($tm/($time_regenerate-$life));
$game["loc"][$i][$j]["mana"]+=round($tm/($time_regenerate-$mana));
if ($game["loc"][$i][$j]["life"]>$game["loc"][$i][$j]["life_max"]) $game["loc"][$i][$j]["life"]=$game["loc"][$i][$j]["life_max"];
if ($game["loc"][$i][$j]["mana"]>$game["loc"][$i][$j]["mana_max"]) $game["loc"][$i][$j]["mana"]=$game["loc"][$i][$j]["mana_max"];
$game["loc"][$i][$j]["time_regenerate"]=time();
}

// игроки
if (substr($j,0,5)=="user.") {
// проверим, не прошло ли время крима
if (time()>$game["loc"][$i][$j]["time_crim"]) {unset($game["loc"][$i][$j]["crim"]); unset($game["loc"][$i][$j]["time_crim"]);}
// если есть лекарь, то воскресимся...
if ($game["loc"][$i][$j]["ghost"] && $healer) {addjournalall($i,$healer.": Возвращайся к живым, ".$game["loc"][$i][$j]["title"]."!");ressurect($j);}
}

// NPC
if (substr($j,0,4)=='npc.') {
$b=0;// надо ли continue, если ушли в др. локацию
// первым делом следуем за хозяином
$owner=$game["loc"][$i][$j]["owner"];
$follow=$game["loc"][$i][$j]["follow"];
$guard=$game["loc"][$i][$j]["guard"];
$attack=$game["loc"][$i][$j]["attack"];
if ($owner) {
// хозяин крима тоже крим
if ($game["loc"][$i][$j]["crim"] && isset($game["loc"][$i][$owner])) docrim($owner);
// если вышло время служения
if (time()>$game["loc"][$i][$j]["time_owner"]) {
addjournal($owner,$game["loc"][$i][$j]["title"]." покинул вас");
if ($game["loc"][$i][$j]["destroyonfree"]) {addjournalall($i,$game["loc"][$i][$j]["title"]." исчез"); unset($game["loc"][$i][$j]); continue;}// дальше не обрабатываем его
else {unset($game["loc"][$i][$j]["time_owner"]); unset($game["loc"][$i][$j]["owner"]);unset($game["loc"][$i][$j]["follow"]); unset($game["loc"][$i][$j]["guard"]);}
}
}
if ($follow && !isset($game["loc"][$i][$follow])) for ($k=3;$k<count($loc);$k++) if (substr($loc[$k],0,4)=='loc.' && isset($game["loc"][$loc[$k]][$follow])) {
// нашли в соседней локации $follow, идем туда
$game["loc"][$loc[$k]][$j] = $game["loc"][$i][$j];
unset($game["loc"][$i][$j]);
unset($game["loc"][$k][$j]["attack"]);
addjournalall($i,$game["loc"][$loc[$k]][$j]["title"]." ушел ".$loc[$k-1]);
addjournalall($loc[$k],"Пришел ".$game["loc"][$loc[$k]][$j]["title"]);
$b=1;// больше не обрабатывать в текущей локации
break;
}
if ($b) continue;//$j ушел из этой локации

// пытаемся преследовать (если ни за кем не следуем)
if ($attack && !$game["loc"][$i][$j]["follow"] && !isset($game["loc"][$i][$attack])) for ($k=3;$k<count($loc);$k++) if (substr($loc[$k],0,4)=='loc.' && isset($game["loc"][$loc[$k]][$attack])) {// нашли!
// хорошие не будут преследовать в неохраняему зону, а плохие не сунутся в гард зону, а гарды всегда преследуют!
$crimj=$game["loc"][$i][$j]["crim"] || substr($j,0,9)=='npc.crim.';
$loc1=split("\|",$locations[$loc[$k]]);
$b=0;
if (($crimj && !$loc1[1]) || (!$crimj && $loc1[1]) || substr($j["id"],0,9)=="npc.guard") $b=1;// продолжить погоню
// проверим скилл игрока skill.hiding, может спрятался (от гардов не действует)
if (substr($attack,0,5)=='user.' && !substr($j,0,9)=="npc.guard" || substr($j,0,4)=="npc.") {
$skills=split("\|",$game["loc"][$loc[$k]][$attack]);
if (rand(0,12)<($skills[17]+6)) {
addjournal($attack,"Вы скрылись от атаки!");
unset($attack); $b=0;
addjournal($attack,"Вы скрылись от погони!");}
}

if ($b) {// погоня!
$game["loc"][$loc[$k]][$j] = $game["loc"][$i][$j];
unset($game["loc"][$i][$j]);
addjournalall($i,$game["loc"][$loc[$k]][$j]["title"]." ушел3 ".$loc[$k]);
addjournalall($loc[$k],"Пришел ".$game["loc"][$loc[$k]][$j]["title"]);
} else unset($game["loc"][$i][$j]["attack"]);
break;
}
if ($b) continue;//$j ушел из этой локации
// если на того, кого охраняем guard=id кто-то нападает, атакуем его
if ($guard && isset($game["loc"][$i][$guard])) {
if ($game["loc"][$i]) foreach (array_keys($game["loc"][$i]) as $k) if ($game["loc"][$i][$k]["attack"]==$guard) {$game["loc"][$i][$j]["attack"]=$k; break;}
}

// гарды атакуют кримов, кримы игроков
if (!$game["loc"][$i][$j]["attack"]) {
if (substr($j,0,9)=="npc.guard" && count($crim)>0) $game["loc"][$i][$j]["attack"]=$crim[rand(0,count($crim)-1)];
if (($game["loc"][$i][$j]["crim"] || substr($j,0,9)=='npc.crim.') && count($users)>0) {
$b=0;
$attack=$users[rand(0,count($users)-1)];
if (substr($attack,0,5)=='user.') {$skills=split("\|",$game["loc"][$i][$attack]); if (rand(0,100)<=$skills[1]*5) {$b=1;addjournal($attack,"Вы укрылись от атаки ".$game["loc"][$i][$j]["title"]);}}
if (!$b) $game["loc"][$i][$j]["attack"]=$attack;
}

// если все еще не атакуем, то атакуем того, кто атакует нас
//if (!$game["loc"][$i][$j]["attack"]) if ($game["loc"][$i]) foreach (array_keys($game["loc"][$i]) as $k) if ($game["loc"][$i][$k]["attack"]==$j) {$game["loc"][$i][$j]["attack"]=$k; break;}
}

// проверяем случайное движение NPC
if (!$game["loc"][$i][$j]["attack"] && $game["loc"][$i][$j]["move"]) {
$move=split("\|",$game["loc"][$i][$j]["move"]);
$b=0;
if (time()>$game["loc"][$i][$j]["time_nextmove"]) {// идем...
$k=$loc[2+2*rand(0,(count($loc)-2)/2-1)+1];// случайный выход
// плохие не идут в гард зону, а хорошие из нее
$crimj=$game["loc"][$i][$j]["crim"] || substr($j,0,9)=='npc.crim.' || substr($j,0,11)=='npc.animal.';
$loc1=split("\|",$locations[$loc[$k]]);
if (($crimj && !$loc1[1]) || (!$crimj && $loc1[1])) $b=1;// идти
if ($k==$i) $b=0;
if ($b) {
// переход
$game["loc"][$k][$j]=$game["loc"][$i][$j];
unset($game["loc"][$i][$j]);
addjournalall($k,"Пришел ".$game["loc"][$k][$j]["title"]);
$s=$game["loc"][$k][$j]["title"]." ушел ";
if (array_search($k,$loc)) $s.=$loc[array_search($k,$loc)-1];
addjournalall($i,$s);
$game["loc"][$k][$j]["time_nextmove"]=time()+rand($move[1],$move[2]);// след. ход
}
}
}
if ($b) continue;//$j ушел из этой локации
// проверяем атаку NPC
if ($game["loc"][$i][$j]["attack"] && $game["loc"][$i][$game["loc"][$i][$j]["attack"]]["ghost"]) unset($game["loc"][$i][$j]["attack"]);
if ($game["loc"][$i][$j]["attack"]) attack($i,$j,$game["loc"][$i][$j]["attack"]);
}//npc
}//foreach user & npc

// удалим пустой массив
//if (count($game["loc"][$i])==0) unset($game["loc"][$i]);
}

function ressurect($to) {
require"ressurect.php";
}

function tsdecode($s) {
if ($s!='') {
$s1=$s;
$s = str_replace("%D0%81","Ё",$s);
$s = str_replace("%d0%81","Ё",$s);
$s = str_replace("%D1%91","ё",$s);
$s = str_replace("%d1%91","ё",$s);
for ($i=144;$i<192;$i++) {$stmp = "%D0".urlencode(chr($i)); $s = str_replace(strtoupper($stmp),chr($i+48),$s); $s = str_replace(strtolower($stmp),chr($i+48),$s);}
for ($i=128;$i<144;$i++) {$stmp = "%D1".urlencode(chr($i)); $s = str_replace(strtoupper($stmp),chr($i+112),$s);$s = str_replace(strtolower($stmp),chr($i+112),$s);}
//if ($s==$s1)
$s = urldecode($s);
}
return $s;
}

function docrim($login) {
require"docrim.php";
}
function calcparam($login) {
require"calcparam.php";
};

function attack($loc,$fromid,$toid,$magic='',$answer=1) {//linkAttack// answer=1 - обороняющийся отвечает, 0 -нет
global $attackf;
global $game,$locations,$login,$time_crim,$points_levelup,$time_objects_destroy,$time_logout,$time_defspeed;
if (!$attackf) $attackf=implode('',file("attackf.php"));
eval($attackf);
}

function view($file) {require"view.php";}
?>









