Commit 26b17b7d authored by Chunchi Che's avatar Chunchi Che

update transform.go

parent b0b2950d
...@@ -2,12 +2,14 @@ package darkneos ...@@ -2,12 +2,14 @@ package darkneos
import ( import (
"errors" "errors"
"unicode/utf16"
"github.com/sktt1ryze/ygopro-proxy/DarkNeos/ygoprobuffer"
"github.com/sktt1ryze/ygopro-proxy/DarkNeos/ygopropb" "github.com/sktt1ryze/ygopro-proxy/DarkNeos/ygopropb"
"google.golang.org/protobuf/proto"
) )
const FILLING_TOKEN uint16 = 0xcccc; const FILLING_TOKEN uint16 = 0xcccc;
const UTF16_BUFFER_MAX_LEN int = 20
const ( const (
ProtobufToRawBuf = 1 ProtobufToRawBuf = 1
...@@ -16,25 +18,61 @@ const ( ...@@ -16,25 +18,61 @@ const (
func Transform(src []byte, tranformType int) ([]byte, error) { func Transform(src []byte, tranformType int) ([]byte, error) {
if tranformType == ProtobufToRawBuf { if tranformType == ProtobufToRawBuf {
return make([]byte, 0), nil message := &ygopropb.YgoCtosMsg{}
err := proto.Unmarshal(src, message)
if err != nil {
return nil, err
}
switch message.Msg.(type) {
case *(ygopropb.YgoCtosMsg_CtosPlayerInfo):
return TransformPlayerInfo(message.GetCtosPlayerInfo()), nil
default:
return nil, errors.New("Unhandled YgoCtosMsg type")
}
} else if tranformType == RawBufToProtobuf { } else if tranformType == RawBufToProtobuf {
// todo return nil, errors.New("Unhandled tranformType")
return make([]byte, 0), nil
} else { } else {
return nil, errors.New("Unknown tranformType") return nil, errors.New("Unknown tranformType")
} }
} }
func TransformPlayerInfo(pb ygopropb.CtosPlayerInfo) ygoprobuffer.CtosPlayerInfo { func TransformPlayerInfo(pb *ygopropb.CtosPlayerInfo) []byte {
name := [ygoprobuffer.PLAYER_NAME_MAX_LEN]uint16 {} info := strToUtf16Buffer(pb.Name)
for i := range name {
name[i] = FILLING_TOKEN return uint16BufToByteBuf(info)
}
func strToUtf16Buffer(s string) []uint16 {
b := make([]uint16, UTF16_BUFFER_MAX_LEN, UTF16_BUFFER_MAX_LEN)
for i := range b {
b[i] = FILLING_TOKEN
} }
info_buf := ygoprobuffer.CtosPlayerInfo { s_utf16 := utf16.Encode([]rune(s))
Name: name,
// todo: optimize
for i, v := range s_utf16 {
if i < UTF16_BUFFER_MAX_LEN {
b[i] = v
if i == len(s_utf16) - 1 && i < len(b) - 1 {
b[i + 1] = 0
}
} else { break }
} }
return info_buf return b
}
func uint16BufToByteBuf(u16_b []uint16) []byte {
b := make([]byte, 0, len(u16_b) * 2)
for _, v := range u16_b {
b = append(b, byte(v >> 8), byte(v))
}
return b
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment