playroom表情

This commit is contained in:
hahwu 2025-07-15 18:39:53 +08:00
parent c58c35c9ed
commit 59ec90f4ba
11 changed files with 193 additions and 31 deletions

View File

@ -11,6 +11,7 @@ import (
"fmt" "fmt"
"io" "io"
"math/rand" "math/rand"
"net/http"
"reflect" "reflect"
"strconv" "strconv"
"strings" "strings"
@ -425,3 +426,102 @@ func GenerateShuffledAlphabet() string {
return string(bytes) return string(bytes)
} }
// 根据IP获取国家名称
func GetCountryByIP(ip string) (string, error) {
resp, err := http.Get("https://ipapi.co/" + ip + "/country_name/")
if err != nil {
return "", err
}
defer resp.Body.Close()
buf := new(bytes.Buffer)
buf.ReadFrom(resp.Body)
return strings.TrimSpace(buf.String()), nil
}
// 根据国家名称获取ISO 3166-1国家码
func GetISOCodeByCountry(country string) (string, error) {
// 简单映射,可以扩展为更完整的映射表
countryMap := map[string]string{
"Afghanistan": "004", // 阿富汗
"Albania": "008", // 阿尔巴尼亚
"Algeria": "012", // 阿尔及利亚
"Angola": "024", // 安哥拉
"Argentina": "032", // 阿根廷
"Austria": "040", // 奥地利
"Azerbaijan": "031", // 阿塞拜疆
"Bahrain": "048", // 巴林
"Bangladesh": "050", // 孟加拉国
"Belgium": "056", // 比利时
"Bolivia": "068", // 玻利维亚
"Bosnia and Herzegovina": "070", // 波斯尼亚和黑塞哥维那
"Brazil": "076", // 巴西
"Bulgaria": "100", // 保加利亚
"Canada": "124", // 加拿大
"Chile": "152", // 智利
"China": "156", // 中国
"Colombia": "170", // 哥伦比亚
"Costa Rica": "188", // 哥斯达黎加
"Croatia": "191", // 克罗地亚
"Cuba": "192", // 古巴
"Denmark": "208", // 丹麦
"Ecuador": "218", // 厄瓜多尔
"Egypt": "818", // 埃及
"Ethiopia": "231", // 埃塞俄比亚
"Finland": "246", // 芬兰
"France": "250", // 法国
"Germany": "276", // 德国
"Ghana": "288", // 加纳
"Greece": "300", // 希腊
"Hungary": "348", // 匈牙利
"India": "356", // 印度
"Indonesia": "360", // 印度尼西亚
"Iran": "364", // 伊朗
"Iraq": "368", // 伊拉克
"Italy": "380", // 意大利
"Japan": "392", // 日本
"Jordan": "400", // 约旦
"Kenya": "404", // 肯尼亚
"Kuwait": "414", // 科威特
"Lebanon": "422", // 黎巴嫩
"Malaysia": "458", // 马来西亚
"Mexico": "484", // 墨西哥
"Morocco": "504", // 摩洛哥
"Nigeria": "566", // 尼日利亚
"Norway": "578", // 挪威
"Pakistan": "586", // 巴基斯坦
"Peru": "604", // 秘鲁
"Philippines": "608", // 菲律宾
"Poland": "616", // 波兰
"Portugal": "620", // 葡萄牙
"Qatar": "634", // 卡塔尔
"Romania": "642", // 罗马尼亚
"Russia": "643", // 俄罗斯
"Saudi Arabia": "682", // 沙特阿拉伯
"South Africa": "710", // 南非
"South Korea": "410", // 韩国
"Spain": "724", // 西班牙
"Sweden": "752", // 瑞典
"Switzerland": "756", // 瑞士
"Thailand": "764", // 泰国
"Turkey": "792", // 土耳其
"Ukraine": "804", // 乌克兰
"United Kingdom": "826", // 英国
"United States": "840", // 美国
"Vietnam": "704", // 越南
"Zimbabwe": "716", // 津巴布韦
}
if code, ok := countryMap[country]; ok {
return code, nil
}
return "", fmt.Errorf("country code not found for %s", country)
}
// 综合函数根据IP获取ISO 3166-1国家码
func GetISOCodeByIP(ip string) (string, error) {
country, err := GetCountryByIP(ip)
if err != nil {
return "", err
}
return GetISOCodeByCountry(country)
}

View File

@ -32,6 +32,7 @@
"RemoteAddr":"host.docker.internal:9001", "RemoteAddr":"host.docker.internal:9001",
"Partition":3, "Partition":3,
"KafkaHost":"kafka-server", "KafkaHost":"kafka-server",
"CountryCode":"004",
"KafkaPort":"9092", "KafkaPort":"9092",
"Version":"1.0.0", "Version":"1.0.0",
"IdVerify":false "IdVerify":false

View File

@ -320,7 +320,7 @@ func ReqGmCommand_(player *Player, Command string) error {
PlayroomBackData(player) PlayroomBackData(player)
case "addChip": case "addChip":
PlayroomMod := player.PlayMod.getPlayroomMod() PlayroomMod := player.PlayMod.getPlayroomMod()
PlayroomMod.AddChip(1, 1) PlayroomMod.AddChip(1, 1, 0)
player.PushClientRes(PlayroomMod.NotifyLose()) player.PushClientRes(PlayroomMod.NotifyLose())
case "save": case "save":
player.PlayMod.ClearData(player) player.PlayMod.ClearData(player)

View File

@ -72,7 +72,8 @@ func PlayroomBackData(p *Player) {
ChipMessage := make([]*proto.ChipInfo, 0) ChipMessage := make([]*proto.ChipInfo, 0)
for _, v := range PlayroomMod.ChipList { for _, v := range PlayroomMod.ChipList {
ChipMessage = append(ChipMessage, &proto.ChipInfo{ ChipMessage = append(ChipMessage, &proto.ChipInfo{
Uid: int64(v.Uid), Uid: int64(v.Uid),
EmojiId: int32(v.Emoji),
}) })
} }
data := G_GameLogicPtr.GetUserData(int(p.M_DwUin)) data := G_GameLogicPtr.GetUserData(int(p.M_DwUin))

View File

@ -212,19 +212,21 @@ func handle(p *Player, m *msg.Msg) error {
PlayroomMod := p.PlayMod.getPlayroomMod() PlayroomMod := p.PlayMod.getPlayroomMod()
Items := m.Item Items := m.Item
GameId := playroom.GAME_TYPE_HOOK GameId := playroom.GAME_TYPE_HOOK
Emoji := 0
if m.Extra != nil { if m.Extra != nil {
if val, ok := m.Extra.(int); ok { if val, ok := m.Extra.(GameResult); ok {
GameId = val GameId = val.T
Emoji = val.Emoji
} }
} }
if len(Items) == 0 { if len(Items) == 0 {
return nil return nil
} }
if GameId == playroom.GAME_TYPE_HOOK { if GameId == playroom.GAME_TYPE_HOOK {
PlayroomMod.AddChip(m.From, m.SendT) PlayroomMod.AddChip(m.From, m.SendT, Emoji)
p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_CAT_WIN, fmt.Sprintf("%d_%d", Items[0].Id, Items[0].Num), m.SendT) p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_CAT_WIN, fmt.Sprintf("%d_%d_%d", Items[0].Id, Items[0].Num, Emoji), m.SendT)
} else { } else {
p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_VISIT, fmt.Sprintf("%d_%d", Items[0].Id, Items[0].Num), m.SendT) p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_VISIT, fmt.Sprintf("%d_%d_%d", Items[0].Id, Items[0].Num, Emoji), m.SendT)
} }
PlayroomMod.AddMood(playroom.MOOD_TYPE_FOOD, -50) PlayroomMod.AddMood(playroom.MOOD_TYPE_FOOD, -50)
PlayroomMod.AddMood(playroom.MOOD_TYPE_CLEAN, -50) PlayroomMod.AddMood(playroom.MOOD_TYPE_CLEAN, -50)
@ -245,7 +247,13 @@ func handle(p *Player, m *msg.Msg) error {
p.PushClientRes(PlayroomMod.NotifyLose()) p.PushClientRes(PlayroomMod.NotifyLose())
case msg.HANDLE_TYPE_PLAYROOM_GAME: case msg.HANDLE_TYPE_PLAYROOM_GAME:
FriendMod := p.PlayMod.getFriendMod() FriendMod := p.PlayMod.getFriendMod()
p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_CAT_LOSE, "", m.SendT) Emoji := 0
if m.Extra != nil {
if val, ok := m.Extra.(GameResult); ok {
Emoji = val.Emoji
}
}
p.AddLog(m.From, friend.LOG_TYPE_PLAYROOM_CAT_LOSE, fmt.Sprintf("%d", Emoji), m.SendT)
FriendMod.Interact(m.From, friend.INTERACT_TYPE_VISIT, m.SendT) FriendMod.Interact(m.From, friend.INTERACT_TYPE_VISIT, m.SendT)
case msg.FRIEND_TREASURE_HANDLE: // # 好友宝藏 case msg.FRIEND_TREASURE_HANDLE: // # 好友宝藏
Items := make([]*item.Item, 0) Items := make([]*item.Item, 0)

View File

@ -148,7 +148,7 @@ func (p *PlayerModData) InitMod(player *Player) (bool, error) {
BaseMod.FackBookId = PlayerBaseMod.Data.FaceBookId BaseMod.FackBookId = PlayerBaseMod.Data.FaceBookId
is_update = true is_update = true
} }
Ip := p.GetPlayer().agent.RemoteAddr().String()
p.ModList.Handbook.InitData() p.ModList.Handbook.InitData()
p.ModList.Order.InitData() p.ModList.Order.InitData()
p.ModList.Decorate.InitData() p.ModList.Decorate.InitData()
@ -158,7 +158,7 @@ func (p *PlayerModData) InitMod(player *Player) (bool, error) {
p.ModList.DailyTask.InitData() p.ModList.DailyTask.InitData()
p.ModList.Face.InitData() p.ModList.Face.InitData()
p.ModList.Avatar.InitData() p.ModList.Avatar.InitData()
p.ModList.Base.InitData(int(p.Data.DwUin)) p.ModList.Base.InitData(int(p.Data.DwUin), Ip)
p.ModList.SevenLogin.InitData() p.ModList.SevenLogin.InitData()
p.ModList.LimitedTimeEvent.InitData(BaseMod.GetLevel()) p.ModList.LimitedTimeEvent.InitData(BaseMod.GetLevel())
p.ModList.Friend.InitData() p.ModList.Friend.InitData()

View File

@ -3268,6 +3268,10 @@ func ReqPlayroomGame(player *Player, buf []byte) error {
To: Target, To: Target,
Type: MsqMod.HANDLE_TYPE_PLAYROOM_GAME, Type: MsqMod.HANDLE_TYPE_PLAYROOM_GAME,
SendT: GoUtil.Now(), SendT: GoUtil.Now(),
Extra: GameResult{
T: PlayroomMod.GetGameId(),
Emoji: int(req.EmojiId),
},
}) })
player.PlayMod.save() player.PlayMod.save()
ItemsMsg := make(map[int32]*msg.ItemInfo, 0) ItemsMsg := make(map[int32]*msg.ItemInfo, 0)
@ -3306,7 +3310,10 @@ func ReqPlayroomSelectReward(player *Player, buf []byte) error {
Type: MsqMod.HANDLE_TYPE_PLAYROOM_LOSE, Type: MsqMod.HANDLE_TYPE_PLAYROOM_LOSE,
SendT: GoUtil.Now(), SendT: GoUtil.Now(),
Item: Items, Item: Items,
Extra: PlayroomMod.GetGameId(), Extra: GameResult{
T: PlayroomMod.GetGameId(),
Emoji: int(req.EmojiId),
},
}) })
G_GameLogicPtr.SetUserData(Target, VAR_OP_CHIP, 1) G_GameLogicPtr.SetUserData(Target, VAR_OP_CHIP, 1)
PlayroomMod.ResetGame() PlayroomMod.ResetGame()
@ -3497,7 +3504,10 @@ func ReqPlayroomFlipReward(player *Player, buf []byte) error {
Type: MsqMod.HANDLE_TYPE_PLAYROOM_LOSE, Type: MsqMod.HANDLE_TYPE_PLAYROOM_LOSE,
SendT: GoUtil.Now(), SendT: GoUtil.Now(),
Item: Items, Item: Items,
Extra: PlayroomMod.GetGameId(), Extra: GameResult{
T: playroom.GAME_TYPE_FILP,
Emoji: int(req.EmojiId),
},
}) })
player.PlayMod.save() player.PlayMod.save()
PlayroomBackData(player) PlayroomBackData(player)

View File

@ -78,8 +78,9 @@ type ChargeExtra struct {
} }
type GameResult struct { type GameResult struct {
t int // 游戏类型 T int // 游戏类型
r int // 1:赢 2:输 3:平 R int // 1:赢 2:输 3:平
Emoji int // 表情
} }
func init() { func init() {

View File

@ -45,12 +45,16 @@ type Base struct {
AddCode string // 用于添加好友的code AddCode string // 用于添加好友的code
} }
func (b *Base) InitData(Uid int) { func (b *Base) InitData(Uid int, Ip string) {
if b.AddCode == "" { if b.AddCode == "" {
Code, _ := GoUtil.GetCountryByIP(Ip)
CountryCode := conf.Server.CountryCode CountryCode := conf.Server.CountryCode
if CountryCode == "" { if CountryCode == "" {
CountryCode = "000" CountryCode = "000"
} }
if Code != "" {
CountryCode = Code
}
b.AddCode = fmt.Sprintf("MMM-%s-%s", CountryCode, GoUtil.UniqueStringFromInt(Uid)) b.AddCode = fmt.Sprintf("MMM-%s-%s", CountryCode, GoUtil.UniqueStringFromInt(Uid))
} }
if b.NickName == "" { if b.NickName == "" {

View File

@ -98,8 +98,9 @@ const (
) )
type ChipInfo struct { type ChipInfo struct {
Uid int Uid int
Time int64 Time int64
Emoji int
} }
type Mood struct { type Mood struct {
@ -327,11 +328,11 @@ func (p *PlayroomMod) GetChip() int {
return len(p.ChipList) return len(p.ChipList)
} }
func (p *PlayroomMod) AddChip(Uid int, Time int64) { func (p *PlayroomMod) AddChip(Uid int, Time int64, Emoji int) {
if len(p.ChipList) >= playroomCfg.GetChipNum() { if len(p.ChipList) >= playroomCfg.GetChipNum() {
return return
} }
p.ChipList = append(p.ChipList, &ChipInfo{Uid: Uid, Time: Time}) p.ChipList = append(p.ChipList, &ChipInfo{Uid: Uid, Time: Time, Emoji: Emoji})
p.RevengeUid = int64(Uid) p.RevengeUid = int64(Uid)
} }

View File

@ -860,7 +860,7 @@ const (
LimitEventParam_CAT_TRICK_ENERGY LimitEventParam = 1 //猫咪能量 LimitEventParam_CAT_TRICK_ENERGY LimitEventParam = 1 //猫咪能量
LimitEventParam_CAT_TRICK_TYPE LimitEventParam = 2 //猫咪类型 LimitEventParam_CAT_TRICK_TYPE LimitEventParam = 2 //猫咪类型
LimitEventParam_PAYBACK_DAY_COUNT LimitEventParam = 3 //回收日 LimitEventParam_PAYBACK_DAY_COUNT LimitEventParam = 3 //回收日
LimitEventParam_LUCKY_CAT_EARNINGS LimitEventParam = 4 //幸运猫收益 LimitEventParam_LUCKY_CAT_EARNINGS LimitEventParam = 4 //幸运猫
) )
// Enum value maps for LimitEventParam. // Enum value maps for LimitEventParam.
@ -20546,7 +20546,8 @@ func (x *NotifyPlayroomLose) GetRevenge() int64 {
type ChipInfo struct { type ChipInfo struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
Uid int64 `protobuf:"varint,1,opt,name=Uid,proto3" json:"Uid,omitempty"` // 玩家id Uid int64 `protobuf:"varint,1,opt,name=Uid,proto3" json:"Uid,omitempty"` // 玩家id
EmojiId int32 `protobuf:"varint,2,opt,name=EmojiId,proto3" json:"EmojiId,omitempty"` // 表情id
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
} }
@ -20588,6 +20589,13 @@ func (x *ChipInfo) GetUid() int64 {
return 0 return 0
} }
func (x *ChipInfo) GetEmojiId() int32 {
if x != nil {
return x.EmojiId
}
return 0
}
type NotifyPlayroomMood struct { type NotifyPlayroomMood struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
AllMood int32 `protobuf:"varint,1,opt,name=AllMood,proto3" json:"AllMood,omitempty"` // 总心情 AllMood int32 `protobuf:"varint,1,opt,name=AllMood,proto3" json:"AllMood,omitempty"` // 总心情
@ -21177,6 +21185,7 @@ func (x *ResPlayroomFlip) GetCardId() int32 {
// 领取游戏奖励 // 领取游戏奖励
type ReqPlayroomFlipReward struct { type ReqPlayroomFlipReward struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
EmojiId int32 `protobuf:"varint,1,opt,name=EmojiId,proto3" json:"EmojiId,omitempty"` // 表情id
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
} }
@ -21211,6 +21220,13 @@ func (*ReqPlayroomFlipReward) Descriptor() ([]byte, []int) {
return file_proto_Gameapi_proto_rawDescGZIP(), []int{367} return file_proto_Gameapi_proto_rawDescGZIP(), []int{367}
} }
func (x *ReqPlayroomFlipReward) GetEmojiId() int32 {
if x != nil {
return x.EmojiId
}
return 0
}
type ResPlayroomFlipReward struct { type ResPlayroomFlipReward struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
Code RES_CODE `protobuf:"varint,1,opt,name=Code,proto3,enum=tutorial.RES_CODE" json:"Code,omitempty"` Code RES_CODE `protobuf:"varint,1,opt,name=Code,proto3,enum=tutorial.RES_CODE" json:"Code,omitempty"`
@ -21265,7 +21281,8 @@ func (x *ResPlayroomFlipReward) GetMsg() string {
type ReqPlayroomGame struct { type ReqPlayroomGame struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
Type int32 `protobuf:"varint,1,opt,name=Type,proto3" json:"Type,omitempty"` // 1:绿色 2黄色 3红色 Type int32 `protobuf:"varint,1,opt,name=Type,proto3" json:"Type,omitempty"` // 1:绿色 2黄色 3红色
EmojiId int32 `protobuf:"varint,2,opt,name=EmojiId,proto3" json:"EmojiId,omitempty"` // 表情id
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
} }
@ -21307,6 +21324,13 @@ func (x *ReqPlayroomGame) GetType() int32 {
return 0 return 0
} }
func (x *ReqPlayroomGame) GetEmojiId() int32 {
if x != nil {
return x.EmojiId
}
return 0
}
type ResPlayroomGame struct { type ResPlayroomGame struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
Code RES_CODE `protobuf:"varint,1,opt,name=Code,proto3,enum=tutorial.RES_CODE" json:"Code,omitempty"` Code RES_CODE `protobuf:"varint,1,opt,name=Code,proto3,enum=tutorial.RES_CODE" json:"Code,omitempty"`
@ -21587,7 +21611,8 @@ func (x *ResPlayroomSetRoom) GetMsg() string {
type ReqPlayroomSelectReward struct { type ReqPlayroomSelectReward struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
Id int32 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` // 奖励id Id int32 `protobuf:"varint,1,opt,name=Id,proto3" json:"Id,omitempty"` // 奖励id
EmojiId int32 `protobuf:"varint,2,opt,name=EmojiId,proto3" json:"EmojiId,omitempty"` // 表情id
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
} }
@ -21629,6 +21654,13 @@ func (x *ReqPlayroomSelectReward) GetId() int32 {
return 0 return 0
} }
func (x *ReqPlayroomSelectReward) GetEmojiId() int32 {
if x != nil {
return x.EmojiId
}
return 0
}
type ResPlayroomSelectReward struct { type ResPlayroomSelectReward struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
Code RES_CODE `protobuf:"varint,1,opt,name=Code,proto3,enum=tutorial.RES_CODE" json:"Code,omitempty"` Code RES_CODE `protobuf:"varint,1,opt,name=Code,proto3,enum=tutorial.RES_CODE" json:"Code,omitempty"`
@ -24987,9 +25019,10 @@ const file_proto_Gameapi_proto_rawDesc = "" +
"\x12NotifyPlayroomLose\x12.\n" + "\x12NotifyPlayroomLose\x12.\n" +
"\bLoseItem\x18\x01 \x03(\v2\x12.tutorial.ItemInfoR\bLoseItem\x12&\n" + "\bLoseItem\x18\x01 \x03(\v2\x12.tutorial.ItemInfoR\bLoseItem\x12&\n" +
"\x04Chip\x18\x02 \x03(\v2\x12.tutorial.ChipInfoR\x04Chip\x12\x18\n" + "\x04Chip\x18\x02 \x03(\v2\x12.tutorial.ChipInfoR\x04Chip\x12\x18\n" +
"\aRevenge\x18\x03 \x01(\x03R\aRevenge\"\x1c\n" + "\aRevenge\x18\x03 \x01(\x03R\aRevenge\"6\n" +
"\bChipInfo\x12\x10\n" + "\bChipInfo\x12\x10\n" +
"\x03Uid\x18\x01 \x01(\x03R\x03Uid\"\xb0\x02\n" + "\x03Uid\x18\x01 \x01(\x03R\x03Uid\x12\x18\n" +
"\aEmojiId\x18\x02 \x01(\x05R\aEmojiId\"\xb0\x02\n" +
"\x12NotifyPlayroomMood\x12\x18\n" + "\x12NotifyPlayroomMood\x12\x18\n" +
"\aAllMood\x18\x01 \x01(\x05R\aAllMood\x12:\n" + "\aAllMood\x18\x01 \x01(\x05R\aAllMood\x12:\n" +
"\x04Mood\x18\x02 \x03(\v2&.tutorial.NotifyPlayroomMood.MoodEntryR\x04Mood\x12L\n" + "\x04Mood\x18\x02 \x03(\v2&.tutorial.NotifyPlayroomMood.MoodEntryR\x04Mood\x12L\n" +
@ -25061,13 +25094,15 @@ const file_proto_Gameapi_proto_rawDesc = "" +
"\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" + "\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" +
"\x03Msg\x18\x02 \x01(\tR\x03Msg\x12\x0e\n" + "\x03Msg\x18\x02 \x01(\tR\x03Msg\x12\x0e\n" +
"\x02Id\x18\x03 \x01(\x05R\x02Id\x12\x16\n" + "\x02Id\x18\x03 \x01(\x05R\x02Id\x12\x16\n" +
"\x06CardId\x18\x04 \x01(\x05R\x06CardId\"\x17\n" + "\x06CardId\x18\x04 \x01(\x05R\x06CardId\"1\n" +
"\x15ReqPlayroomFlipReward\"Q\n" + "\x15ReqPlayroomFlipReward\x12\x18\n" +
"\aEmojiId\x18\x01 \x01(\x05R\aEmojiId\"Q\n" +
"\x15ResPlayroomFlipReward\x12&\n" + "\x15ResPlayroomFlipReward\x12&\n" +
"\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" + "\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" +
"\x03Msg\x18\x02 \x01(\tR\x03Msg\"%\n" + "\x03Msg\x18\x02 \x01(\tR\x03Msg\"?\n" +
"\x0fReqPlayroomGame\x12\x12\n" + "\x0fReqPlayroomGame\x12\x12\n" +
"\x04Type\x18\x01 \x01(\x05R\x04Type\"\xe9\x01\n" + "\x04Type\x18\x01 \x01(\x05R\x04Type\x12\x18\n" +
"\aEmojiId\x18\x02 \x01(\x05R\aEmojiId\"\xe9\x01\n" +
"\x0fResPlayroomGame\x12&\n" + "\x0fResPlayroomGame\x12&\n" +
"\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" + "\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" +
"\x03Msg\x18\x02 \x01(\tR\x03Msg\x12\x12\n" + "\x03Msg\x18\x02 \x01(\tR\x03Msg\x12\x12\n" +
@ -25091,9 +25126,10 @@ const file_proto_Gameapi_proto_rawDesc = "" +
"\x05value\x18\x02 \x01(\x05R\x05value:\x028\x01\"N\n" + "\x05value\x18\x02 \x01(\x05R\x05value:\x028\x01\"N\n" +
"\x12ResPlayroomSetRoom\x12&\n" + "\x12ResPlayroomSetRoom\x12&\n" +
"\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" + "\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" +
"\x03Msg\x18\x02 \x01(\tR\x03Msg\")\n" + "\x03Msg\x18\x02 \x01(\tR\x03Msg\"C\n" +
"\x17ReqPlayroomSelectReward\x12\x0e\n" + "\x17ReqPlayroomSelectReward\x12\x0e\n" +
"\x02Id\x18\x01 \x01(\x05R\x02Id\"S\n" + "\x02Id\x18\x01 \x01(\x05R\x02Id\x12\x18\n" +
"\aEmojiId\x18\x02 \x01(\x05R\aEmojiId\"S\n" +
"\x17ResPlayroomSelectReward\x12&\n" + "\x17ResPlayroomSelectReward\x12&\n" +
"\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" + "\x04Code\x18\x01 \x01(\x0e2\x12.tutorial.RES_CODER\x04Code\x12\x10\n" +
"\x03Msg\x18\x02 \x01(\tR\x03Msg\"\x11\n" + "\x03Msg\x18\x02 \x01(\tR\x03Msg\"\x11\n" +