I found the function, but have hard time (and coding experience) to understand it :
//---------------------------------------------------------------------------------------
static function CreateStartingSoldiers(XComGameState StartState, optional bool bTutorialEnabled = false)
{
local XComGameState_Unit NewSoldierState;
local XComGameState_HeadquartersXCom XComHQ;
local XGCharacterGenerator CharacterGenerator;
local TSoldier TutSoldier;
local int Index, i;
local XComGameState_GameTime GameTime;
local XComGameState_Analytics Analytics;
local TAppearance TutSoldierAppearance;
local TDateTime TutKIADate;
local StateObjectReference EmptyRef;
local X2MissionSourceTemplate MissionSource;
assert(StartState != none);
foreach StartState.IterateByClassType(class'XComGameState_HeadquartersXCom', XComHQ)
{
break;
}
foreach StartState.IterateByClassType(class'XComGameState_GameTime', GameTime)
{
break;
}
`assert( GameTime != none );
foreach StartState.IterateByClassType( class'XComGameState_Analytics', Analytics )
{
break;
}
`assert( Analytics != none );
CharacterGenerator = XComGameInfo(class'WorldInfo'.static.GetWorldInfo().Game).m_CharacterGen;
// Starting soldiers
for( Index = 0; Index < class'XGTacticalGameCore'.default.NUM_STARTING_SOLDIERS; ++Index )
{
NewSoldierState = `CHARACTERPOOLMGR.CreateCharacter(StartState, default.InitialSoldiersCharacterPoolSelectionMode);
if(bTutorialEnabled && Index == 0)
{
TutSoldier = CharacterGenerator.CreateTSoldier('Soldier', default.TutorialSoldierGender, default.TutorialSoldierCountry);
TutSoldierAppearance = default.TutorialSoldierAppearance;
if(GetLanguage() == "FRA")
{
TutSoldierAppearance.nmVoice = default.TutorialSoldierFrenchVoice;
}
else if(GetLanguage() == "DEU")
{
TutSoldierAppearance.nmVoice = default.TutorialSoldierGermanVoice;
}
else if(GetLanguage() == "ITA")
{
TutSoldierAppearance.nmVoice = default.TutorialSoldierItalianVoice;
}
else if(GetLanguage() == "ESN")
{
TutSoldierAppearance.nmVoice = default.TutorialSoldierSpanishVoice;
}
else
{
TutSoldierAppearance.nmVoice = default.TutorialSoldierEnglishVoice;
}
NewSoldierState.SetTAppearance(TutSoldierAppearance);
NewSoldierState.SetCharacterName(class'XLocalizedData'.default.TutorialSoldierFirstName, class'XLocalizedData'.default.TutorialSoldierLastName, TutSoldier.strNickName);
NewSoldierState.SetCountry(TutSoldier.nmCountry);
NewSoldierState.SetXPForRank(1);
NewSoldierState.StartingRank = 1;
NewSoldierState.iNumMissions = 1;
XComHQ.TutorialSoldier = NewSoldierState.GetReference();
}
NewSoldierState.GiveRandomPersonality();
NewSoldierState.RandomizeStats();
NewSoldierState.ApplyInventoryLoadout(StartState);
NewSoldierState.SetHQLocation(eSoldierLoc_Barracks);
XComHQ.AddToCrew(StartState, NewSoldierState);
NewSoldierState.m_RecruitDate = GameTime.CurrentTime; // AddToCrew does this, but during start state creation the StrategyRuleset hasn't been created yet
if(XComHQ.Squad.Length < class'X2StrategyGameRulesetDataStructures'.static.GetMaxSoldiersAllowedOnMission())
{
XComHQ.Squad.AddItem(NewSoldierState.GetReference());
}
StartState.AddStateObject( NewSoldierState );
}