From 9c0d07ae66bdfd7bb59f7ad47ca62a74b80fd2dc Mon Sep 17 00:00:00 2001 From: LA-DI-DA <11174151+0O0o0oOoO00@users.noreply.github.com> Date: Fri, 27 Oct 2023 15:54:14 +0800 Subject: [PATCH] Add(tmp): Tempesta and the Fountain of Youth --- .../TEMPLATE_SIREN_fengfan_ghost_xl.png | Bin 0 -> 1577 bytes .../cn/template/TEMPLATE_SIREN_fengfan_xl.png | Bin 0 -> 1364 bytes campaign/Readme.md | 300 +++++++++--------- campaign/event_20231026_cn/campaign_base.py | 63 ++++ campaign/event_20231026_cn/ex.py | 64 ++++ campaign/event_20231026_cn/sp.py | 88 +++++ campaign/event_20231026_cn/t1.py | 74 +++++ campaign/event_20231026_cn/t2.py | 75 +++++ campaign/event_20231026_cn/t3.py | 76 +++++ campaign/event_20231026_cn/t4.py | 76 +++++ campaign/event_20231026_cn/t5.py | 91 ++++++ campaign/event_20231026_cn/t6.py | 91 ++++++ module/campaign/campaign_ui.py | 6 +- module/campaign/run.py | 12 +- module/config/argument/args.json | 63 ++-- 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 + module/template/assets.py | 2 + 20 files changed, 905 insertions(+), 180 deletions(-) create mode 100644 assets/cn/template/TEMPLATE_SIREN_fengfan_ghost_xl.png create mode 100644 assets/cn/template/TEMPLATE_SIREN_fengfan_xl.png create mode 100644 campaign/event_20231026_cn/campaign_base.py create mode 100644 campaign/event_20231026_cn/ex.py create mode 100644 campaign/event_20231026_cn/sp.py create mode 100644 campaign/event_20231026_cn/t1.py create mode 100644 campaign/event_20231026_cn/t2.py create mode 100644 campaign/event_20231026_cn/t3.py create mode 100644 campaign/event_20231026_cn/t4.py create mode 100644 campaign/event_20231026_cn/t5.py create mode 100644 campaign/event_20231026_cn/t6.py diff --git a/assets/cn/template/TEMPLATE_SIREN_fengfan_ghost_xl.png b/assets/cn/template/TEMPLATE_SIREN_fengfan_ghost_xl.png new file mode 100644 index 0000000000000000000000000000000000000000..21405545861362e207d83a50da655323c5cb6ba6 GIT binary patch literal 1577 zcmV+^2G;qBP)NklX)H?-`*^f#YH#$ap?beU48qfSF2z> zgq^?)Gv$JuNu$8C>iK}D%Os>ZEUXr@b~eAU74gZ%>lxl3{qgrjk*oI(CQItdMwyCg zW*9$zX&pq#06>e;;rzP2o-d-Ge1DVq)!#0rFZahySydVnERv3c3!L-Js2&pQ*lSA; zau3Q)`7AEm>+|oYd7j7aBq<&kjma1L?0XVq8Ye#n8PyFRQA`A|MP;hz2dI zgZCFLvf&_1yXm{GO=u22``u??N-E=FcaAHP1fWlHv=TVxL(EC**9OMno`eXdIcjlB6b1*g8^hA+)PjM;pA7J^Xnh_vd$s^ zLso^w>)(E@DR}^?n&u2r2m=73TLMyVF)q>0uHFsaUZtko2t(e4(|>=pUnI-fjT#XZ zf!+>VLW&VFdWryw(Y5JlLUA1qFK5#ifB5D()m6^WrX*1a-NJBB9uZSq#eRj=g=Kk@ z#m&NHUh3IDv-82;u&zp-usOjUAB>TcdkVDby3ixV1!o!ouqCPM>B&W#m(^geRtC9a zmjz%1s35EQ&;?Jku$PkqV3WLVL#J_iDO_p71GdQ=WknkFvFn!JWV{(EtF(AoFK(7$ zt`D)>@CmGWD!Z;<)N4AC*6qcsmuTmUPs1<+Q6^ffx}H=Vfa_o}?FNT7pPhah2H*+K zby=(eh}N;>tBbSIXna`nV=&y|$*a2b-T}a~0UsR)1l@bo^M;2A+yp?0SB)qJC`y)Y5_bQ#ui4Q@$Hn8|3C1?%(M(gm*(+jzyKHV z_^j*bXTiu6=NFc?FnwzBUGwBsdHUlPCNdBah=}O1b=)}DpWcM1*i@YpZQT=a_k@3B zB$l22=Xg)ag`6S;4rp=!PyikYA0P7%zNO&He+^YE0wkNCx0y5p99go5*+`VfsVJ>e zf49adB?4eh#OWacp4a_S)d3a<-&)ARsemxG~++ zU(TmD3c!E|TbTd=JB*38eQjeVd2BbaM!@bZt^mX%n9KyY(_<6m>61MyZoclsy)xOZ zyetp1TbMp%h2`G%I27cJ9omH!ddqwey(8aQe47R~lC(2K*ZM#i?EEqZzy!cSY$TL! zWwGLs2DnZzIlwFiIAlW`X|A`D7{1$9+_$d<7yu?pq!vMJzJ{|x$q69Feb^nejh8*H zD`&fHOstZa0I=DeU|C#}%QjuW$Ccounl{MCm#hPzi|G>bsvJi}Pcii2#csL8Ls`I~dnhk=NPeYEGZ_Odv!{P6Vy1Q8^kG z&7O)AWKz1514<9{MgrUbV@n{Z>!ulv>RO2fAb{&q0KnDY_YS`So`5LQ3#z literal 0 HcmV?d00001 diff --git a/assets/cn/template/TEMPLATE_SIREN_fengfan_xl.png b/assets/cn/template/TEMPLATE_SIREN_fengfan_xl.png new file mode 100644 index 0000000000000000000000000000000000000000..db178631c1d31a4b399ca9db35f5d8d0682ab7c7 GIT binary patch literal 1364 zcmV-a1*`grP)%x=dxE%nmR>B$)t$5F$L*o9+)!X>s$q zZfQ%i(klG1P6IO#h$Dgy+0R<$dRUbfsvy~2LXH2z0FF3-Q%ciir~R;0#kP|I05Jn_ zXHWpNZ$1RGN$LF0tF)k7OQDi z?O(s-MxA(Pd~gi&U^paVBV-Vs^q~nr0%U77F%TY-AJ4LKYmgWKkXV|H_^Bje0TN;z z`OQTdnvi5NbbaF8t+pT`--!n`-$bZK%fsH@_?tnXEgw+x%pyW)cK;N-+QPBJBEmp{ z$Rvf|J`V#MXNkB0ZcuRtK)U?v<1hdaC~TgyaiIYW~Uk6N0x6Q2u#69KHOM!c1O6t>I|sgAm*y{f8?%Dwbu0$kt_Ru~>>vT#YA?$Js2 z^t3V@DmmE$47dmMY-o>~Z_d4wi;J_40yzBMyj}!zfQg_#zJ5DrS+nWot4=CPImk7J z>)HW;grOI++i|(RFj^-s%6P6uhYgnm03Lw0VC#DYU@p&>_o%N;5kP>z^XqZ3j+UbC zzkjm+000(uH%;?K;oz&Q`6iA`x&OcVIo9vrO}PL-f(-uefH$EErqQpr`RR@VqqlDx ztrP}<-*CCPWU%t+m$y&*y1x2t+R;@HBT&|D4P?drzw7U+!|eR^f9}fENGb)g9`Q~R z3Hyyr|8d?qaNogiZ~D{<0t2w+%;|@{rXgGF@~amoiFcK6cK7SmgpvdR0+xgRV!uiz zME(2t_VT=2r8Vxh7~b66)tnmV1}IN6@4x4qG~4~deedj~-Ac@$Sk7mIe*YdxHl-s^ zYyIMYk~oAp27~Kvs;aV(Sj;B#>D084RrO)clhNYj`-3niv4}i~AXP$`1Fk6r7zBja zbTUKtQW?8_8UuinCSV?B3y^{+C5kWrf*`ipcw(3TQWdi8ST*fP1OiChOt=GB^^(R! zu^5k+tyiz68bLc5wS5exKsJCkF(J2B%tqtf{^nwSKt0zW!wdivn?{4+RLXQTnETnw z9$HVp5{>3F0~G6Y$(%S(2cz09zB=!fx(_!CBLD`NgJ>fyteR)T@q=~0{rdd0mG}RZ zaijV~(8hz0%93O;84q*r{PXKC&N@-6e`tHvF0n))SOYHWhCEq47 T2 > T3', + 'T4 > T5 > T6', + ] + + def campaign_set_chapter(self, name, mode='normal'): + """ + Args: + name (str): Campaign name, such as '7-2', 'd3', 'sp3'. + mode (str): 'normal' or 'hard'. + """ + chapter, stage = self._campaign_separate_name(name) + name = chapter + stage + + if chapter.isdigit(): + self.ui_goto_campaign() + self.campaign_ensure_mode('normal') + self.campaign_ensure_chapter(index=chapter) + if mode == 'hard': + self.campaign_ensure_mode('hard') + + elif chapter in 'abcd' or chapter == 'ex_sp': + self.ui_goto_event() + if chapter in 'ab': + self.campaign_ensure_mode('normal') + elif chapter in 'cd': + self.campaign_ensure_mode('hard') + elif chapter == 'ex_sp': + self.campaign_ensure_mode('ex') + self.campaign_ensure_chapter(index=chapter) + + elif chapter == 'sp': + self.ui_goto_sp() + self.campaign_ensure_chapter(index=chapter) + + elif chapter in ['t', 'ts', 'ht', 'hts']: + self.ui_goto_event() + # Campaign mode + if chapter in ['t', 'ts']: + self.campaign_ensure_mode('normal') + if chapter in ['ht', 'hts']: + self.campaign_ensure_mode('hard') + if chapter == 'ex_sp': + self.campaign_ensure_mode('ex') + if chapter in ['t', 'ht']: + if stage in ["1", "2", "3"]: + self.device.click(CHAPTER_PREV) + elif stage in ["4", "5", "6"]: + self.device.click(CHAPTER_NEXT) + # Get stage + self.campaign_ensure_chapter(index=1) + else: + logger.warning(f'Unknown campaign chapter: {name}') diff --git a/campaign/event_20231026_cn/ex.py b/campaign/event_20231026_cn/ex.py new file mode 100644 index 000000000..240b34cf9 --- /dev/null +++ b/campaign/event_20231026_cn/ex.py @@ -0,0 +1,64 @@ +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('EX') +MAP.shape = 'E7' +MAP.camera_data = ['C4'] +MAP.camera_data_spawn_point = ['C4'] +MAP.map_data = """ + ++ ++ ++ ++ ++ + -- ++ ++ ++ -- + -- ++ ++ ++ -- + ++ ++ MB ++ ++ + ++ -- -- -- ++ + -- -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'boss': 1}, +] +A1, B1, C1, D1, E1, \ +A2, B2, C2, D2, E2, \ +A3, B3, C3, D3, E3, \ +A4, B4, C4, D4, E4, \ +A5, B5, C5, D5, E5, \ +A6, B6, C6, D6, E6, \ +A7, B7, C7, D7, E7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + 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 ===== + + +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_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_0(self): + return self.clear_boss() diff --git a/campaign/event_20231026_cn/sp.py b/campaign/event_20231026_cn/sp.py new file mode 100644 index 000000000..66c6347cf --- /dev/null +++ b/campaign/event_20231026_cn/sp.py @@ -0,0 +1,88 @@ +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 = 'G8' +MAP.camera_data = ['D2', 'D6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ ++ -- MB -- ++ ++ + ++ ++ -- -- -- ++ ++ + -- -- -- -- -- -- -- + -- -- -- __ -- -- -- + ++ ++ SP -- SP ++ ++ + ME -- -- -- -- -- ME + -- ME -- 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 +""" +MAP.spawn_data = [ + {'battle': 0}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3, 'enemy': 7}, + {'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, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['mali', 'weida', 'jinluhao'] + 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 ===== + + +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() diff --git a/campaign/event_20231026_cn/t1.py b/campaign/event_20231026_cn/t1.py new file mode 100644 index 000000000..ed7961f78 --- /dev/null +++ b/campaign/event_20231026_cn/t1.py @@ -0,0 +1,74 @@ +from .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 = 'I8' +MAP.camera_data = ['E2', 'E5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F5', 'E5'] +MAP.map_data = """ + ++ -- -- -- -- -- -- ++ MB + -- ME -- -- ME -- ME -- -- + -- -- ME ++ ++ -- -- -- -- + -- -- -- Me ++ Me -- ME ++ + -- 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 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, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['DD'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + 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_20231026_cn/t2.py b/campaign/event_20231026_cn/t2.py new file mode 100644 index 000000000..13447d623 --- /dev/null +++ b/campaign/event_20231026_cn/t2.py @@ -0,0 +1,75 @@ +from .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 = 'I8' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + -- -- -- ++ ++ -- -- SP -- + -- ME -- ++ ++ MS -- -- SP + ME -- ME -- MB -- __ -- -- + ++ -- ++ Me -- Me -- MS -- + ME -- -- -- -- ++ ++ ++ -- + -- ME -- 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 + 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, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['fengfan_xl'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + 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_20231026_cn/t3.py b/campaign/event_20231026_cn/t3.py new file mode 100644 index 000000000..1d01a37a2 --- /dev/null +++ b/campaign/event_20231026_cn/t3.py @@ -0,0 +1,76 @@ +from .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 = 'J8' +MAP.camera_data = ['D3', 'D6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['D3'] +MAP.map_data = """ + ++ ++ -- -- -- -- ++ ++ -- -- + MB ++ -- SP -- -- -- -- ME -- + -- -- SP -- -- MS ++ -- -- ME + Me -- -- -- MS -- Me -- ME -- + -- Me ++ ++ -- ++ ++ -- -- ++ + ME -- -- Me __ Me -- -- Me -- + ++ 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 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, 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 = ['CL', 'CA'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + 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_20231026_cn/t4.py b/campaign/event_20231026_cn/t4.py new file mode 100644 index 000000000..f0d0b311c --- /dev/null +++ b/campaign/event_20231026_cn/t4.py @@ -0,0 +1,76 @@ +from .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('T4') +MAP.shape = 'J8' +MAP.camera_data = ['D3', 'D6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['G3'] +MAP.map_data = """ + ++ ++ -- -- -- -- -- -- ++ ++ + -- ME -- Me ++ -- -- SP MB ++ + ME -- -- -- -- MS -- -- SP -- + -- ME -- ME ME -- __ -- -- -- + -- -- ++ ++ -- Me -- MS -- Me + ++ ++ ++ -- ME -- -- -- ++ -- + ++ ++ ++ ++ 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 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, 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 = ['CL', 'CA'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + 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_20231026_cn/t5.py b/campaign/event_20231026_cn/t5.py new file mode 100644 index 000000000..03870f139 --- /dev/null +++ b/campaign/event_20231026_cn/t5.py @@ -0,0 +1,91 @@ +from .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('T5') +MAP.shape = 'I10' +MAP.camera_data = ['D3', 'D7', 'D8', 'F3', 'F7', 'F8'] +MAP.camera_data_spawn_point = ['D8', 'F8'] +MAP.map_data = """ + ++ ++ ++ ++ ++ ++ ++ ++ ++ + -- ME -- ++ ++ ++ -- ME -- + -- -- ME ++ ++ ++ ME -- -- + ME -- -- ++ MB ++ -- -- ME + -- ME -- -- -- -- -- ME -- + ++ -- ME Me -- Me ME -- ++ + -- Me ++ ++ MS ++ ++ Me -- + ME -- MS -- __ -- MS -- ME + -- 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 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, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['fengfan_ghost_xl'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + 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_20231026_cn/t6.py b/campaign/event_20231026_cn/t6.py new file mode 100644 index 000000000..ab06e2e24 --- /dev/null +++ b/campaign/event_20231026_cn/t6.py @@ -0,0 +1,91 @@ +from .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('T6') +MAP.shape = 'I10' +MAP.camera_data = ['E5', 'E8'] +MAP.camera_data_spawn_point = ['E8'] +MAP.map_data = """ + -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- + -- -- ++ ++ ++ ++ ++ -- -- + -- -- ++ MS -- MS ++ -- -- + -- -- ++ -- MB -- ++ -- -- + -- -- ++ -- MS -- ++ -- -- + -- -- ++ ++ -- ++ ++ -- -- + -- ME -- SP -- SP -- ME -- + -- Me -- -- __ -- -- Me -- + -- -- 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 + 50 50 50 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': 8, '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, \ +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, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['BB', 'CV'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + 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/campaign/campaign_ui.py b/module/campaign/campaign_ui.py index f6fd2cacd..3d2df02fe 100644 --- a/module/campaign/campaign_ui.py +++ b/module/campaign/campaign_ui.py @@ -83,9 +83,11 @@ class CampaignUI(CampaignEvent, CampaignOcr): if mode == 'ex': logger.warning('Trying to goto EX, but no EX mode switch') elif mode == 'normal': - MODE_SWITCH_1.set('hard', main=self) + if self.appear(SWITCH_1_NORMAL): + MODE_SWITCH_1.set('hard', main=self) elif mode == 'hard': - MODE_SWITCH_1.set('normal', main=self) + if self.appear(SWITCH_1_HARD): + MODE_SWITCH_1.set('normal', main=self) else: logger.warning(f'Unknown campaign mode: {mode}') else: diff --git a/module/campaign/run.py b/module/campaign/run.py index d7568df81..14835e84b 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -231,7 +231,8 @@ class CampaignRun(CampaignEvent, ShopStatus): 'event_20200917_cn', 'event_20221124_cn', 'event_20230525_cn', - 'event_20211125_cn', # chapter T + 'event_20211125_cn', + 'event_20231026_cn',# chapter T ]: name = convert.get(name, name) else: @@ -388,6 +389,15 @@ class CampaignRun(CampaignEvent, ShopStatus): self.device.click_record_clear() try: self.campaign.run() + if self.config.task.command in ['ResearchFarm', 'ResearchFarm2', 'ResearchFarm3', 'ResearchFarm4', 'ResearchFarm5', 'ResearchFarm6']: + CurrentTimes = deep_get(self.config.data, "ResearchFarmingSetting.ResearchFarmingSetting.CurrentCampaignTimes") + 1 + CheckInterval = deep_get(self.config.data, "ResearchFarmingSetting.ResearchFarmingSetting.CheckInterval") + self.config.modified["ResearchFarmingSetting.ResearchFarmingSetting.CurrentCampaignTimes"] = CurrentTimes + if CurrentTimes % CheckInterval == 0: + from module.research_farming.farming import ResearchFarming + ResearchFarming(config=self.config, device=self.device).CheckResearchShipExperience() + self.config.update() + except ScriptEnd as e: logger.hr('Script end') logger.info(str(e)) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 6a5baf0aa..a68b1505e 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1694,13 +1694,14 @@ "event_20230525_cn", "event_20230803_cn", "event_20230817_cn", - "event_20230914_cn" + "event_20230914_cn", + "event_20231026_cn" ], "display": "hide", - "cn": "event_20230914_cn", + "cn": "event_20231026_cn", "en": "event_20230914_cn", "jp": "event_20230914_cn", - "tw": "event_20201229_cn" + "tw": "event_20231026_cn" }, "Mode": { "type": "select", @@ -2016,12 +2017,13 @@ "event_20230525_cn", "event_20230803_cn", "event_20230817_cn", - "event_20230914_cn" + "event_20230914_cn", + "event_20231026_cn" ], - "cn": "event_20230914_cn", + "cn": "event_20231026_cn", "en": "event_20230914_cn", "jp": "event_20230914_cn", - "tw": "event_20201229_cn" + "tw": "event_20231026_cn" }, "Mode": { "type": "select", @@ -2452,12 +2454,13 @@ "event_20230525_cn", "event_20230803_cn", "event_20230817_cn", - "event_20230914_cn" + "event_20230914_cn", + "event_20231026_cn" ], - "cn": "event_20230914_cn", + "cn": "event_20231026_cn", "en": "event_20230914_cn", "jp": "event_20230914_cn", - "tw": "event_20220915_cn" + "tw": "event_20231026_cn" }, "Mode": { "type": "select", @@ -2888,12 +2891,13 @@ "event_20230525_cn", "event_20230803_cn", "event_20230817_cn", - "event_20230914_cn" + "event_20230914_cn", + "event_20231026_cn" ], - "cn": "event_20230914_cn", + "cn": "event_20231026_cn", "en": "event_20230914_cn", "jp": "event_20230914_cn", - "tw": "event_20201229_cn" + "tw": "event_20231026_cn" }, "Mode": { "type": "select", @@ -4237,13 +4241,14 @@ "event_20230525_cn", "event_20230803_cn", "event_20230817_cn", - "event_20230914_cn" + "event_20230914_cn", + "event_20231026_cn" ], "display": "disabled", - "cn": "event_20230914_cn", + "cn": "event_20231026_cn", "en": "event_20230914_cn", "jp": "event_20230914_cn", - "tw": "event_20201229_cn" + "tw": "event_20231026_cn" }, "Mode": { "type": "select", @@ -4691,13 +4696,14 @@ "event_20230525_cn", "event_20230803_cn", "event_20230817_cn", - "event_20230914_cn" + "event_20230914_cn", + "event_20231026_cn" ], "display": "disabled", - "cn": "event_20230914_cn", + "cn": "event_20231026_cn", "en": "event_20230914_cn", "jp": "event_20230914_cn", - "tw": "event_20201229_cn" + "tw": "event_20231026_cn" }, "Mode": { "type": "select", @@ -5145,13 +5151,14 @@ "event_20230525_cn", "event_20230803_cn", "event_20230817_cn", - "event_20230914_cn" + "event_20230914_cn", + "event_20231026_cn" ], "display": "disabled", - "cn": "event_20230914_cn", + "cn": "event_20231026_cn", "en": "event_20230914_cn", "jp": "event_20230914_cn", - "tw": "event_20201229_cn" + "tw": "event_20231026_cn" }, "Mode": { "type": "select", @@ -5599,13 +5606,14 @@ "event_20230525_cn", "event_20230803_cn", "event_20230817_cn", - "event_20230914_cn" + "event_20230914_cn", + "event_20231026_cn" ], "display": "disabled", - "cn": "event_20230914_cn", + "cn": "event_20231026_cn", "en": "event_20230914_cn", "jp": "event_20230914_cn", - "tw": "event_20201229_cn" + "tw": "event_20231026_cn" }, "Mode": { "type": "select", @@ -6043,13 +6051,14 @@ "event_20230525_cn", "event_20230803_cn", "event_20230817_cn", - "event_20230914_cn" + "event_20230914_cn", + "event_20231026_cn" ], "display": "disabled", - "cn": "event_20230914_cn", + "cn": "event_20231026_cn", "en": "event_20230914_cn", "jp": "event_20230914_cn", - "tw": "event_20201229_cn" + "tw": "event_20231026_cn" }, "Mode": { "type": "select", diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index dc4de287b..ddf43156f 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -724,6 +724,7 @@ "event_20230803_cn": "Anthem of Remembrance", "event_20230817_cn": "The Fools Scales", "event_20230914_cn": "Effulgence Before Eclipse", + "event_20231026_cn": "飓风与青春之泉", "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 6a8c32b27..5e3fd9694 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -724,6 +724,7 @@ "event_20230803_cn": "燃ゆる聖都の回想曲", "event_20230817_cn": "愚者の天秤", "event_20230914_cn": "須臾望月抄", + "event_20231026_cn": "飓风与青春之泉", "raid_20200624": "特別演習超空強襲波(復刻)", "raid_20210708": "交錯する新たな波 (復刻)", "raid_20220127": "秘密事件調査", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 172cba9a4..0fe0c414b 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -724,6 +724,7 @@ "event_20230803_cn": "奏响鸢尾之歌", "event_20230817_cn": "愚者的天平", "event_20230914_cn": "须臾望月抄", + "event_20231026_cn": "飓风与青春之泉", "raid_20200624": "复刻特别演习埃塞克斯级", "raid_20210708": "复刻穿越彼方的水线", "raid_20220127": "演习神秘事件调查", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 61a2c5216..cd7e223cb 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -724,6 +724,7 @@ "event_20230803_cn": "Anthem of Remembrance", "event_20230817_cn": "The Fools Scales", "event_20230914_cn": "Effulgence Before Eclipse", + "event_20231026_cn": "復刻-負象限作戰", "raid_20200624": "特別演習埃塞克斯級(復刻)", "raid_20210708": "復刻穿越彼方的水線", "raid_20220127": "演習神秘事件調查", diff --git a/module/template/assets.py b/module/template/assets.py index 85932cf72..0d72aedfc 100644 --- a/module/template/assets.py +++ b/module/template/assets.py @@ -89,6 +89,8 @@ TEMPLATE_SIREN_DogPink = Template(file={'cn': './assets/cn/template/TEMPLATE_SIR TEMPLATE_SIREN_Dorsetshire = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Dorsetshire.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Dorsetshire.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Dorsetshire.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Dorsetshire.gif'}) TEMPLATE_SIREN_DukeOfYork = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_DukeOfYork.gif', 'en': './assets/en/template/TEMPLATE_SIREN_DukeOfYork.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_DukeOfYork.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_DukeOfYork.gif'}) TEMPLATE_SIREN_ELpurple = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_ELpurple.gif', 'en': './assets/en/template/TEMPLATE_SIREN_ELpurple.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_ELpurple.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_ELpurple.gif'}) +TEMPLATE_SIREN_fengfan_ghost_xl = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_fengfan_ghost_xl.png', 'en': './assets/cn/template/TEMPLATE_SIREN_fengfan_ghost_xl.png', 'jp': './assets/cn/template/TEMPLATE_SIREN_fengfan_ghost_xl.png', 'tw': './assets/cn/template/TEMPLATE_SIREN_fengfan_ghost_xl.png'}) +TEMPLATE_SIREN_fengfan_xl = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_fengfan_xl.png', 'en': './assets/cn/template/TEMPLATE_SIREN_fengfan_xl.png', 'jp': './assets/cn/template/TEMPLATE_SIREN_fengfan_xl.png', 'tw': './assets/cn/template/TEMPLATE_SIREN_fengfan_xl.png'}) TEMPLATE_SIREN_Formidable = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Formidable.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Formidable.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Formidable.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Formidable.gif'}) TEMPLATE_SIREN_Gascogne = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Gascogne.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Gascogne.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Gascogne.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Gascogne.gif'}) TEMPLATE_SIREN_Gloucester = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Gloucester.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Gloucester.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Gloucester.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Gloucester.gif'})