108 lines
3.0 KiB
C++
108 lines
3.0 KiB
C++
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "Engine/DataAsset.h"
|
|
#include "ProjectFish/Definations.h"
|
|
#include "SkillAsset.h"
|
|
#include "BagConfigAsset.generated.h"
|
|
|
|
class UBagShapeAsset;
|
|
|
|
//背包中摆放的技能信息
|
|
USTRUCT(BlueprintType)
|
|
struct FPlacedSkillInfo
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
// 技能对象引用
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Placed Skill")
|
|
TObjectPtr< USkillAsset> SkillAsset;
|
|
|
|
// 技能在背包中的位置X
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Placed Skill Position")
|
|
int32 PositionX;
|
|
|
|
// 技能在背包中的位置Y
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Placed Skill Position")
|
|
int32 PositionY;
|
|
|
|
FPlacedSkillInfo()
|
|
{
|
|
SkillAsset = nullptr;
|
|
PositionX = 0;
|
|
PositionY = 0;
|
|
}
|
|
|
|
FPlacedSkillInfo(USkillAsset* InSkillAsset, int32 InX, int32 InY)
|
|
{
|
|
SkillAsset = InSkillAsset;
|
|
PositionX = InX;
|
|
PositionY = InY;
|
|
}
|
|
FIntPoint GetSkillSize()
|
|
{
|
|
return GetSkillSizeValue(SkillAsset->SkillSize);
|
|
}
|
|
// 检查技能是否占用指定位置
|
|
bool OccupiesPosition(int32 X, int32 Y) const
|
|
{
|
|
if (!SkillAsset)
|
|
{
|
|
return false;
|
|
}
|
|
return X >= PositionX && X < (PositionX + GetSkillSizeValue(SkillAsset->SkillSize).X) &&
|
|
Y >= PositionY && Y < (PositionY + GetSkillSizeValue(SkillAsset->SkillSize).Y);
|
|
}
|
|
};
|
|
/**
|
|
*
|
|
*/
|
|
UCLASS(BlueprintType)
|
|
class PROJECTFISH_API UBagConfigAsset : public UDataAsset
|
|
{
|
|
GENERATED_BODY()
|
|
public:
|
|
// 背包形状资源引用
|
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "BagConfig")
|
|
TObjectPtr<UBagShapeAsset> BagShapeAsset;
|
|
|
|
// 背包中放置的技能列表
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "BagConfig")
|
|
TArray<FPlacedSkillInfo> PlacedSkills;
|
|
|
|
// 添加技能到背包
|
|
UFUNCTION(BlueprintCallable, Category = "BagConfig")
|
|
bool AddSkill(USkillAsset* SkillObject, int32 PositionX, int32 PositionY);
|
|
|
|
// 移除技能
|
|
UFUNCTION(BlueprintCallable, Category = "BagConfig")
|
|
bool RemoveSkill(int32 SkillIndex);
|
|
UFUNCTION(BlueprintCallable, Category = "BagConfig")
|
|
void RemoveSkillAsset(class USkillAsset* SkillAsset);
|
|
|
|
// 检查技能是否可以放置在指定位置
|
|
UFUNCTION(BlueprintCallable, Category = "BagConfig")
|
|
bool CanPlaceSkill(USkillAsset* SkillObject, int32 PositionX, int32 PositionY, bool IgnoreSelf = false) const;
|
|
|
|
// 获取指定位置的技能索引
|
|
UFUNCTION(BlueprintCallable, Category = "BagConfig")
|
|
int32 GetSkillAtPosition(int32 X, int32 Y) const;
|
|
|
|
// 获取技能总数
|
|
UFUNCTION(BlueprintCallable, Category = "BagConfig")
|
|
int32 GetSkillCount() const { return PlacedSkills.Num(); }
|
|
|
|
// 清除所有技能
|
|
UFUNCTION(BlueprintCallable, Category = "BagConfig")
|
|
void ClearAllSkills();
|
|
|
|
private:
|
|
// 检查技能之间是否有重叠
|
|
bool CheckSkillOverlap(USkillAsset* SkillObject, int32 PositionX, int32 PositionY, bool IgnoreSelf = false) const;
|
|
|
|
// 检查技能是否在背包形状范围内
|
|
bool IsSkillWithinBagShape(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const;
|
|
};
|