// кастинг заклинаний
eval(implode('',file("f_magic.dat"))); // загружаем всю магию
$magic=split("\|",$arr_magic[$use]);
// проверяем, нужна ли цель
if (($magic[6] && $to) || !$magic[6]) {
// проверяем, хватает ли маны
if ($player["mana"]>=$magic[1]) {
$regsok=1;
if (!$scroll) { // проверяем и удаляем реги
if (!isset($player["magic"][$use])) msg("<p>У вас нет такого заклинания!");
$st="";
for ($i=9;$i<count($magic);$i++) {
$reg=split(":",$magic[$i]);
if (!isset($player["items"][$reg[0]])) {$regsok=0; $st.="<br/>".$reg[2];}
else {$item=split("\|",$player["items"][$reg[0]]); if ($item[1]<$reg[1]) {$regsok=0; if ($st) $st.=", ".$reg[2]; else $st=$reg[2];}}
}
}
if ($regsok) { // мана и реги ок, кастуем
$skills=split("\|",$player["skills"]);
// вероятность кастинга
$cast=10*(($skills[13]+1)*2-$magic[2]);
if ($cast>0) { // пытаемся колдовать
// уменьшаем ману
$player["mana"]-=$magic[1];
// если требовались реги, удаляем их
if (!$scroll) for ($i=9;$i<count($magic);$i++) {
$reg=split(":",$magic[$i]);
$item=split("\|",$player["items"][$reg[0]]);
$item[1]-=1;
if ($item[1]<1) unset($player["items"][$reg[0]]); else $player["items"][$reg[0]]=implode("|",$item);
}
// если кастовали со скролла, удаляем его
if ($scroll && substr($scroll,0,12)=='item.scroll.') {
$item=split("\|",$player["items"][$scroll]);
$item[1]-=1;
if ($item[1]<1) unset($player["items"][$scroll]); else $player["items"][$scroll]=implode("|",$item);
addjournal($login,"Вы потеряли 1 ".$item[0]);
}
// произносим заклинание
addjournalall($player["loc"],$player["title"].": ".$magic[3]);
if (rand(0,100)<=$cast) { // удалось!
// перебираем каждое заклинание и эффект от него
if ($use=='magic.mark') { // Пометить
if (isset($player["items"][$to]) && substr($to,0,15)=='item.recallrune') {
$id="item.recallrune.".$player["loc"];
$loc=split("\|",$locations[$player["loc"]]);
// удаляем пустую руну
$item=split("\|",$player["items"][$to]);
$item[1]-=1;
if ($item[1]<1) unset($player["items"][$to]); else $player["items"][$to]=implode("|",$item);
// добавляем новую руну
if (isset($player["items"][$id])) $item=split("\|",$player["items"][$id]); else $item=split("\|","руна ".$loc[0]."|0|100");
$item[1]+=1;
$player["items"][$id]=implode("|",$item);
addjournal($login,"Руна помечена как ".$loc[0]);
} else addjournal($login,"Заклинание можно использовать только на руну телепортации");
}
if ($use=='magic.recall') { // Возвращение
if (isset($player["items"][$to]) && substr($to,0,15)=='item.recallrune') {
if (substr($to,0,21)!='item.recallrune.empty') {
$go=substr($to,0,16);
$old=split("\|",$locations[$player["loc"]]);
if (isset($locations[$go])) {
$new=split("\|",$locations[$go]);
if (!$old[1] && $new[1]) addjournal($login,"Вы на охраняемой территории");
if ($old[1] && !$new[1]) addjournal($login,"Вы покинули охраняемую территорию");
addjournalall($player["loc"],$player["title"]." исчез ",$login);
$game["loc"][$go][$login]=$game["loc"][$player["loc"]][$login];
unset($game["loc"][$player["loc"]][$login]);
unset($player);
$player=&$game["loc"][$go][$login];
unset($player["attack"]);
$game["players"][$login]=$go;
$player["loc"]=$go;
addjournalall($go,"Появился ".$player["title"],$login);
$page_desc = "1"; // вывести описание локации
}
} else addjournal($login,"Руна не помечена ни в одно место");
} else addjournal($login,"Заклинание можно использовать только на руну телепортации");
}
if ($use=='magic.createfood') { // создать еду
$rnd=rand(0,100);
if ($rnd<=20) {$id="item.food.apple"; $item="яблоко|1|4|2|0|";}
if ($rnd>20 && $rnd<=35) {$id="item.food.cabbage"; $item="капуста|1|10|1|0|";}
if ($rnd>35 && $rnd<=55) {$id="item.food.bread"; $item="хлеб|1|16|6|0|";}
if ($rnd>55 && $rnd<=75) {$id="item.food.sandwich"; $item="бутерброд|1|15|5|0|";}
if ($rnd>75 && $rnd<=85) {$id="item.food.mushroom"; $item="гриб|1|10|2|2|";}
if ($rnd>85 && $rnd<=100) {$id="item.food.sausage"; $item="колбаса|1|20|9|0|";}
// добавляем новый предмет в локацию
if (isset($game["loc"][$player["loc"]][$id])) $item=split("\|",$game["loc"][$player["loc"]][$id]); else $item=split("\|",$item);
$game["loc"][$player["loc"]][$id]=implode("|",$item);
addjournalall($player["loc"],"Появился 1 ".$item[0]);
}
if (substr($use,0,10)=='magic.heal') { // лечить
if (isset($game["loc"][$player["loc"]][$to]) && (substr($to,0,4)=='npc.' || substr($to,0,5)=='user.')) {
$heal=rand($magic[4],$magic[5]); // только не повреждает, а лечит
if ($game["loc"][$player["loc"]][$to]["life"]+$heal>$game["loc"][$player["loc"]][$to]["life_max"]) $heal=$game["loc"][$player["loc"]][$to]["life_max"]-$game["loc"][$player["loc"]][$to]["life"];
$game["loc"][$player["loc"]][$to]["life"]+=$heal;
addjournal($to,"Жизнь +".$heal);
// если лечим крима, сами станомся кримом
$crim=$game["loc"][$player["loc"]][$to]["crim"] || substr($to,0,9)=='npc.crim.';
if ($crim) docrim($login);
}else addjournal($login,"Некого лечить");
}
if ($use=='magic.ressurect') { // воскресить
if (isset($game["loc"][$player["loc"]][$to]) && substr($to,0,5)=='user.' && $game["loc"][$player["loc"]][$to]["ghost"]) {
ressurect($to);
}else addjournal($login,"Воскресить можно только игрока");
}
if ($use=='magic.maddenes') { // безумие
$keys = array_keys($game["loc"][$player["loc"]]);
$id = $keys[rand(0,count($keys)-1)];
if (substr($id,0,5)=='user.' || substr($id,0,4)=='npc.') {
$idto = $keys[rand(0,count($keys)-1)];
if ($id!=$idto && (substr($idto,0,5)=='user.' || substr($idto,0,4)=='npc.')) {
$game["loc"][$player["loc"]][$id]["attack"]=$idto;
attack($player["loc"],$id,$idto);
}else addjournal($login,"Безумие прошло, никого не тронув");
}else addjournal($login,"Безумие никого не тронуло");
}
if ($use=='magic.silence') { // тишина
if ($game["loc"][$player["loc"]]) foreach(array_keys($game["loc"][$player["loc"]]) as $i) if (substr($i,0,4)=='npc.' && $game["loc"][$player["loc"]][$i]["attack"]) {unset($game["loc"][$player["loc"]][$i]["attack"]);}
}
if ($use=='magic.peace') { // успокоить
if (isset($game["loc"][$player["loc"]][$to]) && substr($to,0,4)=='npc.') unset($game["loc"][$player["loc"]][$to]["attack"]);
else addjournal($login,"Заклинание действует только на NPC");
}
if (substr($use,0,11)=='magic.charm') { // зачаровать или привлечь
if (isset($game["loc"][$player["loc"]][$to])) {
$ok=0;
// зачаровать до 5 минут животных animal=1, сопровождают и охраняют
if ($use=='magic.charm' && substr($to,0,7)=='animal.') {$ok=1; $timemin=60; $timemax=5*60; $follow=1;} else addjournal($login,"Заклинание действует только на животных");
// привлечь на свою до 20 сек - 1 минута сторону любого (кроме гардов) атакующего, защищает, но не сопровождает
if ($use=='magic.charm.enemy' && substr($to,0,4)=='npc.' && !substr($to,0,9)=='npc.guard' && $game["loc"][$player["loc"]][$to]["attack"]) {$ok=1; $timemin=20; $timemax=1*60; $follow=0;} else addjournal($login,"Заклинание действует только на дерущихся");
if ($ok) {unset($game["loc"][$player["loc"]][$to]["attack"]); $game["loc"][$player["loc"]][$to]["owner"]=$login; $game["loc"][$player["loc"]][$to]["time_owner"]=time()+rand($timemin,$timemax);if ($follow) $game["loc"][$player["loc"]][$to]["follow"]=$login;$game["loc"][$player["loc"]][$to]["guard"]==$login;}
} addjournal($login,"Нет цели");
}
if (substr($use,0,10)=='magic.all.') { // на всех
// т.к. атакуем магией, то сэмулируем 'war'
// war=hit|damage_min|damage_max|speed|ranged|armor|uklon|parring|shield|magic_uklon|magic_parring|magic_shield|weaponby|exp|need|needtitle
$war="100|".$magic[4]."|".$magic[5]."|".$magic[8]."|0|0|0|0|0|0|0|0|магией|0||";
if ($game["loc"][$player["loc"]]) foreach(array_keys($game["loc"][$player["loc"]]) as $i) if (substr($i,0,5)!='item.') if (!$magic[7] || ($magic[7] && ($game["loc"][$player["loc"]][$i]["crim"] || substr($i,0,9)=='npc.crim.'))) attack($player["loc"],$login,$i,$war);
// наносим и себе урон
if ($use=='magic.all.earthquake') attack($player["loc"],$login,$login,$war);
}
if (substr($use,0,10)=='magic.war.') { // боевые на цель
$war="100|".$magic[4]."|".$magic[5]."|".$magic[8]."|0|0|0|0|0|0|0|0|магией|0||";
if (isset($game["loc"][$player["loc"]][$to]) && substr($to,0,5)!='item.') {
if (!$magic[7] || ($magic[7] && ($game["loc"][$player["loc"]][$to]["crim"] || substr($to,0,9)=='npc.crim.'))) attack($player["loc"],$login,$to,$war);
} else addjournal($login," Заклинание действует только на существ");
}
if (substr($use,0,13)=='magic.summon.') { // призывание
// проверим, чтобы в локации не было более 3 призванных существ, остальных отпустим
$counttmp=0;
if ($game["loc"][$player["loc"]]) foreach (aray_keys($game["loc"][$player["loc"]]) as $i) if ($game["loc"][$player["loc"]][$i]["owner"]==$login) {$counttmp++; if ($counttmp>3) if ($game["loc"][$player["loc"]][$i]["destroyonfree"]) {addjournalall($player["loc"],$game["loc"][$player["loc"]][$i]["title"]." исчез"); addjournal($login,$game["loc"][$player["loc"]][$i]["title"]." покинул вас"); unset($game["loc"][$player["loc"]][$i]);} else {addjournal($login,$game["loc"][$player["loc"]][$i]["title"]." покинул вас"); unset($game["loc"][$player["loc"]][$i]["owner"]);unset($game["loc"][$player["loc"]][$i]["time_owner"]); unset($game["loc"][$player["loc"]][$i]["follow"]); unset($game["loc"][$player["loc"]][$i]["guard"]);}}
if ($use=='magic.summon.wolf') $item=array(
"title"=>"призванный волк",
"life"=>"20",
"life_max"=>"20",
"war"=>"70|4|11|5|0|0|5|0|0|0|0|0|зубами|0||",
);
if ($use=='magic.summon.skeleton') $item=array(
"title"=>"призванный скелет",
"life"=>"30",
"life_max"=>"30",
"war"=>"65|5|12|6|0|0|10|0|0|0|0|0||0||",
);
if ($use=='magic.summon.golem') $item=array(
"title"=>"призванный голем",
"life"=>"50",
"life_max"=>"50",
"war"=>"90|8|14|7|0|5|10|0|0|30|50|4||0||",
);
if ($use=='magic.summon.demon') $item=array(
"title"=>"призванный демон",
"life"=>"80",
"life_max"=>"80",
"war"=>"95|9|18|7|0|3|10|0|0|20|70|8||0||",
);
srand ((float) microtime() * 10000000);
$id=$template.rand(5,9999);
$game["loc"][$player["loc"]][$id] = $item;
$game["loc"][$player["loc"]][$id]["owner"] = $login;
$game["loc"][$player["loc"]][$id]["guard"] = $login;
if ($use!='magic.summon.demon') $game["loc"][$player["loc"]][$id]["follow"] = $login; // демон за вами не следует :-))
else {$game["loc"][$player["loc"]][$id]["crim"]=1;docrim($login);} // демон crim и создавший его становится кримом. если не от кого защищать создавшего, то нападает на игроков, в том числе на создавшего :-)
$game["loc"][$player["loc"]][$id]["time_owner"]=time()+rand(1*60,10*60); // до 10 минут
}
}else addjournal($login,"Заклинание сорвалось");
}else addjournal($login,"Слишком слабый навык магии");
}else addjournal($login,"Не хватает реагентов: ".$st);
}else addjournal($login,"Недостаточно маны");
} else {$list='all';} // нужна цель для этого заклинания