PageRenderTime 35ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/tournament2/generate_pairs.php

http://lansuite.googlecode.com/
PHP | 310 lines | 225 code | 43 blank | 42 comment | 53 complexity | 79a952b2ef518b3b396992373ee1e4f7 MD5 | raw file
Possible License(s): LGPL-3.0, AGPL-1.0, LGPL-2.1
  1. <?php
  2. include_once("modules/mail/class_mail.php");
  3. $mail = new mail();
  4. $teams = $db->qry("SELECT teamid, leaderid, seeding_mark FROM %prefix%t2_teams WHERE (tournamentid = %int%) ORDER BY RAND()", $_GET["tournamentid"]);
  5. $team_anz = $db->num_rows($teams);
  6. $tournament = $db->qry_first("SELECT status, teamplayer, name, mode, blind_draw, mapcycle FROM %prefix%tournament_tournaments WHERE tournamentid = %int%", $_GET["tournamentid"]);
  7. $seeded = $db->qry_first("SELECT COUNT(*) AS anz FROM %prefix%t2_teams WHERE (tournamentid = %int%) AND (seeding_mark = '1') GROUP BY tournamentid", $_GET["tournamentid"]);
  8. if ($_GET["step"] < 2 and $tournament["blind_draw"]) $team_anz = floor($team_anz / $tournament["teamplayer"]);
  9. ########## Fehler prüfen
  10. ## Mind. 4 Teams im Turnier
  11. if ($team_anz < 4) {
  12. $func->information(t('Es müssen mindestens 4 Teams angemeldet sein!'), "index.php?mod=tournament2&action=details&tournamentid={$_GET["tournamentid"]}&headermenuitem=2");
  13. ## Bei Gruppen-Modus: Mind. 6 Teams im Turnier
  14. } elseif ($tournament['mode'] == "groups" and $team_anz < 6) {
  15. $func->information(t('Es müssen mindestens 6 Teams angemeldet sein!'), "index.php?mod=tournament2&action=details&tournamentid={$_GET["tournamentid"]}&headermenuitem=2");
  16. ## Status noch Offen
  17. } elseif ($tournament['status'] != "open") {
  18. $func->information(t('Dieses Turnier wurde bereits gestartet!'), "index.php?mod=tournament2&action=details&tournamentid={$_GET["tournamentid"]}&headermenuitem=1");
  19. ## Nicht mehr als die Hälft geseeded
  20. } elseif (($seeded['anz']) > ($team_anz / 2)){
  21. $func->information(t('Es wurde bereits die Hälfte der fest angemeldeten Teams markiert! Demarkiere zuerst ein Team, bevor du ein weiteres markieren'), "index.php?mod=tournament2&action=details&tournamentid={$_GET["tournamentid"]}&headermenuitem=2");
  22. ########## Keine Fehler gefunden
  23. } else {
  24. if ($_GET["step"] == 2) {
  25. ## Blind-Draw Teams zulosen
  26. if ($tournament["blind_draw"]) {
  27. $bd_teams = $db->qry("SELECT * FROM %prefix%t2_teams WHERE (tournamentid = %int%) ORDER BY RAND()", $_GET["tournamentid"]);
  28. $z = 0;
  29. while ($bd_team = $db->fetch_array($bd_teams)) {
  30. if ($z % $tournament["teamplayer"] == 0) $teamid = $bd_team["teamid"];
  31. else {
  32. $db->qry("INSERT INTO %prefix%t2_teammembers
  33. SET tournamentid = %int%,
  34. userid = %int%,
  35. teamid = %int%
  36. ", $_GET["tournamentid"], $bd_team["leaderid"], $teamid);
  37. $db->qry("DELETE FROM %prefix%t2_teams WHERE teamid = %int%", $bd_team["teamid"]);
  38. }
  39. $z++;
  40. }
  41. // Recalculate team-anz
  42. $teams = $db->qry("SELECT teamid, leaderid, seeding_mark FROM %prefix%t2_teams WHERE (tournamentid = %int%) ORDER BY RAND()", $_GET["tournamentid"]);
  43. $team_anz = $db->num_rows($teams);
  44. }
  45. ## Prüfen auf unvollständige Teams
  46. ## Unvollständige Teams zählen
  47. $waiting_teams = 0;
  48. $teams2 = $db->qry("SELECT name, teamid FROM %prefix%t2_teams WHERE (tournamentid = %int%)", $_GET["tournamentid"]);
  49. while($team2 = $db->fetch_array($teams2)) {
  50. $members = $db->qry_first("SELECT COUNT(*) AS members
  51. FROM %prefix%t2_teammembers
  52. WHERE (teamid = %int%)
  53. GROUP BY teamid
  54. ", $team2['teamid']);
  55. if(($members["members"] + 1) < $tournament['teamplayer']) $waiting_teams ++;
  56. }
  57. $db->free_result($teams2);
  58. ## Wenn unvollständige Teams vorhanden: Fragen, ob löschen
  59. if (($tournament['teamplayer'] == 1) || ($waiting_teams == 0)) $_GET["step"] = 3;
  60. else $func->question(t('Zu diesem Turnier haben sich Teams angemeldet, welche noch nicht komplett sind. Möchtest du diese beim Generieren aus dem Turnier entfernen?'), "index.php?mod=tournament2&action=generate_pairs&step=4&tournamentid={$_GET["tournamentid"]}", "index.php?mod=tournament2&action=generate_pairs&step=3&tournamentid={$_GET["tournamentid"]}");
  61. }
  62. ## Unvollständige Teams löschen
  63. if ($_GET["step"] == 4) {
  64. $teams2 = $db->qry("SELECT teamid, leaderid FROM %prefix%t2_teams WHERE (tournamentid = %int%)", $_GET["tournamentid"]);
  65. while($team2 = $db->fetch_array($teams2)) {
  66. $members = $db->qry_first("SELECT COUNT(*) AS members
  67. FROM %prefix%t2_teammembers
  68. WHERE (teamid = %int%)
  69. GROUP BY teamid
  70. ", $team2['teamid']);
  71. if(($members["members"] + 1) < $tournament['teamplayer']) {
  72. $db->qry("DELETE FROM %prefix%t2_teams WHERE (teamid = %int%) AND (tournamentid = %int%)", $team2["teamid"], $_GET["tournamentid"]);
  73. $db->qry("DELETE FROM %prefix%t2_teammembers WHERE (teamid = %int%) AND (tournamentid = %int%)", $team2["teamid"], $_GET["tournamentid"]);
  74. $mail->create_sys_mail($team2['leaderid'], t_no_html('Dein Team wurde vom Turnier %1 abgemeldet', $tournament['name']) , t_no_html('Der Turnieradmin hat soeben die Paarungen für das Turnier %1 generiert. Da Dein Team zu diesem Zeitpunkt leider noch nicht vollständig war, wurde es, wie vom Turnieradmin gewünscht, vom Turnier abgemeldet.', $tournament['name']));
  75. $func->log_event(t('Alle unvollständigen Teams im Turnier %1 wurden entfernt', $tournament['name']), 1, t('Turnier Teamverwaltung'));
  76. }
  77. }
  78. $db->free_result($teams2);
  79. $func->question(t('Alle unvollständigen Teams im Turnier %1 wurden erfolgreich gelöscht. Möchtest du das Turnier nun generieren?', $tournament["name"]), "index.php?mod=tournament2&action=generate_pairs&step=3&tournamentid={$_GET["tournamentid"]}", "index.php?mod=tournament2&action=details&tournamentid={$_GET["tournamentid"]}&headermenuitem=2");
  80. }
  81. ## Generieren
  82. //random mapcycle
  83. $rand_map = explode("\r\n", $tournament["mapcycle"]);
  84. shuffle($rand_map);
  85. $db->qry("UPDATE %prefix%tournament_tournaments SET mapcycle = %string% WHERE tournamentid = %int%", implode("\r\n", $rand_map), $_GET["tournamentid"]);
  86. if ($_GET["step"] == 3) {
  87. switch ($tournament['mode']) {
  88. case "single":
  89. case "double":
  90. ########## Anzahl an benötigten Freilosen bestimmen
  91. $exp = 0;
  92. for ($z = $team_anz; $z > 1; $z /= 2) $exp++;
  93. $needed_freilose = pow(2, $exp) - $team_anz;
  94. ########## Seeding durchführen
  95. ## Teams werden in 2 Array geteilt: Geseedet und Nicht-geseedet
  96. $seed_team_liste = array();
  97. $noseed_team_liste = array();
  98. $teams_num = 0;
  99. while($team = $db->fetch_array($teams)) {
  100. $teams_num++;
  101. if ($team["seeding_mark"]) array_push($seed_team_liste, $team["leaderid"]);
  102. else array_push($noseed_team_liste, $team["leaderid"]);
  103. $mail->create_sys_mail($team['leaderid'], t_no_html('Turnier %1 generiert', $tournament['name']) , t_no_html('Die Rundes des Turniers %1 wurden soeben generiert. Wir bitte dich, direkt mit dem ersten Spiel anzufangen, damit es keine unnötge Verzögerung im Turnier gibt. Viel Erfolg!', $tournament['name']));
  104. }
  105. $seeded_teams_num = count($seed_team_liste);
  106. ## Jedes wie vielte Element soll geseedet werden?
  107. ($seeded_teams_num) ? $seed_this = ceil($teams_num / $seeded_teams_num) : $seed_this = 0;
  108. ## Die beiden Arrays wieder sortiert zu einem zusammenfügen
  109. $team_liste = array();
  110. for ($akt = 1; $akt <= $teams_num; $akt++){
  111. $error = 0;
  112. if (($seed_this) && (($akt % $seed_this) == 1)) {
  113. if (!($akt_leaderid = array_shift($seed_team_liste))) $error = 1;
  114. } else {
  115. if (!($akt_leaderid = array_shift($noseed_team_liste))) $error = 1;
  116. }
  117. if (!$error) array_push($team_liste, $akt_leaderid);
  118. if ($error) echo "FEHLER beim Seeding!";
  119. }
  120. ########## Teams in die Paarungen-Tabelle schreiben
  121. $pos_round0 = 0;
  122. $pos_round1 = 0;
  123. $pos_round05 = 0;
  124. $pos_roundm1 = 1;
  125. while ($akt_leaderid = array_shift($team_liste)){
  126. $db->qry("INSERT INTO %prefix%t2_games SET
  127. tournamentid = %int%,
  128. leaderid = %int%,
  129. round = 0,
  130. position = %string%,
  131. score = 0
  132. ", $_GET["tournamentid"], $akt_leaderid, $pos_round0);
  133. $pos_round0++;
  134. // Freilose einfügen
  135. if ($needed_freilose > 0) {
  136. $needed_freilose--;
  137. $db->qry("INSERT INTO %prefix%t2_games SET
  138. tournamentid = %int%,
  139. leaderid = 0,
  140. round = 0,
  141. position = %string%,
  142. score = 0
  143. ", $_GET["tournamentid"], $pos_round0);
  144. $pos_round0++;
  145. // Spieler gegen Freilose in nächste Runde schieben
  146. $db->qry("INSERT INTO %prefix%t2_games SET
  147. tournamentid = %int%,
  148. leaderid = %int%,
  149. round = 1,
  150. position = %string%,
  151. score = 0
  152. ", $_GET["tournamentid"], $akt_leaderid, $pos_round1);
  153. $pos_round1++;
  154. // Freilose ins Loser-Bracket schieben
  155. $db->qry("INSERT INTO %prefix%t2_games SET
  156. tournamentid = %int%,
  157. leaderid = 0,
  158. round = -0.5,
  159. position = %string%,
  160. score = 0
  161. ", $_GET["tournamentid"], $pos_round05);
  162. $pos_round05++;
  163. // Freilose vs Freilose im Loser-Bracket Runde -0.5 auswerten und nach Runde -1 verschieben
  164. if (($needed_freilose % 2) == 1) {
  165. $db->qry("INSERT INTO %prefix%t2_games SET
  166. tournamentid = %int%,
  167. leaderid = 0,
  168. round = -1,
  169. position = %string%,
  170. score = 0
  171. ", $_GET["tournamentid"], $pos_roundm1);
  172. $pos_roundm1+=2;
  173. }
  174. }
  175. }
  176. break;
  177. case "liga":
  178. case "groups":
  179. // Calculate size and number of groups
  180. $group_anz = 1;
  181. if ($tournament['mode'] == "groups") {
  182. $res = 10;
  183. while ($res >= 3){
  184. $group_anz *= 2;
  185. $res = floor($team_anz / $group_anz);
  186. }
  187. $group_anz /= 2;
  188. }
  189. $num_over_size = $team_anz % $group_anz;
  190. // for each group, round, position
  191. for ($group = 1; $group <= $group_anz; $group++){
  192. $group_size = floor($team_anz / $group_anz);
  193. // If there are still teams with oversize, increase group size for this group
  194. $team_liste = array();
  195. if ($num_over_size > 0){
  196. $num_over_size--;
  197. $group_size++;
  198. }
  199. // Get teams for this round
  200. $i = 0;
  201. while (($i < $group_size) && ($team = $db->fetch_array($teams))) {
  202. $i++;
  203. array_push ($team_liste, $team["leaderid"]);
  204. }
  205. // If odd, insert faketeam "Geamefree"
  206. if (floor($group_size / 2) != ($group_size / 2)) {
  207. array_push ($team_liste, "0");
  208. $group_size++;
  209. }
  210. for ($round = 0; $round < ($group_size-1); $round++) {
  211. $team_liste_2 = $team_liste;
  212. // Write games to db
  213. for ($position = 0; $position < $group_size; $position++) {
  214. $akt_leader_id = array_shift ($team_liste);
  215. $db->qry("INSERT INTO %prefix%t2_games SET
  216. tournamentid = %int%,
  217. leaderid = %int%,
  218. round = %string%,
  219. position = %string%,
  220. group_nr = %string%,
  221. score = 0
  222. ", $_GET["tournamentid"], $akt_leader_id, $round, $position, $group);
  223. }
  224. // Rotate position for next round
  225. array_push ($team_liste, $team_liste_2[0]);
  226. array_push ($team_liste, $team_liste_2[2]);
  227. for ($position = 2; $position <= ($group_size-4); $position+=2) {
  228. array_push ($team_liste, $team_liste_2[$position+2]);
  229. array_push ($team_liste, $team_liste_2[$position-1]);
  230. }
  231. array_push ($team_liste, $team_liste_2[$group_size-1]);
  232. array_push ($team_liste, $team_liste_2[$group_size-3]);
  233. }
  234. }
  235. break;
  236. case "all":
  237. $z = 0;
  238. while ($team = $db->fetch_array($teams)) {
  239. $db->qry("INSERT INTO %prefix%t2_games SET
  240. tournamentid = %int%,
  241. leaderid = %int%,
  242. round = 0,
  243. position = %int%,
  244. score = 0
  245. ", $_GET["tournamentid"], $team['leaderid'], $z);
  246. $z++;
  247. }
  248. break;
  249. } // Switch Tournament-Mode
  250. $db->free_result($teams);
  251. ########## Turnierstatus auf "process" setzen
  252. $db->qry("UPDATE %prefix%tournament_tournaments SET status='process' WHERE tournamentid = %int%", $_GET["tournamentid"]);
  253. $func->confirmation(t('Das Turnier %1 wurde generiert.<br>Die Begegnungen können nun gespielt werden.', $tournament["name"]), "index.php?mod=tournament2&action=details&tournamentid={$_GET["tournamentid"]}");
  254. $func->log_event(t('Das Turnier %1 wurde generiert', $tournament["name"]), 1, t('Turnier Verwaltung'));
  255. /*
  256. $cronjob->load_job("cron_tmod");
  257. if($tournament['mode'] == "groups"){
  258. for ($i = 0; $i <= $group_anz; $i++){
  259. $cronjob->loaded_class->add_job($_GET["tournamentid"],$i);
  260. }
  261. }else{
  262. $cronjob->loaded_class->add_job($_GET["tournamentid"],"");
  263. }
  264. */
  265. } // Step = 3
  266. }
  267. ?>