Commit 6385eab8 authored by salix5's avatar salix5

field::process_quick_effect()

parent 3a95a668
...@@ -166,6 +166,7 @@ struct processor { ...@@ -166,6 +166,7 @@ struct processor {
event_list point_event; event_list point_event;
event_list instant_event; event_list instant_event;
event_list queue_event; event_list queue_event;
event_list full_event;
event_list used_event; event_list used_event;
event_list single_event; event_list single_event;
event_list solving_event; event_list solving_event;
......
...@@ -1583,6 +1583,7 @@ int32 field::process_phase_event(int16 step, int32 phase) { ...@@ -1583,6 +1583,7 @@ int32 field::process_phase_event(int16 step, int32 phase) {
core.quick_f_chain.clear(); core.quick_f_chain.clear();
core.instant_event.clear(); core.instant_event.clear();
core.point_event.clear(); core.point_event.clear();
core.full_event.clear();
return TRUE; return TRUE;
} }
} }
...@@ -1914,6 +1915,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1914,6 +1915,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
add_process(PROCESSOR_SOLVE_CHAIN, 0, 0, 0, skip_trigger | ((skip_freechain | skip_new) << 8), skip_new); add_process(PROCESSOR_SOLVE_CHAIN, 0, 0, 0, skip_trigger | ((skip_freechain | skip_new) << 8), skip_new);
} else { } else {
core.used_event.splice(core.used_event.end(), core.point_event); core.used_event.splice(core.used_event.end(), core.point_event);
core.full_event.clear();
if(core.chain_limit_p) { if(core.chain_limit_p) {
luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, core.chain_limit_p); luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, core.chain_limit_p);
core.chain_limit_p = 0; core.chain_limit_p = 0;
...@@ -2027,7 +2029,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori ...@@ -2027,7 +2029,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
peffect = pr.first->second; peffect = pr.first->second;
peffect->s_range = peffect->handler->current.location; peffect->s_range = peffect->handler->current.location;
peffect->o_range = peffect->handler->current.sequence; peffect->o_range = peffect->handler->current.sequence;
if(peffect->is_chainable(priority) && peffect->is_activateable(priority, *evit)) { if(!peffect->is_flag(EFFECT_FLAG_DELAY) && peffect->is_chainable(priority) && peffect->is_activateable(priority, *evit)) {
newchain.flag = 0; newchain.flag = 0;
newchain.chain_id = infos.field_id++; newchain.chain_id = infos.field_id++;
newchain.evt = *evit; newchain.evt = *evit;
...@@ -2037,8 +2039,6 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori ...@@ -2037,8 +2039,6 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
newchain.triggering_sequence = peffect->handler->current.sequence; newchain.triggering_sequence = peffect->handler->current.sequence;
newchain.triggering_player = priority; newchain.triggering_player = priority;
core.select_chains.push_back(newchain); core.select_chains.push_back(newchain);
core.delayed_quick_tmp.erase(std::make_pair(peffect, *evit));
core.delayed_quick_break.erase(std::make_pair(peffect, *evit));
} }
} }
pr = effects.quick_o_effect.equal_range(evit->event_code); pr = effects.quick_o_effect.equal_range(evit->event_code);
...@@ -2090,6 +2090,28 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori ...@@ -2090,6 +2090,28 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
if(act) if(act)
core.select_chains.push_back(*clit); core.select_chains.push_back(*clit);
} }
//delayed activate
for(auto evit = core.full_event.begin(); evit != core.full_event.end(); ++evit) {
auto pr = effects.activate_effect.equal_range(evit->event_code);
for(; pr.first != pr.second; ++pr.first) {
peffect = pr.first->second;
peffect->s_range = peffect->handler->current.location;
peffect->o_range = peffect->handler->current.sequence;
if(peffect->is_flag(EFFECT_FLAG_DELAY) && peffect->is_chainable(priority) && peffect->is_activateable(priority, *evit)) {
newchain.flag = 0;
newchain.chain_id = infos.field_id++;
newchain.evt = *evit;
newchain.triggering_controler = peffect->handler->current.controler;
newchain.triggering_effect = peffect;
newchain.triggering_location = peffect->handler->current.location;
newchain.triggering_sequence = peffect->handler->current.sequence;
newchain.triggering_player = priority;
core.select_chains.push_back(newchain);
}
}
}
core.full_event.clear();
// delayed quick
for(auto eit = core.delayed_quick.begin(); eit != core.delayed_quick.end(); ++eit) { for(auto eit = core.delayed_quick.begin(); eit != core.delayed_quick.end(); ++eit) {
peffect = eit->first; peffect = eit->first;
peffect->s_range = peffect->handler->current.location; peffect->s_range = peffect->handler->current.location;
...@@ -2297,13 +2319,9 @@ int32 field::process_instant_event() { ...@@ -2297,13 +2319,9 @@ int32 field::process_instant_event() {
peffect->handler->create_relation(newchain); peffect->handler->create_relation(newchain);
} }
} }
//delayed quick effect // delayed activate effect
pr = effects.activate_effect.equal_range(elit->event_code); core.full_event.push_back(*elit);
for(; pr.first != pr.second; ++pr.first) { // delayed quick effect
peffect = pr.first->second;
if(peffect->is_flag(EFFECT_FLAG_DELAY) && peffect->is_condition_check(peffect->handler->current.controler, *elit))
core.delayed_quick_tmp.insert(std::make_pair(peffect, *elit));
}
pr = effects.quick_o_effect.equal_range(elit->event_code); pr = effects.quick_o_effect.equal_range(elit->event_code);
for(; pr.first != pr.second; ++pr.first) { for(; pr.first != pr.second; ++pr.first) {
peffect = pr.first->second; peffect = pr.first->second;
...@@ -4747,6 +4765,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2 ...@@ -4747,6 +4765,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
} }
case 12: { case 12: {
core.used_event.splice(core.used_event.end(), core.point_event); core.used_event.splice(core.used_event.end(), core.point_event);
core.full_event.clear();
pduel->write_buffer8(MSG_CHAIN_END); pduel->write_buffer8(MSG_CHAIN_END);
if(core.chain_limit_p) { if(core.chain_limit_p) {
luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, core.chain_limit_p); luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, core.chain_limit_p);
......
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