Commit b585cd14 authored by fallenstardust's avatar fallenstardust

sync ocgcore

parent ff766e94
...@@ -1044,22 +1044,43 @@ uint32_t card::get_ritual_level(card* pcard) { ...@@ -1044,22 +1044,43 @@ uint32_t card::get_ritual_level(card* pcard) {
uint32_t card::check_xyz_level(card* pcard, uint32_t lv) { uint32_t card::check_xyz_level(card* pcard, uint32_t lv) {
if(status & STATUS_NO_LEVEL) if(status & STATUS_NO_LEVEL)
return 0; return 0;
int32_t min_count = 0;
effect_set mset;
filter_effect(EFFECT_XYZ_MIN_COUNT, &mset);
for (int32_t i = 0; i < mset.size(); ++i) {
pduel->lua->add_param(this, PARAM_TYPE_CARD);
pduel->lua->add_param(pcard, PARAM_TYPE_CARD);
int32_t count = mset[i]->get_value(2);
if (count > min_count)
min_count = count;
}
if (min_count > 0xf)
min_count = 0xf;
effect_set eset; effect_set eset;
filter_effect(EFFECT_XYZ_LEVEL, &eset); filter_effect(EFFECT_XYZ_LEVEL, &eset);
if(!eset.size()) { if(!eset.size()) {
uint32_t lev = get_level(); uint32_t card_lv = get_level();
if(lev == lv) if (card_lv == lv)
return lev; return (card_lv & MAX_XYZ_LEVEL) | ((uint32_t)min_count << 12);
return 0; return 0;
} }
for(int32_t i = 0; i < eset.size(); ++i) { for(int32_t i = 0; i < eset.size(); ++i) {
pduel->lua->add_param(this, PARAM_TYPE_CARD); pduel->lua->add_param(this, PARAM_TYPE_CARD);
pduel->lua->add_param(pcard, PARAM_TYPE_CARD); pduel->lua->add_param(pcard, PARAM_TYPE_CARD);
uint32_t lev = eset[i]->get_value(2); uint32_t lev = eset[i]->get_value(2);
if(((lev & 0xfff) == lv)) uint16_t lv1 = lev & MAX_XYZ_LEVEL;
return lev & 0xffff; uint16_t count1 = (lev & 0xf000) >> 12;
if(((lev >> 16) & 0xfff) == lv) if (count1 < min_count)
return (lev >> 16) & 0xffff; count1 = min_count;
if (lv1 == lv)
return lv1 | ((uint32_t)count1 << 12);
lev >>= 16;
uint16_t lv2 = lev & MAX_XYZ_LEVEL;
uint16_t count2 = (lev & 0xf000) >> 12;
if (count2 < min_count)
count2 = min_count;
if (lv2 == lv)
return lv2 | ((uint32_t)count2 << 12);
} }
return 0; return 0;
} }
......
...@@ -54,10 +54,10 @@ struct card_state { ...@@ -54,10 +54,10 @@ struct card_state {
uint8_t sequence{ 0 }; uint8_t sequence{ 0 };
uint8_t position{ 0 }; uint8_t position{ 0 };
uint32_t reason{ 0 }; uint32_t reason{ 0 };
bool pzone{ false };
card* reason_card{ nullptr }; card* reason_card{ nullptr };
uint8_t reason_player{ PLAYER_NONE };
effect* reason_effect{ nullptr }; effect* reason_effect{ nullptr };
uint8_t reason_player{ PLAYER_NONE };
bool pzone{ false };
bool is_location(uint32_t loc) const; bool is_location(uint32_t loc) const;
bool is_main_mzone() const { bool is_main_mzone() const {
...@@ -168,7 +168,7 @@ public: ...@@ -168,7 +168,7 @@ public:
uint8_t attacked_count{}; uint8_t attacked_count{};
uint8_t attack_all_target{}; uint8_t attack_all_target{};
uint8_t attack_controler{}; uint8_t attack_controler{};
uint16_t cardid{}; uint64_t cardid{};
uint32_t fieldid{}; uint32_t fieldid{};
uint32_t fieldid_r{}; uint32_t fieldid_r{};
uint16_t turnid{}; uint16_t turnid{};
......
...@@ -529,6 +529,7 @@ const std::map<uint64_t, uint64_t> category_checklist{ ...@@ -529,6 +529,7 @@ const std::map<uint64_t, uint64_t> category_checklist{
#define EFFECT_TUNER 369 #define EFFECT_TUNER 369
#define EFFECT_KAISER_COLOSSEUM 370 #define EFFECT_KAISER_COLOSSEUM 370
#define EFFECT_REPLACE_DAMAGE 371 #define EFFECT_REPLACE_DAMAGE 371
#define EFFECT_XYZ_MIN_COUNT 372
//#define EVENT_STARTUP 1000 //#define EVENT_STARTUP 1000
#define EVENT_FLIP 1001 #define EVENT_FLIP 1001
...@@ -606,8 +607,11 @@ const std::map<uint64_t, uint64_t> category_checklist{ ...@@ -606,8 +607,11 @@ const std::map<uint64_t, uint64_t> category_checklist{
#define EVENT_REMOVE_COUNTER 0x20000 #define EVENT_REMOVE_COUNTER 0x20000
#define EVENT_CUSTOM 0x10000000 #define EVENT_CUSTOM 0x10000000
constexpr int32_t DOUBLE_DAMAGE = 0x80000000; constexpr int32_t DOUBLE_DAMAGE = INT32_MIN;
constexpr int32_t HALF_DAMAGE = 0x80000001; constexpr int32_t HALF_DAMAGE = INT32_MIN + 1;
constexpr uint32_t MAX_PARAMETER = 0xffffU;
constexpr uint32_t MAX_XYZ_LEVEL = 0x0fffU;
// flag effect // flag effect
#define EFFECT_FLAG_EFFECT 0x20000000U #define EFFECT_FLAG_EFFECT 0x20000000U
......
...@@ -123,11 +123,11 @@ struct field_effect { ...@@ -123,11 +123,11 @@ struct field_effect {
grant_effect_container grant_effect; grant_effect_container grant_effect;
}; };
struct field_info { struct field_info {
uint64_t card_id{ 1 };
int32_t field_id{ 1 }; int32_t field_id{ 1 };
uint16_t copy_id{ 1 }; uint16_t copy_id{ 1 };
uint16_t turn_id{}; uint16_t turn_id{};
uint16_t turn_id_by_player[2]{}; uint16_t turn_id_by_player[2]{};
uint16_t card_id{ 1 };
uint16_t phase{}; uint16_t phase{};
uint8_t turn_player{}; uint8_t turn_player{};
uint8_t priorities[2]{}; uint8_t priorities[2]{};
......
...@@ -18,17 +18,17 @@ class duel; ...@@ -18,17 +18,17 @@ class duel;
using card_set = std::set<card*, card_sort>; using card_set = std::set<card*, card_sort>;
constexpr int GTYPE_DEFAULT = 0; constexpr uint32_t GTYPE_DEFAULT = 0;
constexpr int GTYPE_READ_ONLY = 1; constexpr uint32_t GTYPE_READ_ONLY = 1;
constexpr int GTYPE_KEEP_ALIVE = 2; constexpr uint32_t GTYPE_KEEP_ALIVE = 2;
class group { class alignas(8) group {
public: public:
int32_t ref_handle{ 0 };
uint32_t is_readonly{ GTYPE_DEFAULT };
duel* pduel; duel* pduel;
card_set container; card_set container;
card_set::iterator it; card_set::iterator it;
int32_t ref_handle{ 0 };
uint32_t is_readonly{ GTYPE_DEFAULT };
bool is_iterator_dirty{ true }; bool is_iterator_dirty{ true };
bool has_card(card* c) { bool has_card(card* c) {
......
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