Commit 9fc0625d authored by salix5's avatar salix5 Committed by GitHub

split effect_count_code into different tables (#716)

* fix bitfield

* split effect_count_code into different tables

* change signature
parent eed52a9f
......@@ -168,8 +168,8 @@ int32_t effect::check_count_limit(uint8_t playerid) {
return FALSE;
if(count_code) {
uint32_t limit_code = count_code & MAX_CARD_ID;
uint32_t limit_type = count_code & 0xf0000000;
uint32_t count = count_limit_max;
uint32_t limit_type = count_code & 0xf0000000U;
int32_t count = count_limit_max;
if(limit_code == EFFECT_COUNT_CODE_SINGLE) {
if(pduel->game_field->get_effect_code(limit_type | get_handler()->fieldid, PLAYER_NONE) >= count)
return FALSE;
......
......@@ -131,10 +131,10 @@ public:
//#define EFFECT_STATUS_ACTIVATED 0x0002
#define EFFECT_STATUS_SPSELF 0x0004
#define EFFECT_COUNT_CODE_OATH 0x10000000
#define EFFECT_COUNT_CODE_DUEL 0x20000000
#define EFFECT_COUNT_CODE_CHAIN 0x40000000
#define EFFECT_COUNT_CODE_SINGLE 0x1
#define EFFECT_COUNT_CODE_OATH 0x10000000U
#define EFFECT_COUNT_CODE_DUEL 0x20000000U
#define EFFECT_COUNT_CODE_CHAIN 0x40000000U
#define EFFECT_COUNT_CODE_SINGLE 0x1U
//========== Reset ==========
#define RESET_SELF_TURN 0x10000000
......@@ -610,8 +610,8 @@ constexpr int32_t DOUBLE_DAMAGE = 0x80000000;
constexpr int32_t HALF_DAMAGE = 0x80000001;
// flag effect
#define EFFECT_FLAG_EFFECT 0x20000000
#define MAX_CARD_ID 0xfffffff
#define EFFECT_FLAG_EFFECT 0x20000000U
#define MAX_CARD_ID 0x0fffffffU
// The type of effect code
enum code_type : int32_t {
......
......@@ -1329,36 +1329,42 @@ void field::reset_chain() {
(*rm)->handler->remove_effect((*rm));
}
}
void field::add_effect_code(uint32_t code, uint32_t playerid) {
auto* count_map = &core.effect_count_code;
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_t field::get_effect_code(uint32_t code, uint32_t playerid) {
auto* count_map = &core.effect_count_code;
void field::add_effect_code(uint32_t code, int32_t playerid) {
if (playerid < 0 || playerid > PLAYER_NONE)
return;
auto count_map = &core.effect_count_code[playerid];
if (code & EFFECT_COUNT_CODE_DUEL)
count_map = &core.effect_count_code_duel[playerid];
else if (code & EFFECT_COUNT_CODE_CHAIN)
count_map = &core.effect_count_code_chain[playerid];
(*count_map)[code]++;
}
int32_t field::get_effect_code(uint32_t code, int32_t playerid) {
if (playerid < 0 || playerid > PLAYER_NONE)
return 0;
auto count_map = &core.effect_count_code[playerid];
if(code & EFFECT_COUNT_CODE_DUEL)
count_map = &core.effect_count_code_duel;
count_map = &core.effect_count_code_duel[playerid];
else if(code & EFFECT_COUNT_CODE_CHAIN)
count_map = &core.effect_count_code_chain;
auto iter = count_map->find(code + (playerid << 30));
count_map = &core.effect_count_code_chain[playerid];
auto iter = count_map->find(code);
if(iter == count_map->end())
return 0;
return iter->second;
}
void field::dec_effect_code(uint32_t code, uint32_t playerid) {
auto* count_map = &core.effect_count_code;
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;
auto iter = count_map->find(code + (playerid << 30));
void field::dec_effect_code(uint32_t code, int32_t playerid) {
if (playerid < 0 || playerid > PLAYER_NONE)
return;
auto count_map = &core.effect_count_code[playerid];
if (code & EFFECT_COUNT_CODE_DUEL)
count_map = &core.effect_count_code_duel[playerid];
else if (code & EFFECT_COUNT_CODE_CHAIN)
count_map = &core.effect_count_code_chain[playerid];
auto iter = count_map->find(code);
if(iter == count_map->end())
return;
if(iter->second > 0)
--iter->second;
if (iter->second > 0)
iter->second--;
}
void field::filter_field_effect(uint32_t code, effect_set* eset, uint8_t sort) {
auto rg = effects.aura_effect.equal_range(code);
......
......@@ -255,9 +255,9 @@ struct processor {
std::set<effect*> reseted_effects;
std::unordered_map<card*, uint32_t> readjust_map;
std::unordered_set<card*> unique_cards[2];
std::unordered_map<uint32_t, uint32_t> effect_count_code;
std::unordered_map<uint32_t, uint32_t> effect_count_code_duel;
std::unordered_map<uint32_t, uint32_t> effect_count_code_chain;
std::unordered_map<uint32_t, int32_t> effect_count_code[3];
std::unordered_map<uint32_t, int32_t> effect_count_code_duel[3];
std::unordered_map<uint32_t, int32_t> effect_count_code_chain[3];
std::unordered_map<uint32_t, uint32_t> spsummon_once_map[2];
std::multimap<int32_t, card*, std::greater<int32_t>> xmaterial_lst;
......@@ -415,9 +415,9 @@ public:
void release_oath_relation(effect* reason_effect);
void reset_phase(uint32_t phase);
void reset_chain();
void add_effect_code(uint32_t code, uint32_t playerid);
uint32_t get_effect_code(uint32_t code, uint32_t playerid);
void dec_effect_code(uint32_t code, uint32_t playerid);
void add_effect_code(uint32_t code, int32_t playerid);
int32_t get_effect_code(uint32_t code, int32_t playerid);
void dec_effect_code(uint32_t code, int32_t playerid);
void filter_field_effect(uint32_t code, effect_set* eset, uint8_t sort = TRUE);
void filter_affected_cards(effect* peffect, card_set* cset);
......
......@@ -172,7 +172,7 @@ int32_t scriptlib::effect_set_count_limit(lua_State *L) {
if(v == 0)
v = 1;
if(code == EFFECT_COUNT_CODE_CHAIN)
code = EFFECT_COUNT_CODE_CHAIN + EFFECT_COUNT_CODE_SINGLE;
code = EFFECT_COUNT_CODE_CHAIN | EFFECT_COUNT_CODE_SINGLE;
peffect->flag[0] |= EFFECT_FLAG_COUNT_LIMIT;
peffect->count_limit = v;
peffect->count_limit_max = v;
......
......@@ -1498,7 +1498,9 @@ int32_t field::process_point_event(int16_t step, int32_t skip_trigger, int32_t s
for(auto& ch_lim_p : core.chain_limit_p)
luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, ch_lim_p.function);
core.chain_limit_p.clear();
core.effect_count_code_chain.clear();
core.effect_count_code_chain[0].clear();
core.effect_count_code_chain[1].clear();
core.effect_count_code_chain[PLAYER_NONE].clear();
reset_chain();
returns.ivalue[0] = FALSE;
}
......@@ -3669,7 +3671,9 @@ int32_t field::process_turn(uint16_t step, uint8_t turn_player) {
pduel->delete_effect(peffect);
}
core.reseted_effects.clear();
core.effect_count_code.clear();
core.effect_count_code[0].clear();
core.effect_count_code[1].clear();
core.effect_count_code[PLAYER_NONE].clear();
for(uint8_t p = 0; p < 2; ++p) {
for(auto& pcard : player[p].list_mzone) {
if(!pcard)
......@@ -4544,7 +4548,9 @@ int32_t field::solve_chain(uint16_t step, uint32_t chainend_arg1, uint32_t chain
for(auto& ch_lim_p : core.chain_limit_p)
luaL_unref(pduel->lua->lua_state, LUA_REGISTRYINDEX, ch_lim_p.function);
core.chain_limit_p.clear();
core.effect_count_code_chain.clear();
core.effect_count_code_chain[0].clear();
core.effect_count_code_chain[1].clear();
core.effect_count_code_chain[PLAYER_NONE].clear();
reset_chain();
if (core.summoning_card)
core.subunits.push_back(core.summon_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