diff --git a/operations.cpp b/operations.cpp index 3b208c8cc..15c6a5bcc 100644 --- a/operations.cpp +++ b/operations.cpp @@ -2376,6 +2376,26 @@ int32 field::sset(uint16 step, uint8 setplayer, uint8 toplayer, card * target, e return TRUE; if(target->is_affected_by_effect(EFFECT_CANNOT_SSET)) return TRUE; + uint32 flag = 0; + if(target->data.type & TYPE_FIELD) { + flag = ~(0x1 << 13); + } else { + get_useable_count(target, setplayer, LOCATION_SZONE, toplayer, LOCATION_REASON_TOFIELD, 0xff, &flag); + flag = ((flag & 0xff) << 8) | 0xffff00ff; + flag |= 0xe080e080; + } + pduel->write_buffer8(MSG_HINT); + pduel->write_buffer8(HINT_SELECTMSG); + pduel->write_buffer8(setplayer); + pduel->write_buffer32(target->data.code); + add_process(PROCESSOR_SELECT_PLACE, 0, 0, 0, setplayer, flag, 0); + return FALSE; + } + case 1: { + if(returns.bvalue[1] == 0) { + return TRUE; + } + target->to_field_param = returns.bvalue[2]; effect_set eset; target->filter_effect(EFFECT_SSET_COST, &eset); for(int32 i = 0; i < eset.size(); ++i) { @@ -2386,12 +2406,12 @@ int32 field::sset(uint16 step, uint8 setplayer, uint8 toplayer, card * target, e } return FALSE; } - case 1: { + case 2: { target->enable_field_effect(false); - move_to_field(target, setplayer, toplayer, LOCATION_SZONE, POS_FACEDOWN, FALSE, 0, FALSE, (target->data.type & TYPE_FIELD) ? 0x1 << 5 : 0xff); + move_to_field(target, setplayer, toplayer, LOCATION_SZONE, POS_FACEDOWN, FALSE, 0, FALSE, 0x1 << target->to_field_param); return FALSE; } - case 2: { + case 3: { core.phase_action = TRUE; target->set_status(STATUS_SET_TURN, TRUE); if(target->data.type & TYPE_MONSTER) { diff --git a/playerop.cpp b/playerop.cpp index dc50b0edc..8a38ed076 100644 --- a/playerop.cpp +++ b/playerop.cpp @@ -374,8 +374,6 @@ int32 field::select_chain(uint16 step, uint8 playerid, uint8 spe_count, uint8 fo } int32 field::select_place(uint16 step, uint8 playerid, uint32 flag, uint8 count) { if(step == 0) { - if(count == 0) - return TRUE; if((playerid == 1) && (core.duel_options & DUEL_SIMPLE_AI)) { flag = ~flag; int32 filter; @@ -433,14 +431,15 @@ int32 field::select_place(uint16 step, uint8 playerid, uint32 flag, uint8 count) } else { uint8 pt = 0; uint32 selected = 0; - for(int8 i = 0; i < count; ++i) { + for(int8 i = 0; i < 1 || i < count; ++i) { uint8 p = returns.bvalue[pt]; uint8 l = returns.bvalue[pt + 1]; uint8 s = returns.bvalue[pt + 2]; uint32 sel = 0x1u << (s + (p == playerid ? 0 : 16) + (l == LOCATION_MZONE ? 0 : 8)); - if((p != 0 && p != 1) + if(!(count == 0 && i == 0 && l == 0) + && ((p != 0 && p != 1) || ((l != LOCATION_MZONE) && (l != LOCATION_SZONE)) - || (sel & flag) || (sel & selected)) { + || (sel & flag) || (sel & selected))) { pduel->write_buffer8(MSG_RETRY); return FALSE; }