diff --git a/assets/cn/meowfficer/MEOWFFICER_GOLD_CHECK.png b/assets/cn/meowfficer/MEOWFFICER_GOLD_CHECK.png index 8525715fe..7e55be976 100644 Binary files a/assets/cn/meowfficer/MEOWFFICER_GOLD_CHECK.png and b/assets/cn/meowfficer/MEOWFFICER_GOLD_CHECK.png differ diff --git a/assets/cn/template/TEMPLATE_SIREN_SK_BB.gif b/assets/cn/template/TEMPLATE_SIREN_SK_BB.gif new file mode 100644 index 000000000..6896f7564 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_SK_BB.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_SK_CA.gif b/assets/cn/template/TEMPLATE_SIREN_SK_CA.gif new file mode 100644 index 000000000..141de5bed Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_SK_CA.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_SK_CL.gif b/assets/cn/template/TEMPLATE_SIREN_SK_CL.gif new file mode 100644 index 000000000..1110c3af5 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_SK_CL.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_SK_CV.gif b/assets/cn/template/TEMPLATE_SIREN_SK_CV.gif new file mode 100644 index 000000000..bb4310d19 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_SK_CV.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_SK_DD.gif b/assets/cn/template/TEMPLATE_SIREN_SK_DD.gif new file mode 100644 index 000000000..cfad2e80b Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_SK_DD.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_SK_BB.gif b/assets/en/template/TEMPLATE_SIREN_SK_BB.gif new file mode 100644 index 000000000..6896f7564 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_SK_BB.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_SK_CA.gif b/assets/en/template/TEMPLATE_SIREN_SK_CA.gif new file mode 100644 index 000000000..141de5bed Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_SK_CA.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_SK_CL.gif b/assets/en/template/TEMPLATE_SIREN_SK_CL.gif new file mode 100644 index 000000000..1110c3af5 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_SK_CL.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_SK_CV.gif b/assets/en/template/TEMPLATE_SIREN_SK_CV.gif new file mode 100644 index 000000000..bb4310d19 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_SK_CV.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_SK_DD.gif b/assets/en/template/TEMPLATE_SIREN_SK_DD.gif new file mode 100644 index 000000000..cfad2e80b Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_SK_DD.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_SK_BB.gif b/assets/jp/template/TEMPLATE_SIREN_SK_BB.gif new file mode 100644 index 000000000..6896f7564 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_SK_BB.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_SK_CA.gif b/assets/jp/template/TEMPLATE_SIREN_SK_CA.gif new file mode 100644 index 000000000..141de5bed Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_SK_CA.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_SK_CL.gif b/assets/jp/template/TEMPLATE_SIREN_SK_CL.gif new file mode 100644 index 000000000..1110c3af5 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_SK_CL.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_SK_CV.gif b/assets/jp/template/TEMPLATE_SIREN_SK_CV.gif new file mode 100644 index 000000000..bb4310d19 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_SK_CV.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_SK_DD.gif b/assets/jp/template/TEMPLATE_SIREN_SK_DD.gif new file mode 100644 index 000000000..cfad2e80b Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_SK_DD.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_SK_BB.gif b/assets/tw/template/TEMPLATE_SIREN_SK_BB.gif new file mode 100644 index 000000000..6896f7564 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_SK_BB.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_SK_CA.gif b/assets/tw/template/TEMPLATE_SIREN_SK_CA.gif new file mode 100644 index 000000000..141de5bed Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_SK_CA.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_SK_CL.gif b/assets/tw/template/TEMPLATE_SIREN_SK_CL.gif new file mode 100644 index 000000000..1110c3af5 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_SK_CL.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_SK_CV.gif b/assets/tw/template/TEMPLATE_SIREN_SK_CV.gif new file mode 100644 index 000000000..bb4310d19 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_SK_CV.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_SK_DD.gif b/assets/tw/template/TEMPLATE_SIREN_SK_DD.gif new file mode 100644 index 000000000..cfad2e80b Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_SK_DD.gif differ diff --git a/campaign/Readme.md b/campaign/Readme.md index a2afd54d3..3e7db71b0 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -165,3 +165,5 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20231026 | event 20231026 cn | Tempesta and the Fountain of Youth | 飓风与青春之泉 | Tempesta and the Fountain of Youth | テンペスタと若返りの泉 | - | | 20231109 | event 20210916 cn | Upon the Shimmering Blue | 复刻碧海光粼 | Upon the Shimmering Blue Rerun | 駆けよ 碧海の吹き風(復刻) | - | | 20231109 | event 20220728 cn | Aquilifer's Ballade | - | - | - | 雄鷹的敘事歌 | +| 20231123 | event 20220210 cn | Northern Overture Rerun | - | - | - | 復刻北境序曲 | +| 20231123 | event 20231123 cn | The Ninja Scrolls: Azur Flash | 苍闪忍法帖 | The Ninja Scrolls: Azur Flash | 蒼閃忍法帖 | - | diff --git a/campaign/event_20231123_cn/campaign_base.py b/campaign/event_20231123_cn/campaign_base.py new file mode 100644 index 000000000..808f9ead5 --- /dev/null +++ b/campaign/event_20231123_cn/campaign_base.py @@ -0,0 +1,36 @@ +from module.campaign.campaign_base import CampaignBase as CampaignBase_ + + +class CampaignBase(CampaignBase_): + STAGE_INCREASE = [ + """ + T1 > T2 > T3 > T4 > T5 + """, + """ + TSK1 > TSK2 > TSK3 > TSK4 > TSK5 + """, + ] + + def campaign_set_chapter_event(self, chapter, mode='normal'): + self.ui_goto_event() + self.campaign_ensure_chapter(index=chapter) + return True + + def _campaign_get_chapter_index(self, name): + """ + Args: + name (str, int): + + Returns: + int + """ + if name == 't': + return 1 + if name == 'tsk': + return 2 + if name == 'ex_sp': + return 3 + if name == 'ex_ex': + return 4 + + return super(CampaignBase, CampaignBase)._campaign_get_chapter_index(name) diff --git a/campaign/event_20231123_cn/sp.py b/campaign/event_20231123_cn/sp.py new file mode 100644 index 000000000..9005e2243 --- /dev/null +++ b/campaign/event_20231123_cn/sp.py @@ -0,0 +1,131 @@ +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('SP') +MAP.shape = 'I9' +MAP.camera_data = ['D4', 'D6', 'F4', 'F6'] +MAP.camera_data_spawn_point = ['F6', 'D6'] +MAP.map_data = """ + ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ MS -- -- MS -- -- MS ++ + ++ -- Me -- -- -- Me -- ++ + ME -- -- ++ -- ++ -- -- ME + -- ME -- -- MB -- -- ME -- + ME -- -- ++ -- ++ -- -- ME + ++ -- Me -- __ -- Me -- ++ + ++ ME -- SP -- SP -- ME ++ + ++ ++ ++ ++ -- ++ ++ ++ ++ +""" +MAP.map_data_loop = """ + ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ -- -- -- -- -- -- -- ++ + ++ -- Me -- -- -- Me -- ++ + ME -- -- ++ MS ++ -- -- ME + -- ME -- MS MB MS -- ME -- + ME -- -- ++ -- ++ -- -- 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 +""" +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}, +] +MAP.spawn_data_loop = [ + {'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, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['SK_BB', 'SK_CV'] + 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 ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + MAP_SWIPE_MULTIPLY = (1.038, 1.058) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.004, 1.023) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.975, 0.992) + 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() diff --git a/campaign/event_20231123_cn/t1.py b/campaign/event_20231123_cn/t1.py new file mode 100644 index 000000000..70878adc5 --- /dev/null +++ b/campaign/event_20231123_cn/t1.py @@ -0,0 +1,108 @@ +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 = ['E3', 'E6'] +MAP.camera_data_spawn_point = ['E3'] +MAP.map_data = """ + -- -- -- -- -- -- -- -- -- + -- -- SP -- SP -- ME ++ -- + -- ++ -- -- -- -- -- -- -- + -- ME -- -- -- ++ ME -- ME + -- -- Me -- Me ++ -- __ -- + -- ME -- MS -- -- -- ME -- + ++ ++ Me -- Me -- ME -- ME + ++ ++ -- MB -- ++ ++ ++ -- +""" +MAP.map_data_loop = """ + -- -- -- -- -- -- -- -- -- + -- -- SP -- SP -- ME ++ -- + -- ++ -- -- -- -- -- -- -- + -- ME -- MS -- ++ ME -- ME + -- -- Me -- Me ++ -- __ -- + -- ME -- -- -- -- -- ME -- + ++ ++ Me -- Me -- ME -- ME + ++ ++ -- MB -- ++ ++ ++ -- +""" +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}, +] +MAP.spawn_data_loop = [ + {'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 = ['SK_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 ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + MAP_SWIPE_MULTIPLY = (1.187, 1.209) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.148, 1.169) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.115, 1.135) + + +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_20231123_cn/t2.py b/campaign/event_20231123_cn/t2.py new file mode 100644 index 000000000..0e0e04e38 --- /dev/null +++ b/campaign/event_20231123_cn/t2.py @@ -0,0 +1,88 @@ +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 = 'I7' +MAP.camera_data = ['D3', 'D5', 'F3', 'F5'] +MAP.camera_data_spawn_point = ['D3'] +MAP.map_data = """ + -- ++ ++ ++ MS ++ ++ ++ -- + -- -- -- -- __ -- -- Me -- + SP -- -- ME -- ME -- -- ME + SP -- ++ -- MB -- ++ ME -- + -- -- -- ME -- ME -- -- ME + ++ Me -- -- ++ -- -- Me ++ + ++ -- ME -- -- -- ME -- ++ +""" +MAP.map_data_loop = """ + -- ++ ++ ++ -- ++ ++ ++ -- + -- -- MS -- __ -- -- Me -- + SP -- -- ME -- ME -- -- ME + SP -- ++ -- MB -- ++ 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 +""" +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}, +] +MAP.spawn_data_loop = [ + {'battle': 0, 'enemy': 3, 'siren': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['SK_DD', 'SK_CL'] + 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_20231123_cn/t3.py b/campaign/event_20231123_cn/t3.py new file mode 100644 index 000000000..fd3c174eb --- /dev/null +++ b/campaign/event_20231123_cn/t3.py @@ -0,0 +1,84 @@ +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 = 'I8' +MAP.camera_data = ['D3', 'D6', 'F3', 'F6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + -- -- -- -- -- -- -- -- -- + -- ++ ++ -- MB -- ++ ME -- + -- ++ ++ ME -- ME ++ -- ME + -- Me -- ME -- ME -- Me -- + Me -- -- -- __ -- -- -- -- + ++ -- -- MS -- MS -- -- ME + -- -- -- ++ ++ ++ -- MS -- + -- 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 +""" +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}, +] +MAP.spawn_data_loop = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['SK_CL', 'SK_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_20231123_cn/t4.py b/campaign/event_20231123_cn/t4.py new file mode 100644 index 000000000..92afc27bb --- /dev/null +++ b/campaign/event_20231123_cn/t4.py @@ -0,0 +1,84 @@ +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 = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['F6', 'D6'] +MAP.map_data = """ + ++ ++ ++ ME -- MB -- ME ++ + ++ MS -- -- ME -- ME -- -- + ME -- -- ++ -- __ -- -- ++ + -- ME -- -- -- Me -- -- ++ + ++ ++ -- MS -- ++ -- MS -- + ++ ++ -- -- Me ++ Me -- -- + -- -- 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 +""" +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}, +] +MAP.spawn_data_loop = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['SK_CL', 'SK_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_20231123_cn/t5.py b/campaign/event_20231123_cn/t5.py new file mode 100644 index 000000000..f6d5bdffd --- /dev/null +++ b/campaign/event_20231123_cn/t5.py @@ -0,0 +1,100 @@ +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 = ['D2', 'D6', 'D7', 'F2', 'F6', 'F7'] +MAP.camera_data_spawn_point = ['F7', 'D7'] +MAP.map_data = """ + ++ ++ -- ME -- ME -- ++ ++ + ++ ++ ME -- MB -- ME ++ ++ + -- ME -- -- -- -- -- ME -- + ME -- -- ME -- ME -- -- ME + ++ ME -- ++ ++ ++ -- ME ++ + ++ -- -- Me MS Me -- -- ++ + -- MS -- -- __ -- -- MS -- + -- ++ -- SP -- SP -- ++ -- + -- -- Me -- MS -- 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': 3, 'siren': 3}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +MAP.spawn_data_loop = [ + {'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 = ['SK_BB', 'SK_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/campaign/event_20231123_cn/tsk1.py b/campaign/event_20231123_cn/tsk1.py new file mode 100644 index 000000000..f903b82b2 --- /dev/null +++ b/campaign/event_20231123_cn/tsk1.py @@ -0,0 +1,71 @@ +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('TSK1') +MAP.shape = 'E5' +MAP.camera_data = ['D3'] +MAP.camera_data_spawn_point = ['D3'] +MAP.map_data = """ + -- ++ ++ ++ -- + -- -- ++ -- -- + -- SP -- MB -- + ++ -- -- -- ++ + -- ++ ++ ++ -- +""" +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 +""" +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, \ + = 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 ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + MAP_SWIPE_MULTIPLY = (1.187, 1.209) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.148, 1.169) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.115, 1.135) + MAP_IS_ONE_TIME_STAGE = True + FLEET_2 = 0 + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + return self.clear_boss() diff --git a/campaign/event_20231123_cn/tsk2.py b/campaign/event_20231123_cn/tsk2.py new file mode 100644 index 000000000..7ff90bc04 --- /dev/null +++ b/campaign/event_20231123_cn/tsk2.py @@ -0,0 +1,53 @@ +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 .tsk1 import Config as ConfigBase + +MAP = CampaignMap('TSK2') +MAP.shape = 'E5' +MAP.camera_data = ['D3'] +MAP.camera_data_spawn_point = ['D3'] +MAP.map_data = """ + -- ++ ++ ++ -- + -- -- ++ -- -- + -- SP -- MB -- + ++ -- -- -- ++ + -- ++ ++ ++ -- +""" +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 +""" +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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== 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): + return self.clear_boss() diff --git a/campaign/event_20231123_cn/tsk3.py b/campaign/event_20231123_cn/tsk3.py new file mode 100644 index 000000000..52ddb126c --- /dev/null +++ b/campaign/event_20231123_cn/tsk3.py @@ -0,0 +1,53 @@ +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 .tsk1 import Config as ConfigBase + +MAP = CampaignMap('TSK3') +MAP.shape = 'E5' +MAP.camera_data = ['D3'] +MAP.camera_data_spawn_point = ['D3'] +MAP.map_data = """ + -- ++ ++ ++ -- + -- -- ++ -- -- + -- SP -- MB -- + ++ -- -- -- ++ + -- ++ ++ ++ -- +""" +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 +""" +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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== 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): + return self.clear_boss() diff --git a/campaign/event_20231123_cn/tsk4.py b/campaign/event_20231123_cn/tsk4.py new file mode 100644 index 000000000..6372e4780 --- /dev/null +++ b/campaign/event_20231123_cn/tsk4.py @@ -0,0 +1,53 @@ +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 .tsk1 import Config as ConfigBase + +MAP = CampaignMap('TSK4') +MAP.shape = 'E5' +MAP.camera_data = ['D3'] +MAP.camera_data_spawn_point = ['D3'] +MAP.map_data = """ + -- ++ ++ ++ -- + -- -- ++ -- -- + -- SP -- MB -- + ++ -- -- -- ++ + -- ++ ++ ++ -- +""" +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 +""" +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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== 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): + return self.clear_boss() diff --git a/campaign/event_20231123_cn/tsk5.py b/campaign/event_20231123_cn/tsk5.py new file mode 100644 index 000000000..fefa5dbaa --- /dev/null +++ b/campaign/event_20231123_cn/tsk5.py @@ -0,0 +1,53 @@ +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 .tsk1 import Config as ConfigBase + +MAP = CampaignMap('TSK5') +MAP.shape = 'E5' +MAP.camera_data = ['D3'] +MAP.camera_data_spawn_point = ['D3'] +MAP.map_data = """ + -- ++ ++ ++ -- + -- -- ++ -- -- + -- SP -- MB -- + ++ -- -- -- ++ + -- ++ ++ ++ -- +""" +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 +""" +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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== 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): + return self.clear_boss() diff --git a/module/campaign/run.py b/module/campaign/run.py index c9571aa70..b1956f5b1 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -231,6 +231,7 @@ def handle_stage_name(self, name, folder, mode='normal'): # chapter T 'event_20211125_cn', 'event_20231026_cn', + 'event_20231123_cn', ]: name = convert.get(name, name) else: diff --git a/module/config/argument/args.json b/module/config/argument/args.json index ba4b615c7..20371cebc 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1674,17 +1674,18 @@ "event_20230803_cn", "event_20230817_cn", "event_20230914_cn", - "event_20231026_cn" + "event_20231026_cn", + "event_20231123_cn" ], "display": "hide", "option_bold": [ - "event_20220728_cn", - "event_20210916_cn" + "event_20231123_cn", + "event_20220210_cn" ], - "cn": "event_20210916_cn", - "en": "event_20210916_cn", - "jp": "event_20210916_cn", - "tw": "event_20220728_cn" + "cn": "event_20231123_cn", + "en": "event_20231123_cn", + "jp": "event_20231123_cn", + "tw": "event_20220210_cn" }, "Mode": { "type": "select", @@ -2005,16 +2006,17 @@ "event_20230803_cn", "event_20230817_cn", "event_20230914_cn", - "event_20231026_cn" + "event_20231026_cn", + "event_20231123_cn" ], "option_bold": [ - "event_20220728_cn", - "event_20210916_cn" + "event_20231123_cn", + "event_20220210_cn" ], - "cn": "event_20210916_cn", - "en": "event_20210916_cn", - "jp": "event_20210916_cn", - "tw": "event_20220728_cn" + "cn": "event_20231123_cn", + "en": "event_20231123_cn", + "jp": "event_20231123_cn", + "tw": "event_20220210_cn" }, "Mode": { "type": "select", @@ -2450,16 +2452,17 @@ "event_20230803_cn", "event_20230817_cn", "event_20230914_cn", - "event_20231026_cn" + "event_20231026_cn", + "event_20231123_cn" ], "option_bold": [ - "event_20220728_cn", - "event_20210916_cn" + "event_20231123_cn", + "event_20220210_cn" ], - "cn": "event_20210916_cn", - "en": "event_20210916_cn", - "jp": "event_20210916_cn", - "tw": "event_20220728_cn" + "cn": "event_20231123_cn", + "en": "event_20231123_cn", + "jp": "event_20231123_cn", + "tw": "event_20220210_cn" }, "Mode": { "type": "select", @@ -2862,8 +2865,8 @@ "raid_20230629" ], "option_bold": [ - "raid_20221027", - "raid_20230629" + "raid_20230629", + "raid_20221027" ], "cn": "raid_20230629", "en": "raid_20230629", @@ -3833,16 +3836,17 @@ "event_20230803_cn", "event_20230817_cn", "event_20230914_cn", - "event_20231026_cn" + "event_20231026_cn", + "event_20231123_cn" ], "option_bold": [ - "event_20220728_cn", - "event_20210916_cn" + "event_20231123_cn", + "event_20220210_cn" ], - "cn": "event_20210916_cn", - "en": "event_20210916_cn", - "jp": "event_20210916_cn", - "tw": "event_20220728_cn" + "cn": "event_20231123_cn", + "en": "event_20231123_cn", + "jp": "event_20231123_cn", + "tw": "event_20220210_cn" }, "Mode": { "type": "select", @@ -4295,16 +4299,17 @@ "event_20230803_cn", "event_20230817_cn", "event_20230914_cn", - "event_20231026_cn" + "event_20231026_cn", + "event_20231123_cn" ], "option_bold": [ - "event_20220728_cn", - "event_20210916_cn" + "event_20231123_cn", + "event_20220210_cn" ], - "cn": "event_20210916_cn", - "en": "event_20210916_cn", - "jp": "event_20210916_cn", - "tw": "event_20220728_cn" + "cn": "event_20231123_cn", + "en": "event_20231123_cn", + "jp": "event_20231123_cn", + "tw": "event_20220210_cn" }, "Mode": { "type": "select", @@ -4757,16 +4762,17 @@ "event_20230803_cn", "event_20230817_cn", "event_20230914_cn", - "event_20231026_cn" + "event_20231026_cn", + "event_20231123_cn" ], "option_bold": [ - "event_20220728_cn", - "event_20210916_cn" + "event_20231123_cn", + "event_20220210_cn" ], - "cn": "event_20210916_cn", - "en": "event_20210916_cn", - "jp": "event_20210916_cn", - "tw": "event_20220728_cn" + "cn": "event_20231123_cn", + "en": "event_20231123_cn", + "jp": "event_20231123_cn", + "tw": "event_20220210_cn" }, "Mode": { "type": "select", @@ -5219,16 +5225,17 @@ "event_20230803_cn", "event_20230817_cn", "event_20230914_cn", - "event_20231026_cn" + "event_20231026_cn", + "event_20231123_cn" ], "option_bold": [ - "event_20220728_cn", - "event_20210916_cn" + "event_20231123_cn", + "event_20220210_cn" ], - "cn": "event_20210916_cn", - "en": "event_20210916_cn", - "jp": "event_20210916_cn", - "tw": "event_20220728_cn" + "cn": "event_20231123_cn", + "en": "event_20231123_cn", + "jp": "event_20231123_cn", + "tw": "event_20220210_cn" }, "Mode": { "type": "select", @@ -5671,16 +5678,17 @@ "event_20230803_cn", "event_20230817_cn", "event_20230914_cn", - "event_20231026_cn" + "event_20231026_cn", + "event_20231123_cn" ], "option_bold": [ - "event_20220728_cn", - "event_20210916_cn" + "event_20231123_cn", + "event_20220210_cn" ], - "cn": "event_20210916_cn", - "en": "event_20210916_cn", - "jp": "event_20210916_cn", - "tw": "event_20220728_cn" + "cn": "event_20231123_cn", + "en": "event_20231123_cn", + "jp": "event_20231123_cn", + "tw": "event_20220210_cn" }, "Mode": { "type": "select", @@ -6080,8 +6088,8 @@ "raid_20230629" ], "option_bold": [ - "raid_20221027", - "raid_20230629" + "raid_20230629", + "raid_20221027" ], "cn": "raid_20230629", "en": "raid_20230629", diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index cfb59dc62..d665028db 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -709,6 +709,7 @@ "event_20230817_cn": "The Fools Scales", "event_20230914_cn": "Effulgence Before Eclipse", "event_20231026_cn": "Tempesta and the Fountain of Youth", + "event_20231123_cn": "The Ninja Scrolls: Azur Flash", "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 4c4c9515c..3d14b9ac2 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -709,6 +709,7 @@ "event_20230817_cn": "愚者の天秤", "event_20230914_cn": "須臾望月抄", "event_20231026_cn": "テンペスタと若返りの泉", + "event_20231123_cn": "蒼閃忍法帖", "raid_20200624": "特別演習超空強襲波(復刻)", "raid_20210708": "交錯する新たな波 (復刻)", "raid_20220127": "秘密事件調査", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 1da0881f7..40fe34070 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -709,6 +709,7 @@ "event_20230817_cn": "愚者的天平", "event_20230914_cn": "须臾望月抄", "event_20231026_cn": "飓风与青春之泉", + "event_20231123_cn": "苍闪忍法帖", "raid_20200624": "复刻特别演习埃塞克斯级", "raid_20210708": "复刻穿越彼方的水线", "raid_20220127": "演习神秘事件调查", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index c9178e66e..42672d8a9 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -690,7 +690,7 @@ "event_20211111_cn": "杰諾瓦的焰火", "event_20211125_cn": "復刻-交匯世界的弧光", "event_20211229_cn": "逆轉彩虹之塔", - "event_20220210_cn": "Northern Overture Rerun", + "event_20220210_cn": "復刻北境序曲", "event_20220224_cn": "深度回音", "event_20220310_tw": "復刻斯圖爾特的硝煙", "event_20220324_cn": "虛像構築之塔", @@ -709,6 +709,7 @@ "event_20230817_cn": "The Fools Scales", "event_20230914_cn": "Effulgence Before Eclipse", "event_20231026_cn": "Tempesta and the Fountain of Youth", + "event_20231123_cn": "The Ninja Scrolls: Azur Flash", "raid_20200624": "特別演習埃塞克斯級(復刻)", "raid_20210708": "復刻穿越彼方的水線", "raid_20220127": "演習神秘事件調查", diff --git a/module/meowfficer/assets.py b/module/meowfficer/assets.py index fb9b56fdc..98d0539b2 100644 --- a/module/meowfficer/assets.py +++ b/module/meowfficer/assets.py @@ -25,7 +25,7 @@ MEOWFFICER_FORT_GET_XP_2 = Button(area={'cn': (320, 314, 422, 412), 'en': (320, 314, 422, 412), 'jp': (302, 318, 414, 393), 'tw': (320, 314, 422, 412)}, color={'cn': (221, 189, 148), 'en': (221, 189, 148), 'jp': (227, 192, 151), 'tw': (221, 189, 148)}, button={'cn': (320, 314, 422, 412), 'en': (320, 314, 422, 412), 'jp': (302, 318, 414, 393), 'tw': (320, 314, 422, 412)}, file={'cn': './assets/cn/meowfficer/MEOWFFICER_FORT_GET_XP_2.png', 'en': './assets/en/meowfficer/MEOWFFICER_FORT_GET_XP_2.png', 'jp': './assets/jp/meowfficer/MEOWFFICER_FORT_GET_XP_2.png', 'tw': './assets/tw/meowfficer/MEOWFFICER_FORT_GET_XP_2.png'}) MEOWFFICER_FORT_RED_DOT = Button(area={'cn': (918, 647, 938, 668), 'en': (918, 647, 938, 668), 'jp': (918, 647, 938, 668), 'tw': (918, 647, 938, 668)}, color={'cn': (243, 132, 118), 'en': (243, 132, 118), 'jp': (243, 132, 118), 'tw': (243, 132, 118)}, button={'cn': (918, 647, 938, 668), 'en': (918, 647, 938, 668), 'jp': (918, 647, 938, 668), 'tw': (918, 647, 938, 668)}, file={'cn': './assets/cn/meowfficer/MEOWFFICER_FORT_RED_DOT.png', 'en': './assets/en/meowfficer/MEOWFFICER_FORT_RED_DOT.png', 'jp': './assets/jp/meowfficer/MEOWFFICER_FORT_RED_DOT.png', 'tw': './assets/tw/meowfficer/MEOWFFICER_FORT_RED_DOT.png'}) MEOWFFICER_GET_CHECK = Button(area={'cn': (36, 666, 82, 689), 'en': (47, 669, 85, 686), 'jp': (30, 667, 84, 681), 'tw': (797, 358, 827, 458)}, color={'cn': (204, 175, 130), 'en': (211, 181, 124), 'jp': (218, 188, 115), 'tw': (191, 122, 84)}, button={'cn': (36, 666, 82, 689), 'en': (47, 669, 85, 686), 'jp': (30, 667, 84, 681), 'tw': (797, 358, 827, 458)}, file={'cn': './assets/cn/meowfficer/MEOWFFICER_GET_CHECK.png', 'en': './assets/en/meowfficer/MEOWFFICER_GET_CHECK.png', 'jp': './assets/jp/meowfficer/MEOWFFICER_GET_CHECK.png', 'tw': './assets/tw/meowfficer/MEOWFFICER_GET_CHECK.png'}) -MEOWFFICER_GOLD_CHECK = Button(area={'cn': (1107, 242, 1150, 265), 'en': (1107, 242, 1150, 265), 'jp': (1104, 241, 1156, 266), 'tw': (1107, 242, 1150, 265)}, color={'cn': (249, 225, 169), 'en': (249, 225, 169), 'jp': (248, 227, 175), 'tw': (249, 225, 169)}, button={'cn': (1107, 242, 1150, 265), 'en': (1107, 242, 1150, 265), 'jp': (1104, 241, 1156, 266), 'tw': (1107, 242, 1150, 265)}, file={'cn': './assets/cn/meowfficer/MEOWFFICER_GOLD_CHECK.png', 'en': './assets/en/meowfficer/MEOWFFICER_GOLD_CHECK.png', 'jp': './assets/jp/meowfficer/MEOWFFICER_GOLD_CHECK.png', 'tw': './assets/tw/meowfficer/MEOWFFICER_GOLD_CHECK.png'}) +MEOWFFICER_GOLD_CHECK = Button(area={'cn': (1117, 242, 1160, 265), 'en': (1107, 242, 1150, 265), 'jp': (1104, 241, 1156, 266), 'tw': (1107, 242, 1150, 265)}, color={'cn': (250, 229, 170), 'en': (249, 225, 169), 'jp': (248, 227, 175), 'tw': (249, 225, 169)}, button={'cn': (1117, 242, 1160, 265), 'en': (1107, 242, 1150, 265), 'jp': (1104, 241, 1156, 266), 'tw': (1107, 242, 1150, 265)}, file={'cn': './assets/cn/meowfficer/MEOWFFICER_GOLD_CHECK.png', 'en': './assets/en/meowfficer/MEOWFFICER_GOLD_CHECK.png', 'jp': './assets/jp/meowfficer/MEOWFFICER_GOLD_CHECK.png', 'tw': './assets/tw/meowfficer/MEOWFFICER_GOLD_CHECK.png'}) MEOWFFICER_PURPLE_CHECK = Button(area={'cn': (1110, 240, 1148, 265), 'en': (1106, 245, 1153, 264), 'jp': (1112, 241, 1148, 266), 'tw': (1110, 240, 1148, 265)}, color={'cn': (223, 172, 245), 'en': (222, 179, 239), 'jp': (226, 185, 242), 'tw': (223, 172, 245)}, button={'cn': (1110, 240, 1148, 265), 'en': (1106, 245, 1153, 264), 'jp': (1112, 241, 1148, 266), 'tw': (1110, 240, 1148, 265)}, file={'cn': './assets/cn/meowfficer/MEOWFFICER_PURPLE_CHECK.png', 'en': './assets/en/meowfficer/MEOWFFICER_PURPLE_CHECK.png', 'jp': './assets/jp/meowfficer/MEOWFFICER_PURPLE_CHECK.png', 'tw': './assets/tw/meowfficer/MEOWFFICER_PURPLE_CHECK.png'}) MEOWFFICER_TALENT_CLOSE = Button(area={'cn': (858, 238, 908, 297), 'en': (858, 238, 908, 297), 'jp': (858, 238, 908, 297), 'tw': (858, 238, 908, 297)}, color={'cn': (232, 131, 111), 'en': (232, 131, 111), 'jp': (232, 131, 111), 'tw': (232, 131, 111)}, button={'cn': (858, 238, 908, 297), 'en': (858, 238, 908, 297), 'jp': (858, 238, 908, 297), 'tw': (858, 238, 908, 297)}, file={'cn': './assets/cn/meowfficer/MEOWFFICER_TALENT_CLOSE.png', 'en': './assets/en/meowfficer/MEOWFFICER_TALENT_CLOSE.png', 'jp': './assets/jp/meowfficer/MEOWFFICER_TALENT_CLOSE.png', 'tw': './assets/tw/meowfficer/MEOWFFICER_TALENT_CLOSE.png'}) MEOWFFICER_TRAIN_CLICK_SAFE_AREA = Button(area={'cn': (224, 184, 242, 347), 'en': (234, 191, 244, 523), 'jp': (224, 184, 242, 347), 'tw': (224, 184, 242, 347)}, color={'cn': (242, 237, 237), 'en': (243, 239, 239), 'jp': (242, 237, 237), 'tw': (242, 237, 237)}, button={'cn': (224, 184, 242, 347), 'en': (234, 191, 244, 523), 'jp': (224, 184, 242, 347), 'tw': (224, 184, 242, 347)}, file={'cn': './assets/cn/meowfficer/MEOWFFICER_TRAIN_CLICK_SAFE_AREA.png', 'en': './assets/en/meowfficer/MEOWFFICER_TRAIN_CLICK_SAFE_AREA.png', 'jp': './assets/jp/meowfficer/MEOWFFICER_TRAIN_CLICK_SAFE_AREA.png', 'tw': './assets/tw/meowfficer/MEOWFFICER_TRAIN_CLICK_SAFE_AREA.png'}) diff --git a/module/meowfficer/collect.py b/module/meowfficer/collect.py index 3e08dbfa5..22dbb5493 100644 --- a/module/meowfficer/collect.py +++ b/module/meowfficer/collect.py @@ -175,6 +175,39 @@ def _meow_apply_lock(self, lock=True): # Wait until info bar disappears self.ensure_no_info_bar(timeout=1) + def _meow_skip_popup_after_locking(self, skip_first_screenshot=True): + """ + Since 2023-11-16 update, even locked gold meow will still have popup. + If gold meow is locked and have popup, click MEOWFFICER_CONFIRM, + if gold meow is unlocked, this method should not be executed. + """ + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + # Next meow MEOWFFICER_APPLY_LOCK load faster than MEOWFFICER_GET_CHECK, + # make sure exit with a full screenshot + if self.appear(MEOWFFICER_GET_CHECK, offset=(40, 40), interval=3): + if self.appear(MEOWFFICER_APPLY_LOCK, offset=(40, 40)): + break + + if self.appear(MEOWFFICER_APPLY_UNLOCK, offset=(40, 40), interval=3): + self.device.click(MEOWFFICER_TRAIN_CLICK_SAFE_AREA) + continue + if self.appear(MEOWFFICER_CONFIRM, offset=(40, 20), interval=3): + self.device.click(MEOWFFICER_CONFIRM) + continue + elif self.appear(MEOWFFICER_CANCEL, offset=(40, 20), interval=3): + self.device.click(MEOWFFICER_CONFIRM) + continue + + self.device.click_record.pop() + self.device.click_record.pop() + self.interval_reset((MEOWFFICER_GET_CHECK, MEOWFFICER_APPLY_LOCK, + MEOWFFICER_CONFIRM, MEOWFFICER_CANCEL)) + def meow_get(self, skip_first_screenshot=True): """ Transition through all the necessary screens @@ -204,6 +237,10 @@ def meow_get(self, skip_first_screenshot=True): confirm_timer.reset() continue if self.appear(MEOWFFICER_GET_CHECK, offset=(40, 40), interval=3): + if self.appear(MEOWFFICER_APPLY_UNLOCK, offset=(40, 40)): + self._meow_skip_popup_after_locking(skip_first_screenshot=True) + confirm_timer.reset() + count += 1 logger.attr('Meow_get', count) with self.stat.new( diff --git a/module/shop/base.py b/module/shop/base.py index d671d2dac..1206bef73 100644 --- a/module/shop/base.py +++ b/module/shop/base.py @@ -18,10 +18,11 @@ '|plate|retrofit|pr|dr' '|logger|tuning' '|hecombatplan|fragment' - '|albacore|bataan|bluegill|carabiniere|casablanca|contedicavour|dukeofyork|echo' - '|eldridge|grenville|hibiki|hunter|kinggeorgev|kinu|kuroshio|lemalinmuse' - '|letemeraire|littorio|newcastle|oyashio|quincy|ryuujou|sanjuan|sheffieldmuse' - '|trento|vincennes|z26|z28|z36' + '|albacore|bataan|bearn|bluegill|carabiniere|casablanca|contedicavour|dukeofyork' + '|echo|eldridge|gangut|glorious|grenville|hibiki|hunter|icarus' + '|kawakaze|kinggeorgev|kinu|kuroshio|lagalissonniere|lemalinmuse|letemeraire|littorio' + '|mikuma|minsk|newcastle|oyashio|quincy|ryuujou|sanjuan|sheffieldmuse' + '|trento|u37|vincennes|z24|z26|z28|z36' ')' '(neptune|monarch|ibuki|izumo|roon|saintlouis' diff --git a/module/template/assets.py b/module/template/assets.py index 85932cf72..1db7408f8 100644 --- a/module/template/assets.py +++ b/module/template/assets.py @@ -171,6 +171,11 @@ TEMPLATE_SIREN_SirenBoss16 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss16.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss16.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss16.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss16.gif'}) TEMPLATE_SIREN_SirenBoss18 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss18.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss18.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss18.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss18.gif'}) TEMPLATE_SIREN_SirenBoss19 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss19.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss19.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss19.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss19.gif'}) +TEMPLATE_SIREN_SK_BB = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SK_BB.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SK_BB.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SK_BB.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SK_BB.gif'}) +TEMPLATE_SIREN_SK_CA = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SK_CA.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SK_CA.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SK_CA.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SK_CA.gif'}) +TEMPLATE_SIREN_SK_CL = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SK_CL.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SK_CL.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SK_CL.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SK_CL.gif'}) +TEMPLATE_SIREN_SK_CV = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SK_CV.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SK_CV.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SK_CV.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SK_CV.gif'}) +TEMPLATE_SIREN_SK_DD = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SK_DD.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SK_DD.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SK_DD.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SK_DD.gif'}) TEMPLATE_SIREN_Soobrazitelny = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Soobrazitelny.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Soobrazitelny.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Soobrazitelny.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Soobrazitelny.gif'}) TEMPLATE_SIREN_Spee = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Spee.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Spee.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Spee.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Spee.gif'}) TEMPLATE_SIREN_SpeeIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SpeeIdol.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SpeeIdol.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SpeeIdol.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SpeeIdol.gif'})