161 lines
4.6 KiB
C++
161 lines
4.6 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
||
|
||
#pragma once
|
||
|
||
#include "CoreMinimal.h"
|
||
#include "Subsystems/GameInstanceSubsystem.h"
|
||
#include "../../Quest/QuestTypes.h"
|
||
#include "QuestManager.generated.h"
|
||
|
||
class UQuestAsset;
|
||
|
||
/**
|
||
* 任务运行时数据
|
||
*/
|
||
USTRUCT(BlueprintType)
|
||
struct FQuestRuntimeData
|
||
{
|
||
GENERATED_BODY()
|
||
|
||
/** 任务资产引用 */
|
||
UPROPERTY(BlueprintReadOnly)
|
||
TObjectPtr<UQuestAsset> QuestAsset;
|
||
|
||
/** 任务状态 */
|
||
UPROPERTY(BlueprintReadWrite)
|
||
EQuestState State = EQuestState::NotStarted;
|
||
|
||
/** 目标进度 */
|
||
UPROPERTY(BlueprintReadWrite)
|
||
TArray<FQuestProgress> ObjectiveProgress;
|
||
};
|
||
|
||
// 任务事件委托
|
||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnQuestStateChanged, int32, QuestID);
|
||
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnQuestObjectiveUpdated, int32, QuestID, int32, ObjectiveIndex);
|
||
|
||
/**
|
||
* 任务管理器子系统
|
||
* 负责管理所有任务的状态、进度和存档
|
||
*/
|
||
UCLASS()
|
||
class PROJECTFISH_API UQuestManager : public UGameInstanceSubsystem
|
||
{
|
||
GENERATED_BODY()
|
||
|
||
public:
|
||
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
|
||
virtual void Deinitialize() override;
|
||
|
||
// ========== 任务操作 ==========
|
||
/** 加载本地所有任务 */
|
||
void LoadAllQuests();
|
||
|
||
/** 检测所有可接收的任务 */
|
||
UFUNCTION(BlueprintCallable, Category = "Quest")
|
||
void CheckAcceptableQuests(bool bSaveGameInfo = false);
|
||
|
||
/** 接受任务 */
|
||
UFUNCTION(BlueprintCallable, Category = "Quest")
|
||
bool AcceptQuest(UQuestAsset* QuestAsset, bool bSaveGameInfo = false);
|
||
|
||
/** 接受任务 */
|
||
UFUNCTION(BlueprintCallable, Category = "Quest")
|
||
bool FollowQuest(int32 QuestID, bool Follow);
|
||
|
||
/** 完成任务 */
|
||
UFUNCTION(BlueprintCallable, Category = "Quest")
|
||
bool CompleteQuest(int32 QuestID);
|
||
|
||
/** 放弃任务 */
|
||
UFUNCTION(BlueprintCallable, Category = "Quest")
|
||
bool AbandonQuest(int32 QuestID);
|
||
|
||
// ========== 任务进度 ==========
|
||
|
||
/** 更新任务目标进度(收集物品、击败敌人、到达地点) */
|
||
UFUNCTION(BlueprintCallable, Category = "Quest")
|
||
void UpdateObjectiveProgress(int32 QuestID, int32 ObjectiveIndex, int32 Progress);
|
||
|
||
/** 通过目标ID更新进度(自动查找对应目标) */
|
||
UFUNCTION(BlueprintCallable, Category = "Quest")
|
||
void UpdateObjectiveByTargetID(FGameplayTag TargetTag, int32 ProgressDelta = 1);
|
||
|
||
// ========== 任务查询 ==========
|
||
|
||
/** 获取任务状态 */
|
||
UFUNCTION(BlueprintPure, Category = "Quest")
|
||
EQuestState GetQuestState(int32 QuestID) const;
|
||
|
||
/** 任务是否正在被追踪 */
|
||
UFUNCTION(BlueprintPure, Category = "Quest")
|
||
bool IsQuestFollowing(int32 QuestID) const;
|
||
|
||
/** 获取所有进行中的任务 */
|
||
UFUNCTION(BlueprintPure, Category = "Quest")
|
||
TArray<UQuestAsset*> GetActiveQuests() const;
|
||
|
||
/** 获取所有追踪的任务 */
|
||
UFUNCTION(BlueprintPure, Category = "Quest")
|
||
TArray<UQuestAsset*> GetFollowingQuests() const;
|
||
|
||
/** 获取所有已完成的任务 */
|
||
UFUNCTION(BlueprintPure, Category = "Quest")
|
||
TArray<UQuestAsset*> GetCompletedQuests() const;
|
||
|
||
/** 获取任务进度 */
|
||
UFUNCTION(BlueprintPure, Category = "Quest")
|
||
bool GetQuestProgress(int32 QuestID, TArray<FQuestProgress>& OutProgress) const;
|
||
|
||
/** 获取任务进度 */
|
||
UFUNCTION(BlueprintPure, Category = "Quest")
|
||
bool GetQuestRuntimeData(int32 QuestID, FQuestRuntimeData& OutData) const;
|
||
|
||
/** 检查是否可以接受任务(前置任务检查) */
|
||
UFUNCTION(BlueprintPure, Category = "Quest")
|
||
bool CanAcceptQuest(UQuestAsset* QuestAsset) const;
|
||
|
||
// ========== 存档相关 ==========
|
||
|
||
/** 获取所有任务的存档数据 */
|
||
UFUNCTION(BlueprintCallable, Category = "Quest")
|
||
TArray<FQuestSaveData> GetQuestSaveData() const;
|
||
|
||
/** 从存档数据加载任务 */
|
||
UFUNCTION(BlueprintCallable, Category = "Quest")
|
||
void LoadFromSaveData(const TArray<FQuestSaveData>& SaveData);
|
||
|
||
// ========== 事件 ==========
|
||
|
||
/** 任务状态改变事件 */
|
||
UPROPERTY(BlueprintAssignable, Category = "Quest|Events")
|
||
FOnQuestStateChanged OnQuestStateChanged;
|
||
|
||
/** 任务目标更新事件 */
|
||
UPROPERTY(BlueprintAssignable, Category = "Quest|Events")
|
||
FOnQuestObjectiveUpdated OnQuestObjectiveUpdated;
|
||
|
||
protected:
|
||
/** 检查任务是否完成 */
|
||
void CheckQuestCompletion(int32 QuestID);
|
||
|
||
/** 初始化任务运行时数据 */
|
||
FQuestRuntimeData CreateRuntimeData(UQuestAsset* QuestAsset);
|
||
|
||
private:
|
||
/** 运行时任务数据映射 (QuestID -> RuntimeData) */
|
||
UPROPERTY()
|
||
TMap<int32, FQuestRuntimeData> ActiveQuestsMap;
|
||
|
||
/** 正在追踪的任务列表 */
|
||
UPROPERTY(BlueprintReadOnly, meta = (AllowPrivateAccess = true))
|
||
TSet<int32> FollowingQuestIDs;
|
||
|
||
/** 已完成的任务ID列表 */
|
||
UPROPERTY()
|
||
TSet<int32> CompletedQuestIDs;
|
||
|
||
UPROPERTY()
|
||
TArray<UQuestAsset*> QuestAssets;
|
||
};
|