protected virtual void OnAreaUpdateEvent(AreaUpdateEventArgs e)
 {
     if (AreaUpdateEvent != null) AreaUpdateEvent.Invoke(this, e);
 }
        /// <summary>
        /// AreaUpdate Event
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="areaUpdateEventArgs"></param>
        private void OnAreaUpdateEvent(object sender, AreaUpdateEventArgs areaUpdateEventArgs)
        {
            try
            {
                var receivedAreaUpdate = areaUpdateEventArgs.Area;
                if (receivedAreaUpdate == null) return;

                GuiArea foundArea = this.GUIGameInstance.AreaList.FirstOrDefault(x => x.AreaId.Equals(receivedAreaUpdate.AreaId));
                if (foundArea == null) return;

                if (receivedAreaUpdate.Status == Area.AreaStatus.CorrectlyPassed)
                {
                    // When correctly passing a field, reset all wrongly passed field
                    foreach (var area in GUIGameInstance.AreaList)
                    {
                        area.Status = Area.AreaStatus.None;
                    }

                    foreach (var area in GUIGameInstance.Path)
                    {
                        GuiArea foundPathArea = this.GUIGameInstance.AreaList.FirstOrDefault(x => x.AreaId.Equals(area.AreaId));
                        if (area.Equals(foundArea))
                        {
                            break;
                        }

                        if (foundPathArea != null)
                            foundPathArea.Status = Area.AreaStatus.CorrectlyPassed;
                    }
                }

                foundArea.Status = receivedAreaUpdate.Status;
            }
            catch (Exception ex)
            {
                this.ShowInformationOverlay(ex.Message);
            }
        }