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

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