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

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

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

В: Как делать стакающиеся предметы?

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

О:

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

addobj "Грибочек"

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

if грибочек=0:
! если мы ещё не собрали ни одного грибочка
    
! добавляем предмет
    addobj "Грибочек"
end
! увеличиваем число собранных грибочков на 1
грибочек=грибочек+1

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

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

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

! увеличиваем число грибочков
грибочек=грибочек+1
! добавляем предмет с указанным количеством
addobj "Грибочек (<<грибочек>> шт.)"

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

! удаляем старый предмет
delobj "Грибочек (<<грибочек>> шт.)"
! увеличиваем число грибочков
грибочек=грибочек+1
! добавляем предмет с новым количеством
addobj "Грибочек (<<грибочек>> шт.)"

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

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

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

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

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