The number of NPCs doesn't matter because of how events work.
What's in your interest here is to use a single sprite object to hold all your NPCs (through animationframes of a single animation).
(or families if you own a C2 license)
From the moment you set an event:
System.Compare two values
distance(Player.X,Player.Y,NPC.X,NPC.Y) < The_distance_you_want_to_set
It will apply the actions to every NPCs in the distance. (so your dialog display system)
The overlapping would act the same, but you would must have your player "over" the NPC for the actions to take place, not in an area around it like with distance().