Commit 927c8caf authored by wind2009's avatar wind2009

Merge remote-tracking branch 'upstream/master' into develop

parents 5862743a 490da977
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <cstdint> #include <cstdint>
#include <cstring> #include <cstring>
#include <cwchar> #include <cwchar>
#include <vector>
class BufferIO { class BufferIO {
public: public:
...@@ -15,11 +16,21 @@ public: ...@@ -15,11 +16,21 @@ public:
return ret; return ret;
} }
template<typename T> template<typename T>
static void Write(unsigned char*& p, T value) { static void Write(unsigned char*& p, const T& value) {
std::memcpy(p, &value, sizeof(T)); std::memcpy(p, &value, sizeof(T));
p += sizeof(T); p += sizeof(T);
} }
static void VectorWriteBlock(std::vector<unsigned char>& buffer, const void* src, size_t size) {
const auto len = buffer.size();
buffer.resize(len + size);
std::memcpy(buffer.data() + len, src, size);
}
template<typename T>
static void VectorWrite(std::vector<unsigned char>& buffer, const T& value) {
VectorWriteBlock(buffer, &value, sizeof(T));
}
// for compatibility // for compatibility
[[deprecated]] [[deprecated]]
static int32_t ReadInt32(unsigned char*& p) { static int32_t ReadInt32(unsigned char*& p) {
......
...@@ -702,17 +702,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -702,17 +702,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
} }
mainGame->ClearCardInfo(); mainGame->ClearCardInfo();
unsigned char deckbuf[1024]{}; DuelClient::SendUpdateDeck(deckManager.current_deck);
auto pdeck = deckbuf;
BufferIO::Write<int32_t>(pdeck, static_cast<int32_t>(deckManager.current_deck.main.size() + deckManager.current_deck.extra.size()));
BufferIO::Write<int32_t>(pdeck, static_cast<int32_t>(deckManager.current_deck.side.size()));
for(size_t i = 0; i < deckManager.current_deck.main.size(); ++i)
BufferIO::Write<uint32_t>(pdeck, deckManager.current_deck.main[i]->first);
for(size_t i = 0; i < deckManager.current_deck.extra.size(); ++i)
BufferIO::Write<uint32_t>(pdeck, deckManager.current_deck.extra[i]->first);
for(size_t i = 0; i < deckManager.current_deck.side.size(); ++i)
BufferIO::Write<uint32_t>(pdeck, deckManager.current_deck.side[i]->first);
DuelClient::SendBufferToServer(CTOS_UPDATE_DECK, deckbuf, pdeck - deckbuf);
break; break;
} }
case BUTTON_SIDE_RELOAD: { case BUTTON_SIDE_RELOAD: {
......
...@@ -829,11 +829,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) { ...@@ -829,11 +829,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) {
break; break;
} }
case STOC_HS_PLAYER_ENTER: { case STOC_HS_PLAYER_ENTER: {
if (len < 1 + STOC_HS_PlayerEnter_size) if (len < 1 + sizeof(STOC_HS_PlayerEnter))
return; return;
soundManager.PlaySoundEffect(SOUND_PLAYER_ENTER); soundManager.PlaySoundEffect(SOUND_PLAYER_ENTER);
STOC_HS_PlayerEnter packet; STOC_HS_PlayerEnter packet;
std::memcpy(&packet, pdata, STOC_HS_PlayerEnter_size); std::memcpy(&packet, pdata, sizeof(STOC_HS_PlayerEnter));
auto pkt = &packet; auto pkt = &packet;
if(pkt->pos > 3) if(pkt->pos > 3)
break; break;
...@@ -2942,7 +2942,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) { ...@@ -2942,7 +2942,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, int len) {
pcard->SetCode(code); pcard->SetCode(code);
pcard->position = cp; pcard->position = cp;
if(!mainGame->dInfo.isReplay || !mainGame->dInfo.isReplaySkiping) { if(!mainGame->dInfo.isReplay || !mainGame->dInfo.isReplaySkiping) {
soundManager.PlaySoundEffect(SOUND_FILP); soundManager.PlaySoundEffect(SOUND_FLIP);
myswprintf(event_string, dataManager.GetSysString(1607), dataManager.GetName(code)); myswprintf(event_string, dataManager.GetSysString(1607), dataManager.GetName(code));
mainGame->dField.MoveCard(pcard, 10); mainGame->dField.MoveCard(pcard, 10);
mainGame->WaitFrameSignal(11); mainGame->WaitFrameSignal(11);
...@@ -4067,6 +4067,19 @@ void DuelClient::SendResponse() { ...@@ -4067,6 +4067,19 @@ void DuelClient::SendResponse() {
SendBufferToServer(CTOS_RESPONSE, response_buf, response_len); SendBufferToServer(CTOS_RESPONSE, response_buf, response_len);
} }
} }
void DuelClient::SendUpdateDeck(const Deck& deck) {
std::vector<unsigned char> deckbuf;
deckbuf.reserve(1024);
BufferIO::VectorWrite<int32_t>(deckbuf, static_cast<int32_t>(deck.main.size() + deck.extra.size()));
BufferIO::VectorWrite<int32_t>(deckbuf, static_cast<int32_t>(deck.side.size()));
for (const auto& card: deck.main)
BufferIO::VectorWrite<uint32_t>(deckbuf, card->first);
for (const auto& card: deck.extra)
BufferIO::VectorWrite<uint32_t>(deckbuf, card->first);
for (const auto& card: deck.side)
BufferIO::VectorWrite<uint32_t>(deckbuf, card->first);
SendBufferToServer(CTOS_UPDATE_DECK, deckbuf.data(), deckbuf.size());
}
void DuelClient::BeginRefreshHost() { void DuelClient::BeginRefreshHost() {
if(is_refreshing) if(is_refreshing)
return; return;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <set> #include <set>
#include <random> #include <random>
#include "config.h" #include "config.h"
#include "deck_manager.h"
#include "network.h" #include "network.h"
namespace ygo { namespace ygo {
...@@ -48,6 +49,7 @@ public: ...@@ -48,6 +49,7 @@ public:
static void SetResponseI(int32_t respI); static void SetResponseI(int32_t respI);
static void SetResponseB(void* respB, size_t len); static void SetResponseB(void* respB, size_t len);
static void SendResponse(); static void SendResponse();
static void SendUpdateDeck(const Deck& deck);
static void SendPacketToServer(unsigned char proto) { static void SendPacketToServer(unsigned char proto) {
auto p = duel_client_write; auto p = duel_client_write;
BufferIO::Write<uint16_t>(p, 1); BufferIO::Write<uint16_t>(p, 1);
......
...@@ -15,17 +15,7 @@ namespace ygo { ...@@ -15,17 +15,7 @@ namespace ygo {
void UpdateDeck() { void UpdateDeck() {
BufferIO::CopyWideString(mainGame->cbCategorySelect->getText(), mainGame->gameConf.lastcategory); BufferIO::CopyWideString(mainGame->cbCategorySelect->getText(), mainGame->gameConf.lastcategory);
BufferIO::CopyWideString(mainGame->cbDeckSelect->getText(), mainGame->gameConf.lastdeck); BufferIO::CopyWideString(mainGame->cbDeckSelect->getText(), mainGame->gameConf.lastdeck);
unsigned char deckbuf[1024]{}; DuelClient::SendUpdateDeck(deckManager.current_deck);
auto pdeck = deckbuf;
BufferIO::Write<int32_t>(pdeck, static_cast<int32_t>(deckManager.current_deck.main.size() + deckManager.current_deck.extra.size()));
BufferIO::Write<int32_t>(pdeck, static_cast<int32_t>(deckManager.current_deck.side.size()));
for(size_t i = 0; i < deckManager.current_deck.main.size(); ++i)
BufferIO::Write<uint32_t>(pdeck, deckManager.current_deck.main[i]->first);
for(size_t i = 0; i < deckManager.current_deck.extra.size(); ++i)
BufferIO::Write<uint32_t>(pdeck, deckManager.current_deck.extra[i]->first);
for(size_t i = 0; i < deckManager.current_deck.side.size(); ++i)
BufferIO::Write<uint32_t>(pdeck, deckManager.current_deck.side[i]->first);
DuelClient::SendBufferToServer(CTOS_UPDATE_DECK, deckbuf, pdeck - deckbuf);
} }
bool MenuHandler::OnEvent(const irr::SEvent& event) { bool MenuHandler::OnEvent(const irr::SEvent& event) {
if(mainGame->dField.OnCommonEvent(event)) if(mainGame->dField.OnCommonEvent(event))
......
...@@ -172,14 +172,14 @@ constexpr int LEN_CHAT_PLAYER = 1; ...@@ -172,14 +172,14 @@ constexpr int LEN_CHAT_PLAYER = 1;
constexpr int LEN_CHAT_MSG = 256; constexpr int LEN_CHAT_MSG = 256;
constexpr int SIZE_STOC_CHAT = (LEN_CHAT_PLAYER + LEN_CHAT_MSG) * sizeof(uint16_t); constexpr int SIZE_STOC_CHAT = (LEN_CHAT_PLAYER + LEN_CHAT_MSG) * sizeof(uint16_t);
#pragma pack(push, 1)
struct STOC_HS_PlayerEnter { struct STOC_HS_PlayerEnter {
uint16_t name[20]{}; uint16_t name[20]{};
uint8_t pos{}; uint8_t pos{};
// byte padding[1]
}; };
#pragma pack(pop)
check_trivially_copyable(STOC_HS_PlayerEnter); check_trivially_copyable(STOC_HS_PlayerEnter);
//static_assert(sizeof(STOC_HS_PlayerEnter) == 42, "size mismatch: STOC_HS_PlayerEnter"); static_assert(sizeof(STOC_HS_PlayerEnter) == 41, "size mismatch: STOC_HS_PlayerEnter");
constexpr int STOC_HS_PlayerEnter_size = 41; //workwround
struct STOC_HS_PlayerChange { struct STOC_HS_PlayerChange {
//pos<<4 | state //pos<<4 | state
......
...@@ -106,7 +106,7 @@ void SoundManager::PlaySoundEffect(int sound) { ...@@ -106,7 +106,7 @@ void SoundManager::PlaySoundEffect(int sound) {
strcpy(soundName, "set"); strcpy(soundName, "set");
break; break;
} }
case SOUND_FILP: { case SOUND_FLIP: {
strcpy(soundName, "flip"); strcpy(soundName, "flip");
break; break;
} }
......
...@@ -54,7 +54,7 @@ extern SoundManager soundManager; ...@@ -54,7 +54,7 @@ extern SoundManager soundManager;
#define SOUND_SPECIAL_SUMMON 102 #define SOUND_SPECIAL_SUMMON 102
#define SOUND_ACTIVATE 103 #define SOUND_ACTIVATE 103
#define SOUND_SET 104 #define SOUND_SET 104
#define SOUND_FILP 105 #define SOUND_FLIP 105
#define SOUND_REVEAL 106 #define SOUND_REVEAL 106
#define SOUND_EQUIP 107 #define SOUND_EQUIP 107
#define SOUND_DESTROYED 108 #define SOUND_DESTROYED 108
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment