diff --git a/src/structure/components/com_sportsmanager/admin.php b/src/structure/components/com_sportsmanager/admin.php
index bbfa1e3..27012b8 100644
--- a/src/structure/components/com_sportsmanager/admin.php
+++ b/src/structure/components/com_sportsmanager/admin.php
@@ -4724,6 +4724,10 @@ function adminEditTeamspielmodus(): void
$spielpunkte_wertung_einzel = $jInput->get('spielpunkte_wertung_einzel', 0, 'INT');
$spielpunkte_wertung_doppel_separat = $jInput->get('spielpunkte_wertung_doppel_separat', 0, 'INT');
$spielpunkte_wertung_doppel = $spielpunkte_wertung_doppel_separat ? $jInput->get('spielpunkte_wertung_doppel', 0, 'INT') : $spielpunkte_wertung_einzel;
+ if ($spielpunkte_wertung_einzel == 4 && ($punktetyp != 1 || $satzergebnisse != 1))
+ $spielpunkte_wertung_einzel = 0;
+ if ($spielpunkte_wertung_doppel == 4 && ($punktetyp != 1 || $satzergebnisse != 1))
+ $spielpunkte_wertung_doppel = 0;
$spielpunkte_bedingung = $jInput->get('spielpunkte_bedingung', 0, 'INT');
$spielernamen = $jInput->get('spielernamen', 0, 'INT');
@@ -11264,19 +11268,20 @@ function adminSaveBegegnungSpielplan(): void
$total_heim_punkte += $spiel_heim_punkte;
$total_gast_punkte += $spiel_gast_punkte;
+ $spiel_ergebnis_detailliert = $skip_spiel
+ ? (isset($spiele_nummern[$spiel_nr]) ? $spiele_nummern[$spiel_nr]->ergebnis_detailliert : null)
+ : $ergebnis_detailliert;
+
list($spiel_heim_spielpunkte, $spiel_gast_spielpunkte) = spielpunkteFuerSpiel(
$spieltyp[0] != "D" ? $spielpunkte_wertung_einzel : $spielpunkte_wertung_doppel,
- $spiel_heim_punkte, $spiel_gast_punkte);
+ $spiel_heim_punkte, $spiel_gast_punkte, $spiel_ergebnis_detailliert);
$total_heim_spielpunkte += $spiel_heim_spielpunkte;
$total_gast_spielpunkte += $spiel_gast_spielpunkte;
list($spiel_heim_tore, $spiel_gast_tore) = toreFuerSpiel(
$teamspiel_modus->punktetyp, $teamspiel_modus->satzergebnisse ?? 0,
- $spiel_heim_punkte, $spiel_gast_punkte,
- $skip_spiel
- ? (isset($spiele_nummern[$spiel_nr]) ? $spiele_nummern[$spiel_nr]->ergebnis_detailliert : null)
- : $ergebnis_detailliert);
+ $spiel_heim_punkte, $spiel_gast_punkte, $spiel_ergebnis_detailliert);
if ($spiel_heim_tore === null || $total_heim_tore === null) {
$total_heim_tore = null;
$total_gast_tore = null;
diff --git a/src/structure/components/com_sportsmanager/sportsmanager.php b/src/structure/components/com_sportsmanager/sportsmanager.php
index a787d92..2b9e1e3 100644
--- a/src/structure/components/com_sportsmanager/sportsmanager.php
+++ b/src/structure/components/com_sportsmanager/sportsmanager.php
@@ -6180,7 +6180,7 @@ function begegnungenAktualisieren($geaendert_veranstaltung_id = 0, $geaendert_mo
list($spiel_heim_spielpunkte, $spiel_gast_spielpunkte) = spielpunkteFuerSpiel(
$spiel->heim_spieler_2_id === NULL && $spiel->gast_spieler_2_id === NULL
? $spielpunkte_wertung_einzel : $spielpunkte_wertung_doppel,
- $spiel_heim_punkte, $spiel_gast_punkte);
+ $spiel_heim_punkte, $spiel_gast_punkte, $spiel->ergebnis_detailliert);
$total_heim_spielpunkte += $spiel_heim_spielpunkte;
$total_gast_spielpunkte += $spiel_gast_spielpunkte;
diff --git a/src/structure/components/com_sportsmanager/tools.php b/src/structure/components/com_sportsmanager/tools.php
index 3d689b2..be7de2b 100644
--- a/src/structure/components/com_sportsmanager/tools.php
+++ b/src/structure/components/com_sportsmanager/tools.php
@@ -628,10 +628,16 @@ function runden_detailliert_auswertung($runden): array
return array($ergebnis, $heim_saetze, $unentschieden_saetze, $gast_saetze, $heim_punkte, $gast_punkte);
}
-function spielpunkteFuerSpiel($wertung, $heim_punkte, $gast_punkte): array
+function spielpunkteFuerSpiel($wertung, $heim_punkte, $gast_punkte, $ergebnis_detailliert = null): array
{
if ($wertung == 2)
return array($heim_punkte, $gast_punkte);
+ if ($wertung == 4) {
+ if (empty($ergebnis_detailliert))
+ return array(2 * (int)$heim_punkte, 2 * (int)$gast_punkte);
+ $auswertung = runden_detailliert_auswertung($ergebnis_detailliert);
+ return array(2 * $auswertung[1] + $auswertung[2], 2 * $auswertung[3] + $auswertung[2]);
+ }
$sieg = $wertung == 0 ? 2 : ($wertung == 1 ? 3 : 1);
if ($heim_punkte > $gast_punkte)
return array($sieg, 0);
diff --git a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php
index 1e04b18..b7597d9 100644
--- a/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php
+++ b/src/structure/components/com_sportsmanager/views/sportsmanager/view_admin.php
@@ -4722,6 +4722,18 @@ class HTML_sportsmanager_admin
if (text != null) sel.options[o].textContent = text;
}
}
+ var satzdetails = saetze && document.adminForm.punktetyp.value == 2;
+ var wertungen = ['spielpunkte_wertung_einzel', 'spielpunkte_wertung_doppel'];
+ for (var f = 0; f < wertungen.length; f++) {
+ var sel = document.adminForm[wertungen[f]];
+ if (sel == null) continue;
+ for (var o = 0; o < sel.options.length; o++) {
+ if (sel.options[o].getAttribute('data-satzdetails') == null) continue;
+ sel.options[o].hidden = !satzdetails;
+ sel.options[o].disabled = !satzdetails;
+ if (!satzdetails && sel.value == sel.options[o].value) sel.value = '0';
+ }
+ }
if (race) {
var spiele = 0;
for (var n = 1; ; n++) {
@@ -4846,11 +4858,19 @@ class HTML_sportsmanager_admin
var _punktetyp_vorher = satzergebnisse) ? 2 : (int)($row->punktetyp ?? 0); ?>;
var _hat_ergebnisse = hat_ergebnisse) ? 'true' : 'false'; ?>;
+ var _wertung4_vorher = spielpunkte_wertung_einzel == 4 || $row->spielpunkte_wertung_doppel == 4) ? 'true' : 'false'; ?>;
function punktetyp_geprueft() {
if (!_hat_ergebnisse) return true;
- if (Number(document.adminForm.punktetyp.value) === _punktetyp_vorher) return true;
- return confirm();
+ if (Number(document.adminForm.punktetyp.value) !== _punktetyp_vorher
+ && !confirm())
+ return false;
+ var separat = document.adminForm.spielpunkte_wertung_doppel_separat.value == 1;
+ var wertung4 = document.adminForm.spielpunkte_wertung_einzel.value == 4
+ || (separat && document.adminForm.spielpunkte_wertung_doppel.value == 4);
+ if (wertung4 !== _wertung4_vorher)
+ return confirm();
+ return true;
}
function spielpunkte_wertung_doppel_anzeigen() {
@@ -5100,12 +5120,14 @@ class HTML_sportsmanager_admin
name="spielpunkte_wertung_einzel" id="points_valuation_single"
size="1">
spielpunkte_wertung_einzel == $typ_wert[$i] ? " selected" : "") : "") . ">" . htmlentities_utf8($typ[$i]) . "";
+ $satzdetails_an = !$race_an && !empty($row) && !empty($row->satzergebnisse) && $row->punktetyp != 0;
+ $satzdetails_attr = ' data-satzdetails="1"' . ($satzdetails_an ? '' : ' hidden disabled');
+ for ($i = 0; $i <= 4; $i++) {
+ echo "";
}
?>
@@ -5126,9 +5148,9 @@ class HTML_sportsmanager_admin
name="spielpunkte_wertung_doppel" id="points_valuation_double"
size="1">
spielpunkte_wertung_doppel == $typ_wert[$i] ? " selected" : "") : "") . ">" . htmlentities_utf8($typ[$i]) . "";
+ $typ = array(Text::_('COM_SPORTSMANAGER_WIN_1_POINT'), Text::_('COM_SPORTSMANAGER_WIN_2_POINTS'), Text::_('COM_SPORTSMANAGER_WIN_3_POINTS'), Text::_('COM_SPORTSMANAGER_RESULT_AS_GAME_POINTS'), Text::_('COM_SPORTSMANAGER_WIN_2_POINTS_PER_SET'));
+ for ($i = 0; $i <= 4; $i++) {
+ echo "";
}
?>
@@ -12721,11 +12743,33 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
. "}\n";
}
}
+ if ($spielpunkte_wertung_einzel == 4 || $spielpunkte_wertung_doppel == 4) {
+ echo "function satz_summen(nr) {\n"
+ . " var heim = document.getElementsByName('spiel_' + nr + '_heim_punkte_detailliert[]');\n"
+ . " var gast = document.getElementsByName('spiel_' + nr + '_gast_punkte_detailliert[]');\n"
+ . " var gewonnen = 0, unentschieden = 0, verloren = 0;\n"
+ . " for (var i = 0; i < heim.length; i++) {\n"
+ . " var h = heim[i].value == '' ? 0 : Number(heim[i].value);\n"
+ . " var g = gast[i].value == '' ? 0 : Number(gast[i].value);\n"
+ . " if (h == 0 && g == 0) continue;\n"
+ . " if (h > g) gewonnen++;\n"
+ . " else if (g > h) verloren++;\n"
+ . " else unentschieden++;\n"
+ . " }\n"
+ . " return [gewonnen, unentschieden, verloren];\n"
+ . "}\n";
+ }
echo "function gesamtstand_aktualisieren() {\n"
- . " var sh = 0, sg = 0, h, g;\n";
+ . " var sh = 0, sg = 0, h, g, satzstand;\n";
for ($i = 1; $i <= count($spieltypen); $i++) {
$d = $spieltypen[$i - 1][0] == "D";
$w = $d ? $spielpunkte_wertung_doppel : $spielpunkte_wertung_einzel;
+ if ($w == 4) {
+ echo " satzstand = satz_summen(" . $i . ");\n"
+ . " sh += 2 * satzstand[0] + satzstand[1];\n"
+ . " sg += 2 * satzstand[2] + satzstand[1];\n";
+ continue;
+ }
echo " h = document.adminForm['spiel_" . $i . "_heim_punkte'];\n"
. " g = document.adminForm['spiel_" . $i . "_gast_punkte'];\n"
. " h = (h != null && h.value != '') ? Number(h.value) : 0;\n"
@@ -12879,12 +12923,19 @@ static function adminVerbandsorganMitglieder($rows,$verbandsorgan): void
. " var spielpunkte_unentschieden_einzel = " . ($spielpunkte_wertung_einzel <= 1 ? 1 : 0) . ";\n"
. " var spielpunkte_unentschieden_doppel = " . ($spielpunkte_wertung_doppel <= 1 ? 1 : 0) . ";\n"
. " var punkte_heim;\n"
- . " var punkte_gast;\n";
+ . " var punkte_gast;\n"
+ . " var satzstand;\n";
$n = count($spieltypen);
for ($i = 1; $i <= $n; $i++) {
$spiel_einzel = $spieltypen[$i - 1][0] != "D";
if (($spiel_einzel && $spielpunkte_wertung_einzel == 2) || (!$spiel_einzel && $spielpunkte_wertung_doppel == 2))
continue;
+ if (($spiel_einzel ? $spielpunkte_wertung_einzel : $spielpunkte_wertung_doppel) == 4) {
+ echo " satzstand = satz_summen(" . $i . ");\n"
+ . " spielpunkte_heim += 2 * satzstand[0] + satzstand[1];\n"
+ . " spielpunkte_gast += 2 * satzstand[2] + satzstand[1];\n";
+ continue;
+ }
// Number(): .value ist eine Zeichenkette, "10" > "9" wäre sonst unwahr
echo " punkte_heim = document.adminForm.spiel_" . $i . "_heim_punkte.value != '' ? Number(document.adminForm.spiel_" . $i . "_heim_punkte.value) : 0;\n"
. " punkte_gast = document.adminForm.spiel_" . $i . "_gast_punkte.value != '' ? Number(document.adminForm.spiel_" . $i . "_gast_punkte.value) : 0;\n"
diff --git a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini
index b486286..5dc2221 100644
--- a/src/structure/language/de-DE/de-DE.com_sportsmanager.ini
+++ b/src/structure/language/de-DE/de-DE.com_sportsmanager.ini
@@ -501,6 +501,7 @@ COM_SPORTSMANAGER_ADD_SEASON="Saison hinzufügen"
COM_SPORTSMANAGER_GAME_POINTS_GAME="Spielpunkte pro Spiel"
COM_SPORTSMANAGER_WIN_1_POINT="Sieg: 1 Punkt"
COM_SPORTSMANAGER_WIN_2_POINTS="Sieg: 2 Punkte, Unentschieden: 1 Punkt"
+COM_SPORTSMANAGER_WIN_2_POINTS_PER_SET="Sieg: 2 Punkte, Unentschieden: 1 Punkt – je Satz"
COM_SPORTSMANAGER_WIN_3_POINTS="Sieg: 3 Punkte, Unentschieden: 1 Punkt"
COM_SPORTSMANAGER_MEETING_CONCLUDED_AT="Begegnung abgeschlossen bei"
COM_SPORTSMANAGER_GAMES_IN_STATISTIK="Spiele in Spielerstatistik"
@@ -1174,5 +1175,6 @@ COM_SPORTSMANAGER_GROUP_SEQUENCE="Spielfolge"
COM_SPORTSMANAGER_GAMES_IN_STATISTIK_FIRST_ONE="nur das erste Spiel"
COM_SPORTSMANAGER_GAMES_IN_STATISTIK_FIRST="nur die ersten %d Spiele"
COM_SPORTSMANAGER_POINT_TYPE_CHANGED_WARNING="Für diesen Mannschaftsspielplan sind bereits Ergebnisse eingetragen. Die gespeicherten Zahlen werden NICHT umgerechnet – sie bedeuten danach etwas anderes (Tore statt Sätze bzw. umgekehrt). Trotzdem speichern?"
+COM_SPORTSMANAGER_PER_SET_VALUATION_CHANGED_WARNING="Für diesen Mannschaftsspielplan sind bereits Ergebnisse eingetragen. Beim Wechsel der Wertung „je Satz" wird nichts umgerechnet: Spiele ohne gespeicherte Satzergebnisse werden mit 2 Punkten je gewonnenem Satz gewertet, ihre Satz-Unentschieden gehen verloren. Und wo unter „Mehrere" in Wahrheit Tore in den Punkte-Feldern stehen (statt Sätzen), zählt ab jetzt jedes Tor wie ein gewonnener Satz doppelt. Trotzdem speichern?"
COM_SPORTSMANAGER_RACE_RUNNING="Stand"
COM_SPORTSMANAGER_TOTAL_SCORE="Gesamtstand"
diff --git a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini
index 6a7a12b..40124bd 100644
--- a/src/structure/language/en-GB/en-GB.com_sportsmanager.ini
+++ b/src/structure/language/en-GB/en-GB.com_sportsmanager.ini
@@ -501,6 +501,7 @@ COM_SPORTSMANAGER_ADD_SEASON="Add season"
COM_SPORTSMANAGER_GAME_POINTS_GAME="Game points per game"
COM_SPORTSMANAGER_WIN_1_POINT="Win: 1 point"
COM_SPORTSMANAGER_WIN_2_POINTS="Win: 2 points, draw: 1 point"
+COM_SPORTSMANAGER_WIN_2_POINTS_PER_SET="Win: 2 points, draw: 1 point – per set"
COM_SPORTSMANAGER_WIN_3_POINTS="Win: 3 points, draw: 1 point"
COM_SPORTSMANAGER_MEETING_CONCLUDED_AT="Match won at"
COM_SPORTSMANAGER_GAMES_IN_STATISTIK="Games in player statistics"
@@ -1174,5 +1175,6 @@ COM_SPORTSMANAGER_GROUP_SEQUENCE="Game sequence"
COM_SPORTSMANAGER_GAMES_IN_STATISTIK_FIRST_ONE="the first game only"
COM_SPORTSMANAGER_GAMES_IN_STATISTIK_FIRST="the first %d games only"
COM_SPORTSMANAGER_POINT_TYPE_CHANGED_WARNING="Results have already been entered for this team schedule. The stored numbers are NOT converted – afterwards they mean something else (goals instead of sets, or the other way round). Save anyway?"
+COM_SPORTSMANAGER_PER_SET_VALUATION_CHANGED_WARNING="Results have already been entered for this team schedule. Switching the per-set valuation converts nothing: games without stored set results are valued at 2 points per set won, and their drawn sets are lost. And where a 'multiple sets' schedule in fact holds goals in its points fields (instead of sets), every goal will from now on count double, like a set won. Save anyway?"
COM_SPORTSMANAGER_RACE_RUNNING="Score"
COM_SPORTSMANAGER_TOTAL_SCORE="Total score"