O problema é que o Prompt de Comando do Windows / Interpretador de Linha de Comando (CLI),
conhecido como CMD.EXE, tem um bug (bem, eu tenho certeza que a Microsoft acha que é um recurso) em que,
quando lê uma construção de bloco como IF … ( … )
ou FOR
loop,
ele interpreta todas as variáveis %variable_name%
imediatamente ,
antes que o loop ou bloco seja executado.
No seu exemplo, se potion
for 0 quando você inserir o bloco If %dropmode%==on ( … )
,
então todas as ocorrências de %potion%
dentro desse bloco são avaliadas como 0,
e, assim, ambas as suas instruções set
são processadas como set /a potion=0+1
,
mesmo se você alterar potion
dentro do bloco.
Isso é evidente na saída de tela que você relatou.
A correção é dizer ao CMD para permitir que as variáveis sejam expandidas no momento certo, quando as declarações referentes a eles são executadas. Você faz isso adicionando
setlocal enabledelayedexpansion
em algum lugar perto do início do seu arquivo de lote e alterando seu código de contagem para parecer
set /a potion=!potion!+1
usando o formulário !variable_name!
para ativar a expansão atrasada.
Veja SET /?
e SETLOCAL /?
para mais informações.
P.S. Outra solução é simplesmente remover os caracteres %
das declarações set
e diga
set /a potion=potion+1