Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Y
YGOMobile-Cn-Ko-En
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fallenstardust
YGOMobile-Cn-Ko-En
Commits
e726ae9b
Commit
e726ae9b
authored
Jun 03, 2024
by
fallenstardust
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update network server
parent
f55445bd
Changes
16
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
458 additions
and
222 deletions
+458
-222
Classes/gframe/bufferio.h
Classes/gframe/bufferio.h
+2
-2
Classes/gframe/deck_manager.cpp
Classes/gframe/deck_manager.cpp
+6
-6
Classes/gframe/deck_manager.h
Classes/gframe/deck_manager.h
+4
-0
Classes/gframe/duelclient.cpp
Classes/gframe/duelclient.cpp
+83
-26
Classes/gframe/duelclient.h
Classes/gframe/duelclient.h
+5
-4
Classes/gframe/game.cpp
Classes/gframe/game.cpp
+1
-1
Classes/gframe/netserver.cpp
Classes/gframe/netserver.cpp
+86
-29
Classes/gframe/netserver.h
Classes/gframe/netserver.h
+6
-4
Classes/gframe/network.h
Classes/gframe/network.h
+182
-83
Classes/gframe/replay_mode.cpp
Classes/gframe/replay_mode.cpp
+1
-1
Classes/gframe/single_duel.cpp
Classes/gframe/single_duel.cpp
+35
-27
Classes/gframe/single_duel.h
Classes/gframe/single_duel.h
+4
-4
Classes/gframe/single_mode.cpp
Classes/gframe/single_mode.cpp
+3
-3
Classes/gframe/tag_duel.cpp
Classes/gframe/tag_duel.cpp
+34
-26
Classes/gframe/tag_duel.h
Classes/gframe/tag_duel.h
+4
-4
libcore/android/bufferio_android.h
libcore/android/bufferio_android.h
+2
-2
No files found.
Classes/gframe/bufferio.h
View file @
e726ae9b
...
@@ -29,7 +29,7 @@ public:
...
@@ -29,7 +29,7 @@ public:
}
}
// return: string length
// return: string length
template
<
typename
T1
,
typename
T2
>
template
<
typename
T1
,
typename
T2
>
inline
static
int
CopyWStr
(
T1
*
src
,
T2
*
pstr
,
int
bufsize
)
{
inline
static
int
CopyWStr
(
const
T1
*
src
,
T2
*
pstr
,
int
bufsize
)
{
int
l
=
0
;
int
l
=
0
;
while
(
src
[
l
]
&&
l
<
bufsize
-
1
)
{
while
(
src
[
l
]
&&
l
<
bufsize
-
1
)
{
pstr
[
l
]
=
(
T2
)
src
[
l
];
pstr
[
l
]
=
(
T2
)
src
[
l
];
...
@@ -39,7 +39,7 @@ public:
...
@@ -39,7 +39,7 @@ public:
return
l
;
return
l
;
}
}
template
<
typename
T1
,
typename
T2
>
template
<
typename
T1
,
typename
T2
>
inline
static
int
CopyWStrRef
(
T1
*
src
,
T2
*&
pstr
,
int
bufsize
)
{
inline
static
int
CopyWStrRef
(
const
T1
*
src
,
T2
*&
pstr
,
int
bufsize
)
{
int
l
=
0
;
int
l
=
0
;
while
(
src
[
l
]
&&
l
<
bufsize
-
1
)
{
while
(
src
[
l
]
&&
l
<
bufsize
-
1
)
{
pstr
[
l
]
=
(
T2
)
src
[
l
];
pstr
[
l
]
=
(
T2
)
src
[
l
];
...
...
Classes/gframe/deck_manager.cpp
View file @
e726ae9b
...
@@ -36,7 +36,7 @@ void DeckManager::LoadLFListSingle(const char* path) {
...
@@ -36,7 +36,7 @@ void DeckManager::LoadLFListSingle(const char* path) {
int
count
=
-
1
;
int
count
=
-
1
;
if
(
sscanf
(
linebuf
,
"%d %d"
,
&
code
,
&
count
)
!=
2
)
if
(
sscanf
(
linebuf
,
"%d %d"
,
&
code
,
&
count
)
!=
2
)
continue
;
continue
;
if
(
code
<=
0
||
code
>
99999999
)
if
(
code
<=
0
||
code
>
0xfffffff
)
continue
;
continue
;
if
(
count
<
0
||
count
>
2
)
if
(
count
<
0
||
count
>
2
)
continue
;
continue
;
...
@@ -88,11 +88,11 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, int rule) {
...
@@ -88,11 +88,11 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, int rule) {
if
(
!
list
)
if
(
!
list
)
return
0
;
return
0
;
int
dc
=
0
;
int
dc
=
0
;
if
(
deck
.
main
.
size
()
<
40
||
deck
.
main
.
size
()
>
60
)
if
(
deck
.
main
.
size
()
<
DECK_MIN_SIZE
||
deck
.
main
.
size
()
>
DECK_MAX_SIZE
)
return
(
DECKERROR_MAINCOUNT
<<
28
)
+
deck
.
main
.
size
();
return
(
DECKERROR_MAINCOUNT
<<
28
)
+
deck
.
main
.
size
();
if
(
deck
.
extra
.
size
()
>
15
)
if
(
deck
.
extra
.
size
()
>
EXTRA_MAX_SIZE
)
return
(
DECKERROR_EXTRACOUNT
<<
28
)
+
deck
.
extra
.
size
();
return
(
DECKERROR_EXTRACOUNT
<<
28
)
+
deck
.
extra
.
size
();
if
(
deck
.
side
.
size
()
>
15
)
if
(
deck
.
side
.
size
()
>
SIDE_MAX_SIZE
)
return
(
DECKERROR_SIDECOUNT
<<
28
)
+
deck
.
side
.
size
();
return
(
DECKERROR_SIDECOUNT
<<
28
)
+
deck
.
side
.
size
();
const
int
rule_map
[
6
]
=
{
AVAIL_OCG
,
AVAIL_TCG
,
AVAIL_SC
,
AVAIL_CUSTOM
,
AVAIL_OCGTCG
,
0
};
const
int
rule_map
[
6
]
=
{
AVAIL_OCG
,
AVAIL_TCG
,
AVAIL_SC
,
AVAIL_CUSTOM
,
AVAIL_OCGTCG
,
0
};
int
avail
=
rule_map
[
rule
];
int
avail
=
rule_map
[
rule
];
...
@@ -160,10 +160,10 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p
...
@@ -160,10 +160,10 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p
continue
;
continue
;
}
}
else
if
(
cd
.
type
&
(
TYPE_FUSION
|
TYPE_SYNCHRO
|
TYPE_XYZ
|
TYPE_LINK
))
{
else
if
(
cd
.
type
&
(
TYPE_FUSION
|
TYPE_SYNCHRO
|
TYPE_XYZ
|
TYPE_LINK
))
{
if
(
deck
.
extra
.
size
()
>=
15
)
if
(
deck
.
extra
.
size
()
>=
EXTRA_MAX_SIZE
)
continue
;
continue
;
deck
.
extra
.
push_back
(
dataManager
.
GetCodePointer
(
code
));
deck
.
extra
.
push_back
(
dataManager
.
GetCodePointer
(
code
));
}
else
if
(
deck
.
main
.
size
()
<
60
)
{
}
else
if
(
deck
.
main
.
size
()
<
DECK_MAX_SIZE
)
{
deck
.
main
.
push_back
(
dataManager
.
GetCodePointer
(
code
));
deck
.
main
.
push_back
(
dataManager
.
GetCodePointer
(
code
));
}
}
}
}
...
...
Classes/gframe/deck_manager.h
View file @
e726ae9b
...
@@ -8,6 +8,10 @@
...
@@ -8,6 +8,10 @@
#include <sstream>
#include <sstream>
namespace
ygo
{
namespace
ygo
{
constexpr
int
DECK_MAX_SIZE
=
60
;
constexpr
int
DECK_MIN_SIZE
=
40
;
constexpr
int
EXTRA_MAX_SIZE
=
15
;
constexpr
int
SIDE_MAX_SIZE
=
15
;
struct
LFList
{
struct
LFList
{
unsigned
int
hash
{};
unsigned
int
hash
{};
...
...
Classes/gframe/duelclient.cpp
View file @
e726ae9b
This diff is collapsed.
Click to expand it.
Classes/gframe/duelclient.h
View file @
e726ae9b
...
@@ -27,6 +27,7 @@ private:
...
@@ -27,6 +27,7 @@ private:
static
event_base
*
client_base
;
static
event_base
*
client_base
;
static
bufferevent
*
client_bev
;
static
bufferevent
*
client_bev
;
static
unsigned
char
duel_client_read
[
SIZE_NETWORK_BUFFER
];
static
unsigned
char
duel_client_read
[
SIZE_NETWORK_BUFFER
];
static
int
read_len
;
static
unsigned
char
duel_client_write
[
SIZE_NETWORK_BUFFER
];
static
unsigned
char
duel_client_write
[
SIZE_NETWORK_BUFFER
];
static
bool
is_closing
;
static
bool
is_closing
;
static
bool
is_swapping
;
static
bool
is_swapping
;
...
@@ -45,7 +46,7 @@ public:
...
@@ -45,7 +46,7 @@ public:
static
void
ClientRead
(
bufferevent
*
bev
,
void
*
ctx
);
static
void
ClientRead
(
bufferevent
*
bev
,
void
*
ctx
);
static
void
ClientEvent
(
bufferevent
*
bev
,
short
events
,
void
*
ctx
);
static
void
ClientEvent
(
bufferevent
*
bev
,
short
events
,
void
*
ctx
);
static
int
ClientThread
();
static
int
ClientThread
();
static
void
HandleSTOCPacketLan
(
unsigned
char
*
data
,
unsigned
int
len
);
static
void
HandleSTOCPacketLan
(
unsigned
char
*
data
,
int
len
);
static
int
ClientAnalyze
(
unsigned
char
*
msg
,
unsigned
int
len
);
static
int
ClientAnalyze
(
unsigned
char
*
msg
,
unsigned
int
len
);
static
void
SwapField
();
static
void
SwapField
();
static
void
SetResponseI
(
int
respI
);
static
void
SetResponseI
(
int
respI
);
...
@@ -62,10 +63,10 @@ public:
...
@@ -62,10 +63,10 @@ public:
auto
p
=
duel_client_write
;
auto
p
=
duel_client_write
;
int
blen
=
sizeof
(
ST
);
int
blen
=
sizeof
(
ST
);
if
(
blen
>
MAX_DATA_SIZE
)
if
(
blen
>
MAX_DATA_SIZE
)
blen
=
MAX_DATA_SIZE
;
return
;
BufferIO
::
WriteInt16
(
p
,
(
short
)(
1
+
blen
));
BufferIO
::
WriteInt16
(
p
,
(
short
)(
1
+
blen
));
BufferIO
::
WriteInt8
(
p
,
proto
);
BufferIO
::
WriteInt8
(
p
,
proto
);
memcpy
(
p
,
&
st
,
blen
);
std
::
memcpy
(
p
,
&
st
,
blen
);
bufferevent_write
(
client_bev
,
duel_client_write
,
blen
+
3
);
bufferevent_write
(
client_bev
,
duel_client_write
,
blen
+
3
);
}
}
static
void
SendBufferToServer
(
unsigned
char
proto
,
void
*
buffer
,
size_t
len
)
{
static
void
SendBufferToServer
(
unsigned
char
proto
,
void
*
buffer
,
size_t
len
)
{
...
@@ -77,7 +78,7 @@ public:
...
@@ -77,7 +78,7 @@ public:
blen
=
MAX_DATA_SIZE
;
blen
=
MAX_DATA_SIZE
;
BufferIO
::
WriteInt16
(
p
,
(
short
)(
1
+
blen
));
BufferIO
::
WriteInt16
(
p
,
(
short
)(
1
+
blen
));
BufferIO
::
WriteInt8
(
p
,
proto
);
BufferIO
::
WriteInt8
(
p
,
proto
);
memcpy
(
p
,
buffer
,
blen
);
std
::
memcpy
(
p
,
buffer
,
blen
);
bufferevent_write
(
client_bev
,
duel_client_write
,
blen
+
3
);
bufferevent_write
(
client_bev
,
duel_client_write
,
blen
+
3
);
}
}
...
...
Classes/gframe/game.cpp
View file @
e726ae9b
...
@@ -21,7 +21,7 @@
...
@@ -21,7 +21,7 @@
#include <COGLESDriver.h>
#include <COGLESDriver.h>
#endif
#endif
const
unsigned
short
PRO_VERSION
=
0x136
0
;
const
unsigned
short
PRO_VERSION
=
0x136
1
;
namespace
ygo
{
namespace
ygo
{
...
...
Classes/gframe/netserver.cpp
View file @
e726ae9b
...
@@ -10,6 +10,7 @@ event* NetServer::broadcast_ev = 0;
...
@@ -10,6 +10,7 @@ event* NetServer::broadcast_ev = 0;
evconnlistener
*
NetServer
::
listener
=
0
;
evconnlistener
*
NetServer
::
listener
=
0
;
DuelMode
*
NetServer
::
duel_mode
=
0
;
DuelMode
*
NetServer
::
duel_mode
=
0
;
unsigned
char
NetServer
::
net_server_read
[
SIZE_NETWORK_BUFFER
];
unsigned
char
NetServer
::
net_server_read
[
SIZE_NETWORK_BUFFER
];
int
NetServer
::
read_len
=
0
;
unsigned
char
NetServer
::
net_server_write
[
SIZE_NETWORK_BUFFER
];
unsigned
char
NetServer
::
net_server_write
[
SIZE_NETWORK_BUFFER
];
unsigned
short
NetServer
::
last_sent
=
0
;
unsigned
short
NetServer
::
last_sent
=
0
;
...
@@ -84,7 +85,9 @@ void NetServer::BroadcastEvent(evutil_socket_t fd, short events, void* arg) {
...
@@ -84,7 +85,9 @@ void NetServer::BroadcastEvent(evutil_socket_t fd, short events, void* arg) {
int
ret
=
recvfrom
(
fd
,
buf
,
256
,
0
,
(
sockaddr
*
)
&
bc_addr
,
&
sz
);
int
ret
=
recvfrom
(
fd
,
buf
,
256
,
0
,
(
sockaddr
*
)
&
bc_addr
,
&
sz
);
if
(
ret
==
-
1
)
if
(
ret
==
-
1
)
return
;
return
;
HostRequest
*
pHR
=
(
HostRequest
*
)
buf
;
HostRequest
packet
;
std
::
memcpy
(
&
packet
,
buf
,
sizeof
packet
);
const
HostRequest
*
pHR
=
&
packet
;
if
(
pHR
->
identifier
==
NETWORK_CLIENT_ID
)
{
if
(
pHR
->
identifier
==
NETWORK_CLIENT_ID
)
{
SOCKADDR_IN
sockTo
;
SOCKADDR_IN
sockTo
;
sockTo
.
sin_addr
.
s_addr
=
bc_addr
.
sin_addr
.
s_addr
;
sockTo
.
sin_addr
.
s_addr
=
bc_addr
.
sin_addr
.
s_addr
;
...
@@ -112,19 +115,30 @@ void NetServer::ServerAccept(evconnlistener* listener, evutil_socket_t fd, socka
...
@@ -112,19 +115,30 @@ void NetServer::ServerAccept(evconnlistener* listener, evutil_socket_t fd, socka
void
NetServer
::
ServerAcceptError
(
evconnlistener
*
listener
,
void
*
ctx
)
{
void
NetServer
::
ServerAcceptError
(
evconnlistener
*
listener
,
void
*
ctx
)
{
event_base_loopexit
(
net_evbase
,
0
);
event_base_loopexit
(
net_evbase
,
0
);
}
}
/*
* packet_len: 2 bytes
* proto: 1 byte
* [data]: (packet_len - 1) bytes
*/
void
NetServer
::
ServerEchoRead
(
bufferevent
*
bev
,
void
*
ctx
)
{
void
NetServer
::
ServerEchoRead
(
bufferevent
*
bev
,
void
*
ctx
)
{
evbuffer
*
input
=
bufferevent_get_input
(
bev
);
evbuffer
*
input
=
bufferevent_get_input
(
bev
);
size_
t
len
=
evbuffer_get_length
(
input
);
in
t
len
=
evbuffer_get_length
(
input
);
unsigned
short
packet_len
=
0
;
unsigned
short
packet_len
=
0
;
while
(
true
)
{
while
(
true
)
{
if
(
len
<
2
)
if
(
len
<
2
)
return
;
return
;
evbuffer_copyout
(
input
,
&
packet_len
,
2
);
evbuffer_copyout
(
input
,
&
packet_len
,
2
);
if
(
len
<
(
size_t
)
packet_len
+
2
)
if
(
packet_len
+
2
>
SIZE_NETWORK_BUFFER
)
{
ServerEchoEvent
(
bev
,
BEV_EVENT_ERROR
,
0
);
return
;
return
;
evbuffer_remove
(
input
,
net_server_read
,
packet_len
+
2
);
}
if
(
packet_len
)
if
(
len
<
packet_len
+
2
)
HandleCTOSPacket
(
&
users
[
bev
],
&
net_server_read
[
2
],
packet_len
);
return
;
if
(
packet_len
<
1
)
return
;
read_len
=
evbuffer_remove
(
input
,
net_server_read
,
packet_len
+
2
);
if
(
read_len
>=
3
)
HandleCTOSPacket
(
&
users
[
bev
],
&
net_server_read
[
2
],
read_len
-
2
);
len
-=
packet_len
+
2
;
len
-=
packet_len
+
2
;
}
}
}
}
...
@@ -134,7 +148,8 @@ void NetServer::ServerEchoEvent(bufferevent* bev, short events, void* ctx) {
...
@@ -134,7 +148,8 @@ void NetServer::ServerEchoEvent(bufferevent* bev, short events, void* ctx) {
DuelMode
*
dm
=
dp
->
game
;
DuelMode
*
dm
=
dp
->
game
;
if
(
dm
)
if
(
dm
)
dm
->
LeaveGame
(
dp
);
dm
->
LeaveGame
(
dp
);
else
DisconnectPlayer
(
dp
);
else
DisconnectPlayer
(
dp
);
}
}
}
}
int
NetServer
::
ServerThread
()
{
int
NetServer
::
ServerThread
()
{
...
@@ -171,7 +186,7 @@ void NetServer::DisconnectPlayer(DuelPlayer* dp) {
...
@@ -171,7 +186,7 @@ void NetServer::DisconnectPlayer(DuelPlayer* dp) {
users
.
erase
(
bit
);
users
.
erase
(
bit
);
}
}
}
}
void
NetServer
::
HandleCTOSPacket
(
DuelPlayer
*
dp
,
unsigned
char
*
data
,
unsigned
int
len
)
{
void
NetServer
::
HandleCTOSPacket
(
DuelPlayer
*
dp
,
unsigned
char
*
data
,
int
len
)
{
auto
pdata
=
data
;
auto
pdata
=
data
;
unsigned
char
pktType
=
BufferIO
::
ReadUInt8
(
pdata
);
unsigned
char
pktType
=
BufferIO
::
ReadUInt8
(
pdata
);
if
((
pktType
!=
CTOS_SURRENDER
)
&&
(
pktType
!=
CTOS_CHAT
)
&&
(
dp
->
state
==
0xff
||
(
dp
->
state
&&
dp
->
state
!=
pktType
)))
if
((
pktType
!=
CTOS_SURRENDER
)
&&
(
pktType
!=
CTOS_CHAT
)
&&
(
dp
->
state
==
0xff
||
(
dp
->
state
&&
dp
->
state
!=
pktType
)))
...
@@ -180,6 +195,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, unsigned i
...
@@ -180,6 +195,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, unsigned i
case
CTOS_RESPONSE
:
{
case
CTOS_RESPONSE
:
{
if
(
!
dp
->
game
||
!
duel_mode
->
pduel
)
if
(
!
dp
->
game
||
!
duel_mode
->
pduel
)
return
;
return
;
if
(
len
<
1
+
(
int
)
sizeof
(
unsigned
char
))
return
;
duel_mode
->
GetResponse
(
dp
,
pdata
,
len
-
1
);
duel_mode
->
GetResponse
(
dp
,
pdata
,
len
-
1
);
break
;
break
;
}
}
...
@@ -192,38 +209,58 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, unsigned i
...
@@ -192,38 +209,58 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, unsigned i
case
CTOS_CHAT
:
{
case
CTOS_CHAT
:
{
if
(
!
dp
->
game
)
if
(
!
dp
->
game
)
return
;
return
;
if
(
len
<
1
+
(
int
)
sizeof
(
unsigned
char
))
return
;
duel_mode
->
Chat
(
dp
,
pdata
,
len
-
1
);
duel_mode
->
Chat
(
dp
,
pdata
,
len
-
1
);
break
;
break
;
}
}
case
CTOS_UPDATE_DECK
:
{
case
CTOS_UPDATE_DECK
:
{
if
(
!
dp
->
game
)
if
(
!
dp
->
game
)
return
;
return
;
if
(
len
<
1
+
(
int
)
sizeof
(
unsigned
char
))
return
;
duel_mode
->
UpdateDeck
(
dp
,
pdata
,
len
-
1
);
duel_mode
->
UpdateDeck
(
dp
,
pdata
,
len
-
1
);
break
;
break
;
}
}
case
CTOS_HAND_RESULT
:
{
case
CTOS_HAND_RESULT
:
{
if
(
!
dp
->
game
)
if
(
!
dp
->
game
)
return
;
return
;
CTOS_HandResult
*
pkt
=
(
CTOS_HandResult
*
)
pdata
;
if
(
len
<
1
+
(
int
)
sizeof
(
CTOS_HandResult
))
return
;
CTOS_HandResult
packet
;
std
::
memcpy
(
&
packet
,
pdata
,
sizeof
packet
);
const
auto
*
pkt
=
&
packet
;
dp
->
game
->
HandResult
(
dp
,
pkt
->
res
);
dp
->
game
->
HandResult
(
dp
,
pkt
->
res
);
break
;
break
;
}
}
case
CTOS_TP_RESULT
:
{
case
CTOS_TP_RESULT
:
{
if
(
!
dp
->
game
)
if
(
!
dp
->
game
)
return
;
return
;
CTOS_TPResult
*
pkt
=
(
CTOS_TPResult
*
)
pdata
;
if
(
len
<
1
+
(
int
)
sizeof
(
CTOS_TPResult
))
return
;
CTOS_TPResult
packet
;
std
::
memcpy
(
&
packet
,
pdata
,
sizeof
packet
);
const
auto
*
pkt
=
&
packet
;
dp
->
game
->
TPResult
(
dp
,
pkt
->
res
);
dp
->
game
->
TPResult
(
dp
,
pkt
->
res
);
break
;
break
;
}
}
case
CTOS_PLAYER_INFO
:
{
case
CTOS_PLAYER_INFO
:
{
CTOS_PlayerInfo
*
pkt
=
(
CTOS_PlayerInfo
*
)
pdata
;
if
(
len
<
1
+
(
int
)
sizeof
(
CTOS_PlayerInfo
))
return
;
CTOS_PlayerInfo
packet
;
std
::
memcpy
(
&
packet
,
pdata
,
sizeof
packet
);
const
auto
*
pkt
=
&
packet
;
BufferIO
::
CopyWStr
(
pkt
->
name
,
dp
->
name
,
20
);
BufferIO
::
CopyWStr
(
pkt
->
name
,
dp
->
name
,
20
);
break
;
break
;
}
}
case
CTOS_CREATE_GAME
:
{
case
CTOS_CREATE_GAME
:
{
if
(
dp
->
game
||
duel_mode
)
if
(
dp
->
game
||
duel_mode
)
return
;
return
;
CTOS_CreateGame
*
pkt
=
(
CTOS_CreateGame
*
)
pdata
;
if
(
len
<
1
+
(
int
)
sizeof
(
CTOS_CreateGame
))
return
;
CTOS_CreateGame
packet
;
std
::
memcpy
(
&
packet
,
pdata
,
sizeof
packet
);
auto
pkt
=
&
packet
;
if
(
pkt
->
info
.
mode
==
MODE_SINGLE
)
{
if
(
pkt
->
info
.
mode
==
MODE_SINGLE
)
{
duel_mode
=
new
SingleDuel
(
false
);
duel_mode
=
new
SingleDuel
(
false
);
duel_mode
->
etimer
=
event_new
(
net_evbase
,
0
,
EV_TIMEOUT
|
EV_PERSIST
,
SingleDuel
::
SingleTimer
,
duel_mode
);
duel_mode
->
etimer
=
event_new
(
net_evbase
,
0
,
EV_TIMEOUT
|
EV_PERSIST
,
SingleDuel
::
SingleTimer
,
duel_mode
);
...
@@ -261,56 +298,76 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, unsigned i
...
@@ -261,56 +298,76 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, unsigned i
break
;
break
;
}
}
case
CTOS_JOIN_GAME
:
{
case
CTOS_JOIN_GAME
:
{
if
(
!
duel_mode
)
if
(
!
duel_mode
)
break
;
return
;
if
(
len
<
1
+
(
int
)
sizeof
(
CTOS_JoinGame
))
return
;
duel_mode
->
JoinGame
(
dp
,
pdata
,
false
);
duel_mode
->
JoinGame
(
dp
,
pdata
,
false
);
break
;
break
;
}
}
case
CTOS_LEAVE_GAME
:
{
case
CTOS_LEAVE_GAME
:
{
if
(
!
duel_mode
)
if
(
!
duel_mode
)
break
;
return
;
duel_mode
->
LeaveGame
(
dp
);
duel_mode
->
LeaveGame
(
dp
);
break
;
break
;
}
}
case
CTOS_SURRENDER
:
{
case
CTOS_SURRENDER
:
{
if
(
!
duel_mode
)
if
(
!
duel_mode
)
break
;
return
;
duel_mode
->
Surrender
(
dp
);
duel_mode
->
Surrender
(
dp
);
break
;
break
;
}
}
case
CTOS_HS_TODUELIST
:
{
case
CTOS_HS_TODUELIST
:
{
if
(
!
duel_mode
||
duel_mode
->
pduel
)
if
(
!
duel_mode
||
duel_mode
->
pduel
)
break
;
return
;
duel_mode
->
ToDuelist
(
dp
);
duel_mode
->
ToDuelist
(
dp
);
break
;
break
;
}
}
case
CTOS_HS_TOOBSERVER
:
{
case
CTOS_HS_TOOBSERVER
:
{
if
(
!
duel_mode
||
duel_mode
->
pduel
)
if
(
!
duel_mode
||
duel_mode
->
pduel
)
break
;
return
;
duel_mode
->
ToObserver
(
dp
);
duel_mode
->
ToObserver
(
dp
);
break
;
break
;
}
}
case
CTOS_HS_READY
:
case
CTOS_HS_READY
:
case
CTOS_HS_NOTREADY
:
{
case
CTOS_HS_NOTREADY
:
{
if
(
!
duel_mode
||
duel_mode
->
pduel
)
if
(
!
duel_mode
||
duel_mode
->
pduel
)
break
;
return
;
duel_mode
->
PlayerReady
(
dp
,
(
CTOS_HS_NOTREADY
-
pktType
)
!=
0
);
duel_mode
->
PlayerReady
(
dp
,
(
CTOS_HS_NOTREADY
-
pktType
)
!=
0
);
break
;
break
;
}
}
case
CTOS_HS_KICK
:
{
case
CTOS_HS_KICK
:
{
if
(
!
duel_mode
||
duel_mode
->
pduel
)
if
(
!
duel_mode
||
duel_mode
->
pduel
)
break
;
return
;
CTOS_Kick
*
pkt
=
(
CTOS_Kick
*
)
pdata
;
if
(
len
<
1
+
(
int
)
sizeof
(
CTOS_Kick
))
return
;
CTOS_Kick
packet
;
std
::
memcpy
(
&
packet
,
pdata
,
sizeof
packet
);
const
auto
*
pkt
=
&
packet
;
duel_mode
->
PlayerKick
(
dp
,
pkt
->
pos
);
duel_mode
->
PlayerKick
(
dp
,
pkt
->
pos
);
break
;
break
;
}
}
case
CTOS_HS_START
:
{
case
CTOS_HS_START
:
{
if
(
!
duel_mode
||
duel_mode
->
pduel
)
if
(
!
duel_mode
||
duel_mode
->
pduel
)
break
;
return
;
duel_mode
->
StartDuel
(
dp
);
duel_mode
->
StartDuel
(
dp
);
break
;
break
;
}
}
}
}
}
}
size_t
NetServer
::
CreateChatPacket
(
unsigned
char
*
src
,
int
src_size
,
unsigned
char
*
dst
,
uint16_t
dst_player_type
)
{
if
(
!
check_msg_size
(
src_size
))
return
0
;
uint16_t
src_msg
[
LEN_CHAT_MSG
];
std
::
memcpy
(
src_msg
,
src
,
src_size
);
const
int
src_len
=
src_size
/
sizeof
(
uint16_t
);
if
(
src_msg
[
src_len
-
1
]
!=
0
)
return
0
;
// STOC_Chat packet
auto
pdst
=
dst
;
buffer_write
<
uint16_t
>
(
pdst
,
dst_player_type
);
buffer_write_block
(
pdst
,
src_msg
,
src_size
);
return
sizeof
(
dst_player_type
)
+
src_size
;
}
}
}
Classes/gframe/netserver.h
View file @
e726ae9b
...
@@ -19,6 +19,7 @@ private:
...
@@ -19,6 +19,7 @@ private:
static
evconnlistener
*
listener
;
static
evconnlistener
*
listener
;
static
DuelMode
*
duel_mode
;
static
DuelMode
*
duel_mode
;
static
unsigned
char
net_server_read
[
SIZE_NETWORK_BUFFER
];
static
unsigned
char
net_server_read
[
SIZE_NETWORK_BUFFER
];
static
int
read_len
;
static
unsigned
char
net_server_write
[
SIZE_NETWORK_BUFFER
];
static
unsigned
char
net_server_write
[
SIZE_NETWORK_BUFFER
];
static
unsigned
short
last_sent
;
static
unsigned
short
last_sent
;
...
@@ -35,7 +36,8 @@ public:
...
@@ -35,7 +36,8 @@ public:
static
void
ServerEchoEvent
(
bufferevent
*
bev
,
short
events
,
void
*
ctx
);
static
void
ServerEchoEvent
(
bufferevent
*
bev
,
short
events
,
void
*
ctx
);
static
int
ServerThread
();
static
int
ServerThread
();
static
void
DisconnectPlayer
(
DuelPlayer
*
dp
);
static
void
DisconnectPlayer
(
DuelPlayer
*
dp
);
static
void
HandleCTOSPacket
(
DuelPlayer
*
dp
,
unsigned
char
*
data
,
unsigned
int
len
);
static
void
HandleCTOSPacket
(
DuelPlayer
*
dp
,
unsigned
char
*
data
,
int
len
);
static
size_t
CreateChatPacket
(
unsigned
char
*
src
,
int
src_size
,
unsigned
char
*
dst
,
uint16_t
dst_player_type
);
static
void
SendPacketToPlayer
(
DuelPlayer
*
dp
,
unsigned
char
proto
)
{
static
void
SendPacketToPlayer
(
DuelPlayer
*
dp
,
unsigned
char
proto
)
{
auto
p
=
net_server_write
;
auto
p
=
net_server_write
;
BufferIO
::
WriteInt16
(
p
,
1
);
BufferIO
::
WriteInt16
(
p
,
1
);
...
@@ -50,10 +52,10 @@ public:
...
@@ -50,10 +52,10 @@ public:
auto
p
=
net_server_write
;
auto
p
=
net_server_write
;
int
blen
=
sizeof
(
ST
);
int
blen
=
sizeof
(
ST
);
if
(
blen
>
MAX_DATA_SIZE
)
if
(
blen
>
MAX_DATA_SIZE
)
blen
=
MAX_DATA_SIZE
;
return
;
BufferIO
::
WriteInt16
(
p
,
(
short
)(
1
+
blen
));
BufferIO
::
WriteInt16
(
p
,
(
short
)(
1
+
blen
));
BufferIO
::
WriteInt8
(
p
,
proto
);
BufferIO
::
WriteInt8
(
p
,
proto
);
memcpy
(
p
,
&
st
,
blen
);
std
::
memcpy
(
p
,
&
st
,
blen
);
last_sent
=
blen
+
3
;
last_sent
=
blen
+
3
;
if
(
dp
)
if
(
dp
)
bufferevent_write
(
dp
->
bev
,
net_server_write
,
blen
+
3
);
bufferevent_write
(
dp
->
bev
,
net_server_write
,
blen
+
3
);
...
@@ -67,7 +69,7 @@ public:
...
@@ -67,7 +69,7 @@ public:
blen
=
MAX_DATA_SIZE
;
blen
=
MAX_DATA_SIZE
;
BufferIO
::
WriteInt16
(
p
,
(
short
)(
1
+
blen
));
BufferIO
::
WriteInt16
(
p
,
(
short
)(
1
+
blen
));
BufferIO
::
WriteInt8
(
p
,
proto
);
BufferIO
::
WriteInt8
(
p
,
proto
);
memcpy
(
p
,
buffer
,
blen
);
std
::
memcpy
(
p
,
buffer
,
blen
);
last_sent
=
blen
+
3
;
last_sent
=
blen
+
3
;
if
(
dp
)
if
(
dp
)
bufferevent_write
(
dp
->
bev
,
net_server_write
,
blen
+
3
);
bufferevent_write
(
dp
->
bev
,
net_server_write
,
blen
+
3
);
...
...
Classes/gframe/network.h
View file @
e726ae9b
This diff is collapsed.
Click to expand it.
Classes/gframe/replay_mode.cpp
View file @
e726ae9b
...
@@ -940,7 +940,7 @@ uint32 ReplayMode::MessageHandler(intptr_t fduel, uint32 type) {
...
@@ -940,7 +940,7 @@ uint32 ReplayMode::MessageHandler(intptr_t fduel, uint32 type) {
if
(
!
enable_log
)
if
(
!
enable_log
)
return
0
;
return
0
;
char
msgbuf
[
1024
];
char
msgbuf
[
1024
];
get_log_message
(
fduel
,
(
byte
*
)
msgbuf
);
get_log_message
(
fduel
,
msgbuf
);
mainGame
->
AddDebugMsg
(
msgbuf
);
mainGame
->
AddDebugMsg
(
msgbuf
);
return
0
;
return
0
;
}
}
...
...
Classes/gframe/single_duel.cpp
View file @
e726ae9b
...
@@ -12,17 +12,17 @@ SingleDuel::SingleDuel(bool is_match) {
...
@@ -12,17 +12,17 @@ SingleDuel::SingleDuel(bool is_match) {
}
}
SingleDuel
::~
SingleDuel
()
{
SingleDuel
::~
SingleDuel
()
{
}
}
void
SingleDuel
::
Chat
(
DuelPlayer
*
dp
,
void
*
pdata
,
int
len
)
{
void
SingleDuel
::
Chat
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
int
len
)
{
STOC_Chat
scc
;
unsigned
char
scc
[
SIZE_STOC_CHAT
]
;
scc
.
player
=
dp
->
type
;
const
auto
scc_size
=
NetServer
::
CreateChatPacket
(
pdata
,
len
,
scc
,
dp
->
type
)
;
unsigned
short
*
msg
=
(
unsigned
short
*
)
pdata
;
if
(
!
scc_size
)
int
msglen
=
BufferIO
::
CopyWStr
(
msg
,
scc
.
msg
,
256
)
;
return
;
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_CHAT
,
&
scc
,
4
+
msglen
*
2
);
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_CHAT
,
scc
,
scc_size
);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
for
(
auto
pit
=
observers
.
begin
();
pit
!=
observers
.
end
();
++
pit
)
for
(
auto
pit
=
observers
.
begin
();
pit
!=
observers
.
end
();
++
pit
)
NetServer
::
ReSendToPlayer
(
*
pit
);
NetServer
::
ReSendToPlayer
(
*
pit
);
}
}
void
SingleDuel
::
JoinGame
(
DuelPlayer
*
dp
,
void
*
pdata
,
bool
is_creater
)
{
void
SingleDuel
::
JoinGame
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
bool
is_creater
)
{
if
(
!
is_creater
)
{
if
(
!
is_creater
)
{
if
(
dp
->
game
&&
dp
->
type
!=
0xff
)
{
if
(
dp
->
game
&&
dp
->
type
!=
0xff
)
{
STOC_ErrorMsg
scem
;
STOC_ErrorMsg
scem
;
...
@@ -32,7 +32,9 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
...
@@ -32,7 +32,9 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
NetServer
::
DisconnectPlayer
(
dp
);
NetServer
::
DisconnectPlayer
(
dp
);
return
;
return
;
}
}
CTOS_JoinGame
*
pkt
=
(
CTOS_JoinGame
*
)
pdata
;
CTOS_JoinGame
packet
;
std
::
memcpy
(
&
packet
,
pdata
,
sizeof
packet
);
const
auto
*
pkt
=
&
packet
;
if
(
pkt
->
version
!=
PRO_VERSION
)
{
if
(
pkt
->
version
!=
PRO_VERSION
)
{
STOC_ErrorMsg
scem
;
STOC_ErrorMsg
scem
;
scem
.
msg
=
ERRMSG_VERERROR
;
scem
.
msg
=
ERRMSG_VERERROR
;
...
@@ -272,25 +274,35 @@ void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
...
@@ -272,25 +274,35 @@ void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
return
;
return
;
LeaveGame
(
players
[
pos
]);
LeaveGame
(
players
[
pos
]);
}
}
void
SingleDuel
::
UpdateDeck
(
DuelPlayer
*
dp
,
void
*
pdata
,
unsigned
int
len
)
{
void
SingleDuel
::
UpdateDeck
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
int
len
)
{
if
(
dp
->
type
>
1
||
ready
[
dp
->
type
])
if
(
dp
->
type
>
1
||
ready
[
dp
->
type
])
return
;
return
;
unsigned
char
*
deckbuf
=
(
unsigned
char
*
)
pdata
;
if
(
len
<
8
)
return
;
bool
valid
=
true
;
auto
deckbuf
=
pdata
;
int
mainc
=
BufferIO
::
ReadInt32
(
deckbuf
);
int
mainc
=
BufferIO
::
ReadInt32
(
deckbuf
);
int
sidec
=
BufferIO
::
ReadInt32
(
deckbuf
);
int
sidec
=
BufferIO
::
ReadInt32
(
deckbuf
);
// verify data
const
int
deck_size
=
len
-
2
*
sizeof
(
int32_t
);
const
unsigned
int
possibleMaxLength
=
(
len
-
8
)
/
4
;
if
(
mainc
<
0
||
mainc
>
MAINC_MAX
)
if
((
unsigned
)
mainc
>
possibleMaxLength
||
(
unsigned
)
sidec
>
possibleMaxLength
||
(
unsigned
)
mainc
+
(
unsigned
)
sidec
>
possibleMaxLength
)
{
valid
=
false
;
else
if
(
sidec
<
0
||
sidec
>
SIDEC_MAX
)
valid
=
false
;
else
if
(
deck_size
!=
(
mainc
+
sidec
)
*
(
int
)
sizeof
(
int32_t
))
valid
=
false
;
if
(
!
valid
)
{
STOC_ErrorMsg
scem
;
STOC_ErrorMsg
scem
;
scem
.
msg
=
ERRMSG_DECKERROR
;
scem
.
msg
=
ERRMSG_DECKERROR
;
scem
.
code
=
0
;
scem
.
code
=
0
;
NetServer
::
SendPacketToPlayer
(
dp
,
STOC_ERROR_MSG
,
scem
);
NetServer
::
SendPacketToPlayer
(
dp
,
STOC_ERROR_MSG
,
scem
);
return
;
return
;
}
}
int
deck_list
[
SIZE_NETWORK_BUFFER
/
sizeof
(
int32_t
)];
std
::
memcpy
(
deck_list
,
deckbuf
,
deck_size
);
if
(
duel_count
==
0
)
{
if
(
duel_count
==
0
)
{
deck_error
[
dp
->
type
]
=
deckManager
.
LoadDeck
(
pdeck
[
dp
->
type
],
(
int
*
)
deckbuf
,
mainc
,
sidec
);
deck_error
[
dp
->
type
]
=
deckManager
.
LoadDeck
(
pdeck
[
dp
->
type
],
deck_list
,
mainc
,
sidec
);
}
else
{
}
else
{
if
(
deckManager
.
LoadSide
(
pdeck
[
dp
->
type
],
(
int
*
)
deckbuf
,
mainc
,
sidec
))
{
if
(
deckManager
.
LoadSide
(
pdeck
[
dp
->
type
],
deck_list
,
mainc
,
sidec
))
{
ready
[
dp
->
type
]
=
true
;
ready
[
dp
->
type
]
=
true
;
NetServer
::
SendPacketToPlayer
(
dp
,
STOC_DUEL_START
);
NetServer
::
SendPacketToPlayer
(
dp
,
STOC_DUEL_START
);
if
(
ready
[
0
]
&&
ready
[
1
])
{
if
(
ready
[
0
]
&&
ready
[
1
])
{
...
@@ -330,9 +342,9 @@ void SingleDuel::StartDuel(DuelPlayer* dp) {
...
@@ -330,9 +342,9 @@ void SingleDuel::StartDuel(DuelPlayer* dp) {
BufferIO
::
WriteInt16
(
pbuf
,
(
short
)
pdeck
[
1
].
side
.
size
());
BufferIO
::
WriteInt16
(
pbuf
,
(
short
)
pdeck
[
1
].
side
.
size
());
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_DECK_COUNT
,
deckbuff
,
12
);
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_DECK_COUNT
,
deckbuff
,
12
);
char
tempbuff
[
6
];
char
tempbuff
[
6
];
memcpy
(
tempbuff
,
deckbuff
,
6
);
std
::
memcpy
(
tempbuff
,
deckbuff
,
6
);
memcpy
(
deckbuff
,
deckbuff
+
6
,
6
);
std
::
memcpy
(
deckbuff
,
deckbuff
+
6
,
6
);
memcpy
(
deckbuff
+
6
,
tempbuff
,
6
);
std
::
memcpy
(
deckbuff
+
6
,
tempbuff
,
6
);
NetServer
::
SendBufferToPlayer
(
players
[
1
],
STOC_DECK_COUNT
,
deckbuff
,
12
);
NetServer
::
SendBufferToPlayer
(
players
[
1
],
STOC_DECK_COUNT
,
deckbuff
,
12
);
NetServer
::
SendPacketToPlayer
(
players
[
0
],
STOC_SELECT_HAND
);
NetServer
::
SendPacketToPlayer
(
players
[
0
],
STOC_SELECT_HAND
);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
...
@@ -1404,11 +1416,11 @@ int SingleDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
...
@@ -1404,11 +1416,11 @@ int SingleDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
}
}
return
0
;
return
0
;
}
}
void
SingleDuel
::
GetResponse
(
DuelPlayer
*
dp
,
void
*
pdata
,
unsigned
int
len
)
{
void
SingleDuel
::
GetResponse
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
unsigned
int
len
)
{
byte
resb
[
SIZE_RETURN_VALUE
];
byte
resb
[
SIZE_RETURN_VALUE
];
if
(
len
>
SIZE_RETURN_VALUE
)
if
(
len
>
SIZE_RETURN_VALUE
)
len
=
SIZE_RETURN_VALUE
;
len
=
SIZE_RETURN_VALUE
;
memcpy
(
resb
,
pdata
,
len
);
std
::
memcpy
(
resb
,
pdata
,
len
);
last_replay
.
WriteInt8
(
len
);
last_replay
.
WriteInt8
(
len
);
last_replay
.
WriteData
(
resb
,
len
);
last_replay
.
WriteData
(
resb
,
len
);
set_responseb
(
pduel
,
resb
);
set_responseb
(
pduel
,
resb
);
...
@@ -1426,9 +1438,9 @@ void SingleDuel::EndDuel() {
...
@@ -1426,9 +1438,9 @@ void SingleDuel::EndDuel() {
return
;
return
;
last_replay
.
EndRecord
();
last_replay
.
EndRecord
();
char
replaybuf
[
0x2000
],
*
pbuf
=
replaybuf
;
char
replaybuf
[
0x2000
],
*
pbuf
=
replaybuf
;
memcpy
(
pbuf
,
&
last_replay
.
pheader
,
sizeof
(
ReplayHeader
));
std
::
memcpy
(
pbuf
,
&
last_replay
.
pheader
,
sizeof
(
ReplayHeader
));
pbuf
+=
sizeof
(
ReplayHeader
);
pbuf
+=
sizeof
(
ReplayHeader
);
memcpy
(
pbuf
,
last_replay
.
comp_data
,
last_replay
.
comp_size
);
std
::
memcpy
(
pbuf
,
last_replay
.
comp_data
,
last_replay
.
comp_size
);
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_REPLAY
,
replaybuf
,
sizeof
(
ReplayHeader
)
+
last_replay
.
comp_size
);
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_REPLAY
,
replaybuf
,
sizeof
(
ReplayHeader
)
+
last_replay
.
comp_size
);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
for
(
auto
oit
=
observers
.
begin
();
oit
!=
observers
.
end
();
++
oit
)
for
(
auto
oit
=
observers
.
begin
();
oit
!=
observers
.
end
();
++
oit
)
...
@@ -1468,10 +1480,6 @@ inline int SingleDuel::WriteUpdateData(int& player, int location, int& flag, uns
...
@@ -1468,10 +1480,6 @@ inline int SingleDuel::WriteUpdateData(int& player, int location, int& flag, uns
int
len
=
query_field_card
(
pduel
,
player
,
location
,
flag
,
qbuf
,
use_cache
);
int
len
=
query_field_card
(
pduel
,
player
,
location
,
flag
,
qbuf
,
use_cache
);
return
len
;
return
len
;
}
}
inline
unsigned
int
GetPosition
(
unsigned
char
*&
qbuf
,
int
offset
)
{
unsigned
int
info
=
*
(
unsigned
int
*
)(
qbuf
+
offset
);
return
info
>>
24
;
}
void
SingleDuel
::
RefreshMzone
(
int
player
,
int
flag
,
int
use_cache
)
{
void
SingleDuel
::
RefreshMzone
(
int
player
,
int
flag
,
int
use_cache
)
{
std
::
vector
<
unsigned
char
>
query_buffer
;
std
::
vector
<
unsigned
char
>
query_buffer
;
query_buffer
.
resize
(
SIZE_QUERY_BUFFER
);
query_buffer
.
resize
(
SIZE_QUERY_BUFFER
);
...
@@ -1579,7 +1587,7 @@ uint32 SingleDuel::MessageHandler(intptr_t fduel, uint32 type) {
...
@@ -1579,7 +1587,7 @@ uint32 SingleDuel::MessageHandler(intptr_t fduel, uint32 type) {
if
(
!
enable_log
)
if
(
!
enable_log
)
return
0
;
return
0
;
char
msgbuf
[
1024
];
char
msgbuf
[
1024
];
get_log_message
(
fduel
,
(
byte
*
)
msgbuf
);
get_log_message
(
fduel
,
msgbuf
);
mainGame
->
AddDebugMsg
(
msgbuf
);
mainGame
->
AddDebugMsg
(
msgbuf
);
return
0
;
return
0
;
}
}
...
...
Classes/gframe/single_duel.h
View file @
e726ae9b
...
@@ -11,21 +11,21 @@ class SingleDuel: public DuelMode {
...
@@ -11,21 +11,21 @@ class SingleDuel: public DuelMode {
public:
public:
SingleDuel
(
bool
is_match
);
SingleDuel
(
bool
is_match
);
virtual
~
SingleDuel
();
virtual
~
SingleDuel
();
virtual
void
Chat
(
DuelPlayer
*
dp
,
void
*
pdata
,
int
len
);
virtual
void
Chat
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
int
len
);
virtual
void
JoinGame
(
DuelPlayer
*
dp
,
void
*
pdata
,
bool
is_creater
);
virtual
void
JoinGame
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
bool
is_creater
);
virtual
void
LeaveGame
(
DuelPlayer
*
dp
);
virtual
void
LeaveGame
(
DuelPlayer
*
dp
);
virtual
void
ToDuelist
(
DuelPlayer
*
dp
);
virtual
void
ToDuelist
(
DuelPlayer
*
dp
);
virtual
void
ToObserver
(
DuelPlayer
*
dp
);
virtual
void
ToObserver
(
DuelPlayer
*
dp
);
virtual
void
PlayerReady
(
DuelPlayer
*
dp
,
bool
ready
);
virtual
void
PlayerReady
(
DuelPlayer
*
dp
,
bool
ready
);
virtual
void
PlayerKick
(
DuelPlayer
*
dp
,
unsigned
char
pos
);
virtual
void
PlayerKick
(
DuelPlayer
*
dp
,
unsigned
char
pos
);
virtual
void
UpdateDeck
(
DuelPlayer
*
dp
,
void
*
pdata
,
unsigned
int
len
);
virtual
void
UpdateDeck
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
int
len
);
virtual
void
StartDuel
(
DuelPlayer
*
dp
);
virtual
void
StartDuel
(
DuelPlayer
*
dp
);
virtual
void
HandResult
(
DuelPlayer
*
dp
,
unsigned
char
res
);
virtual
void
HandResult
(
DuelPlayer
*
dp
,
unsigned
char
res
);
virtual
void
TPResult
(
DuelPlayer
*
dp
,
unsigned
char
tp
);
virtual
void
TPResult
(
DuelPlayer
*
dp
,
unsigned
char
tp
);
virtual
void
Process
();
virtual
void
Process
();
virtual
void
Surrender
(
DuelPlayer
*
dp
);
virtual
void
Surrender
(
DuelPlayer
*
dp
);
virtual
int
Analyze
(
unsigned
char
*
msgbuffer
,
unsigned
int
len
);
virtual
int
Analyze
(
unsigned
char
*
msgbuffer
,
unsigned
int
len
);
virtual
void
GetResponse
(
DuelPlayer
*
dp
,
void
*
pdata
,
unsigned
int
len
);
virtual
void
GetResponse
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
unsigned
int
len
);
virtual
void
TimeConfirm
(
DuelPlayer
*
dp
);
virtual
void
TimeConfirm
(
DuelPlayer
*
dp
);
virtual
void
EndDuel
();
virtual
void
EndDuel
();
...
...
Classes/gframe/single_mode.cpp
View file @
e726ae9b
...
@@ -741,7 +741,7 @@ bool SingleMode::SinglePlayAnalyze(unsigned char* msg, unsigned int len) {
...
@@ -741,7 +741,7 @@ bool SingleMode::SinglePlayAnalyze(unsigned char* msg, unsigned int len) {
int
len
=
BufferIO
::
ReadInt16
(
pbuf
);
int
len
=
BufferIO
::
ReadInt16
(
pbuf
);
auto
begin
=
pbuf
;
auto
begin
=
pbuf
;
pbuf
+=
len
+
1
;
pbuf
+=
len
+
1
;
memcpy
(
namebuf
,
begin
,
len
+
1
);
std
::
memcpy
(
namebuf
,
begin
,
len
+
1
);
BufferIO
::
DecodeUTF8
(
namebuf
,
wname
);
BufferIO
::
DecodeUTF8
(
namebuf
,
wname
);
BufferIO
::
CopyWStr
(
wname
,
mainGame
->
dInfo
.
clientname
,
20
);
BufferIO
::
CopyWStr
(
wname
,
mainGame
->
dInfo
.
clientname
,
20
);
break
;
break
;
...
@@ -752,7 +752,7 @@ bool SingleMode::SinglePlayAnalyze(unsigned char* msg, unsigned int len) {
...
@@ -752,7 +752,7 @@ bool SingleMode::SinglePlayAnalyze(unsigned char* msg, unsigned int len) {
int
len
=
BufferIO
::
ReadInt16
(
pbuf
);
int
len
=
BufferIO
::
ReadInt16
(
pbuf
);
auto
begin
=
pbuf
;
auto
begin
=
pbuf
;
pbuf
+=
len
+
1
;
pbuf
+=
len
+
1
;
memcpy
(
msgbuf
,
begin
,
len
+
1
);
std
::
memcpy
(
msgbuf
,
begin
,
len
+
1
);
BufferIO
::
DecodeUTF8
(
msgbuf
,
msg
);
BufferIO
::
DecodeUTF8
(
msgbuf
,
msg
);
mainGame
->
gMutex
.
lock
();
mainGame
->
gMutex
.
lock
();
mainGame
->
SetStaticText
(
mainGame
->
stMessage
,
370
*
mainGame
->
xScale
,
mainGame
->
guiFont
,
msg
);
mainGame
->
SetStaticText
(
mainGame
->
stMessage
,
370
*
mainGame
->
xScale
,
mainGame
->
guiFont
,
msg
);
...
@@ -826,7 +826,7 @@ uint32 SingleMode::MessageHandler(intptr_t fduel, uint32 type) {
...
@@ -826,7 +826,7 @@ uint32 SingleMode::MessageHandler(intptr_t fduel, uint32 type) {
if
(
!
enable_log
)
if
(
!
enable_log
)
return
0
;
return
0
;
char
msgbuf
[
1024
];
char
msgbuf
[
1024
];
get_log_message
(
fduel
,
(
byte
*
)
msgbuf
);
get_log_message
(
fduel
,
msgbuf
);
mainGame
->
AddDebugMsg
(
msgbuf
);
mainGame
->
AddDebugMsg
(
msgbuf
);
return
0
;
return
0
;
}
}
...
...
Classes/gframe/tag_duel.cpp
View file @
e726ae9b
...
@@ -16,17 +16,17 @@ TagDuel::TagDuel() {
...
@@ -16,17 +16,17 @@ TagDuel::TagDuel() {
}
}
TagDuel
::~
TagDuel
()
{
TagDuel
::~
TagDuel
()
{
}
}
void
TagDuel
::
Chat
(
DuelPlayer
*
dp
,
void
*
pdata
,
int
len
)
{
void
TagDuel
::
Chat
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
int
len
)
{
STOC_Chat
scc
;
unsigned
char
scc
[
SIZE_STOC_CHAT
]
;
scc
.
player
=
dp
->
type
;
const
auto
scc_size
=
NetServer
::
CreateChatPacket
(
pdata
,
len
,
scc
,
dp
->
type
)
;
unsigned
short
*
msg
=
(
unsigned
short
*
)
pdata
;
if
(
!
scc_size
)
int
msglen
=
BufferIO
::
CopyWStr
(
msg
,
scc
.
msg
,
256
)
;
return
;
for
(
int
i
=
0
;
i
<
4
;
++
i
)
for
(
int
i
=
0
;
i
<
4
;
++
i
)
NetServer
::
SendBufferToPlayer
(
players
[
i
],
STOC_CHAT
,
&
scc
,
4
+
msglen
*
2
);
NetServer
::
SendBufferToPlayer
(
players
[
i
],
STOC_CHAT
,
scc
,
scc_size
);
for
(
auto
pit
=
observers
.
begin
();
pit
!=
observers
.
end
();
++
pit
)
for
(
auto
pit
=
observers
.
begin
();
pit
!=
observers
.
end
();
++
pit
)
NetServer
::
ReSendToPlayer
(
*
pit
);
NetServer
::
ReSendToPlayer
(
*
pit
);
}
}
void
TagDuel
::
JoinGame
(
DuelPlayer
*
dp
,
void
*
pdata
,
bool
is_creater
)
{
void
TagDuel
::
JoinGame
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
bool
is_creater
)
{
if
(
!
is_creater
)
{
if
(
!
is_creater
)
{
if
(
dp
->
game
&&
dp
->
type
!=
0xff
)
{
if
(
dp
->
game
&&
dp
->
type
!=
0xff
)
{
STOC_ErrorMsg
scem
;
STOC_ErrorMsg
scem
;
...
@@ -36,7 +36,9 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
...
@@ -36,7 +36,9 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
NetServer
::
DisconnectPlayer
(
dp
);
NetServer
::
DisconnectPlayer
(
dp
);
return
;
return
;
}
}
CTOS_JoinGame
*
pkt
=
(
CTOS_JoinGame
*
)
pdata
;
CTOS_JoinGame
packet
;
std
::
memcpy
(
&
packet
,
pdata
,
sizeof
packet
);
const
auto
*
pkt
=
&
packet
;
if
(
pkt
->
version
!=
PRO_VERSION
)
{
if
(
pkt
->
version
!=
PRO_VERSION
)
{
STOC_ErrorMsg
scem
;
STOC_ErrorMsg
scem
;
scem
.
msg
=
ERRMSG_VERERROR
;
scem
.
msg
=
ERRMSG_VERERROR
;
...
@@ -255,22 +257,32 @@ void TagDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
...
@@ -255,22 +257,32 @@ void TagDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
return
;
return
;
LeaveGame
(
players
[
pos
]);
LeaveGame
(
players
[
pos
]);
}
}
void
TagDuel
::
UpdateDeck
(
DuelPlayer
*
dp
,
void
*
pdata
,
unsigned
int
len
)
{
void
TagDuel
::
UpdateDeck
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
int
len
)
{
if
(
dp
->
type
>
3
||
ready
[
dp
->
type
])
if
(
dp
->
type
>
3
||
ready
[
dp
->
type
])
return
;
return
;
unsigned
char
*
deckbuf
=
(
unsigned
char
*
)
pdata
;
if
(
len
<
8
)
return
;
bool
valid
=
true
;
auto
deckbuf
=
pdata
;
int
mainc
=
BufferIO
::
ReadInt32
(
deckbuf
);
int
mainc
=
BufferIO
::
ReadInt32
(
deckbuf
);
int
sidec
=
BufferIO
::
ReadInt32
(
deckbuf
);
int
sidec
=
BufferIO
::
ReadInt32
(
deckbuf
);
// verify data
const
int
deck_size
=
len
-
2
*
sizeof
(
int32_t
);
const
unsigned
int
possibleMaxLength
=
(
len
-
8
)
/
4
;
if
(
mainc
<
0
||
mainc
>
MAINC_MAX
)
if
((
unsigned
)
mainc
>
possibleMaxLength
||
(
unsigned
)
sidec
>
possibleMaxLength
||
(
unsigned
)
mainc
+
(
unsigned
)
sidec
>
possibleMaxLength
)
{
valid
=
false
;
else
if
(
sidec
<
0
||
sidec
>
SIDEC_MAX
)
valid
=
false
;
else
if
(
deck_size
!=
(
mainc
+
sidec
)
*
(
int
)
sizeof
(
int32_t
))
valid
=
false
;
if
(
!
valid
)
{
STOC_ErrorMsg
scem
;
STOC_ErrorMsg
scem
;
scem
.
msg
=
ERRMSG_DECKERROR
;
scem
.
msg
=
ERRMSG_DECKERROR
;
scem
.
code
=
0
;
scem
.
code
=
0
;
NetServer
::
SendPacketToPlayer
(
dp
,
STOC_ERROR_MSG
,
scem
);
NetServer
::
SendPacketToPlayer
(
dp
,
STOC_ERROR_MSG
,
scem
);
return
;
return
;
}
}
deck_error
[
dp
->
type
]
=
deckManager
.
LoadDeck
(
pdeck
[
dp
->
type
],
(
int
*
)
deckbuf
,
mainc
,
sidec
);
int
deck_list
[
SIZE_NETWORK_BUFFER
/
sizeof
(
int32_t
)];
std
::
memcpy
(
deck_list
,
deckbuf
,
deck_size
);
deck_error
[
dp
->
type
]
=
deckManager
.
LoadDeck
(
pdeck
[
dp
->
type
],
deck_list
,
mainc
,
sidec
);
}
}
void
TagDuel
::
StartDuel
(
DuelPlayer
*
dp
)
{
void
TagDuel
::
StartDuel
(
DuelPlayer
*
dp
)
{
if
(
dp
!=
host_player
)
if
(
dp
!=
host_player
)
...
@@ -296,9 +308,9 @@ void TagDuel::StartDuel(DuelPlayer* dp) {
...
@@ -296,9 +308,9 @@ void TagDuel::StartDuel(DuelPlayer* dp) {
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_DECK_COUNT
,
deckbuff
,
12
);
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_DECK_COUNT
,
deckbuff
,
12
);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
char
tempbuff
[
6
];
char
tempbuff
[
6
];
memcpy
(
tempbuff
,
deckbuff
,
6
);
std
::
memcpy
(
tempbuff
,
deckbuff
,
6
);
memcpy
(
deckbuff
,
deckbuff
+
6
,
6
);
std
::
memcpy
(
deckbuff
,
deckbuff
+
6
,
6
);
memcpy
(
deckbuff
+
6
,
tempbuff
,
6
);
std
::
memcpy
(
deckbuff
+
6
,
tempbuff
,
6
);
NetServer
::
SendBufferToPlayer
(
players
[
2
],
STOC_DECK_COUNT
,
deckbuff
,
12
);
NetServer
::
SendBufferToPlayer
(
players
[
2
],
STOC_DECK_COUNT
,
deckbuff
,
12
);
NetServer
::
ReSendToPlayer
(
players
[
3
]);
NetServer
::
ReSendToPlayer
(
players
[
3
]);
NetServer
::
SendPacketToPlayer
(
players
[
0
],
STOC_SELECT_HAND
);
NetServer
::
SendPacketToPlayer
(
players
[
0
],
STOC_SELECT_HAND
);
...
@@ -1519,11 +1531,11 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
...
@@ -1519,11 +1531,11 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
}
}
return
0
;
return
0
;
}
}
void
TagDuel
::
GetResponse
(
DuelPlayer
*
dp
,
void
*
pdata
,
unsigned
int
len
)
{
void
TagDuel
::
GetResponse
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
unsigned
int
len
)
{
byte
resb
[
SIZE_RETURN_VALUE
];
byte
resb
[
SIZE_RETURN_VALUE
];
if
(
len
>
SIZE_RETURN_VALUE
)
if
(
len
>
SIZE_RETURN_VALUE
)
len
=
SIZE_RETURN_VALUE
;
len
=
SIZE_RETURN_VALUE
;
memcpy
(
resb
,
pdata
,
len
);
std
::
memcpy
(
resb
,
pdata
,
len
);
last_replay
.
WriteInt8
(
len
);
last_replay
.
WriteInt8
(
len
);
last_replay
.
WriteData
(
resb
,
len
);
last_replay
.
WriteData
(
resb
,
len
);
set_responseb
(
pduel
,
resb
);
set_responseb
(
pduel
,
resb
);
...
@@ -1542,9 +1554,9 @@ void TagDuel::EndDuel() {
...
@@ -1542,9 +1554,9 @@ void TagDuel::EndDuel() {
return
;
return
;
last_replay
.
EndRecord
();
last_replay
.
EndRecord
();
char
replaybuf
[
0x2000
],
*
pbuf
=
replaybuf
;
char
replaybuf
[
0x2000
],
*
pbuf
=
replaybuf
;
memcpy
(
pbuf
,
&
last_replay
.
pheader
,
sizeof
(
ReplayHeader
));
std
::
memcpy
(
pbuf
,
&
last_replay
.
pheader
,
sizeof
(
ReplayHeader
));
pbuf
+=
sizeof
(
ReplayHeader
);
pbuf
+=
sizeof
(
ReplayHeader
);
memcpy
(
pbuf
,
last_replay
.
comp_data
,
last_replay
.
comp_size
);
std
::
memcpy
(
pbuf
,
last_replay
.
comp_data
,
last_replay
.
comp_size
);
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_REPLAY
,
replaybuf
,
sizeof
(
ReplayHeader
)
+
last_replay
.
comp_size
);
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_REPLAY
,
replaybuf
,
sizeof
(
ReplayHeader
)
+
last_replay
.
comp_size
);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
NetServer
::
ReSendToPlayer
(
players
[
2
]);
NetServer
::
ReSendToPlayer
(
players
[
2
]);
...
@@ -1590,10 +1602,6 @@ inline int TagDuel::WriteUpdateData(int& player, int location, int& flag, unsign
...
@@ -1590,10 +1602,6 @@ inline int TagDuel::WriteUpdateData(int& player, int location, int& flag, unsign
int
len
=
query_field_card
(
pduel
,
player
,
location
,
flag
,
qbuf
,
use_cache
);
int
len
=
query_field_card
(
pduel
,
player
,
location
,
flag
,
qbuf
,
use_cache
);
return
len
;
return
len
;
}
}
inline
unsigned
int
GetPosition
(
unsigned
char
*&
qbuf
,
int
offset
)
{
unsigned
int
info
=
*
(
unsigned
int
*
)(
qbuf
+
offset
);
return
info
>>
24
;
}
void
TagDuel
::
RefreshMzone
(
int
player
,
int
flag
,
int
use_cache
)
{
void
TagDuel
::
RefreshMzone
(
int
player
,
int
flag
,
int
use_cache
)
{
std
::
vector
<
unsigned
char
>
query_buffer
;
std
::
vector
<
unsigned
char
>
query_buffer
;
query_buffer
.
resize
(
SIZE_QUERY_BUFFER
);
query_buffer
.
resize
(
SIZE_QUERY_BUFFER
);
...
@@ -1726,7 +1734,7 @@ uint32 TagDuel::MessageHandler(intptr_t fduel, uint32 type) {
...
@@ -1726,7 +1734,7 @@ uint32 TagDuel::MessageHandler(intptr_t fduel, uint32 type) {
if
(
!
enable_log
)
if
(
!
enable_log
)
return
0
;
return
0
;
char
msgbuf
[
1024
];
char
msgbuf
[
1024
];
get_log_message
(
fduel
,
(
byte
*
)
msgbuf
);
get_log_message
(
fduel
,
msgbuf
);
mainGame
->
AddDebugMsg
(
msgbuf
);
mainGame
->
AddDebugMsg
(
msgbuf
);
return
0
;
return
0
;
}
}
...
...
Classes/gframe/tag_duel.h
View file @
e726ae9b
...
@@ -11,21 +11,21 @@ class TagDuel: public DuelMode {
...
@@ -11,21 +11,21 @@ class TagDuel: public DuelMode {
public:
public:
TagDuel
();
TagDuel
();
virtual
~
TagDuel
();
virtual
~
TagDuel
();
virtual
void
Chat
(
DuelPlayer
*
dp
,
void
*
pdata
,
int
len
);
virtual
void
Chat
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
int
len
);
virtual
void
JoinGame
(
DuelPlayer
*
dp
,
void
*
pdata
,
bool
is_creater
);
virtual
void
JoinGame
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
bool
is_creater
);
virtual
void
LeaveGame
(
DuelPlayer
*
dp
);
virtual
void
LeaveGame
(
DuelPlayer
*
dp
);
virtual
void
ToDuelist
(
DuelPlayer
*
dp
);
virtual
void
ToDuelist
(
DuelPlayer
*
dp
);
virtual
void
ToObserver
(
DuelPlayer
*
dp
);
virtual
void
ToObserver
(
DuelPlayer
*
dp
);
virtual
void
PlayerReady
(
DuelPlayer
*
dp
,
bool
ready
);
virtual
void
PlayerReady
(
DuelPlayer
*
dp
,
bool
ready
);
virtual
void
PlayerKick
(
DuelPlayer
*
dp
,
unsigned
char
pos
);
virtual
void
PlayerKick
(
DuelPlayer
*
dp
,
unsigned
char
pos
);
virtual
void
UpdateDeck
(
DuelPlayer
*
dp
,
void
*
pdata
,
unsigned
int
len
);
virtual
void
UpdateDeck
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
int
len
);
virtual
void
StartDuel
(
DuelPlayer
*
dp
);
virtual
void
StartDuel
(
DuelPlayer
*
dp
);
virtual
void
HandResult
(
DuelPlayer
*
dp
,
unsigned
char
res
);
virtual
void
HandResult
(
DuelPlayer
*
dp
,
unsigned
char
res
);
virtual
void
TPResult
(
DuelPlayer
*
dp
,
unsigned
char
tp
);
virtual
void
TPResult
(
DuelPlayer
*
dp
,
unsigned
char
tp
);
virtual
void
Process
();
virtual
void
Process
();
virtual
void
Surrender
(
DuelPlayer
*
dp
);
virtual
void
Surrender
(
DuelPlayer
*
dp
);
virtual
int
Analyze
(
unsigned
char
*
msgbuffer
,
unsigned
int
len
);
virtual
int
Analyze
(
unsigned
char
*
msgbuffer
,
unsigned
int
len
);
virtual
void
GetResponse
(
DuelPlayer
*
dp
,
void
*
pdata
,
unsigned
int
len
);
virtual
void
GetResponse
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
unsigned
int
len
);
virtual
void
TimeConfirm
(
DuelPlayer
*
dp
);
virtual
void
TimeConfirm
(
DuelPlayer
*
dp
);
virtual
void
EndDuel
();
virtual
void
EndDuel
();
...
...
libcore/android/bufferio_android.h
View file @
e726ae9b
...
@@ -29,7 +29,7 @@ public:
...
@@ -29,7 +29,7 @@ public:
}
}
// return: string length
// return: string length
template
<
typename
T1
,
typename
T2
>
template
<
typename
T1
,
typename
T2
>
inline
static
int
CopyWStr
(
T1
*
src
,
T2
*
pstr
,
int
bufsize
)
{
inline
static
int
CopyWStr
(
const
T1
*
src
,
T2
*
pstr
,
int
bufsize
)
{
int
l
=
0
;
int
l
=
0
;
while
(
src
[
l
]
&&
l
<
bufsize
-
1
)
{
while
(
src
[
l
]
&&
l
<
bufsize
-
1
)
{
pstr
[
l
]
=
(
T2
)
src
[
l
];
pstr
[
l
]
=
(
T2
)
src
[
l
];
...
@@ -39,7 +39,7 @@ public:
...
@@ -39,7 +39,7 @@ public:
return
l
;
return
l
;
}
}
template
<
typename
T1
,
typename
T2
>
template
<
typename
T1
,
typename
T2
>
inline
static
int
CopyWStrRef
(
T1
*
src
,
T2
*&
pstr
,
int
bufsize
)
{
inline
static
int
CopyWStrRef
(
const
T1
*
src
,
T2
*&
pstr
,
int
bufsize
)
{
int
l
=
0
;
int
l
=
0
;
while
(
src
[
l
]
&&
l
<
bufsize
-
1
)
{
while
(
src
[
l
]
&&
l
<
bufsize
-
1
)
{
pstr
[
l
]
=
(
T2
)
src
[
l
];
pstr
[
l
]
=
(
T2
)
src
[
l
];
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment