// starts a stopwatch for this time and compares it with the game time to keep it in sync
        // TODO
        internal void setStartTime(double time)
        {
            gameStartTime = time;

            // run stopwatch
            //watch.Start();

            // use listener and EventParser to get the in-game time of the UX and compare
            // it with the stopwatch to see if there are any time seeks
            // TODO
            listener.add(message => {
                double receivedTime = EventParser.extractSetCurrentReplayTime((string)message);
                lastTimeInGame      = receivedTime;

                if (EventParser.extractReplayFastForwardCaughtUp((string)message) == false)
                {
                    return;
                }
                //double receivedTime = EventParser.extractSetCurrentReplayTime((string)message);

                if (receivedTime != -1.0)
                {
                    Task.Run(() => {
                        timeSeek(receivedTime);
                    });
                }
            });
        }
        // report the time whenever a timeseek happens
        internal void listenToTimeseeks()
        {
            listener.add(message => {
                double receivedTime = EventParser.extractSetCurrentReplayTime((string)message);
                lastTimeInGame      = receivedTime;

                if (EventParser.extractReplayFastForwardCaughtUp((string)message) == false)
                {
                    return;
                }
                //double receivedTime = EventParser.extractSetCurrentReplayTime((string)message);

                if (receivedTime != -1.0)
                {
                    Task.Run(() => {
                        timeSeek(receivedTime);
                    });
                }
            });
        }