// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "SurvivalGameMode.generated.h"

/**
 * L'arbitre de la partie. N'existe QUE sur le serveur -- sur un client,
 * GetGameMode() rend nullptr, toujours. Ce n'est pas un bug mais le design du
 * framework : le GameMode decide, le GameState montre.
 *
 * Corollaire a garder en tete pour tout le portage coop : le moindre appel a
 * GetGameMode() ecrit du cote client doit etre remplace par un RPC serveur ou
 * par une lecture du GameState. C'est le cas du respawn, aujourd'hui declenche
 * depuis AFpsPlayerController.
 *
 * Y mettra plus tard : les regles de mort, le cycle jour/nuit, la sauvegarde
 * du monde. Pour l'instant il ne fait que borner le nombre de joueurs et
 * cabler GameState et PlayerState.
 */
UCLASS()
class EMBERWILD_API ASurvivalGameMode : public AGameModeBase
{
	GENERATED_BODY()

public:
	ASurvivalGameMode();

	virtual void InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage) override;
	virtual void PostLogin(APlayerController* NewPlayer) override;
	virtual void Logout(AController* Exiting) override;

protected:
	/**
	 * Plafond de joueurs, applique a la AGameSession.
	 *
	 * Regle ici et pas seulement dans les reglages de session : la session
	 * annonce des places libres, mais c'est le GameMode qui refuse reellement la
	 * connexion. Sans ce plafond, un cinquieme joueur qui arrive par une
	 * invitation directe entre quand meme.
	 *
	 * Sa valeur par defaut est posee dans le constructeur depuis
	 * USessionSubsystem::DefaultMaxPlayers, pour qu'il n'existe qu'UN seul 4
	 * dans le projet : deux nombres qui doivent rester egaux finissent toujours
	 * par diverger, et le symptome serait une place annoncee mais refusee.
	 */
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Coop", meta = (ClampMin = "1", ClampMax = "16"))
	int32 MaxCoopPlayers;
};
