- // playercard.cpp 
-   
- #include "common.h" 
-   
-   
- void PlayerCards_Init (void) 
- { 
-    // this function resets the player cards array, preparing it for a new use 
-   
-    playercards = NULL; // reset the array pointer 
-    playercard_count = 0; // and set the element count to zero 
-   
-    return; // that's all there is 
- } 
-   
-   
- void PlayerCards_Shutdown (void) 
- { 
-    // this function empties the player cards array, closing windows and freeing allocated resources 
-   
-    int playercard_index; 
-   
-    // for each player card we know... 
-    for (playercard_index = 0; playercard_index < playercard_count; playercard_index++) 
-    { 
-       if (IsWindow (playercards[playercard_index].hWnd)) 
-          DestroyWindow (playercards[playercard_index].hWnd); // close any eventual player card window 
-       SAFE_free ((void **) &playercards[playercard_index].fingertext); // free the player card's finger text buffer 
-       playercards[playercard_index].fingertext_length = 0; // and reset this buffer's size 
-    } 
-    SAFE_free ((void **) &playercards); // free the player cards array 
-    playercard_count = 0; // and reset the player cards count 
-   
-    return; // finished 
- } 
-   
-   
- playercard_t *PlayerCard_FindOrCreate (const wchar_t *nickname) 
- { 
-    // this function returns the index in the player cards array of the player card whose nickname is specified, 
-    // creating a new slot for him if he can't be found. 
-   
-    playercard_t *playercard; 
-    int playercard_index; 
-    player_t *local_player; 
-   
-    // see if we are already displaying this player card, loop through all of them... 
-    for (playercard_index = 0; playercard_index < playercard_count; playercard_index++) 
-       if (playercards[playercard_index].is_active && (_wcsicmp (nickname, playercards[playercard_index].nickname) == 0)) 
-          break; // break as soon as we find it 
-   
-    // have we NOT found it ? 
-    if (playercard_index == playercard_count) 
-    { 
-       // no exact match found ; loop again to see if we have a similar name in the empty cards 
-       for (playercard_index = 0; playercard_index < playercard_count; playercard_index++) 
-          if (playercards[playercard_index].is_active && !playercards[playercard_index].got_reply 
-              && (_wcsnicmp (nickname, playercards[playercard_index].nickname, wcslen (playercards[playercard_index].nickname)) == 0)) 
-             break; // break as soon as we find it 
-    } 
-   
-    // have we STILL NOT found it ? 
-    if (playercard_index == playercard_count) 
-    { 
-       // we haven't found it, so add a new player card in our array. See if there's a free slot first... 
-       for (playercard_index = 0; playercard_index < playercard_count; playercard_index++) 
-          if (!playercards[playercard_index].is_active) 
-             break; // break as soon as we find one 
-   
-       // have we NOT found one ? if so, resize our player cards array and add this playercard in it 
-       if (playercard_index == playercard_count) 
-       { 
-          playercards = (playercard_t *) SAFE_realloc (playercards, playercard_count, playercard_count + 1, sizeof (playercard_t), false); 
-          playercard_count++; // we know now one player card more 
-       } 
-   
-       // get a quick access to playercard. Only do it after the realloc, as the array may have moved. 
-       playercard = &playercards[playercard_index]; 
-   
-       // find local player and see whether this player card is ours 
-       local_player = Player_FindByType (PLAYER_HUMAN); 
-   
-       // reset some values for this new player card 
-       playercard->is_active = true; 
-       playercard->is_own = ((local_player != NULL) && (_wcsicmp (nickname, local_player->name) == 0)); 
-       wcscpy_s (playercard->nickname, WCHAR_SIZEOF (playercard->nickname), nickname); // save nickname 
-       playercard->got_reply = false; 
-       playercard->doesnt_exist = false; 
-       playercard->hWnd = NULL; 
-       playercard->fingertext = NULL; // no finger text yet 
-       playercard->fingertext_length = 0; 
-       playercard->gamestyleratings = NULL; // no game style ratings yet 
-       playercard->gamestylerating_count = 0; 
-       playercard->minutes_online = 0; 
-       playercard->seconds_idle = 0; 
-       playercard->disconnection_day = 0; 
-       playercard->disconnection_month = 0; 
-       playercard->disconnection_year = 0; 
-       playercard->game_played = 0; 
-       playercard->game_name[0] = 0; 
-   
-       // and fire up the new player card dialog box 
-       DialogBox_PlayerCard (playercard_index); 
-    } 
-   
-    // else we've found it 
-    else 
-    { 
-       // get a quick access to player card 
-       playercard = &playercards[playercard_index]; 
-   
-       // does the player card window exist AND is it currently NOT the foreground window ? 
-       if (IsWindow (playercard->hWnd) && (GetForegroundWindow () != playercard->hWnd)) 
-       { 
-          ShowWindow (playercard->hWnd, SW_RESTORE); // restore it from the taskbar 
-          SetForegroundWindow (playercard->hWnd); // bring the window to front if necessary 
-       } 
-    } 
-   
-    return (playercard); // return pointer to player card 
- } 
-   
-   
- void PlayerCard_AppendPersonalData (playercard_t *playercard, const wchar_t *text) 
- { 
-    // helper function to quickly add an entry to an player card's personal data window 
-   
-    static const wchar_t *format_string = L"%s\r\n"; 
-    static const int extra_length = 2; 
-   
-    int text_length; 
-   
-    // get text length 
-    text_length = wcslen (text); 
-   
-    // resize the personal data text buffer 
-    playercard->fingertext = (wchar_t *) SAFE_realloc (playercard->fingertext, 
-                                                       playercard->fingertext_length, 
-                                                       playercard->fingertext_length + text_length + extra_length + 1, 
-                                                       sizeof (wchar_t), false); 
-   
-    // append the message to the personal data text and save the new text length 
-    swprintf_s (&playercard->fingertext[playercard->fingertext_length], 
-                text_length + extra_length + 1, // +1 for null terminator 
-                format_string, text); 
-    playercard->fingertext_length += text_length + extra_length; // save new string length 
-   
-    return; // finished 
- } 
-