Fixed by implementing Effect Spore. Relevant ASM:
EffectSpore:
seg006:021D9DD0 PUSH {R3-R6,LR}
seg006:021D9DD2 SUB SP, SP, #0xC
seg006:021D9DD4 MOVS R0, #4
seg006:021D9DD6 MOVS R5, R1
seg006:021D9DD8 MOVS R6, R2
seg006:021D9DDA BL ReadVolatileVariable
seg006:021D9DDE CMP R6, R0
seg006:021D9DE0 BNE loc_21D9E18
seg006:021D9DE2 MOVS R0, #0x46 @ 'F'
seg006:021D9DE4 BL ReadVolatileVariable
seg006:021D9DE8 CMP R0, #0
seg006:021D9DEA BNE loc_21D9E18
seg006:021D9DEC MOVS R0, #0x1E
seg006:021D9DEE BL BRand
seg006:021D9DF2 CMP R0, #0x14
seg006:021D9DF4 BLS loc_21D9DFA
seg006:021D9DF6 MOVS R4, #5 ; Poison
seg006:021D9DF8 B loc_21D9E02
seg006:021D9DFA @ ---------------------------------------------------------------------------
seg006:021D9DFA
seg006:021D9DFA loc_21D9DFA: @ CODE XREF: EffectSpore+24j
seg006:021D9DFA MOVS R4, #1 ; Para
seg006:021D9DFC CMP R0, #0xA
seg006:021D9DFE BHI loc_21D9E02
seg006:021D9E00 MOVS R4, #2 ; Sleep
seg006:021D9E02
seg006:021D9E02 loc_21D9E02: @ CODE XREF: EffectSpore+28j
seg006:021D9E02 @ EffectSpore+2Ej
seg006:021D9E02 MOVS R0, R4
seg006:021D9E04 BL sub_21D7D38 ; If sleep precompute duration (rand(3)+2)
seg006:021D9E08 MOVS R3, R0
seg006:021D9E0A MOVS R0, #0x1E
seg006:021D9E0C STR R0, [sP]
seg006:021D9E0E MOVS R0, R5
seg006:021D9E10 MOVS R1, R6
seg006:021D9E12 MOVS R2, R4
seg006:021D9E14 BL effectSporeRand
seg006:021D9E18
seg006:021D9E18 loc_21D9E18: @ CODE XREF: EffectSpore+10j
seg006:021D9E18 @ EffectSpore+1Aj
seg006:021D9E18 ADD SP, SP, #0xC
seg006:021D9E1A POP {R3-R6,PC}
seg006:021D9E1A @ End of function EffectSpore
seg006:021D9E1A
seg006:021D9E1C
seg006:021D9E1C @ =============== S U B R O U T I N E =======================================
seg006:021D9E1C
seg006:021D9E1C
seg006:021D9E1C sub_21D9E1C:
seg006:021D9E1C MOVS R1, #1
seg006:021D9E1E STR R1, [R0]
seg006:021D9E20 LDR R0, =0x21F0850
seg006:021D9E22 BX LR
seg006:021D9E22 @ End of function sub_21D9E1C
seg006:021D9E22
seg006:021D9E22 @ ---------------------------------------------------------------------------
seg006:021D9E24 dword_21D9E24:.long 0x21F0850 @ DATA XREF: sub_21D9E1C+4r
seg006:021D9E28
seg006:021D9E28 @ =============== S U B R O U T I N E =======================================
seg006:021D9E28
seg006:021D9E28
seg006:021D9E28 effectSporeRand: @ CODE XREF: sub_21D9CAC+1Ap
seg006:021D9E28 @ sub_21D9CDC+1Ap ...
seg006:021D9E28
seg006:021D9E28 varg_r0= -0x10
seg006:021D9E28 varg_r1= -0xC
seg006:021D9E28 varg_r2= -8
seg006:021D9E28 varg_r3= -4
seg006:021D9E28
seg006:021D9E28 PUSH {R0-R3}
seg006:021D9E2A PUSH {R3-R7,LR}
seg006:021D9E2C MOVS R4, R0
seg006:021D9E2E MOVS R0, #4
seg006:021D9E30 MOVS R5, R1
seg006:021D9E32 MOVS R6, R2
seg006:021D9E34 MOVS R7, #4
seg006:021D9E36 BL ReadVolatileVariable
seg006:021D9E3A CMP R5, R0
seg006:021D9E3C BNE loc_21D9E98
seg006:021D9E3E MOVS R0, #0x46 @ 'F'
seg006:021D9E40 BL ReadVolatileVariable
seg006:021D9E44 CMP R0, #0
seg006:021D9E46 BNE loc_21D9E98
seg006:021D9E48 MOVS R0, #0x12
seg006:021D9E4A BL ReadVolatileVariable
seg006:021D9E4E LSLS R0, R0, #0x10
seg006:021D9E50 LSRS R0, R0, #0x10
seg006:021D9E52 MOVS R1, #0
seg006:021D9E54 BL GetMoveFlag ; contact flag
seg006:021D9E58 CMP R0, #0
seg006:021D9E5A BEQ loc_21D9E98
seg006:021D9E5C ADD R1, SP, #0x28
seg006:021D9E5E LDRB R1, [R1]
seg006:021D9E60 MOVS R0, R4
seg006:021D9E62 BL RandomEffect ; rand(100)<30
seg006:021D9E66 CMP R0, #0
seg006:021D9E68 BEQ loc_21D9E98
seg006:021D9E6A MOVS R0, R4
seg006:021D9E6C MOVS R1, #0xC
seg006:021D9E6E MOVS R2, R5
seg006:021D9E70 BL sub_21C88C4
seg006:021D9E74 MOVS R5, R0
seg006:021D9E76 LDR R1, [R5]
seg006:021D9E78 LSLS R0, R7, #0x15
seg006:021D9E7A ORRS R0, R1
seg006:021D9E7C STR R0, [R5]
seg006:021D9E7E LDR R0, [sP,#0x24]
seg006:021D9E80 STR R6, [R5,#4]
seg006:021D9E82 STR R0, [R5,#8]
seg006:021D9E84 MOVS R0, #0
seg006:021D9E86 STRB R0, [R5,#0xC]
seg006:021D9E88 MOVS R0, #3
seg006:021D9E8A BL ReadVolatileVariable
seg006:021D9E8E STRB R0, [R5,#0xF]
seg006:021D9E90 MOVS R0, R4
seg006:021D9E92 MOVS R1, R5
seg006:021D9E94 BL sub_21C88E8
seg006:021D9E98
seg006:021D9E98 loc_21D9E98: @ CODE XREF: effectSporeRand+14j
seg006:021D9E98 @ effectSporeRand+1Ej ...
seg006:021D9E98 POP {R3-R7}
seg006:021D9E9A POP {R3}
seg006:021D9E9C ADD SP, SP, #0x10
seg006:021D9E9E BX R3
seg006:021D9E9E @ End of function effectSporeRand
Note that effect spore has a slight biais towards sleep and against poison.