public void UpdateExperienceValues(ExperienceData experienceData, int currentExperience, int requiredExperience) { var newCurrentBaseExperience = currentExperience; var requiredBasedExp = requiredExperience; if (newCurrentBaseExperience == int.MinValue || requiredBasedExp == int.MinValue || requiredBasedExp == 15) // for some reason required base exp returns as 15 when char not selected, no idea why { experienceData.Reset(); return; } experienceData.RequiredExperience = requiredBasedExp; if (experienceData.FirstUpdate) { experienceData.PreviousRequiredExperience = requiredBasedExp; experienceData.CurrentExperience = newCurrentBaseExperience; experienceData.FirstUpdate = false; } else if (newCurrentBaseExperience != experienceData.CurrentExperience) // exp hasn't changed, nothing else to do { if (experienceData.RequiredExperience > experienceData.PreviousRequiredExperience) // handle level up scenarios { experienceData.LastExperienceGain = (experienceData.PreviousRequiredExperience - experienceData.CurrentExperience) + newCurrentBaseExperience; experienceData.PreviousRequiredExperience = requiredBasedExp; } else { experienceData.LastExperienceGain = newCurrentBaseExperience - experienceData.CurrentExperience; } experienceData.CurrentExperience = newCurrentBaseExperience; experienceData.GainedExperience += experienceData.LastExperienceGain; } experienceData.ExperiencePerHour = (int)(experienceData.GainedExperience * (TimeSpan.FromHours(1).TotalMilliseconds / experienceData.ElapsedTime.TotalMilliseconds)); experienceData.TimeToLevel = CalculateTimeToLevel(experienceData); // make sure the elapsed time is kept updated every tick, must be called from experience data class experienceData.NotifyOfPropertyChange(() => experienceData.ElapsedTime); experienceDataToTextService.WriteToFile(experienceData); }