From 63108cb5a1f5852b330eac084e13768f642112b3 Mon Sep 17 00:00:00 2001 From: Andreas Knuth Date: Tue, 30 Jun 2026 00:18:14 -0500 Subject: [PATCH] sim fix --- lib/feeds.ts | 6 ---- lib/resolve-bracket.ts | 70 ++++++++++++++++++++---------------------- 2 files changed, 33 insertions(+), 43 deletions(-) diff --git a/lib/feeds.ts b/lib/feeds.ts index 9f38236..1e95460 100644 --- a/lib/feeds.ts +++ b/lib/feeds.ts @@ -682,12 +682,6 @@ export function applyFifaScores( 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) { const min = parseInt(fs.matchTime, 10); if (!isNaN(min)) r.minute = min; diff --git a/lib/resolve-bracket.ts b/lib/resolve-bracket.ts index a490e34..51eaf29 100644 --- a/lib/resolve-bracket.ts +++ b/lib/resolve-bracket.ts @@ -42,16 +42,23 @@ function winnerOf(m: Match | undefined): string | null { if (m.awayScore > m.homeScore) return m.awayTeamId; return null; } -let _winnerDbg = true; // Nur einmal loggen -function winnerDbg(m: Match | undefined, result: string | null, ctx: string): void { - if (!_winnerDbg || !m || m.matchNumber !== 74) return; - _winnerDbg = false; - console.log("[WINNER-OF]", ctx, - "| matchNumber:", m.matchNumber, - "| winnerTeamId:", m.winnerTeamId, - "| homeScore:", m.homeScore, "| awayScore:", m.awayScore, - "| status:", m.status, - "| ergebnis (zurückgegebener sieger):", result); +// Bestimmt im Sim-Modus die Sieger-Slot-ID. +// Real gespielte Spiele: echtes winnerTeamId (inkl. Elfmeter) auf die +// aufgelöste Slot-Seite mappen. Simulierte Spiele: Score-Vergleich. +function simWinnerSlotId(feed: Match, homeSlotId: string, awaySlotId: string): string { + if (feed.status === "FINISHED" && feed.winnerTeamId) { + if (feed.winnerTeamId === homeSlotId) return homeSlotId; + if (feed.winnerTeamId === awaySlotId) return awaySlotId; + if (feed.homePenalty != null && feed.awayPenalty != null + && feed.homePenalty !== feed.awayPenalty) { + 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 { @@ -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 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 && feed.homeScore != null && feed.awayScore != null) { - // Simulation: Gewinner aus Scores und aufgelösten Team-IDs ableiten. - // Nutze NICHT feed.homeTeamId/awayTeamId (sind null für KO-Matches), - // 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; + const winnerId = simWinnerSlotId(feed, h.teamId, a.teamId); + const loserId = winnerId === h.teamId ? a.teamId : h.teamId; 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 { winners.set(rm.matchNumber, feedWinner); losers.set(rm.matchNumber, loserOf(feed)); } 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 { matchNumber: rm.matchNumber, stage: "R32", home, away, status: feed?.status ?? "SCHEDULED", prob: feed?.prob, @@ -216,11 +208,16 @@ export function resolveBracket( const src = km.losers ? losers : winners; const homeId = src.get(km.fromHome) ?? null; const awayId = src.get(km.fromAway) ?? null; - if (km.matchNumber === 89) { - console.log("[PROPAGATE]", "ziel slot:", km.matchNumber, - "| fromHome:", km.fromHome, "| fromAway:", km.fromAway, - "| homeId (aus winners):", homeId, - "| awayId (aus winners):", awayId); + if (km.matchNumber === 89 || km.matchNumber === 90) { + console.log("[PROPAGATE-R16]", { + zielSlot: km.matchNumber, + fromHome: km.fromHome, + 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. @@ -236,11 +233,10 @@ export function resolveBracket( const feedWinner = winnerOf(feed); if (resolveWinners && feed && homeId && awayId && feed.homeScore != null && feed.awayScore != null) { - const homeWins = feed.homeScore > feed.awayScore; - const awayWins = feed.awayScore > feed.homeScore; - const winnerId = homeWins ? homeId : awayWins ? awayId : homeId; + const winnerId = simWinnerSlotId(feed, homeId, awayId); + const loserId = winnerId === homeId ? awayId : homeId; winners.set(km.matchNumber, winnerId); - losers.set(km.matchNumber, loserOf(feed) ?? (homeWins ? awayId : awayWins ? homeId : awayId)); + losers.set(km.matchNumber, loserId); } else { winners.set(km.matchNumber, feedWinner); losers.set(km.matchNumber, loserOf(feed));