Skip to content

Commit 89e31c6

Browse files
committed
Merge branch 'fh' into patch-select-chain-forced
2 parents fd1c98e + 4922ba5 commit 89e31c6

42 files changed

Lines changed: 925 additions & 413 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build.yml

Lines changed: 338 additions & 80 deletions
Large diffs are not rendered by default.

gframe/CGUITTFont.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
john@suckerfreegames.com
2929
*/
3030

31+
#define _IRR_STATIC_LIB_
3132
#include <irrlicht.h>
3233
#include "CGUITTFont.h"
3334

gframe/bufferio.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class BufferIO {
3232
* @brief Copy a C-style string to another C-style string.
3333
* @param src The source wide string
3434
* @param pstr The destination char string
35-
* @param bufsize The size of the destination buffer
35+
* @param bufsize The length of the destination buffer
3636
* @return The length of the copied string
3737
*/
3838
template<typename T1, typename T2>
@@ -62,13 +62,13 @@ class BufferIO {
6262
}
6363
template<size_t N>
6464
static void CopyString(const char* src, char(&dst)[N]) {
65-
dst[0] = 0;
66-
std::strncat(dst, src, N - 1);
65+
std::strncpy(dst, src, N - 1);
66+
dst[N - 1] = 0;
6767
}
6868
template<size_t N>
6969
static void CopyWideString(const wchar_t* src, wchar_t(&dst)[N]) {
70-
dst[0] = 0;
71-
std::wcsncat(dst, src, N - 1);
70+
std::wcsncpy(dst, src, N - 1);
71+
dst[N - 1] = 0;
7272
}
7373
template<typename T>
7474
static bool CheckUTF8Byte(const T* str, int len) {

gframe/client_field.cpp

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
#include "image_manager.h"
77
#include "game.h"
88
#include "materials.h"
9-
#include "../ocgcore/common.h"
109

1110
namespace ygo {
1211

@@ -15,7 +14,7 @@ ClientField::ClientField() {
1514
mzone[p].resize(7, 0);
1615
szone[p].resize(8, 0);
1716
}
18-
rnd.reset((uint_fast32_t)std::random_device()());
17+
rnd.seed(std::random_device()());
1918
}
2019
ClientField::~ClientField() {
2120
for (int i = 0; i < 2; ++i) {
@@ -119,28 +118,23 @@ void ClientField::Clear() {
119118
tag_surrender = false;
120119
tag_teammate_surrender = false;
121120
}
122-
void ClientField::Initial(int player, int deckc, int extrac) {
123-
ClientCard* pcard;
124-
for(int i = 0; i < deckc; ++i) {
125-
pcard = new ClientCard;
126-
deck[player].push_back(pcard);
127-
pcard->owner = player;
128-
pcard->controler = player;
129-
pcard->location = LOCATION_DECK;
130-
pcard->sequence = i;
131-
pcard->position = POS_FACEDOWN_DEFENSE;
132-
GetCardLocation(pcard, &pcard->curPos, &pcard->curRot, true);
133-
}
134-
for(int i = 0; i < extrac; ++i) {
135-
pcard = new ClientCard;
136-
extra[player].push_back(pcard);
137-
pcard->owner = player;
138-
pcard->controler = player;
139-
pcard->location = LOCATION_EXTRA;
140-
pcard->sequence = i;
141-
pcard->position = POS_FACEDOWN_DEFENSE;
142-
GetCardLocation(pcard, &pcard->curPos, &pcard->curRot, true);
143-
}
121+
void ClientField::Initial(int player, int deckc, int extrac, int sidec) {
122+
auto load_location = [&](std::vector<ClientCard*>& container, int count, uint8_t location) {
123+
for(int i = 0; i < count; ++i) {
124+
ClientCard* pcard = new ClientCard;
125+
container.push_back(pcard);
126+
pcard->owner = player;
127+
pcard->controler = player;
128+
pcard->location = location;
129+
pcard->sequence = i;
130+
pcard->position = POS_FACEDOWN_DEFENSE;
131+
GetCardLocation(pcard, &pcard->curPos, &pcard->curRot, true);
132+
}
133+
};
134+
135+
load_location(deck[player], deckc, LOCATION_DECK);
136+
load_location(extra[player], extrac, LOCATION_EXTRA);
137+
load_location(remove[player], sidec, LOCATION_REMOVED);
144138
}
145139
void ClientField::ResetSequence(std::vector<ClientCard*>& list, bool reset_height) {
146140
unsigned char seq = 0;
@@ -413,7 +407,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
413407
}
414408
}
415409
if(has_card_in_grave) {
416-
rnd.shuffle_vector(selectable_cards);
410+
std::shuffle(selectable_cards.begin(), selectable_cards.end(), rnd);
417411
}
418412
}
419413
int startpos;

gframe/client_field.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#define CLIENT_FIELD_H
33

44
#include "config.h"
5-
#include "../ocgcore/mtrandom.h"
5+
#include <random>
66
#include <vector>
77
#include <set>
88
#include <map>
@@ -90,12 +90,12 @@ class ClientField: public irr::IEventReceiver {
9090
bool cant_check_grave{ false };
9191
bool tag_surrender{ false };
9292
bool tag_teammate_surrender{ false };
93-
mt19937 rnd;
93+
std::mt19937 rnd;
9494

9595
ClientField();
9696
~ClientField();
9797
void Clear();
98-
void Initial(int player, int deckc, int extrac);
98+
void Initial(int player, int deckc, int extrac, int sidec = 0);
9999
void ResetSequence(std::vector<ClientCard*>& list, bool reset_height);
100100
ClientCard* GetCard(int controler, int location, int sequence, int sub_seq = 0);
101101
void AddCard(ClientCard* pcard, int controler, int location, int sequence);

gframe/config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#include <windows.h>
1414
#include <ws2tcpip.h>
1515

16-
#ifdef _MSC_VER
16+
#if defined(_MSC_VER) or defined(__MINGW32__)
1717
#define mywcsncasecmp _wcsnicmp
1818
#define mystrncasecmp _strnicmp
1919
#else

gframe/data_manager.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,7 @@ void DataManager::ReadStringConfLine(const char* linebuf) {
165165
}
166166
}
167167
bool DataManager::Error(sqlite3* pDB, sqlite3_stmt* pStmt) {
168-
errmsg[0] = '\0';
169-
std::strncat(errmsg, sqlite3_errmsg(pDB), sizeof errmsg - 1);
168+
std::snprintf(errmsg, sizeof errmsg, "%s", sqlite3_errmsg(pDB));
170169
if(pStmt)
171170
sqlite3_finalize(pStmt);
172171
return false;

gframe/deck_con.cpp

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1+
#include <array>
12
#include "config.h"
23
#include "deck_con.h"
34
#include "myfilesystem.h"
4-
#include "data_manager.h"
5-
#include "deck_manager.h"
65
#include "image_manager.h"
76
#include "sound_manager.h"
87
#include "game.h"
@@ -54,6 +53,14 @@ static inline void load_current_deck(irr::gui::IGUIComboBox* cbCategory, irr::gu
5453
deckManager.LoadCurrentDeck(cbCategory->getSelected(), cbCategory->getText(), cbDeck->getText());
5554
}
5655

56+
DeckBuilder::DeckBuilder() {
57+
std::random_device rd;
58+
std::array<uint32_t, 8> seed{};
59+
for (auto& x : seed)
60+
x = rd();
61+
std::seed_seq seq(seed.begin(), seed.end());
62+
rnd.seed(seq);
63+
}
5764
void DeckBuilder::Initialize() {
5865
mainGame->is_building = true;
5966
mainGame->is_siding = false;
@@ -82,7 +89,6 @@ void DeckBuilder::Initialize() {
8289
filterList = &deckManager._lfList.back();
8390
}
8491
ClearSearch();
85-
rnd.reset((uint_fast32_t)std::time(nullptr));
8692
mouse_pos.set(0, 0);
8793
hovered_code = 0;
8894
hovered_pos = 0;
@@ -175,7 +181,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
175181
break;
176182
}
177183
case BUTTON_SHUFFLE_DECK: {
178-
rnd.shuffle_vector(deckManager.current_deck.main);
184+
std::shuffle(deckManager.current_deck.main.begin(), deckManager.current_deck.main.end(), rnd);
179185
break;
180186
}
181187
case BUTTON_SAVE_DECK: {
@@ -388,6 +394,29 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
388394
prev_operation = id;
389395
break;
390396
}
397+
case BUTTON_IMPORT_DECK_CODE: {
398+
time_t nowtime = std::time(nullptr);
399+
wchar_t timetext[40];
400+
std::wcsftime(timetext, sizeof timetext / sizeof timetext[0], L"%Y-%m-%d %H-%M-%S", std::localtime(&nowtime));
401+
mainGame->gMutex.lock();
402+
mainGame->stDMMessage->setText(dataManager.GetSysString(1471));
403+
mainGame->ebDMName->setVisible(true);
404+
mainGame->ebDMName->setText(timetext);
405+
mainGame->PopupElement(mainGame->wDMQuery);
406+
mainGame->gMutex.unlock();
407+
prev_operation = id;
408+
break;
409+
}
410+
case BUTTON_EXPORT_DECK_CODE: {
411+
std::stringstream textStream;
412+
deckManager.SaveDeck(deckManager.current_deck, textStream);
413+
wchar_t text[0x10000];
414+
BufferIO::DecodeUTF8(textStream.str().c_str(), text);
415+
mainGame->env->getOSOperator()->copyToClipboard(text);
416+
mainGame->stACMessage->setText(dataManager.GetSysString(1480));
417+
mainGame->PopupElement(mainGame->wACMessage, 20);
418+
break;
419+
}
391420
case BUTTON_DM_OK: {
392421
switch(prev_operation) {
393422
case BUTTON_NEW_CATEGORY: {
@@ -464,17 +493,28 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
464493
}
465494
break;
466495
}
467-
case BUTTON_NEW_DECK: {
496+
case BUTTON_NEW_DECK:
497+
case BUTTON_IMPORT_DECK_CODE: {
468498
const wchar_t* deckname = mainGame->ebDMName->getText();
469499
wchar_t catepath[256];
470500
DeckManager::GetCategoryPath(catepath, mainGame->cbDBCategory->getSelected(), mainGame->cbDBCategory->getText());
471501
wchar_t filepath[256];
472502
myswprintf(filepath, L"%ls/%ls.ydk", catepath, deckname);
473503
bool res = false;
474504
if(!FileSystem::IsFileExists(filepath)) {
475-
deckManager.current_deck.main.clear();
476-
deckManager.current_deck.extra.clear();
477-
deckManager.current_deck.side.clear();
505+
if(prev_operation == BUTTON_NEW_DECK) {
506+
deckManager.current_deck.main.clear();
507+
deckManager.current_deck.extra.clear();
508+
deckManager.current_deck.side.clear();
509+
} else {
510+
const wchar_t* txt = mainGame->env->getOSOperator()->getTextFromClipboard();
511+
if(txt) {
512+
char text[0x10000];
513+
BufferIO::EncodeUTF8(txt, text);
514+
std::istringstream textStream(text);
515+
deckManager.LoadCurrentDeck(textStream);
516+
}
517+
}
478518
res = DeckManager::SaveDeck(deckManager.current_deck, filepath);
479519
RefreshDeckList();
480520
ChangeCategory(mainGame->lstCategories->getSelected());

gframe/deck_con.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@
33

44
#include <unordered_map>
55
#include <vector>
6+
#include <random>
67
#include <irrlicht.h>
78
#include "data_manager.h"
89
#include "deck_manager.h"
9-
#include "../ocgcore/mtrandom.h"
1010

1111
namespace ygo {
1212

1313
class DeckBuilder: public irr::IEventReceiver {
1414
public:
15+
DeckBuilder();
1516
bool OnEvent(const irr::SEvent& event) override;
1617
void Initialize();
1718
void Terminate();
@@ -80,7 +81,7 @@ class DeckBuilder: public irr::IEventReceiver {
8081
bool is_modified{};
8182
bool readonly{};
8283
bool showing_pack{};
83-
mt19937 rnd;
84+
std::mt19937 rnd;
8485

8586
const LFList* filterList{};
8687
std::vector<code_pointer> results;

gframe/deck_manager.cpp

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,10 @@ irr::io::IReadFile* DeckManager::OpenDeckReader(const wchar_t* file) {
277277
#endif
278278
return reader;
279279
}
280+
bool DeckManager::LoadCurrentDeck(std::istringstream& deckStream, bool is_packlist) {
281+
LoadDeckFromStream(current_deck, deckStream, is_packlist);
282+
return true; // the above LoadDeck has return value but we ignore it here for now
283+
}
280284
bool DeckManager::LoadCurrentDeck(const wchar_t* file, bool is_packlist) {
281285
current_deck.clear();
282286
auto reader = OpenDeckReader(file);
@@ -311,21 +315,27 @@ bool DeckManager::LoadCurrentDeck(int category_index, const wchar_t* category_na
311315
mainGame->deckBuilder.RefreshPackListScroll();
312316
return res;
313317
}
318+
void DeckManager::SaveDeck(const Deck& deck, std::stringstream& deckStream) {
319+
deckStream << "#created by ..." << std::endl;
320+
deckStream << "#main" << std::endl;
321+
for(size_t i = 0; i < deck.main.size(); ++i)
322+
deckStream << deck.main[i]->first << std::endl;
323+
deckStream << "#extra" << std::endl;
324+
for(size_t i = 0; i < deck.extra.size(); ++i)
325+
deckStream << deck.extra[i]->first << std::endl;
326+
deckStream << "!side" << std::endl;
327+
for(size_t i = 0; i < deck.side.size(); ++i)
328+
deckStream << deck.side[i]->first << std::endl;
329+
}
314330
bool DeckManager::SaveDeck(const Deck& deck, const wchar_t* file) {
315331
if(!FileSystem::IsDirExists(L"./deck") && !FileSystem::MakeDir(L"./deck"))
316332
return false;
317333
FILE* fp = OpenDeckFile(file, "w");
318334
if(!fp)
319335
return false;
320-
std::fprintf(fp, "#created by ...\n#main\n");
321-
for(size_t i = 0; i < deck.main.size(); ++i)
322-
std::fprintf(fp, "%u\n", deck.main[i]->first);
323-
std::fprintf(fp, "#extra\n");
324-
for(size_t i = 0; i < deck.extra.size(); ++i)
325-
std::fprintf(fp, "%u\n", deck.extra[i]->first);
326-
std::fprintf(fp, "!side\n");
327-
for(size_t i = 0; i < deck.side.size(); ++i)
328-
std::fprintf(fp, "%u\n", deck.side[i]->first);
336+
std::stringstream deckStream;
337+
SaveDeck(deck, deckStream);
338+
std::fwrite(deckStream.str().c_str(), 1, deckStream.str().length(), fp);
329339
std::fclose(fp);
330340
return true;
331341
}

0 commit comments

Comments
 (0)