// Fill out your copyright notice in the Description page of Project Settings. #include "MyPlayerState.h" #include "MyGameState.h" #include "Kismet/GameplayStatics.h" #include "Net/UnrealNetwork.h" AMyPlayerState::AMyPlayerState() : Super(), bIsMyTurn(false), SelectedTrooper(nullptr) { // PrimaryActorTick.bCanEverTick = true; } void AMyPlayerState::BeginPlay() { Super::BeginPlay(); } auto AMyPlayerState::GetMyGameState() const { return Cast(GetWorld()->GetGameState()); } // void AMyPlayerState::Tick(float DeltaSeconds) { // Super::Tick(DeltaSeconds); // if (GetMyGameState() && GetMyGameState()->IsGameStarted()) { // // for (const auto Actor : Troopers) { // // const auto Trooper = Cast(Actor); // // if (Trooper != nullptr && Trooper->GetPlayerIndex() != // // PlayerIndex) { // // Trooper->HighlightAsEnemy(PlayerIndex); // // } // // } // bIsSelectionInitialized = true; // SetActorTickEnabled(false); // } // } void AMyPlayerState::SetPlayerIndex(uint8 NewPlayerIndex) { PlayerIndex = NewPlayerIndex; } void AMyPlayerState::SetEnemySelection_Implementation( /*const TArray &Troopers*/) const { TArray Troopers; UGameplayStatics::GetAllActorsOfClass(GetWorld(), ATrooper::StaticClass(), Troopers); for (const auto Actor : Troopers) { const auto Trooper = Cast(Actor); if (Trooper != nullptr) { Trooper->HighlightAsEnemy(PlayerIndex); } } } void AMyPlayerState::MoveTrooper_Implementation(ATrooper *Trooper, FVector Location) { Location.Z = 0.0f; if (Trooper->CheckMoveCorrectness(Location)) { Trooper->MoveTrooper(Location); // GetMyGameMode()->CycleTurns(); } else { GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Red, FString::Printf( TEXT("Out of move radius!"))); } } // void AMyPlayerState::Attack_Implementation(ATrooper *Attacker, // FVector Location, // int ActionIndex) { // if (Attacker->CheckAttackCorrectness(Location, ActionIndex)) { // Attacker->Attack(ActionIndex); // } else { // GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Red, // FString::Printf( // TEXT( // "Out of radius or not enough Action Points!"))); // } // } void AMyPlayerState::Attack_Implementation(ATrooper *Attacker, FVector Location, int ActionIndex, const TArray & Troopers) { if (Attacker->CheckAttackCorrectness(Location, ActionIndex)) { Attacker->Attack(ActionIndex, Location); // for (const auto Trooper : Troopers) { // if (Attacker->GetPlayerIndex() != Trooper->GetPlayerIndex()) { // Trooper->TakeDamage(Attacker->GetAbility(ActionIndex)->Damage); // } // } } else { GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Red, FString::Printf( TEXT( "Out of radius or not enough Action Points!"))); } } // void AMyPlayerState::CycleTurns_Implementation() const { // if (bIsMyTurn) { // GetMyGameState()->CycleTurns(); // } // } bool AMyPlayerState::IsMyTurn() const { return bIsMyTurn; } void AMyPlayerState::SetMyTurn(bool bMyTurn) { bIsMyTurn = bMyTurn; if (bIsMyTurn) { GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Green, FString::Printf( TEXT("CURRENT TURN: %d"), PlayerIndex)); } } void AMyPlayerState::StartTurn_Implementation() { SetMyTurn(true); UE_LOG(LogTemp, Warning, TEXT("Your turn, %d"), PlayerIndex); } void AMyPlayerState::EndTurn_Implementation() { if (bIsMyTurn) { UE_LOG(LogTemp, Warning, TEXT("End Turn from player %d"), PlayerIndex); SetMyTurn(false); if (SelectedTrooper) { SelectedTrooper->SetSelection(false, CurrentAction); SelectedTrooper = nullptr; } UE_LOG(LogTemp, Warning, TEXT("Not your turn, %d"), PlayerIndex); // AMyGameMode *gameMode = GetMyGameMode(); // gameMode->CycleTurns(); // Cast(GetWorld()->GetGameState())->CycleTurns(); } } void AMyPlayerState::OnPlayerAction(const FHitResult &HitResult) { auto const NewlySelectedLocation = HitResult.Location; ATrooper *NewlySelectedTrooper = Cast( HitResult.GetActor()); // skip re-selection if (SelectedTrooper == NewlySelectedTrooper) { UE_LOG(LogTemp, Warning, TEXT("Skip reselection")); return; } if (NewlySelectedTrooper == nullptr || !NewlySelectedTrooper-> IsValidLowLevel() || NewlySelectedTrooper->GetPlayerIndex() != PlayerIndex) { if (SelectedTrooper != nullptr && SelectedTrooper-> IsValidLowLevel()) { switch (CurrentAction) { case 0: UE_LOG(LogTemp, Warning, TEXT("Do move")); // move this mf MoveTrooper(SelectedTrooper, NewlySelectedLocation); // and reset the selection.... SelectedTrooper->SetSelection(false, CurrentAction); SelectedTrooper = nullptr; break; default: // ATTACK! ATTACK! UE_LOG(LogTemp, Warning, TEXT("Do attack")); Attack(SelectedTrooper, NewlySelectedLocation, CurrentAction, GetMyGameState()->GetTroopers()); SelectedTrooper->SetSelection(false, CurrentAction); SelectedTrooper = nullptr; break; } } } else if (NewlySelectedTrooper != nullptr && NewlySelectedTrooper-> IsValidLowLevel() && NewlySelectedTrooper->GetPlayerIndex() == PlayerIndex) { UE_LOG(LogTemp, Warning, TEXT("Do reselect")); // our move, selection if (SelectedTrooper) { SelectedTrooper->SetSelection(false, CurrentAction); } SelectedTrooper = NewlySelectedTrooper; SelectedTrooper->SetSelection(true, CurrentAction); } } void AMyPlayerState::SetCurrentAction_Implementation(int Action) { CurrentAction = Action; if (SelectedTrooper) { SelectedTrooper->UpdateSelectionRadius(Action); } UE_LOG(LogTemp, Warning, TEXT("SetCurrentAction: %d on Player Controller " "with index %d"), CurrentAction, PlayerIndex); } uint8 AMyPlayerState::GetPlayerIndex() const { return PlayerIndex; } void AMyPlayerState::GetLifetimeReplicatedProps( TArray &OutLifetimeProps) const { Super::GetLifetimeReplicatedProps(OutLifetimeProps); DOREPLIFETIME(AMyPlayerState, PlayerIndex); DOREPLIFETIME(AMyPlayerState, CurrentAction); DOREPLIFETIME(AMyPlayerState, bIsMyTurn); DOREPLIFETIME(AMyPlayerState, SelectedTrooper); DOREPLIFETIME(AMyPlayerState, bIsSelectionInitialized); }