/**
  * Creates a new formation for specified team.
  * Will simply take the first 11 players and place them in a 4-4-2 formation.
  * 
  * @param WebSoccer $websoccer Application context.
  * @param DbConnection $db DB connection.
  * @param SimulationMatch $match match model.
  * @param SimulationTeam $team team model.
  */
 private static function _createRandomFormation(WebSoccer $websoccer, DbConnection $db, SimulationMatch $match, SimulationTeam $team)
 {
     // better delete possible previous formation with too few players
     $db->queryDelete($websoccer->getConfig('db_prefix') . '_youthmatch_player', 'match_id = %d AND team_id = %d', array($match->id, $team->id));
     // define the exact default formation
     $formationPositions = array('T', 'LV', 'IV', 'IV', 'RV', 'LM', 'ZM', 'ZM', 'RM', 'LS', 'RS');
     $positionMapping = SimulationHelper::getPositionsMapping();
     // set players
     $players = YouthPlayersDataService::getYouthPlayersOfTeam($websoccer, $db, $team->id);
     $positionIndex = 0;
     foreach ($players as $playerinfo) {
         $mainPosition = $formationPositions[$positionIndex];
         $position = $positionMapping[$mainPosition];
         $player = new SimulationPlayer($playerinfo['id'], $team, $position, $mainPosition, 3.0, DEFAULT_PLAYER_AGE, $playerinfo['strength'], $playerinfo['strength'], YOUTH_STRENGTH_STAMINA, YOUTH_STRENGTH_FRESHNESS, YOUTH_STRENGTH_SATISFACTION);
         $player->name = $playerinfo['firstname'] . ' ' . $playerinfo['lastname'];
         // strength adaption required?
         if ($player->position != $playerinfo['position']) {
             $player->strength = round($playerinfo['strength'] * (1 - $websoccer->getConfig('sim_strength_reduction_wrongposition') / 100));
         }
         try {
             // create record
             $columns = array('match_id' => $match->id, 'team_id' => $team->id, 'player_id' => $player->id, 'playernumber' => $positionIndex + 1, 'position' => $player->position, 'position_main' => $player->mainPosition, 'name' => $player->name);
             $db->queryInsert($columns, $websoccer->getConfig('db_prefix') . '_youthmatch_player');
             $team->positionsAndPlayers[$player->position][] = $player;
         } catch (Exception $e) {
             // could not be stored. Can happen when the youth player moved from the opponent to this team.
             // then we get a PK violation. We just don't add this player then.
         }
         $positionIndex++;
         if ($positionIndex == 11) {
             break;
         }
     }
 }
 public static function addPlayers(WebSoccer $websoccer, DbConnection $db, SimulationTeam $team, $matchinfo, $columnPrefix)
 {
     $fromTable = $websoccer->getConfig('db_prefix') . '_spieler';
     $columns['verein_id'] = 'team_id';
     $columns['nation'] = 'nation';
     $columns['position'] = 'position';
     $columns['position_main'] = 'mainPosition';
     $columns['position_second'] = 'secondPosition';
     $columns['vorname'] = 'firstName';
     $columns['nachname'] = 'lastName';
     $columns['kunstname'] = 'pseudonym';
     $columns['w_staerke'] = 'strength';
     $columns['w_technik'] = 'technique';
     $columns['w_kondition'] = 'stamina';
     $columns['w_frische'] = 'freshness';
     $columns['w_zufriedenheit'] = 'satisfaction';
     $columns['st_spiele'] = 'matches_played';
     if ($websoccer->getConfig('players_aging') == 'birthday') {
         $ageColumn = 'TIMESTAMPDIFF(YEAR,geburtstag,CURDATE())';
     } else {
         $ageColumn = 'age';
     }
     $columns[$ageColumn] = 'age';
     $whereCondition = 'id = %d AND verletzt = 0';
     // player must not be blocked
     if ($team->isNationalTeam) {
         $whereCondition .= ' AND gesperrt_nationalteam = 0';
     } elseif ($matchinfo['type'] == 'Pokalspiel') {
         $whereCondition .= ' AND gesperrt_cups = 0';
     } elseif ($matchinfo['type'] != 'Freundschaft') {
         $whereCondition .= ' AND gesperrt = 0';
     }
     $positionMapping = SimulationHelper::getPositionsMapping();
     $addedPlayers = 0;
     for ($playerNo = 1; $playerNo <= 11; $playerNo++) {
         $playerId = $matchinfo[$columnPrefix . '_formation_player' . $playerNo];
         $mainPosition = $matchinfo[$columnPrefix . '_formation_player_pos_' . $playerNo];
         $result = $db->querySelect($columns, $fromTable, $whereCondition, $playerId);
         $playerinfo = $result->fetch_array();
         $result->free();
         // is player still in team?
         if (isset($playerinfo['team_id']) && $playerinfo['team_id'] == $team->id || $team->isNationalTeam && $playerinfo['nation'] == $team->name) {
             $position = $positionMapping[$mainPosition];
             $strength = $playerinfo['strength'];
             // player becomes weaker: wrong position
             if ($playerinfo['position'] != $position && $playerinfo['mainPosition'] != $mainPosition && $playerinfo['secondPosition'] != $mainPosition) {
                 $strength = round($strength * (1 - $websoccer->getConfig('sim_strength_reduction_wrongposition') / 100));
                 // player becomes weaker: secondary position
             } elseif (strlen($playerinfo['mainPosition']) && $playerinfo['mainPosition'] != $mainPosition && ($playerinfo['position'] == $position || $playerinfo['secondPosition'] == $mainPosition)) {
                 $strength = round($strength * (1 - $websoccer->getConfig('sim_strength_reduction_secondary') / 100));
             }
             $player = new SimulationPlayer($playerId, $team, $position, $mainPosition, 3.0, $playerinfo['age'], $strength, $playerinfo['technique'], $playerinfo['stamina'], $playerinfo['freshness'], $playerinfo['satisfaction']);
             if (strlen($playerinfo['pseudonym'])) {
                 $player->name = $playerinfo['pseudonym'];
             } else {
                 $player->name = $playerinfo['firstName'] . ' ' . $playerinfo['lastName'];
             }
             $team->positionsAndPlayers[$player->position][] = $player;
             SimulationStateHelper::createSimulationRecord($websoccer, $db, $matchinfo['match_id'], $player);
             $addedPlayers++;
             // is player the team captain?
             if ($matchinfo[$columnPrefix . '_captain_id'] == $playerId) {
                 self::computeMorale($player, $playerinfo['matches_played']);
             }
             // is player free kick taker?
             if ($matchinfo[$columnPrefix . '_formation_freekickplayer'] == $playerId) {
                 $team->freeKickPlayer = $player;
             }
         }
     }
     // generate new formation if formation is invalid
     if ($addedPlayers < 11 && $websoccer->getConfig('sim_createformation_on_invalidsubmission')) {
         // delete existing invalid formation
         $db->queryDelete($websoccer->getConfig('db_prefix') . '_spiel_berechnung', 'spiel_id = %d AND team_id = %d', array($matchinfo['match_id'], $team->id));
         $team->positionsAndPlayers = array();
         // generate a new one
         SimulationFormationHelper::generateNewFormationForTeam($websoccer, $db, $team, $matchinfo['match_id']);
         $team->noFormationSet = TRUE;
         return;
     }
     // bench
     for ($playerNo = 1; $playerNo <= 5; $playerNo++) {
         $playerId = $matchinfo[$columnPrefix . '_formation_bench' . $playerNo];
         $result = $db->querySelect($columns, $fromTable, $whereCondition, $playerId);
         $playerinfo = $result->fetch_array();
         $result->free();
         // is player still in team?
         if (isset($playerinfo['team_id']) && $playerinfo['team_id'] == $team->id || $team->isNationalTeam && $playerinfo['nation'] == $team->name) {
             $player = new SimulationPlayer($playerId, $team, $playerinfo['position'], $playerinfo['mainPosition'], 3.0, $playerinfo['age'], $playerinfo['strength'], $playerinfo['technique'], $playerinfo['stamina'], $playerinfo['freshness'], $playerinfo['satisfaction']);
             if (strlen($playerinfo['pseudonym'])) {
                 $player->name = $playerinfo['pseudonym'];
             } else {
                 $player->name = $playerinfo['firstName'] . ' ' . $playerinfo['lastName'];
             }
             $team->playersOnBench[$playerId] = $player;
             SimulationStateHelper::createSimulationRecord($websoccer, $db, $matchinfo['match_id'], $player, TRUE);
         }
     }
 }