Commit f79332d7 authored by mercury233's avatar mercury233
parents e44e30f9 511f2f9f
...@@ -2051,8 +2051,15 @@ uint8 card::refresh_control_status() { ...@@ -2051,8 +2051,15 @@ uint8 card::refresh_control_status() {
filter_effect(EFFECT_SET_CONTROL, &eset); filter_effect(EFFECT_SET_CONTROL, &eset);
if(eset.size()) { if(eset.size()) {
effect* peffect = eset.get_last(); effect* peffect = eset.get_last();
if(peffect->id >= last_id) if(peffect->id >= last_id) {
card* pcard = peffect->get_handler();
pduel->game_field->core.readjust_map[pcard]++;
if(pduel->game_field->core.readjust_map[pcard] > 3) {
pduel->game_field->send_to(pcard, 0, REASON_RULE, peffect->get_handler_player(), PLAYER_NONE, LOCATION_GRAVE, 0, POS_FACEUP);
return final;
}
final = (uint8)peffect->get_value(this); final = (uint8)peffect->get_value(this);
}
} }
return final; return final;
} }
......
...@@ -315,7 +315,6 @@ struct card_sort { ...@@ -315,7 +315,6 @@ struct card_sort {
#define MSG_ANNOUNCE_ATTRIB 141 #define MSG_ANNOUNCE_ATTRIB 141
#define MSG_ANNOUNCE_CARD 142 #define MSG_ANNOUNCE_CARD 142
#define MSG_ANNOUNCE_NUMBER 143 #define MSG_ANNOUNCE_NUMBER 143
#define MSG_ANNOUNCE_CARD_FILTER 144
#define MSG_CARD_HINT 160 #define MSG_CARD_HINT 160
#define MSG_TAG_SWAP 161 #define MSG_TAG_SWAP 161
#define MSG_RELOAD_FIELD 162 // Debug.ReloadFieldEnd() #define MSG_RELOAD_FIELD 162 // Debug.ReloadFieldEnd()
......
...@@ -932,8 +932,20 @@ void field::shuffle(uint8 playerid, uint8 location) { ...@@ -932,8 +932,20 @@ void field::shuffle(uint8 playerid, uint8 location) {
pduel->write_buffer8(svector.size()); pduel->write_buffer8(svector.size());
for(auto& pcard : svector) for(auto& pcard : svector)
pduel->write_buffer32(pcard->data.code); pduel->write_buffer32(pcard->data.code);
if(location == LOCATION_HAND) if(location == LOCATION_HAND) {
core.shuffle_hand_check[playerid] = FALSE; core.shuffle_hand_check[playerid] = FALSE;
for(auto& pcard : svector) {
for(auto& i : pcard->indexer) {
effect* peffect = i.first;
if(peffect->is_flag(EFFECT_FLAG_CLIENT_HINT) && !peffect->is_flag(EFFECT_FLAG_PLAYER_TARGET)) {
pduel->write_buffer8(MSG_CARD_HINT);
pduel->write_buffer32(pcard->get_info_location());
pduel->write_buffer8(CHINT_DESC_ADD);
pduel->write_buffer32(peffect->description);
}
}
}
}
} else { } else {
pduel->write_buffer8(MSG_SHUFFLE_DECK); pduel->write_buffer8(MSG_SHUFFLE_DECK);
pduel->write_buffer8(playerid); pduel->write_buffer8(playerid);
......
...@@ -607,7 +607,7 @@ public: ...@@ -607,7 +607,7 @@ public:
int32 sort_card(int16 step, uint8 playerid, uint8 is_chain); int32 sort_card(int16 step, uint8 playerid, uint8 is_chain);
int32 announce_race(int16 step, uint8 playerid, int32 count, int32 available); int32 announce_race(int16 step, uint8 playerid, int32 count, int32 available);
int32 announce_attribute(int16 step, uint8 playerid, int32 count, int32 available); int32 announce_attribute(int16 step, uint8 playerid, int32 count, int32 available);
int32 announce_card(int16 step, uint8 playerid, uint32 ttype); int32 announce_card(int16 step, uint8 playerid);
int32 announce_number(int16 step, uint8 playerid); int32 announce_number(int16 step, uint8 playerid);
}; };
......
...@@ -537,7 +537,6 @@ static const struct luaL_Reg duellib[] = { ...@@ -537,7 +537,6 @@ static const struct luaL_Reg duellib[] = {
{ "AnnounceAttribute", scriptlib::duel_announce_attribute }, { "AnnounceAttribute", scriptlib::duel_announce_attribute },
{ "AnnounceLevel", scriptlib::duel_announce_level }, { "AnnounceLevel", scriptlib::duel_announce_level },
{ "AnnounceCard", scriptlib::duel_announce_card }, { "AnnounceCard", scriptlib::duel_announce_card },
{ "AnnounceCardFilter", scriptlib::duel_announce_card_filter },
{ "AnnounceType", scriptlib::duel_announce_type }, { "AnnounceType", scriptlib::duel_announce_type },
{ "AnnounceNumber", scriptlib::duel_announce_number }, { "AnnounceNumber", scriptlib::duel_announce_number },
{ "AnnounceCoin", scriptlib::duel_announce_coin }, { "AnnounceCoin", scriptlib::duel_announce_coin },
......
...@@ -3555,24 +3555,15 @@ int32 scriptlib::duel_announce_card(lua_State * L) { ...@@ -3555,24 +3555,15 @@ int32 scriptlib::duel_announce_card(lua_State * L) {
int32 playerid = lua_tointeger(L, 1); int32 playerid = lua_tointeger(L, 1);
duel* pduel = interpreter::get_duel_info(L); duel* pduel = interpreter::get_duel_info(L);
pduel->game_field->core.select_options.clear(); pduel->game_field->core.select_options.clear();
uint32 ttype = TYPE_MONSTER | TYPE_SPELL | TYPE_TRAP; if(lua_gettop(L) == 1) {
if(lua_gettop(L) >= 2) pduel->game_field->core.select_options.push_back(TRUE);
ttype = lua_tointeger(L, 2); } else if(lua_gettop(L) == 2) {
pduel->game_field->add_process(PROCESSOR_ANNOUNCE_CARD, 0, 0, 0, playerid, ttype); pduel->game_field->core.select_options.push_back(lua_tointeger(L, 2));
return lua_yieldk(L, 0, (lua_KContext)pduel, [](lua_State *L, int32 status, lua_KContext ctx) { pduel->game_field->core.select_options.push_back(OPCODE_ISTYPE);
duel* pduel = (duel*)ctx; } else {
lua_pushinteger(L, pduel->game_field->returns.ivalue[0]); for(int32 i = 2; i <= lua_gettop(L); ++i)
return 1; pduel->game_field->core.select_options.push_back(lua_tointeger(L, i));
}); }
}
int32 scriptlib::duel_announce_card_filter(lua_State * L) {
check_action_permission(L);
check_param_count(L, 2);
int32 playerid = lua_tointeger(L, 1);
duel* pduel = interpreter::get_duel_info(L);
pduel->game_field->core.select_options.clear();
for(int32 i = 2; i <= lua_gettop(L); ++i)
pduel->game_field->core.select_options.push_back(lua_tointeger(L, i));
pduel->game_field->add_process(PROCESSOR_ANNOUNCE_CARD, 0, 0, 0, playerid, 0); pduel->game_field->add_process(PROCESSOR_ANNOUNCE_CARD, 0, 0, 0, playerid, 0);
return lua_yieldk(L, 0, (lua_KContext)pduel, [](lua_State *L, int32 status, lua_KContext ctx) { return lua_yieldk(L, 0, (lua_KContext)pduel, [](lua_State *L, int32 status, lua_KContext ctx) {
duel* pduel = (duel*)ctx; duel* pduel = (duel*)ctx;
......
...@@ -965,43 +965,27 @@ static int32 is_declarable(card_data const& cd, const std::vector<uint32>& opcod ...@@ -965,43 +965,27 @@ static int32 is_declarable(card_data const& cd, const std::vector<uint32>& opcod
return cd.code == CARD_MARINE_DOLPHIN || cd.code == CARD_TWINKLE_MOSS return cd.code == CARD_MARINE_DOLPHIN || cd.code == CARD_TWINKLE_MOSS
|| (!cd.alias && (cd.type & (TYPE_MONSTER + TYPE_TOKEN)) != (TYPE_MONSTER + TYPE_TOKEN)); || (!cd.alias && (cd.type & (TYPE_MONSTER + TYPE_TOKEN)) != (TYPE_MONSTER + TYPE_TOKEN));
} }
int32 field::announce_card(int16 step, uint8 playerid, uint32 ttype) { int32 field::announce_card(int16 step, uint8 playerid) {
if(step == 0) { if(step == 0) {
if(core.select_options.size() == 0) { pduel->write_buffer8(MSG_ANNOUNCE_CARD);
pduel->write_buffer8(MSG_ANNOUNCE_CARD); pduel->write_buffer8(playerid);
pduel->write_buffer8(playerid); pduel->write_buffer8(core.select_options.size());
pduel->write_buffer32(ttype); for(auto& option : core.select_options)
} else { pduel->write_buffer32(option);
pduel->write_buffer8(MSG_ANNOUNCE_CARD_FILTER);
pduel->write_buffer8(playerid);
pduel->write_buffer8(core.select_options.size());
for(auto& option : core.select_options)
pduel->write_buffer32(option);
}
return FALSE; return FALSE;
} else { } else {
int32 code = returns.ivalue[0]; int32 code = returns.ivalue[0];
bool retry = false;
card_data data; card_data data;
read_card(code, &data); read_card(code, &data);
if(!data.code) { if(!data.code) {
retry = true; pduel->write_buffer8(MSG_RETRY);
} else if(core.select_options.size() == 0) { return FALSE;
if(!(data.type & ttype)) {
retry = true;
}
} else { } else {
if(!is_declarable(data, core.select_options)) { if(!is_declarable(data, core.select_options)) {
retry = true; pduel->write_buffer8(MSG_RETRY);
return FALSE;
} }
} }
if(retry) {
pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_MESSAGE);
pduel->write_buffer8(playerid);
pduel->write_buffer32(1421);
return announce_card(0, playerid, ttype);
}
pduel->write_buffer8(MSG_HINT); pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_CODE); pduel->write_buffer8(HINT_CODE);
pduel->write_buffer8(playerid); pduel->write_buffer8(playerid);
......
...@@ -543,11 +543,10 @@ int32 field::process() { ...@@ -543,11 +543,10 @@ int32 field::process() {
return PROCESSOR_WAITING + pduel->bufferlen; return PROCESSOR_WAITING + pduel->bufferlen;
} }
case PROCESSOR_ANNOUNCE_CARD: { case PROCESSOR_ANNOUNCE_CARD: {
if(announce_card(it->step, it->arg1, it->arg2)) { if(announce_card(it->step, it->arg1)) {
core.units.pop_front(); core.units.pop_front();
} else { } else {
if(it->step == 0) it->step++;
it->step++;
} }
return PROCESSOR_WAITING + pduel->bufferlen; return PROCESSOR_WAITING + pduel->bufferlen;
} }
......
...@@ -532,7 +532,6 @@ public: ...@@ -532,7 +532,6 @@ public:
static int32 duel_announce_attribute(lua_State *L); static int32 duel_announce_attribute(lua_State *L);
static int32 duel_announce_level(lua_State *L); static int32 duel_announce_level(lua_State *L);
static int32 duel_announce_card(lua_State *L); static int32 duel_announce_card(lua_State *L);
static int32 duel_announce_card_filter(lua_State *L);
static int32 duel_announce_type(lua_State *L); static int32 duel_announce_type(lua_State *L);
static int32 duel_announce_number(lua_State *L); static int32 duel_announce_number(lua_State *L);
static int32 duel_announce_coin(lua_State *L); static int32 duel_announce_coin(lua_State *L);
......
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