Files

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)
}