//go:build js && wasm // +build js,wasm package main import ( "fmt" "log" "syscall/js" "time" ) // setupJavaScriptBridge registriert JavaScript-Funktionen für HTML-Menü Interaktion func (g *Game) setupJavaScriptBridge() { // startGame(mode, playerName, roomID, teamName, isHost) startGameFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} { if len(args) < 2 { log.Println("❌ startGame: Nicht genug Argumente") return nil } mode := args[0].String() // "solo" oder "coop" playerName := args[1].String() // Spielername // Spieler-Daten setzen g.playerName = playerName g.gameMode = mode g.savePlayerName(playerName) if mode == "solo" { // Solo Mode - direkt ins Spiel g.roomID = fmt.Sprintf("solo_%d", time.Now().UnixNano()) g.isHost = true g.appState = StateGame log.Printf("🎮 Solo-Spiel gestartet: %s", playerName) } else if mode == "coop" && len(args) >= 5 { // Co-op Mode - in die Lobby roomID := args[2].String() teamName := args[3].String() isHost := args[4].Bool() g.roomID = roomID g.teamName = teamName g.isHost = isHost g.appState = StateLobby log.Printf("🎮 Co-op-Lobby erstellt: %s (Room: %s, Team: %s, Host: %v)", playerName, roomID, teamName, isHost) } // Verbindung starten go g.connectAndStart() return nil }) // requestLeaderboard() requestLeaderboardFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} { log.Println("📊 Leaderboard angefordert") go g.requestLeaderboard() return nil }) // setMusicVolume(volume) setMusicVolumeFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} { if len(args) > 0 { volume := args[0].Float() g.audio.SetMusicVolume(volume) log.Printf("🎵 Musik-Lautstärke: %.0f%%", volume*100) } return nil }) // setSFXVolume(volume) setSFXVolumeFunc := js.FuncOf(func(this js.Value, args []js.Value) interface{} { if len(args) > 0 { volume := args[0].Float() g.audio.SetSFXVolume(volume) log.Printf("🔊 SFX-Lautstärke: %.0f%%", volume*100) } return nil }) // Im globalen Scope registrieren js.Global().Set("startGame", startGameFunc) js.Global().Set("requestLeaderboard", requestLeaderboardFunc) js.Global().Set("setMusicVolume", setMusicVolumeFunc) js.Global().Set("setSFXVolume", setSFXVolumeFunc) log.Println("✅ JavaScript Bridge registriert") } // Leaderboard an JavaScript senden func (g *Game) sendLeaderboardToJS() { g.leaderboardMutex.Lock() entries := make([]interface{}, len(g.leaderboard)) for i, entry := range g.leaderboard { entries[i] = map[string]interface{}{ "player_name": entry.PlayerName, "score": entry.Score, "player_code": entry.PlayerCode, } } g.leaderboardMutex.Unlock() // JavaScript-Funktion aufrufen if updateFunc := js.Global().Get("updateLeaderboard"); !updateFunc.IsUndefined() { jsEntries := js.ValueOf(entries) updateFunc.Invoke(jsEntries) log.Printf("📤 Leaderboard an JavaScript gesendet: %d Einträge", len(entries)) } } // Game Over Screen an JavaScript senden func (g *Game) sendGameOverToJS(score int) { if gameOverFunc := js.Global().Get("showGameOver"); !gameOverFunc.IsUndefined() { gameOverFunc.Invoke(score) log.Printf("💀 Game Over an JavaScript gesendet: Score=%d", score) } }