Crossplay Integration Kit
Architecture

Kit standard

The shared architecture used by every Betide online kit

Kit standard

Every Betide online kit uses BetideCore for shared lifetime, errors, results, web requests, settings, and operation control. Platform behavior stays inside its kit, while cross-kit behavior is exposed through provider interfaces. A kit still builds independently: WITH_UCIK=1 when Source/UCIKCore is present and WITH_UCIK=0 in its standalone package.

Module shape

Runtime source belongs under Public/ and Private/. Public headers expose the smallest stable API; implementation helpers and Automation tests remain private. Each runtime kit enables full IWYU and C++20, publicly depends on BetideCore, and uses the canonical WITH_UCIK probe. External SDK bridge modules remain ModuleType.External and do not own runtime objects or tests.

Shared primitives

ConcernUse
Async Blueprint lifetimeUBetideAsyncAction
Web Blueprint lifetimeUBetideWebApiAction
SDK/delegate ownershipUBetideKitSubsystem and its binding set
Settings discoveryUBetideKitSettings and FBetideSettingsRegistry
Errors and callbacksFBetideError, TBetideResult<T>, FBetideCallback<T>
HTTP, retry, and JSONUBetideWebRequest
Serialized/deduplicated workBetideOps

Async nodes implement Run() and leave lifetime completion to Finish() or Cancel(). Callback-owning subsystems put Steam callbacks, EOS notification removers, and Unreal delegate handles into the shared binding set. Kit nodes never create their own HTTP retry pipeline.

#include "BetideAsyncAction.h"

UCLASS()
class UMyKit_Query final : public UBetideAsyncAction
{
    GENERATED_BODY()

protected:
    virtual void Run() override;
};

void UMyKit_Query::Run()
{
    Service->Query(FBetideCallback<FMyResult>::CreateWeakLambda(
        this, [this](const TBetideResult<FMyResult>& Result)
        {
            Result.bOk ? OnSuccess.Broadcast(Result.GetValue()) : OnFailure.Broadcast(Result.Error);
            Finish();
        }));
}

Completion checks

Automation tests live in Private/Tests/ and use the UCIK.<Kit>.<Area> prefix. They cover validation, state transitions, conversions, total error mapping, and mocked provider or HTTP behavior. Before committing a converted module, run:

python Scripts/check-standard.py --module <Module>
clang-format -i <touched C++ files>

See Hosting providers and Matchmaking providers for the cross-kit adapter contracts.

On this page