Я делал что-то подобное раньше и использовал что-то похожее на ваш вариант №2.Когда карта загружается, я загружаю конфигурационный файл Lua, содержащий все данные NPC;среди них имя файла сценария, используемого для NPC.
Когда мне нужно загрузить NPC в игре, я компилирую файл Lua.NPC могут использовать «модель» типа NPC, чтобы диктовать большую часть общего поведения (например, типа Merchant или Commoner), которое указано в конфигурации NPC.Эти типы моделей предоставляют все основные функции, такие как предоставление окна торговли при нажатии.Конкретные NPC используют функции, такие как OnClick (), чтобы переопределить свою модель и предоставить пользовательские обработчики.
Для меня это сработало довольно хорошо, хотя в конечном итоге игра становится большим объемом скриптов.