From efc65786890a7682c56eb2daf4aa3bfae3872ccb Mon Sep 17 00:00:00 2001 From: purerosefallen <78877@qq.com> Date: Thu, 13 Feb 2025 09:10:01 +0800 Subject: [PATCH 01/10] add EFFECT_ALLOW_FOR_SYNCHRO --- card.cpp | 27 +++++++++++++++++++++++++-- effect.h | 1 + 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/card.cpp b/card.cpp index 94bfc6820..ff287b289 100644 --- a/card.cpp +++ b/card.cpp @@ -1019,7 +1019,18 @@ uint32_t card::get_link() { } uint32_t card::get_synchro_level(card* pcard) { if((data.type & (TYPE_XYZ | TYPE_LINK)) || (status & STATUS_NO_LEVEL)) + { + effect_set eset; + filter_effect(EFFECT_ALLOW_FOR_SYNCHRO, &eset); + for(int32_t i = 0; i < eset.size(); ++i) { + uint32_t lev = eset[i]->get_value(pcard); + if(lev) { + return lev; + } + } return 0; + } + //return 0; uint32_t lev; effect_set eset; filter_effect(EFFECT_SYNCHRO_LEVEL, &eset); @@ -4077,7 +4088,19 @@ int32_t card::is_can_be_fusion_material(card* fcard, uint32_t summon_type) { return TRUE; } int32_t card::is_can_be_synchro_material(card* scard, card* tuner) { - if(data.type & (TYPE_XYZ | TYPE_LINK)) + effect_set eset; + if(data.type & (TYPE_XYZ | TYPE_LINK)) { + filter_effect(EFFECT_ALLOW_FOR_SYNCHRO, &eset); + auto found = FALSE; + for(int32_t i = 0; i < eset.size(); ++i) { + if(eset[i]->get_value(scard)) { + found = TRUE; + break; + } + } + if(!found) + return FALSE; + } return FALSE; if(!(get_synchro_type() & TYPE_MONSTER)) return FALSE; @@ -4088,7 +4111,7 @@ int32_t card::is_can_be_synchro_material(card* scard, card* tuner) { if(is_affected_by_effect(EFFECT_SCRAP_CHIMERA, tuner)) return false; } - effect_set eset; + eset.clear(); filter_effect(EFFECT_CANNOT_BE_SYNCHRO_MATERIAL, &eset); for(int32_t i = 0; i < eset.size(); ++i) if(eset[i]->get_value(scard)) diff --git a/effect.h b/effect.h index b5fdfca48..4cebee584 100644 --- a/effect.h +++ b/effect.h @@ -530,6 +530,7 @@ const std::map category_checklist{ #define EFFECT_KAISER_COLOSSEUM 370 #define EFFECT_REPLACE_DAMAGE 371 #define EFFECT_XYZ_MIN_COUNT 372 +#define EFFECT_ALLOW_FOR_SYNCHRO 373 //#define EVENT_STARTUP 1000 #define EVENT_FLIP 1001 From 97ebcf8a6017712dc735181e71cfc4913df7167b Mon Sep 17 00:00:00 2001 From: salix5 Date: Fri, 14 Feb 2025 10:18:29 +0800 Subject: [PATCH 02/10] clean --- card.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/card.cpp b/card.cpp index ff287b289..1ed5f213b 100644 --- a/card.cpp +++ b/card.cpp @@ -1018,8 +1018,7 @@ uint32_t card::get_link() { return data.level; } uint32_t card::get_synchro_level(card* pcard) { - if((data.type & (TYPE_XYZ | TYPE_LINK)) || (status & STATUS_NO_LEVEL)) - { + if((data.type & (TYPE_XYZ | TYPE_LINK)) || (status & STATUS_NO_LEVEL)) { effect_set eset; filter_effect(EFFECT_ALLOW_FOR_SYNCHRO, &eset); for(int32_t i = 0; i < eset.size(); ++i) { @@ -1030,7 +1029,6 @@ uint32_t card::get_synchro_level(card* pcard) { } return 0; } - //return 0; uint32_t lev; effect_set eset; filter_effect(EFFECT_SYNCHRO_LEVEL, &eset); From ae14518c87f51c0f2b10f4134294e6f58162a94d Mon Sep 17 00:00:00 2001 From: purerosefallen <78877@qq.com> Date: Fri, 14 Feb 2025 10:35:22 +0800 Subject: [PATCH 03/10] refactor & add EFFECT_ALLOW_FOR_RITUAL as well --- card.cpp | 47 +++++++++++++++++++---------------------------- card.h | 2 ++ effect.h | 1 + 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/card.cpp b/card.cpp index 1ed5f213b..6645d18c4 100644 --- a/card.cpp +++ b/card.cpp @@ -1017,38 +1017,29 @@ uint32_t card::get_link() { return 0; return data.level; } -uint32_t card::get_synchro_level(card* pcard) { - if((data.type & (TYPE_XYZ | TYPE_LINK)) || (status & STATUS_NO_LEVEL)) { - effect_set eset; - filter_effect(EFFECT_ALLOW_FOR_SYNCHRO, &eset); - for(int32_t i = 0; i < eset.size(); ++i) { - uint32_t lev = eset[i]->get_value(pcard); - if(lev) { - return lev; - } - } + +uint32_t get_mat_level_from_effect(card* pcard, uint32_t effect_code) { + if(!effect_code) return 0; - } - uint32_t lev; effect_set eset; - filter_effect(EFFECT_SYNCHRO_LEVEL, &eset); - if(eset.size()) - lev = eset[0]->get_value(pcard); - else - lev = get_level(); - return lev; + pduel->game_field->filter_effect(effect_code, &eset); + for(int32_t i = 0; i < eset.size(); ++i) { + uint32_t lev = eset[i]->get_value(pcard); + if(lev) + return lev; + } + return 0; } -uint32_t card::get_ritual_level(card* pcard) { +uint32_t card::get_mat_level(card* pcard, uint32_t level_effect_code, uint32_t allow_effect_code) { if((data.type & (TYPE_XYZ | TYPE_LINK)) || (status & STATUS_NO_LEVEL)) - return 0; - uint32_t lev; - effect_set eset; - filter_effect(EFFECT_RITUAL_LEVEL, &eset); - if(eset.size()) - lev = eset[0]->get_value(pcard); - else - lev = get_level(); - return lev; + return get_mat_level_from_effect(pcard, allow_effect_code); + return get_mat_level_from_effect(pcard, level_effect_code) || get_level(); +} +uint32_t card::get_synchro_level(card* pcard) { + return get_mat_level(pcard, EFFECT_SYNCHRO_LEVEL, EFFECT_ALLOW_FOR_SYNCHRO); +} +uint32_t card::get_ritual_level(card* pcard) { + return get_mat_level(pcard, EFFECT_RITUAL_LEVEL, EFFECT_ALLOW_FOR_RITUAL); } uint32_t card::check_xyz_level(card* pcard, uint32_t lv) { if(status & STATUS_NO_LEVEL) diff --git a/card.h b/card.h index 5e5514e20..58b9b10ff 100644 --- a/card.h +++ b/card.h @@ -243,6 +243,8 @@ class card { uint32_t get_level(); uint32_t get_rank(); uint32_t get_link(); + uint32_t get_mat_level_from_effect(card* pcard, uint32_t effect_code); + uint32_t get_mat_level(card* pcard, uint32_t level_effect_code, uint32_t allow_effect_code = 0); uint32_t get_synchro_level(card* pcard); uint32_t get_ritual_level(card* pcard); uint32_t check_xyz_level(card* pcard, uint32_t lv); diff --git a/effect.h b/effect.h index 4cebee584..4dcf4e519 100644 --- a/effect.h +++ b/effect.h @@ -531,6 +531,7 @@ const std::map category_checklist{ #define EFFECT_REPLACE_DAMAGE 371 #define EFFECT_XYZ_MIN_COUNT 372 #define EFFECT_ALLOW_FOR_SYNCHRO 373 +#define EFFECT_ALLOW_FOR_RITUAL 374 //#define EVENT_STARTUP 1000 #define EVENT_FLIP 1001 From c8dbe07226771ac402db9b2b1a4e0032323ff536 Mon Sep 17 00:00:00 2001 From: purerosefallen <78877@qq.com> Date: Fri, 14 Feb 2025 10:39:17 +0800 Subject: [PATCH 04/10] fix --- card.cpp | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/card.cpp b/card.cpp index 6645d18c4..daa23cc8c 100644 --- a/card.cpp +++ b/card.cpp @@ -4078,18 +4078,7 @@ int32_t card::is_can_be_fusion_material(card* fcard, uint32_t summon_type) { } int32_t card::is_can_be_synchro_material(card* scard, card* tuner) { effect_set eset; - if(data.type & (TYPE_XYZ | TYPE_LINK)) { - filter_effect(EFFECT_ALLOW_FOR_SYNCHRO, &eset); - auto found = FALSE; - for(int32_t i = 0; i < eset.size(); ++i) { - if(eset[i]->get_value(scard)) { - found = TRUE; - break; - } - } - if(!found) - return FALSE; - } + if((data.type & (TYPE_XYZ | TYPE_LINK)) && !get_synchro_level(scard)) return FALSE; if(!(get_synchro_type() & TYPE_MONSTER)) return FALSE; From 231f1c45453339629f9aa74fd4ebf24c66155c8f Mon Sep 17 00:00:00 2001 From: purerosefallen <78877@qq.com> Date: Fri, 14 Feb 2025 10:39:53 +0800 Subject: [PATCH 05/10] clean --- card.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/card.cpp b/card.cpp index daa23cc8c..c51187401 100644 --- a/card.cpp +++ b/card.cpp @@ -4077,7 +4077,6 @@ int32_t card::is_can_be_fusion_material(card* fcard, uint32_t summon_type) { return TRUE; } int32_t card::is_can_be_synchro_material(card* scard, card* tuner) { - effect_set eset; if((data.type & (TYPE_XYZ | TYPE_LINK)) && !get_synchro_level(scard)) return FALSE; if(!(get_synchro_type() & TYPE_MONSTER)) @@ -4089,7 +4088,7 @@ int32_t card::is_can_be_synchro_material(card* scard, card* tuner) { if(is_affected_by_effect(EFFECT_SCRAP_CHIMERA, tuner)) return false; } - eset.clear(); + effect_set eset; filter_effect(EFFECT_CANNOT_BE_SYNCHRO_MATERIAL, &eset); for(int32_t i = 0; i < eset.size(); ++i) if(eset[i]->get_value(scard)) From dc2a6c4139ffcbe079db598079e3d2bc44089045 Mon Sep 17 00:00:00 2001 From: purerosefallen <78877@qq.com> Date: Fri, 14 Feb 2025 10:54:25 +0800 Subject: [PATCH 06/10] add everything for EFFECT_ALLOW_FOR_RITUAL as well --- field.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/field.cpp b/field.cpp index 24de1d9e5..6dc9f534b 100644 --- a/field.cpp +++ b/field.cpp @@ -1842,18 +1842,18 @@ void field::get_ritual_material(uint8_t playerid, effect* peffect, card_set* mat for(auto& pcard : player[playerid].list_mzone) { if(pcard && pcard->is_affect_by_effect(peffect) && pcard->is_releasable_by_nonsummon(playerid, REASON_EFFECT) && pcard->is_releasable_by_effect(playerid, peffect) - && (no_level || pcard->get_level() > 0)) + && (no_level || pcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_ALLOW_FOR_RITUAL))) material->insert(pcard); if(pcard && pcard->is_affected_by_effect(EFFECT_OVERLAY_RITUAL_MATERIAL)) for(auto& mcard : pcard->xyz_materials) - if (no_level || mcard->get_level() > 0) + if (no_level || mcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_ALLOW_FOR_RITUAL)) material->insert(mcard); } for(auto& pcard : player[1 - playerid].list_mzone) { if(pcard && pcard->is_affect_by_effect(peffect) && pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE) && pcard->is_position(POS_FACEUP) && pcard->is_releasable_by_nonsummon(playerid, REASON_EFFECT) && pcard->is_releasable_by_effect(playerid, peffect) - && (no_level || pcard->get_level() > 0)) + && (no_level || pcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_ALLOW_FOR_RITUAL))) material->insert(pcard); } for(auto& pcard : player[playerid].list_hand) @@ -1862,11 +1862,11 @@ void field::get_ritual_material(uint8_t playerid, effect* peffect, card_set* mat for(auto& pcard : player[playerid].list_grave) if((pcard->data.type & TYPE_MONSTER) && pcard->is_affected_by_effect(EFFECT_EXTRA_RITUAL_MATERIAL) && pcard->is_removeable(playerid, POS_FACEUP, REASON_EFFECT) - && (no_level || pcard->get_level() > 0)) + && (no_level || pcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_ALLOW_FOR_RITUAL))) material->insert(pcard); for(auto& pcard : player[playerid].list_extra) if(pcard->is_affected_by_effect(EFFECT_EXTRA_RITUAL_MATERIAL) - && (no_level || pcard->get_level() > 0)) + && (no_level || pcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_ALLOW_FOR_RITUAL))) material->insert(pcard); } void field::get_fusion_material(uint8_t playerid, card_set* material_all, card_set* material_base, uint32_t location) { From 8779e6ce260e5d3c6448b62f7407e16af42d4467 Mon Sep 17 00:00:00 2001 From: purerosefallen <78877@qq.com> Date: Fri, 14 Feb 2025 10:59:58 +0800 Subject: [PATCH 07/10] fuck GitHub Copilot --- card.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/card.cpp b/card.cpp index c51187401..57377af6a 100644 --- a/card.cpp +++ b/card.cpp @@ -1022,7 +1022,7 @@ uint32_t get_mat_level_from_effect(card* pcard, uint32_t effect_code) { if(!effect_code) return 0; effect_set eset; - pduel->game_field->filter_effect(effect_code, &eset); + filter_effect(effect_code, &eset); for(int32_t i = 0; i < eset.size(); ++i) { uint32_t lev = eset[i]->get_value(pcard); if(lev) From f811d14bfb4e64fe05a6ee02ee8d43dfa710c18c Mon Sep 17 00:00:00 2001 From: purerosefallen <78877@qq.com> Date: Fri, 14 Feb 2025 11:03:08 +0800 Subject: [PATCH 08/10] fix --- card.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/card.cpp b/card.cpp index 57377af6a..891721de1 100644 --- a/card.cpp +++ b/card.cpp @@ -1018,7 +1018,7 @@ uint32_t card::get_link() { return data.level; } -uint32_t get_mat_level_from_effect(card* pcard, uint32_t effect_code) { +uint32_t card::get_mat_level_from_effect(card* pcard, uint32_t effect_code) { if(!effect_code) return 0; effect_set eset; From b172bc82855c75cfb4f60858eb813c9f5416f06e Mon Sep 17 00:00:00 2001 From: purerosefallen <78877@qq.com> Date: Fri, 14 Feb 2025 20:34:16 +0800 Subject: [PATCH 09/10] fix --- card.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/card.cpp b/card.cpp index 891721de1..1449a29db 100644 --- a/card.cpp +++ b/card.cpp @@ -1033,7 +1033,10 @@ uint32_t card::get_mat_level_from_effect(card* pcard, uint32_t effect_code) { uint32_t card::get_mat_level(card* pcard, uint32_t level_effect_code, uint32_t allow_effect_code) { if((data.type & (TYPE_XYZ | TYPE_LINK)) || (status & STATUS_NO_LEVEL)) return get_mat_level_from_effect(pcard, allow_effect_code); - return get_mat_level_from_effect(pcard, level_effect_code) || get_level(); + auto lv = get_mat_level_from_effect(pcard, level_effect_code); + if(lv) + return lv; + return get_level(); } uint32_t card::get_synchro_level(card* pcard) { return get_mat_level(pcard, EFFECT_SYNCHRO_LEVEL, EFFECT_ALLOW_FOR_SYNCHRO); From 3f2f5943ad51efe93d6d271201b79012891c09c7 Mon Sep 17 00:00:00 2001 From: purerosefallen <78877@qq.com> Date: Sat, 15 Feb 2025 10:09:09 +0800 Subject: [PATCH 10/10] rename effect --- card.cpp | 4 ++-- effect.h | 4 ++-- field.cpp | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/card.cpp b/card.cpp index 1449a29db..5a466ba88 100644 --- a/card.cpp +++ b/card.cpp @@ -1039,10 +1039,10 @@ uint32_t card::get_mat_level(card* pcard, uint32_t level_effect_code, uint32_t a return get_level(); } uint32_t card::get_synchro_level(card* pcard) { - return get_mat_level(pcard, EFFECT_SYNCHRO_LEVEL, EFFECT_ALLOW_FOR_SYNCHRO); + return get_mat_level(pcard, EFFECT_SYNCHRO_LEVEL, EFFECT_SYNCHRO_LEVEL_EX); } uint32_t card::get_ritual_level(card* pcard) { - return get_mat_level(pcard, EFFECT_RITUAL_LEVEL, EFFECT_ALLOW_FOR_RITUAL); + return get_mat_level(pcard, EFFECT_RITUAL_LEVEL, EFFECT_RITUAL_LEVEL_EX); } uint32_t card::check_xyz_level(card* pcard, uint32_t lv) { if(status & STATUS_NO_LEVEL) diff --git a/effect.h b/effect.h index 4dcf4e519..fa5ae22fa 100644 --- a/effect.h +++ b/effect.h @@ -530,8 +530,8 @@ const std::map category_checklist{ #define EFFECT_KAISER_COLOSSEUM 370 #define EFFECT_REPLACE_DAMAGE 371 #define EFFECT_XYZ_MIN_COUNT 372 -#define EFFECT_ALLOW_FOR_SYNCHRO 373 -#define EFFECT_ALLOW_FOR_RITUAL 374 +#define EFFECT_SYNCHRO_LEVEL_EX 373 +#define EFFECT_RITUAL_LEVEL_EX 374 //#define EVENT_STARTUP 1000 #define EVENT_FLIP 1001 diff --git a/field.cpp b/field.cpp index 6dc9f534b..35dc0512e 100644 --- a/field.cpp +++ b/field.cpp @@ -1842,18 +1842,18 @@ void field::get_ritual_material(uint8_t playerid, effect* peffect, card_set* mat for(auto& pcard : player[playerid].list_mzone) { if(pcard && pcard->is_affect_by_effect(peffect) && pcard->is_releasable_by_nonsummon(playerid, REASON_EFFECT) && pcard->is_releasable_by_effect(playerid, peffect) - && (no_level || pcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_ALLOW_FOR_RITUAL))) + && (no_level || pcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_RITUAL_LEVEL_EX))) material->insert(pcard); if(pcard && pcard->is_affected_by_effect(EFFECT_OVERLAY_RITUAL_MATERIAL)) for(auto& mcard : pcard->xyz_materials) - if (no_level || mcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_ALLOW_FOR_RITUAL)) + if (no_level || mcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_RITUAL_LEVEL_EX)) material->insert(mcard); } for(auto& pcard : player[1 - playerid].list_mzone) { if(pcard && pcard->is_affect_by_effect(peffect) && pcard->is_affected_by_effect(EFFECT_EXTRA_RELEASE) && pcard->is_position(POS_FACEUP) && pcard->is_releasable_by_nonsummon(playerid, REASON_EFFECT) && pcard->is_releasable_by_effect(playerid, peffect) - && (no_level || pcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_ALLOW_FOR_RITUAL))) + && (no_level || pcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_RITUAL_LEVEL_EX))) material->insert(pcard); } for(auto& pcard : player[playerid].list_hand) @@ -1862,11 +1862,11 @@ void field::get_ritual_material(uint8_t playerid, effect* peffect, card_set* mat for(auto& pcard : player[playerid].list_grave) if((pcard->data.type & TYPE_MONSTER) && pcard->is_affected_by_effect(EFFECT_EXTRA_RITUAL_MATERIAL) && pcard->is_removeable(playerid, POS_FACEUP, REASON_EFFECT) - && (no_level || pcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_ALLOW_FOR_RITUAL))) + && (no_level || pcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_RITUAL_LEVEL_EX))) material->insert(pcard); for(auto& pcard : player[playerid].list_extra) if(pcard->is_affected_by_effect(EFFECT_EXTRA_RITUAL_MATERIAL) - && (no_level || pcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_ALLOW_FOR_RITUAL))) + && (no_level || pcard->get_level() > 0 || pcard->is_affected_by_effect(EFFECT_RITUAL_LEVEL_EX))) material->insert(pcard); } void field::get_fusion_material(uint8_t playerid, card_set* material_all, card_set* material_base, uint32_t location) {