The problem is the 'on collision' event. That will trigger once, when the two objects meet. So you are having to ram into the NPC constantly. So you could change that event to an 'is Overlapping' event, and have them slightly overlapping each other.
OR
What you could do, is set up a private variable toggle. When the characters collide trigger the toggle so that it is locked in conversation mode.
So it would work something like this,
On collision between vir and Sprite21 - set PV inConvo to 1
inConvo is 1? - Set players X and Y movement to 0 so they cannot walk around while talking.
- Now set the 'text waiting' and key D pressed events in sub events of "inConvo is 1"
- Talking is finished? - Set PV inConvo to 0
Hopefully that is enough to get you started.