Commit 70d40dac authored by nanahira's avatar nanahira

Merge branch 'master' of github.com:Fluorohydride/ygopro-core

parents 6d90b448 9663d39e
This diff is collapsed.
......@@ -297,9 +297,9 @@ public:
void filter_immune_effect();
void filter_disable_related_cards();
int32 filter_summon_procedure(uint8 playerid, effect_set* eset, uint8 ignore_count, uint8 min_tribute, uint32 zone);
int32 check_summon_procedure(effect* peffect, 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 check_set_procedure(effect* peffect, 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_g(uint8 playerid, effect_set* eset);
effect* is_affected_by_effect(int32 code);
......@@ -315,8 +315,8 @@ public:
int32 check_cost_condition(int32 ecode, int32 playerid, int32 sumtype);
int32 is_summonable_card();
int32 is_fusion_summonable_card(uint32 summon_type);
int32 is_spsummonable(effect* peffect);
int32 is_summonable(effect* peffect, uint8 min_tribute, uint32 zone = 0x1f, uint32 releasable = 0xff00ff);
int32 is_spsummonable(effect* proc);
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 get_summon_tribute_count();
int32 get_set_tribute_count();
......@@ -325,18 +325,18 @@ public:
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_szone(uint8 playerid, uint8 ignore_fd = 0, uint8 toplayer = 2, uint32 zone = 0xff);
int32 is_affect_by_effect(effect* peffect);
int32 is_affect_by_effect(effect* reason_effect);
int32 is_destructable();
int32 is_destructable_by_battle(card* pcard);
effect* check_indestructable_by_effect(effect* peffect, uint8 playerid);
int32 is_destructable_by_effect(effect* peffect, uint8 playerid);
effect* check_indestructable_by_effect(effect* reason_effect, uint8 playerid);
int32 is_destructable_by_effect(effect* reason_effect, uint8 playerid);
int32 is_removeable(uint8 playerid, uint8 pos, uint32 reason);
int32 is_removeable_as_cost(uint8 playerid, uint8 pos);
int32 is_attack_decreasable_as_cost(uint8 playerid, int32 val);
int32 is_defense_decreasable_as_cost(uint8 playerid, int32 val);
int32 is_releasable_by_summon(uint8 playerid, card* pcard);
int32 is_releasable_by_nonsummon(uint8 playerid);
int32 is_releasable_by_effect(uint8 playerid, effect* peffect);
int32 is_releasable_by_effect(uint8 playerid, effect* reason_effect);
int32 is_capable_send_to_grave(uint8 playerid);
int32 is_capable_send_to_hand(uint8 playerid);
int32 is_capable_send_to_deck(uint8 playerid);
......@@ -353,7 +353,7 @@ public:
int32 is_capable_change_control();
int32 is_control_can_be_changed(int32 ignore_mzone, uint32 zone);
int32 is_capable_be_battle_target(card* pcard);
int32 is_capable_be_effect_target(effect* peffect, uint8 playerid);
int32 is_capable_be_effect_target(effect* reason_effect, uint8 playerid);
int32 is_capable_overlay(uint8 playerid);
int32 is_can_be_fusion_material(card* fcard, uint32 summon_type);
int32 is_can_be_synchro_material(card* scard, card* tuner = 0);
......
......@@ -1292,6 +1292,11 @@ void field::remove_oath_effect(effect* reason_effect) {
}
}
}
void field::release_oath_relation(effect* reason_effect) {
for(auto& oeit : effects.oath)
if(oeit.second == reason_effect)
oeit.second = 0;
}
void field::reset_phase(uint32 phase) {
for(auto eit = effects.pheff.begin(); eit != effects.pheff.end();) {
auto rm = eit++;
......@@ -2901,7 +2906,7 @@ int32 field::is_player_can_discard_deck_as_cost(uint8 playerid, int32 count) {
}
return TRUE;
}
int32 field::is_player_can_discard_hand(uint8 playerid, card * pcard, effect * peffect, uint32 reason) {
int32 field::is_player_can_discard_hand(uint8 playerid, card * pcard, effect * reason_effect, uint32 reason) {
if(pcard->current.location != LOCATION_HAND)
return FALSE;
effect_set eset;
......@@ -2911,7 +2916,7 @@ int32 field::is_player_can_discard_hand(uint8 playerid, card * pcard, effect * p
return FALSE;
pduel->lua->add_param(eset[i], PARAM_TYPE_EFFECT);
pduel->lua->add_param(pcard, PARAM_TYPE_CARD);
pduel->lua->add_param(peffect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(reason_effect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(reason, PARAM_TYPE_INT);
if (pduel->lua->check_condition(eset[i]->target, 4))
return FALSE;
......@@ -2987,7 +2992,7 @@ int32 field::is_player_can_spsummon(uint8 playerid) {
}
return is_player_can_spsummon_count(playerid, 1);
}
int32 field::is_player_can_spsummon(effect* peffect, uint32 sumtype, uint8 sumpos, uint8 playerid, uint8 toplayer, card* pcard) {
int32 field::is_player_can_spsummon(effect* reason_effect, uint32 sumtype, uint8 sumpos, uint8 playerid, uint8 toplayer, card* pcard) {
if(pcard->is_affected_by_effect(EFFECT_CANNOT_SPECIAL_SUMMON))
return FALSE;
if(pcard->is_status(STATUS_FORBIDDEN))
......@@ -3018,7 +3023,7 @@ int32 field::is_player_can_spsummon(effect* peffect, uint32 sumtype, uint8 sumpo
pduel->lua->add_param(sumtype, PARAM_TYPE_INT);
pduel->lua->add_param(sumpos, PARAM_TYPE_INT);
pduel->lua->add_param(toplayer, PARAM_TYPE_INT);
pduel->lua->add_param(peffect, PARAM_TYPE_EFFECT);
pduel->lua->add_param(reason_effect, PARAM_TYPE_EFFECT);
if (pduel->lua->check_condition(eset[i]->target, 7))
return FALSE;
}
......
......@@ -393,6 +393,7 @@ public:
void add_effect(effect* peffect, uint8 owner_player = 2);
void remove_effect(effect* peffect);
void remove_oath_effect(effect* reason_effect);
void release_oath_relation(effect* reason_effect);
void reset_phase(uint32 phase);
void reset_chain();
void add_effect_code(uint32 code, uint32 playerid);
......@@ -457,13 +458,13 @@ public:
int32 is_player_can_draw(uint8 playerid);
int32 is_player_can_discard_deck(uint8 playerid, int32 count);
int32 is_player_can_discard_deck_as_cost(uint8 playerid, int32 count);
int32 is_player_can_discard_hand(uint8 playerid, card* pcard, effect* peffect, uint32 reason);
int32 is_player_can_discard_hand(uint8 playerid, card* pcard, effect* reason_effect, uint32 reason);
int32 is_player_can_action(uint8 playerid, uint32 actionlimit);
int32 is_player_can_summon(uint32 sumtype, uint8 playerid, card* pcard, uint8 toplayer);
int32 is_player_can_mset(uint32 sumtype, uint8 playerid, card* pcard, uint8 toplayer);
int32 is_player_can_sset(uint8 playerid, card* pcard);
int32 is_player_can_spsummon(uint8 playerid);
int32 is_player_can_spsummon(effect* peffect, uint32 sumtype, uint8 sumpos, uint8 playerid, uint8 toplayer, card* pcard);
int32 is_player_can_spsummon(effect* reason_effect, uint32 sumtype, uint8 sumpos, uint8 playerid, uint8 toplayer, card* pcard);
int32 is_player_can_flipsummon(uint8 playerid, card* pcard);
int32 is_player_can_spsummon_monster(uint8 playerid, uint8 toplayer, uint8 sumpos, uint32 sumtype, card_data* pdata);
int32 is_player_can_spsummon_count(uint8 playerid, uint32 count);
......
......@@ -1628,8 +1628,8 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui
core.units.begin()->ptr1 = 0;
return FALSE;
}
effect* peffect = core.select_effects[returns.ivalue[0]];
core.units.begin()->peffect = peffect;
effect* proc = core.select_effects[returns.ivalue[0]];
core.units.begin()->peffect = proc;
core.select_effects.clear();
core.select_options.clear();
if(ignore_count || core.summon_count[sumplayer] < get_summon_count_limit(sumplayer)) {
......@@ -1644,10 +1644,10 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui
int32 new_zone = retval.size() > 1 ? retval[1] : 0x1f;
int32 releasable = retval.size() > 2 ? (retval[2] < 0 ? 0xff00ff + retval[2] : retval[2]) : 0xff00ff;
new_zone &= zone;
if(peffect) {
if(proc) {
if(new_min_tribute < (int32)min_tribute)
new_min_tribute = min_tribute;
if(!target->is_summonable(peffect, new_min_tribute, new_zone, releasable))
if(!target->is_summonable(proc, new_min_tribute, new_zone, releasable))
continue;
} else {
int32 rcount = target->get_summon_tribute_count();
......@@ -1758,12 +1758,17 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui
}
effect_set eset;
target->filter_effect(EFFECT_SUMMON_COST, &eset);
if(eset.size()) {
for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->operation) {
core.sub_solving_event.push_back(nil_event);
add_process(PROCESSOR_EXECUTE_OPERATION, 0, eset[i], 0, sumplayer, 0);
}
}
effect_set* peset = new effect_set;
*peset = std::move(eset);
core.units.begin()->ptr2 = peset;
}
return FALSE;
}
case 5: {
......@@ -1982,6 +1987,12 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui
dec_effect_code(proc->count_code, sumplayer);
}
}
if(effect_set* peset = (effect_set*)core.units.begin()->ptr2) {
for(int32 i = 0; i < peset->size(); ++i)
remove_oath_effect(peset->at(i));
delete peset;
core.units.begin()->ptr2 = 0;
}
if(target->current.location == LOCATION_MZONE)
send_to(target, 0, REASON_RULE, sumplayer, sumplayer, LOCATION_GRAVE, 0, 0);
adjust_instant();
......@@ -1990,9 +2001,13 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui
}
case 15: {
if(proc) {
for(auto& oeit : effects.oath)
if(oeit.second == proc)
oeit.second = 0;
release_oath_relation(proc);
}
if(effect_set* peset = (effect_set*)core.units.begin()->ptr2) {
for(int32 i = 0; i < peset->size(); ++i)
release_oath_relation(peset->at(i));
delete peset;
core.units.begin()->ptr2 = 0;
}
target->set_status(STATUS_SUMMONING, FALSE);
target->set_status(STATUS_SUMMON_TURN, TRUE);
......@@ -2043,12 +2058,17 @@ int32 field::flip_summon(uint16 step, uint8 sumplayer, card * target) {
return TRUE;
effect_set eset;
target->filter_effect(EFFECT_FLIPSUMMON_COST, &eset);
if(eset.size()) {
for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->operation) {
core.sub_solving_event.push_back(nil_event);
add_process(PROCESSOR_EXECUTE_OPERATION, 0, eset[i], 0, sumplayer, 0);
}
}
effect_set* peset = new effect_set;
*peset = std::move(eset);
core.units.begin()->ptr1 = peset;
}
return FALSE;
}
case 1: {
......@@ -2073,12 +2093,24 @@ int32 field::flip_summon(uint16 step, uint8 sumplayer, card * target) {
case 2: {
if(target->is_status(STATUS_SUMMONING))
return FALSE;
if(effect_set* peset = (effect_set*)core.units.begin()->ptr1) {
for(int32 i = 0; i < peset->size(); ++i)
remove_oath_effect(peset->at(i));
delete peset;
core.units.begin()->ptr1 = 0;
}
if(target->current.location == LOCATION_MZONE)
send_to(target, 0, REASON_RULE, sumplayer, sumplayer, LOCATION_GRAVE, 0, 0);
add_process(PROCESSOR_POINT_EVENT, 0, 0, 0, FALSE, 0);
return TRUE;
}
case 3: {
if(effect_set* peset = (effect_set*)core.units.begin()->ptr1) {
for(int32 i = 0; i < peset->size(); ++i)
release_oath_relation(peset->at(i));
delete peset;
core.units.begin()->ptr1 = 0;
}
target->set_status(STATUS_SUMMONING, FALSE);
target->enable_field_effect(true);
if(target->is_status(STATUS_DISABLED))
......@@ -2164,8 +2196,8 @@ int32 field::mset(uint16 step, uint8 setplayer, card* target, effect* proc, uint
core.units.begin()->ptr1 = 0;
return FALSE;
}
effect* peffect = core.select_effects[returns.ivalue[0]];
core.units.begin()->peffect = peffect;
effect* proc = core.select_effects[returns.ivalue[0]];
core.units.begin()->peffect = proc;
core.select_effects.clear();
core.select_options.clear();
if(ignore_count || core.summon_count[setplayer] < get_summon_count_limit(setplayer)) {
......@@ -2180,10 +2212,10 @@ int32 field::mset(uint16 step, uint8 setplayer, card* target, effect* proc, uint
int32 new_zone = retval.size() > 1 ? retval[1] : 0x1f;
int32 releasable = retval.size() > 2 ? (retval[2] < 0 ? 0xff00ff + retval[2] : retval[2]) : 0xff00ff;
new_zone &= zone;
if(peffect) {
if(proc) {
if(new_min_tribute < (int32)min_tribute)
new_min_tribute = min_tribute;
if(!target->is_summonable(peffect, new_min_tribute, new_zone, releasable))
if(!target->is_summonable(proc, new_min_tribute, new_zone, releasable))
continue;
} else {
int32 rcount = target->get_set_tribute_count();
......@@ -2702,12 +2734,17 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
return TRUE;
effect_set eset;
target->filter_effect(EFFECT_SPSUMMON_COST, &eset);
if(eset.size()) {
for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->operation) {
core.sub_solving_event.push_back(nil_event);
add_process(PROCESSOR_EXECUTE_OPERATION, 0, eset[i], 0, sumplayer, 0);
}
}
effect_set* peset = new effect_set;
*peset = std::move(eset);
core.units.begin()->ptr1 = peset;
}
return FALSE;
}
case 3: {
......@@ -2853,6 +2890,12 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
if(peffect->is_flag(EFFECT_FLAG_COUNT_LIMIT) && (peffect->count_code & EFFECT_COUNT_CODE_OATH)) {
dec_effect_code(peffect->count_code, sumplayer);
}
if(effect_set* peset = (effect_set*)core.units.begin()->ptr1) {
for(int32 i = 0; i < peset->size(); ++i)
remove_oath_effect(peset->at(i));
delete peset;
core.units.begin()->ptr1 = 0;
}
if(target->current.location == LOCATION_MZONE)
send_to(target, 0, REASON_RULE, sumplayer, sumplayer, LOCATION_GRAVE, 0, 0);
adjust_instant();
......@@ -2860,9 +2903,13 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
return TRUE;
}
case 15: {
for(auto& oeit : effects.oath)
if(oeit.second == core.units.begin()->peffect)
oeit.second = 0;
release_oath_relation(core.units.begin()->peffect);
if(effect_set* peset = (effect_set*)core.units.begin()->ptr1) {
for(int32 i = 0; i < peset->size(); ++i)
release_oath_relation(peset->at(i));
delete peset;
core.units.begin()->ptr1 = 0;
}
target->set_status(STATUS_SUMMONING, FALSE);
target->set_status(STATUS_PROC_COMPLETE | STATUS_SPSUMMON_TURN, TRUE);
target->enable_field_effect(true);
......@@ -2931,12 +2978,17 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
}
effect_set eset;
pcard->filter_effect(EFFECT_SPSUMMON_COST, &eset);
if(eset.size()) {
for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->operation) {
core.sub_solving_event.push_back(nil_event);
add_process(PROCESSOR_EXECUTE_OPERATION, 0, eset[i], 0, sumplayer, 0);
}
}
effect_set* peset = new effect_set;
*peset = std::move(eset);
core.units.begin()->ptr1 = peset;
}
}
return FALSE;
}
......@@ -3032,6 +3084,12 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
if(peffect->is_flag(EFFECT_FLAG_COUNT_LIMIT) && (peffect->count_code & EFFECT_COUNT_CODE_OATH)) {
dec_effect_code(peffect->count_code, sumplayer);
}
if(effect_set* peset = (effect_set*)core.units.begin()->ptr1) {
for(int32 i = 0; i < peset->size(); ++i)
remove_oath_effect(peset->at(i));
delete peset;
core.units.begin()->ptr1 = 0;
}
add_process(PROCESSOR_POINT_EVENT, 0, 0, 0, FALSE, 0);
return TRUE;
}
......@@ -3039,9 +3097,13 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
}
case 27: {
group* pgroup = core.units.begin()->ptarget;
for(auto& oeit : effects.oath)
if(oeit.second == core.units.begin()->peffect)
oeit.second = 0;
release_oath_relation(core.units.begin()->peffect);
if(effect_set* peset = (effect_set*)core.units.begin()->ptr1) {
for(int32 i = 0; i < peset->size(); ++i)
release_oath_relation(peset->at(i));
delete peset;
core.units.begin()->ptr1 = 0;
}
for(auto& pcard : pgroup->container) {
pcard->set_status(STATUS_SUMMONING, FALSE);
pcard->set_status(STATUS_SPSUMMON_TURN, TRUE);
......@@ -3121,15 +3183,26 @@ int32 field::special_summon_step(uint16 step, group* targets, card* target, uint
}
eset.clear();
target->filter_effect(EFFECT_SPSUMMON_COST, &eset);
if(eset.size()) {
for(int32 i = 0; i < eset.size(); ++i) {
if(eset[i]->operation) {
core.sub_solving_event.push_back(nil_event);
add_process(PROCESSOR_EXECUTE_OPERATION, 0, eset[i], 0, target->summon_player, 0);
}
}
effect_set* peset = new effect_set;
*peset = std::move(eset);
core.units.begin()->ptr2 = peset;
}
return FALSE;
}
case 1: {
if(effect_set* peset = (effect_set*)core.units.begin()->ptr2) {
for(int32 i = 0; i < peset->size(); ++i)
release_oath_relation(peset->at(i));
delete peset;
core.units.begin()->ptr2 = 0;
}
if(!targets)
core.special_summoning.insert(target);
target->enable_field_effect(false);
......
......@@ -4307,9 +4307,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
core.units.begin()->step = 9;
return FALSE;
}
for(auto& oeit : effects.oath)
if(oeit.second == peffect)
oeit.second = 0;
release_oath_relation(peffect);
break_effect();
core.chain_solving = TRUE;
raise_event((card*)0, EVENT_CHAIN_SOLVING, peffect, 0, cait->triggering_player, cait->triggering_player, cait->chain_count);
......
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