Commit 1d2a19f2 authored by salix5's avatar salix5

MSG_SELECT_CHAIN

parent 4fb0de1b
......@@ -18,8 +18,10 @@ ClientCard::ClientCard() {
is_highlighting = false;
is_disabled = false;
is_reversed = false;
is_conti = false;
cmdFlag = 0;
code = 0;
conti_code = 0;
type = 0;
alias = 0;
level = 0;
......
......@@ -63,7 +63,9 @@ public:
bool is_showtarget;
bool is_highlighting;
bool is_reversed;
bool is_conti;
u32 code;
u32 conti_code;
u32 alias;
u32 type;
u32 level;
......
......@@ -333,24 +333,32 @@ void ClientField::ClearChainSelect() {
std::vector<ClientCard*>::iterator cit;
for(cit = activatable_cards.begin(); cit != activatable_cards.end(); ++cit) {
(*cit)->cmdFlag = 0;
(*cit)->conti_code = 0;
(*cit)->is_selectable = false;
(*cit)->is_selected = false;
(*cit)->is_conti = false;
}
grave_act = false;
remove_act = false;
extra_act = false;
}
void ClientField::ShowSelectCard(bool buttonok) {
void ClientField::ShowSelectCard(bool buttonok, bool chain) {
if(selectable_cards.size() <= 5) {
int startpos = 30 + 125 * (5 - selectable_cards.size()) / 2;
for(size_t i = 0; i < selectable_cards.size(); ++i) {
if(selectable_cards[i]->code)
mainGame->imageLoading.insert(std::make_pair(mainGame->btnCardSelect[i], selectable_cards[i]->code));
else if(chain && selectable_cards[i]->is_conti)
mainGame->imageLoading.insert(std::make_pair(mainGame->btnCardSelect[i], selectable_cards[i]->conti_code));
else
mainGame->btnCardSelect[i]->setImage(imageManager.tCover);
mainGame->btnCardSelect[i]->setRelativePosition(rect<s32>(startpos + i * 125, 55, startpos + 120 + i * 125, 225));
mainGame->btnCardSelect[i]->setPressed(false);
mainGame->btnCardSelect[i]->setVisible(true);
if(mainGame->dInfo.curMsg != MSG_SORT_CHAIN && mainGame->dInfo.curMsg != MSG_SORT_CARD) {
if(chain && selectable_cards[i]->is_conti)
myswprintf(formatBuffer, L"%ls", DataManager::unknown_string);
else
myswprintf(formatBuffer, L"%ls[%d]", dataManager.FormatLocation(selectable_cards[i]->location, selectable_cards[i]->sequence),
selectable_cards[i]->sequence + 1);
mainGame->stCardPos[i]->setText(formatBuffer);
......@@ -377,12 +385,17 @@ void ClientField::ShowSelectCard(bool buttonok) {
for(int i = 0; i < 5; ++i) {
if(selectable_cards[i]->code)
mainGame->imageLoading.insert(std::make_pair(mainGame->btnCardSelect[i], selectable_cards[i]->code));
else if(chain && selectable_cards[i]->is_conti)
mainGame->imageLoading.insert(std::make_pair(mainGame->btnCardSelect[i], selectable_cards[i]->conti_code));
else
mainGame->btnCardSelect[i]->setImage(imageManager.tCover);
mainGame->btnCardSelect[i]->setRelativePosition(rect<s32>(30 + i * 125, 55, 30 + 120 + i * 125, 225));
mainGame->btnCardSelect[i]->setPressed(false);
mainGame->btnCardSelect[i]->setVisible(true);
if(mainGame->dInfo.curMsg != MSG_SORT_CHAIN && mainGame->dInfo.curMsg != MSG_SORT_CARD) {
if(chain && selectable_cards[i]->is_conti)
myswprintf(formatBuffer, L"%ls", DataManager::unknown_string);
else
myswprintf(formatBuffer, L"%ls[%d]", dataManager.FormatLocation(selectable_cards[i]->location, selectable_cards[i]->sequence),
selectable_cards[i]->sequence + 1);
mainGame->stCardPos[i]->setText(formatBuffer);
......
......@@ -36,6 +36,7 @@ public:
std::vector<ClientCard*> reposable_cards;
std::vector<ClientCard*> activatable_cards;
std::vector<ClientCard*> attackable_cards;
std::vector<ClientCard*> conti_cards;
std::vector<int> activatable_descs;
std::vector<int> select_options;
std::vector<ChainInfo> chains;
......@@ -81,7 +82,7 @@ public:
void ClearCommandFlag();
void ClearSelect();
void ClearChainSelect();
void ShowSelectCard(bool buttonok = false);
void ShowSelectCard(bool buttonok = false, bool chain = false);
void ShowChainCard();
void ReplaySwap();
void RefreshAllCards();
......
......@@ -1160,14 +1160,14 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
int forced = BufferIO::ReadInt8(pbuf);
/*int hint0 = */BufferIO::ReadInt32(pbuf);
/*int hint1 = */BufferIO::ReadInt32(pbuf);
int c, l, s, ss, desc;
int code, c, l, s, ss, desc;
ClientCard* pcard;
bool panelmode = false;
mainGame->dField.chain_forced = (forced != 0);
mainGame->dField.activatable_cards.clear();
mainGame->dField.activatable_descs.clear();
for (int i = 0; i < count; ++i) {
/*code = */BufferIO::ReadInt32(pbuf);
code = BufferIO::ReadInt32(pbuf);
c = mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
l = BufferIO::ReadInt8(pbuf);
s = BufferIO::ReadInt8(pbuf);
......@@ -1178,14 +1178,24 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
mainGame->dField.activatable_descs.push_back(desc);
pcard->is_selectable = true;
pcard->is_selected = false;
if(code) {
pcard->is_conti = true;
pcard->conti_code = code;
mainGame->dField.conti_cards.push_back(pcard);
mainGame->dField.remove_act = true;
}
else {
pcard->cmdFlag |= COMMAND_ACTIVATE;
if(l == LOCATION_GRAVE)
mainGame->dField.grave_act = true;
if(l == LOCATION_REMOVED)
mainGame->dField.remove_act = true;
if(l & 0xc1)
if(l == LOCATION_EXTRA)
mainGame->dField.extra_act = true;
if(l == LOCATION_OVERLAY)
panelmode = true;
}
}
if(!forced && (mainGame->ignore_chain || ((count == 0 || specount == 0) && !mainGame->always_chain))) {
SetResponseI(-1);
mainGame->dField.ClearChainSelect();
......
......@@ -303,6 +303,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
for(size_t i = 0; i < remove[command_controler].size(); ++i)
if(remove[command_controler][i]->cmdFlag & COMMAND_ACTIVATE)
selectable_cards.push_back(remove[command_controler][i]);
selectable_cards.reserve(selectable_cards.size() + conti_cards.size());
selectable_cards.insert(selectable_cards.end(), conti_cards.begin(), conti_cards.end());
break;
}
case LOCATION_EXTRA: {
......@@ -314,7 +316,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
}
mainGame->wCardSelect->setText(dataManager.GetSysString(566));
list_command = COMMAND_ACTIVATE;
ShowSelectCard();
ShowSelectCard(true, true);
}
break;
}
......@@ -1023,10 +1025,13 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
}
case LOCATION_REMOVED: {
int command_flag = 0;
if(remove[hovered_controler].size() == 0)
if(remove[hovered_controler].size() == 0 && conti_cards.size() == 0)
break;
for(size_t i = 0; i < remove[hovered_controler].size(); ++i)
command_flag |= remove[hovered_controler][i]->cmdFlag;
if(conti_cards.size())
command_flag |= COMMAND_ACTIVATE;
if(remove[hovered_controler].size())
command_flag |= COMMAND_LIST;
list_command = 1;
ShowMenu(command_flag, x, y);
......
......@@ -317,7 +317,10 @@ int32 field::select_chain(uint16 step, uint8 playerid, uint8 spe_count, uint8 fo
for(uint32 i = 0; i < core.select_chains.size(); ++i) {
effect* peffect = core.select_chains[i].triggering_effect;
card* pcard = peffect->handler;
if(peffect->flag & EFFECT_FLAG_FIELD_ONLY)
pduel->write_buffer32(pcard->data.code);
else
pduel->write_buffer32(0);
pduel->write_buffer32(pcard->get_info_location());
pduel->write_buffer32(peffect->description);
}
......
......@@ -33,11 +33,13 @@ function c93108433.activate(e,tp,eg,ep,ev,re,r,rp)
local tc=Duel.GetFirstTarget()
local g=Duel.GetFieldGroup(tp,LOCATION_HAND,0)
local ct=g:GetCount()
if ct>0 and tc:IsRelateToEffect(e) then
if tc:IsRelateToEffect(e) then
g:AddCard(tc)
Duel.SendtoDeck(g,nil,2,REASON_EFFECT)
Duel.ShuffleDeck(tp)
if ct>0 then
Duel.BreakEffect()
Duel.Draw(tp,ct,REASON_EFFECT)
end
end
end
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