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

14.5. Как заменить один предмет на другой?

В: Как заменить один предмет на другой?

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

Это может быть "Фонарик" (Фонарик включен/Фонарик выключен), "Фляга для воды" (Фляга полная/Фляга пустая), "Батарейка" (Батарейка заряжена/Батарейка разряжена) и т.п.

До появления оператора MODOBJ, чтобы изменить статус предмета, приходилось удалять предмет со старым названием, а затем добавлять в ту же позицию предмет с новым названием:

act "Выключить фонарик":
delobj "Фонарик включен"
addobj "Фонарик выключен"
end

Всё довольно просто, но проблема в том, что "Включённый фонарик" мог быть во второй позиции (второй строке списка в окне предметов), а при таком "выключении", "Выключенный фонарик" добавится в последнюю позицию. Т.е. визуально это не выглядит как смена статуса.

Очевидным решением будет "запоминать" позицию предмета, а так же его состояние:

act "Выключить фонарик":
if фонарик_включён:
delobj "Фонарик включён"
if фонарик = 0: фонарик = countobj + 1
addobj "Фонарик выключен", "", фонарик
фонарик_включён = 0
else:
*pl "Фонарик уже выключен"
end
end
act "Включить фонарик":
if no фонарик_включён:
delobj "Фонарик выключен"
if фонарик = 0: фонарик = countobj + 1
addobj "Фонарик включён", "", фонарик
фонарик_включён = 1
else:
*pl "Фонарик уже включён"
end
end

Оператор MODOBJ позволяет не хранить позицию предметов и не производить поиск предмета с указанным названием в списке. Особенно, если все предметы в игре уникальны. Мы просто добавляем предмету описание, которое заменяет название в инвентаре:

if no obj('Фонарик'):
! добавляем выключенный фонарик
addobj 'Фонарик'
modobj 'Фонарик', 'Фонарик выключен'
фонарик_включен = 0
end
act "Выключить фонарик":
if фонарик_включён:
modobj 'Фонарик', 'Фонарик выключен'
фонарик_включён = 0
else:
*pl "Фонарик уже выключен"
end
end
act "Включить фонарик":
if no фонарик_включён:
modobj 'Фонарик', 'Фонарик включен'
фонарик_включён = 1
else:
*pl "Фонарик уже включён"
end
end

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

Примеры: