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

14.10. Как сделать два списка предметов?

В: Как сделать два списка предметов? Например для игры за разных персонажей.

О:

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

! список предметов персонажа Вася
$вася_предметы[0]="Отвёртка"
$вася_предметы[1]="Гаечный ключ"
$вася_предметы[2]="Ножовка"
! список предметов персонажа Петя
$петя_предметы[0]="Радиоактивный пепел"
$петя_предметы[1]="Хрустальный шар"
$петя_предметы[2]="Апельсин"

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

! добавляем предмет в окно предметов
addobj "Бутылка кетчупа"
! запоминаем название предмета в массиве
$петя_предметы[]="Бутылка кетчупа"

Пустые квадратные скобки после названия массива означают, что нужно записать значение в ячейку следующую за последней (в новую).

Удаление предмета соответственно будет выглядеть так:

! удаляем предмет из окна предметов
delobj "Бутылка кетчупа"
! удаляем запись о предмете из массива
killvar "$петя_предметы",arrpos("$петя_предметы","Бутылка кетчупа")

Когда нам нужно сменить персонаж, мы делаем следующее:

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

Можно написать универсальные локации для каждого из этих алгоритмов и использовать их, когда нужно. Для подробностей см. оператор `gosub`.

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

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

Добавление предмета немного усложнится:

! добавляем предмет в окно предметов
addobj "Бутылка кетчупа"
! добавляем название в список и указываем, кому принадлежит
$предмет_название[]="Бутылка кетчупа"
$предмет_расположение[]="Петя"

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

! удаляем предмет из окна предметов
delobj "Бутылка кетчупа"
! удаляем и название предмета из списка и его расположение
i=arrpos("$предмет_название","Бутылка кетчупа")
killvar "$предмет_название",i
killvar "$предмет_расположение",i

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

! где-то ранее мы написали имя персонажа в переменную
$персонаж_имя="Петя"

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