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

14.6. Как делать динамические/считаемые предметы?

В: Как делать динамические/считаемые предметы? В: Как делать стакающиеся предметы? В: Как делать предметы, рядом с названиями которых выводится их количество?

О: Допустим, на разных локациях мы можем подбирать одинаковые предметы с названием "Грибочек". Если мы просто пропишем везде команду:

addobj "Грибочек"

, то наш инвентарь окажется захламлён множеством одинаковых "Грибочков". Чтобы избежать этого, обычно заводят переменную, которая ведёт подсчёт числа предметов, и тогда код каждого подъёма грибочков слегка усложняется:

if грибочек = 0:
! если мы ещё не собрали ни одного грибочка

! добавляем предмет

addobj "Грибочек"
end
! увеличиваем число собранных грибочков на 1

грибочек += 1

Затем можно выводить число грибочков на экран при щелчке по предмету "Грибочек".

Но как же сделать, чтобы в окне инвентаря отображалась актуальная информация о числе "Грибочков", и нам не приходилось щёлкать по предмету?

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

! увеличиваем число грибочков

грибочек += 1
! добавляем предмет с указанным количеством

addobj "Грибочек (<<грибочек>> шт.)"

А чтобы с экрана пропадал предмет со старым названием, необходимо его предварительно удалить с помощью оператора delobj:

! удаляем старый предмет

delobj "Грибочек (<<грибочек>> шт.)"
! увеличиваем число грибочков

грибочек += 1
! добавляем предмет с новым количеством

addobj "Грибочек (<<грибочек>> шт.)"

Иными словами, всякий раз, как мы изменяем количество, предмет со старым названием удаляется из инвентаря, а предмет с новым, актуальным названием добавляется в инвентарь.

При этом у вас могут возникнуть сложности со взаимодействием с этим предметом, например, в локации-обработчике выделения предмета, поскольку теперь нельзя будет точно предсказать, в какой момент игры, какое будет у предмета название. Условие:

if $selobj = "Грибочек":

не сработает. В этом случае нужно проверять только часть названия, например с помощью функции instr:

if instr($selobj, "Грибочек") <> 0: