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

108 lines
3.7 KiB
C#
Raw Normal View History

using Framework;
2023-11-06 18:20:55 +08:00
using Framework.Condition;
namespace Gameplay.Level
{
public partial class Level
{
private int _currStageSuccessReactionID;
private int _currStageFailReactionID;
2024-09-23 19:33:59 +08:00
private int[] _currLevelStarReactionIDArray = new int[15];
2023-11-06 18:20:55 +08:00
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;
}
2023-11-08 15:05:19 +08:00
_currStageSuccessReactionID = ConditionReactor.Instance.AddReaction(currStage.successCondition,
OnSuccessConditionChanged, null, false);
2023-11-06 18:20:55 +08:00
if (currStage.failConditions == null || currStage.failConditions.Count == 0)
{
DebugUtil.LogError(
$"currStage's fail condition is null or 0 elements!stageIndex:{currentStageIndex} levelID:{ID}");
return;
}
2023-11-08 15:05:19 +08:00
_currStageFailReactionID = ConditionReactor.Instance.AddReaction(currStage.failConditions,
OnFailConditionChanged, null, false, false);
EventManager.Instance.Register(EventManager.EventName.LevelBattleBegin, CheckSuccessAndFailCondition);
2023-11-07 12:17:14 +08:00
}
2023-11-06 18:20:55 +08:00
private void ReleaseStageConditions()
{
EventManager.Instance.Unregister(EventManager.EventName.LevelBattleBegin, CheckSuccessAndFailCondition);
2023-11-06 18:20:55 +08:00
ConditionReactor.Instance.RemoveReaction(_currStageSuccessReactionID);
ConditionReactor.Instance.RemoveReaction(_currStageFailReactionID);
}
private void CheckSuccessAndFailCondition()
{
ConditionReactor.Instance.ExecuteReaction(_currStageSuccessReactionID);
ConditionReactor.Instance.ExecuteReaction(_currStageFailReactionID);
}
2023-11-06 18:20:55 +08:00
private void OnSuccessConditionChanged(bool result, object param, int id)
{
if (result)
{
OnStageSuccess();
}
}
private void OnFailConditionChanged(bool result, object param, int id)
{
if (result)
{
OnStageFailed();
}
}
2023-11-08 15:05:19 +08:00
private void OnStarConditionChanged(bool result, object param, int id)
{
var index = (int)param;
_starTargets[index] = result;
}
2023-11-06 18:20:55 +08:00
private void InitStarConditions()
{
2024-09-23 19:33:59 +08:00
if (_levelData.scoreLevel) // 评分关
2023-11-08 15:05:19 +08:00
{
2024-09-23 19:33:59 +08:00
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);
}
2023-11-08 15:05:19 +08:00
}
2023-11-06 18:20:55 +08:00
}
private void ReleaseStarConditions()
{
2023-11-08 15:05:19 +08:00
foreach (var reactionID in _currLevelStarReactionIDArray)
{
ConditionReactor.Instance.RemoveReaction(reactionID);
}
2023-11-06 18:20:55 +08:00
}
}
}