NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Level/Level.Condition.cs

108 lines
3.7 KiB
C#

using Framework;
using Framework.Condition;
namespace Gameplay.Level
{
public partial class Level
{
private int _currStageSuccessReactionID;
private int _currStageFailReactionID;
private int[] _currLevelStarReactionIDArray = new int[15];
private void InitStageConditions()
{
var currStage = CurrentStage;
if (currStage == null)
return;
if (currStage.successCondition == null)
{
DebugUtil.LogError(
$"currStage's success condition is null!stageIndex:{currentStageIndex} levelID:{ID}");
return;
}
_currStageSuccessReactionID = ConditionReactor.Instance.AddReaction(currStage.successCondition,
OnSuccessConditionChanged, null, false);
if (currStage.failConditions == null || currStage.failConditions.Count == 0)
{
DebugUtil.LogError(
$"currStage's fail condition is null or 0 elements!stageIndex:{currentStageIndex} levelID:{ID}");
return;
}
_currStageFailReactionID = ConditionReactor.Instance.AddReaction(currStage.failConditions,
OnFailConditionChanged, null, false, false);
EventManager.Instance.Register(EventManager.EventName.LevelBattleBegin, CheckSuccessAndFailCondition);
}
private void ReleaseStageConditions()
{
EventManager.Instance.Unregister(EventManager.EventName.LevelBattleBegin, CheckSuccessAndFailCondition);
ConditionReactor.Instance.RemoveReaction(_currStageSuccessReactionID);
ConditionReactor.Instance.RemoveReaction(_currStageFailReactionID);
}
private void CheckSuccessAndFailCondition()
{
ConditionReactor.Instance.ExecuteReaction(_currStageSuccessReactionID);
ConditionReactor.Instance.ExecuteReaction(_currStageFailReactionID);
}
private void OnSuccessConditionChanged(bool result, object param, int id)
{
if (result)
{
OnStageSuccess();
}
}
private void OnFailConditionChanged(bool result, object param, int id)
{
if (result)
{
OnStageFailed();
}
}
private void OnStarConditionChanged(bool result, object param, int id)
{
var index = (int)param;
_starTargets[index] = result;
}
private void InitStarConditions()
{
if (_levelData.scoreLevel) // 评分关
{
for (int i = 0; i < _levelData.scoreTarget.Count; i++)
{
ConditionModifier conditionModifier = _levelData.scoreTarget[i];
if (null != conditionModifier)
_currLevelStarReactionIDArray[i] = ConditionReactor.Instance.AddReaction(conditionModifier, OnStarConditionChanged, i);
}
}
else // 星级关
{
for (int i = 0; i < STAR_TARGET_COUNT; i++)
{
var condition = _levelData.starTarget[i];
var index = i;
_currLevelStarReactionIDArray[i] =
ConditionReactor.Instance.AddReaction(condition, OnStarConditionChanged, index);
}
}
}
private void ReleaseStarConditions()
{
foreach (var reactionID in _currLevelStarReactionIDArray)
{
ConditionReactor.Instance.RemoveReaction(reactionID);
}
}
}
}