示例#1
0
 /** permet de répartir aléatoirement les dégats sur les différentes unités
  * @param $damage int quantité totale de dégats infligés ce tour
  * @return string le résultat de cette escarmouche
  */
 public function split_damage($damage)
 {
     //on range les unités de la plus nombreuse à la moins nombreuse
     $troops = $this->sort_troops_by_quantities($this->troops);
     // on limite à 99% pour éviter les division par 0 si jammais rand = 100
     $percent_left = 99;
     $damage_left = $damage;
     $nb_fleet = count($troops);
     $result = '';
     $i = 0;
     foreach ($troops as $unit_id => $troop) {
         $i++;
         // si on a déjà plus d'unités, on reporte les dommages aux unités suivantes
         if (intval($troop->quantity) <= 0) {
             continue;
         }
         $unit_life = $troop->life * $troop->quantity;
         switch ($i) {
             case $nb_fleet:
                 // la dernière encaise tous les dommages restants
                 $rand = 100;
                 break;
             case 0:
                 //la première encaisse au moins 20%
                 $rand = rand(20, $percent_left);
                 break;
             default:
                 // les autres encaissent entre 1 et le % restant
                 $rand = rand(1, $percent_left);
         }
         // mise à jour des probabilités pour le tour suivant
         $percent_left -= $rand;
         // dégats infligés ce tour çi
         $cur_damage = $damage_left * $rand / 100;
         // calcul du nombre d'unités qui vont mourir
         $losses = round($troop->quantity * $cur_damage / $unit_life);
         // dégats restants
         $damage_left -= $cur_damage;
         // cas particulier si toutes les unités sont détruites (noter que les dégats sont alors gaspillés)
         if ($troop->quantity - $losses <= 0) {
             $losses = $troop->quantity;
             $this->troops[$unit_id]->quantity = 0;
         } else {
             $this->troops[$unit_id]->quantity -= $losses;
         }
         // log
         $result .= $troop->name . ' : ' . $troop->quantity;
         if ($losses > 0) {
             $result .= '(-' . $losses . ')';
         }
         // affiche les pertes
         if ($i != $nb_fleet) {
             $result .= ', ';
         }
         // ajoute une virgule entre les unités
         // suppression des unités dans la base
         $fleet = new Troop($troop->id);
         //todo : j'en étais là, des fois la quantité semble "nulle"
         $fleet->update_value('quantity', $this->troops[$unit_id]->quantity);
         // mise à jour des propriétés
         $this->total_units -= $losses;
         $this->total_damage -= $troop->damage * $losses;
         $this->total_life -= $troop->life * $losses;
     }
     return $result . '<br>Dégats reçu :' . $damage;
 }