Skip to content
14 changes: 8 additions & 6 deletions gframe/client_card.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

namespace ygo {

ClientCard::ClientCard(ClientField* field) : field_(field) {
}
ClientCard::~ClientCard() {
ClearTarget();
if (equipTarget) {
Expand Down Expand Up @@ -41,7 +43,7 @@ void ClientCard::SetCode(unsigned int x) {
}
code = x;
if (location == LOCATION_HAND) {
mainGame->dField.MoveCard(this, 5);
field_->MoveCard(this, 5);
}
}
void ClientCard::UpdateInfo(unsigned char* buf) {
Expand All @@ -60,7 +62,7 @@ void ClientCard::UpdateInfo(unsigned char* buf) {
int pdata = (BufferIO::Read<int32_t>(buf) >> 24) & 0xff;
if((location & (LOCATION_EXTRA | LOCATION_REMOVED)) && pdata != position) {
position = pdata;
mainGame->dField.MoveCard(this, 1);
field_->MoveCard(this, 1);
} else
position = pdata;
}
Expand Down Expand Up @@ -118,7 +120,7 @@ void ClientCard::UpdateInfo(unsigned char* buf) {
unsigned int l = BufferIO::Read<uint8_t>(buf);
int s = BufferIO::Read<uint8_t>(buf);
BufferIO::Read<uint8_t>(buf);
ClientCard* ecard = mainGame->dField.GetCard(mainGame->LocalPlayer(c), l, s);
ClientCard* ecard = field_->GetCard(mainGame->LocalPlayer(c), l, s);
if (ecard) {
equipTarget = ecard;
ecard->equipped.insert(this);
Expand All @@ -131,7 +133,7 @@ void ClientCard::UpdateInfo(unsigned char* buf) {
unsigned int l = BufferIO::Read<uint8_t>(buf);
int s = BufferIO::Read<uint8_t>(buf);
BufferIO::Read<uint8_t>(buf);
ClientCard* tcard = mainGame->dField.GetCard(mainGame->LocalPlayer(c), l, s);
ClientCard* tcard = field_->GetCard(mainGame->LocalPlayer(c), l, s);
if (tcard) {
cardTarget.insert(tcard);
tcard->ownerTarget.insert(this);
Expand All @@ -142,9 +144,9 @@ void ClientCard::UpdateInfo(unsigned char* buf) {
int count = BufferIO::Read<int32_t>(buf);
for(int i = 0; i < count; ++i) {
if(i >= overlayed.size()) {
ClientCard* xcard = new ClientCard;
ClientCard* xcard = field_->CreateCard();
overlayed.push_back(xcard);
mainGame->dField.overlay_cards.insert(xcard);
field_->overlay_cards.insert(xcard);
xcard->overlayTarget = this;
xcard->location = LOCATION_OVERLAY;
xcard->sequence = (unsigned char)(overlayed.size() - 1);
Expand Down
7 changes: 6 additions & 1 deletion gframe/client_card.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

namespace ygo {

class ClientField;

class ClientCard {
public:
irr::core::matrix4 mTransform;
Expand Down Expand Up @@ -73,13 +75,16 @@ class ClientCard {
wchar_t lscstring[16]{};
wchar_t rscstring[16]{};

ClientCard() = default;
ClientCard(ClientField* field);
~ClientCard();
void SetCode(unsigned int x);
void UpdateInfo(unsigned char* buf);
void ClearTarget();
void ClearData();
static bool client_card_sort(ClientCard* c1, ClientCard* c2);

private:
ClientField* field_{};
};

}
Expand Down
77 changes: 20 additions & 57 deletions gframe/client_field.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,81 +17,27 @@ ClientField::ClientField() {
}
rnd.seed(std::random_device()());
}
ClientField::~ClientField() {
for (int i = 0; i < 2; ++i) {
for (auto& card : deck[i]) {
delete card;
}
deck[i].clear();
for (auto& card : hand[i]) {
delete card;
}
hand[i].clear();
for (auto& card : mzone[i]) {
delete card;
card = nullptr;
}
for (auto& card : szone[i]) {
delete card;
card = nullptr;
}
for (auto& card : grave[i]) {
delete card;
}
grave[i].clear();
for (auto& card : remove[i]) {
delete card;
}
remove[i].clear();
for (auto& card : extra[i]) {
delete card;
}
extra[i].clear();
}
for (auto& card : overlay_cards) {
delete card;
}
overlay_cards.clear();
}
ClientField::~ClientField() = default;
void ClientField::Clear() {
for(int i = 0; i < 2; ++i) {
for (auto& card : deck[i]) {
delete card;
}
deck[i].clear();
for (auto& card : hand[i]) {
delete card;
}
hand[i].clear();
for (auto& card : mzone[i]) {
delete card;
card = nullptr;
}
for (auto& card : szone[i]) {
delete card;
card = nullptr;
}
for (auto& card : grave[i]) {
delete card;
}
grave[i].clear();
for (auto& card : remove[i]) {
delete card;
}
remove[i].clear();
for (auto& card : extra[i]) {
delete card;
}
extra[i].clear();
deck_act[i] = false;
grave_act[i] = false;
remove_act[i] = false;
extra_act[i] = false;
pzone_act[i] = false;
}
for (auto& card : overlay_cards) {
delete card;
}
cards_.clear();
overlay_cards.clear();
extra_p_count[0] = 0;
extra_p_count[1] = 0;
Expand Down Expand Up @@ -123,7 +69,7 @@ void ClientField::Clear() {
void ClientField::Initial(int player, int deckc, int extrac, int sidec) {
auto load_location = [&](std::vector<ClientCard*>& container, int count, uint8_t location) {
for(int i = 0; i < count; ++i) {
ClientCard* pcard = new ClientCard;
ClientCard* pcard = CreateCard();
container.push_back(pcard);
pcard->owner = player;
pcard->controler = player;
Expand All @@ -148,6 +94,23 @@ void ClientField::ResetSequence(std::vector<ClientCard*>& list, bool reset_heigh
}
}
}
ClientCard* ClientField::CreateCard() {
cards_.emplace_back(std::make_unique<ClientCard>(this));
return cards_.back().get();
}
void ClientField::DestroyCard(ClientCard* pcard) {
if (!pcard)
return;
overlay_cards.erase(pcard);
auto it = std::find_if(cards_.begin(), cards_.end(),
Comment thread
salix5 marked this conversation as resolved.
[pcard](const std::unique_ptr<ClientCard>& ptr) {
return ptr.get() == pcard;
});
if (it != cards_.end()) {
std::swap(*it, cards_.back());
cards_.pop_back();
}
}
ClientCard* ClientField::GetCard(int controler, int location, int sequence, int sub_seq) {
std::vector<ClientCard*>* lst = 0;
bool is_xyz = (location & LOCATION_OVERLAY) != 0;
Expand Down
6 changes: 6 additions & 0 deletions gframe/client_field.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <vector>
#include <set>
#include <map>
#include <memory>

namespace ygo {

Expand Down Expand Up @@ -96,6 +97,8 @@ class ClientField: public irr::IEventReceiver {
~ClientField() override;
void Clear();
void Initial(int player, int deckc, int extrac, int sidec = 0);
ClientCard* CreateCard();
void DestroyCard(ClientCard* pcard);
void ResetSequence(std::vector<ClientCard*>& list, bool reset_height);
ClientCard* GetCard(int controler, int location, int sequence, int sub_seq = 0);
void AddCard(ClientCard* pcard, int controler, int location, int sequence);
Expand Down Expand Up @@ -158,6 +161,9 @@ class ClientField: public irr::IEventReceiver {
void SetResponseSelectedCards() const;
void SetResponseSelectedOption() const;
void CancelOrFinish();

private:
std::vector<std::unique_ptr<ClientCard>> cards_;
};

}
Expand Down
42 changes: 21 additions & 21 deletions gframe/duelclient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2604,7 +2604,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, size_t len) {
}
int appear = mainGame->gameConf.quick_animation ? 12 : 20;
if (pl == 0) {
ClientCard* pcard = new ClientCard;
ClientCard* pcard = mainGame->dField.CreateCard();
pcard->position = cp;
pcard->SetCode(code);
if(!mainGame->dInfo.isReplay || !mainGame->dInfo.isReplaySkiping) {
Expand All @@ -2622,8 +2622,8 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, size_t len) {
if (code != 0 && pcard->code != code)
pcard->SetCode(code);
pcard->ClearTarget();
for(auto eqit = pcard->equipped.begin(); eqit != pcard->equipped.end(); ++eqit)
(*eqit)->equipTarget = 0;
for (auto& equip_card : pcard->equipped)
equip_card->equipTarget = nullptr;
if(!mainGame->dInfo.isReplay || !mainGame->dInfo.isReplaySkiping) {
mainGame->dField.FadeCard(pcard, 5, appear);
mainGame->WaitFrameSignal(appear);
Expand All @@ -2634,7 +2634,7 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, size_t len) {
mainGame->dField.hovered_card = 0;
} else
mainGame->dField.RemoveCard(pc, pl, ps);
delete pcard;
mainGame->dField.DestroyCard(pcard);
Comment thread
salix5 marked this conversation as resolved.
Outdated
} else {
if (!(pl & LOCATION_OVERLAY) && !(cl & LOCATION_OVERLAY)) {
ClientCard* pcard = mainGame->dField.GetCard(pc, pl, ps);
Expand Down Expand Up @@ -3814,13 +3814,13 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, size_t len) {
mainGame->gMutex.lock();
if(mainGame->dField.deck[player].size() > mcount) {
while(mainGame->dField.deck[player].size() > mcount) {
ClientCard* ccard = *mainGame->dField.deck[player].rbegin();
ClientCard* ccard = mainGame->dField.deck[player].back();
mainGame->dField.deck[player].pop_back();
delete ccard;
mainGame->dField.DestroyCard(ccard);
}
} else {
while(mainGame->dField.deck[player].size() < mcount) {
ClientCard* ccard = new ClientCard;
ClientCard* ccard = mainGame->dField.CreateCard();
ccard->controler = player;
ccard->location = LOCATION_DECK;
ccard->sequence = (unsigned char)mainGame->dField.deck[player].size();
Expand All @@ -3829,13 +3829,13 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, size_t len) {
}
if(mainGame->dField.hand[player].size() > hcount) {
while(mainGame->dField.hand[player].size() > hcount) {
ClientCard* ccard = *mainGame->dField.hand[player].rbegin();
ClientCard* ccard = mainGame->dField.hand[player].back();
mainGame->dField.hand[player].pop_back();
delete ccard;
mainGame->dField.DestroyCard(ccard);
}
} else {
while(mainGame->dField.hand[player].size() < hcount) {
ClientCard* ccard = new ClientCard;
ClientCard* ccard = mainGame->dField.CreateCard();
ccard->controler = player;
ccard->location = LOCATION_HAND;
ccard->sequence = (unsigned char)mainGame->dField.hand[player].size();
Expand All @@ -3844,13 +3844,13 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, size_t len) {
}
if(mainGame->dField.extra[player].size() > ecount) {
while(mainGame->dField.extra[player].size() > ecount) {
ClientCard* ccard = *mainGame->dField.extra[player].rbegin();
ClientCard* ccard = mainGame->dField.extra[player].back();
mainGame->dField.extra[player].pop_back();
delete ccard;
mainGame->dField.DestroyCard(ccard);
}
} else {
while(mainGame->dField.extra[player].size() < ecount) {
ClientCard* ccard = new ClientCard;
ClientCard* ccard = mainGame->dField.CreateCard();
ccard->controler = player;
ccard->location = LOCATION_EXTRA;
ccard->sequence = (unsigned char)mainGame->dField.extra[player].size();
Expand Down Expand Up @@ -3905,13 +3905,13 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, size_t len) {
for(int seq = 0; seq < 7; ++seq) {
val = BufferIO::Read<uint8_t>(pbuf);
if(val) {
ClientCard* ccard = new ClientCard;
ClientCard* ccard = mainGame->dField.CreateCard();
mainGame->dField.AddCard(ccard, p, LOCATION_MZONE, seq);
ccard->position = BufferIO::Read<uint8_t>(pbuf);
val = BufferIO::Read<uint8_t>(pbuf);
if(val) {
for(int xyz = 0; xyz < val; ++xyz) {
ClientCard* xcard = new ClientCard;
ClientCard* xcard = mainGame->dField.CreateCard();
ccard->overlayed.push_back(xcard);
mainGame->dField.overlay_cards.insert(xcard);
xcard->overlayTarget = ccard;
Expand All @@ -3926,34 +3926,34 @@ bool DuelClient::ClientAnalyze(unsigned char* msg, size_t len) {
for(int seq = 0; seq < 8; ++seq) {
val = BufferIO::Read<uint8_t>(pbuf);
if(val) {
ClientCard* ccard = new ClientCard;
ClientCard* ccard = mainGame->dField.CreateCard();
mainGame->dField.AddCard(ccard, p, LOCATION_SZONE, seq);
ccard->position = BufferIO::Read<uint8_t>(pbuf);
}
}
val = BufferIO::Read<uint8_t>(pbuf);
for(int seq = 0; seq < val; ++seq) {
ClientCard* ccard = new ClientCard;
ClientCard* ccard = mainGame->dField.CreateCard();
mainGame->dField.AddCard(ccard, p, LOCATION_DECK, seq);
}
val = BufferIO::Read<uint8_t>(pbuf);
for(int seq = 0; seq < val; ++seq) {
ClientCard* ccard = new ClientCard;
ClientCard* ccard = mainGame->dField.CreateCard();
mainGame->dField.AddCard(ccard, p, LOCATION_HAND, seq);
}
val = BufferIO::Read<uint8_t>(pbuf);
for(int seq = 0; seq < val; ++seq) {
ClientCard* ccard = new ClientCard;
ClientCard* ccard = mainGame->dField.CreateCard();
mainGame->dField.AddCard(ccard, p, LOCATION_GRAVE, seq);
}
val = BufferIO::Read<uint8_t>(pbuf);
for(int seq = 0; seq < val; ++seq) {
ClientCard* ccard = new ClientCard;
ClientCard* ccard = mainGame->dField.CreateCard();
mainGame->dField.AddCard(ccard, p, LOCATION_REMOVED, seq);
}
val = BufferIO::Read<uint8_t>(pbuf);
for(int seq = 0; seq < val; ++seq) {
ClientCard* ccard = new ClientCard;
ClientCard* ccard = mainGame->dField.CreateCard();
mainGame->dField.AddCard(ccard, p, LOCATION_EXTRA, seq);
}
val = BufferIO::Read<uint8_t>(pbuf);
Expand Down
Loading