Beispiel #1
0
        public Running_Event AddEvent(string name, List <FunScriptAction> actions, bool synced_by_animation)
        {
            Running_Event new_event = new Running_Event(name, actions, synced_by_animation);

            lock (running_events)
            {
                running_events.Add(new_event);
            }
            ForceUpdate();
            EventListUpdated?.Invoke(this, EventArgs.Empty);
            return(new_event);
        }
Beispiel #2
0
        private async void UpdateLoop()
        {
            double old_position = 0;
            double new_position = 0;
            double cur_position = 0;
            bool   paused       = false;

            while (!disposed)
            {
                Thread.Sleep(5);
                //if (!gameRunning) continue;
                //check if there are running events
                bool has_events = false;
                lock (running_events)
                {
                    has_events = running_events.Count != 0;
                }



                if (!has_events)
                {
                    old_position = 0;
                    new_position = 0;
                    await Set(0);
                    await Set(0, 300);

                    continue;
                }


                DateTime timeNow = DateTime.Now;
                if (!Game_Running)
                {
                    if (!paused)
                    {
                        paused = true;
                        double position = ((double)(timeNow - prevUpdate).TotalMilliseconds / (double)(nextUpdate - prevUpdate).TotalMilliseconds * (new_position - old_position)) + old_position;
                        await Set(position, 100);                        //pause at current possition
                        await Set(0);
                    }
                    continue;
                }

                if (paused)
                {
                    paused = false;
                    ForceUpdate();
                }


                if (timeNow >= nextUpdate)
                {
                    List <double> positions = new List <double>();

                    lock (running_events)
                    {
                        //update all events and find next update time
                        foreach (Running_Event running_event in running_events)
                        {
                            running_event.Update(timeNow);
                        }

                        //remove events that are done
                        for (int i = running_events.Count - 1; i >= 0; i--)
                        {
                            if (running_events[i].ended)
                            {
                                running_events.RemoveAt(i);
                                EventListUpdated?.Invoke(this, EventArgs.Empty);
                            }
                        }

                        //find earliest time at wich point we need to do a update again
                        foreach (Running_Event running_event in running_events)
                        {
                            if (nextUpdate < running_event.nextTime)
                            {
                                prevUpdate = timeNow;
                                nextUpdate = running_event.nextTime;
                            }
                        }

                        //Find positions of all events at next update location
                        foreach (Running_Event running_event in running_events)
                        {
                            positions.Add(running_event.GetPosition(nextUpdate) / 99.0d);
                        }
                    }

                    if (positions.Count == 0)
                    {
                        //No events are plaing on this device so we can set it back to position 0
                        old_position = 0;
                        new_position = 0;
                        await Set(0, 1000);

                        continue;
                    }


                    //avarage the positions to get final position
                    double position = 0;
                    foreach (double p in positions)
                    {
                        position += p;
                    }

                    new_position = Math.Min(position / positions.Count, 99d);
                    old_position = cur_position;


                    Debug_Message?.Invoke(this, new StringArg(String.Format("Current position:{0}, New position:{1}", cur_position, new_position)));
                    //calculate duration to next point
                    uint duration = (uint)(nextUpdate - timeNow).TotalMilliseconds;
                    try
                    {
                        await Set(new_position, duration);
                    }catch { }

                    //We want to update it directly
                    nextIntermediateUpdate = timeNow;
                }

                if (timeNow >= nextIntermediateUpdate)
                {
                    nextIntermediateUpdate = timeNow + IntermediateUpdateInterval;
                    double old_cur_position = cur_position;
                    cur_position = ((double)(timeNow - prevUpdate).TotalMilliseconds / (double)(nextUpdate - prevUpdate).TotalMilliseconds * (new_position - old_position)) + old_position;
                    if (Double.IsNaN(cur_position) || Double.IsInfinity(cur_position))
                    {
                        cur_position = old_cur_position;
                    }

                    double test = Math.Abs(new_position - old_position) / (double)(nextUpdate - prevUpdate).TotalMilliseconds * 200;
                    Debug_Message?.Invoke(this, new StringArg(String.Format("Intermediate Update Strength: {0} or {1}", cur_position, test)));
                    try
                    {
                        //await Set(test);
                        await Set(cur_position);
                    }
                    catch { }
                }
            }
        }