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

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