#JavaScript (ES6), 55 53 bytes
Takes input as (a)(b)
with \$a\le b\$. Returns \$0\$ (valid), \$1\$ (ended) or \$2\$ (invalid).
a=>b=>a<0|a>29|b>30|b>21&(a-=b)*a>4?2:b>20&a*a>1|b>29
#JavaScript (ES6), 55 53 bytes
Takes input as (a)(b)
with \$a\le b\$. Returns \$0\$ (valid), \$1\$ (ended) or \$2\$ (invalid).
a=>b=>a<0|a>29|b>30|b>21&(a-=b)*a>4?2:b>20&a*a>1|b>29