137 lines
3.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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")
bool AcceptQuest(UQuestAsset* QuestAsset);
/** 完成任务 */
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(FName TargetID, int32 ProgressDelta = 1);
// ========== 任务查询 ==========
/** 获取任务状态 */
UFUNCTION(BlueprintPure, Category = "Quest")
EQuestState GetQuestState(int32 QuestID) const;
/** 获取所有进行中的任务 */
UFUNCTION(BlueprintPure, Category = "Quest")
TArray<UQuestAsset*> GetActiveQuests() 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 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;
/** 已完成的任务ID列表 */
UPROPERTY()
TSet<int32> CompletedQuestIDs;
UPROPERTY()
TArray<UQuestAsset*> QuestAssets;
};