Commit 1d2a19f2 authored by salix5's avatar salix5

MSG_SELECT_CHAIN

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