Files

56 lines
5.3 KiB
C++

#include "IronsGame.h"
#include "Misc/CommandLine.h"
#include "Misc/Parse.h"
#include "Misc/Paths.h"
#include "Misc/FileHelper.h"
#include "HighResScreenshot.h"
#include "Engine/GameViewportClient.h"
#include "Kismet/KismetSystemLibrary.h"
#include "Serialization/JsonSerializer.h"
#include "HAL/FileManager.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "EnhancedInputComponent.h"
void AIronsController::TickAcceptance(float Dt){
#if !UE_BUILD_SHIPPING
FString Scenario;if(!FParse::Value(FCommandLine::Get(),TEXT("IronsporeQAScenario="),Scenario))return;
auto H=Host();if(!H||!H->bReady||!H->DataRoot.Contains(TEXT("/QA/")))return;
FString Folder;if(!FParse::Value(FCommandLine::Get(),TEXT("IronsporeQAEvidence="),Folder)||!Folder.Contains(TEXT("/Docs/QA/")))return;
if(Scenario.StartsWith(TEXT("performance"))){TickPerformanceAcceptance(Dt);return;}
IFileManager::Get().MakeDirectory(*Folder,true);
AcceptanceClock+=Dt;int Step=H->AcceptanceStep;
auto Shot=[&](const TCHAR* Name){FString Path=Folder/TEXT("")+Name+FString::Printf(TEXT("-%d.png"),Step);FScreenshotRequest::RequestScreenshot(Path,true,false);};
auto Record=[&](const TCHAR* Name){FFileHelper::SaveStringToFile(UTF8_TO_TCHAR(gf::encode(H->Core().state()).c_str()),*(Folder/(FString(Name)+TEXT(".json"))),FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM);};
auto Advance=[&](){H->AcceptanceStep++;AcceptanceClock=0;};
if(Scenario==TEXT("manual")){
if(Mech()&&AcceptanceClock>.1f){auto M=Mech()->GetCharacterMovement();auto L=Mech()->GetActorLocation();auto V=Mech()->GetVelocity();auto E=Cast<UEnhancedInputComponent>(InputComponent);bool Mapped=E&&Actions.Num()>0&&E->GetBoundActionValue(Actions[0]).Get<bool>();FString Line=FString::Printf(TEXT("%.3f,%.3f,%.3f,%.3f,%.3f,%d,%d,%d,%d,%d\n"),GetWorld()->GetTimeSeconds(),L.X,L.Y,L.Z,V.Size(),static_cast<int>(M->MovementMode),M->IsComponentTickEnabled()?1:0,IsMoveInputIgnored()?1:0,IsInputKeyDown(FKey(*H->Keys[0]))?1:0,Mapped?1:0);FFileHelper::SaveStringToFile(Line,*(Folder/TEXT("movement.csv")),FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM,&IFileManager::Get(),FILEWRITE_Append);AcceptanceClock=0;}
return;
}
if(Scenario==TEXT("ui")){
if(AcceptanceClock<3)return;
if(Step==0){H->Core().seedAcceptanceStock();H->SetLanguage(false);SetPage(TEXT("home"));Shot(TEXT("home-zh"));}
else if(Step==1){SetPage(TEXT("hangar"));Shot(TEXT("hangar-zh"));}
else if(Step==2){H->SetLanguage(true);Shot(TEXT("hangar-en"));}
else if(Step==3){SetPage(TEXT("settings"));Shot(TEXT("settings-en"));}
else if(Step==4){H->SetLanguage(false);SetPage(TEXT("research"));Shot(TEXT("research-zh"));}
else{Record(TEXT("ui-profile"));UKismetSystemLibrary::QuitGame(this,this,EQuitPreference::Quit,false);return;}
Advance();return;
}
if(Scenario!=TEXT("cycle"))return;
if(Playing()&&Mech()&&Step<9){auto& R=H->Core().state().run;H->Core().vitals(H->Core().catalog().chassis[R.chassis].armor,R.energy,R.elapsed,R.escortArmor);if(AcceptanceClock>2&&Step==2)FrameSamples.Add(Dt);}
if(AcceptanceClock<3)return;
if(Step==0){H->SetLanguage(false);Shot(TEXT("cycle-home"));Record(TEXT("before"));Advance();}
else if(Step==1){Advance();Launch();}
else if(Step==2){if(AcceptanceClock<7)return;Shot(TEXT("shoulder"));Record(TEXT("deployed"));FString Stats;float Sum=0,Max=0;for(float T:FrameSamples){Sum+=T;Max=FMath::Max(Max,T);}Stats=FString::Printf(TEXT("{\"samples\":%d,\"seconds\":%.3f,\"averageFps\":%.3f,\"worstFrameMs\":%.3f,\"environment\":\"Packaged Win64, short battle sampling; shader warmup excluded\"}\n"),FrameSamples.Num(),Sum,Sum>0?FrameSamples.Num()/Sum:0,Max*1000);FFileHelper::SaveStringToFile(Stats,*(Folder/TEXT("frame-sample.json")),FFileHelper::EEncodingOptions::ForceUTF8WithoutBOM);H->Core().addLoot("alloy",4,"qa-pod-source");H->Core().recoverPod({H->Core().state().run.cargo.front().uid});H->Core().addLoot("cells",2,"qa-safe-source");auto Uid=H->Core().state().run.cargo.front().uid;H->Core().moveItem(Uid,gf::Hold::Cargo,gf::Hold::SafeCase);Advance();}
else if(Step==3){SetPage(TEXT("inventory"));Shot(TEXT("cargo-recovery"));Record(TEXT("pod-recovered"));Advance();}
else if(Step==4){SetPage(TEXT("play"));if(Mech())Mech()->SwitchView();Shot(TEXT("cockpit"));Advance();}
else if(Step==5){if(auto M=GetWorld()->GetAuthGameMode<AIronsGameMode>()){if(Mech()&&M->Extraction)Mech()->SetActorLocation(M->Extraction->GetActorLocation()+FVector(0,0,180));M->Interact();}Advance();}
else if(Step==6){auto M=GetWorld()->GetAuthGameMode<AIronsGameMode>();if(!M||!M->bExtractionReady)return;Record(TEXT("ready-still-active"));Shot(TEXT("ready-to-board"));Advance();M->Interact();}
else if(Step==7){Record(TEXT("returned"));Shot(TEXT("after-extraction"));Advance();}
else if(Step==8){Advance();Launch();}
else if(Step==9){H->Core().addLoot("alloy",5,"qa-loss-source");H->Core().addLoot("cells",3,"qa-survival-source");auto& Items=H->Core().state().run.cargo;for(auto& I:Items)if(I.itemId=="cells"){auto Uid=I.uid;H->Core().moveItem(Uid,gf::Hold::Cargo,gf::Hold::SafeCase);break;}Advance();if(Mech())Mech()->ReceiveHit(100000);}
else if(Step==10){Record(TEXT("destroyed"));Shot(TEXT("after-destruction"));Advance();}
else{Record(TEXT("final"));UKismetSystemLibrary::QuitGame(this,this,EQuitPreference::Quit,false);}
#endif
}