Commit 56921480 authored by VanillaSalt's avatar VanillaSalt

fix

parent 90ec3bc2
...@@ -1324,6 +1324,8 @@ int32 field::process_phase_event(int16 step, int32 phase) { ...@@ -1324,6 +1324,8 @@ int32 field::process_phase_event(int16 step, int32 phase) {
nil_event.event_code = phase_event; nil_event.event_code = phase_event;
nil_event.event_player = infos.turn_player; nil_event.event_player = infos.turn_player;
int32 check_player = infos.turn_player; int32 check_player = infos.turn_player;
if(core.units.begin()->arg2 & 0x2)
check_player = 1 - infos.turn_player;
chain newchain; chain newchain;
core.select_chains.clear(); core.select_chains.clear();
int32 tf_count = 0, to_count = 0, fc_count = 0, cn_count = 0; int32 tf_count = 0, to_count = 0, fc_count = 0, cn_count = 0;
...@@ -1393,6 +1395,8 @@ int32 field::process_phase_event(int16 step, int32 phase) { ...@@ -1393,6 +1395,8 @@ int32 field::process_phase_event(int16 step, int32 phase) {
pr = effects.activate_effect.equal_range(EVENT_FREE_CHAIN); pr = effects.activate_effect.equal_range(EVENT_FREE_CHAIN);
for(; pr.first != pr.second; ++pr.first) { for(; pr.first != pr.second; ++pr.first) {
peffect = pr.first->second; peffect = pr.first->second;
peffect->s_range = peffect->handler->current.location;
peffect->o_range = peffect->handler->current.sequence;
if(!peffect->is_chainable(check_player) || !peffect->is_activateable(check_player, nil_event)) if(!peffect->is_chainable(check_player) || !peffect->is_activateable(check_player, nil_event))
continue; continue;
peffect->id = infos.field_id++; peffect->id = infos.field_id++;
...@@ -1451,21 +1455,22 @@ int32 field::process_phase_event(int16 step, int32 phase) { ...@@ -1451,21 +1455,22 @@ int32 field::process_phase_event(int16 step, int32 phase) {
return FALSE; return FALSE;
} }
case 2: { case 2: {
chain newchain; int32 priority_passed = core.units.begin()->arg2 & 0x1;
int32 is_opponent = core.units.begin()->arg2 & 0x2;
if(returns.ivalue[0] == -1) { if(returns.ivalue[0] == -1) {
if(core.units.begin()->arg2 == 1) if(priority_passed)
core.units.begin()->step = 19; core.units.begin()->step = 19;
else { else {
if(core.units.begin()->arg2 == 0) priority_passed = 1;
core.units.begin()->arg2 = 1; is_opponent ^= 0x2;
else core.units.begin()->arg2 = is_opponent | priority_passed;
core.units.begin()->arg2 = 0; core.units.begin()->step = -1;
core.units.begin()->step = 9;
} }
return FALSE; return FALSE;
} }
core.units.begin()->arg2 = 2; priority_passed = 0;
newchain = core.select_chains[returns.ivalue[0]]; core.units.begin()->arg2 = is_opponent | priority_passed;
chain newchain = core.select_chains[returns.ivalue[0]];
effect* peffect = newchain.triggering_effect; effect* peffect = newchain.triggering_effect;
if(!(peffect->type & EFFECT_TYPE_ACTIONS)) { if(!(peffect->type & EFFECT_TYPE_ACTIONS)) {
if(peffect->flag & EFFECT_FLAG_FIELD_ONLY) if(peffect->flag & EFFECT_FLAG_FIELD_ONLY)
...@@ -1475,19 +1480,22 @@ int32 field::process_phase_event(int16 step, int32 phase) { ...@@ -1475,19 +1480,22 @@ int32 field::process_phase_event(int16 step, int32 phase) {
adjust_all(); adjust_all();
core.units.begin()->step = 3; core.units.begin()->step = 3;
} else if(!(peffect->type & EFFECT_TYPE_CONTINUOUS)) { } else if(!(peffect->type & EFFECT_TYPE_CONTINUOUS)) {
int32 check_player = infos.turn_player;
if(is_opponent)
check_player = 1 - infos.turn_player;
newchain.flag = 0; newchain.flag = 0;
newchain.chain_id = infos.field_id++; newchain.chain_id = infos.field_id++;
newchain.evt = nil_event; newchain.evt = nil_event;
newchain.triggering_controler = peffect->handler->current.controler; newchain.triggering_controler = peffect->handler->current.controler;
newchain.triggering_location = peffect->handler->current.location; newchain.triggering_location = peffect->handler->current.location;
newchain.triggering_sequence = peffect->handler->current.sequence; newchain.triggering_sequence = peffect->handler->current.sequence;
newchain.triggering_player = infos.turn_player; newchain.triggering_player = check_player;
core.new_chains.push_back(newchain); core.new_chains.push_back(newchain);
peffect->handler->set_status(STATUS_CHAINING, TRUE); peffect->handler->set_status(STATUS_CHAINING, TRUE);
peffect->dec_count(infos.turn_player); peffect->dec_count(check_player);
core.select_chains.clear(); core.select_chains.clear();
add_process(PROCESSOR_ADD_CHAIN, 0, 0, 0, 0, 0); add_process(PROCESSOR_ADD_CHAIN, 0, 0, 0, 0, 0);
add_process(PROCESSOR_QUICK_EFFECT, 0, 0, 0, FALSE, 1 - infos.turn_player); add_process(PROCESSOR_QUICK_EFFECT, 0, 0, 0, FALSE, 1 - check_player);
infos.priorities[0] = 0; infos.priorities[0] = 0;
infos.priorities[1] = 0; infos.priorities[1] = 0;
} else { } else {
...@@ -1514,204 +1522,6 @@ int32 field::process_phase_event(int16 step, int32 phase) { ...@@ -1514,204 +1522,6 @@ int32 field::process_phase_event(int16 step, int32 phase) {
core.units.begin()->step = -1; core.units.begin()->step = -1;
return FALSE; return FALSE;
} }
case 10: {
int32 phase_event = EVENT_PHASE + phase;
effect* peffect;
nil_event.event_code = phase_event;
nil_event.event_player = infos.turn_player;
int32 check_player = 1 - infos.turn_player;
chain newchain;
core.select_chains.clear();
int32 tf_count = 0, to_count = 0, fc_count = 0, cn_count = 0;
auto pr = effects.trigger_f_effect.equal_range(phase_event);
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_activateable(check_player, nil_event))
continue;
peffect->id = infos.field_id++;
newchain.triggering_effect = peffect;
core.select_chains.push_back(newchain);
tf_count++;
}
pr = effects.continuous_effect.equal_range(phase_event);
for(; pr.first != pr.second;) {
peffect = pr.first->second;
++pr.first;
if(peffect->get_handler_player() != check_player || !peffect->is_activateable(check_player, nil_event))
continue;
peffect->id = infos.field_id++;
newchain.triggering_effect = peffect;
core.select_chains.push_back(newchain);
cn_count++;
}
for(auto eit = effects.pheff.begin(); eit != effects.pheff.end(); ++eit) {
peffect = *eit;
if(peffect->code != EFFECT_SET_CONTROL)
continue;
if(peffect->get_owner_player() != check_player)
continue;
if(!(peffect->reset_flag & phase))
continue;
uint8 pid = peffect->get_handler_player();
uint8 tp = infos.turn_player;
if(!(((peffect->reset_flag & RESET_SELF_TURN) && pid == tp) || ((peffect->reset_flag & RESET_OPPO_TURN) && pid != tp)))
continue;
if((peffect->reset_count & 0xff) != 1)
continue;
newchain.triggering_effect = peffect;
core.select_chains.push_back(newchain);
cn_count++;
}
core.spe_effect[check_player] = 0;
if(!core.hand_adjusted) {
pr = effects.trigger_o_effect.equal_range(phase_event);
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_activateable(check_player, nil_event))
continue;
peffect->id = infos.field_id++;
newchain.triggering_effect = peffect;
core.select_chains.push_back(newchain);
to_count++;
core.spe_effect[check_player]++;
}
if(phase == PHASE_DRAW)
core.hint_timing[infos.turn_player] = TIMING_DRAW_PHASE;
else if(phase == PHASE_STANDBY)
core.hint_timing[infos.turn_player] = TIMING_STANDBY_PHASE;
else if(phase == PHASE_BATTLE)
core.hint_timing[infos.turn_player] = TIMING_BATTLE_END;
else core.hint_timing[infos.turn_player] = TIMING_END_PHASE;
pr = effects.activate_effect.equal_range(EVENT_FREE_CHAIN);
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_chainable(check_player) || !peffect->is_activateable(check_player, nil_event))
continue;
peffect->id = infos.field_id++;
newchain.triggering_effect = peffect;
if(check_hint_timing(peffect))
core.spe_effect[check_player]++;
core.select_chains.push_back(newchain);
fc_count++;
}
pr = effects.quick_o_effect.equal_range(EVENT_FREE_CHAIN);
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_chainable(check_player) || !peffect->is_activateable(check_player, nil_event))
continue;
peffect->id = infos.field_id++;
newchain.triggering_effect = peffect;
if(check_hint_timing(peffect))
core.spe_effect[check_player]++;
core.select_chains.push_back(newchain);
fc_count++;
}
}
if(core.select_chains.size() == 0) {
returns.ivalue[0] = -1;
core.units.begin()->step = 11;
return FALSE;
} else if(tf_count == 0 && cn_count == 1 && to_count == 0 && fc_count == 0) {
returns.ivalue[0] = 0;
core.units.begin()->step = 11;
return FALSE;
} else if(tf_count == 0 && to_count == 1 && fc_count == 0 && cn_count == 0) {
add_process(PROCESSOR_SELECT_EFFECTYN, 0, 0, (group*)core.select_chains[0].triggering_effect->handler, check_player, 0);
return FALSE;
} else {
pduel->write_buffer8(MSG_HINT);
pduel->write_buffer8(HINT_EVENT);
pduel->write_buffer8(check_player);
if(infos.phase == PHASE_DRAW)
pduel->write_buffer32(20);
else if(infos.phase == PHASE_STANDBY)
pduel->write_buffer32(21);
else if(infos.phase == PHASE_BATTLE)
pduel->write_buffer32(25);
else
pduel->write_buffer32(26);
add_process(PROCESSOR_SELECT_CHAIN, 0, 0, 0, check_player, core.spe_effect[check_player] | (tf_count + cn_count ? 0x10000 : 0));
core.units.begin()->step = 11;
return FALSE;
}
return FALSE;
}
case 11: {
returns.ivalue[0]--;
return FALSE;
}
case 12: {
chain newchain;
if(returns.ivalue[0] == -1) {
if(core.units.begin()->arg2 == 1)
core.units.begin()->step = 19;
else {
if(core.units.begin()->arg2 == 0)
core.units.begin()->arg2 = 1;
else
core.units.begin()->arg2 = 0;
core.units.begin()->step = -1;
}
return FALSE;
}
core.units.begin()->arg2 = 2;
newchain = core.select_chains[returns.ivalue[0]];
effect* peffect = newchain.triggering_effect;
if(!(peffect->type & EFFECT_TYPE_ACTIONS)) {
if(peffect->flag & EFFECT_FLAG_FIELD_ONLY)
remove_effect(peffect);
else
peffect->handler->remove_effect(peffect);
adjust_all();
core.units.begin()->step = 13;
} else if(!(peffect->type & EFFECT_TYPE_CONTINUOUS)) {
newchain.flag = 0;
newchain.chain_id = infos.field_id++;
newchain.evt = nil_event;
newchain.triggering_controler = peffect->handler->current.controler;
newchain.triggering_location = peffect->handler->current.location;
newchain.triggering_sequence = peffect->handler->current.sequence;
newchain.triggering_player = 1 - infos.turn_player;
core.new_chains.push_back(newchain);
peffect->handler->set_status(STATUS_CHAINING, TRUE);
peffect->dec_count(1 - infos.turn_player);
core.select_chains.clear();
add_process(PROCESSOR_ADD_CHAIN, 0, 0, 0, 0, 0);
add_process(PROCESSOR_QUICK_EFFECT, 0, 0, 0, FALSE, infos.turn_player);
infos.priorities[0] = 0;
infos.priorities[1] = 0;
} else {
core.select_chains.clear();
core.sub_solving_event.push_back(nil_event);
add_process(PROCESSOR_SOLVE_CONTINUOUS, 0, peffect, 0, peffect->get_handler_player(), 0);
core.units.begin()->step = 13;
}
return FALSE;
}
case 13: {
if(core.chain_limit) {
luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, core.chain_limit);
core.chain_limit = 0;
}
for(auto cait = core.current_chain.begin(); cait != core.current_chain.end(); ++cait)
cait->triggering_effect->handler->set_status(STATUS_CHAINING, FALSE);
add_process(PROCESSOR_SOLVE_CHAIN, 0, 0, 0, FALSE, 0);
core.units.begin()->step = 9;
return FALSE;
}
case 14: {
add_process(PROCESSOR_POINT_EVENT, 0, 0, 0, 0, 0);
core.units.begin()->step = 9;
return FALSE;
}
case 20: { case 20: {
if(phase != PHASE_END) { if(phase != PHASE_END) {
core.units.begin()->step = 24; core.units.begin()->step = 24;
...@@ -1748,6 +1558,7 @@ int32 field::process_phase_event(int16 step, int32 phase) { ...@@ -1748,6 +1558,7 @@ int32 field::process_phase_event(int16 step, int32 phase) {
core.hand_adjusted = TRUE; core.hand_adjusted = TRUE;
add_process(PROCESSOR_POINT_EVENT, 0, 0, 0, 0, 0); add_process(PROCESSOR_POINT_EVENT, 0, 0, 0, 0, 0);
core.units.begin()->step = -1; core.units.begin()->step = -1;
core.units.begin()->arg2 = 0;
return FALSE; return FALSE;
} }
case 25: { case 25: {
......
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