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

14.13. Как сделать многоуровневый рюкзак?

В: Как сделать многоуровневый рюкзак?

В: Как сделать предметы в предметах?

Например, щёлкаешь по предмету "Рюкзак", и в окне инвентаря появляется список предметов в рюкзаке.

О:

Списки предметов можно хранить в разных массивах. Например:

! верхний уровень предметов
$ур0_предметы[0]="Дневник заданий"
$ур0_предметы[1]="Рюкзак"
$ур0_предметы[2]="Книга заклинаний"
$ур0_предметы[3]="Кошелёк"
! предметы в рюкзаке
$ур1_предметы[0]="Отвёртка"
$ур1_предметы[1]="Хрустальный шар"
$ур1_предметы[2]="Агар-Агар"

С помощью цикла любой из этих списков можно вывести на экран.

На локации-обработчике выделения предмета можно прописать примерно такой код:

if $selobj="Рюкзак":
! если кликнули по предмету рюкзак
    
! удаляем список предметов верхнего уровня
    killobj
    
! выводим предмет, позволяющий вернуться обратно
    
! к списку предметов верхнего уровня
    addobj "...Назад..."
    
! выводим предметы в рюкзаке
    loop local i=0 while i<arrsize('$ур1_предметы') step i+=1:
        addobj $ур1_предметы[i]
    end
end

if $selobj="...Назад...":
! если кликнули по предмету Назад
    
! удаляем старый список с экрана
    killobj
    
! выводим новый (предметы верхнего уровня)
    loop local i=0 while i<arrsize('$ур0_предметы') step i+=1:
        addobj $ур0_предметы[i]
    end    
end

Если вам нужно более двух списков предметов, то заводить отдельный массив на каждый неразумно. Проще завести два массива:

  • в одном массиве прописывать сам предмет: `$предмет_название[0]="Бутылка кетчупа"`
  • во втором массиве прописывать, где этот предмет находится: `$предмет_расположение[0]="Рюкзак"`

Важно, чтобы индексы и предмета, и его расположения, в каждом массиве совпадали.

Вывести все предметы текущего уровня можно так:

! где-то ранее мы написали, предметы какого уровня нам нужно вывести
$уровень_вложений="Рюкзак"
! очищаем окно предметов от предметов другого уровня
killobj
! выводим предметы текущего уровня в окно предметов
loop local i=0 while i<arrsize("$предмет_название") step i+=1:
! пока счётчик не превысил номер последней ячейки массива
    if $предмет_расположение[i]=$уровень_вложений:
    
! если предмет находится на текущем уровне
        
! выводим в окно предметов предмет, записанный в массив
        addobj $предмет_название[i]
    end
end