Commit 108ab49d authored by salix5's avatar salix5

summon/set procedure

Now EFFECT_SUMMON_PROC, EFFECT_LIMIT_SUMMON_PROC, EFFECT_SET_PROC,
EFFECT_LIMIT_SET_PROC effects have to keep a record of their tribute
number in value
Ex. SUMMON_TYPE_ADVANCE+2

filter_summon_procedure() will check if:
1. tribute number >= min_tribute
2. there are enough slots
3. there are enough tributes

EFFECT_TRIPLE_TRIBUTE is currently removed since it doesn't not work.
parent 47ad4fa9
This diff is collapsed.
......@@ -246,8 +246,8 @@ public:
int32 check_fusion_substitute(card* fcard);
int32 is_equipable(card* pcard);
int32 is_summonable();
int32 is_summonable(effect* peffect);
int32 is_summonable_card();
int32 is_spsummonable(effect* peffect);
int32 is_summonable(effect* peffect, uint8 min_tribute);
int32 is_can_be_summoned(uint8 playerid, uint8 ingore_count, effect* peffect, uint8 min_tribute);
int32 get_summon_tribute_count();
......
......@@ -315,7 +315,7 @@ inline effect_flag operator|(effect_flag flag1, effect_flag flag2)
#define EFFECT_EXTRA_RELEASE 153
#define EFFECT_TRIBUTE_LIMIT 154
#define EFFECT_EXTRA_RELEASE_SUM 155
#define EFFECT_TRIPLE_TRIBUTE 156
//#define EFFECT_TRIPLE_TRIBUTE 156
#define EFFECT_PUBLIC 160
#define EFFECT_COUNTER_PERMIT 0x10000
#define EFFECT_COUNTER_LIMIT 0x20000
......
......@@ -491,8 +491,9 @@ int32 field::is_location_useable(uint8 playerid, uint8 location, uint8 sequence)
return FALSE;
return TRUE;
}
// return: usable count of LOCATION_MZONE or real LOCATION_SZONE
// store local flag in list
// uplayer: request player, PLAYER_NONE means ignoring EFFECT_MAX_MZONE, EFFECT_MAX_SZONE
// list: store local flag in list
// return: usable count of LOCATION_MZONE or real LOCATION_SZONE of plaerid requested by uplayer (may be negative)
int32 field::get_useable_count(uint8 playerid, uint8 location, uint8 uplayer, uint32 reason, uint32* list) {
if (location != LOCATION_MZONE && location != LOCATION_SZONE)
return 0;
......@@ -1251,7 +1252,15 @@ int32 field::check_release_list(uint8 playerid, int32 count, int32 use_con, int3
}
return FALSE;
}
// ex: the procedure of target can release opponent monster
// return: the max release count of mg or all monsters on field
int32 field::get_summon_release_list(card* target, card_set* release_list, card_set* ex_list, card_set* ex_list_sum, group* mg, uint32 ex) {
int32 m1 = get_summon_release_slist(target, release_list, mg);
int32 m2 = get_summon_release_olist(target, ex_list, ex_list_sum, mg, ex);
return m1 + m2;
}
//
int32 field::get_summon_release_slist(card* target, card_set* release_list, group* mg) {
uint8 p = target->current.controler;
card* pcard;
uint32 rcount = 0;
......@@ -1262,28 +1271,31 @@ int32 field::get_summon_release_list(card* target, card_set* release_list, card_
continue;
if(release_list)
release_list->insert(pcard);
if(pcard->is_affected_by_effect(EFFECT_TRIPLE_TRIBUTE, target))
pcard->release_param = 3;
else if(pcard->is_affected_by_effect(EFFECT_DOUBLE_TRIBUTE, target))
if(pcard->is_affected_by_effect(EFFECT_DOUBLE_TRIBUTE, target))
pcard->release_param = 2;
else
pcard->release_param = 1;
rcount += pcard->release_param;
}
}
return rcount;
}
//
int32 field::get_summon_release_olist(card* target, card_set* ex_list, card_set* ex_list_sum, group* mg, uint32 ex) {
uint8 p = target->current.controler;
card* pcard;
uint32 rcount = 0;
uint32 ex_sum_max = 0;
for(int i = 0; i < 5; ++i) {
pcard = player[1 - p].list_mzone[i];
if(!(pcard && pcard->is_releasable_by_summon(p, target)))
if(!pcard || pcard->is_releasable_by_summon(p, target))
continue;
if(mg && !mg->has_card(pcard))
continue;
if(ex || pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE)) {
if(ex_list)
ex_list->insert(pcard);
if(pcard->is_affected_by_effect(EFFECT_TRIPLE_TRIBUTE, target))
pcard->release_param = 3;
else if(pcard->is_affected_by_effect(EFFECT_DOUBLE_TRIBUTE, target))
if(pcard->is_affected_by_effect(EFFECT_DOUBLE_TRIBUTE, target))
pcard->release_param = 2;
else
pcard->release_param = 1;
......@@ -1294,9 +1306,7 @@ int32 field::get_summon_release_list(card* target, card_set* release_list, card_
continue;
if(ex_list_sum)
ex_list_sum->insert(pcard);
if(pcard->is_affected_by_effect(EFFECT_TRIPLE_TRIBUTE, target))
pcard->release_param = 3;
else if(pcard->is_affected_by_effect(EFFECT_DOUBLE_TRIBUTE, target))
if(pcard->is_affected_by_effect(EFFECT_DOUBLE_TRIBUTE, target))
pcard->release_param = 2;
else
pcard->release_param = 1;
......@@ -1531,7 +1541,7 @@ void field::remove_unique_card(card* pcard) {
if(pcard->unique_pos[1])
core.unique_cards[1 - con].erase(pcard);
}
// return: pcard->unique_effect or 0
effect* field::check_unique_onfield(card* pcard, uint8 controler, uint8 location) {
if(!pcard->unique_code)
return 0;
......@@ -2304,7 +2314,7 @@ int32 field::is_player_can_summon(uint32 sumtype, uint8 playerid, card * pcard)
pduel->lua->add_param(pcard, PARAM_TYPE_CARD);
pduel->lua->add_param(playerid, PARAM_TYPE_INT);
pduel->lua->add_param(sumtype, PARAM_TYPE_INT);
if (pduel->lua->check_condition(eset[i]->target, 4))
if(pduel->lua->check_condition(eset[i]->target, 4))
return FALSE;
}
return TRUE;
......
......@@ -363,7 +363,9 @@ public:
int32 get_release_list(uint8 playerid, card_set* release_list, card_set* ex_list, int32 use_con, int32 use_hand, int32 fun, int32 exarg, card* exp);
int32 check_release_list(uint8 playerid, int32 count, int32 use_con, int32 use_hand, int32 fun, int32 exarg, card* exp);
int32 get_summon_release_list(card* target, card_set* release_list, card_set* ex_list, card_set* ex_list_sum, group* mg = 0, uint32 ex = 0);
int32 get_summon_release_list(card* target, card_set* release_list, card_set* ex_list, card_set* ex_list_sum, group* mg = NULL, uint32 ex = 0);
int32 get_summon_release_slist(card* target, card_set* release_list, group* mg = NULL);
int32 get_summon_release_olist(card* target, card_set* ex_list, card_set* ex_list_sum, group* mg = NULL, uint32 ex = 0);
int32 get_summon_count_limit(uint8 playerid);
int32 get_draw_count(uint8 playerid);
void get_ritual_material(uint8 playerid, effect* peffect, card_set* material);
......
......@@ -1325,7 +1325,7 @@ int32 scriptlib::card_is_summonable(lua_State *L) {
check_param_count(L, 1);
check_param(L, PARAM_TYPE_CARD, 1);
card * pcard = *(card**) lua_touserdata(L, 1);
lua_pushboolean(L, pcard->is_summonable());
lua_pushboolean(L, pcard->is_summonable_card());
return 1;
}
int32 scriptlib::card_is_msetable(lua_State *L) {
......
......@@ -1989,7 +1989,7 @@ int32 scriptlib::duel_get_tribute_group(lua_State *L) {
card* target = *(card**) lua_touserdata(L, 1);
duel* pduel = interpreter::get_duel_info(L);
group* pgroup = pduel->new_group();
pduel->game_field->get_summon_release_list(target, &(pgroup->container), &(pgroup->container), 0);
pduel->game_field->get_summon_release_list(target, &(pgroup->container), &(pgroup->container), NULL);
interpreter::group2value(L, pgroup);
return 1;
}
......@@ -2011,7 +2011,7 @@ int32 scriptlib::duel_get_tribute_count(lua_State *L) {
if(lua_gettop(L) >= 3)
ex = lua_toboolean(L, 3);
duel* pduel = interpreter::get_duel_info(L);
lua_pushinteger(L, pduel->game_field->get_summon_release_list(target, 0, 0, 0, mg, ex));
lua_pushinteger(L, pduel->game_field->get_summon_release_list(target, NULL, NULL, NULL, mg, ex));
return 1;
}
int32 scriptlib::duel_select_tribute(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