Skip to content

Commit

Permalink
new ruling: (special) summon count
Browse files Browse the repository at this point in the history
  • Loading branch information
DailyShana committed Apr 2, 2020
1 parent 08da17f commit f39885a
Show file tree
Hide file tree
Showing 6 changed files with 11 additions and 61 deletions.
2 changes: 0 additions & 2 deletions card.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ card::card(duel* pd) {
std::memset(&temp, 0xff, sizeof(card_state));
unique_pos[0] = unique_pos[1] = 0;
spsummon_counter[0] = spsummon_counter[1] = 0;
spsummon_counter_rst[0] = spsummon_counter_rst[1] = 0;
unique_code = 0;
unique_fieldid = 0;
assume_type = 0;
Expand Down Expand Up @@ -1505,7 +1504,6 @@ void card::apply_field_effect() {
if(unique_code && (current.location & unique_location))
pduel->game_field->add_unique_card(this);
spsummon_counter[0] = spsummon_counter[1] = 0;
spsummon_counter_rst[0] = spsummon_counter_rst[1] = 0;
}
void card::cancel_field_effect() {
if (current.controler == PLAYER_NONE)
Expand Down
1 change: 0 additions & 1 deletion card.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,6 @@ class card {
effect* unique_effect;
uint32 spsummon_code;
uint16 spsummon_counter[2];
uint16 spsummon_counter_rst[2];
uint8 assume_type;
uint32 assume_value;
card* equiping_target;
Expand Down
27 changes: 5 additions & 22 deletions field.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2170,32 +2170,15 @@ void field::check_chain_counter(effect* peffect, int32 playerid, int32 chainid,
}
}
}
void field::set_spsummon_counter(uint8 playerid, bool add, bool chain) {
if(add) {
core.spsummon_state_count[playerid]++;
if(chain)
core.spsummon_state_count_rst[playerid]++;
} else {
if(chain) {
core.spsummon_state_count[playerid] -= core.spsummon_state_count_rst[playerid];
core.spsummon_state_count_rst[playerid] = 0;
} else
core.spsummon_state_count[playerid]--;
}
void field::set_spsummon_counter(uint8 playerid) {
core.spsummon_state_count[playerid]++;
if(core.global_flag & GLOBALFLAG_SPSUMMON_COUNT) {
for(auto& peffect : effects.spsummon_count_eff) {
card* pcard = peffect->get_handler();
if(add) {
if(peffect->is_available()) {
if(((playerid == pcard->current.controler) && peffect->s_range) || ((playerid != pcard->current.controler) && peffect->o_range)) {
pcard->spsummon_counter[playerid]++;
if(chain)
pcard->spsummon_counter_rst[playerid]++;
}
if(peffect->is_available()) {
if(((playerid == pcard->current.controler) && peffect->s_range) || ((playerid != pcard->current.controler) && peffect->o_range)) {
pcard->spsummon_counter[playerid]++;
}
} else {
pcard->spsummon_counter[playerid] -= pcard->spsummon_counter_rst[playerid];
pcard->spsummon_counter_rst[playerid] = 0;
}
}
}
Expand Down
5 changes: 1 addition & 4 deletions field.h
Original file line number Diff line number Diff line change
Expand Up @@ -313,9 +313,6 @@ struct processor {
uint8 normalsummon_state_count[2];
uint8 flipsummon_state_count[2];
uint8 spsummon_state_count[2];
uint8 spsummon_state_count_rst[2];
uint8 spsummon_state_count_tmp[2];
bool spsummon_rst;
uint8 attack_state_count[2];
uint8 battle_phase_count[2];
uint8 battled_count[2];
Expand Down Expand Up @@ -432,7 +429,7 @@ class field {
void check_card_counter(card* pcard, int32 counter_type, int32 playerid);
void check_card_counter(group* pgroup, int32 counter_type, int32 playerid);
void check_chain_counter(effect* peffect, int32 playerid, int32 chainid, bool cancel = false);
void set_spsummon_counter(uint8 playerid, bool add = true, bool chain = false);
void set_spsummon_counter(uint8 playerid);
int32 check_spsummon_counter(uint8 playerid, uint8 ct = 1);

int32 check_lp_cost(uint8 playerid, uint32 cost);
Expand Down
11 changes: 5 additions & 6 deletions operations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1916,8 +1916,6 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui
pduel->write_buffer8(MSG_SUMMONING);
pduel->write_buffer32(target->data.code);
pduel->write_buffer32(target->get_info_location());
core.summon_state_count[sumplayer]++;
core.normalsummon_state_count[sumplayer]++;
if (target->material_cards.size()) {
for (auto& mcard : target->material_cards)
raise_single_event(mcard, 0, EVENT_BE_PRE_MATERIAL, proc, REASON_SUMMON, sumplayer, sumplayer, 0);
Expand Down Expand Up @@ -1992,6 +1990,8 @@ int32 field::summon(uint16 step, uint8 sumplayer, card* target, effect* proc, ui
return FALSE;
}
case 17: {
core.summon_state_count[sumplayer]++;
core.normalsummon_state_count[sumplayer]++;
check_card_counter(target, 1, sumplayer);
check_card_counter(target, 2, sumplayer);
raise_single_event(target, 0, EVENT_SUMMON_SUCCESS, proc, 0, sumplayer, sumplayer, 0);
Expand Down Expand Up @@ -2032,7 +2032,6 @@ int32 field::flip_summon(uint16 step, uint8 sumplayer, card * target) {
target->current.position = POS_FACEUP_ATTACK;
target->fieldid = infos.field_id++;
core.phase_action = TRUE;
core.flipsummon_state_count[sumplayer]++;
pduel->write_buffer8(MSG_FLIPSUMMONING);
pduel->write_buffer32(target->data.code);
pduel->write_buffer32(target->get_info_location());
Expand Down Expand Up @@ -2065,6 +2064,7 @@ int32 field::flip_summon(uint16 step, uint8 sumplayer, card * target) {
}
case 4: {
pduel->write_buffer8(MSG_FLIPSUMMONED);
core.flipsummon_state_count[sumplayer]++;
check_card_counter(target, 4, sumplayer);
adjust_instant();
raise_single_event(target, 0, EVENT_FLIP, 0, 0, sumplayer, sumplayer, 0);
Expand Down Expand Up @@ -2755,7 +2755,6 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
target->current.reason_effect = peffect;
target->current.reason_player = sumplayer;
target->summon_player = sumplayer;
set_spsummon_counter(sumplayer);
break_effect();
return FALSE;
}
Expand Down Expand Up @@ -2860,6 +2859,7 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
return FALSE;
}
case 17: {
set_spsummon_counter(sumplayer);
check_card_counter(target, 3, sumplayer);
if(target->spsummon_code)
core.spsummon_once_map[sumplayer][target->spsummon_code]++;
Expand Down Expand Up @@ -2962,7 +2962,6 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
}
case 25: {
group* pgroup = core.units.begin()->ptarget;
set_spsummon_counter(sumplayer);
card_set cset;
for(auto& pcard : pgroup->container) {
pcard->set_status(STATUS_SUMMONING, TRUE);
Expand Down Expand Up @@ -3015,6 +3014,7 @@ int32 field::special_summon_rule(uint16 step, uint8 sumplayer, card* target, uin
case 28: {
group* pgroup = core.units.begin()->ptarget;
pduel->write_buffer8(MSG_SPSUMMONED);
set_spsummon_counter(sumplayer);
check_card_counter(pgroup, 3, sumplayer);
std::set<uint32> spsummon_once_set;
for(auto& pcard : pgroup->container) {
Expand Down Expand Up @@ -4743,7 +4743,6 @@ int32 field::change_position(uint16 step, group * targets, effect * reason_effec
if((pcard->summon_info & SUMMON_TYPE_PENDULUM) == SUMMON_TYPE_PENDULUM)
pcard->summon_info &= 0xf000ffff;
pcard->spsummon_counter[0] = pcard->spsummon_counter[1] = 0;
pcard->spsummon_counter_rst[0] = pcard->spsummon_counter_rst[1] = 0;
}
if((npos & POS_FACEDOWN) && pcard->equiping_cards.size()) {
for(auto csit = pcard->equiping_cards.begin(); csit != pcard->equiping_cards.end();) {
Expand Down
26 changes: 0 additions & 26 deletions processor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3642,15 +3642,13 @@ int32 field::process_turn(uint16 step, uint8 turn_player) {
core.normalsummon_state_count[p] = 0;
core.flipsummon_state_count[p] = 0;
core.spsummon_state_count[p] = 0;
core.spsummon_state_count_rst[p] = 0;
core.attack_state_count[p] = 0;
core.battle_phase_count[p] = 0;
core.battled_count[p] = 0;
core.summon_count[p] = 0;
core.extra_summon[p] = 0;
core.spsummon_once_map[p].clear();
}
core.spsummon_rst = false;
for(auto& peffect : effects.rechargeable)
if(!peffect->is_flag(EFFECT_FLAG_NO_TURN_RESET))
peffect->recharge();
Expand All @@ -3671,7 +3669,6 @@ int32 field::process_turn(uint16 step, uint8 turn_player) {
card* pcard = peffect->get_handler();
if(!peffect->is_flag(EFFECT_FLAG_NO_TURN_RESET)) {
pcard->spsummon_counter[0] = pcard->spsummon_counter[1] = 0;
pcard->spsummon_counter_rst[0] = pcard->spsummon_counter_rst[1] = 0;
}
}
}
Expand Down Expand Up @@ -4156,12 +4153,6 @@ int32 field::add_chain(uint16 step) {
&& !peffect->is_flag(EFFECT_FLAG_FIELD_ONLY))
clit.flag |= CHAIN_CONTINUOUS_CARD;
core.phase_action = TRUE;
if(clit.opinfos.count(0x200) && clit.opinfos[0x200].op_count) {
core.spsummon_rst = true;
set_spsummon_counter(clit.triggering_player, true, true);
if(clit.opinfos[0x200].op_player == PLAYER_ALL)
set_spsummon_counter(1 - clit.triggering_player, true, true);
}
pduel->write_buffer8(MSG_CHAINED);
pduel->write_buffer8(clit.chain_count);
raise_event(phandler, EVENT_CHAINING, peffect, 0, clit.triggering_player, clit.triggering_player, clit.chain_count);
Expand Down Expand Up @@ -4279,11 +4270,6 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
auto cait = core.current_chain.rbegin();
switch(step) {
case 0: {
if(core.spsummon_rst) {
set_spsummon_counter(0, false, true);
set_spsummon_counter(1, false, true);
core.spsummon_rst = false;
}
pduel->write_buffer8(MSG_CHAIN_SOLVING);
pduel->write_buffer8(cait->chain_count);
add_to_disable_check_list(cait->triggering_effect->get_handler());
Expand Down Expand Up @@ -4317,8 +4303,6 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
return FALSE;
}
case 2: {
core.spsummon_state_count_tmp[0] = core.spsummon_state_count[0];
core.spsummon_state_count_tmp[1] = core.spsummon_state_count[1];
effect* peffect = cait->triggering_effect;
card* pcard = peffect->get_handler();
if((peffect->type & EFFECT_TYPE_ACTIVATE) && pcard->is_has_relation(*cait)) {
Expand Down Expand Up @@ -4369,16 +4353,6 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
return FALSE;
}
case 4: {
if(core.units.begin()->arg4 == 0) {
if(cait->opinfos.count(0x200) && cait->opinfos[0x200].op_count) {
if(core.spsummon_state_count_tmp[cait->triggering_player] == core.spsummon_state_count[cait->triggering_player])
set_spsummon_counter(cait->triggering_player);
if(cait->opinfos[0x200].op_player == PLAYER_ALL && core.spsummon_state_count_tmp[1 - cait->triggering_player] == core.spsummon_state_count[1 - cait->triggering_player])
set_spsummon_counter(1 - cait->triggering_player);
}
}
core.spsummon_state_count_tmp[0] = 0;
core.spsummon_state_count_tmp[1] = 0;
core.chain_solving = FALSE;
if(core.delayed_continuous_tp.size()) {
core.conti_player = infos.turn_player;
Expand Down

0 comments on commit f39885a

Please sign in to comment.