/**
 *	Base for a standard Shootmania game mode
 */
#Extends "Modes/ModeMatchmaking2.Script.txt"

#RequireContext CSmMode

#Const MB_SM_Version			"2017-01-31"
#Const MB_SM_ScriptName	"Modes/ShootMania/ModeBase2.Script.txt"

// ---------------------------------- //
// Libraries
// ---------------------------------- //
#Include "Libs/Nadeo/ShootMania/UI2.Script.txt" as UI
#Include "Libs/Nadeo/ShootMania/SM3.Script.txt" as SM
#Include "Libs/Nadeo/ShootMania/Objects.Script.txt" as Objects
#Include "Libs/Nadeo/ShootMania/Events.Script.txt" as Events
#Include "Libs/Nadeo/ShootMania/Scores.Script.txt" as Scores
#Include "Libs/Nadeo/ShootMania/SpawnScreen.Script.txt" as SpawnScreen
#Include "Libs/Nadeo/ShootMania/Attributes.Script.txt" as Attributes

// ---------------------------------- //
// Settings
// ---------------------------------- //

// ---------------------------------- //
// Constants
// ---------------------------------- //
#Const C_DefaultHudModulePath "Nadeo/ShootMania/Default/Hud.Module.Gbx"

// ---------------------------------- //
// Globales
// ---------------------------------- //
declare Boolean MB_Settings_UseDefaultTimer;
declare Boolean MB_Settings_UseDefaultScores;
declare Boolean MB_Settings_UseDefaultClansScoresUI;
declare Boolean MB_Settings_UseDefaultSpawnScreen;
declare Boolean MB_Settings_UseDefaultBaseIllumination;
declare Boolean MB_Settings_UseDefaultSounds;
declare Boolean MB_Settings_UseDefaultObjects;

// ---------------------------------- //
// Extends
// ---------------------------------- //
***MB_Private_LogVersions***
***
Log::RegisterScript(MB_SM_ScriptName, MB_SM_Version);
Log::RegisterScript(Events::GetScriptName(), Events::GetScriptVersion());
Log::RegisterScript(Objects::GetScriptName(), Objects::GetScriptVersion());
Log::RegisterScript(Scores::GetScriptName(), Scores::GetScriptVersion());
Log::RegisterScript(SM::GetScriptName(), SM::GetScriptVersion());
Log::RegisterScript(SpawnScreen::GetScriptName(), SpawnScreen::GetScriptVersion());
Log::RegisterScript(UI::GetScriptName(), UI::GetScriptVersion());
***

***MB_Private_Settings***
***
MB_Settings_UseDefaultTimer = True;
MB_Settings_UseDefaultScores = True;
MB_Settings_UseDefaultClansScoresUI = True;
MB_Settings_UseDefaultSpawnScreen = True;
MB_Settings_UseDefaultBaseIllumination = True;
MB_Settings_UseDefaultSounds = True;
MB_Settings_UseDefaultObjects = True;
***

***MB_Private_LoadLibraries***
***
Attributes::Load();
Events::Load();
Objects::Load();
SM::Load();
Scores::Load();
SpawnScreen::Load();
UI::Load();
***

***MB_Private_UnloadLibraries***
***
Events::Unload();
Objects::Unload();
SM::Unload();
Scores::Unload();
SpawnScreen::Unload();
UI::Unload();
Attributes::Unload();
***

***MB_Private_AfterLoadHud***
***
if (MB_Settings_UseDefaultHud) {
	if (Hud != Null && Hud.ScoresTable != Null) {
		Hud.ScoresTable.Scores_Sort(CModulePlaygroundScoresTable::EScoreSortOrder::SMPoints);
	}
}
***

***MB_Private_Yield***
***
Events::Yield();
Objects::Yield();
Scores::Yield();
UI::Yield();
***

***MB_Private_StartServer***
***
if (MB_Settings_UseDefaultObjects) {
	Objects::SetAutoPickUp(True);
}

// ---------------------------------- //
// Spawn screen
+++MB_Private_BeforeSpawnScreen+++
if (MB_Settings_UseDefaultSpawnScreen) {
	UIManager.UIAll.ScreenIn3dHideScoreSummary = True;
	SpawnScreen::SetModeName(ModeInfo::GetName());
	SpawnScreen::CreateMapInfo();
	SpawnScreen::CreateScores();
	SpawnScreen::ResetRulesSection();
	SpawnScreen::AddSubsection(_("Type"), ModeInfo::GetType(), 0.);
	SpawnScreen::AddSubsection(_("Objectives"), ModeInfo::GetRules(), 20.);
	+++MB_Private_SpawnScreen+++
	SpawnScreen::CreatePrettyRules(ModeInfo::GetName());
} else {
	+++MB_Private_SpawnScreen+++
}
+++MB_Private_AfterSpawnScreen+++

SM::SetupDefaultVisibility();
***

***MB_Private_StartMatch***
***
if (MB_Settings_UseDefaultScores) {
	Scores::StartMatch();
}
***

***MB_Private_AfterLoadMap***
***
if (MB_Settings_UseDefaultObjects) {
	Objects::CreateAnchorsObjects();
	Objects::SpawnAnchorsObjects();
}
***

***MB_Private_StartMap***
***
if (MB_Settings_UseDefaultClansScoresUI) {
	Scores::EnableClansScoresUI(UseClans);
}

if (MB_Settings_UseDefaultScores) {
	Scores::StartMap();
}

if (MB_Settings_UseDefaultBaseIllumination) {
	foreach (Base in MapBases) {
		Base.Clan = 0;
		Base.IsActive = True;
	}
}
***

***MB_Private_StartRound***
***
if (MB_Settings_UseDefaultScores) {
	Scores::StartRound();
}
***

***MB_Private_StartTurn***
***			
if (MB_Settings_UseDefaultTimer) {
	StartTime = Now;
}
***

***MB_Private_StartPlayLoop***
***
if (MB_Settings_UseDefaultSounds) {
	UIManager.UIAll.SendNotice("", CUIConfig::ENoticeLevel::MatchInfo, Null, CUIConfig::EAvatarVariant::Default, CUIConfig::EUISound::StartRound, 0);
}
***

***MB_Private_EndTurn***
***
if (MB_Settings_UseDefaultTimer) {
	StartTime = -1;
}
***

***MB_Private_AfterEndRound***
***
if (MB_Settings_UseDefaultScores) {
	Scores::EndRound();
}

Scores::XmlRpc_SendScores(Scores::Section_EndRound(), "");
***

***MB_Private_EndMap***
***
if (MB_Settings_UseDefaultClansScoresUI) {
	Scores::EnableClansScoresUI(False);
}
***

***MB_Private_AfterEndMap***
***
if (MB_Settings_UseDefaultScores) {
	Scores::EndMap();
}

Scores::XmlRpc_SendScores(Scores::Section_EndMap(), "");
***

***MB_Private_BeforeCloseLadder***
***
if (MB_Settings_UseDefaultScores) {
	Scores::ComputeLadder(Scores::Sort_MapPoints(), Scores::Order_Descending());
}
***

***MB_Private_BeforePodiumSequence***
***
if (MB_Settings_UseDefaultPodiumSequence && !MB_Private_SkipPodiumSequence) {
	UIManager.UIAll.BigMessageSound = CUIConfig::EUISound::EndRound;
	UIManager.UIAll.BigMessageSoundVariant = 0;
	
	declare MB_Private_Message = _("|Match|Draw");
	if (UseClans) {
		declare MB_Private_TeamId = Scores::GetClanWinner() - 1;
		if (Teams.existskey(MB_Private_TeamId)) {
			if (!MB_MatchIsRunning()) MB_Private_Message = MM_TL::Compose(_("$<%1$> wins the match!"), Teams[MB_Private_TeamId].ColorizedName);
			else MB_Private_Message = MM_TL::Compose(_("$<%1$> wins the map!"), Teams[MB_Private_TeamId].ColorizedName);
		}
	} else {
		declare MB_Private_Score <=> Scores::GetPlayerWinner();
		if (MB_Private_Score != Null) {
			if (!MB_MatchIsRunning()) MB_Private_Message = MM_TL::Compose(_("$<%1$> wins the match!"), MB_Private_Score.User.Name);
			else MB_Private_Message = MM_TL::Compose(_("$<%1$> wins the map!"), MB_Private_Score.User.Name);
		}
	}
	
	UIManager.UIAll.BigMessage = MB_Private_Message;
}
***

***MB_Private_AfterPodiumSequence***
***
if (MB_Settings_UseDefaultPodiumSequence && !MB_Private_SkipPodiumSequence) {
	UIManager.UIAll.BigMessage = "";
}
***

***MB_Private_BeforeUnloadMap***
***
if (MB_Settings_UseDefaultObjects) {
	Objects::DestroyAnchorsObjects();
}
***

***MB_Private_AfterEndMatch***
***
if (MB_Settings_UseDefaultScores) {
	Scores::EndMatch();
}

Scores::XmlRpc_SendScores(Scores::Section_EndMatch(), "");
***

Void MB_Private_Empty() {}