@ Initialize the Battle Factory challenge
	.macro factory_init
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_INIT
	special CallBattleFactoryFunction
	.endm

	@ Get the value of some FACTORY_DATA_*. See GetBattleFactoryData for the data types that can be retrieved
	.macro factory_get data:req
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_GET_DATA
	setvar VAR_0x8005, \data
	special CallBattleFactoryFunction
	.endm

	@ Set some FACTORY_DATA_* to val. See SetBattleFactoryData for the data types that can be set
	.macro factory_set data:req, val=0xFFFF
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_SET_DATA
	setvar VAR_0x8005, \data
	.if \val == 0xFFFF
	@ argument not provided
	.elseif \val >= VARS_START
	copyvar VAR_0x8006, \val
	.else
	setvar VAR_0x8006, \val
	.endif
	special CallBattleFactoryFunction
	.endm

	@ Save the game and set the challenge status
	.macro factory_save challengeStatus:req
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_SAVE
	setvar VAR_0x8005, \challengeStatus
	special CallBattleFactoryFunction
	.endm

	@ Select the initial rental mons for the challenge
	.macro factory_rentmons
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_SELECT_RENT_MONS
	special CallBattleFactoryFunction
	.endm

	@ Select a mon to swap for from the previously defeated team
	.macro factory_swapmons
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_SWAP_RENT_MONS
	special CallBattleFactoryFunction
	.endm

	@ Allows FACTORY_DATA_WIN_STREAK_SWAPS to be incremented once
	.macro factory_setswapped
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_SET_SWAPPED
	special CallBattleFactoryFunction
	.endm

	@ Update gEnemyParty with the next set of rental mons
	.macro factory_setopponentmons
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_SET_OPPONENT_MONS
	special CallBattleFactoryFunction
	.endm

	@ Populate gPlayerParty and gEnemyParty with the rental mons. Only needed when resuming a challenge, otherwise only factory_setopponentmons and factory_rentmons/factory_swapmons are needed
	.macro factory_setparties arg:req
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_SET_PARTIES
	setvar VAR_0x8005, \arg
	special CallBattleFactoryFunction
	.endm

	@ Set the object event gfx for the opponent trainer
	.macro factory_setopponentgfx
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_SET_OPPONENT_GFX
	special CallBattleFactoryFunction
	.endm

	@ Generate the mons for the opponents team
	.macro factory_generateopponentmons
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_GENERATE_OPPONENT_MONS
	special CallBattleFactoryFunction
	.endm

	@ Generate the random 6 mons to choose from for the initial rental
	.macro factory_generaterentalmons
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_GENERATE_RENTAL_MONS
	special CallBattleFactoryFunction
	.endm

	@ Return the pokemon type most common in the opponents team, or NUMBER_OF_MON_TYPES if there is no standout type
	.macro factory_getopponentmontype
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_GET_OPPONENT_MON_TYPE
	special CallBattleFactoryFunction
	.endm

	@ Return the FACTORY_STYLE_* dependent on what types of moves the opponents team has, or FACTORY_NUM_STYLES if multiple styles tie for the same amount of moves
	.macro factory_getopponentstyle
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_GET_OPPONENT_STYLE
	special CallBattleFactoryFunction
	.endm

	@ Restore the held items for the players party to what they were pre-battle
	.macro factory_resethelditems
	setvar VAR_0x8004, BATTLE_FACTORY_FUNC_RESET_HELD_ITEMS
	special CallBattleFactoryFunction
	.endm