This commit is contained in:
2026-06-30 00:18:14 -05:00
parent d982ff1068
commit 63108cb5a1
2 changed files with 33 additions and 43 deletions

View File

@@ -682,12 +682,6 @@ export function applyFifaScores(
console.warn("[fifa] FIFA-Winner-ID nicht in Team-Map:", fs.winnerTeamId, "| matchNumber:", m.matchNumber); console.warn("[fifa] FIFA-Winner-ID nicht in Team-Map:", fs.winnerTeamId, "| matchNumber:", m.matchNumber);
} }
} }
console.log("[FIFA-WINNER]", "matchNumber:", m.matchNumber,
"| fifa.Winner:", fs.winnerTeamId,
"| status:", r.status,
"| homeScore:", r.homeScore, "| awayScore:", r.awayScore,
"| homePenalty:", r.homePenalty, "| awayPenalty:", r.awayPenalty,
"| -> m.winnerTeamId gesetzt:", r.winnerTeamId);
if (fs.matchTime) { if (fs.matchTime) {
const min = parseInt(fs.matchTime, 10); const min = parseInt(fs.matchTime, 10);
if (!isNaN(min)) r.minute = min; if (!isNaN(min)) r.minute = min;

View File

@@ -42,16 +42,23 @@ function winnerOf(m: Match | undefined): string | null {
if (m.awayScore > m.homeScore) return m.awayTeamId; if (m.awayScore > m.homeScore) return m.awayTeamId;
return null; return null;
} }
let _winnerDbg = true; // Nur einmal loggen // Bestimmt im Sim-Modus die Sieger-Slot-ID.
function winnerDbg(m: Match | undefined, result: string | null, ctx: string): void { // Real gespielte Spiele: echtes winnerTeamId (inkl. Elfmeter) auf die
if (!_winnerDbg || !m || m.matchNumber !== 74) return; // aufgelöste Slot-Seite mappen. Simulierte Spiele: Score-Vergleich.
_winnerDbg = false; function simWinnerSlotId(feed: Match, homeSlotId: string, awaySlotId: string): string {
console.log("[WINNER-OF]", ctx, if (feed.status === "FINISHED" && feed.winnerTeamId) {
"| matchNumber:", m.matchNumber, if (feed.winnerTeamId === homeSlotId) return homeSlotId;
"| winnerTeamId:", m.winnerTeamId, if (feed.winnerTeamId === awaySlotId) return awaySlotId;
"| homeScore:", m.homeScore, "| awayScore:", m.awayScore, if (feed.homePenalty != null && feed.awayPenalty != null
"| status:", m.status, && feed.homePenalty !== feed.awayPenalty) {
"| ergebnis (zurückgegebener sieger):", result); return feed.homePenalty > feed.awayPenalty ? homeSlotId : awaySlotId;
}
}
if (feed.homeScore != null && feed.awayScore != null) {
if (feed.homeScore > feed.awayScore) return homeSlotId;
if (feed.awayScore > feed.homeScore) return awaySlotId;
}
return homeSlotId;
} }
function loserOf(m: Match | undefined): string | null { function loserOf(m: Match | undefined): string | null {
@@ -177,32 +184,17 @@ export function resolveBracket(
const away = sideFrom(a.teamId, slotLabel(rm.away, assignment, winnerGroup), teams, feed, "away", a.provisional, a.tooltip); const away = sideFrom(a.teamId, slotLabel(rm.away, assignment, winnerGroup), teams, feed, "away", a.provisional, a.tooltip);
const feedWinner = winnerOf(feed); const feedWinner = winnerOf(feed);
winnerDbg(feed, feedWinner, "resolveR32Slot");
// Sim-Modus: Gewinner NUR aus Scores + Slot-Team-IDs ableiten.
// feedWinner (aus feed.homeTeamId/awayTeamId) wird IGNORIERT,
// weil matchNumber-Zuweisung (assignNumbersAndVenues) von der
// FIFA-Nummerierung abweichen kann → feed gehört evtl. zum falschen Spiel.
if (resolveWinners && feed && h.teamId && a.teamId if (resolveWinners && feed && h.teamId && a.teamId
&& feed.homeScore != null && feed.awayScore != null) { && feed.homeScore != null && feed.awayScore != null) {
// Simulation: Gewinner aus Scores und aufgelösten Team-IDs ableiten. const winnerId = simWinnerSlotId(feed, h.teamId, a.teamId);
// Nutze NICHT feed.homeTeamId/awayTeamId (sind null für KO-Matches), const loserId = winnerId === h.teamId ? a.teamId : h.teamId;
// sondern die aufgelösten h.teamId / a.teamId aus resolveR32Slot.
const homeWins = feed.homeScore > feed.awayScore;
const awayWins = feed.awayScore > feed.homeScore;
const winnerId = homeWins ? h.teamId : awayWins ? a.teamId : h.teamId;
winners.set(rm.matchNumber, winnerId); winners.set(rm.matchNumber, winnerId);
losers.set(rm.matchNumber, loserOf(feed) ?? (homeWins ? a.teamId : awayWins ? h.teamId : a.teamId)); losers.set(rm.matchNumber, loserId);
} else { } else {
winners.set(rm.matchNumber, feedWinner); winners.set(rm.matchNumber, feedWinner);
losers.set(rm.matchNumber, loserOf(feed)); losers.set(rm.matchNumber, loserOf(feed));
} }
decided.set(rm.matchNumber, feed?.status === "FINISHED"); decided.set(rm.matchNumber, feed?.status === "FINISHED");
if (rm.matchNumber === 74) {
console.log("[PROPAGATE]", "von matchNumber:", rm.matchNumber,
"| feedWinner:", feedWinner,
"| -> in winners map unter key:", rm.matchNumber,
"| ziel z.B. slot 89 fromHome:", 74);
}
return { return {
matchNumber: rm.matchNumber, stage: "R32", matchNumber: rm.matchNumber, stage: "R32",
home, away, status: feed?.status ?? "SCHEDULED", prob: feed?.prob, home, away, status: feed?.status ?? "SCHEDULED", prob: feed?.prob,
@@ -216,11 +208,16 @@ export function resolveBracket(
const src = km.losers ? losers : winners; const src = km.losers ? losers : winners;
const homeId = src.get(km.fromHome) ?? null; const homeId = src.get(km.fromHome) ?? null;
const awayId = src.get(km.fromAway) ?? null; const awayId = src.get(km.fromAway) ?? null;
if (km.matchNumber === 89) { if (km.matchNumber === 89 || km.matchNumber === 90) {
console.log("[PROPAGATE]", "ziel slot:", km.matchNumber, console.log("[PROPAGATE-R16]", {
"| fromHome:", km.fromHome, "| fromAway:", km.fromAway, zielSlot: km.matchNumber,
"| homeId (aus winners):", homeId, fromHome: km.fromHome,
"| awayId (aus winners):", awayId); fromAway: km.fromAway,
homeIdAusWinners: homeId,
awayIdAusWinners: awayId,
homeIdAusLosers: losers.get(km.fromHome) ?? null,
awayIdAusLosers: losers.get(km.fromAway) ?? null,
});
} }
// Ein Folgeteam ist fix, wenn das speisende Spiel beendet ist. // Ein Folgeteam ist fix, wenn das speisende Spiel beendet ist.
@@ -236,11 +233,10 @@ export function resolveBracket(
const feedWinner = winnerOf(feed); const feedWinner = winnerOf(feed);
if (resolveWinners && feed && homeId && awayId if (resolveWinners && feed && homeId && awayId
&& feed.homeScore != null && feed.awayScore != null) { && feed.homeScore != null && feed.awayScore != null) {
const homeWins = feed.homeScore > feed.awayScore; const winnerId = simWinnerSlotId(feed, homeId, awayId);
const awayWins = feed.awayScore > feed.homeScore; const loserId = winnerId === homeId ? awayId : homeId;
const winnerId = homeWins ? homeId : awayWins ? awayId : homeId;
winners.set(km.matchNumber, winnerId); winners.set(km.matchNumber, winnerId);
losers.set(km.matchNumber, loserOf(feed) ?? (homeWins ? awayId : awayWins ? homeId : awayId)); losers.set(km.matchNumber, loserId);
} else { } else {
winners.set(km.matchNumber, feedWinner); winners.set(km.matchNumber, feedWinner);
losers.set(km.matchNumber, loserOf(feed)); losers.set(km.matchNumber, loserOf(feed));