Перейти к основному содержимому

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