RU

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

Nex Moderator 05.06.2014 15:00 32 comments 25293 views

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

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

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

! В локации, из которой надо вернуться на предыдущую:
ACT 'Вернуться':
    GOTO $prevLoc
END
Edited at 06.07.2014 17:11 (11 years ago)

В локации “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
Edited at 14.07.2014 09:27 (11 years ago)

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 локацию.

Log in or Register to post comments.