My idea is close to it, but I used loop with conditional branch in the end of it with break loop. So when the trigger in dialogue turns on the animation isn’t breaking immediately but plays till the end (so the next animation can start where the first one ended and avoid tearing).
In your example the issue is the same as in mine: you use 20 wait to have 3 frames/sec, but as our animations have 15-20 frames per sec we have an issue that we can’t play 25 or 17 frames a sec for example, only 30, 20 or 15 (2, 3, 4 wait).