19#include "Components/HorizontalBox.h"
20#include "Components/ScrollBox.h"
21#include "Components/TextBlock.h"
22#include "Blueprint/UserWidget.h"
23#include "Components/Image.h"
24#include "Components/Spacer.h"
25#include "Components/VerticalBox.h"
29 Super::NativeDestruct();
35 if (
auto GS = Cast<ALingoGameState>(GetWorld()->GetGameState()))
37 GS->StopMissionTimer();
52 if (
auto GS = Cast<ALingoGameState>(GetWorld()->GetGameState()))
65 bool bHasResult =
false;
70 PRINTLOG(TEXT(
"[Popup_Result] Read result already exists in GameState"));
77 PRINTLOG(TEXT(
"[Popup_Result] Listen result already exists in GameState"));
83 if (!bHasResult && GetOwningPlayer()->HasAuthority())
95 PopupMgr->HideCurrentPopup();
103 if (
auto GS = Cast<ALingoGameState>(GetWorld()->GetGameState()))
107 Txt_Kor->SetText(FText::FromString(GS->ReadScenarioData.full_data.Kor));
108 Txt_Eng->SetText(FText::FromString(GS->ReadScenarioData.full_data.Eng));
110 Txt_Title->SetText(FText::FromString(TEXT(
"Read Quest")));
116 Txt_Kor->SetText(FText::FromString(GS->ListenScenarioData.full_data.Kor));
117 Txt_Eng->SetText(FText::FromString(GS->ListenScenarioData.full_data.Eng));
119 Txt_Title->SetText(FText::FromString(TEXT(
"Listen Quest")));
128 ALingoGameState* GS = Cast<ALingoGameState>(GetWorld()->GetGameState());
133 TArray<int32> WrongList;
135 TArray<FScenarioTargetData> ScenarioData;
154 for (int32 i = 0; i < WrongList.Num(); i++)
172 Spacer->SetSize(FVector2D(1.f, 10.f));
182 if (
auto GS = Cast<ALingoGameState>(GetWorld()->GetGameState()))
185 auto TimeTaken = GS->GetTimeTaken();
186 const int32 Minutes = FMath::FloorToInt(TimeTaken / 60.f);
187 const int32 Seconds = FMath::FloorToInt(TimeTaken) % 60;
192 TimeResultData.
TitleText = FText::FromString(TEXT(
"Time"));
194 TimeResultData.
SymbolValue = FString::Printf(TEXT(
"%02d:%02d"), Minutes, Seconds);
201 GradeResultData.
TitleText = FText::FromString(TEXT(
"Grade"));
208 TopRateResultData.
TitleText = FText::FromString(TEXT(
"Rate"));
215 AverageScoreResultData.
TitleText = FText::FromString(TEXT(
"Score"));
223 if (
auto GS = Cast<ALingoGameState>(GetWorld()->GetGameState()))
226 auto TimeTaken = GS->GetTimeTaken();
227 const int32 Minutes = FMath::FloorToInt(TimeTaken / 60.f);
228 const int32 Seconds = FMath::FloorToInt(TimeTaken) % 60;
233 TimeResultData.
TitleText = FText::FromString(TEXT(
"TIME"));
235 TimeResultData.
SymbolValue = FString::Printf(TEXT(
"%02d:%02d"), Minutes, Seconds);
242 GradeResultData.
TitleText = FText::FromString(TEXT(
"GRADE"));
249 TopRateResultData.
TitleText = FText::FromString(TEXT(
"TOP"));
256 AverageScoreResultData.
TitleText = FText::FromString(TEXT(
"SCORE"));
264 APlayerController* PC = GetOwningPlayer();
269 bool bIsHost =
false;
270 if (APlayerState* PS = PC->GetPlayerState<APlayerState>())
272 if (AGameStateBase* GameStateBase = GetWorld()->GetGameState())
274 int32 PlayerIndex = GameStateBase->PlayerArray.IndexOfByKey(PS);
275 bIsHost = (PlayerIndex == 0);
282 PRINTLOG(TEXT(
"[Popup_Result] Guest player - skipping request, waiting for Host"));
286 PRINTLOG(TEXT(
"[Popup_Result] Host player - sending result request"));
288 if (
auto GS = Cast<ALingoGameState>(GetWorld()->GetGameState()))
296 ReadRequest.
room_id = GS->GetRoomId();
297 ReadRequest.
user_id = Cast<APlayerControl>(GetOwningPlayer())->GetUserId();
302 ReadRequest.
wrong_idx = GS->WrongReadAnswerList;
303 Network->RequestReadResult(ReadRequest,
309 ListenRequest.
room_id = GS->GetRoomId();
310 ListenRequest.
user_id = Cast<APlayerControl>(GetOwningPlayer())->GetUserId();
315 ListenRequest.
wrong_idx = GS->WrongListenAnswerList;
316 Network->RequestListenResult(ListenRequest,
327 PRINTLOG(TEXT(
"[Result] Grade: %s, average_score: %.2f%%, Top Percent: %.2f%%"),
331 if (
auto GS = Cast<ALingoGameState>(GetWorld()->GetGameState()))
333 GS->ReadResult = ResponseData;
334 GS->OnReadResultUpdated.Broadcast(ResponseData);
341 PRINTLOG(TEXT(
"[Result] Quest result Failed"));
350 if (
auto GS = Cast<ALingoGameState>(GetWorld()->GetGameState()))
352 GS->ListenResult = ResponseData;
353 GS->OnListenResultUpdated.Broadcast(ResponseData);
360 PRINTLOG(TEXT(
"[Result] Quest result Failed"));
APlayerControl 선언에 대한 Doxygen 주석을 제공합니다.
YiSan 전반에서 사용하는 공용 인터페이스를 선언합니다.
#define PRINTLOG(fmt,...)
UGameDataManager 클래스를 선언합니다.
KLingo API 요청을 담당하는 서브시스템을 선언합니다.
TArray< int32 > WrongListenAnswerList
FORCEINLINE const FResponseListenScenario & GetListenScenarioData() const
FResponseListenScenario TryListenAnswerData
TArray< int32 > WrongReadAnswerList
FORCEINLINE const FResponseReadScenario & GetReadScenarioData() const
void InitInfo(EQuestType QuestType, int32 InOrder, FScenarioTargetData TargetData, FScenarioTargetData CorrectData)
KLingo 서버와의 HTTP 요청을 중재하는 게임 인스턴스 서브시스템입니다.
static int32 GetStageTypeIndex(const EQuestType QuestType)
static EResourceTextureType ConvertGradeString(const FString &Grade)
TArray< int32 > wrong_idx
TArray< int32 > wrong_idx
FScenarioTargetData GetCorrectAnswerData() const
TArray< FScenarioTargetData > target_data
FScenarioTargetData GetCorrectAnswerData() const
TArray< FScenarioTargetData > target_data
Result Stat 위젯 통합 데이터 구조 위젯 타입, 색상 스타일, 각 타입별 데이터를 통합 관리
EResourceTextureType SymbolTextureType
Symbol 타입 전용: 심볼 문자열
float RatePercent
Rate 타입 전용: 퍼센트 값 (0.0 ~ 1.0)
EColorStyleType ColorType
색상 스타일
EResultItemWidgetType WidgetType
위젯 타입
EResourceTextureType GradeTextureType
Grade 타입 전용: 텍스처 타입