Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su

13.5. Не работает `*pl` в действии с `goto`

В: Не работает `*pl` в действии с `goto`.

Ожидаю, что при нажатии на действие на экране появится текст, а действие исчезнет, но этого не происходит. Вот код в поле "выполнить при посещении" локации:

if hide_act=0:
    act 'Далее':
        hide_act=1
        *pl 'Действие скрылось.'
        goto $curloc
    end
end

О:

Необходимо чётко представлять, как работает плеер в этом случае.

Сначала проверяется условие `hide_act=0`. Если условие верно, плеер выводит на экран действие "Далее". Этому действию соответствует набор команд:

hide_act=1
*pl 'Действие скрылось.'
goto $curloc

При нажатии на действие, команды выполняются по порядку:

hide_act=1                    ! переменной hide_act присваивается значение 1
*pl 'Действие скрылось.'    ! на экран выводится строка текста
goto $curloc                ! плеер перезаходит на текущую локацию

Итак, казалось бы всё правильно. Строка текста должна появиться на экране, а затем происходит повторный вход на текущую локацию. Однако при выполнении команды `goto` плеер очищает окно основного описания и окно действий. Именно поэтому действие при перезаходе на локацию "пропадёт". И именно поэтому мы не успеем увидеть, как надпись "Действие скрылось." будет выведена на экран.

Эту проблему можно решить следующим образом:

if hide_act=0:
    act 'Далее':
        hide_act=1
        *pl 'Действие скрылось.'
        wait 1500
        goto $curloc
    end
end

Так между выведением надписи на экран и переходом на текущую локацию будет задержка полторы секунды. Это не лучший способ, поскольку любая задержка, когда ничего нельзя сделать в игре, довольно сильно раздражает игрока. Намного правильнее выводить надпись, как и действие, по условию:

if hide_act=1:
    *pl 'Действие скрылось.'
end
if hide_act=0:
    act 'Далее':
        hide_act=1
        goto $curloc
    end
end