Commit 6385eab8 authored by salix5's avatar salix5

field::process_quick_effect()

parent 3a95a668
......@@ -166,6 +166,7 @@ struct processor {
event_list point_event;
event_list instant_event;
event_list queue_event;
event_list full_event;
event_list used_event;
event_list single_event;
event_list solving_event;
......
......@@ -1583,6 +1583,7 @@ int32 field::process_phase_event(int16 step, int32 phase) {
core.quick_f_chain.clear();
core.instant_event.clear();
core.point_event.clear();
core.full_event.clear();
return TRUE;
}
}
......@@ -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);
} else {
core.used_event.splice(core.used_event.end(), core.point_event);
core.full_event.clear();
if(core.chain_limit_p) {
luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, core.chain_limit_p);
core.chain_limit_p = 0;
......@@ -2027,7 +2029,7 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
peffect = pr.first->second;
peffect->s_range = peffect->handler->current.location;
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.chain_id = infos.field_id++;
newchain.evt = *evit;
......@@ -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_player = priority;
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);
......@@ -2090,6 +2090,28 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
if(act)
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) {
peffect = eit->first;
peffect->s_range = peffect->handler->current.location;
......@@ -2297,13 +2319,9 @@ int32 field::process_instant_event() {
peffect->handler->create_relation(newchain);
}
}
//delayed quick effect
pr = effects.activate_effect.equal_range(elit->event_code);
for(; pr.first != pr.second; ++pr.first) {
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));
}
// delayed activate effect
core.full_event.push_back(*elit);
// delayed quick effect
pr = effects.quick_o_effect.equal_range(elit->event_code);
for(; pr.first != pr.second; ++pr.first) {
peffect = pr.first->second;
......@@ -4747,6 +4765,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
}
case 12: {
core.used_event.splice(core.used_event.end(), core.point_event);
core.full_event.clear();
pduel->write_buffer8(MSG_CHAIN_END);
if(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