Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Y
ygopro
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
赤子奈落
ygopro
Commits
4769836a
Commit
4769836a
authored
May 29, 2024
by
nanahira
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'patch-pointer' of github.com:salix5/ygopro into dev-salixthing
parents
2d8ef512
8763c49e
Changes
18
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
339 additions
and
175 deletions
+339
-175
gframe/data_manager.cpp
gframe/data_manager.cpp
+2
-2
gframe/deck_con.cpp
gframe/deck_con.cpp
+4
-4
gframe/deck_manager.cpp
gframe/deck_manager.cpp
+8
-6
gframe/deck_manager.h
gframe/deck_manager.h
+4
-0
gframe/drawing.cpp
gframe/drawing.cpp
+4
-4
gframe/duelclient.cpp
gframe/duelclient.cpp
+84
-26
gframe/duelclient.h
gframe/duelclient.h
+5
-9
gframe/event_handler.cpp
gframe/event_handler.cpp
+3
-3
gframe/lzma/Types.h
gframe/lzma/Types.h
+6
-0
gframe/netserver.cpp
gframe/netserver.cpp
+87
-29
gframe/netserver.h
gframe/netserver.h
+6
-4
gframe/network.h
gframe/network.h
+48
-26
gframe/single_duel.cpp
gframe/single_duel.cpp
+34
-26
gframe/single_duel.h
gframe/single_duel.h
+4
-4
gframe/single_mode.cpp
gframe/single_mode.cpp
+2
-2
gframe/tag_duel.cpp
gframe/tag_duel.cpp
+33
-25
gframe/tag_duel.h
gframe/tag_duel.h
+4
-4
ocgcore
ocgcore
+1
-1
No files found.
gframe/data_manager.cpp
View file @
4769836a
...
...
@@ -61,7 +61,7 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
if
(
len
>
SIZE_SETCODE
)
len
=
SIZE_SETCODE
;
if
(
len
)
memcpy
(
cd
.
setcode
,
it
->
second
.
data
(),
len
*
sizeof
(
uint16_t
));
std
::
memcpy
(
cd
.
setcode
,
it
->
second
.
data
(),
len
*
sizeof
(
uint16_t
));
}
else
cd
.
set_setcode
(
setcode
);
...
...
@@ -184,7 +184,7 @@ bool DataManager::GetData(unsigned int code, CardData* pData) {
if
(
pData
)
{
pData
->
code
=
data
.
code
;
pData
->
alias
=
data
.
alias
;
memcpy
(
pData
->
setcode
,
data
.
setcode
,
SIZE_SETCODE
);
std
::
memcpy
(
pData
->
setcode
,
data
.
setcode
,
SIZE_SETCODE
);
pData
->
type
=
data
.
type
;
pData
->
level
=
data
.
level
;
pData
->
attribute
=
data
.
attribute
;
...
...
gframe/deck_con.cpp
View file @
4769836a
...
...
@@ -1292,7 +1292,7 @@ void DeckBuilder::GetHoveredCard() {
}
else
if
(
y
>=
164
&&
y
<=
435
)
{
int
lx
=
10
,
px
,
py
=
(
y
-
164
)
/
68
;
hovered_pos
=
1
;
if
(
deckManager
.
current_deck
.
main
.
size
()
>
40
)
if
(
deckManager
.
current_deck
.
main
.
size
()
>
DECK_MIN_SIZE
)
lx
=
(
deckManager
.
current_deck
.
main
.
size
()
-
41
)
/
4
+
11
;
if
(
x
>=
750
)
px
=
lx
-
1
;
...
...
@@ -1803,7 +1803,7 @@ bool DeckBuilder::push_main(code_pointer pointer, int seq) {
if
(
pointer
->
second
.
type
&
(
TYPE_FUSION
|
TYPE_SYNCHRO
|
TYPE_XYZ
|
TYPE_LINK
))
return
false
;
auto
&
container
=
deckManager
.
current_deck
.
main
;
int
maxc
=
mainGame
->
is_siding
?
YGOPRO_MAX_DECK
+
5
:
YGOPRO_MAX_DECK
;
int
maxc
=
mainGame
->
is_siding
?
DECK_MAX_SIZE
+
4
:
DECK_MAX_SIZE
;
if
((
int
)
container
.
size
()
>=
maxc
)
return
false
;
if
(
seq
>=
0
&&
seq
<
(
int
)
container
.
size
())
...
...
@@ -1818,7 +1818,7 @@ bool DeckBuilder::push_extra(code_pointer pointer, int seq) {
if
(
!
(
pointer
->
second
.
type
&
(
TYPE_FUSION
|
TYPE_SYNCHRO
|
TYPE_XYZ
|
TYPE_LINK
)))
return
false
;
auto
&
container
=
deckManager
.
current_deck
.
extra
;
int
maxc
=
mainGame
->
is_siding
?
YGOPRO_MAX_EXTRA
+
5
:
YGOPRO_MAX_EXTRA
;
int
maxc
=
mainGame
->
is_siding
?
EXTRA_MAX_SIZE
+
5
:
EXTRA_MAX_SIZE
;
if
((
int
)
container
.
size
()
>=
maxc
)
return
false
;
if
(
seq
>=
0
&&
seq
<
(
int
)
container
.
size
())
...
...
@@ -1831,7 +1831,7 @@ bool DeckBuilder::push_extra(code_pointer pointer, int seq) {
}
bool
DeckBuilder
::
push_side
(
code_pointer
pointer
,
int
seq
)
{
auto
&
container
=
deckManager
.
current_deck
.
side
;
int
maxc
=
mainGame
->
is_siding
?
YGOPRO_MAX_SIDE
+
5
:
YGOPRO_MAX_SID
E
;
int
maxc
=
mainGame
->
is_siding
?
SIDE_MAX_SIZE
+
5
:
SIDE_MAX_SIZ
E
;
if
((
int
)
container
.
size
()
>=
maxc
)
return
false
;
if
(
seq
>=
0
&&
seq
<
(
int
)
container
.
size
())
...
...
gframe/deck_manager.cpp
View file @
4769836a
...
...
@@ -89,11 +89,11 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, int rule) {
if
(
!
list
)
return
0
;
int
dc
=
0
;
if
(
deck
.
main
.
size
()
<
YGOPRO_MIN_DECK
||
deck
.
main
.
size
()
>
YGOPRO_MAX_DECK
)
if
(
deck
.
main
.
size
()
<
DECK_MIN_SIZE
||
deck
.
main
.
size
()
>
DECK_MAX_SIZE
)
return
(
DECKERROR_MAINCOUNT
<<
28
)
+
deck
.
main
.
size
();
if
(
deck
.
extra
.
size
()
>
YGOPRO_MAX_EXTRA
)
if
(
deck
.
extra
.
size
()
>
EXTRA_MAX_SIZE
)
return
(
DECKERROR_EXTRACOUNT
<<
28
)
+
deck
.
extra
.
size
();
if
(
deck
.
side
.
size
()
>
YGOPRO_MAX_SID
E
)
if
(
deck
.
side
.
size
()
>
SIDE_MAX_SIZ
E
)
return
(
DECKERROR_SIDECOUNT
<<
28
)
+
deck
.
side
.
size
();
const
int
rule_map
[
6
]
=
{
AVAIL_OCG
,
AVAIL_TCG
,
AVAIL_SC
,
AVAIL_CUSTOM
,
AVAIL_OCGTCG
,
0
};
int
avail
=
rule_map
[
rule
];
...
...
@@ -161,10 +161,10 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p
continue
;
}
else
if
(
cd
.
type
&
(
TYPE_FUSION
|
TYPE_SYNCHRO
|
TYPE_XYZ
|
TYPE_LINK
))
{
if
(
deck
.
extra
.
size
()
>=
YGOPRO_MAX_EXTRA
)
if
(
deck
.
extra
.
size
()
>=
EXTRA_MAX_SIZE
)
continue
;
deck
.
extra
.
push_back
(
dataManager
.
GetCodePointer
(
code
));
}
else
if
(
deck
.
main
.
size
()
<
YGOPRO_MAX_DECK
)
{
}
else
if
(
deck
.
main
.
size
()
<
DECK_MAX_SIZE
)
{
deck
.
main
.
push_back
(
dataManager
.
GetCodePointer
(
code
));
}
}
...
...
@@ -253,7 +253,9 @@ bool DeckManager::LoadDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUICom
}
FILE
*
DeckManager
::
OpenDeckFile
(
const
wchar_t
*
file
,
const
char
*
mode
)
{
#ifdef WIN32
FILE
*
fp
=
_wfopen
(
file
,
(
wchar_t
*
)
mode
);
wchar_t
wmode
[
20
]{};
BufferIO
::
CopyWStr
(
mode
,
wmode
,
sizeof
(
wmode
)
/
sizeof
(
wchar_t
));
FILE
*
fp
=
_wfopen
(
file
,
wmode
);
#else
char
file2
[
256
];
BufferIO
::
EncodeUTF8
(
file
,
file2
);
...
...
gframe/deck_manager.h
View file @
4769836a
...
...
@@ -8,6 +8,10 @@
#include <sstream>
namespace
ygo
{
constexpr
int
DECK_MAX_SIZE
=
YGOPRO_MAX_DECK
;
constexpr
int
DECK_MIN_SIZE
=
YGOPRO_MIN_DECK
;
constexpr
int
EXTRA_MAX_SIZE
=
YGOPRO_MAX_EXTRA
;
constexpr
int
SIDE_MAX_SIZE
=
YGOPRO_MAX_SIDE
;
struct
LFList
{
unsigned
int
hash
{};
...
...
gframe/drawing.cpp
View file @
4769836a
...
...
@@ -18,10 +18,10 @@ void Game::DrawSelectionLine(irr::video::S3DVertex* vec, bool strip, int width,
glDisable
(
GL_TEXTURE_2D
);
glMaterialfv
(
GL_FRONT
,
GL_AMBIENT
,
cv
);
glBegin
(
GL_LINE_LOOP
);
glVertex3fv
(
(
float
*
)
&
vec
[
0
].
Pos
);
glVertex3fv
(
(
float
*
)
&
vec
[
1
].
Pos
);
glVertex3fv
(
(
float
*
)
&
vec
[
3
].
Pos
);
glVertex3fv
(
(
float
*
)
&
vec
[
2
].
Pos
);
glVertex3fv
(
&
vec
[
0
].
Pos
.
X
);
glVertex3fv
(
&
vec
[
1
].
Pos
.
X
);
glVertex3fv
(
&
vec
[
3
].
Pos
.
X
);
glVertex3fv
(
&
vec
[
2
].
Pos
.
X
);
glEnd
();
glMaterialfv
(
GL_FRONT
,
GL_AMBIENT
,
origin
);
glDisable
(
GL_LINE_STIPPLE
);
...
...
gframe/duelclient.cpp
View file @
4769836a
This diff is collapsed.
Click to expand it.
gframe/duelclient.h
View file @
4769836a
...
...
@@ -5,11 +5,6 @@
#include <vector>
#include <set>
#include <utility>
#include <event2/event.h>
#include <event2/listener.h>
#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/thread.h>
#include "network.h"
#include "data_manager.h"
#include "deck_manager.h"
...
...
@@ -66,6 +61,7 @@ private:
static
event_base
*
client_base
;
static
bufferevent
*
client_bev
;
static
unsigned
char
duel_client_read
[
SIZE_NETWORK_BUFFER
];
static
int
read_len
;
static
unsigned
char
duel_client_write
[
SIZE_NETWORK_BUFFER
];
static
bool
is_closing
;
static
bool
is_swapping
;
...
...
@@ -88,7 +84,7 @@ public:
static
void
ClientRead
(
bufferevent
*
bev
,
void
*
ctx
);
static
void
ClientEvent
(
bufferevent
*
bev
,
short
events
,
void
*
ctx
);
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
void
SwapField
();
static
void
SetResponseI
(
int
respI
);
...
...
@@ -112,10 +108,10 @@ public:
auto
p
=
duel_client_write
;
int
blen
=
sizeof
(
ST
);
if
(
blen
>
MAX_DATA_SIZE
)
blen
=
MAX_DATA_SIZE
;
return
;
BufferIO
::
WriteInt16
(
p
,
(
short
)(
1
+
blen
));
BufferIO
::
WriteInt8
(
p
,
proto
);
memcpy
(
p
,
&
st
,
blen
);
std
::
memcpy
(
p
,
&
st
,
blen
);
#ifdef YGOPRO_MESSAGE_DEBUG
printf
(
"CTOS: %d Length: %ld
\n
"
,
proto
,
sizeof
(
ST
));
#endif
...
...
@@ -130,7 +126,7 @@ public:
blen
=
MAX_DATA_SIZE
;
BufferIO
::
WriteInt16
(
p
,
(
short
)(
1
+
blen
));
BufferIO
::
WriteInt8
(
p
,
proto
);
memcpy
(
p
,
buffer
,
blen
);
std
::
memcpy
(
p
,
buffer
,
blen
);
#ifdef YGOPRO_MESSAGE_DEBUG
printf
(
"CTOS: %d Length: %ld
\n
"
,
proto
,
len
);
#endif
...
...
gframe/event_handler.cpp
View file @
4769836a
...
...
@@ -2087,9 +2087,9 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) {
break
;
const
wchar_t
*
input
=
mainGame
->
ebChatInput
->
getText
();
if
(
input
[
0
])
{
u
nsigned
short
msgbuf
[
256
];
int
len
=
BufferIO
::
CopyWStr
(
input
,
msgbuf
,
256
);
DuelClient
::
SendBufferToServer
(
CTOS_CHAT
,
msgbuf
,
(
len
+
1
)
*
sizeof
(
shor
t
));
u
int16_t
msgbuf
[
LEN_CHAT_MSG
];
int
len
=
BufferIO
::
CopyWStr
(
input
,
msgbuf
,
LEN_CHAT_MSG
);
DuelClient
::
SendBufferToServer
(
CTOS_CHAT
,
msgbuf
,
(
len
+
1
)
*
sizeof
(
uint16_
t
));
mainGame
->
ebChatInput
->
setText
(
L""
);
return
true
;
}
...
...
gframe/lzma/Types.h
View file @
4769836a
...
...
@@ -74,9 +74,15 @@ typedef unsigned long UInt64;
#else
#if defined(_MSC_VER) || defined(__BORLANDC__)
typedef
__int64
Int64
;
typedef
unsigned
__int64
UInt64
;
#define UINT64_CONST(n) n
#else
typedef
long
long
int
Int64
;
typedef
unsigned
long
long
int
UInt64
;
#define UINT64_CONST(n) n ## ULL
#endif
#endif
...
...
gframe/netserver.cpp
View file @
4769836a
...
...
@@ -10,6 +10,7 @@ event* NetServer::broadcast_ev = 0;
evconnlistener
*
NetServer
::
listener
=
0
;
DuelMode
*
NetServer
::
duel_mode
=
0
;
unsigned
char
NetServer
::
net_server_read
[
SIZE_NETWORK_BUFFER
];
int
NetServer
::
read_len
=
0
;
unsigned
char
NetServer
::
net_server_write
[
SIZE_NETWORK_BUFFER
];
unsigned
short
NetServer
::
last_sent
=
0
;
...
...
@@ -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
);
if
(
ret
==
-
1
)
return
;
HostRequest
*
pHR
=
(
HostRequest
*
)
buf
;
HostRequest
packet
;
std
::
memcpy
(
&
packet
,
buf
,
sizeof
packet
);
const
HostRequest
*
pHR
=
&
packet
;
if
(
pHR
->
identifier
==
NETWORK_CLIENT_ID
)
{
SOCKADDR_IN
sockTo
;
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
void
NetServer
::
ServerAcceptError
(
evconnlistener
*
listener
,
void
*
ctx
)
{
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
)
{
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
;
while
(
true
)
{
if
(
len
<
2
)
return
;
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
;
evbuffer_remove
(
input
,
net_server_read
,
packet_len
+
2
);
if
(
packet_len
)
HandleCTOSPacket
(
&
users
[
bev
],
&
net_server_read
[
2
],
packet_len
);
}
if
(
len
<
packet_len
+
2
)
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
;
}
}
...
...
@@ -134,7 +148,8 @@ void NetServer::ServerEchoEvent(bufferevent* bev, short events, void* ctx) {
DuelMode
*
dm
=
dp
->
game
;
if
(
dm
)
dm
->
LeaveGame
(
dp
);
else
DisconnectPlayer
(
dp
);
else
DisconnectPlayer
(
dp
);
}
}
int
NetServer
::
ServerThread
()
{
...
...
@@ -171,7 +186,7 @@ void NetServer::DisconnectPlayer(DuelPlayer* dp) {
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
;
unsigned
char
pktType
=
BufferIO
::
ReadUInt8
(
pdata
);
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
case
CTOS_RESPONSE
:
{
if
(
!
dp
->
game
||
!
duel_mode
->
pduel
)
return
;
if
(
len
<
1
+
(
int
)
sizeof
(
unsigned
char
))
return
;
duel_mode
->
GetResponse
(
dp
,
pdata
,
len
-
1
);
break
;
}
...
...
@@ -192,38 +209,58 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, unsigned i
case
CTOS_CHAT
:
{
if
(
!
dp
->
game
)
return
;
if
(
len
<
1
+
(
int
)
sizeof
(
unsigned
char
))
return
;
duel_mode
->
Chat
(
dp
,
pdata
,
len
-
1
);
break
;
}
case
CTOS_UPDATE_DECK
:
{
if
(
!
dp
->
game
)
return
;
if
(
len
<
1
+
(
int
)
sizeof
(
unsigned
char
))
return
;
duel_mode
->
UpdateDeck
(
dp
,
pdata
,
len
-
1
);
break
;
}
case
CTOS_HAND_RESULT
:
{
if
(
!
dp
->
game
)
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
);
break
;
}
case
CTOS_TP_RESULT
:
{
if
(
!
dp
->
game
)
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
);
break
;
}
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
);
break
;
}
case
CTOS_CREATE_GAME
:
{
if
(
dp
->
game
||
duel_mode
)
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
)
{
duel_mode
=
new
SingleDuel
(
false
);
duel_mode
->
etimer
=
event_new
(
net_evbase
,
0
,
EV_TIMEOUT
|
EV_PERSIST
,
SingleDuel
::
SingleTimer
,
duel_mode
);
...
...
@@ -247,6 +284,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, unsigned i
}
if
(
hash
==
1
)
pkt
->
info
.
lflist
=
deckManager
.
_lfList
[
0
].
hash
;
std
::
memcpy
(
pdata
,
&
packet
,
sizeof
packet
);
duel_mode
->
host_info
=
pkt
->
info
;
BufferIO
::
CopyWStr
(
pkt
->
name
,
duel_mode
->
name
,
20
);
BufferIO
::
CopyWStr
(
pkt
->
pass
,
duel_mode
->
pass
,
20
);
...
...
@@ -255,56 +293,76 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, unsigned i
break
;
}
case
CTOS_JOIN_GAME
:
{
if
(
!
duel_mode
)
break
;
if
(
!
duel_mode
)
return
;
if
(
len
<
1
+
(
int
)
sizeof
(
CTOS_JoinGame
))
return
;
duel_mode
->
JoinGame
(
dp
,
pdata
,
false
);
break
;
}
case
CTOS_LEAVE_GAME
:
{
if
(
!
duel_mode
)
break
;
if
(
!
duel_mode
)
return
;
duel_mode
->
LeaveGame
(
dp
);
break
;
}
case
CTOS_SURRENDER
:
{
if
(
!
duel_mode
)
break
;
if
(
!
duel_mode
)
return
;
duel_mode
->
Surrender
(
dp
);
break
;
}
case
CTOS_HS_TODUELIST
:
{
if
(
!
duel_mode
||
duel_mode
->
pduel
)
break
;
if
(
!
duel_mode
||
duel_mode
->
pduel
)
return
;
duel_mode
->
ToDuelist
(
dp
);
break
;
}
case
CTOS_HS_TOOBSERVER
:
{
if
(
!
duel_mode
||
duel_mode
->
pduel
)
break
;
if
(
!
duel_mode
||
duel_mode
->
pduel
)
return
;
duel_mode
->
ToObserver
(
dp
);
break
;
}
case
CTOS_HS_READY
:
case
CTOS_HS_NOTREADY
:
{
if
(
!
duel_mode
||
duel_mode
->
pduel
)
break
;
if
(
!
duel_mode
||
duel_mode
->
pduel
)
return
;
duel_mode
->
PlayerReady
(
dp
,
(
CTOS_HS_NOTREADY
-
pktType
)
!=
0
);
break
;
}
case
CTOS_HS_KICK
:
{
if
(
!
duel_mode
||
duel_mode
->
pduel
)
break
;
CTOS_Kick
*
pkt
=
(
CTOS_Kick
*
)
pdata
;
if
(
!
duel_mode
||
duel_mode
->
pduel
)
return
;
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
);
break
;
}
case
CTOS_HS_START
:
{
if
(
!
duel_mode
||
duel_mode
->
pduel
)
break
;
if
(
!
duel_mode
||
duel_mode
->
pduel
)
return
;
duel_mode
->
StartDuel
(
dp
);
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
;
}
}
gframe/netserver.h
View file @
4769836a
...
...
@@ -19,6 +19,7 @@ private:
static
evconnlistener
*
listener
;
static
DuelMode
*
duel_mode
;
static
unsigned
char
net_server_read
[
SIZE_NETWORK_BUFFER
];
static
int
read_len
;
static
unsigned
char
net_server_write
[
SIZE_NETWORK_BUFFER
];
static
unsigned
short
last_sent
;
...
...
@@ -35,7 +36,8 @@ public:
static
void
ServerEchoEvent
(
bufferevent
*
bev
,
short
events
,
void
*
ctx
);
static
int
ServerThread
();
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
)
{
auto
p
=
net_server_write
;
BufferIO
::
WriteInt16
(
p
,
1
);
...
...
@@ -50,10 +52,10 @@ public:
auto
p
=
net_server_write
;
int
blen
=
sizeof
(
ST
);
if
(
blen
>
MAX_DATA_SIZE
)
blen
=
MAX_DATA_SIZE
;
return
;
BufferIO
::
WriteInt16
(
p
,
(
short
)(
1
+
blen
));
BufferIO
::
WriteInt8
(
p
,
proto
);
memcpy
(
p
,
&
st
,
blen
);
std
::
memcpy
(
p
,
&
st
,
blen
);
last_sent
=
blen
+
3
;
if
(
dp
)
bufferevent_write
(
dp
->
bev
,
net_server_write
,
blen
+
3
);
...
...
@@ -67,7 +69,7 @@ public:
blen
=
MAX_DATA_SIZE
;
BufferIO
::
WriteInt16
(
p
,
(
short
)(
1
+
blen
));
BufferIO
::
WriteInt8
(
p
,
proto
);
memcpy
(
p
,
buffer
,
blen
);
std
::
memcpy
(
p
,
buffer
,
blen
);
last_sent
=
blen
+
3
;
if
(
dp
)
bufferevent_write
(
dp
->
bev
,
net_server_write
,
blen
+
3
);
...
...
gframe/network.h
View file @
4769836a
...
...
@@ -14,16 +14,16 @@ namespace ygo {
constexpr
int
MAX_DATA_SIZE
=
SIZE_NETWORK_BUFFER
-
3
;
struct
HostInfo
{
unsigned
int
lflist
{
0
};
unsigned
char
rule
{
0
};
unsigned
char
mode
{
0
};
unsigned
char
duel_rule
{
0
};
bool
no_check_deck
{
false
};
bool
no_shuffle_deck
{
false
};
unsigned
int
start_lp
{
0
};
unsigned
char
start_hand
{
0
};
unsigned
char
draw_count
{
0
};
unsigned
short
time_limit
{
0
};
unsigned
int
lflist
{};
unsigned
char
rule
{};
unsigned
char
mode
{};
unsigned
char
duel_rule
{};
unsigned
char
no_check_deck
{
};
unsigned
char
no_shuffle_deck
{
};
unsigned
int
start_lp
{};
unsigned
char
start_hand
{};
unsigned
char
draw_count
{};
unsigned
short
time_limit
{};
};
struct
HostPacket
{
unsigned
short
identifier
;
...
...
@@ -60,6 +60,8 @@ struct CTOS_JoinGame {
struct
CTOS_Kick
{
unsigned
char
pos
;
};
// STOC
struct
STOC_ErrorMsg
{
unsigned
char
msg
;
unsigned
int
code
;
...
...
@@ -84,10 +86,14 @@ struct STOC_TimeLimit {
unsigned
char
player
;
unsigned
short
left_time
;
};
struct
STOC_Chat
{
unsigned
short
player
;
unsigned
short
msg
[
256
];
};
/*
* STOC_Chat
* uint16_t player_type;
* uint16_t msg[256]; (UTF-16 string)
*/
constexpr
int
LEN_CHAT_PLAYER
=
1
;
constexpr
int
LEN_CHAT_MSG
=
256
;
constexpr
int
SIZE_STOC_CHAT
=
(
LEN_CHAT_PLAYER
+
LEN_CHAT_MSG
)
*
sizeof
(
uint16_t
);
struct
STOC_HS_PlayerEnter
{
unsigned
short
name
[
20
];
unsigned
char
pos
;
...
...
@@ -110,18 +116,34 @@ struct DuelPlayer {
bufferevent
*
bev
{
0
};
};
inline
bool
check_msg_size
(
int
size
)
{
// empty string is not allowed
if
(
size
<
2
*
sizeof
(
uint16_t
))
return
false
;
if
(
size
>
LEN_CHAT_MSG
*
sizeof
(
uint16_t
))
return
false
;
if
(
size
%
sizeof
(
uint16_t
)
!=
0
)
return
false
;
return
true
;
}
inline
unsigned
int
GetPosition
(
unsigned
char
*
qbuf
,
int
offset
)
{
unsigned
int
info
=
0
;
std
::
memcpy
(
&
info
,
qbuf
+
offset
,
sizeof
info
);
return
info
>>
24
;
}
class
DuelMode
{
public:
DuelMode
()
:
host_player
(
nullptr
),
pduel
(
0
),
duel_stage
(
0
)
{}
virtual
~
DuelMode
()
{}
virtual
void
Chat
(
DuelPlayer
*
dp
,
void
*
pdata
,
int
len
)
{}
virtual
void
JoinGame
(
DuelPlayer
*
dp
,
void
*
pdata
,
bool
is_creater
)
{}
virtual
void
Chat
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
int
len
)
{}
virtual
void
JoinGame
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
bool
is_creater
)
{}
virtual
void
LeaveGame
(
DuelPlayer
*
dp
)
{}
virtual
void
ToDuelist
(
DuelPlayer
*
dp
)
{}
virtual
void
ToObserver
(
DuelPlayer
*
dp
)
{}
virtual
void
PlayerReady
(
DuelPlayer
*
dp
,
bool
is_ready
)
{}
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
HandResult
(
DuelPlayer
*
dp
,
unsigned
char
res
)
{}
virtual
void
TPResult
(
DuelPlayer
*
dp
,
unsigned
char
tp
)
{}
...
...
@@ -130,18 +152,18 @@ public:
return
0
;
}
virtual
void
Surrender
(
DuelPlayer
*
dp
)
{}
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
EndDuel
()
{}
;
virtual
void
EndDuel
()
{}
public:
event
*
etimer
;
DuelPlayer
*
host_player
;
event
*
etimer
{
nullptr
}
;
DuelPlayer
*
host_player
{
nullptr
}
;
HostInfo
host_info
;
int
duel_stage
;
intptr_t
pduel
;
wchar_t
name
[
20
];
wchar_t
pass
[
20
];
int
duel_stage
{}
;
intptr_t
pduel
{}
;
wchar_t
name
[
20
]
{}
;
wchar_t
pass
[
20
]
{}
;
};
}
...
...
gframe/single_duel.cpp
View file @
4769836a
...
...
@@ -12,17 +12,17 @@ SingleDuel::SingleDuel(bool is_match) {
}
SingleDuel
::~
SingleDuel
()
{
}
void
SingleDuel
::
Chat
(
DuelPlayer
*
dp
,
void
*
pdata
,
int
len
)
{
STOC_Chat
scc
;
scc
.
player
=
dp
->
type
;
unsigned
short
*
msg
=
(
unsigned
short
*
)
pdata
;
int
msglen
=
BufferIO
::
CopyWStr
(
msg
,
scc
.
msg
,
256
)
;
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_CHAT
,
&
scc
,
4
+
msglen
*
2
);
void
SingleDuel
::
Chat
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
int
len
)
{
unsigned
char
scc
[
SIZE_STOC_CHAT
]
;
const
auto
scc_size
=
NetServer
::
CreateChatPacket
(
pdata
,
len
,
scc
,
dp
->
type
)
;
if
(
!
scc_size
)
return
;
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_CHAT
,
scc
,
scc_size
);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
for
(
auto
pit
=
observers
.
begin
();
pit
!=
observers
.
end
();
++
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
(
dp
->
game
&&
dp
->
type
!=
0xff
)
{
STOC_ErrorMsg
scem
;
...
...
@@ -32,7 +32,9 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
NetServer
::
DisconnectPlayer
(
dp
);
return
;
}
CTOS_JoinGame
*
pkt
=
(
CTOS_JoinGame
*
)
pdata
;
CTOS_JoinGame
packet
;
std
::
memcpy
(
&
packet
,
pdata
,
sizeof
packet
);
const
auto
*
pkt
=
&
packet
;
/* disabled version check
if(pkt->version != PRO_VERSION) {
STOC_ErrorMsg scem;
...
...
@@ -274,25 +276,35 @@ void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
return
;
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
])
return
;
unsigned
char
*
deckbuf
=
(
unsigned
char
*
)
pdata
;
if
(
len
<=
8
||
len
%
sizeof
(
int32_t
)
!=
0
)
return
;
bool
valid
=
true
;
auto
deckbuf
=
pdata
;
int
mainc
=
BufferIO
::
ReadInt32
(
deckbuf
);
int
sidec
=
BufferIO
::
ReadInt32
(
deckbuf
);
// verify data
const
unsigned
int
possibleMaxLength
=
(
len
-
8
)
/
4
;
if
((
unsigned
)
mainc
>
possibleMaxLength
||
(
unsigned
)
sidec
>
possibleMaxLength
||
(
unsigned
)
mainc
+
(
unsigned
)
sidec
>
possibleMaxLength
)
{
const
int
deck_size
=
len
-
2
*
sizeof
(
int32_t
);
if
(
mainc
<
DECK_MIN_SIZE
||
mainc
>
DECK_MAX_SIZE
+
EXTRA_MAX_SIZE
)
valid
=
false
;
else
if
(
sidec
<
0
||
sidec
>
SIDE_MAX_SIZE
)
valid
=
false
;
else
if
(
deck_size
!=
(
mainc
+
sidec
)
*
(
int
)
sizeof
(
int32_t
))
valid
=
false
;
if
(
!
valid
)
{
STOC_ErrorMsg
scem
;
scem
.
msg
=
ERRMSG_DECKERROR
;
scem
.
code
=
0
;
NetServer
::
SendPacketToPlayer
(
dp
,
STOC_ERROR_MSG
,
scem
);
return
;
}
int
deck_list
[
DECK_MAX_SIZE
+
EXTRA_MAX_SIZE
+
SIDE_MAX_SIZE
];
std
::
memcpy
(
deck_list
,
deckbuf
,
deck_size
);
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
{
if
(
deckManager
.
LoadSide
(
pdeck
[
dp
->
type
],
(
int
*
)
deckbuf
,
mainc
,
sidec
))
{
if
(
deckManager
.
LoadSide
(
pdeck
[
dp
->
type
],
deck_list
,
mainc
,
sidec
))
{
ready
[
dp
->
type
]
=
true
;
NetServer
::
SendPacketToPlayer
(
dp
,
STOC_DUEL_START
);
if
(
ready
[
0
]
&&
ready
[
1
])
{
...
...
@@ -332,9 +344,9 @@ void SingleDuel::StartDuel(DuelPlayer* dp) {
BufferIO
::
WriteInt16
(
pbuf
,
(
short
)
pdeck
[
1
].
side
.
size
());
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_DECK_COUNT
,
deckbuff
,
12
);
char
tempbuff
[
6
];
memcpy
(
tempbuff
,
deckbuff
,
6
);
memcpy
(
deckbuff
,
deckbuff
+
6
,
6
);
memcpy
(
deckbuff
+
6
,
tempbuff
,
6
);
std
::
memcpy
(
tempbuff
,
deckbuff
,
6
);
std
::
memcpy
(
deckbuff
,
deckbuff
+
6
,
6
);
std
::
memcpy
(
deckbuff
+
6
,
tempbuff
,
6
);
NetServer
::
SendBufferToPlayer
(
players
[
1
],
STOC_DECK_COUNT
,
deckbuff
,
12
);
NetServer
::
SendPacketToPlayer
(
players
[
0
],
STOC_SELECT_HAND
);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
...
...
@@ -1423,11 +1435,11 @@ int SingleDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
}
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
];
if
(
len
>
SIZE_RETURN_VALUE
)
len
=
SIZE_RETURN_VALUE
;
memcpy
(
resb
,
pdata
,
len
);
std
::
memcpy
(
resb
,
pdata
,
len
);
last_replay
.
WriteInt8
(
len
);
last_replay
.
WriteData
(
resb
,
len
);
set_responseb
(
pduel
,
resb
);
...
...
@@ -1445,9 +1457,9 @@ void SingleDuel::EndDuel() {
return
;
last_replay
.
EndRecord
();
char
replaybuf
[
0x2000
],
*
pbuf
=
replaybuf
;
memcpy
(
pbuf
,
&
last_replay
.
pheader
,
sizeof
(
ReplayHeader
));
std
::
memcpy
(
pbuf
,
&
last_replay
.
pheader
,
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
::
ReSendToPlayer
(
players
[
1
]);
for
(
auto
oit
=
observers
.
begin
();
oit
!=
observers
.
end
();
++
oit
)
...
...
@@ -1487,10 +1499,6 @@ inline int SingleDuel::WriteUpdateData(int& player, int location, int& flag, uns
int
len
=
query_field_card
(
pduel
,
player
,
location
,
flag
,
qbuf
,
use_cache
);
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
)
{
std
::
vector
<
unsigned
char
>
query_buffer
;
query_buffer
.
resize
(
SIZE_QUERY_BUFFER
);
...
...
gframe/single_duel.h
View file @
4769836a
...
...
@@ -11,21 +11,21 @@ class SingleDuel: public DuelMode {
public:
SingleDuel
(
bool
is_match
);
virtual
~
SingleDuel
();
virtual
void
Chat
(
DuelPlayer
*
dp
,
void
*
pdata
,
int
len
);
virtual
void
JoinGame
(
DuelPlayer
*
dp
,
void
*
pdata
,
bool
is_creater
);
virtual
void
Chat
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
int
len
);
virtual
void
JoinGame
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
bool
is_creater
);
virtual
void
LeaveGame
(
DuelPlayer
*
dp
);
virtual
void
ToDuelist
(
DuelPlayer
*
dp
);
virtual
void
ToObserver
(
DuelPlayer
*
dp
);
virtual
void
PlayerReady
(
DuelPlayer
*
dp
,
bool
ready
);
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
HandResult
(
DuelPlayer
*
dp
,
unsigned
char
res
);
virtual
void
TPResult
(
DuelPlayer
*
dp
,
unsigned
char
tp
);
virtual
void
Process
();
virtual
void
Surrender
(
DuelPlayer
*
dp
);
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
EndDuel
();
...
...
gframe/single_mode.cpp
View file @
4769836a
...
...
@@ -758,7 +758,7 @@ bool SingleMode::SinglePlayAnalyze(unsigned char* msg, unsigned int len) {
int
len
=
BufferIO
::
ReadInt16
(
pbuf
);
auto
begin
=
pbuf
;
pbuf
+=
len
+
1
;
memcpy
(
namebuf
,
begin
,
len
+
1
);
std
::
memcpy
(
namebuf
,
begin
,
len
+
1
);
BufferIO
::
DecodeUTF8
(
namebuf
,
wname
);
BufferIO
::
CopyWStr
(
wname
,
mainGame
->
dInfo
.
clientname
,
20
);
break
;
...
...
@@ -769,7 +769,7 @@ bool SingleMode::SinglePlayAnalyze(unsigned char* msg, unsigned int len) {
int
len
=
BufferIO
::
ReadInt16
(
pbuf
);
auto
begin
=
pbuf
;
pbuf
+=
len
+
1
;
memcpy
(
msgbuf
,
begin
,
len
+
1
);
std
::
memcpy
(
msgbuf
,
begin
,
len
+
1
);
BufferIO
::
DecodeUTF8
(
msgbuf
,
msg
);
mainGame
->
gMutex
.
lock
();
mainGame
->
SetStaticText
(
mainGame
->
stMessage
,
310
,
mainGame
->
guiFont
,
msg
);
...
...
gframe/tag_duel.cpp
View file @
4769836a
...
...
@@ -16,17 +16,17 @@ TagDuel::TagDuel() {
}
TagDuel
::~
TagDuel
()
{
}
void
TagDuel
::
Chat
(
DuelPlayer
*
dp
,
void
*
pdata
,
int
len
)
{
STOC_Chat
scc
;
scc
.
player
=
dp
->
type
;
unsigned
short
*
msg
=
(
unsigned
short
*
)
pdata
;
int
msglen
=
BufferIO
::
CopyWStr
(
msg
,
scc
.
msg
,
256
)
;
void
TagDuel
::
Chat
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
int
len
)
{
unsigned
char
scc
[
SIZE_STOC_CHAT
]
;
const
auto
scc_size
=
NetServer
::
CreateChatPacket
(
pdata
,
len
,
scc
,
dp
->
type
)
;
if
(
!
scc_size
)
return
;
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
)
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
(
dp
->
game
&&
dp
->
type
!=
0xff
)
{
STOC_ErrorMsg
scem
;
...
...
@@ -36,7 +36,9 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
NetServer
::
DisconnectPlayer
(
dp
);
return
;
}
CTOS_JoinGame
*
pkt
=
(
CTOS_JoinGame
*
)
pdata
;
CTOS_JoinGame
packet
;
std
::
memcpy
(
&
packet
,
pdata
,
sizeof
packet
);
const
auto
*
pkt
=
&
packet
;
/* disabled version check
if(pkt->version != PRO_VERSION) {
STOC_ErrorMsg scem;
...
...
@@ -257,22 +259,32 @@ void TagDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
return
;
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
])
return
;
unsigned
char
*
deckbuf
=
(
unsigned
char
*
)
pdata
;
if
(
len
<=
8
||
len
%
sizeof
(
int32_t
)
!=
0
)
return
;
bool
valid
=
true
;
auto
deckbuf
=
pdata
;
int
mainc
=
BufferIO
::
ReadInt32
(
deckbuf
);
int
sidec
=
BufferIO
::
ReadInt32
(
deckbuf
);
// verify data
const
unsigned
int
possibleMaxLength
=
(
len
-
8
)
/
4
;
if
((
unsigned
)
mainc
>
possibleMaxLength
||
(
unsigned
)
sidec
>
possibleMaxLength
||
(
unsigned
)
mainc
+
(
unsigned
)
sidec
>
possibleMaxLength
)
{
const
int
deck_size
=
len
-
2
*
sizeof
(
int32_t
);
if
(
mainc
<
DECK_MIN_SIZE
||
mainc
>
DECK_MAX_SIZE
+
EXTRA_MAX_SIZE
)
valid
=
false
;
else
if
(
sidec
<
0
||
sidec
>
SIDE_MAX_SIZE
)
valid
=
false
;
else
if
(
deck_size
!=
(
mainc
+
sidec
)
*
(
int
)
sizeof
(
int32_t
))
valid
=
false
;
if
(
!
valid
)
{
STOC_ErrorMsg
scem
;
scem
.
msg
=
ERRMSG_DECKERROR
;
scem
.
code
=
0
;
NetServer
::
SendPacketToPlayer
(
dp
,
STOC_ERROR_MSG
,
scem
);
return
;
}
deck_error
[
dp
->
type
]
=
deckManager
.
LoadDeck
(
pdeck
[
dp
->
type
],
(
int
*
)
deckbuf
,
mainc
,
sidec
);
int
deck_list
[
DECK_MAX_SIZE
+
EXTRA_MAX_SIZE
+
SIDE_MAX_SIZE
];
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
)
{
if
(
dp
!=
host_player
)
...
...
@@ -298,9 +310,9 @@ void TagDuel::StartDuel(DuelPlayer* dp) {
NetServer
::
SendBufferToPlayer
(
players
[
0
],
STOC_DECK_COUNT
,
deckbuff
,
12
);
NetServer
::
ReSendToPlayer
(
players
[
1
]);
char
tempbuff
[
6
];
memcpy
(
tempbuff
,
deckbuff
,
6
);
memcpy
(
deckbuff
,
deckbuff
+
6
,
6
);
memcpy
(
deckbuff
+
6
,
tempbuff
,
6
);
std
::
memcpy
(
tempbuff
,
deckbuff
,
6
);
std
::
memcpy
(
deckbuff
,
deckbuff
+
6
,
6
);
std
::
memcpy
(
deckbuff
+
6
,
tempbuff
,
6
);
NetServer
::
SendBufferToPlayer
(
players
[
2
],
STOC_DECK_COUNT
,
deckbuff
,
12
);
NetServer
::
ReSendToPlayer
(
players
[
3
]);
NetServer
::
SendPacketToPlayer
(
players
[
0
],
STOC_SELECT_HAND
);
...
...
@@ -1540,11 +1552,11 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
}
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
];
if
(
len
>
SIZE_RETURN_VALUE
)
len
=
SIZE_RETURN_VALUE
;
memcpy
(
resb
,
pdata
,
len
);
std
::
memcpy
(
resb
,
pdata
,
len
);
last_replay
.
WriteInt8
(
len
);
last_replay
.
WriteData
(
resb
,
len
);
set_responseb
(
pduel
,
resb
);
...
...
@@ -1563,9 +1575,9 @@ void TagDuel::EndDuel() {
return
;
last_replay
.
EndRecord
();
char
replaybuf
[
0x2000
],
*
pbuf
=
replaybuf
;
memcpy
(
pbuf
,
&
last_replay
.
pheader
,
sizeof
(
ReplayHeader
));
std
::
memcpy
(
pbuf
,
&
last_replay
.
pheader
,
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
::
ReSendToPlayer
(
players
[
1
]);
NetServer
::
ReSendToPlayer
(
players
[
2
]);
...
...
@@ -1611,10 +1623,6 @@ inline int TagDuel::WriteUpdateData(int& player, int location, int& flag, unsign
int
len
=
query_field_card
(
pduel
,
player
,
location
,
flag
,
qbuf
,
use_cache
);
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
)
{
std
::
vector
<
unsigned
char
>
query_buffer
;
query_buffer
.
resize
(
SIZE_QUERY_BUFFER
);
...
...
gframe/tag_duel.h
View file @
4769836a
...
...
@@ -11,21 +11,21 @@ class TagDuel: public DuelMode {
public:
TagDuel
();
virtual
~
TagDuel
();
virtual
void
Chat
(
DuelPlayer
*
dp
,
void
*
pdata
,
int
len
);
virtual
void
JoinGame
(
DuelPlayer
*
dp
,
void
*
pdata
,
bool
is_creater
);
virtual
void
Chat
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
int
len
);
virtual
void
JoinGame
(
DuelPlayer
*
dp
,
unsigned
char
*
pdata
,
bool
is_creater
);
virtual
void
LeaveGame
(
DuelPlayer
*
dp
);
virtual
void
ToDuelist
(
DuelPlayer
*
dp
);
virtual
void
ToObserver
(
DuelPlayer
*
dp
);
virtual
void
PlayerReady
(
DuelPlayer
*
dp
,
bool
ready
);
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
HandResult
(
DuelPlayer
*
dp
,
unsigned
char
res
);
virtual
void
TPResult
(
DuelPlayer
*
dp
,
unsigned
char
tp
);
virtual
void
Process
();
virtual
void
Surrender
(
DuelPlayer
*
dp
);
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
EndDuel
();
...
...
ocgcore
@
47c224db
Subproject commit
7b4f8ec113d598de98598f651f3b542931f50d27
Subproject commit
47c224dbac247767b3eb55068d08f68645089b11
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