Skip to content

Commit

Permalink
Various fixes for how we upgrade/repair buildings and units
Browse files Browse the repository at this point in the history
  • Loading branch information
AdamKyle committed Sep 5, 2024
1 parent 325fad0 commit 9ec28f8
Show file tree
Hide file tree
Showing 10 changed files with 234 additions and 46 deletions.
70 changes: 67 additions & 3 deletions app/Game/Kingdoms/Handlers/CapitalCityKingdomLogHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
namespace App\Game\Kingdoms\Handlers;

use App\Flare\Models\CapitalCityBuildingQueue;
use App\Flare\Models\CapitalCityUnitQueue;
use App\Flare\Models\KingdomBuilding;
use App\Flare\Models\KingdomLog;
use App\Flare\Values\KingdomLogStatusValue;
use App\Game\Kingdoms\Events\UpdateCapitalCityBuildingQueueTable;
use App\Game\Kingdoms\Events\UpdateCapitalCityUnitQueueTable;
use App\Game\Kingdoms\Service\UpdateKingdom;
use App\Game\Kingdoms\Values\CapitalCityQueueStatus;

Expand All @@ -22,13 +24,13 @@ public function __construct(private readonly UpdateKingdom $updateKingdom) {}
* @param CapitalCityBuildingQueue $capitalCityBuildingQueue
* @return void
*/
public function possiblyCreateLogForQueue(CapitalCityBuildingQueue $capitalCityBuildingQueue): void
public function possiblyCreateLogForBuildingQueue(CapitalCityBuildingQueue $capitalCityBuildingQueue): void
{
$requestData = $capitalCityBuildingQueue->building_request_data;
$kingdom = $capitalCityBuildingQueue->kingdom;
$character = $capitalCityBuildingQueue->character;

$buildingData = $this->createBuildingDataForLog($requestData);
$buildingData = $this->createBuildingDataForLog($kingdom, $requestData);

if (count($buildingData) === count($requestData)) {
KingdomLog::create([
Expand All @@ -52,13 +54,55 @@ public function possiblyCreateLogForQueue(CapitalCityBuildingQueue $capitalCityB
}
}

public function possiblyCreateLogForUnitQueue(CapitalCityUnitQueue $capitalCityUnitQueue): void
{
$requestData = $capitalCityUnitQueue->unit_request_data;
$kingdom = $capitalCityUnitQueue->kingdom;
$character = $capitalCityUnitQueue->character;

$unitData = $this->createUnitDataForLog($requestData);
dump('possiblyCreateLogForUnitQueue');
dump($unitData, $requestData);
if (count($unitData) === 0 && count($requestData) === 0) {

$capitalCityUnitQueue->delete();

event(new UpdateCapitalCityUnitQueueTable($character));

return;
}

if (count($unitData) === count($requestData)) {

KingdomLog::create([
'character_id' => $character->id,
'from_kingdom_id' => $capitalCityUnitQueue->requested_kingdom,
'to_kingdom_id' => $kingdom->id,
'opened' => false,
'additional_details' => [
'messages' => $capitalCityUnitQueue->messages,
'unit_data' => $unitData,
],
'status' => KingdomLogStatusValue::CAPITAL_CITY_UNIT_REQUEST,
'published' => true,
]);

$this->updateKingdom->updateKingdomLogs($kingdom->character, true);

$capitalCityUnitQueue->delete();

event(new UpdateCapitalCityUnitQueueTable($character));
}
}

/**
* Create building data for the log.
*
* @param Kingdom $kingdom
* @param array $requestData
* @return array
*/
private function createBuildingDataForLog(array $requestData): array {
private function createBuildingDataForLog(Kingdom $kingdom, array $requestData): array {
$buildingData = [];

foreach ($requestData as $data) {
Expand All @@ -81,4 +125,24 @@ private function createBuildingDataForLog(array $requestData): array {

return $buildingData;
}

private function createUnitDataForLog(array $requestData): array {
$unitData = [];

foreach ($requestData as $data) {
if ($data['secondary_status'] === CapitalCityQueueStatus::REJECTED ||
$data['secondary_status'] === CapitalCityQueueStatus::FINISHED ||
$data['secondary_status'] === CapitalCityQueueStatus::CANCELLED
) {

$unitData[] = [
'unit_name' => $data['name'],
'amount_requested' => $data['amount'],
'status' => $data['secondary_status'],
];
}
}

return $unitData;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ private function createLogAndTriggerEvents(CapitalCityBuildingQueue $capitalCity

$capitalCityBuildingQueue = $capitalCityBuildingQueue->refresh();

$this->capitalCityKingdomLogHandler->possiblyCreateLogForQueue($capitalCityBuildingQueue);
$this->capitalCityKingdomLogHandler->possiblyCreateLogForBuildingQueue($capitalCityBuildingQueue);
$this->sendOffEvents($capitalCityBuildingQueue);
}

Expand Down
133 changes: 109 additions & 24 deletions app/Game/Kingdoms/Handlers/CapitalCityProcessUnitRequestHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,29 @@
namespace App\Game\Kingdoms\Handlers;

use App\Flare\Models\CapitalCityResourceRequest;
use App\Flare\Models\UnitInQueue;
use App\Flare\Models\GameBuildingUnit;
use App\Flare\Models\GameUnit;
use App\Flare\Models\KingdomBuilding;
use App\Flare\Models\CapitalCityUnitQueue;
use App\Flare\Models\Character;
use App\Flare\Models\Kingdom;
use App\Flare\Models\KingdomUnit;
use App\Game\Kingdoms\Events\UpdateCapitalCityUnitQueueTable;
use App\Game\Kingdoms\Jobs\CapitalCityResourceRequest as CapitalCityResourceRequestJob;
use App\Game\Kingdoms\Jobs\CapitalCityUnitRequest;
use App\Game\Kingdoms\Service\UnitService;
use App\Game\Kingdoms\Values\CapitalCityResourceRequestType;
use App\Game\Kingdoms\Values\UnitCosts;
use App\Game\Kingdoms\Values\CapitalCityQueueStatus;
use App\Game\Maps\Calculations\DistanceCalculation;
use App\Game\PassiveSkills\Values\PassiveSkillTypeValue;
use Facades\App\Game\Kingdoms\Validation\ResourceValidation;


class CapitalCityProcessUnitRequestHandler {

const MAX_DAYS = 7;

/**
* @var array $messages
*/
Expand All @@ -28,10 +34,12 @@ class CapitalCityProcessUnitRequestHandler {
/**
* @param CapitalCityKingdomLogHandler $capitalCityKingdomLogHandler
* @param DistanceCalculation $distanceCalculation
* @param UnitService $unitService
*/
public function __construct(
private readonly CapitalCityKingdomLogHandler $capitalCityKingdomLogHandler,
private readonly DistanceCalculation $distanceCalculation
private readonly DistanceCalculation $distanceCalculation,
private readonly UnitService $unitService
) {}

/**
Expand All @@ -48,7 +56,9 @@ public function handleUnitRequests(CapitalCityUnitQueue $capitalCityUnitQueue):

$requestData = $this->processUnitRequests($kingdom, $requestData);
$missingResources = $this->calculateMissingResources($requestData);

dump('missing resources');
dump($missingResources);
dump($this->messages);
if (!empty($missingResources)) {
$this->handleResourceRequests($capitalCityUnitQueue, $character, $missingResources, $requestData, $kingdom);
} else {
Expand All @@ -65,15 +75,67 @@ public function handleUnitRequests(CapitalCityUnitQueue $capitalCityUnitQueue):
*/
private function processUnitRequests(Kingdom $kingdom, array $requestData): array
{
dump($requestData);
foreach ($requestData as $index => $unitRequest) {
$unit = $kingdom->units()->where('id', $unitRequest['unit_id'])->first();
$unitRequest = $this->processPotentialResourceRequests($kingdom, $unit, $unitRequest);
$gameUnit = GameUnit::where('name', $unitRequest['name'])->first();
$gameBuildingRelation = GameBuildingUnit::where('game_unit_id', $gameUnit->id)->first();
$building = $kingdom->buildings()->where('game_building_id', $gameBuildingRelation->game_building_id)->first();

dump($unitRequest);

if ($this->isBuildingLocked($building, $kingdom)) {
dump('isBuildingLocked');
$requestData[$index]['secondary_status'] = CapitalCityQueueStatus::REJECTED;

continue;
}

if ($this->isBuildingUnderLeveled($building, $gameBuildingRelation, $kingdom)) {
dump('isBuildingUnderLeveled');
$requestData[$index]['secondary_status'] = CapitalCityQueueStatus::REJECTED;

continue;
}

if ($this->isTimeGreaterThanSevenDays($kingdom->character, $kingdom, $gameUnit, $unitRequest['amount'])) {
dump('isTimeGreaterThanSevenDays');
$requestData[$index]['secondary_status'] = CapitalCityQueueStatus::REJECTED;

continue;
}

dump('Do we ever get here?');

$unitRequest = $this->processPotentialResourceRequests($kingdom, $gameUnit, $unitRequest);

$requestData[$index] = $unitRequest;
}

return $requestData;
}

private function isBuildingLocked(KingdomBuilding $building, Kingdom $kingdom): bool {
if ($building->is_locked) {

$this->messages[] = 'Building is locked in '.$kingdom->name.'. You need to unlock the building: '.$building->name.' first by leveling a passive of the same name to level 1.';

return true;
}

return false;
}

private function isBuildingUnderLeveled(KingdomBuilding $building, GameBuildingUnit $gameBuildingRelation, Kingdom $kingdom): bool {
if ($building->level < $gameBuildingRelation->required_level) {

$this->messages[] = 'Building is under level in '.$kingdom->name.'. You need to level the building: '.$building->name.' to level: '.$gameBuildingRelation->required_level.' first.';

return true;
}

return false;
}

/**
* Process potential resource requests for unit recruitment.
*
Expand All @@ -82,14 +144,16 @@ private function processUnitRequests(Kingdom $kingdom, array $requestData): arra
* @param array $unitRequest
* @return array
*/
private function processPotentialResourceRequests(Kingdom $kingdom, KingdomUnit $unit, array $unitRequest): array
private function processPotentialResourceRequests(Kingdom $kingdom, GameUnit $unit, array $unitRequest): array
{
$missingResources = ResourceValidation::getMissingCosts($unit, $kingdom);

$missingResources = ResourceValidation::getMissingUnitResources($unit, $kingdom, $unitRequest['amount']);
dump('processPotentialResourceRequests', $missingResources);
if (!empty($missingResources)) {
if (!$this->canAffordPopulationCost($kingdom, $missingResources['population'] ?? 0)) {
$this->messages[] = "Unit recruitment for {$unit->name} rejected due to insufficient population.";

$unitRequest['secondary_status'] = CapitalCityQueueStatus::REJECTED;

return $unitRequest;
}

Expand All @@ -98,7 +162,7 @@ private function processPotentialResourceRequests(Kingdom $kingdom, KingdomUnit
} else {
$unitRequest['secondary_status'] = CapitalCityQueueStatus::RECRUITING;
}

dump($unitRequest);
return $unitRequest;
}

Expand Down Expand Up @@ -152,19 +216,23 @@ private function handleResourceRequests(
Kingdom $kingdom
): void {
$resourceProvidingKingdom = $this->findKingdomToProvideResources($character, $missingResources);
$sendResourceRequests = true;

if (is_null($resourceProvidingKingdom)) {
$requestData = $this->markRequestsAsRejected($requestData);

$this->messages[] = 'No kingdom could provide the resources for unit recruitment.';

$sendResourceRequests = false;
}

$this->updateQueue($capitalCityUnitQueue, $requestData);

if (empty($this->messages)) {
if ($sendResourceRequests) {
$this->createResourceRequest($character, $capitalCityUnitQueue, $resourceProvidingKingdom, $kingdom, $missingResources);
}

$this->triggerEvents($capitalCityUnitQueue);
$this->logAndTriggerEvents($capitalCityUnitQueue);
}

/**
Expand All @@ -179,6 +247,8 @@ private function handleNoResourceRequests(CapitalCityUnitQueue $capitalCityUnitQ
if ($this->hasRecruitingUnits($requestData)) {
$this->createUnitRecruitmentRequest($capitalCityUnitQueue->character, $capitalCityUnitQueue, $capitalCityUnitQueue->kingdom, $requestData);
} else {
dump('handleNoResourceRequests');
dump($requestData);
$this->logAndTriggerEvents($capitalCityUnitQueue);
}
}
Expand Down Expand Up @@ -236,7 +306,7 @@ private function findKingdomToProvideResources(Character $character, array $miss
*/
private function logAndTriggerEvents(CapitalCityUnitQueue $capitalCityUnitQueue): void
{
$this->capitalCityKingdomLogHandler->possiblyCreateLogForQueue($capitalCityUnitQueue);
$this->capitalCityKingdomLogHandler->possiblyCreateLogForUnitQueue($capitalCityUnitQueue);
$this->triggerEvents($capitalCityUnitQueue);
}

Expand All @@ -255,24 +325,17 @@ private function triggerEvents(CapitalCityUnitQueue $capitalCityUnitQueue): void
* Create a unit recruitment request.
*
* @param Character $character
* @param CapitalCityUnitQueue $capitalCityUnitQueue
* @param Kingdom $kingdom
* @param array $requestData
* @param GameUnit $gameUnit
* @param int $amount
* @return void
*/
private function createUnitRecruitmentRequest(
Character $character,
CapitalCityUnitQueue $capitalCityUnitQueue,
Kingdom $kingdom,
array $requestData
GameUnit $gameUnit,
int $amount
): void {
$unitQueue = UnitInQueue::create([
'character_id' => $character->id,
'kingdom_id' => $kingdom->id,
'units_in_queue' => $this->prepareUnitsInQueue($requestData),
]);

CapitalCityUnitRequest::dispatch($unitQueue)->onQueue('capital_city_unit');
$timeInSecondsToRecruit = $this->getTimeForRecruitment($character, $gameUnit, $amount);
}

/**
Expand Down Expand Up @@ -367,4 +430,26 @@ private function getTimeToKingdom(Character $character, Kingdom $kingdomAskingFo

return $timeToKingdom;
}

private function getTimeForRecruitment(Character $character, GameUnit $gameUnit, int $amount): int
{
$totalTime = $gameUnit->time_to_recruit * $amount;

return $totalTime - $totalTime * $this->unitService->fetchTimeReduction($character)->unit_time_reduction;
}

private function isTimeGreaterThanSevenDays(Character $character, Kingdom $kingdom, GameUnit $gameUnit, int $amount): bool
{
$timeTillDone = $this->getTimeForRecruitment($character, $gameUnit, $amount);

$timeTillDone = now()->addSeconds($timeTillDone);

if (now()->diffInDays($timeTillDone) > self::MAX_DAYS) {
$this->messages[] = $gameUnit->name.' for kingdom: '.$kingdom->name.' would take longer then 7 (Real World) Days. The kingdom has rejected this recruitment order. If you want this amount of units, you must recruit it from the kingdom it\'s self.';

return true;
}

return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public function handle(
$this->updateQueueData($queueData, $responseData);

event(new UpdateCapitalCityBuildingQueueTable($queueData->character));
$capitalCityBuildingManagement->possiblyCreateLogForQueue($queueData);
$capitalCityBuildingManagement->possiblyCreateLogForBuildingQueue($queueData);

$this->cleanupCancellationRecords();
}
Expand Down
2 changes: 1 addition & 1 deletion app/Game/Kingdoms/Jobs/RebuildBuilding.php
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ public function handle(UpdateKingdom $updateKingdom, CapitalCityBuildingManageme

$capitalCityQueue = $capitalCityQueue->refresh();

$capitalCityBuildingManagement->possiblyCreateLogForQueue($capitalCityQueue);
$capitalCityBuildingManagement->possiblyCreateLogForBuildingQueue($capitalCityQueue);
}
}
}
Loading

0 comments on commit 9ec28f8

Please sign in to comment.