public override void Execute(IImpactScorerData data) { var value = (long)_logic.Calculate(data.Value); var values = _scorers.GetScrorerMap(data.Id, data.StageId); if (values == null) { return; } long delta = 0; switch (data.Operator) { case OperationType.Add: delta = value; values[data.Id] += value; break; case OperationType.Set: delta = value - values[data.Id]; values[data.Id] = value; break; default: throw new ArgumentOutOfRangeException(); } if (delta > 0) { var staticData = _scorers._scorers.Static.MoneyTypes.Values.FirstOrDefault(x => x.ScorerId == data.Id); if (staticData != null && staticData.AchievScorerId != 0) { values = _scorers.GetScrorerMap(staticData.AchievScorerId, 0); if (values != null) { values[staticData.AchievScorerId] += delta; } } } if (_scorers.HasLog(data.Id)) { var logStage = data.StageId; if (logStage == 0) { if (_explorer.State.IsRun) { logStage = _explorer.CurrentStage; } } LogicLog.ChangeScorer(data.Id, data.Operator, value, logStage); } }