Commit df6796ad authored by mercury233's avatar mercury233

Merge branch 'master' of https://github.com/Fluorohydride/ygopro into server-link

parents 090fbbe8 44b05a18
...@@ -66,6 +66,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -66,6 +66,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
if(mainGame->wQuery->isVisible() && id != BUTTON_YES && id != BUTTON_NO) if(mainGame->wQuery->isVisible() && id != BUTTON_YES && id != BUTTON_NO)
break; break;
if(mainGame->wLinkMarks->isVisible() && id != BUTTON_MARKERS_OK)
break;
switch(event.GUIEvent.EventType) { switch(event.GUIEvent.EventType) {
case irr::gui::EGET_BUTTON_CLICKED: { case irr::gui::EGET_BUTTON_CLICKED: {
switch(id) { switch(id) {
...@@ -157,18 +159,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -157,18 +159,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_START_FILTER: { case BUTTON_START_FILTER: {
filter_type = mainGame->cbCardType->getSelected(); StartFilter();
filter_type2 = mainGame->cbCardType2->getItemData(mainGame->cbCardType2->getSelected());
filter_lm = mainGame->cbLimit->getSelected();
if(filter_type == 1) {
filter_attrib = mainGame->cbAttribute->getItemData(mainGame->cbAttribute->getSelected());
filter_race = mainGame->cbRace->getItemData(mainGame->cbRace->getSelected());
filter_atk = parse_filter(mainGame->ebAttack->getText(), &filter_atktype);
filter_def = parse_filter(mainGame->ebDefense->getText(), &filter_deftype);
filter_lv = parse_filter(mainGame->ebStar->getText(), &filter_lvtype);
filter_scl = parse_filter(mainGame->ebScale->getText(), &filter_scltype);
}
FilterCards();
if(!mainGame->gameConf.separate_clear_button) if(!mainGame->gameConf.separate_clear_button)
ClearFilter(); ClearFilter();
break; break;
...@@ -242,6 +233,31 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -242,6 +233,31 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
is_clearing = false; is_clearing = false;
break; break;
} }
case BUTTON_MARKS_FILTER: {
mainGame->PopupElement(mainGame->wLinkMarks);
break;
}
case BUTTON_MARKERS_OK: {
filter_marks = 0;
if (mainGame->btnMark[0]->isPressed())
filter_marks |= 0100;
if (mainGame->btnMark[1]->isPressed())
filter_marks |= 0200;
if (mainGame->btnMark[2]->isPressed())
filter_marks |= 0400;
if (mainGame->btnMark[3]->isPressed())
filter_marks |= 0010;
if (mainGame->btnMark[4]->isPressed())
filter_marks |= 0040;
if (mainGame->btnMark[5]->isPressed())
filter_marks |= 0001;
if (mainGame->btnMark[6]->isPressed())
filter_marks |= 0002;
if (mainGame->btnMark[7]->isPressed())
filter_marks |= 0004;
mainGame->HideElement(mainGame->wLinkMarks);
break;
}
} }
break; break;
} }
...@@ -258,12 +274,17 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -258,12 +274,17 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
case irr::gui::EGET_EDITBOX_ENTER: { case irr::gui::EGET_EDITBOX_ENTER: {
switch(id) { switch(id) {
case EDITBOX_KEYWORD: { case EDITBOX_KEYWORD: {
irr::SEvent me; StartFilter();
me.EventType = irr::EET_GUI_EVENT; break;
me.GUIEvent.EventType = irr::gui::EGET_BUTTON_CLICKED; }
me.GUIEvent.Caller = mainGame->btnStartFilter; }
me.GUIEvent.Element = mainGame->btnStartFilter; break;
mainGame->device->postEventFromUser(me); }
case irr::gui::EGET_EDITBOX_CHANGED: {
switch(id) {
case EDITBOX_KEYWORD: {
if(mainGame->gameConf.auto_search_limit >= 0 && (wcslen(mainGame->ebCardName->getText()) >= mainGame->gameConf.auto_search_limit))
StartFilter();
break; break;
} }
} }
...@@ -783,6 +804,20 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -783,6 +804,20 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
return false; return false;
} }
void DeckBuilder::StartFilter() {
filter_type = mainGame->cbCardType->getSelected();
filter_type2 = mainGame->cbCardType2->getItemData(mainGame->cbCardType2->getSelected());
filter_lm = mainGame->cbLimit->getSelected();
if(filter_type == 1) {
filter_attrib = mainGame->cbAttribute->getItemData(mainGame->cbAttribute->getSelected());
filter_race = mainGame->cbRace->getItemData(mainGame->cbRace->getSelected());
filter_atk = parse_filter(mainGame->ebAttack->getText(), &filter_atktype);
filter_def = parse_filter(mainGame->ebDefense->getText(), &filter_deftype);
filter_lv = parse_filter(mainGame->ebStar->getText(), &filter_lvtype);
filter_scl = parse_filter(mainGame->ebScale->getText(), &filter_scltype);
}
FilterCards();
}
void DeckBuilder::FilterCards() { void DeckBuilder::FilterCards() {
results.clear(); results.clear();
const wchar_t* pstr = mainGame->ebCardName->getText(); const wchar_t* pstr = mainGame->ebCardName->getText();
...@@ -860,6 +895,8 @@ void DeckBuilder::FilterCards() { ...@@ -860,6 +895,8 @@ void DeckBuilder::FilterCards() {
} }
if(filter_effect && !(data.category & filter_effect)) if(filter_effect && !(data.category & filter_effect))
continue; continue;
if(filter_marks && (data.link_marker & filter_marks)!= filter_marks)
continue;
if(filter_lm) { if(filter_lm) {
if(filter_lm <= 3 && (!filterList->count(ptr->first) || (*filterList)[ptr->first] != filter_lm - 1)) if(filter_lm <= 3 && (!filterList->count(ptr->first) || (*filterList)[ptr->first] != filter_lm - 1))
continue; continue;
...@@ -874,12 +911,12 @@ void DeckBuilder::FilterCards() { ...@@ -874,12 +911,12 @@ void DeckBuilder::FilterCards() {
} }
if(pstr) { if(pstr) {
if(pstr[0] == L'$') { if(pstr[0] == L'$') {
if(wcsstr(text.name, &pstr[1]) == 0) if(!CardNameContains(text.name, &pstr[1]))
continue; continue;
} else if(pstr[0] == L'@' && set_code) { } else if(pstr[0] == L'@' && set_code) {
if(!check_set_code(data, set_code)) continue; if(!check_set_code(data, set_code)) continue;
} else { } else {
if(wcsstr(text.name, pstr) == 0 && wcsstr(text.text, pstr) == 0 if(!CardNameContains(text.name, pstr) && wcsstr(text.text, pstr) == 0
&& (!set_code || !check_set_code(data, set_code))) && (!set_code || !check_set_code(data, set_code)))
continue; continue;
} }
...@@ -909,6 +946,8 @@ void DeckBuilder::ClearSearch() { ...@@ -909,6 +946,8 @@ void DeckBuilder::ClearSearch() {
mainGame->ebScale->setEnabled(false); mainGame->ebScale->setEnabled(false);
mainGame->ebCardName->setText(L""); mainGame->ebCardName->setText(L"");
ClearFilter(); ClearFilter();
results.clear();
myswprintf(result_string, L"%d", 0);
} }
void DeckBuilder::ClearFilter() { void DeckBuilder::ClearFilter() {
mainGame->cbAttribute->setSelected(0); mainGame->cbAttribute->setSelected(0);
...@@ -921,6 +960,9 @@ void DeckBuilder::ClearFilter() { ...@@ -921,6 +960,9 @@ void DeckBuilder::ClearFilter() {
filter_effect = 0; filter_effect = 0;
for(int i = 0; i < 32; ++i) for(int i = 0; i < 32; ++i)
mainGame->chkCategory[i]->setChecked(false); mainGame->chkCategory[i]->setChecked(false);
filter_marks = 0;
for(int i = 0; i < 8; i++)
mainGame->btnMark[i]->setPressed(false);
} }
void DeckBuilder::SortList() { void DeckBuilder::SortList() {
auto left = results.begin(); auto left = results.begin();
...@@ -946,5 +988,46 @@ void DeckBuilder::SortList() { ...@@ -946,5 +988,46 @@ void DeckBuilder::SortList() {
break; break;
} }
} }
static inline wchar_t NormalizeChar(wchar_t c) {
/*
// Convert all symbols and punctuations to space.
if (c != 0 && c < 128 && !isalnum(c)) {
return ' ';
}
*/
// Convert latin chararacters to uppercase to ignore case.
if (c < 128 && isalpha(c)) {
return toupper(c);
}
// Remove some accentued characters that are not supported by the editbox.
if (c >= 232 && c <= 235) {
return 'E';
}
if (c >= 238 && c <= 239) {
return 'I';
}
return c;
}
bool DeckBuilder::CardNameContains(const wchar_t *haystack, const wchar_t *needle)
{
if (!needle[0]) {
return true;
}
int i = 0;
int j = 0;
while (haystack[i]) {
wchar_t ca = NormalizeChar(haystack[i]);
wchar_t cb = NormalizeChar(needle[j]);
if (ca == cb) {
j++;
if (!needle[j]) {
return true;
}
} else {
j = 0;
}
i++;
}
return false;
}
} }
...@@ -12,10 +12,13 @@ class DeckBuilder: public irr::IEventReceiver { ...@@ -12,10 +12,13 @@ class DeckBuilder: public irr::IEventReceiver {
public: public:
virtual bool OnEvent(const irr::SEvent& event); virtual bool OnEvent(const irr::SEvent& event);
void FilterCards(); void FilterCards();
void StartFilter();
void ClearFilter(); void ClearFilter();
void ClearSearch(); void ClearSearch();
void SortList(); void SortList();
bool CardNameContains(const wchar_t *haystack, const wchar_t *needle);
long long filter_effect; long long filter_effect;
unsigned int filter_type; unsigned int filter_type;
unsigned int filter_type2; unsigned int filter_type2;
...@@ -29,6 +32,7 @@ public: ...@@ -29,6 +32,7 @@ public:
unsigned int filter_lv; unsigned int filter_lv;
unsigned int filter_scltype; unsigned int filter_scltype;
unsigned int filter_scl; unsigned int filter_scl;
unsigned int filter_marks;
int filter_lm; int filter_lm;
int hovered_code; int hovered_code;
int hovered_pos; int hovered_pos;
......
...@@ -166,8 +166,13 @@ void Game::DrawBackGround() { ...@@ -166,8 +166,13 @@ void Game::DrawBackGround() {
S3DVertex *vertex = 0; S3DVertex *vertex = 0;
if (dField.hovered_location == LOCATION_DECK) if (dField.hovered_location == LOCATION_DECK)
vertex = matManager.vFieldDeck[dField.hovered_controler]; vertex = matManager.vFieldDeck[dField.hovered_controler];
else if (dField.hovered_location == LOCATION_MZONE) else if (dField.hovered_location == LOCATION_MZONE) {
vertex = matManager.vFieldMzone[dField.hovered_controler][dField.hovered_sequence]; vertex = matManager.vFieldMzone[dField.hovered_controler][dField.hovered_sequence];
ClientCard* pcard = mainGame->dField.mzone[dField.hovered_controler][dField.hovered_sequence];
if(dInfo.duel_rule >= 3 && pcard && pcard->type & TYPE_LINK) {
DrawLinkedZones(pcard);
}
}
else if (dField.hovered_location == LOCATION_SZONE) else if (dField.hovered_location == LOCATION_SZONE)
vertex = matManager.vFieldSzone[dField.hovered_controler][dField.hovered_sequence][rule]; vertex = matManager.vFieldSzone[dField.hovered_controler][dField.hovered_sequence][rule];
else if (dField.hovered_location == LOCATION_GRAVE) else if (dField.hovered_location == LOCATION_GRAVE)
...@@ -191,6 +196,36 @@ void Game::DrawBackGround() { ...@@ -191,6 +196,36 @@ void Game::DrawBackGround() {
driver->drawVertexPrimitiveList(vertex, 4, matManager.iRectangle, 2); driver->drawVertexPrimitiveList(vertex, 4, matManager.iRectangle, 2);
} }
} }
void Game::DrawLinkedZones(ClientCard* pcard) {
int mark = pcard->link_marker;
matManager.mSelField.AmbientColor = 0xff0261a2;
driver->setMaterial(matManager.mSelField);
if (dField.hovered_sequence<5) {
if (mark & LINK_MARKER_LEFT && dField.hovered_sequence>0)
driver->drawVertexPrimitiveList(&matManager.vFieldMzone[dField.hovered_controler][dField.hovered_sequence - 1], 4, matManager.iRectangle, 2);
if (mark & LINK_MARKER_RIGHT && dField.hovered_sequence<4)
driver->drawVertexPrimitiveList(&matManager.vFieldMzone[dField.hovered_controler][dField.hovered_sequence + 1], 4, matManager.iRectangle, 2);
if ((mark & LINK_MARKER_TOP_LEFT && dField.hovered_sequence == 2) || (mark & LINK_MARKER_TOP && dField.hovered_sequence == 1) || (mark & LINK_MARKER_TOP_RIGHT && dField.hovered_sequence == 0))
driver->drawVertexPrimitiveList(&matManager.vFieldMzone[dField.hovered_controler][5], 4, matManager.iRectangle, 2);
if ((mark & LINK_MARKER_TOP_LEFT && dField.hovered_sequence == 4) || (mark & LINK_MARKER_TOP && dField.hovered_sequence == 3) || (mark & LINK_MARKER_TOP_RIGHT && dField.hovered_sequence == 2))
driver->drawVertexPrimitiveList(&matManager.vFieldMzone[dField.hovered_controler][6], 4, matManager.iRectangle, 2);
}
else {
int swap = (dField.hovered_sequence == 5) ? 0 : 2;
if (mark & LINK_MARKER_BOTTOM_LEFT)
driver->drawVertexPrimitiveList(&matManager.vFieldMzone[dField.hovered_controler][0 + swap], 4, matManager.iRectangle, 2);
if (mark & LINK_MARKER_BOTTOM)
driver->drawVertexPrimitiveList(&matManager.vFieldMzone[dField.hovered_controler][1 + swap], 4, matManager.iRectangle, 2);
if (mark & LINK_MARKER_BOTTOM_RIGHT)
driver->drawVertexPrimitiveList(&matManager.vFieldMzone[dField.hovered_controler][2 + swap], 4, matManager.iRectangle, 2);
if (mark & LINK_MARKER_TOP_LEFT)
driver->drawVertexPrimitiveList(&matManager.vFieldMzone[1 - dField.hovered_controler][4 - swap], 4, matManager.iRectangle, 2);
if (mark & LINK_MARKER_TOP)
driver->drawVertexPrimitiveList(&matManager.vFieldMzone[1 - dField.hovered_controler][3 - swap], 4, matManager.iRectangle, 2);
if (mark & LINK_MARKER_TOP_RIGHT)
driver->drawVertexPrimitiveList(&matManager.vFieldMzone[1 - dField.hovered_controler][2 - swap], 4, matManager.iRectangle, 2);
}
}
void Game::DrawCards() { void Game::DrawCards() {
for(int p = 0; p < 2; ++p) { for(int p = 0; p < 2; ++p) {
for(auto it = dField.mzone[p].begin(); it != dField.mzone[p].end(); ++it) for(auto it = dField.mzone[p].begin(); it != dField.mzone[p].end(); ++it)
...@@ -437,25 +472,48 @@ void Game::DrawMisc() { ...@@ -437,25 +472,48 @@ void Game::DrawMisc() {
pcard = dField.mzone[1][6]; pcard = dField.mzone[1][6];
if(pcard && (pcard->position & POS_FACEUP)) if(pcard && (pcard->position & POS_FACEUP))
DrawStatus(pcard, 593, 291, 555, 338); DrawStatus(pcard, 593, 291, 555, 338);
pcard = dField.szone[0][6]; if(dInfo.duel_rule < 3) {
if(pcard) { pcard = dField.szone[0][6];
adFont->draw(pcard->lscstring, recti(426, 394, 438, 414), 0xff000000, true, false, 0); if(pcard) {
adFont->draw(pcard->lscstring, recti(427, 395, 439, 415), 0xffffffff, true, false, 0); adFont->draw(pcard->lscstring, recti(426, 394, 438, 414), 0xff000000, true, false, 0);
} adFont->draw(pcard->lscstring, recti(427, 395, 439, 415), 0xffffffff, true, false, 0);
pcard = dField.szone[0][7]; }
if(pcard) { pcard = dField.szone[0][7];
adFont->draw(pcard->rscstring, recti(880, 394, 912, 414), 0xff000000, true, false, 0); if(pcard) {
adFont->draw(pcard->rscstring, recti(881, 395, 913, 415), 0xffffffff, true, false, 0); adFont->draw(pcard->rscstring, recti(880, 394, 912, 414), 0xff000000, true, false, 0);
} adFont->draw(pcard->rscstring, recti(881, 395, 913, 415), 0xffffffff, true, false, 0);
pcard = dField.szone[1][6]; }
if(pcard) { pcard = dField.szone[1][6];
adFont->draw(pcard->lscstring, recti(839, 245, 871, 265), 0xff000000, true, false, 0); if(pcard) {
adFont->draw(pcard->lscstring, recti(840, 246, 872, 266), 0xffffffff, true, false, 0); adFont->draw(pcard->lscstring, recti(839, 245, 871, 265), 0xff000000, true, false, 0);
} adFont->draw(pcard->lscstring, recti(840, 246, 872, 266), 0xffffffff, true, false, 0);
pcard = dField.szone[1][7]; }
if(pcard) { pcard = dField.szone[1][7];
adFont->draw(pcard->rscstring, recti(463, 245, 495, 265), 0xff000000, true, false, 0); if(pcard) {
adFont->draw(pcard->rscstring, recti(464, 246, 496, 266), 0xffffffff, true, false, 0); adFont->draw(pcard->rscstring, recti(463, 245, 495, 265), 0xff000000, true, false, 0);
adFont->draw(pcard->rscstring, recti(464, 246, 496, 266), 0xffffffff, true, false, 0);
}
} else {
pcard = dField.szone[0][0];
if(pcard && (pcard->type & TYPE_PENDULUM) && !pcard->equipTarget) {
adFont->draw(pcard->lscstring, recti(454, 430, 466, 450), 0xff000000, true, false, 0);
adFont->draw(pcard->lscstring, recti(455, 431, 467, 451), 0xffffffff, true, false, 0);
}
pcard = dField.szone[0][4];
if(pcard && (pcard->type & TYPE_PENDULUM) && !pcard->equipTarget) {
adFont->draw(pcard->rscstring, recti(850, 430, 882, 450), 0xff000000, true, false, 0);
adFont->draw(pcard->rscstring, recti(851, 431, 883, 451), 0xffffffff, true, false, 0);
}
pcard = dField.szone[1][0];
if(pcard && (pcard->type & TYPE_PENDULUM) && !pcard->equipTarget) {
adFont->draw(pcard->lscstring, recti(806, 222, 838, 242), 0xff000000, true, false, 0);
adFont->draw(pcard->lscstring, recti(807, 223, 839, 243), 0xffffffff, true, false, 0);
}
pcard = dField.szone[1][4];
if(pcard && (pcard->type & TYPE_PENDULUM) && !pcard->equipTarget) {
adFont->draw(pcard->rscstring, recti(498, 222, 530, 242), 0xff000000, true, false, 0);
adFont->draw(pcard->rscstring, recti(499, 223, 531, 243), 0xffffffff, true, false, 0);
}
} }
if(dField.extra[0].size()) { if(dField.extra[0].size()) {
int offset = (dField.extra[0].size() >= 10) ? 0 : mainGame->textFont->getDimension(dataManager.GetNumString(1)).Width; int offset = (dField.extra[0].size() >= 10) ? 0 : mainGame->textFont->getDimension(dataManager.GetNumString(1)).Width;
......
...@@ -1014,7 +1014,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -1014,7 +1014,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
mainGame->dField.remove_act = true; mainGame->dField.remove_act = true;
else if (pcard->location == LOCATION_EXTRA) else if (pcard->location == LOCATION_EXTRA)
mainGame->dField.extra_act = true; mainGame->dField.extra_act = true;
else if (pcard->location == LOCATION_SZONE && (pcard->sequence == 0 || pcard->sequence == 6) && pcard->lscale) else if (pcard->location == LOCATION_SZONE && (pcard->sequence == 0 || pcard->sequence == 6) && (pcard->type & TYPE_PENDULUM))
mainGame->dField.pzone_act[pcard->controler] = true; mainGame->dField.pzone_act[pcard->controler] = true;
} }
mainGame->dField.reposable_cards.clear(); mainGame->dField.reposable_cards.clear();
...@@ -1295,10 +1295,14 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -1295,10 +1295,14 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
myswprintf(textBuffer, dataManager.GetSysString(569), dataManager.GetName(select_hint)); myswprintf(textBuffer, dataManager.GetSysString(569), dataManager.GetName(select_hint));
} else } else
myswprintf(textBuffer, dataManager.GetSysString(560)); myswprintf(textBuffer, dataManager.GetSysString(560));
select_hint = 0; } else {
mainGame->stHintMsg->setText(textBuffer); if (select_hint) {
} else myswprintf(textBuffer, dataManager.GetDesc(select_hint));
mainGame->stHintMsg->setText(dataManager.GetSysString(570)); } else
myswprintf(textBuffer, dataManager.GetSysString(570));
}
select_hint = 0;
mainGame->stHintMsg->setText(textBuffer);
mainGame->stHintMsg->setVisible(true); mainGame->stHintMsg->setVisible(true);
if (mainGame->dInfo.curMsg == MSG_SELECT_PLACE && mainGame->chkAutoPos->isChecked()) { if (mainGame->dInfo.curMsg == MSG_SELECT_PLACE && mainGame->chkAutoPos->isChecked()) {
unsigned int filter; unsigned int filter;
...@@ -2910,6 +2914,30 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -2910,6 +2914,30 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
mainGame->WaitFrameSignal(40); mainGame->WaitFrameSignal(40);
return true; return true;
} }
case MSG_ROCK_PAPER_SCISSORS: {
/*int player = */mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
if(mainGame->dInfo.isReplay && mainGame->dInfo.isReplaySkiping)
return true;
mainGame->gMutex.Lock();
mainGame->PopupElement(mainGame->wHand);
mainGame->gMutex.Unlock();
return false;
}
case MSG_HAND_RES: {
int res = BufferIO::ReadInt8(pbuf);
if(mainGame->dInfo.isReplay && mainGame->dInfo.isReplaySkiping)
return true;
mainGame->stHintMsg->setVisible(false);
if(mainGame->dInfo.isFirst)
mainGame->showcardcode = ((res & 0x3) - 1) + ((((res >> 2) & 0x3) - 1) << 16);
else
mainGame->showcardcode = (((res >> 2) & 0x3) - 1) + (((res & 0x3) - 1) << 16);
mainGame->showcarddif = 50;
mainGame->showcardp = 0;
mainGame->showcard = 100;
mainGame->WaitFrameSignal(60);
return false;
}
case MSG_ANNOUNCE_RACE: { case MSG_ANNOUNCE_RACE: {
/*int player = */mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf)); /*int player = */mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
mainGame->dField.announce_count = BufferIO::ReadInt8(pbuf); mainGame->dField.announce_count = BufferIO::ReadInt8(pbuf);
...@@ -3176,6 +3204,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -3176,6 +3204,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
case MSG_RELOAD_FIELD: { case MSG_RELOAD_FIELD: {
mainGame->gMutex.Lock(); mainGame->gMutex.Lock();
mainGame->dField.Clear(); mainGame->dField.Clear();
mainGame->dInfo.duel_rule = BufferIO::ReadInt8(pbuf);
int val = 0; int val = 0;
for(int i = 0; i < 2; ++i) { for(int i = 0; i < 2; ++i) {
int p = mainGame->LocalPlayer(i); int p = mainGame->LocalPlayer(i);
...@@ -3291,7 +3320,6 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -3291,7 +3320,6 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
myswprintf(event_string, dataManager.GetSysString(1609), dataManager.GetName(mainGame->dField.current_chain.code)); myswprintf(event_string, dataManager.GetSysString(1609), dataManager.GetName(mainGame->dField.current_chain.code));
mainGame->dField.last_chain = true; mainGame->dField.last_chain = true;
} }
mainGame->dInfo.duel_rule = BufferIO::ReadInt8(pbuf);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
break; break;
} }
......
...@@ -29,11 +29,16 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -29,11 +29,16 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case BUTTON_HAND2: case BUTTON_HAND2:
case BUTTON_HAND3: { case BUTTON_HAND3: {
mainGame->wHand->setVisible(false); mainGame->wHand->setVisible(false);
mainGame->stHintMsg->setText(L""); if(mainGame->dInfo.curMsg == MSG_ROCK_PAPER_SCISSORS){
mainGame->stHintMsg->setVisible(true); DuelClient::SetResponseI(id - BUTTON_HAND1 + 1);
CTOS_HandResult cshr; DuelClient::SendResponse();
cshr.res = id - BUTTON_HAND1 + 1; } else {
DuelClient::SendPacketToServer(CTOS_HAND_RESULT, cshr); mainGame->stHintMsg->setText(L"");
mainGame->stHintMsg->setVisible(true);
CTOS_HandResult cshr;
cshr.res = id - BUTTON_HAND1 + 1;
DuelClient::SendPacketToServer(CTOS_HAND_RESULT, cshr);
}
break; break;
} }
case BUTTON_FIRST: case BUTTON_FIRST:
......
...@@ -527,10 +527,10 @@ bool Game::Initialize() { ...@@ -527,10 +527,10 @@ bool Game::Initialize() {
ebDefense = env->addEditBox(L"", rect<s32>(260, 40 + 75 / 6, 340, 60 + 75 / 6), true, wFilter); ebDefense = env->addEditBox(L"", rect<s32>(260, 40 + 75 / 6, 340, 60 + 75 / 6), true, wFilter);
ebDefense->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER); ebDefense->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
env->addStaticText(dataManager.GetSysString(1324), rect<s32>(10, 62 + 100 / 6, 80, 82 + 100 / 6), false, false, wFilter); env->addStaticText(dataManager.GetSysString(1324), rect<s32>(10, 62 + 100 / 6, 80, 82 + 100 / 6), false, false, wFilter);
ebStar = env->addEditBox(L"", rect<s32>(60, 60 + 100 / 6, 190, 80 + 100 / 6), true, wFilter); ebStar = env->addEditBox(L"", rect<s32>(60, 60 + 100 / 6, 100, 80 + 100 / 6), true, wFilter);
ebStar->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER); ebStar->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
env->addStaticText(dataManager.GetSysString(1336), rect<s32>(10, 82 + 125 / 6, 80, 102 + 125 / 6), false, false, wFilter); env->addStaticText(dataManager.GetSysString(1336), rect<s32>(101, 62 + 100 / 6, 150, 82 + 100 / 6), false, false, wFilter);
ebScale = env->addEditBox(L"", rect<s32>(60, 80 + 125 / 6, 190, 100 + 125 / 6), true, wFilter); ebScale = env->addEditBox(L"", rect<s32>(150, 60 + 100 / 6, 190, 80 + 100 / 6), true, wFilter);
ebScale->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER); ebScale->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
env->addStaticText(dataManager.GetSysString(1325), rect<s32>(205, 62 + 100 / 6, 280, 82 + 100 / 6), false, false, wFilter); env->addStaticText(dataManager.GetSysString(1325), rect<s32>(205, 62 + 100 / 6, 280, 82 + 100 / 6), false, false, wFilter);
ebCardName = env->addEditBox(L"", rect<s32>(260, 60 + 100 / 6, 390, 80 + 100 / 6), true, wFilter, EDITBOX_KEYWORD); ebCardName = env->addEditBox(L"", rect<s32>(260, 60 + 100 / 6, 390, 80 + 100 / 6), true, wFilter, EDITBOX_KEYWORD);
...@@ -549,6 +549,23 @@ bool Game::Initialize() { ...@@ -549,6 +549,23 @@ bool Game::Initialize() {
btnCategoryOK = env->addButton(rect<s32>(135, 175, 235, 200), wCategories, BUTTON_CATEGORY_OK, dataManager.GetSysString(1211)); btnCategoryOK = env->addButton(rect<s32>(135, 175, 235, 200), wCategories, BUTTON_CATEGORY_OK, dataManager.GetSysString(1211));
for(int i = 0; i < 32; ++i) for(int i = 0; i < 32; ++i)
chkCategory[i] = env->addCheckBox(false, recti(10 + (i % 4) * 90, 10 + (i / 4) * 20, 100 + (i % 4) * 90, 30 + (i / 4) * 20), wCategories, -1, dataManager.GetSysString(1100 + i)); chkCategory[i] = env->addCheckBox(false, recti(10 + (i % 4) * 90, 10 + (i / 4) * 20, 100 + (i % 4) * 90, 30 + (i / 4) * 20), wCategories, -1, dataManager.GetSysString(1100 + i));
btnMarksFilter = env->addButton(rect<s32>(60, 80 + 125 / 6, 190, 100 + 125 / 6), wFilter, BUTTON_MARKS_FILTER, dataManager.GetSysString(1374));
wLinkMarks = env->addWindow(rect<s32>(700, 30, 820, 150), false, dataManager.strBuffer);
wLinkMarks->getCloseButton()->setVisible(false);
wLinkMarks->setDrawTitlebar(false);
wLinkMarks->setDraggable(false);
wLinkMarks->setVisible(false);
btnMarksOK = env->addButton(recti(45, 45, 75, 75), wLinkMarks, BUTTON_MARKERS_OK, dataManager.GetSysString(1211));
btnMark[0] = env->addButton(recti(10, 10, 40, 40), wLinkMarks, -1, L"\u2196");
btnMark[1] = env->addButton(recti(45, 10, 75, 40), wLinkMarks, -1, L"\u2191");
btnMark[2] = env->addButton(recti(80, 10, 110, 40), wLinkMarks, -1, L"\u2197");
btnMark[3] = env->addButton(recti(10, 45, 40, 75), wLinkMarks, -1, L"\u2190");
btnMark[4] = env->addButton(recti(80, 45, 110, 75), wLinkMarks, -1, L"\u2192");
btnMark[5] = env->addButton(recti(10, 80, 40, 110), wLinkMarks, -1, L"\u2199");
btnMark[6] = env->addButton(recti(45, 80, 75, 110), wLinkMarks, -1, L"\u2193");
btnMark[7] = env->addButton(recti(80, 80, 110, 110), wLinkMarks, -1, L"\u2198");
for(int i=0;i<8;i++)
btnMark[i]->setIsPushButton(true);
//replay window //replay window
wReplay = env->addWindow(rect<s32>(220, 100, 800, 520), false, dataManager.GetSysString(1202)); wReplay = env->addWindow(rect<s32>(220, 100, 800, 520), false, dataManager.GetSysString(1202));
wReplay->getCloseButton()->setVisible(false); wReplay->getCloseButton()->setVisible(false);
...@@ -943,6 +960,7 @@ void Game::LoadConfig() { ...@@ -943,6 +960,7 @@ void Game::LoadConfig() {
gameConf.control_mode = 0; gameConf.control_mode = 0;
gameConf.draw_field_spell = 1; gameConf.draw_field_spell = 1;
gameConf.separate_clear_button = 1; gameConf.separate_clear_button = 1;
gameConf.auto_search_limit = -1;
fseek(fp, 0, SEEK_END); fseek(fp, 0, SEEK_END);
int fsize = ftell(fp); int fsize = ftell(fp);
fseek(fp, 0, SEEK_SET); fseek(fp, 0, SEEK_SET);
...@@ -997,6 +1015,8 @@ void Game::LoadConfig() { ...@@ -997,6 +1015,8 @@ void Game::LoadConfig() {
gameConf.draw_field_spell = atoi(valbuf); gameConf.draw_field_spell = atoi(valbuf);
} else if(!strcmp(strbuf, "separate_clear_button")) { } else if(!strcmp(strbuf, "separate_clear_button")) {
gameConf.separate_clear_button = atoi(valbuf); gameConf.separate_clear_button = atoi(valbuf);
} else if(!strcmp(strbuf, "auto_search_limit")) {
gameConf.auto_search_limit = atoi(valbuf);
} else { } else {
// options allowing multiple words // options allowing multiple words
sscanf(linebuf, "%s = %240[^\n]", strbuf, valbuf); sscanf(linebuf, "%s = %240[^\n]", strbuf, valbuf);
...@@ -1050,6 +1070,8 @@ void Game::SaveConfig() { ...@@ -1050,6 +1070,8 @@ void Game::SaveConfig() {
fprintf(fp, "control_mode = %d\n", gameConf.control_mode); fprintf(fp, "control_mode = %d\n", gameConf.control_mode);
fprintf(fp, "draw_field_spell = %d\n", gameConf.draw_field_spell); fprintf(fp, "draw_field_spell = %d\n", gameConf.draw_field_spell);
fprintf(fp, "separate_clear_button = %d\n", gameConf.separate_clear_button); fprintf(fp, "separate_clear_button = %d\n", gameConf.separate_clear_button);
fprintf(fp, "#auto_search_limit >= 0: Start search automatically when the user enters N chars\n");
fprintf(fp, "auto_search_limit = %d\n", gameConf.auto_search_limit);
fclose(fp); fclose(fp);
} }
void Game::ShowCardInfo(int code) { void Game::ShowCardInfo(int code) {
......
...@@ -36,6 +36,7 @@ struct Config { ...@@ -36,6 +36,7 @@ struct Config {
int control_mode; int control_mode;
int draw_field_spell; int draw_field_spell;
int separate_clear_button; int separate_clear_button;
int auto_search_limit;
}; };
struct DuelInfo { struct DuelInfo {
...@@ -91,6 +92,7 @@ public: ...@@ -91,6 +92,7 @@ public:
void RefreshSingleplay(); void RefreshSingleplay();
void DrawSelectionLine(irr::video::S3DVertex* vec, bool strip, int width, float* cv); void DrawSelectionLine(irr::video::S3DVertex* vec, bool strip, int width, float* cv);
void DrawBackGround(); void DrawBackGround();
void DrawLinkedZones(ClientCard* pcard);
void DrawCards(); void DrawCards();
void DrawCard(ClientCard* pcard); void DrawCard(ClientCard* pcard);
void DrawMisc(); void DrawMisc();
...@@ -389,6 +391,10 @@ public: ...@@ -389,6 +391,10 @@ public:
irr::gui::IGUIWindow* wCategories; irr::gui::IGUIWindow* wCategories;
irr::gui::IGUICheckBox* chkCategory[32]; irr::gui::IGUICheckBox* chkCategory[32];
irr::gui::IGUIButton* btnCategoryOK; irr::gui::IGUIButton* btnCategoryOK;
irr::gui::IGUIButton* btnMarksFilter;
irr::gui::IGUIWindow* wLinkMarks;
irr::gui::IGUIButton* btnMark[8];
irr::gui::IGUIButton* btnMarksOK;
//sort type //sort type
irr::gui::IGUIStaticText* wSort; irr::gui::IGUIStaticText* wSort;
irr::gui::IGUIComboBox* cbSortType; irr::gui::IGUIComboBox* cbSortType;
...@@ -558,5 +564,8 @@ extern unsigned char draw_count; ...@@ -558,5 +564,8 @@ extern unsigned char draw_count;
#define BUTTON_CANCEL_SINGLEPLAY 352 #define BUTTON_CANCEL_SINGLEPLAY 352
#define COMBOBOX_SORTTYPE 370 #define COMBOBOX_SORTTYPE 370
#define BUTTON_MARKS_FILTER 380
#define BUTTON_MARKERS_OK 381
#define DEFAULT_DUEL_RULE 3 #define DEFAULT_DUEL_RULE 3
#endif // GAME_H #endif // GAME_H
...@@ -131,19 +131,30 @@ int main(int argc, char* argv[]) { ...@@ -131,19 +131,30 @@ int main(int argc, char* argv[]) {
} else if(!strcmp(argv[i], "-k")) { // Keep on return } else if(!strcmp(argv[i], "-k")) { // Keep on return
exit_on_return = false; exit_on_return = false;
keep_on_return = true; keep_on_return = true;
} else if(!strcmp(argv[i], "-d")) { // Deck
if(i + 2 < argc) { // select deck
++i;
GetParameterW(ygo::mainGame->gameConf.lastdeck, &argv[i][0]);
continue;
} else { // open deck
exit_on_return = !keep_on_return;
if(i < argc) {
open_file = true;
GetParameterW(open_file_name, &argv[i + 1][0]);
}
ClickButton(ygo::mainGame->btnDeckEdit);
break;
}
} else if(!strcmp(argv[i], "-c")) { // Create host
exit_on_return = !keep_on_return;
ygo::mainGame->HideElement(ygo::mainGame->wMainMenu);
ClickButton(ygo::mainGame->btnHostConfirm);
break;
} else if(!strcmp(argv[i], "-j")) { // Join host } else if(!strcmp(argv[i], "-j")) { // Join host
exit_on_return = !keep_on_return; exit_on_return = !keep_on_return;
ClickButton(ygo::mainGame->btnLanMode); ClickButton(ygo::mainGame->btnLanMode);
ClickButton(ygo::mainGame->btnJoinHost); ClickButton(ygo::mainGame->btnJoinHost);
break; break;
} else if(!strcmp(argv[i], "-d")) { // Deck
exit_on_return = !keep_on_return;
if(i < argc) {
open_file = true;
GetParameterW(open_file_name, &argv[i + 1][0]);
}
ClickButton(ygo::mainGame->btnDeckEdit);
break;
} else if(!strcmp(argv[i], "-r")) { // Replay } else if(!strcmp(argv[i], "-r")) { // Replay
exit_on_return = !keep_on_return; exit_on_return = !keep_on_return;
if(i < argc) { if(i < argc) {
......
...@@ -271,6 +271,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -271,6 +271,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame->ebStar->setEnabled(false); mainGame->ebStar->setEnabled(false);
mainGame->ebScale->setEnabled(false); mainGame->ebScale->setEnabled(false);
mainGame->deckBuilder.filter_effect = 0; mainGame->deckBuilder.filter_effect = 0;
mainGame->deckBuilder.filter_marks = 0;
mainGame->deckBuilder.result_string[0] = L'0'; mainGame->deckBuilder.result_string[0] = L'0';
mainGame->deckBuilder.result_string[1] = 0; mainGame->deckBuilder.result_string[1] = 0;
mainGame->deckBuilder.results.clear(); mainGame->deckBuilder.results.clear();
...@@ -280,6 +281,8 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -280,6 +281,8 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame->device->setEventReceiver(&mainGame->deckBuilder); mainGame->device->setEventReceiver(&mainGame->deckBuilder);
for(int i = 0; i < 32; ++i) for(int i = 0; i < 32; ++i)
mainGame->chkCategory[i]->setChecked(false); mainGame->chkCategory[i]->setChecked(false);
for(int i = 0; i < 8; i++)
mainGame->btnMark[i]->setPressed(false);
break; break;
} }
} }
......
...@@ -745,6 +745,15 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) { ...@@ -745,6 +745,15 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) {
DuelClient::ClientAnalyze(offset, pbuf - offset); DuelClient::ClientAnalyze(offset, pbuf - offset);
break; break;
} }
case MSG_ROCK_PAPER_SCISSORS: {
player = BufferIO::ReadInt8(pbuf);
return ReadReplayResponse();
}
case MSG_HAND_RES: {
pbuf += 1;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_ANNOUNCE_RACE: { case MSG_ANNOUNCE_RACE: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 5; pbuf += 5;
......
...@@ -1452,6 +1452,20 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1452,6 +1452,20 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
break; break;
} }
case MSG_ROCK_PAPER_SCISSORS: {
player = BufferIO::ReadInt8(pbuf);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_HAND_RES: {
pbuf += 1;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
for (auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_ANNOUNCE_RACE: { case MSG_ANNOUNCE_RACE: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 5; pbuf += 5;
......
...@@ -57,8 +57,13 @@ int SingleMode::SinglePlayThread(void* param) { ...@@ -57,8 +57,13 @@ int SingleMode::SinglePlayThread(void* param) {
mainGame->dInfo.clientname[0] = 0; mainGame->dInfo.clientname[0] = 0;
mainGame->dInfo.turn = 0; mainGame->dInfo.turn = 0;
if(!preload_script(pduel, fname2, slen)) { if(!preload_script(pduel, fname2, slen)) {
end_duel(pduel); wchar_t fname[256];
return 0; myswprintf(fname, L"./single/%ls", open_file_name);
slen = BufferIO::EncodeUTF8(fname, fname2);
if(!preload_script(pduel, fname2, slen)) {
end_duel(pduel);
return 0;
}
} }
mainGame->gMutex.Lock(); mainGame->gMutex.Lock();
mainGame->HideElement(mainGame->wSinglePlay); mainGame->HideElement(mainGame->wSinglePlay);
...@@ -569,6 +574,19 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -569,6 +574,19 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
DuelClient::ClientAnalyze(offset, pbuf - offset); DuelClient::ClientAnalyze(offset, pbuf - offset);
break; break;
} }
case MSG_ROCK_PAPER_SCISSORS: {
player = BufferIO::ReadInt8(pbuf);
if(!DuelClient::ClientAnalyze(offset, pbuf - offset)) {
mainGame->singleSignal.Reset();
mainGame->singleSignal.Wait();
}
break;
}
case MSG_HAND_RES: {
pbuf += 1;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_ANNOUNCE_RACE: { case MSG_ANNOUNCE_RACE: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 5; pbuf += 5;
...@@ -632,6 +650,7 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -632,6 +650,7 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
case MSG_RELOAD_FIELD: { case MSG_RELOAD_FIELD: {
mainGame->gMutex.Lock(); mainGame->gMutex.Lock();
mainGame->dField.Clear(); mainGame->dField.Clear();
mainGame->dInfo.duel_rule = BufferIO::ReadInt8(pbuf);
int val = 0; int val = 0;
for(int p = 0; p < 2; ++p) { for(int p = 0; p < 2; ++p) {
mainGame->dInfo.lp[p] = BufferIO::ReadInt32(pbuf); mainGame->dInfo.lp[p] = BufferIO::ReadInt32(pbuf);
...@@ -694,7 +713,6 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -694,7 +713,6 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
BufferIO::ReadInt8(pbuf); //chain count, always 0 BufferIO::ReadInt8(pbuf); //chain count, always 0
SinglePlayReload(); SinglePlayReload();
mainGame->dField.RefreshAllCards(); mainGame->dField.RefreshAllCards();
mainGame->dInfo.duel_rule = BufferIO::ReadInt8(pbuf);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
break; break;
} }
......
...@@ -1480,6 +1480,22 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1480,6 +1480,22 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
break; break;
} }
case MSG_ROCK_PAPER_SCISSORS: {
player = BufferIO::ReadInt8(pbuf);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_HAND_RES: {
pbuf += 1;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for (auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_ANNOUNCE_RACE: { case MSG_ANNOUNCE_RACE: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 5; pbuf += 5;
......
Subproject commit e5e5b78d9270040e3e377bb54873a0922de7a5ba Subproject commit c3859e4d926aca7c77e19d939c4d588aced52889
Subproject commit 6b2388ce000829dfda768af40db69576e3527f12 Subproject commit e9d8a27ff316dda638bf3cc1a8b71713c234f0f8
...@@ -116,6 +116,7 @@ ...@@ -116,6 +116,7 @@
!system 568 请选择要处理效果的卡 !system 568 请选择要处理效果的卡
!system 569 请选择[%ls]的位置 !system 569 请选择[%ls]的位置
!system 570 请选择要变成不能使用的卡片区域 !system 570 请选择要变成不能使用的卡片区域
!system 571 请选择要移动到的位置
!system 1000 卡组 !system 1000 卡组
!system 1001 手卡 !system 1001 手卡
!system 1002 怪兽区 !system 1002 怪兽区
...@@ -358,6 +359,7 @@ ...@@ -358,6 +359,7 @@
!system 1371 攻击↑ !system 1371 攻击↑
!system 1372 守备↑ !system 1372 守备↑
!system 1373 名称↓ !system 1373 名称↓
!system 1374 连接标记
!system 1390 等待行动中... !system 1390 等待行动中...
!system 1391 等待行动中.... !system 1391 等待行动中....
!system 1392 等待行动中..... !system 1392 等待行动中.....
......
...@@ -23,3 +23,5 @@ hide_hint_button = 1 ...@@ -23,3 +23,5 @@ hide_hint_button = 1
control_mode = 0 control_mode = 0
draw_field_spell = 1 draw_field_spell = 1
separate_clear_button = 1 separate_clear_button = 1
#auto_search_limit >= 0: Start search automatically when the user enters N chars.
auto_search_limit = -1
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