Commit c036f2fc authored by salix5's avatar salix5 Committed by GitHub

add struct material_info (#399)

class card
is_spsummonable(), is_special_summonable(), filter_spsummon_procedure()
Now they will use arguments just like normal functions.
parent 086a268d
...@@ -2686,7 +2686,7 @@ int32 card::check_set_procedure(effect* proc, uint8 playerid, uint8 ignore_count ...@@ -2686,7 +2686,7 @@ int32 card::check_set_procedure(effect* proc, uint8 playerid, uint8 ignore_count
return is_summonable(proc, min_tribute, zone); return is_summonable(proc, min_tribute, zone);
return FALSE; return FALSE;
} }
void card::filter_spsummon_procedure(uint8 playerid, effect_set* peset, uint32 summon_type) { void card::filter_spsummon_procedure(uint8 playerid, effect_set* peset, uint32 summon_type, material_info info) {
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;
...@@ -2703,7 +2703,7 @@ void card::filter_spsummon_procedure(uint8 playerid, effect_set* peset, uint32 s ...@@ -2703,7 +2703,7 @@ void card::filter_spsummon_procedure(uint8 playerid, effect_set* peset, uint32 s
topos = POS_FACEUP; topos = POS_FACEUP;
toplayer = playerid; toplayer = playerid;
} }
if(peffect->is_available() && peffect->check_count_limit(playerid) && is_spsummonable(peffect) if(peffect->is_available() && peffect->check_count_limit(playerid) && is_spsummonable(peffect, info)
&& ((topos & POS_FACEDOWN) || !pduel->game_field->check_unique_onfield(this, toplayer, LOCATION_MZONE))) { && ((topos & POS_FACEDOWN) || !pduel->game_field->check_unique_onfield(this, toplayer, LOCATION_MZONE))) {
effect* sumeffect = pduel->game_field->core.reason_effect; effect* sumeffect = pduel->game_field->core.reason_effect;
if(!sumeffect) if(!sumeffect)
...@@ -3022,7 +3022,8 @@ int32 card::is_fusion_summonable_card(uint32 summon_type) { ...@@ -3022,7 +3022,8 @@ int32 card::is_fusion_summonable_card(uint32 summon_type) {
} }
return TRUE; return TRUE;
} }
int32 card::is_spsummonable(effect* proc) { // check the condition function of proc
int32 card::is_spsummonable(effect* proc, material_info info) {
effect* oreason = pduel->game_field->core.reason_effect; effect* oreason = pduel->game_field->core.reason_effect;
uint8 op = pduel->game_field->core.reason_player; uint8 op = pduel->game_field->core.reason_player;
pduel->game_field->core.reason_effect = proc; pduel->game_field->core.reason_effect = proc;
...@@ -3031,34 +3032,34 @@ int32 card::is_spsummonable(effect* proc) { ...@@ -3031,34 +3032,34 @@ int32 card::is_spsummonable(effect* proc) {
pduel->lua->add_param(proc, PARAM_TYPE_EFFECT); pduel->lua->add_param(proc, PARAM_TYPE_EFFECT);
pduel->lua->add_param(this, PARAM_TYPE_CARD); pduel->lua->add_param(this, PARAM_TYPE_CARD);
uint32 result = FALSE; uint32 result = FALSE;
if(pduel->game_field->core.limit_tuner || pduel->game_field->core.limit_syn) { if(info.limit_tuner || info.limit_syn) {
pduel->lua->add_param(pduel->game_field->core.limit_tuner, PARAM_TYPE_CARD); pduel->lua->add_param(info.limit_tuner, PARAM_TYPE_CARD);
pduel->lua->add_param(pduel->game_field->core.limit_syn, PARAM_TYPE_GROUP); pduel->lua->add_param(info.limit_syn, PARAM_TYPE_GROUP);
uint32 param_count = 4; uint32 param_count = 4;
if(pduel->game_field->core.limit_syn_minc) { if(info.limit_syn_minc) {
pduel->lua->add_param(pduel->game_field->core.limit_syn_minc, PARAM_TYPE_INT); pduel->lua->add_param(info.limit_syn_minc, PARAM_TYPE_INT);
pduel->lua->add_param(pduel->game_field->core.limit_syn_maxc, PARAM_TYPE_INT); pduel->lua->add_param(info.limit_syn_maxc, PARAM_TYPE_INT);
param_count = 6; param_count = 6;
} }
if(pduel->lua->check_condition(proc->condition, param_count)) if(pduel->lua->check_condition(proc->condition, param_count))
result = TRUE; result = TRUE;
} else if(pduel->game_field->core.limit_xyz) { } else if(info.limit_xyz) {
pduel->lua->add_param(pduel->game_field->core.limit_xyz, PARAM_TYPE_GROUP); pduel->lua->add_param(info.limit_xyz, PARAM_TYPE_GROUP);
uint32 param_count = 3; uint32 param_count = 3;
if(pduel->game_field->core.limit_xyz_minc) { if(info.limit_xyz_minc) {
pduel->lua->add_param(pduel->game_field->core.limit_xyz_minc, PARAM_TYPE_INT); pduel->lua->add_param(info.limit_xyz_minc, PARAM_TYPE_INT);
pduel->lua->add_param(pduel->game_field->core.limit_xyz_maxc, PARAM_TYPE_INT); pduel->lua->add_param(info.limit_xyz_maxc, PARAM_TYPE_INT);
param_count = 5; param_count = 5;
} }
if(pduel->lua->check_condition(proc->condition, param_count)) if(pduel->lua->check_condition(proc->condition, param_count))
result = TRUE; result = TRUE;
} else if(pduel->game_field->core.limit_link || pduel->game_field->core.limit_link_card) { } else if(info.limit_link || info.limit_link_card) {
pduel->lua->add_param(pduel->game_field->core.limit_link, PARAM_TYPE_GROUP); pduel->lua->add_param(info.limit_link, PARAM_TYPE_GROUP);
pduel->lua->add_param(pduel->game_field->core.limit_link_card, PARAM_TYPE_CARD); pduel->lua->add_param(info.limit_link_card, PARAM_TYPE_CARD);
uint32 param_count = 4; uint32 param_count = 4;
if(pduel->game_field->core.limit_link_minc) { if(info.limit_link_minc) {
pduel->lua->add_param(pduel->game_field->core.limit_link_minc, PARAM_TYPE_INT); pduel->lua->add_param(info.limit_link_minc, PARAM_TYPE_INT);
pduel->lua->add_param(pduel->game_field->core.limit_link_maxc, PARAM_TYPE_INT); pduel->lua->add_param(info.limit_link_maxc, PARAM_TYPE_INT);
param_count = 6; param_count = 6;
} }
if(pduel->lua->check_condition(proc->condition, param_count)) if(pduel->lua->check_condition(proc->condition, param_count))
...@@ -3234,7 +3235,7 @@ int32 card::is_can_be_flip_summoned(uint8 playerid) { ...@@ -3234,7 +3235,7 @@ int32 card::is_can_be_flip_summoned(uint8 playerid) {
} }
// check if this can be sp_summoned by EFFECT_SPSUMMON_PROC // check if this can be sp_summoned by EFFECT_SPSUMMON_PROC
// call filter_spsummon_procedure() // call filter_spsummon_procedure()
int32 card::is_special_summonable(uint8 playerid, uint32 summon_type) { int32 card::is_special_summonable(uint8 playerid, uint32 summon_type, material_info info) {
if(!(data.type & TYPE_MONSTER)) if(!(data.type & TYPE_MONSTER))
return FALSE; return FALSE;
if(is_affected_by_effect(EFFECT_CANNOT_SPECIAL_SUMMON)) if(is_affected_by_effect(EFFECT_CANNOT_SPECIAL_SUMMON))
...@@ -3247,7 +3248,7 @@ int32 card::is_special_summonable(uint8 playerid, uint32 summon_type) { ...@@ -3247,7 +3248,7 @@ int32 card::is_special_summonable(uint8 playerid, uint32 summon_type) {
return FALSE; return FALSE;
} }
effect_set eset; effect_set eset;
filter_spsummon_procedure(playerid, &eset, summon_type); filter_spsummon_procedure(playerid, &eset, summon_type, info);
pduel->game_field->restore_lp_cost(); pduel->game_field->restore_lp_cost();
return eset.size(); return eset.size();
} }
......
...@@ -91,6 +91,28 @@ struct query_cache { ...@@ -91,6 +91,28 @@ struct query_cache {
uint32 link_marker; uint32 link_marker;
}; };
struct material_info {
// Synchron
card* limit_tuner;
group* limit_syn;
int32 limit_syn_minc;
int32 limit_syn_maxc;
// Xyz
group* limit_xyz;
int32 limit_xyz_minc;
int32 limit_xyz_maxc;
// Link
group* limit_link;
card* limit_link_card;
int32 limit_link_minc;
int32 limit_link_maxc;
material_info()
: limit_tuner(nullptr), limit_syn(nullptr), limit_syn_minc(0), limit_syn_maxc(0), limit_xyz(nullptr), limit_xyz_minc(0), limit_xyz_maxc(0),
limit_link(nullptr), limit_link_card(nullptr), limit_link_minc(0), limit_link_maxc(0) {}
};
const material_info null_info;
class card { class card {
public: public:
struct effect_relation_hash { struct effect_relation_hash {
...@@ -299,7 +321,7 @@ public: ...@@ -299,7 +321,7 @@ public:
int32 check_summon_procedure(effect* proc, uint8 playerid, uint8 ignore_count, uint8 min_tribute, uint32 zone); int32 check_summon_procedure(effect* proc, uint8 playerid, uint8 ignore_count, uint8 min_tribute, uint32 zone);
int32 filter_set_procedure(uint8 playerid, effect_set* eset, uint8 ignore_count, uint8 min_tribute, uint32 zone); int32 filter_set_procedure(uint8 playerid, effect_set* eset, uint8 ignore_count, uint8 min_tribute, uint32 zone);
int32 check_set_procedure(effect* proc, uint8 playerid, uint8 ignore_count, uint8 min_tribute, uint32 zone); int32 check_set_procedure(effect* proc, uint8 playerid, uint8 ignore_count, uint8 min_tribute, uint32 zone);
void filter_spsummon_procedure(uint8 playerid, effect_set* eset, uint32 summon_type); void filter_spsummon_procedure(uint8 playerid, effect_set* eset, uint32 summon_type, material_info info = null_info);
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);
...@@ -314,13 +336,13 @@ public: ...@@ -314,13 +336,13 @@ public:
int32 check_cost_condition(int32 ecode, int32 playerid, int32 sumtype); int32 check_cost_condition(int32 ecode, int32 playerid, int32 sumtype);
int32 is_summonable_card(); int32 is_summonable_card();
int32 is_fusion_summonable_card(uint32 summon_type); int32 is_fusion_summonable_card(uint32 summon_type);
int32 is_spsummonable(effect* proc); int32 is_spsummonable(effect* proc, material_info info = null_info);
int32 is_summonable(effect* proc, uint8 min_tribute, uint32 zone = 0x1f, uint32 releasable = 0xff00ff); int32 is_summonable(effect* proc, uint8 min_tribute, uint32 zone = 0x1f, uint32 releasable = 0xff00ff);
int32 is_can_be_summoned(uint8 playerid, uint8 ingore_count, effect* peffect, uint8 min_tribute, uint32 zone = 0x1f); int32 is_can_be_summoned(uint8 playerid, uint8 ingore_count, effect* peffect, uint8 min_tribute, uint32 zone = 0x1f);
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, uint32 summon_type); int32 is_special_summonable(uint8 playerid, uint32 summon_type, material_info info = null_info);
int32 is_can_be_special_summoned(effect* reason_effect, uint32 sumtype, uint8 sumpos, uint8 sumplayer, uint8 toplayer, uint8 nocheck, uint8 nolimit, uint32 zone); int32 is_can_be_special_summoned(effect* reason_effect, uint32 sumtype, uint8 sumpos, uint8 sumplayer, uint8 toplayer, uint8 nocheck, uint8 nolimit, uint32 zone);
int32 is_setable_mzone(uint8 playerid, uint8 ignore_count, effect* peffect, uint8 min_tribute, uint32 zone = 0x1f); int32 is_setable_mzone(uint8 playerid, uint8 ignore_count, effect* peffect, uint8 min_tribute, uint32 zone = 0x1f);
int32 is_setable_szone(uint8 playerid, uint8 ignore_fd = 0); int32 is_setable_szone(uint8 playerid, uint8 ignore_fd = 0);
......
...@@ -2102,15 +2102,12 @@ int32 scriptlib::card_is_synchro_summonable(lua_State *L) { ...@@ -2102,15 +2102,12 @@ int32 scriptlib::card_is_synchro_summonable(lua_State *L) {
if(lua_gettop(L) >= 5) if(lua_gettop(L) >= 5)
maxc = (int32)lua_tointeger(L, 5); maxc = (int32)lua_tointeger(L, 5);
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; material_info info;
pcard->pduel->game_field->core.limit_syn = mg; info.limit_tuner = tuner;
pcard->pduel->game_field->core.limit_syn_minc = minc; info.limit_syn = mg;
pcard->pduel->game_field->core.limit_syn_maxc = maxc; info.limit_syn_minc = minc;
int32 res = pcard->is_special_summonable(p, SUMMON_TYPE_SYNCHRO); info.limit_syn_maxc = maxc;
pcard->pduel->game_field->core.limit_tuner = 0; int32 res = pcard->is_special_summonable(p, SUMMON_TYPE_SYNCHRO, info);
pcard->pduel->game_field->core.limit_syn = 0;
pcard->pduel->game_field->core.limit_syn_minc = 0;
pcard->pduel->game_field->core.limit_syn_maxc = 0;
lua_pushboolean(L, res); lua_pushboolean(L, res);
return 1; return 1;
} }
...@@ -2134,13 +2131,11 @@ int32 scriptlib::card_is_xyz_summonable(lua_State *L) { ...@@ -2134,13 +2131,11 @@ int32 scriptlib::card_is_xyz_summonable(lua_State *L) {
if(lua_gettop(L) >= 4) if(lua_gettop(L) >= 4)
maxc = (int32)lua_tointeger(L, 4); maxc = (int32)lua_tointeger(L, 4);
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; material_info info;
pcard->pduel->game_field->core.limit_xyz_minc = minc; info.limit_xyz = materials;
pcard->pduel->game_field->core.limit_xyz_maxc = maxc; info.limit_xyz_minc = minc;
int32 res = pcard->is_special_summonable(p, SUMMON_TYPE_XYZ); info.limit_xyz_maxc = maxc;
pcard->pduel->game_field->core.limit_xyz = 0; int32 res = pcard->is_special_summonable(p, SUMMON_TYPE_XYZ, info);
pcard->pduel->game_field->core.limit_xyz_minc = 0;
pcard->pduel->game_field->core.limit_xyz_maxc = 0;
lua_pushboolean(L, res); lua_pushboolean(L, res);
return 1; return 1;
} }
...@@ -2171,15 +2166,12 @@ int32 scriptlib::card_is_link_summonable(lua_State *L) { ...@@ -2171,15 +2166,12 @@ int32 scriptlib::card_is_link_summonable(lua_State *L) {
if(lua_gettop(L) >= 5) if(lua_gettop(L) >= 5)
maxc = (int32)lua_tointeger(L, 5); maxc = (int32)lua_tointeger(L, 5);
uint32 p = pcard->pduel->game_field->core.reason_player; uint32 p = pcard->pduel->game_field->core.reason_player;
pcard->pduel->game_field->core.limit_link = materials; material_info info;
pcard->pduel->game_field->core.limit_link_card = lcard; info.limit_link = materials;
pcard->pduel->game_field->core.limit_link_minc = minc; info.limit_link_card = lcard;
pcard->pduel->game_field->core.limit_link_maxc = maxc; info.limit_link_minc = minc;
int32 res = pcard->is_special_summonable(p, SUMMON_TYPE_LINK); info.limit_link_maxc = maxc;
pcard->pduel->game_field->core.limit_link = 0; int32 res = pcard->is_special_summonable(p, SUMMON_TYPE_LINK, info);
pcard->pduel->game_field->core.limit_link_card = 0;
pcard->pduel->game_field->core.limit_link_minc = 0;
pcard->pduel->game_field->core.limit_link_maxc = 0;
lua_pushboolean(L, res); lua_pushboolean(L, res);
return 1; return 1;
} }
......
...@@ -2592,30 +2592,20 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin ...@@ -2592,30 +2592,20 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
switch(step) { switch(step) {
case 0: { case 0: {
effect_set eset; effect_set eset;
card* tuner = core.limit_tuner; material_info info;
group* syn = core.limit_syn; info.limit_tuner = core.limit_tuner;
int32 sminc = core.limit_syn_minc; info.limit_syn = core.limit_syn;
int32 smaxc = core.limit_syn_maxc; info.limit_syn_minc = core.limit_syn_minc;
group* xmaterials = core.limit_xyz; info.limit_syn_maxc = core.limit_syn_maxc;
int32 xminc = core.limit_xyz_minc; info.limit_xyz = core.limit_xyz;
int32 xmaxc = core.limit_xyz_maxc; info.limit_xyz_minc = core.limit_xyz_minc;
group* lmaterials = core.limit_link; info.limit_xyz_maxc = core.limit_xyz_maxc;
card* lcard = core.limit_link_card; info.limit_link = core.limit_link;
int32 lminc = core.limit_link_minc; info.limit_link_card = core.limit_link_card;
int32 lmaxc = core.limit_link_maxc; info.limit_link_minc = core.limit_link_minc;
target->filter_spsummon_procedure(sumplayer, &eset, summon_type); info.limit_link_maxc = core.limit_link_maxc;
target->filter_spsummon_procedure(sumplayer, &eset, summon_type, info);
target->filter_spsummon_procedure_g(sumplayer, &eset); target->filter_spsummon_procedure_g(sumplayer, &eset);
core.limit_tuner = tuner;
core.limit_syn = syn;
core.limit_syn_minc = sminc;
core.limit_syn_maxc = smaxc;
core.limit_xyz = xmaterials;
core.limit_xyz_minc = xminc;
core.limit_xyz_maxc = xmaxc;
core.limit_link = lmaterials;
core.limit_link_card = lcard;
core.limit_link_minc = lminc;
core.limit_link_maxc = lmaxc;
if(!eset.size()) if(!eset.size())
return TRUE; return TRUE;
core.select_effects.clear(); core.select_effects.clear();
......
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