//------------------------------------------------------------------------- /* 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::AddNewKill(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