/* ===================================== LeaderboardLocal_Init ===================================== */ void LeaderboardLocal_Init() { const idList< mpMap_t > maps = common->GetMapList(); const char** gameModes = NULL; const char** gameModesDisplay = NULL; int numModes = game->GetMPGameModes( &gameModes, &gameModesDisplay ); // Iterate through all the available maps, and generate leaderboard Defs, and IDs for each. for( int mapIdx = 0; mapIdx < maps.Num(); mapIdx++ ) { for( int modeIdx = 0; modeIdx < numModes; modeIdx++ ) { // Check the supported modes on the map. if( maps[ mapIdx ].supportedModes & BIT( modeIdx ) ) { const columnGameMode_t gamemode = gameMode_columnDefs[ modeIdx ]; // Generate a Leaderboard ID for the map/mode int boardID = LeaderboardLocal_GetID( mapIdx, modeIdx ); // Create and Register the leaderboard with the sys_stats registered Leaderboards leaderboardDefinition_t* newLeaderboardDef = Sys_CreateLeaderboardDef( boardID, gamemode.numColumns, gamemode.columnDef, gamemode.rankOrder, gamemode.supportsAttachments, gamemode.checkAgainstCurrent ); #ifndef USE_STEAM_API // Set the leaderboard name. const char* mapname = idLocalization::GetString( maps[ mapIdx ].mapName ); newLeaderboardDef->boardName.Format( "%s %s", mapname, gamemode.abrevName ); #endif // sanity check. if( Sys_FindLeaderboardDef( boardID ) != newLeaderboardDef ) { idLib::Error( "Leaderboards_Init leaderboard creation failed" ); } } } } }
/* ======================== idMenuScreen_Shell_Leaderboards::Initialize ======================== */ void idMenuScreen_Shell_Leaderboards::Initialize( idMenuHandler * data ) { idMenuScreen::Initialize( data ); if ( data != NULL ) { menuGUI = data->GetGUI(); } lbCache = new idLBCache(); lbCache->Reset(); SetSpritePath( "menuLeaderboards" ); options = new (TAG_SWF) idMenuWidget_DynamicList(); options->SetNumVisibleOptions( NUM_LEADERBOARD_ITEMS ); options->SetSpritePath( GetSpritePath(), "info", "options" ); options->SetWrappingAllowed( true ); while ( options->GetChildren().Num() < NUM_LEADERBOARD_ITEMS ) { idMenuWidget_Button * const buttonWidget = new (TAG_SWF) idMenuWidget_Button(); buttonWidget->AddEventAction( WIDGET_EVENT_PRESS ).Set( WIDGET_ACTION_PRESS_FOCUSED, options->GetChildren().Num() ); buttonWidget->Initialize( data ); options->AddChild( buttonWidget ); } options->Initialize( data ); AddChild( options ); btnBack = new (TAG_SWF) idMenuWidget_Button(); btnBack->Initialize( data ); btnBack->SetLabel( "#str_swf_party_lobby" ); btnBack->SetSpritePath( GetSpritePath(), "info", "btnBack" ); btnBack->AddEventAction( WIDGET_EVENT_PRESS ).Set( WIDGET_ACTION_GO_BACK ); AddChild( btnBack ); btnNext = new (TAG_SWF) idMenuWidget_Button(); btnNext->Initialize( data ); btnNext->SetLabel( "#str_swf_next" ); btnNext->SetSpritePath( GetSpritePath(), "info", "btnNext" ); btnNext->AddEventAction( WIDGET_EVENT_PRESS ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_TAB_NEXT, WIDGET_EVENT_TAB_NEXT ) ); AddChild( btnNext ); btnPrev = new (TAG_SWF) idMenuWidget_Button(); btnPrev->Initialize( data ); btnPrev->SetLabel( "#str_swf_prev" ); btnPrev->SetSpritePath( GetSpritePath(), "info", "btnPrevious" ); btnPrev->AddEventAction( WIDGET_EVENT_PRESS ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_TAB_PREV, WIDGET_EVENT_TAB_PREV ) ); AddChild( btnPrev ); btnPageDwn = new (TAG_SWF) idMenuWidget_Button(); btnPageDwn->Initialize( data ); btnPageDwn->SetLabel( "#str_swf_next_page" ); btnPageDwn->SetSpritePath( GetSpritePath(), "info", "btnPageDwn" ); idSWFParmList parms; parms.Append( MAX_STAT_LISTINGS - 1 ); btnPageDwn->AddEventAction( WIDGET_EVENT_PRESS ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_SCROLL_PAGE_DOWN_START_REPEATER, WIDGET_EVENT_SCROLL_PAGEDWN ) ); btnPageDwn->AddEventAction( WIDGET_EVENT_RELEASE ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_STOP_REPEATER, WIDGET_EVENT_SCROLL_PAGEDWN_RELEASE ) ); AddChild( btnPageDwn ); btnPageUp = new (TAG_SWF) idMenuWidget_Button(); btnPageUp->Initialize( data ); btnPageUp->SetLabel( "#str_swf_prev_page" ); btnPageUp->SetSpritePath( GetSpritePath(), "info", "btnPageUp" ); parms.Clear(); parms.Append( MAX_STAT_LISTINGS - 1 ); btnPageUp->AddEventAction( WIDGET_EVENT_PRESS ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_SCROLL_PAGE_UP_START_REPEATER, WIDGET_EVENT_SCROLL_PAGEUP ) ); btnPageUp->AddEventAction( WIDGET_EVENT_RELEASE ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_STOP_REPEATER, WIDGET_EVENT_SCROLL_PAGEUP_RELEASE ) ); AddChild( btnPageUp ); AddEventAction( WIDGET_EVENT_SCROLL_DOWN_LSTICK ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_SCROLL_DOWN_START_REPEATER_VARIABLE, WIDGET_EVENT_SCROLL_DOWN_LSTICK ) ); AddEventAction( WIDGET_EVENT_SCROLL_UP_LSTICK ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_SCROLL_UP_START_REPEATER_VARIABLE, WIDGET_EVENT_SCROLL_UP_LSTICK ) ); AddEventAction( WIDGET_EVENT_SCROLL_DOWN_LSTICK_RELEASE ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_STOP_REPEATER, WIDGET_EVENT_SCROLL_DOWN_LSTICK_RELEASE ) ); AddEventAction( WIDGET_EVENT_SCROLL_UP_LSTICK_RELEASE ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_STOP_REPEATER, WIDGET_EVENT_SCROLL_UP_LSTICK_RELEASE ) ); AddEventAction( WIDGET_EVENT_SCROLL_DOWN ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_SCROLL_DOWN_START_REPEATER_VARIABLE, WIDGET_EVENT_SCROLL_DOWN ) ); AddEventAction( WIDGET_EVENT_SCROLL_UP ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_SCROLL_UP_START_REPEATER_VARIABLE, WIDGET_EVENT_SCROLL_UP ) ); AddEventAction( WIDGET_EVENT_SCROLL_DOWN_RELEASE ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_STOP_REPEATER, WIDGET_EVENT_SCROLL_DOWN_RELEASE ) ); AddEventAction( WIDGET_EVENT_SCROLL_UP_RELEASE ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_STOP_REPEATER, WIDGET_EVENT_SCROLL_UP_RELEASE ) ); AddEventAction( WIDGET_EVENT_SCROLL_PAGEDWN ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_SCROLL_PAGE_DOWN_START_REPEATER, WIDGET_EVENT_SCROLL_PAGEDWN ) ); AddEventAction( WIDGET_EVENT_SCROLL_PAGEUP ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_SCROLL_PAGE_UP_START_REPEATER, WIDGET_EVENT_SCROLL_PAGEUP ) ); AddEventAction( WIDGET_EVENT_SCROLL_PAGEDWN_RELEASE ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_STOP_REPEATER, WIDGET_EVENT_SCROLL_PAGEDWN_RELEASE ) ); AddEventAction( WIDGET_EVENT_SCROLL_PAGEUP_RELEASE ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_STOP_REPEATER, WIDGET_EVENT_SCROLL_PAGEUP_RELEASE ) ); AddEventAction( WIDGET_EVENT_TAB_NEXT ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_TAB_NEXT, WIDGET_EVENT_TAB_NEXT ) ); AddEventAction( WIDGET_EVENT_TAB_PREV ).Set( new (TAG_SWF) idWidgetActionHandler( this, WIDGET_ACTION_EVENT_TAB_PREV, WIDGET_EVENT_TAB_PREV ) ); leaderboards.Clear(); const idList< mpMap_t > maps = common->GetMapList(); const char ** gameModes = NULL; const char ** gameModesDisplay = NULL; int numModes = game->GetMPGameModes( &gameModes, &gameModesDisplay ); for ( int mapIndex = 0; mapIndex < maps.Num(); ++mapIndex ) { for ( int modeIndex = 0; modeIndex < numModes; ++modeIndex ) { // Check the supported modes on the map. if( maps[ mapIndex ].supportedModes & BIT( modeIndex ) ) { int boardID = LeaderboardLocal_GetID( mapIndex, modeIndex ); const leaderboardDefinition_t * lbDef = Sys_FindLeaderboardDef( boardID ); if ( lbDef != NULL ) { doomLeaderboard_t lb = doomLeaderboard_t( lbDef, lbDef->boardName ); leaderboards.Append( lb ); } } } } }
void LeaderboardLocal_Upload( lobbyUserID_t lobbyUserID, int gameType, leaderboardStats_t& stats ) { assert( gameType > GAME_RANDOM ); int mapIdx = 0; // Need to figure out What stat columns we want to base rank on. ( for now we'll use wins ) const column_t* gameTypeColumn = NULL; const column_t defaultStats[] = { stats.wins }; // calculate DM score. int dmScore = stats.frags * FRAG_MULTIPLIER + stats.deaths * DEATH_MULTIPLIER + stats.wins * WINS_MULTIPLIER ; // TODO: Once leaderboard menu has correct columns- enable this -> const column_t dmStats[] = { stats.frags, stats.deaths, stats.wins, dmScore }; const column_t dmStats[] = { dmScore }; // Calculate TDM score. int tdmScore = stats.frags * FRAG_MULTIPLIER + stats.teamfrags * FRAG_MULTIPLIER + stats.deaths * DEATH_MULTIPLIER + stats.wins * WINS_MULTIPLIER ; const column_t tdmStats[] = { tdmScore }; // Calculate Tourney score. int tourneyScore = stats.wins; const column_t tnyStats[] = { tourneyScore }; // Calculate LMS score. int lmsFrags = stats.frags; if( lmsFrags < 0 ) { lmsFrags = 0; // LMS NO LIVES LEFT = -20 on fragCount. } int lmsScore = lmsFrags * FRAG_MULTIPLIER + stats.wins * ( WINS_MULTIPLIER * 10 ) ; const column_t lmsStats[] = { lmsScore }; // Calculate CTF score. int ctfScore = stats.frags * FRAG_MULTIPLIER + stats.deaths * DEATH_MULTIPLIER + stats.wins * ( WINS_MULTIPLIER * 10 ); const column_t ctfStats[] = { ctfScore }; switch( gameType ) { case GAME_DM: gameTypeColumn = dmStats; break; case GAME_TDM: gameTypeColumn = tdmStats; break; case GAME_TOURNEY: gameTypeColumn = tnyStats; break; case GAME_LASTMAN: gameTypeColumn = lmsStats; break; case GAME_CTF: { gameTypeColumn = ctfStats; break; } default: gameTypeColumn = defaultStats; } const idMatchParameters& matchParameters = session->GetActingGameStateLobbyBase().GetMatchParms(); const idList< mpMap_t > maps = common->GetMapList(); // need to find the map Index number for( mapIdx = 0; mapIdx < maps.Num(); mapIdx++ ) { if( matchParameters.mapName.Cmp( maps[ mapIdx ].mapFile ) == 0 ) { break; } } int boardID = LeaderboardLocal_GetID( mapIdx, gameType ); const leaderboardDefinition_t* board = Sys_FindLeaderboardDef( boardID ); if( board ) { session->LeaderboardUpload( lobbyUserID, board, gameTypeColumn ); } else { idLib::Warning( "LeaderboardLocal_Upload invalid leaderboard with id of %d", boardID ); } }