Updated TicTacToeRules and BattleshipRules to implement ApplyMove(state, playerIdx, payload) (bool, bool, int) as required by GameRules. Added win/draw resolution logic directly inside each game’s ApplyMove return. Removed obsolete convertToGamePlayers helper. Updated GenericMatch to call AssignPlayerSymbols with []*structs.Player directly. Ensured all rule implementations now fully satisfy the GameRules interface.
88 lines
2.2 KiB
Go
88 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
|
|
"github.com/heroiclabs/nakama-common/runtime"
|
|
|
|
// Project modules
|
|
"localrepo/plugins/modules"
|
|
"localrepo/plugins/games"
|
|
)
|
|
|
|
func InitModule(
|
|
ctx context.Context,
|
|
logger runtime.Logger,
|
|
db *sql.DB,
|
|
nk runtime.NakamaModule,
|
|
initializer runtime.Initializer,
|
|
) error {
|
|
|
|
//--------------------------------------------------------
|
|
// 1. Register RPCs
|
|
//--------------------------------------------------------
|
|
if err := initializer.RegisterRpc("leave_matchmaking", modules.RpcLeaveMatchmaking); err != nil {
|
|
logger.Error("Failed to register RPC leave_matchmaking: %v", err)
|
|
return err
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
// 2. Register Matchmaker Handler
|
|
//--------------------------------------------------------
|
|
if err := initializer.RegisterMatchmakerMatched(modules.MatchmakerMatched); err != nil {
|
|
logger.Error("Failed to register MatchmakerMatched: %v", err)
|
|
return err
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
// 3. Register ALL game rules for GenericMatch
|
|
//--------------------------------------------------------
|
|
|
|
registry := map[string]games.GameRules{
|
|
"tictactoe": &games.TicTacToeRules{},
|
|
"battleship": &games.BattleshipRules{},
|
|
}
|
|
|
|
if err := initializer.RegisterMatch(
|
|
"generic",
|
|
modules.NewGenericMatch(registry),
|
|
); err != nil {
|
|
logger.Error("Failed to register generic match: %v", err)
|
|
return err
|
|
}
|
|
|
|
//--------------------------------------------------------
|
|
// 4. Create Leaderboards
|
|
//--------------------------------------------------------
|
|
|
|
leaderboards := []string{
|
|
"tictactoe_classic",
|
|
"tictactoe_ranked",
|
|
"battleship_classic",
|
|
"battleship_ranked",
|
|
}
|
|
|
|
for _, lb := range leaderboards {
|
|
err := nk.LeaderboardCreate(
|
|
ctx,
|
|
lb,
|
|
true, // authoritative
|
|
"desc", // sort order
|
|
"incr", // operator
|
|
"", // reset schedule
|
|
map[string]interface{}{}, // metadata
|
|
)
|
|
|
|
if err != nil && err.Error() != "Leaderboard ID already exists" {
|
|
logger.Error("Failed to create leaderboard %s: %v", lb, err)
|
|
return err
|
|
}
|
|
|
|
logger.Info("Leaderboard ready: %s", lb)
|
|
}
|
|
|
|
logger.Info("Go module loaded successfully!")
|
|
return nil
|
|
}
|