FrankProjects/UltimateWarfare

View on GitHub
src/Service/BattleEngine/BattleUpdaterService.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

declare(strict_types=1);

namespace FrankProjects\UltimateWarfare\Service\BattleEngine;

use FrankProjects\UltimateWarfare\Entity\Fleet;
use FrankProjects\UltimateWarfare\Entity\FleetUnit;
use FrankProjects\UltimateWarfare\Entity\WorldRegionUnit;
use FrankProjects\UltimateWarfare\Repository\FleetRepository;
use FrankProjects\UltimateWarfare\Repository\FleetUnitRepository;
use FrankProjects\UltimateWarfare\Repository\WorldRegionRepository;
use FrankProjects\UltimateWarfare\Repository\WorldRegionUnitRepository;

final class BattleUpdaterService
{
    private FleetRepository $fleetRepository;
    private FleetUnitRepository $fleetUnitRepository;
    private WorldRegionRepository $worldRegionRepository;
    private WorldRegionUnitRepository $worldRegionUnitRepository;

    public function __construct(
        FleetRepository $fleetRepository,
        FleetUnitRepository $fleetUnitRepository,
        WorldRegionRepository $worldRegionRepository,
        WorldRegionUnitRepository $worldRegionUnitRepository
    ) {
        $this->fleetRepository = $fleetRepository;
        $this->fleetUnitRepository = $fleetUnitRepository;
        $this->worldRegionRepository = $worldRegionRepository;
        $this->worldRegionUnitRepository = $worldRegionUnitRepository;
    }

    /**
     * XXX TODO: Set player notifications
     *
     * @param Fleet $fleet
     * @param array<int, FleetUnit> $attackerGameUnits
     */
    public function updateBattleWon(Fleet $fleet, array $attackerGameUnits): void
    {
        $targetWorldRegion = $fleet->getTargetWorldRegion();
        $targetWorldRegion->setPlayer($fleet->getPlayer());
        $this->worldRegionRepository->save($targetWorldRegion);

        foreach ($targetWorldRegion->getWorldRegionUnits() as $regionUnit) {
            $this->worldRegionUnitRepository->remove($regionUnit);
        }

        foreach ($attackerGameUnits as $fleetUnit) {
            $worldRegionUnit = WorldRegionUnit::create(
                $targetWorldRegion,
                $fleetUnit->getGameUnit(),
                $fleetUnit->getAmount()
            );
            $this->worldRegionUnitRepository->save($worldRegionUnit);
        }
        $this->fleetRepository->remove($fleet);
    }

    /**
     * XXX TODO: Improve code
     * XXX TODO: Set player notifications
     *
     * @param Fleet $fleet
     * @param array<int, FleetUnit> $attackerGameUnits
     * @param array<int, WorldRegionUnit> $defenderGameUnits
     */
    public function updateBattleLost(Fleet $fleet, array $attackerGameUnits, array $defenderGameUnits): void
    {
        foreach ($fleet->getTargetWorldRegion()->getWorldRegionUnits() as $regionUnit) {
            $this->worldRegionUnitRepository->remove($regionUnit);
        }
        foreach ($defenderGameUnits as $worldRegionUnit) {
            $this->worldRegionUnitRepository->save($worldRegionUnit);
        }
        foreach ($fleet->getFleetUnits() as $fleetUnit) {
            $this->fleetUnitRepository->remove($fleetUnit);
        }
        foreach ($attackerGameUnits as $fleetUnit) {
            $this->fleetUnitRepository->save($fleetUnit);
        }
    }
}