Rounds System¶
The GameFuse Rounds System allows you to track and manage game rounds in your game. This includes creating rounds, fetching round data, and managing round metadata.
Getting Started with Rounds¶
To use the GameFuse Rounds system, you'll need to access the UGameFuseRounds subsystem:
Creating a Game Round¶
You can create a new game round with specific settings:
C++ Example
void UMyGameMode::CreateGameRound()
{
    UGameFuseRounds* RoundsSystem = GetGameInstance()->GetSubsystem<UGameFuseRounds>();
    // Create a new game round structure
    FGFGameRound RoundData;
    RoundData.Score = 100;
    RoundData.StartTime = FDateTime::Now();
    RoundData.EndTime = RoundData.StartTime + FTimespan::FromMinutes(1);
    RoundData.GameType = "SinglePlayer";
    // Create typed callback
    FGFGameRoundCallback OnCreateGameRound;
    OnCreateGameRound.BindLambda([this](const FGFGameRound& CreatedRound) {
        UE_LOG(LogTemp, Display, TEXT("Game round created successfully"));
        UE_LOG(LogTemp, Display, TEXT("Round ID: %d"), CreatedRound.Id);
        UE_LOG(LogTemp, Display, TEXT("Score: %d"), CreatedRound.Score);
        UE_LOG(LogTemp, Display, TEXT("Game Type: %s"), *CreatedRound.GameType);
    });
    // Create the game round
    RoundsSystem->CreateGameRound(RoundData, OnCreateGameRound);
}
Creating a Game Round with Metadata¶
You can include additional metadata with your game round:
C++ Example
void UMyGameMode::CreateGameRoundWithMetadata()
{
    UGameFuseRounds* RoundsSystem = GetGameInstance()->GetSubsystem<UGameFuseRounds>();
    // Create a new game round structure
    FGFGameRound RoundData;
    RoundData.Score = 100;
    RoundData.StartTime = FDateTime::Now();
    RoundData.EndTime = RoundData.StartTime + FTimespan::FromMinutes(1);
    RoundData.GameType = "SinglePlayer";
    // Add metadata
    RoundData.Metadata.Add("key1", "value1");
    RoundData.Metadata.Add("key2", "value2");
    RoundData.Metadata.Add("difficulty", "hard");
    RoundData.Metadata.Add("level", "5");
    // Create typed callback
    FGFGameRoundCallback OnCreateGameRoundWithMetadata;
    OnCreateGameRoundWithMetadata.BindLambda([this](const FGFGameRound& CreatedRound) {
        UE_LOG(LogTemp, Display, TEXT("Game round with metadata created successfully"));
        UE_LOG(LogTemp, Display, TEXT("Round ID: %d"), CreatedRound.Id);
        // Access metadata
        for (const auto& Pair : CreatedRound.Metadata)
        {
            UE_LOG(LogTemp, Display, TEXT("Metadata - %s: %s"), *Pair.Key, *Pair.Value);
        }
    });
    // Create the game round with metadata
    RoundsSystem->CreateGameRound(RoundData, OnCreateGameRoundWithMetadata);
}
Creating a Multiplayer Game Round¶
You can create a multiplayer game round by specifying the game type and including player IDs:
C++ Example
void UMyGameMode::CreateMultiplayerGameRound()
{
    UGameFuseRounds* RoundsSystem = GetGameInstance()->GetSubsystem<UGameFuseRounds>();
    // Create a new game round structure
    FGFGameRound RoundData;
    RoundData.Score = 200;
    RoundData.StartTime = FDateTime::Now();
    RoundData.EndTime = RoundData.StartTime + FTimespan::FromMinutes(5);
    RoundData.GameType = "Multiplayer";
    RoundData.bMultiplayer = true;
    // Add metadata
    RoundData.Metadata.Add("map", "desert");
    RoundData.Metadata.Add("mode", "capture_the_flag");
    // Create typed callback
    FGFGameRoundCallback OnCreateMultiplayerGameRound;
    OnCreateMultiplayerGameRound.BindLambda([this](const FGFGameRound& CreatedRound) {
        UE_LOG(LogTemp, Display, TEXT("Multiplayer game round created successfully"));
        UE_LOG(LogTemp, Display, TEXT("Round ID: %d"), CreatedRound.Id);
        UE_LOG(LogTemp, Display, TEXT("Multiplayer: %s"), CreatedRound.bMultiplayer ? TEXT("Yes") : TEXT("No"));
    });
    // Create the multiplayer game round
    RoundsSystem->CreateGameRound(RoundData, OnCreateMultiplayerGameRound);
}
Fetching a Game Round¶
You can fetch a specific game round by its ID:
C++ Example
void UMyGameMode::FetchGameRound(int32 RoundId)
{
    UGameFuseRounds* RoundsSystem = GetGameInstance()->GetSubsystem<UGameFuseRounds>();
    // Create typed callback
    FGFGameRoundCallback OnFetchGameRound;
    OnFetchGameRound.BindLambda([this](const FGFGameRound& Round) {
        UE_LOG(LogTemp, Display, TEXT("Game round fetched successfully"));
        UE_LOG(LogTemp, Display, TEXT("Round ID: %d"), Round.Id);
        UE_LOG(LogTemp, Display, TEXT("Score: %d"), Round.Score);
        UE_LOG(LogTemp, Display, TEXT("Game Type: %s"), *Round.GameType);
        // Access metadata
        for (const auto& Pair : Round.Metadata)
        {
            UE_LOG(LogTemp, Display, TEXT("Metadata - %s: %s"), *Pair.Key, *Pair.Value);
        }
    });
    // Fetch the game round
    RoundsSystem->FetchGameRound(RoundId, OnFetchGameRound);
}
Fetching Game Rounds¶
Fetching Current User's Game Rounds¶
C++ Example
void UMyGameMode::FetchMyGameRounds()
{
    UGameFuseRounds* RoundsSystem = GetGameInstance()->GetSubsystem<UGameFuseRounds>();
    // Create typed callback
    FGFGameRoundListCallback OnFetchMyGameRounds;
    OnFetchMyGameRounds.BindLambda([this](const TArray<FGFGameRound>& Rounds) {
        UE_LOG(LogTemp, Display, TEXT("Fetched %d game rounds"), Rounds.Num());
        for (const FGFGameRound& Round : Rounds)
        {
            UE_LOG(LogTemp, Display, TEXT("Round ID: %d, Score: %d, Type: %s"), 
                Round.Id, Round.Score, *Round.GameType);
        }
    });
    // Fetch current user's game rounds with pagination and filtering
    RoundsSystem->FetchMyGameRounds(OnFetchMyGameRounds, "SinglePlayer", 0, 10);
}
Fetching Other Users' Game Rounds¶
C++ Example
void UMyGameMode::FetchUserGameRounds(int32 UserId)
{
    UGameFuseRounds* RoundsSystem = GetGameInstance()->GetSubsystem<UGameFuseRounds>();
    // Create typed callback
    FGFGameRoundListCallback OnFetchUserGameRounds;
    OnFetchUserGameRounds.BindLambda([this](const TArray<FGFGameRound>& Rounds) {
        UE_LOG(LogTemp, Display, TEXT("Fetched %d game rounds for user"), Rounds.Num());
        for (const FGFGameRound& Round : Rounds)
        {
            UE_LOG(LogTemp, Display, TEXT("Round ID: %d, Score: %d, Type: %s"), 
                Round.Id, Round.Score, *Round.GameType);
        }
    });
    // Fetch specific user's game rounds with pagination and filtering
    RoundsSystem->FetchUserGameRounds(UserId, OnFetchUserGameRounds, "Multiplayer", 0, 10);
}
Updating a Game Round¶
You can update an existing game round:
C++ Example
void UMyGameMode::UpdateGameRound(int32 RoundId)
{
    UGameFuseRounds* RoundsSystem = GetGameInstance()->GetSubsystem<UGameFuseRounds>();
    // First fetch the existing round
    FGFGameRoundCallback OnFetchForUpdate;
    OnFetchForUpdate.BindLambda([this, RoundsSystem, RoundId](const FGFGameRound& ExistingRound) {
        // Create an updated version of the round
        FGFGameRound UpdatedRound = ExistingRound;
        UpdatedRound.Score = 150; // Update the score
        UpdatedRound.EndTime = FDateTime::Now(); // Update the end time
        // Add or update metadata
        UpdatedRound.Metadata.Add("completed", "true");
        // Create callback for the update operation
        FGFGameRoundCallback OnUpdateGameRound;
        OnUpdateGameRound.BindLambda([this](const FGFGameRound& UpdatedRoundResult) {
            UE_LOG(LogTemp, Display, TEXT("Game round updated successfully"));
            UE_LOG(LogTemp, Display, TEXT("Updated Score: %d"), UpdatedRoundResult.Score);
        });
        // Update the game round
        RoundsSystem->UpdateGameRound(RoundId, UpdatedRound, OnUpdateGameRound);
    });
    // First fetch the existing round
    RoundsSystem->FetchGameRound(RoundId, OnFetchForUpdate);
}
Deleting a Game Round¶
You can delete a game round:
C++ Example
void UMyGameMode::DeleteGameRound(int32 RoundId)
{
    UGameFuseRounds* RoundsSystem = GetGameInstance()->GetSubsystem<UGameFuseRounds>();
    // Create typed callback
    FGFGameRoundActionCallback OnDeleteGameRound;
    OnDeleteGameRound.BindLambda([this](bool bSuccess) {
        if (bSuccess)
        {
            UE_LOG(LogTemp, Display, TEXT("Game round deleted successfully"));
        }
        else
        {
            UE_LOG(LogTemp, Error, TEXT("Failed to delete game round"));
        }
    });
    // Delete the game round
    RoundsSystem->DeleteGameRound(RoundId, OnDeleteGameRound);
}
Function Parameters¶
Creating and Updating Game Rounds¶
| Parameter | Type | Description | 
|---|---|---|
| RoundData | FGFGameRound | The game round data to create or update | 
| RoundId | int32 | The ID of the round to update or delete | 
| Callback | Various callback types | Callback function to handle the response | 
Fetching Game Rounds¶
| Parameter | Type | Description | 
|---|---|---|
| UserId | int32 | The user ID to fetch rounds for (optional, for user-specific fetch) | 
| GameType | FString | Optional game type filter (e.g., "SinglePlayer", "Multiplayer") | 
| Page | int32 | Page number for pagination (0-based) | 
| PerPage | int32 | Number of rounds per page | 
| Callback | FGFGameRoundListCallback | Callback function to handle the response | 
Function Return Values¶
Game Round Operations¶
| HTTP status code | Description | 
|---|---|
| 200 | OK - Operation successful | 
| 400 | Bad request - Invalid parameters | 
| 401 | Unauthorized - User not signed in | 
| 404 | Game round not found | 
| 500 | Unknown server error | 
Fetching Game Rounds¶
| HTTP status code | Description | 
|---|---|
| 200 | OK - Game rounds fetched successfully | 
| 401 | Unauthorized - User not signed in | 
| 404 | User not found (for user-specific fetch) | 
| 500 | Unknown server error | 
Cached Data Access¶
You can access cached rounds data without making API calls:
