# team autobalance system
# modified by DarkRedemptor email : guschane_fr@yahoo.fr
# july 5th 2005

# the way is to made a smart autobalance team.
# this doesn't swap squad member or commander, it only swap the lone wolf
# it's allow a little non balance : a team can have 3 player more than the other team for squad regroup


import bf2
import host
from bf2 import g_debug

def init():
	if g_debug: print 'initializing autobalance script'
	
	host.registerHandler('PlayerConnect', onPlayerConnect)	
	host.registerHandler('PlayerDeath', onPlayerDeath)
	host.registerHandler('PlayerChangeTeams', onPlayerChangeTeams)


def onPlayerConnect(p):
	# if not bf2.serverSettings.getAutoBalanceTeam(): return None	
	if g_debug: print 'place player on the team with least players'

	team1 = 0
	team2 = 0
	for tp in bf2.playerManager.getPlayers():
		if tp != p:
			if tp.getTeam() == 1:
				team1 += 1
			else:
				team2 += 1	
			
	team2 = team2 * bf2.serverSettings.getTeamRatioPercent() / 100.0		
	if team2 > team1:
		p.setTeam(1)
	else:
		p.setTeam(2)



		
def onPlayerDeath(p, vehicle):			
	if not bf2.serverSettings.getAutoBalanceTeam(): return None	
	if g_debug: print 'handling player death autobalance'	
	
	# dont use autobalance when its suicide/changes team
	if p.getSuicide(): 
		p.setSuicide(0)
		return None		
	
	aiPlayerBalance = 0
	team1 = 0
	team2 = 0
	for tp in bf2.playerManager.getPlayers():	
		if tp.getTeam() == 1:
			team1 += 1
		else:
			team2 += 1
		if tp.isAIPlayer():
			aiPlayerBalance += 1
		else:
			aiPlayerBalance -= 1					
	
	if host.sgl_getIsAIGame():
		if not (aiPlayerBalance < 0):		
			if not p.isAIPlayer():
				return None	
			
	team2 = team2 * bf2.serverSettings.getTeamRatioPercent() / 100.0
	if g_debug: print 'team1 %f team2 %f' % (team1,team2)	
	if (p.getTeam() == 1):
		if (team2+1) < team1:			# we let 2 people unnballance for squad regroupement
			if p.isCommander():		# we don't want to swap the commander
				p.setTeam(1)
			elif (p.getSquadId() != 0):	# we don't want to swap the member of squad
				p.setTeam(1)			
			else:				# we want to swap only the Lone wolf player
				p.setTeam(2)

	elif (p.getTeam() == 2):
		if (team1+1) < team2:			# we let 2 people unnballance for squad regroupement
			if p.isCommander():		# we don't want to swap the commander
				p.setTeam(2)
			elif (p.getSquadId() != 0):	# we don't want to swap the member of squad
				p.setTeam(2)			
			else:				# we want to swap only the Lone wolf player
				p.setTeam(1)			



		
def onPlayerChangeTeams(p, humanHasSpawned):
	if not bf2.serverSettings.getAutoBalanceTeam(): return None
	if host.sgl_getIsAIGame(): 		
		if humanHasSpawned: return None
		if p.isAIPlayer(): return None
	
		if g_debug: print 'handling aiplayer team change autobalance when round not started'
	
		team = p.getTeam()	
		aiplayer = 0	
	
		for tp in bf2.playerManager.getPlayers():		
			if aiplayer == 0 and tp.getTeam() == team and tp.isAIPlayer(): 
				aiplayer = tp
				break
		
		if aiplayer: 
			if p.getTeam() == 1:
				aiplayer.setTeam(2)
			else:
				aiplayer.setTeam(1)
									
	else:
		if g_debug: print 'checking to see if player is allowed to change teams'
	
		team1 = 0
		team2 = 0
		for tp in bf2.playerManager.getPlayers():	
			if tp.getTeam() == 1:
				team1 += 1
			else:
				team2 += 1

		if abs(team1 - team2) > 3:		# we allow an unbalance of 3 players
			if p.getTeam() == 1: p.setTeam(2)
			else: p.setTeam(1)

	
		