FSM。下みたいな感じで小さな必要なメッセージハンドラ書いて、STATEにMixinして、更にFSMクラスにMixinすれば全体の見通しがよくなりそう。
ただ、当然下位のメッセージハンドラの方が種類多いから下から積み上げて、個々のゲームオブジェクトに対応するFSM作るのは面倒。上から仮想関数のオーバーライドみたいな感じで差分だけ加えていければいいんだけどMixinは名前が重なると即エラー。


template MSG_SeeEnemy()
{
On_SeeEnemy(){/*敵を発見した時の処理*/}
}

template MSG_Attacked()
{
On_Attacked(){/*攻撃された時の処理*/}
}

template STATE_Patrol(alias msg)
{
exec(){/*msgによって適切なメッセージハンドラを実行*/}
mixin MSG_SeeEnemy;
mixin MSG_Attacked;

}

class FSM
{
exec(){/*現在のstateに対応したSTATEにmsgを渡して実行する*/}
mixin STATE_いろいろ
}