Commit fe26cbcc authored by mercury233's avatar mercury233 Committed by GitHub

Merge branch 'master' into patch-skip-confirm

parents 339c26c7 05da015f
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
/ygopro /ygopro
/ygopro.exe /ygopro.exe
/ygopro.app /ygopro.app
/ikpMP3.dll
/irrKlang.dll
/bin /bin
/build /build
......
...@@ -7,35 +7,35 @@ ...@@ -7,35 +7,35 @@
class BufferIO { class BufferIO {
public: public:
inline static int ReadInt32(char*& p) { inline static int ReadInt32(unsigned char*& p) {
int ret = *(int*)p; int ret = *(int*)p;
p += 4; p += 4;
return ret; return ret;
} }
inline static short ReadInt16(char*& p) { inline static short ReadInt16(unsigned char*& p) {
short ret = *(short*)p; short ret = *(short*)p;
p += 2; p += 2;
return ret; return ret;
} }
inline static char ReadInt8(char*& p) { inline static char ReadInt8(unsigned char*& p) {
char ret = *(char*)p; char ret = *(char*)p;
p++; p++;
return ret; return ret;
} }
inline static unsigned char ReadUInt8(char*& p) { inline static unsigned char ReadUInt8(unsigned char*& p) {
unsigned char ret = *(unsigned char*)p; unsigned char ret = *(unsigned char*)p;
p++; p++;
return ret; return ret;
} }
inline static void WriteInt32(char*& p, int val) { inline static void WriteInt32(unsigned char*& p, int val) {
(*(int*)p) = val; (*(int*)p) = val;
p += 4; p += 4;
} }
inline static void WriteInt16(char*& p, short val) { inline static void WriteInt16(unsigned char*& p, short val) {
(*(short*)p) = val; (*(short*)p) = val;
p += 2; p += 2;
} }
inline static void WriteInt8(char*& p, char val) { inline static void WriteInt8(unsigned char*& p, char val) {
*p = val; *p = val;
p++; p++;
} }
......
...@@ -5,50 +5,32 @@ ...@@ -5,50 +5,32 @@
namespace ygo { namespace ygo {
ClientCard::ClientCard() { ClientCard::~ClientCard() {
curAlpha = 255; ClearTarget();
dAlpha = 0; if (equipTarget) {
aniFrame = 0; equipTarget->is_showequip = false;
is_moving = false; equipTarget->equipped.erase(this);
is_fading = false; equipTarget = nullptr;
is_hovered = false; }
is_selectable = false; for (auto& card : equipped) {
is_selected = false; card->is_showequip = false;
is_showequip = false; card->equipTarget = nullptr;
is_showtarget = false; }
is_showchaintarget = false; equipped.clear();
is_highlighting = false; if (overlayTarget) {
status = 0; for (auto it = overlayTarget->overlayed.begin(); it != overlayTarget->overlayed.end(); ) {
is_reversed = false; if (*it == this) {
cmdFlag = 0; it = overlayTarget->overlayed.erase(it);
code = 0; }
chain_code = 0; else
location = 0; ++it;
type = 0; }
alias = 0; overlayTarget = nullptr;
level = 0; }
rank = 0; for (auto& card : overlayed) {
link = 0; card->overlayTarget = nullptr;
race = 0; }
attribute = 0; overlayed.clear();
attack = 0;
defense = 0;
base_attack = 0;
base_defense = 0;
lscale = 0;
rscale = 0;
link_marker = 0;
position = 0;
cHint = 0;
chValue = 0;
atkstring[0] = 0;
defstring[0] = 0;
lvstring[0] = 0;
linkstring[0] = 0;
rscstring[0] = 0;
lscstring[0] = 0;
overlayTarget = 0;
equipTarget = 0;
} }
void ClientCard::SetCode(int code) { void ClientCard::SetCode(int code) {
if((location == LOCATION_HAND) && (this->code != (unsigned int)code)) { if((location == LOCATION_HAND) && (this->code != (unsigned int)code)) {
...@@ -57,13 +39,16 @@ void ClientCard::SetCode(int code) { ...@@ -57,13 +39,16 @@ void ClientCard::SetCode(int code) {
} else } else
this->code = code; this->code = code;
} }
void ClientCard::UpdateInfo(char* buf) { void ClientCard::UpdateInfo(unsigned char* buf) {
int flag = BufferIO::ReadInt32(buf); int flag = BufferIO::ReadInt32(buf);
if(flag == 0) if (flag == 0) {
ClearData();
return; return;
int pdata; }
if(flag & QUERY_CODE) { if(flag & QUERY_CODE) {
pdata = BufferIO::ReadInt32(buf); int pdata = BufferIO::ReadInt32(buf);
if (!pdata)
ClearData();
if((location == LOCATION_HAND) && ((unsigned int)pdata != code)) { if((location == LOCATION_HAND) && ((unsigned int)pdata != code)) {
code = pdata; code = pdata;
mainGame->dField.MoveCard(this, 5); mainGame->dField.MoveCard(this, 5);
...@@ -71,7 +56,7 @@ void ClientCard::UpdateInfo(char* buf) { ...@@ -71,7 +56,7 @@ void ClientCard::UpdateInfo(char* buf) {
code = pdata; code = pdata;
} }
if(flag & QUERY_POSITION) { if(flag & QUERY_POSITION) {
pdata = (BufferIO::ReadInt32(buf) >> 24) & 0xff; int pdata = (BufferIO::ReadInt32(buf) >> 24) & 0xff;
if((location & (LOCATION_EXTRA | LOCATION_REMOVED)) && (u8)pdata != position) { if((location & (LOCATION_EXTRA | LOCATION_REMOVED)) && (u8)pdata != position) {
position = pdata; position = pdata;
mainGame->dField.MoveCard(this, 1); mainGame->dField.MoveCard(this, 1);
...@@ -83,14 +68,14 @@ void ClientCard::UpdateInfo(char* buf) { ...@@ -83,14 +68,14 @@ void ClientCard::UpdateInfo(char* buf) {
if(flag & QUERY_TYPE) if(flag & QUERY_TYPE)
type = BufferIO::ReadInt32(buf); type = BufferIO::ReadInt32(buf);
if(flag & QUERY_LEVEL) { if(flag & QUERY_LEVEL) {
pdata = BufferIO::ReadInt32(buf); int pdata = BufferIO::ReadInt32(buf);
if(level != (unsigned int)pdata) { if(level != (unsigned int)pdata) {
level = pdata; level = pdata;
myswprintf(lvstring, L"L%d", level); myswprintf(lvstring, L"L%d", level);
} }
} }
if(flag & QUERY_RANK) { if(flag & QUERY_RANK) {
pdata = BufferIO::ReadInt32(buf); int pdata = BufferIO::ReadInt32(buf);
if(pdata && rank != (unsigned int)pdata) { if(pdata && rank != (unsigned int)pdata) {
rank = pdata; rank = pdata;
myswprintf(lvstring, L"R%d", rank); myswprintf(lvstring, L"R%d", rank);
...@@ -133,8 +118,10 @@ void ClientCard::UpdateInfo(char* buf) { ...@@ -133,8 +118,10 @@ void ClientCard::UpdateInfo(char* buf) {
int s = BufferIO::ReadInt8(buf); int s = BufferIO::ReadInt8(buf);
BufferIO::ReadInt8(buf); BufferIO::ReadInt8(buf);
ClientCard* ecard = mainGame->dField.GetCard(mainGame->LocalPlayer(c), l, s); ClientCard* ecard = mainGame->dField.GetCard(mainGame->LocalPlayer(c), l, s);
equipTarget = ecard; if (ecard) {
ecard->equipped.insert(this); equipTarget = ecard;
ecard->equipped.insert(this);
}
} }
if(flag & QUERY_TARGET_CARD) { if(flag & QUERY_TARGET_CARD) {
int count = BufferIO::ReadInt32(buf); int count = BufferIO::ReadInt32(buf);
...@@ -144,8 +131,10 @@ void ClientCard::UpdateInfo(char* buf) { ...@@ -144,8 +131,10 @@ void ClientCard::UpdateInfo(char* buf) {
int s = BufferIO::ReadInt8(buf); int s = BufferIO::ReadInt8(buf);
BufferIO::ReadInt8(buf); BufferIO::ReadInt8(buf);
ClientCard* tcard = mainGame->dField.GetCard(mainGame->LocalPlayer(c), l, s); ClientCard* tcard = mainGame->dField.GetCard(mainGame->LocalPlayer(c), l, s);
cardTarget.insert(tcard); if (tcard) {
tcard->ownerTarget.insert(this); cardTarget.insert(tcard);
tcard->ownerTarget.insert(this);
}
} }
} }
if(flag & QUERY_OVERLAY_CARD) { if(flag & QUERY_OVERLAY_CARD) {
...@@ -175,7 +164,7 @@ void ClientCard::UpdateInfo(char* buf) { ...@@ -175,7 +164,7 @@ void ClientCard::UpdateInfo(char* buf) {
myswprintf(rscstring, L"%d", rscale); myswprintf(rscstring, L"%d", rscale);
} }
if(flag & QUERY_LINK) { if(flag & QUERY_LINK) {
pdata = BufferIO::ReadInt32(buf); int pdata = BufferIO::ReadInt32(buf);
if (link != (unsigned int)pdata) { if (link != (unsigned int)pdata) {
link = pdata; link = pdata;
} }
...@@ -198,6 +187,31 @@ void ClientCard::ClearTarget() { ...@@ -198,6 +187,31 @@ void ClientCard::ClearTarget() {
cardTarget.clear(); cardTarget.clear();
ownerTarget.clear(); ownerTarget.clear();
} }
void ClientCard::ClearData() {
alias = 0;
type = 0;
level = 0;
rank = 0;
race = 0;
attribute = 0;
attack = 0;
defense = 0;
base_attack = 0;
base_defense = 0;
lscale = 0;
rscale = 0;
link = 0;
link_marker = 0;
status = 0;
atkstring[0] = 0;
defstring[0] = 0;
lvstring[0] = 0;
linkstring[0] = 0;
rscstring[0] = 0;
lscstring[0] = 0;
counters.clear();
}
bool ClientCard::client_card_sort(ClientCard* c1, ClientCard* c2) { bool ClientCard::client_card_sort(ClientCard* c1, ClientCard* c2) {
if(c1->is_selected != c2->is_selected) if(c1->is_selected != c2->is_selected)
return c1->is_selected < c2->is_selected; return c1->is_selected < c2->is_selected;
...@@ -207,23 +221,26 @@ bool ClientCard::client_card_sort(ClientCard* c1, ClientCard* c2) { ...@@ -207,23 +221,26 @@ bool ClientCard::client_card_sort(ClientCard* c1, ClientCard* c2) {
return cp1 < cp2; return cp1 < cp2;
if(c1->location != c2->location) if(c1->location != c2->location)
return c1->location < c2->location; return c1->location < c2->location;
if(c1->location & LOCATION_OVERLAY) if (c1->location & LOCATION_OVERLAY) {
if(c1->overlayTarget != c2->overlayTarget) if (c1->overlayTarget != c2->overlayTarget)
return c1->overlayTarget->sequence < c2->overlayTarget->sequence; return c1->overlayTarget->sequence < c2->overlayTarget->sequence;
else return c1->sequence < c2->sequence; else
return c1->sequence < c2->sequence;
}
else { else {
if(c1->location & (LOCATION_DECK | LOCATION_GRAVE | LOCATION_REMOVED | LOCATION_EXTRA)) { if(c1->location & (LOCATION_DECK | LOCATION_GRAVE | LOCATION_REMOVED | LOCATION_EXTRA)) {
auto it1 = std::find_if(mainGame->dField.chains.rbegin(), mainGame->dField.chains.rend(), [c1](const auto& ch) { auto it1 = std::find_if(mainGame->dField.chains.rbegin(), mainGame->dField.chains.rend(), [c1](const ChainInfo& ch) {
return c1 == ch.chain_card || ch.target.find(c1) != ch.target.end(); return c1 == ch.chain_card || ch.target.find(c1) != ch.target.end();
}); });
auto it2 = std::find_if(mainGame->dField.chains.rbegin(), mainGame->dField.chains.rend(), [c2](const auto& ch) { auto it2 = std::find_if(mainGame->dField.chains.rbegin(), mainGame->dField.chains.rend(), [c2](const ChainInfo& ch) {
return c2 == ch.chain_card || ch.target.find(c2) != ch.target.end(); return c2 == ch.chain_card || ch.target.find(c2) != ch.target.end();
}); });
if(it1 != mainGame->dField.chains.rend() || it2 != mainGame->dField.chains.rend()) { if(it1 != mainGame->dField.chains.rend() || it2 != mainGame->dField.chains.rend()) {
return it1 < it2; return it1 < it2;
} }
return c1->sequence > c2->sequence; return c1->sequence > c2->sequence;
} else }
else
return c1->sequence < c2->sequence; return c1->sequence < c2->sequence;
} }
} }
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define CLIENT_CARD_H #define CLIENT_CARD_H
#include "config.h" #include "config.h"
#include "../ocgcore/card_data.h"
#include <vector> #include <vector>
#include <set> #include <set>
#include <map> #include <map>
...@@ -9,35 +10,10 @@ ...@@ -9,35 +10,10 @@
namespace ygo { namespace ygo {
struct CardData { using CardData = card_data;
unsigned int code; struct CardDataC : card_data {
unsigned int alias; unsigned int ot{};
unsigned long long setcode; unsigned int category{};
unsigned int type;
unsigned int level;
unsigned int attribute;
unsigned int race;
int attack;
int defense;
unsigned int lscale;
unsigned int rscale;
unsigned int link_marker;
};
struct CardDataC {
unsigned int code;
unsigned int alias;
unsigned long long setcode;
unsigned int type;
unsigned int level;
unsigned int attribute;
unsigned int race;
int attack;
int defense;
unsigned int lscale;
unsigned int rscale;
unsigned int link_marker;
unsigned int ot;
unsigned int category;
}; };
struct CardString { struct CardString {
std::wstring name; std::wstring name;
...@@ -45,6 +21,7 @@ struct CardString { ...@@ -45,6 +21,7 @@ struct CardString {
std::wstring desc[16]; std::wstring desc[16];
}; };
typedef std::unordered_map<unsigned int, CardDataC>::const_iterator code_pointer; typedef std::unordered_map<unsigned int, CardDataC>::const_iterator code_pointer;
typedef std::unordered_map<unsigned int, CardString>::const_iterator string_pointer;
class ClientCard { class ClientCard {
public: public:
...@@ -53,67 +30,70 @@ public: ...@@ -53,67 +30,70 @@ public:
irr::core::vector3df curRot; irr::core::vector3df curRot;
irr::core::vector3df dPos; irr::core::vector3df dPos;
irr::core::vector3df dRot; irr::core::vector3df dRot;
u32 curAlpha; u32 curAlpha{ 255 };
u32 dAlpha; u32 dAlpha{ 0 };
u32 aniFrame; u32 aniFrame{ 0 };
bool is_moving; bool is_moving{ false };
bool is_fading; bool is_fading{ false };
bool is_hovered; bool is_hovered{ false };
bool is_selectable; bool is_selectable{ false };
bool is_selected; bool is_selected{ false };
bool is_showequip; bool is_showequip{ false };
bool is_showtarget; bool is_showtarget{ false };
bool is_showchaintarget; bool is_showchaintarget{ false };
bool is_highlighting; bool is_highlighting{ false };
bool is_reversed; bool is_reversed{ false };
u32 code;
u32 chain_code; unsigned int code{ 0 };
u32 alias; unsigned int chain_code{ 0 };
u32 type; unsigned int alias{ 0 };
u32 level; unsigned int type{ 0 };
u32 rank; unsigned int level{ 0 };
u32 link; unsigned int rank{ 0 };
u32 attribute; unsigned int link{ 0 };
u32 race; unsigned int attribute{ 0 };
s32 attack; unsigned int race{ 0 };
s32 defense; int attack{ 0 };
s32 base_attack; int defense{ 0 };
s32 base_defense; int base_attack{ 0 };
u32 lscale; int base_defense{ 0 };
u32 rscale; unsigned int lscale{ 0 };
u32 link_marker; unsigned int rscale{ 0 };
u32 reason; unsigned int link_marker{ 0 };
u32 select_seq; unsigned int reason{ 0 };
u8 owner; unsigned int select_seq{ 0 };
u8 controler; unsigned char owner{ PLAYER_NONE };
u8 location; unsigned char controler{ PLAYER_NONE };
u8 sequence; unsigned char location{ 0 };
u8 position; unsigned char sequence{ 0 };
u32 status; unsigned char position{ 0 };
u8 cHint; unsigned int status{ 0 };
u32 chValue; unsigned char cHint{ 0 };
u32 opParam; unsigned int chValue{ 0 };
u32 symbol; unsigned int opParam{ 0 };
u32 cmdFlag; unsigned int symbol{ 0 };
ClientCard* overlayTarget; unsigned int cmdFlag{ 0 };
ClientCard* overlayTarget{ nullptr };
std::vector<ClientCard*> overlayed; std::vector<ClientCard*> overlayed;
ClientCard* equipTarget; ClientCard* equipTarget{ nullptr };
std::set<ClientCard*> equipped; std::set<ClientCard*> equipped;
std::set<ClientCard*> cardTarget; std::set<ClientCard*> cardTarget;
std::set<ClientCard*> ownerTarget; std::set<ClientCard*> ownerTarget;
std::map<int, int> counters; std::map<int, int> counters;
std::map<int, int> desc_hints; std::map<int, int> desc_hints;
wchar_t atkstring[16]; wchar_t atkstring[16]{};
wchar_t defstring[16]; wchar_t defstring[16]{};
wchar_t lvstring[16]; wchar_t lvstring[16]{};
wchar_t linkstring[16]; wchar_t linkstring[16]{};
wchar_t lscstring[16]; wchar_t lscstring[16]{};
wchar_t rscstring[16]; wchar_t rscstring[16]{};
ClientCard(); ClientCard() = default;
~ClientCard();
void SetCode(int code); void SetCode(int code);
void UpdateInfo(char* buf); void UpdateInfo(unsigned char* buf);
void ClearTarget(); void ClearTarget();
void ClearData();
static bool client_card_sort(ClientCard* c1, ClientCard* c2); static bool client_card_sort(ClientCard* c1, ClientCard* c2);
static bool deck_sort_lv(code_pointer l1, code_pointer l2); static bool deck_sort_lv(code_pointer l1, code_pointer l2);
static bool deck_sort_atk(code_pointer l1, code_pointer l2); static bool deck_sort_atk(code_pointer l1, code_pointer l2);
......
...@@ -11,31 +11,50 @@ ...@@ -11,31 +11,50 @@
namespace ygo { namespace ygo {
ClientField::ClientField() { ClientField::ClientField() {
panel = 0;
hovered_card = 0;
clicked_card = 0;
highlighting_card = 0;
menu_card = 0;
hovered_controler = 0;
hovered_location = 0;
hovered_sequence = 0;
selectable_field = 0;
selected_field = 0;
deck_act = false;
grave_act = false;
remove_act = false;
extra_act = false;
pzone_act[0] = false;
pzone_act[1] = false;
conti_act = false;
deck_reversed = false;
conti_selecting = false;
cant_check_grave = false;
for(int p = 0; p < 2; ++p) { for(int p = 0; p < 2; ++p) {
mzone[p].resize(7, 0); mzone[p].resize(7, 0);
szone[p].resize(8, 0); szone[p].resize(8, 0);
} }
rnd.reset(std::random_device()()); rnd.reset((uint_fast32_t)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]) {
if (card)
delete card;
card = nullptr;
}
for (auto& card : szone[i]) {
if (card)
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();
} }
void ClientField::Clear() { void ClientField::Clear() {
for(int i = 0; i < 2; ++i) { for(int i = 0; i < 2; ++i) {
...@@ -303,12 +322,13 @@ ClientCard* ClientField::RemoveCard(int controler, int location, int sequence) { ...@@ -303,12 +322,13 @@ ClientCard* ClientField::RemoveCard(int controler, int location, int sequence) {
pcard->location = 0; pcard->location = 0;
return pcard; return pcard;
} }
void ClientField::UpdateCard(int controler, int location, int sequence, char* data) { void ClientField::UpdateCard(int controler, int location, int sequence, unsigned char* data) {
ClientCard* pcard = GetCard(controler, location, sequence); ClientCard* pcard = GetCard(controler, location, sequence);
if(pcard) int len = BufferIO::ReadInt32(data);
pcard->UpdateInfo(data + 4); if (pcard && len > LEN_HEADER)
pcard->UpdateInfo(data);
} }
void ClientField::UpdateFieldCard(int controler, int location, char* data) { void ClientField::UpdateFieldCard(int controler, int location, unsigned char* data) {
std::vector<ClientCard*>* lst = 0; std::vector<ClientCard*>* lst = 0;
switch(location) { switch(location) {
case LOCATION_DECK: case LOCATION_DECK:
...@@ -338,7 +358,7 @@ void ClientField::UpdateFieldCard(int controler, int location, char* data) { ...@@ -338,7 +358,7 @@ void ClientField::UpdateFieldCard(int controler, int location, char* data) {
int len; int len;
for(auto cit = lst->begin(); cit != lst->end(); ++cit) { for(auto cit = lst->begin(); cit != lst->end(); ++cit) {
len = BufferIO::ReadInt32(data); len = BufferIO::ReadInt32(data);
if(len > 8) if(len > LEN_HEADER)
(*cit)->UpdateInfo(data); (*cit)->UpdateInfo(data);
data += len - 4; data += len - 4;
} }
...@@ -595,11 +615,11 @@ void ClientField::ShowLocationCard() { ...@@ -595,11 +615,11 @@ void ClientField::ShowLocationCard() {
mainGame->stDisplayPos[i]->setBackgroundColor(0xffffffff); mainGame->stDisplayPos[i]->setBackgroundColor(0xffffffff);
} else if(display_cards[i]->location == LOCATION_EXTRA || display_cards[i]->location == LOCATION_REMOVED) { } else if(display_cards[i]->location == LOCATION_EXTRA || display_cards[i]->location == LOCATION_REMOVED) {
if(display_cards[i]->position & POS_FACEDOWN) if(display_cards[i]->position & POS_FACEDOWN)
mainGame->stCardPos[i]->setOverrideColor(0xff0000ff); mainGame->stDisplayPos[i]->setOverrideColor(0xff0000ff);
if(display_cards[i]->controler) if(display_cards[i]->controler)
mainGame->stCardPos[i]->setBackgroundColor(0xffd0d0d0); mainGame->stDisplayPos[i]->setBackgroundColor(0xffd0d0d0);
else else
mainGame->stCardPos[i]->setBackgroundColor(0xffffffff); mainGame->stDisplayPos[i]->setBackgroundColor(0xffffffff);
} else { } else {
if(display_cards[i]->controler) if(display_cards[i]->controler)
mainGame->stDisplayPos[i]->setBackgroundColor(0xffd0d0d0); mainGame->stDisplayPos[i]->setBackgroundColor(0xffd0d0d0);
...@@ -848,6 +868,9 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir ...@@ -848,6 +868,9 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir
int sequence = pcard->sequence; int sequence = pcard->sequence;
int location = pcard->location; int location = pcard->location;
int rule = (mainGame->dInfo.duel_rule >= 4) ? 1 : 0; int rule = (mainGame->dInfo.duel_rule >= 4) ? 1 : 0;
const float overlay_buttom = 0.0f;
const float material_height = 0.003f;
const float mzone_buttom = 0.020f;
switch (location) { switch (location) {
case LOCATION_DECK: { case LOCATION_DECK: {
t->X = (matManager.vFieldDeck[controler][0].Pos.X + matManager.vFieldDeck[controler][1].Pos.X) / 2; t->X = (matManager.vFieldDeck[controler][0].Pos.X + matManager.vFieldDeck[controler][1].Pos.X) / 2;
...@@ -927,7 +950,7 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir ...@@ -927,7 +950,7 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir
case LOCATION_MZONE: { case LOCATION_MZONE: {
t->X = (matManager.vFieldMzone[controler][sequence][0].Pos.X + matManager.vFieldMzone[controler][sequence][1].Pos.X) / 2; t->X = (matManager.vFieldMzone[controler][sequence][0].Pos.X + matManager.vFieldMzone[controler][sequence][1].Pos.X) / 2;
t->Y = (matManager.vFieldMzone[controler][sequence][0].Pos.Y + matManager.vFieldMzone[controler][sequence][2].Pos.Y) / 2; t->Y = (matManager.vFieldMzone[controler][sequence][0].Pos.Y + matManager.vFieldMzone[controler][sequence][2].Pos.Y) / 2;
t->Z = 0.01f; t->Z = mzone_buttom;
if (controler == 0) { if (controler == 0) {
if (pcard->position & POS_DEFENSE) { if (pcard->position & POS_DEFENSE) {
r->X = 0.0f; r->X = 0.0f;
...@@ -1040,21 +1063,22 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir ...@@ -1040,21 +1063,22 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir
break; break;
} }
case LOCATION_OVERLAY: { case LOCATION_OVERLAY: {
if (pcard->overlayTarget->location != 0x4) { if (pcard->overlayTarget->location != LOCATION_MZONE) {
return; return;
} }
int oseq = pcard->overlayTarget->sequence; int oseq = pcard->overlayTarget->sequence;
int mseq = (sequence < MAX_LAYER_COUNT) ? sequence : (MAX_LAYER_COUNT - 1);
if (pcard->overlayTarget->controler == 0) { if (pcard->overlayTarget->controler == 0) {
t->X = (matManager.vFieldMzone[0][oseq][0].Pos.X + matManager.vFieldMzone[0][oseq][1].Pos.X) / 2 - 0.12f + 0.06f * sequence; t->X = (matManager.vFieldMzone[0][oseq][0].Pos.X + matManager.vFieldMzone[0][oseq][1].Pos.X) / 2 - 0.12f + 0.06f * mseq;
t->Y = (matManager.vFieldMzone[0][oseq][0].Pos.Y + matManager.vFieldMzone[0][oseq][2].Pos.Y) / 2 + 0.05f; t->Y = (matManager.vFieldMzone[0][oseq][0].Pos.Y + matManager.vFieldMzone[0][oseq][2].Pos.Y) / 2 + 0.05f;
t->Z = 0.005f + pcard->sequence * 0.0001f; t->Z = overlay_buttom + mseq * material_height;
r->X = 0.0f; r->X = 0.0f;
r->Y = 0.0f; r->Y = 0.0f;
r->Z = 0.0f; r->Z = 0.0f;
} else { } else {
t->X = (matManager.vFieldMzone[1][oseq][0].Pos.X + matManager.vFieldMzone[1][oseq][1].Pos.X) / 2 + 0.12f - 0.06f * sequence; t->X = (matManager.vFieldMzone[1][oseq][0].Pos.X + matManager.vFieldMzone[1][oseq][1].Pos.X) / 2 + 0.12f - 0.06f * mseq;
t->Y = (matManager.vFieldMzone[1][oseq][0].Pos.Y + matManager.vFieldMzone[1][oseq][2].Pos.Y) / 2 - 0.05f; t->Y = (matManager.vFieldMzone[1][oseq][0].Pos.Y + matManager.vFieldMzone[1][oseq][2].Pos.Y) / 2 - 0.05f;
t->Z = 0.005f + pcard->sequence * 0.0001f; t->Z = overlay_buttom + mseq * material_height;
r->X = 0.0f; r->X = 0.0f;
r->Y = 0.0f; r->Y = 0.0f;
r->Z = 3.1415926f; r->Z = 3.1415926f;
...@@ -1465,15 +1489,7 @@ static bool is_declarable(T const& cd, const std::vector<int>& opcode) { ...@@ -1465,15 +1489,7 @@ static bool is_declarable(T const& cd, const std::vector<int>& opcode) {
if (stack.size() >= 1) { if (stack.size() >= 1) {
int set_code = stack.top(); int set_code = stack.top();
stack.pop(); stack.pop();
unsigned long long sc = cd.setcode; bool res = cd.is_setcode(set_code);
bool res = false;
int settype = set_code & 0xfff;
int setsubtype = set_code & 0xf000;
while (sc) {
if ((sc & 0xfff) == settype && (sc & 0xf000 & setsubtype) == setsubtype)
res = true;
sc = sc >> 16;
}
stack.push(res); stack.push(res);
} }
break; break;
...@@ -1531,9 +1547,11 @@ void ClientField::UpdateDeclarableList() { ...@@ -1531,9 +1547,11 @@ void ClientField::UpdateDeclarableList() {
} }
mainGame->lstANCard->clear(); mainGame->lstANCard->clear();
ancard.clear(); ancard.clear();
for(auto cit = dataManager._strings.begin(); cit != dataManager._strings.end(); ++cit) { for(auto cit = dataManager.strings_begin; cit != dataManager.strings_end; ++cit) {
if(cit->second.name.find(pname) != std::wstring::npos) { if(cit->second.name.find(pname) != std::wstring::npos) {
auto cp = dataManager.GetCodePointer(cit->first); //verified by _strings auto cp = dataManager.GetCodePointer(cit->first);
if (cp == dataManager.datas_end)
continue;
//datas.alias can be double card names or alias //datas.alias can be double card names or alias
if(is_declarable(cp->second, declare_opcodes)) { if(is_declarable(cp->second, declare_opcodes)) {
if(pname == cit->second.name || trycode == cit->first) { //exact match or last used if(pname == cit->second.name || trycode == cit->first) { //exact match or last used
......
...@@ -13,13 +13,13 @@ class ClientCard; ...@@ -13,13 +13,13 @@ class ClientCard;
struct ChainInfo { struct ChainInfo {
irr::core::vector3df chain_pos; irr::core::vector3df chain_pos;
ClientCard* chain_card; ClientCard* chain_card{ nullptr };
int code; int code{ 0 };
int desc; int desc{ 0 };
int controler; int controler{ 0 };
int location; int location{ 0 };
int sequence; int sequence{ 0 };
bool solved; bool solved{ false };
std::set<ClientCard*> target; std::set<ClientCard*> target;
}; };
...@@ -33,6 +33,7 @@ public: ...@@ -33,6 +33,7 @@ public:
std::vector<ClientCard*> remove[2]; std::vector<ClientCard*> remove[2];
std::vector<ClientCard*> extra[2]; std::vector<ClientCard*> extra[2];
std::set<ClientCard*> overlay_cards; std::set<ClientCard*> overlay_cards;
std::vector<ClientCard*> summonable_cards; std::vector<ClientCard*> summonable_cards;
std::vector<ClientCard*> spsummonable_cards; std::vector<ClientCard*> spsummonable_cards;
std::vector<ClientCard*> msetable_cards; std::vector<ClientCard*> msetable_cards;
...@@ -45,25 +46,25 @@ public: ...@@ -45,25 +46,25 @@ public:
std::vector<int> select_options; std::vector<int> select_options;
std::vector<int> select_options_index; std::vector<int> select_options_index;
std::vector<ChainInfo> chains; std::vector<ChainInfo> chains;
int extra_p_count[2]; int extra_p_count[2]{};
size_t selected_option; size_t selected_option{ 0 };
ClientCard* attacker; ClientCard* attacker{ nullptr };
ClientCard* attack_target; ClientCard* attack_target{ nullptr };
unsigned int disabled_field; unsigned int disabled_field{ 0 };
unsigned int selectable_field; unsigned int selectable_field{ 0 };
unsigned int selected_field; unsigned int selected_field{ 0 };
int select_min; int select_min{ 0 };
int select_max; int select_max{ 0 };
int must_select_count; int must_select_count{ 0 };
int select_sumval; int select_sumval{ 0 };
int select_mode; int select_mode{ 0 };
bool select_cancelable; bool select_cancelable{ false };
bool select_panalmode; bool select_panalmode{ false };
bool select_ready; bool select_ready{ false };
int announce_count; int announce_count{ 0 };
int select_counter_count; int select_counter_count{ 0 };
int select_counter_type; int select_counter_type{ 0 };
std::vector<ClientCard*> selectable_cards; std::vector<ClientCard*> selectable_cards;
std::vector<ClientCard*> selected_cards; std::vector<ClientCard*> selected_cards;
std::set<ClientCard*> selectsum_cards; std::set<ClientCard*> selectsum_cards;
...@@ -72,28 +73,29 @@ public: ...@@ -72,28 +73,29 @@ public:
std::vector<ClientCard*> display_cards; std::vector<ClientCard*> display_cards;
std::vector<int> sort_list; std::vector<int> sort_list;
std::map<int, int> player_desc_hints[2]; std::map<int, int> player_desc_hints[2];
bool grave_act; bool grave_act{ false };
bool remove_act; bool remove_act{ false };
bool deck_act; bool deck_act{ false };
bool extra_act; bool extra_act{ false };
bool pzone_act[2]; bool pzone_act[2]{};
bool conti_act; bool conti_act{ false };
bool chain_forced; bool chain_forced{ false };
ChainInfo current_chain; ChainInfo current_chain;
bool last_chain; bool last_chain{ false };
bool deck_reversed; bool deck_reversed{ false };
bool conti_selecting; bool conti_selecting{ false };
bool cant_check_grave; bool cant_check_grave{ false };
mt19937 rnd; mt19937 rnd;
ClientField(); ClientField();
~ClientField();
void Clear(); void Clear();
void Initial(int player, int deckc, int extrac); void Initial(int player, int deckc, int extrac);
ClientCard* GetCard(int controler, int location, int sequence, int sub_seq = 0); ClientCard* GetCard(int controler, int location, int sequence, int sub_seq = 0);
void AddCard(ClientCard* pcard, int controler, int location, int sequence); void AddCard(ClientCard* pcard, int controler, int location, int sequence);
ClientCard* RemoveCard(int controler, int location, int sequence); ClientCard* RemoveCard(int controler, int location, int sequence);
void UpdateCard(int controler, int location, int sequence, char* data); void UpdateCard(int controler, int location, int sequence, unsigned char* data);
void UpdateFieldCard(int controler, int location, char* data); void UpdateFieldCard(int controler, int location, unsigned char* data);
void ClearCommandFlag(); void ClearCommandFlag();
void ClearSelect(); void ClearSelect();
void ClearChainSelect(); void ClearChainSelect();
...@@ -121,21 +123,21 @@ public: ...@@ -121,21 +123,21 @@ public:
void UpdateDeclarableList(); void UpdateDeclarableList();
irr::gui::IGUIElement* panel; irr::gui::IGUIElement* panel{ nullptr };
std::vector<int> ancard; std::vector<int> ancard;
int hovered_controler; int hovered_controler{ 0 };
int hovered_location; int hovered_location{ 0 };
size_t hovered_sequence; size_t hovered_sequence{ 0 };
int command_controler; int command_controler{ 0 };
int command_location; int command_location{ 0 };
size_t command_sequence; size_t command_sequence{ 0 };
ClientCard* hovered_card; ClientCard* hovered_card{ nullptr };
int hovered_player; int hovered_player{ 0 };
ClientCard* clicked_card; ClientCard* clicked_card{ nullptr };
ClientCard* command_card; ClientCard* command_card{ nullptr };
ClientCard* highlighting_card; ClientCard* highlighting_card{ nullptr };
ClientCard* menu_card; ClientCard* menu_card{ nullptr };
int list_command; int list_command{ 0 };
virtual bool OnEvent(const irr::SEvent& event); virtual bool OnEvent(const irr::SEvent& event);
virtual bool OnCommonEvent(const irr::SEvent& event); virtual bool OnCommonEvent(const irr::SEvent& event);
......
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
#define IRR_COMPILE_WITH_DX9_DEV_PACK #define IRR_COMPILE_WITH_DX9_DEV_PACK
#ifdef _WIN32 #ifdef _WIN32
#include <WinSock2.h>
#define NOMINMAX #define NOMINMAX
#include <WinSock2.h>
#include <windows.h> #include <windows.h>
#include <ws2tcpip.h> #include <ws2tcpip.h>
...@@ -69,7 +69,6 @@ inline int myswprintf(wchar_t(&buf)[N], const wchar_t* fmt, TR... args) { ...@@ -69,7 +69,6 @@ inline int myswprintf(wchar_t(&buf)[N], const wchar_t* fmt, TR... args) {
#include <iostream> #include <iostream>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <memory.h>
#include <time.h> #include <time.h>
#include <thread> #include <thread>
#include <mutex> #include <mutex>
...@@ -87,6 +86,8 @@ using namespace video; ...@@ -87,6 +86,8 @@ using namespace video;
using namespace io; using namespace io;
using namespace gui; using namespace gui;
typedef int BOOL;
extern const unsigned short PRO_VERSION; extern const unsigned short PRO_VERSION;
extern int enable_log; extern int enable_log;
extern bool exit_on_return; extern bool exit_on_return;
......
...@@ -9,6 +9,13 @@ byte DataManager::scriptBuffer[0x20000]; ...@@ -9,6 +9,13 @@ byte DataManager::scriptBuffer[0x20000];
IFileSystem* DataManager::FileSystem; IFileSystem* DataManager::FileSystem;
DataManager dataManager; DataManager dataManager;
DataManager::DataManager() : _datas(16384), _strings(16384) {
datas_begin = _datas.begin();
datas_end = _datas.end();
strings_begin = _strings.begin();
strings_end = _strings.end();
extra_setcode = { {8512558u, {0x8f, 0x54, 0x59, 0x82, 0x13a}}, };
}
bool DataManager::LoadDB(const wchar_t* wfile) { bool DataManager::LoadDB(const wchar_t* wfile) {
char file[256]; char file[256];
BufferIO::EncodeUTF8(wfile, file); BufferIO::EncodeUTF8(wfile, file);
...@@ -34,11 +41,11 @@ bool DataManager::LoadDB(const wchar_t* wfile) { ...@@ -34,11 +41,11 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
const char* sql = "select * from datas,texts where datas.id=texts.id"; const char* sql = "select * from datas,texts where datas.id=texts.id";
if(sqlite3_prepare_v2(pDB, sql, -1, &pStmt, 0) != SQLITE_OK) if(sqlite3_prepare_v2(pDB, sql, -1, &pStmt, 0) != SQLITE_OK)
return Error(&db); return Error(&db);
CardDataC cd;
CardString cs;
wchar_t strBuffer[4096]; wchar_t strBuffer[4096];
int step = 0; int step = 0;
do { do {
CardDataC cd;
CardString cs;
step = sqlite3_step(pStmt); step = sqlite3_step(pStmt);
if(step == SQLITE_BUSY || step == SQLITE_ERROR || step == SQLITE_MISUSE) if(step == SQLITE_BUSY || step == SQLITE_ERROR || step == SQLITE_MISUSE)
return Error(&db, pStmt); return Error(&db, pStmt);
...@@ -46,7 +53,16 @@ bool DataManager::LoadDB(const wchar_t* wfile) { ...@@ -46,7 +53,16 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
cd.code = sqlite3_column_int(pStmt, 0); cd.code = sqlite3_column_int(pStmt, 0);
cd.ot = sqlite3_column_int(pStmt, 1); cd.ot = sqlite3_column_int(pStmt, 1);
cd.alias = sqlite3_column_int(pStmt, 2); cd.alias = sqlite3_column_int(pStmt, 2);
cd.setcode = sqlite3_column_int64(pStmt, 3); auto it = extra_setcode.find(cd.code);
if (it != extra_setcode.end()) {
int len = it->second.size();
if (len > SIZE_SETCODE)
len = SIZE_SETCODE;
if (len)
memcpy(cd.setcode, it->second.data(), len * sizeof(uint16_t));
}
else
cd.set_setcode(sqlite3_column_int64(pStmt, 3));
cd.type = sqlite3_column_int(pStmt, 4); cd.type = sqlite3_column_int(pStmt, 4);
cd.attack = sqlite3_column_int(pStmt, 5); cd.attack = sqlite3_column_int(pStmt, 5);
cd.defense = sqlite3_column_int(pStmt, 6); cd.defense = sqlite3_column_int(pStmt, 6);
...@@ -83,6 +99,10 @@ bool DataManager::LoadDB(const wchar_t* wfile) { ...@@ -83,6 +99,10 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
sqlite3_finalize(pStmt); sqlite3_finalize(pStmt);
spmemvfs_close_db(&db); spmemvfs_close_db(&db);
spmemvfs_env_fini(); spmemvfs_env_fini();
datas_begin = _datas.begin();
datas_end = _datas.end();
strings_begin = _strings.begin();
strings_end = _strings.end();
return true; return true;
} }
bool DataManager::LoadStrings(const char* file) { bool DataManager::LoadStrings(const char* file) {
...@@ -147,17 +167,33 @@ bool DataManager::Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt) { ...@@ -147,17 +167,33 @@ bool DataManager::Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt) {
spmemvfs_env_fini(); spmemvfs_env_fini();
return false; return false;
} }
bool DataManager::GetData(int code, CardData* pData) { bool DataManager::GetData(unsigned int code, CardData* pData) {
auto cdit = _datas.find(code); code_pointer cdit = _datas.find(code);
if(cdit == _datas.end()) if(cdit == _datas.end())
return false; return false;
if(pData) auto& data = cdit->second;
*pData = *((CardData*)&cdit->second); if (pData) {
pData->code = data.code;
pData->alias = data.alias;
memcpy(pData->setcode, data.setcode, SIZE_SETCODE);
pData->type = data.type;
pData->level = data.level;
pData->attribute = data.attribute;
pData->race = data.race;
pData->attack = data.attack;
pData->defense = data.defense;
pData->lscale = data.lscale;
pData->rscale = data.rscale;
pData->link_marker = data.link_marker;
}
return true; return true;
} }
code_pointer DataManager::GetCodePointer(int code) { code_pointer DataManager::GetCodePointer(unsigned int code) const {
return _datas.find(code); return _datas.find(code);
} }
string_pointer DataManager::GetStringPointer(unsigned int code) const {
return _strings.find(code);
}
bool DataManager::GetString(int code, CardString* pStr) { bool DataManager::GetString(int code, CardString* pStr) {
auto csit = _strings.find(code); auto csit = _strings.find(code);
if(csit == _strings.end()) { if(csit == _strings.end()) {
...@@ -279,7 +315,7 @@ const wchar_t* DataManager::FormatRace(int race) { ...@@ -279,7 +315,7 @@ const wchar_t* DataManager::FormatRace(int race) {
wchar_t* p = racBuffer; wchar_t* p = racBuffer;
unsigned filter = 1; unsigned filter = 1;
int i = 1020; int i = 1020;
for(; filter != 0x2000000; filter <<= 1, ++i) { for(; filter < (1 << RACES_COUNT); filter <<= 1, ++i) {
if(race & filter) { if(race & filter) {
BufferIO::CopyWStrRef(GetSysString(i), p, 16); BufferIO::CopyWStrRef(GetSysString(i), p, 16);
*p = L'|'; *p = L'|';
...@@ -309,10 +345,12 @@ const wchar_t* DataManager::FormatType(int type) { ...@@ -309,10 +345,12 @@ const wchar_t* DataManager::FormatType(int type) {
return unknown_string; return unknown_string;
return tpBuffer; return tpBuffer;
} }
const wchar_t* DataManager::FormatSetName(unsigned long long setcode) { const wchar_t* DataManager::FormatSetName(const uint16_t setcode[]) {
wchar_t* p = scBuffer; wchar_t* p = scBuffer;
for(int i = 0; i < 4; ++i) { for(int i = 0; i < 10; ++i) {
const wchar_t* setname = GetSetName((setcode >> i * 16) & 0xffff); if (!setcode[i])
break;
const wchar_t* setname = GetSetName(setcode[i]);
if(setname) { if(setname) {
BufferIO::CopyWStrRef(setname, p, 32); BufferIO::CopyWStrRef(setname, p, 32);
*p = L'|'; *p = L'|';
...@@ -346,9 +384,9 @@ const wchar_t* DataManager::FormatLinkMarker(int link_marker) { ...@@ -346,9 +384,9 @@ const wchar_t* DataManager::FormatLinkMarker(int link_marker) {
BufferIO::CopyWStrRef(L"[\u2198]", p, 4); BufferIO::CopyWStrRef(L"[\u2198]", p, 4);
return lmBuffer; return lmBuffer;
} }
int DataManager::CardReader(int code, void* pData) { uint32 DataManager::CardReader(uint32 code, card_data* pData) {
if(!dataManager.GetData(code, (CardData*)pData)) if (!dataManager.GetData(code, pData))
memset(pData, 0, sizeof(CardData)); pData->clear();
return 0; return 0;
} }
byte* DataManager::ScriptReaderEx(const char* script_name, int* slen) { byte* DataManager::ScriptReaderEx(const char* script_name, int* slen) {
......
...@@ -11,14 +11,15 @@ namespace ygo { ...@@ -11,14 +11,15 @@ namespace ygo {
class DataManager { class DataManager {
public: public:
DataManager(): _datas(8192), _strings(8192) {} DataManager();
bool LoadDB(const wchar_t* wfile); bool LoadDB(const wchar_t* wfile);
bool LoadStrings(const char* file); bool LoadStrings(const char* file);
bool LoadStrings(IReadFile* reader); bool LoadStrings(IReadFile* reader);
void ReadStringConfLine(const char* linebuf); void ReadStringConfLine(const char* linebuf);
bool Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt = 0); bool Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt = 0);
bool GetData(int code, CardData* pData); bool GetData(unsigned int code, CardData* pData);
code_pointer GetCodePointer(int code); code_pointer GetCodePointer(unsigned int code) const;
string_pointer GetStringPointer(unsigned int code) const;
bool GetString(int code, CardString* pStr); bool GetString(int code, CardString* pStr);
const wchar_t* GetName(int code); const wchar_t* GetName(int code);
const wchar_t* GetText(int code); const wchar_t* GetText(int code);
...@@ -33,15 +34,17 @@ public: ...@@ -33,15 +34,17 @@ public:
const wchar_t* FormatAttribute(int attribute); const wchar_t* FormatAttribute(int attribute);
const wchar_t* FormatRace(int race); const wchar_t* FormatRace(int race);
const wchar_t* FormatType(int type); const wchar_t* FormatType(int type);
const wchar_t* FormatSetName(unsigned long long setcode); const wchar_t* FormatSetName(const uint16_t setcode[]);
const wchar_t* FormatLinkMarker(int link_marker); const wchar_t* FormatLinkMarker(int link_marker);
std::unordered_map<unsigned int, CardDataC> _datas;
std::unordered_map<unsigned int, CardString> _strings;
std::unordered_map<unsigned int, std::wstring> _counterStrings; std::unordered_map<unsigned int, std::wstring> _counterStrings;
std::unordered_map<unsigned int, std::wstring> _victoryStrings; std::unordered_map<unsigned int, std::wstring> _victoryStrings;
std::unordered_map<unsigned int, std::wstring> _setnameStrings; std::unordered_map<unsigned int, std::wstring> _setnameStrings;
std::unordered_map<unsigned int, std::wstring> _sysStrings; std::unordered_map<unsigned int, std::wstring> _sysStrings;
code_pointer datas_begin;
code_pointer datas_end;
string_pointer strings_begin;
string_pointer strings_end;
wchar_t numStrings[301][4]; wchar_t numStrings[301][4];
wchar_t numBuffer[6]; wchar_t numBuffer[6];
...@@ -53,10 +56,15 @@ public: ...@@ -53,10 +56,15 @@ public:
static byte scriptBuffer[0x20000]; static byte scriptBuffer[0x20000];
static const wchar_t* unknown_string; static const wchar_t* unknown_string;
static int CardReader(int, void*); static uint32 CardReader(uint32, card_data*);
static byte* ScriptReaderEx(const char* script_name, int* slen); static byte* ScriptReaderEx(const char* script_name, int* slen);
static byte* ScriptReader(const char* script_name, int* slen); static byte* ScriptReader(const char* script_name, int* slen);
static IFileSystem* FileSystem; static IFileSystem* FileSystem;
private:
std::unordered_map<unsigned int, CardDataC> _datas;
std::unordered_map<unsigned int, CardString> _strings;
std::unordered_map<unsigned int, std::vector<uint16_t>> extra_setcode;
}; };
extern DataManager dataManager; extern DataManager dataManager;
......
...@@ -40,23 +40,6 @@ static int parse_filter(const wchar_t* pstr, unsigned int* type) { ...@@ -40,23 +40,6 @@ static int parse_filter(const wchar_t* pstr, unsigned int* type) {
return 0; return 0;
} }
static bool check_set_code(const CardDataC& data, int set_code) {
unsigned long long sc = data.setcode;
if (data.alias) {
auto aptr = dataManager._datas.find(data.alias);
if (aptr != dataManager._datas.end())
sc = aptr->second.setcode;
}
bool res = false;
int settype = set_code & 0xfff;
int setsubtype = set_code & 0xf000;
while (sc) {
if ((sc & 0xfff) == settype && (sc & 0xf000 & setsubtype) == setsubtype)
res = true;
sc = sc >> 16;
}
return res;
}
static inline bool havePopupWindow() { static inline bool havePopupWindow() {
return mainGame->wQuery->isVisible() || mainGame->wCategories->isVisible() || mainGame->wLinkMarks->isVisible() || mainGame->wDeckManage->isVisible() || mainGame->wDMQuery->isVisible(); return mainGame->wQuery->isVisible() || mainGame->wCategories->isVisible() || mainGame->wLinkMarks->isVisible() || mainGame->wDeckManage->isVisible() || mainGame->wDMQuery->isVisible();
...@@ -79,7 +62,7 @@ void DeckBuilder::Initialize() { ...@@ -79,7 +62,7 @@ void DeckBuilder::Initialize() {
mainGame->btnSideReload->setVisible(false); mainGame->btnSideReload->setVisible(false);
filterList = &deckManager._lfList[mainGame->gameConf.use_lflist ? mainGame->gameConf.default_lflist : deckManager._lfList.size() - 1].content; filterList = &deckManager._lfList[mainGame->gameConf.use_lflist ? mainGame->gameConf.default_lflist : deckManager._lfList.size() - 1].content;
ClearSearch(); ClearSearch();
rnd.reset((unsigned int)time(nullptr)); rnd.reset((uint_fast32_t)time(nullptr));
mouse_pos.set(0, 0); mouse_pos.set(0, 0);
hovered_code = 0; hovered_code = 0;
hovered_pos = 0; hovered_pos = 0;
...@@ -652,8 +635,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -652,8 +635,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
} }
mainGame->ClearCardInfo(); mainGame->ClearCardInfo();
char deckbuf[1024]; unsigned char deckbuf[1024];
char* pdeck = deckbuf; auto pdeck = deckbuf;
BufferIO::WriteInt32(pdeck, deckManager.current_deck.main.size() + deckManager.current_deck.extra.size()); BufferIO::WriteInt32(pdeck, deckManager.current_deck.main.size() + deckManager.current_deck.extra.size());
BufferIO::WriteInt32(pdeck, deckManager.current_deck.side.size()); BufferIO::WriteInt32(pdeck, deckManager.current_deck.side.size());
for(size_t i = 0; i < deckManager.current_deck.main.size(); ++i) for(size_t i = 0; i < deckManager.current_deck.main.size(); ++i)
...@@ -1030,7 +1013,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1030,7 +1013,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
dragx = event.MouseInput.X; dragx = event.MouseInput.X;
dragy = event.MouseInput.Y; dragy = event.MouseInput.Y;
draging_pointer = dataManager.GetCodePointer(hovered_code); draging_pointer = dataManager.GetCodePointer(hovered_code);
if(draging_pointer == dataManager._datas.end()) if(draging_pointer == dataManager.datas_end)
break; break;
if(hovered_pos == 4) { if(hovered_pos == 4) {
if(!check_limit(draging_pointer)) if(!check_limit(draging_pointer))
...@@ -1084,7 +1067,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1084,7 +1067,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(hovered_pos == 0 || hovered_seq == -1) if(hovered_pos == 0 || hovered_seq == -1)
break; break;
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = dataManager.GetCodePointer(hovered_code);
if(pointer == dataManager._datas.end()) if(pointer == dataManager.datas_end)
break; break;
soundManager.PlaySoundEffect(SOUND_CARD_DROP); soundManager.PlaySoundEffect(SOUND_CARD_DROP);
if(hovered_pos == 1) { if(hovered_pos == 1) {
...@@ -1119,7 +1102,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1119,7 +1102,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
pop_side(hovered_seq); pop_side(hovered_seq);
} else { } else {
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = dataManager.GetCodePointer(hovered_code);
if(pointer == dataManager._datas.end()) if(pointer == dataManager.datas_end)
break; break;
if(!check_limit(pointer)) if(!check_limit(pointer))
break; break;
...@@ -1154,6 +1137,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1154,6 +1137,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if (is_draging) if (is_draging)
break; break;
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = dataManager.GetCodePointer(hovered_code);
if (pointer == dataManager.datas_end)
break;
if(!check_limit(pointer)) if(!check_limit(pointer))
break; break;
soundManager.PlaySoundEffect(SOUND_CARD_PICK); soundManager.PlaySoundEffect(SOUND_CARD_PICK);
...@@ -1351,7 +1336,7 @@ void DeckBuilder::FilterCards() { ...@@ -1351,7 +1336,7 @@ void DeckBuilder::FilterCards() {
results.clear(); results.clear();
struct element_t { struct element_t {
std::wstring keyword; std::wstring keyword;
int setcode; unsigned int setcode;
enum class type_t { enum class type_t {
all, all,
name, name,
...@@ -1421,9 +1406,11 @@ void DeckBuilder::FilterCards() { ...@@ -1421,9 +1406,11 @@ void DeckBuilder::FilterCards() {
query_elements.push_back(element); query_elements.push_back(element);
} }
} }
auto strpointer = dataManager._strings.begin(); for(code_pointer ptr = dataManager.datas_begin; ptr != dataManager.datas_end; ++ptr) {
for(code_pointer ptr = dataManager._datas.begin(); ptr != dataManager._datas.end(); ++ptr, ++strpointer) {
const CardDataC& data = ptr->second; const CardDataC& data = ptr->second;
auto strpointer = dataManager.GetStringPointer(ptr->first);
if (strpointer == dataManager.strings_end)
continue;
const CardString& text = strpointer->second; const CardString& text = strpointer->second;
if(data.type & TYPE_TOKEN) if(data.type & TYPE_TOKEN)
continue; continue;
...@@ -1502,14 +1489,14 @@ void DeckBuilder::FilterCards() { ...@@ -1502,14 +1489,14 @@ void DeckBuilder::FilterCards() {
if (elements_iterator->type == element_t::type_t::name) { if (elements_iterator->type == element_t::type_t::name) {
match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str()); match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str());
} else if (elements_iterator->type == element_t::type_t::setcode) { } else if (elements_iterator->type == element_t::type_t::setcode) {
match = elements_iterator->setcode && check_set_code(data, elements_iterator->setcode); match = elements_iterator->setcode && data.is_setcode(elements_iterator->setcode);
} else { } else {
int trycode = BufferIO::GetVal(elements_iterator->keyword.c_str()); int trycode = BufferIO::GetVal(elements_iterator->keyword.c_str());
bool tryresult = dataManager.GetData(trycode, 0); bool tryresult = dataManager.GetData(trycode, 0);
if(!tryresult) { if(!tryresult) {
match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str()) match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str())
|| text.text.find(elements_iterator->keyword) != std::wstring::npos || text.text.find(elements_iterator->keyword) != std::wstring::npos
|| (elements_iterator->setcode && check_set_code(data, elements_iterator->setcode)); || (elements_iterator->setcode && data.is_setcode(elements_iterator->setcode));
} else { } else {
match = data.code == trycode || data.alias == trycode; match = data.code == trycode || data.alias == trycode;
} }
......
...@@ -161,7 +161,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p ...@@ -161,7 +161,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p
else if(cd.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) { else if(cd.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) {
if(deck.extra.size() >= 15) if(deck.extra.size() >= 15)
continue; continue;
deck.extra.push_back(dataManager.GetCodePointer(code)); //verified by GetData() deck.extra.push_back(dataManager.GetCodePointer(code));
} else if(deck.main.size() < 60) { } else if(deck.main.size() < 60) {
deck.main.push_back(dataManager.GetCodePointer(code)); deck.main.push_back(dataManager.GetCodePointer(code));
} }
...@@ -175,7 +175,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p ...@@ -175,7 +175,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p
if(cd.type & TYPE_TOKEN) if(cd.type & TYPE_TOKEN)
continue; continue;
if(deck.side.size() < 15) if(deck.side.size() < 15)
deck.side.push_back(dataManager.GetCodePointer(code)); //verified by GetData() deck.side.push_back(dataManager.GetCodePointer(code));
} }
return errorcode; return errorcode;
} }
......
...@@ -318,8 +318,21 @@ void Game::DrawCards() { ...@@ -318,8 +318,21 @@ void Game::DrawCards() {
for(auto it = dField.extra[p].begin(); it != dField.extra[p].end(); ++it) for(auto it = dField.extra[p].begin(); it != dField.extra[p].end(); ++it)
DrawCard(*it); DrawCard(*it);
} }
for(auto cit = dField.overlay_cards.begin(); cit != dField.overlay_cards.end(); ++cit) for (auto cit = dField.overlay_cards.begin(); cit != dField.overlay_cards.end(); ++cit) {
DrawCard(*cit); auto pcard = (*cit);
auto olcard = pcard->overlayTarget;
if (pcard->aniFrame) {
DrawCard(pcard);
}
else if (olcard && olcard->location == LOCATION_MZONE) {
if (pcard->sequence < MAX_LAYER_COUNT) {
DrawCard(pcard);
}
}
else {
DrawCard(pcard);
}
}
} }
void Game::DrawCard(ClientCard* pcard) { void Game::DrawCard(ClientCard* pcard) {
if(pcard->aniFrame) { if(pcard->aniFrame) {
...@@ -518,12 +531,29 @@ void Game::DrawMisc() { ...@@ -518,12 +531,29 @@ void Game::DrawMisc() {
driver->draw2DImage(imageManager.tLPFrame, Resize(330, 10, 629, 30), recti(0, 0, 200, 20), 0, 0, true); driver->draw2DImage(imageManager.tLPFrame, Resize(330, 10, 629, 30), recti(0, 0, 200, 20), 0, 0, true);
driver->draw2DImage(imageManager.tLPFrame, Resize(691, 10, 990, 30), recti(0, 0, 200, 20), 0, 0, true); driver->draw2DImage(imageManager.tLPFrame, Resize(691, 10, 990, 30), recti(0, 0, 200, 20), 0, 0, true);
if(dInfo.start_lp) { if(dInfo.start_lp) {
if(dInfo.lp[0] >= dInfo.start_lp) auto maxLP = dInfo.isTag ? dInfo.start_lp / 2 : dInfo.start_lp;
driver->draw2DImage(imageManager.tLPBar, Resize(335, 12, 625, 28), recti(0, 0, 16, 16), 0, 0, true); if(dInfo.lp[0] >= maxLP) {
else driver->draw2DImage(imageManager.tLPBar, Resize(335, 12, 335 + 290 * dInfo.lp[0] / dInfo.start_lp, 28), recti(0, 0, 16, 16), 0, 0, true); auto layerCount = dInfo.lp[0] / maxLP;
if(dInfo.lp[1] >= dInfo.start_lp) auto partialLP = dInfo.lp[0] % maxLP;
driver->draw2DImage(imageManager.tLPBar, Resize(696, 12, 986, 28), recti(0, 0, 16, 16), 0, 0, true); auto bgColorPos = (layerCount - 1) % 5;
else driver->draw2DImage(imageManager.tLPBar, Resize(986 - 290 * dInfo.lp[1] / dInfo.start_lp, 12, 986, 28), recti(0, 0, 16, 16), 0, 0, true); auto fgColorPos = layerCount % 5;
driver->draw2DImage(imageManager.tLPBar, Resize(335 + 290 * partialLP / maxLP, 12, 625, 28), recti(0, bgColorPos * 16, 16, (bgColorPos + 1) * 16), 0, 0, true);
if(partialLP > 0) {
driver->draw2DImage(imageManager.tLPBar, Resize(335, 12, 335 + 290 * partialLP / maxLP, 28), recti(0, fgColorPos * 16, 16, (fgColorPos + 1) * 16), 0, 0, true);
}
}
else driver->draw2DImage(imageManager.tLPBar, Resize(335, 12, 335 + 290 * dInfo.lp[0] / maxLP, 28), recti(0, 0, 16, 16), 0, 0, true);
if(dInfo.lp[1] >= maxLP) {
auto layerCount = dInfo.lp[1] / maxLP;
auto partialLP = dInfo.lp[1] % maxLP;
auto bgColorPos = (layerCount - 1) % 5;
auto fgColorPos = layerCount % 5;
driver->draw2DImage(imageManager.tLPBar, Resize(696, 12, 986 - 290 * partialLP / maxLP, 28), recti(0, bgColorPos * 16, 16, (bgColorPos + 1) * 16), 0, 0, true);
if(partialLP > 0) {
driver->draw2DImage(imageManager.tLPBar, Resize(986 - 290 * partialLP / maxLP, 12, 986, 28), recti(0, fgColorPos * 16, 16, (fgColorPos + 1) * 16), 0, 0, true);
}
}
else driver->draw2DImage(imageManager.tLPBar, Resize(986 - 290 * dInfo.lp[1] / maxLP, 12, 986, 28), recti(0, 0, 16, 16), 0, 0, true);
} }
if(lpframe) { if(lpframe) {
dInfo.lp[lpplayer] -= lpd; dInfo.lp[lpplayer] -= lpd;
...@@ -547,20 +577,22 @@ void Game::DrawMisc() { ...@@ -547,20 +577,22 @@ void Game::DrawMisc() {
DrawShadowText(numFont, dInfo.strLP[0], Resize(330, 12, 631, 30), Resize(0, 1, 2, 0), 0xffffff00, 0xff000000, true, false, 0); DrawShadowText(numFont, dInfo.strLP[0], Resize(330, 12, 631, 30), Resize(0, 1, 2, 0), 0xffffff00, 0xff000000, true, false, 0);
DrawShadowText(numFont, dInfo.strLP[1], Resize(691, 12, 992, 30), Resize(0, 1, 2, 0), 0xffffff00, 0xff000000, true, false, 0); DrawShadowText(numFont, dInfo.strLP[1], Resize(691, 12, 992, 30), Resize(0, 1, 2, 0), 0xffffff00, 0xff000000, true, false, 0);
recti p1size = Resize(335, 31, 629, 50); if(!gameConf.hide_player_name) {
recti p2size = Resize(986, 31, 986, 50); recti p1size = Resize(335, 31, 629, 50);
if(!dInfo.isTag || !dInfo.tag_player[0]) recti p2size = Resize(986, 31, 986, 50);
textFont->draw(dInfo.hostname, p1size, 0xffffffff, false, false, 0); if(!dInfo.isTag || !dInfo.tag_player[0])
else textFont->draw(dInfo.hostname, p1size, 0xffffffff, false, false, 0);
textFont->draw(dInfo.hostname_tag, p1size, 0xffffffff, false, false, 0); else
if(!dInfo.isTag || !dInfo.tag_player[1]) { textFont->draw(dInfo.hostname_tag, p1size, 0xffffffff, false, false, 0);
auto cld = textFont->getDimension(dInfo.clientname); if(!dInfo.isTag || !dInfo.tag_player[1]) {
p2size.UpperLeftCorner.X -= cld.Width; auto cld = textFont->getDimension(dInfo.clientname);
textFont->draw(dInfo.clientname, p2size, 0xffffffff, false, false, 0); p2size.UpperLeftCorner.X -= cld.Width;
} else { textFont->draw(dInfo.clientname, p2size, 0xffffffff, false, false, 0);
auto cld = textFont->getDimension(dInfo.clientname_tag); } else {
p2size.UpperLeftCorner.X -= cld.Width; auto cld = textFont->getDimension(dInfo.clientname_tag);
textFont->draw(dInfo.clientname_tag, p2size, 0xffffffff, false, false, 0); p2size.UpperLeftCorner.X -= cld.Width;
textFont->draw(dInfo.clientname_tag, p2size, 0xffffffff, false, false, 0);
}
} }
driver->draw2DRectangle(Resize(632, 10, 688, 30), 0x00000000, 0x00000000, 0xffffffff, 0xffffffff); driver->draw2DRectangle(Resize(632, 10, 688, 30), 0x00000000, 0x00000000, 0xffffffff, 0xffffffff);
driver->draw2DRectangle(Resize(632, 30, 688, 50), 0xffffffff, 0xffffffff, 0x00000000, 0x00000000); driver->draw2DRectangle(Resize(632, 30, 688, 50), 0xffffffff, 0xffffffff, 0x00000000, 0x00000000);
......
This diff is collapsed.
...@@ -27,14 +27,14 @@ private: ...@@ -27,14 +27,14 @@ private:
static bool is_host; static bool is_host;
static event_base* client_base; static event_base* client_base;
static bufferevent* client_bev; static bufferevent* client_bev;
static char duel_client_read[0x2000]; static unsigned char duel_client_read[0x2000];
static char duel_client_write[0x2000]; static unsigned char duel_client_write[0x2000];
static bool is_closing; static bool is_closing;
static bool is_swapping; static bool is_swapping;
static int select_hint; static int select_hint;
static int select_unselect_hint; static int select_unselect_hint;
static int last_select_hint; static int last_select_hint;
static char last_successful_msg[0x2000]; static unsigned char last_successful_msg[0x2000];
static unsigned int last_successful_msg_length; static unsigned int last_successful_msg_length;
static wchar_t event_string[256]; static wchar_t event_string[256];
static mt19937 rnd; static mt19937 rnd;
...@@ -45,28 +45,28 @@ public: ...@@ -45,28 +45,28 @@ public:
static void ClientRead(bufferevent* bev, void* ctx); static void ClientRead(bufferevent* bev, void* ctx);
static void ClientEvent(bufferevent *bev, short events, void *ctx); static void ClientEvent(bufferevent *bev, short events, void *ctx);
static int ClientThread(); static int ClientThread();
static void HandleSTOCPacketLan(char* data, unsigned int len); static void HandleSTOCPacketLan(unsigned char* data, unsigned int len);
static int ClientAnalyze(char* msg, unsigned int len); static int ClientAnalyze(unsigned char* msg, unsigned int len);
static void SwapField(); static void SwapField();
static void SetResponseI(int respI); static void SetResponseI(int respI);
static void SetResponseB(void* respB, unsigned char len); static void SetResponseB(void* respB, unsigned char len);
static void SendResponse(); static void SendResponse();
static void SendPacketToServer(unsigned char proto) { static void SendPacketToServer(unsigned char proto) {
char* p = duel_client_write; auto p = duel_client_write;
BufferIO::WriteInt16(p, 1); BufferIO::WriteInt16(p, 1);
BufferIO::WriteInt8(p, proto); BufferIO::WriteInt8(p, proto);
bufferevent_write(client_bev, duel_client_write, 3); bufferevent_write(client_bev, duel_client_write, 3);
} }
template<typename ST> template<typename ST>
static void SendPacketToServer(unsigned char proto, ST& st) { static void SendPacketToServer(unsigned char proto, ST& st) {
char* p = duel_client_write; auto p = duel_client_write;
BufferIO::WriteInt16(p, 1 + sizeof(ST)); BufferIO::WriteInt16(p, 1 + sizeof(ST));
BufferIO::WriteInt8(p, proto); BufferIO::WriteInt8(p, proto);
memcpy(p, &st, sizeof(ST)); memcpy(p, &st, sizeof(ST));
bufferevent_write(client_bev, duel_client_write, sizeof(ST) + 3); bufferevent_write(client_bev, duel_client_write, sizeof(ST) + 3);
} }
static void SendBufferToServer(unsigned char proto, void* buffer, size_t len) { static void SendBufferToServer(unsigned char proto, void* buffer, size_t len) {
char* p = duel_client_write; auto p = duel_client_write;
BufferIO::WriteInt16(p, 1 + len); BufferIO::WriteInt16(p, 1 + len);
BufferIO::WriteInt8(p, proto); BufferIO::WriteInt8(p, proto);
memcpy(p, buffer, len); memcpy(p, buffer, len);
......
...@@ -837,7 +837,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -837,7 +837,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} }
case CHECK_RACE: { case CHECK_RACE: {
int rac = 0, filter = 0x1, count = 0; int rac = 0, filter = 0x1, count = 0;
for(int i = 0; i < 25; ++i, filter <<= 1) { for(int i = 0; i < RACES_COUNT; ++i, filter <<= 1) {
if(mainGame->chkRace[i]->isChecked()) { if(mainGame->chkRace[i]->isChecked()) {
rac |= filter; rac |= filter;
count++; count++;
...@@ -1666,6 +1666,13 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1666,6 +1666,13 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
myswprintf(formatBuffer, L"\n*%ls", dataManager.GetDesc(iter->first)); myswprintf(formatBuffer, L"\n*%ls", dataManager.GetDesc(iter->first));
str.append(formatBuffer); str.append(formatBuffer);
} }
if(mainGame->dInfo.turn == 1) {
if(mplayer == 0 && mainGame->dInfo.isFirst || mplayer != 0 && !mainGame->dInfo.isFirst)
myswprintf(formatBuffer, L"\n*%ls", dataManager.GetSysString(100));
else
myswprintf(formatBuffer, L"\n*%ls", dataManager.GetSysString(101));
str.append(formatBuffer);
}
should_show_tip = true; should_show_tip = true;
irr::core::dimension2d<unsigned int> dtip = mainGame->guiFont->getDimension(str.c_str()) + irr::core::dimension2d<unsigned int>(10, 10); irr::core::dimension2d<unsigned int> dtip = mainGame->guiFont->getDimension(str.c_str()) + irr::core::dimension2d<unsigned int>(10, 10);
mainGame->stTip->setRelativePosition(recti(mousepos.X - 10 - dtip.Width, mousepos.Y + 10, mousepos.X - 10, mousepos.Y + 10 + dtip.Height)); mainGame->stTip->setRelativePosition(recti(mousepos.X - 10 - dtip.Width, mousepos.Y + 10, mousepos.X - 10, mousepos.Y + 10 + dtip.Height));
...@@ -1913,6 +1920,13 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) { ...@@ -1913,6 +1920,13 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) {
return true; return true;
break; break;
} }
case CHECKBOX_HIDE_PLAYER_NAME: {
mainGame->gameConf.hide_player_name = mainGame->chkHidePlayerName->isChecked() ? 1 : 0;
if(mainGame->gameConf.hide_player_name)
mainGame->ClearChatMsg();
return true;
break;
}
case CHECKBOX_PREFER_EXPANSION: { case CHECKBOX_PREFER_EXPANSION: {
mainGame->gameConf.prefer_expansion_script = mainGame->chkPreferExpansionScript->isChecked() ? 1 : 0; mainGame->gameConf.prefer_expansion_script = mainGame->chkPreferExpansionScript->isChecked() ? 1 : 0;
return true; return true;
...@@ -2162,6 +2176,7 @@ void ClientField::GetHoverField(int x, int y) { ...@@ -2162,6 +2176,7 @@ void ClientField::GetHoverField(int x, int y) {
hovered_location = LOCATION_REMOVED; hovered_location = LOCATION_REMOVED;
} }
} else if(rule == 1 && boardx >= matManager.vFieldSzone[1][7][rule][1].Pos.X && boardx <= matManager.vFieldSzone[1][7][rule][2].Pos.X) { } else if(rule == 1 && boardx >= matManager.vFieldSzone[1][7][rule][1].Pos.X && boardx <= matManager.vFieldSzone[1][7][rule][2].Pos.X) {
// deprecated szone[7]
if(boardy >= matManager.vFieldSzone[1][7][rule][2].Pos.Y && boardy <= matManager.vFieldSzone[1][7][rule][0].Pos.Y) { if(boardy >= matManager.vFieldSzone[1][7][rule][2].Pos.Y && boardy <= matManager.vFieldSzone[1][7][rule][0].Pos.Y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_SZONE; hovered_location = LOCATION_SZONE;
...@@ -2193,7 +2208,8 @@ void ClientField::GetHoverField(int x, int y) { ...@@ -2193,7 +2208,8 @@ void ClientField::GetHoverField(int x, int y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_EXTRA; hovered_location = LOCATION_EXTRA;
} }
} else if(rule == 0 && boardx >= matManager.vFieldSzone[0][7][rule][0].Pos.X && boardx <= matManager.vFieldSzone[0][7][rule][1].Pos.X) { } else if(rule == 1 && boardx >= matManager.vFieldSzone[0][7][rule][0].Pos.X && boardx <= matManager.vFieldSzone[0][7][rule][1].Pos.X) {
// deprecated szone[7]
if(boardy >= matManager.vFieldSzone[0][7][rule][0].Pos.Y && boardy <= matManager.vFieldSzone[0][7][rule][2].Pos.Y) { if(boardy >= matManager.vFieldSzone[0][7][rule][0].Pos.Y && boardy <= matManager.vFieldSzone[0][7][rule][2].Pos.Y) {
hovered_controler = 0; hovered_controler = 0;
hovered_location = LOCATION_SZONE; hovered_location = LOCATION_SZONE;
...@@ -2218,25 +2234,62 @@ void ClientField::GetHoverField(int x, int y) { ...@@ -2218,25 +2234,62 @@ void ClientField::GetHoverField(int x, int y) {
hovered_sequence = sequence; hovered_sequence = sequence;
} else if(boardy >= matManager.vFieldMzone[0][5][0].Pos.Y && boardy <= matManager.vFieldMzone[0][5][2].Pos.Y) { } else if(boardy >= matManager.vFieldMzone[0][5][0].Pos.Y && boardy <= matManager.vFieldMzone[0][5][2].Pos.Y) {
if(sequence == 1) { if(sequence == 1) {
if(!mzone[1][6]) { if (mzone[0][5]) {
hovered_controler = 0; hovered_controler = 0;
hovered_location = LOCATION_MZONE; hovered_location = LOCATION_MZONE;
hovered_sequence = 5; hovered_sequence = 5;
} else { }
else if(mzone[1][6]) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_MZONE; hovered_location = LOCATION_MZONE;
hovered_sequence = 6; hovered_sequence = 6;
} }
} else if(sequence == 3) { else if((mainGame->dInfo.curMsg == MSG_SELECT_PLACE || mainGame->dInfo.curMsg == MSG_SELECT_DISFIELD)) {
if(!mzone[1][5]) { if (mainGame->dField.selectable_field & (0x1 << (16 + 6))) {
hovered_controler = 1;
hovered_location = LOCATION_MZONE;
hovered_sequence = 6;
}
else {
hovered_controler = 0;
hovered_location = LOCATION_MZONE;
hovered_sequence = 5;
}
}
else{
hovered_controler = 0;
hovered_location = LOCATION_MZONE;
hovered_sequence = 5;
}
}
else if(sequence == 3) {
if (mzone[0][6]) {
hovered_controler = 0; hovered_controler = 0;
hovered_location = LOCATION_MZONE; hovered_location = LOCATION_MZONE;
hovered_sequence = 6; hovered_sequence = 6;
} else { }
else if (mzone[1][5]) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_MZONE; hovered_location = LOCATION_MZONE;
hovered_sequence = 5; hovered_sequence = 5;
} }
else if ((mainGame->dInfo.curMsg == MSG_SELECT_PLACE || mainGame->dInfo.curMsg == MSG_SELECT_DISFIELD)) {
if (mainGame->dField.selectable_field & (0x1 << (16 + 5))) {
hovered_controler = 1;
hovered_location = LOCATION_MZONE;
hovered_sequence = 5;
}
else {
hovered_controler = 0;
hovered_location = LOCATION_MZONE;
hovered_sequence = 6;
}
}
else {
hovered_controler = 0;
hovered_location = LOCATION_MZONE;
hovered_sequence = 6;
}
} }
} else if(boardy >= matManager.vFieldMzone[1][0][2].Pos.Y && boardy <= matManager.vFieldMzone[1][0][0].Pos.Y) { } else if(boardy >= matManager.vFieldMzone[1][0][2].Pos.Y && boardy <= matManager.vFieldMzone[1][0][0].Pos.Y) {
hovered_controler = 1; hovered_controler = 1;
......
This diff is collapsed.
...@@ -9,97 +9,102 @@ ...@@ -9,97 +9,102 @@
#include <vector> #include <vector>
#include <list> #include <list>
#define DEFAULT_DUEL_RULE 5
namespace ygo { namespace ygo {
struct Config { struct Config {
bool use_d3d; bool use_d3d{ false };
bool use_image_scale; bool use_image_scale{ true };
unsigned short antialias; unsigned short antialias{ 0 };
unsigned short serverport; unsigned short serverport{ 7911 };
unsigned char textfontsize; unsigned char textfontsize{ 14 };
wchar_t lasthost[100]; wchar_t lasthost[100]{};
wchar_t lastport[10]; wchar_t lastport[10]{};
wchar_t nickname[20]; wchar_t nickname[20]{};
wchar_t gamename[20]; wchar_t gamename[20]{};
wchar_t lastcategory[64]; wchar_t lastcategory[64]{};
wchar_t lastdeck[64]; wchar_t lastdeck[64]{};
wchar_t textfont[256]; wchar_t textfont[256]{};
wchar_t numfont[256]; wchar_t numfont[256]{};
wchar_t roompass[20]; wchar_t roompass[20]{};
wchar_t bot_deck_path[64]; wchar_t bot_deck_path[64]{};
//settings //settings
int chkMAutoPos; int chkMAutoPos{ 0 };
int chkSTAutoPos; int chkSTAutoPos{ 1 };
int chkRandomPos; int chkRandomPos{ 0 };
int chkAutoChain; int chkAutoChain{ 0 };
int chkWaitChain; int chkWaitChain{ 0 };
int chkDefaultShowChain; int chkDefaultShowChain{ 0 };
int chkIgnore1; int chkIgnore1{ 0 };
int chkIgnore2; int chkIgnore2{ 0 };
int use_lflist; int use_lflist{ 1 };
int default_lflist; int default_lflist{ 0 };
int default_rule; int default_rule{ DEFAULT_DUEL_RULE };
int hide_setname; int hide_setname{ 0 };
int hide_hint_button; int hide_hint_button{ 0 };
int control_mode; int control_mode{ 0 };
int draw_field_spell; int draw_field_spell{ 1 };
int separate_clear_button; int separate_clear_button{ 1 };
int auto_search_limit; int auto_search_limit{ -1 };
int search_multiple_keywords; int search_multiple_keywords{ 1 };
int chkIgnoreDeckChanges; int chkIgnoreDeckChanges{ 0 };
int defaultOT; int defaultOT{ 1 };
int enable_bot_mode; int enable_bot_mode{ 0 };
int quick_animation; int quick_animation{ 0 };
int auto_save_replay; int auto_save_replay{ 0 };
int draw_single_chain; int draw_single_chain{ 0 };
int prefer_expansion_script; int hide_player_name{ 0 };
bool enable_sound; int prefer_expansion_script{ 0 };
bool enable_music; bool enable_sound{ true };
double sound_volume; bool enable_music{ true };
double music_volume; double sound_volume{ 0.5 };
int music_mode; double music_volume{ 0.5 };
bool window_maximized; int music_mode{ 1 };
int window_width; bool window_maximized{ false };
int window_height; int window_width{ 1024 };
bool resize_popup_menu; int window_height{ 640 };
bool resize_popup_menu{ false };
}; };
struct DuelInfo { struct DuelInfo {
bool isStarted; bool isStarted{ false };
bool isFinished; bool isFinished{ false };
bool isReplay; bool isReplay{ false };
bool isReplaySkiping; bool isReplaySkiping{ false };
bool isFirst; bool isFirst{ false };
bool isTag; bool isTag{ false };
bool isSingleMode; bool isSingleMode{ false };
bool is_shuffling; bool is_shuffling{ false };
bool tag_player[2]; bool tag_player[2]{};
int lp[2]; bool isReplaySwapped{ false };
int start_lp; int lp[2]{};
int duel_rule; int start_lp{ 0 };
int turn; int duel_rule{ 0 };
short curMsg; int turn{ 0 };
wchar_t hostname[20]; short curMsg{ 0 };
wchar_t clientname[20]; wchar_t hostname[20]{};
wchar_t hostname_tag[20]; wchar_t clientname[20]{};
wchar_t clientname_tag[20]; wchar_t hostname_tag[20]{};
wchar_t strLP[2][16]; wchar_t clientname_tag[20]{};
wchar_t* vic_string; wchar_t strLP[2][16]{};
unsigned char player_type; wchar_t* vic_string{ nullptr };
unsigned char time_player; unsigned char player_type{ 0 };
unsigned short time_limit; unsigned char time_player{ 0 };
unsigned short time_left[2]; unsigned short time_limit{ 0 };
bool isReplaySwapped; unsigned short time_left[2]{};
void Clear();
}; };
struct BotInfo { struct BotInfo {
wchar_t name[256]; wchar_t name[256]{};
wchar_t command[256]; wchar_t command[256]{};
wchar_t desc[256]; wchar_t desc[256]{};
bool support_master_rule_3; bool support_master_rule_3{ false };
bool support_new_master_rule; bool support_new_master_rule{ false };
bool support_master_rule_2020; bool support_master_rule_2020{ false };
bool select_deckfile; bool select_deckfile{ false };
}; };
struct FadingUnit { struct FadingUnit {
...@@ -212,8 +217,8 @@ public: ...@@ -212,8 +217,8 @@ public:
int hideChatTimer; int hideChatTimer;
bool hideChat; bool hideChat;
int chatTiming[8]; int chatTiming[8]{};
int chatType[8]; int chatType[8]{};
unsigned short linePatternD3D; unsigned short linePatternD3D;
unsigned short linePatternGL; unsigned short linePatternGL;
int waitFrame; int waitFrame;
...@@ -296,6 +301,7 @@ public: ...@@ -296,6 +301,7 @@ public:
irr::gui::IGUICheckBox* chkQuickAnimation; irr::gui::IGUICheckBox* chkQuickAnimation;
irr::gui::IGUICheckBox* chkAutoSaveReplay; irr::gui::IGUICheckBox* chkAutoSaveReplay;
irr::gui::IGUICheckBox* chkDrawSingleChain; irr::gui::IGUICheckBox* chkDrawSingleChain;
irr::gui::IGUICheckBox* chkHidePlayerName;
irr::gui::IGUIWindow* tabSystem; irr::gui::IGUIWindow* tabSystem;
irr::gui::IGUIElement* elmTabSystemLast; irr::gui::IGUIElement* elmTabSystemLast;
irr::gui::IGUIScrollBar* scrTabSystem; irr::gui::IGUIScrollBar* scrTabSystem;
...@@ -456,7 +462,7 @@ public: ...@@ -456,7 +462,7 @@ public:
irr::gui::IGUICheckBox* chkAttribute[7]; irr::gui::IGUICheckBox* chkAttribute[7];
//announce race //announce race
irr::gui::IGUIWindow* wANRace; irr::gui::IGUIWindow* wANRace;
irr::gui::IGUICheckBox* chkRace[25]; irr::gui::IGUICheckBox* chkRace[RACES_COUNT];
//cmd menu //cmd menu
irr::gui::IGUIWindow* wCmdMenu; irr::gui::IGUIWindow* wCmdMenu;
irr::gui::IGUIButton* btnActivate; irr::gui::IGUIButton* btnActivate;
...@@ -591,6 +597,8 @@ extern Game* mainGame; ...@@ -591,6 +597,8 @@ extern Game* mainGame;
} }
#define SIZE_QUERY_BUFFER 0x4000
#define CARD_IMG_WIDTH 177 #define CARD_IMG_WIDTH 177
#define CARD_IMG_HEIGHT 254 #define CARD_IMG_HEIGHT 254
#define CARD_THUMB_WIDTH 44 #define CARD_THUMB_WIDTH 44
...@@ -793,18 +801,30 @@ extern Game* mainGame; ...@@ -793,18 +801,30 @@ extern Game* mainGame;
#define CHECKBOX_PREFER_EXPANSION 373 #define CHECKBOX_PREFER_EXPANSION 373
#define CHECKBOX_DRAW_SINGLE_CHAIN 374 #define CHECKBOX_DRAW_SINGLE_CHAIN 374
#define CHECKBOX_LFLIST 375 #define CHECKBOX_LFLIST 375
#define CHECKBOX_HIDE_PLAYER_NAME 376
#define BUTTON_BIG_CARD_CLOSE 380 #define BUTTON_BIG_CARD_CLOSE 380
#define BUTTON_BIG_CARD_ZOOM_IN 381 #define BUTTON_BIG_CARD_ZOOM_IN 381
#define BUTTON_BIG_CARD_ZOOM_OUT 382 #define BUTTON_BIG_CARD_ZOOM_OUT 382
#define BUTTON_BIG_CARD_ORIG_SIZE 383 #define BUTTON_BIG_CARD_ORIG_SIZE 383
//STOC_GAME_MSG messages
#define MSG_WAITING 3
#define MSG_START 4
#define MSG_UPDATE_DATA 6 // flag=0: clear
#define MSG_UPDATE_CARD 7 // flag=QUERY_CODE, code=0: clear
#define MSG_REQUEST_DECK 8
#define MSG_REFRESH_DECK 34
#define MSG_CARD_SELECTED 80
#define MSG_UNEQUIP 95
#define MSG_BE_CHAIN_TARGET 121
#define MSG_CREATE_RELATION 122
#define MSG_RELEASE_RELATION 123
#define AVAIL_OCG 0x1 #define AVAIL_OCG 0x1
#define AVAIL_TCG 0x2 #define AVAIL_TCG 0x2
#define AVAIL_CUSTOM 0x4 #define AVAIL_CUSTOM 0x4
#define AVAIL_SC 0x8 #define AVAIL_SC 0x8
#define AVAIL_OCGTCG (AVAIL_OCG|AVAIL_TCG) #define AVAIL_OCGTCG (AVAIL_OCG|AVAIL_TCG)
#define DEFAULT_DUEL_RULE 5 #define MAX_LAYER_COUNT 6
#define CARD_ARTWORK_VERSIONS_OFFSET 10
#endif // GAME_H #endif // GAME_H
...@@ -111,9 +111,9 @@ inline uchar16_t swapEndian16(const uchar16_t& c) { ...@@ -111,9 +111,9 @@ inline uchar16_t swapEndian16(const uchar16_t& c) {
//! \return The new value. //! \return The new value.
inline uchar32_t swapEndian32(const uchar32_t& c) { inline uchar32_t swapEndian32(const uchar32_t& c) {
return ((c >> 24) & 0x000000FF) | return ((c >> 24) & 0x000000FF) |
((c >> 8) & 0x0000FF00) | ((c >> 8) & 0x0000FF00) |
((c << 8) & 0x00FF0000) | ((c << 8) & 0x00FF0000) |
((c << 24) & 0xFF000000); ((c << 24) & 0xFF000000);
} }
//! The Unicode byte order mark. //! The Unicode byte order mark.
...@@ -138,21 +138,21 @@ const u8 BOM_ENCODE_UTF32_LEN = 4; ...@@ -138,21 +138,21 @@ const u8 BOM_ENCODE_UTF32_LEN = 4;
//! Unicode encoding type. //! Unicode encoding type.
enum EUTF_ENCODE { enum EUTF_ENCODE {
EUTFE_NONE = 0, EUTFE_NONE = 0,
EUTFE_UTF8, EUTFE_UTF8,
EUTFE_UTF16, EUTFE_UTF16,
EUTFE_UTF16_LE, EUTFE_UTF16_LE,
EUTFE_UTF16_BE, EUTFE_UTF16_BE,
EUTFE_UTF32, EUTFE_UTF32,
EUTFE_UTF32_LE, EUTFE_UTF32_LE,
EUTFE_UTF32_BE EUTFE_UTF32_BE
}; };
//! Unicode endianness. //! Unicode endianness.
enum EUTF_ENDIAN { enum EUTF_ENDIAN {
EUTFEE_NATIVE = 0, EUTFEE_NATIVE = 0,
EUTFEE_LITTLE, EUTFEE_LITTLE,
EUTFEE_BIG EUTFEE_BIG
}; };
//! Returns the specified unicode byte order mark in a byte array. //! Returns the specified unicode byte order mark in a byte array.
...@@ -2234,7 +2234,7 @@ public: ...@@ -2234,7 +2234,7 @@ public:
for (u32 j = 0; j < count; ++j) { for (u32 j = 0; j < count; ++j) {
if (ch == c[j]) { if (ch == c[j]) {
if ((!ignoreEmptyTokens || pos - lastpos != 0) && if ((!ignoreEmptyTokens || pos - lastpos != 0) &&
!lastWasSeparator) !lastWasSeparator)
ret.push_back(ustring16<TAlloc>(&array[lastpospos], pos - lastpos)); ret.push_back(ustring16<TAlloc>(&array[lastpospos], pos - lastpos));
foundSeparator = true; foundSeparator = true;
lastpos = (keepSeparators ? pos : pos + 1); lastpos = (keepSeparators ? pos : pos + 1);
...@@ -2836,7 +2836,7 @@ public: ...@@ -2836,7 +2836,7 @@ public:
//! \return An enum describing the endianness of this string. //! \return An enum describing the endianness of this string.
const unicode::EUTF_ENDIAN getEndianness() const { const unicode::EUTF_ENDIAN getEndianness() const {
if (encoding == unicode::EUTFE_UTF16_LE || if (encoding == unicode::EUTFE_UTF16_LE ||
encoding == unicode::EUTFE_UTF32_LE) encoding == unicode::EUTFE_UTF32_LE)
return unicode::EUTFEE_LITTLE; return unicode::EUTFEE_LITTLE;
else return unicode::EUTFEE_BIG; else return unicode::EUTFEE_BIG;
} }
...@@ -2964,7 +2964,7 @@ template <typename TAlloc> ...@@ -2964,7 +2964,7 @@ template <typename TAlloc>
inline ustring16<TAlloc> && operator+(ustring16<TAlloc> && left, ustring16<TAlloc> && right) { inline ustring16<TAlloc> && operator+(ustring16<TAlloc> && left, ustring16<TAlloc> && right) {
//std::cout << "MOVE operator+(&&, &&)" << std::endl; //std::cout << "MOVE operator+(&&, &&)" << std::endl;
if ((right.size_raw() <= left.capacity() - left.size_raw()) || if ((right.size_raw() <= left.capacity() - left.size_raw()) ||
(right.capacity() - right.size_raw() < left.size_raw())) { (right.capacity() - right.size_raw() < left.size_raw())) {
left.append(right); left.append(right);
return std::move(left); return std::move(left);
} else { } else {
...@@ -3052,7 +3052,7 @@ namespace unicode { ...@@ -3052,7 +3052,7 @@ namespace unicode {
//! Hashing algorithm for hashing a ustring. Used for things like unordered_maps. //! Hashing algorithm for hashing a ustring. Used for things like unordered_maps.
//! Algorithm taken from std::hash<std::string>. //! Algorithm taken from std::hash<std::string>.
class hash : public std::unary_function<core::ustring, size_t> { class uhash {
public: public:
size_t operator()(const core::ustring& s) const { size_t operator()(const core::ustring& s) const {
size_t ret = 2166136261U; size_t ret = 2166136261U;
......
...@@ -21,11 +21,11 @@ public: ...@@ -21,11 +21,11 @@ public:
S3DVertex vFieldSpell2[4]; S3DVertex vFieldSpell2[4];
//S3DVertex vBackLine[76]; //S3DVertex vBackLine[76];
S3DVertex vFieldDeck[2][4]; S3DVertex vFieldDeck[2][4];
S3DVertex vFieldGrave[2][2][4]; S3DVertex vFieldGrave[2][2][4]; //[player][rule], rule = 0: dule_rule <= 3, 1: dule_rule >= 4
S3DVertex vFieldExtra[2][4]; S3DVertex vFieldExtra[2][4];
S3DVertex vFieldRemove[2][2][4]; S3DVertex vFieldRemove[2][2][4]; //[player][rule]
S3DVertex vFieldMzone[2][7][4]; S3DVertex vFieldMzone[2][7][4]; //[player][sequence]
S3DVertex vFieldSzone[2][8][2][4]; S3DVertex vFieldSzone[2][8][2][4]; //[player][sequence][rule]
irr::core::vector3df vFieldContiAct[4]; irr::core::vector3df vFieldContiAct[4];
S3DVertex vArrow[40]; S3DVertex vArrow[40];
SColor c2d[4]; SColor c2d[4];
......
...@@ -16,8 +16,8 @@ void UpdateDeck() { ...@@ -16,8 +16,8 @@ void UpdateDeck() {
mainGame->gameConf.lastcategory, 64); mainGame->gameConf.lastcategory, 64);
BufferIO::CopyWStr(mainGame->cbDeckSelect->getItem(mainGame->cbDeckSelect->getSelected()), BufferIO::CopyWStr(mainGame->cbDeckSelect->getItem(mainGame->cbDeckSelect->getSelected()),
mainGame->gameConf.lastdeck, 64); mainGame->gameConf.lastdeck, 64);
char deckbuf[1024]; unsigned char deckbuf[1024];
char* pdeck = deckbuf; auto pdeck = deckbuf;
BufferIO::WriteInt32(pdeck, deckManager.current_deck.main.size() + deckManager.current_deck.extra.size()); BufferIO::WriteInt32(pdeck, deckManager.current_deck.main.size() + deckManager.current_deck.extra.size());
BufferIO::WriteInt32(pdeck, deckManager.current_deck.side.size()); BufferIO::WriteInt32(pdeck, deckManager.current_deck.side.size());
for(size_t i = 0; i < deckManager.current_deck.main.size(); ++i) for(size_t i = 0; i < deckManager.current_deck.main.size(); ++i)
...@@ -93,6 +93,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -93,6 +93,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
sockaddr_in * sin = ((struct sockaddr_in *)answer->ai_addr); sockaddr_in * sin = ((struct sockaddr_in *)answer->ai_addr);
evutil_inet_ntop(AF_INET, &(sin->sin_addr), ip, 20); evutil_inet_ntop(AF_INET, &(sin->sin_addr), ip, 20);
remote_addr = htonl(inet_addr(ip)); remote_addr = htonl(inet_addr(ip));
evutil_freeaddrinfo(answer);
} }
} }
unsigned int remote_port = _wtoi(mainGame->ebJoinPort->getText()); unsigned int remote_port = _wtoi(mainGame->ebJoinPort->getText());
...@@ -126,10 +127,15 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -126,10 +127,15 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
case BUTTON_HOST_CONFIRM: { case BUTTON_HOST_CONFIRM: {
bot_mode = false; bot_mode = false;
BufferIO::CopyWStr(mainGame->ebServerName->getText(), mainGame->gameConf.gamename, 20); BufferIO::CopyWStr(mainGame->ebServerName->getText(), mainGame->gameConf.gamename, 20);
if(!NetServer::StartServer(mainGame->gameConf.serverport)) if(!NetServer::StartServer(mainGame->gameConf.serverport)) {
soundManager.PlaySoundEffect(SOUND_INFO);
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1402));
break; break;
}
if(!DuelClient::StartClient(0x7f000001, mainGame->gameConf.serverport)) { if(!DuelClient::StartClient(0x7f000001, mainGame->gameConf.serverport)) {
NetServer::StopServer(); NetServer::StopServer();
soundManager.PlaySoundEffect(SOUND_INFO);
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1402));
break; break;
} }
mainGame->btnHostConfirm->setEnabled(false); mainGame->btnHostConfirm->setEnabled(false);
...@@ -169,6 +175,10 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -169,6 +175,10 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
case BUTTON_HP_READY: { case BUTTON_HP_READY: {
if(mainGame->cbCategorySelect->getSelected() == -1 || mainGame->cbDeckSelect->getSelected() == -1 || if(mainGame->cbCategorySelect->getSelected() == -1 || mainGame->cbDeckSelect->getSelected() == -1 ||
!deckManager.LoadDeck(mainGame->cbCategorySelect, mainGame->cbDeckSelect)) { !deckManager.LoadDeck(mainGame->cbCategorySelect, mainGame->cbDeckSelect)) {
mainGame->gMutex.lock();
soundManager.PlaySoundEffect(SOUND_INFO);
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1406));
mainGame->gMutex.unlock();
break; break;
} }
UpdateDeck(); UpdateDeck();
...@@ -304,11 +314,17 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -304,11 +314,17 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
for(int i = 0; i < max; ++i) { for(int i = 0; i < max; ++i) {
int main = replay.ReadInt32(); int main = replay.ReadInt32();
Deck tmp_deck; Deck tmp_deck;
for(int j = 0; j < main; ++j) for (int j = 0; j < main; ++j) {
tmp_deck.main.push_back(dataManager.GetCodePointer(replay.ReadInt32())); auto card = dataManager.GetCodePointer(replay.ReadInt32());
if (card != dataManager.datas_end)
tmp_deck.main.push_back(card);
}
int extra = replay.ReadInt32(); int extra = replay.ReadInt32();
for(int j = 0; j < extra; ++j) for (int j = 0; j < extra; ++j) {
tmp_deck.extra.push_back(dataManager.GetCodePointer(replay.ReadInt32())); auto card = dataManager.GetCodePointer(replay.ReadInt32());
if (card != dataManager.datas_end)
tmp_deck.extra.push_back(card);
}
FileSystem::SafeFileName(namebuf[i]); FileSystem::SafeFileName(namebuf[i]);
myswprintf(filename, L"deck/%ls-%d %ls.ydk", ex_filename, i + 1, namebuf[i]); myswprintf(filename, L"deck/%ls-%d %ls.ydk", ex_filename, i + 1, namebuf[i]);
deckManager.SaveDeck(tmp_deck, filename); deckManager.SaveDeck(tmp_deck, filename);
...@@ -323,10 +339,15 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -323,10 +339,15 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
break; break;
bot_mode = true; bot_mode = true;
#ifdef _WIN32 #ifdef _WIN32
if(!NetServer::StartServer(mainGame->gameConf.serverport)) if(!NetServer::StartServer(mainGame->gameConf.serverport)) {
soundManager.PlaySoundEffect(SOUND_INFO);
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1402));
break; break;
}
if(!DuelClient::StartClient(0x7f000001, mainGame->gameConf.serverport)) { if(!DuelClient::StartClient(0x7f000001, mainGame->gameConf.serverport)) {
NetServer::StopServer(); NetServer::StopServer();
soundManager.PlaySoundEffect(SOUND_INFO);
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1402));
break; break;
} }
STARTUPINFOW si; STARTUPINFOW si;
...@@ -373,10 +394,15 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -373,10 +394,15 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
execl("./bot", "bot", arg1, arg2, arg3, NULL); execl("./bot", "bot", arg1, arg2, arg3, NULL);
exit(0); exit(0);
} else { } else {
if(!NetServer::StartServer(mainGame->gameConf.serverport)) if(!NetServer::StartServer(mainGame->gameConf.serverport)) {
soundManager.PlaySoundEffect(SOUND_INFO);
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1402));
break; break;
}
if(!DuelClient::StartClient(0x7f000001, mainGame->gameConf.serverport)) { if(!DuelClient::StartClient(0x7f000001, mainGame->gameConf.serverport)) {
NetServer::StopServer(); NetServer::StopServer();
soundManager.PlaySoundEffect(SOUND_INFO);
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1402));
break; break;
} }
} }
...@@ -607,7 +633,11 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -607,7 +633,11 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
if(static_cast<irr::gui::IGUICheckBox*>(caller)->isChecked()) { if(static_cast<irr::gui::IGUICheckBox*>(caller)->isChecked()) {
if(mainGame->cbCategorySelect->getSelected() == -1 || mainGame->cbDeckSelect->getSelected() == -1 || if(mainGame->cbCategorySelect->getSelected() == -1 || mainGame->cbDeckSelect->getSelected() == -1 ||
!deckManager.LoadDeck(mainGame->cbCategorySelect, mainGame->cbDeckSelect)) { !deckManager.LoadDeck(mainGame->cbCategorySelect, mainGame->cbDeckSelect)) {
mainGame->gMutex.lock();
static_cast<irr::gui::IGUICheckBox*>(caller)->setChecked(false); static_cast<irr::gui::IGUICheckBox*>(caller)->setChecked(false);
soundManager.PlaySoundEffect(SOUND_INFO);
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1406));
mainGame->gMutex.unlock();
break; break;
} }
UpdateDeck(); UpdateDeck();
......
...@@ -9,8 +9,8 @@ event_base* NetServer::net_evbase = 0; ...@@ -9,8 +9,8 @@ event_base* NetServer::net_evbase = 0;
event* NetServer::broadcast_ev = 0; event* NetServer::broadcast_ev = 0;
evconnlistener* NetServer::listener = 0; evconnlistener* NetServer::listener = 0;
DuelMode* NetServer::duel_mode = 0; DuelMode* NetServer::duel_mode = 0;
char NetServer::net_server_read[0x2000]; unsigned char NetServer::net_server_read[0x2000];
char NetServer::net_server_write[0x2000]; unsigned char NetServer::net_server_write[0x2000];
unsigned short NetServer::last_sent = 0; unsigned short NetServer::last_sent = 0;
bool NetServer::StartServer(unsigned short port) { bool NetServer::StartServer(unsigned short port) {
...@@ -171,8 +171,8 @@ void NetServer::DisconnectPlayer(DuelPlayer* dp) { ...@@ -171,8 +171,8 @@ void NetServer::DisconnectPlayer(DuelPlayer* dp) {
users.erase(bit); users.erase(bit);
} }
} }
void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) { void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, unsigned int len) {
char* pdata = data; auto pdata = data;
unsigned char pktType = BufferIO::ReadUInt8(pdata); unsigned char pktType = BufferIO::ReadUInt8(pdata);
if((pktType != CTOS_SURRENDER) && (pktType != CTOS_CHAT) && (dp->state == 0xff || (dp->state && dp->state != pktType))) if((pktType != CTOS_SURRENDER) && (pktType != CTOS_CHAT) && (dp->state == 0xff || (dp->state && dp->state != pktType)))
return; return;
......
...@@ -18,8 +18,8 @@ private: ...@@ -18,8 +18,8 @@ private:
static event* broadcast_ev; static event* broadcast_ev;
static evconnlistener* listener; static evconnlistener* listener;
static DuelMode* duel_mode; static DuelMode* duel_mode;
static char net_server_read[0x2000]; static unsigned char net_server_read[0x2000];
static char net_server_write[0x2000]; static unsigned char net_server_write[0x2000];
static unsigned short last_sent; static unsigned short last_sent;
public: public:
...@@ -35,9 +35,9 @@ public: ...@@ -35,9 +35,9 @@ public:
static void ServerEchoEvent(bufferevent* bev, short events, void* ctx); static void ServerEchoEvent(bufferevent* bev, short events, void* ctx);
static int ServerThread(); static int ServerThread();
static void DisconnectPlayer(DuelPlayer* dp); static void DisconnectPlayer(DuelPlayer* dp);
static void HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len); static void HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, unsigned int len);
static void SendPacketToPlayer(DuelPlayer* dp, unsigned char proto) { static void SendPacketToPlayer(DuelPlayer* dp, unsigned char proto) {
char* p = net_server_write; auto p = net_server_write;
BufferIO::WriteInt16(p, 1); BufferIO::WriteInt16(p, 1);
BufferIO::WriteInt8(p, proto); BufferIO::WriteInt8(p, proto);
last_sent = 3; last_sent = 3;
...@@ -47,7 +47,7 @@ public: ...@@ -47,7 +47,7 @@ public:
} }
template<typename ST> template<typename ST>
static void SendPacketToPlayer(DuelPlayer* dp, unsigned char proto, ST& st) { static void SendPacketToPlayer(DuelPlayer* dp, unsigned char proto, ST& st) {
char* p = net_server_write; auto p = net_server_write;
BufferIO::WriteInt16(p, 1 + sizeof(ST)); BufferIO::WriteInt16(p, 1 + sizeof(ST));
BufferIO::WriteInt8(p, proto); BufferIO::WriteInt8(p, proto);
memcpy(p, &st, sizeof(ST)); memcpy(p, &st, sizeof(ST));
...@@ -56,7 +56,7 @@ public: ...@@ -56,7 +56,7 @@ public:
bufferevent_write(dp->bev, net_server_write, last_sent); bufferevent_write(dp->bev, net_server_write, last_sent);
} }
static void SendBufferToPlayer(DuelPlayer* dp, unsigned char proto, void* buffer, size_t len) { static void SendBufferToPlayer(DuelPlayer* dp, unsigned char proto, void* buffer, size_t len) {
char* p = net_server_write; auto p = net_server_write;
BufferIO::WriteInt16(p, 1 + len); BufferIO::WriteInt16(p, 1 + len);
BufferIO::WriteInt8(p, proto); BufferIO::WriteInt8(p, proto);
memcpy(p, buffer, len); memcpy(p, buffer, len);
......
...@@ -12,16 +12,16 @@ ...@@ -12,16 +12,16 @@
namespace ygo { namespace ygo {
struct HostInfo { struct HostInfo {
unsigned int lflist; unsigned int lflist{ 0 };
unsigned char rule; unsigned char rule{ 0 };
unsigned char mode; unsigned char mode{ 0 };
unsigned char duel_rule; unsigned char duel_rule{ 0 };
bool no_check_deck; bool no_check_deck{ false };
bool no_shuffle_deck; bool no_shuffle_deck{ false };
unsigned int start_lp; unsigned int start_lp{ 0 };
unsigned char start_hand; unsigned char start_hand{ 0 };
unsigned char draw_count; unsigned char draw_count{ 0 };
unsigned short time_limit; unsigned short time_limit{ 0 };
}; };
struct HostPacket { struct HostPacket {
unsigned short identifier; unsigned short identifier;
...@@ -99,22 +99,16 @@ struct STOC_HS_WatchChange { ...@@ -99,22 +99,16 @@ struct STOC_HS_WatchChange {
class DuelMode; class DuelMode;
struct DuelPlayer { struct DuelPlayer {
unsigned short name[20]; unsigned short name[20]{};
DuelMode* game; DuelMode* game{ nullptr };
unsigned char type; unsigned char type{ 0 };
unsigned char state; unsigned char state{ 0 };
bufferevent* bev; bufferevent* bev{ 0 };
DuelPlayer() {
game = 0;
type = 0;
state = 0;
bev = 0;
}
}; };
class DuelMode { class DuelMode {
public: public:
DuelMode(): host_player(0), pduel(0), duel_stage(0) {} DuelMode(): host_player(nullptr), pduel(0), duel_stage(0) {}
virtual ~DuelMode() {} virtual ~DuelMode() {}
virtual void Chat(DuelPlayer* dp, void* pdata, int len) {} virtual void Chat(DuelPlayer* dp, void* pdata, int len) {}
virtual void JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {} virtual void JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {}
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
#define REPLAY_H #define REPLAY_H
#include "config.h" #include "config.h"
#include <time.h>
namespace ygo { namespace ygo {
...@@ -53,7 +52,7 @@ public: ...@@ -53,7 +52,7 @@ public:
static bool RenameReplay(const wchar_t* oldname, const wchar_t* newname); static bool RenameReplay(const wchar_t* oldname, const wchar_t* newname);
bool ReadNextResponse(unsigned char resp[64]); bool ReadNextResponse(unsigned char resp[64]);
void ReadName(wchar_t* data); void ReadName(wchar_t* data);
void ReadHeader(ReplayHeader& header); //void ReadHeader(ReplayHeader& header);
void ReadData(void* data, int length); void ReadData(void* data, int length);
int ReadInt32(); int ReadInt32();
short ReadInt16(); short ReadInt16();
......
This diff is collapsed.
#ifndef REPLAY_MODE_H #ifndef REPLAY_MODE_H
#define REPLAY_MODE_H #define REPLAY_MODE_H
#include "config.h" #include <stdint.h>
#include "data_manager.h" #include <vector>
#include "deck_manager.h"
#include "replay.h" #include "replay.h"
#include "../ocgcore/mtrandom.h"
namespace ygo { namespace ygo {
...@@ -22,6 +20,7 @@ private: ...@@ -22,6 +20,7 @@ private:
static int skip_turn; static int skip_turn;
static int current_step; static int current_step;
static int skip_step; static int skip_step;
static void ReloadLocation(int player, int location, int flag, std::vector<unsigned char>& queryBuffer);
public: public:
static Replay cur_replay; static Replay cur_replay;
...@@ -37,9 +36,10 @@ public: ...@@ -37,9 +36,10 @@ public:
static void EndDuel(); static void EndDuel();
static void Restart(bool refresh); static void Restart(bool refresh);
static void Undo(); static void Undo();
static bool ReplayAnalyze(char* msg, unsigned int len); static bool ReplayAnalyze(unsigned char* msg, unsigned int len);
static void ReplayRefresh(int flag = 0xf81fff); static void ReplayRefresh(int flag = 0xf81fff);
static void ReplayRefreshLocation(int player, int location, int flag);
static void ReplayRefreshHand(int player, int flag = 0x781fff); static void ReplayRefreshHand(int player, int flag = 0x781fff);
static void ReplayRefreshGrave(int player, int flag = 0x181fff); static void ReplayRefreshGrave(int player, int flag = 0x181fff);
static void ReplayRefreshDeck(int player, int flag = 0x181fff); static void ReplayRefreshDeck(int player, int flag = 0x181fff);
...@@ -47,7 +47,7 @@ public: ...@@ -47,7 +47,7 @@ public:
static void ReplayRefreshSingle(int player, int location, int sequence, int flag = 0xf81fff); static void ReplayRefreshSingle(int player, int location, int sequence, int flag = 0xf81fff);
static void ReplayReload(); static void ReplayReload();
static int MessageHandler(intptr_t fduel, int type); static uint32 MessageHandler(intptr_t fduel, uint32 type);
}; };
} }
......
This diff is collapsed.
...@@ -24,7 +24,7 @@ public: ...@@ -24,7 +24,7 @@ public:
virtual void TPResult(DuelPlayer* dp, unsigned char tp); virtual void TPResult(DuelPlayer* dp, unsigned char tp);
virtual void Process(); virtual void Process();
virtual void Surrender(DuelPlayer* dp); virtual void Surrender(DuelPlayer* dp);
virtual int Analyze(char* msgbuffer, unsigned int len); virtual int Analyze(unsigned char* msgbuffer, unsigned int len);
virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len); virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len);
virtual void TimeConfirm(DuelPlayer* dp); virtual void TimeConfirm(DuelPlayer* dp);
virtual void EndDuel(); virtual void EndDuel();
...@@ -38,26 +38,29 @@ public: ...@@ -38,26 +38,29 @@ public:
void RefreshExtra(int player, int flag = 0xe81fff, int use_cache = 1); void RefreshExtra(int player, int flag = 0xe81fff, int use_cache = 1);
void RefreshSingle(int player, int location, int sequence, int flag = 0xf81fff); void RefreshSingle(int player, int location, int sequence, int flag = 0xf81fff);
static int MessageHandler(intptr_t fduel, int type); static uint32 MessageHandler(intptr_t fduel, uint32 type);
static void SingleTimer(evutil_socket_t fd, short events, void* arg); static void SingleTimer(evutil_socket_t fd, short events, void* arg);
private:
int WriteUpdateData(int& player, int location, int& flag, unsigned char*& qbuf, int& use_cache);
protected: protected:
DuelPlayer* players[2]; DuelPlayer* players[2]{};
DuelPlayer* pplayer[2]; DuelPlayer* pplayer[2]{};
bool ready[2]; bool ready[2]{};
Deck pdeck[2]; Deck pdeck[2];
int deck_error[2]; int deck_error[2]{};
unsigned char hand_result[2]; unsigned char hand_result[2]{};
unsigned char last_response; unsigned char last_response{ 0 };
std::set<DuelPlayer*> observers; std::set<DuelPlayer*> observers;
Replay last_replay; Replay last_replay;
bool match_mode; bool match_mode{ false };
int match_kill; int match_kill{ 0 };
unsigned char duel_count; unsigned char duel_count{ 0 };
unsigned char tp_player; unsigned char tp_player{ 0 };
unsigned char match_result[3]; unsigned char match_result[3]{};
short time_limit[2]; short time_limit[2]{};
short time_elapsed; short time_elapsed{ 0 };
}; };
} }
......
This diff is collapsed.
#ifndef SINGLE_MODE_H #ifndef SINGLE_MODE_H
#define SINGLE_MODE_H #define SINGLE_MODE_H
#include <stdint.h>
#include <vector>
#include "replay.h" #include "replay.h"
namespace ygo { namespace ygo {
...@@ -10,15 +12,17 @@ private: ...@@ -10,15 +12,17 @@ private:
static intptr_t pduel; static intptr_t pduel;
static bool is_closing; static bool is_closing;
static bool is_continuing; static bool is_continuing;
static void ReloadLocation(int player, int location, int flag, std::vector<unsigned char>& queryBuffer);
public: public:
static bool StartPlay(); static bool StartPlay();
static void StopPlay(bool is_exiting = false); static void StopPlay(bool is_exiting = false);
static void SetResponse(unsigned char* resp, unsigned int len); static void SetResponse(unsigned char* resp, unsigned int len);
static int SinglePlayThread(); static int SinglePlayThread();
static bool SinglePlayAnalyze(char* msg, unsigned int len); static bool SinglePlayAnalyze(unsigned char* msg, unsigned int len);
static void SinglePlayRefresh(int flag = 0xf81fff); static void SinglePlayRefresh(int flag = 0xf81fff);
static void SingleRefreshLocation(int player, int location, int flag);
static void SinglePlayRefreshHand(int player, int flag = 0x781fff); static void SinglePlayRefreshHand(int player, int flag = 0x781fff);
static void SinglePlayRefreshGrave(int player, int flag = 0x181fff); static void SinglePlayRefreshGrave(int player, int flag = 0x181fff);
static void SinglePlayRefreshDeck(int player, int flag = 0x181fff); static void SinglePlayRefreshDeck(int player, int flag = 0x181fff);
...@@ -26,7 +30,7 @@ public: ...@@ -26,7 +30,7 @@ public:
static void SinglePlayRefreshSingle(int player, int location, int sequence, int flag = 0xf81fff); static void SinglePlayRefreshSingle(int player, int location, int sequence, int flag = 0xf81fff);
static void SinglePlayReload(); static void SinglePlayReload();
static int MessageHandler(intptr_t fduel, int type); static uint32 MessageHandler(intptr_t fduel, uint32 type);
protected: protected:
static Replay last_replay; static Replay last_replay;
......
This diff is collapsed.
...@@ -24,7 +24,7 @@ public: ...@@ -24,7 +24,7 @@ public:
virtual void TPResult(DuelPlayer* dp, unsigned char tp); virtual void TPResult(DuelPlayer* dp, unsigned char tp);
virtual void Process(); virtual void Process();
virtual void Surrender(DuelPlayer* dp); virtual void Surrender(DuelPlayer* dp);
virtual int Analyze(char* msgbuffer, unsigned int len); virtual int Analyze(unsigned char* msgbuffer, unsigned int len);
virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len); virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len);
virtual void TimeConfirm(DuelPlayer* dp); virtual void TimeConfirm(DuelPlayer* dp);
virtual void EndDuel(); virtual void EndDuel();
...@@ -38,8 +38,11 @@ public: ...@@ -38,8 +38,11 @@ public:
void RefreshExtra(int player, int flag = 0xe81fff, int use_cache = 1); void RefreshExtra(int player, int flag = 0xe81fff, int use_cache = 1);
void RefreshSingle(int player, int location, int sequence, int flag = 0xf81fff); void RefreshSingle(int player, int location, int sequence, int flag = 0xf81fff);
static int MessageHandler(intptr_t fduel, int type); static uint32 MessageHandler(intptr_t fduel, uint32 type);
static void TagTimer(evutil_socket_t fd, short events, void* arg); static void TagTimer(evutil_socket_t fd, short events, void* arg);
private:
int WriteUpdateData(int& player, int location, int& flag, unsigned char*& qbuf, int& use_cache);
protected: protected:
DuelPlayer* players[4]; DuelPlayer* players[4];
......
This diff is collapsed.
Subproject commit b840d9c1d59dbae35374a06e786409b34881d423 Subproject commit 06b41f47d45c6a9b00882aeff21d4e8f380b7bba
Subproject commit 3a636a9be60bbbb243e5c359f203b44cda97c395 Subproject commit 78e2d6bc30f435724338a3727aff2e4bd9d7b3c8
...@@ -181,6 +181,7 @@ ...@@ -181,6 +181,7 @@
!system 1042 创造神 !system 1042 创造神
!system 1043 幻龙 !system 1043 幻龙
!system 1044 电子界 !system 1044 电子界
!system 1045 幻想魔
!system 1050 怪兽 !system 1050 怪兽
!system 1051 魔法 !system 1051 魔法
!system 1052 陷阱 !system 1052 陷阱
...@@ -317,8 +318,8 @@ ...@@ -317,8 +318,8 @@
!system 1260 大师规则 !system 1260 大师规则
!system 1261 大师规则2 !system 1261 大师规则2
!system 1262 大师规则3 !system 1262 大师规则3
!system 1263 新大师规则 !system 1263 新大师规则2017
!system 1264 大师规则2020 !system 1264 大师规则2020
!system 1270 卡片信息 !system 1270 卡片信息
!system 1271 消息记录 !system 1271 消息记录
!system 1272 清除记录 !system 1272 清除记录
...@@ -338,6 +339,7 @@ ...@@ -338,6 +339,7 @@
!system 1286 特大 !system 1286 特大
!system 1287 只有连锁1也显示连锁动画 !system 1287 只有连锁1也显示连锁动画
!system 1288 禁限卡表 !system 1288 禁限卡表
!system 1289 隐藏玩家昵称
!system 1290 禁用聊天功能 !system 1290 禁用聊天功能
!system 1291 忽略观战者发言 !system 1291 忽略观战者发言
!system 1292 忽略时点 !system 1292 忽略时点
...@@ -594,7 +596,7 @@ ...@@ -594,7 +596,7 @@
!counter 0x25 年代记指示物 !counter 0x25 年代记指示物
!counter 0x26 指示物(金属射手) !counter 0x26 指示物(金属射手)
!counter 0x27 指示物(死亡蚊) !counter 0x27 指示物(死亡蚊)
!counter 0x28 指示物(暗黑射手) !counter 0x28 指示物(暗黑射手)
!counter 0x29 指示物(气球蜥蜴) !counter 0x29 指示物(气球蜥蜴)
!counter 0x102a 指示物(魔法防护器) !counter 0x102a 指示物(魔法防护器)
!counter 0x2b 命运指示物 !counter 0x2b 命运指示物
...@@ -638,7 +640,7 @@ ...@@ -638,7 +640,7 @@
!counter 0x57 幻魔指示物 !counter 0x57 幻魔指示物
!counter 0x58 指示物(祢须三破鸣比) !counter 0x58 指示物(祢须三破鸣比)
!counter 0x59 落魂指示物 !counter 0x59 落魂指示物
!counter 0x5a 指示物(岩战之试炼) !counter 0x5a 指示物(战吼试炼)
!counter 0x5b 指示物(北极天熊北斗星) !counter 0x5b 指示物(北极天熊北斗星)
!counter 0x105c 燃烧指示物 !counter 0x105c 燃烧指示物
!counter 0x5d 指示物(机巧传-神使记纪图) !counter 0x5d 指示物(机巧传-神使记纪图)
...@@ -649,6 +651,12 @@ ...@@ -649,6 +651,12 @@
!counter 0x62 指示物(逐渐削减的生命) !counter 0x62 指示物(逐渐削减的生命)
!counter 0x1063 幻觉指示物 !counter 0x1063 幻觉指示物
!counter 0x64 G石人指示物 !counter 0x64 G石人指示物
!counter 0x1065 兔耳指示物
!counter 0x66 指示物(推荐捏军贯)
!counter 0x67 指示物(战斗车轮)
!counter 0x68 指示物(图腾柱)
!counter 0x69 指示物(吠陀-优婆尼沙昙)
!counter 0x6a 响鸣指示物
#setnames, using tab for comment #setnames, using tab for comment
!setname 0x1 正义盟军 AOJ !setname 0x1 正义盟军 AOJ
!setname 0x2 次世代 ジェネクス !setname 0x2 次世代 ジェネクス
...@@ -688,7 +696,7 @@ ...@@ -688,7 +696,7 @@
!setname 0x16 机人 ロイド !setname 0x16 机人 ロイド
!setname 0x1016 交通机人 ビークロイド !setname 0x1016 交通机人 ビークロイド
!setname 0x2016 疾行机人 スピードロイド !setname 0x2016 疾行机人 スピードロイド
#!setname 0x17 同调 シンクロ !setname 0x17 同调 シンクロ
!setname 0x1017 同调士 シンクロン !setname 0x1017 同调士 シンクロン
!setname 0x2017 同调龙 シンクロ・ドラゴン !setname 0x2017 同调龙 シンクロ・ドラゴン
!setname 0x18 云魔物 雲魔物 !setname 0x18 云魔物 雲魔物
...@@ -701,7 +709,8 @@ ...@@ -701,7 +709,8 @@
!setname 0x1e 茧状体 C(コクーン) !setname 0x1e 茧状体 C(コクーン)
!setname 0x1f 新空间侠 N(ネオスペーシアン) !setname 0x1f 新空间侠 N(ネオスペーシアン)
!setname 0x20 紫炎 紫炎 !setname 0x20 紫炎 紫炎
!setname 0x21 地缚神 地縛神 !setname 0x21 地缚 地縛
!setname 0x1021 地缚神 地縛神
!setname 0x22 朱罗纪 ジュラック !setname 0x22 朱罗纪 ジュラック
!setname 0x23Sin !setname 0x23Sin
!setname 0x24 废铁 スクラップ !setname 0x24 废铁 スクラップ
...@@ -769,6 +778,8 @@ ...@@ -769,6 +778,8 @@
!setname 0x1050 凶饿毒|蛇毒 スターヴ・ヴェノム !setname 0x1050 凶饿毒|蛇毒 スターヴ・ヴェノム
!setname 0x51 零件 ガジェット !setname 0x51 零件 ガジェット
!setname 0x52 守护者 ガーディアン !setname 0x52 守护者 ガーディアン
!setname 0x1052 门之守护神|守护者 ゲート・ガーディアン
!setname 0x2052 法理守护者 ローガーディアン
!setname 0x53 星圣 セイクリッド !setname 0x53 星圣 セイクリッド
!setname 0x54 我我我 ガガガ !setname 0x54 我我我 ガガガ
!setname 0x55 光子 フォトン !setname 0x55 光子 フォトン
...@@ -810,6 +821,7 @@ ...@@ -810,6 +821,7 @@
!setname 0x73 超量 エクシーズ !setname 0x73 超量 エクシーズ
!setname 0x1073 混沌超量 CX(カオスエクシーズ) !setname 0x1073 混沌超量 CX(カオスエクシーズ)
!setname 0x2073 超量龙 エクシーズ・ドラゴン !setname 0x2073 超量龙 エクシーズ・ドラゴン
!setname 0x4073 铠装超量 アーマード・エクシーズ
!setname 0x74 水精鳞 水精鱗 !setname 0x74 水精鳞 水精鱗
!setname 0x75 深渊 アビス !setname 0x75 深渊 アビス
!setname 0x76 纹章兽 紋章獣 !setname 0x76 纹章兽 紋章獣
...@@ -819,6 +831,8 @@ ...@@ -819,6 +831,8 @@
#setname 0x7a 圣 聖 #setname 0x7a 圣 聖
!setname 0x107a 圣骑士 聖騎士(せいきし) !setname 0x107a 圣骑士 聖騎士(せいきし)
!setname 0x207a 圣剑 聖剣(せいけん) !setname 0x207a 圣剑 聖剣(せいけん)
!setname 0x507a 焰圣骑士 焔聖騎士
!setname 0x607a 焰圣剑 焔聖剣
!setname 0x7b 银河 ギャラクシー !setname 0x7b 银河 ギャラクシー
!setname 0x107b 银河眼 ギャラクシーアイズ !setname 0x107b 银河眼 ギャラクシーアイズ
!setname 0x307b 银河眼时空龙 ギャラクシーアイズ・タキオン・ドラゴン !setname 0x307b 银河眼时空龙 ギャラクシーアイズ・タキオン・ドラゴン
...@@ -837,7 +851,9 @@ ...@@ -837,7 +851,9 @@
!setname 0x82 怒怒怒 ドドド !setname 0x82 怒怒怒 ドドド
!setname 0x83 人偶 パペット !setname 0x83 人偶 パペット
!setname 0x1083 机关傀儡 ギミック・パペット !setname 0x1083 机关傀儡 ギミック・パペット
!setname 0x84 燃烧拳击手 BK(バーニングナックラー) #setname 0x84 燃烧拳 バーニングナック
!setname 0x1084 燃烧拳击手 BK(バーニングナックラー)
!setname 0x2084 燃烧拳 バーニングナックル
!setname 0x85 超级防卫机器人 SDロボ !setname 0x85 超级防卫机器人 SDロボ
!setname 0x86 光天使 !setname 0x86 光天使
!setname 0x87 阴影 アンブラル !setname 0x87 阴影 アンブラル
...@@ -867,8 +883,8 @@ ...@@ -867,8 +883,8 @@
!setname 0x109a 超重武者装留 !setname 0x109a 超重武者装留
!setname 0x9b 幻奏 !setname 0x9b 幻奏
!setname 0x109b 幻奏的音姬 幻奏の音姫 !setname 0x109b 幻奏的音姬 幻奏の音姫
!setname 0x9c テラナイト !setname 0x9c骑士 テラナイト
!setname 0x109c 星辉士|星 ステラナイト !setname 0x109c 星辉士|星骑士 ステラナイト
!setname 0x9d 影依 シャドール !setname 0x9d 影依 シャドール
!setname 0x9e 龙星 竜星 !setname 0x9e 龙星 竜星
!setname 0x9f 娱乐伙伴 EM(エンタメイト) !setname 0x9f 娱乐伙伴 EM(エンタメイト)
...@@ -890,6 +906,7 @@ ...@@ -890,6 +906,7 @@
!setname 0x10aa 隐藏的机壳 アポクリフォート !setname 0x10aa 隐藏的机壳 アポクリフォート
!setname 0xab 文具电子人|非「电子」 ブンボーグ !setname 0xab 文具电子人|非「电子」 ブンボーグ
!setname 0xac 哥布林 ゴブリン !setname 0xac 哥布林 ゴブリン
!setname 0x10ac 哥布林骑手 ゴブリンライダー
!setname 0xad 魔玩具 デストーイ !setname 0xad 魔玩具 デストーイ
!setname 0xae 契约书 契約書 !setname 0xae 契约书 契約書
!setname 0xaf DD !setname 0xaf DD
...@@ -1114,6 +1131,7 @@ ...@@ -1114,6 +1131,7 @@
!setname 0x160 原质炉 マテリアクトル !setname 0x160 原质炉 マテリアクトル
!setname 0x161 溟界 !setname 0x161 溟界
!setname 0x162 七音服 ドレミコード !setname 0x162 七音服 ドレミコード
!setname 0x1162 大钢琴之七音服 グランドレミコード
!setname 0x163 北极天熊 ベアルクティ !setname 0x163 北极天熊 ベアルクティ
!setname 0x164 死狱乡 デスピア !setname 0x164 死狱乡 デスピア
!setname 0x165 魔键 魔鍵 !setname 0x165 魔键 魔鍵
...@@ -1140,7 +1158,7 @@ ...@@ -1140,7 +1158,7 @@
!setname 0x179 兽带斗神 セリオンズ !setname 0x179 兽带斗神 セリオンズ
!setname 0x17a 恐吓爪牙族 スケアクロー !setname 0x17a 恐吓爪牙族 スケアクロー
!setname 0x17b 野蛮人 バーバリアン !setname 0x17b 野蛮人 バーバリアン
!setname 0x17c 漫读使灵 リブロマンサー !setname 0x17c 书灵师 リブロマンサー
!setname 0x17d 群豪 ヴァリアンツ !setname 0x17d 群豪 ヴァリアンツ
!setname 0x17e 拉比林斯迷宫 ラビュリンス !setname 0x17e 拉比林斯迷宫 ラビュリンス
!setname 0x117e 拉比林斯迷宫欢迎 ウェルカム・ラビュリンス !setname 0x117e 拉比林斯迷宫欢迎 ウェルカム・ラビュリンス
...@@ -1157,8 +1175,39 @@ ...@@ -1157,8 +1175,39 @@
!setname 0x187 桥梁 架け橋 !setname 0x187 桥梁 架け橋
!setname 0x188 深渊之兽 ビーステッド !setname 0x188 深渊之兽 ビーステッド
!setname 0x189 俱舍怒威族 クシャトリラ !setname 0x189 俱舍怒威族 クシャトリラ
!setname 0x18a 魊影 Ghoti !setname 0x18a 魊影 ゴーティス
!setname 0x18b 救援ACERACE !setname 0x18b 救援ACERACE
!setname 0x18c 纯爱妖精 ピュアリィ !setname 0x18c 纯爱妖精 ピュアリィ
!setname 0x18d 御巫 !setname 0x18d 御巫
!setname 0x18e 仪水镜 儀水鏡 !setname 0x18e 仪水镜 儀水鏡
!setname 0x18f 防火 ファイアウォール
!setname 0x190 末那愚子族 マナドゥム
!setname 0x191 妮穆蕾莉娅 ネムレリア
!setname 0x192 金傲大奖赛 GP(ゴールド・プライド)
!setname 0x193 迷宫壁 ラビリンス・ウォール
!setname 0x194 至爱 フェイバリット
!setname 0x195 征服斗魂 VS(ヴァンキッシュ・ソウル)
!setname 0x196 新式魔厨 ヌーベルズ
!setname 0x197 食谱 レシピ
!setname 0x198 维萨斯 ヴィサス
!setname 0x199 反击 カウンター
!setname 0x19a 吠陀 ヴェーダ
!setname 0x19b 迪亚贝尔斯塔尔 ディアベルスター
!setname 0x19c 蛇眼 スネークアイ
!setname 0x19d 荷鲁斯 ホルス
!setname 0x119d 荷鲁斯之黑炎龙 ホルスの黒炎竜
!setname 0x19e 罪宝
!setname 0x19f 圣菓使 聖菓使
!setname 0x1a0 哈特 ハート
!setname 0x1a1 莫忘 メメント
!setname 0x1a2 百夫长骑士 センチュリオン
!setname 0x1a3 异响鸣 ヴァルモニカ
!setname 0x1a4 蒂斯蒂娜 Tistina
!setname 0x1a5 于贝尔 ユベル
!setname 0x1a6 肃声 粛声
!setname 0x1a7 白斗气 ホワイト・オーラ
!setname 0x1a8 玩具 トイ
!setname 0x1a9 灿幻 燦幻
!setname 0x1aa 天杯龙 天盃龍
!setname 0x1ab 蕾祸 蕾禍
!setname 0x1ac 飞龙炎 Salamandra
textures/lp.png

967 Bytes | W: | H:

textures/lp.png

2.05 KB | W: | H:

textures/lp.png
textures/lp.png
textures/lp.png
textures/lp.png
  • 2-up
  • Swipe
  • Onion skin
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