Skip to main content

Match Settings

For more flexibility, match parameters are stored in Instanced Objects.

Preset​

You can find match presets to quickly test the game.
For example, if you take a look at DA_AFT_Versus_SettingsPreset, this is the same preset used in Training Mode.

Match Settings

Each "type" of setting is encapsulated in a UObject.
For example, TimeLimit holds the parameters for the match timer,
and Character Selection Settings handles which players/characters are selected.

The preset is simply a set of pre-filled values for better readability and easier modification during testing.

Runtime​

Here's an example of how match parameters can be modified at runtime, as seen in W_AFT_MIN_MatchSettings_Versus:

Match Settings

You can see that the singleton function GetOrCreateMatchSettingsInstance retrieves (or creates)
a Versus-type match settings instance and assigns the new values to it.

Sync with Deterministic Battle​

The loading of match parameters — in order to synchronize them with the deterministic battle state — is handled, for example, here:

void UAFTBattleModeSettings::Load(UAFTGGPOGameStateComponent* GameStateComponent)
{
FAFTBattleStateObject& bs = GameStateComponent->GetBattleState()->GetBS();

bs.Timer.Infinity = GameStateComponent->BattleModeSettingsInfo.bInfiniteTimer;
bs.Timer.FrameTimeMax = GameStateComponent->BattleModeSettingsInfo.TimeLimitSeconds * 60;
bs.RoundMax = GameStateComponent->BattleModeSettingsInfo.RoundMax;
}

void UAFTBattleModeSettings::ComputeFromLocalStorage()
{
FAFTBattleModeSettingInfo BattleModeSettingInfo;

auto* BattleSettingStorage = UAFTGameplayStatics::GetSubModuleByClass<UAFTLocalStorageModule>(this)->BattleSetting;
auto* MatchSettingsInstance = BattleSettingStorage->GetCurrentMatchSettingsInstance();

auto* TimeLimitSetting = MatchSettingsInstance->GetSettingByClass<UAFTTimeLimitSetting>();
auto* SideSelectSettings = MatchSettingsInstance->GetSettingByClass<UAFTSideSelectSettings>();
auto* VictoryConditionSetting = MatchSettingsInstance->GetSettingByClass<UAFTVictoryConditionSetting>();

BattleModeSettingInfo.RoundMax = VictoryConditionSetting->MaxRounds;

BattleModeSettingInfo.bInfiniteTimer = TimeLimitSetting->bIsInfiniteTime;
BattleModeSettingInfo.TimeLimitSeconds = TimeLimitSetting->TimeLimitSeconds;

ComputedBattleModeSettingInfo = BattleModeSettingInfo;

// Character selections
CharacterSelectInfos.Reset();
CharacterSelectInfos.Add(SideSelectSettings->P1_CharacterSide);
CharacterSelectInfos.Add(SideSelectSettings->P2_CharacterSide);
}