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

131 lines
2.9 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "BagConfigAsset.h"
#include "ShapeAsset.h"
bool UBagConfigAsset::AddSkill(USkillAsset* SkillObject, int32 PositionX, int32 PositionY)
{
if (!SkillObject || !CanPlaceSkill(SkillObject, PositionX, PositionY))
{
return false;
}
PlacedSkills.Add(FPlacedSkillInfo(SkillObject, PositionX, PositionY));
return true;
}
bool UBagConfigAsset::RemoveSkill(int32 SkillIndex)
{
if (SkillIndex < 0 || SkillIndex >= PlacedSkills.Num())
{
return false;
}
PlacedSkills.RemoveAt(SkillIndex);
return true;
}
void UBagConfigAsset::RemoveSkillAsset(class USkillAsset* SkillAsset)
{
for (int32 i = 0; i < PlacedSkills.Num(); i++)
{
if (PlacedSkills[i].SkillAsset == SkillAsset)
{
PlacedSkills.RemoveAt(i);
break;
}
}
}
bool UBagConfigAsset::CanPlaceSkill(USkillAsset* SkillObject, int32 PositionX, int32 PositionY, bool IgnoreSelf ) const
{
if (!SkillObject || !BagShapeAsset)
{
return false;
}
if (!IsSkillWithinBagShape(SkillObject, PositionX, PositionY))
{
return false;
}
if (CheckSkillOverlap(SkillObject, PositionX, PositionY, IgnoreSelf))
{
return false;
}
return true;
}
int32 UBagConfigAsset::GetSkillAtPosition(int32 X, int32 Y) const
{
for (int32 i = 0; i < PlacedSkills.Num(); i++)
{
if (PlacedSkills[i].OccupiesPosition(X, Y))
{
return i;
}
}
return -1;
}
void UBagConfigAsset::ClearAllSkills()
{
PlacedSkills.Empty();
}
bool UBagConfigAsset::CheckSkillOverlap(USkillAsset* SkillObject, int32 PositionX, int32 PositionY, bool IgnoreSelf ) const
{
if (!SkillObject)
{
return false;
}
for (int32 i = 0; i < PlacedSkills.Num(); i++)
{
const FPlacedSkillInfo& ExistingSkill = PlacedSkills[i];
if (!ExistingSkill.SkillAsset)
{
continue;
}
// 检查矩形重叠
if (!(PositionX >= ExistingSkill.PositionX + GetSkillSizeValue(ExistingSkill.SkillAsset->SkillSize).X ||
PositionX + GetSkillSizeValue(SkillObject->SkillSize).X <= ExistingSkill.PositionX ||
PositionY >= ExistingSkill.PositionY + GetSkillSizeValue(ExistingSkill.SkillAsset->SkillSize).Y ||
PositionY + GetSkillSizeValue(SkillObject->SkillSize).Y <= ExistingSkill.PositionY))
{
if (IgnoreSelf && ExistingSkill.SkillAsset == SkillObject)
continue;
else
return true; // 有重叠
}
}
return false; // 无重叠
}
bool UBagConfigAsset::IsSkillWithinBagShape(USkillAsset* SkillObject, int32 PositionX, int32 PositionY) const
{
if (!BagShapeAsset || !SkillObject)
{
return false;
}
// 检查技能占用的所有格子是否都在激活的背包形状内
for (int32 X = PositionX; X < PositionX + GetSkillSizeValue(SkillObject->SkillSize).X; X++)
{
for (int32 Y = PositionY; Y < PositionY + GetSkillSizeValue(SkillObject->SkillSize).Y; Y++)
{
if (!BagShapeAsset->IsSlotActive(X, Y))
{
return false;
}
}
}
return true;
}