Перейти к основному содержимому

1.8. Чем отличается goto от gosub?

В: Чем отличается goto от gosub?

О: Разница между этими двумя командами заключается в том, как ведёт себя плеер при их выполнении.

Команда goto осуществляет переход на указанную локацию:

goto "комната"

При этом происходит следующее:

  1. Плеер, выполняя какой-то код, встречает команду goto и видит название локации, указанное в качестве аргумента.
  2. Плеер "переходит" на указанную локацию. Технически это означает, что функция $curloc будет возвращать название локации, на которую был осуществлён "переход".
  3. При переходе по goto плеер очищает окно основного описания и окно действий.
  4. Далее плеер выводит в окно основного описания "Базовое описание", а в окно действий — "базовые действия". После чего выполняет код из поля "Выполнить при посещении".
  5. Закончив выполнять код из поля "Выполнить при посещении", плеер (опционально) выполняет код из локации-обработчика события "переход на новую локацию" (см. onNewLoc), а затем перестаёт что-либо делать и ждёт участия игрока.

Таким образом, если после команды goto были написаны ещё какие-то команды, эти команды плеер не выполняет, так как уже "находится" на другой локации.

Команда gosub не осуществляет перехода на указанную локацию, она осуществляет её вызов:

gosub "комната"

Здесь плеер ведёт себя по-другому:

  1. Плеер, выполняя какой-то код, встречает команду gosub и видит название локации, указанное в качестве аргумента.
  2. Плеер прерывает выполнение текущего кода, и переходит к локации, указанной в качестве аргумента к gosub.
  3. При этом НЕ ПРОИСХОДИТ очистка окна основного описания и окна действий.
  4. В окно основного описания добавляется текст из "Базового описания", а в окно действий — "базовые действия" локации, указанной аргументом к gosub. Потом выполняется код этой локации из поля "Выполнить при посещении".
  5. Закончив выполнять код из поля "Выполнить при посещении", плеер возвращается к выполнению кода на той локации, где была встречена команда gosub и продолжает выполнение этого кода уже после команды gosub.

Таким образом команда gosub позволяет использовать локации как подпрограммы. Плеер обрабатывает эти локации, но технически не "переходит" на них.

Отличие же xgoto от goto заключается лишь в одном: при переходе по xgoto НЕ ПРОИСХОДИТ очистка окна основного описания.