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

20.1. Как сделать возврат на предыдущую локацию?

В: Как сделать возврат на предыдущую локацию?

О:

В общем виде это делается так:

  • "Запоминаем" название текущей локации в какой-нибудь переменной.
  • При переходе на новую локацию создаём действие, гиперссылку или предмет, по нажатию на которые произойдёт переход на предыдущую локацию (которую мы "запомнили").

Для примера рассмотрим пару частных случаев.

Сделаем действие, которое будет появляться в каждой локации, и по нажатию на которое можно будет вернуться на предыдущую посещённую локацию.

Для начала создадим локацию-обработчик перехода на новую локацию. Назвать её можно как угодно, например "при_переходе".

Теперь нужно указать плееру, какую локацию он должен использовать как локацию-обработчик перехода на новую локацию. Для этого в переменную `$onnewloc` помещаем название нашей новой созданной локации. Пишем, например, на самой первой локации в игре:

$onnewloc="при_переходе"

Теперь всякий раз при переходе на локацию по `goto` или `xgoto` автоматически будет выполняться код локации "при_переходе". Вот на ней мы и пишем следующий код:

!#при_переходе
! сохраняем название предыдущей посещённой локации
$back_loc=$now_loc
! запоминаем название текущей локации
$now_loc=$curloc

! теперь если нам есть куда вернуться
if $back_loc<>"":
    
! создаём действие возврата
    act "Вернуться":
        goto $back_loc
    
! закрываем действие
    end
! закрываем условие
end

Вот такой короткий код позволит нам возвращаться на предыдущую локацию.

К примеру, если игрок посетил сначала локацию "коридор", в `$now_loc` записалось название "коридор". Затем он перешёл на локацию "спальня", в `$back_loc` записалось значение из `$now_loc`, то есть "коридор", а в `$now_loc` — "спальня". Если нажать действие "Вернуться", игрок вернётся на локацию "коридор".

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

Если есть необходимость "пролистывать" локации в порядке обратном прохождению, можно немного модифицировать код:

!#при_переходе
if $back_loc[]<>$curloc:
! если в последней ячейке массива
! ещё не записано название текущей локации
    
! вписываем
    $back_loc[]=$curloc
end

! создаём действие возврата
act "Вернуться":
    
! получаем размер массива
    local array_size=arrsize('$back_loc')
    
! удаляем последнюю ячейку
    killvar '$back_loc',array_size-1
    
! переходим на предыдущую локацию
    goto $back_loc[]
! закрываем действие возврата
end

Данный код лишён недостатков предыдущего и удобен там, где может потребоваться возвращаться на несколько локаций назад. Например, в книгах-играх.

Если нам нужен предмет, который будет работать, как действие "Вернуться", снова изменим код.

Во-первых, нам понадобится ещё одна служебная локация — локация-обработчик выделения предмета. Опять же, название может быть любым, например, "предмет_выделен". И как и с локацией-обработчиком перехода на новую локацию, необходимо указать плееру, какую локацию ему следует использовать как локацию-обработчик выделения предмета. Пишем, например на самой первой локации в игре:

$onobjsel="предмет_выделен"

И добавляем в окно предметов предмет для возврата. Можно так же на самой первой локации:

addobj "Вернуться"

На локации "при_переходе" оставляем только эту часть:

!#при_переходе
if $back_loc[]<>$curloc:
    $back_loc[]=$curloc
end

На локации "предмет_выделен" пишем следующее:

if $selobj="Вернуться":
! если выделен предмет "Вернуться"
    local array_size=arrsize('$back_loc')
    killvar '$back_loc',array_size-1
    goto $back_loc[]
end

Модифицируя и комбинируя эти способы, вы можете добиться нужного поведения кнопок для возврата на предыдущие локации.

Так же почитайте тему "Как сделать?", там не раз задавлись подобные вопросы, наверняка вы найдёте подходящий вариант для себя.