diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index f4e506d..e1abe12 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -34,10 +34,12 @@ jobs: if [ "$BRANCH_LOWER" = "main" ] || [ "$BRANCH_LOWER" = "master" ]; then APP_URL="${{ env.BASE_DOMAIN }}" TARGET_NS="${REPO_LOWER}" + BUILD_MODE="main" echo "Mode: PRODUCTION (Root Domain)" else APP_URL="${REPO_LOWER}-${BRANCH_LOWER}.${{ env.BASE_DOMAIN }}" TARGET_NS="${REPO_LOWER}-${BRANCH_LOWER}" + BUILD_MODE="dev" echo "Mode: DEVELOPMENT (Subdomain)" fi @@ -50,6 +52,7 @@ jobs: echo "DEBUG: Namespace: $TARGET_NS" echo "DEBUG: URL: $APP_URL" echo "DEBUG: Branch-Tag: $BRANCH_TAG" + echo "DEBUG: Build-Mode: $BUILD_MODE" # In Gitea Actions Environment schreiben echo "FULL_IMAGE_PATH=$FULL_IMAGE_PATH" >> $GITHUB_ENV @@ -58,6 +61,7 @@ jobs: echo "APP_URL=$APP_URL" >> $GITHUB_ENV echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV echo "BRANCH_TAG=$BRANCH_TAG" >> $GITHUB_ENV + echo "BUILD_MODE=$BUILD_MODE" >> $GITHUB_ENV # 3. Prüfen ob ein Image-Rebuild nötig ist - name: Detect Source Changes @@ -93,7 +97,7 @@ jobs: image: ${{ env.FULL_IMAGE_PATH }} tag: ${{ env.IMAGE_TAG }} cache: true - extra_args: --skip-tls-verify-pull --insecure + extra_args: --skip-tls-verify-pull --insecure --build-arg BUILD_MODE=${{ env.BUILD_MODE }} # 5. Stabilen Branch-Tag aktualisieren (NUR nach erfolgreichem Build) # Damit weiß der nächste Nicht-Build-Push welches Image er verwenden soll. diff --git a/Dockerfile b/Dockerfile index 3de291a..a524ef1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,11 +25,19 @@ RUN if [ ! -f cmd/client/web/assets/assets.json ]; then \ RUN chmod +x scripts/cache-version.sh && \ ./scripts/cache-version.sh -# Bilder komprimieren (verlustfrei für PNG, leichter Verlust für JPG) -RUN echo "🗜️ Komprimiere Bilder..." && \ - find cmd/client/web -type f -name "*.png" -exec optipng -o3 -strip all {} \; && \ - find cmd/client/web -type f \( -name "*.jpg" -o -name "*.jpeg" \) -exec jpegoptim -m85 --strip-all --all-progressive --preserve --totals {} \; && \ - echo "✅ Bildkompression abgeschlossen" +# ARG für den Build-Modus (z.B. "main" für Produktion) +ARG BUILD_MODE=dev + +# Bilder komprimieren (NUR für BUILD_MODE=main) +# Spart Zeit bei Feature-Branch Builds +RUN if [ "$BUILD_MODE" = "main" ]; then \ + echo "🗜️ PRODUCTION MODE: Komprimiere Bilder..." && \ + find cmd/client/web -type f -name "*.png" -exec optipng -o3 -strip all {} \; && \ + find cmd/client/web -type f \( -name "*.jpg" -o -name "*.jpeg" \) -exec jpegoptim -m85 --strip-all --all-progressive --preserve --totals {} \; && \ + echo "✅ Bildkompression abgeschlossen"; \ + else \ + echo "⚡ DEV/FEATURE MODE: Bildkompression übersprungen"; \ + fi # Server binary bauen RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags="-w -s" -o server ./cmd/server diff --git a/cmd/client/game_render.go b/cmd/client/game_render.go index f7501bc..a2c6817 100644 --- a/cmd/client/game_render.go +++ b/cmd/client/game_render.go @@ -245,6 +245,11 @@ func (g *Game) UpdateGame() { g.SendInputWithSequence(input) + // Solo: Lokale Prüfung der Runde (Tod/Score) + if g.gameMode == "solo" { + g.checkSoloRound() + } + // Trail: store predicted position every physics step g.trail = append(g.trail, trailPoint{X: g.predictedX, Y: g.predictedY}) if len(g.trail) > 8 { diff --git a/cmd/client/gameover_native.go b/cmd/client/gameover_native.go index d0dda0d..e10aa10 100644 --- a/cmd/client/gameover_native.go +++ b/cmd/client/gameover_native.go @@ -168,7 +168,7 @@ func (g *Game) drawGameOverScreen(screen *ebiten.Image, myScore int) { text.Draw(screen, "SUBMIT SCORE", basicfont.Face7x13, submitBtnX+50, submitBtnY+25, color.White) } else if g.gameMode == "solo" && g.scoreSubmitted { // Solo: Zeige Bestätigungsmeldung - text.Draw(screen, "Score eingereicht!", basicfont.Face7x13, ScreenWidth/2-70, ScreenHeight-100, color.RGBA{0, 255, 0, 255}) + text.Draw(screen, "✓ Runde verifiziert & Score eingereicht!", basicfont.Face7x13, ScreenWidth/2-110, ScreenHeight-100, color.RGBA{0, 255, 0, 255}) } else if g.gameMode == "coop" && !g.isHost { // Coop Non-Host: Warten auf Host text.Draw(screen, "Warte auf Host...", basicfont.Face7x13, ScreenWidth/2-70, ScreenHeight-100, color.Gray{180}) diff --git a/cmd/client/main.go b/cmd/client/main.go index 025b3ee..5a83aa2 100644 --- a/cmd/client/main.go +++ b/cmd/client/main.go @@ -139,6 +139,7 @@ type Game struct { // Highscore localHighscore int + roundStartTime time.Time // Startzeit der aktuellen Runde (für Solo) // Audio System audio *AudioSystem @@ -271,9 +272,13 @@ func (g *Game) Update() error { } if currentStatus == "RUNNING" && g.lastStatus != "RUNNING" { g.audio.PlayMusic() + g.roundStartTime = time.Now() } if currentStatus == "GAMEOVER" && g.lastStatus == "RUNNING" { g.audio.StopMusic() + if g.gameMode == "solo" { + g.verifyRoundResult() + } } g.lastStatus = currentStatus