- Joined
- Jul 18, 2010
- Messages
- 2,377
RandomTeams is a function, teaming up all Players into random Teams each having an equal amount of players.
ChangeLog:
JASS:
// Allies Players of a force (playergroup) into random teams each team having teamSize number of players.
// The last team will have less players, if there are not enough players.
// Won't ally players, if all players would be placed into 1 Team.
// playerPool - the players from which the teams are formed. (use null or bj_FORCE_ALL_PLAYERS to include all Players)
// teamSize - the amount of players in each team.
// returns the last player of the last team, if it has not the wanted amount of players.
// in other cases returns null
function RandomTeams takes force playerPool, integer teamSize returns player
local integer LoopA = bj_MAX_PLAYER_SLOTS
local player array unteamedPlayer
local integer unteamedPlayerSize = 0
local integer currentTeamMemberCount = 0
local integer random
local force currentTeam
local player lastAddedPlayer
if playerPool == null then //For lacy people
set playerPool = bj_FORCE_ALL_PLAYERS
endif
call SetForceAllianceStateBJ( playerPool, playerPool, bj_ALLIANCE_UNALLIED )
// Load All Players into an Array
loop
if IsPlayerInForce(Player(LoopA), playerPool) and IsPlayerInForce(Player(LoopA), bj_FORCE_ALL_PLAYERS) then //Pick only playing players
set unteamedPlayerSize = unteamedPlayerSize + 1
set unteamedPlayer[unteamedPlayerSize] = Player(LoopA)
endif
exitwhen LoopA == 0
set LoopA = LoopA - 1
endloop
// skip remaining actions if all players would be placed in one team.
if unteamedPlayerSize <= teamSize or teamSize < 2 then
return null
endif
set currentTeam = CreateForce()
// Add 1 Random Player to current Team
// If current Team has enough members switch to next team
loop
set random = GetRandomInt(1, unteamedPlayerSize)
call ForceAddPlayer(currentTeam, unteamedPlayer[random])
set lastAddedPlayer = unteamedPlayer[random]
set currentTeamMemberCount = currentTeamMemberCount + 1
set unteamedPlayer[random] = unteamedPlayer[unteamedPlayerSize]
set unteamedPlayerSize = unteamedPlayerSize - 1
if currentTeamMemberCount == teamSize or unteamedPlayerSize == 0 then
call SetForceAllianceStateBJ( currentTeam, currentTeam, bj_ALLIANCE_ALLIED_VISION ) // bj_ALLIANCE_ALLIED bj_ALLIANCE_ALLIED_VISION bj_ALLIANCE_ALLIED_UNITS bj_ALLIANCE_ALLIED_ADVUNITS
call ForceClear(currentTeam)
if unteamedPlayerSize != 0 then //if there are further players reset currentTeamMemberCount
set currentTeamMemberCount = 0
endif
endif
exitwhen unteamedPlayerSize == 0
endloop
call DestroyForce(currentTeam)
set currentTeam = null
if currentTeamMemberCount != teamSize then //last Team has not teamSize amount of members?
return lastAddedPlayer
else
return null
endif
endfunction
ChangeLog:
Added a Force argument, teams are formed out of players from that force.
unteamedPlayer integer -> player
returns now a player: the last added Player, if the last team does not have the wanted amount of members. In other cases null.
unteamedPlayer integer -> player
returns now a player: the last added Player, if the last team does not have the wanted amount of members. In other cases null.
Last edited: