You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

137 lines
3.6 KiB

package helper
import (
"fmt"
"github.com/bytedance/sonic"
"sonet/api/gen/mahjong"
"sonet/internal/mahjong/game"
"sonet/pkg/utils/collect"
"sonet/pkg/utils/state"
"sonet/pkg/utils/strs"
)
func SliceInt8To32(tiles []int8) (res []int32) {
for _, tile := range tiles {
res = append(res, int32(tile))
}
return
}
func SliceInt32To8(tiles []int32) (res []int8) {
for _, tile := range tiles {
res = append(res, int8(tile))
}
return
}
func MjTable2ProtoTable(table *game.MjTable, curPlayerId string) *mahjong.MjTable {
return mjTable2ProtoTable0(table, curPlayerId)
}
func mjTable2ProtoTable0(table *game.MjTable, curPlayerId string) *mahjong.MjTable {
t := &mahjong.MjTable{
TableId: table.TableId,
MasterId: table.MasterId,
Stage: int32(table.Stage),
GameTimes: table.GameTimes,
HitPlayerId: table.HitPlayerId,
Hits: SliceInt8To32(table.Hits),
}
for _, direct := range table.PlayerDirects {
t.PlayerDirects = append(t.PlayerDirects, int32(direct))
}
if table.MjWall != nil {
restNum := int16(table.MjWall.RestNum())
t.RestTiles = int32(restNum)
}
t.Players = make([]*mahjong.MjPlayer, 4)
for i, p := range table.Players {
if p != nil {
if table.Stage == 4 {
curPlayerId = ""
}
t.Players[i] = mjPlayer2TfPlayer0(p, curPlayerId)
}
}
return t
}
func MjPlayer2TfPlayer(player *game.MjPlayer) *mahjong.MjPlayer {
return mjPlayer2TfPlayer0(player, "")
}
func mjPlayer2TfPlayer0(player *game.MjPlayer, curPlayerId string) *mahjong.MjPlayer {
p := &mahjong.MjPlayer{
PlayerId: player.PlayerId,
Username: player.Username,
Avatar: player.Avatar,
Status: int32(player.Status),
TileLack: int32(player.TileLack),
Coin: player.Coin,
Opts: SliceInt8To32(player.Opts),
GangTiles: SliceInt8To32(player.GangTiles),
}
if player.MjTable != nil {
p.TableId = player.MjTable.TableId
}
if curPlayerId == "" || player.PlayerId == curPlayerId {
p.MjHand = SliceInt8To32(player.MjHand) // 手牌
p.MjDraw = int32(player.MjDraw) // 摸牌
} else {
// 其他玩家手牌置空
p.MjHand = SliceInt8To32(game.BlankHandTilesI8)
}
// 碰杠
for _, peng := range player.MjPeng {
p.MjPeng = append(p.MjPeng, &mahjong.MjPlayer_Peng{Tiles: SliceInt8To32(peng[:])})
}
for _, gang := range player.MjGang {
p.MjGang = append(p.MjGang, &mahjong.MjPlayer_Gang{Tiles: SliceInt8To32(gang[:])})
}
if player.WinSettle != nil {
p.WinSettle = &mahjong.WinSettle{
Weight: player.WinSettle.Weight,
WinTypeName: player.WinSettle.WinType.String(),
WeightNames: collect.Mapping(player.WinSettle.Weights, func(w game.MjWeight) string {
return w.String()
}),
}
}
return p
}
func SetState2MjSetState(setState state.SetState) (s *mahjong.SetState, err error) {
s = &mahjong.SetState{}
if len(setState.States) > 0 {
states := state.S{}
for k, v := range setState.States {
k = strs.LowerInitialLetter(k)
states[k] = v // 首字母小写
}
s.States, err = sonic.MarshalString(states)
if err != nil {
err = fmt.Errorf("marshal states error: %s", err.Error())
return
}
}
for _, setter := range setState.Setters {
set := &mahjong.StateSetter{
K: strs.LowerInitialLetter(setter.K),
T: int32(setter.T),
Index: int32(setter.Index),
K2: strs.LowerInitialLetter(setter.K2),
}
if setter.V == nil {
set.V = nil
} else {
str, e := sonic.MarshalString(setter.V)
if e != nil {
err = fmt.Errorf("marshal state setter %s=%s error: %v", setter.K, setter.V, e.Error())
return
}
set.V = &str
}
s.Setters = append(s.Setters, set)
}
return
}