11#include < array>
2+ #include < utility>
23#include " config.h"
34#include " tag_duel.h"
45#include " netserver.h"
@@ -954,10 +955,14 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
954955 int cc = pbuf[8 ];
955956 int cl = pbuf[9 ];
956957 int cs = pbuf[10 ];
957- int cp = pbuf[11 ];
958+ uint8_t cp = pbuf[11 ];
959+ const bool hide_code = NetServer::ShouldHideFacedownCode (cp);
960+ if (cl & LOCATION_ONFIELD )
961+ cp = NetServer::StripRevealFlag (pbufw, 8 );
958962 pbuf += 16 ;
959963 NetServer::SendBufferToPlayer (cur_player[cc], STOC_GAME_MSG , offset, pbuf - offset);
960- if (!(cl & (LOCATION_GRAVE + LOCATION_OVERLAY )) && ((cl & (LOCATION_DECK + LOCATION_HAND )) || (cp & POS_FACEDOWN )))
964+ if (!(cl & (LOCATION_GRAVE | LOCATION_OVERLAY ))
965+ && ((cl & (LOCATION_DECK | LOCATION_HAND )) || hide_code))
961966 BufferIO::Write<int32_t >(pbufw, 0 );
962967 for (int i = 0 ; i < 4 ; ++i)
963968 if (players[i] != cur_player[cc])
@@ -1052,12 +1057,14 @@ int TagDuel::Analyze(unsigned char* msgbuffer, unsigned int len) {
10521057 int cc = pbuf[4 ];
10531058 /* int cl = pbuf[5];*/
10541059 /* int cs = pbuf[6];*/
1055- int cp = pbuf[7 ];
1060+ uint8_t cp = pbuf[7 ];
1061+ const bool hide_code = NetServer::ShouldHideFacedownCode (cp);
1062+ cp = NetServer::StripRevealFlag (pbufw, 4 );
10561063 pbuf += 8 ;
10571064 auto pid = (cc == 0 ) ? 0 : 2 ;
10581065 NetServer::SendBufferToPlayer (players[pid], STOC_GAME_MSG , offset, pbuf - offset);
10591066 NetServer::ReSendToPlayer (players[pid + 1 ]);
1060- if (cp & POS_FACEDOWN )
1067+ if (hide_code )
10611068 BufferIO::Write<int32_t >(pbufw, 0 );
10621069 pid = 2 - pid;
10631070 NetServer::SendBufferToPlayer (players[pid], STOC_GAME_MSG , offset, pbuf - offset);
@@ -1596,20 +1603,25 @@ void TagDuel::RefreshMzone(int player, int flag, int use_cache) {
15961603 std::array<unsigned char , SIZE_QUERY_BUFFER > query_buffer;
15971604 auto qbuf = query_buffer.data ();
15981605 auto len = WriteUpdateData (player, LOCATION_MZONE , flag, qbuf, use_cache);
1606+ std::vector<std::pair<unsigned char *, int >> hidden_segments;
15991607 int pid = (player == 0 ) ? 0 : 2 ;
1600- NetServer::SendBufferToPlayer (players[pid], STOC_GAME_MSG , query_buffer.data (), len + 3 );
1601- NetServer::ReSendToPlayer (players[pid + 1 ]);
16021608 int qlen = 0 ;
16031609 while (qlen < len) {
16041610 int clen = BufferIO::Read<int32_t >(qbuf);
16051611 qlen += clen;
16061612 if (clen <= LEN_HEADER )
16071613 continue ;
16081614 auto position = GetPosition (qbuf, 8 );
1609- if (position & POS_FACEDOWN )
1610- std::memset (qbuf, 0 , clen - 4 );
1615+ const bool hide_code = NetServer::ShouldHideFacedownCode (position);
1616+ position = NetServer::StripRevealFlag (qbuf, 8 );
1617+ if (hide_code)
1618+ hidden_segments.emplace_back (qbuf, clen);
16111619 qbuf += clen - 4 ;
16121620 }
1621+ NetServer::SendBufferToPlayer (players[pid], STOC_GAME_MSG , query_buffer.data (), len + 3 );
1622+ NetServer::ReSendToPlayer (players[pid + 1 ]);
1623+ for (const auto & segment : hidden_segments)
1624+ std::memset (segment.first , 0 , segment.second - 4 );
16131625 pid = 2 - pid;
16141626 NetServer::SendBufferToPlayer (players[pid], STOC_GAME_MSG , query_buffer.data (), len + 3 );
16151627 NetServer::ReSendToPlayer (players[pid + 1 ]);
@@ -1620,20 +1632,25 @@ void TagDuel::RefreshSzone(int player, int flag, int use_cache) {
16201632 std::array<unsigned char , SIZE_QUERY_BUFFER > query_buffer;
16211633 auto qbuf = query_buffer.data ();
16221634 auto len = WriteUpdateData (player, LOCATION_SZONE , flag, qbuf, use_cache);
1635+ std::vector<std::pair<unsigned char *, int >> hidden_segments;
16231636 int pid = (player == 0 ) ? 0 : 2 ;
1624- NetServer::SendBufferToPlayer (players[pid], STOC_GAME_MSG , query_buffer.data (), len + 3 );
1625- NetServer::ReSendToPlayer (players[pid + 1 ]);
16261637 int qlen = 0 ;
16271638 while (qlen < len) {
16281639 int clen = BufferIO::Read<int32_t >(qbuf);
16291640 qlen += clen;
16301641 if (clen <= LEN_HEADER )
16311642 continue ;
16321643 auto position = GetPosition (qbuf, 8 );
1633- if (position & POS_FACEDOWN )
1634- std::memset (qbuf, 0 , clen - 4 );
1644+ const bool hide_code = NetServer::ShouldHideFacedownCode (position);
1645+ position = NetServer::StripRevealFlag (qbuf, 8 );
1646+ if (hide_code)
1647+ hidden_segments.emplace_back (qbuf, clen);
16351648 qbuf += clen - 4 ;
16361649 }
1650+ NetServer::SendBufferToPlayer (players[pid], STOC_GAME_MSG , query_buffer.data (), len + 3 );
1651+ NetServer::ReSendToPlayer (players[pid + 1 ]);
1652+ for (const auto & segment : hidden_segments)
1653+ std::memset (segment.first , 0 , segment.second - 4 );
16371654 pid = 2 - pid;
16381655 NetServer::SendBufferToPlayer (players[pid], STOC_GAME_MSG , query_buffer.data (), len + 3 );
16391656 NetServer::ReSendToPlayer (players[pid + 1 ]);
@@ -1689,12 +1706,20 @@ void TagDuel::RefreshSingle(int player, int location, int sequence, int flag) {
16891706 BufferIO::Write<uint8_t >(qbuf, sequence);
16901707 int len = query_card (pduel, player, location, sequence, flag, qbuf, 0 );
16911708 int pid = (player == 0 ) ? 0 : 2 ;
1692- NetServer::SendBufferToPlayer (players[pid], STOC_GAME_MSG , query_buffer, len + 4 );
1693- NetServer::ReSendToPlayer (players[pid + 1 ] );
1694- if (len <= LEN_HEADER )
1709+ if ( len <= LEN_HEADER ) {
1710+ NetServer::SendBufferToPlayer (players[pid], STOC_GAME_MSG , query_buffer, len + 4 );
1711+ NetServer::ReSendToPlayer (players[pid + 1 ]);
16951712 return ;
1713+ }
16961714 auto position = GetPosition (qbuf, 12 );
1697- if (position & POS_FACEDOWN ) {
1715+ bool hide_code = position & POS_FACEDOWN ;
1716+ if (location & LOCATION_ONFIELD ) {
1717+ hide_code = NetServer::ShouldHideFacedownCode (position);
1718+ position = NetServer::StripRevealFlag (qbuf, 12 );
1719+ }
1720+ NetServer::SendBufferToPlayer (players[pid], STOC_GAME_MSG , query_buffer, len + 4 );
1721+ NetServer::ReSendToPlayer (players[pid + 1 ]);
1722+ if (hide_code) {
16981723 BufferIO::Write<int32_t >(qbuf, 16 );
16991724 BufferIO::Write<uint32_t >(qbuf, QUERY_CODE | QUERY_POSITION );
17001725 BufferIO::Write<uint32_t >(qbuf, 0 );
0 commit comments