From a5e297d0c523f5110abd8bf141d47c0a51b73ab7 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 25 Jun 2026 21:34:20 +0800 Subject: [PATCH 1/5] Add: event entrance for Miracle by Midnight (event_20260625_cn) --- campaign/Readme.md | 1 + module/config/argument/args.json | 80 ++++++++++++++++---------------- module/config/i18n/en-US.json | 1 + module/config/i18n/ja-JP.json | 1 + module/config/i18n/zh-CN.json | 1 + module/config/i18n/zh-TW.json | 1 + 6 files changed, 45 insertions(+), 40 deletions(-) diff --git a/campaign/Readme.md b/campaign/Readme.md index eb7caa365..c8a385078 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -302,3 +302,4 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20260605 | event 20260520 cn | Alliance Before the Hagiobull | - | - | - | 聖印前的同盟 | | 20260618 | event 20240521 cn | Light of the Martyrium Rerun | 复刻绽放于辉光之城 | Light of the Martyrium Rerun | 赫輝のマルティリウム(復刻) | - | | 20260625 | event 20230223 cn | Revelations of Dust | - | - | - | 復刻湮燼塵墟 | +| 20260625 | event 20260625 cn | Miracle by Midnight | 美梦巡演奇妙夜 | Miracle by Midnight | 幻夢のカヴァルカード | - | diff --git a/module/config/argument/args.json b/module/config/argument/args.json index e0b7497e9..95e737091 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1644,23 +1644,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { @@ -1926,23 +1926,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { @@ -2323,23 +2323,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { @@ -4070,23 +4070,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { @@ -4484,23 +4484,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { @@ -4898,23 +4898,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { @@ -5312,23 +5312,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { @@ -5716,23 +5716,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 9cb785da1..e492eb006 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -772,6 +772,7 @@ "event_20260326_cn": "The Vagabond’s Recruitment Plan", "event_20260417_cn": "Vacation Lane – Beachside Brilliance", "event_20260520_cn": "Alliance Before the Hagiobull", + "event_20260625_cn": "Miracle by Midnight", "raid_20200624": "Air Raid Drills with Essex Rerun", "raid_20210708": "Cross Wave rerun", "raid_20220127": "Mystery Investigation", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 9c930cbf9..872b8ab51 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -772,6 +772,7 @@ "event_20260326_cn": "ワンダラー募集計画", "event_20260417_cn": "バケーションレーン・きらめく砂浜", "event_20260520_cn": "聖印前の同盟", + "event_20260625_cn": "幻夢のカヴァルカード", "raid_20200624": "特別演習超空強襲波(復刻)", "raid_20210708": "交錯する新たな波 (復刻)", "raid_20220127": "秘密事件調査", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index a5fa75a67..15311c96e 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -772,6 +772,7 @@ "event_20260326_cn": "漫游者招募计划", "event_20260417_cn": "假日航线闪耀海滨", "event_20260520_cn": "圣印前的同盟", + "event_20260625_cn": "美梦巡演奇妙夜", "raid_20200624": "复刻特别演习埃塞克斯级", "raid_20210708": "复刻穿越彼方的水线", "raid_20220127": "演习神秘事件调查", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 60930b400..db9cb981d 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -772,6 +772,7 @@ "event_20260326_cn": "漫遊者招募計劃", "event_20260417_cn": "假日航線閃耀海濱", "event_20260520_cn": "聖印前的同盟", + "event_20260625_cn": "Miracle by Midnight", "raid_20200624": "特別演習埃塞克斯級(復刻)", "raid_20210708": "復刻穿越彼方的水線", "raid_20220127": "演習神秘事件調查", From 8b41bbc9db590c63c3b27975ef18ab0644e3c573 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 25 Jun 2026 22:08:50 +0800 Subject: [PATCH 2/5] Add: Chapter T --- .../TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif | Bin 0 -> 5217 bytes .../TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif | Bin 0 -> 5217 bytes .../TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif | Bin 0 -> 5217 bytes .../TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif | Bin 0 -> 5217 bytes campaign/event_20260625_cn/t1.py | 78 +++++++++++++++++ campaign/event_20260625_cn/t2.py | 76 +++++++++++++++++ campaign/event_20260625_cn/t3.py | 80 ++++++++++++++++++ module/campaign/run.py | 2 + module/template/assets.py | 1 + 9 files changed, 237 insertions(+) create mode 100644 assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif create mode 100644 assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif create mode 100644 assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif create mode 100644 assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif create mode 100644 campaign/event_20260625_cn/t1.py create mode 100644 campaign/event_20260625_cn/t2.py create mode 100644 campaign/event_20260625_cn/t3.py diff --git a/assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif b/assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif new file mode 100644 index 0000000000000000000000000000000000000000..80cbceb5ca9c090358cd515a2e667a4f7387a083 GIT binary patch literal 5217 zcmeI0Yfw{H0>|%7E_smGO$ZVmYOba>%cO3C+6m}%ZxUX0kh$8&V3%ryc9*tpC$#Pi z>+m7T4df~)v8Y5uy&;G}P=cbOqTakTXw;}Ehz|l~x?MZF1KW0Ib$7Zhg=iJ}?{-@yWd~Nmy2_ORO0C4Bdo!hr>4-O9Ax^?U3&6_uF+=xb_*RNl{ zcJ12Lt5+kD$dxNsE?>SpFfefG(xrCgV0NyiI_ikOWHj3N6tTtwO!>(6xA`WmBmj^`)DM0 z?FK!>&RR}lh`VN>F*&o)Ov!Z&LAu&A7-fW3arrRuJ5(P?5Gu7E!i7A-6UvtmB|SGo z+tM_8xMnh@v+@@e52|~{@(E#@3M0*59)!e6Ya`wr`pU~K&ey86njN@Zl)l0Qznz2I zlT{^73_($l$r8#7y=EQG5-%;vBTatkWbeh)nn`OxL$ZFQ14jHf zTa!;vQ@(|@O-T6~0sw<{sdim`%mf-DiBj4FVyJ;7dj0)~ajKC~~bf=Im* z5~S)tE0YEH4jX$7H4=3e^m}vcJ4+(6vC0E4WDC<3i!kRTX&K@x3jbMwl-arBkU<|{DFuKD91iENhD-buWpQD*^4#W-`8gbj#bUG*Jb3UR4uokMOc#qd6XJa$ z4uoJZ_#%BGUM8lSMBEbE+S>jXQE)gM4Gj&`G}yXzD@}vVn>W7_7k74(KWhS<$G|6H z0x380t;~-j-qm=1ASLTlX-gIC@}=@BCo#loD-g?dHehNDXA4(gec>q!enps(RS|Z8 zcuk_z=s{fpsHkblCuN?sE;_0=%tQ{xiBaEjr?qYNKw7dFW%v@SO95KodJ zlbhM~lDX<42kgrE@sU`GIbirXG@!e|zgfZm`^NBsSeW_D@L$O=Qx$&J3o<*|E0h4| zAHZkBUY()VhjWtt@^{1?;-xJ9pw|ex%R(t{RQG!--8fq`mo5or*F-|1^wTcmQ~+X& z=D%gjIBikXN){NQF{Iqah8Glk5yo_W`lHy>w>n^mHm53c&6BZj3q;69igOrb+E~Jj z73QhR;1=;48_iL#g;BzWQHt=5`GxXdZ6b}GE=CPkSlDOu1@aQ*%F?o762Z&)sdW3e zQN|L^nWHMDOfKvCL|Jjsy2p&#;DGzRF0;#B&>(vgfMB%|_%owVpeTV|ItC*_rqCKG i%JOx>ruj4#bj-13rirMlocu9u*>9qxrrd}E%l`#qscs7Z literal 0 HcmV?d00001 diff --git a/assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif b/assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif new file mode 100644 index 0000000000000000000000000000000000000000..80cbceb5ca9c090358cd515a2e667a4f7387a083 GIT binary patch literal 5217 zcmeI0Yfw{H0>|%7E_smGO$ZVmYOba>%cO3C+6m}%ZxUX0kh$8&V3%ryc9*tpC$#Pi z>+m7T4df~)v8Y5uy&;G}P=cbOqTakTXw;}Ehz|l~x?MZF1KW0Ib$7Zhg=iJ}?{-@yWd~Nmy2_ORO0C4Bdo!hr>4-O9Ax^?U3&6_uF+=xb_*RNl{ zcJ12Lt5+kD$dxNsE?>SpFfefG(xrCgV0NyiI_ikOWHj3N6tTtwO!>(6xA`WmBmj^`)DM0 z?FK!>&RR}lh`VN>F*&o)Ov!Z&LAu&A7-fW3arrRuJ5(P?5Gu7E!i7A-6UvtmB|SGo z+tM_8xMnh@v+@@e52|~{@(E#@3M0*59)!e6Ya`wr`pU~K&ey86njN@Zl)l0Qznz2I zlT{^73_($l$r8#7y=EQG5-%;vBTatkWbeh)nn`OxL$ZFQ14jHf zTa!;vQ@(|@O-T6~0sw<{sdim`%mf-DiBj4FVyJ;7dj0)~ajKC~~bf=Im* z5~S)tE0YEH4jX$7H4=3e^m}vcJ4+(6vC0E4WDC<3i!kRTX&K@x3jbMwl-arBkU<|{DFuKD91iENhD-buWpQD*^4#W-`8gbj#bUG*Jb3UR4uokMOc#qd6XJa$ z4uoJZ_#%BGUM8lSMBEbE+S>jXQE)gM4Gj&`G}yXzD@}vVn>W7_7k74(KWhS<$G|6H z0x380t;~-j-qm=1ASLTlX-gIC@}=@BCo#loD-g?dHehNDXA4(gec>q!enps(RS|Z8 zcuk_z=s{fpsHkblCuN?sE;_0=%tQ{xiBaEjr?qYNKw7dFW%v@SO95KodJ zlbhM~lDX<42kgrE@sU`GIbirXG@!e|zgfZm`^NBsSeW_D@L$O=Qx$&J3o<*|E0h4| zAHZkBUY()VhjWtt@^{1?;-xJ9pw|ex%R(t{RQG!--8fq`mo5or*F-|1^wTcmQ~+X& z=D%gjIBikXN){NQF{Iqah8Glk5yo_W`lHy>w>n^mHm53c&6BZj3q;69igOrb+E~Jj z73QhR;1=;48_iL#g;BzWQHt=5`GxXdZ6b}GE=CPkSlDOu1@aQ*%F?o762Z&)sdW3e zQN|L^nWHMDOfKvCL|Jjsy2p&#;DGzRF0;#B&>(vgfMB%|_%owVpeTV|ItC*_rqCKG i%JOx>ruj4#bj-13rirMlocu9u*>9qxrrd}E%l`#qscs7Z literal 0 HcmV?d00001 diff --git a/assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif b/assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif new file mode 100644 index 0000000000000000000000000000000000000000..80cbceb5ca9c090358cd515a2e667a4f7387a083 GIT binary patch literal 5217 zcmeI0Yfw{H0>|%7E_smGO$ZVmYOba>%cO3C+6m}%ZxUX0kh$8&V3%ryc9*tpC$#Pi z>+m7T4df~)v8Y5uy&;G}P=cbOqTakTXw;}Ehz|l~x?MZF1KW0Ib$7Zhg=iJ}?{-@yWd~Nmy2_ORO0C4Bdo!hr>4-O9Ax^?U3&6_uF+=xb_*RNl{ zcJ12Lt5+kD$dxNsE?>SpFfefG(xrCgV0NyiI_ikOWHj3N6tTtwO!>(6xA`WmBmj^`)DM0 z?FK!>&RR}lh`VN>F*&o)Ov!Z&LAu&A7-fW3arrRuJ5(P?5Gu7E!i7A-6UvtmB|SGo z+tM_8xMnh@v+@@e52|~{@(E#@3M0*59)!e6Ya`wr`pU~K&ey86njN@Zl)l0Qznz2I zlT{^73_($l$r8#7y=EQG5-%;vBTatkWbeh)nn`OxL$ZFQ14jHf zTa!;vQ@(|@O-T6~0sw<{sdim`%mf-DiBj4FVyJ;7dj0)~ajKC~~bf=Im* z5~S)tE0YEH4jX$7H4=3e^m}vcJ4+(6vC0E4WDC<3i!kRTX&K@x3jbMwl-arBkU<|{DFuKD91iENhD-buWpQD*^4#W-`8gbj#bUG*Jb3UR4uokMOc#qd6XJa$ z4uoJZ_#%BGUM8lSMBEbE+S>jXQE)gM4Gj&`G}yXzD@}vVn>W7_7k74(KWhS<$G|6H z0x380t;~-j-qm=1ASLTlX-gIC@}=@BCo#loD-g?dHehNDXA4(gec>q!enps(RS|Z8 zcuk_z=s{fpsHkblCuN?sE;_0=%tQ{xiBaEjr?qYNKw7dFW%v@SO95KodJ zlbhM~lDX<42kgrE@sU`GIbirXG@!e|zgfZm`^NBsSeW_D@L$O=Qx$&J3o<*|E0h4| zAHZkBUY()VhjWtt@^{1?;-xJ9pw|ex%R(t{RQG!--8fq`mo5or*F-|1^wTcmQ~+X& z=D%gjIBikXN){NQF{Iqah8Glk5yo_W`lHy>w>n^mHm53c&6BZj3q;69igOrb+E~Jj z73QhR;1=;48_iL#g;BzWQHt=5`GxXdZ6b}GE=CPkSlDOu1@aQ*%F?o762Z&)sdW3e zQN|L^nWHMDOfKvCL|Jjsy2p&#;DGzRF0;#B&>(vgfMB%|_%owVpeTV|ItC*_rqCKG i%JOx>ruj4#bj-13rirMlocu9u*>9qxrrd}E%l`#qscs7Z literal 0 HcmV?d00001 diff --git a/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif b/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif new file mode 100644 index 0000000000000000000000000000000000000000..80cbceb5ca9c090358cd515a2e667a4f7387a083 GIT binary patch literal 5217 zcmeI0Yfw{H0>|%7E_smGO$ZVmYOba>%cO3C+6m}%ZxUX0kh$8&V3%ryc9*tpC$#Pi z>+m7T4df~)v8Y5uy&;G}P=cbOqTakTXw;}Ehz|l~x?MZF1KW0Ib$7Zhg=iJ}?{-@yWd~Nmy2_ORO0C4Bdo!hr>4-O9Ax^?U3&6_uF+=xb_*RNl{ zcJ12Lt5+kD$dxNsE?>SpFfefG(xrCgV0NyiI_ikOWHj3N6tTtwO!>(6xA`WmBmj^`)DM0 z?FK!>&RR}lh`VN>F*&o)Ov!Z&LAu&A7-fW3arrRuJ5(P?5Gu7E!i7A-6UvtmB|SGo z+tM_8xMnh@v+@@e52|~{@(E#@3M0*59)!e6Ya`wr`pU~K&ey86njN@Zl)l0Qznz2I zlT{^73_($l$r8#7y=EQG5-%;vBTatkWbeh)nn`OxL$ZFQ14jHf zTa!;vQ@(|@O-T6~0sw<{sdim`%mf-DiBj4FVyJ;7dj0)~ajKC~~bf=Im* z5~S)tE0YEH4jX$7H4=3e^m}vcJ4+(6vC0E4WDC<3i!kRTX&K@x3jbMwl-arBkU<|{DFuKD91iENhD-buWpQD*^4#W-`8gbj#bUG*Jb3UR4uokMOc#qd6XJa$ z4uoJZ_#%BGUM8lSMBEbE+S>jXQE)gM4Gj&`G}yXzD@}vVn>W7_7k74(KWhS<$G|6H z0x380t;~-j-qm=1ASLTlX-gIC@}=@BCo#loD-g?dHehNDXA4(gec>q!enps(RS|Z8 zcuk_z=s{fpsHkblCuN?sE;_0=%tQ{xiBaEjr?qYNKw7dFW%v@SO95KodJ zlbhM~lDX<42kgrE@sU`GIbirXG@!e|zgfZm`^NBsSeW_D@L$O=Qx$&J3o<*|E0h4| zAHZkBUY()VhjWtt@^{1?;-xJ9pw|ex%R(t{RQG!--8fq`mo5or*F-|1^wTcmQ~+X& z=D%gjIBikXN){NQF{Iqah8Glk5yo_W`lHy>w>n^mHm53c&6BZj3q;69igOrb+E~Jj z73QhR;1=;48_iL#g;BzWQHt=5`GxXdZ6b}GE=CPkSlDOu1@aQ*%F?o762Z&)sdW3e zQN|L^nWHMDOfKvCL|Jjsy2p&#;DGzRF0;#B&>(vgfMB%|_%owVpeTV|ItC*_rqCKG i%JOx>ruj4#bj-13rirMlocu9u*>9qxrrd}E%l`#qscs7Z literal 0 HcmV?d00001 diff --git a/campaign/event_20260625_cn/t1.py b/campaign/event_20260625_cn/t1.py new file mode 100644 index 000000000..07f9cd3a6 --- /dev/null +++ b/campaign/event_20260625_cn/t1.py @@ -0,0 +1,78 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('T1') +MAP.shape = 'I7' +MAP.camera_data = ['F2', 'F5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + -- -- ME -- ME -- -- ++ MB + -- -- ++ ME -- ME ++ ME -- + SP -- -- MS -- -- Me -- -- + -- -- __ -- ++ -- -- -- ME + SP -- -- MS ++ Me -- ++ ++ + -- -- -- -- -- -- -- ++ ++ + ++ ++ ++ Me -- ME -- ME -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['MeowfficerBust_Hobbies'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219_SP = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + MAP_SWIPE_MULTIPLY = (1.144, 1.165) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.106, 1.126) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.074, 1.093) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20260625_cn/t2.py b/campaign/event_20260625_cn/t2.py new file mode 100644 index 000000000..76d9a348d --- /dev/null +++ b/campaign/event_20260625_cn/t2.py @@ -0,0 +1,76 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T2') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F5'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ME -- ME ++ ME -- -- ++ ++ + -- -- -- -- -- -- SP -- ++ + -- Me ++ ++ ++ -- -- SP -- + -- -- -- Me -- MS -- -- -- + ME -- ME ++ -- MS MS ++ Me + -- MB -- ++ __ -- -- ++ -- + ME -- ME -- -- ME -- Me -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['MeowfficerBust_Hobbies'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.224, 1.247) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.184, 1.206) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.149, 1.170) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20260625_cn/t3.py b/campaign/event_20260625_cn/t3.py new file mode 100644 index 000000000..57738dd2a --- /dev/null +++ b/campaign/event_20260625_cn/t3.py @@ -0,0 +1,80 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T3') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F5'] +MAP.map_data = """ + ++ ++ ++ ++ MB ++ ++ ++ ++ + ++ -- Me Me -- Me Me -- ++ + -- ME -- -- __ -- -- ME -- + ME -- -- SP ++ SP -- -- ME + -- ME -- -- -- -- -- ME -- + ++ ++ ME -- MS -- ME ++ ++ + ++ ++ -- MS -- MS -- ++ ++ + -- -- ++ ++ ++ ++ ++ -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['MeowfficerBust_Hobbies'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.115, 1.136) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.078, 1.098) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.047, 1.065) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/module/campaign/run.py b/module/campaign/run.py index f244c36ce..15d121687 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -220,6 +220,7 @@ class CampaignRun(CampaignEvent): 'event_20250814_cn', 'event_20251023_cn', 'event_20260326_cn', + 'event_20260625_cn', 'war_archives_20230525_cn', 'war_archives_20231026_cn', 'war_archives_20240725_cn', @@ -258,6 +259,7 @@ class CampaignRun(CampaignEvent): 'event_20250814_cn', 'event_20251023_cn', 'event_20260326_cn', + 'event_20260625_cn', 'war_archives_20230525_cn', 'war_archives_20231026_cn', 'war_archives_20240725_cn', diff --git a/module/template/assets.py b/module/template/assets.py index cefe72137..c24692c7e 100644 --- a/module/template/assets.py +++ b/module/template/assets.py @@ -176,6 +176,7 @@ TEMPLATE_SIREN_Mainz = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN TEMPLATE_SIREN_MarieRoseDOA = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MarieRoseDOA.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MarieRoseDOA.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MarieRoseDOA.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MarieRoseDOA.gif'}) TEMPLATE_SIREN_MaryCeleste = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MaryCeleste.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MaryCeleste.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MaryCeleste.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MaryCeleste.gif'}) TEMPLATE_SIREN_Maya = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Maya.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Maya.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Maya.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Maya.gif'}) +TEMPLATE_SIREN_MeowfficerBust_Hobbies = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif'}) TEMPLATE_SIREN_Mikasa = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Mikasa.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Mikasa.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Mikasa.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Mikasa.gif'}) TEMPLATE_SIREN_MisakiDOA = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MisakiDOA.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MisakiDOA.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MisakiDOA.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MisakiDOA.gif'}) TEMPLATE_SIREN_Miyuki = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Miyuki.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Miyuki.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Miyuki.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Miyuki.gif'}) From e758474a07faf298aa3b7023b336b25b79915675 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 25 Jun 2026 22:24:45 +0800 Subject: [PATCH 3/5] Add: Chapter HT --- ...TEMPLATE_SIREN_MeowfficerBust_Playtime.gif | Bin 0 -> 4316 bytes ...TEMPLATE_SIREN_MeowfficerBust_Studying.gif | Bin 0 -> 2154 bytes ...TEMPLATE_SIREN_MeowfficerBust_Playtime.gif | Bin 0 -> 4316 bytes ...TEMPLATE_SIREN_MeowfficerBust_Studying.gif | Bin 0 -> 2154 bytes ...TEMPLATE_SIREN_MeowfficerBust_Playtime.gif | Bin 0 -> 4316 bytes ...TEMPLATE_SIREN_MeowfficerBust_Studying.gif | Bin 0 -> 2154 bytes ...TEMPLATE_SIREN_MeowfficerBust_Playtime.gif | Bin 0 -> 4316 bytes ...TEMPLATE_SIREN_MeowfficerBust_Studying.gif | Bin 0 -> 2154 bytes campaign/event_20260625_cn/ht1.py | 79 ++++++++++++++++ campaign/event_20260625_cn/ht2.py | 86 +++++++++++++++++ campaign/event_20260625_cn/ht3.py | 89 ++++++++++++++++++ module/template/assets.py | 2 + 12 files changed, 256 insertions(+) create mode 100644 assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif create mode 100644 assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif create mode 100644 assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif create mode 100644 assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif create mode 100644 assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif create mode 100644 assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif create mode 100644 assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif create mode 100644 assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif create mode 100644 campaign/event_20260625_cn/ht1.py create mode 100644 campaign/event_20260625_cn/ht2.py create mode 100644 campaign/event_20260625_cn/ht3.py diff --git a/assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif b/assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif new file mode 100644 index 0000000000000000000000000000000000000000..a73bf4c5e9056e336763dccb140cec69d6809775 GIT binary patch literal 4316 zcmeI#=}%K@0>|<0E!`+fp<=~TC|Hnd5SeQo$c&V&ERqU{RnQc~C5TuUM=LJra%jtH zDT|1pZQ&{?YDG{`)E+iLP+LVLidv93By%UznV1asmGhV;gj`1_nU}*o|H1R*JfD1j z@dcbLY=xYHe+8X=yQ;Oh%*8U@$Z_HJv+muD-s$wzjsWrbegJRaRD3R8*9g zmzR~5m6n!jwOX}WT~bm4!>~%FQYw`Sg+eZupE`Bw~kQ&M8n)1sq9 zv0>{%vFOjAQJi0JBn~)z$d?=V@=Q>q&!`Qsqj0X28MIaY$!xYD7ygvj2dh$%D0X&8AhdHy`?5JnpI`;z$j2MN8#tLo9 zpRo@zco9FE&4th$tWWUg>mancYIQiBA+bu(mEL|nkWOS2;HVqm1-rozwPRgo<7PyU zQH+v&WzZ&@b)Dy$mzm>NC>+d zjptwblUJQ6j8y3r(9`lj#3ACy?tbDPDF^!csx-ipj~_qI&CPxI@L_g#7TEIk?OR~W z>({RVEMJrIKX`KQ-o2%yEP4Vk0g_z5e*J4qfFyvCix)38H#Y-J8XFsdCuh%|b$X)L z>#M7)fhtv1RZdu(s%SKtU#S8}Ieq#xAm!MxV@Ho3bz*Y(@L{JX0F&I@T&E{uv3UFT z?P+OgiHV8v@$p}NrQg0~a07sf_2aDm+_E}eiV}6)Vn(nyJS1+ghne<3IX1QnYZAulI{j7AL@MwlHDEZE;?C9b za#{zKL|J$E)=u0Q)7#fi*kGR>p^@of{yQ*m9N8loHZ(90OjQ8aC#)T9$|a!LvI@Dw zuF|nRe1(o|B$`OK;HfgVDMdM#g{g7L3aOGZsJ!Cll}Azkm1c-SqVIx1{(^e0-}smP!H217rti z4iFqpBRV=dKy$RWw_m<|d1-S1CN5mK;FRM0`SVUJ8X6ja7a&3E>gs-_#+fr`mcsF^ z76EW9=E(8m$DKI>DrEou{XmVJoE(Wn0_*@4l97?IZQC}`B3rg>Nls2)2CrtB9uZ)X zG_4ivrPK$fsqK7+Aqq>t6WDD!qq=6zF0*h`Q49`4q5z&!(|? z637BmYnZ_n{_H@47cVM?D}tcma{P+0Ec0e$=nVCb9a%fF4KdYjG*9l3d7>ZhvPw?M z7Wl(h0>w)fcB z#MO8)*kRhDm<0OjB>r%nU7^)e>E6<~^_XZJZB1jo_JkmzoJ8mH-HaTSn&ycSi)@lG zdH|Cp7TXZ4<}a%lBxtJuU=bHCYjyv zqbr<6v53Udsq&qj@?S>^SSU-KSUOUiS}aBd0AuMwaYhB8!dVoHLVTYGuvQkk!Z}r( zQL$(Pm@3Y?SX?X4z&Ld1P=0>?!Gj0EY}vba@18w-fEi%604+o!QA9+<#*G^T0|S@o zQ~G~DHlQN5ZK0Z*=p7=0N$my;8cQHzD)=@d?8?dLOLt3+Az+APPqxs}GDMp%#*kPGN_OEddp*(8Tnt28g3nuZ~X%wcguY zUK=F5eiA9n=qUAz3JIUeiXC%b>E}MhOI4Y1tS?){E+^|(1Pf%LD7)H)#0dVGBv3?^ z1V-d{K{jJF8WkKSltTR@cp_8zsqLm;OrZ-Va9jq>L{WR06%K#-4<@XJM)0)Cp?W1u b_R!h2ivHgdY2LvTBR||0lu*!URK&jliu`sY literal 0 HcmV?d00001 diff --git a/assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif b/assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif new file mode 100644 index 0000000000000000000000000000000000000000..12e50c71ba6f6345cf807544286169fc047c824c GIT binary patch literal 2154 zcmZ?wbhEHb6krfwXlG!!ef##UTeq%VyLRQul}nc{ojZ5#?Afzt&YU@Y`t+$&r%s$W zarEfXBS(%LK79D#!GnAE?%la_=hm%TH*Vaxe*OA&>(;Gay?Vup70Z?_TeN7={Q2|e z&6_uO?%X+Z=FFZwd)BO3GiJ<~Hf`GE$&)8dnly3Z#0e87^!NAo_4W1i^mKQ3cXf4j zc6N4jbhNd#H8(dmH8nLhHa0Xg)YsS7)z#J3*4EV2R99D5RaI41R#sG0l$V#6m6es0 zloS^i7Znv178Vv16y)dU=jG+)=H}+)CW*rKF@JCnqN*B_$>% zCL|=p$H<#l^B)#M@L6RMMXwNMnpt}goFeJ1_lHK`1||&`T6+9&~XlZF_YHBJeDM?F9i-?FYjDkTN0*e2+{aizWogD*Qjr0td8UO!hQ2fclp$K%c z4#?S{Y{J0tpMl$;z+uBdCRR=nhaVpvv2*ZqvPf7c7&f(Xi8#&B2x@9(=MiEPxX`f3 ztzXVM=EH=Gj?Qeta(X=+PR1uDD4N)(SO})K^9d?;Tv=jyb#WP|~3bLJ@EMZvp1hgW3AT zG-DPyO#GPAIYBpj*PKk}v{O^Gl6$5EdQSEbR1KJ8<7xD?YpPOoN<)BQvs>?F^Ry2O zgqC&8kT$c*VYt}Dc1yx+Qcaz2Jx{w3p5%Sl0% zuniM#7(6^U`IXls30}!h%5Gdd92^`B0tyP4A=G~3#tmQ@a`oy}U@>y}@?~H#0xUy- z1<0{u#~`K0p+kp&1<3B*yLar^v1Q8^V7ak!<;vyDmoHtqbjgw>z|v#Ef(5|R1G(s! zK7Bf{^q4wz>Xa!{fCUJo^uR1ST3TAriVm#hMrmm&F-1p4Mh2wxNKH*8vH%GU4Gj(s z4hjl_6eEx_#M|2&xfpSCbAyy5@M6T;+8S7lz{?O*Q&V6uVr*<|XlMv2Nq}XDf`Wpa zoSd+*@F31WqfP^b0I-A*){*cCXl!Z}a`~dr=;+YM!ow$F(V*bi#HmoUW5b4rj*Se= z91c4kFdktS(k`pG;LzyY$|mUd!@w!!gn*QtN6d^5%MdU$TwJ_@Us~L1LZ@*O zdoRC3m)GA$rlT?z#(EhA6O~t8k+bf)aC1|t+Z;8;pf?kC9d4Jf3|%0ya^a)Xvs5js zepm=SJv&=H{K>H$7Z0^d8pNGiQF!_3$tn6?o7QAJQt=ef$-dDsQ^=J|RM+v?3I|2y z_LowoMGsDVWZ{{t=^mGGBjC_cF0mbvA2uvvZI===jN8+&(D~#LJ uC>RzkIXP83bcu>%&@<02LCISigd!)i@k*Oz9cVcybf~e3fq{vM!5RSI3o3vB literal 0 HcmV?d00001 diff --git a/assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif b/assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif new file mode 100644 index 0000000000000000000000000000000000000000..a73bf4c5e9056e336763dccb140cec69d6809775 GIT binary patch literal 4316 zcmeI#=}%K@0>|<0E!`+fp<=~TC|Hnd5SeQo$c&V&ERqU{RnQc~C5TuUM=LJra%jtH zDT|1pZQ&{?YDG{`)E+iLP+LVLidv93By%UznV1asmGhV;gj`1_nU}*o|H1R*JfD1j z@dcbLY=xYHe+8X=yQ;Oh%*8U@$Z_HJv+muD-s$wzjsWrbegJRaRD3R8*9g zmzR~5m6n!jwOX}WT~bm4!>~%FQYw`Sg+eZupE`Bw~kQ&M8n)1sq9 zv0>{%vFOjAQJi0JBn~)z$d?=V@=Q>q&!`Qsqj0X28MIaY$!xYD7ygvj2dh$%D0X&8AhdHy`?5JnpI`;z$j2MN8#tLo9 zpRo@zco9FE&4th$tWWUg>mancYIQiBA+bu(mEL|nkWOS2;HVqm1-rozwPRgo<7PyU zQH+v&WzZ&@b)Dy$mzm>NC>+d zjptwblUJQ6j8y3r(9`lj#3ACy?tbDPDF^!csx-ipj~_qI&CPxI@L_g#7TEIk?OR~W z>({RVEMJrIKX`KQ-o2%yEP4Vk0g_z5e*J4qfFyvCix)38H#Y-J8XFsdCuh%|b$X)L z>#M7)fhtv1RZdu(s%SKtU#S8}Ieq#xAm!MxV@Ho3bz*Y(@L{JX0F&I@T&E{uv3UFT z?P+OgiHV8v@$p}NrQg0~a07sf_2aDm+_E}eiV}6)Vn(nyJS1+ghne<3IX1QnYZAulI{j7AL@MwlHDEZE;?C9b za#{zKL|J$E)=u0Q)7#fi*kGR>p^@of{yQ*m9N8loHZ(90OjQ8aC#)T9$|a!LvI@Dw zuF|nRe1(o|B$`OK;HfgVDMdM#g{g7L3aOGZsJ!Cll}Azkm1c-SqVIx1{(^e0-}smP!H217rti z4iFqpBRV=dKy$RWw_m<|d1-S1CN5mK;FRM0`SVUJ8X6ja7a&3E>gs-_#+fr`mcsF^ z76EW9=E(8m$DKI>DrEou{XmVJoE(Wn0_*@4l97?IZQC}`B3rg>Nls2)2CrtB9uZ)X zG_4ivrPK$fsqK7+Aqq>t6WDD!qq=6zF0*h`Q49`4q5z&!(|? z637BmYnZ_n{_H@47cVM?D}tcma{P+0Ec0e$=nVCb9a%fF4KdYjG*9l3d7>ZhvPw?M z7Wl(h0>w)fcB z#MO8)*kRhDm<0OjB>r%nU7^)e>E6<~^_XZJZB1jo_JkmzoJ8mH-HaTSn&ycSi)@lG zdH|Cp7TXZ4<}a%lBxtJuU=bHCYjyv zqbr<6v53Udsq&qj@?S>^SSU-KSUOUiS}aBd0AuMwaYhB8!dVoHLVTYGuvQkk!Z}r( zQL$(Pm@3Y?SX?X4z&Ld1P=0>?!Gj0EY}vba@18w-fEi%604+o!QA9+<#*G^T0|S@o zQ~G~DHlQN5ZK0Z*=p7=0N$my;8cQHzD)=@d?8?dLOLt3+Az+APPqxs}GDMp%#*kPGN_OEddp*(8Tnt28g3nuZ~X%wcguY zUK=F5eiA9n=qUAz3JIUeiXC%b>E}MhOI4Y1tS?){E+^|(1Pf%LD7)H)#0dVGBv3?^ z1V-d{K{jJF8WkKSltTR@cp_8zsqLm;OrZ-Va9jq>L{WR06%K#-4<@XJM)0)Cp?W1u b_R!h2ivHgdY2LvTBR||0lu*!URK&jliu`sY literal 0 HcmV?d00001 diff --git a/assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif b/assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif new file mode 100644 index 0000000000000000000000000000000000000000..12e50c71ba6f6345cf807544286169fc047c824c GIT binary patch literal 2154 zcmZ?wbhEHb6krfwXlG!!ef##UTeq%VyLRQul}nc{ojZ5#?Afzt&YU@Y`t+$&r%s$W zarEfXBS(%LK79D#!GnAE?%la_=hm%TH*Vaxe*OA&>(;Gay?Vup70Z?_TeN7={Q2|e z&6_uO?%X+Z=FFZwd)BO3GiJ<~Hf`GE$&)8dnly3Z#0e87^!NAo_4W1i^mKQ3cXf4j zc6N4jbhNd#H8(dmH8nLhHa0Xg)YsS7)z#J3*4EV2R99D5RaI41R#sG0l$V#6m6es0 zloS^i7Znv178Vv16y)dU=jG+)=H}+)CW*rKF@JCnqN*B_$>% zCL|=p$H<#l^B)#M@L6RMMXwNMnpt}goFeJ1_lHK`1||&`T6+9&~XlZF_YHBJeDM?F9i-?FYjDkTN0*e2+{aizWogD*Qjr0td8UO!hQ2fclp$K%c z4#?S{Y{J0tpMl$;z+uBdCRR=nhaVpvv2*ZqvPf7c7&f(Xi8#&B2x@9(=MiEPxX`f3 ztzXVM=EH=Gj?Qeta(X=+PR1uDD4N)(SO})K^9d?;Tv=jyb#WP|~3bLJ@EMZvp1hgW3AT zG-DPyO#GPAIYBpj*PKk}v{O^Gl6$5EdQSEbR1KJ8<7xD?YpPOoN<)BQvs>?F^Ry2O zgqC&8kT$c*VYt}Dc1yx+Qcaz2Jx{w3p5%Sl0% zuniM#7(6^U`IXls30}!h%5Gdd92^`B0tyP4A=G~3#tmQ@a`oy}U@>y}@?~H#0xUy- z1<0{u#~`K0p+kp&1<3B*yLar^v1Q8^V7ak!<;vyDmoHtqbjgw>z|v#Ef(5|R1G(s! zK7Bf{^q4wz>Xa!{fCUJo^uR1ST3TAriVm#hMrmm&F-1p4Mh2wxNKH*8vH%GU4Gj(s z4hjl_6eEx_#M|2&xfpSCbAyy5@M6T;+8S7lz{?O*Q&V6uVr*<|XlMv2Nq}XDf`Wpa zoSd+*@F31WqfP^b0I-A*){*cCXl!Z}a`~dr=;+YM!ow$F(V*bi#HmoUW5b4rj*Se= z91c4kFdktS(k`pG;LzyY$|mUd!@w!!gn*QtN6d^5%MdU$TwJ_@Us~L1LZ@*O zdoRC3m)GA$rlT?z#(EhA6O~t8k+bf)aC1|t+Z;8;pf?kC9d4Jf3|%0ya^a)Xvs5js zepm=SJv&=H{K>H$7Z0^d8pNGiQF!_3$tn6?o7QAJQt=ef$-dDsQ^=J|RM+v?3I|2y z_LowoMGsDVWZ{{t=^mGGBjC_cF0mbvA2uvvZI===jN8+&(D~#LJ uC>RzkIXP83bcu>%&@<02LCISigd!)i@k*Oz9cVcybf~e3fq{vM!5RSI3o3vB literal 0 HcmV?d00001 diff --git a/assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif b/assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif new file mode 100644 index 0000000000000000000000000000000000000000..a73bf4c5e9056e336763dccb140cec69d6809775 GIT binary patch literal 4316 zcmeI#=}%K@0>|<0E!`+fp<=~TC|Hnd5SeQo$c&V&ERqU{RnQc~C5TuUM=LJra%jtH zDT|1pZQ&{?YDG{`)E+iLP+LVLidv93By%UznV1asmGhV;gj`1_nU}*o|H1R*JfD1j z@dcbLY=xYHe+8X=yQ;Oh%*8U@$Z_HJv+muD-s$wzjsWrbegJRaRD3R8*9g zmzR~5m6n!jwOX}WT~bm4!>~%FQYw`Sg+eZupE`Bw~kQ&M8n)1sq9 zv0>{%vFOjAQJi0JBn~)z$d?=V@=Q>q&!`Qsqj0X28MIaY$!xYD7ygvj2dh$%D0X&8AhdHy`?5JnpI`;z$j2MN8#tLo9 zpRo@zco9FE&4th$tWWUg>mancYIQiBA+bu(mEL|nkWOS2;HVqm1-rozwPRgo<7PyU zQH+v&WzZ&@b)Dy$mzm>NC>+d zjptwblUJQ6j8y3r(9`lj#3ACy?tbDPDF^!csx-ipj~_qI&CPxI@L_g#7TEIk?OR~W z>({RVEMJrIKX`KQ-o2%yEP4Vk0g_z5e*J4qfFyvCix)38H#Y-J8XFsdCuh%|b$X)L z>#M7)fhtv1RZdu(s%SKtU#S8}Ieq#xAm!MxV@Ho3bz*Y(@L{JX0F&I@T&E{uv3UFT z?P+OgiHV8v@$p}NrQg0~a07sf_2aDm+_E}eiV}6)Vn(nyJS1+ghne<3IX1QnYZAulI{j7AL@MwlHDEZE;?C9b za#{zKL|J$E)=u0Q)7#fi*kGR>p^@of{yQ*m9N8loHZ(90OjQ8aC#)T9$|a!LvI@Dw zuF|nRe1(o|B$`OK;HfgVDMdM#g{g7L3aOGZsJ!Cll}Azkm1c-SqVIx1{(^e0-}smP!H217rti z4iFqpBRV=dKy$RWw_m<|d1-S1CN5mK;FRM0`SVUJ8X6ja7a&3E>gs-_#+fr`mcsF^ z76EW9=E(8m$DKI>DrEou{XmVJoE(Wn0_*@4l97?IZQC}`B3rg>Nls2)2CrtB9uZ)X zG_4ivrPK$fsqK7+Aqq>t6WDD!qq=6zF0*h`Q49`4q5z&!(|? z637BmYnZ_n{_H@47cVM?D}tcma{P+0Ec0e$=nVCb9a%fF4KdYjG*9l3d7>ZhvPw?M z7Wl(h0>w)fcB z#MO8)*kRhDm<0OjB>r%nU7^)e>E6<~^_XZJZB1jo_JkmzoJ8mH-HaTSn&ycSi)@lG zdH|Cp7TXZ4<}a%lBxtJuU=bHCYjyv zqbr<6v53Udsq&qj@?S>^SSU-KSUOUiS}aBd0AuMwaYhB8!dVoHLVTYGuvQkk!Z}r( zQL$(Pm@3Y?SX?X4z&Ld1P=0>?!Gj0EY}vba@18w-fEi%604+o!QA9+<#*G^T0|S@o zQ~G~DHlQN5ZK0Z*=p7=0N$my;8cQHzD)=@d?8?dLOLt3+Az+APPqxs}GDMp%#*kPGN_OEddp*(8Tnt28g3nuZ~X%wcguY zUK=F5eiA9n=qUAz3JIUeiXC%b>E}MhOI4Y1tS?){E+^|(1Pf%LD7)H)#0dVGBv3?^ z1V-d{K{jJF8WkKSltTR@cp_8zsqLm;OrZ-Va9jq>L{WR06%K#-4<@XJM)0)Cp?W1u b_R!h2ivHgdY2LvTBR||0lu*!URK&jliu`sY literal 0 HcmV?d00001 diff --git a/assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif b/assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif new file mode 100644 index 0000000000000000000000000000000000000000..12e50c71ba6f6345cf807544286169fc047c824c GIT binary patch literal 2154 zcmZ?wbhEHb6krfwXlG!!ef##UTeq%VyLRQul}nc{ojZ5#?Afzt&YU@Y`t+$&r%s$W zarEfXBS(%LK79D#!GnAE?%la_=hm%TH*Vaxe*OA&>(;Gay?Vup70Z?_TeN7={Q2|e z&6_uO?%X+Z=FFZwd)BO3GiJ<~Hf`GE$&)8dnly3Z#0e87^!NAo_4W1i^mKQ3cXf4j zc6N4jbhNd#H8(dmH8nLhHa0Xg)YsS7)z#J3*4EV2R99D5RaI41R#sG0l$V#6m6es0 zloS^i7Znv178Vv16y)dU=jG+)=H}+)CW*rKF@JCnqN*B_$>% zCL|=p$H<#l^B)#M@L6RMMXwNMnpt}goFeJ1_lHK`1||&`T6+9&~XlZF_YHBJeDM?F9i-?FYjDkTN0*e2+{aizWogD*Qjr0td8UO!hQ2fclp$K%c z4#?S{Y{J0tpMl$;z+uBdCRR=nhaVpvv2*ZqvPf7c7&f(Xi8#&B2x@9(=MiEPxX`f3 ztzXVM=EH=Gj?Qeta(X=+PR1uDD4N)(SO})K^9d?;Tv=jyb#WP|~3bLJ@EMZvp1hgW3AT zG-DPyO#GPAIYBpj*PKk}v{O^Gl6$5EdQSEbR1KJ8<7xD?YpPOoN<)BQvs>?F^Ry2O zgqC&8kT$c*VYt}Dc1yx+Qcaz2Jx{w3p5%Sl0% zuniM#7(6^U`IXls30}!h%5Gdd92^`B0tyP4A=G~3#tmQ@a`oy}U@>y}@?~H#0xUy- z1<0{u#~`K0p+kp&1<3B*yLar^v1Q8^V7ak!<;vyDmoHtqbjgw>z|v#Ef(5|R1G(s! zK7Bf{^q4wz>Xa!{fCUJo^uR1ST3TAriVm#hMrmm&F-1p4Mh2wxNKH*8vH%GU4Gj(s z4hjl_6eEx_#M|2&xfpSCbAyy5@M6T;+8S7lz{?O*Q&V6uVr*<|XlMv2Nq}XDf`Wpa zoSd+*@F31WqfP^b0I-A*){*cCXl!Z}a`~dr=;+YM!ow$F(V*bi#HmoUW5b4rj*Se= z91c4kFdktS(k`pG;LzyY$|mUd!@w!!gn*QtN6d^5%MdU$TwJ_@Us~L1LZ@*O zdoRC3m)GA$rlT?z#(EhA6O~t8k+bf)aC1|t+Z;8;pf?kC9d4Jf3|%0ya^a)Xvs5js zepm=SJv&=H{K>H$7Z0^d8pNGiQF!_3$tn6?o7QAJQt=ef$-dDsQ^=J|RM+v?3I|2y z_LowoMGsDVWZ{{t=^mGGBjC_cF0mbvA2uvvZI===jN8+&(D~#LJ uC>RzkIXP83bcu>%&@<02LCISigd!)i@k*Oz9cVcybf~e3fq{vM!5RSI3o3vB literal 0 HcmV?d00001 diff --git a/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif b/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif new file mode 100644 index 0000000000000000000000000000000000000000..a73bf4c5e9056e336763dccb140cec69d6809775 GIT binary patch literal 4316 zcmeI#=}%K@0>|<0E!`+fp<=~TC|Hnd5SeQo$c&V&ERqU{RnQc~C5TuUM=LJra%jtH zDT|1pZQ&{?YDG{`)E+iLP+LVLidv93By%UznV1asmGhV;gj`1_nU}*o|H1R*JfD1j z@dcbLY=xYHe+8X=yQ;Oh%*8U@$Z_HJv+muD-s$wzjsWrbegJRaRD3R8*9g zmzR~5m6n!jwOX}WT~bm4!>~%FQYw`Sg+eZupE`Bw~kQ&M8n)1sq9 zv0>{%vFOjAQJi0JBn~)z$d?=V@=Q>q&!`Qsqj0X28MIaY$!xYD7ygvj2dh$%D0X&8AhdHy`?5JnpI`;z$j2MN8#tLo9 zpRo@zco9FE&4th$tWWUg>mancYIQiBA+bu(mEL|nkWOS2;HVqm1-rozwPRgo<7PyU zQH+v&WzZ&@b)Dy$mzm>NC>+d zjptwblUJQ6j8y3r(9`lj#3ACy?tbDPDF^!csx-ipj~_qI&CPxI@L_g#7TEIk?OR~W z>({RVEMJrIKX`KQ-o2%yEP4Vk0g_z5e*J4qfFyvCix)38H#Y-J8XFsdCuh%|b$X)L z>#M7)fhtv1RZdu(s%SKtU#S8}Ieq#xAm!MxV@Ho3bz*Y(@L{JX0F&I@T&E{uv3UFT z?P+OgiHV8v@$p}NrQg0~a07sf_2aDm+_E}eiV}6)Vn(nyJS1+ghne<3IX1QnYZAulI{j7AL@MwlHDEZE;?C9b za#{zKL|J$E)=u0Q)7#fi*kGR>p^@of{yQ*m9N8loHZ(90OjQ8aC#)T9$|a!LvI@Dw zuF|nRe1(o|B$`OK;HfgVDMdM#g{g7L3aOGZsJ!Cll}Azkm1c-SqVIx1{(^e0-}smP!H217rti z4iFqpBRV=dKy$RWw_m<|d1-S1CN5mK;FRM0`SVUJ8X6ja7a&3E>gs-_#+fr`mcsF^ z76EW9=E(8m$DKI>DrEou{XmVJoE(Wn0_*@4l97?IZQC}`B3rg>Nls2)2CrtB9uZ)X zG_4ivrPK$fsqK7+Aqq>t6WDD!qq=6zF0*h`Q49`4q5z&!(|? z637BmYnZ_n{_H@47cVM?D}tcma{P+0Ec0e$=nVCb9a%fF4KdYjG*9l3d7>ZhvPw?M z7Wl(h0>w)fcB z#MO8)*kRhDm<0OjB>r%nU7^)e>E6<~^_XZJZB1jo_JkmzoJ8mH-HaTSn&ycSi)@lG zdH|Cp7TXZ4<}a%lBxtJuU=bHCYjyv zqbr<6v53Udsq&qj@?S>^SSU-KSUOUiS}aBd0AuMwaYhB8!dVoHLVTYGuvQkk!Z}r( zQL$(Pm@3Y?SX?X4z&Ld1P=0>?!Gj0EY}vba@18w-fEi%604+o!QA9+<#*G^T0|S@o zQ~G~DHlQN5ZK0Z*=p7=0N$my;8cQHzD)=@d?8?dLOLt3+Az+APPqxs}GDMp%#*kPGN_OEddp*(8Tnt28g3nuZ~X%wcguY zUK=F5eiA9n=qUAz3JIUeiXC%b>E}MhOI4Y1tS?){E+^|(1Pf%LD7)H)#0dVGBv3?^ z1V-d{K{jJF8WkKSltTR@cp_8zsqLm;OrZ-Va9jq>L{WR06%K#-4<@XJM)0)Cp?W1u b_R!h2ivHgdY2LvTBR||0lu*!URK&jliu`sY literal 0 HcmV?d00001 diff --git a/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif b/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif new file mode 100644 index 0000000000000000000000000000000000000000..12e50c71ba6f6345cf807544286169fc047c824c GIT binary patch literal 2154 zcmZ?wbhEHb6krfwXlG!!ef##UTeq%VyLRQul}nc{ojZ5#?Afzt&YU@Y`t+$&r%s$W zarEfXBS(%LK79D#!GnAE?%la_=hm%TH*Vaxe*OA&>(;Gay?Vup70Z?_TeN7={Q2|e z&6_uO?%X+Z=FFZwd)BO3GiJ<~Hf`GE$&)8dnly3Z#0e87^!NAo_4W1i^mKQ3cXf4j zc6N4jbhNd#H8(dmH8nLhHa0Xg)YsS7)z#J3*4EV2R99D5RaI41R#sG0l$V#6m6es0 zloS^i7Znv178Vv16y)dU=jG+)=H}+)CW*rKF@JCnqN*B_$>% zCL|=p$H<#l^B)#M@L6RMMXwNMnpt}goFeJ1_lHK`1||&`T6+9&~XlZF_YHBJeDM?F9i-?FYjDkTN0*e2+{aizWogD*Qjr0td8UO!hQ2fclp$K%c z4#?S{Y{J0tpMl$;z+uBdCRR=nhaVpvv2*ZqvPf7c7&f(Xi8#&B2x@9(=MiEPxX`f3 ztzXVM=EH=Gj?Qeta(X=+PR1uDD4N)(SO})K^9d?;Tv=jyb#WP|~3bLJ@EMZvp1hgW3AT zG-DPyO#GPAIYBpj*PKk}v{O^Gl6$5EdQSEbR1KJ8<7xD?YpPOoN<)BQvs>?F^Ry2O zgqC&8kT$c*VYt}Dc1yx+Qcaz2Jx{w3p5%Sl0% zuniM#7(6^U`IXls30}!h%5Gdd92^`B0tyP4A=G~3#tmQ@a`oy}U@>y}@?~H#0xUy- z1<0{u#~`K0p+kp&1<3B*yLar^v1Q8^V7ak!<;vyDmoHtqbjgw>z|v#Ef(5|R1G(s! zK7Bf{^q4wz>Xa!{fCUJo^uR1ST3TAriVm#hMrmm&F-1p4Mh2wxNKH*8vH%GU4Gj(s z4hjl_6eEx_#M|2&xfpSCbAyy5@M6T;+8S7lz{?O*Q&V6uVr*<|XlMv2Nq}XDf`Wpa zoSd+*@F31WqfP^b0I-A*){*cCXl!Z}a`~dr=;+YM!ow$F(V*bi#HmoUW5b4rj*Se= z91c4kFdktS(k`pG;LzyY$|mUd!@w!!gn*QtN6d^5%MdU$TwJ_@Us~L1LZ@*O zdoRC3m)GA$rlT?z#(EhA6O~t8k+bf)aC1|t+Z;8;pf?kC9d4Jf3|%0ya^a)Xvs5js zepm=SJv&=H{K>H$7Z0^d8pNGiQF!_3$tn6?o7QAJQt=ef$-dDsQ^=J|RM+v?3I|2y z_LowoMGsDVWZ{{t=^mGGBjC_cF0mbvA2uvvZI===jN8+&(D~#LJ uC>RzkIXP83bcu>%&@<02LCISigd!)i@k*Oz9cVcybf~e3fq{vM!5RSI3o3vB literal 0 HcmV?d00001 diff --git a/campaign/event_20260625_cn/ht1.py b/campaign/event_20260625_cn/ht1.py new file mode 100644 index 000000000..e74fa4caa --- /dev/null +++ b/campaign/event_20260625_cn/ht1.py @@ -0,0 +1,79 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('HT1') +MAP.shape = 'I7' +MAP.camera_data = ['F2', 'F5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + -- -- ME -- ME -- -- ++ MB + -- -- ++ ME -- ME ++ ME -- + SP -- -- MS -- -- Me -- -- + -- -- __ -- ++ -- -- -- ME + SP -- -- MS ++ Me -- ++ ++ + -- -- -- -- -- -- -- ++ ++ + ++ ++ ++ Me -- ME -- ME -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['MeowfficerBust_Studying', 'MeowfficerBust_Playtime'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219_SP = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + MAP_SWIPE_MULTIPLY = (1.144, 1.165) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.106, 1.126) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.074, 1.093) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20260625_cn/ht2.py b/campaign/event_20260625_cn/ht2.py new file mode 100644 index 000000000..f3133d748 --- /dev/null +++ b/campaign/event_20260625_cn/ht2.py @@ -0,0 +1,86 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT2') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F5'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ME -- ME ++ ME -- -- ++ ++ + -- -- -- -- -- -- SP -- ++ + -- Me ++ ++ ++ -- -- SP -- + -- -- -- Me -- MS -- -- -- + ME -- ME ++ -- MS MS ++ Me + -- MB -- ++ __ -- -- ++ -- + ME -- ME -- -- ME -- Me -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2, 'siren': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['MeowfficerBust_Studying', 'MeowfficerBust_Playtime'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.224, 1.247) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.184, 1.206) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.149, 1.170) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20260625_cn/ht3.py b/campaign/event_20260625_cn/ht3.py new file mode 100644 index 000000000..eec5d0294 --- /dev/null +++ b/campaign/event_20260625_cn/ht3.py @@ -0,0 +1,89 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT3') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F5'] +MAP.map_data = """ + ++ ++ ++ ++ MB ++ ++ ++ ++ + ++ -- Me Me -- Me Me -- ++ + -- ME -- -- __ -- -- ME -- + ME -- -- SP ++ SP -- -- ME + -- ME -- -- -- -- -- ME -- + ++ ++ ME -- MS -- ME ++ ++ + ++ ++ -- MS -- MS -- ++ ++ + -- -- ++ ++ ++ ++ ++ -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2, 'siren': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['MeowfficerBust_Studying', 'MeowfficerBust_Playtime'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.115, 1.136) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.078, 1.098) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.047, 1.065) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/module/template/assets.py b/module/template/assets.py index c24692c7e..2082ebe53 100644 --- a/module/template/assets.py +++ b/module/template/assets.py @@ -177,6 +177,8 @@ TEMPLATE_SIREN_MarieRoseDOA = Template(file={'cn': './assets/cn/template/TEMPLAT TEMPLATE_SIREN_MaryCeleste = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MaryCeleste.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MaryCeleste.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MaryCeleste.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MaryCeleste.gif'}) TEMPLATE_SIREN_Maya = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Maya.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Maya.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Maya.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Maya.gif'}) TEMPLATE_SIREN_MeowfficerBust_Hobbies = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif'}) +TEMPLATE_SIREN_MeowfficerBust_Playtime = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif'}) +TEMPLATE_SIREN_MeowfficerBust_Studying = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif'}) TEMPLATE_SIREN_Mikasa = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Mikasa.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Mikasa.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Mikasa.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Mikasa.gif'}) TEMPLATE_SIREN_MisakiDOA = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MisakiDOA.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MisakiDOA.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MisakiDOA.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MisakiDOA.gif'}) TEMPLATE_SIREN_Miyuki = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Miyuki.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Miyuki.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Miyuki.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Miyuki.gif'}) From 00d966c720bfc1a25cb663d7290debf556ee2a01 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 25 Jun 2026 23:04:08 +0800 Subject: [PATCH 4/5] Add: Chapter SP --- campaign/event_20260625_cn/sp.py | 104 +++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 campaign/event_20260625_cn/sp.py diff --git a/campaign/event_20260625_cn/sp.py b/campaign/event_20260625_cn/sp.py new file mode 100644 index 000000000..9be26753d --- /dev/null +++ b/campaign/event_20260625_cn/sp.py @@ -0,0 +1,104 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('SP') +MAP.shape = 'G10' +MAP.camera_data = ['D3', 'D7', 'D8'] +MAP.camera_data_spawn_point = ['D8'] +MAP.map_data = """ + -- -- ++ -- ++ ++ -- + ++ ++ ++ MB ++ ++ ++ + ++ ME -- -- -- ME -- + -- -- -- ME -- -- ME + ME -- ME ++ ++ -- -- + ++ -- -- -- ++ -- ME + ++ -- MS __ MS -- ++ + ME -- -- MS -- -- ME + ++ ++ -- -- -- ME -- + ++ ++ SP -- SP ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 10, 'siren': 3}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6}, + {'battle': 7, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, \ +A2, B2, C2, D2, E2, F2, G2, \ +A3, B3, C3, D3, E3, F3, G3, \ +A4, B4, C4, D4, E4, F4, G4, \ +A5, B5, C5, D5, E5, F5, G5, \ +A6, B6, C6, D6, E6, F6, G6, \ +A7, B7, C7, D7, E7, F7, G7, \ +A8, B8, C8, D8, E8, F8, G8, \ +A9, B9, C9, D9, E9, F9, G9, \ +A10, B10, C10, D10, E10, F10, G10, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['MeowfficerBust_Studying', 'MeowfficerBust_Playtime'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + MAP_IS_ONE_TIME_STAGE = True + MAP_CHAPTER_SWITCH_20241219_SP = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = False + HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)]) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_SWIPE_MULTIPLY = (1.005, 1.024) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.972, 0.990) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.944, 0.961) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=2): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_7(self): + return self.fleet_boss.clear_boss() From 9121b94cedce9c49610247dc720a4003284c76dd Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 25 Jun 2026 23:09:13 +0800 Subject: [PATCH 5/5] Fix: handle AVATAR_TRIAL_EXPIRED --- assets/cn/handler/AVATAR_EXPIRED.png | Bin 0 -> 5718 bytes module/handler/assets.py | 1 + module/handler/login.py | 2 ++ 3 files changed, 3 insertions(+) create mode 100644 assets/cn/handler/AVATAR_EXPIRED.png diff --git a/assets/cn/handler/AVATAR_EXPIRED.png b/assets/cn/handler/AVATAR_EXPIRED.png new file mode 100644 index 0000000000000000000000000000000000000000..549f0955cc69ef162d09ab3e71c60b6a4f31ddf7 GIT binary patch literal 5718 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