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