Erscheint mir zum einen ziemlich widersinnig, zum anderen bezweifle ich, daß du auf diese Art das hinkriegst, was du möchtest.
Zum Thema widersinnig:
So wie du es darstellst beinhaltet deine Klasse "Game_Map" alle Methoden für die Interaktionen mit den NPCs die auf der Map sind. Das ist eine mMn eine Vermischung der beiden Objekttypen "Map" und "NPC". Es sollte nicht von der Karte abhängen welche Interaktionen man mit einem NPC ausführen kann bzw. wie diese aussehen, sondern dies sollte nur vom NPC abhängen.
Du kannst ja problemlos auf verschiedenen Karten verschiedene NPC-Objekte platzieren die demnach auch verschiedene Interaktionen ermöglichen.
Anders ausgedrückt wo ist der Unterschied zwischen deiner Art und:
Bei deinem Verfahren blähst du deine Game_Map-Klasse mit extrem viel Ballast auf, der logisch gar nicht zum Verhalten der Karte gehört, sondern vielmehr zum Verhalten der NPC-Objekte.
Zum zweiten:
Eine Speicherung von Methoden in objekten macht nur dann Sinn, wenn du letztlich zwei Objekte derselben Klasse haben willst, die beim selben Methodenaufruf komplett unterschiedlich funktionieren sollen.
Das wird bei deiner Art aber nur funktionieren wenn du extrem viele Methoden in deiner Game_Map definierst, was auch zu einem ziemlichen Namens-Chaos führen wird. (Wie willst du die Methoden benennen, wenn du 20 verschiedene Goblins hast, die alle unterschiedlich reagieren sollen?)
Anstatt eine bestehende Methode in ein Objekt zu packen, wie du es aktuell tust, solltest du direkt Ruby-Code in ein Objekt kapseln. Das kannst du einerseits machen indem du den Code einfach als String speicherst und zum ausführen "eval()" drüberlaufen lässt, oder du erzeugst aus dem Code direkt ein "Proc"-Objekt mittels Proc.new.
Das könnte dann so aussehen:
Beides macht letztlich dasselbe, wobei ich davon ausgehe, daß die erste Variante deutlich langsamer ist. Damit könntest du aber völlig unabhängig voneinander zwei verschiedenen Goblin-Objekten zwei unterschiedliche Methoden verpassen, die diese jeweils in einer Instanzenvariable speichern und diese dann über denselben Namen aufrufen.