Проблема заключается в том, что в командной строке Windows / интерпретаторе командной строки (CLI), известном как CMD.EXE, есть ошибка (ну, я уверен, что Microsoft считает, что это особенность), когда она читает блок-конструкцию, такую как IF … ( … ) Или цикл FOR , он интерпретирует все %variable_name% variable_name % непосредственно перед выполнением цикла или блока.
В вашем примере, если potion равно 0, когда вы входите в If %dropmode%==on ( … ) , тогда все вхождения %potion% внутри этого блока оцениваются в 0, и поэтому оба ваших оператора set обрабатываются как set /a potion=0+1 , даже если вы меняете potion внутри блока.
Это видно из вывода на экран вашего сообщения.
Исправление заключается в том, чтобы сообщить CMD, чтобы разрешить расширение переменных в нужное время, когда выполняются операторы, ссылающиеся на них. Вы делаете это, добавляя
setlocal enabledelayedexpansion
где-то рядом с началом вашего пакетного файла, и изменение кода подсчета, чтобы выглядеть так
set /a potion=!potion!+1
используя !variable_name! Форма для активации отложенного расширения.
Смотрите SET /? и SETLOCAL /? для дополнительной информации.
PS Другое решение - просто удалить символы % из set операторов и сказать
set /a potion=potion+1