131 lines
2.9 KiB
C++
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;
|
|
}
|