From af08c1325510d4414528d6e495b75cd267e93872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Untersch=C3=BCtz?= Date: Wed, 28 Jan 2026 12:01:15 +0100 Subject: [PATCH] refactor client prediction logic and add tolerance levels; implement `restartGame` function to reset game state without a full reload --- cmd/client/prediction.go | 45 +++++++++++++++++++++++++++------------ cmd/client/web/game.js | 18 ++++++++++++++++ cmd/client/web/index.html | 2 +- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/cmd/client/prediction.go b/cmd/client/prediction.go index 3ef9928..8aad0a7 100644 --- a/cmd/client/prediction.go +++ b/cmd/client/prediction.go @@ -128,25 +128,42 @@ func (g *Game) ReconcileWithServer(serverState game.PlayerState) { g.correctionX = diffX g.correctionY = diffY - // Bei sehr kleinen Abweichungen (<2px): Sofort korrigieren um Drift zu vermeiden - if dist < 4.0 { // 2px threshold + // === NEUE KORREKTUR-LOGIK MIT TOLERANZ === + + const ( + // Toleranzen für Client-Abweichungen + smallTolerance = 4.0 // 2px - sofort korrigieren + normalTolerance = 225.0 // 15px - akzeptable Abweichung, sanfte Korrektur + largeTolerance = 900.0 // 30px - Warnschwelle, nur noch Monitoring + hugeTolerance = 10000.0 // 100px - kritisch (Teleport/Respawn) + ) + + if dist < smallTolerance { + // Bei sehr kleinen Abweichungen (<2px): Sofort korrigieren um Drift zu vermeiden g.predictedX = replayX g.predictedY = replayY - } else if dist > 100*100 { - // Bei sehr großen Abweichungen (>100px): Sofort korrigieren (Teleport/Respawn) - g.predictedX = replayX - g.predictedY = replayY - g.correctionCount++ - } else if dist > 1.0 { - // Bei normalen Abweichungen: Sanfte Interpolation - // Bei 20 TPS: Aggressivere Interpolation - interpFactor := 0.5 // 50% pro Tick - if dist > 50*50 { - interpFactor = 0.8 // 80% bei großen Abweichungen - } + } else if dist < normalTolerance { + // Bei kleinen Abweichungen (2-15px): Sanfte Korrektur, Client hat etwas Spielraum + interpFactor := 0.3 // Nur 30% Korrektur - mehr Client-Freiheit g.predictedX += diffX * interpFactor g.predictedY += diffY * interpFactor g.correctionCount++ + } else if dist < largeTolerance { + // Bei mittleren Abweichungen (15-30px): Stärkere Korrektur + interpFactor := 0.5 // 50% Korrektur + g.predictedX += diffX * interpFactor + g.predictedY += diffY * interpFactor + g.correctionCount++ + } else if dist < hugeTolerance { + // Bei großen Abweichungen (30-100px): Nur noch Monitoring, KEINE Korrektur mehr + // Der Unterschied ist zu groß geworden - Client-Position wird akzeptiert + // Server überwacht weiterhin, greift aber nicht mehr ein + // (Dies verhindert "Ruckeln" bei starker Latenz) + } else { + // Bei kritischen Abweichungen (>100px): Sofort korrigieren (Teleport/Respawn/Desync) + g.predictedX = replayX + g.predictedY = replayY + g.correctionCount++ } // Velocity und Ground Status vom Server übernehmen diff --git a/cmd/client/web/game.js b/cmd/client/web/game.js index 8817886..c8426af 100644 --- a/cmd/client/web/game.js +++ b/cmd/client/web/game.js @@ -817,6 +817,23 @@ function deleteHighscoreCode(index) { loadMyCodes(); // Reload display } +// Restart game without reload +function restartGame() { + console.log('🔄 Restarting game...'); + + // Reset game state + gameStarted = false; + gameStarting = false; + + // Return to main menu + setUIState(UIState.MENU); + + // Re-enable start buttons + enableStartButtons(); + + console.log('✅ Game restarted - ready to play again'); +} + // Export functions for WASM to call window.showMenu = showMenu; window.hideMenu = hideMenu; @@ -824,6 +841,7 @@ window.updateLeaderboard = updateLeaderboard; window.showGameOver = showGameOver; window.onGameStarted = onGameStarted; window.saveHighscoreCode = saveHighscoreCode; +window.restartGame = restartGame; // Initialize on load initWASM(); diff --git a/cmd/client/web/index.html b/cmd/client/web/index.html index b9b91ad..28cdbb1 100644 --- a/cmd/client/web/index.html +++ b/cmd/client/web/index.html @@ -277,7 +277,7 @@ Lade Leaderboard... - +