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

20.18. Как сделать склад, сундук, тайник, место, в котором можно выкладывать и хранить предметы?

В: Как сделать склад, сундук, тайник, место, в котором можно выкладывать и хранить предметы?

О:

Решение данного вопроса состоит из двух частей.

Первая часть — это непосредственно создание тайника. Тайник можно реализовать на отдельной локации.

Создаём новую локацию и называем её "тайник". Затем, на локации, где мы располагаем тайник, нужно добавить действие или гиперссылку, которая ведёт на локацию тайник:

act "Открыть сейф":
    goto "тайник"
end

Само собой на локации "тайник" необходимо создать гиперссылку или действие, ведущие на предыдущую локацию.

На этом первая часть решения нашего вопроса окончена. Переходим ко второй части. Непосредственно сброс предметов на локации.

Для того, чтобы игрок мог взаимодействовать с предметами, необходимо завести локацию-обработчик выделения предмета (более подробно об этом прочитайте в разделе "Предметы") и на этой локации прописать код взаимодействия. Тут тоже есть варианты. Вы можете организовать меню предметов, одним из пунктов которого может быть пункт "Выбросить", можете добавить в окно действий действие "Выбросить" на каждый предмет (если их не много), либо (если на локации "тайник" можно только сбрасывать предметы) воспользоваться нижеследующим решением, которое позволяет сбрасывать предметы по клику на них.

Для того, чтобы каждый предмет на локации "тайник" сбрасывался по клику, на локации-обработчике выделения предмета необходимо прописать следующий код:

if $curloc="тайник":
! если текущая локация — "тайник"
    
! записываем текущий предмет в новую ячейку массива $secretbox
    $secretbox[]=$selobj
    
! удаляем предмет из списка
    delobj $selobj
    
! перезаходим на локацию тайник
    goto $curloc
end

Чтобы сброшенные предметы воспроизводились на локации "тайник" в виде действий, нужно на локации "тайник" прописать такой код:

loop local i=0 while i<arrsize('$secretbox') step i+=1:
! пока значение счётчика не превысило номер последней ячейки массива
    
! с помощью команды dynamic генерируем действие
    dynamic "
        act 'Поднять <<$secretbox[i]>>:
            addobj '<<$secretbox[i]>>'
            killvar '$secretbox',<<i>>
            goto $curloc
        end'
    "

end

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