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
t->X = 0;
t->Y = 0;
t->Z = 0;
int rule = (mainGame->dInfo.duel_rule == 3) ? 0 : 1;
int speed = (mainGame->dInfo.speed) ? 1 : 0;
int field = (mainGame->dInfo.duel_field == 3 || mainGame->dInfo.duel_field == 5) ? 0 : 1;
int speed = (mainGame->dInfo.extraval & 0x1) ? 1 : 0;
switch((location & 0x7f)) {
case LOCATION_DECK: {
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
break;
}
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->Y = (matManager.vFieldSzone[controler][sequence][rule][speed][0].Pos.Y + matManager.vFieldSzone[controler][sequence][rule][speed][2].Pos.Y) / 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][field][speed][0].Pos.Y + matManager.vFieldSzone[controler][sequence][field][speed][2].Pos.Y) / 2;
t->Z = 0.03f;
break;
}
case LOCATION_GRAVE: {
t->X = (matManager.vFieldGrave[controler][rule][speed][0].Pos.X + matManager.vFieldGrave[controler][rule][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->X = (matManager.vFieldGrave[controler][field][speed][0].Pos.X + matManager.vFieldGrave[controler][field][speed][1].Pos.X) / 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;
break;
}
case LOCATION_REMOVED: {
t->X = (matManager.vFieldRemove[controler][rule][speed][0].Pos.X + matManager.vFieldRemove[controler][rule][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->X = (matManager.vFieldRemove[controler][field][speed][0].Pos.X + matManager.vFieldRemove[controler][field][speed][1].Pos.X) / 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;
break;
}
......@@ -752,8 +752,8 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir
int controler = pcard->controler;
int sequence = pcard->sequence;
int location = pcard->location;
int rule = (mainGame->dInfo.duel_rule == 3) ? 0 : 1;
int speed = (mainGame->dInfo.speed) ? 1 : 0;
int field = (mainGame->dInfo.duel_field == 3 || mainGame->dInfo.duel_field == 5) ? 0 : 1;
int speed = (mainGame->dInfo.extraval & 0x1) ? 1 : 0;
switch (location) {
case LOCATION_DECK: {
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
break;
}
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->Y = (matManager.vFieldSzone[controler][sequence][rule][speed][0].Pos.Y + matManager.vFieldSzone[controler][sequence][rule][speed][2].Pos.Y) / 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][field][speed][0].Pos.Y + matManager.vFieldSzone[controler][sequence][field][speed][2].Pos.Y) / 2;
t->Z = 0.01f;
if (controler == 0) {
r->X = 0.0f;
......@@ -891,8 +891,8 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir
break;
}
case LOCATION_GRAVE: {
t->X = (matManager.vFieldGrave[controler][rule][speed][0].Pos.X + matManager.vFieldGrave[controler][rule][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->X = (matManager.vFieldGrave[controler][field][speed][0].Pos.X + matManager.vFieldGrave[controler][field][speed][1].Pos.X) / 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;
if (controler == 0) {
r->X = 0.0f;
......@@ -906,8 +906,8 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir
break;
}
case LOCATION_REMOVED: {
t->X = (matManager.vFieldRemove[controler][rule][speed][0].Pos.X + matManager.vFieldRemove[controler][rule][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->X = (matManager.vFieldRemove[controler][field][speed][0].Pos.X + matManager.vFieldRemove[controler][field][speed][1].Pos.X) / 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;
if (controler == 0) {
if(pcard->position & POS_FACEUP) {
......@@ -975,16 +975,16 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir
}
} else {
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->Y = (matManager.vFieldSzone[0][oseq][rule][speed][0].Pos.Y + matManager.vFieldSzone[0][oseq][rule][speed][2].Pos.Y) / 2 + 0.05f;
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][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;
r->X = 0.0f;
r->Y = 0.0f;
r->Z = 0.0f;
}
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->Y = (matManager.vFieldSzone[1][oseq][rule][speed][0].Pos.Y + matManager.vFieldSzone[1][oseq][rule][speed][2].Pos.Y) / 2 - 0.05f;
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][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;
r->X = 0.0f;
r->Y = 0.0f;
......
......@@ -70,7 +70,7 @@ int DeckManager::TypeCount(std::vector<code_pointer> cards, int type) {
}
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>* list = 0;
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_
if(!list)
return 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;
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)))
return 1;
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) {
cscg.info.draw_count = _wtoi(mainGame->ebDrawCount->getText());
cscg.info.time_limit = _wtoi(mainGame->ebTimeLimit->getText());
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.no_check_deck = mainGame->chkNoCheckDeck->isChecked();
cscg.info.no_shuffle_deck = mainGame->chkNoShuffleDeck->isChecked();
cscg.info.check = 2;
cscg.info.forbiddentypes = mainGame->forbiddentypes;
cscg.info.sealed = mainGame->chkRules[0]->isChecked();
cscg.info.booster = mainGame->chkRules[1]->isChecked();
cscg.info.destiny_draw = mainGame->chkRules[2]->isChecked();
......@@ -381,20 +382,20 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
str.append(msgbuf);
int rule;
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 {
rule = pkt->info.duel_rule;
if (rule == 0) {
mainGame->dInfo.duel_rule = 3;
mainGame->dInfo.duel_field = 3;
rule = 3;
} else
mainGame->dInfo.duel_rule = rule;
mainGame->dInfo.duel_field = rule;
}
if (rule == 5) {
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) {
myswprintf(msgbuf, L"*%ls\n", dataManager.GetSysString(1265 + i));
myswprintf(msgbuf, L"*%ls\n", dataManager.GetSysString(1631 + i));
str2.append(msgbuf);
host2 = true;
}
......@@ -536,7 +537,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->ShowElement(mainGame->wHostPrepare2);
mainGame->wChat->setVisible(true);
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;
connect_state |= 0x4;
break;
......@@ -645,8 +646,8 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->device->setEventReceiver(&mainGame->dField);
// reset master rule 4 phase button position
mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 310, 855, 330));
if(mainGame->dInfo.speed) {
if(mainGame->dInfo.duel_rule >= 4) {
if(mainGame->dInfo.extraval & 0x1) {
if(mainGame->dInfo.duel_field >= 4) {
mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 290, 855, 350));
mainGame->btnShuffle->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) {
}
} else {
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->btnM1->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) {
case MSG_RELOAD_FIELD: {
mainGame->gMutex.Lock();
mainGame->dField.Clear();
int rule = BufferIO::ReadInt8(pbuf);
mainGame->dInfo.duel_rule = rule & 0xf;
mainGame->dInfo.speed = (rule >> 4) ? 1 : 0;
int field = BufferIO::ReadInt8(pbuf);
mainGame->dInfo.duel_field = field & 0xf;
mainGame->dInfo.extraval = field >> 4;
int val = 0;
for(int i = 0; i < 2; ++i) {
int p = mainGame->LocalPlayer(i);
......@@ -3877,7 +3878,7 @@ void DuelClient::BroadcastReply(evutil_socket_t fd, short events, void * arg) {
hoststr.append(L"][");
int rule;
if(pHP->host.check == 2) {
mainGame->GetMasterRule(pHP->host.duel_flag, &rule);
mainGame->GetMasterRule(pHP->host.duel_flag, pHP->host.forbiddentypes, &rule);
} else
rule = pHP->host.duel_rule;
if(rule == 5)
......
......@@ -2134,13 +2134,13 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) {
void ClientField::GetHoverField(int x, int y) {
irr::core::recti sfRect(430, 504, 875, 600);
irr::core::recti ofRect(531, 135, 800, 191);
if(mainGame->dInfo.speed) {
if(mainGame->dInfo.extraval & 0x1) {
sfRect = recti(509, 504, 796, 600);
ofRect = recti(531+ 46, 135, 800- 46, 191);
}
irr::core::position2di pos(x, y);
int rule = (mainGame->dInfo.duel_rule == 3) ? 0 : 1;
int speed = (mainGame->dInfo.speed) ? 1 : 0;
int field = (mainGame->dInfo.duel_field == 3 || mainGame->dInfo.duel_field == 5) ? 0 : 1;
int speed = (mainGame->dInfo.extraval & 0x1) ? 1 : 0;
if(sfRect.isPointInside(pos)) {
int hc = hand[0].size();
int cardSize = 66;
......@@ -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) {
hovered_controler = 0;
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_location = LOCATION_SZONE;
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_location = LOCATION_SZONE;
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_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_location = LOCATION_SZONE;
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_location = LOCATION_GRAVE;
} else if(boardy >= matManager.vFieldDeck[1][speed][2].Pos.Y && boardy <= matManager.vFieldDeck[1][speed][0].Pos.Y) {
hovered_controler = 1;
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) {
if(boardy >= matManager.vFieldRemove[1][rule][speed][2].Pos.Y && boardy <= matManager.vFieldRemove[1][rule][speed][0].Pos.Y) {
} 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][field][speed][2].Pos.Y && boardy <= matManager.vFieldRemove[1][field][speed][0].Pos.Y) {
hovered_controler = 1;
hovered_location = LOCATION_REMOVED;
} else if(boardy >= matManager.vFieldContiAct[speed][0].Y && boardy <= matManager.vFieldContiAct[speed][2].Y) {
hovered_controler = 0;
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) {
if(boardy >= matManager.vFieldSzone[1][7][rule][speed][2].Pos.Y && boardy <= matManager.vFieldSzone[1][7][rule][speed][0].Pos.Y) {
} 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][field][speed][2].Pos.Y && boardy <= matManager.vFieldSzone[1][7][field][speed][0].Pos.Y) {
hovered_controler = 1;
hovered_location = LOCATION_SZONE;
hovered_sequence = 7;
......@@ -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) {
hovered_controler = 0;
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_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_location = LOCATION_SZONE;
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_location = LOCATION_SZONE;
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_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_location = LOCATION_SZONE;
hovered_sequence = 5;
......@@ -2272,14 +2272,14 @@ void ClientField::GetHoverField(int x, int y) {
hovered_controler = 1;
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) {
if(boardy >= matManager.vFieldSzone[0][7][rule][speed][0].Pos.Y && boardy <= matManager.vFieldSzone[0][7][rule][speed][2].Pos.Y) {
} 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][field][speed][0].Pos.Y && boardy <= matManager.vFieldSzone[0][7][field][speed][2].Pos.Y) {
hovered_controler = 0;
hovered_location = LOCATION_SZONE;
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) {
if(boardy >= matManager.vFieldRemove[0][rule][speed][0].Pos.Y && boardy <= matManager.vFieldRemove[0][rule][speed][2].Pos.Y) {
} 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][field][speed][0].Pos.Y && boardy <= matManager.vFieldRemove[0][field][speed][2].Pos.Y) {
hovered_controler = 0;
hovered_location = LOCATION_REMOVED;
}
......@@ -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);
if(sequence > 4)
sequence = 4;
if(mainGame->dInfo.speed && (sequence == 0 || sequence== 4))
if((mainGame->dInfo.extraval & 0x1) && (sequence == 0 || sequence== 4))
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_location = LOCATION_SZONE;
hovered_sequence = sequence;
......@@ -2323,7 +2323,7 @@ void ClientField::GetHoverField(int x, int y) {
hovered_controler = 1;
hovered_location = LOCATION_MZONE;
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_location = LOCATION_SZONE;
hovered_sequence = 4 - sequence;
......
......@@ -177,14 +177,34 @@ bool Game::Initialize() {
cbDuelRule->addItem(dataManager.GetSysString(1263));
cbDuelRule->setSelected(DEFAULT_DUEL_RULE - 1);
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->setDrawTitlebar(false);
wCustomRules->setDraggable(true);
wCustomRules->setVisible(false);
for(int i = 0; i < 5; ++i)
chkCustomRules[i] = env->addCheckBox(false, recti(10, 10 + i * 20, 200, 30 + i * 20), wCustomRules, 353 + i, dataManager.GetSysString(1265 + i));
btnCustomRulesOK = env->addButton(rect<s32>(55, 130, 155, 155), wCustomRules, BUTTON_CUSTOM_RULE_OK, dataManager.GetSysString(1211));
int spacing = 0;
env->addStaticText(dataManager.GetSysString(1629), rect<s32>(10, 10 + spacing * 20, 200, 30 + spacing * 20), false, false, wCustomRules);
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;
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));
......@@ -1429,10 +1449,16 @@ const wchar_t* Game::LocalName(int local_player) {
}
void Game::UpdateDuelParam() {
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()) {
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->addItem(dataManager.GetSysString(1260));
cbDuelRule->addItem(dataManager.GetSysString(1261));
......@@ -1441,58 +1467,65 @@ void Game::UpdateDuelParam() {
switch (flag) {
case MASTER_RULE_1: {
cbDuelRule->setSelected(0);
break;
if (flag2 == MASTER_RULE_1_FORB)
break;
}
case MASTER_RULE_2: {
cbDuelRule->setSelected(1);
break;
if (flag2 == MASTER_RULE_2_FORB)
break;
}
case MASTER_RULE_3: {
cbDuelRule->setSelected(2);
break;
if (flag2 == MASTER_RULE_3_FORB)
break;
}
case MASTER_RULE_4: {
cbDuelRule->setSelected(3);
break;
if (flag2 == MASTER_RULE_4_FORB)
break;
}
default: {
cbDuelRule->addItem(dataManager.GetSysString(1264));
cbDuelRule->addItem(dataManager.GetSysString(1630));
cbDuelRule->setSelected(4);
break;
}
}
duel_param = flag;
forbiddentypes = flag2;
}
int Game::GetMasterRule(uint32 param, int* truerule) {
int Game::GetMasterRule(uint32 param, uint32 forbiddentypes, int* truerule) {
switch(param) {
case MASTER_RULE_1: {
if (truerule)
*truerule = 1;
return 1;
break;
if (forbiddentypes == MASTER_RULE_1_FORB)
return 1;
}
case MASTER_RULE_2: {
if (truerule)
*truerule = 2;
return 2;
break;
if (forbiddentypes == MASTER_RULE_2_FORB)
return 1;
}
case MASTER_RULE_3: {
if (truerule)
*truerule = 3;
return 3;
break;
if (forbiddentypes == MASTER_RULE_3_FORB)
return 1;
}
case MASTER_RULE_4: {
if (truerule)
*truerule = 4;
return 4;
break;
if (forbiddentypes == MASTER_RULE_4_FORB)
return 1;
}
default: {
if (truerule)
*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;
else if (param & DUEL_PZONE)
return 3;
......@@ -1555,7 +1588,7 @@ void Game::OnResize()
wHostPrepare->setRelativePosition(ResizeWin(270, 120, 750, 440));
wHostPrepare2->setRelativePosition(ResizeWin(750, 120, 950, 440));
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));
wSinglePlay->setRelativePosition(ResizeWin(220, 100, 800, 520));
......@@ -1602,8 +1635,8 @@ void Game::OnResize()
btnReplayExit->setRelativePosition(Resize(5, 105, 85, 125));
wPhase->setRelativePosition(Resize(480, 310, 855, 330));
if(dInfo.speed) {
if(dInfo.duel_rule >= 4) {
if(dInfo.extraval & 0x1) {
if(dInfo.duel_field >= 4) {
wPhase->setRelativePosition(Resize(480, 290, 855, 350));
btnShuffle->setRelativePosition(Resize(0, 40, 50, 60));
btnDP->setRelativePosition(Resize(0, 40, 50, 60));
......@@ -1623,7 +1656,7 @@ void Game::OnResize()
}
} else {
btnDP->setRelativePosition(Resize(0, 0, 50, 20));
if(dInfo.duel_rule >= 4) {
if(dInfo.duel_field >= 4) {
btnSP->setRelativePosition(Resize(0, 0, 50, 20));
btnM1->setRelativePosition(Resize(160, 0, 210, 20));
btnBP->setRelativePosition(Resize(160, 0, 210, 20));
......
......@@ -56,9 +56,9 @@ struct DuelInfo {
bool tag_player[2];
int lp[2];
int startlp;
int duel_rule;
int speed = false;
int duel_field;
int lua64;
int extraval;
int turn;
short curMsg;
wchar_t hostname[20];
......@@ -130,7 +130,7 @@ public:
int LocalPlayer(int player);
const wchar_t* LocalName(int local_player);
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 {
irr::gui::IGUIElement* focus = env->getFocus();
......@@ -189,6 +189,7 @@ public:
bool is_building;
bool is_siding;
int forbiddentypes;
uint32 duel_param;
int texty;
......@@ -275,7 +276,8 @@ public:
irr::gui::IGUIButton* btnRulesOK;
irr::gui::IGUIComboBox* cbDuelRule;
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::IGUIButton* btnCustomRulesOK;
irr::gui::IGUICheckBox* chkNoCheckDeck;
......
......@@ -39,12 +39,16 @@ bool ImageManager::Initial() {
tFieldTransparent[0][1] = driver->getTexture("textures/field-transparent3.png");
tField[0][2] = driver->getTexture("textures/field.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");
tFieldTransparent[1][0] = driver->getTexture("textures/field-transparentSP2.png");
tField[1][1] = driver->getTexture("textures/fieldSP3.png");
tFieldTransparent[1][1] = driver->getTexture("textures/field-transparentSP3.png");
tField[1][2] = driver->getTexture("textures/fieldSP.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;
}
void ImageManager::SetDevice(irr::IrrlichtDevice* dev) {
......
......@@ -41,8 +41,8 @@ public:
irr::video::ITexture* tBackGround;
irr::video::ITexture* tBackGround_menu;
irr::video::ITexture* tBackGround_deck;
irr::video::ITexture* tField[3][3];
irr::video::ITexture* tFieldTransparent[3][3];
irr::video::ITexture* tField[2][4];
irr::video::ITexture* tFieldTransparent[2][4];
};
extern ImageManager imageManager;
......
......@@ -136,27 +136,37 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
switch (mainGame->cbDuelRule->getSelected()) {
case 0: {
mainGame->duel_param = MASTER_RULE_1;
mainGame->forbiddentypes = MASTER_RULE_1_FORB;
break;
}
case 1: {
mainGame->duel_param = MASTER_RULE_2;
mainGame->forbiddentypes = MASTER_RULE_2_FORB;
break;
}
case 2: {
mainGame->duel_param = MASTER_RULE_3;
mainGame->forbiddentypes = MASTER_RULE_3_FORB;
break;
}
case 3: {
mainGame->duel_param = MASTER_RULE_4;
mainGame->forbiddentypes = MASTER_RULE_4_FORB;
break;
}
}
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)
mainGame->chkCustomRules[i]->setChecked(true);
else
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);
break;
}
......@@ -557,7 +567,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
}
}
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)
mainGame->chkCustomRules[i]->setChecked(true);
else
......
......@@ -106,12 +106,14 @@ int ReplayMode::ReplayThread(void* param) {
opt |= MASTER_RULE_1;
} else if (!(opt & 0xff80))
opt |= MASTER_RULE_3;
mainGame->dInfo.duel_rule = 2;
if(opt & DUEL_EMZONE)
mainGame->dInfo.duel_rule = 4;
mainGame->dInfo.duel_field = 2;
if ((opt & DUEL_PZONE) && (opt & DUEL_SEPARATE_PZONE) && (opt & DUEL_EMZONE))
mainGame->dInfo.duel_field = 5;
else if (opt & DUEL_EMZONE)
mainGame->dInfo.duel_field = 4;
else if(opt & DUEL_PZONE)
mainGame->dInfo.duel_rule = 3;
mainGame->dInfo.speed = (opt & SPEED_DUEL) ? 1 : 0;
mainGame->dInfo.duel_field = 3;
mainGame->dInfo.extraval = (opt & SPEED_DUEL) ? 1 : 0;
set_player_info(pduel, 0, start_lp, start_hand, draw_count);
set_player_info(pduel, 1, start_lp, start_hand, draw_count);
mainGame->dInfo.lp[0] = start_lp;
......@@ -122,8 +124,8 @@ int ReplayMode::ReplayThread(void* param) {
mainGame->dInfo.turn = 0;
// reset master rule 4 phase button position
mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 310, 855, 330));
if(mainGame->dInfo.speed) {
if(mainGame->dInfo.duel_rule >= 4) {
if(mainGame->dInfo.extraval) {
if(mainGame->dInfo.duel_field >= 4) {
mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 290, 855, 350));
mainGame->btnShuffle->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) {
}
} else {
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->btnM1->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) {
if(is_ready) {
bool allow_ocg = host_info.rule == 0 || 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) {
STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | PLAYERCHANGE_NOTREADY;
......
......@@ -665,12 +665,12 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
mainGame->gMutex.Lock();
mainGame->dField.Clear();
int rule = BufferIO::ReadInt8(pbuf);
mainGame->dInfo.duel_rule = rule & 0xf;
mainGame->dInfo.speed = (rule >> 4) ? 1 : 0;
mainGame->dInfo.duel_field = rule & 0xf;
mainGame->dInfo.extraval = rule >> 4;
// reset master rule 4 phase button position
mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 310, 855, 330));
if(mainGame->dInfo.speed) {
if(mainGame->dInfo.duel_rule >= 4) {
if(mainGame->dInfo.extraval) {
if(mainGame->dInfo.duel_field >= 4) {
mainGame->wPhase->setRelativePosition(mainGame->Resize(480, 290, 855, 350));
mainGame->btnShuffle->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) {
}
} else {
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->btnM1->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) {
if(is_ready) {
bool allow_ocg = host_info.rule == 0 || 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) {
STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | PLAYERCHANGE_NOTREADY;
......
......@@ -302,12 +302,6 @@
!system 1261 Master Rule 2
!system 1262 Master Rule 3
!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 1271 Log
!system 1272 Clear Log
......@@ -433,6 +427,16 @@
!system 1624 Die landed on:
!system 1625 Extra Rules
!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 2046 Enable sound effects
!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