278 lines
8.5 KiB
PHP
278 lines
8.5 KiB
PHP
|
<?php
|
|||
|
/***************************************************************************
|
|||
|
* class.combat.php
|
|||
|
* -------------------
|
|||
|
* begin : Samedi 26 janvier 2008
|
|||
|
* email : nemunaire@gmail.com
|
|||
|
*
|
|||
|
*
|
|||
|
***************************************************************************/
|
|||
|
|
|||
|
class Combat {
|
|||
|
var $refflotte = 0;
|
|||
|
var $ATvais = array();
|
|||
|
var $ENvais = array();
|
|||
|
var $ENdef = array();
|
|||
|
var $Ntour = 0;
|
|||
|
var $ATtactique = 0;
|
|||
|
var $ENtactique = 0;
|
|||
|
|
|||
|
/**
|
|||
|
* Constructeur
|
|||
|
* @param array $flotteAT tableau SQL des vaisseaux envoy<EFBFBD>s par l'attaquant
|
|||
|
* @param array $flotteEN tableau SQL de la plan<EFBFBD>te du d<EFBFBD>fenseur
|
|||
|
* @param array $defEN tableau SQL de la plan<EFBFBD>te du d<EFBFBD>fenseur
|
|||
|
*
|
|||
|
* @return void
|
|||
|
* @access public
|
|||
|
*/
|
|||
|
function Combat($flotteAT, $flotteEN, $defEN) {
|
|||
|
include('includes/vars.php');
|
|||
|
//G<>n<EFBFBD>ration des vaisseaux attaquants
|
|||
|
for ($i=1 ; $i<=12 ; $i++) {
|
|||
|
if ($flotteAT['vaisseau'.$i] >= 1) {
|
|||
|
$this->ATvais[] = array($i, $flotteAT['vaisseau'.$i], array(array($nomvais_pv[$i-1], $flotteAT['vaisseau'.$i])), array(array($nomvais_bc[$i-1], $flotteAT['vaisseau'.$i])));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//G<>n<EFBFBD>ration des vaisseaux d<>fenseurs
|
|||
|
for ($i=1 ; $i<=12 ; $i++) {
|
|||
|
if ($flotteEN['vaisseau_'.$i] >= 1) {
|
|||
|
$this->ENvais[] = array($i, $flotteEN['vaisseau_'.$i], array(array($nomvais_pv[$i-1], $flotteEN['vaisseau_'.$i])), array(array($nomvais_bc[$i-1], $flotteEN['vaisseau_'.$i])));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//G<>n<EFBFBD>ration des d<>fenses d<>fenseurs
|
|||
|
for ($i=1 ; $i<=5 ; $i++) {
|
|||
|
if ($defEN['def_'.$i] >= 1) {
|
|||
|
$this->ENdef[] = array($i, $defEN['def_'.$i], array(array($nomvais_pv[$i-1], $defEN['def_'.$i])), array(array($nomvais_bc[$i-1], $defEN['def_'.$i])));
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Change la tactique de l'attaquant
|
|||
|
* @param int $tactique num<EFBFBD>ro de la tactique choisie
|
|||
|
*
|
|||
|
* @return void
|
|||
|
* @access public
|
|||
|
*/
|
|||
|
function changerTactiqueAT($tactique) {
|
|||
|
$this->ATtactique = ceil($tactique);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Change la tactique du d<EFBFBD>fenseur
|
|||
|
* @param int $tactique num<EFBFBD>ro de la tactique choisie
|
|||
|
*
|
|||
|
* @return void
|
|||
|
* @access public
|
|||
|
*/
|
|||
|
function changerTactiqueEN($tactique) {
|
|||
|
$this->ENtactique = ceil($tactique);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* R<EFBFBD>g<EFBFBD>n<EFBFBD>re les boucliers
|
|||
|
* @param int $pourcentage pourcentage de r<EFBFBD>g<EFBFBD>n<EFBFBD>ration
|
|||
|
* @param bool $attaquant r<EFBFBD>g<EFBFBD>n<EFBFBD>re le bouclier de l'attaquant si true, sinon r<EFBFBD>g<EFBFBD>nr<EFBFBD>re celui du d<EFBFBD>fenseur
|
|||
|
* @param bool $retour si true, renvoie true ou false si !le pourcentage a <EFBFBD>t<EFBFBD> consomm<EFBFBD> ou non, si false, retrourne ne nombre de pourcentage restant
|
|||
|
*
|
|||
|
* @return float pourcentage non utilis<EFBFBD>
|
|||
|
* @access public
|
|||
|
*/
|
|||
|
function regenereBC($pourcentage, $attaquant, $retour = false) {
|
|||
|
include('includes/vars.php');
|
|||
|
if ($attaquant) {
|
|||
|
$count = count($this->ATvais);
|
|||
|
$enplus = 0;
|
|||
|
$norm = 0;
|
|||
|
for ($i=0 ; $i<$count ; $i++) {
|
|||
|
$type = $this->ATvais[$i][0]-1;
|
|||
|
$maxbc = $nomvais_bc[$type];
|
|||
|
$ajout = $maxbc*$pourcentage/100;
|
|||
|
$norm += $maxbc * $this->ATvais[$i][1];
|
|||
|
|
|||
|
$cntbc = count($this->ATvais[$i][3]);
|
|||
|
for ($j=0 ; $j<$cntbc ; $j++) {
|
|||
|
if ($this->ATvais[$i][3][$j][0] < $maxbc) {
|
|||
|
$this->ATvais[$i][3][$j][0] += $ajout;
|
|||
|
}
|
|||
|
else $enplus += $ajout * $this->ATvais[$i][3][$j][1];
|
|||
|
if ($this->ATvais[$i][3][$j][0] > $maxbc) {
|
|||
|
$enplus += ($this->ATvais[$i][3][$j][0] - $maxbc)*$this->ATvais[$i][3][$j][1];
|
|||
|
$this->ATvais[$i][3][$j][0] = $maxbc;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if ($retour) {
|
|||
|
if($enplus/$norm == 1) return true;
|
|||
|
else return false;
|
|||
|
}
|
|||
|
else return $enplus/$norm;
|
|||
|
}
|
|||
|
else {
|
|||
|
$count = count($this->ENvais);
|
|||
|
$enplus = 0;
|
|||
|
$norm = 0;
|
|||
|
for ($i=0 ; $i<$count ; $i++) {
|
|||
|
$type = $this->ENvais[$i][0]-1;
|
|||
|
$maxbc = $nomvais_bc[$type];
|
|||
|
$ajout = $maxbc*$pourcentage/100;
|
|||
|
$norm += $maxbc * $this->ENvais[$i][1];
|
|||
|
|
|||
|
$cntbc = count($this->ENvais[$i][3]);
|
|||
|
for ($j=0 ; $j<$cntbc ; $j++) {
|
|||
|
if ($this->ENvais[$i][3][$j][0] < $maxbc) {
|
|||
|
$this->ENvais[$i][3][$j][0] += $ajout;
|
|||
|
}
|
|||
|
else $enplus += $ajout * $this->ENvais[$i][3][$j][1];
|
|||
|
if ($this->ENvais[$i][3][$j][0] > $maxbc) {
|
|||
|
$enplus += ($this->ENvais[$i][3][$j][0] - $maxbc)*$this->ENvais[$i][3][$j][1];
|
|||
|
$this->ENvais[$i][3][$j][0] = $maxbc;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
$return = $enplus/$norm;
|
|||
|
|
|||
|
//D<>fenses
|
|||
|
$count = count($this->ENdef);
|
|||
|
$enplus = 0;
|
|||
|
$norm = 0;
|
|||
|
for ($i=0 ; $i<$count ; $i++) {
|
|||
|
$type = $this->ENdef[$i][0]-1;
|
|||
|
$maxbc = $defense_bc[$type];
|
|||
|
$ajout = $maxbc*$pourcentage/100;
|
|||
|
$norm += $maxbc * $this->ENdef[$i][1];
|
|||
|
|
|||
|
$cntbc = count($this->ENdef[$i][3]);
|
|||
|
for ($j=0 ; $j<$cntbc ; $j++) {
|
|||
|
if ($this->ENdef[$i][3][$j][0] < $maxbc) {
|
|||
|
$this->ENdef[$i][3][$j][0] += $ajout;
|
|||
|
}
|
|||
|
else $enplus += $ajout * $this->ENdef[$i][3][$j][1];
|
|||
|
if ($this->ENdef[$i][3][$j][0] > $maxbc) {
|
|||
|
$enplus += ($this->ENdef[$i][3][$j][0] - $maxbc)*$this->ENdef[$i][3][$j][1];
|
|||
|
$this->ENdef[$i][3][$j][0] = $maxbc;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
$return += $enplus/$norm;
|
|||
|
return $return/2;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Calcul la puissance d'attaque disponible
|
|||
|
* @param int $pourcentage pourcentage de r<EFBFBD>g<EFBFBD>n<EFBFBD>ration
|
|||
|
* @param bool $attaquant calcul les points de l'attaquant si true, sinon calcul pour le d<EFBFBD>fenseur
|
|||
|
*
|
|||
|
* @return int points disponibles
|
|||
|
* @access public
|
|||
|
*/
|
|||
|
function calcAttaque($pourcentage, $attaquant) {
|
|||
|
include('includes/vars.php');
|
|||
|
if ($attaquant) {
|
|||
|
$puissance = 0;
|
|||
|
$count = count($this->ATvais);
|
|||
|
for ($i=0 ; $i<$count ; $i++) {
|
|||
|
$maxat = $nomvais_at[$this->ATvais[$i][0]-1];
|
|||
|
$puissance += $maxat * $pourcentage/100 * $this->ATvais[$i][1];
|
|||
|
}
|
|||
|
return $puissance;
|
|||
|
}
|
|||
|
else {
|
|||
|
$puissance = 0;
|
|||
|
$count = count($this->ENvais);
|
|||
|
for ($i=0 ; $i<$count ; $i++) {
|
|||
|
$maxat = $nomvais_at[$this->ENvais[$i][0]-1];
|
|||
|
$puissance += $maxat * $pourcentage/100 * $this->ENvais[$i][1];
|
|||
|
}
|
|||
|
|
|||
|
//D<>fenses
|
|||
|
$count = count($this->ENdef);
|
|||
|
for ($i=0 ; $i<$count ; $i++) {
|
|||
|
$maxat = $defense_at[$this->ENdef[$i][0]-1];
|
|||
|
$puissance += $maxat * $pourcentage/100 * $this->ENdef[$i][1];
|
|||
|
}
|
|||
|
return $puissance;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Attaque les vaisseaux adverses
|
|||
|
* @param int $points points d'attaque disponible pour l'attaque
|
|||
|
* @param bool $attaquant attaque le d<EFBFBD>fenseur si true, sinon attaque l'attaquant
|
|||
|
*
|
|||
|
* @return void
|
|||
|
* @access public
|
|||
|
*/
|
|||
|
function attaquerVais($points, $attaquant) {
|
|||
|
if ($attaquant) {
|
|||
|
while($points > 0) {
|
|||
|
// Calcul du nombre de vaisseaux et d<>fenses <20> attaquer
|
|||
|
$nbvais = 0;
|
|||
|
$nb = count($this->ENvais);
|
|||
|
for ($i=0 ; $i<$nb ; $i++) {
|
|||
|
$nbvais += $this->ENvais[$i][1];
|
|||
|
}
|
|||
|
$nb = count($this->ENdef);
|
|||
|
for ($i=0 ; $i<$nb ; $i++) {
|
|||
|
$nbvais += $this->ENdef[$i][1];
|
|||
|
}
|
|||
|
|
|||
|
//S'il ne reste plus de vaisseaux et de d<>fenses, on arr<72>te la boucle
|
|||
|
if ($nbvais < 0 || $points < 0) break;
|
|||
|
|
|||
|
//Calcul du nombre de points qui sera enlev<65> par vaisseau ou d<>fense
|
|||
|
$ppv = $points / $nbvais;
|
|||
|
|
|||
|
//On lance l'attaque
|
|||
|
$nb = count($this->ENvais);
|
|||
|
for ($i=0 ; $i<$nb ; $i++) {
|
|||
|
$persage = 0; //Initialisation du nombre de point restant pour attaquer les PV
|
|||
|
$nbpersage = 0; //Initialisation du nombre de vaisseaux affectuer par le persage
|
|||
|
$nbj = count($this->ENvais[$i][3]); //Nombre de vaisseaux dans le groupe
|
|||
|
|
|||
|
//Attaque des boucliers
|
|||
|
for ($j=0 ; $j<$nbj ; $j++) {
|
|||
|
$this->ENvais[$i][3][$j][0] -= $ppv;
|
|||
|
if ($this->ENvais[$i][3][$j][0] <= 0) {
|
|||
|
$persage += abs($this->ENvais[$i][3][$j][0]);
|
|||
|
$nbpersage += $this->ENvais[$i][3][$j][1];
|
|||
|
$this->ENvais[$i][3][$j][0] = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//Attaque des PV
|
|||
|
while($persage > 0) {
|
|||
|
$j = count($this->ENvais[$i][2])-1; //Nombre de vaisseaux dans le groupe
|
|||
|
if ($this->ENvais[$i][2][$j][0] * $this->ENvais[$i][2][$j][1] < $persage * $nbpersage) { //Si il y a suffisament de point de persage pour d<>truire tous les vaisseaux de cette ligne
|
|||
|
//On efface les vaisseaux du nombre total
|
|||
|
$nbvais -= $this->ENvais[$i][2][$j][1];
|
|||
|
$this->ENvais[$i][1] -= $this->ENvais[$i][2][$j][1];
|
|||
|
|
|||
|
//On efface le groupe
|
|||
|
unset($this->ENvais[$i][2][$j]);
|
|||
|
|
|||
|
//S'il ne reste aucun vaisseaux du type, on le supprime
|
|||
|
if ($j == 0 || $this->ENvais[$i][1] == 0) {
|
|||
|
unset($this->ENvais[$i]);
|
|||
|
$persage = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
else { //Attaque vaisseau par vaisseau dans le groupe
|
|||
|
$nbmod = floor(($this->ENvais[$i][2][$j][0] * $this->ENvais[$i][2][$j][1])/($persage * $nbpersage));
|
|||
|
$this->ENvais[$i][1] -= $nbmod;
|
|||
|
$nbvais -= $nbmod;
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
?>
|