<<
	local factions = wesnoth.get_variable("factions")
	local function detect_faction(side_number)
		local helper = wesnoth.require("lua/helper.lua")
		for multiplayer_side in helper.child_range(factions, "multiplayer_side") do
			local function recruits_match()
				local count = 0
				for searched in string.gmatch(multiplayer_side.recruit, "[^%s,][^,]*") do
					count = count + 1
					local found = false
					for i, actual in ipairs(wesnoth.sides[side_number].recruit) do
						if searched == actual then
							found = true
							break
						end
					end
					if not found then return false end
				end
				return count == #wesnoth.sides[side_number].recruit
			end
			local function leader_matches()
				local actual = wesnoth.get_units({ canrecruit = true, side = side_number })[1]

				if actual then
					for searched in string.gmatch(multiplayer_side.leader, "[^%s,][^,]*") do
						if searched == actual.type then return true end
					end
				else
					return false
				end
			end
			if recruits_match() and leader_matches() then
				wesnoth.set_variable("p" .. tostring(side_number) .. "_faction", multiplayer_side.id)
				return
			end
		end
	end
	detect_faction(1)
	detect_faction(2)
>>
