Commit ccdbe19c authored by edo9300's avatar edo9300

Field update, added card type filter

parent 13d45ea3
...@@ -695,8 +695,8 @@ void ClientField::GetChainLocation(int controler, int location, int sequence, ir ...@@ -695,8 +695,8 @@ void ClientField::GetChainLocation(int controler, int location, int sequence, ir
t->X = 0; t->X = 0;
t->Y = 0; t->Y = 0;
t->Z = 0; t->Z = 0;
int rule = (mainGame->dInfo.duel_rule == 3) ? 0 : 1; int field = (mainGame->dInfo.duel_field == 3 || mainGame->dInfo.duel_field == 5) ? 0 : 1;
int speed = (mainGame->dInfo.speed) ? 1 : 0; int speed = (mainGame->dInfo.extraval & 0x1) ? 1 : 0;
switch((location & 0x7f)) { switch((location & 0x7f)) {
case LOCATION_DECK: { case LOCATION_DECK: {
t->X = (matManager.vFieldDeck[controler][speed][0].Pos.X + matManager.vFieldDeck[controler][speed][1].Pos.X) / 2; t->X = (matManager.vFieldDeck[controler][speed][0].Pos.X + matManager.vFieldDeck[controler][speed][1].Pos.X) / 2;
...@@ -723,20 +723,20 @@ void ClientField::GetChainLocation(int controler, int location, int sequence, ir ...@@ -723,20 +723,20 @@ void ClientField::GetChainLocation(int controler, int location, int sequence, ir
break; break;
} }
case LOCATION_SZONE: { case LOCATION_SZONE: {
t->X = (matManager.vFieldSzone[controler][sequence][rule][speed][0].Pos.X + matManager.vFieldSzone[controler][sequence][rule][speed][1].Pos.X) / 2; t->X = (matManager.vFieldSzone[controler][sequence][field][speed][0].Pos.X + matManager.vFieldSzone[controler][sequence][field][speed][1].Pos.X) / 2;
t->Y = (matManager.vFieldSzone[controler][sequence][rule][speed][0].Pos.Y + matManager.vFieldSzone[controler][sequence][rule][speed][2].Pos.Y) / 2; t->Y = (matManager.vFieldSzone[controler][sequence][field][speed][0].Pos.Y + matManager.vFieldSzone[controler][sequence][field][speed][2].Pos.Y) / 2;
t->Z = 0.03f; t->Z = 0.03f;
break; break;
} }
case LOCATION_GRAVE: { case LOCATION_GRAVE: {
t->X = (matManager.vFieldGrave[controler][rule][speed][0].Pos.X + matManager.vFieldGrave[controler][rule][speed][1].Pos.X) / 2; t->X = (matManager.vFieldGrave[controler][field][speed][0].Pos.X + matManager.vFieldGrave[controler][field][speed][1].Pos.X) / 2;
t->Y = (matManager.vFieldGrave[controler][rule][speed][0].Pos.Y + matManager.vFieldGrave[controler][rule][speed][2].Pos.Y) / 2; t->Y = (matManager.vFieldGrave[controler][field][speed][0].Pos.Y + matManager.vFieldGrave[controler][field][speed][2].Pos.Y) / 2;
t->Z = grave[controler].size() * 0.01f + 0.03f; t->Z = grave[controler].size() * 0.01f + 0.03f;
break; break;
} }
case LOCATION_REMOVED: { case LOCATION_REMOVED: {
t->X = (matManager.vFieldRemove[controler][rule][speed][0].Pos.X + matManager.vFieldRemove[controler][rule][speed][1].Pos.X) / 2; t->X = (matManager.vFieldRemove[controler][field][speed][0].Pos.X + matManager.vFieldRemove[controler][field][speed][1].Pos.X) / 2;
t->Y = (matManager.vFieldRemove[controler][rule][speed][0].Pos.Y + matManager.vFieldRemove[controler][rule][speed][2].Pos.Y) / 2; t->Y = (matManager.vFieldRemove[controler][field][speed][0].Pos.Y + matManager.vFieldRemove[controler][field][speed][2].Pos.Y) / 2;
t->Z = remove[controler].size() * 0.01f + 0.03f; t->Z = remove[controler].size() * 0.01f + 0.03f;
break; break;
} }
...@@ -752,8 +752,8 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir ...@@ -752,8 +752,8 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir
int controler = pcard->controler; int controler = pcard->controler;
int sequence = pcard->sequence; int sequence = pcard->sequence;
int location = pcard->location; int location = pcard->location;
int rule = (mainGame->dInfo.duel_rule == 3) ? 0 : 1; int field = (mainGame->dInfo.duel_field == 3 || mainGame->dInfo.duel_field == 5) ? 0 : 1;
int speed = (mainGame->dInfo.speed) ? 1 : 0; int speed = (mainGame->dInfo.extraval & 0x1) ? 1 : 0;
switch (location) { switch (location) {
case LOCATION_DECK: { case LOCATION_DECK: {
t->X = (matManager.vFieldDeck[controler][speed][0].Pos.X + matManager.vFieldDeck[controler][speed][1].Pos.X) / 2; t->X = (matManager.vFieldDeck[controler][speed][0].Pos.X + matManager.vFieldDeck[controler][speed][1].Pos.X) / 2;
...@@ -872,8 +872,8 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir ...@@ -872,8 +872,8 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir
break; break;
} }
case LOCATION_SZONE: { case LOCATION_SZONE: {
t->X = (matManager.vFieldSzone[controler][sequence][rule][speed][0].Pos.X + matManager.vFieldSzone[controler][sequence][rule][speed][1].Pos.X) / 2; t->X = (matManager.vFieldSzone[controler][sequence][field][speed][0].Pos.X + matManager.vFieldSzone[controler][sequence][field][speed][1].Pos.X) / 2;
t->Y = (matManager.vFieldSzone[controler][sequence][rule][speed][0].Pos.Y + matManager.vFieldSzone[controler][sequence][rule][speed][2].Pos.Y) / 2; t->Y = (matManager.vFieldSzone[controler][sequence][field][speed][0].Pos.Y + matManager.vFieldSzone[controler][sequence][field][speed][2].Pos.Y) / 2;
t->Z = 0.01f; t->Z = 0.01f;
if (controler == 0) { if (controler == 0) {
r->X = 0.0f; r->X = 0.0f;
...@@ -891,8 +891,8 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir ...@@ -891,8 +891,8 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir
break; break;
} }
case LOCATION_GRAVE: { case LOCATION_GRAVE: {
t->X = (matManager.vFieldGrave[controler][rule][speed][0].Pos.X + matManager.vFieldGrave[controler][rule][speed][1].Pos.X) / 2; t->X = (matManager.vFieldGrave[controler][field][speed][0].Pos.X + matManager.vFieldGrave[controler][field][speed][1].Pos.X) / 2;
t->Y = (matManager.vFieldGrave[controler][rule][speed][0].Pos.Y + matManager.vFieldGrave[controler][rule][speed][2].Pos.Y) / 2; t->Y = (matManager.vFieldGrave[controler][field][speed][0].Pos.Y + matManager.vFieldGrave[controler][field][speed][2].Pos.Y) / 2;
t->Z = 0.01f + 0.01f * sequence; t->Z = 0.01f + 0.01f * sequence;
if (controler == 0) { if (controler == 0) {
r->X = 0.0f; r->X = 0.0f;
...@@ -906,8 +906,8 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir ...@@ -906,8 +906,8 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir
break; break;
} }
case LOCATION_REMOVED: { case LOCATION_REMOVED: {
t->X = (matManager.vFieldRemove[controler][rule][speed][0].Pos.X + matManager.vFieldRemove[controler][rule][speed][1].Pos.X) / 2; t->X = (matManager.vFieldRemove[controler][field][speed][0].Pos.X + matManager.vFieldRemove[controler][field][speed][1].Pos.X) / 2;
t->Y = (matManager.vFieldRemove[controler][rule][speed][0].Pos.Y + matManager.vFieldRemove[controler][rule][speed][2].Pos.Y) / 2; t->Y = (matManager.vFieldRemove[controler][field][speed][0].Pos.Y + matManager.vFieldRemove[controler][field][speed][2].Pos.Y) / 2;
t->Z = 0.01f + 0.01f * sequence; t->Z = 0.01f + 0.01f * sequence;
if (controler == 0) { if (controler == 0) {
if(pcard->position & POS_FACEUP) { if(pcard->position & POS_FACEUP) {
...@@ -975,16 +975,16 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir ...@@ -975,16 +975,16 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir
} }
} else { } else {
if (pcard->overlayTarget->controler == 0) { if (pcard->overlayTarget->controler == 0) {
t->X = (matManager.vFieldSzone[0][oseq][rule][speed][0].Pos.X + matManager.vFieldSzone[0][oseq][rule][speed][1].Pos.X) / 2 - 0.12f + 0.06f * sequence; t->X = (matManager.vFieldSzone[0][oseq][field][speed][0].Pos.X + matManager.vFieldSzone[0][oseq][field][speed][1].Pos.X) / 2 - 0.12f + 0.06f * sequence;
t->Y = (matManager.vFieldSzone[0][oseq][rule][speed][0].Pos.Y + matManager.vFieldSzone[0][oseq][rule][speed][2].Pos.Y) / 2 + 0.05f; t->Y = (matManager.vFieldSzone[0][oseq][field][speed][0].Pos.Y + matManager.vFieldSzone[0][oseq][field][speed][2].Pos.Y) / 2 + 0.05f;
t->Z = 0.005f + pcard->sequence * 0.0001f; t->Z = 0.005f + pcard->sequence * 0.0001f;
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.vFieldSzone[1][oseq][rule][speed][0].Pos.X + matManager.vFieldSzone[1][oseq][rule][speed][1].Pos.X) / 2 + 0.12f - 0.06f * sequence; t->X = (matManager.vFieldSzone[1][oseq][field][speed][0].Pos.X + matManager.vFieldSzone[1][oseq][field][speed][1].Pos.X) / 2 + 0.12f - 0.06f * sequence;
t->Y = (matManager.vFieldSzone[1][oseq][rule][speed][0].Pos.Y + matManager.vFieldSzone[1][oseq][rule][speed][2].Pos.Y) / 2 - 0.05f; t->Y = (matManager.vFieldSzone[1][oseq][field][speed][0].Pos.Y + matManager.vFieldSzone[1][oseq][field][speed][2].Pos.Y) / 2 - 0.05f;
t->Z = 0.005f + pcard->sequence * 0.0001f; t->Z = 0.005f + pcard->sequence * 0.0001f;
r->X = 0.0f; r->X = 0.0f;
r->Y = 0.0f; r->Y = 0.0f;
......
...@@ -70,7 +70,7 @@ int DeckManager::TypeCount(std::vector<code_pointer> cards, int type) { ...@@ -70,7 +70,7 @@ int DeckManager::TypeCount(std::vector<code_pointer> cards, int type) {
} }
return count; return count;
} }
int DeckManager::CheckLFList(Deck& deck, int lfhash, bool allow_ocg, bool allow_tcg, bool doubled) { int DeckManager::CheckLFList(Deck& deck, int lfhash, bool allow_ocg, bool allow_tcg, bool doubled, int forbiddentypes) {
std::unordered_map<int, int> ccount; std::unordered_map<int, int> ccount;
std::unordered_map<int, int>* list = 0; std::unordered_map<int, int>* list = 0;
for(size_t i = 0; i < _lfList.size(); ++i) { for(size_t i = 0; i < _lfList.size(); ++i) {
...@@ -82,9 +82,11 @@ int DeckManager::CheckLFList(Deck& deck, int lfhash, bool allow_ocg, bool allow_ ...@@ -82,9 +82,11 @@ int DeckManager::CheckLFList(Deck& deck, int lfhash, bool allow_ocg, bool allow_
if(!list) if(!list)
return 0; return 0;
int dc = 0; int dc = 0;
if(mainGame->dInfo.speed && (deck.main.size() != 20 || deck.extra.size() > 5)) if ((mainGame->dInfo.extraval & 0x1) && (deck.main.size() != 20 || deck.extra.size() > 5))
return 1; return 1;
else if(!mainGame->dInfo.speed && deck.main.size() < 40 || (!doubled && (deck.main.size() > 60 || deck.extra.size() > 15 || deck.side.size() > 15)) if (TypeCount(deck.main, forbiddentypes) > 0 || TypeCount(deck.extra, forbiddentypes) > 0 || TypeCount(deck.side, forbiddentypes) > 0)
return 1;
if (!(mainGame->dInfo.extraval & 0x1) && deck.main.size() < 40 || (!doubled && (deck.main.size() > 60 || deck.extra.size() > 15 || deck.side.size() > 15))
|| (doubled && (deck.main.size() != 100 || deck.extra.size() > 30 || deck.side.size() > 30))) || (doubled && (deck.main.size() != 100 || deck.extra.size() > 30 || deck.side.size() > 30)))
return 1; return 1;
for(size_t i = 0; i < deck.main.size(); ++i) { for(size_t i = 0; i < deck.main.size(); ++i) {
......
This diff is collapsed.
...@@ -127,11 +127,12 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) { ...@@ -127,11 +127,12 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
cscg.info.draw_count = _wtoi(mainGame->ebDrawCount->getText()); cscg.info.draw_count = _wtoi(mainGame->ebDrawCount->getText());
cscg.info.time_limit = _wtoi(mainGame->ebTimeLimit->getText()); cscg.info.time_limit = _wtoi(mainGame->ebTimeLimit->getText());
cscg.info.lflist = mainGame->cbLFlist->getItemData(mainGame->cbLFlist->getSelected()); cscg.info.lflist = mainGame->cbLFlist->getItemData(mainGame->cbLFlist->getSelected());
cscg.info.duel_rule = mainGame->GetMasterRule(mainGame->duel_param); cscg.info.duel_rule = mainGame->GetMasterRule(mainGame->duel_param, mainGame->forbiddentypes);
cscg.info.duel_flag = mainGame->duel_param; cscg.info.duel_flag = mainGame->duel_param;
cscg.info.no_check_deck = mainGame->chkNoCheckDeck->isChecked(); cscg.info.no_check_deck = mainGame->chkNoCheckDeck->isChecked();
cscg.info.no_shuffle_deck = mainGame->chkNoShuffleDeck->isChecked(); cscg.info.no_shuffle_deck = mainGame->chkNoShuffleDeck->isChecked();
cscg.info.check = 2; cscg.info.check = 2;
cscg.info.forbiddentypes = mainGame->forbiddentypes;
cscg.info.sealed = mainGame->chkRules[0]->isChecked(); cscg.info.sealed = mainGame->chkRules[0]->isChecked();
cscg.info.booster = mainGame->chkRules[1]->isChecked(); cscg.info.booster = mainGame->chkRules[1]->isChecked();
cscg.info.destiny_draw = mainGame->chkRules[2]->isChecked(); cscg.info.destiny_draw = mainGame->chkRules[2]->isChecked();
...@@ -381,20 +382,20 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -381,20 +382,20 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
str.append(msgbuf); str.append(msgbuf);
int rule; int rule;
if (pkt->info.check == 2) { if (pkt->info.check == 2) {
mainGame->dInfo.duel_rule = mainGame->GetMasterRule(pkt->info.duel_flag, &rule); mainGame->dInfo.duel_field = mainGame->GetMasterRule(pkt->info.duel_flag, pkt->info.forbiddentypes, &rule);
} else { } else {
rule = pkt->info.duel_rule; rule = pkt->info.duel_rule;
if (rule == 0) { if (rule == 0) {
mainGame->dInfo.duel_rule = 3; mainGame->dInfo.duel_field = 3;
rule = 3; rule = 3;
} else } else
mainGame->dInfo.duel_rule = rule; mainGame->dInfo.duel_field = rule;
} }
if (rule == 5) { if (rule == 5) {
uint32 filter = 0x100; uint32 filter = 0x100;
for (int i = 0; i < 5; ++i, filter <<= 1) for (int i = 0; i < 6; ++i, filter <<= 1)
if (pkt->info.duel_flag & filter) { if (pkt->info.duel_flag & filter) {
myswprintf(msgbuf, L"*%ls\n", dataManager.GetSysString(1265 + i)); myswprintf(msgbuf, L"*%ls\n", dataManager.GetSysString(1631 + i));
str2.append(msgbuf); str2.append(msgbuf);
host2 = true; host2 = true;
} }
...@@ -536,7 +537,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -536,7 +537,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->ShowElement(mainGame->wHostPrepare2); mainGame->ShowElement(mainGame->wHostPrepare2);
mainGame->wChat->setVisible(true); mainGame->wChat->setVisible(true);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
mainGame->dInfo.speed = (pkt->info.check == 2 && pkt->info.speed) ? 1 : 0; mainGame->dInfo.extraval = (pkt->info.check == 2 && pkt->info.speed) ? 1 : 0;
watching = 0; watching = 0;
connect_state |= 0x4; connect_state |= 0x4;
break; break;
...@@ -645,8 +646,8 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -645,8 +646,8 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->device->setEventReceiver(&mainGame->dField); mainGame->device->setEventReceiver(&mainGame->dField);
// reset master rule 4 phase button position // reset master rule 4 phase button position
mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 310, 855, 330)); mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 310, 855, 330));
if(mainGame->dInfo.speed) { if(mainGame->dInfo.extraval & 0x1) {
if(mainGame->dInfo.duel_rule >= 4) { if(mainGame->dInfo.duel_field >= 4) {
mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 290, 855, 350)); mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 290, 855, 350));
mainGame->btnShuffle->setRelativePosition(mainGame->Resize(0, 40, 50, 60)); mainGame->btnShuffle->setRelativePosition(mainGame->Resize(0, 40, 50, 60));
mainGame->btnDP->setRelativePosition(mainGame->Resize(0, 40, 50, 60)); mainGame->btnDP->setRelativePosition(mainGame->Resize(0, 40, 50, 60));
...@@ -666,7 +667,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -666,7 +667,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
} }
} else { } else {
mainGame->btnDP->setRelativePosition(mainGame->Resize(0, 0, 50, 20)); mainGame->btnDP->setRelativePosition(mainGame->Resize(0, 0, 50, 20));
if(mainGame->dInfo.duel_rule >= 4) { if(mainGame->dInfo.duel_field >= 4) {
mainGame->btnSP->setRelativePosition(mainGame->Resize(0, 0, 50, 20)); mainGame->btnSP->setRelativePosition(mainGame->Resize(0, 0, 50, 20));
mainGame->btnM1->setRelativePosition(mainGame->Resize(160, 0, 210, 20)); mainGame->btnM1->setRelativePosition(mainGame->Resize(160, 0, 210, 20));
mainGame->btnBP->setRelativePosition(mainGame->Resize(160, 0, 210, 20)); mainGame->btnBP->setRelativePosition(mainGame->Resize(160, 0, 210, 20));
...@@ -3586,9 +3587,9 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -3586,9 +3587,9 @@ 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();
int rule = BufferIO::ReadInt8(pbuf); int field = BufferIO::ReadInt8(pbuf);
mainGame->dInfo.duel_rule = rule & 0xf; mainGame->dInfo.duel_field = field & 0xf;
mainGame->dInfo.speed = (rule >> 4) ? 1 : 0; mainGame->dInfo.extraval = field >> 4;
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);
...@@ -3877,7 +3878,7 @@ void DuelClient::BroadcastReply(evutil_socket_t fd, short events, void * arg) { ...@@ -3877,7 +3878,7 @@ void DuelClient::BroadcastReply(evutil_socket_t fd, short events, void * arg) {
hoststr.append(L"]["); hoststr.append(L"][");
int rule; int rule;
if(pHP->host.check == 2) { if(pHP->host.check == 2) {
mainGame->GetMasterRule(pHP->host.duel_flag, &rule); mainGame->GetMasterRule(pHP->host.duel_flag, pHP->host.forbiddentypes, &rule);
} else } else
rule = pHP->host.duel_rule; rule = pHP->host.duel_rule;
if(rule == 5) if(rule == 5)
......
...@@ -2134,13 +2134,13 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) { ...@@ -2134,13 +2134,13 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) {
void ClientField::GetHoverField(int x, int y) { void ClientField::GetHoverField(int x, int y) {
irr::core::recti sfRect(430, 504, 875, 600); irr::core::recti sfRect(430, 504, 875, 600);
irr::core::recti ofRect(531, 135, 800, 191); irr::core::recti ofRect(531, 135, 800, 191);
if(mainGame->dInfo.speed) { if(mainGame->dInfo.extraval & 0x1) {
sfRect = recti(509, 504, 796, 600); sfRect = recti(509, 504, 796, 600);
ofRect = recti(531+ 46, 135, 800- 46, 191); ofRect = recti(531+ 46, 135, 800- 46, 191);
} }
irr::core::position2di pos(x, y); irr::core::position2di pos(x, y);
int rule = (mainGame->dInfo.duel_rule == 3) ? 0 : 1; int field = (mainGame->dInfo.duel_field == 3 || mainGame->dInfo.duel_field == 5) ? 0 : 1;
int speed = (mainGame->dInfo.speed) ? 1 : 0; int speed = (mainGame->dInfo.extraval & 0x1) ? 1 : 0;
if(sfRect.isPointInside(pos)) { if(sfRect.isPointInside(pos)) {
int hc = hand[0].size(); int hc = hand[0].size();
int cardSize = 66; int cardSize = 66;
...@@ -2207,38 +2207,38 @@ void ClientField::GetHoverField(int x, int y) { ...@@ -2207,38 +2207,38 @@ void ClientField::GetHoverField(int x, int y) {
if(boardy >= matManager.vFieldExtra[0][speed][0].Pos.Y && boardy <= matManager.vFieldExtra[0][speed][2].Pos.Y) { if(boardy >= matManager.vFieldExtra[0][speed][0].Pos.Y && boardy <= matManager.vFieldExtra[0][speed][2].Pos.Y) {
hovered_controler = 0; hovered_controler = 0;
hovered_location = LOCATION_EXTRA; hovered_location = LOCATION_EXTRA;
} else if(boardy >= matManager.vFieldSzone[0][5][rule][speed][0].Pos.Y && boardy <= matManager.vFieldSzone[0][5][rule][speed][2].Pos.Y) {//field } else if(boardy >= matManager.vFieldSzone[0][5][field][speed][0].Pos.Y && boardy <= matManager.vFieldSzone[0][5][field][speed][2].Pos.Y) {//field
hovered_controler = 0; hovered_controler = 0;
hovered_location = LOCATION_SZONE; hovered_location = LOCATION_SZONE;
hovered_sequence = 5; hovered_sequence = 5;
} else if(boardy >= matManager.vFieldSzone[0][6][rule][speed][0].Pos.Y && boardy <= matManager.vFieldSzone[0][6][rule][speed][2].Pos.Y) { } else if(boardy >= matManager.vFieldSzone[0][6][field][speed][0].Pos.Y && boardy <= matManager.vFieldSzone[0][6][field][speed][2].Pos.Y) {
hovered_controler = 0; hovered_controler = 0;
hovered_location = LOCATION_SZONE; hovered_location = LOCATION_SZONE;
hovered_sequence = 6; hovered_sequence = 6;
} else if(rule == 1 && boardy >= matManager.vFieldRemove[1][rule][speed][2].Pos.Y && boardy <= matManager.vFieldRemove[1][rule][speed][0].Pos.Y) { } else if(field == 1 && boardy >= matManager.vFieldRemove[1][field][speed][2].Pos.Y && boardy <= matManager.vFieldRemove[1][field][speed][0].Pos.Y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_REMOVED; hovered_location = LOCATION_REMOVED;
} else if(rule == 0 && boardy >= matManager.vFieldSzone[1][7][rule][speed][2].Pos.Y && boardy <= matManager.vFieldSzone[1][7][rule][speed][0].Pos.Y) { } else if(field == 0 && boardy >= matManager.vFieldSzone[1][7][field][speed][2].Pos.Y && boardy <= matManager.vFieldSzone[1][7][field][speed][0].Pos.Y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_SZONE; hovered_location = LOCATION_SZONE;
hovered_sequence = 7; hovered_sequence = 7;
} else if(boardy >= matManager.vFieldGrave[1][rule][speed][2].Pos.Y && boardy <= matManager.vFieldGrave[1][rule][speed][0].Pos.Y) { } else if(boardy >= matManager.vFieldGrave[1][field][speed][2].Pos.Y && boardy <= matManager.vFieldGrave[1][field][speed][0].Pos.Y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_GRAVE; hovered_location = LOCATION_GRAVE;
} else if(boardy >= matManager.vFieldDeck[1][speed][2].Pos.Y && boardy <= matManager.vFieldDeck[1][speed][0].Pos.Y) { } else if(boardy >= matManager.vFieldDeck[1][speed][2].Pos.Y && boardy <= matManager.vFieldDeck[1][speed][0].Pos.Y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_DECK; hovered_location = LOCATION_DECK;
} }
} else if(rule == 0 && boardx >= matManager.vFieldRemove[1][rule][speed][1].Pos.X && boardx <= matManager.vFieldRemove[1][rule][speed][0].Pos.X) { } else if(field == 0 && boardx >= matManager.vFieldRemove[1][field][speed][1].Pos.X && boardx <= matManager.vFieldRemove[1][field][speed][0].Pos.X) {
if(boardy >= matManager.vFieldRemove[1][rule][speed][2].Pos.Y && boardy <= matManager.vFieldRemove[1][rule][speed][0].Pos.Y) { if(boardy >= matManager.vFieldRemove[1][field][speed][2].Pos.Y && boardy <= matManager.vFieldRemove[1][field][speed][0].Pos.Y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_REMOVED; hovered_location = LOCATION_REMOVED;
} else if(boardy >= matManager.vFieldContiAct[speed][0].Y && boardy <= matManager.vFieldContiAct[speed][2].Y) { } else if(boardy >= matManager.vFieldContiAct[speed][0].Y && boardy <= matManager.vFieldContiAct[speed][2].Y) {
hovered_controler = 0; hovered_controler = 0;
hovered_location = POSITION_HINT; hovered_location = POSITION_HINT;
} }
} else if(rule == 1 && boardx >= matManager.vFieldSzone[1][7][rule][speed][1].Pos.X && boardx <= matManager.vFieldSzone[1][7][rule][speed][2].Pos.X) { } else if(field == 1 && boardx >= matManager.vFieldSzone[1][7][field][speed][1].Pos.X && boardx <= matManager.vFieldSzone[1][7][field][speed][2].Pos.X) {
if(boardy >= matManager.vFieldSzone[1][7][rule][speed][2].Pos.Y && boardy <= matManager.vFieldSzone[1][7][rule][speed][0].Pos.Y) { if(boardy >= matManager.vFieldSzone[1][7][field][speed][2].Pos.Y && boardy <= matManager.vFieldSzone[1][7][field][speed][0].Pos.Y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_SZONE; hovered_location = LOCATION_SZONE;
hovered_sequence = 7; hovered_sequence = 7;
...@@ -2250,21 +2250,21 @@ void ClientField::GetHoverField(int x, int y) { ...@@ -2250,21 +2250,21 @@ void ClientField::GetHoverField(int x, int y) {
if(boardy >= matManager.vFieldDeck[0][speed][0].Pos.Y && boardy <= matManager.vFieldDeck[0][speed][2].Pos.Y) { if(boardy >= matManager.vFieldDeck[0][speed][0].Pos.Y && boardy <= matManager.vFieldDeck[0][speed][2].Pos.Y) {
hovered_controler = 0; hovered_controler = 0;
hovered_location = LOCATION_DECK; hovered_location = LOCATION_DECK;
} else if(boardy >= matManager.vFieldGrave[0][rule][speed][0].Pos.Y && boardy <= matManager.vFieldGrave[0][rule][speed][2].Pos.Y) { } else if(boardy >= matManager.vFieldGrave[0][field][speed][0].Pos.Y && boardy <= matManager.vFieldGrave[0][field][speed][2].Pos.Y) {
hovered_controler = 0; hovered_controler = 0;
hovered_location = LOCATION_GRAVE; hovered_location = LOCATION_GRAVE;
} else if(boardy >= matManager.vFieldSzone[1][6][rule][speed][2].Pos.Y && boardy <= matManager.vFieldSzone[1][6][rule][speed][0].Pos.Y) { } else if(boardy >= matManager.vFieldSzone[1][6][field][speed][2].Pos.Y && boardy <= matManager.vFieldSzone[1][6][field][speed][0].Pos.Y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_SZONE; hovered_location = LOCATION_SZONE;
hovered_sequence = 6; hovered_sequence = 6;
} else if(rule == 0 && boardy >= matManager.vFieldSzone[0][7][rule][speed][0].Pos.Y && boardy <= matManager.vFieldSzone[0][7][rule][speed][2].Pos.Y) { } else if(field == 0 && boardy >= matManager.vFieldSzone[0][7][field][speed][0].Pos.Y && boardy <= matManager.vFieldSzone[0][7][field][speed][2].Pos.Y) {
hovered_controler = 0; hovered_controler = 0;
hovered_location = LOCATION_SZONE; hovered_location = LOCATION_SZONE;
hovered_sequence = 7; hovered_sequence = 7;
} else if(rule == 1 && boardy >= matManager.vFieldRemove[0][rule][speed][0].Pos.Y && boardy <= matManager.vFieldRemove[0][rule][speed][2].Pos.Y) { } else if(field == 1 && boardy >= matManager.vFieldRemove[0][field][speed][0].Pos.Y && boardy <= matManager.vFieldRemove[0][field][speed][2].Pos.Y) {
hovered_controler = 0; hovered_controler = 0;
hovered_location = LOCATION_REMOVED; hovered_location = LOCATION_REMOVED;
} else if(boardy >= matManager.vFieldSzone[1][5][rule][speed][2].Pos.Y && boardy <= matManager.vFieldSzone[1][5][rule][speed][0].Pos.Y) { } else if(boardy >= matManager.vFieldSzone[1][5][field][speed][2].Pos.Y && boardy <= matManager.vFieldSzone[1][5][field][speed][0].Pos.Y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_SZONE; hovered_location = LOCATION_SZONE;
hovered_sequence = 5; hovered_sequence = 5;
...@@ -2272,14 +2272,14 @@ void ClientField::GetHoverField(int x, int y) { ...@@ -2272,14 +2272,14 @@ void ClientField::GetHoverField(int x, int y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_EXTRA; hovered_location = LOCATION_EXTRA;
} }
} else if(rule == 1 && boardx >= matManager.vFieldSzone[0][7][rule][speed][0].Pos.X && boardx <= matManager.vFieldSzone[0][7][rule][speed][1].Pos.X) { } else if(field == 1 && boardx >= matManager.vFieldSzone[0][7][field][speed][0].Pos.X && boardx <= matManager.vFieldSzone[0][7][field][speed][1].Pos.X) {
if(boardy >= matManager.vFieldSzone[0][7][rule][speed][0].Pos.Y && boardy <= matManager.vFieldSzone[0][7][rule][speed][2].Pos.Y) { if(boardy >= matManager.vFieldSzone[0][7][field][speed][0].Pos.Y && boardy <= matManager.vFieldSzone[0][7][field][speed][2].Pos.Y) {
hovered_controler = 0; hovered_controler = 0;
hovered_location = LOCATION_SZONE; hovered_location = LOCATION_SZONE;
hovered_sequence = 7; hovered_sequence = 7;
} }
} else if(rule == 0 && boardx >= matManager.vFieldRemove[0][rule][speed][0].Pos.X && boardx <= matManager.vFieldRemove[0][rule][speed][1].Pos.X) { } else if(field == 0 && boardx >= matManager.vFieldRemove[0][field][speed][0].Pos.X && boardx <= matManager.vFieldRemove[0][field][speed][1].Pos.X) {
if(boardy >= matManager.vFieldRemove[0][rule][speed][0].Pos.Y && boardy <= matManager.vFieldRemove[0][rule][speed][2].Pos.Y) { if(boardy >= matManager.vFieldRemove[0][field][speed][0].Pos.Y && boardy <= matManager.vFieldRemove[0][field][speed][2].Pos.Y) {
hovered_controler = 0; hovered_controler = 0;
hovered_location = LOCATION_REMOVED; hovered_location = LOCATION_REMOVED;
} }
...@@ -2287,9 +2287,9 @@ void ClientField::GetHoverField(int x, int y) { ...@@ -2287,9 +2287,9 @@ void ClientField::GetHoverField(int x, int y) {
int sequence = (boardx - matManager.vFieldMzone[0][0][0].Pos.X) / (matManager.vFieldMzone[0][0][1].Pos.X - matManager.vFieldMzone[0][0][0].Pos.X); int sequence = (boardx - matManager.vFieldMzone[0][0][0].Pos.X) / (matManager.vFieldMzone[0][0][1].Pos.X - matManager.vFieldMzone[0][0][0].Pos.X);
if(sequence > 4) if(sequence > 4)
sequence = 4; sequence = 4;
if(mainGame->dInfo.speed && (sequence == 0 || sequence== 4)) if((mainGame->dInfo.extraval & 0x1) && (sequence == 0 || sequence== 4))
hovered_location = 0; hovered_location = 0;
else if(boardy > matManager.vFieldSzone[0][0][rule][speed][0].Pos.Y && boardy <= matManager.vFieldSzone[0][0][rule][speed][2].Pos.Y) { else if(boardy > matManager.vFieldSzone[0][0][field][speed][0].Pos.Y && boardy <= matManager.vFieldSzone[0][0][field][speed][2].Pos.Y) {
hovered_controler = 0; hovered_controler = 0;
hovered_location = LOCATION_SZONE; hovered_location = LOCATION_SZONE;
hovered_sequence = sequence; hovered_sequence = sequence;
...@@ -2323,7 +2323,7 @@ void ClientField::GetHoverField(int x, int y) { ...@@ -2323,7 +2323,7 @@ void ClientField::GetHoverField(int x, int y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_MZONE; hovered_location = LOCATION_MZONE;
hovered_sequence = 4 - sequence; hovered_sequence = 4 - sequence;
} else if(boardy >= matManager.vFieldSzone[1][0][rule][speed][2].Pos.Y && boardy < matManager.vFieldSzone[1][0][rule][speed][0].Pos.Y) { } else if(boardy >= matManager.vFieldSzone[1][0][field][speed][2].Pos.Y && boardy < matManager.vFieldSzone[1][0][field][speed][0].Pos.Y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_SZONE; hovered_location = LOCATION_SZONE;
hovered_sequence = 4 - sequence; hovered_sequence = 4 - sequence;
......
...@@ -177,14 +177,34 @@ bool Game::Initialize() { ...@@ -177,14 +177,34 @@ bool Game::Initialize() {
cbDuelRule->addItem(dataManager.GetSysString(1263)); cbDuelRule->addItem(dataManager.GetSysString(1263));
cbDuelRule->setSelected(DEFAULT_DUEL_RULE - 1); cbDuelRule->setSelected(DEFAULT_DUEL_RULE - 1);
btnCustomRule = env->addButton(rect<s32>(305, 175, 370, 200), wCreateHost, BUTTON_CUSTOM_RULE, dataManager.GetSysString(1626)); btnCustomRule = env->addButton(rect<s32>(305, 175, 370, 200), wCreateHost, BUTTON_CUSTOM_RULE, dataManager.GetSysString(1626));
wCustomRules = env->addWindow(rect<s32>(700, 100, 910, 280), false, dataManager.strBuffer); wCustomRules = env->addWindow(rect<s32>(700, 100, 910, 410), false, dataManager.strBuffer);
wCustomRules->getCloseButton()->setVisible(false); wCustomRules->getCloseButton()->setVisible(false);
wCustomRules->setDrawTitlebar(false); wCustomRules->setDrawTitlebar(false);
wCustomRules->setDraggable(true); wCustomRules->setDraggable(true);
wCustomRules->setVisible(false); wCustomRules->setVisible(false);
for(int i = 0; i < 5; ++i) int spacing = 0;
chkCustomRules[i] = env->addCheckBox(false, recti(10, 10 + i * 20, 200, 30 + i * 20), wCustomRules, 353 + i, dataManager.GetSysString(1265 + i)); env->addStaticText(dataManager.GetSysString(1629), rect<s32>(10, 10 + spacing * 20, 200, 30 + spacing * 20), false, false, wCustomRules);
btnCustomRulesOK = env->addButton(rect<s32>(55, 130, 155, 155), wCustomRules, BUTTON_CUSTOM_RULE_OK, dataManager.GetSysString(1211)); spacing++;
for(int i = 0; i < 6; ++i, ++spacing)
chkCustomRules[i] = env->addCheckBox(false, recti(10, 10 + spacing * 20, 200, 30 + spacing * 20), wCustomRules, -1, dataManager.GetSysString(1631 + i));
env->addStaticText(dataManager.GetSysString(1628), rect<s32>(10, 10 + spacing * 20, 200, 30 + spacing * 20), false, false, wCustomRules);
myswprintf(strbuf, dataManager.GetSysString(1627), dataManager.GetSysString(1056));
spacing++;
chkTypeLimit[0] = env->addCheckBox(false, recti(10, 10 + spacing * 20, 200, 30 + spacing * 20), wCustomRules, -1, strbuf);
myswprintf(strbuf, dataManager.GetSysString(1627), dataManager.GetSysString(1063));
spacing++;
chkTypeLimit[1] = env->addCheckBox(false, recti(10, 10 + spacing * 20, 200, 30 + spacing * 20), wCustomRules, -1, strbuf);
myswprintf(strbuf, dataManager.GetSysString(1627), dataManager.GetSysString(1073));
spacing++;
chkTypeLimit[2] = env->addCheckBox(false, recti(10, 10 + spacing * 20, 200, 30 + spacing * 20), wCustomRules, -1, strbuf);
myswprintf(strbuf, dataManager.GetSysString(1627), dataManager.GetSysString(1074));
spacing++;
chkTypeLimit[3] = env->addCheckBox(false, recti(10, 10 + spacing * 20, 200, 30 + spacing * 20), wCustomRules, -1, strbuf);
myswprintf(strbuf, dataManager.GetSysString(1627), dataManager.GetSysString(1076));
spacing++;
chkTypeLimit[4] = env->addCheckBox(false, recti(10, 10 + spacing * 20, 200, 30 + spacing * 20), wCustomRules, 353 + spacing, strbuf);
btnCustomRulesOK = env->addButton(rect<s32>(55, 270, 155, 295), wCustomRules, BUTTON_CUSTOM_RULE_OK, dataManager.GetSysString(1211));
forbiddentypes = MASTER_RULE_4_FORB;
duel_param = MASTER_RULE_4; duel_param = MASTER_RULE_4;
chkNoCheckDeck = env->addCheckBox(false, rect<s32>(20, 210, 170, 230), wCreateHost, -1, dataManager.GetSysString(1229)); chkNoCheckDeck = env->addCheckBox(false, rect<s32>(20, 210, 170, 230), wCreateHost, -1, dataManager.GetSysString(1229));
chkNoShuffleDeck = env->addCheckBox(false, rect<s32>(180, 210, 360, 230), wCreateHost, -1, dataManager.GetSysString(1230)); chkNoShuffleDeck = env->addCheckBox(false, rect<s32>(180, 210, 360, 230), wCreateHost, -1, dataManager.GetSysString(1230));
...@@ -1429,10 +1449,16 @@ const wchar_t* Game::LocalName(int local_player) { ...@@ -1429,10 +1449,16 @@ const wchar_t* Game::LocalName(int local_player) {
} }
void Game::UpdateDuelParam() { void Game::UpdateDuelParam() {
uint32 flag = 0, filter = 0x100; uint32 flag = 0, filter = 0x100;
for (int i = 0; i < 5; ++i, filter <<= 1) for (int i = 0; i < 6; ++i, filter <<= 1)
if (chkCustomRules[i]->isChecked()) { if (chkCustomRules[i]->isChecked()) {
flag |= filter; flag |= filter;
} }
uint32 limits[] = { TYPE_FUSION, TYPE_SYNCHRO, TYPE_XYZ, TYPE_PENDULUM, TYPE_LINK };
uint32 flag2 = 0;
for (int i = 0; i < 5; ++i)
if (chkTypeLimit[i]->isChecked()) {
flag2 |= limits[i];
}
cbDuelRule->clear(); cbDuelRule->clear();
cbDuelRule->addItem(dataManager.GetSysString(1260)); cbDuelRule->addItem(dataManager.GetSysString(1260));
cbDuelRule->addItem(dataManager.GetSysString(1261)); cbDuelRule->addItem(dataManager.GetSysString(1261));
...@@ -1441,58 +1467,65 @@ void Game::UpdateDuelParam() { ...@@ -1441,58 +1467,65 @@ void Game::UpdateDuelParam() {
switch (flag) { switch (flag) {
case MASTER_RULE_1: { case MASTER_RULE_1: {
cbDuelRule->setSelected(0); cbDuelRule->setSelected(0);
break; if (flag2 == MASTER_RULE_1_FORB)
break;
} }
case MASTER_RULE_2: { case MASTER_RULE_2: {
cbDuelRule->setSelected(1); cbDuelRule->setSelected(1);
break; if (flag2 == MASTER_RULE_2_FORB)
break;
} }
case MASTER_RULE_3: { case MASTER_RULE_3: {
cbDuelRule->setSelected(2); cbDuelRule->setSelected(2);
break; if (flag2 == MASTER_RULE_3_FORB)
break;
} }
case MASTER_RULE_4: { case MASTER_RULE_4: {
cbDuelRule->setSelected(3); cbDuelRule->setSelected(3);
break; if (flag2 == MASTER_RULE_4_FORB)
break;
} }
default: { default: {
cbDuelRule->addItem(dataManager.GetSysString(1264)); cbDuelRule->addItem(dataManager.GetSysString(1630));
cbDuelRule->setSelected(4); cbDuelRule->setSelected(4);
break; break;
} }
} }
duel_param = flag; duel_param = flag;
forbiddentypes = flag2;
} }
int Game::GetMasterRule(uint32 param, int* truerule) { int Game::GetMasterRule(uint32 param, uint32 forbiddentypes, int* truerule) {
switch(param) { switch(param) {
case MASTER_RULE_1: { case MASTER_RULE_1: {
if (truerule) if (truerule)
*truerule = 1; *truerule = 1;
return 1; if (forbiddentypes == MASTER_RULE_1_FORB)
break; return 1;
} }
case MASTER_RULE_2: { case MASTER_RULE_2: {
if (truerule) if (truerule)
*truerule = 2; *truerule = 2;
return 2; if (forbiddentypes == MASTER_RULE_2_FORB)
break; return 1;
} }
case MASTER_RULE_3: { case MASTER_RULE_3: {
if (truerule) if (truerule)
*truerule = 3; *truerule = 3;
return 3; if (forbiddentypes == MASTER_RULE_3_FORB)
break; return 1;
} }
case MASTER_RULE_4: { case MASTER_RULE_4: {
if (truerule) if (truerule)
*truerule = 4; *truerule = 4;
return 4; if (forbiddentypes == MASTER_RULE_4_FORB)
break; return 1;
} }
default: { default: {
if (truerule) if (truerule)
*truerule = 5; *truerule = 5;
if(param & DUEL_EMZONE) if ((param & DUEL_PZONE) && (param & DUEL_SEPARATE_PZONE) && (param & DUEL_EMZONE))
return 5;
else if(param & DUEL_EMZONE)
return 4; return 4;
else if (param & DUEL_PZONE) else if (param & DUEL_PZONE)
return 3; return 3;
...@@ -1555,7 +1588,7 @@ void Game::OnResize() ...@@ -1555,7 +1588,7 @@ void Game::OnResize()
wHostPrepare->setRelativePosition(ResizeWin(270, 120, 750, 440)); wHostPrepare->setRelativePosition(ResizeWin(270, 120, 750, 440));
wHostPrepare2->setRelativePosition(ResizeWin(750, 120, 950, 440)); wHostPrepare2->setRelativePosition(ResizeWin(750, 120, 950, 440));
wRules->setRelativePosition(ResizeWin(630, 100, 1000, 310)); wRules->setRelativePosition(ResizeWin(630, 100, 1000, 310));
wCustomRules->setRelativePosition(ResizeWin(700, 100, 910, 280)); wCustomRules->setRelativePosition(ResizeWin(700, 100, 910, 410));
wReplay->setRelativePosition(ResizeWin(220, 100, 800, 520)); wReplay->setRelativePosition(ResizeWin(220, 100, 800, 520));
wSinglePlay->setRelativePosition(ResizeWin(220, 100, 800, 520)); wSinglePlay->setRelativePosition(ResizeWin(220, 100, 800, 520));
...@@ -1602,8 +1635,8 @@ void Game::OnResize() ...@@ -1602,8 +1635,8 @@ void Game::OnResize()
btnReplayExit->setRelativePosition(Resize(5, 105, 85, 125)); btnReplayExit->setRelativePosition(Resize(5, 105, 85, 125));
wPhase->setRelativePosition(Resize(480, 310, 855, 330)); wPhase->setRelativePosition(Resize(480, 310, 855, 330));
if(dInfo.speed) { if(dInfo.extraval & 0x1) {
if(dInfo.duel_rule >= 4) { if(dInfo.duel_field >= 4) {
wPhase->setRelativePosition(Resize(480, 290, 855, 350)); wPhase->setRelativePosition(Resize(480, 290, 855, 350));
btnShuffle->setRelativePosition(Resize(0, 40, 50, 60)); btnShuffle->setRelativePosition(Resize(0, 40, 50, 60));
btnDP->setRelativePosition(Resize(0, 40, 50, 60)); btnDP->setRelativePosition(Resize(0, 40, 50, 60));
...@@ -1623,7 +1656,7 @@ void Game::OnResize() ...@@ -1623,7 +1656,7 @@ void Game::OnResize()
} }
} else { } else {
btnDP->setRelativePosition(Resize(0, 0, 50, 20)); btnDP->setRelativePosition(Resize(0, 0, 50, 20));
if(dInfo.duel_rule >= 4) { if(dInfo.duel_field >= 4) {
btnSP->setRelativePosition(Resize(0, 0, 50, 20)); btnSP->setRelativePosition(Resize(0, 0, 50, 20));
btnM1->setRelativePosition(Resize(160, 0, 210, 20)); btnM1->setRelativePosition(Resize(160, 0, 210, 20));
btnBP->setRelativePosition(Resize(160, 0, 210, 20)); btnBP->setRelativePosition(Resize(160, 0, 210, 20));
......
...@@ -56,9 +56,9 @@ struct DuelInfo { ...@@ -56,9 +56,9 @@ struct DuelInfo {
bool tag_player[2]; bool tag_player[2];
int lp[2]; int lp[2];
int startlp; int startlp;
int duel_rule; int duel_field;
int speed = false;
int lua64; int lua64;
int extraval;
int turn; int turn;
short curMsg; short curMsg;
wchar_t hostname[20]; wchar_t hostname[20];
...@@ -130,7 +130,7 @@ public: ...@@ -130,7 +130,7 @@ public:
int LocalPlayer(int player); int LocalPlayer(int player);
const wchar_t* LocalName(int local_player); const wchar_t* LocalName(int local_player);
void UpdateDuelParam(); void UpdateDuelParam();
int GetMasterRule(uint32 param, int* truerule = 0); int GetMasterRule(uint32 param, uint32 forbidden, int* truerule = 0);
bool HasFocus(EGUI_ELEMENT_TYPE type) const { bool HasFocus(EGUI_ELEMENT_TYPE type) const {
irr::gui::IGUIElement* focus = env->getFocus(); irr::gui::IGUIElement* focus = env->getFocus();
...@@ -189,6 +189,7 @@ public: ...@@ -189,6 +189,7 @@ public:
bool is_building; bool is_building;
bool is_siding; bool is_siding;
int forbiddentypes;
uint32 duel_param; uint32 duel_param;
int texty; int texty;
...@@ -275,7 +276,8 @@ public: ...@@ -275,7 +276,8 @@ public:
irr::gui::IGUIButton* btnRulesOK; irr::gui::IGUIButton* btnRulesOK;
irr::gui::IGUIComboBox* cbDuelRule; irr::gui::IGUIComboBox* cbDuelRule;
irr::gui::IGUIButton* btnCustomRule; irr::gui::IGUIButton* btnCustomRule;
irr::gui::IGUICheckBox* chkCustomRules[5]; irr::gui::IGUICheckBox* chkCustomRules[6];
irr::gui::IGUICheckBox* chkTypeLimit[5];
irr::gui::IGUIWindow* wCustomRules; irr::gui::IGUIWindow* wCustomRules;
irr::gui::IGUIButton* btnCustomRulesOK; irr::gui::IGUIButton* btnCustomRulesOK;
irr::gui::IGUICheckBox* chkNoCheckDeck; irr::gui::IGUICheckBox* chkNoCheckDeck;
......
...@@ -39,12 +39,16 @@ bool ImageManager::Initial() { ...@@ -39,12 +39,16 @@ bool ImageManager::Initial() {
tFieldTransparent[0][1] = driver->getTexture("textures/field-transparent3.png"); tFieldTransparent[0][1] = driver->getTexture("textures/field-transparent3.png");
tField[0][2] = driver->getTexture("textures/field.png"); tField[0][2] = driver->getTexture("textures/field.png");
tFieldTransparent[0][2] = driver->getTexture("textures/field-transparent.png"); tFieldTransparent[0][2] = driver->getTexture("textures/field-transparent.png");
tField[0][3] = driver->getTexture("textures/field4.png");
tFieldTransparent[0][3] = driver->getTexture("textures/field-transparent4.png");
tField[1][0] = driver->getTexture("textures/fieldSP2.png"); tField[1][0] = driver->getTexture("textures/fieldSP2.png");
tFieldTransparent[1][0] = driver->getTexture("textures/field-transparentSP2.png"); tFieldTransparent[1][0] = driver->getTexture("textures/field-transparentSP2.png");
tField[1][1] = driver->getTexture("textures/fieldSP3.png"); tField[1][1] = driver->getTexture("textures/fieldSP3.png");
tFieldTransparent[1][1] = driver->getTexture("textures/field-transparentSP3.png"); tFieldTransparent[1][1] = driver->getTexture("textures/field-transparentSP3.png");
tField[1][2] = driver->getTexture("textures/fieldSP.png"); tField[1][2] = driver->getTexture("textures/fieldSP.png");
tFieldTransparent[1][2] = driver->getTexture("textures/field-transparentSP.png"); tFieldTransparent[1][2] = driver->getTexture("textures/field-transparentSP.png");
tField[1][3] = driver->getTexture("textures/fieldSP4.png");
tFieldTransparent[1][3] = driver->getTexture("textures/field-transparentSP4.png");
return true; return true;
} }
void ImageManager::SetDevice(irr::IrrlichtDevice* dev) { void ImageManager::SetDevice(irr::IrrlichtDevice* dev) {
......
...@@ -41,8 +41,8 @@ public: ...@@ -41,8 +41,8 @@ public:
irr::video::ITexture* tBackGround; irr::video::ITexture* tBackGround;
irr::video::ITexture* tBackGround_menu; irr::video::ITexture* tBackGround_menu;
irr::video::ITexture* tBackGround_deck; irr::video::ITexture* tBackGround_deck;
irr::video::ITexture* tField[3][3]; irr::video::ITexture* tField[2][4];
irr::video::ITexture* tFieldTransparent[3][3]; irr::video::ITexture* tFieldTransparent[2][4];
}; };
extern ImageManager imageManager; extern ImageManager imageManager;
......
...@@ -136,27 +136,37 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -136,27 +136,37 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
switch (mainGame->cbDuelRule->getSelected()) { switch (mainGame->cbDuelRule->getSelected()) {
case 0: { case 0: {
mainGame->duel_param = MASTER_RULE_1; mainGame->duel_param = MASTER_RULE_1;
mainGame->forbiddentypes = MASTER_RULE_1_FORB;
break; break;
} }
case 1: { case 1: {
mainGame->duel_param = MASTER_RULE_2; mainGame->duel_param = MASTER_RULE_2;
mainGame->forbiddentypes = MASTER_RULE_2_FORB;
break; break;
} }
case 2: { case 2: {
mainGame->duel_param = MASTER_RULE_3; mainGame->duel_param = MASTER_RULE_3;
mainGame->forbiddentypes = MASTER_RULE_3_FORB;
break; break;
} }
case 3: { case 3: {
mainGame->duel_param = MASTER_RULE_4; mainGame->duel_param = MASTER_RULE_4;
mainGame->forbiddentypes = MASTER_RULE_4_FORB;
break; break;
} }
} }
uint32 filter = 0x100; uint32 filter = 0x100;
for (int i = 0; i < 5; ++i, filter <<= 1) for (int i = 0; i < 6; ++i, filter <<= 1)
if (mainGame->duel_param & filter) if (mainGame->duel_param & filter)
mainGame->chkCustomRules[i]->setChecked(true); mainGame->chkCustomRules[i]->setChecked(true);
else else
mainGame->chkCustomRules[i]->setChecked(false); mainGame->chkCustomRules[i]->setChecked(false);
uint32 limits[] = { TYPE_FUSION, TYPE_SYNCHRO, TYPE_XYZ, TYPE_PENDULUM, TYPE_LINK };
for (int i = 0; i < 5; ++i, filter <<= 1)
if (mainGame->forbiddentypes & limits[i])
mainGame->chkTypeLimit[i]->setChecked(true);
else
mainGame->chkTypeLimit[i]->setChecked(false);
mainGame->PopupElement(mainGame->wCustomRules); mainGame->PopupElement(mainGame->wCustomRules);
break; break;
} }
...@@ -557,7 +567,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -557,7 +567,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
} }
} }
uint32 filter = 0x100; uint32 filter = 0x100;
for (int i = 0; i < 5; ++i, filter <<= 1) for (int i = 0; i < 6; ++i, filter <<= 1)
if (mainGame->duel_param & filter) if (mainGame->duel_param & filter)
mainGame->chkCustomRules[i]->setChecked(true); mainGame->chkCustomRules[i]->setChecked(true);
else else
......
...@@ -106,12 +106,14 @@ int ReplayMode::ReplayThread(void* param) { ...@@ -106,12 +106,14 @@ int ReplayMode::ReplayThread(void* param) {
opt |= MASTER_RULE_1; opt |= MASTER_RULE_1;
} else if (!(opt & 0xff80)) } else if (!(opt & 0xff80))
opt |= MASTER_RULE_3; opt |= MASTER_RULE_3;
mainGame->dInfo.duel_rule = 2; mainGame->dInfo.duel_field = 2;
if(opt & DUEL_EMZONE) if ((opt & DUEL_PZONE) && (opt & DUEL_SEPARATE_PZONE) && (opt & DUEL_EMZONE))
mainGame->dInfo.duel_rule = 4; mainGame->dInfo.duel_field = 5;
else if (opt & DUEL_EMZONE)
mainGame->dInfo.duel_field = 4;
else if(opt & DUEL_PZONE) else if(opt & DUEL_PZONE)
mainGame->dInfo.duel_rule = 3; mainGame->dInfo.duel_field = 3;
mainGame->dInfo.speed = (opt & SPEED_DUEL) ? 1 : 0; mainGame->dInfo.extraval = (opt & SPEED_DUEL) ? 1 : 0;
set_player_info(pduel, 0, start_lp, start_hand, draw_count); set_player_info(pduel, 0, start_lp, start_hand, draw_count);
set_player_info(pduel, 1, start_lp, start_hand, draw_count); set_player_info(pduel, 1, start_lp, start_hand, draw_count);
mainGame->dInfo.lp[0] = start_lp; mainGame->dInfo.lp[0] = start_lp;
...@@ -122,8 +124,8 @@ int ReplayMode::ReplayThread(void* param) { ...@@ -122,8 +124,8 @@ int ReplayMode::ReplayThread(void* param) {
mainGame->dInfo.turn = 0; mainGame->dInfo.turn = 0;
// reset master rule 4 phase button position // reset master rule 4 phase button position
mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 310, 855, 330)); mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 310, 855, 330));
if(mainGame->dInfo.speed) { if(mainGame->dInfo.extraval) {
if(mainGame->dInfo.duel_rule >= 4) { if(mainGame->dInfo.duel_field >= 4) {
mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 290, 855, 350)); mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 290, 855, 350));
mainGame->btnShuffle->setRelativePosition(mainGame->Resize(0, 40, 50, 60)); mainGame->btnShuffle->setRelativePosition(mainGame->Resize(0, 40, 50, 60));
mainGame->btnDP->setRelativePosition(mainGame->Resize(0, 40, 50, 60)); mainGame->btnDP->setRelativePosition(mainGame->Resize(0, 40, 50, 60));
...@@ -143,7 +145,7 @@ int ReplayMode::ReplayThread(void* param) { ...@@ -143,7 +145,7 @@ int ReplayMode::ReplayThread(void* param) {
} }
} else { } else {
mainGame->btnDP->setRelativePosition(mainGame->Resize(0, 0, 50, 20)); mainGame->btnDP->setRelativePosition(mainGame->Resize(0, 0, 50, 20));
if(mainGame->dInfo.duel_rule >= 4) { if(mainGame->dInfo.duel_field >= 4) {
mainGame->btnSP->setRelativePosition(mainGame->Resize(0, 0, 50, 20)); mainGame->btnSP->setRelativePosition(mainGame->Resize(0, 0, 50, 20));
mainGame->btnM1->setRelativePosition(mainGame->Resize(160, 0, 210, 20)); mainGame->btnM1->setRelativePosition(mainGame->Resize(160, 0, 210, 20));
mainGame->btnBP->setRelativePosition(mainGame->Resize(160, 0, 210, 20)); mainGame->btnBP->setRelativePosition(mainGame->Resize(160, 0, 210, 20));
......
...@@ -254,7 +254,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) { ...@@ -254,7 +254,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
if(is_ready) { if(is_ready) {
bool allow_ocg = host_info.rule == 0 || host_info.rule == 2; bool allow_ocg = host_info.rule == 0 || host_info.rule == 2;
bool allow_tcg = host_info.rule == 1 || host_info.rule == 2; bool allow_tcg = host_info.rule == 1 || host_info.rule == 2;
int res = host_info.no_check_deck ? false : deckManager.CheckLFList(pdeck[dp->type], host_info.lflist, allow_ocg, allow_tcg, host_info.doubled); int res = host_info.no_check_deck ? false : deckManager.CheckLFList(pdeck[dp->type], host_info.lflist, allow_ocg, allow_tcg, host_info.doubled, host_info.forbiddentypes);
if(res) { if(res) {
STOC_HS_PlayerChange scpc; STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | PLAYERCHANGE_NOTREADY; scpc.status = (dp->type << 4) | PLAYERCHANGE_NOTREADY;
......
...@@ -665,12 +665,12 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -665,12 +665,12 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
mainGame->gMutex.Lock(); mainGame->gMutex.Lock();
mainGame->dField.Clear(); mainGame->dField.Clear();
int rule = BufferIO::ReadInt8(pbuf); int rule = BufferIO::ReadInt8(pbuf);
mainGame->dInfo.duel_rule = rule & 0xf; mainGame->dInfo.duel_field = rule & 0xf;
mainGame->dInfo.speed = (rule >> 4) ? 1 : 0; mainGame->dInfo.extraval = rule >> 4;
// reset master rule 4 phase button position // reset master rule 4 phase button position
mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 310, 855, 330)); mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 310, 855, 330));
if(mainGame->dInfo.speed) { if(mainGame->dInfo.extraval) {
if(mainGame->dInfo.duel_rule >= 4) { if(mainGame->dInfo.duel_field >= 4) {
mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 290, 855, 350)); mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 290, 855, 350));
mainGame->btnShuffle->setRelativePosition(mainGame->Resize(0, 40, 50, 60)); mainGame->btnShuffle->setRelativePosition(mainGame->Resize(0, 40, 50, 60));
mainGame->btnDP->setRelativePosition(mainGame->Resize(0, 40, 50, 60)); mainGame->btnDP->setRelativePosition(mainGame->Resize(0, 40, 50, 60));
...@@ -690,7 +690,7 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -690,7 +690,7 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
} }
} else { } else {
mainGame->btnDP->setRelativePosition(mainGame->Resize(0, 0, 50, 20)); mainGame->btnDP->setRelativePosition(mainGame->Resize(0, 0, 50, 20));
if(mainGame->dInfo.duel_rule >= 4) { if(mainGame->dInfo.duel_field >= 4) {
mainGame->btnSP->setRelativePosition(mainGame->Resize(0, 0, 50, 20)); mainGame->btnSP->setRelativePosition(mainGame->Resize(0, 0, 50, 20));
mainGame->btnM1->setRelativePosition(mainGame->Resize(160, 0, 210, 20)); mainGame->btnM1->setRelativePosition(mainGame->Resize(160, 0, 210, 20));
mainGame->btnBP->setRelativePosition(mainGame->Resize(160, 0, 210, 20)); mainGame->btnBP->setRelativePosition(mainGame->Resize(160, 0, 210, 20));
......
...@@ -224,7 +224,7 @@ void TagDuel::PlayerReady(DuelPlayer* dp, bool is_ready) { ...@@ -224,7 +224,7 @@ void TagDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
if(is_ready) { if(is_ready) {
bool allow_ocg = host_info.rule == 0 || host_info.rule == 2; bool allow_ocg = host_info.rule == 0 || host_info.rule == 2;
bool allow_tcg = host_info.rule == 1 || host_info.rule == 2; bool allow_tcg = host_info.rule == 1 || host_info.rule == 2;
int res = host_info.no_check_deck ? false : deckManager.CheckLFList(pdeck[dp->type], host_info.lflist, allow_ocg, allow_tcg, host_info.doubled); int res = host_info.no_check_deck ? false : deckManager.CheckLFList(pdeck[dp->type], host_info.lflist, allow_ocg, allow_tcg, host_info.doubled, host_info.forbiddentypes);
if(res) { if(res) {
STOC_HS_PlayerChange scpc; STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | PLAYERCHANGE_NOTREADY; scpc.status = (dp->type << 4) | PLAYERCHANGE_NOTREADY;
......
...@@ -302,12 +302,6 @@ ...@@ -302,12 +302,6 @@
!system 1261 Master Rule 2 !system 1261 Master Rule 2
!system 1262 Master Rule 3 !system 1262 Master Rule 3
!system 1263 Master Rule 4 !system 1263 Master Rule 4
!system 1264 Custom Rule
!system 1265 Obsolete Ignition
!system 1266 1st Turn Draw
!system 1267 1 Field
!system 1268 Pendulum Zones
!system 1269 Extra Monster Zones
!system 1270 Card info !system 1270 Card info
!system 1271 Log !system 1271 Log
!system 1272 Clear Log !system 1272 Clear Log
...@@ -433,6 +427,16 @@ ...@@ -433,6 +427,16 @@
!system 1624 Die landed on: !system 1624 Die landed on:
!system 1625 Extra Rules !system 1625 Extra Rules
!system 1626 Custom !system 1626 Custom
!system 1627 No %s
!system 1628 ==Card Type filter==
!system 1629 ==Game rules==
!system 1630 Custom Rule
!system 1631 Obsolete Ignition
!system 1632 1st Turn Draw
!system 1633 1 Field
!system 1634 Pendulum Zones
!system 1635 Separate Pendulum Zones
!system 1636 Extra Monster Zones
!system 1999 Show anime cards !system 1999 Show anime cards
!system 2046 Enable sound effects !system 2046 Enable sound effects
!system 2047 Enable music !system 2047 Enable music
......
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