/** 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; }