// challenge.cpp
#include "common.h"
void Challenges_Init (void)
{
// this function resets the challenges array, preparing it for a new use
challenges = NULL; // reset the array pointer
challenge_count = 0; // and set the element count to zero
return; // that's all there is
}
void Challenges_Shutdown (void)
{
// this function empties the challenges array, closing windows and freeing allocated resources
int challenge_index;
// for each challenge we know...
for (challenge_index = 0; challenge_index < challenge_count; challenge_index++)
if (IsWindow (challenges[challenge_index].hWnd))
EndDialog (challenges[challenge_index].hWnd, 0); // close any eventual opened challenge window
SAFE_free ((void **) &challenges); // free the challenges array
challenge_count = 0; // and reset the challenges count
return; // finished
}
challenge_t *Challenge_FindOrCreate (const wchar_t *nickname)
{
// this function returns a pointer to the interlocutor whose nickname is specified,
// creating a new slot for him in the interlocutors array if he can't be found.
challenge_t *challenge;
int challenge_index;
// see if we are already displaying this challenge, loop through all of them...
for (challenge_index = 0; challenge_index < challenge_count; challenge_index++)
if (challenges[challenge_index].is_active && (_wcsicmp (nickname, challenges[challenge_index].challenger) == 0))
break; // break as soon as we find it
// have we NOT found it ?
if (challenge_index == challenge_count)
{
// we haven't found it, so add a new challenge in our array. See if there's a free slot first...
for (challenge_index = 0; challenge_index < challenge_count; challenge_index++)
if (!challenges[challenge_index].is_active)
break; // break as soon as we find one
// have we NOT found one ? if so, resize our challenges array and add this challenge in it
if (challenge_index == challenge_count)
{
challenges = (challenge_t *) SAFE_realloc (challenges, challenge_count, challenge_count + 1, sizeof (challenge_t), false);
challenge_count++; // we know now one challenge more
}
// get a quick access to challenge. Only do it after the realloc, as the array may have moved.
challenge = &challenges[challenge_index];
// reset some values for this new challenge
memset (challenge, 0, sizeof (challenge_t));
challenge->is_active = true;
wcscpy_s (challenge->challenger, WCHAR_SIZEOF (challenge->challenger), nickname); // save nickname
// and fire up the new challenge dialog box
DialogBox_Challenge (challenge_index);
}
// else we've found it
else
{
// get a quick access to challenge
challenge = &challenges[challenge_index];
// does the challenge window exist AND is it currently NOT the foreground window ?
if (IsWindow (challenge->hWnd) && (GetForegroundWindow () != challenge->hWnd))
{
ShowWindow (challenge->hWnd, SW_RESTORE); // restore it from the taskbar
SetForegroundWindow (challenge->hWnd); // bring the window to front if necessary
}
}
return (challenge); // return index of challenge
}
challenge_t *Challenge_Find (const wchar_t *nickname)
{
// this function returns a pointer to the interlocutor whose nickname is specified
int challenge_index;
// see if we are already displaying this challenge, loop through all of them...
for (challenge_index = 0; challenge_index < challenge_count; challenge_index++)
if (challenges[challenge_index].is_active && (_wcsicmp (nickname, challenges[challenge_index].challenger) == 0))
return (&challenges[challenge_index]); // found it, return a pointer to it
return (NULL); // we couldn't find this challenge, return NULL
}
void Challenge_UpdateData (challenge_t *challenge, challenge_t *new_challenge)
{
// helper function to quickly copy the game data of a new challenge structure into another
// update challenge data
challenge->challenger_level = new_challenge->challenger_level;
challenge->color = new_challenge->color;
challenge->is_rated = new_challenge->is_rated;
wcscpy_s (challenge->game_type, WCHAR_SIZEOF (challenge->game_type), new_challenge->game_type);
challenge->initial_time = new_challenge->initial_time;
challenge->increment = new_challenge->increment;
// and tell our challenge window there's a new message to display
challenge->update_dialog = true;
return; // finished
}