From 3fb7c5490889a339b8163610f5d4bf24c3c98562 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sat, 20 Dec 2025 19:10:39 +0800 Subject: [PATCH 1/4] Add: Chapter B --- .../template/TEMPLATE_SIREN_Vboss_Chariot.gif | Bin 0 -> 3879 bytes .../template/TEMPLATE_SIREN_Vboss_Hermit.gif | Bin 0 -> 3821 bytes .../template/TEMPLATE_SIREN_Vboss_Lovers.gif | Bin 0 -> 4002 bytes .../template/TEMPLATE_SIREN_Vboss_Chariot.gif | Bin 0 -> 3879 bytes .../template/TEMPLATE_SIREN_Vboss_Hermit.gif | Bin 0 -> 3821 bytes .../template/TEMPLATE_SIREN_Vboss_Lovers.gif | Bin 0 -> 4002 bytes .../template/TEMPLATE_SIREN_Vboss_Chariot.gif | Bin 0 -> 3879 bytes .../template/TEMPLATE_SIREN_Vboss_Hermit.gif | Bin 0 -> 3821 bytes .../template/TEMPLATE_SIREN_Vboss_Lovers.gif | Bin 0 -> 4002 bytes .../template/TEMPLATE_SIREN_Vboss_Chariot.gif | Bin 0 -> 3879 bytes .../template/TEMPLATE_SIREN_Vboss_Hermit.gif | Bin 0 -> 3821 bytes .../template/TEMPLATE_SIREN_Vboss_Lovers.gif | Bin 0 -> 4002 bytes campaign/event_20251218_cn/b1.py | 96 ++++++++++++++++++ campaign/event_20251218_cn/b2.py | 76 ++++++++++++++ campaign/event_20251218_cn/b3.py | 82 +++++++++++++++ module/template/assets.py | 3 + 16 files changed, 257 insertions(+) create mode 100644 assets/cn/template/TEMPLATE_SIREN_Vboss_Chariot.gif create mode 100644 assets/cn/template/TEMPLATE_SIREN_Vboss_Hermit.gif create mode 100644 assets/cn/template/TEMPLATE_SIREN_Vboss_Lovers.gif create mode 100644 assets/en/template/TEMPLATE_SIREN_Vboss_Chariot.gif create mode 100644 assets/en/template/TEMPLATE_SIREN_Vboss_Hermit.gif create mode 100644 assets/en/template/TEMPLATE_SIREN_Vboss_Lovers.gif create mode 100644 assets/jp/template/TEMPLATE_SIREN_Vboss_Chariot.gif create mode 100644 assets/jp/template/TEMPLATE_SIREN_Vboss_Hermit.gif create mode 100644 assets/jp/template/TEMPLATE_SIREN_Vboss_Lovers.gif create mode 100644 assets/tw/template/TEMPLATE_SIREN_Vboss_Chariot.gif create mode 100644 assets/tw/template/TEMPLATE_SIREN_Vboss_Hermit.gif create mode 100644 assets/tw/template/TEMPLATE_SIREN_Vboss_Lovers.gif create mode 100644 campaign/event_20251218_cn/b1.py create mode 100644 campaign/event_20251218_cn/b2.py create mode 100644 campaign/event_20251218_cn/b3.py diff --git a/assets/cn/template/TEMPLATE_SIREN_Vboss_Chariot.gif b/assets/cn/template/TEMPLATE_SIREN_Vboss_Chariot.gif new file mode 100644 index 0000000000000000000000000000000000000000..2d693b9451f72f6e6ea57715e9e9ba1d0901acbd GIT binary patch literal 3879 zcmeI!X-pGo9LMpQa60f< z9zTBk=+UEx4<9~w@ZkRa`}gkMyL(;Hy$;r{{^*D~NT)9%G(`962q@|@TS+ZpD z;>8OWE=);DnLmGia&q$AxpOfLn>~B>tXZ?-H5$#dY14v(gM)&CluD&s zE}t}Ml8=v%mzS4^hlf-ub#rr*NF>hA&Q4BFj*gB3fxyAR!QS4U&*$@aJT8}OV`IZ& zv8=7F84L#Ucxu}ySuxA z`W#H5d$8 zSy>=^_3G8DR;>crnVFf(moEq3>FMcX#8XpK7cE+}V8H@_4#X1@5@ybv3AiI7BEWZ8 zSXgLiXh=wiTCG;8R0@S+^5n?@0RjI0{@&i+pd5(1ySsyOS65enE*6VP-*$F(@0~mNZ;5i0LWj zYz|kJUL9Uw=cUr&kuGXmU(K(*krcI&;hvn)s1PCwx_83)*d7%{L7|%Yve@Ezowj0u zl~C45{qgg^a0B4iRjV7U(&t(+75vsTLTR9}BJ`e0$TtJ;~Ii{<;oS% zdg;<7SlQ>!or8Vd-rnBU)&^QXN4jg*E?C(+ckZmOuZOK&RaLcZ+cs!1Ol%m`fE3~j zn|kfqwV)Le3{;`Ku&K%5lCwG~DJd>44z$jgF$1(lM@K_&$<9ulI(5pFDPR_A>*wb; zapFXoOa^RWR(}eX>?};_vBFweSwUgJDT<FWt2wghzxZ|~TMjBFmn&}|d4HUQ68gOeB xR*5x<^GdwL^b{kCDX6x7%P^6?S7BCe6Mc3dQIeB|y2ZyyhuW!h9(i8fdl{m literal 0 HcmV?d00001 diff --git a/assets/cn/template/TEMPLATE_SIREN_Vboss_Hermit.gif b/assets/cn/template/TEMPLATE_SIREN_Vboss_Hermit.gif new file mode 100644 index 0000000000000000000000000000000000000000..be67af5078900b743ec04d7a5d9271e5f73cb657 GIT binary patch literal 3821 zcmeI!c~4VW9LDj}(w1(P0;M2}Qb1a;U_qiq5ihi5(TbN%MIEdNh&pOPf~bh4tO7!j zH4&9|P;p|AL1Retk5&)~xFRm2#tlX>q5^JcQ08ZDLd-0$0M9G9=j49!eL}-Sr2gxf zh=U3dnwXgQ_U+r(uV2T<$H&ITK7Rc8;lqdb@87?B_il7_ba;69&6_u`U%wt28hZKi z<@4vy`}_MJK79D#!GpVZ@AmfgUb=Ltqod=(g$w7;pKohxYi(_9Zf-tx>XgA?(ChU_ zj~+d8a@jv9Yl+F)>k5QIV06 z5fKqer7}D`TqctR2M1#q78n?~Xwjm8fB=7gf2maJ=jS(P&Kz%VZ?RbH;o;%#?(XX9 zDi8=}%$VWi&lI`sc+;NTGK(^)!cDwoX8oHPqCqp_eP?&32?jfZuX}NN19s{Lw zNA;Zt_<>?aXRg4k%*H3X4Ixub4sy^A;iF_MmqzD`T2x6)HllJm6fLTP8vD%YqM|(* z+13(~$^ZV~LQoB!zkK-uq(6Q71ga-VkBp3fYViE()vLk5K_LC?*|SHF9)apRckW!j ze*NmztKHq*U0q!O8%Uo!cMepaK7IPci4(_<9|zS94Go76AFi*j2iSz_%F4=v2M?B) zmzR~5m6Vk1-@hM_6T-oEc6Rpe-Me?~+O>1%&Wwx(;GXwrttFd2>oi%EpZw zlarG-Y}k;HkO11_3qycaKCOxT_~cdoCmF991!ySTUj z>6tTU5~`<9pAM>RZEXQIkH@pJvLay9XtXKtS5NgT(hnns^O!&$T)_RMPC`<-Fl*iB zqpHCKDpoFzZN7n#5t)qwny?D1S=}r&4Gm$fW(Af)U$lyg%Pvtp1WG@WHbGIrcUBG! zOJqG&(-uT!+5K@WpYA>j$y-c@cAc}RMyE!YnK@gyVyw-i0PXg=l^p%S!1C4;>8Oh$d4aCzIX2) z=PgX$)FeL9y)Xg^w!qaLYX1UKo{IXoO5$? zv$C=Xu9=ycz!f4qNtEdD+O=!ftXTs!UbSi!K@S<;ROp8K!@ke zn+F{Rv_3vQkYX<{FHcWTsIf>S5(tj`l18Y!fj`zIWi`b$$=|ZkC@tZHUaTSYJ7qf+Ru)E&m}ip%pvnL z#)nh$=o*GOpQ6zu7FP=qHwyP7^DDB&~ zZwaUa0|UfzzJLEdaJ_x|HgLUl>lTQ;a^=e9%a?&G%xRO!bmq(%SkX;QO|YM#v_C?H z%vMxX0N2veQbH_bHYX=%-@bi>TR;n$g%!Ph`*xrUfrYxliUzs_TG-Dpo};6qaU6%b zf?F8RKQ=ZfD2Uk4^XJb8s}hNX;0jg&>g0Ha(oS-P(!zM=a9}F^JX7ce=tq&I`bGjZ zjEW+3%1vC^(i+#WFw}y(U91*Gopm!AFfx@ESk$K*F)Jx$IdHg)r%!1tdpuKFr|*}U z&+?Po#RVIKbe2NAQ55-Gc$t|+avi#vm_N;y#Nl>n+B=vwi+)9FwKK}+du7n|WTYig rQM~j|e+tr)88p?fv9Xv&VtI0L3>mA0h$B*~o**)Xp`u`1E?W3E@!K3x literal 0 HcmV?d00001 diff --git a/assets/cn/template/TEMPLATE_SIREN_Vboss_Lovers.gif b/assets/cn/template/TEMPLATE_SIREN_Vboss_Lovers.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5b4079807d2192facdedd8045eeaacc3780e7d3 GIT binary patch literal 4002 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 literal 0 HcmV?d00001 diff --git a/assets/en/template/TEMPLATE_SIREN_Vboss_Hermit.gif b/assets/en/template/TEMPLATE_SIREN_Vboss_Hermit.gif new file mode 100644 index 0000000000000000000000000000000000000000..be67af5078900b743ec04d7a5d9271e5f73cb657 GIT binary patch literal 3821 zcmeI!c~4VW9LDj}(w1(P0;M2}Qb1a;U_qiq5ihi5(TbN%MIEdNh&pOPf~bh4tO7!j zH4&9|P;p|AL1Retk5&)~xFRm2#tlX>q5^JcQ08ZDLd-0$0M9G9=j49!eL}-Sr2gxf zh=U3dnwXgQ_U+r(uV2T<$H&ITK7Rc8;lqdb@87?B_il7_ba;69&6_u`U%wt28hZKi z<@4vy`}_MJK79D#!GpVZ@AmfgUb=Ltqod=(g$w7;pKohxYi(_9Zf-tx>XgA?(ChU_ zj~+d8a@jv9Yl+F)>k5QIV06 z5fKqer7}D`TqctR2M1#q78n?~Xwjm8fB=7gf2maJ=jS(P&Kz%VZ?RbH;o;%#?(XX9 zDi8=}%$VWi&lI`sc+;NTGK(^)!cDwoX8oHPqCqp_eP?&32?jfZuX}NN19s{Lw zNA;Zt_<>?aXRg4k%*H3X4Ixub4sy^A;iF_MmqzD`T2x6)HllJm6fLTP8vD%YqM|(* z+13(~$^ZV~LQoB!zkK-uq(6Q71ga-VkBp3fYViE()vLk5K_LC?*|SHF9)apRckW!j ze*NmztKHq*U0q!O8%Uo!cMepaK7IPci4(_<9|zS94Go76AFi*j2iSz_%F4=v2M?B) zmzR~5m6Vk1-@hM_6T-oEc6Rpe-Me?~+O>1%&Wwx(;GXwrttFd2>oi%EpZw zlarG-Y}k;HkO11_3qycaKCOxT_~cdoCmF991!ySTUj z>6tTU5~`<9pAM>RZEXQIkH@pJvLay9XtXKtS5NgT(hnns^O!&$T)_RMPC`<-Fl*iB zqpHCKDpoFzZN7n#5t)qwny?D1S=}r&4Gm$fW(Af)U$lyg%Pvtp1WG@WHbGIrcUBG! zOJqG&(-uT!+5K@WpYA>j$y-c@cAc}RMyE!YnK@gyVyw-i0PXg=l^p%S!1C4;>8Oh$d4aCzIX2) z=PgX$)FeL9y)Xg^w!qaLYX1UKo{IXoO5$? zv$C=Xu9=ycz!f4qNtEdD+O=!ftXTs!UbSi!K@S<;ROp8K!@ke zn+F{Rv_3vQkYX<{FHcWTsIf>S5(tj`l18Y!fj`zIWi`b$$=|ZkC@tZHUaTSYJ7qf+Ru)E&m}ip%pvnL z#)nh$=o*GOpQ6zu7FP=qHwyP7^DDB&~ zZwaUa0|UfzzJLEdaJ_x|HgLUl>lTQ;a^=e9%a?&G%xRO!bmq(%SkX;QO|YM#v_C?H z%vMxX0N2veQbH_bHYX=%-@bi>TR;n$g%!Ph`*xrUfrYxliUzs_TG-Dpo};6qaU6%b zf?F8RKQ=ZfD2Uk4^XJb8s}hNX;0jg&>g0Ha(oS-P(!zM=a9}F^JX7ce=tq&I`bGjZ zjEW+3%1vC^(i+#WFw}y(U91*Gopm!AFfx@ESk$K*F)Jx$IdHg)r%!1tdpuKFr|*}U z&+?Po#RVIKbe2NAQ55-Gc$t|+avi#vm_N;y#Nl>n+B=vwi+)9FwKK}+du7n|WTYig rQM~j|e+tr)88p?fv9Xv&VtI0L3>mA0h$B*~o**)Xp`u`1E?W3E@!K3x literal 0 HcmV?d00001 diff --git a/assets/en/template/TEMPLATE_SIREN_Vboss_Lovers.gif b/assets/en/template/TEMPLATE_SIREN_Vboss_Lovers.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5b4079807d2192facdedd8045eeaacc3780e7d3 GIT binary patch literal 4002 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 literal 0 HcmV?d00001 diff --git a/assets/jp/template/TEMPLATE_SIREN_Vboss_Hermit.gif b/assets/jp/template/TEMPLATE_SIREN_Vboss_Hermit.gif new file mode 100644 index 0000000000000000000000000000000000000000..be67af5078900b743ec04d7a5d9271e5f73cb657 GIT binary patch literal 3821 zcmeI!c~4VW9LDj}(w1(P0;M2}Qb1a;U_qiq5ihi5(TbN%MIEdNh&pOPf~bh4tO7!j zH4&9|P;p|AL1Retk5&)~xFRm2#tlX>q5^JcQ08ZDLd-0$0M9G9=j49!eL}-Sr2gxf zh=U3dnwXgQ_U+r(uV2T<$H&ITK7Rc8;lqdb@87?B_il7_ba;69&6_u`U%wt28hZKi z<@4vy`}_MJK79D#!GpVZ@AmfgUb=Ltqod=(g$w7;pKohxYi(_9Zf-tx>XgA?(ChU_ zj~+d8a@jv9Yl+F)>k5QIV06 z5fKqer7}D`TqctR2M1#q78n?~Xwjm8fB=7gf2maJ=jS(P&Kz%VZ?RbH;o;%#?(XX9 zDi8=}%$VWi&lI`sc+;NTGK(^)!cDwoX8oHPqCqp_eP?&32?jfZuX}NN19s{Lw zNA;Zt_<>?aXRg4k%*H3X4Ixub4sy^A;iF_MmqzD`T2x6)HllJm6fLTP8vD%YqM|(* z+13(~$^ZV~LQoB!zkK-uq(6Q71ga-VkBp3fYViE()vLk5K_LC?*|SHF9)apRckW!j ze*NmztKHq*U0q!O8%Uo!cMepaK7IPci4(_<9|zS94Go76AFi*j2iSz_%F4=v2M?B) zmzR~5m6Vk1-@hM_6T-oEc6Rpe-Me?~+O>1%&Wwx(;GXwrttFd2>oi%EpZw zlarG-Y}k;HkO11_3qycaKCOxT_~cdoCmF991!ySTUj z>6tTU5~`<9pAM>RZEXQIkH@pJvLay9XtXKtS5NgT(hnns^O!&$T)_RMPC`<-Fl*iB zqpHCKDpoFzZN7n#5t)qwny?D1S=}r&4Gm$fW(Af)U$lyg%Pvtp1WG@WHbGIrcUBG! zOJqG&(-uT!+5K@WpYA>j$y-c@cAc}RMyE!YnK@gyVyw-i0PXg=l^p%S!1C4;>8Oh$d4aCzIX2) z=PgX$)FeL9y)Xg^w!qaLYX1UKo{IXoO5$? zv$C=Xu9=ycz!f4qNtEdD+O=!ftXTs!UbSi!K@S<;ROp8K!@ke zn+F{Rv_3vQkYX<{FHcWTsIf>S5(tj`l18Y!fj`zIWi`b$$=|ZkC@tZHUaTSYJ7qf+Ru)E&m}ip%pvnL z#)nh$=o*GOpQ6zu7FP=qHwyP7^DDB&~ zZwaUa0|UfzzJLEdaJ_x|HgLUl>lTQ;a^=e9%a?&G%xRO!bmq(%SkX;QO|YM#v_C?H z%vMxX0N2veQbH_bHYX=%-@bi>TR;n$g%!Ph`*xrUfrYxliUzs_TG-Dpo};6qaU6%b zf?F8RKQ=ZfD2Uk4^XJb8s}hNX;0jg&>g0Ha(oS-P(!zM=a9}F^JX7ce=tq&I`bGjZ zjEW+3%1vC^(i+#WFw}y(U91*Gopm!AFfx@ESk$K*F)Jx$IdHg)r%!1tdpuKFr|*}U z&+?Po#RVIKbe2NAQ55-Gc$t|+avi#vm_N;y#Nl>n+B=vwi+)9FwKK}+du7n|WTYig rQM~j|e+tr)88p?fv9Xv&VtI0L3>mA0h$B*~o**)Xp`u`1E?W3E@!K3x literal 0 HcmV?d00001 diff --git a/assets/jp/template/TEMPLATE_SIREN_Vboss_Lovers.gif b/assets/jp/template/TEMPLATE_SIREN_Vboss_Lovers.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5b4079807d2192facdedd8045eeaacc3780e7d3 GIT binary patch literal 4002 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 literal 0 HcmV?d00001 diff --git a/assets/tw/template/TEMPLATE_SIREN_Vboss_Hermit.gif b/assets/tw/template/TEMPLATE_SIREN_Vboss_Hermit.gif new file mode 100644 index 0000000000000000000000000000000000000000..be67af5078900b743ec04d7a5d9271e5f73cb657 GIT binary patch literal 3821 zcmeI!c~4VW9LDj}(w1(P0;M2}Qb1a;U_qiq5ihi5(TbN%MIEdNh&pOPf~bh4tO7!j zH4&9|P;p|AL1Retk5&)~xFRm2#tlX>q5^JcQ08ZDLd-0$0M9G9=j49!eL}-Sr2gxf zh=U3dnwXgQ_U+r(uV2T<$H&ITK7Rc8;lqdb@87?B_il7_ba;69&6_u`U%wt28hZKi z<@4vy`}_MJK79D#!GpVZ@AmfgUb=Ltqod=(g$w7;pKohxYi(_9Zf-tx>XgA?(ChU_ zj~+d8a@jv9Yl+F)>k5QIV06 z5fKqer7}D`TqctR2M1#q78n?~Xwjm8fB=7gf2maJ=jS(P&Kz%VZ?RbH;o;%#?(XX9 zDi8=}%$VWi&lI`sc+;NTGK(^)!cDwoX8oHPqCqp_eP?&32?jfZuX}NN19s{Lw zNA;Zt_<>?aXRg4k%*H3X4Ixub4sy^A;iF_MmqzD`T2x6)HllJm6fLTP8vD%YqM|(* z+13(~$^ZV~LQoB!zkK-uq(6Q71ga-VkBp3fYViE()vLk5K_LC?*|SHF9)apRckW!j ze*NmztKHq*U0q!O8%Uo!cMepaK7IPci4(_<9|zS94Go76AFi*j2iSz_%F4=v2M?B) zmzR~5m6Vk1-@hM_6T-oEc6Rpe-Me?~+O>1%&Wwx(;GXwrttFd2>oi%EpZw zlarG-Y}k;HkO11_3qycaKCOxT_~cdoCmF991!ySTUj z>6tTU5~`<9pAM>RZEXQIkH@pJvLay9XtXKtS5NgT(hnns^O!&$T)_RMPC`<-Fl*iB zqpHCKDpoFzZN7n#5t)qwny?D1S=}r&4Gm$fW(Af)U$lyg%Pvtp1WG@WHbGIrcUBG! zOJqG&(-uT!+5K@WpYA>j$y-c@cAc}RMyE!YnK@gyVyw-i0PXg=l^p%S!1C4;>8Oh$d4aCzIX2) z=PgX$)FeL9y)Xg^w!qaLYX1UKo{IXoO5$? zv$C=Xu9=ycz!f4qNtEdD+O=!ftXTs!UbSi!K@S<;ROp8K!@ke zn+F{Rv_3vQkYX<{FHcWTsIf>S5(tj`l18Y!fj`zIWi`b$$=|ZkC@tZHUaTSYJ7qf+Ru)E&m}ip%pvnL z#)nh$=o*GOpQ6zu7FP=qHwyP7^DDB&~ zZwaUa0|UfzzJLEdaJ_x|HgLUl>lTQ;a^=e9%a?&G%xRO!bmq(%SkX;QO|YM#v_C?H z%vMxX0N2veQbH_bHYX=%-@bi>TR;n$g%!Ph`*xrUfrYxliUzs_TG-Dpo};6qaU6%b zf?F8RKQ=ZfD2Uk4^XJb8s}hNX;0jg&>g0Ha(oS-P(!zM=a9}F^JX7ce=tq&I`bGjZ zjEW+3%1vC^(i+#WFw}y(U91*Gopm!AFfx@ESk$K*F)Jx$IdHg)r%!1tdpuKFr|*}U z&+?Po#RVIKbe2NAQ55-Gc$t|+avi#vm_N;y#Nl>n+B=vwi+)9FwKK}+du7n|WTYig rQM~j|e+tr)88p?fv9Xv&VtI0L3>mA0h$B*~o**)Xp`u`1E?W3E@!K3x literal 0 HcmV?d00001 diff --git a/assets/tw/template/TEMPLATE_SIREN_Vboss_Lovers.gif b/assets/tw/template/TEMPLATE_SIREN_Vboss_Lovers.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5b4079807d2192facdedd8045eeaacc3780e7d3 GIT binary patch literal 4002 zcmeI!`A<{n9>?+1LbZTsDYBHcEv4*RK`2s{LP7Q^n<65#?4uX~72%2sMGJ+h6xpo` z6_8O>zzq?#lue*2ATbUxMiv#+mVGc>aRtoSfJ5{%j5OXL|D2 zAnTA~1X*5QUR+%K@ZrPz_wN@L7Ut*Y-@JJhJIG>+4e}6urH@a=HB8y?fo=-FNTa?ds~fefxGtM@M^m`_-#g+uGW$T)EQP z+Is2IrIwbKix)4RKYzZyzP_%muBxi)%$YM1iKM)|{PgM5r%s(ZdGe%KEEb7GB_$=r z#l=NMMFN4~=+UD`jvUF)&p&+laBgmHPEO8&0|)l+-@kY7-aUKv?B2aQH8qvb=O-j2 z#K*_)+O;b#E^g<}o!ho;i;9YhjEv-RxnW^pAt52b!NEa6K>+~){{H@cetteaK5RDI z+uM8d=FOWnZDO%lUS3`sH*RDynI0YnncHFsgxffVC$|9yKOSv z*&JMNpq<-ZH{&q1|qHp*H=nx30!Jf?&bVq}@tK3_m=I#I0V-Ypfeg`)(LXL>#tlNu^DOKFMA z>S)|rLQ0%zkB!Y?c2Arv$HcZGk||;YHDn3?CH~| zN~IFy4-E|s4h{l-RQ`hp4|;lfQ1-WO-MV@6=8YRSIy*bTKj6Q7`7+>dZf*wojg5_f zUn-TJJ$n|t0%~h(D=RDE76A68rKP}LC={x|=jG)cI&=uYXJut&W@hf&w-3w%`1JJj zw6ru}pOTUS@_{{okByDpv113YkB*K8`CuNv2L=YB;5i%)fCud>sjqa-U@(554#;h6 zY^<%Vfx4xo0?4TjT(w5iIF7HLK zVQp@`RDU7PK${wX&rH-bux91Y{e|=fRASfGH^>)@goL$ZVQV--3nJKtmgiDrGaB{k z0W!A^qUA`9E-@o+JpAur5sg(*&Lz)0(zc9}#Vk;GLuLAQol$>K2Q({5tE;=_d5M}N zm-rr5Ub(l%IxSs+^iOPySl^1&O&I@c+D}4H$dU4ivJ?&Cs#xBVB2igsXvJ&dIrBw^ zF28rO8Y5;EVr}Z><2HT0A+`1v>X~@_zx)37?c37Q(&x{gKYjWHeV?A5e);kx_b@l8!lp#0pq za{wKD*VNQhS68ER@zSHV~PZbZMR8YBB!LB zKvm@b-Y&z7?1D=(_~Ei*J+;8j7)fGt2~o`~yFj8NEY-1zN`2j0*sEUe6x-@8nebH* zoY%UwY80Iqsj_D26P6f_el^bVJ(=MQM4@eAVpeODI_!LVrd__P~J9+#p@5p+?7&sNOO7F9gEB1ONK<>z6NI zV8(-Ps5bzI=?=7Ey-!R`pc#MiKP^(14bccpRz^`Aw4z8izu-l>DGMNnO z-O$i*;lc&9;Sg|@Zdmf@jE4;mB`+&01Lgp{u&}V8py1fCW2ylUNr#w2!_j~zB_;8A zJaoFlZdXa)zI{8o-owMg0XwXB)oxdne9M+CE2sPa^$r7GwcgRN|8u~jRfi3ah8+g{ zFE&5X7r;LT;OXVQVqyg)F%p$sD&8XY-!4HW>bPHFlJ+2 zFQ{|EIvsO)u1$kLdCGqKwc~;88Ldhj4}f>3l&sURmUB89TQrGQ+Y*(`3O2{s!M`i+ z&j^~2t_P0UBT7sS(l=8lO63tUpR=xM%5swLadwrd0lkYI>3_1`A&{P-! Date: Sat, 20 Dec 2025 19:20:47 +0800 Subject: [PATCH 2/4] Upd: [JP] TEMPLATE_COMBAT_LOADING (#5393) --- assets/jp/template/TEMPLATE_COMBAT_LOADING.png | Bin 746 -> 781 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/jp/template/TEMPLATE_COMBAT_LOADING.png b/assets/jp/template/TEMPLATE_COMBAT_LOADING.png index 9086656f04cf95773ab7511a0bbc9f3d62cbf568..2bf0123f5bd05ceebbd81243e1a5e5c419a24549 100644 GIT binary patch literal 781 zcmV+o1M>WdP) zj12FkNv5Xdm}q&|j?Vp@Gw0GCr4|eJ-s{`n$G7&{aIpLSeC%h(wRQl&{z3fJ`!5e3 z_oUJpr^^MWqfZ;_LV#-TMkeb*mCmx7nYnLO6#H>LgWbsF~%Hc;Ve90XOIt=+27L?#csFf zucG53$S)9p;_8~LBn8UL6-8zhEvFvoA;6M{FfJwBSa-V}h9M&;BQuNQf23oDfX}nwB%94rN;yiAw7sJ$3d1-`STi1{gH=nWn;a?B@hu`I5wZ|+Mf)@rZn47TzX z!aDGIiu`^*d(yqbL@K9)j0`YQlL^uk@|ys@{xt1&6snq9A8y=PT$U*9ADJYK{yDZ< zS?2K-yD&m;mRB%FcOLbmRf9}?UpaZARJ6Nx4&oVE=^q?<*7ueXyk0LcRnuyBsKgxm z5$hYBmh#R(Lqo%*3$0{vait+#^I==BI(H>GIwuHRXJ==F!rJ zk9CcO5Ms;cVkpR>&TUOm$k*@n zw6~^dB1Ds<12?Kwxz?%>1fjzO;eXgANgJ6gNv@BLv`#6?G+Lw-G5}dLK%yIF^BcFX zT_Tzp+Ta+SM>?hNSCNQD!auin2^NV&y1h_)a`k`X}PMj zD?Cnz1wb$qE*6XVd|uP)=;q+b_ix??9Td;ibyaSvRRL*JcV}vqN~QFdE|+D}6kK*YCt_xW6fLeYV#&E@n$zF=`^^cJ8Q44D1CdwPQ7<5w0| z)&&-ykpiHuca_t^YL`lq Date: Sat, 20 Dec 2025 19:29:51 +0800 Subject: [PATCH 3/4] Add: Chapter CD --- campaign/event_20251218_cn/c1.py | 96 +++++++++++++++++++++++++++++++ campaign/event_20251218_cn/c2.py | 75 ++++++++++++++++++++++++ campaign/event_20251218_cn/c3.py | 82 +++++++++++++++++++++++++++ campaign/event_20251218_cn/d1.py | 97 ++++++++++++++++++++++++++++++++ campaign/event_20251218_cn/d2.py | 85 ++++++++++++++++++++++++++++ campaign/event_20251218_cn/d3.py | 91 ++++++++++++++++++++++++++++++ 6 files changed, 526 insertions(+) create mode 100644 campaign/event_20251218_cn/c1.py create mode 100644 campaign/event_20251218_cn/c2.py create mode 100644 campaign/event_20251218_cn/c3.py create mode 100644 campaign/event_20251218_cn/d1.py create mode 100644 campaign/event_20251218_cn/d2.py create mode 100644 campaign/event_20251218_cn/d3.py diff --git a/campaign/event_20251218_cn/c1.py b/campaign/event_20251218_cn/c1.py new file mode 100644 index 000000000..fd594847a --- /dev/null +++ b/campaign/event_20251218_cn/c1.py @@ -0,0 +1,96 @@ +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('C1') +MAP.shape = 'J8' +MAP.camera_data = ['D3', 'D6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['G2'] +MAP.map_data = """ + ++ -- -- -- -- -- ++ -- SP -- + ++ ME ++ ++ ++ Me -- -- -- SP + -- -- -- -- Me -- -- MS -- -- + ME -- ME -- -- -- __ -- ++ ++ + ++ -- ++ ++ -- MS -- -- ++ ++ + -- -- -- ++ ME -- ++ Me -- -- + -- MB -- -- -- -- -- -- -- -- + -- -- -- ++ 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 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': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Star'] + 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 = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + STAGE_INCREASE_AB = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.232, 1.255) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.191, 1.213) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.156, 1.177) + + +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_20251218_cn/c2.py b/campaign/event_20251218_cn/c2.py new file mode 100644 index 000000000..87e2ebf10 --- /dev/null +++ b/campaign/event_20251218_cn/c2.py @@ -0,0 +1,75 @@ +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 .c1 import Config as ConfigBase + +MAP = CampaignMap('C2') +MAP.shape = 'J8' +MAP.camera_data = ['E3', 'E6', 'F3', 'F6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + -- -- -- -- -- ++ ME ++ -- -- + -- -- MB -- -- ME -- ME -- -- + ++ ++ -- ++ ++ -- -- -- ME -- + ++ -- __ -- ++ Me -- ++ ++ ++ + -- MS -- MS -- -- -- Me -- -- + -- -- MS -- -- Me -- -- ME -- + ++ -- -- -- -- ++ -- ME ++ ++ + ++ SP -- SP -- 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 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': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Star'] + 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 ===== + + +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_20251218_cn/c3.py b/campaign/event_20251218_cn/c3.py new file mode 100644 index 000000000..99f63596e --- /dev/null +++ b/campaign/event_20251218_cn/c3.py @@ -0,0 +1,82 @@ +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 .c1 import Config as ConfigBase + +MAP = CampaignMap('C3') +MAP.shape = 'K10' +MAP.camera_data = ['F3', 'F6'] +MAP.camera_data_spawn_point = ['F6'] +MAP.map_data = """ + -- ++ ++ ++ -- -- -- ++ ++ ++ -- + -- ++ -- Me -- MB -- Me -- ++ -- + -- -- ME -- Me -- Me -- ME -- -- + -- -- ++ MS -- __ -- MS ++ -- -- + -- -- ++ -- -- MS -- -- ++ -- -- + ++ ++ ME -- -- -- -- -- ME ++ ++ + ++ ++ -- -- SP -- SP -- -- ++ ++ + -- -- 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 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 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': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, J10, K10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Star'] + 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 ===== + + +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_20251218_cn/d1.py b/campaign/event_20251218_cn/d1.py new file mode 100644 index 000000000..cf99034b0 --- /dev/null +++ b/campaign/event_20251218_cn/d1.py @@ -0,0 +1,97 @@ +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('D1') +MAP.shape = 'J8' +MAP.camera_data = ['D3', 'D6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['G2'] +MAP.map_data = """ + ++ -- -- -- -- -- ++ -- SP -- + ++ ME ++ ++ ++ Me -- -- -- SP + -- -- -- -- Me -- -- MS -- -- + ME -- ME -- -- -- __ -- ++ ++ + ++ -- ++ ++ -- MS -- -- ++ ++ + -- -- -- ++ ME -- ++ Me -- -- + -- MB -- -- -- -- -- -- -- -- + -- -- -- ++ 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 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 9, 'siren': 2}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Hermit', 'Vboss_Lovers'] + 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 = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + STAGE_INCREASE_AB = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.217, 1.240) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.177, 1.199) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.143, 1.163) + + +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_20251218_cn/d2.py b/campaign/event_20251218_cn/d2.py new file mode 100644 index 000000000..ddf96d6e7 --- /dev/null +++ b/campaign/event_20251218_cn/d2.py @@ -0,0 +1,85 @@ +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 .d1 import Config as ConfigBase + +MAP = CampaignMap('D2') +MAP.shape = 'J8' +MAP.camera_data = ['E3', 'E6', 'F3', 'F6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + -- -- -- -- -- ++ ME ++ -- -- + -- -- MB -- -- ME -- ME -- -- + ++ ++ -- ++ ++ -- -- -- ME -- + ++ -- __ -- ++ Me -- ++ ++ ++ + -- MS -- MS -- -- -- Me -- -- + -- -- MS -- -- Me -- -- ME -- + ++ -- -- -- -- ++ -- ME ++ ++ + ++ SP -- SP -- 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 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 9, 'siren': 3}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Hermit', 'Vboss_Chariot'] + 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 ===== + + +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_20251218_cn/d3.py b/campaign/event_20251218_cn/d3.py new file mode 100644 index 000000000..107d0066e --- /dev/null +++ b/campaign/event_20251218_cn/d3.py @@ -0,0 +1,91 @@ +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 .d1 import Config as ConfigBase + +MAP = CampaignMap('D3') +MAP.shape = 'K10' +MAP.camera_data = ['F3', 'F6'] +MAP.camera_data_spawn_point = ['F6'] +MAP.map_data = """ + -- ++ ++ ++ -- -- -- ++ ++ ++ -- + -- ++ -- Me -- MB -- Me -- ++ -- + -- -- ME -- Me -- Me -- ME -- -- + -- -- ++ MS -- __ -- MS ++ -- -- + -- -- ++ -- -- MS -- -- ++ -- -- + ++ ++ ME -- -- -- -- -- ME ++ ++ + ++ ++ -- -- SP -- SP -- -- ++ ++ + -- -- 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 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 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': 9, 'siren': 3}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, J10, K10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Lovers', 'Vboss_Chariot'] + 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 ===== + + +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() From bcfe9b260e2cf98220492a89280a139cb744d8fe Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sat, 20 Dec 2025 21:24:30 +0800 Subject: [PATCH 4/4] Add: Chapter SP --- campaign/event_20251218_cn/sp.py | 111 +++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 campaign/event_20251218_cn/sp.py diff --git a/campaign/event_20251218_cn/sp.py b/campaign/event_20251218_cn/sp.py new file mode 100644 index 000000000..f74e5236f --- /dev/null +++ b/campaign/event_20251218_cn/sp.py @@ -0,0 +1,111 @@ +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 = 'I8' +MAP.camera_data = ['D3', 'D6', 'F3', 'F6'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ++ ++ ++ -- -- -- -- SP -- + -- ME -- -- -- MS -- -- SP + -- -- ME ++ -- -- MS -- -- + ME -- -- -- ME __ -- MS -- + -- ME -- ME ++ -- ++ ++ ME + ++ -- -- -- -- -- ++ ++ -- + -- MB -- ++ 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 + 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, 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: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Hermit', 'Vboss_Lovers', 'Vboss_Chariot'] + 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 + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + STAGE_ENTRANCE = ['half', '20240725'] + STAGE_INCREASE_AB = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.180, 1.202) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.141, 1.162) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.108, 1.128) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_IS_ONE_TIME_STAGE = True + + +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()