Commit af4efd81 authored by salix5's avatar salix5

card: update is_set_card()

parent 00ede3c8
...@@ -476,95 +476,66 @@ uint32 card::get_another_code() { ...@@ -476,95 +476,66 @@ uint32 card::get_another_code() {
return otcode; return otcode;
return 0; return 0;
} }
int32 card::is_set_card(uint32 set_code) { inline bool check_setcode(uint16_t setcode, uint32 value) {
uint32 code = get_code(); uint16_t settype = value & 0x0fff;
uint64 setcode; uint16_t setsubtype = value & 0xf000;
if (code == data.code) { return (setcode & 0x0fff) == settype && (setcode & 0xf000 & setsubtype) == setsubtype;
setcode = data.setcode; }
} else { bool card::check_card_setcode(uint32 code, uint32 value) {
card_data dat; card_data dat;
::read_card(code, &dat); ::read_card(code, &dat);
setcode = dat.setcode; return dat.is_setcode(value);
}
int32 card::is_set_card(uint32 set_code) {
uint32 code1 = get_code();
card_data dat1;
if (code1 == data.code) {
if (data.is_setcode(set_code))
return TRUE;
} }
uint32 settype = set_code & 0xfff; else {
uint32 setsubtype = set_code & 0xf000; if (check_card_setcode(code1, set_code))
while(setcode) {
if ((setcode & 0xfff) == settype && (setcode & 0xf000 & setsubtype) == setsubtype)
return TRUE; return TRUE;
setcode = setcode >> 16;
} }
uint32 code2 = get_another_code();
if (code2 && check_card_setcode(code2, set_code))
return TRUE;
//add set code //add set code
effect_set eset; effect_set eset;
filter_effect(EFFECT_ADD_SETCODE, &eset); filter_effect(EFFECT_ADD_SETCODE, &eset);
for(int32 i = 0; i < eset.size(); ++i) { for(int32 i = 0; i < eset.size(); ++i) {
uint32 value = eset[i]->get_value(this); uint32 value = eset[i]->get_value(this);
if ((value & 0xfff) == settype && (value & 0xf000 & setsubtype) == setsubtype) uint16_t new_setcode = value & 0xffff;
return TRUE; if (check_setcode(new_setcode, set_code))
}
//another code
uint32 code2 = get_another_code();
uint64 setcode2;
if (code2 != 0) {
card_data dat;
::read_card(code2, &dat);
setcode2 = dat.setcode;
} else {
return FALSE;
}
while(setcode2) {
if ((setcode2 & 0xfff) == settype && (setcode2 & 0xf000 & setsubtype) == setsubtype)
return TRUE; return TRUE;
setcode2 = setcode2 >> 16;
} }
return FALSE; return FALSE;
} }
int32 card::is_origin_set_card(uint32 set_code) { int32 card::is_origin_set_card(uint32 set_code) {
uint64 setcode = data.setcode; if (data.is_setcode(set_code))
uint32 settype = set_code & 0xfff; return TRUE;
uint32 setsubtype = set_code & 0xf000; uint32 code2 = std::get<1>(get_original_code_rule());
while(setcode) { if (code2 && check_card_setcode(code2, set_code))
if((setcode & 0xfff) == settype && (setcode & 0xf000 & setsubtype) == setsubtype)
return TRUE; return TRUE;
setcode = setcode >> 16;
}
return FALSE; return FALSE;
} }
int32 card::is_pre_set_card(uint32 set_code) { int32 card::is_pre_set_card(uint32 set_code) {
uint32 code = previous.code; uint32 code = previous.code;
uint64 setcode;
if (code == data.code) { if (code == data.code) {
setcode = data.setcode; if (data.is_setcode(set_code))
} else {
card_data dat;
::read_card(code, &dat);
setcode = dat.setcode;
}
uint32 settype = set_code & 0xfff;
uint32 setsubtype = set_code & 0xf000;
while(setcode) {
if ((setcode & 0xfff) == settype && (setcode & 0xf000 & setsubtype) == setsubtype)
return TRUE; return TRUE;
setcode = setcode >> 16;
} }
//add set code else {
for(auto& presetcode : previous.setcode) { if (check_card_setcode(code, set_code))
if (presetcode && (presetcode & 0xfff) == settype && (presetcode & 0xf000 & setsubtype) == setsubtype)
return TRUE; return TRUE;
} }
//another code
uint32 code2 = previous.code2; uint32 code2 = previous.code2;
uint64 setcode2; if (code2 && check_card_setcode(code2, set_code))
if (code2 != 0) { return TRUE;
card_data dat; //add set code
::read_card(code2, &dat); for(auto& presetcode : previous.setcode) {
setcode2 = dat.setcode; if (check_setcode(presetcode, set_code))
} else {
return FALSE;
}
while(setcode2) {
if ((setcode2 & 0xfff) == settype && (setcode2 & 0xf000 & setsubtype) == setsubtype)
return TRUE; return TRUE;
setcode2 = setcode2 >> 16;
} }
return FALSE; return FALSE;
} }
...@@ -573,26 +544,19 @@ int32 card::is_fusion_set_card(uint32 set_code) { ...@@ -573,26 +544,19 @@ int32 card::is_fusion_set_card(uint32 set_code) {
return TRUE; return TRUE;
if(pduel->game_field->core.not_material) if(pduel->game_field->core.not_material)
return FALSE; return FALSE;
uint32 settype = set_code & 0xfff;
uint32 setsubtype = set_code & 0xf000;
effect_set eset; effect_set eset;
filter_effect(EFFECT_ADD_FUSION_CODE, &eset); filter_effect(EFFECT_ADD_FUSION_CODE, &eset);
for(int32 i = 0; i < eset.size(); ++i) { for(int32 i = 0; i < eset.size(); ++i) {
uint32 code = eset[i]->get_value(this); uint32 code = eset[i]->get_value(this);
card_data dat; if (check_card_setcode(code, set_code))
::read_card(code, &dat);
uint64 setcode = dat.setcode;
while(setcode) {
if ((setcode & 0xfff) == settype && (setcode & 0xf000 & setsubtype) == setsubtype)
return TRUE; return TRUE;
setcode = setcode >> 16;
}
} }
eset.clear(); eset.clear();
filter_effect(EFFECT_ADD_FUSION_SETCODE, &eset); filter_effect(EFFECT_ADD_FUSION_SETCODE, &eset);
for(int32 i = 0; i < eset.size(); ++i) { for(int32 i = 0; i < eset.size(); ++i) {
uint32 setcode = eset[i]->get_value(this); uint32 value = eset[i]->get_value(this);
if ((setcode & 0xfff) == settype && (setcode & 0xf000 & setsubtype) == setsubtype) uint16_t new_setcode = value & 0xffff;
if (check_setcode(new_setcode, set_code))
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
...@@ -606,53 +570,22 @@ int32 card::is_link_set_card(uint32 set_code) { ...@@ -606,53 +570,22 @@ int32 card::is_link_set_card(uint32 set_code) {
filter_effect(EFFECT_ADD_LINK_CODE, &eset); filter_effect(EFFECT_ADD_LINK_CODE, &eset);
for(int32 i = 0; i < eset.size(); ++i) { for(int32 i = 0; i < eset.size(); ++i) {
uint32 code = eset[i]->get_value(this); uint32 code = eset[i]->get_value(this);
card_data dat; if (check_card_setcode(code, set_code))
::read_card(code, &dat);
uint64 setcode = dat.setcode;
while(setcode) {
if ((setcode & 0xfff) == settype && (setcode & 0xf000 & setsubtype) == setsubtype)
return TRUE; return TRUE;
setcode = setcode >> 16;
}
} }
return FALSE; return FALSE;
} }
int32 card::is_special_summon_set_card(uint32 set_code) { int32 card::is_special_summon_set_card(uint32 set_code) {
uint32 code = spsummon.code; uint32 code = spsummon.code;
uint64 setcode; if (check_card_setcode(code, set_code))
if (code == data.code) { return TRUE;
setcode = data.setcode; uint32 code2 = spsummon.code2;
} else { if (code2 && check_card_setcode(code2, set_code))
card_data dat;
::read_card(code, &dat);
setcode = dat.setcode;
}
uint32 settype = set_code & 0xfff;
uint32 setsubtype = set_code & 0xf000;
while(setcode) {
if ((setcode & 0xfff) == settype && (setcode & 0xf000 & setsubtype) == setsubtype)
return TRUE; return TRUE;
setcode = setcode >> 16;
}
//add set code //add set code
for(auto& spsetcode : spsummon.setcode) { for(auto& spsetcode : spsummon.setcode) {
if (spsetcode && (spsetcode & 0xfff) == settype && (spsetcode & 0xf000 & setsubtype) == setsubtype) if (check_setcode(spsetcode, set_code))
return TRUE;
}
//another code
uint32 code2 = spsummon.code2;
uint64 setcode2;
if (code2 != 0) {
card_data dat;
::read_card(code2, &dat);
setcode2 = dat.setcode;
} else {
return FALSE;
}
while(setcode2) {
if ((setcode2 & 0xfff) == settype && (setcode2 & 0xf000 & setsubtype) == setsubtype)
return TRUE; return TRUE;
setcode2 = setcode2 >> 16;
} }
return FALSE; return FALSE;
} }
......
...@@ -218,6 +218,7 @@ public: ...@@ -218,6 +218,7 @@ public:
std::tuple<uint32, uint32> get_original_code_rule() const; std::tuple<uint32, uint32> get_original_code_rule() const;
uint32 get_code(); uint32 get_code();
uint32 get_another_code(); uint32 get_another_code();
static bool check_card_setcode(uint32 code, uint32 value);
int32 is_set_card(uint32 set_code); int32 is_set_card(uint32 set_code);
int32 is_origin_set_card(uint32 set_code); int32 is_origin_set_card(uint32 set_code);
int32 is_pre_set_card(uint32 set_code); int32 is_pre_set_card(uint32 set_code);
......
...@@ -4294,8 +4294,10 @@ int32 scriptlib::duel_is_player_can_spsummon_monster(lua_State * L) { ...@@ -4294,8 +4294,10 @@ int32 scriptlib::duel_is_player_can_spsummon_monster(lua_State * L) {
::read_card(code, &dat); ::read_card(code, &dat);
dat.code = code; dat.code = code;
dat.alias = 0; dat.alias = 0;
if(!lua_isnil(L, 3)) if(!lua_isnil(L, 3)) {
dat.setcode = lua_tointeger(L, 3); uint64 setcode_list = lua_tointeger(L, 3);
dat.set_setcode(setcode_list);
}
if(!lua_isnil(L, 4)) if(!lua_isnil(L, 4))
dat.type = (uint32)lua_tointeger(L, 4); dat.type = (uint32)lua_tointeger(L, 4);
if(!lua_isnil(L, 5)) if(!lua_isnil(L, 5))
......
...@@ -920,15 +920,7 @@ static int32 is_declarable(card_data const& cd, const std::vector<uint32>& opcod ...@@ -920,15 +920,7 @@ static int32 is_declarable(card_data const& cd, const std::vector<uint32>& opcod
if(stack.size() >= 1) { if(stack.size() >= 1) {
int32 set_code = stack.top(); int32 set_code = stack.top();
stack.pop(); stack.pop();
uint64 sc = cd.setcode; bool res = cd.is_setcode(set_code);
bool res = false;
uint32 settype = set_code & 0xfff;
uint32 setsubtype = set_code & 0xf000;
while(sc) {
if((sc & 0xfff) == settype && (sc & 0xf000 & setsubtype) == setsubtype)
res = true;
sc = sc >> 16;
}
stack.push(res); stack.push(res);
} }
break; break;
......
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