Commit 22f3ed54 authored by fallenstardust's avatar fallenstardust

sync ocgcore

parent 3c34ed0e
...@@ -192,7 +192,7 @@ struct processor { ...@@ -192,7 +192,7 @@ struct processor {
event_list sub_solving_event; event_list sub_solving_event;
chain_array select_chains; chain_array select_chains;
chain_array current_chain; chain_array current_chain;
chain_array tmp_chains; chain_array ignition_priority_chains;
chain_list continuous_chain; chain_list continuous_chain;
chain_list solving_continuous; chain_list solving_continuous;
chain_list sub_solving_continuous; chain_list sub_solving_continuous;
......
...@@ -683,7 +683,7 @@ int32 field::remove_counter(uint16 step, uint32 reason, card* pcard, uint8 rplay ...@@ -683,7 +683,7 @@ int32 field::remove_counter(uint16 step, uint32 reason, card* pcard, uint8 rplay
if(core.select_options.size() == 1) if(core.select_options.size() == 1)
returns.ivalue[0] = 0; returns.ivalue[0] = 0;
else if(core.select_effects[0] == 0 && core.select_effects.size() == 2) else if(core.select_effects[0] == 0 && core.select_effects.size() == 2)
add_process(PROCESSOR_SELECT_EFFECTYN, 0, 0, (group*)core.select_effects[1]->handler, rplayer, 219); add_process(PROCESSOR_SELECT_EFFECTYN, 0, 0, (group*)core.select_effects[1]->handler, rplayer, 220);
else else
add_process(PROCESSOR_SELECT_OPTION, 0, 0, 0, rplayer, 0); add_process(PROCESSOR_SELECT_OPTION, 0, 0, 0, rplayer, 0);
return FALSE; return FALSE;
...@@ -759,7 +759,7 @@ int32 field::remove_overlay_card(uint16 step, uint32 reason, card* pcard, uint8 ...@@ -759,7 +759,7 @@ int32 field::remove_overlay_card(uint16 step, uint32 reason, card* pcard, uint8
if(core.select_options.size() == 1) if(core.select_options.size() == 1)
returns.ivalue[0] = 0; returns.ivalue[0] = 0;
else if(core.select_effects[0] == 0 && core.select_effects.size() == 2) else if(core.select_effects[0] == 0 && core.select_effects.size() == 2)
add_process(PROCESSOR_SELECT_EFFECTYN, 0, 0, (group*)core.select_effects[1]->handler, rplayer, 220); add_process(PROCESSOR_SELECT_EFFECTYN, 0, 0, (group*)core.select_effects[1]->handler, rplayer, 219);
else else
add_process(PROCESSOR_SELECT_OPTION, 0, 0, 0, rplayer, 0); add_process(PROCESSOR_SELECT_OPTION, 0, 0, 0, rplayer, 0);
return FALSE; return FALSE;
...@@ -5944,16 +5944,19 @@ int32 field::toss_coin(uint16 step, effect * reason_effect, uint8 reason_player, ...@@ -5944,16 +5944,19 @@ int32 field::toss_coin(uint16 step, effect * reason_effect, uint8 reason_player,
effect* peffect = 0; effect* peffect = 0;
tevent e; tevent e;
e.event_cards = 0; e.event_cards = 0;
e.reason_effect = core.reason_effect;
e.reason_player = core.reason_player;
e.event_player = playerid; e.event_player = playerid;
e.event_value = count; e.event_value = count;
e.reason = 0;
e.reason_effect = reason_effect;
e.reason_player = reason_player;
for(uint8 i = 0; i < 5; ++i) for(uint8 i = 0; i < 5; ++i)
core.coin_result[i] = 0; core.coin_result[i] = 0;
filter_field_effect(EFFECT_TOSS_COIN_REPLACE, &eset); auto pr = effects.continuous_effect.equal_range(EFFECT_TOSS_COIN_REPLACE);
for(int32 i = eset.size() - 1; i >= 0; --i) { for(auto eit = pr.first; eit != pr.second;) {
if(eset[i]->is_activateable(eset[i]->get_handler_player(), e)) { effect* pe = eit->second;
peffect = eset[i]; ++eit;
if(pe->is_activateable(pe->get_handler_player(), e)) {
peffect = pe;
break; break;
} }
} }
...@@ -5967,17 +5970,22 @@ int32 field::toss_coin(uint16 step, effect * reason_effect, uint8 reason_player, ...@@ -5967,17 +5970,22 @@ int32 field::toss_coin(uint16 step, effect * reason_effect, uint8 reason_player,
} }
raise_event((card*)0, EVENT_TOSS_COIN_NEGATE, reason_effect, 0, reason_player, playerid, count); raise_event((card*)0, EVENT_TOSS_COIN_NEGATE, reason_effect, 0, reason_player, playerid, count);
process_instant_event(); process_instant_event();
return FALSE;
} else { } else {
solve_continuous(peffect->get_handler_player(), peffect, e); solve_continuous(peffect->get_handler_player(), peffect, e);
return TRUE; core.units.begin()->step = 1;
} }
return FALSE;
} }
case 1: { case 1: {
raise_event((card*)0, EVENT_TOSS_COIN, reason_effect, 0, reason_player, playerid, count); raise_event((card*)0, EVENT_TOSS_COIN, reason_effect, 0, reason_player, playerid, count);
process_instant_event(); process_instant_event();
return TRUE; return TRUE;
} }
case 2: {
for(uint8 i = 0; i < 5; ++i)
core.coin_result[i] = (returns.ivalue[0] >> (i * 4)) & 0xf;
return TRUE;
}
} }
return TRUE; return TRUE;
} }
...@@ -5988,16 +5996,19 @@ int32 field::toss_dice(uint16 step, effect * reason_effect, uint8 reason_player, ...@@ -5988,16 +5996,19 @@ int32 field::toss_dice(uint16 step, effect * reason_effect, uint8 reason_player,
effect* peffect = 0; effect* peffect = 0;
tevent e; tevent e;
e.event_cards = 0; e.event_cards = 0;
e.reason_effect = core.reason_effect;
e.reason_player = core.reason_player;
e.event_player = playerid; e.event_player = playerid;
e.event_value = count1 + (count2 << 16); e.event_value = count1 + (count2 << 16);
e.reason = 0;
e.reason_effect = reason_effect;
e.reason_player = reason_player;
for(int32 i = 0; i < 5; ++i) for(int32 i = 0; i < 5; ++i)
core.dice_result[i] = 0; core.dice_result[i] = 0;
filter_field_effect(EFFECT_TOSS_DICE_REPLACE, &eset); auto pr = effects.continuous_effect.equal_range(EFFECT_TOSS_DICE_REPLACE);
for(int32 i = eset.size() - 1; i >= 0; --i) { for(auto eit = pr.first; eit != pr.second;) {
if(eset[i]->is_activateable(eset[i]->get_handler_player(), e)) { effect* pe = eit->second;
peffect = eset[i]; ++eit;
if(pe->is_activateable(pe->get_handler_player(), e)) {
peffect = pe;
break; break;
} }
} }
...@@ -6020,17 +6031,22 @@ int32 field::toss_dice(uint16 step, effect * reason_effect, uint8 reason_player, ...@@ -6020,17 +6031,22 @@ int32 field::toss_dice(uint16 step, effect * reason_effect, uint8 reason_player,
} }
raise_event((card*)0, EVENT_TOSS_DICE_NEGATE, reason_effect, 0, reason_player, playerid, count1 + (count2 << 16)); raise_event((card*)0, EVENT_TOSS_DICE_NEGATE, reason_effect, 0, reason_player, playerid, count1 + (count2 << 16));
process_instant_event(); process_instant_event();
return FALSE;
} else { } else {
solve_continuous(peffect->get_handler_player(), peffect, e); solve_continuous(peffect->get_handler_player(), peffect, e);
return TRUE; core.units.begin()->step = 1;
} }
return FALSE;
} }
case 1: { case 1: {
raise_event((card*)0, EVENT_TOSS_DICE, reason_effect, 0, reason_player, playerid, count1 + (count2 << 16)); raise_event((card*)0, EVENT_TOSS_DICE, reason_effect, 0, reason_player, playerid, count1 + (count2 << 16));
process_instant_event(); process_instant_event();
return TRUE; return TRUE;
} }
case 2: {
for(uint8 i = 0; i < 5; ++i)
core.dice_result[i] = (returns.ivalue[0] >> (i * 4)) & 0xf;
return TRUE;
}
} }
return TRUE; return TRUE;
} }
......
...@@ -1646,7 +1646,6 @@ int32 field::process_phase_event(int16 step, int32 phase) { ...@@ -1646,7 +1646,6 @@ int32 field::process_phase_event(int16 step, int32 phase) {
} }
return TRUE; return TRUE;
} }
// core.tmp_chains: used in step 8 (obsolete ignition effect ruling)
int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_freechain, int32 skip_new) { int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_freechain, int32 skip_new) {
switch(step) { switch(step) {
case 0: { case 0: {
...@@ -1824,7 +1823,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1824,7 +1823,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
newchain.triggering_effect = peffect; newchain.triggering_effect = peffect;
newchain.set_triggering_state(phandler); newchain.set_triggering_state(phandler);
newchain.triggering_player = infos.turn_player; newchain.triggering_player = infos.turn_player;
core.tmp_chains.push_back(newchain); core.ignition_priority_chains.push_back(newchain);
} }
} }
} }
...@@ -1983,8 +1982,8 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori ...@@ -1983,8 +1982,8 @@ int32 field::process_quick_effect(int16 step, int32 skip_freechain, uint8 priori
} }
case 2: { case 2: {
chain newchain; chain newchain;
if(core.tmp_chains.size()) if(core.ignition_priority_chains.size())
core.select_chains.swap(core.tmp_chains); core.select_chains.swap(core.ignition_priority_chains);
for(auto evit = core.point_event.begin(); evit != core.instant_event.end(); ++evit) { for(auto evit = core.point_event.begin(); evit != core.instant_event.end(); ++evit) {
if(evit == core.point_event.end()) if(evit == core.point_event.end())
evit = core.instant_event.begin(); evit = core.instant_event.begin();
......
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