Path: blob/master/SonicMania/Objects/Helpers/CompetitionSession.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: CompetitionSession Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectCompetitionSession *CompetitionSession = NULL;1011void CompetitionSession_Update(void) {}1213void CompetitionSession_LateUpdate(void) {}1415void CompetitionSession_StaticUpdate(void) {}1617void CompetitionSession_Draw(void) {}1819void CompetitionSession_Create(void *data) {}2021void CompetitionSession_StageLoad(void) {}2223EntityCompetitionSession *CompetitionSession_GetSession(void) { return (EntityCompetitionSession *)globals->competitionSession; }2425#if !MANIA_USE_PLUS26void CompetitionSession_ResetOptions(void)27{28EntityCompetitionSession *session = CompetitionSession_GetSession();2930session->inMatch = false;31session->matchID = 0;32session->matchCount = 0;33session->stageIndex = 0;3435for (int32 r = 0; r < 12; ++r) {36session->completedStages[r] = 0;37session->matchWinner[r] = 0;38}3940for (int32 p = 0; p < 4; ++p) {41session->finishState[p] = FINISHTYPE_NOTFINISHED;42session->playerID[p] = 0;43session->time[p].minutes = 0;44session->time[p].seconds = 0;45session->time[p].milliseconds = 0;46session->rings[p] = 0;47session->score[p] = 0;48session->items[p] = 0;49session->totalRings[p] = 0;50session->wins[p] = 0;51session->lives[p] = 3;52}53}5455void CompetitionSession_ClearMatchData(void)56{57EntityCompetitionSession *session = CompetitionSession_GetSession();5859session->matchWinner[session->matchID] = 0;60for (int32 p = 0; p < PLAYER_COUNT; ++p) {61session->finishState[p] = FINISHTYPE_NOTFINISHED;62session->time[p].minutes = 0;63session->time[p].seconds = 0;64session->time[p].milliseconds = 0;65session->rings[p] = 0;66session->score[p] = 0;67session->items[p] = 0;68session->totalRings[p] = 0;69}70}7172void CompetitionSession_DeriveWinner(int32 playerID, int32 finishType)73{74EntityCompetitionSession *session = CompetitionSession_GetSession();75session->finishState[playerID] = finishType;7677if (finishType == FINISHTYPE_GAMEOVER) {78session->totalRings[playerID] = 0;79session->items[playerID] = 0;80session->rings[playerID] = 0;81session->score[playerID] = 0;82session->time[playerID].minutes = 9;83session->time[playerID].seconds = 59;84session->time[playerID].milliseconds = 59;85}8687int32 deathCount = 0;88bool32 allPlayersFinished = true;89for (int32 p = 0; p < session->playerCount; ++p) {90if (!session->lives[p] || session->finishState[p] == FINISHTYPE_GAMEOVER)91++deathCount;92}9394if (deathCount < session->playerCount - 1) {95for (int32 p = 0; p < session->playerCount; ++p) {96allPlayersFinished = allPlayersFinished && (!session->lives[p] || session->finishState[p]);97}98}99100if (allPlayersFinished) {101if (!session->matchWinner[session->matchID]) {102uint32 winnerTime = 0xFFFFFFFF;103uint32 winnerRings = 0;104uint32 winnerScore = 0;105uint32 winnerItems = 0;106uint32 winnerTotalRings = 0;107108int32 times[PLAYER_COUNT];109for (int32 p = 0; p < session->playerCount; ++p) {110int32 mins = session->time[p].minutes;111int32 secs = session->time[p].seconds;112int32 ms = session->time[p].milliseconds;113times[p] = ms + 100 * (secs + 60 * mins);114115if (session->rings[p] > winnerRings)116winnerRings = session->rings[p];117118if (session->totalRings[p] > winnerTotalRings)119winnerTotalRings = session->totalRings[p];120121if (session->score[p] > winnerScore)122winnerScore = session->score[p];123124if (session->items[p] > winnerItems)125winnerItems = session->items[p];126127if (times[p] < winnerTime)128winnerTime = times[p];129}130131int32 scores[PLAYER_COUNT];132memset(scores, 0, 4 * sizeof(int32));133int32 winner = 0;134for (int32 p = 0; p < session->playerCount; ++p) {135if (session->finishState[p] == FINISHTYPE_PASSEDSIGNPOST) {136int32 score = 0;137138if (session->rings[p] == winnerRings)139score++;140141if (session->totalRings[p] == winnerTotalRings)142++score;143144if (session->score[p] == winnerScore)145++score;146147if (times[p] == winnerTime)148++score;149150if (session->items[p] == winnerItems)151++score;152153LogHelpers_Print("player %d => score %d", p, score);154155scores[p] = score;156if (score > winner)157winner = score;158}159}160161session->matchWinner[session->matchID] = 0;162for (int32 p = 0; p < session->playerCount; ++p) {163bool32 isWinner = session->lives[p] > 0 && session->finishState[p] != FINISHTYPE_GAMEOVER && scores[p] == winner;164if (isWinner) {165LogHelpers_Print("DeriveWinner() -> %d", p);166CompetitionSession_WinMatchFor(p);167}168}169}170}171else {172LogHelpers_Print("DeriveWinner() -> %d", -1);173}174}175176void CompetitionSession_WinMatchFor(int32 player)177{178EntityCompetitionSession *session = CompetitionSession_GetSession();179180LogHelpers_Print("CompetitionSession_WinMatchFor(%d)", player);181++session->wins[player];182session->matchWinner[session->matchID] |= (1 << player);183}184#endif185186#if GAME_INCLUDE_EDITOR187void CompetitionSession_EditorDraw(void) {}188189void CompetitionSession_EditorLoad(void) {}190#endif191192void CompetitionSession_Serialize(void) {}193194195