diff --git a/ProjectFish/Content/DataTable/PawnSkills.uasset b/ProjectFish/Content/DataTable/PawnSkills.uasset index 11609e3..02cddfd 100644 Binary files a/ProjectFish/Content/DataTable/PawnSkills.uasset and b/ProjectFish/Content/DataTable/PawnSkills.uasset differ diff --git a/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/8/VO/DV1AKH9EUYVRMVYP3DYZVH.uasset b/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/8/VO/DV1AKH9EUYVRMVYP3DYZVH.uasset index 8360458..abadf53 100644 Binary files a/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/8/VO/DV1AKH9EUYVRMVYP3DYZVH.uasset and b/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/8/VO/DV1AKH9EUYVRMVYP3DYZVH.uasset differ diff --git a/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/9/GX/KCVNFI6L6PBCQ844W3A926.uasset b/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/9/GX/KCVNFI6L6PBCQ844W3A926.uasset index e41ef75..c3e4a5d 100644 Binary files a/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/9/GX/KCVNFI6L6PBCQ844W3A926.uasset and b/ProjectFish/Content/__ExternalActors__/Maps/Dabaza/9/GX/KCVNFI6L6PBCQ844W3A926.uasset differ diff --git a/ProjectFish/Source/ProjectFish/Definations.h b/ProjectFish/Source/ProjectFish/Definations.h index 531e4e5..f738b35 100644 --- a/ProjectFish/Source/ProjectFish/Definations.h +++ b/ProjectFish/Source/ProjectFish/Definations.h @@ -25,10 +25,11 @@ enum class ESkillTargetType: uint8 { Self UMETA(DisplayName = "自身"), Other UMETA(DisplayName = "对方"), - AdjacentLeft UMETA(DisplayName = "左侧相邻"), - AdjacentRight UMETA(DisplayName = "右侧相邻"), - AllLeft UMETA(DisplayName = "左侧全部"), - AllRight UMETA(DisplayName = "右侧全部"), + Around UMETA(DisplayName = "格子周围") + // AdjacentLeft UMETA(DisplayName = "左侧相邻"), + // AdjacentRight UMETA(DisplayName = "右侧相邻"), + // AllLeft UMETA(DisplayName = "左侧全部"), + // AllRight UMETA(DisplayName = "右侧全部"), }; //随机对象类型 UENUM(BlueprintType) @@ -116,7 +117,7 @@ struct FSkillData: public FTableRowBase FGameplayTag SkillTag; UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "背包占用")) - FIntPoint SkillWeight; + FIntPoint SkillWeight = FIntPoint(1, 1); UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ToolTip = "是否为主动技能")) bool bActiveSkill = true; diff --git a/ProjectFish/Source/ProjectFish/Skill/Skill.cpp b/ProjectFish/Source/ProjectFish/Skill/Skill.cpp index 3f1ed94..94cbd3f 100644 --- a/ProjectFish/Source/ProjectFish/Skill/Skill.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/Skill.cpp @@ -11,11 +11,12 @@ #include "SkillEffects/SkillEffect_ModifySpeed.h" #include "SkillEffects/SkillEffect_SER.h" -void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkillData skillData) +void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkillData skillData, FIntPoint BagPos) { this->Owner = owner; this->SkillManager = skillManager; this->SkillData = skillData; + this->BagPosition = BagPos; this->RemainingTime = SkillData.CD; this->RemainingEndurance = SkillData.Endurance; for (auto effectData: skillData.SkillEffects) @@ -113,6 +114,11 @@ FSkillData& USkill::GetSkillData() return SkillData; } +FIntPoint USkill::GetBagPos() +{ + return BagPosition; +} + void USkill::SetSkillData(FSkillData data) { SkillData = data; diff --git a/ProjectFish/Source/ProjectFish/Skill/Skill.h b/ProjectFish/Source/ProjectFish/Skill/Skill.h index 3dfbcb1..1c544d9 100644 --- a/ProjectFish/Source/ProjectFish/Skill/Skill.h +++ b/ProjectFish/Source/ProjectFish/Skill/Skill.h @@ -19,7 +19,7 @@ class PROJECTFISH_API USkill : public UObject { GENERATED_BODY() public: - void InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, FSkillData SkillData); + void InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, FSkillData SkillData, FIntPoint BagPos); void InitSkillTrigger(); void TickSkill(float deltaTime); void ExecuteSkill(); @@ -28,6 +28,7 @@ public: class APawnWithSkill* GetOwner(); FSkillData& GetSkillData(); + FIntPoint GetBagPos(); void SetSkillData( FSkillData SkillData); UFUNCTION(BlueprintCallable) void ApplyRemainingTimeOffset(int timeOffset); @@ -53,6 +54,9 @@ protected: float RemainingTime; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta = (ToolTip = "剩余耐久度")) int32 RemainingEndurance; + + UPROPERTY(BlueprintReadOnly, EditAnywhere, meta = (ToolTip = "背包位置")) + FIntPoint BagPosition; }; diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp index 354f363..cab60b8 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillEffect.cpp @@ -132,52 +132,15 @@ void USkillEffect::GetEffectTargetsByTargetType(const FSkillContext& context, TA } break; } - case ESkillTargetType::AdjacentLeft: + case ESkillTargetType::Around: + { + //技能左侧的技能 + TArray aroundSkills = context.SkillManager->GetSkillsAround(context.OwnerSkill); + for (auto skill: aroundSkills) { - //技能左侧的技能 - TArray< USkill*> allSkills = context.SkillManager->GetAllSkills(); - int32 index = allSkills.Find(OwnerSkill); - if ((index - 1) >= 0) - { - result.Add(allSkills[index - 1]); - } - break;; - } - case ESkillTargetType::AdjacentRight: - { - //技能右侧的技能 - TArray< USkill*> allSkills = context.SkillManager->GetAllSkills(); - int32 index = allSkills.Find(OwnerSkill); - if ((index + 1) < allSkills.Num()) - { - result.Add(allSkills[index + 1]); + result.Add(skill); } break;; - } - case ESkillTargetType::AllLeft: - { - //所有当前技能左侧的技能 - TArray< USkill*> allSkills = context.SkillManager->GetAllSkills(); - int32 index = allSkills.Find(OwnerSkill); - for (int i = 0; i < index; ++i) - { - if (allSkills[i]->GetOwner() == OwnerSkill->GetOwner()) - result.Add(allSkills[i]); - } - break; - } - - case ESkillTargetType::AllRight: - { - //所有当前技能右侧的技能 - TArray< USkill*> allSkills = context.SkillManager->GetAllSkills(); - int32 index = allSkills.Find(OwnerSkill); - for (int i = index + 1; i < allSkills.Num(); ++i) - { - if (allSkills[i]->GetOwner() == OwnerSkill->GetOwner()) - result.Add(allSkills[i]); - } - break; } } } diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp b/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp index f97a7b7..5d5f9b6 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp +++ b/ProjectFish/Source/ProjectFish/Skill/SkillManager.cpp @@ -25,12 +25,12 @@ TStatId USkillManager::GetStatId() const void USkillManager::AddPawn(class APawnWithSkill* Pawn, FIntPoint BagSize) { PawnInfo.Add(Pawn, BagSize); - TMap states; + TMap states; for (int y = 0; y < BagSize.Y; y++) { for (int x = 0; x < BagSize.X; x++) { - states.Add(FIntPoint(x, y), false); + states.Add(FIntPoint(x, y), -1); } } @@ -44,12 +44,11 @@ void USkillManager::AddPawn(class APawnWithSkill* Pawn, FIntPoint BagSize) USkill* USkillManager::AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoint& BagPos) { - TMap* states = PawnBagState.Find(Pawn); + TMap* 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; @@ -58,7 +57,7 @@ USkill* USkillManager::AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoin 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) + || *states->Find(FIntPoint(x, y) + FIntPoint(skillX, skillY)) != -1) { bAddAble = false; } @@ -67,18 +66,19 @@ USkill* USkillManager::AddSkill(FSkillData data, APawnWithSkill* Pawn, FIntPoin //满足条件 if (bAddAble) { + BagPos = FIntPoint(x, y); + USkill* skill = NewObject(this); + skill->InitSkill(Pawn, this, data, BagPos); + Skills.Add(skill); //设置占用状态 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); + states->Add(FIntPoint(xTemp, yTemp) + FIntPoint(x, y), GetSkillIndex(skill)); } } - BagPos = FIntPoint(x, y); - USkill* skill = NewObject(this); - skill->InitSkill(Pawn, this, data); - Skills.Add(skill); + return skill; } } @@ -106,6 +106,36 @@ class USkill* USkillManager::GetSkillByTag(FGameplayTag Tag) return nullptr; } +int32 USkillManager::GetSkillIndex(USkill* Skill) +{ + return Skills.Find(Skill); +} + +TArray USkillManager::GetSkillsAround(USkill* TargetSkill) +{ + TArray aroundSkills; + TMap *BagStates = PawnBagState.Find(TargetSkill->GetOwner()); + FIntPoint BagPos = TargetSkill->GetBagPos(); + FIntPoint BagSize = *PawnInfo.Find(TargetSkill->GetOwner()); + FSkillData data = TargetSkill->GetSkillData(); + int beginX = FMath::Max(0, BagPos.X- 1); + int endX = FMath::Min(BagSize.X - 1, BagPos.X + 1); + int beginY = FMath::Max(0, BagPos.Y - 1); + int endY = FMath::Min(BagSize.Y - 1, BagPos.Y + 1); + for (int x = beginX; x <= endX; x++) + { + for (int y = beginY; y <= endY; y++) + { + + int32 skillIndex = *BagStates->Find(FIntPoint(x, y)); + if (skillIndex != -1 && skillIndex != GetSkillIndex(TargetSkill) && !aroundSkills.Contains(Skills[skillIndex])) + { + aroundSkills.Add(Skills[skillIndex]); + } + } + } + return aroundSkills; +} void USkillManager::RemoveSkill(USkill* Skill) { diff --git a/ProjectFish/Source/ProjectFish/Skill/SkillManager.h b/ProjectFish/Source/ProjectFish/Skill/SkillManager.h index 647407e..edffd5d 100644 --- a/ProjectFish/Source/ProjectFish/Skill/SkillManager.h +++ b/ProjectFish/Source/ProjectFish/Skill/SkillManager.h @@ -32,7 +32,11 @@ public: UFUNCTION(BlueprintPure) class USkill* GetSkillByTag(FGameplayTag Tag); + + int32 GetSkillIndex(USkill* Skill); + UFUNCTION(BlueprintPure) + TArray GetSkillsAround(USkill *TargetSkill); UFUNCTION(BlueprintCallable) void RemoveSkill(class USkill *Skill); @@ -53,5 +57,7 @@ protected: UPROPERTY(BlueprintReadWrite) bool bGameEnd = false; - TMap> PawnBagState; + TMap> PawnBagState; }; + +