А готовых решений нет и быть не может, потому что они зависят от механик в
вашей игре.
То есть нужно взять за основу стейт машину, а еще лучше
дерево поведения, т.к. оно лучше для сложной логики, и затем уже привносить туда
свою логику.
К примеру, по какому принципу NPC могут объединяться? В Prison Architect они объединяются в банды
по цвету кожи. В вашей игре есть цвет кожи и расизм? Скорее всего, нет, значит у вас будет другой, уникальный критерий.
То есть вы пишете какую-то функцию типа getTheBestNpcToMakeFriendsWith(), в которой учитываются различные параметры NPC и свойства окружающей среды, свойственные только для вашей игры, и далее используете эту функцию в дереве поведения для переключения на ту или иную ветку.
А еще социализация может быть размазана по самому дереву решений. И в каждой ветке будет своя функция getBestNpcAround() для всяких целей (подружиться, подраться и т.д.).
И это еще не конец. Поведение придется еще забалансить, чтобы выглядело аутентично и играть было интересно. Ведь геймдев - это искусство. Поэтому коэффициенты внутри этой функции придется подбирать, пробовать разные, да и вообще менять и улучшать саму функцию, и дерево тоже, пока NPC не будут вести так, как вы хотите. Было бы странно найти готовое решение под это.