/** Cette fonction transfert les unités en attaque au stock et efface le combat * elle retourne la nouvelle armée pour l'affichage en ajax * @return array new updated Army_owned list */ public function reset_army() { $army_mobile = new Army($this->attacker_id, $this->id); $army_owned = new Army($this->attacker_id); if (count($army_mobile->troops) > 0 && $army_mobile->total_units > 0) { foreach ($army_mobile->troops as $unit_id => $troop) { if ($troop->quantity > 0) { $army_owned->add_troop($unit_id, $troop->quantity); } $troop = new Troop($troop->id); $troop->delete(); } } $this->delete(); return $army_owned->get_troops(); }
/** 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; }
/** * @param \AppBundle\Manager\User $user * @param \AppBundle\Manager\Troop $troop * @return bool */ public function isUserInTroop(User $user, Troop $troop) { if ($this->em->getRepository(Troop::class)->isUserInTroop($user->getId(), $troop->getId())) { return 'joined'; } if ($this->em->getRepository(MembershipRequest::class)->isUserJoiningTroop($user->getId(), $troop->getId())) { return 'requested_membership'; } return 'no'; }
public function createTroopMock(User $user, Troop $troop) { $troop->setId(1); }