private void UpdateSimulateMode()
    {
        ActionSequence.Action action = actionSequence.get();
        string action_msg            = action.name.Replace("_", MSG_PADDING);
        string message = MSG_SIMULATE_INSTRUCTION.Replace("%1", action_msg);

        if (!currentEntry.actionName.Equals(action.name))
        {
            currentEntry.actionName       = action.name;
            currentEntry.messageTimestamp = GetCurrentUnixTimestampMillis();
        }


        if ((action.name.Equals("Crouch") && !isCrouchDown) || (action.name.Equals("Stand_Up") && !isCrouchDown))
        {
            PrepareForAction(action.name);
        }

        if (actionFinished && !actionSequence.isFinished())
        {
            actionFinished = false;
            simulateStartTimer.StopTimer();
            simulateStartTimer.SetOnTimerDoneListener(new SimulateStartTimerListener(this));
            simulateStartTimer.StartTimer(action.waitingTime);
        }

        if (simulateStartTimerDone)
        {
            simulateStartTimerDone = false;
            simulateEnabled        = true;
            simulateActionTimer.StopTimer();
            simulateActionTimer.SetOnTimerDoneListener(new SimulateActionTimerListener(this));
            simulateActionTimer.StartTimer(action.duration);
            threshTick = action.duration * 100;
        }

        if (simulateEnabled)
        {
            float errorChoice    = 1;
            float errorHasAction = 0;
            if (simulateErrorTimer.isFinished() && Math.Floor(simulateActionTimer.getTimeLeft() * 100) <= threshTick)
            {
                threshTick     = Math.Floor(simulateActionTimer.getTimeLeft() * 100) - 10;
                errorChoice    = UnityEngine.Random.Range(0.0f, 1.0f);
                errorHasAction = UnityEngine.Random.Range(0.0f, 1.0f);
            }

            if (simulateErrorTimer.isFinished())
            {
                actionName = action.name;
            }

            if (errorChoice > simulateErrorProbability && !hasNoAction)
            {
                SimmulateAction(actionName);
            }
            else
            {
                if (simulateErrorTimer.isFinished())
                {
                    SimmulateActionRelease(actionName);
                    simulateErrorTimer.SetOnTimerDoneListener(new SimulateErrorTimerListener(this));
                    simulateErrorTimer.StartTimer(Math.Min(simulateActionTimer.getTimeLeft(), UnityEngine.Random.Range(0.1f, 0.5f)));
                    if (errorHasAction < actionActivationProbability)
                    {
                        var list = new List <string>(keyBindingsCaptions.Keys.ToArray());
                        list.Remove(action.name);

                        actionName = list[UnityEngine.Random.Range(0, list.Count - 1)];

                        SimmulateAction(actionName);
                        hasNoAction = false;
                    }
                    else
                    {
                        hasNoAction = true;
                    }
                }
            }
        }

        if (!simulateWaitingTimer.isFinished())
        {
            isWaitMessage = true;
            message       = MSG_WAIT + Math.Round(simulateWaitingTimer.getTimeLeft());
        }
        else
        {
            if (isWaitMessage)
            {
                worldController.AnimatePlayerTextPosition();
            }

            //if (!simulateEnabled && !simulateStartTimerDone && actionSequence.isLast())
            //{
            //    message = MSG_FINISH;
            //    actionSequence.advance();
            //}

            isWaitMessage = false;
        }

        worldController.UpdatePlayerRequestText(message);
    }