RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2425475 views

Aleks Versus, werewolf,
Спасибо. Я же учусь и мне нужен работающий пример. Карты игральные и карты топографические, на мой непросвещенный взгляд, самое то, для понимания многомерных массивов.
Сразу же возник вопрос по записи массива. В одном случае написано:
$карта[’<<$X>>_<<$Y>>’]
В другом:
$пространство[’<<X>>,<<Y>>’]
Это одно и то же?

Aleks Versus Moderator 10.06.2015 13:01 (10 years ago)

svandrus,
индекс элемента ТЕКСТОВЫЙ. То есть это просто строка, в которой ты указываешь цифры. Ты можешь выбрать любую форму записи, какая тебе будет удобна и наглядна:

$пространство['<<X>>,<<Y>>']
$пространство['<<X>>_<<Y>>']
$пространство['<<X>>:<<Y>>']
$пространство['x=<<X>>;y=<<Y>>']

главное, чтобы числа стояли правильные, и чтобы на протяжении всей игры в индексе соблюдалась одна форма записи. Понятно объясняю? А то мне кажется, что не понятно.)
Посмотри модуль карты. Там вроде тоже есть двумерный массив.

Aleks Versus,
Понятно-понятно. Я уже как бы и сам дошёл, но просто хочется быть уверенным - вижу две разных формы записи, значит, ага, это ж-ж-ж неспроста. Не станут же умные программисты делать лишние способы записи одного и того же.. Хотя есть let и set, как наследие чего-то там мудрёного…

Добрый день!
Не могли бы Вы подсказать, в чём тут заключается ошибка, я только учусь и всю голову уже себе сломал переделывая этот код.

Spoiler

if $args[0] = ‘Бутылка эля’:
‘<center><img src=“images/produkt/ale.jpg” ></center>’
‘<center>Бутылка эля (+ 10 к опьянению)</center>’
act ‘Выпить’:
alc += 10
ale -= 1
gs ‘stat’
gt $prevloc
end
!….
act ‘Не пить пока’: gt $prevloc
end

Бутылка эля лежит в сумке, нужно этот эль либо ‘выпить’, либо ‘Не пить пока’ и после любого действия вернуться обратно, в итоге получаю вот что:

Spoiler

Буду очень благодарен, если поможете! :)

Что в строке 12 то?
Судя по всему gt $prevloc. Уверен что в $prevloc сидит имя существующей локации?

Если не уверен, выведи ее значение на экран и проверь.

Хм, ну персонаж переходит с этой локации чтобы выпить эль, значит она существует. Вот только локация, это сумка в которой лежит эль.
Допустим персонаж стоит на улице, открывает сумку (она открывается в “Дополнительное описание”), там лежит ‘Бутылка эля’, он должен выпить её и вернуться обратно.
Получается я пытаюсь вернуть персонажа в сумку? :D Всё, что мне нужно, это выпить эль и вернуться на ту локацию, где был при открытии сумки и выпивки эля.

Я не совсем понял, что значит вывести её значение на экран и проверить. :|

Напиши сверху кода:
‘<<$prevLoc>>’
Где записывается вот это?
$prevLoc = $curloc

Добавил сверху кода, вот что вышло:

Spoiler

1 - ‘<<$prevLoc>>’
2 - if $args[0] = ‘Бутылка эля’:
3 - ‘<center><img src=“images/produkt/ale.jpg” ></center>’
4 - ‘<center>Бутылка эля (+ 10 к опьянению)</center>’
5 - act ‘Выпить’:
6 - alc += 10
7 - ale -= 1
8 - gs ‘stat’
9 - gt $prevloc
10 - end
11 - !….
12 - act ‘Не пить пока’: gt $prevloc
13 - end

Но ничего не изменилось.
А что касается:
$prevLoc = $curloc
Такого у меня нету, есть вот, что:

Spoiler

1 - if $CURLOC ! $nextLoc:
2 - $prevLoc = $nextLoc
3 - $nextLoc = $CURLOC
4 - end

А располагается это в локации ONNEWLOC

flipslam,
Теперь и мне стало интересно. А почему у тебя не показывает ‘<<$prevLoc>>’? Должно показывать, я проверял. Запусти игру и посмотри, что написано сверху, только кнопки не нажимай..
Эта штука на ONNEWLOC запоминает предыдущую локацию…Если сумка отдельной локацией, значит в сумку и вернёшься…
Сообщение о несуществующей локации может появляться если $prevloc забрано в кавычки…

По идее здесь в самом верху должна быть надпись ‘<<$prevloc>>’, как я понимаю?

Spoiler

Но как видите её тут нет, в сумку он возвращаться не хочет, как сделать по другому не знаю )

В общем переделал всё и сделал без лишних локаций, по простенькому, возможно когда допрёт как сделать так, как задумывал, верну всё обратно :)
Теперь это выглядит так:

Spoiler

if ale > 0:pl’У вас есть бутылка эля. <a href=“exec:ale -= 1 & alc += 10 & gs’’stat’’”><b>Выпить</b></a>’
end

Edited at 11.06.2015 18:38 (10 years ago)

flipslam,
Сделай заход в сумку через gs. Тогда с улицы не уйдешь и к действиям добавится то, что есть на локации “Сумка”.
На локации улица:

act 'Посмотреть содержимое сумки':
gs 'Сумка'
end

На локации Сумка

act 'Выпить эль':
alco += 10
ale -= 1
gt $curloc
end

P.S. Что-то меня заносить начало… Советы раздавать стал…
P.P.S. Но вот почему не выводится название предыдущей запомненной локации я не понял.
UPD. Ещё может не выводиться, поскольку её действительно нет и эта локация самая первая.. Может взрослые что подскажут?

Если немного подумать, то станет понятно, что в

1 - '<<$prevLoc>>'

для целей отладки смысла нет, от слова “совсем”.

Ибо, локация $ONNEWLOC обрабатывается после выполнения кода текущей локации, но до передачи управления игроку. Таким образом, в переменной $prevLoc на момент выполнения кода

'<<$prevLoc>>'

будет записана не предыдущая локация, а локация перед предыдущей.

Итак, если вы хотите отладку, то делайте, примерно так:
Локация ‘history’:

if $CURLOC ! $nextLoc:
	$prevLoc = $nextLoc
	$nextLoc = $CURLOC
end

Локация ‘Сумка’:

gs 'history'
*nl $prevLoc 
if $args[0] = 'Бутылка эля': 
    '<center><img src="images/produkt/ale.jpg" ></center>' 
    '<center>Бутылка эля (+ 10 к опьянению)</center>' 
    act 'Выпить': 
        alc += 10 
        ale -= 1 
        gs 'stat' 
        gt $prevloc 
    end 
    !.... 
    act 'Не пить пока': gt $prevloc
end

Либо просто в локации “Сумка”:

if $args[0] = 'Бутылка эля': 
    '<center><img src="images/produkt/ale.jpg" ></center>' 
    '<center>Бутылка эля (+ 10 к опьянению)</center>' 
    act 'Выпить': 
        alc += 10 
        ale -= 1 
        gs 'stat' 
        gt $prevloc 
    end 
    !.... 
    act 'Не пить пока': gt $prevloc
    act 'PrevLoc???': *nl $prevLoc
end

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

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

evp:

Ибо, локация $ONNEWLOC обрабатывается после выполнения кода текущей локации, но до передачи управления игроку. Таким образом, в переменной $prevLoc на момент выполнения кода будет записана не предыдущая локация, а локация перед предыдущей

Тонкий момент. Получается должно показывать про “позавчера”, а не про “вчера”. Но ведь вообще ни про что не показывает.

Для начала, нужно проверить, назначен ли вообще обработчик на $ONNEWLOC.

В начале игры написано

$ONNEWLOC = 'ONNEWLOC'

?

Spoiler

evp:

Если немного подумать, то станет понятно, что в

1 - '<<$prevLoc>>'

для целей отладки смысла нет, от слова “совсем”.

Ибо, локация $ONNEWLOC обрабатывается после выполнения кода текущей локации, но до передачи управления игроку. Таким образом, в переменной $prevLoc на момент выполнения кода

'<<$prevLoc>>'

будет записана не предыдущая локация, а локация перед предыдущей.

Итак, если вы хотите отладку, то делайте, примерно так:
Локация ‘history’:

if $CURLOC ! $nextLoc:
	$prevLoc = $nextLoc
	$nextLoc = $CURLOC
end

Локация ‘Сумка’:

gs 'history'
*nl $prevLoc 
if $args[0] = 'Бутылка эля': 
    '<center><img src="/images/produkt/ale.jpg" ></center>' 
    '<center>Бутылка эля (+ 10 к опьянению)</center>' 
    act 'Выпить': 
        alc += 10 
        ale -= 1 
        gs 'stat' 
        gt $prevloc 
    end 
    !.... 
    act 'Не пить пока': gt $prevloc
end

Либо просто в локации “Сумка”:

if $args[0] = 'Бутылка эля': 
    '<center><img src="/images/produkt/ale.jpg" ></center>' 
    '<center>Бутылка эля (+ 10 к опьянению)</center>' 
    act 'Выпить': 
        alc += 10 
        ale -= 1 
        gs 'stat' 
        gt $prevloc 
    end 
    !.... 
    act 'Не пить пока': gt $prevloc
    act 'PrevLoc???': *nl $prevLoc
end

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

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

Огромное спасибо!
Использовал первый способ и всё заработало как надо, эль выпивается, никаких ошибок нет )

А сумка открывается таким образом.
Это в стартовой локации

Spoiler

!Рюкзак
addobj ‘Инвентарь’
$menu_bag[0] = ‘Посмотреть сумку:menu_sumka’

А это в локации onobjsel

Spoiler

if $selobj = ‘Инвентарь’:
menu ‘$menu_bag’
end
unsel

+ всё же присутствует ошибка с моей стороны, забыл прописать в стартовой локации это:
$ONNEWLOC = ‘ONNEWLOC’
Если б не увидал тут, даже и не подумал бы об этом )

Log in or Register to post comments.