2025-10-15 18:25:31 +08:00

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 UShapeAsset;
//背包中摆放的技能信息
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<UShapeAsset> 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;
};