Возврат на предыдущую локацию

Возврат на предыдущую локацию

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

Код:

! В начале игры назначаем обработчик перехода на новую локацию.

$ONNEWLOC = 'ONNEWLOC'

! В локации "ONNEWLOC":
IF $CURLOC <> $nextLoc:
    $prevLoc = $nextLoc
    $nextLoc = $CURLOC
END

! В локации, из которой надо вернуться на предыдущую:
ACT 'Вернуться':
    GOTO $prevLoc
END

Изменено: Nex
06.Июл.14 21:11:48
Nex
useravatar
Offline
4277 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

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

В локации "ONNEWLOC":

Код:

if $CURLOC ! $nextLoc:

    $prevLoc = $nextLoc
    $nextLoc = $CURLOC
end

evp
useravatar
Offline
383 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

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

evp,
спасибо за замечание. Действительно, такой код более подходит. Отредактировал.

Nex
useravatar
Offline
4277 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

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

В локации "ONNEWLOC":

Код:

if $CURLOC ! $nextHLoc:

    if $CURLOC = $historyLoc[ARRSIZE ('$historyLoc') - 1] and ARRSIZE ('$historyLoc'):
        killvar '$historyLoc', ARRSIZE ('$historyLoc') - 1
        $nextHLoc = $CURLOC
    else
        $historyLoc[] = $nextHLoc
        $nextHLoc = $CURLOC
    end
    if ARRSIZE ('$historyLoc'): $prevHLoc = $historyLoc[ARRSIZE ('$historyLoc') - 1]
end

Изменено: evp
14.Июл.14 13:27:29
evp
useravatar
Offline
383 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

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

evp,
Зачем такие навороты? smile
И интуиция мне подсказывает, что этот код может не работать. Например из-за обращения к массиву по индексу -1.

newsash
useravatar
Offline
465 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

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

-1?
Обращения по такому индексу не произойдет. Подумайте, почему.

Но, в общем-то, этот код лучше использовать не как замену оригинальному, а совместно с ним. Для этого надо в нем не присваивать результат переменной $prevLoc, а использовать другую, например, $prevHLoc.

Очень часто встречаются локации с единственным настоящим выходом, но переменная $prevLoc приведет вас не туда, куда вы рассчитывали.

Пример: комната с одним выходом, а в ней шкаф, оформленный отдельной локацией, в шкафу - аналогичная шкатулка, в шкатулке - яйцо Кащея какое-нибудь зеркало-локация. Посетив такие псевдо-локации, вы хотите уйти из комнаты. Но не просто уйти, а уйти именно туда, откуда вы когда-то попали в эту комнату. В этом вам поможет $prevHLoc.

Поправил свой код с учетом сказанного.

evp
useravatar
Offline
383 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

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

evp написал(а):

Обращения по такому индексу не произойдет. Подумайте, почему.

Обращение по такому индексу происходит, но ошибки не возникает. Я забыл, как qsp себя ведёт, но вроде обращение переадресовывается по индексу 0. Проверку "and ARRSIZE ('$historyLoc')" можно убрать. А код работает, интуиция меня подвела.

newsash
useravatar
Offline
465 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

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

newsash написал(а):

Я забыл, как qsp себя ведёт, но вроде обращение переадресовывается по индексу 0.

Не переадресовывается.

Код:

nirvana[] = 1

*nl nirvana[no 0]

На выходе получаем 0.

evp
useravatar
Offline
383 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

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

Еще одно важное замечание. В силу особенностей работы локации $ONNEWLOC, у вас не получится работать с переменной $prevLoc в коде вашей локации. Например, если вы попытаетесь использовать ссылку:

Код:

'<a href = "exec: gt ''<<prevLoc>>''">Назад</a>'

Вы будете несколько разочарованы, так как она приведет вовсе не на предыдущую локацию. Так получается потому, что переменная $prevLoc в момент формирования ссылки еще не обновила своего значения (она "станет правильной" после выполнения кода всей локации). Следовательно, с ней можно полноценно работать только в действиях (act: gt $prevLoc).

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

Код:

'<a href = "dynamic $moveBackward">Назад</a>'

Где
$moveBackward = {
    gt $prevLoc
}

Саму переменную $moveBackward можете определить в стартовой локации или любой другой подходящей для этой цели.

evp
useravatar
Offline
383 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

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

Вы будете несколько разочарованы, так как она приведет вовсе не на предыдущую локацию.

Ещё бы. Ведь ты забыл знак "$".

А использовать предыдущую очень просто: на этапе выполнения кода локации она хранится в $nextLoc.

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

Код:

'<a href = "EXEC: GOTO $prevLoc">Назад</a>'

Nex
useravatar
Offline
4277 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Информация

Статистика форума:
 
Всего тем:
974
Всего опросов:
14
Всего сообщений:
16790588
Сообщений на этой неделе:
3
Пользователи форума:
 
Всего пользователей:
2371
Последним зарегистрировался:
Artog