// version du 04/07/2004
// zones : type (m=maritime,p=province), nombre de garnisons, défense, points d'action
$lesZones[0] = array("p",1,3,4);$lesZones[1] = array("p",0,0,0);$lesZones[2] = array("p",0,0,0);$lesZones[3] = array("p",1,0,0);$lesZones[4] = array("p",0,0,0);$lesZones[5] = array("p",1,0,0);$lesZones[6] = array("p",1,2,0);$lesZones[7] = array("p",0,0,0);$lesZones[8] = array("p",1,1,1);$lesZones[9] = array("p",1,2,1);..... et ainsi de suite
// zones maritimes
for ($z=60;$z<=75;$z++){$lesZones[$z] = array("m",0,0,0);}
// noms des zones
$nomZones=array("ANCYREE","Arabie déserte",... et ainsi de suite jusqu'au "Golfe Persique");
// noms des provinces jouées
$nomProvincesJouees=array("ANCYREE","CHALDEE","EGYPTE","MACEDOINE");
// zones de début
$lesZonesDebut = explode("!",$row_leTour['zones']);
// unites : attaque, défense
$laValeurUnite[0] = array(1,1); // mercenaire
$laValeurUnite[1] = array(2,1); // elite
$laValeurUnite[2] = array(3,2); // garde
// unites : type
$typeUnites = array("unité de Mercenaires","unité d'Elite","unité de Garde");
// initialisation des points d'action et du compte de provinces possédées
$pointsAction = array(0,0,0,0);
$compteProvinces = array(0,0,0,0);
// initialisation adversaires dans les zones avec valeur de combat
for ($z=0;$z<count($lesZones);$z++){
$lesValeursParZone[$z] = array(0,0,0,0);
$lesUnitesParZone[$z] = array(array(),array(),array(),array());
$occupantZone[$z] = ($z<count($lesZonesDebut)) ? $lesZonesDebut[$z]-2 : -1 ; // -1 pour la mer et les provinces inoccupées
}
// constitution des tableaux pour traiter les unites et fabrication des rapport d'ordres pour le mail de fin de tour
$cptUnite = 0;
$rapport =" RESUME DES ORDRES PASSES AU TOUR ".utf8_decode($_POST['tour'])." : \r\n";
for($j=0;$j<4;$j++){
$actionEffectuee= false;
$unitesDebut = explode("!",$row_leTour['unitesDebut'.$j]);
$unitesFin = explode("!",$row_leTour['unitesFin'.$j]);
$rapport .= "\r\n ".$nomProvincesJouees[$j]." : \r\n";
for($u=0;$u<count($unitesFin);$u+=4){
// joueur, type, x,y,zone,detruite
$lesUnites[$cptUnite] = array("j"=>$j,"t"=>$unitesFin[$u],"x"=>$unitesFin[$u+1],"y"=>$unitesFin[$u+2],"z"=>$unitesFin[$u+3],"d"=>false);
// affectation de l'unité à la zone
$lesUnitesParZone[$unitesFin[$u+3]][$j][count($lesUnitesParZone[$unitesFin[$u+3]][$j])] = $cptUnite;
// incrementation de la valeur par zone (si joueur occupant : valeur defensive, sinon valeur attaque
$lesValeursParZone[$unitesFin[$u+3]][$j]+= ($j==$occupantZone[$unitesFin[$u+3]]) ? $laValeurUnite[$unitesFin[$u]][1] : $laValeurUnite[$unitesFin[$u]][0] ;
// compteur
$cptUnite++;
// fabrication du rapport
if(isset($unitesDebut[$u])){ // l'unité existait déjà
if($unitesFin[$u]!=$unitesDebut[$u]){ // promotion
$rapport.= " - ".$typeUnites[$unitesDebut[$u]]." promue en ".$typeUnites[$unitesFin[$u]].", en ".$nomZones[$unitesFin[$u+3]]."\r\n";
if(!$actionEffectuee){$actionEffectuee=true;}
}
else {
if($unitesFin[$u+3]!=$unitesDebut[$u+3]){ // déplacement
$rapport.= " - ".$typeUnites[$unitesDebut[$u]]." déplacée de ".$nomZones[$unitesDebut[$u+3]]." vers ".$nomZones[$unitesFin[$u+3]]."\r\n";
if(!$actionEffectuee){$actionEffectuee=true;}
}
}
}
else{ // nouvelle unité
$rapport.= " - ".$typeUnites[0]." recrutée en ".$nomZones[$unitesFin[$u+3]]."\r\n";
if(!$actionEffectuee){$actionEffectuee=true;}
}
}
if(!$actionEffectuee){$rapport.=" - aucun ordre n'a été passé\r\n";}
}
// parcours et traitement des zones
for ($z=0;$z<count($lesZones);$z++){
// resolution des combats
if(array_sum($lesValeursParZone[$z])>0){ // premier test rapide pour éviter des tests inutiles
if($lesZones[$z][0]=="p" && $occupantZone[$z]>=0){
if($lesValeursParZone[$z][$occupantZone[$z]]>0){ // occupant présent dans la zone, on ajoute le bonus défensif, au cas où
$lesValeursParZone[$z][$occupantZone[$z]]+=$lesZones[$z][2];
}
}
$valeurMaxi = max($lesValeursParZone[$z]); // valeur maximum (vainqueur, donc)
// recherche du nombre de valeurs au maxi, pour départage en cas d'égalité
$listeVainqueurs = array();
for($j=0;$j<4;$j++){
if($lesValeursParZone[$z][$j]==$valeurMaxi){$listeVainqueurs[count($listeVainqueurs)]=$j;}
}
if(count($listeVainqueurs)>1){
// necessite un tirage au sort
$jVainqueur=$listeVainqueurs[mt_rand(0,count($listeVainqueurs)-1)];
}
else {
$jVainqueur=$listeVainqueurs[0];
}
// on tient le vainqueur qui devient le nouvel occupant, si la province n'est pas maritime
if($lesZones[$z][0]=="p"){$occupantZone[$z]=$jVainqueur;}
// les unités des perdants doivent être placées en destruction et on met à zéro les valeurs de combats
for($j=0;$j<4;$j++){
if($j!=$jVainqueur){
$lesValeursParZone[$z][$j]=0;
for($u=0;$u<count($lesUnitesParZone[$z][$j]);$u++){
$lesUnites[$lesUnitesParZone[$z][$j][$u]]["d"]=true;
}
}
}
}
// menage dans la zone : destruction des unites en trop
for($j=0;$j<4;$j++){
if($lesValeursParZone[$z][$j]>0){ // on traite les unités en trop
$maxiAccueil = 1 + $lesZones[$z][1];
$unitesEnTrop = count($lesUnitesParZone[$z][$j])-$maxiAccueil;
if($unitesEnTrop>0){
// il faut dégager la différence : c'est balèze à faire ! Fait chier !!! Il est dejà 02:12 !
// fabrique d'un tableau avec les types d'unites correspondant au numero dans la zone
for($u=0;$u<count($lesUnitesParZone[$z][$j]);$u++){
$tableauTypes[$u] = $lesUnites[$lesUnitesParZone[$z][$j][$u]]["t"];
}
// trie en parallèle les 2 tableaux sur le type croissant
array_multisort($tableauTypes, $lesUnitesParZone[$z][$j]);
// on place les premières unités en trop en destruction
for($u=0;$u<$unitesEnTrop;$u++){
$lesUnites[$lesUnitesParZone[$z][$j][$u]]["d"]=true;
}
// 02:27 !!! si ça marche au premier test, je suis bon !
// ça marche !!!
// Chiotte ! :-(
// Finalement, au bout de 4 mois un bug à ce niveau a été détecté, toujours irrésolu...
}
}
}
// compte des points d'action et des provinces occupées
if($lesZones[$z][0]=="p" && $occupantZone[$z]>=0){
$pointsAction[$occupantZone[$z]]+=$lesZones[$z][3];
$compteProvinces[$occupantZone[$z]]++;
}
// construction du tableau des nouvelles zones pour les couleurs de la carte
if($lesZones[$z][0]=="p"){
$lesNouvellesZones[$z]=$occupantZone[$z]+2;
}
}
// construction des unites pour chaque joueur
$lesUnitesParJoueur=array(array(),array(),array(),array());
for ($u=0;$u<count($lesUnites);$u++){
if(!$lesUnites[$u]["d"]){
// l'unité n'est pas détruite, on l'affecte au joueur
$lesUnitesParJoueur[$lesUnites[$u]["j"]][count($lesUnitesParJoueur[$lesUnites[$u]["j"]])]=$lesUnites[$u]["t"]."!".$lesUnites[$u]["x"]."!".$lesUnites[$u]["y"]."!".$lesUnites[$u]["z"];
}
}
// contruction des données pour l'enregistrement du nouveau tour
$zones = implode("!",$lesNouvellesZones);
$unitesDebut0 = implode("!",$lesUnitesParJoueur[0]);// ANC
$unitesDebut1 = implode("!",$lesUnitesParJoueur[1]);// CHD
$unitesDebut2 = implode("!",$lesUnitesParJoueur[2]);// EGY
$unitesDebut3 = implode("!",$lesUnitesParJoueur[3]);// MAC
$unitesFin0 = $unitesDebut0;
$unitesFin1 = $unitesDebut1;
$unitesFin2 = $unitesDebut2;
$unitesFin3 = $unitesDebut3;
$pa0 = $pointsAction[0];
$pa1 = $pointsAction[1];
$pa2 = $pointsAction[2];
$pa3 = $pointsAction[3];
$pr0 = $compteProvinces[0];
$pr1 = $compteProvinces[1];
$pr2 = $compteProvinces[2];
$pr3 = $compteProvinces[3];