/** * @param Qg $qg */ public static function reindexQg(Qg $qg) { /** @var Hexa $oldPosition */ if (isset(self::$indexParQg[$qg->getId()])) { $oldPosition = self::$indexParQg[$qg->getId()]; } else { $oldPosition = null; } if (!is_null($oldPosition) && isset(self::$indexParHexa[$oldPosition->getId()][$qg->getId()])) { unset(self::$indexParHexa[$oldPosition->getId()][$qg->getId()]); } if (!$qg->isEfface()) { self::$indexParQg[$qg->getId()] = $qg->getPosition(); if (!isset(self::$indexParHexa[$qg->getPosition()->getId()])) { self::$indexParHexa[$qg->getPosition()->getId()] = new QgCollection(); } if (!isset(self::$indexParHexa[$qg->getPosition()->getId()][$qg->getId()])) { self::$indexParHexa[$qg->getPosition()->getId()][$qg->getId()] = $qg; } } /* * Zones d'interception */ if (in_array($qg->getIdTypeMission(), Missions::missionsInterception())) { foreach ($qg->getPosition()->getCouronnePleine(Missions::$types[Missions::INTERCEPTION]['tailleZone']) as $hexa) { if (!isset(self::$indexIntercepteurs[$hexa->getId()])) { self::$indexIntercepteurs[$hexa->getId()] = new QgCollection(); } self::$indexIntercepteurs[$hexa->getId()]->ajout($qg); } } }
/** * Résoud les déplacements des Qgs et les combats * @return void */ public function resolve() { Log::getInstance()->debug(array('msg' => 'qgsAvantDeplacement', 'qgs' => $this->qgs->debug())); $intercepteurs = new QgCollection(); foreach ($this->qgs as $qg) { $qg->getMission()->beforeDeplacements(); } foreach ($this->qgs->getByMission() as $idTypeMission => $qgs) { if (in_array($idTypeMission, Missions::missionsInterception())) { $intercepteurs = $qgs; } if (!in_array($idTypeMission, Missions::missionsDeplacement())) { continue; } $maxVitesse = $qgs->maxVitesse(true); for ($pas = 1; $pas <= $maxVitesse; $pas++) { Log::getInstance()->debug(array('msg' => 'pas', 'idTypeMission' => $idTypeMission, 'pas' => $pas)); /* * Pas et interceptions */ foreach ($qgs as $qg) { /** @var Qg $qg */ $qg->getMission()->pas($maxVitesse); /* * Zones d'interception */ if ($qg->getMission()->isInterceptable() && IndexPositions::getIntercepteursOnSamePosition($qg)->count()) { foreach (IndexPositions::getIntercepteursOnSamePosition($qg) as $intercepteur) { if ($qg->getJoueur()->isEnnemi($intercepteur->getJoueur())) { /** @var Interception $mission */ $mission = $intercepteur->getMission(); $mission->getCiblesPotentielles()->ajout($qg); } } } } /* * Interceptions (combat) */ $interceptions = new CombatCollection(); foreach ($intercepteurs as $intercepteur) { /** @var Qg $intercepteur */ $mission = $intercepteur->getMission(); /** @var Interception $mission */ $combat = $mission->createCombat(); if (!is_null($combat)) { $interceptions->ajout($combat); } } $interceptions->run(); /* * Combats */ $this->combatsAFaire()->run(); } /* * Stacks à gérer en fin de déplacements */ $recul = true; while ($recul) { $recul = false; foreach (IndexPositions::getStacks() as $stack) { foreach ($stack->qgsQuiDoiventBouger() as $qg) { /** @var Qg $qg */ $qg->getMission()->recul(); } $recul = true; } IndexPositions::reset(); foreach ($this->qgs as $qg) { IndexPositions::reindexQg($qg); } $this->combatsAFaire()->run(); } } foreach ($this->qgs as $qg) { $qg->getMission()->afterDeplacements(); } Log::getInstance()->debug(array('msg' => 'qgsApresDeplacement', 'qgs' => $this->qgs->debug())); }
/** * @return bool */ public function isInterception() { return in_array($this->getQg()->getIdTypeMission(), Missions::missionsInterception()); }