Commit 33d00147 authored by VanillaSalt's avatar VanillaSalt

fix

parent f6964062
...@@ -1534,7 +1534,7 @@ int32 card::filter_set_procedure(uint8 playerid, effect_set* peset, uint8 ignore ...@@ -1534,7 +1534,7 @@ int32 card::filter_set_procedure(uint8 playerid, effect_set* peset, uint8 ignore
return TRUE; return TRUE;
return FALSE; return FALSE;
} }
void card::filter_spsummon_procedure(uint8 playerid, effect_set* peset) { void card::filter_spsummon_procedure(uint8 playerid, effect_set* peset, uint32 summon_type) {
auto pr = field_effect.equal_range(EFFECT_SPSUMMON_PROC); auto pr = field_effect.equal_range(EFFECT_SPSUMMON_PROC);
uint8 toplayer; uint8 toplayer;
uint8 topos; uint8 topos;
...@@ -1551,9 +1551,12 @@ void card::filter_spsummon_procedure(uint8 playerid, effect_set* peset) { ...@@ -1551,9 +1551,12 @@ void card::filter_spsummon_procedure(uint8 playerid, effect_set* peset) {
topos = POS_FACEUP; topos = POS_FACEUP;
toplayer = playerid; toplayer = playerid;
} }
if(peffect->is_available() && peffect->check_count_limit(playerid) && is_summonable(peffect) if(peffect->is_available() && peffect->check_count_limit(playerid) && is_summonable(peffect)) {
&& pduel->game_field->is_player_can_spsummon(peffect, peffect->get_value(this), topos, playerid, toplayer, this)) uint32 sumtype = peffect->get_value(this);
peset->add_item(peffect); if((!summon_type || summon_type == sumtype)
&& pduel->game_field->is_player_can_spsummon(peffect, sumtype, topos, playerid, toplayer, this))
peset->add_item(peffect);
}
} }
} }
void card::filter_spsummon_procedure_g(uint8 playerid, effect_set* peset) { void card::filter_spsummon_procedure_g(uint8 playerid, effect_set* peset) {
...@@ -1860,7 +1863,7 @@ int32 card::is_can_be_flip_summoned(uint8 playerid) { ...@@ -1860,7 +1863,7 @@ int32 card::is_can_be_flip_summoned(uint8 playerid) {
pduel->game_field->restore_lp_cost(); pduel->game_field->restore_lp_cost();
return TRUE; return TRUE;
} }
int32 card::is_special_summonable(uint8 playerid) { int32 card::is_special_summonable(uint8 playerid, uint32 summon_type) {
if(!(data.type & TYPE_MONSTER)) if(!(data.type & TYPE_MONSTER))
return FALSE; return FALSE;
if(pduel->game_field->check_unique_onfield(this, playerid)) if(pduel->game_field->check_unique_onfield(this, playerid))
...@@ -1886,7 +1889,7 @@ int32 card::is_special_summonable(uint8 playerid) { ...@@ -1886,7 +1889,7 @@ int32 card::is_special_summonable(uint8 playerid) {
} }
} }
eset.clear(); eset.clear();
filter_spsummon_procedure(playerid, &eset); filter_spsummon_procedure(playerid, &eset, summon_type);
pduel->game_field->core.limit_tuner = 0; pduel->game_field->core.limit_tuner = 0;
pduel->game_field->core.limit_xyz = 0; pduel->game_field->core.limit_xyz = 0;
pduel->game_field->core.limit_syn = 0; pduel->game_field->core.limit_syn = 0;
......
...@@ -203,7 +203,7 @@ public: ...@@ -203,7 +203,7 @@ public:
void filter_disable_related_cards(); void filter_disable_related_cards();
int32 filter_summon_procedure(uint8 playerid, effect_set* eset, uint8 ignore_count, uint8 min_tribute); int32 filter_summon_procedure(uint8 playerid, effect_set* eset, uint8 ignore_count, uint8 min_tribute);
int32 filter_set_procedure(uint8 playerid, effect_set* eset, uint8 ignore_count, uint8 min_tribute); int32 filter_set_procedure(uint8 playerid, effect_set* eset, uint8 ignore_count, uint8 min_tribute);
void filter_spsummon_procedure(uint8 playerid, effect_set* eset); void filter_spsummon_procedure(uint8 playerid, effect_set* eset, uint32 summon_type);
void filter_spsummon_procedure_g(uint8 playerid, effect_set* eset); void filter_spsummon_procedure_g(uint8 playerid, effect_set* eset);
effect* is_affected_by_effect(int32 code); effect* is_affected_by_effect(int32 code);
effect* is_affected_by_effect(int32 code, card* target); effect* is_affected_by_effect(int32 code, card* target);
...@@ -219,7 +219,7 @@ public: ...@@ -219,7 +219,7 @@ public:
int32 get_summon_tribute_count(); int32 get_summon_tribute_count();
int32 get_set_tribute_count(); int32 get_set_tribute_count();
int32 is_can_be_flip_summoned(uint8 playerid); int32 is_can_be_flip_summoned(uint8 playerid);
int32 is_special_summonable(uint8 playerid); int32 is_special_summonable(uint8 playerid, uint32 summon_type);
int32 is_can_be_special_summoned(effect* reason_effect, uint32 sumtype, uint8 sumpos, uint8 sumplayer, uint8 toplayer, uint8 nocheck, uint8 nolimit); int32 is_can_be_special_summoned(effect* reason_effect, uint32 sumtype, uint8 sumpos, uint8 sumplayer, uint8 toplayer, uint8 nocheck, uint8 nolimit);
int32 is_setable_mzone(uint8 playerid, uint8 ignore_count, effect* peffect, uint8 min_tribute); int32 is_setable_mzone(uint8 playerid, uint8 ignore_count, effect* peffect, uint8 min_tribute);
int32 is_setable_szone(uint8 playerid, uint8 ignore_fd = 0); int32 is_setable_szone(uint8 playerid, uint8 ignore_fd = 0);
......
...@@ -456,7 +456,7 @@ public: ...@@ -456,7 +456,7 @@ public:
void damage(effect* reason_effect, uint32 reason, uint32 reason_player, card* pcard, uint32 playerid, uint32 amount); void damage(effect* reason_effect, uint32 reason, uint32 reason_player, card* pcard, uint32 playerid, uint32 amount);
void recover(effect* reason_effect, uint32 reason, uint32 reason_player, uint32 playerid, uint32 amount); void recover(effect* reason_effect, uint32 reason, uint32 reason_player, uint32 playerid, uint32 amount);
void summon(uint32 sumplayer, card* target, effect* proc, uint32 ignore_count, uint32 min_tribute); void summon(uint32 sumplayer, card* target, effect* proc, uint32 ignore_count, uint32 min_tribute);
void special_summon_rule(uint32 sumplayer, card* target); void special_summon_rule(uint32 sumplayer, card* target, uint32 summon_type);
void special_summon(card_set* target, uint32 sumtype, uint32 sumplayer, uint32 playerid, uint32 nocheck, uint32 nolimit, uint32 positions); void special_summon(card_set* target, uint32 sumtype, uint32 sumplayer, uint32 playerid, uint32 nocheck, uint32 nolimit, uint32 positions);
void special_summon_step(card* target, uint32 sumtype, uint32 sumplayer, uint32 playerid, uint32 nocheck, uint32 nolimit, uint32 positions); void special_summon_step(card* target, uint32 sumtype, uint32 sumplayer, uint32 playerid, uint32 nocheck, uint32 nolimit, uint32 positions);
void special_summon_complete(effect* reason_effect, uint8 reason_player); void special_summon_complete(effect* reason_effect, uint8 reason_player);
...@@ -484,7 +484,7 @@ public: ...@@ -484,7 +484,7 @@ public:
int32 mset(uint16 step, uint8 setplayer, card* ptarget, effect* proc, uint8 ignore_count, uint8 min_tribute); int32 mset(uint16 step, uint8 setplayer, card* ptarget, effect* proc, uint8 ignore_count, uint8 min_tribute);
int32 sset(uint16 step, uint8 setplayer, uint8 toplayer, card* ptarget); int32 sset(uint16 step, uint8 setplayer, uint8 toplayer, card* ptarget);
int32 sset_g(uint16 step, uint8 setplayer, uint8 toplayer, group* ptarget); int32 sset_g(uint16 step, uint8 setplayer, uint8 toplayer, group* ptarget);
int32 special_summon_rule(uint16 step, uint8 sumplayer, card* target); int32 special_summon_rule(uint16 step, uint8 sumplayer, card* target, uint32 summon_type);
int32 special_summon_step(uint16 step, group* targets, card* target); int32 special_summon_step(uint16 step, group* targets, card* target);
int32 special_summon(uint16 step, effect* reason_effect, uint8 reason_player, group* targets); int32 special_summon(uint16 step, effect* reason_effect, uint8 reason_player, group* targets);
int32 destroy(uint16 step, group* targets, card* target, uint8 battle); int32 destroy(uint16 step, group* targets, card* target, uint8 battle);
......
...@@ -1154,7 +1154,7 @@ int32 scriptlib::card_is_special_summonable(lua_State *L) { ...@@ -1154,7 +1154,7 @@ int32 scriptlib::card_is_special_summonable(lua_State *L) {
check_param(L, PARAM_TYPE_CARD, 1); check_param(L, PARAM_TYPE_CARD, 1);
card* pcard = *(card**) lua_touserdata(L, 1); card* pcard = *(card**) lua_touserdata(L, 1);
uint32 p = pcard->pduel->game_field->core.reason_player; uint32 p = pcard->pduel->game_field->core.reason_player;
lua_pushboolean(L, pcard->is_special_summonable(p)); lua_pushboolean(L, pcard->is_special_summonable(p, 0));
return 1; return 1;
} }
int32 scriptlib::card_is_synchro_summonable(lua_State *L) { int32 scriptlib::card_is_synchro_summonable(lua_State *L) {
...@@ -1178,7 +1178,7 @@ int32 scriptlib::card_is_synchro_summonable(lua_State *L) { ...@@ -1178,7 +1178,7 @@ int32 scriptlib::card_is_synchro_summonable(lua_State *L) {
uint32 p = pcard->pduel->game_field->core.reason_player; uint32 p = pcard->pduel->game_field->core.reason_player;
pcard->pduel->game_field->core.limit_tuner = tuner; pcard->pduel->game_field->core.limit_tuner = tuner;
pcard->pduel->game_field->core.limit_syn = mg; pcard->pduel->game_field->core.limit_syn = mg;
lua_pushboolean(L, pcard->is_special_summonable(p)); lua_pushboolean(L, pcard->is_special_summonable(p, SUMMON_TYPE_SYNCHRO));
return 1; return 1;
} }
int32 scriptlib::card_is_xyz_summonable(lua_State *L) { int32 scriptlib::card_is_xyz_summonable(lua_State *L) {
...@@ -1194,7 +1194,7 @@ int32 scriptlib::card_is_xyz_summonable(lua_State *L) { ...@@ -1194,7 +1194,7 @@ int32 scriptlib::card_is_xyz_summonable(lua_State *L) {
} }
uint32 p = pcard->pduel->game_field->core.reason_player; uint32 p = pcard->pduel->game_field->core.reason_player;
pcard->pduel->game_field->core.limit_xyz = materials; pcard->pduel->game_field->core.limit_xyz = materials;
lua_pushboolean(L, pcard->is_special_summonable(p)); lua_pushboolean(L, pcard->is_special_summonable(p, SUMMON_TYPE_XYZ));
return 1; return 1;
} }
int32 scriptlib::card_is_can_be_summoned(lua_State *L) { int32 scriptlib::card_is_can_be_summoned(lua_State *L) {
......
...@@ -233,7 +233,7 @@ int32 scriptlib::duel_special_summon_rule(lua_State *L) { ...@@ -233,7 +233,7 @@ int32 scriptlib::duel_special_summon_rule(lua_State *L) {
return 0; return 0;
card* pcard = *(card**)lua_touserdata(L, 2); card* pcard = *(card**)lua_touserdata(L, 2);
duel * pduel = pcard->pduel; duel * pduel = pcard->pduel;
pduel->game_field->special_summon_rule(playerid, pcard); pduel->game_field->special_summon_rule(playerid, pcard, 0);
return lua_yield(L, 0); return lua_yield(L, 0);
} }
int32 scriptlib::duel_synchro_summon(lua_State *L) { int32 scriptlib::duel_synchro_summon(lua_State *L) {
...@@ -259,7 +259,7 @@ int32 scriptlib::duel_synchro_summon(lua_State *L) { ...@@ -259,7 +259,7 @@ int32 scriptlib::duel_synchro_summon(lua_State *L) {
duel * pduel = pcard->pduel; duel * pduel = pcard->pduel;
pduel->game_field->core.limit_tuner = tuner; pduel->game_field->core.limit_tuner = tuner;
pduel->game_field->core.limit_syn = mg; pduel->game_field->core.limit_syn = mg;
pduel->game_field->special_summon_rule(playerid, pcard); pduel->game_field->special_summon_rule(playerid, pcard, SUMMON_TYPE_SYNCHRO);
return lua_yield(L, 0); return lua_yield(L, 0);
} }
int32 scriptlib::duel_xyz_summon(lua_State *L) { int32 scriptlib::duel_xyz_summon(lua_State *L) {
...@@ -277,7 +277,7 @@ int32 scriptlib::duel_xyz_summon(lua_State *L) { ...@@ -277,7 +277,7 @@ int32 scriptlib::duel_xyz_summon(lua_State *L) {
} }
duel * pduel = pcard->pduel; duel * pduel = pcard->pduel;
pduel->game_field->core.limit_xyz = materials; pduel->game_field->core.limit_xyz = materials;
pduel->game_field->special_summon_rule(playerid, pcard); pduel->game_field->special_summon_rule(playerid, pcard, SUMMON_TYPE_XYZ);
return lua_yield(L, 0); return lua_yield(L, 0);
} }
int32 scriptlib::duel_setm(lua_State *L) { int32 scriptlib::duel_setm(lua_State *L) {
......
...@@ -129,8 +129,8 @@ void field::recover(effect* reason_effect, uint32 reason, uint32 reason_player, ...@@ -129,8 +129,8 @@ void field::recover(effect* reason_effect, uint32 reason, uint32 reason_player,
void field::summon(uint32 sumplayer, card* target, effect* proc, uint32 ignore_count, uint32 min_tribute) { void field::summon(uint32 sumplayer, card* target, effect* proc, uint32 ignore_count, uint32 min_tribute) {
add_process(PROCESSOR_SUMMON_RULE, 0, proc, (group*)target, sumplayer, ignore_count + (min_tribute << 8)); add_process(PROCESSOR_SUMMON_RULE, 0, proc, (group*)target, sumplayer, ignore_count + (min_tribute << 8));
} }
void field::special_summon_rule(uint32 sumplayer, card* target) { void field::special_summon_rule(uint32 sumplayer, card* target, uint32 summon_type) {
add_process(PROCESSOR_SPSUMMON_RULE, 0, 0, (group*)target, sumplayer, 0); add_process(PROCESSOR_SPSUMMON_RULE, 0, 0, (group*)target, sumplayer, summon_type);
} }
void field::special_summon(card_set* target, uint32 sumtype, uint32 sumplayer, uint32 playerid, uint32 nocheck, uint32 nolimit, uint32 positions) { void field::special_summon(card_set* target, uint32 sumtype, uint32 sumplayer, uint32 playerid, uint32 nocheck, uint32 nolimit, uint32 positions) {
if((positions & POS_FACEDOWN) && is_player_affected_by_effect(sumplayer, EFFECT_DEVINE_LIGHT)) if((positions & POS_FACEDOWN) && is_player_affected_by_effect(sumplayer, EFFECT_DEVINE_LIGHT))
...@@ -1943,7 +1943,7 @@ int32 field::sset_g(uint16 step, uint8 setplayer, uint8 toplayer, group* ptarget ...@@ -1943,7 +1943,7 @@ int32 field::sset_g(uint16 step, uint8 setplayer, uint8 toplayer, group* ptarget
} }
return TRUE; return TRUE;
} }
int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card * target) { int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card * target, uint32 summon_type) {
switch(step) { switch(step) {
case 0: { case 0: {
if(!(target->data.type & TYPE_MONSTER)) if(!(target->data.type & TYPE_MONSTER))
...@@ -1970,7 +1970,7 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card * target) { ...@@ -1970,7 +1970,7 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card * target) {
card* tuner = core.limit_tuner; card* tuner = core.limit_tuner;
group* materials = core.limit_xyz; group* materials = core.limit_xyz;
group* syn = core.limit_syn; group* syn = core.limit_syn;
target->filter_spsummon_procedure(sumplayer, &eset); target->filter_spsummon_procedure(sumplayer, &eset, summon_type);
target->filter_spsummon_procedure_g(sumplayer, &eset); target->filter_spsummon_procedure_g(sumplayer, &eset);
core.limit_tuner = tuner; core.limit_tuner = tuner;
core.limit_xyz = materials; core.limit_xyz = materials;
......
...@@ -355,7 +355,7 @@ int32 field::process() { ...@@ -355,7 +355,7 @@ int32 field::process() {
return pduel->bufferlen; return pduel->bufferlen;
} }
case PROCESSOR_SPSUMMON_RULE: { case PROCESSOR_SPSUMMON_RULE: {
if (special_summon_rule(it->step, it->arg1, (card*)it->ptarget)) if (special_summon_rule(it->step, it->arg1, (card*)it->ptarget, it->arg2))
core.units.pop_front(); core.units.pop_front();
else else
core.units.begin()->step++; core.units.begin()->step++;
...@@ -2619,7 +2619,7 @@ int32 field::process_idle_command(uint16 step) { ...@@ -2619,7 +2619,7 @@ int32 field::process_idle_command(uint16 step) {
pcard = eset[i]->handler; pcard = eset[i]->handler;
if(!eset[i]->check_count_limit(pcard->current.controler)) if(!eset[i]->check_count_limit(pcard->current.controler))
continue; continue;
if(pcard->current.controler == infos.turn_player && pcard->is_special_summonable(infos.turn_player)) if(pcard->current.controler == infos.turn_player && pcard->is_special_summonable(infos.turn_player, 0))
core.spsummonable_cards.push_back(pcard); core.spsummonable_cards.push_back(pcard);
} }
eset.clear(); eset.clear();
...@@ -2740,7 +2740,7 @@ int32 field::process_idle_command(uint16 step) { ...@@ -2740,7 +2740,7 @@ int32 field::process_idle_command(uint16 step) {
} }
case 6: { case 6: {
card* target = core.spsummonable_cards[returns.ivalue[0] >> 16]; card* target = core.spsummonable_cards[returns.ivalue[0] >> 16];
special_summon_rule(infos.turn_player, target); special_summon_rule(infos.turn_player, target, 0);
core.units.begin()->step = -1; core.units.begin()->step = -1;
return FALSE; return FALSE;
} }
......
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