using UnityEngine;
using BaseGames.Player;
namespace BaseGames.Quest
{
///
/// 任务目标基类(抽象,架构 22_QuestChallengeModule §3)。
/// 所有具体目标类型均继承此类,通过多态实现零代码扩展。
/// 每种目标在事件驱动下由 QuestManager 调用 EvaluateCompletion()。
///
public abstract class QuestObjectiveSO : ScriptableObject
{
[Header("标识")]
public string objectiveId;
[TextArea(1, 4)]
public string displayTextKey; // 本地化 key(通过 LocalizationManager.Get(displayTextKey, "Quest") 显示)
public bool IsOptional; // 可选目标(完成加奖励但不阻塞任务)
/// 根据当前进度判断目标是否完成。
public abstract bool EvaluateCompletion(QuestObjectiveState state);
}
// ── 运行时目标进度状态(由 QuestManager 管理,不继承 SO)────────────────
public class QuestObjectiveState
{
public bool completed = false;
public int progressCount = 0;
}
// ── 具体目标类型 ────────────────────────────────────────────────────────
/// 与指定 NPC 对话后完成。
[CreateAssetMenu(menuName = "Quest/Objective/TalkToNPC")]
public class TalkToNPCObjective : QuestObjectiveSO
{
public string targetNpcId;
public override bool EvaluateCompletion(QuestObjectiveState s) => s.progressCount >= 1;
}
/// 击败指定 ID 的敌人若干次。
[CreateAssetMenu(menuName = "Quest/Objective/Defeat")]
public class DefeatEnemyObjective : QuestObjectiveSO
{
public string targetEnemyId;
[Min(1)] public int defeatCount = 1;
public override bool EvaluateCompletion(QuestObjectiveState s) => s.progressCount >= defeatCount;
}
/// 收集指定 ID 的物品若干件。
[CreateAssetMenu(menuName = "Quest/Objective/Collect")]
public class CollectItemObjective : QuestObjectiveSO
{
public string itemId;
[Min(1)] public int collectCount = 1;
public override bool EvaluateCompletion(QuestObjectiveState s) => s.progressCount >= collectCount;
}
/// 到达指定场景/区域标记点后完成。
[CreateAssetMenu(menuName = "Quest/Objective/Reach")]
public class ReachAreaObjective : QuestObjectiveSO
{
public string sceneName; // 需到达的场景
public string markerTag; // 场景内的目标标记 Tag(预留)
public override bool EvaluateCompletion(QuestObjectiveState s) => s.progressCount >= 1;
}
/// 使用指定能力若干次后完成。
[CreateAssetMenu(menuName = "Quest/Objective/UseSkill")]
public class UseSkillObjective : QuestObjectiveSO
{
public AbilityType requiredAbility;
[Min(1)] public int useCount = 1;
public override bool EvaluateCompletion(QuestObjectiveState s) => s.progressCount >= useCount;
}
}