implement Pursuit Sequence Logic

This commit is contained in:
2025-07-11 13:09:18 +02:00
parent bc6a928312
commit 73413e44b4
4 changed files with 146 additions and 68 deletions

View File

@ -3,6 +3,9 @@
#include "DTFluxPursuitManager.h"
#include <ImportExport.h>
#include "DTFluxCoreSubsystem.h"
#include "DTFluxCoreSubsystemModule.h"
UDTFluxPursuitManager::UDTFluxPursuitManager(const FObjectInitializer& ObjectInitializer):
@ -12,7 +15,7 @@ UDTFluxPursuitManager::UDTFluxPursuitManager(const FObjectInitializer& ObjectIni
// TODO : Add way to pass MaxSimultaneousPursuit and MassStartDelay
// For now it's done in UPROPERTIES
void UDTFluxPursuitManager::LaunchPursuitSequenceFor(const TArray<FDTFluxContest> InContests)
void UDTFluxPursuitManager::InitPursuitForContests(const TArray<FDTFluxContest> InContests)
{
if (InitSubSystems())
{
@ -39,6 +42,91 @@ void UDTFluxPursuitManager::LaunchPursuitSequenceFor(const TArray<FDTFluxContest
}
}
void UDTFluxPursuitManager::InitPursuit(const TArray<int> InContestIds, const int MaxSimultaneousPursuit)
{
CoreSubsystem = Cast<UDTFluxCoreSubsystem>(GetOuter());
if (!CoreSubsystem)
{
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("CoreSubsystem is not Available !!!"));
return;
}
TArray<FDTFluxContest> Contests = TArray<FDTFluxContest>();
for (const auto& ContestId : InContestIds)
{
FDTFluxContest Contest;
CoreSubsystem->GetContestForId(ContestId, Contest);
Contests.Add(Contest);
InitPursuitForContests(Contests);
}
}
void UDTFluxPursuitManager::SetPursuitInfoIsMassStart(FDTFluxPursuitGroup NextFocusGroup)
{
for (auto& Pursuit : NextFocusGroup.PursuitGroup)
{
Pursuit.bIsMassStart = Pursuit.StartTime >= MassStartTime;
}
}
void UDTFluxPursuitManager::GetPursuit(TArray<FDTFluxPursuitInfo>& OutPursuitFocusNext,
TArray<FDTFluxPursuitInfo>& OutPursuitNext, bool& BIsFocusTruncate,
const int MaxSimultaneousPursuit)
{
if (MaxSimultaneousPursuit <= 0)
{
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("MaxSimultaneousPursuit must be > 0"));
OutPursuitFocusNext = TArray<FDTFluxPursuitInfo>();
OutPursuitNext = TArray<FDTFluxPursuitInfo>();
BIsFocusTruncate = false;
return;
}
if (bIsSequenceDone && MaxSimultaneousPursuit <= 0)
{
OutPursuitFocusNext = TArray<FDTFluxPursuitInfo>();
OutPursuitNext = TArray<FDTFluxPursuitInfo>();
BIsFocusTruncate = false;
return;
}
OutPursuitFocusNext.Reset();
OutPursuitNext.Reset();
if (!GroupedPursuit.IsEmpty())
{
FDTFluxPursuitGroup NextFocusGroup = GroupedPursuit[0];
GroupedPursuit.RemoveAt(0);
SetPursuitInfoIsMassStart(NextFocusGroup);
OutPursuitFocusNext = NextFocusGroup.PursuitGroup;
bFocusIsTruncate = NextFocusGroup.PursuitGroup.Num() > 1;
for (int RemainingPursuitNum = MaxSimultaneousPursuit - 1; RemainingPursuitNum != 0;)
{
if (!GroupedPursuit.IsEmpty())
{
FDTFluxPursuitGroup NextGroup = GroupedPursuit[0];
SetPursuitInfoIsMassStart(NextGroup);
if (NextGroup.PursuitGroup.Num() >= RemainingPursuitNum)
{
// extract the number we need
for (int i = 0; i < RemainingPursuitNum; i++)
{
FDTFluxPursuitInfo Pursuit = NextGroup.PursuitGroup[0];
OutPursuitNext.Add(Pursuit);
}
break;
}
else
{
OutPursuitNext.Append(NextGroup.PursuitGroup);
RemainingPursuitNum -= NextGroup.PursuitGroup.Num();
}
}
else
{
break;
}
}
}
}
void UDTFluxPursuitManager::OnRequestResponse(const FGuid& RequestId, FDTFluxServerResponse& Response)
{
UE_LOG(logDTFluxCoreSubsystem, Log,
@ -48,9 +136,9 @@ void UDTFluxPursuitManager::OnRequestResponse(const FGuid& RequestId, FDTFluxSer
if (Response.GetResponseType() == EDTFluxApiDataType::StageRanking)
{
FDTFluxStageRankings Rankings;
FRequestData FoundData;
if (Response.ParseStageRankingResponse(Rankings))
{
FRequestData FoundData = FRequestData();
for (auto& PendingReq : PendingRequestData)
{
// Check for a matching PendingReq
@ -64,9 +152,9 @@ void UDTFluxPursuitManager::OnRequestResponse(const FGuid& RequestId, FDTFluxSer
break;
}
}
if (InitPursuit(FoundData))
if (InitPursuitForRequest(FoundData))
{
OnPursuitSequenceReady.Broadcast(NextFocusPursuits, NextFocusPursuits, bFocusIsTruncate);
OnPursuitSequenceReady.Broadcast(MassStartTime, NextFocusPursuits, NextFocusPursuits, bFocusIsTruncate);
}
}
}
@ -92,16 +180,17 @@ bool UDTFluxPursuitManager::InitSubSystems()
return NetworkSubsystem != nullptr;
}
bool UDTFluxPursuitManager::InitPursuit(FRequestData Data)
bool UDTFluxPursuitManager::InitPursuitForRequest(FRequestData Data)
{
//Clean Data
NextFocusPursuits.Empty();
NextPursuits.Empty();
PursuitGrouped.Empty();
GroupedPursuit.Empty();
TArray<FDTFluxDetailedRankingItem> AllRankings;
TArray<FDTFluxPursuitInfo> AllPursuits;
TMap<FDateTime, FDTFluxPursuitGroup> TempGroups;
// Full the Array Of Rankings
for (auto& KeyPair : Data.StageRankings)
{
@ -138,13 +227,27 @@ bool UDTFluxPursuitManager::InitPursuit(FRequestData Data)
{
return A < B;
});
PursuitGrouped.Reserve(TempGroups.Num());
TMap<FDateTime, int> StartTimeFrequency;
int32 MaxFrequency = 0;
GroupedPursuit.Reserve(TempGroups.Num());
for (const auto& Pair : TempGroups)
{
PursuitGrouped.Add(Pair.Value);
if (Pair.Value.StartTimeGlobal != FDateTime::MinValue() && Pair.Value.StartTimeGlobal != FDateTime::MaxValue())
{
StartTimeFrequency.FindOrAdd(Pair.Value.StartTimeGlobal)++;
const FDateTime& PropertyValue = Pair.Value.StartTimeGlobal; // Votre propriété
int32& Count = StartTimeFrequency.FindOrAdd(PropertyValue, 0);
Count++;
if (Count > MaxFrequency)
{
MaxFrequency = Count;
MassStartTime = PropertyValue;
}
}
GroupedPursuit.Add(Pair.Value);
}
PursuitGrouped.Sort([](const FDTFluxPursuitGroup& A, const FDTFluxPursuitGroup& B)
GroupedPursuit.Sort([](const FDTFluxPursuitGroup& A, const FDTFluxPursuitGroup& B)
{
return A.StartTimeGlobal < B.StartTimeGlobal;
});