public void UpdateEfficiency(float deltaTime, IBosServiceCollection services) { IManagerService service = services.ManagerService; if (generatorData.Type == GeneratorType.Normal && services.PlanetService.IsMoonOpened) { if (services.SecretaryService.IsLoaded == false) { return; } //when efficiency dropped to minimum values than we stop fatig accumulation if (BosMath.Approximately(Efficiency(services), service.MinManagerEfficiency)) { fatigueValue = 0; return; } double managerFatigueSpeed = service.GetManagerFatigueEfficiencySpeed(Id); double changeForOneReport = Services.SecretaryService.GetEfficiencyChangeForOneReport(Id); double deltaFatig = deltaTime * managerFatigueSpeed; fatigueValue += deltaFatig; double oldEfficiency = Efficiency(services); double removedTotal = 0; LogFatigueState(new LogManagerEfficiencyData { CurrentFatigue = fatigueValue, FatigueForReport = changeForOneReport, FatigueSpeed = managerFatigueSpeed, Id = Id }); if (fatigueValue >= changeForOneReport) { int loops = (int)(fatigueValue / changeForOneReport); removedTotal = loops * changeForOneReport; fatigueValue -= Math.Abs(removedTotal); services.SecretaryService.TryAddReports(Id, loops); } if (removedTotal > 0) { var drop = new GameEvents.EfficiencyDrop { Value = -removedTotal, Manager = this }; GameEvents.EfficiencyDropObservable.OnNext(drop); GameEvents.OnEfficiencyDrop(drop); } } }