On battle_util it checks like so:
gBattleStruct->hpBefore[battler] > gBattleMons[battler].maxHP / 2
&& gBattleMons[battler].hp < gBattleMons[battler].maxHP / 2
So if it hits exactly half hp, it won't trigger in the same turn because of the second check, the next one it will fail the first check. I fixed this on https://gitgud.io/stephenlynx/pokemonie/-/commit/1ad25d09151919379a02f45f3fcec20146ad5c72
On battle_util it checks like so:
gBattleStruct->hpBefore[battler] > gBattleMons[battler].maxHP / 2
&& gBattleMons[battler].hp < gBattleMons[battler].maxHP / 2
So if it hits exactly half hp, it won't trigger in the same turn because of the second check, the next one it will fail the first check. I fixed this on https://gitgud.io/stephenlynx/pokemonie/-/commit/1ad25d09151919379a02f45f3fcec20146ad5c72