Commit e769c948 authored by nanahira's avatar nanahira

updc

parent 8901ba22
...@@ -563,7 +563,7 @@ public: ...@@ -563,7 +563,7 @@ public:
int32 select_synchro_material(int16 step, uint8 playerid, card* pcard, int32 min, int32 max, card* smat, group* mg); int32 select_synchro_material(int16 step, uint8 playerid, card* pcard, int32 min, int32 max, card* smat, group* mg);
int32 select_xyz_material(int16 step, uint8 playerid, uint32 lv, card* pcard, int32 min, int32 max); int32 select_xyz_material(int16 step, uint8 playerid, uint32 lv, card* pcard, int32 min, int32 max);
int32 select_release_cards(int16 step, uint8 playerid, uint8 check_field, uint8 cancelable, int32 min, int32 max); int32 select_release_cards(int16 step, uint8 playerid, uint8 check_field, uint8 cancelable, int32 min, int32 max);
int32 select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable, int32 min, int32 max, uint32 zone); int32 select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable, int32 min, int32 max, uint8 toplayer, uint32 zone);
int32 toss_coin(uint16 step, effect* reason_effect, uint8 reason_player, uint8 playerid, uint8 count); int32 toss_coin(uint16 step, effect* reason_effect, uint8 reason_player, uint8 playerid, uint8 count);
int32 toss_dice(uint16 step, effect* reason_effect, uint8 reason_player, uint8 playerid, uint8 count1, uint8 count2); int32 toss_dice(uint16 step, effect* reason_effect, uint8 reason_player, uint8 playerid, uint8 count1, uint8 count2);
int32 rock_paper_scissors(uint16 step, uint8 repeat); int32 rock_paper_scissors(uint16 step, uint8 repeat);
......
...@@ -2431,16 +2431,21 @@ int32 scriptlib::duel_select_tribute(lua_State *L) { ...@@ -2431,16 +2431,21 @@ int32 scriptlib::duel_select_tribute(lua_State *L) {
check_param(L, PARAM_TYPE_GROUP, 5); check_param(L, PARAM_TYPE_GROUP, 5);
mg = *(group**) lua_touserdata(L, 5); mg = *(group**) lua_touserdata(L, 5);
} }
uint32 ex = 0; uint8 toplayer = playerid;
if(lua_gettop(L) >= 6) if(lua_gettop(L) >= 6)
ex = lua_toboolean(L, 6); toplayer = lua_tointeger(L, 6);
if(toplayer != 0 && toplayer != 1)
return 0;
uint32 ex = FALSE;
if(toplayer != playerid)
ex = TRUE;
uint32 zone = 0x1f; uint32 zone = 0x1f;
duel* pduel = interpreter::get_duel_info(L); duel* pduel = interpreter::get_duel_info(L);
pduel->game_field->core.release_cards.clear(); pduel->game_field->core.release_cards.clear();
pduel->game_field->core.release_cards_ex.clear(); pduel->game_field->core.release_cards_ex.clear();
pduel->game_field->core.release_cards_ex_sum.clear(); pduel->game_field->core.release_cards_ex_sum.clear();
pduel->game_field->get_summon_release_list(target, &pduel->game_field->core.release_cards, &pduel->game_field->core.release_cards_ex, &pduel->game_field->core.release_cards_ex_sum, mg, ex); pduel->game_field->get_summon_release_list(target, &pduel->game_field->core.release_cards, &pduel->game_field->core.release_cards_ex, &pduel->game_field->core.release_cards_ex_sum, mg, ex);
pduel->game_field->add_process(PROCESSOR_SELECT_TRIBUTE_S, 0, 0, 0, playerid, (max << 16) + min, zone); pduel->game_field->add_process(PROCESSOR_SELECT_TRIBUTE_S, 0, 0, 0, playerid, (max << 16) + min, toplayer, zone);
return lua_yield(L, 0); return lua_yield(L, 0);
} }
/** /**
......
...@@ -1609,7 +1609,7 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui ...@@ -1609,7 +1609,7 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui
} else { } else {
int32 ct = get_tofield_count(sumplayer, LOCATION_MZONE, zone); int32 ct = get_tofield_count(sumplayer, LOCATION_MZONE, zone);
int32 fcount = get_mzone_limit(sumplayer, sumplayer, LOCATION_REASON_TOFIELD); int32 fcount = get_mzone_limit(sumplayer, sumplayer, LOCATION_REASON_TOFIELD);
if(min == 0 && ct > 0) { if(min == 0 && ct > 0 && fcount > 0) {
add_process(PROCESSOR_SELECT_YESNO, 0, 0, 0, sumplayer, 90); add_process(PROCESSOR_SELECT_YESNO, 0, 0, 0, sumplayer, 90);
core.units.begin()->arg2 = required; core.units.begin()->arg2 = required;
} else { } else {
...@@ -1617,7 +1617,7 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui ...@@ -1617,7 +1617,7 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui
min = -fcount + 1; min = -fcount + 1;
required = min + (max << 16); required = min + (max << 16);
} }
add_process(PROCESSOR_SELECT_TRIBUTE, 0, 0, 0, sumplayer + ((uint32)core.summon_cancelable << 16), required, zone); add_process(PROCESSOR_SELECT_TRIBUTE, 0, 0, 0, sumplayer + ((uint32)core.summon_cancelable << 16), required, sumplayer, zone);
core.units.begin()->step = 3; core.units.begin()->step = 3;
} }
} }
...@@ -1629,7 +1629,7 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui ...@@ -1629,7 +1629,7 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui
returns.bvalue[0] = 0; returns.bvalue[0] = 0;
else { else {
int32 required = 1 + core.units.begin()->arg2; int32 required = 1 + core.units.begin()->arg2;
add_process(PROCESSOR_SELECT_TRIBUTE, 0, 0, 0, sumplayer + ((uint32)core.summon_cancelable << 16), required, zone); add_process(PROCESSOR_SELECT_TRIBUTE, 0, 0, 0, sumplayer + ((uint32)core.summon_cancelable << 16), required, sumplayer, zone);
} }
return FALSE; return FALSE;
} }
...@@ -2159,7 +2159,7 @@ int32 field::mset(uint16 step, uint8 setplayer, card* target, effect* proc, uint ...@@ -2159,7 +2159,7 @@ int32 field::mset(uint16 step, uint8 setplayer, card* target, effect* proc, uint
} else { } else {
int32 ct = get_tofield_count(setplayer, LOCATION_MZONE, zone); int32 ct = get_tofield_count(setplayer, LOCATION_MZONE, zone);
int32 fcount = get_mzone_limit(setplayer, setplayer, LOCATION_REASON_TOFIELD); int32 fcount = get_mzone_limit(setplayer, setplayer, LOCATION_REASON_TOFIELD);
if(min == 0 && ct > 0) { if(min == 0 && ct > 0 && fcount > 0) {
add_process(PROCESSOR_SELECT_YESNO, 0, 0, 0, setplayer, 90); add_process(PROCESSOR_SELECT_YESNO, 0, 0, 0, setplayer, 90);
core.units.begin()->arg2 = required; core.units.begin()->arg2 = required;
} else { } else {
...@@ -2167,7 +2167,7 @@ int32 field::mset(uint16 step, uint8 setplayer, card* target, effect* proc, uint ...@@ -2167,7 +2167,7 @@ int32 field::mset(uint16 step, uint8 setplayer, card* target, effect* proc, uint
min = -fcount + 1; min = -fcount + 1;
required = min + (max << 16); required = min + (max << 16);
} }
add_process(PROCESSOR_SELECT_TRIBUTE, 0, 0, 0, setplayer + ((uint32)core.summon_cancelable << 16), required, zone); add_process(PROCESSOR_SELECT_TRIBUTE, 0, 0, 0, setplayer + ((uint32)core.summon_cancelable << 16), required, setplayer, zone);
core.units.begin()->step = 3; core.units.begin()->step = 3;
} }
} }
...@@ -2179,7 +2179,7 @@ int32 field::mset(uint16 step, uint8 setplayer, card* target, effect* proc, uint ...@@ -2179,7 +2179,7 @@ int32 field::mset(uint16 step, uint8 setplayer, card* target, effect* proc, uint
returns.bvalue[0] = 0; returns.bvalue[0] = 0;
else { else {
int32 required = 1 + core.units.begin()->arg2; int32 required = 1 + core.units.begin()->arg2;
add_process(PROCESSOR_SELECT_TRIBUTE, 0, 0, 0, setplayer + ((uint32)core.summon_cancelable << 16), required, zone); add_process(PROCESSOR_SELECT_TRIBUTE, 0, 0, 0, setplayer + ((uint32)core.summon_cancelable << 16), required, setplayer, zone);
} }
return FALSE; return FALSE;
} }
...@@ -5444,9 +5444,13 @@ int32 field::select_release_cards(int16 step, uint8 playerid, uint8 check_field, ...@@ -5444,9 +5444,13 @@ int32 field::select_release_cards(int16 step, uint8 playerid, uint8 check_field,
} }
return TRUE; return TRUE;
} }
int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable, int32 min, int32 max, uint32 zone) { int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable, int32 min, int32 max, uint8 toplayer, uint32 zone) {
switch(step) { switch(step) {
case 0: { case 0: {
if(toplayer != playerid) {
core.units.begin()->step = 19;
return FALSE;
}
core.operated_set.clear(); core.operated_set.clear();
zone &= 0x1f; zone &= 0x1f;
int32 ct = get_tofield_count(playerid, LOCATION_MZONE, zone); int32 ct = get_tofield_count(playerid, LOCATION_MZONE, zone);
...@@ -5641,6 +5645,112 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable, ...@@ -5641,6 +5645,112 @@ int32 field::select_tribute_cards(int16 step, uint8 playerid, uint8 cancelable,
peffect->dec_count(); peffect->dec_count();
return TRUE; return TRUE;
} }
case 20: {
core.operated_set.clear();
zone &= 0x1f;
int32 ct = get_tofield_count(toplayer, LOCATION_MZONE, zone);
if(ct > 0) {
returns.ivalue[0] = TRUE;
core.units.begin()->step = 21;
return FALSE;
}
int32 rmax = 0;
core.select_cards.clear();
for(auto cit = core.release_cards_ex.begin(); cit != core.release_cards_ex.end(); ++cit) {
if((zone >> (*cit)->current.sequence) & 1)
core.select_cards.push_back(*cit);
else
rmax += (*cit)->release_param;
}
pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_SELECTMSG);
pduel->write_buffer8(playerid);
pduel->write_buffer32(500);
if(core.release_cards.empty() && min > rmax) {
if(rmax > 0) {
core.select_cards.clear();
for(auto cit = core.release_cards_ex.begin(); cit != core.release_cards_ex.end(); ++cit)
core.select_cards.push_back(*cit);
}
add_process(PROCESSOR_SELECT_TRIBUTE_P, 0, 0, 0, ((uint32)cancelable << 16) + playerid, (max << 16) + min);
return TRUE;
}
add_process(PROCESSOR_SELECT_CARD, 0, 0, 0, ((uint32)cancelable << 16) + playerid, 0x10001);
return FALSE;
}
case 21: {
if(returns.ivalue[0] == -1)
return TRUE;
card* pcard = core.select_cards[returns.bvalue[1]];
core.operated_set.insert(pcard);
core.release_cards_ex.erase(pcard);
if(min <= (int32)pcard->release_param) {
if(max > 1 && (!core.release_cards_ex.empty() || !core.release_cards.empty()))
add_process(PROCESSOR_SELECT_YESNO, 0, 0, 0, playerid, 210);
else
core.units.begin()->step = 24;
} else
returns.ivalue[0] = TRUE;
return FALSE;
}
case 22: {
if(!returns.ivalue[0]) {
core.units.begin()->step = 24;
return FALSE;
}
int32 fcount = get_mzone_limit(toplayer, playerid, LOCATION_REASON_TOFIELD);
if(!core.operated_set.empty()) {
min -= (*core.operated_set.begin())->release_param;
max--;
fcount++;
}
core.units.begin()->arg2 = (max << 16) + min;
if(core.release_cards.size() == 0
|| (fcount <= 0 && min < 2)) {
core.select_cards.clear();
for(auto cit = core.release_cards_ex.begin(); cit != core.release_cards_ex.end(); ++cit)
core.select_cards.push_back(*cit);
pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_SELECTMSG);
pduel->write_buffer8(playerid);
pduel->write_buffer32(500);
add_process(PROCESSOR_SELECT_TRIBUTE_P, 0, 0, 0, ((uint32)cancelable << 16) + playerid, (max << 16) + min);
core.units.begin()->step = 23;
return FALSE;
}
return FALSE;
}
case 23: {
core.select_cards.clear();
for(auto cit = core.release_cards_ex.begin(); cit != core.release_cards_ex.end(); ++cit)
core.select_cards.push_back(*cit);
for(auto cit = core.release_cards.begin(); cit != core.release_cards.end(); ++cit)
core.select_cards.push_back(*cit);
pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_SELECTMSG);
pduel->write_buffer8(playerid);
pduel->write_buffer32(500);
add_process(PROCESSOR_SELECT_TRIBUTE_P, 0, 0, 0, ((uint32)cancelable << 16) + playerid, (max << 16) + min);
return FALSE;
}
case 24: {
if(returns.ivalue[0] == -1)
return TRUE;
for(int32 i = 0; i < returns.bvalue[0]; ++i)
core.operated_set.insert(core.select_cards[returns.bvalue[i + 1]]);
return FALSE;
}
case 25: {
core.select_cards.clear();
returns.bvalue[0] = core.operated_set.size();
int32 i = 0;
for(auto cit = core.operated_set.begin(); cit != core.operated_set.end(); ++cit, ++i) {
core.select_cards.push_back(*cit);
returns.bvalue[i + 1] = i;
}
return TRUE;
}
} }
return TRUE; return TRUE;
} }
......
...@@ -204,7 +204,7 @@ int32 field::process() { ...@@ -204,7 +204,7 @@ int32 field::process() {
return pduel->bufferlen; return pduel->bufferlen;
} }
case PROCESSOR_SELECT_TRIBUTE: { case PROCESSOR_SELECT_TRIBUTE: {
if (select_tribute_cards(it->step, it->arg1 & 0xff, (it->arg1 >> 16) & 0xff, (it->arg2) & 0xff, (it->arg2 >> 16) & 0xff, it->arg3)) if (select_tribute_cards(it->step, it->arg1 & 0xff, (it->arg1 >> 16) & 0xff, (it->arg2) & 0xff, (it->arg2 >> 16) & 0xff, it->arg3, it->arg4))
core.units.pop_front(); core.units.pop_front();
else else
it->step++; it->step++;
...@@ -739,7 +739,7 @@ int32 field::process() { ...@@ -739,7 +739,7 @@ int32 field::process() {
} }
case PROCESSOR_SELECT_TRIBUTE_S: { case PROCESSOR_SELECT_TRIBUTE_S: {
if(it->step == 0) { if(it->step == 0) {
add_process(PROCESSOR_SELECT_TRIBUTE, 0, it->peffect, it->ptarget, it->arg1, it->arg2, it->arg3); add_process(PROCESSOR_SELECT_TRIBUTE, 0, it->peffect, it->ptarget, it->arg1, it->arg2, it->arg3, it->arg4);
it->step++; it->step++;
} else { } else {
group* pgroup = pduel->new_group(); group* pgroup = pduel->new_group();
......
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