136 lines
4.2 KiB
Go
136 lines
4.2 KiB
Go
package gameserver
|
|
|
|
import (
|
|
"log"
|
|
|
|
"ananta-ps/pkg/protocol"
|
|
)
|
|
|
|
// Chinese Chess Board (9x10 Xiangqi)
|
|
type ChineseChessGame struct {
|
|
Board [10][9]int8
|
|
}
|
|
|
|
func NewChineseChessGame() *ChineseChessGame {
|
|
g := &ChineseChessGame{}
|
|
g.Reset()
|
|
return g
|
|
}
|
|
|
|
func (g *ChineseChessGame) Reset() {
|
|
// Standard Xiangqi starting pieces:
|
|
// Red: 1-King, 2-Advisor, 3-Elephant, 4-Horse, 5-Chariot, 6-Cannon, 7-Soldier
|
|
// Black: -1 to -7
|
|
g.Board = [10][9]int8{
|
|
{-5, -4, -3, -2, -1, -2, -3, -4, -5},
|
|
{0, 0, 0, 0, 0, 0, 0, 0, 0},
|
|
{0, -6, 0, 0, 0, 0, 0, -6, 0},
|
|
{-7, 0, -7, 0, -7, 0, -7, 0, -7},
|
|
{0, 0, 0, 0, 0, 0, 0, 0, 0},
|
|
{0, 0, 0, 0, 0, 0, 0, 0, 0},
|
|
{7, 0, 7, 0, 7, 0, 7, 0, 7},
|
|
{0, 6, 0, 0, 0, 0, 0, 6, 0},
|
|
{0, 0, 0, 0, 0, 0, 0, 0, 0},
|
|
{5, 4, 3, 2, 1, 2, 3, 4, 5},
|
|
}
|
|
}
|
|
|
|
func (s *Server) handleAskChineseChessMove(sess *Session, pkt *protocol.RpcPacket) error {
|
|
r := protocol.NewUxReader(pkt.Body)
|
|
fromX, _ := r.U8()
|
|
fromY, _ := r.U8()
|
|
toX, _ := r.U8()
|
|
toY, _ := r.U8()
|
|
|
|
log.Printf("[CHESS] ChineseChess move from (%d,%d) to (%d,%d)", fromX, fromY, toX, toY)
|
|
if err := sess.ReturnEmptyOk(pkt.InvokeID, pkt.MethodID); err != nil {
|
|
return err
|
|
}
|
|
|
|
w := protocol.NewUxWriter()
|
|
w.U8(fromX).U8(fromY).U8(toX).U8(toY)
|
|
return sess.NotifyData(protocol.MethodGetMethodIDDefault("SyncChineseChessMove", 68582880), w.Bytes())
|
|
}
|
|
|
|
// Mahjong Solo
|
|
func (s *Server) handleAskMahjongAction(sess *Session, pkt *protocol.RpcPacket) error {
|
|
r := protocol.NewUxReader(pkt.Body)
|
|
actionType, _ := r.U32()
|
|
tileId, _ := r.U32()
|
|
|
|
log.Printf("[MAHJONG] Mahjong action=%d tile=%d", actionType, tileId)
|
|
if err := sess.ReturnEmptyOk(pkt.InvokeID, pkt.MethodID); err != nil {
|
|
return err
|
|
}
|
|
|
|
w := protocol.NewUxWriter()
|
|
w.U32(actionType).U32(tileId)
|
|
return sess.NotifyData(protocol.MethodGetMethodIDDefault("SyncMahjongAction", 68582881), w.Bytes())
|
|
}
|
|
|
|
// Balloon Shooting Game
|
|
func (s *Server) handleEnterBalloonZone(sess *Session, pkt *protocol.RpcPacket) error {
|
|
log.Printf("[BALLOON] Player entered balloon shooting zone")
|
|
if err := sess.ReturnEmptyOk(pkt.InvokeID, pkt.MethodID); err != nil {
|
|
return err
|
|
}
|
|
|
|
// SyncGameGroundZoneInfo for Balloon game
|
|
wZone := protocol.NewUxWriter()
|
|
wZone.U32(3).U64(0x9000000000000001).Bool(true)
|
|
return sess.NotifyData(protocol.MethodGetMethodIDDefault("SyncGameGroundZoneInfo", 68004609), wZone.Bytes())
|
|
}
|
|
|
|
func (s *Server) handleLeaveBalloon(sess *Session, pkt *protocol.RpcPacket) error {
|
|
log.Printf("[BALLOON] Player left balloon zone")
|
|
return sess.ReturnEmptyOk(pkt.InvokeID, pkt.MethodID)
|
|
}
|
|
|
|
func (s *Server) handleAskBreakDestructibleObject(sess *Session, pkt *protocol.RpcPacket) error {
|
|
r := protocol.NewUxReader(pkt.Body)
|
|
objId, _ := r.U64()
|
|
|
|
sess.balloonScore += 10
|
|
log.Printf("[BALLOON] BreakDestructibleObject id=%d totalScore=%d", objId, sess.balloonScore)
|
|
|
|
if err := sess.ReturnEmptyOk(pkt.InvokeID, pkt.MethodID); err != nil {
|
|
return err
|
|
}
|
|
|
|
wScore := protocol.NewUxWriter()
|
|
wScore.U64(objId).U32(sess.balloonScore)
|
|
return sess.NotifyData(protocol.MethodGetMethodIDDefault("SyncBalloonScore", 68582882), wScore.Bytes())
|
|
}
|
|
|
|
// Bowling Alley
|
|
func (s *Server) handleEnterBowlingZone(sess *Session, pkt *protocol.RpcPacket) error {
|
|
log.Printf("[BOWLING] Player entered bowling zone")
|
|
if err := sess.ReturnEmptyOk(pkt.InvokeID, pkt.MethodID); err != nil {
|
|
return err
|
|
}
|
|
|
|
wZone := protocol.NewUxWriter()
|
|
wZone.U32(1).U64(0x9000000000000002).Bool(true)
|
|
return sess.NotifyData(protocol.MethodGetMethodIDDefault("SyncGameGroundZoneInfo", 68004609), wZone.Bytes())
|
|
}
|
|
|
|
// Claw Machine
|
|
func (s *Server) handleAskClawBuyTicket(sess *Session, pkt *protocol.RpcPacket) error {
|
|
log.Printf("[CLAW] Bought claw machine ticket")
|
|
return sess.ReturnEmptyOk(pkt.InvokeID, pkt.MethodID)
|
|
}
|
|
|
|
func (s *Server) handleAskClawSettlement(sess *Session, pkt *protocol.RpcPacket) error {
|
|
r := protocol.NewUxReader(pkt.Body)
|
|
isSuccess, _ := r.Bool()
|
|
log.Printf("[CLAW] Claw settlement success=%v", isSuccess)
|
|
return sess.ReturnEmptyOk(pkt.InvokeID, pkt.MethodID)
|
|
}
|
|
|
|
func (s *Server) handleAskBuyMiniGameTicket(sess *Session, pkt *protocol.RpcPacket) error {
|
|
r := protocol.NewUxReader(pkt.Body)
|
|
ticketType, _ := r.U32()
|
|
log.Printf("[MINIGAME] BuyMiniGameTicket type=%d", ticketType)
|
|
return sess.ReturnEmptyOk(pkt.InvokeID, pkt.MethodID)
|
|
}
|