From 04d9a758fc5b6fd9e8bc09e3b982c864ebe9ef57 Mon Sep 17 00:00:00 2001 From: iceynano <34570144+iceynano@users.noreply.github.com> Date: Fri, 19 Dec 2025 10:17:21 +0800 Subject: [PATCH] event_20251218_cn --- .../template/TEMPLATE_SIREN_Vboss_Chariot.gif | Bin 0 -> 2153 bytes .../template/TEMPLATE_SIREN_Vboss_Hermit.gif | Bin 0 -> 3250 bytes .../template/TEMPLATE_SIREN_Vboss_Lovers.gif | Bin 0 -> 7144 bytes .../template/TEMPLATE_SIREN_Vboss_Chariot.gif | Bin 0 -> 2153 bytes .../template/TEMPLATE_SIREN_Vboss_Hermit.gif | Bin 0 -> 3250 bytes .../template/TEMPLATE_SIREN_Vboss_Lovers.gif | Bin 0 -> 7144 bytes .../template/TEMPLATE_SIREN_Vboss_Chariot.gif | Bin 0 -> 2153 bytes .../template/TEMPLATE_SIREN_Vboss_Hermit.gif | Bin 0 -> 3250 bytes .../template/TEMPLATE_SIREN_Vboss_Lovers.gif | Bin 0 -> 7144 bytes .../template/TEMPLATE_SIREN_Vboss_Chariot.gif | Bin 0 -> 2153 bytes .../template/TEMPLATE_SIREN_Vboss_Hermit.gif | Bin 0 -> 3250 bytes .../template/TEMPLATE_SIREN_Vboss_Lovers.gif | Bin 0 -> 7144 bytes campaign/event_20251218_cn/b1.py | 96 +++++++++++++++++ campaign/event_20251218_cn/b2.py | 76 ++++++++++++++ campaign/event_20251218_cn/b3.py | 82 +++++++++++++++ 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 ++++++++++++++++ module/template/assets.py | 3 + 22 files changed, 783 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 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/assets/cn/template/TEMPLATE_SIREN_Vboss_Chariot.gif b/assets/cn/template/TEMPLATE_SIREN_Vboss_Chariot.gif new file mode 100644 index 0000000000000000000000000000000000000000..0a414523e22b88ec9ff90862307d4b19a1eea124 GIT binary patch literal 2153 zcmeIy*-v5z7zOZq;j)Op0E&Z%&b^k-IK&W!ng*>8;5OQ{m6?)i`_Q1V%7YKqnx<_U zm8I3BI-_Qqsk>rbYK#lf#Ka|+Ma3;@T*npnU2$I{y~dZOeeC1R_aB^-@BE%dgh~8k z?g1n_4W1D)z#(Y<;BIt`T6B-5-@$vD|(b3`I;laUy-EQCC z-{0HY+uhyW+1c6N-rm~U+T7gS*w|QKUte2WTU}jUUS3{WT3TFOwApO)^Ye3abF;Iv zGcz;O)6CMG5(BqYSg$H&ITMny$MMn(n&1qB8Mip64~P$&=x5Crk`^yG56 z91e%gW-}NJI-O3XQh|5()--@PoIeXyd>$;5hl+(FJm_!$$OS}3umXH{CNw5+B8~Z&L&-ITOqgtvV1LszQC4@ww@c43osdd7!UnM?f zm9J?DG>BVf1JM^gVPQ!%48({dJHy^m817|1^!1fXZBmPw;0%oA=(~EID0r??nv?R) z7d(YwxUn%sX>sE6fW{}G5kxNNCXxWDu<5iuyJ9i&P=iT(>Vy+p(k-zhutK3-41f6YiXcWEeY zoVXfW8Ax`b{knn5mRBgQF2boDkul>1Px5s%RaI_MlV~om3S}_$+S=MMKQKHD z2E&~n_4V}_A=TB@RaI4$m6ez!7$le?7$J9lcG{A+uUSK!G{~F|J)`9StY9gQNEd#W zNoIlR4+1D6&TbBXBc8p6@kgoS#7U(Ucw(JV5=Q8svsAxkDReWqH(A`Ki8lj tUQ6)iivW!|Ec?Do^q)!?3knIv$E@LR&E3vakzC?)0GbG-N7(;=^f!6-Gd}r;N z3zVV+ic`5rwA>UBv0kD~6VpOPKvZrDcrB=ickl|{*lU{j!(6gowqKm@fABoX^Lf89 z^P_`9Qk)<*lmkJNlan7le0cx<{kwPX-oAbN=FOXliHY&?@z<|kzk2oR<;#~ZUc7kz z{Q0wI&&I~aMn^}VK7IP+$&<&AA3u8Z=;6bM4<0GoIZW})TvXAjg2Qyo;-2l#PQ?Dj~zR9MI1N=$mLWw*vGMtbE1&Ao{!`XJr7`C! zx%?EE=D@U9C`g4mlZyH%GYmMNLc;{|43mNEs+`ISR++3Yqk@|6zM$MoO{s9>q|OqN zWFN!rdztYMlSN05+Y?YM8Z>8eru*S!rvj#93;d;o3gR!Zi*_Pvut9XYqa%y!NmOV^ zn8GGo$8MivvF%-%BhKq_i1MR;#LBPArchCGq!s&(%yC3lJ*o*`kwy0kQz>!1fmPxS zLr^Q>70L3KDAT3bs*WPQe*jg7d*!-`7OvA3Csc3e3ZoY)r$Xz|ZJckz(qBlsv*I{2 zW%RFPTJesfha94EoaZ3wOA}R zT1+O>=b{`wd>Ei|=+GgXD?pUW%1WChWo2chrKKe$CB?6OH8oYCPykMnlau4);{hb|=g*f&Bw=A;VzD?VCMUPlQJiG}kb3 zsu8N|MO>n@q@6v~Y+Cd;JmDy*p|LsBCfinTV@Y#gAl8n@7~o!gwtRjIfASb>ulG7bh(E3EXTVVKl%)0n^tKz zW!6vo1Cc@RH}9B)`1LJvt|vT!xke-r4kqdVk9v!5yS{V5V5hbQmGU$0!kz#BxLsN z*&>n1$H#}q zRZ_x=YcPyG#}MBHXQK321uLx_(V|Qb55j~GLsTb`ED1`1DO9f@agvC{)kt(8Po+4D z=;$mKCfY2gXsIm2Qtmc|S`ACQ=Mc^sa~sNCjQ?ud*_1`6+aEXbhu|1{FOIkv>&Deo zJESalsVSVk?S~{efhWOQh(hHt3MuCt`QGetPh)cggi!4D26L9Qz|Ey9z&sdkipQq1 zA!GRpX|5BV)lZZ{7q|i+1{6$0(d=i=+oDRvw6c=fu>scWxFnC`Fa8;?ZIZ}Jg`#w> h`^1nXZYM8JGbiO}^>#O5VuQd854Zg84nE1yKLMPInr;99 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..6f815e5165f29668590436d070b7cd9b6a320c85 GIT binary patch literal 7144 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 LogKlqap}JR3=+VA literal 0 HcmV?d00001 diff --git a/assets/en/template/TEMPLATE_SIREN_Vboss_Chariot.gif b/assets/en/template/TEMPLATE_SIREN_Vboss_Chariot.gif new file mode 100644 index 0000000000000000000000000000000000000000..0a414523e22b88ec9ff90862307d4b19a1eea124 GIT binary patch literal 2153 zcmeIy*-v5z7zOZq;j)Op0E&Z%&b^k-IK&W!ng*>8;5OQ{m6?)i`_Q1V%7YKqnx<_U zm8I3BI-_Qqsk>rbYK#lf#Ka|+Ma3;@T*npnU2$I{y~dZOeeC1R_aB^-@BE%dgh~8k z?g1n_4W1D)z#(Y<;BIt`T6B-5-@$vD|(b3`I;laUy-EQCC z-{0HY+uhyW+1c6N-rm~U+T7gS*w|QKUte2WTU}jUUS3{WT3TFOwApO)^Ye3abF;Iv zGcz;O)6CMG5(BqYSg$H&ITMny$MMn(n&1qB8Mip64~P$&=x5Crk`^yG56 z91e%gW-}NJI-O3XQh|5()--@PoIeXyd>$;5hl+(FJm_!$$OS}3umXH{CNw5+B8~Z&L&-ITOqgtvV1LszQC4@ww@c43osdd7!UnM?f zm9J?DG>BVf1JM^gVPQ!%48({dJHy^m817|1^!1fXZBmPw;0%oA=(~EID0r??nv?R) z7d(YwxUn%sX>sE6fW{}G5kxNNCXxWDu<5iuyJ9i&P=iT(>Vy+p(k-zhutK3-41f6YiXcWEeY zoVXfW8Ax`b{knn5mRBgQF2boDkul>1Px5s%RaI_MlV~om3S}_$+S=MMKQKHD z2E&~n_4V}_A=TB@RaI4$m6ez!7$le?7$J9lcG{A+uUSK!G{~F|J)`9StY9gQNEd#W zNoIlR4+1D6&TbBXBc8p6@kgoS#7U(Ucw(JV5=Q8svsAxkDReWqH(A`Ki8lj tUQ6)iivW!|Ec?Do^q)!?3knIv$E@LR&E3vakzC?)0GbG-N7(;=^f!6-Gd}r;N z3zVV+ic`5rwA>UBv0kD~6VpOPKvZrDcrB=ickl|{*lU{j!(6gowqKm@fABoX^Lf89 z^P_`9Qk)<*lmkJNlan7le0cx<{kwPX-oAbN=FOXliHY&?@z<|kzk2oR<;#~ZUc7kz z{Q0wI&&I~aMn^}VK7IP+$&<&AA3u8Z=;6bM4<0GoIZW})TvXAjg2Qyo;-2l#PQ?Dj~zR9MI1N=$mLWw*vGMtbE1&Ao{!`XJr7`C! zx%?EE=D@U9C`g4mlZyH%GYmMNLc;{|43mNEs+`ISR++3Yqk@|6zM$MoO{s9>q|OqN zWFN!rdztYMlSN05+Y?YM8Z>8eru*S!rvj#93;d;o3gR!Zi*_Pvut9XYqa%y!NmOV^ zn8GGo$8MivvF%-%BhKq_i1MR;#LBPArchCGq!s&(%yC3lJ*o*`kwy0kQz>!1fmPxS zLr^Q>70L3KDAT3bs*WPQe*jg7d*!-`7OvA3Csc3e3ZoY)r$Xz|ZJckz(qBlsv*I{2 zW%RFPTJesfha94EoaZ3wOA}R zT1+O>=b{`wd>Ei|=+GgXD?pUW%1WChWo2chrKKe$CB?6OH8oYCPykMnlau4);{hb|=g*f&Bw=A;VzD?VCMUPlQJiG}kb3 zsu8N|MO>n@q@6v~Y+Cd;JmDy*p|LsBCfinTV@Y#gAl8n@7~o!gwtRjIfASb>ulG7bh(E3EXTVVKl%)0n^tKz zW!6vo1Cc@RH}9B)`1LJvt|vT!xke-r4kqdVk9v!5yS{V5V5hbQmGU$0!kz#BxLsN z*&>n1$H#}q zRZ_x=YcPyG#}MBHXQK321uLx_(V|Qb55j~GLsTb`ED1`1DO9f@agvC{)kt(8Po+4D z=;$mKCfY2gXsIm2Qtmc|S`ACQ=Mc^sa~sNCjQ?ud*_1`6+aEXbhu|1{FOIkv>&Deo zJESalsVSVk?S~{efhWOQh(hHt3MuCt`QGetPh)cggi!4D26L9Qz|Ey9z&sdkipQq1 zA!GRpX|5BV)lZZ{7q|i+1{6$0(d=i=+oDRvw6c=fu>scWxFnC`Fa8;?ZIZ}Jg`#w> h`^1nXZYM8JGbiO}^>#O5VuQd854Zg84nE1yKLMPInr;99 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..6f815e5165f29668590436d070b7cd9b6a320c85 GIT binary patch literal 7144 zcmeI$eN@u--^X$81w{qKL_-rn#WF*(QnN&E47>}?$~G(SGA&nXwV87Tii${vXobrP z)XJLM%+*${ZK7ykH&d(4nrmw1tlg=#&01T(&+mNC`5un`>iS*Rzg_&vkv~+vkMn%J zS4bj*LsFd(6ht`!@#4jczyJRG`Sa(0{q@(gXV0EKeL6KY^~WE7JbCiux8HvI<(FR` zJ$m%;;lr`9u^)f@addR_{{8zSBO^cj@Wb7^cLxUt@7%dFFfj1VH{aa6dGp4N8~y$L zy}iBHu3fu&^=eN~kHum!o6VOmU+(DWXm4-->Z`B5{PN2$zWCzOrArqtUc7MO!uj*( zKmGL6bLY;TJ$v?(Pd;gDYddr1OlxcF#~*+E(MKPB_~C~wEiE5>@WJWRr%#XMTQuUS3{qZtnK&+qZ4omXnjSb?eqGTef6nWo2e& zrl+T;rKP2&rf%H0F*!N;%{SkC@*>tgJo;sx~;STXAMm)P-_;t14!A zk|m+qIXam2PNPb4XqGDLc0Wr+Vu`-2??oVF^g!RXR`R`wZWYd_$$w%u&Zfq9b5YK4 z0?TYSdoIUB%S)9jC`nB_AM~Md7($rpe4rvyreYxIS7qrZOYsagiP((tbMO=vEYF>Y zXP_#4BNU{%GxB2Fu!=``RZwQM9o{LK=*l0uTuC7j3#v`*tEBLxZG+}v{uMiyxLK(v zbbAjiWM9L$1T7Rh288W-(u=%*qi)WjXV1w&Y!W*loTpI{T2qA;#I#YmVdv(R23`?8 zP?}I;uJ#PeoN7(X)_U>xa{5K2@??$Bb@gC-36b+$s_?B2%Qt%#Uc%ySwm0_)ZI4;Fs!1Y0%EMR zv~(I{d-v{zBzyPWcX#jJ4KRD>op)f*cI?2e!@G*%_z?JR=f`wzjrtH2NhE^K1Gx;OWnyGYf5EXDv#qO3ALdXG5UK z?wTSVcgG$M+HB4^#eHB=xU8Lp;YF~bXp6V@t8b5Z69`_r8ogaHOrn#3H>lQ?RaQ+u$E~; zliy?CB4k)d?k;$L+G(VMx1ZudB#vt(eXRLa4L5ax8P#j%q>bb}Ldl|!g&*u@bv$k~ z+b*3~g}IQYpdR*k-@&iYq$IOLc(`_Te5+izk6d?uY9L7I*bu1-5RDm5imMr+K{R9H zsd$#KG>MF#I~N2(ZqKLpA)Oj>(k$LbYxyN)gSnMYu+Qa`5Jh--mrsS5Lhv;R84{m)IdT&L ziF_$gAg^GTKv+REfv^HSH9R~FPy$H>_tZ>?zW(}a5LQ>NTme;O&C#^5vK9$ytN${r z{!5gs^9pV&*rl0mW$hAZD+s0c-g^%e7H|nf7EBY=S=KIr&ay@ch_re0W>8xYN}#zw zaHXWAz|92*7pN^rq{zrfkw^qw0wO`d1uO~)37N(b)Lhd3nwMXiObvwZ1vNV+3zwS9rH2qy~4b zE-Uk|@`e_jWcLY4{ZdvHiHu~~ zIk6VZ_s&!5=-ML2TNC%3w`Fa*oJJhb^ZfR)3b2}mrxO?P=?bb5UIDZ7C8Hw^O zt3aa9_J(wBCMj*^qNsUoDOc4otVYj8Zxz`XIk%Cb(&fUW(X})uBja8r05|@;Yg(ZwLRXX>8ZNz57@m0r!#r|y) z0+ZH&@`zIOp&Y{y@(yYvqNALprcbsz)QEGt2(xzP3LN=G(lVc;ISB-IIFV%XmbB<2 zk^`T}gbt$Ge1dmC;+Ar)47J9rZrQn$j8Au#sSuj~({|cbM5QJ7B zh$t`t$H&LP1cV|AREFHtv%~ZvgYW2TS_34fJGZNYyjgAG}79&YuBt< zlbDzYl~R0sJQ#v2SFVJT2`oZTO%jO&R1+`?j6zUNP%?p02pa{DLa3L(D70RLU=D&U z2)P6;LYO9a6w+ukD4)P6gmeN0HRAz&-QNH}eXa9jp15+rches!l01Q>6rVrXLKb8a zX#s0mcFN-o78~kHDq=w2b;UU_wY^9_(p6c(&TP*zT8CZYwhp7lYe_!q{6yO2QuGGyvPU&O z`^j$3W)iuiSm+R>JB=uybjPxM%L)gE`V^&_*-K?X4D1QCfmckj=bEyW#BdER%dA0) zjx6E^Jw(=u`wUT(#jX1+`HeWD>pY=-hf_A$BRuZ}r%+Q;L30bpD9Fke)H1~?c7g>v zhdpVWos(rm+6NEjqFfHMJIsul=Mys0fhIi~i%1&ka9o+UZ z+UdtrNg_4h;$6=gsURwgxLvq_WX}?!?|?=@N*gy?=%tFuQm0)x)k5cG7|cr(3c5}G z{`>Fn#i zlMk{CA`ISp@Yo9v4+nt-&RH;C)<-RnR?tNY+_K<97Kkd~mvvNu$p_uC+}zxNT+lfS zum!GIAgW&HLlzKf^?lbJrYJ_p%E^K3iFB15$!Qytqz_-VMRTTtBM_+QN=Ekbtabyc z>JW<+dI?|5RucmX##%xe%PK1!oS((Gb|AZ)!i!Qo{Sx>#uAJ41;DVIn*L8O5M_b7| zM!NC11f^!6z1UucEz;$Z?l4ki<)(<1CuwMMmPV3YC9I`+c(`arTJX?JQgB;}^XAET?u;d8Owv9}%*3 z^qPBYwkMga&9IPt-ss^?G}y*rc~#Vid`!j7LoBqJ)M_m5qO9IgrR45pCp4`%CdBN^ zzR_rLa0|`IxuZQ^bHcBXc##@QwhmpPKv==&b*QkQD-`euoS>kv0#yYc*+Er7n-8ukU=ws||Bp67 z;}3)td}jxTC}{A(RR!OoTwPtkogJ(_D5mV~?V+O-27D)8?-vm2L91U)CQ--9JE&%K z2*h%fOV{+rCnDHkE5c>=WOI=$>NK}?l`^%G33>~LaEx)qkPC0+2U+d7pIsF z9dSp4m(+%38`7g|*qhd1f`^bof?(&JmSI_g0z=<+y`W&C3#C{RJZj40HkxZ^&(mE( zAkhdEC1)EiJH1godj@txwiOGL}vqc9Jvnepq(3ikC*$~y^e^W)Bu`~9@^2(@kM#S~Vb2TSxe zPn;%p@>)^GYO|0+#9F@d2BiT_TIAVR?We@2Sr~hy8Ud50mW$jO&r>iYpCluJZHUP) zx5ZDjmpgNF5$%{zl2KuspdSGZRn*Yq5Uu8;9lV1%e1{+e12e0dSWIBmX(qeo)DCjG LogKlqap}JR3=+VA literal 0 HcmV?d00001 diff --git a/assets/jp/template/TEMPLATE_SIREN_Vboss_Chariot.gif b/assets/jp/template/TEMPLATE_SIREN_Vboss_Chariot.gif new file mode 100644 index 0000000000000000000000000000000000000000..0a414523e22b88ec9ff90862307d4b19a1eea124 GIT binary patch literal 2153 zcmeIy*-v5z7zOZq;j)Op0E&Z%&b^k-IK&W!ng*>8;5OQ{m6?)i`_Q1V%7YKqnx<_U zm8I3BI-_Qqsk>rbYK#lf#Ka|+Ma3;@T*npnU2$I{y~dZOeeC1R_aB^-@BE%dgh~8k z?g1n_4W1D)z#(Y<;BIt`T6B-5-@$vD|(b3`I;laUy-EQCC z-{0HY+uhyW+1c6N-rm~U+T7gS*w|QKUte2WTU}jUUS3{WT3TFOwApO)^Ye3abF;Iv zGcz;O)6CMG5(BqYSg$H&ITMny$MMn(n&1qB8Mip64~P$&=x5Crk`^yG56 z91e%gW-}NJI-O3XQh|5()--@PoIeXyd>$;5hl+(FJm_!$$OS}3umXH{CNw5+B8~Z&L&-ITOqgtvV1LszQC4@ww@c43osdd7!UnM?f zm9J?DG>BVf1JM^gVPQ!%48({dJHy^m817|1^!1fXZBmPw;0%oA=(~EID0r??nv?R) z7d(YwxUn%sX>sE6fW{}G5kxNNCXxWDu<5iuyJ9i&P=iT(>Vy+p(k-zhutK3-41f6YiXcWEeY zoVXfW8Ax`b{knn5mRBgQF2boDkul>1Px5s%RaI_MlV~om3S}_$+S=MMKQKHD z2E&~n_4V}_A=TB@RaI4$m6ez!7$le?7$J9lcG{A+uUSK!G{~F|J)`9StY9gQNEd#W zNoIlR4+1D6&TbBXBc8p6@kgoS#7U(Ucw(JV5=Q8svsAxkDReWqH(A`Ki8lj tUQ6)iivW!|Ec?Do^q)!?3knIv$E@LR&E3vakzC?)0GbG-N7(;=^f!6-Gd}r;N z3zVV+ic`5rwA>UBv0kD~6VpOPKvZrDcrB=ickl|{*lU{j!(6gowqKm@fABoX^Lf89 z^P_`9Qk)<*lmkJNlan7le0cx<{kwPX-oAbN=FOXliHY&?@z<|kzk2oR<;#~ZUc7kz z{Q0wI&&I~aMn^}VK7IP+$&<&AA3u8Z=;6bM4<0GoIZW})TvXAjg2Qyo;-2l#PQ?Dj~zR9MI1N=$mLWw*vGMtbE1&Ao{!`XJr7`C! zx%?EE=D@U9C`g4mlZyH%GYmMNLc;{|43mNEs+`ISR++3Yqk@|6zM$MoO{s9>q|OqN zWFN!rdztYMlSN05+Y?YM8Z>8eru*S!rvj#93;d;o3gR!Zi*_Pvut9XYqa%y!NmOV^ zn8GGo$8MivvF%-%BhKq_i1MR;#LBPArchCGq!s&(%yC3lJ*o*`kwy0kQz>!1fmPxS zLr^Q>70L3KDAT3bs*WPQe*jg7d*!-`7OvA3Csc3e3ZoY)r$Xz|ZJckz(qBlsv*I{2 zW%RFPTJesfha94EoaZ3wOA}R zT1+O>=b{`wd>Ei|=+GgXD?pUW%1WChWo2chrKKe$CB?6OH8oYCPykMnlau4);{hb|=g*f&Bw=A;VzD?VCMUPlQJiG}kb3 zsu8N|MO>n@q@6v~Y+Cd;JmDy*p|LsBCfinTV@Y#gAl8n@7~o!gwtRjIfASb>ulG7bh(E3EXTVVKl%)0n^tKz zW!6vo1Cc@RH}9B)`1LJvt|vT!xke-r4kqdVk9v!5yS{V5V5hbQmGU$0!kz#BxLsN z*&>n1$H#}q zRZ_x=YcPyG#}MBHXQK321uLx_(V|Qb55j~GLsTb`ED1`1DO9f@agvC{)kt(8Po+4D z=;$mKCfY2gXsIm2Qtmc|S`ACQ=Mc^sa~sNCjQ?ud*_1`6+aEXbhu|1{FOIkv>&Deo zJESalsVSVk?S~{efhWOQh(hHt3MuCt`QGetPh)cggi!4D26L9Qz|Ey9z&sdkipQq1 zA!GRpX|5BV)lZZ{7q|i+1{6$0(d=i=+oDRvw6c=fu>scWxFnC`Fa8;?ZIZ}Jg`#w> h`^1nXZYM8JGbiO}^>#O5VuQd854Zg84nE1yKLMPInr;99 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..6f815e5165f29668590436d070b7cd9b6a320c85 GIT binary patch literal 7144 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 LogKlqap}JR3=+VA literal 0 HcmV?d00001 diff --git a/assets/tw/template/TEMPLATE_SIREN_Vboss_Chariot.gif b/assets/tw/template/TEMPLATE_SIREN_Vboss_Chariot.gif new file mode 100644 index 0000000000000000000000000000000000000000..0a414523e22b88ec9ff90862307d4b19a1eea124 GIT binary patch literal 2153 zcmeIy*-v5z7zOZq;j)Op0E&Z%&b^k-IK&W!ng*>8;5OQ{m6?)i`_Q1V%7YKqnx<_U zm8I3BI-_Qqsk>rbYK#lf#Ka|+Ma3;@T*npnU2$I{y~dZOeeC1R_aB^-@BE%dgh~8k z?g1n_4W1D)z#(Y<;BIt`T6B-5-@$vD|(b3`I;laUy-EQCC z-{0HY+uhyW+1c6N-rm~U+T7gS*w|QKUte2WTU}jUUS3{WT3TFOwApO)^Ye3abF;Iv zGcz;O)6CMG5(BqYSg$H&ITMny$MMn(n&1qB8Mip64~P$&=x5Crk`^yG56 z91e%gW-}NJI-O3XQh|5()--@PoIeXyd>$;5hl+(FJm_!$$OS}3umXH{CNw5+B8~Z&L&-ITOqgtvV1LszQC4@ww@c43osdd7!UnM?f zm9J?DG>BVf1JM^gVPQ!%48({dJHy^m817|1^!1fXZBmPw;0%oA=(~EID0r??nv?R) z7d(YwxUn%sX>sE6fW{}G5kxNNCXxWDu<5iuyJ9i&P=iT(>Vy+p(k-zhutK3-41f6YiXcWEeY zoVXfW8Ax`b{knn5mRBgQF2boDkul>1Px5s%RaI_MlV~om3S}_$+S=MMKQKHD z2E&~n_4V}_A=TB@RaI4$m6ez!7$le?7$J9lcG{A+uUSK!G{~F|J)`9StY9gQNEd#W zNoIlR4+1D6&TbBXBc8p6@kgoS#7U(Ucw(JV5=Q8svsAxkDReWqH(A`Ki8lj tUQ6)iivW!|Ec?Do^q)!?3knIv$E@LR&E3vakzC?)0GbG-N7(;=^f!6-Gd}r;N z3zVV+ic`5rwA>UBv0kD~6VpOPKvZrDcrB=ickl|{*lU{j!(6gowqKm@fABoX^Lf89 z^P_`9Qk)<*lmkJNlan7le0cx<{kwPX-oAbN=FOXliHY&?@z<|kzk2oR<;#~ZUc7kz z{Q0wI&&I~aMn^}VK7IP+$&<&AA3u8Z=;6bM4<0GoIZW})TvXAjg2Qyo;-2l#PQ?Dj~zR9MI1N=$mLWw*vGMtbE1&Ao{!`XJr7`C! zx%?EE=D@U9C`g4mlZyH%GYmMNLc;{|43mNEs+`ISR++3Yqk@|6zM$MoO{s9>q|OqN zWFN!rdztYMlSN05+Y?YM8Z>8eru*S!rvj#93;d;o3gR!Zi*_Pvut9XYqa%y!NmOV^ zn8GGo$8MivvF%-%BhKq_i1MR;#LBPArchCGq!s&(%yC3lJ*o*`kwy0kQz>!1fmPxS zLr^Q>70L3KDAT3bs*WPQe*jg7d*!-`7OvA3Csc3e3ZoY)r$Xz|ZJckz(qBlsv*I{2 zW%RFPTJesfha94EoaZ3wOA}R zT1+O>=b{`wd>Ei|=+GgXD?pUW%1WChWo2chrKKe$CB?6OH8oYCPykMnlau4);{hb|=g*f&Bw=A;VzD?VCMUPlQJiG}kb3 zsu8N|MO>n@q@6v~Y+Cd;JmDy*p|LsBCfinTV@Y#gAl8n@7~o!gwtRjIfASb>ulG7bh(E3EXTVVKl%)0n^tKz zW!6vo1Cc@RH}9B)`1LJvt|vT!xke-r4kqdVk9v!5yS{V5V5hbQmGU$0!kz#BxLsN z*&>n1$H#}q zRZ_x=YcPyG#}MBHXQK321uLx_(V|Qb55j~GLsTb`ED1`1DO9f@agvC{)kt(8Po+4D z=;$mKCfY2gXsIm2Qtmc|S`ACQ=Mc^sa~sNCjQ?ud*_1`6+aEXbhu|1{FOIkv>&Deo zJESalsVSVk?S~{efhWOQh(hHt3MuCt`QGetPh)cggi!4D26L9Qz|Ey9z&sdkipQq1 zA!GRpX|5BV)lZZ{7q|i+1{6$0(d=i=+oDRvw6c=fu>scWxFnC`Fa8;?ZIZ}Jg`#w> h`^1nXZYM8JGbiO}^>#O5VuQd854Zg84nE1yKLMPInr;99 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..6f815e5165f29668590436d070b7cd9b6a320c85 GIT binary patch literal 7144 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 LogKlqap}JR3=+VA literal 0 HcmV?d00001 diff --git a/campaign/event_20251218_cn/b1.py b/campaign/event_20251218_cn/b1.py new file mode 100644 index 000000000..230e32207 --- /dev/null +++ b/campaign/event_20251218_cn/b1.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('B1') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', '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': 1}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4, '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.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/b2.py b/campaign/event_20251218_cn/b2.py new file mode 100644 index 000000000..5d51d0a60 --- /dev/null +++ b/campaign/event_20251218_cn/b2.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 .b1 import Config as ConfigBase + +MAP = CampaignMap('B2') +MAP.shape = 'J8' +MAP.camera_data = ['E2', 'E6', 'F2', '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': 1}, + {'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(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=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20251218_cn/b3.py b/campaign/event_20251218_cn/b3.py new file mode 100644 index 000000000..12af0244b --- /dev/null +++ b/campaign/event_20251218_cn/b3.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 .b1 import Config as ConfigBase + +MAP = CampaignMap('B3') +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': 2}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'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_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=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20251218_cn/c1.py b/campaign/event_20251218_cn/c1.py new file mode 100644 index 000000000..6c19e9fe3 --- /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 = ['D2', 'D6', 'G2', '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..10917f2c1 --- /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 = ['E2', 'E6', 'F2', '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..f0924260f --- /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 = ['D2', 'D6', 'G2', '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.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_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..7076ee80c --- /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 = ['E2', 'E6', 'F2', '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..f57e8cf7f --- /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_Star', '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/module/template/assets.py b/module/template/assets.py index 05b2a6d12..3973aded9 100644 --- a/module/template/assets.py +++ b/module/template/assets.py @@ -239,6 +239,9 @@ TEMPLATE_SIREN_U81 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_U TEMPLATE_SIREN_UDFFortress2 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_UDFFortress2.gif', 'en': './assets/en/template/TEMPLATE_SIREN_UDFFortress2.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_UDFFortress2.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_UDFFortress2.gif'}) TEMPLATE_SIREN_UlrichVonHutten = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_UlrichVonHutten.gif', 'en': './assets/en/template/TEMPLATE_SIREN_UlrichVonHutten.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_UlrichVonHutten.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_UlrichVonHutten.gif'}) TEMPLATE_SIREN_Vauquelin = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Vauquelin.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Vauquelin.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Vauquelin.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Vauquelin.gif'}) +TEMPLATE_SIREN_Vboss_Chariot = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Vboss_Chariot.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Vboss_Chariot.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Vboss_Chariot.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Vboss_Chariot.gif'}) +TEMPLATE_SIREN_Vboss_Hermit = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Vboss_Hermit.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Vboss_Hermit.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Vboss_Hermit.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Vboss_Hermit.gif'}) +TEMPLATE_SIREN_Vboss_Lovers = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Vboss_Lovers.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Vboss_Lovers.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Vboss_Lovers.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Vboss_Lovers.gif'}) TEMPLATE_SIREN_Vboss_Star = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Vboss_Star.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Vboss_Star.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Vboss_Star.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Vboss_Star.gif'}) TEMPLATE_SIREN_Victorious = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Victorious.gif', 'en': './assets/cn/template/TEMPLATE_SIREN_Victorious.gif', 'jp': './assets/cn/template/TEMPLATE_SIREN_Victorious.gif', 'tw': './assets/cn/template/TEMPLATE_SIREN_Victorious.gif'}) TEMPLATE_SIREN_Volga = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Volga.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Volga.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Volga.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Volga.gif'})