feature/MAPG-203-initial-multiplayer-implementation #5
@ -4,7 +4,6 @@ use MapGuesser\Interfaces\Request\IRequest;
|
|||||||
use MapGuesser\Util\Geo\Position;
|
use MapGuesser\Util\Geo\Position;
|
||||||
use MapGuesser\Response\JsonContent;
|
use MapGuesser\Response\JsonContent;
|
||||||
use MapGuesser\Interfaces\Response\IContent;
|
use MapGuesser\Interfaces\Response\IContent;
|
||||||
use MapGuesser\PersistentData\Model\Place;
|
|
||||||
use MapGuesser\Repository\PlaceRepository;
|
use MapGuesser\Repository\PlaceRepository;
|
||||||
|
|
||||||
class GameFlowController
|
class GameFlowController
|
||||||
@ -22,10 +21,9 @@ class GameFlowController
|
|||||||
$this->placeRepository = new PlaceRepository();
|
$this->placeRepository = new PlaceRepository();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getNewPlace(): IContent
|
public function getInitialData(): IContent
|
||||||
{
|
{
|
||||||
$mapId = (int) $this->request->query('mapId');
|
$mapId = (int) $this->request->query('mapId');
|
||||||
|
|
||||||
$session = $this->request->session();
|
$session = $this->request->session();
|
||||||
|
|
||||||
if (!($state = $session->get('state')) || $state['mapId'] !== $mapId) {
|
if (!($state = $session->get('state')) || $state['mapId'] !== $mapId) {
|
||||||
@ -33,16 +31,15 @@ class GameFlowController
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (count($state['rounds']) === 0) {
|
if (count($state['rounds']) === 0) {
|
||||||
$placesWithoutPano = [];
|
$place = $this->selectNewPlace($state, $mapId);
|
||||||
$place = $this->placeRepository->getRandomForMapWithValidPano($mapId, [], $placesWithoutPano);
|
|
||||||
|
|
||||||
$this->addNewRoundToState($state, $place, $placesWithoutPano);
|
|
||||||
|
|
||||||
$session->set('state', $state);
|
$session->set('state', $state);
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'panoId' => $place->getPanoIdCached(),
|
'place' => [
|
||||||
'pov' => $place->getPov()->toArray()
|
'panoId' => $place->getPanoIdCached(),
|
||||||
|
'pov' => $place->getPov()->toArray()
|
||||||
|
]
|
||||||
];
|
];
|
||||||
} else {
|
} else {
|
||||||
$rounds = count($state['rounds']);
|
$rounds = count($state['rounds']);
|
||||||
@ -61,10 +58,12 @@ class GameFlowController
|
|||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'history' => $history,
|
'history' => $history,
|
||||||
'panoId' => $last['panoId'],
|
'place' => [
|
||||||
'pov' => isset($last['pov']) ? // should be checked not to break with old sessions
|
'panoId' => $last['panoId'],
|
||||||
$last['pov']->toArray() :
|
'pov' => isset($last['pov']) ? // should be checked not to break with old sessions
|
||||||
['heading' => 0.0, 'pitch' => 0.0, 'zoom' => 0.0],
|
$last['pov']->toArray() :
|
||||||
|
['heading' => 0.0, 'pitch' => 0.0, 'zoom' => 0.0]
|
||||||
|
]
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,7 +73,6 @@ class GameFlowController
|
|||||||
public function evaluateGuess(): IContent
|
public function evaluateGuess(): IContent
|
||||||
{
|
{
|
||||||
$mapId = (int) $this->request->query('mapId');
|
$mapId = (int) $this->request->query('mapId');
|
||||||
|
|
||||||
$session = $this->request->session();
|
$session = $this->request->session();
|
||||||
|
|
||||||
if (!($state = $session->get('state')) || $state['mapId'] !== $mapId) {
|
if (!($state = $session->get('state')) || $state['mapId'] !== $mapId) {
|
||||||
@ -94,49 +92,43 @@ class GameFlowController
|
|||||||
$last['score'] = $score;
|
$last['score'] = $score;
|
||||||
$state['rounds'][count($state['rounds']) - 1] = $last;
|
$state['rounds'][count($state['rounds']) - 1] = $last;
|
||||||
|
|
||||||
if (count($state['rounds']) < static::NUMBER_OF_ROUNDS) {
|
$response = [
|
||||||
$exclude = [];
|
|
||||||
|
|
||||||
foreach ($state['rounds'] as $round) {
|
|
||||||
$exclude = array_merge($exclude, $round['placesWithoutPano'], [$round['placeId']]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$placesWithoutPano = [];
|
|
||||||
$place = $this->placeRepository->getRandomForMapWithValidPano($mapId, $exclude, $placesWithoutPano);
|
|
||||||
|
|
||||||
$this->addNewRoundToState($state, $place, $placesWithoutPano);
|
|
||||||
|
|
||||||
$panoId = $place->getPanoIdCached();
|
|
||||||
$pov = $place->getPov()->toArray();
|
|
||||||
} else {
|
|
||||||
$state['rounds'] = [];
|
|
||||||
|
|
||||||
$panoId = null;
|
|
||||||
$pov = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$session->set('state', $state);
|
|
||||||
|
|
||||||
return new JsonContent([
|
|
||||||
'result' => [
|
'result' => [
|
||||||
'position' => $position->toArray(),
|
'position' => $position->toArray(),
|
||||||
'distance' => $distance,
|
'distance' => $distance,
|
||||||
'score' => $score
|
'score' => $score
|
||||||
],
|
]
|
||||||
'panoId' => $panoId,
|
];
|
||||||
'pov' => $pov
|
|
||||||
]);
|
if (count($state['rounds']) < static::NUMBER_OF_ROUNDS) {
|
||||||
|
$place = $this->selectNewPlace($state, $mapId);
|
||||||
|
|
||||||
|
$response['newPlace'] = [
|
||||||
|
'panoId' => $place->getPanoIdCached(),
|
||||||
|
'pov' => $place->getPov()->toArray()
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
$state['rounds'] = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$session->set('state', $state);
|
||||||
|
|
||||||
|
return new JsonContent($response);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function addNewRoundToState(array &$state, Place $place, array $placesWithoutPano): void
|
private function selectNewPlace(array &$state, int $mapId)
|
||||||
{
|
{
|
||||||
|
$exclude = array_column($state['rounds'], 'placeId');
|
||||||
|
$place = $this->placeRepository->getRandomForMapWithValidPano($mapId, $exclude);
|
||||||
|
|
||||||
$state['rounds'][] = [
|
$state['rounds'][] = [
|
||||||
'placesWithoutPano' => $placesWithoutPano,
|
|
||||||
'placeId' => $place->getId(),
|
'placeId' => $place->getId(),
|
||||||
'position' => $place->getPosition(),
|
'position' => $place->getPosition(),
|
||||||
'panoId' => $place->getPanoIdCached(),
|
'panoId' => $place->getPanoIdCached(),
|
||||||
'pov' => $place->getPov()
|
'pov' => $place->getPov()
|
||||||
];
|
];
|
||||||
|
|
||||||
|
return $place;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function calculateDistance(Position $realPosition, Position $guessPosition): float
|
private function calculateDistance(Position $realPosition, Position $guessPosition): float
|
||||||
|
Loading…
Reference in New Issue
Block a user