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

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` НЕ ПРОИСХОДИТ очистка окна основного описания.