Вопрос скорее про "скриптовую игровую логику в играх". Следует подумать о ключевом примере (псевдокод):
monster1.walkTo(level.homepointA); // идет из текущей точки в точку A, длится минуты
monster1.walkTo(level.coverpointD); // идет из точки A в точку D, длится минуты
monster1.fireAt(enemy, 5.0); // стрелять по врагу 5 минут
monster1.walkTo(level.homepointA); // идти обратно в точку A
Входные данные:
- Статические: Разметка карты невидимыми объектами с именами. Их использует скрипт. У объектов могут быть свойства (высота укрытия например)
- Времени выполнения: enemy - ссылка на объект врага. Обычно монстр получает уведомление о появлении игрока в радиусе видимости. (Думать о реализации событий и нотификаций)
Императивные действия, "глаголы":
Вы правильно заметили про потоки и последовательности. Хотелось бы чтобы действия "длились" и выполнялись последовательно и параллельно для разных ботов. В mainstream языках это невозможно стандартными методами. И поэтому там каждой строчке будет соответствовать состояние в стейт-машине. (Читать про FSM).
В идеале же для работы в "последовательном стиле" можно воспользоваться coroutines. Это псевдо-потоки как раз для описанного случая. Разумеется, все описанные выше действия можно дополнять стандартными ветками if/else, циклами for/while и т.д.
Вот пример интеграции Lua и C++:
https://github.com/loyso/LuaCSP
Для начинающего лучше конечно реализовать подход 1 бот = 1 стейт-машина.