Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .github/workflows/sync-upstream.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Sync Upstream

on:
schedule:
- cron: '0 0 * * *' # Viene eseguito ogni giorno a mezzanotte
workflow_dispatch: # Ti permette di lanciarlo anche a mano dai tasti di GitHub

jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Checkout target repo
uses: actions/checkout@v3
with:
ref: main # O il nome del tuo branch principale (es. master)

- name: Sync upstream changes
id: sync
uses: a2vu/sync-upstream-repo@v1.1.0
with:
upstream_repo: https://github.com/lanedirt/OGameX.git
upstream_branch: main
target_branch: main # Il tuo branch
force: false # Metti true solo se vuoi sovrascrivere tutto (rischioso!)
1 change: 1 addition & 0 deletions app/Enums/DarkMatterTransactionType.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ enum DarkMatterTransactionType: string
case SPEEDUP = 'speedup';
case ADMIN_ADJUSTMENT = 'admin_adjustment';
case HALVING = 'halving';
case OFFICER_PURCHASE = 'officer_purchase';
}
19 changes: 15 additions & 4 deletions app/GameMissions/EspionageMission.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
use OGame\Models\Resources;
use OGame\Services\CounterEspionageService;
use OGame\Services\DebrisFieldService;
use OGame\Services\OfficerService;
use OGame\Services\PlanetService;
use OGame\Services\PlayerService;
use RuntimeException;
Expand Down Expand Up @@ -107,8 +108,13 @@ protected function processArrival(FleetMission $mission): void
// Calculate counter-espionage chance
$counterEspionageService = resolve(CounterEspionageService::class);
$attackerProbeCount = $mission->espionage_probe;
$attackerEspionageLevel = $originPlayer->getResearchLevel('espionage_technology');
$defenderEspionageLevel = $targetPlayer->getResearchLevel('espionage_technology');
$officerService = app(OfficerService::class);
$attackerEspionageLevel = $originPlayer->getResearchLevel('espionage_technology')
+ $officerService->getAdditionalEspionageLevels($originPlayer->getUser())
+ $officerService->getCommandingStaffEspionageLevels($originPlayer->getUser());
$defenderEspionageLevel = $targetPlayer->getResearchLevel('espionage_technology')
+ $officerService->getAdditionalEspionageLevels($targetPlayer->getUser())
+ $officerService->getCommandingStaffEspionageLevels($targetPlayer->getUser());

// TODO: Include ACS Defend fleets in counter-espionage chance calculation
// Currently only counts planet owner's ships via getDefenderShipCount()
Expand Down Expand Up @@ -487,8 +493,13 @@ private function createEspionageReport(FleetMission $mission, PlanetService $ori
}

// TODO: Validate this does not cause issues when probing slot 16
$attackerEspionageLevel = $originPlayer->getResearchLevel('espionage_technology');
$defenderEspionageLevel = $targetPlayer->getResearchLevel('espionage_technology');
$officerServiceReport = app(OfficerService::class);
$attackerEspionageLevel = $originPlayer->getResearchLevel('espionage_technology')
+ $officerServiceReport->getAdditionalEspionageLevels($originPlayer->getUser())
+ $officerServiceReport->getCommandingStaffEspionageLevels($originPlayer->getUser());
$defenderEspionageLevel = $targetPlayer->getResearchLevel('espionage_technology')
+ $officerServiceReport->getAdditionalEspionageLevels($targetPlayer->getUser())
+ $officerServiceReport->getCommandingStaffEspionageLevels($targetPlayer->getUser());
$techDifference = $defenderEspionageLevel - $attackerEspionageLevel;
$levelDifference = max(0, $techDifference);
$extraProbesRequired = pow($levelDifference, 2);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ public function addBuildRequest(Request $request, PlayerService $player): JsonRe

return response()->json([
'status' => 'success',
'message' => 'Building construction started.',
'message' => __('t_ingame.buildings.building_started'),
]);
}

Expand Down
36 changes: 36 additions & 0 deletions app/Http/Controllers/Admin/DeveloperShortcutsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use OGame\Services\DebrisFieldService;
use OGame\Services\ObjectService;
use OGame\Services\PlayerService;
use OGame\Services\OfficerService;
use OGame\Services\SettingsService;

class DeveloperShortcutsController extends OGameController
Expand Down Expand Up @@ -454,4 +455,39 @@ public function impersonate(Request $request): RedirectResponse
return redirect()->route('overview.index')
->with('success', __('Now impersonating :username', ['username' => $targetUser->username]));
}

/**
* Activate an officer for a player from the developer shortcuts page.
*/
public function activateOfficer(Request $request, OfficerService $officerService): RedirectResponse
{
$validOfficerKeys = array_values(OfficerService::TYPE_MAP);
$validOfficerKeys[] = 'all_officers';

$validated = $request->validate([
'username' => ['required', 'string'],
'officer_key' => ['required', 'string', 'in:' . implode(',', $validOfficerKeys)],
'days' => ['required', 'integer', 'in:' . implode(',', OfficerService::DURATIONS)],
]);

$user = User::where('username', $validated['username'])->first();
if (!$user) {
return redirect()->back()->with('error', 'Player "' . $validated['username'] . '" not found.');
}

$officer = $officerService->getOfficer($user);

if ($validated['officer_key'] === 'all_officers') {
foreach (array_values(OfficerService::TYPE_MAP) as $key) {
$officer->activate($key, (int)$validated['days']);
}
} else {
$officer->activate($validated['officer_key'], (int)$validated['days']);
}

$officer->save();
$officerService->clearCache($user);

return redirect()->back()->with('success', 'Officer "' . $validated['officer_key'] . '" activated for ' . $validated['days'] . ' days for player "' . $validated['username'] . '".');
}
}
2 changes: 1 addition & 1 deletion app/Http/Controllers/FleetEventsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -499,7 +499,7 @@ public function fetchEventList(PlayerService $player, FleetMissionService $fleet
$summaryRow->time_departure = $initiator->time_departure;
$summaryRow->is_return_trip = false;
$summaryRow->is_recallable = false;
$summaryRow->friendly_status = $initiator->friendly_status ?? 'friendly';
$summaryRow->friendly_status = $initiator->friendly_status;

$summaryRow->destination_planet_name = $initiator->destination_planet_name;
$summaryRow->destination_planet_coords = $initiator->destination_planet_coords;
Expand Down
40 changes: 20 additions & 20 deletions app/Http/Controllers/GalaxyController.php
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ private function createDebrisFieldArray(DebrisFieldService $debrisField): array
'availableMissions' => [
[
'missionType' => 8,
'name' => 'Harvest',
'name' => __('t_ingame.fleet.mission_recycle'),
],
],
'requiredShips' => $debrisField->calculateRequiredRecyclers(),
Expand Down Expand Up @@ -293,7 +293,7 @@ private function getAvailableMissions(int $galaxy, int $system, int $position, P
$availableMissions[] = [
'missionType' => 3,
'link' => route('fleet.index', ['galaxy' => $galaxy, 'system' => $system, 'position' => $position, 'type' => $planet->getPlanetType()->value, 'mission' => 3]),
'name' => __('Transport'),
'name' => __('t_ingame.fleet.mission_transport'),
];

$targetPlayer = $planet->getPlayer();
Expand All @@ -313,14 +313,14 @@ private function getAvailableMissions(int $galaxy, int $system, int $position, P
'reportId' => '',
'reportLink' => '',
'link' => route('fleet.dispatch.sendfleet', ['galaxy' => $galaxy, 'system' => $system, 'position' => $position, 'type' => $planet->getPlanetType()->value, 'mission' => 6, 'am210' => 1]),
'name' => __('Espionage'),
'name' => __('t_ingame.fleet.mission_espionage'),
];

// Attack (only if foreign planet and not Legor).
$availableMissions[] = [
'missionType' => 1,
'link' => route('fleet.index', ['galaxy' => $galaxy, 'system' => $system, 'position' => $position, 'type' => $planet->getPlanetType()->value, 'mission' => 1]),
'name' => __('Attack'),
'name' => __('t_ingame.fleet.mission_attack'),
];
}

Expand All @@ -335,7 +335,7 @@ private function getAvailableMissions(int $galaxy, int $system, int $position, P
$availableMissions[] = [
'missionType' => 5,
'link' => route('fleet.index', ['galaxy' => $galaxy, 'system' => $system, 'position' => $position, 'type' => $planet->getPlanetType()->value, 'mission' => 5]),
'name' => __('ACS Defend'),
'name' => __('t_ingame.fleet.mission_acs_defend'),
];
}

Expand All @@ -344,15 +344,15 @@ private function getAvailableMissions(int $galaxy, int $system, int $position, P
$availableMissions[] = [
'missionType' => 10,
'link' => route('fleet.index', ['galaxy' => $galaxy, 'system' => $system, 'position' => $position, 'type' => $planet->getPlanetType()->value, 'mission' => 10]),
'name' => __('Moon destruction'),
'name' => __('t_ingame.fleet.mission_destroy_moon'),
];
}
} else {
// Deployment (only if own planet).
$availableMissions[] = [
'missionType' => 4,
'link' => route('fleet.index', ['galaxy' => $galaxy, 'system' => $system, 'position' => $position, 'type' => $planet->getPlanetType()->value, 'mission' => 4]),
'name' => __('Deployment'),
'name' => __('t_ingame.fleet.mission_deploy'),
];
}

Expand Down Expand Up @@ -406,7 +406,7 @@ private function getPlanetActions(PlanetService $planet, int $galaxy, int $syste
if ($has_deuterium) {
$can_phalanx = true;
} else {
$phalanx_inactive_reason = 'Not enough deuterium to use phalanx';
$phalanx_inactive_reason = __('t_ingame.galaxy.phalanx_no_deut');
}
}
}
Expand Down Expand Up @@ -452,7 +452,7 @@ private function getPlanetActions(PlanetService $planet, int $galaxy, int $syste
'phalanxInactiveReason' => $phalanx_inactive_reason,
'canSendProbes' => $canEspionage,
'canWrite' => false,
'discoveryUnlocked' => 'You haven\'t unlocked the research to discover new lifeforms yet.\n',
'discoveryUnlocked' => __('t_galaxy.discovery.locked'),
'missileAttackLink' => $missileAttackLink,
];
}
Expand Down Expand Up @@ -512,7 +512,7 @@ private function getPlayerInfo(PlayerService $player): array
'highscoreLink' => route('highscore.index', ['category' => 2, 'page' => $highscorePage]),
'highscoreTitle' => (string)$highscoreRank,
'infoPageLink' => route('alliance.index'),
'infoPageTitle' => __('Alliance Page'),
'infoPageTitle' => __('t_ingame.galaxy.alliance_page'),
// Alliance class not implemented yet
'allianceClassName' => null,
'allianceClassCss' => null,
Expand All @@ -521,7 +521,7 @@ private function getPlayerInfo(PlayerService $player): array
? route('alliance.index', ['alliance_id' => $alliance->id])
: null,
'applicationTitle' => (!$this->playerService->getUser()->alliance_id && $alliance->is_open)
? __('Apply')
? __('t_ingame.galaxy.apply')
: null,
];
}
Expand Down Expand Up @@ -550,19 +550,19 @@ private function getPlayerInfo(PlayerService $player): array
'available' => $isTargetAdmin,
'playerId' => $player->getId(),
'link' => 'javascript:void(0);', // TODO: Implement proper support contact link when messaging system is ready
'title' => 'Contact support',
'title' => __('t_ingame.galaxy.contact_support'),
'playerName' => $player->getUsername(),
],
'highscore' => [
'available' => $playerRank !== null,
'rank' => $playerRank,
'title' => 'Ranking',
'title' => __('t_ingame.galaxy.ranking'),
'link' => route('highscore.index', ['category' => 1, 'page' => $highscorePage]),
],
'message' => [
'available' => $isForeignPlayer && !$isTargetAdmin,
'disabledChatBar' => false,
'title' => __('Write message'),
'title' => __('t_ingame.highscore.write_message'),
'link' => 'javascript:void(0);',
'playerId' => $player->getId(),
],
Expand Down Expand Up @@ -613,7 +613,7 @@ private function createEmptySpaceRow(int $galaxy, int $system, int $position): a
'moveAction' => 'prepareMove',
'moveLink' => route('planetMove.move'),
'galaxyLink' => route('galaxy.index', ['galaxy' => $galaxy, 'system' => $system]),
'title' => 'Relocate'
'title' => __('t_ingame.galaxy.relocate_title')
],
[
'missionType' => 7,
Expand All @@ -629,10 +629,10 @@ private function createEmptySpaceRow(int $galaxy, int $system, int $position): a
'planets' => [],
'player' => [
'playerId' => 99999,
'playerName' => 'Deep space'
'playerName' => __('t_ingame.fleet.deep_space')
],
'playerId' => 99999,
'playerName' => 'Deep space',
'playerName' => __('t_ingame.fleet.deep_space'),
'position' => $position,
'positionFilters' => 'empty_filter',
'system' => $system
Expand Down Expand Up @@ -668,10 +668,10 @@ private function createExpeditionDebrisRow(int $galaxy, int $system, int $positi
'planets' => $debrisFieldObject,
'player' => [
'playerId' => 99999,
'playerName' => 'Deep space'
'playerName' => __('t_ingame.fleet.deep_space')
],
'playerId' => 99999,
'playerName' => 'Deep space',
'playerName' => __('t_ingame.fleet.deep_space'),
'position' => $position,
'positionFilters' => 'expedition_debris',
'system' => $system
Expand All @@ -695,7 +695,7 @@ public function ajax(Request $request, PlayerService $player, PlanetServiceFacto
if ($player->isInVacationMode()) {
return response()->json([
'success' => false,
'error' => __('You cannot use the galaxy view whilst in vacation mode!'),
'error' => __('t_ingame.galaxy.vacation_error'),
], 403);
}

Expand Down
Loading
Loading