Возврат на предыдущую локацию
Запоминаем текущую локацию при переходе, чтобы потом вернуться на неё.
! В начале игры назначаем обработчик перехода на новую локацию.
$ONNEWLOC = 'ONNEWLOC'
! В локации "ONNEWLOC":
IF $CURLOC <> $nextLoc:
$prevLoc = $nextLoc
$nextLoc = $CURLOC
END
! В локации, из которой надо вернуться на предыдущую:
ACT 'Вернуться':
GOTO $prevLoc
END
В локации “ONNEWLOC”:
if $CURLOC ! $nextLoc:
$prevLoc = $nextLoc
$nextLoc = $CURLOC
end
evp,
спасибо за замечание. Действительно, такой код более подходит. Отредактировал.
В локации “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,
Зачем такие навороты? :)
И интуиция мне подсказывает, что этот код может не работать. Например из-за обращения к массиву по индексу -1.
-1?
Обращения по такому индексу не произойдет. Подумайте, почему.
Но, в общем-то, этот код лучше использовать не как замену оригинальному, а совместно с ним. Для этого надо в нем не присваивать результат переменной $prevLoc, а использовать другую, например, $prevHLoc.
Очень часто встречаются локации с единственным настоящим выходом, но переменная $prevLoc приведет вас не туда, куда вы рассчитывали.
Пример: комната с одним выходом, а в ней шкаф, оформленный отдельной локацией, в шкафу - аналогичная шкатулка, в шкатулке - яйцо Кащея какое-нибудь зеркало-локация. Посетив такие псевдо-локации, вы хотите уйти из комнаты. Но не просто уйти, а уйти именно туда, откуда вы когда-то попали в эту комнату. В этом вам поможет $prevHLoc.
Поправил свой код с учетом сказанного.
evp:
Обращения по такому индексу не произойдет. Подумайте, почему.
Обращение по такому индексу происходит, но ошибки не возникает. Я забыл, как qsp себя ведёт, но вроде обращение переадресовывается по индексу 0. Проверку “and ARRSIZE (’$historyLoc’)” можно убрать. А код работает, интуиция меня подвела.
newsash:
Я забыл, как qsp себя ведёт, но вроде обращение переадресовывается по индексу 0.
Не переадресовывается.
nirvana[] = 1
*nl nirvana[no 0]
На выходе получаем 0.
Еще одно важное замечание. В силу особенностей работы локации $ONNEWLOC, у вас не получится работать с переменной $prevLoc в коде вашей локации. Например, если вы попытаетесь использовать ссылку:
'<a href = "exec: gt ''<<prevLoc>>''">Назад</a>'
Вы будете несколько разочарованы, так как она приведет вовсе не на предыдущую локацию. Так получается потому, что переменная $prevLoc в момент формирования ссылки еще не обновила своего значения (она “станет правильной” после выполнения кода всей локации). Следовательно, с ней можно полноценно работать только в действиях (act: gt $prevLoc).
Но было бы жалко потерять такое изящное решение, как предложенное в первом сообщении. Могу предложить возможный выход: использовать в коде локации что-то наподобие
'<a href = "dynamic $moveBackward">Назад</a>'
Где
$moveBackward = {
gt $prevLoc
}
Саму переменную $moveBackward можете определить в стартовой локации или любой другой подходящей для этой цели.
Вы будете несколько разочарованы, так как она приведет вовсе не на предыдущую локацию.
Ещё бы. Ведь ты забыл знак “$”.
А использовать предыдущую очень просто: на этапе выполнения кода локации она хранится в $nextLoc.
Что касается конкретно твоего примера со ссылкой, следует убрать подвыражения, тогда на момент нажатия ссылки в переменной уже будет корректное значение.
'<a href = "EXEC: GOTO $prevLoc">Назад</a>'
Nex:
Ещё бы. Ведь ты забыл знак “$”.
Угу. Это просто опечатка.
Может кто-то предложить простой способ использования $prevLoc в коде локации, исключая действия (gt и ссылки)?
К примеру, вот в таком сценарии:
if $prevLoc = 'a': $img = 'a.jpg'
if $prevLoc = 'b': $img = 'b.jpg'
...
some code
...
act 'bla-bla': gt $curLoc
evp,
Nex:
использовать предыдущую очень просто: на этапе выполнения кода локации она хранится в $nextLoc.
evp:
act ‘bla-bla’: gt $curLoc
evp,
и чего? Тебе нужно было использование предыдущей локации в коде локации, я тебе показал.
В чём вопрос-то?
Непонятно в чем вопрос? Ладно, подробнее.
if $nextLoc = 'a': $img = 'a.jpg'
if $nextLoc = 'b': $img = 'b.jpg'
...
some code
...
act 'bla-bla': gt $curLoc
При перезаходе на локацию этот код будет работать некорректно, но зато правильно будет работать код, который я привел четырьмя постами выше.
Если мы хотим, чтобы локация реагировала на то, откуда в нее зашли, придется либо городить нечто типа условий runOnce, либо непосредственно передавать название “локации-отправителя” в переменной либо еще какие-то костыли городить. А хочется простого и универсального способа определения откуда пришли.
Пока что я вижу только такой вариант: все, абсолютно все gt в коде заменить на dynamic $GoToLoc, $NextLoc
где dynamic $GoToLoc:
$GoToLoc = {
if $ARGS[0] ! $CURLOC: $prevLoc = $CURLOC
gt $ARGS[0]
}
Но мне этот вариант не нравится тем, что приходится решать задачу тупо “в лоб”. Вот и думаю, может кто придумал способ не добавляя ничего в коды локаций достигнуть поставленной цели: просто проверить некую переменную и узнать, откуда пришли. И, конечно, желательно не заменять стандартные операторы на самописные :)
В коде Некса из первого поста темы такой проблемы нет.
Если требуется оформить переход из локации в себя же, как переход, то есть два варианта:
1) Менять $prevLoc вручную
$prevLoc = $curloc
gt $curloc
2) Если такое требуется очень часто, то придется модифицировать условие $CURLOC <> $nextLoc в onnewloc. Можно сделать две переменные - в одной хранить предыдущую локацию, в другой - предыдущую не $curloc локацию.