/** * 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); } } }