39 lines
1.3 KiB
C#
39 lines
1.3 KiB
C#
using UnityEngine;
|
|
using BaseGames.Core.Save;
|
|
using BaseGames.Player;
|
|
|
|
namespace BaseGames.Progression
|
|
{
|
|
/// <summary>解锁所有指定能力的成就条件(位掩码检查)。</summary>
|
|
[CreateAssetMenu(menuName = "Achievement/Condition/UnlockedAllAbilities", fileName = "COND_UnlockedAllAbilities")]
|
|
public class UnlockedAllAbilitiesCondition : AchievementCondition
|
|
{
|
|
[Tooltip("需要全部解锁的能力组合(位掩码)")]
|
|
public AbilityType requiredAbilities = AbilityType.AllMovement;
|
|
|
|
public override bool IsMet(SaveData save)
|
|
{
|
|
if (save?.Player == null) return false;
|
|
var flags = (AbilityType)save.Player.AbilityFlags;
|
|
return (flags & requiredAbilities) == requiredAbilities;
|
|
}
|
|
|
|
public override float GetProgress(SaveData save)
|
|
{
|
|
if (save?.Player == null) return 0f;
|
|
var flags = (AbilityType)save.Player.AbilityFlags;
|
|
int required = 0, met = 0;
|
|
for (int i = 0; i < 32; i++)
|
|
{
|
|
var bit = (AbilityType)(1u << i);
|
|
if ((requiredAbilities & bit) != 0)
|
|
{
|
|
required++;
|
|
if ((flags & bit) != 0) met++;
|
|
}
|
|
}
|
|
return required > 0 ? (float)met / required : 0f;
|
|
}
|
|
}
|
|
}
|