// Fill out your copyright notice in the Description page of Project Settings. #include "AdventurePlayerController.h" #include "AdventureMap.h" #include "HexTile.h" #include "AdventureCameraPawn.h" #include "AdventureCharacter.h" #include "MapObject.h" AAdventurePlayerController::AAdventurePlayerController() { PrimaryActorTick.bCanEverTick = true; PrimaryActorTick.bStartWithTickEnabled = true; AutoReceiveInput = EAutoReceiveInput::Player0; } void AAdventurePlayerController::BeginPlay() { Super::BeginPlay(); World = GetWorld(); HoveredHex = CurrentHex; } // Called every frame void AAdventurePlayerController::Tick(float DeltaTime) { Super::Tick(DeltaTime); if (bInPlacementMode) { FitOnGrid(PlaceObj); } } void AAdventurePlayerController::SetupInputComponent() { // Always call this. Super::SetupInputComponent(); // This is initialized on startup, you can go straight to binding InputComponent->BindAction("LeftClick", IE_Pressed, this, &AAdventurePlayerController::LeftClick); InputComponent->BindAction("DebugAlt", IE_Pressed, this, &AAdventurePlayerController::TogglePlacing); // Change binding eventually } void AAdventurePlayerController::LeftClick() { if (!IsValid(HoveredHex)) { return; } if (bInPlacementMode) { PlaceObject(PlaceObjClass, HoveredHex); } } TArray AAdventurePlayerController::Vision(int32 Radius) { TArray Results; TSet Visible; if (CurrentHex->bDiagMove) { Radius = FMath::FloorToInt(float(Radius) * (2.f / 3.f)); } Visible = MapRef->BreadthFirstSearch(CurrentHex, Radius); for (auto& Hex : Visible) { if (ExploredHexes.Contains(Hex)) { continue; } Results.Add(Hex); ExploredHexes.Add(Hex); } return Results; } void AAdventurePlayerController::TogglePlacing() { bInPlacementMode = !bInPlacementMode; if (bInPlacementMode) { PlaceObj = World->SpawnActor(PlaceObjClass, FTransform()); } else { if (IsValid(PlaceObj)) { PlaceObj->Destroy(); } } } void AAdventurePlayerController::FitOnGrid(AMapObject* MapObject) { if (!IsValid(HoveredHex)) { return; } if (HoveredHex->bFree) { MapObject->SetActorLocation(FVector(HoveredHex->GetActorLocation())); } } // called from BP; generally takes the Hex under the player cursor as argument void AAdventurePlayerController::PlaceObject(TSubclassOf MapObjClass, AHexTile* OnHex) { AMapObject* SpawnedObj = World->SpawnActor(MapObjClass, FTransform(OnHex->GetActorTransform().GetLocation())); SpawnedObj->Origin = OnHex; OnHex->bFree = false; SpawnedObj->Occupy(); MapRef->MapObjects.Add(OnHex, SpawnedObj); MapRef->IncID++; SpawnedObj->ID = MapRef->IncID; MapRef->MapObjectsByID.Add(MapRef->IncID, SpawnedObj); }