Commit caae9f2b authored by Momobako's avatar Momobako

update_core

parent 1d87a121
...@@ -1654,7 +1654,8 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1654,7 +1654,8 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
} }
case 2: { case 2: {
//forced trigger //forced trigger
for (auto clit = core.new_fchain_s.begin(); clit != core.new_fchain_s.end(); ++clit) { core.select_chains.clear();
for (auto clit = core.new_fchain_s.begin(); clit != core.new_fchain_s.end(); ) {
effect* peffect = clit->triggering_effect; effect* peffect = clit->triggering_effect;
card* phandler = peffect->get_handler(); card* phandler = peffect->get_handler();
if(!peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER | EFFECT_FLAG_BOTH_SIDE) && phandler->is_has_relation(*clit)) { if(!peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER | EFFECT_FLAG_BOTH_SIDE) && phandler->is_has_relation(*clit)) {
...@@ -1664,71 +1665,63 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1664,71 +1665,63 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
uint8 tp = clit->triggering_player; uint8 tp = clit->triggering_player;
bool act = true; bool act = true;
if(peffect->is_chainable(tp) && peffect->is_activateable(tp, clit->evt, TRUE) if(peffect->is_chainable(tp) && peffect->is_activateable(tp, clit->evt, TRUE)
&& (!(peffect->type & EFFECT_TYPE_FIELD) || phandler->is_has_relation(*clit)) && (!(peffect->type & EFFECT_TYPE_FIELD) || phandler->is_has_relation(*clit))
&& (peffect->code == EVENT_FLIP && infos.phase == PHASE_DAMAGE && (peffect->code == EVENT_FLIP && infos.phase == PHASE_DAMAGE
|| (clit->triggering_location & 0x43) && (clit->triggering_position & POS_FACEDOWN) || (clit->triggering_location & 0x43) && (clit->triggering_position & POS_FACEDOWN)
|| !(phandler->current.location & 0x43) || phandler->is_position(POS_FACEUP))) { || !(phandler->current.location & 0x43) || phandler->is_position(POS_FACEUP))) {
if(peffect->is_flag(EFFECT_FLAG_CHAIN_UNIQUE)) { if(peffect->is_flag(EFFECT_FLAG_CHAIN_UNIQUE)) {
if(tp == infos.turn_player) { for(auto tpit = core.new_chains.begin(); tpit != core.new_chains.end(); ++tpit) {
for(auto tpit = core.tpchain.begin(); tpit != core.tpchain.end(); ++tpit) { if(tpit->triggering_effect->get_handler()->data.code == phandler->data.code && tpit->triggering_player == tp) {
if(tpit->triggering_effect->get_handler()->data.code == phandler->data.code) { act = false;
act = false; break;
break;
}
}
} else {
for(auto ntpit = core.ntpchain.begin(); ntpit != core.ntpchain.end(); ++ntpit) {
if(ntpit->triggering_effect->get_handler()->data.code == phandler->data.code) {
act = false;
break;
}
} }
} }
} }
} else } else
act = false; act = false;
if(act) { if(act) {
if(tp == infos.turn_player) if(tp == core.current_player)
core.tpchain.push_back(*clit); core.select_chains.push_back(*clit);
else } else {
core.ntpchain.push_back(*clit); core.new_fchain_s.erase(clit++);
phandler->set_status(STATUS_CHAINING, TRUE); continue;
peffect->dec_count(tp);
if(peffect->is_flag(EFFECT_FLAG_CVAL_CHECK))
peffect->get_value();
} }
++clit;
} }
core.new_fchain_s.clear(); if(core.select_chains.size() == 0) {
if(core.current_player == infos.turn_player) { returns.ivalue[0] = -1;
if(core.tpchain.size() > 1) } else if(core.select_chains.size() == 1) {
add_process(PROCESSOR_SORT_CHAIN, 0, 0, 0, 1, infos.turn_player); returns.ivalue[0] = 0;
} else { } else {
if(core.ntpchain.size() > 1) add_process(PROCESSOR_SELECT_CHAIN, 0, 0, 0, core.current_player, 0x7f | 0x10000);
add_process(PROCESSOR_SORT_CHAIN, 0, 0, 0, 0, infos.turn_player);
} }
return FALSE; return FALSE;
} }
case 3: { case 3: {
if(core.current_player == infos.turn_player) { if(returns.ivalue[0] == -1) {
core.new_chains.splice(core.new_chains.end(), core.tpchain); if(core.new_fchain_s.size()) {
if(core.new_chains.size()) core.current_player = 1 - infos.turn_player;
add_process(PROCESSOR_ADD_CHAIN, 0, 0, 0, 0, 0); core.units.begin()->step = 1;
core.current_player = 1 - infos.turn_player; } else {
core.units.begin()->step = 1; core.current_player = infos.turn_player;
} else { }
core.new_chains.splice(core.new_chains.end(), core.ntpchain); return FALSE;
if(core.new_chains.size())
add_process(PROCESSOR_ADD_CHAIN, 0, 0, 0, 0, 0);
} }
chain newchain = core.select_chains[returns.ivalue[0]];
effect* peffect = newchain.triggering_effect;
uint8 tp = newchain.triggering_player;
peffect->get_handler()->set_status(STATUS_CHAINING, TRUE);
peffect->dec_count(tp);
core.new_chains.push_back(newchain);
add_process(PROCESSOR_ADD_CHAIN, 0, 0, 0, 0, 0);
core.new_fchain_s.remove_if([=](chain ch) { return ch.chain_id == newchain.chain_id; });
core.units.begin()->step = 1;
return FALSE; return FALSE;
} }
case 4: { case 4: {
//optional trigger //optional trigger
if(core.new_ochain_s.size() == 0) { core.select_chains.clear();
core.units.begin()->step = 6; for (auto clit = core.new_ochain_s.begin(); clit != core.new_ochain_s.end(); ) {
return FALSE;
}
for (auto clit = core.new_ochain_s.begin(); clit != core.new_ochain_s.end(); ++clit) {
effect* peffect = clit->triggering_effect; effect* peffect = clit->triggering_effect;
card* phandler = peffect->get_handler(); card* phandler = peffect->get_handler();
if((!peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER | EFFECT_FLAG_BOTH_SIDE) && phandler->is_has_relation(*clit)) if((!peffect->is_flag(EFFECT_FLAG_EVENT_PLAYER | EFFECT_FLAG_BOTH_SIDE) && phandler->is_has_relation(*clit))
...@@ -1739,164 +1732,83 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1739,164 +1732,83 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
clit->triggering_player = phandler->current.controler; clit->triggering_player = phandler->current.controler;
clit->set_triggering_place(phandler); clit->set_triggering_place(phandler);
} }
if(clit->triggering_player == infos.turn_player) uint8 tp = clit->triggering_player;
core.tpchain.push_back(*clit); bool act = true;
else if(peffect->is_chainable(tp) && peffect->is_activateable(tp, clit->evt, TRUE)
core.ntpchain.push_back(*clit);
}
core.new_ochain_s.clear();
core.new_ochain_s.splice(core.new_ochain_s.end(), core.tpchain);
core.new_ochain_s.splice(core.new_ochain_s.end(), core.ntpchain);
core.new_ochain_h.clear();
core.tmp_chain.clear();
core.current_player = infos.turn_player;
return FALSE;
}
case 5: {
if(core.new_ochain_s.size() == 0) {
if(core.current_player == infos.turn_player) {
if(core.tpchain.size() > 1)
add_process(PROCESSOR_SORT_CHAIN, 0, 0, 0, 1, infos.turn_player);
core.new_ochain_s.splice(core.new_ochain_s.end(), core.tmp_chain);
} else {
if(core.ntpchain.size() > 1)
add_process(PROCESSOR_SORT_CHAIN, 0, 0, 0, 0, infos.turn_player);
}
core.units.begin()->step = 6;
return FALSE;
}
auto clit = core.new_ochain_s.begin();
effect* peffect = clit->triggering_effect;
card* phandler = peffect->get_handler();
uint8 tp = clit->triggering_player;
bool act = true;
if(peffect->is_chainable(tp) && peffect->is_activateable(tp, clit->evt, TRUE)
&& (!(peffect->type & EFFECT_TYPE_FIELD) || phandler->is_has_relation(*clit)) && (!(peffect->type & EFFECT_TYPE_FIELD) || phandler->is_has_relation(*clit))
&& (peffect->code == EVENT_FLIP && infos.phase == PHASE_DAMAGE && (peffect->code == EVENT_FLIP && infos.phase == PHASE_DAMAGE
|| (clit->triggering_location & 0x43) && (clit->triggering_position & POS_FACEDOWN) || (clit->triggering_location & 0x43) && (clit->triggering_position & POS_FACEDOWN)
|| !(phandler->current.location & 0x43) || phandler->is_position(POS_FACEUP))) { || !(phandler->current.location & 0x43) || phandler->is_position(POS_FACEUP))) {
if(!peffect->is_flag(EFFECT_FLAG_FIELD_ONLY) && clit->triggering_location == LOCATION_HAND && (peffect->range & LOCATION_HAND)) { if(!peffect->is_flag(EFFECT_FLAG_FIELD_ONLY) && clit->triggering_location == LOCATION_HAND
core.new_ochain_h.push_back(*clit); && (((peffect->type & EFFECT_TYPE_SINGLE) && !peffect->is_flag(EFFECT_FLAG_SINGLE_RANGE) && phandler->is_has_relation(*clit))
act = false; || (peffect->range & LOCATION_HAND))) {
} else if(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY) || !(peffect->type & EFFECT_TYPE_FIELD) core.new_ochain_h.push_back(*clit);
|| peffect->in_range(*clit)) { act = false;
if(peffect->is_flag(EFFECT_FLAG_CHAIN_UNIQUE)) { } else if(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY) || !(peffect->type & EFFECT_TYPE_FIELD) || peffect->in_range(*clit)) {
if(tp == infos.turn_player) { if(peffect->is_flag(EFFECT_FLAG_CHAIN_UNIQUE)) {
for(auto tpit = core.tpchain.begin(); tpit != core.tpchain.end(); ++tpit) { for(auto tpit = core.new_chains.begin(); tpit != core.new_chains.end(); ++tpit) {
if(tpit->triggering_effect->get_handler()->data.code == phandler->data.code) { if(tpit->triggering_effect->get_handler()->data.code == phandler->data.code && tpit->triggering_player == tp) {
act = false;
break;
}
}
} else {
for(auto ntpit = core.ntpchain.begin(); ntpit != core.ntpchain.end(); ++ntpit) {
if(ntpit->triggering_effect->get_handler()->data.code == phandler->data.code) {
act = false; act = false;
break; break;
} }
} }
} }
} } else
} else act = false;
act = false; } else act = false;
} else act = false; if(act) {
if(act) { if(tp == core.current_player)
if(tp == core.current_player) core.select_chains.push_back(*clit);
add_process(PROCESSOR_SELECT_EFFECTYN, 0, 0, (group*)phandler, tp, 0); } else {
else { core.new_ochain_s.erase(clit++);
core.tmp_chain.push_back(*clit); continue;
returns.ivalue[0] = FALSE;
} }
} else returns.ivalue[0] = FALSE; ++clit;
}
if(core.select_chains.size() == 0) {
returns.ivalue[0] = -1;
core.units.begin()->step = 5;
return FALSE;
} else if(core.select_chains.size() == 1 && !core.current_chain.size()) {
add_process(PROCESSOR_SELECT_EFFECTYN, 0, 0, (group*)core.select_chains[0].triggering_effect->get_handler(), core.current_player, 0);
return FALSE;
} else {
add_process(PROCESSOR_SELECT_CHAIN, 0, 0, 0, core.current_player, 0x7f);
core.units.begin()->step = 5;
return FALSE;
}
return FALSE;
}
case 5: {
returns.ivalue[0]--;
return FALSE; return FALSE;
} }
case 6: { case 6: {
if(!returns.ivalue[0]) { if(returns.ivalue[0] == -1) {
core.new_ochain_s.pop_front(); for(auto cit = core.select_chains.begin(); cit != core.select_chains.end(); ++cit)
core.units.begin()->step = 4; core.new_ochain_s.remove_if([=](chain ch) { return ch.chain_id == cit->chain_id; });
return FALSE; if(core.new_ochain_s.size()) {
} core.current_player = 1 - infos.turn_player;
auto clit = core.new_ochain_s.begin(); core.units.begin()->step = 3;
effect* peffect = clit->triggering_effect; } else {
card* pcard = peffect->get_handler(); core.current_player = infos.turn_player;
uint8 tp = clit->triggering_player; core.units.begin()->step = 6;
core.select_effects.clear();
core.select_options.clear();
uintptr_t index = 0;
core.select_effects.push_back((effect*)index);
core.select_options.push_back(peffect->description);
while(++clit != core.new_ochain_s.end()) {
++index;
peffect = clit->triggering_effect;
card* phandler = peffect->get_handler();
if(pcard != phandler)
continue;
bool act = true;
if(peffect->is_chainable(tp) && peffect->is_activateable(tp, clit->evt, TRUE)
&& (!(peffect->type & EFFECT_TYPE_FIELD) || phandler->is_has_relation(*clit))
&& (peffect->code == EVENT_FLIP && infos.phase == PHASE_DAMAGE
|| (clit->triggering_location & 0x43) && (clit->triggering_position & POS_FACEDOWN)
|| !(phandler->current.location & 0x43) || phandler->is_position(POS_FACEUP))) {
if(!peffect->is_flag(EFFECT_FLAG_FIELD_ONLY) && clit->triggering_location == LOCATION_HAND && (peffect->range & LOCATION_HAND)) {
continue;
} else if(peffect->is_flag(EFFECT_FLAG_FIELD_ONLY) || !(peffect->type & EFFECT_TYPE_FIELD)
|| peffect->in_range(*clit)) {
if(peffect->is_flag(EFFECT_FLAG_CHAIN_UNIQUE)) {
if(tp == infos.turn_player) {
for(auto tpit = core.tpchain.begin(); tpit != core.tpchain.end(); ++tpit) {
if(tpit->triggering_effect->get_handler()->data.code == phandler->data.code) {
act = false;
break;
}
}
} else {
for(auto ntpit = core.ntpchain.begin(); ntpit != core.ntpchain.end(); ++ntpit) {
if(ntpit->triggering_effect->get_handler()->data.code == phandler->data.code) {
act = false;
break;
}
}
}
}
} else
continue;
} else continue;
if(act) {
core.select_effects.push_back((effect*)index);
core.select_options.push_back(peffect->description);
} }
}
if(core.select_options.size() > 1) {
add_process(PROCESSOR_SELECT_OPTION, 0, 0, 0, tp, 0);
core.units.begin()->step = 19;
return FALSE; return FALSE;
} }
clit = core.new_ochain_s.begin(); chain newchain = core.select_chains[returns.ivalue[0]];
peffect = clit->triggering_effect; effect* peffect = newchain.triggering_effect;
uint8 tp = newchain.triggering_player;
peffect->get_handler()->set_status(STATUS_CHAINING, TRUE); peffect->get_handler()->set_status(STATUS_CHAINING, TRUE);
peffect->dec_count(tp); peffect->dec_count(tp);
if(tp == infos.turn_player) core.new_chains.push_back(newchain);
core.tpchain.push_back(*clit); add_process(PROCESSOR_ADD_CHAIN, 0, 0, 0, 0, 0);
else core.new_ochain_s.remove_if([=](chain ch) { return ch.chain_id == newchain.chain_id; });
core.ntpchain.push_back(*clit); core.units.begin()->step = 3;
if(peffect->is_flag(EFFECT_FLAG_CVAL_CHECK))
peffect->get_value();
core.new_ochain_s.pop_front();
core.units.begin()->step = 4;
return FALSE; return FALSE;
} }
case 7: { case 7: {
if(core.current_player == infos.turn_player) { core.select_chains.clear();
core.new_chains.splice(core.new_chains.end(), core.tpchain);
if(core.new_chains.size())
add_process(PROCESSOR_ADD_CHAIN, 0, 0, 0, 0, 0);
core.current_player = 1 - infos.turn_player;
core.units.begin()->step = 4;
} else {
core.new_chains.splice(core.new_chains.end(), core.ntpchain);
if(core.new_chains.size())
add_process(PROCESSOR_ADD_CHAIN, 0, 0, 0, 0, 0);
}
return FALSE; return FALSE;
} }
case 8: { case 8: {
...@@ -1963,24 +1875,6 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1963,24 +1875,6 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
} }
return TRUE; return TRUE;
} }
case 20: {
uintptr_t index = (uintptr_t)core.select_effects[returns.ivalue[0]];
auto clit = core.new_ochain_s.begin();
std::advance(clit, index);
effect* peffect = clit->triggering_effect;
uint8 tp = clit->triggering_player;
peffect->get_handler()->set_status(STATUS_CHAINING, TRUE);
peffect->dec_count(tp);
if(tp == infos.turn_player)
core.tpchain.push_back(*clit);
else
core.ntpchain.push_back(*clit);
if(peffect->is_flag(EFFECT_FLAG_CVAL_CHECK))
peffect->get_value();
core.new_ochain_s.erase(clit);
core.units.begin()->step = 4;
return FALSE;
}
case 30: { case 30: {
int32 check_player = infos.turn_player; int32 check_player = infos.turn_player;
nil_event.event_code = EVENT_FREE_CHAIN; nil_event.event_code = EVENT_FREE_CHAIN;
......
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