140 lines
2.7 KiB
C++
140 lines
2.7 KiB
C++
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
|
|
#include "SkillManager.h"
|
|
#include "Skill.h"
|
|
|
|
void USkillManager::Tick(float DeltaTime)
|
|
{
|
|
for (auto Skill : Skills)
|
|
{
|
|
Skill->TickSkill(DeltaTime);
|
|
}
|
|
}
|
|
|
|
bool USkillManager::IsTickable() const
|
|
{
|
|
return !bGameEnd;
|
|
}
|
|
|
|
TStatId USkillManager::GetStatId() const
|
|
{
|
|
return Super::GetStatID();
|
|
}
|
|
|
|
void USkillManager::AddPawn(class APawnWithSkill* Pawn, FIntPoint BagSize)
|
|
{
|
|
PawnInfo.Add(Pawn, BagSize);
|
|
TMap<FIntPoint, bool> states;
|
|
for (int y = 0; y < BagSize.Y; y++)
|
|
{
|
|
for (int x = 0; x < BagSize.X; x++)
|
|
{
|
|
states.Add(FIntPoint(x, y), false);
|
|
|
|
}
|
|
}
|
|
PawnBagState.Add(Pawn, states);
|
|
}
|
|
|
|
// void USkillManager::InitPawns(TArray<APawnWithSkill*> Pawns)
|
|
// {
|
|
// this->SkillPawns = Pawns;
|
|
// }
|
|
|
|
USkill* USkillManager::AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoint& BagPos)
|
|
{
|
|
TMap<FIntPoint, bool>* states = PawnBagState.Find(Pawn);
|
|
FIntPoint BagSize = *PawnInfo.Find(Pawn);
|
|
bool bAddAble = true;
|
|
for (int y = 0; y < BagSize.Y; y++)
|
|
{
|
|
bAddAble = true;
|
|
for (int x = 0; x < BagSize.X; x++)
|
|
{
|
|
bAddAble = true;
|
|
for (int skillX = 0; skillX < data.SkillWeight.X; skillX++)
|
|
{
|
|
for (int skillY = 0; skillY < data.SkillWeight.Y; skillY++)
|
|
{
|
|
if (states->Find(FIntPoint(x, y) + FIntPoint(skillX, skillY)) == nullptr
|
|
|| *states->Find(FIntPoint(x, y) + FIntPoint(skillX, skillY)) == true)
|
|
{
|
|
bAddAble = false;
|
|
}
|
|
}
|
|
}
|
|
//满足条件
|
|
if (bAddAble)
|
|
{
|
|
//设置占用状态
|
|
for (int xTemp = 0; xTemp < data.SkillWeight.X; xTemp++)
|
|
{
|
|
for (int yTemp = 0; yTemp < data.SkillWeight.Y; yTemp++)
|
|
{
|
|
states->Add(FIntPoint(xTemp, yTemp) + FIntPoint(x, y), true);
|
|
}
|
|
}
|
|
BagPos = FIntPoint(x, y);
|
|
USkill* skill = NewObject<USkill>(this);
|
|
skill->InitSkill(Pawn, this, data);
|
|
Skills.Add(skill);
|
|
return skill;
|
|
}
|
|
}
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
void USkillManager::OnAllSkillAdded()
|
|
{
|
|
//所有技能初始化后,初始化技能的触发器
|
|
for (auto Skill : Skills)
|
|
{
|
|
Skill->InitSkillTrigger();
|
|
}
|
|
}
|
|
|
|
class USkill* USkillManager::GetSkillByTag(FGameplayTag Tag)
|
|
{
|
|
for (auto Skill : Skills)
|
|
{
|
|
if (Skill->GetSkillData().SkillTag == Tag)
|
|
return Skill;
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
|
|
void USkillManager::RemoveSkill(USkill* Skill)
|
|
{
|
|
Skills.Remove(Skill);
|
|
}
|
|
|
|
TArray<APawnWithSkill*> USkillManager::GetAllPawns()
|
|
{
|
|
TArray<APawnWithSkill*> Pawns;
|
|
for (auto info: PawnInfo)
|
|
{
|
|
Pawns.Add(info.Key);
|
|
}
|
|
return Pawns;
|
|
}
|
|
|
|
TArray<class USkill*> USkillManager::GetSkillsByOwner(APawnWithSkill* Pawn)
|
|
{
|
|
TArray<class USkill*> skills;
|
|
for (auto Skill : Skills)
|
|
{
|
|
if (Skill->GetOwner() == Pawn)
|
|
skills.Add(Skill);
|
|
}
|
|
return skills;
|
|
}
|
|
|
|
TArray< USkill*> USkillManager::GetAllSkills()
|
|
{
|
|
return Skills;
|
|
}
|