forked from Fluorohydride/ygopro
-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathgame.h
More file actions
907 lines (864 loc) · 30.1 KB
/
Copy pathgame.h
File metadata and controls
907 lines (864 loc) · 30.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
#ifndef GAME_H
#define GAME_H
#include "config.h"
#include "CGUITTFont.h"
#include "mysignal.h"
#include "client_field.h"
#include "deck_con.h"
#include "menu_handler.h"
#include <ctime>
#include <unordered_map>
#include <vector>
#include <list>
#include <mutex>
#include <functional>
namespace ygo {
constexpr int DEFAULT_DUEL_RULE = CURRENT_RULE;
constexpr int CONFIG_LINE_SIZE = 1024;
constexpr int GAME_WINDOW_WIDTH = 1024;
constexpr int GAME_WINDOW_HEIGHT = 640;
constexpr int CARD_IMG_WIDTH = 177;
constexpr int CARD_IMG_HEIGHT = 254;
constexpr int CARD_THUMB_WIDTH = 44;
constexpr int CARD_THUMB_HEIGHT = 64;
template<size_t N>
bool IsExtension(const wchar_t* filename, const wchar_t(&extension)[N]) {
auto flen = std::wcslen(filename);
constexpr size_t elen = N - 1;
if (!elen || flen < elen)
return false;
return !mywcsncasecmp(filename + (flen - elen), extension, elen);
}
template<size_t N>
bool IsExtension(const char* filename, const char(&extension)[N]) {
auto flen = std::strlen(filename);
constexpr size_t elen = N - 1;
if (!elen || flen < elen)
return false;
return !mystrncasecmp(filename + (flen - elen), extension, elen);
}
struct Config {
bool use_d3d{ false };
bool use_image_scale_multi_thread{ false };
bool use_image_load_background_thread{ false };
unsigned short antialias{ 2 };
unsigned int enable_log{ 0x3 };
unsigned short serverport{ 7911 };
unsigned char textfontsize{ 14 };
wchar_t lasthost[100]{};
wchar_t lastport[10]{};
wchar_t nickname[20]{ L"Player" };
wchar_t gamename[20]{ L"Game" };
wchar_t roompass[20]{};
//path
wchar_t lastcategory[256]{};
wchar_t lastdeck[256]{};
char textfont[256]{};
char numfont[256]{};
wchar_t bot_deck_path[256]{ L"./botdeck" };
//settings
int chkMAutoPos{ 0 };
int chkSTAutoPos{ 0 };
int chkRandomPos{ 0 };
int chkAutoChain{ 0 };
int chkWaitChain{ 0 };
int chkDefaultShowChain{ 0 };
int chkIgnore1{ 0 };
int chkIgnore2{ 0 };
int use_lflist{ 1 };
int default_lflist{ 0 };
int default_rule{ DEFAULT_DUEL_RULE };
int hide_setname{ 0 };
int hide_hint_button{ 0 };
int control_mode{ 0 };
int draw_field_spell{ 1 };
int separate_clear_button{ 1 };
int auto_search_limit{ -1 };
int search_multiple_keywords{ 1 };
int chkIgnoreDeckChanges{ 0 };
int defaultOT{ 1 };
int enable_bot_mode{ 0 };
int quick_animation{ 0 };
int auto_save_replay{ 0 };
int draw_single_chain{ 0 };
int hide_player_name{ 0 };
int prefer_expansion_script{ 0 };
bool enable_sound{ true };
bool enable_music{ true };
int sound_volume{ 50 };
int music_volume{ 50 };
int music_mode{ 1 };
bool window_maximized{ false };
int window_width{ GAME_WINDOW_WIDTH };
int window_height{ GAME_WINDOW_HEIGHT };
int resize_popup_menu{ 0 };
bool resize_select_window{ true };
bool swap_yes_no_button{ false };
};
struct DuelInfo {
bool isStarted{ false };
bool isInDuel{ false };
bool isFinished{false};
bool isReplay{ false };
bool isReplaySkiping{ false };
bool isFirst{ false };
bool isTag{ false };
bool isSingleMode{ false };
bool is_shuffling{ false };
bool tag_player[2]{};
bool isReplaySwapped{ false };
int lp[2]{};
int start_lp{ 0 };
int duel_rule{ 0 };
int turn{ 0 };
short curMsg{ 0 };
wchar_t hostname[20]{};
wchar_t clientname[20]{};
wchar_t hostname_tag[20]{};
wchar_t clientname_tag[20]{};
wchar_t strLP[2][16]{};
std::wstring vic_string;
unsigned char player_type{ 0 };
unsigned char time_player{ 0 };
unsigned short time_limit{ 0 };
unsigned short time_left[2]{};
void Clear();
};
struct BotInfo {
wchar_t name[256]{};
wchar_t command[256]{};
wchar_t desc[256]{};
bool support_master_rule_3{ false };
bool support_new_master_rule{ false };
bool support_master_rule_2020{ false };
bool select_deckfile{ false };
};
struct FadingUnit {
bool signalAction{};
bool isFadein{};
int fadingFrame{};
int autoFadeoutFrame{};
irr::gui::IGUIElement* guiFading{};
irr::core::recti fadingSize;
irr::core::vector2di fadingUL;
irr::core::vector2di fadingLR;
irr::core::vector2di fadingDiff;
};
class Game {
public:
bool Initialize();
void MainLoop();
void BuildProjectionMatrix(irr::core::matrix4& mProjection, irr::f32 left, irr::f32 right, irr::f32 bottom, irr::f32 top, irr::f32 znear, irr::f32 zfar);
void InitStaticText(irr::gui::IGUIStaticText* pControl, irr::u32 cWidth, irr::u32 cHeight, irr::gui::CGUITTFont* font, const wchar_t* text);
std::wstring SetStaticText(irr::gui::IGUIStaticText* pControl, irr::u32 cWidth, irr::gui::CGUITTFont* font, const wchar_t* text, irr::u32 pos = 0);
void LoadExpansions();
void RefreshCategoryDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck, bool selectlastused = true);
void RefreshDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck);
void RefreshDeck(const wchar_t* deckpath, const std::function<void(const wchar_t*)>& additem);
void RefreshReplay();
void RefreshSingleplay();
void RefreshBot();
void Draw2DImageQuad(irr::video::IVideoDriver* driver, irr::video::ITexture* texture, const irr::core::recti& sourceRect,
const irr::core::vector2di corner[4], bool useAlphaChannel = true, irr::video::SColor color = 0xffffffff);
void DrawSelectionLine(irr::video::S3DVertex* vec, bool stipple, irr::video::SColor color);
void DrawSelectionLine(irr::gui::IGUIElement* element, int width, irr::video::SColor color);
void DrawBackGround();
void DrawLinkedZones(ClientCard* pcard);
void CheckMutual(ClientCard* pcard, int mark);
void DrawCards();
void DrawCard(ClientCard* pcard);
void DrawMisc();
void DrawStatus(ClientCard* pcard, int x1, int y1, int x2, int y2);
void DrawGUI(); // called from MainLoop with gMutex held
void DrawSpec();
void DrawBackImage(irr::video::ITexture* texture);
void ShowElement(irr::gui::IGUIElement* element, int autoframe = 0); // caller must hold gMutex
void HideElement(irr::gui::IGUIElement* element, bool set_action = false); // caller must hold gMutex
void PopupElement(irr::gui::IGUIElement* element, int hideframe = 0); // caller must hold gMutex
void SetImageButtonDrawing(irr::gui::IGUIElement* element, bool draw = true);
void WaitFrameSignal(int frame);
void DrawThumb(const CardDataC* cp, irr::core::vector2di pos, const LFList* lflist, bool drag = false);
void DrawDeckBd();
void LoadConfig(const char* file);
void SaveConfig();
void ShowCardInfo(int code, bool resize = false);
void ClearCardInfo(int player = 0);
void AddLog(const wchar_t* msg, int param = 0);
void AddChatMsg(const wchar_t* msg, int player, bool play_sound = false);
void ClearChatMsg();
void AddDebugMsg(const char* msgbuf);
void ErrorLog(const char* msgbuf);
void ClearTextures(); // caller must hold gMutex
void CloseGameButtons();
void CloseGameWindow();
void CloseDuelWindow();
int LocalPlayer(int player) const;
int OppositePlayer(int player);
int ChatLocalPlayer(int player);
const wchar_t* LocalName(int local_player);
irr::s32 GetPopupMenuButtonWidth() const {
if(gameConf.resize_popup_menu > 0) {
return (xScale >= 0.7f) ? 100 * xScale : 70;
} else {
return 100;
}
}
irr::s32 GetPopupMenuButtonHeight() const {
if(gameConf.resize_popup_menu > 0) {
float yScaleForMenu = yScale * (1 + (gameConf.resize_popup_menu - 1) * 0.33f);
return (yScaleForMenu >= 0.7f) ? 24 * yScaleForMenu : 16;
} else {
return 24;
}
}
bool HasFocus(irr::gui::EGUI_ELEMENT_TYPE type) const {
irr::gui::IGUIElement* focus = env->getFocus();
return focus && focus->hasType(type);
}
void TrimText(irr::gui::IGUIElement* editbox) const {
irr::core::stringw text(editbox->getText());
text.trim();
editbox->setText(text.c_str());
}
void SwapYesNoButtons(bool no_first);
void OnResize(); // caller must hold gMutex
void ResizeChatInputWindow();
void ResizeCmdMenu();
void ResizePosSelectButtons();
void ResizeCardSelectButtons(irr::gui::IGUIWindow* window, irr::gui::IGUIStaticText** labels, irr::gui::IGUIButton** images,
irr::gui::IGUIScrollBar* scrollbar, irr::gui::IGUIButton* buttonOK, const std::vector<ClientCard*>& cards);
irr::core::recti Resize(irr::s32 x, irr::s32 y, irr::s32 x2, irr::s32 y2);
irr::core::recti Resize(irr::s32 x, irr::s32 y, irr::s32 x2, irr::s32 y2, irr::s32 dx, irr::s32 dy, irr::s32 dx2, irr::s32 dy2);
irr::core::vector2di Resize(irr::s32 x, irr::s32 y);
irr::core::vector2di ResizeReverse(irr::s32 x, irr::s32 y);
irr::core::recti ResizePhaseHint(irr::s32 x, irr::s32 y, irr::s32 x2, irr::s32 y2, irr::s32 width);
irr::core::recti ResizeWin(irr::s32 x, irr::s32 y, irr::s32 x2, irr::s32 y2);
irr::core::recti ResizeCardImgWin(irr::s32 x, irr::s32 y, irr::s32 mx, irr::s32 my);
irr::core::recti ResizeCardHint(irr::s32 x, irr::s32 y, irr::s32 x2, irr::s32 y2);
irr::core::vector2di ResizeCardHint(irr::s32 x, irr::s32 y);
irr::core::recti ResizeCardMid(irr::s32 x, irr::s32 y, irr::s32 x2, irr::s32 y2, irr::s32 midx, irr::s32 midy);
irr::core::vector2di ResizeCardMid(irr::s32 x, irr::s32 y, irr::s32 midx, irr::s32 midy);
irr::core::recti ResizeFit(irr::s32 x, irr::s32 y, irr::s32 x2, irr::s32 y2);
static void FixMacOSBundleWorkingDirectory();
void SetWindowsIcon();
void SetWindowsScale(float scale);
void FlashWindow();
void SetCursor(irr::gui::ECURSOR_ICON icon);
static bool SpawnAsync(const std::wstring& exePath, const std::vector<std::wstring>& args);
template<typename T>
static void DrawShadowText(irr::gui::CGUITTFont* font, const T& text, const irr::core::rect<irr::s32>& position, const irr::core::rect<irr::s32>& padding,
irr::video::SColor color = 0xffffffff, irr::video::SColor shadowcolor = 0xff000000, bool hcenter = false, bool vcenter = false, const irr::core::rect<irr::s32>* clip = nullptr);
std::mutex gMutex;
Signal frameSignal;
Signal actionSignal;
Signal replaySignal;
Signal singleSignal;
Signal closeSignal;
Signal closeDoneSignal;
Config gameConf;
DuelInfo dInfo;
std::list<FadingUnit> fadingList;
std::vector<int> logParam;
std::wstring chatMsg[8];
std::vector<BotInfo> botInfo;
int hideChatTimer{};
bool hideChat{};
int chatTiming[8]{};
int chatType[8]{};
unsigned short linePattern{ 0 };
unsigned short stippleMask{ 0x0f0f };
int waitFrame{};
int signalFrame{};
int actionParam{};
int showingcode{};
const wchar_t* showingtext{};
int showcard{};
int showcardcode{};
int showcarddif{};
int showcardp{};
int is_attacking{};
int attack_sv{};
irr::core::vector3df atk_r;
irr::core::vector3df atk_t;
float atkdy{};
int lpframe{};
int lpd{};
int lpplayer{};
irr::u32 lpccolor{};
std::wstring lpcstring;
bool always_chain{};
bool ignore_chain{};
bool chain_when_avail{};
bool is_building{};
bool is_siding{};
bool exit_on_return{ false };
bool open_file{ false };
wchar_t open_file_name[256]{};
bool bot_mode{ false };
irr::core::dimension2d<irr::u32> window_size;
float xScale{ 1.0f };
float yScale{ 1.0f };
ClientField dField;
DeckBuilder deckBuilder;
MenuHandler menuHandler;
irr::IrrlichtDevice* device{};
irr::video::IVideoDriver* driver{};
irr::scene::ISceneManager* smgr{};
irr::scene::ICameraSceneNode* camera{};
#ifdef _WIN32
HWND hWnd;
#endif
//GUI
irr::gui::IGUIEnvironment* env{};
irr::gui::CGUITTFont* guiFont{};
irr::gui::CGUITTFont* textFont{};
irr::gui::CGUITTFont* numFont{};
irr::gui::CGUITTFont* adFont{};
irr::gui::CGUITTFont* lpcFont{};
// textures must be added in the main thread which handle OpenGL context,
// {card_code, rotated} written in network thread, loaded in main thread's DrawGUI
std::unordered_map<irr::gui::IGUIButton*, std::pair<int, bool>> btnImagePending;
// persistent tracking for image refresh on resize:
// {card_code, rotated} for buttons showing a card image from GetTextureButton
std::unordered_map<irr::gui::IGUIButton*, std::pair<int, bool>> btnCardImgInfo;
// {cover_idx, rotated} for buttons showing a facedown card (cover) image
std::unordered_map<irr::gui::IGUIButton*, std::pair<int, bool>> btnFacedownImgInfo;
//card image
irr::gui::IGUIStaticText* wCardImg{};
irr::gui::IGUIImage* imgCard{};
//hint text
irr::gui::IGUIStaticText* stHintMsg{};
irr::gui::IGUIStaticText* stTip{};
irr::gui::IGUIStaticText* stCardListTip{};
//infos
irr::gui::IGUITabControl* wInfos{};
irr::gui::IGUIStaticText* stName{};
irr::gui::IGUIStaticText* stInfo{};
irr::gui::IGUIStaticText* stDataInfo{};
irr::gui::IGUIStaticText* stSetName{};
irr::gui::IGUIStaticText* stText{};
irr::gui::IGUIScrollBar* scrCardText{};
irr::gui::IGUIListBox* lstLog{};
irr::gui::IGUIButton* btnClearLog{};
irr::gui::IGUIButton* btnSaveLog{};
irr::gui::IGUIWindow* tabHelper{};
irr::gui::IGUIElement* elmTabHelperLast{};
irr::gui::IGUIScrollBar* scrTabHelper{};
irr::gui::IGUICheckBox* chkMAutoPos{};
irr::gui::IGUICheckBox* chkSTAutoPos{};
irr::gui::IGUICheckBox* chkRandomPos{};
irr::gui::IGUICheckBox* chkAutoChain{};
irr::gui::IGUICheckBox* chkWaitChain{};
irr::gui::IGUICheckBox* chkDefaultShowChain{};
irr::gui::IGUICheckBox* chkQuickAnimation{};
irr::gui::IGUICheckBox* chkAutoSaveReplay{};
irr::gui::IGUICheckBox* chkDrawSingleChain{};
irr::gui::IGUICheckBox* chkHidePlayerName{};
irr::gui::IGUIWindow* tabSystem{};
irr::gui::IGUIElement* elmTabSystemLast{};
irr::gui::IGUIScrollBar* scrTabSystem{};
irr::gui::IGUICheckBox* chkIgnoreDeckChanges{};
irr::gui::IGUICheckBox* chkAutoSearch{};
irr::gui::IGUICheckBox* chkMultiKeywords{};
irr::gui::IGUICheckBox* chkPreferExpansionScript{};
irr::gui::IGUICheckBox* chkSwapYesNoButton{};
irr::gui::IGUICheckBox* chkLFlist{};
irr::gui::IGUIComboBox* cbLFlist{};
irr::gui::IGUICheckBox* chkEnableSound{};
irr::gui::IGUICheckBox* chkEnableMusic{};
irr::gui::IGUIScrollBar* scrSoundVolume{};
irr::gui::IGUIScrollBar* scrMusicVolume{};
irr::gui::IGUICheckBox* chkMusicMode{};
irr::gui::IGUICheckBox* chkResizeSelectWindow{};
irr::gui::IGUICheckBox* chkResizePopupMenu{};
irr::gui::IGUIScrollBar* scrResizePopupMenu{};
irr::gui::IGUIButton* btnWinResizeS{};
irr::gui::IGUIButton* btnWinResizeM{};
irr::gui::IGUIButton* btnWinResizeL{};
irr::gui::IGUIButton* btnWinResizeXL{};
//main menu
irr::gui::IGUIWindow* wMainMenu{};
irr::gui::IGUIButton* btnLanMode{};
irr::gui::IGUIButton* btnSingleMode{};
irr::gui::IGUIButton* btnReplayMode{};
irr::gui::IGUIButton* btnTestMode{};
irr::gui::IGUIButton* btnDeckEdit{};
irr::gui::IGUIButton* btnModeExit{};
//lan
irr::gui::IGUIWindow* wLanWindow{};
irr::gui::IGUIEditBox* ebNickName{};
irr::gui::IGUIListBox* lstHostList{};
irr::gui::IGUIButton* btnLanRefresh{};
irr::gui::IGUIEditBox* ebJoinHost{};
irr::gui::IGUIEditBox* ebJoinPort{};
irr::gui::IGUIEditBox* ebJoinPass{};
irr::gui::IGUIButton* btnJoinHost{};
irr::gui::IGUIButton* btnJoinCancel{};
irr::gui::IGUIButton* btnCreateHost{};
//create host
irr::gui::IGUIWindow* wCreateHost{};
irr::gui::IGUIComboBox* cbHostLFlist{};
irr::gui::IGUIComboBox* cbMatchMode{};
irr::gui::IGUIComboBox* cbRule{};
irr::gui::IGUIEditBox* ebTimeLimit{};
irr::gui::IGUIEditBox* ebStartLP{};
irr::gui::IGUIEditBox* ebStartHand{};
irr::gui::IGUIEditBox* ebDrawCount{};
irr::gui::IGUIEditBox* ebServerName{};
irr::gui::IGUIEditBox* ebServerPass{};
irr::gui::IGUIComboBox* cbDuelRule{};
irr::gui::IGUICheckBox* chkNoCheckDeck{};
irr::gui::IGUICheckBox* chkNoShuffleDeck{};
irr::gui::IGUIButton* btnHostConfirm{};
irr::gui::IGUIButton* btnHostCancel{};
//host panel
irr::gui::IGUIWindow* wHostPrepare{};
irr::gui::IGUIButton* btnHostPrepDuelist{};
irr::gui::IGUIButton* btnHostPrepOB{};
irr::gui::IGUIStaticText* stHostPrepDuelist[4]{};
irr::gui::IGUICheckBox* chkHostPrepReady[4]{};
irr::gui::IGUIButton* btnHostPrepKick[4]{};
irr::gui::IGUIComboBox* cbCategorySelect{};
irr::gui::IGUIComboBox* cbDeckSelect{};
irr::gui::IGUIStaticText* stHostPrepRule{};
irr::gui::IGUIStaticText* stHostPrepOB{};
irr::gui::IGUIButton* btnHostPrepReady{};
irr::gui::IGUIButton* btnHostPrepNotReady{};
irr::gui::IGUIButton* btnHostPrepStart{};
irr::gui::IGUIButton* btnHostPrepCancel{};
//replay
irr::gui::IGUIWindow* wReplay{};
irr::gui::IGUIListBox* lstReplayList{};
irr::gui::IGUIStaticText* stReplayInfo{};
irr::gui::IGUIButton* btnLoadReplay{};
irr::gui::IGUIButton* btnDeleteReplay{};
irr::gui::IGUIButton* btnRenameReplay{};
irr::gui::IGUIButton* btnReplayCancel{};
irr::gui::IGUIButton* btnExportDeck{};
irr::gui::IGUIEditBox* ebRepStartTurn{};
//single play
irr::gui::IGUIWindow* wSinglePlay{};
irr::gui::IGUIListBox* lstBotList{};
irr::gui::IGUIStaticText* stBotInfo{};
irr::gui::IGUIButton* btnStartBot{};
irr::gui::IGUIButton* btnBotCancel{};
irr::gui::IGUIComboBox* cbBotDeckCategory{};
irr::gui::IGUIComboBox* cbBotDeck{};
irr::gui::IGUIComboBox* cbBotRule{};
irr::gui::IGUICheckBox* chkBotHand{};
irr::gui::IGUICheckBox* chkBotNoCheckDeck{};
irr::gui::IGUICheckBox* chkBotNoShuffleDeck{};
irr::gui::IGUIListBox* lstSinglePlayList{};
irr::gui::IGUIStaticText* stSinglePlayInfo{};
irr::gui::IGUICheckBox* chkSinglePlayReturnDeckTop{};
irr::gui::IGUIButton* btnLoadSinglePlay{};
irr::gui::IGUIButton* btnSinglePlayCancel{};
//hand
irr::gui::IGUIWindow* wHand{};
irr::gui::IGUIButton* btnHand[3]{};
//
irr::gui::IGUIWindow* wFTSelect{};
irr::gui::IGUIButton* btnFirst{};
irr::gui::IGUIButton* btnSecond{};
//message
irr::gui::IGUIWindow* wMessage{};
irr::gui::IGUIStaticText* stMessage{};
irr::gui::IGUIButton* btnMsgOK{};
//auto close message
irr::gui::IGUIWindow* wACMessage{};
irr::gui::IGUIStaticText* stACMessage{};
//yes/no
irr::gui::IGUIWindow* wQuery{};
irr::gui::IGUIStaticText* stQMessage{};
irr::gui::IGUIButton* btnYes{};
irr::gui::IGUIButton* btnNo{};
//surrender yes/no
irr::gui::IGUIWindow* wSurrender{};
irr::gui::IGUIStaticText* stSurrenderMessage{};
irr::gui::IGUIButton* btnSurrenderYes{};
irr::gui::IGUIButton* btnSurrenderNo{};
//options
irr::gui::IGUIWindow* wOptions{};
irr::gui::IGUIStaticText* stOptions{};
irr::gui::IGUIButton* btnOptionp{};
irr::gui::IGUIButton* btnOptionn{};
irr::gui::IGUIButton* btnOptionOK{};
irr::gui::IGUIButton* btnOption[5]{};
irr::gui::IGUIScrollBar* scrOption{};
//pos selection
irr::gui::IGUIWindow* wPosSelect{};
irr::gui::IGUIButton* btnPSAU{};
irr::gui::IGUIButton* btnPSAD{};
irr::gui::IGUIButton* btnPSDU{};
irr::gui::IGUIButton* btnPSDD{};
//card selection
irr::gui::IGUIWindow* wCardSelect{};
irr::gui::IGUIButton* btnCardSelect[5]{};
irr::gui::IGUIStaticText *stCardPos[5]{};
irr::gui::IGUIScrollBar *scrCardList{};
irr::gui::IGUIButton* btnSelectOK{};
//card display
irr::gui::IGUIWindow* wCardDisplay{};
irr::gui::IGUIButton* btnCardDisplay[5]{};
irr::gui::IGUIStaticText *stDisplayPos[5]{};
irr::gui::IGUIScrollBar *scrDisplayList{};
irr::gui::IGUIButton* btnDisplayOK{};
//announce number
irr::gui::IGUIWindow* wANNumber{};
irr::gui::IGUIComboBox* cbANNumber{};
irr::gui::IGUIButton* btnANNumber[12]{};
irr::gui::IGUIButton* btnANNumberOK{};
//announce card
irr::gui::IGUIWindow* wANCard{};
irr::gui::IGUIEditBox* ebANCard{};
irr::gui::IGUIListBox* lstANCard{};
irr::gui::IGUIButton* btnANCardOK{};
//announce attribute
irr::gui::IGUIWindow* wANAttribute{};
irr::gui::IGUICheckBox* chkAttribute[ATTRIBUTES_COUNT]{};
//announce race
irr::gui::IGUIWindow* wANRace{};
irr::gui::IGUICheckBox* chkRace[RACES_COUNT]{};
//cmd menu
irr::gui::IGUIWindow* wCmdMenu{};
irr::gui::IGUIButton* btnActivate{};
irr::gui::IGUIButton* btnSummon{};
irr::gui::IGUIButton* btnSPSummon{};
irr::gui::IGUIButton* btnMSet{};
irr::gui::IGUIButton* btnSSet{};
irr::gui::IGUIButton* btnRepos{};
irr::gui::IGUIButton* btnAttack{};
irr::gui::IGUIButton* btnShowList{};
irr::gui::IGUIButton* btnOperation{};
irr::gui::IGUIButton* btnReset{};
irr::gui::IGUIButton* btnShuffle{};
//chat window
irr::gui::IGUIWindow* wChat{};
irr::gui::IGUIListBox* lstChatLog{};
irr::gui::IGUIEditBox* ebChatInput{};
irr::gui::IGUICheckBox* chkIgnore1{};
irr::gui::IGUICheckBox* chkIgnore2{};
//phase button
irr::gui::IGUIStaticText* wPhase{};
irr::gui::IGUIButton* btnPhaseStatus{};
irr::gui::IGUIButton* btnBP{};
irr::gui::IGUIButton* btnM2{};
irr::gui::IGUIButton* btnEP{};
//deck edit
irr::gui::IGUIStaticText* wDeckEdit{};
irr::gui::IGUIComboBox* cbDBCategory{};
irr::gui::IGUIComboBox* cbDBDecks{};
irr::gui::IGUIButton* btnManageDeck{};
irr::gui::IGUIButton* btnClearDeck{};
irr::gui::IGUIButton* btnSortDeck{};
irr::gui::IGUIButton* btnShuffleDeck{};
irr::gui::IGUIButton* btnSaveDeck{};
irr::gui::IGUIButton* btnDeleteDeck{};
irr::gui::IGUIButton* btnSaveDeckAs{};
irr::gui::IGUIButton* btnSideOK{};
irr::gui::IGUIButton* btnSideShuffle{};
irr::gui::IGUIButton* btnSideSort{};
irr::gui::IGUIButton* btnSideReload{};
irr::gui::IGUIEditBox* ebDeckname{};
irr::gui::IGUIStaticText* stDBCategory{};
irr::gui::IGUIStaticText* stDeck{};
irr::gui::IGUIStaticText* stCategory{};
irr::gui::IGUIStaticText* stLimit{};
irr::gui::IGUIStaticText* stAttribute{};
irr::gui::IGUIStaticText* stRace{};
irr::gui::IGUIStaticText* stAttack{};
irr::gui::IGUIStaticText* stDefense{};
irr::gui::IGUIStaticText* stStar{};
irr::gui::IGUIStaticText* stSearch{};
irr::gui::IGUIStaticText* stScale{};
//deck manage
irr::gui::IGUIWindow* wDeckManage{};
irr::gui::IGUIListBox* lstCategories{};
irr::gui::IGUIListBox* lstDecks{};
irr::gui::IGUIButton* btnNewCategory{};
irr::gui::IGUIButton* btnRenameCategory{};
irr::gui::IGUIButton* btnDeleteCategory{};
irr::gui::IGUIButton* btnNewDeck{};
irr::gui::IGUIButton* btnRenameDeck{};
irr::gui::IGUIButton* btnDMDeleteDeck{};
irr::gui::IGUIButton* btnMoveDeck{};
irr::gui::IGUIButton* btnCopyDeck{};
irr::gui::IGUIButton* btnImportDeckCode{};
irr::gui::IGUIButton* btnExportDeckCode{};
irr::gui::IGUIWindow* wDMQuery{};
irr::gui::IGUIStaticText* stDMMessage{};
irr::gui::IGUIStaticText* stDMMessage2{};
irr::gui::IGUIEditBox* ebDMName{};
irr::gui::IGUIComboBox* cbDMCategory{};
irr::gui::IGUIButton* btnDMOK{};
irr::gui::IGUIButton* btnDMCancel{};
irr::gui::IGUIScrollBar* scrPackCards{};
//filter
irr::gui::IGUIStaticText* wFilter{};
irr::gui::IGUIScrollBar* scrFilter{};
irr::gui::IGUIComboBox* cbCardType{};
irr::gui::IGUIComboBox* cbCardType2{};
irr::gui::IGUIComboBox* cbRace{};
irr::gui::IGUIComboBox* cbAttribute{};
irr::gui::IGUIComboBox* cbLimit{};
irr::gui::IGUIEditBox* ebStar{};
irr::gui::IGUIEditBox* ebScale{};
irr::gui::IGUIEditBox* ebAttack{};
irr::gui::IGUIEditBox* ebDefense{};
irr::gui::IGUIEditBox* ebCardName{};
irr::gui::IGUIButton* btnEffectFilter{};
irr::gui::IGUIButton* btnStartFilter{};
irr::gui::IGUIButton* btnClearFilter{};
irr::gui::IGUIWindow* wCategories{};
irr::gui::IGUICheckBox* chkCategory[32]{};
irr::gui::IGUIButton* btnCategoryOK{};
irr::gui::IGUIButton* btnMarksFilter{};
irr::gui::IGUIWindow* wLinkMarks{};
irr::gui::IGUIButton* btnMark[8]{};
irr::gui::IGUIButton* btnMarksOK{};
//sort type
irr::gui::IGUIStaticText* wSort{};
irr::gui::IGUIComboBox* cbSortType{};
//replay save
irr::gui::IGUIWindow* wReplaySave{};
irr::gui::IGUIEditBox* ebRSName{};
irr::gui::IGUIButton* btnRSYes{};
irr::gui::IGUIButton* btnRSNo{};
//replay control
irr::gui::IGUIStaticText* wReplayControl{};
irr::gui::IGUIButton* btnReplayStart{};
irr::gui::IGUIButton* btnReplayPause{};
irr::gui::IGUIButton* btnReplayStep{};
irr::gui::IGUIButton* btnReplayUndo{};
irr::gui::IGUIButton* btnReplayExit{};
irr::gui::IGUIButton* btnReplaySwap{};
//surrender/leave
irr::gui::IGUIButton* btnLeaveGame{};
//swap
irr::gui::IGUIButton* btnSpectatorSwap{};
//chain control
irr::gui::IGUIButton* btnChainIgnore{};
irr::gui::IGUIButton* btnChainAlways{};
irr::gui::IGUIButton* btnChainWhenAvail{};
//cancel or finish
irr::gui::IGUIButton* btnCancelOrFinish{};
//big picture
irr::gui::IGUIWindow* wBigCard{};
irr::gui::IGUIImage* imgBigCard{};
irr::gui::IGUIButton* btnBigCardOriginalSize{};
irr::gui::IGUIButton* btnBigCardZoomIn{};
irr::gui::IGUIButton* btnBigCardZoomOut{};
irr::gui::IGUIButton* btnBigCardClose{};
};
extern Game* mainGame;
}
#define SIZE_QUERY_BUFFER 0x4000
#define UEVENT_EXIT 0x1
#define UEVENT_TOWINDOW 0x2
#define COMMAND_ACTIVATE 0x0001
#define COMMAND_SUMMON 0x0002
#define COMMAND_SPSUMMON 0x0004
#define COMMAND_MSET 0x0008
#define COMMAND_SSET 0x0010
#define COMMAND_REPOS 0x0020
#define COMMAND_ATTACK 0x0040
#define COMMAND_LIST 0x0080
#define COMMAND_OPERATION 0x0100
#define COMMAND_RESET 0x0200
#define POSITION_HINT 0x8000
#define BUTTON_LAN_MODE 100
#define BUTTON_SINGLE_MODE 101
#define BUTTON_REPLAY_MODE 102
#define BUTTON_TEST_MODE 103
#define BUTTON_DECK_EDIT 104
#define BUTTON_MODE_EXIT 105
#define LISTBOX_LAN_HOST 110
#define BUTTON_JOIN_HOST 111
#define BUTTON_JOIN_CANCEL 112
#define BUTTON_CREATE_HOST 113
#define BUTTON_HOST_CONFIRM 114
#define BUTTON_HOST_CANCEL 115
#define BUTTON_LAN_REFRESH 116
#define BUTTON_HP_DUELIST 120
#define BUTTON_HP_OBSERVER 121
#define BUTTON_HP_START 122
#define BUTTON_HP_CANCEL 123
#define BUTTON_HP_KICK 124
#define CHECKBOX_HP_READY 125
#define BUTTON_HP_READY 126
#define BUTTON_HP_NOTREADY 127
#define COMBOBOX_HP_CATEGORY 128
#define LISTBOX_REPLAY_LIST 130
#define BUTTON_LOAD_REPLAY 131
#define BUTTON_CANCEL_REPLAY 132
#define BUTTON_DELETE_REPLAY 133
#define BUTTON_RENAME_REPLAY 134
#define BUTTON_EXPORT_DECK 135
#define BUTTON_REPLAY_START 140
#define BUTTON_REPLAY_PAUSE 141
#define BUTTON_REPLAY_STEP 142
#define BUTTON_REPLAY_UNDO 143
#define BUTTON_REPLAY_EXIT 144
#define BUTTON_REPLAY_SWAP 145
#define BUTTON_REPLAY_SAVE 146
#define BUTTON_REPLAY_CANCEL 147
#define LISTBOX_SINGLEPLAY_LIST 150
#define BUTTON_LOAD_SINGLEPLAY 151
#define BUTTON_CANCEL_SINGLEPLAY 152
#define LISTBOX_BOT_LIST 153
#define BUTTON_BOT_START 154
#define COMBOBOX_BOT_RULE 155
#define COMBOBOX_BOT_DECKCATEGORY 156
#define EDITBOX_CHAT 199
#define BUTTON_MSG_OK 200
#define BUTTON_YES 201
#define BUTTON_NO 202
#define BUTTON_HAND1 205
#define BUTTON_HAND2 206
#define BUTTON_HAND3 207
#define BUTTON_FIRST 208
#define BUTTON_SECOND 209
#define BUTTON_POS_AU 210
#define BUTTON_POS_AD 211
#define BUTTON_POS_DU 212
#define BUTTON_POS_DD 213
#define BUTTON_OPTION_PREV 220
#define BUTTON_OPTION_NEXT 221
#define BUTTON_OPTION_OK 222
#define BUTTON_OPTION_0 223
#define BUTTON_OPTION_1 224
#define BUTTON_OPTION_2 225
#define BUTTON_OPTION_3 226
#define BUTTON_OPTION_4 227
#define SCROLL_OPTION_SELECT 228
#define BUTTON_CARD_0 230
#define BUTTON_CARD_1 231
#define BUTTON_CARD_2 232
#define BUTTON_CARD_3 233
#define BUTTON_CARD_4 234
#define SCROLL_CARD_SELECT 235
#define BUTTON_CARD_SEL_OK 236
#define TEXT_CARD_LIST_TIP 237
#define BUTTON_CMD_ACTIVATE 240
#define BUTTON_CMD_SUMMON 241
#define BUTTON_CMD_SPSUMMON 242
#define BUTTON_CMD_MSET 243
#define BUTTON_CMD_SSET 244
#define BUTTON_CMD_REPOS 245
#define BUTTON_CMD_ATTACK 246
#define BUTTON_CMD_SHOWLIST 247
#define BUTTON_CMD_SHUFFLE 248
#define BUTTON_CMD_RESET 249
#define BUTTON_ANNUMBER_OK 250
#define BUTTON_ANCARD_OK 251
#define EDITBOX_ANCARD 252
#define LISTBOX_ANCARD 253
#define CHECK_ATTRIBUTE 254
#define CHECK_RACE 255
#define BUTTON_BP 260
#define BUTTON_M2 261
#define BUTTON_EP 262
#define BUTTON_LEAVE_GAME 263
#define BUTTON_CHAIN_IGNORE 264
#define BUTTON_CHAIN_ALWAYS 265
#define BUTTON_CHAIN_WHENAVAIL 266
#define BUTTON_CANCEL_OR_FINISH 267
#define BUTTON_PHASE 268
#define BUTTON_ANNUMBER_1 270
#define BUTTON_ANNUMBER_2 271
#define BUTTON_ANNUMBER_3 272
#define BUTTON_ANNUMBER_4 273
#define BUTTON_ANNUMBER_5 274
#define BUTTON_ANNUMBER_6 275
#define BUTTON_ANNUMBER_7 276
#define BUTTON_ANNUMBER_8 277
#define BUTTON_ANNUMBER_9 278
#define BUTTON_ANNUMBER_10 279
#define BUTTON_ANNUMBER_11 280
#define BUTTON_ANNUMBER_12 281
#define BUTTON_DISPLAY_0 290
#define BUTTON_DISPLAY_1 291
#define BUTTON_DISPLAY_2 292
#define BUTTON_DISPLAY_3 293
#define BUTTON_DISPLAY_4 294
#define SCROLL_CARD_DISPLAY 295
#define BUTTON_CARD_DISP_OK 296
#define BUTTON_SURRENDER_YES 297
#define BUTTON_SURRENDER_NO 298
#define BUTTON_MANAGE_DECK 300
#define COMBOBOX_DBCATEGORY 301
#define COMBOBOX_DBDECKS 302
#define BUTTON_CLEAR_DECK 303
#define BUTTON_SAVE_DECK 304
#define BUTTON_SAVE_DECK_AS 305
#define BUTTON_DELETE_DECK 306
#define BUTTON_SIDE_RELOAD 307
#define BUTTON_SORT_DECK 308
#define BUTTON_SIDE_OK 309
#define BUTTON_SHUFFLE_DECK 310
#define COMBOBOX_MAINTYPE 311
#define COMBOBOX_SECONDTYPE 312
#define BUTTON_EFFECT_FILTER 313
#define BUTTON_START_FILTER 314
#define SCROLL_FILTER 315
#define EDITBOX_KEYWORD 316
#define BUTTON_CLEAR_FILTER 317
#define COMBOBOX_ATTRIBUTE 318
#define COMBOBOX_RACE 319
#define COMBOBOX_LIMIT 320
#define BUTTON_CATEGORY_OK 321
#define BUTTON_MARKS_FILTER 322
#define BUTTON_MARKERS_OK 323
#define COMBOBOX_SORTTYPE 324
#define EDITBOX_INPUTS 325
#define WINDOW_DECK_MANAGE 330
#define BUTTON_NEW_CATEGORY 331
#define BUTTON_RENAME_CATEGORY 332
#define BUTTON_DELETE_CATEGORY 333
#define BUTTON_NEW_DECK 334
#define BUTTON_RENAME_DECK 335
#define BUTTON_DELETE_DECK_DM 336
#define BUTTON_MOVE_DECK 337
#define BUTTON_COPY_DECK 338
#define LISTBOX_CATEGORIES 339
#define LISTBOX_DECKS 340
#define BUTTON_DM_OK 341
#define BUTTON_DM_CANCEL 342
#define BUTTON_IMPORT_DECK_CODE 343
#define BUTTON_EXPORT_DECK_CODE 344
#define COMBOBOX_LFLIST 349
#define BUTTON_CLEAR_LOG 350
#define LISTBOX_LOG 351
#define SCROLL_CARDTEXT 352
#define CHECKBOX_AUTO_SEARCH 360
#define CHECKBOX_ENABLE_SOUND 361
#define CHECKBOX_ENABLE_MUSIC 362
#define SCROLL_VOLUME 363
#define CHECKBOX_DISABLE_CHAT 364
#define BUTTON_WINDOW_RESIZE_S 365
#define BUTTON_WINDOW_RESIZE_M 366
#define BUTTON_WINDOW_RESIZE_L 367
#define BUTTON_WINDOW_RESIZE_XL 368
#define CHECKBOX_QUICK_ANIMATION 369
#define SCROLL_TAB_HELPER 370
#define SCROLL_TAB_SYSTEM 371
#define CHECKBOX_MULTI_KEYWORDS 372
#define CHECKBOX_PREFER_EXPANSION 373
#define CHECKBOX_DRAW_SINGLE_CHAIN 374
#define CHECKBOX_LFLIST 375
#define CHECKBOX_HIDE_PLAYER_NAME 376
#define BUTTON_BIG_CARD_CLOSE 380
#define BUTTON_BIG_CARD_ZOOM_IN 381
#define BUTTON_BIG_CARD_ZOOM_OUT 382
#define BUTTON_BIG_CARD_ORIG_SIZE 383
#define CHECKBOX_RESIZE_POPUP_MENU 384
#define SCROLL_RESIZE_POPUP_MENU 385
#define CHECKBOX_RESIZE_SELECT_WINDOW 386
#define CHECKBOX_SWAP_YES_NO_BUTTON 387
#define AVAIL_OCG 0x1
#define AVAIL_TCG 0x2
#define AVAIL_CUSTOM 0x4
#define AVAIL_SC 0x8
#define AVAIL_OCGTCG (AVAIL_OCG|AVAIL_TCG)
#define MAX_LAYER_COUNT 6
#endif // GAME_H