//-------------------------------------------------------------------------
/*
Copyright (C) 2010-2019 EDuke32 developers and contributors
Copyright (C) 2019 Nuke.YKT

This file is part of NBlood.

NBlood is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License version 2
as published by the Free Software Foundation.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/
//-------------------------------------------------------------------------

#include "ns.h"	// Must come before everything else!

#include "build.h"
#include "v_draw.h"
#include "statistics.h"
#include "gstrings.h"
#include "gamestate.h"
#include "raze_sound.h"
#include "d_net.h"
#include "screenjob.h"
#include "blood.h"

BEGIN_BLD_NS


void GameInterface::LevelCompleted(MapRecord* map, int skill)
{
	// Save the player state before taking down anything.
	for (int i = connecthead; i >= 0; i = connectpoint2[i])
	{
		if (gPlayer[i].actor)
		{
			memcpy(&gPlayerTemp[i], &gPlayer[i], sizeof(PLAYER));
			gHealthTemp[i] = gPlayer[i].actor->xspr.health;
		}
	}

	EndLevel();
	Mus_Stop();

	SummaryInfo info{};

	info.kills = gKillMgr.Kills;
	info.maxkills = gKillMgr.TotalKills;
	info.secrets = gSecretMgr.Founds;
	info.maxsecrets = gSecretMgr.Total;
	info.supersecrets = gSecretMgr.Super;
	info.endofgame = map == nullptr;

	ShowIntermission(currentLevel, map, &info, [=](bool)
		{
			soundEngine->StopAllChannels();
			gameaction = map ? ga_nextlevel : ga_creditsmenu;
		});
}


void CKillMgr::SetCount(int nCount)
{
	TotalKills = nCount;
}

void CKillMgr::AddKill(DBloodActor* actor)
{
	if (actor->spr.statnum == kStatDude && actor->spr.type != kDudeBat && actor->spr.type != kDudeRat && actor->spr.type != kDudeInnocent && actor->spr.type != kDudeBurningInnocent)
		Kills++;
}

void CKillMgr::CountTotalKills(void)
{
	TotalKills = 0;
	BloodStatIterator it(kStatDude);
	while (auto actor = it.Next())
	{
		if (actor->spr.type < kDudeBase || actor->spr.type >= kDudeMax)
			I_Error("Non-enemy sprite (%d) in the enemy sprite list.", actor->GetIndex());
		if (actor->spr.statnum == kStatDude && actor->spr.type != kDudeBat && actor->spr.type != kDudeRat && actor->spr.type != kDudeInnocent && actor->spr.type != kDudeBurningInnocent)
			TotalKills++;
	}
}

void CKillMgr::Clear(void)
{
	TotalKills = Kills = 0;
}

void CSecretMgr::SetCount(int nCount)
{
	Total = nCount;
}

void CSecretMgr::Found(int nType)
{
	if (nType == 0) Founds++;
	else if (nType < 0) {
		viewSetSystemMessage("Invalid secret type %d triggered.", nType);
		return;
	}
	else Super++;
}

void CSecretMgr::Clear(void)
{
	Total = Founds = Super = 0;
}

void SerializeGameStats(FSerializer& arc)
{
	if (arc.BeginObject("gamestats"))
	{
		arc("secrets", gSecretMgr.Total)
			("secretsfound", gSecretMgr.Founds)
			("super", gSecretMgr.Super)
			("totalkills", gKillMgr.TotalKills)
			("kills", gKillMgr.Kills)
			.EndObject();
	}
}


CSecretMgr gSecretMgr;
CKillMgr gKillMgr;

END_BLD_NS
