Commit 6e1886a8 authored by VanillaSalt's avatar VanillaSalt

update EFFECT_ATTACK_ALL

parent dcde72e4
...@@ -46,6 +46,11 @@ bool card::card_operation_sort(card* c1, card* c2) { ...@@ -46,6 +46,11 @@ bool card::card_operation_sort(card* c1, card* c2) {
return c1->current.sequence < c2->current.sequence; return c1->current.sequence < c2->current.sequence;
} }
} }
void card::attacker_map::addcard(card* pcard) {
uint16 fid = pcard ? pcard->fieldid_r : 0;
auto pr = insert(std::make_pair(fid, std::make_pair(pcard, 0)));
pr.first->second.second++;
}
card::card(duel* pd) { card::card(duel* pd) {
scrtype = 1; scrtype = 1;
ref_handle = 0; ref_handle = 0;
......
...@@ -85,7 +85,10 @@ public: ...@@ -85,7 +85,10 @@ public:
typedef std::unordered_map<effect*, uint32> effect_relation; typedef std::unordered_map<effect*, uint32> effect_relation;
typedef std::unordered_map<card*, uint32> relation_map; typedef std::unordered_map<card*, uint32> relation_map;
typedef std::map<uint16, std::array<uint16, 2> > counter_map; typedef std::map<uint16, std::array<uint16, 2> > counter_map;
typedef std::unordered_map<uint16, card*> attacker_map; class attacker_map : public std::unordered_map<uint16, std::pair<card*, uint32> > {
public:
void addcard(card* pcard);
} ;
int32 scrtype; int32 scrtype;
int32 ref_handle; int32 ref_handle;
duel* pduel; duel* pduel;
......
...@@ -1689,8 +1689,13 @@ int32 field::get_attack_target(card* pcard, card_vector* v, uint8 chain_attack) ...@@ -1689,8 +1689,13 @@ int32 field::get_attack_target(card* pcard, card_vector* v, uint8 chain_attack)
pv = &player[1 - p].list_mzone; pv = &player[1 - p].list_mzone;
for(cit = pv->begin(); cit != pv->end(); ++cit) { for(cit = pv->begin(); cit != pv->end(); ++cit) {
atarget = *cit; atarget = *cit;
if(!atarget || pcard->announced_cards.count(atarget->fieldid_r)) if(!atarget)
continue;
auto it = pcard->announced_cards.find(atarget->fieldid_r);
if(it != pcard->announced_cards.end()) {
if(it->second.second >= peffect->get_value(atarget))
continue; continue;
}
if(atarget->is_affected_by_effect(EFFECT_IGNORE_BATTLE_TARGET)) if(atarget->is_affected_by_effect(EFFECT_IGNORE_BATTLE_TARGET))
continue; continue;
if(atarget->is_affected_by_effect(EFFECT_CANNOT_BE_BATTLE_TARGET, pcard)) if(atarget->is_affected_by_effect(EFFECT_CANNOT_BE_BATTLE_TARGET, pcard))
...@@ -1749,8 +1754,7 @@ void field::attack_all_target_check() { ...@@ -1749,8 +1754,7 @@ void field::attack_all_target_check() {
effect* peffect = core.attacker->is_affected_by_effect(EFFECT_ATTACK_ALL); effect* peffect = core.attacker->is_affected_by_effect(EFFECT_ATTACK_ALL);
if(!peffect) if(!peffect)
return; return;
pduel->lua->add_param(core.attack_target, PARAM_TYPE_CARD); if(!peffect->get_value(core.attack_target))
if(!peffect->check_value_condition(1))
core.attacker->attack_all_target = FALSE; core.attacker->attack_all_target = FALSE;
} }
int32 field::check_synchro_material(card* pcard, int32 findex1, int32 findex2, int32 min, int32 max, card* smat, group* mg) { int32 field::check_synchro_material(card* pcard, int32 findex1, int32 findex2, int32 min, int32 max, card* smat, group* mg) {
......
...@@ -744,8 +744,8 @@ int32 scriptlib::card_get_attacked_group(lua_State *L) { ...@@ -744,8 +744,8 @@ int32 scriptlib::card_get_attacked_group(lua_State *L) {
card* pcard = *(card**) lua_touserdata(L, 1); card* pcard = *(card**) lua_touserdata(L, 1);
group* pgroup = pcard->pduel->new_group(); group* pgroup = pcard->pduel->new_group();
for(auto cit = pcard->attacked_cards.begin(); cit != pcard->attacked_cards.end(); ++cit) { for(auto cit = pcard->attacked_cards.begin(); cit != pcard->attacked_cards.end(); ++cit) {
if(cit->second) if(cit->second.first)
pgroup->container.insert(cit->second); pgroup->container.insert(cit->second.first);
} }
interpreter::group2value(L, pgroup); interpreter::group2value(L, pgroup);
return 1; return 1;
...@@ -770,8 +770,8 @@ int32 scriptlib::card_get_battled_group(lua_State *L) { ...@@ -770,8 +770,8 @@ int32 scriptlib::card_get_battled_group(lua_State *L) {
card* pcard = *(card**) lua_touserdata(L, 1); card* pcard = *(card**) lua_touserdata(L, 1);
group* pgroup = pcard->pduel->new_group(); group* pgroup = pcard->pduel->new_group();
for(auto cit = pcard->battled_cards.begin(); cit != pcard->battled_cards.end(); ++cit) { for(auto cit = pcard->battled_cards.begin(); cit != pcard->battled_cards.end(); ++cit) {
if(cit->second) if(cit->second.first)
pgroup->container.insert(cit->second); pgroup->container.insert(cit->second.first);
} }
interpreter::group2value(L, pgroup); interpreter::group2value(L, pgroup);
return 1; return 1;
...@@ -795,8 +795,7 @@ int32 scriptlib::card_is_direct_attacked(lua_State *L) { ...@@ -795,8 +795,7 @@ int32 scriptlib::card_is_direct_attacked(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);
bool ret = false; bool ret = false;
for(auto cit = pcard->attacked_cards.begin(); cit != pcard->attacked_cards.end(); ++cit) if(pcard->attacked_cards.find(0) != pcard->attacked_cards.end())
if(cit->first == 0)
ret = true; ret = true;
lua_pushboolean(L, ret); lua_pushboolean(L, ret);
return 1; return 1;
......
...@@ -1157,11 +1157,7 @@ int32 scriptlib::duel_change_attacker(lua_State *L) { ...@@ -1157,11 +1157,7 @@ int32 scriptlib::duel_change_attacker(lua_State *L) {
card* attacker = pduel->game_field->core.attacker; card* attacker = pduel->game_field->core.attacker;
card* attack_target = pduel->game_field->core.attack_target; card* attack_target = pduel->game_field->core.attack_target;
attacker->announce_count++; attacker->announce_count++;
if(attack_target) { attacker->announced_cards.addcard(attack_target);
attacker->announced_cards[attack_target->fieldid_r] = attack_target;
} else {
attacker->announced_cards[0] = 0;
}
pduel->game_field->core.sub_attacker = target; pduel->game_field->core.sub_attacker = target;
return 0; return 0;
} }
......
...@@ -2923,7 +2923,7 @@ int32 field::process_battle_command(uint16 step) { ...@@ -2923,7 +2923,7 @@ int32 field::process_battle_command(uint16 step) {
if(core.select_cards.size() == 0) { if(core.select_cards.size() == 0) {
if(!core.attack_cancelable) { if(!core.attack_cancelable) {
core.attacker->announce_count++; core.attacker->announce_count++;
core.attacker->announced_cards[0] = 0; core.attacker->announced_cards.addcard(0);
} }
core.units.begin()->step = -1; core.units.begin()->step = -1;
return FALSE; return FALSE;
...@@ -2949,10 +2949,7 @@ int32 field::process_battle_command(uint16 step) { ...@@ -2949,10 +2949,7 @@ int32 field::process_battle_command(uint16 step) {
//rollback //rollback
if(core.units.begin()->arg1) { if(core.units.begin()->arg1) {
core.attacker->announce_count++; core.attacker->announce_count++;
if(core.attack_target) core.attacker->announced_cards.addcard(core.attack_target);
core.attacker->announced_cards[core.attack_target->fieldid_r] = core.attack_target;
else
core.attacker->announced_cards[0] = 0;
} }
core.units.begin()->step = -1; core.units.begin()->step = -1;
return FALSE; return FALSE;
...@@ -3050,10 +3047,7 @@ int32 field::process_battle_command(uint16 step) { ...@@ -3050,10 +3047,7 @@ int32 field::process_battle_command(uint16 step) {
reset_phase(PHASE_DAMAGE); reset_phase(PHASE_DAMAGE);
if(core.attacker->fieldid_r == afid) { if(core.attacker->fieldid_r == afid) {
if(!atk_disabled) { if(!atk_disabled) {
if(core.attack_target) core.attacker->attacked_cards.addcard(core.attack_target);
core.attacker->attacked_cards[core.attack_target->fieldid_r] = core.attack_target;
else
core.attacker->attacked_cards[0] = 0;
} }
core.attacker->announce_count++; core.attacker->announce_count++;
attack_all_target_check(); attack_all_target_check();
...@@ -3070,17 +3064,11 @@ int32 field::process_battle_command(uint16 step) { ...@@ -3070,17 +3064,11 @@ int32 field::process_battle_command(uint16 step) {
if(atk_disabled || !core.attacker->is_capable_attack() || core.attacker->is_status(STATUS_ATTACK_CANCELED) if(atk_disabled || !core.attacker->is_capable_attack() || core.attacker->is_status(STATUS_ATTACK_CANCELED)
|| core.attacker->current.controler != acon || core.attacker->fieldid_r != afid) { || core.attacker->current.controler != acon || core.attacker->fieldid_r != afid) {
if(core.attacker->fieldid_r == afid) { if(core.attacker->fieldid_r == afid) {
if(core.attack_target)
core.attacker->announced_cards[core.attack_target->fieldid_r] = core.attack_target;
else
core.attacker->announced_cards[0] = 0;
core.attacker->announce_count++; core.attacker->announce_count++;
core.attacker->announced_cards.addcard(core.attack_target);
attack_all_target_check(); attack_all_target_check();
if(!core.attacker->is_status(STATUS_ATTACK_CANCELED)) { if(!core.attacker->is_status(STATUS_ATTACK_CANCELED)) {
if(core.attack_target) core.attacker->attacked_cards.addcard(core.attack_target);
core.attacker->attacked_cards[core.attack_target->fieldid_r] = core.attack_target;
else
core.attacker->attacked_cards[0] = 0;
} }
} }
core.units.begin()->step = -1; core.units.begin()->step = -1;
...@@ -3105,16 +3093,14 @@ int32 field::process_battle_command(uint16 step) { ...@@ -3105,16 +3093,14 @@ int32 field::process_battle_command(uint16 step) {
core.sub_attacker = 0; core.sub_attacker = 0;
core.sub_attack_target = (card*)0xffffffff; core.sub_attack_target = (card*)0xffffffff;
core.attacker->announce_count++; core.attacker->announce_count++;
core.attacker->announced_cards.addcard(core.attack_target);
attack_all_target_check(); attack_all_target_check();
core.attacker->attacked_cards.addcard(core.attack_target);
pduel->write_buffer8(MSG_ATTACK); pduel->write_buffer8(MSG_ATTACK);
pduel->write_buffer32(core.attacker->get_info_location()); pduel->write_buffer32(core.attacker->get_info_location());
if(core.attack_target) { if(core.attack_target) {
core.attacker->announced_cards[core.attack_target->fieldid_r] = core.attack_target;
core.attacker->attacked_cards[core.attack_target->fieldid_r] = core.attack_target;
pduel->write_buffer32(core.attack_target->get_info_location()); pduel->write_buffer32(core.attack_target->get_info_location());
} else { } else {
core.attacker->announced_cards[0] = 0;
core.attacker->attacked_cards[0] = 0;
pduel->write_buffer32(0); pduel->write_buffer32(0);
} }
core.units.begin()->step = 19; core.units.begin()->step = 19;
...@@ -3139,14 +3125,9 @@ int32 field::process_battle_command(uint16 step) { ...@@ -3139,14 +3125,9 @@ int32 field::process_battle_command(uint16 step) {
rollback = true; rollback = true;
if(!rollback) { if(!rollback) {
core.attacker->announce_count++; core.attacker->announce_count++;
core.attacker->announced_cards.addcard(core.attack_target);
attack_all_target_check(); attack_all_target_check();
if(core.attack_target) { core.attacker->attacked_cards.addcard(core.attack_target);
core.attacker->announced_cards[core.attack_target->fieldid_r] = core.attack_target;
core.attacker->attacked_cards[core.attack_target->fieldid_r] = core.attack_target;
} else {
core.attacker->announced_cards[0] = 0;
core.attacker->attacked_cards[0] = 0;
}
core.units.begin()->step = 19; core.units.begin()->step = 19;
adjust_instant(); adjust_instant();
adjust_all(); adjust_all();
...@@ -3176,10 +3157,7 @@ int32 field::process_battle_command(uint16 step) { ...@@ -3176,10 +3157,7 @@ int32 field::process_battle_command(uint16 step) {
return FALSE; return FALSE;
} }
core.attacker->announce_count++; core.attacker->announce_count++;
if(core.attack_target) core.attacker->announced_cards.addcard(core.attack_target);
core.attacker->announced_cards[core.attack_target->fieldid_r] = core.attack_target;
else
core.attacker->announced_cards[0] = 0;
attack_all_target_check(); attack_all_target_check();
core.units.begin()->step = -1; core.units.begin()->step = -1;
reset_phase(PHASE_DAMAGE); reset_phase(PHASE_DAMAGE);
...@@ -3421,11 +3399,9 @@ int32 field::process_battle_command(uint16 step) { ...@@ -3421,11 +3399,9 @@ int32 field::process_battle_command(uint16 step) {
infos.phase = PHASE_DAMAGE; infos.phase = PHASE_DAMAGE;
core.hint_timing[infos.turn_player] = 0; core.hint_timing[infos.turn_player] = 0;
core.chain_attack = FALSE; core.chain_attack = FALSE;
if(core.attack_target) { core.attacker->battled_cards.addcard(core.attack_target);
core.attacker->battled_cards[core.attack_target->fieldid_r] = core.attack_target; if(core.attack_target)
core.attack_target->battled_cards[core.attacker->fieldid_r] = core.attacker; core.attack_target->battled_cards.addcard(core.attacker);
} else
core.attacker->battled_cards[0] = 0;
uint8 reason_player = core.temp_var[0]; uint8 reason_player = core.temp_var[0];
card* reason_card = 0; card* reason_card = 0;
if(core.temp_var[1] == 1) if(core.temp_var[1] == 1)
......
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