Commit 0df2566f authored by nanahira's avatar nanahira

Merge branch 'master' of github.com:moecube/ygopro-core

parents b431b512 a8cc7f5d
...@@ -107,6 +107,8 @@ struct card_sort { ...@@ -107,6 +107,8 @@ struct card_sort {
#define ATTRIBUTE_DEVINE 0x40 // #define ATTRIBUTE_DEVINE 0x40 //
//Races //Races
#define RACES_COUNT 26
#define RACE_ALL 0x3ffffff
#define RACE_WARRIOR 0x1 // #define RACE_WARRIOR 0x1 //
#define RACE_SPELLCASTER 0x2 // #define RACE_SPELLCASTER 0x2 //
#define RACE_FAIRY 0x4 // #define RACE_FAIRY 0x4 //
...@@ -132,6 +134,7 @@ struct card_sort { ...@@ -132,6 +134,7 @@ struct card_sort {
#define RACE_CREATORGOD 0x400000 // #define RACE_CREATORGOD 0x400000 //
#define RACE_WYRM 0x800000 // #define RACE_WYRM 0x800000 //
#define RACE_CYBERSE 0x1000000 // #define RACE_CYBERSE 0x1000000 //
#define RACE_ILLUSION 0x2000000 //
//Reason //Reason
#define REASON_DESTROY 0x1 // #define REASON_DESTROY 0x1 //
......
...@@ -201,7 +201,7 @@ int32 effect::check_count_limit(uint8 playerid) { ...@@ -201,7 +201,7 @@ int32 effect::check_count_limit(uint8 playerid) {
if(count_code) { if(count_code) {
uint32 code = count_code & 0xfffffff; uint32 code = count_code & 0xfffffff;
uint32 count = count_limit_max; uint32 count = count_limit_max;
if(code == 1) { if(code == EFFECT_COUNT_CODE_SINGLE) {
if(pduel->game_field->get_effect_code((count_code & 0xf0000000) | get_handler()->fieldid, PLAYER_NONE) >= count) if(pduel->game_field->get_effect_code((count_code & 0xf0000000) | get_handler()->fieldid, PLAYER_NONE) >= count)
return FALSE; return FALSE;
} else { } else {
...@@ -669,7 +669,7 @@ void effect::dec_count(uint32 playerid) { ...@@ -669,7 +669,7 @@ void effect::dec_count(uint32 playerid) {
count_limit -= 1; count_limit -= 1;
if(count_code) { if(count_code) {
uint32 code = count_code & 0xfffffff; uint32 code = count_code & 0xfffffff;
if(code == 1) if(code == EFFECT_COUNT_CODE_SINGLE)
pduel->game_field->add_effect_code((count_code & 0xf0000000) | get_handler()->fieldid, PLAYER_NONE); pduel->game_field->add_effect_code((count_code & 0xf0000000) | get_handler()->fieldid, PLAYER_NONE);
else else
pduel->game_field->add_effect_code(count_code, playerid); pduel->game_field->add_effect_code(count_code, playerid);
......
...@@ -140,8 +140,10 @@ public: ...@@ -140,8 +140,10 @@ public:
//#define EFFECT_STATUS_ACTIVATED 0x0002 //#define EFFECT_STATUS_ACTIVATED 0x0002
#define EFFECT_STATUS_SPSELF 0x0004 #define EFFECT_STATUS_SPSELF 0x0004
#define EFFECT_COUNT_CODE_OATH 0x10000000 #define EFFECT_COUNT_CODE_OATH 0x10000000
#define EFFECT_COUNT_CODE_DUEL 0x20000000 #define EFFECT_COUNT_CODE_DUEL 0x20000000
#define EFFECT_COUNT_CODE_CHAIN 0x40000000
#define EFFECT_COUNT_CODE_SINGLE 0x1
//========== Reset ========== //========== Reset ==========
#define RESET_SELF_TURN 0x10000000 #define RESET_SELF_TURN 0x10000000
......
...@@ -1101,6 +1101,7 @@ void field::swap_deck_and_grave(uint8 playerid) { ...@@ -1101,6 +1101,7 @@ void field::swap_deck_and_grave(uint8 playerid) {
pcard->apply_field_effect(); pcard->apply_field_effect();
pcard->enable_field_effect(true); pcard->enable_field_effect(true);
pcard->reset(RESET_TODECK, RESET_EVENT); pcard->reset(RESET_TODECK, RESET_EVENT);
pcard->set_status(STATUS_PROC_COMPLETE, FALSE);
} }
for(auto& pcard : ex) { for(auto& pcard : ex) {
pcard->current.position = POS_FACEDOWN_DEFENSE; pcard->current.position = POS_FACEDOWN_DEFENSE;
...@@ -1111,6 +1112,7 @@ void field::swap_deck_and_grave(uint8 playerid) { ...@@ -1111,6 +1112,7 @@ void field::swap_deck_and_grave(uint8 playerid) {
pcard->apply_field_effect(); pcard->apply_field_effect();
pcard->enable_field_effect(true); pcard->enable_field_effect(true);
pcard->reset(RESET_TODECK, RESET_EVENT); pcard->reset(RESET_TODECK, RESET_EVENT);
pcard->set_status(STATUS_PROC_COMPLETE, FALSE);
} }
player[playerid].list_extra.insert(player[playerid].list_extra.end() - player[playerid].extra_p_count, ex.begin(), ex.end()); player[playerid].list_extra.insert(player[playerid].list_extra.end() - player[playerid].extra_p_count, ex.begin(), ex.end());
reset_sequence(playerid, LOCATION_GRAVE); reset_sequence(playerid, LOCATION_GRAVE);
...@@ -1342,20 +1344,32 @@ void field::reset_chain() { ...@@ -1342,20 +1344,32 @@ void field::reset_chain() {
} }
} }
void field::add_effect_code(uint32 code, uint32 playerid) { void field::add_effect_code(uint32 code, uint32 playerid) {
auto& count_map = (code & EFFECT_COUNT_CODE_DUEL) ? core.effect_count_code_duel : core.effect_count_code; auto* count_map = &core.effect_count_code;
count_map[code + (playerid << 30)]++; if(code & EFFECT_COUNT_CODE_DUEL)
count_map = &core.effect_count_code_duel;
else if(code & EFFECT_COUNT_CODE_CHAIN)
count_map = &core.effect_count_code_chain;
(*count_map)[code + (playerid << 30)]++;
} }
uint32 field::get_effect_code(uint32 code, uint32 playerid) { uint32 field::get_effect_code(uint32 code, uint32 playerid) {
auto& count_map = (code & EFFECT_COUNT_CODE_DUEL) ? core.effect_count_code_duel : core.effect_count_code; auto* count_map = &core.effect_count_code;
auto iter = count_map.find(code + (playerid << 30)); if(code & EFFECT_COUNT_CODE_DUEL)
if(iter == count_map.end()) count_map = &core.effect_count_code_duel;
else if(code & EFFECT_COUNT_CODE_CHAIN)
count_map = &core.effect_count_code_chain;
auto iter = count_map->find(code + (playerid << 30));
if(iter == count_map->end())
return 0; return 0;
return iter->second; return iter->second;
} }
void field::dec_effect_code(uint32 code, uint32 playerid) { void field::dec_effect_code(uint32 code, uint32 playerid) {
auto& count_map = (code & EFFECT_COUNT_CODE_DUEL) ? core.effect_count_code_duel : core.effect_count_code; auto* count_map = &core.effect_count_code;
auto iter = count_map.find(code + (playerid << 30)); if(code & EFFECT_COUNT_CODE_DUEL)
if(iter == count_map.end()) count_map = &core.effect_count_code_duel;
else if(code & EFFECT_COUNT_CODE_CHAIN)
count_map = &core.effect_count_code_chain;
auto iter = count_map->find(code + (playerid << 30));
if(iter == count_map->end())
return; return;
if(iter->second > 0) if(iter->second > 0)
iter->second--; iter->second--;
......
...@@ -263,6 +263,7 @@ struct processor { ...@@ -263,6 +263,7 @@ struct processor {
std::unordered_set<card*> unique_cards[2]; std::unordered_set<card*> unique_cards[2];
std::unordered_map<uint32, uint32> effect_count_code; std::unordered_map<uint32, uint32> effect_count_code;
std::unordered_map<uint32, uint32> effect_count_code_duel; std::unordered_map<uint32, uint32> effect_count_code_duel;
std::unordered_map<uint32, uint32> effect_count_code_chain;
std::unordered_map<uint32, uint32> spsummon_once_map[2]; std::unordered_map<uint32, uint32> spsummon_once_map[2];
std::multimap<int32, card*, std::greater<int32>> xmaterial_lst; std::multimap<int32, card*, std::greater<int32>> xmaterial_lst;
......
...@@ -154,6 +154,8 @@ int32 scriptlib::effect_set_count_limit(lua_State *L) { ...@@ -154,6 +154,8 @@ int32 scriptlib::effect_set_count_limit(lua_State *L) {
code = (uint32)lua_tointeger(L, 3); code = (uint32)lua_tointeger(L, 3);
if(v == 0) if(v == 0)
v = 1; v = 1;
if(code == EFFECT_COUNT_CODE_CHAIN)
code = EFFECT_COUNT_CODE_CHAIN + EFFECT_COUNT_CODE_SINGLE;
peffect->flag[0] |= EFFECT_FLAG_COUNT_LIMIT; peffect->flag[0] |= EFFECT_FLAG_COUNT_LIMIT;
peffect->count_limit = v; peffect->count_limit = v;
peffect->count_limit_max = v; peffect->count_limit_max = v;
......
...@@ -753,7 +753,7 @@ int32 field::sort_card(int16 step, uint8 playerid) { ...@@ -753,7 +753,7 @@ int32 field::sort_card(int16 step, uint8 playerid) {
int32 field::announce_race(int16 step, uint8 playerid, int32 count, int32 available) { int32 field::announce_race(int16 step, uint8 playerid, int32 count, int32 available) {
if(step == 0) { if(step == 0) {
int32 scount = 0; int32 scount = 0;
for(int32 ft = 0x1; ft != 0x2000000; ft <<= 1) { for(int32 ft = 0x1; ft < (1 << RACES_COUNT); ft <<= 1) {
if(ft & available) if(ft & available)
scount++; scount++;
} }
...@@ -769,7 +769,7 @@ int32 field::announce_race(int16 step, uint8 playerid, int32 count, int32 availa ...@@ -769,7 +769,7 @@ int32 field::announce_race(int16 step, uint8 playerid, int32 count, int32 availa
} else { } else {
int32 rc = returns.ivalue[0]; int32 rc = returns.ivalue[0];
int32 sel = 0; int32 sel = 0;
for(int32 ft = 0x1; ft != 0x2000000; ft <<= 1) { for(int32 ft = 0x1; ft < (1 << RACES_COUNT); ft <<= 1) {
if(!(ft & rc)) continue; if(!(ft & rc)) continue;
if(!(ft & available)) { if(!(ft & available)) {
pduel->write_buffer8(MSG_RETRY); pduel->write_buffer8(MSG_RETRY);
......
...@@ -1492,6 +1492,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free ...@@ -1492,6 +1492,7 @@ int32 field::process_point_event(int16 step, int32 skip_trigger, int32 skip_free
for(auto& ch_lim_p : core.chain_limit_p) for(auto& ch_lim_p : core.chain_limit_p)
luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, ch_lim_p.function); luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, ch_lim_p.function);
core.chain_limit_p.clear(); core.chain_limit_p.clear();
core.effect_count_code_chain.clear();
reset_chain(); reset_chain();
returns.ivalue[0] = FALSE; returns.ivalue[0] = FALSE;
} }
...@@ -3316,8 +3317,12 @@ int32 field::process_damage_step(uint16 step, uint32 new_attack) { ...@@ -3316,8 +3317,12 @@ int32 field::process_damage_step(uint16 step, uint32 new_attack) {
case 3: { case 3: {
core.attacker = (card*)core.units.begin()->peffect; core.attacker = (card*)core.units.begin()->peffect;
core.attack_target = (card*)core.units.begin()->ptarget; core.attack_target = (card*)core.units.begin()->ptarget;
if(core.attacker) if(core.attacker) {
core.attacker->set_status(STATUS_ATTACK_CANCELED, TRUE); core.attacker->set_status(STATUS_ATTACK_CANCELED, TRUE);
core.attacker->announce_count++;
core.attacker->announced_cards.addcard(core.attack_target);
attack_all_target_check();
}
if(core.attack_target) if(core.attack_target)
core.attack_target->set_status(STATUS_ATTACK_CANCELED, TRUE); core.attack_target->set_status(STATUS_ATTACK_CANCELED, TRUE);
core.effect_damage_step = 0; core.effect_damage_step = 0;
...@@ -4502,6 +4507,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2 ...@@ -4502,6 +4507,7 @@ int32 field::solve_chain(uint16 step, uint32 chainend_arg1, uint32 chainend_arg2
for(auto& ch_lim_p : core.chain_limit_p) for(auto& ch_lim_p : core.chain_limit_p)
luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, ch_lim_p.function); luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, ch_lim_p.function);
core.chain_limit_p.clear(); core.chain_limit_p.clear();
core.effect_count_code_chain.clear();
reset_chain(); reset_chain();
if(core.summoning_card || core.effect_damage_step == 1) if(core.summoning_card || core.effect_damage_step == 1)
core.subunits.push_back(core.reserved); core.subunits.push_back(core.reserved);
......
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