Commit c06a0867 authored by salix5's avatar salix5 Committed by GitHub

Add setcode utility functions (#776)

parent e5ce3178
...@@ -455,11 +455,6 @@ uint32_t card::get_another_code() { ...@@ -455,11 +455,6 @@ uint32_t card::get_another_code() {
return otcode; return otcode;
return 0; return 0;
} }
inline bool check_setcode(uint16_t setcode, uint32_t value) {
const uint32_t settype = value & 0x0fffU;
const uint32_t setsubtype = value & 0xf000U;
return (setcode & 0x0fffU) == settype && (setcode & setsubtype) == setsubtype;
}
int32_t card::is_set_card(uint32_t set_code) { int32_t card::is_set_card(uint32_t set_code) {
uint32_t code1 = get_code(); uint32_t code1 = get_code();
card_data dat1; card_data dat1;
......
...@@ -24,6 +24,33 @@ const std::unordered_map<uint32_t, uint32_t> second_code = { ...@@ -24,6 +24,33 @@ const std::unordered_map<uint32_t, uint32_t> second_code = {
{CARD_HERMOS, 10000070u}, {CARD_HERMOS, 10000070u},
}; };
inline bool check_setcode(uint16_t setcode, uint32_t value) {
const uint32_t settype = value & 0x0fffU;
const uint32_t setsubtype = value & 0xf000U;
return setcode && (setcode & 0x0fffU) == settype && (setcode & setsubtype) == setsubtype;
}
inline void write_setcode(uint16_t list[], uint64_t value) {
if (!list)
return;
int len = 0;
while (value) {
if (value & 0xffff) {
list[len] = value & 0xffff;
++len;
}
value >>= 16;
}
if (len < SIZE_SETCODE)
std::memset(list + len, 0, (SIZE_SETCODE - len) * sizeof(uint16_t));
}
inline bool is_alternative(uint32_t code, uint32_t alias) {
if (code == CARD_BLACK_LUSTER_SOLDIER2)
return false;
return alias && (alias < code + CARD_ARTWORK_VERSIONS_OFFSET) && (code < alias + CARD_ARTWORK_VERSIONS_OFFSET);
}
struct card_data { struct card_data {
uint32_t code{}; uint32_t code{};
uint32_t alias{}; uint32_t alias{};
...@@ -43,38 +70,17 @@ struct card_data { ...@@ -43,38 +70,17 @@ struct card_data {
} }
bool is_setcode(uint32_t value) const { bool is_setcode(uint32_t value) const {
const uint16_t settype = value & 0x0fff;
const uint16_t setsubtype = value & 0xf000;
for (auto& x : setcode) { for (auto& x : setcode) {
if ((x & 0x0fff) == settype && (x & setsubtype) == setsubtype)
return true;
if (!x) if (!x)
return false; return false;
if (check_setcode(x, value))
return true;
} }
return false; return false;
} }
bool is_alternative() const {
if (code == CARD_BLACK_LUSTER_SOLDIER2)
return false;
return alias && (alias < code + CARD_ARTWORK_VERSIONS_OFFSET) && (code < alias + CARD_ARTWORK_VERSIONS_OFFSET);
}
void set_setcode(uint64_t value) {
int ctr = 0;
while (value) {
if (value & 0xffff) {
setcode[ctr] = value & 0xffff;
++ctr;
}
value >>= 16;
}
if (ctr < SIZE_SETCODE)
std::memset(setcode + ctr, 0, (SIZE_SETCODE - ctr) * sizeof(uint16_t));
}
uint32_t get_original_code() const { uint32_t get_original_code() const {
return is_alternative() ? alias : code; return is_alternative(code, alias) ? alias : code;
} }
}; };
......
...@@ -4446,7 +4446,7 @@ int32_t scriptlib::duel_is_player_can_spsummon_monster(lua_State * L) { ...@@ -4446,7 +4446,7 @@ int32_t scriptlib::duel_is_player_can_spsummon_monster(lua_State * L) {
dat.code = code; dat.code = code;
dat.alias = 0; dat.alias = 0;
if(lua_gettop(L) >= 3 && !lua_isnil(L, 3)) if(lua_gettop(L) >= 3 && !lua_isnil(L, 3))
dat.set_setcode((uint64_t)lua_tointeger(L, 3)); write_setcode(dat.setcode, lua_tointeger(L, 3));
if(lua_gettop(L) >= 4 && !lua_isnil(L, 4)) if(lua_gettop(L) >= 4 && !lua_isnil(L, 4))
dat.type = (uint32_t)lua_tointeger(L, 4); dat.type = (uint32_t)lua_tointeger(L, 4);
if(lua_gettop(L) >= 5 && !lua_isnil(L, 5)) if(lua_gettop(L) >= 5 && !lua_isnil(L, 5))
......
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