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

5.2. Как сделать кнопку "Назад", работающую на каждой локации?

В: Как сделать кнопку "Назад", работающую на каждой локации?

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

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

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

Теперь нам нужно прописать в локации "при_переходе" код, который будет запоминать последнюю локацию.

Если мы напишем просто:

$current_loc = $curloc

Эта строчка кода будет просто прописывать название текущей локации в переменную $current_loc. Например, если у нас есть две локации "комната" и "кухня", то при переходе в "комнату" в $current_loc запишется значение "комната", а при переходе из "комнаты" в "кухню" — значение "кухня".

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

! сохраняем название локации, с которой ушли:

$back_loc = $current_loc
! сохраняем название локации, на которую пришли (текущая)

$current_loc = $curloc

Теперь, когда мы зайдём в "комнату", в $current_loc запишется значение "комната". Если дальше мы перейдём в "кухню", значение "комната" из $current_loc пропишется в $back_loc, то есть в $back_loc окажется значение "комната", а в $current_loc запишется название текущей локации, т.е. значение "кухня".

Осталось только привязать команду перехода, например, к действию. На той же локации "при_переходе" пишем это действие:

if $back_loc <> "":
! если переменная $back_loc не пуста

! создаём действие для возврата

act "Назад":
goto $back_loc
end
end

Данный код позволяет вернуться только на одну локацию назад. То есть, если мы перешли из "кухни" в "комнату", действие "Назад" вернёт нас из "комнаты" в "кухню", а из "кухни" снова в "комнату".

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

if $back_loc[]<>$curloc and back_act=0: 
! если в последнем элементе массива нет названия текущей локации

! а так же если мы совершаем переход не по действию возврата

!записываем в последний элемент массива название текущей локации

$back_loc[]=$curloc
end
! обнуляем переменную back_act, чтобы разрешить запись в массив $back, если мы захотим перейти на новую локацию

back_act=0
! создаём действие возврата

! только если есть куда возвращаться

if arrsize('$back_loc')>1:
act "шаг назад":
! выставляем переменной-маркеру back_act значение 1,

! чтобы запретить запись в массив $back при возврате на предыдущую локацию

back_act=1
! непосредственно переход

! записываем во временную переменную название предыдущей посещённой локации

local $backward = $back_loc[arrsize('$back_loc')-2]
! удаляем из массива текущую локацию

killvar '$back_loc',arrsize('$back_loc')-1
! переходим

goto $backward
end
end