Fixed vision blocking; MapObject::Occupy() now blueprint implementable
This commit is contained in:
parent
068beeacfd
commit
276f8e2b50
@ -8,7 +8,7 @@
|
|||||||
#include "Kismet/GameplayStatics.h"
|
#include "Kismet/GameplayStatics.h"
|
||||||
#include "Algo/Reverse.h"
|
#include "Algo/Reverse.h"
|
||||||
#include "Util/IndexPriorityQueue.h"
|
#include "Util/IndexPriorityQueue.h"
|
||||||
#include <cmath.h>
|
#include <tgmath.h>
|
||||||
|
|
||||||
// Sets default values
|
// Sets default values
|
||||||
AAdventureMap::AAdventureMap()
|
AAdventureMap::AAdventureMap()
|
||||||
@ -106,13 +106,10 @@ FHexVector AAdventureMap::AxialRound(float qf, float rf)
|
|||||||
return FHexVector(q, r);
|
return FHexVector(q, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
float AAdventureMap::Lerp(int32 a, int32 b, int32 t)
|
float AAdventureMap::Lerp(int32 a, int32 b, float t)
|
||||||
{
|
{
|
||||||
return float(a + (b - a) * t);
|
return float(a + (b - a) * t);
|
||||||
}
|
}
|
||||||
// FHexVector SampleHex = MapRef->AxialRound(Lerpl(a, b, t), Lerp(x, y, z));
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
TArray<AHexTile*> AAdventureMap::Neighbors(AHexTile* OfHex, bool bFreeOnly = false)
|
TArray<AHexTile*> AAdventureMap::Neighbors(AHexTile* OfHex, bool bFreeOnly = false)
|
||||||
{
|
{
|
||||||
|
@ -81,9 +81,9 @@ public:
|
|||||||
bool DiagIsReachable(AHexTile* InStart, FHexVector InDiagUnitVec);
|
bool DiagIsReachable(AHexTile* InStart, FHexVector InDiagUnitVec);
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable, Category = "Utility")
|
UFUNCTION(BlueprintCallable, Category = "Utility")
|
||||||
float Lerp(int32 a, int32 b, int32 t);
|
float Lerp(int32 a, int32 b, float t);
|
||||||
UFUNCTION(BlueprintCallable, Category = "Utility")
|
UFUNCTION(BlueprintCallable, Category = "Utility")
|
||||||
FHexVector AxialRound(float q, float r)
|
FHexVector AxialRound(float q, float r);
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable, Category = "Utility")
|
UFUNCTION(BlueprintCallable, Category = "Utility")
|
||||||
TArray<AHexTile*> Neighbors(AHexTile* OfHex, bool bFreeOnly);
|
TArray<AHexTile*> Neighbors(AHexTile* OfHex, bool bFreeOnly);
|
||||||
|
@ -55,15 +55,14 @@ void AAdventurePlayerController::LeftClick()
|
|||||||
else { return; }
|
else { return; }
|
||||||
}
|
}
|
||||||
|
|
||||||
TSet<AHexTile*> AAdventurePlayerController::Vision(int32 Radius)
|
TArray<AHexTile*> AAdventurePlayerController::Vision(int32 Radius)
|
||||||
{
|
{
|
||||||
TSet<AHexTile*> InRange = MapRef->BreadthFirstSearch(CurrentHex, Radius);
|
TSet<AHexTile*> InRange = MapRef->BreadthFirstSearch(CurrentHex, Radius);
|
||||||
TSet<AHexTile*> Results;
|
TArray<AHexTile*> Results;
|
||||||
|
|
||||||
for (auto& Hex : InRange) {
|
for (auto& Hex : InRange) {
|
||||||
if (Hex->Distance(CurrentHex) == Radius)
|
if (Hex->Distance(CurrentHex) == Radius)
|
||||||
{
|
{
|
||||||
AHexTile* Target;
|
|
||||||
for (int32 i = 1; i <= Radius; i++)
|
for (int32 i = 1; i <= Radius; i++)
|
||||||
{
|
{
|
||||||
float t = 1.0f / Radius * i;
|
float t = 1.0f / Radius * i;
|
||||||
@ -73,9 +72,11 @@ TSet<AHexTile*> AAdventurePlayerController::Vision(int32 Radius)
|
|||||||
AHexTile* SampleHex = MapRef->Grid[MapRef->GridIndex(Sample.Q, Sample.R)];
|
AHexTile* SampleHex = MapRef->Grid[MapRef->GridIndex(Sample.Q, Sample.R)];
|
||||||
|
|
||||||
Results.Add(SampleHex);
|
Results.Add(SampleHex);
|
||||||
ExploredHexes.Add(Hex);
|
|
||||||
|
|
||||||
if (!SampleHex->bFree || ExploredHexes.Contains(SampleHex))
|
if (!ExploredHexes.Contains(SampleHex))
|
||||||
|
{ ExploredHexes.Add(Hex); }
|
||||||
|
|
||||||
|
if (!SampleHex->bFree)
|
||||||
{ break; }
|
{ break; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -131,13 +132,15 @@ void AAdventurePlayerController::FitOnGrid(AMapObject* MapObject)
|
|||||||
void AAdventurePlayerController::PlaceObject(TSubclassOf<AMapObject> MapObjClass, AHexTile* HoveredTile)
|
void AAdventurePlayerController::PlaceObject(TSubclassOf<AMapObject> MapObjClass, AHexTile* HoveredTile)
|
||||||
{
|
{
|
||||||
AMapObject* SpawnedObj = World->SpawnActor<AMapObject>(MapObjClass, FTransform(HoveredTile->GetActorTransform().GetLocation()));
|
AMapObject* SpawnedObj = World->SpawnActor<AMapObject>(MapObjClass, FTransform(HoveredTile->GetActorTransform().GetLocation()));
|
||||||
|
SpawnedObj->MapRef = MapRef;
|
||||||
SpawnedObj->Origin = HoveredTile;
|
SpawnedObj->Origin = HoveredTile;
|
||||||
|
SpawnedObj->bPlaced = true;
|
||||||
HoveredTile->bFree = false;
|
HoveredTile->bFree = false;
|
||||||
HoveredTile->MapObject = SpawnedObj;
|
HoveredTile->MapObject = SpawnedObj;
|
||||||
SpawnedObj->Occupy();
|
|
||||||
|
|
||||||
MapRef->MapObjects.Add(HoveredTile, SpawnedObj);
|
MapRef->MapObjects.Add(HoveredTile, SpawnedObj);
|
||||||
MapRef->IncID++;
|
MapRef->IncID++;
|
||||||
SpawnedObj->ID = MapRef->IncID;
|
SpawnedObj->ID = MapRef->IncID;
|
||||||
MapRef->MapObjectsByID.Add(MapRef->IncID, SpawnedObj);
|
MapRef->MapObjectsByID.Add(MapRef->IncID, SpawnedObj);
|
||||||
|
SpawnedObj->Occupy();
|
||||||
}
|
}
|
@ -57,7 +57,7 @@ public:
|
|||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
int32 VisionRadius = 6;
|
int32 VisionRadius = 6;
|
||||||
UFUNCTION(BlueprintCallable)
|
UFUNCTION(BlueprintCallable)
|
||||||
TSet<AHexTile*> Vision(int32 Radius);
|
TArray<AHexTile*> Vision(int32 Radius);
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
TSet<AHexTile*> ExploredHexes;
|
TSet<AHexTile*> ExploredHexes;
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ public:
|
|||||||
// MapObject Placement
|
// MapObject Placement
|
||||||
UPROPERTY(BlueprintReadWrite, VisibleAnywhere)
|
UPROPERTY(BlueprintReadWrite, VisibleAnywhere)
|
||||||
bool bFree = true;
|
bool bFree = true;
|
||||||
UPROPERTY(BlueprintReadOnly, VisibleInstanceOnly)
|
UPROPERTY(BlueprintReadWrite, VisibleAnywhere)
|
||||||
AMapObject* MapObject;
|
AMapObject* MapObject;
|
||||||
UPROPERTY(BlueprintReadWrite, EditDefaultsOnly)
|
UPROPERTY(BlueprintReadWrite, EditDefaultsOnly)
|
||||||
bool bCanActivate = false;
|
bool bCanActivate = false;
|
||||||
|
@ -21,7 +21,6 @@ AMapObject::AMapObject()
|
|||||||
void AMapObject::BeginPlay()
|
void AMapObject::BeginPlay()
|
||||||
{
|
{
|
||||||
Super::BeginPlay();
|
Super::BeginPlay();
|
||||||
Occupy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called every frame
|
// Called every frame
|
||||||
@ -39,11 +38,10 @@ void AMapObject::Activate()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Any subclass of MapObject has a defined array of Vectors relative to its origin which has to occupy() upon being placed on the map.
|
// Any subclass of MapObject has a defined array of Vectors relative to its origin which has to occupy() upon being placed on the map.
|
||||||
void AMapObject::Occupy()
|
//void AMapObject::Occupy(int32 Q, int32 R)
|
||||||
{
|
//{
|
||||||
for (auto& V : Occupying) {
|
// AHexTile* OccupiedHex = MapRef->Grid[MapRef->GridIndex(Q, R)];
|
||||||
AHexTile* OccupiedHex = MapRef->Grid[MapRef->GridIndex(Origin->Q + V.Q, Origin->R + V.R)];
|
//
|
||||||
OccupiedHex->bFree = false;
|
// OccupiedHex->bFree = false;
|
||||||
OccupiedHex->MapObject = this;
|
// OccupiedHex->MapObject = this;
|
||||||
}
|
//}
|
||||||
}
|
|
||||||
|
@ -35,6 +35,8 @@ public:
|
|||||||
int32 ID;
|
int32 ID;
|
||||||
UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "Generation")
|
UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "Generation")
|
||||||
class AHexTile* Origin; // very important
|
class AHexTile* Origin; // very important
|
||||||
|
UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category = "Generation")
|
||||||
|
bool bPlaced;
|
||||||
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "Generation")
|
UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category = "Generation")
|
||||||
TArray<FHexVector> Occupying;
|
TArray<FHexVector> Occupying;
|
||||||
|
|
||||||
@ -54,6 +56,7 @@ public:
|
|||||||
// Called every frame
|
// Called every frame
|
||||||
virtual void Tick(float DeltaTime) override;
|
virtual void Tick(float DeltaTime) override;
|
||||||
|
|
||||||
|
UFUNCTION(BlueprintImplementableEvent)
|
||||||
void Occupy();
|
void Occupy();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user