示例#1
0
        public static void ExecuteScheduledEvents()
        {
            var delayedEvents = GameState.Instance.DelayedEvents;

            //reverse iterate, executing scheduled events
            try
            {
                for (int i = delayedEvents.Count - 1; i >= 0; i--)
                {
                    DelayedEvent delayedEvent = delayedEvents[i];

                    if (!delayedEvent.DelayAbsolute)
                    {
                        throw new InvalidOperationException();
                    }

                    double fireTime    = delayedEvent.DelayTime;
                    double elapsedTime = 0;
                    switch (delayedEvent.DelayType)
                    {
                    case DelayTimeType.Real:
                        elapsedTime = GameState.Instance.WorldState.RealTimeElapsed;
                        break;

                    case DelayTimeType.Game:
                        elapsedTime = GameState.Instance.WorldState.GameTimeElapsed;
                        break;

                    case DelayTimeType.World:
                        elapsedTime = GameState.Instance.WorldState.WorldDaysElapsed * SecondsInDay + GameState.Instance.WorldState.WorldSecondsElapsed;
                        break;
                    }

                    if (elapsedTime >= fireTime)
                    {
                        try
                        {
                            delayedEvent.Event.Execute();
                        }
                        catch (Exception e)
                        {
                            Debug.LogError("Failed to execute microscript of delayed event");
                            Debug.LogException(e);
                        }

                        delayedEvents.RemoveAt(i);
                    }
                }
            }
            catch (Exception e)
            {
                Debug.LogException(e);
                GameState.Instance.DelayedEvents.Clear(); //purge the list, something went terribly wrong
            }
        }
示例#2
0
        public static void ScheduleEvent(DelayedEvent ev)
        {
            if (!ev.DelayAbsolute) //if not absolute, calculate absolute time
            {
                switch (ev.DelayType)
                {
                case DelayTimeType.Real:
                    ev.DelayTime = GameState.Instance.WorldState.RealTimeElapsed + ev.DelayTime;
                    break;

                case DelayTimeType.Game:
                    ev.DelayTime = GameState.Instance.WorldState.GameTimeElapsed + ev.DelayTime;
                    break;

                case DelayTimeType.World:
                    ev.DelayTime = GameState.Instance.WorldState.WorldDaysElapsed * SecondsInDay + GameState.Instance.WorldState.WorldSecondsElapsed + ev.DelayTime;
                    break;
                }

                ev.DelayAbsolute = true;
            }

            GameState.Instance.DelayedEvents.Add(ev);
        }